@augmentd-labs/canvas-web 2.24.1 → 2.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,55 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pdf-Ciz5_WNq.js","assets/preload-helper-Czpn1I53.js","assets/markdown-html-XoABNf32.js","assets/rolldown-runtime-C0FnF6B9.js","assets/code-editor-BQnKd3jw.js","assets/sanitize-DrVcFY1Q.js","assets/markdown-it-DRESbtwK.js","assets/punycode.es6-ZbLrB_Dn.js","assets/markdown-html-DtQ7-esK.css","assets/SketchEditor-CCh9_zKT.js","assets/react-BzqgEMSQ.js","assets/ui-NWo4bzrd.js","assets/utils-BxVxyehK.js","assets/alert-dialog-CDKOX-MP.js","assets/utils-2pl1SbIp.js","assets/blobs-NdFfDbao.js","assets/workspace-Dh0Dd0r4.js","assets/sha256-BhArj2aT.js","assets/chunk-K2UTITRG-zQFDOW3Q.js","assets/chunk-SRAX5OIU-Dhm3gOdh.js","assets/chunk-6U3AYISY-C6-Mtja1.js","assets/chunk-Z3N5DIM6-D9TMVU7m.js","assets/EditorOverlay-DqlaCJe7.js","assets/SketchEditor-DtRVLazd.css","assets/TextDocumentEditor-S5KKs7E_.js","assets/text-documents-iLXAAr-8.js","assets/LocationTab-BONJQfYM.js","assets/map-BxCwdK0d.js","assets/map-BcsP_QXj.css","assets/subtree-transfer-dialog-CSjPDp4d.js","assets/NextShell-CX994BbA.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,$r as y,$t as b,An as x,Ar as S,At as C,B as w,Bn as T,Br as E,Bt as D,C as O,Cn as k,Cr as A,Ct as j,Dn as M,Dr as N,Dt as P,En as ee,Er as F,Et as I,F as L,Fr as R,Ft as te,G as z,Gn as ne,Gr as B,Gt as re,H as V,Hn as ie,Hr as ae,Ht as oe,I as H,Ir as se,It as ce,J as U,Jn as le,Jr as ue,Jt as de,K as fe,Kn as pe,Kr as me,Kt as he,L as W,Ln as ge,Lr as _e,Lt as ve,Mn as ye,Mr as G,Mt as K,Nn as be,Nr as xe,Nt as Se,On as Ce,Or as we,Ot as Te,P as Ee,Pn as De,Pr as Oe,Pt as ke,Q as Ae,Qn as je,Qr as Me,Qt as Ne,R as Pe,Rn as Fe,Rr as Ie,Rt as Le,S as Re,Sn as ze,Sr as Be,St as Ve,Tn as He,Tr as Ue,Tt as We,U as Ge,Un as Ke,Ur as qe,Ut as Je,V as Ye,Vn as Xe,Vr as Ze,Vt as Qe,W as $e,Wn as et,Wr as tt,Wt as nt,X as rt,Xn as it,Xr as at,Xt as ot,Y as st,Yn as ct,Yr as lt,Yt as ut,Z as dt,Zn as ft,Zr as pt,Zt as mt,_ as ht,_i as gt,_n as _t,_r as vt,_t as yt,ai as bt,an as xt,ar as St,at as Ct,b as wt,bn as Tt,br as Et,bt as Dt,ci as Ot,cn as kt,cr as At,ct as jt,d as Mt,di as Nt,dr as Pt,dt as Ft,ei as It,en as Lt,er as Rt,et as zt,f as Bt,fi as Vt,fn as Ht,fr as Ut,ft as Wt,g as Gt,gi as Kt,gn as qt,gr as Jt,gt as Yt,h as Xt,hi as Zt,hn as Qt,hr as $t,ht as en,ii as tn,in as nn,ir as rn,it as an,jn as on,jr as sn,jt as cn,kn as ln,kr as un,kt as dn,li as fn,ln as pn,lr as mn,lt as hn,m as gn,mi as _n,mn as vn,mr as yn,mt as bn,ni as xn,nn as Sn,nr as Cn,nt as wn,oi as Tn,on as En,or as Dn,ot as On,p as kn,pi as An,pr as jn,pt as Mn,q as Nn,qn as Pn,qr as Fn,qt as In,ri as Ln,rn as Rn,rr as zn,rt as Bn,si as Vn,sn as Hn,sr as Un,st as Wn,tn as Gn,tr as Kn,tt as qn,u as Jn,ui as Yn,un as Xn,ur as Zn,ut as Qn,v as $n,vn as er,vr as tr,vt as nr,w as rr,wr as ir,wt as ar,x as or,xn as sr,xr as cr,xt as lr,y as ur,yn as dr,yr as fr,yt as pr,z as mr,zn as hr,zr as gr,zt as _r}from"./ui-NWo4bzrd.js";import{i as vr,n as yr,r as br}from"./utils-BxVxyehK.js";import{n as xr,t as q}from"./utils-2pl1SbIp.js";import{_ as Sr,a as Cr,b as J,c as wr,d as Tr,f as Er,g as Dr,h as Or,i as kr,l as Ar,m as jr,n as Mr,o as Nr,p as Pr,r as Fr,s as Ir,t as Lr,u as Y,v as Rr,x as X,y as zr}from"./alert-dialog-CDKOX-MP.js";import{t as Br}from"./socket-hM4c-ZSl.js";import{a as Vr,c as Hr,i as Ur,n as Wr,o as Gr,s as Kr,t as qr}from"./blobs-NdFfDbao.js";import{$ as Jr,$t as Yr,A as Xr,An as Zr,At as Qr,B as $r,Bn as ei,Bt as ti,C as ni,Cn as ri,Ct as ii,D as ai,Dn as oi,Dt as si,E as ci,En as li,Et as ui,F as di,Fn as fi,Ft as pi,G as mi,Gt as hi,H as gi,Hn as _i,Ht as vi,I as yi,It as bi,J as xi,Jt as Si,K as Ci,Kt as wi,L as Ti,Ln as Ei,Lt as Di,M as Oi,Mn as ki,Mt as Ai,Nt as ji,O as Mi,On as Ni,Ot as Pi,P as Fi,Pt as Ii,Q as Li,Qt as Ri,R as zi,Rt as Bi,S as Vi,Sn as Hi,St as Ui,T as Wi,Tn as Gi,Tt as Ki,U as qi,Ut as Ji,V as Yi,Vn as Xi,Vt as Zi,W as Qi,Wt as $i,X as ea,Xt as ta,Y as na,Yt as ra,Z as ia,_ as aa,_n as oa,_t as sa,a as ca,an as la,at as ua,b as da,bn as fa,bt as pa,c as ma,cn as ha,ct as ga,d as _a,dn as va,dt as ya,en as ba,et as xa,f as Sa,fn as Ca,ft as wa,g as Ta,gn as Ea,gt as Da,h as Oa,hn as ka,ht as Aa,i as ja,in as Ma,it as Na,j as Pa,jn as Fa,jt as Ia,k as La,kn as Ra,kt as za,l as Ba,ln as Va,lt as Ha,m as Ua,mn as Wa,mt as Ga,n as Ka,nn as qa,nt as Ja,o as Ya,on as Xa,ot as Za,p as Qa,pn as $a,pt as eo,q as to,qt as no,r as ro,rn as io,rt as ao,s as oo,sn as so,st as co,t as lo,tn as uo,tt as fo,u as po,un as mo,ut as ho,v as go,vn as _o,vt as vo,w as yo,wt as bo,x as xo,xn as So,xt as Co,y as wo,yn as To,yt as Eo,z as Do,zn as Oo,zt as ko}from"./workspace-Dh0Dd0r4.js";import{_ as Ao,a as jo,c as Mo,d as No,f as Po,g as Fo,h as Io,i as Lo,l as Ro,m as zo,n as Bo,o as Vo,p as Ho,r as Uo,s as Wo,t as Go,u as Ko,v as qo,y as Jo}from"./text-documents-iLXAAr-8.js";import{n as Yo,t as Xo}from"./map-BxCwdK0d.js";import{t as Zo}from"./search-COMZIxA7.js";import{A as Qo,B as $o,C as es,D as ts,E as ns,F as rs,H as is,I as as,L as os,M as ss,N as cs,O as ls,P as us,R as ds,S as fs,T as ps,V as ms,_ as hs,a as gs,b as _s,c as vs,d as ys,f as bs,g as xs,h as Ss,i as Cs,j as ws,k as Ts,l as Es,m as Ds,o as Os,p as ks,r as As,s as js,t as Ms,u as Ns,v as Ps,w as Fs,x as Is,y as Ls,z as Rs}from"./sha256-BhArj2aT.js";import{t as zs}from"./sanitize-DrVcFY1Q.js";import{t as Bs}from"./markdown-it-DRESbtwK.js";import{n as Vs,t as Hs}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 Z=n(d(),1),Us=m(),Ws=/^(?:[a-z][a-z0-9+.-]*:|[\\/]{2})/i,Gs=/^[\\/]{2}/;function Ks(e,t){return t+e.replace(/\\/g,`/`)}var qs=(e=>(e.Pop=`POP`,e.Push=`PUSH`,e.Replace=`REPLACE`,e))(qs||{}),Js=`popstate`;function Ys(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function Xs(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return tc(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:nc(t)}return ic(t,n,null,e)}function Zs(e,t){if(e===!1||e==null)throw Error(t)}function Qs(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function $s(){return Math.random().toString(36).substring(2,10)}function ec(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function tc(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?rc(t):t,state:n,key:t&&t.key||r||$s(),mask:i}}function nc({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function rc(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function ic(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:h.location,delta:t})}function f(e,t){s=`PUSH`;let r=Ys(e)?e:tc(h.location,e,t);n&&n(r,e),l=u()+1;let d=ec(r,l),f=h.createHref(r.mask||r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:h.location,delta:1})}function p(e,t){s=`REPLACE`;let r=Ys(e)?e:tc(h.location,e,t);n&&n(r,e),l=u();let i=ec(r,l),d=h.createHref(r.mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:h.location,delta:0})}function m(e){return ac(i,e)}let h={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(Js,d),c=e,()=>{i.removeEventListener(Js,d),c=null}},createHref(e){return t(i,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:p,go(e){return o.go(e)}};return h}function ac(e,t,n=!1){let r=`http://localhost`;e&&(r=e.location.origin===`null`?e.location.href:e.location.origin),Zs(r,`No window.location.(origin|href) available to create URL`);let i=typeof t==`string`?t:nc(t);return i=i.replace(/ $/,`%20`),!n&&Gs.test(i)&&(i=r+i),new URL(i,r)}function oc(e,t,n=`/`){return sc(e,t,n,!1)}function sc(e,t,n,r,i){let a=Ec((typeof t==`string`?rc(t):t).pathname||`/`,n);if(a==null)return null;let o=i??cc(e),s=null,c=Tc(a);for(let e=0;s==null&&e<o.length;++e)s=xc(o[e],c,r);return s}function cc(e){let t=lc(e);return dc(t),t}function lc(e,t=[],n=[],r=``,i=!1){let a=(e,a,o=i,s)=>{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;Zs(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=Pc([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(Zs(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),lc(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:yc(l,e.index),routesMeta:u.map((e,t)=>{let[n,r]=wc(e.relativePath,e.caseSensitive,t===u.length-1);return{...e,matcher:n,compiledParams:r}})})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of uc(e.path))a(e,t,!0,n)}),t}function uc(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=uc(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function dc(e){e.sort((e,t)=>e.score===t.score?bc(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var fc=/^:[\w-]+$/,pc=3,mc=2,hc=1,gc=10,_c=-2,vc=e=>e===`*`;function yc(e,t){let n=e.split(`/`),r=n.length;return n.some(vc)&&(r+=_c),t&&(r+=mc),n.filter(e=>!vc(e)).reduce((e,t)=>e+(fc.test(t)?pc:t===``?hc:gc),r)}function bc(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function xc(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e<r.length;++e){let s=r[e],c=e===r.length-1,l=a===`/`?t:t.slice(a.length)||`/`,u={path:s.relativePath,caseSensitive:s.caseSensitive,end:c},d=s.matcher&&s.compiledParams?Cc(u,l,s.matcher,s.compiledParams):Sc(u,l),f=s.route;if(!d&&c&&n&&!r[r.length-1].route.index&&(d=Sc({path:s.relativePath,caseSensitive:s.caseSensitive,end:!1},l)),!d)return null;Object.assign(i,d.params),o.push({params:i,pathname:Pc([a,d.pathname]),pathnameBase:Ic(Pc([a,d.pathnameBase])),route:f}),d.pathnameBase!==`/`&&(a=Pc([a,d.pathnameBase]))}return o}function Sc(e,t){typeof e==`string`&&(e={path:e,caseSensitive:!1,end:!0});let[n,r]=wc(e.path,e.caseSensitive,e.end);return Cc(e,t,n,r)}function Cc(e,t,n,r){let i=t.match(n);if(!i)return null;let a=i[0],o=a.replace(/(.)\/+$/,`$1`),s=i.slice(1);return{params:r.reduce((e,{paramName:t,isOptional:n},r)=>{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return e[t]=n&&!i?void 0:(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function wc(e,t=!1,n=!0){Qs(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function Tc(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return Qs(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function Ec(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}function Dc(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?rc(e):e,a;return n?(n=Nc(n),a=n.startsWith(`/`)?Oc(n.substring(1),`/`):Oc(n,t)):a=t,{pathname:a,search:Lc(r),hash:Rc(i)}}function Oc(e,t){let n=Fc(t).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function kc(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.`}function Ac(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function jc(e){let t=Ac(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function Mc(e,t,n,r=!1){let i;typeof e==`string`?i=rc(e):(i={...e},Zs(!i.pathname||!i.pathname.includes(`?`),kc(`?`,`pathname`,`search`,i)),Zs(!i.pathname||!i.pathname.includes(`#`),kc(`#`,`pathname`,`hash`,i)),Zs(!i.search||!i.search.includes(`#`),kc(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=Dc(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var Nc=e=>e.replace(/[\\/]{2,}/g,`/`),Pc=e=>Nc(e.join(`/`)),Fc=e=>e.replace(/\/+$/,``),Ic=e=>Fc(e).replace(/^\/*/,`/`),Lc=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,Rc=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,zc=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function Bc(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function Vc(e){return Pc(e.map(e=>e.route.path).filter(Boolean))||`/`}var Hc=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function Uc(e,t){let n=e;if(typeof n!=`string`||!Ws.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(Hc)try{let e=new URL(window.location.href),r=Gs.test(n)?new URL(Ks(n,e.protocol)):new URL(n),a=Ec(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{Qs(!1,`<Link to="${n}"> contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);var Wc=[`POST`,`PUT`,`PATCH`,`DELETE`];new Set(Wc);var Gc=[`GET`,...Wc];new Set(Gc);var Kc=[`about:`,`blob:`,`chrome:`,`chrome-untrusted:`,`content:`,`data:`,`devtools:`,`file:`,`filesystem:`,`javascript:`];function qc(e){try{return Kc.includes(new URL(e).protocol)}catch{return!1}}var Jc=Z.createContext(null);Jc.displayName=`DataRouter`;var Yc=Z.createContext(null);Yc.displayName=`DataRouterState`;var Xc=Z.createContext(!1);function Zc(){return Z.useContext(Xc)}var Qc=Z.createContext({isTransitioning:!1});Qc.displayName=`ViewTransition`;var $c=Z.createContext(new Map);$c.displayName=`Fetchers`;var el=Z.createContext(null);el.displayName=`Await`;var tl=Z.createContext(null);tl.displayName=`Navigation`;var nl=Z.createContext(null);nl.displayName=`Location`;var rl=Z.createContext({outlet:null,matches:[],isDataRoute:!1});rl.displayName=`Route`;var il=Z.createContext(null);il.displayName=`RouteError`;var al=`REACT_ROUTER_ERROR`,ol=`REDIRECT`,sl=`ROUTE_ERROR_RESPONSE`;function cl(e){if(e.startsWith(`${al}:${ol}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function ll(e){if(e.startsWith(`${al}:${sl}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new zc(t.status,t.statusText,t.data)}catch{}}function ul(e,{relative:t}={}){Zs(dl(),`useHref() may be used only in the context of a <Router> component.`);let{basename:n,navigator:r}=Z.useContext(tl),{hash:i,pathname:a,search:o}=bl(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:Pc([n,a])),r.createHref({pathname:s,search:o,hash:i})}function dl(){return Z.useContext(nl)!=null}function fl(){return Zs(dl(),`useLocation() may be used only in the context of a <Router> component.`),Z.useContext(nl).location}var pl=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function ml(e){Z.useContext(tl).static||Z.useLayoutEffect(e)}function hl(){let{isDataRoute:e}=Z.useContext(rl);return e?Ll():gl()}function gl(){Zs(dl(),`useNavigate() may be used only in the context of a <Router> component.`);let e=Z.useContext(Jc),{basename:t,navigator:n}=Z.useContext(tl),{matches:r}=Z.useContext(rl),{pathname:i}=fl(),a=JSON.stringify(jc(r)),o=Z.useRef(!1);return ml(()=>{o.current=!0}),Z.useCallback((r,s={})=>{if(Qs(o.current,pl),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=Mc(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:Pc([t,c.pathname])),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}var _l=Z.createContext(null);function vl(e){let t=Z.useContext(rl).outlet;return Z.useMemo(()=>t&&Z.createElement(_l.Provider,{value:e},t),[t,e])}function yl(){let{matches:e}=Z.useContext(rl);return e[e.length-1]?.params??{}}function bl(e,{relative:t}={}){let{matches:n}=Z.useContext(rl),{pathname:r}=fl(),i=JSON.stringify(jc(n));return Z.useMemo(()=>Mc(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function xl(e,t){return Sl(e,t)}function Sl(e,t,n){Zs(dl(),`useRoutes() may be used only in the context of a <Router> component.`);let{navigator:r}=Z.useContext(tl),{matches:i}=Z.useContext(rl),a=i[i.length-1],o=a?a.params:{},s=a?a.pathname:`/`,c=a?a.pathnameBase:`/`,l=a&&a.route;{let e=l&&l.path||``;zl(s,!l||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant <Routes> (or called \`useRoutes()\`) at "${s}" (under <Route path="${e}">) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.
3
-
4
- Please change the parent <Route path="${e}"> to <Route path="${e===`/`?`*`:`${e}/*`}">.`)}let u=fl(),d;if(t){let e=typeof t==`string`?rc(t):t;Zs(c===`/`||e.pathname?.startsWith(c),`When overriding the location using \`<Routes location>\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${c}" but pathname "${e.pathname}" was given in the \`location\` prop.`),d=e}else d=u;let f=d.pathname||`/`,p=f;if(c!==`/`){let e=c.replace(/^\//,``).split(`/`);p=`/`+f.replace(/^\//,``).split(`/`).slice(e.length).join(`/`)}let m=n&&n.state.matches.length?n.state.matches.map(e=>Object.assign(e,{route:n.manifest[e.route.id]||e.route})):oc(e,{pathname:p});Qs(l||m!=null,`No routes matched location "${d.pathname}${d.search}${d.hash}" `),Qs(m==null||m[m.length-1].route.element!==void 0||m[m.length-1].route.Component!==void 0||m[m.length-1].route.lazy!==void 0,`Matched leaf route at location "${d.pathname}${d.search}${d.hash}" does not have an element or Component. This means it will render an <Outlet /> with a null value by default resulting in an "empty" page.`);let h=kl(m&&m.map(e=>Object.assign({},e,{params:Object.assign({},o,e.params),pathname:Pc([c,r.encodeLocation?r.encodeLocation(e.pathname.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathname]),pathnameBase:e.pathnameBase===`/`?c:Pc([c,r.encodeLocation?r.encodeLocation(e.pathnameBase.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathnameBase])})),i,n);return t&&h?Z.createElement(nl.Provider,{value:{location:{pathname:`/`,search:``,hash:``,state:null,key:`default`,mask:void 0,...d},navigationType:`POP`}},h):h}function Cl(){let e=Il(),t=Bc(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r=`rgba(200,200,200, 0.5)`,i={padding:`0.5rem`,backgroundColor:r},a={padding:`2px 4px`,backgroundColor:r},o=null;return console.error(`Error handled by React Router default ErrorBoundary:`,e),o=Z.createElement(Z.Fragment,null,Z.createElement(`p`,null,`💿 Hey developer 👋`),Z.createElement(`p`,null,`You can provide a way better UX than this when your app throws errors by providing your own `,Z.createElement(`code`,{style:a},`ErrorBoundary`),` or`,` `,Z.createElement(`code`,{style:a},`errorElement`),` prop on your route.`)),Z.createElement(Z.Fragment,null,Z.createElement(`h2`,null,`Unexpected Application Error!`),Z.createElement(`h3`,{style:{fontStyle:`italic`}},t),n?Z.createElement(`pre`,{style:i},n):null,o)}var wl=Z.createElement(Cl,null),Tl=class extends Z.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!==`idle`&&e.revalidation===`idle`?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error===void 0?t.error:e.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error(`React Router caught the following error during render`,e)}render(){let e=this.state.error;if(this.context&&typeof e==`object`&&e&&`digest`in e&&typeof e.digest==`string`){let t=ll(e.digest);t&&(e=t)}let t=e===void 0?this.props.children:Z.createElement(rl.Provider,{value:this.props.routeContext},Z.createElement(il.Provider,{value:e,children:this.props.component}));return this.context?Z.createElement(Dl,{error:e},t):t}};Tl.contextType=Xc;var El=new WeakMap;function Dl({children:e,error:t}){let{basename:n}=Z.useContext(tl);if(typeof t==`object`&&t&&`digest`in t&&typeof t.digest==`string`){let e=cl(t.digest);if(e){let r=El.get(t);if(r)throw r;let i=Uc(e.location,n),a=i.absoluteURL||i.to;if(qc(a))throw Error(`Invalid redirect location`);if(Hc&&!El.get(t)){if(i.isExternal||e.reloadDocument)window.location.href=a;else{let n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(i.to,{replace:e.replace}));throw El.set(t,n),n}}return Z.createElement(`meta`,{httpEquiv:`refresh`,content:`0;url=${a}`})}}return e}function Ol({routeContext:e,match:t,children:n}){let r=Z.useContext(Jc);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),Z.createElement(rl.Provider,{value:e},n)}function kl(e,t=[],n){let r=n?.state;if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let i=e,a=r?.errors;if(a!=null){let e=i.findIndex(e=>e.route.id&&a?.[e.route.id]!==void 0);Zs(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(a).join(`,`)}`),i=i.slice(0,Math.min(i.length,e+1))}let o=!1,s=-1;if(n&&r){o=r.renderFallback;for(let e=0;e<i.length;e++){let t=i[e];if((t.route.HydrateFallback||t.route.hydrateFallbackElement)&&(s=e),t.route.id){let{loaderData:e,errors:a}=r,c=t.route.loader&&!e.hasOwnProperty(t.route.id)&&(!a||a[t.route.id]===void 0);if(t.route.lazy||c){n.isStatic&&(o=!0),i=s>=0?i.slice(0,s+1):[i[0]];break}}}}let c=n?.onError,l=r&&c?(e,t)=>{c(e,{location:r.location,params:r.matches?.[0]?.params??{},pattern:Vc(r.matches),errorInfo:t})}:void 0;return i.reduceRight((e,n,c)=>{let u,d=!1,f=null,p=null;r&&(u=a&&n.route.id?a[n.route.id]:void 0,f=n.route.errorElement||wl,o&&(s<0&&c===0?(zl(`route-fallback`,!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,p=null):s===c&&(d=!0,p=n.route.hydrateFallbackElement||null)));let m=t.concat(i.slice(0,c+1)),h=()=>{let t;return t=u?f:d?p:n.route.Component?Z.createElement(n.route.Component,null):n.route.element?n.route.element:e,Z.createElement(Ol,{match:n,routeContext:{outlet:e,matches:m,isDataRoute:r!=null},children:t})};return r&&(n.route.ErrorBoundary||n.route.errorElement||c===0)?Z.createElement(Tl,{location:r.location,revalidation:r.revalidation,component:f,error:u,children:h(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:l}):h()},null)}function Al(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function jl(e){let t=Z.useContext(Jc);return Zs(t,Al(e)),t}function Ml(e){let t=Z.useContext(Yc);return Zs(t,Al(e)),t}function Nl(e){let t=Z.useContext(rl);return Zs(t,Al(e)),t}function Pl(e){let t=Nl(e),n=t.matches[t.matches.length-1];return Zs(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function Fl(){return Pl(`useRouteId`)}function Il(){let e=Z.useContext(il),t=Ml(`useRouteError`),n=Pl(`useRouteError`);return e===void 0?t.errors?.[n]:e}function Ll(){let{router:e}=jl(`useNavigate`),t=Pl(`useNavigate`),n=Z.useRef(!1);return ml(()=>{n.current=!0}),Z.useCallback(async(r,i={})=>{Qs(n.current,pl),n.current&&(typeof r==`number`?await e.navigate(r):await e.navigate(r,{fromRouteId:t,...i}))},[e,t])}var Rl={};function zl(e,t,n){!t&&!Rl[e]&&(Rl[e]=!0,Qs(!1,n))}Z.memo(Bl);function Bl({routes:e,manifest:t,future:n,state:r,isStatic:i,onError:a}){return Sl(e,void 0,{manifest:t,state:r,isStatic:i,onError:a,future:n})}function Vl({to:e,replace:t,state:n,relative:r}){Zs(dl(),`<Navigate> may be used only in the context of a <Router> component.`);let{static:i}=Z.useContext(tl);Qs(!i,`<Navigate> must not be used on the initial render in a <StaticRouter>. This is a no-op, but you should modify your code so the <Navigate> is only ever rendered in response to some user interaction or state change.`);let{matches:a}=Z.useContext(rl),{pathname:o}=fl(),s=hl(),c=Mc(e,jc(a),o,r===`path`),l=JSON.stringify(c);return Z.useEffect(()=>{s(JSON.parse(l),{replace:t,state:n,relative:r})},[s,l,r,t,n]),null}function Hl(e){return vl(e.context)}function Ul(e){Zs(!1,`A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Please wrap your <Route> in a <Routes>.`)}function Wl({basename:e=`/`,children:t=null,location:n,navigationType:r=`POP`,navigator:i,static:a=!1,useTransitions:o}){Zs(!dl(),`You cannot render a <Router> inside another <Router>. You should never have more than one in your app.`);let s=e.replace(/^\/*/,`/`),c=Z.useMemo(()=>({basename:s,navigator:i,static:a,useTransitions:o,future:{}}),[s,i,a,o]);typeof n==`string`&&(n=rc(n));let{pathname:l=`/`,search:u=``,hash:d=``,state:f=null,key:p=`default`,mask:m}=n,h=Z.useMemo(()=>{let e=Ec(l,s);return e==null?null:{location:{pathname:e,search:u,hash:d,state:f,key:p,mask:m},navigationType:r}},[s,l,u,d,f,p,r,m]);return Qs(h!=null,`<Router basename="${s}"> is not able to match the URL "${l}${u}${d}" because it does not start with the basename, so the <Router> won't render anything.`),h==null?null:Z.createElement(tl.Provider,{value:c},Z.createElement(nl.Provider,{children:t,value:h}))}function Gl({children:e,location:t}){return xl(Kl(e),t)}Z.Component;function Kl(e,t=[]){let n=[];return Z.Children.forEach(e,(e,r)=>{if(!Z.isValidElement(e))return;let i=[...t,r];if(e.type===Z.Fragment){n.push.apply(n,Kl(e.props.children,i));return}Zs(e.type===Ul,`[${typeof e.type==`string`?e.type:e.type.name}] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`),Zs(!e.props.index||!e.props.children,`An index route cannot have child routes.`);let a={id:e.props.id||i.join(`-`),caseSensitive:e.props.caseSensitive,element:e.props.element,Component:e.props.Component,index:e.props.index,path:e.props.path,middleware:e.props.middleware,loader:e.props.loader,action:e.props.action,hydrateFallbackElement:e.props.hydrateFallbackElement,HydrateFallback:e.props.HydrateFallback,errorElement:e.props.errorElement,ErrorBoundary:e.props.ErrorBoundary,hasErrorBoundary:e.props.hasErrorBoundary===!0||e.props.ErrorBoundary!=null||e.props.errorElement!=null,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle,lazy:e.props.lazy};e.props.children&&(a.children=Kl(e.props.children,i)),n.push(a)}),n}var ql=`get`,Jl=`application/x-www-form-urlencoded`;function Yl(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function Xl(e){return Yl(e)&&e.tagName.toLowerCase()===`button`}function Zl(e){return Yl(e)&&e.tagName.toLowerCase()===`form`}function Ql(e){return Yl(e)&&e.tagName.toLowerCase()===`input`}function $l(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function eu(e,t){return e.button===0&&(!t||t===`_self`)&&!$l(e)}function tu(e=``){return new URLSearchParams(typeof e==`string`||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,n)=>{let r=e[n];return t.concat(Array.isArray(r)?r.map(e=>[n,e]):[[n,r]])},[]))}function nu(e,t){let n=tu(e);return t&&t.forEach((e,r)=>{n.has(r)||t.getAll(r).forEach(e=>{n.append(r,e)})}),n}var ru=null;function iu(){if(ru===null)try{new FormData(document.createElement(`form`),0),ru=!1}catch{ru=!0}return ru}var au=new Set([`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`]);function ou(e){return e!=null&&!au.has(e)?(Qs(!1,`"${e}" is not a valid \`encType\` for \`<Form>\`/\`<fetcher.Form>\` and will default to "${Jl}"`),null):e}function su(e,t){let n,r,i,a,o;if(Zl(e)){let o=e.getAttribute(`action`);r=o?Ec(o,t):null,n=e.getAttribute(`method`)||ql,i=ou(e.getAttribute(`enctype`))||Jl,a=new FormData(e)}else if(Xl(e)||Ql(e)&&(e.type===`submit`||e.type===`image`)){let o=e.form;if(o==null)throw Error(`Cannot submit a <button> or <input type="submit"> without a <form>`);let s=e.getAttribute(`formaction`)||o.getAttribute(`action`);if(r=s?Ec(s,t):null,n=e.getAttribute(`formmethod`)||o.getAttribute(`method`)||ql,i=ou(e.getAttribute(`formenctype`))||ou(o.getAttribute(`enctype`))||Jl,a=new FormData(o,e),!iu()){let{name:t,type:n,value:r}=e;if(n===`image`){let e=t?`${t}.`:``;a.append(`${e}x`,`0`),a.append(`${e}y`,`0`)}else t&&a.append(t,r)}}else if(Yl(e))throw Error(`Cannot submit element that is not <form>, <button>, or <input type="submit|image">`);else n=ql,r=null,i=Jl,o=e;return a&&i===`text/plain`&&(o=a,a=void 0),{action:r,method:n.toLowerCase(),encType:i,formData:a,body:o}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);function cu(e,t){if(e===!1||e==null)throw Error(t)}function lu(e,t,n,r){let i=typeof e==`string`?new URL(e,typeof window>`u`?`server://singlefetch/`:window.location.origin):e;return i.pathname=n?i.pathname.endsWith(`/`)?`${i.pathname}_.${r}`:`${i.pathname}.${r}`:i.pathname===`/`?`_root.${r}`:t&&Ec(i.pathname,t)===`/`?`${Fc(t)}/_root.${r}`:`${Fc(i.pathname)}.${r}`,i}async function uu(e,t){if(e.id in t)return t[e.id];try{let n=await g(()=>import(e.module),[]);return t[e.id]=n,n}catch(t){return console.error(`Error loading route module \`${e.module}\`, reloading page...`),console.error(t),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}function du(e){return e!=null&&typeof e.page==`string`}function fu(e){return e==null?!1:e.href==null?e.rel===`preload`&&typeof e.imageSrcSet==`string`&&typeof e.imageSizes==`string`:typeof e.rel==`string`&&typeof e.href==`string`}async function pu(e,t,n){return vu((await Promise.all(e.map(async e=>{let r=t.routes[e.route.id];if(r){let e=await uu(r,n);return e.links?e.links():[]}return[]}))).flat(1).filter(fu).filter(e=>e.rel===`stylesheet`||e.rel===`preload`).map(e=>e.rel===`stylesheet`?{...e,rel:`prefetch`,as:`style`}:{...e,rel:`prefetch`}))}function mu(e,t,n,r,i,a){let o=(e,t)=>!n[t]||e.route.id!==n[t].route.id,s=(e,t)=>n[t].pathname!==e.pathname||n[t].route.path?.endsWith(`*`)&&n[t].params[`*`]!==e.params[`*`];return a===`assets`?t.filter((e,t)=>o(e,t)||s(e,t)):a===`data`?t.filter((t,a)=>{let c=r.routes[t.route.id];if(!c||!c.hasLoader)return!1;if(o(t,a)||s(t,a))return!0;if(t.route.shouldRevalidate){let r=t.route.shouldRevalidate({currentUrl:new URL(i.pathname+i.search+i.hash,window.origin),currentParams:n[0]?.params||{},nextUrl:new URL(e,window.origin),nextParams:t.params,defaultShouldRevalidate:!0});if(typeof r==`boolean`)return r}return!0}):[]}function hu(e,t,{includeHydrateFallback:n}={}){return gu(e.map(e=>{let r=t.routes[e.route.id];if(!r)return[];let i=[r.module];return r.clientActionModule&&(i=i.concat(r.clientActionModule)),r.clientLoaderModule&&(i=i.concat(r.clientLoaderModule)),n&&r.hydrateFallbackModule&&(i=i.concat(r.hydrateFallbackModule)),r.imports&&(i=i.concat(r.imports)),i}).flat(1))}function gu(e){return[...new Set(e)]}function _u(e){let t={},n=Object.keys(e).sort();for(let r of n)t[r]=e[r];return t}function vu(e,t){let n=new Set,r=new Set(t);return e.reduce((e,i)=>{if(t&&!du(i)&&i.as===`script`&&i.href&&r.has(i.href))return e;let a=JSON.stringify(_u(i));return n.has(a)||(n.add(a),e.push({key:a,link:i})),e},[])}function yu(){let e=Z.useContext(Jc);return cu(e,`You must render this element inside a <DataRouterContext.Provider> element`),e}function bu(){let e=Z.useContext(Yc);return cu(e,`You must render this element inside a <DataRouterStateContext.Provider> element`),e}var xu=Z.createContext(void 0);xu.displayName=`FrameworkContext`;function Su(){let e=Z.useContext(xu);return cu(e,`You must render this element inside a <HydratedRouter> element`),e}function Cu(e,t){let n=Z.useContext(xu),[r,i]=Z.useState(!1),[a,o]=Z.useState(!1),{onFocus:s,onBlur:c,onMouseEnter:l,onMouseLeave:u,onTouchStart:d}=t,f=Z.useRef(null);Z.useEffect(()=>{if(e===`render`&&o(!0),e===`viewport`){let e=new IntersectionObserver(e=>{e.forEach(e=>{o(e.isIntersecting)})},{threshold:.5});return f.current&&e.observe(f.current),()=>{e.disconnect()}}},[e]),Z.useEffect(()=>{if(r){let e=setTimeout(()=>{o(!0)},100);return()=>{clearTimeout(e)}}},[r]);let p=()=>{i(!0)},m=()=>{i(!1),o(!1)};return n?e===`intent`?[a,f,{onFocus:wu(s,p),onBlur:wu(c,m),onMouseEnter:wu(l,p),onMouseLeave:wu(u,m),onTouchStart:wu(d,p)}]:[a,f,{}]:[!1,f,{}]}function wu(e,t){return n=>{e&&e(n),n.defaultPrevented||t(n)}}function Tu({page:e,...t}){let n=Zc(),{nonce:r}=Su(),{router:i}=yu(),a=Z.useMemo(()=>oc(i.routes,e,i.basename),[i.routes,e,i.basename]);return a?(t.nonce==null&&r&&(t={...t,nonce:r}),n?Z.createElement(Du,{page:e,matches:a,...t}):Z.createElement(Ou,{page:e,matches:a,...t})):null}function Eu(e){let{manifest:t,routeModules:n}=Su(),[r,i]=Z.useState([]);return Z.useEffect(()=>{let r=!1;return pu(e,t,n).then(e=>{r||i(e)}),()=>{r=!0}},[e,t,n]),r}function Du({page:e,matches:t,...n}){let r=fl(),{future:i}=Su(),{basename:a}=yu(),o=Z.useMemo(()=>{if(e===r.pathname+r.search+r.hash)return[];let n=lu(e,a,i.v8_trailingSlashAwareDataRequests,`rsc`),o=!1,s=[];for(let e of t)typeof e.route.shouldRevalidate==`function`?o=!0:s.push(e.route.id);return o&&s.length>0&&n.searchParams.set(`_routes`,s.join(`,`)),[n.pathname+n.search]},[a,i.v8_trailingSlashAwareDataRequests,e,r,t]);return Z.createElement(Z.Fragment,null,o.map(e=>Z.createElement(`link`,{key:e,rel:`prefetch`,as:`fetch`,href:e,...n})))}function Ou({page:e,matches:t,...n}){let r=fl(),{future:i,manifest:a,routeModules:o}=Su(),{basename:s}=yu(),{loaderData:c,matches:l}=bu(),u=Z.useMemo(()=>mu(e,t,l,a,r,`data`),[e,t,l,a,r]),d=Z.useMemo(()=>mu(e,t,l,a,r,`assets`),[e,t,l,a,r]),f=Z.useMemo(()=>{if(e===r.pathname+r.search+r.hash)return[];let n=new Set,l=!1;if(t.forEach(e=>{let t=a.routes[e.route.id];!t||!t.hasLoader||(!u.some(t=>t.route.id===e.route.id)&&e.route.id in c&&o[e.route.id]?.shouldRevalidate||t.hasClientLoader?l=!0:n.add(e.route.id))}),n.size===0)return[];let d=lu(e,s,i.v8_trailingSlashAwareDataRequests,`data`);return l&&n.size>0&&d.searchParams.set(`_routes`,t.filter(e=>n.has(e.route.id)).map(e=>e.route.id).join(`,`)),[d.pathname+d.search]},[s,i.v8_trailingSlashAwareDataRequests,c,r,a,u,t,e,o]),p=Z.useMemo(()=>hu(d,a),[d,a]),m=Eu(d);return Z.createElement(Z.Fragment,null,f.map(e=>Z.createElement(`link`,{key:e,rel:`prefetch`,as:`fetch`,href:e,...n})),p.map(e=>Z.createElement(`link`,{key:e,rel:`modulepreload`,href:e,...n})),m.map(({key:e,link:t})=>Z.createElement(`link`,{key:e,nonce:n.nonce,...t,crossOrigin:t.crossOrigin??n.crossOrigin})))}function ku(...e){return t=>{e.forEach(e=>{typeof e==`function`?e(t):e!=null&&(e.current=t)})}}Z.Component;var Au=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;try{Au&&(window.__reactRouterVersion=`7.18.2`)}catch{}function ju({basename:e,children:t,useTransitions:n,window:r}){let i=Z.useRef();i.current??=Xs({window:r,v5Compat:!0});let a=i.current,[o,s]=Z.useState({action:a.action,location:a.location}),c=Z.useCallback(e=>{n===!1?s(e):Z.startTransition(()=>s(e))},[n]);return Z.useLayoutEffect(()=>a.listen(c),[a,c]),Z.createElement(Wl,{basename:e,children:t,location:o.location,navigationType:o.action,navigator:a,useTransitions:n})}var Mu=Z.forwardRef(function({onClick:e,discover:t=`render`,prefetch:n=`none`,relative:r,reloadDocument:i,replace:a,mask:o,state:s,target:c,to:l,preventScrollReset:u,viewTransition:d,defaultShouldRevalidate:f,...p},m){let{basename:h,navigator:g,useTransitions:_}=Z.useContext(tl),v=typeof l==`string`&&Ws.test(l),y=Uc(l,h);l=y.to;let b=ul(l,{relative:r}),x=fl(),S=null;if(o){let e=Mc(o,[],x.mask?x.mask.pathname:`/`,!0);h!==`/`&&(e.pathname=e.pathname===`/`?h:Pc([h,e.pathname])),S=g.createHref(e)}let[C,w,T]=Cu(n,p),E=Lu(l,{replace:a,mask:o,state:s,target:c,preventScrollReset:u,relative:r,viewTransition:d,defaultShouldRevalidate:f,useTransitions:_});function D(t){e&&e(t),t.defaultPrevented||E(t)}let O=!(y.isExternal||i),k=Z.createElement(`a`,{...p,...T,href:(O?S:void 0)||y.absoluteURL||b,onClick:O?D:e,ref:ku(m,w),target:c,"data-discover":!v&&t===`render`?`true`:void 0});return C&&!v?Z.createElement(Z.Fragment,null,k,Z.createElement(Tu,{page:b})):k});Mu.displayName=`Link`;var Nu=Z.forwardRef(function({"aria-current":e=`page`,caseSensitive:t=!1,className:n=``,end:r=!1,style:i,to:a,viewTransition:o,children:s,...c},l){let u=bl(a,{relative:c.relative}),d=fl(),f=Z.useContext(Yc),{navigator:p,basename:m}=Z.useContext(tl),h=f!=null&&Uu(u)&&o===!0,g=p.encodeLocation?p.encodeLocation(u).pathname:u.pathname,_=d.pathname,v=f&&f.navigation&&f.navigation.location?f.navigation.location.pathname:null;t||(_=_.toLowerCase(),v=v?v.toLowerCase():null,g=g.toLowerCase()),v&&m&&(v=Ec(v,m)||v);let y=g!==`/`&&g.endsWith(`/`)?g.length-1:g.length,b=_===g||!r&&_.startsWith(g)&&_.charAt(y)===`/`,x=v!=null&&(v===g||!r&&v.startsWith(g)&&v.charAt(g.length)===`/`),S={isActive:b,isPending:x,isTransitioning:h},C=b?e:void 0,w;w=typeof n==`function`?n(S):[n,b?`active`:null,x?`pending`:null,h?`transitioning`:null].filter(Boolean).join(` `);let T=typeof i==`function`?i(S):i;return Z.createElement(Mu,{...c,"aria-current":C,className:w,ref:l,style:T,to:a,viewTransition:o},typeof s==`function`?s(S):s)});Nu.displayName=`NavLink`;var Pu=Z.forwardRef(({discover:e=`render`,fetcherKey:t,navigate:n,reloadDocument:r,replace:i,state:a,method:o=ql,action:s,onSubmit:c,relative:l,preventScrollReset:u,viewTransition:d,defaultShouldRevalidate:f,...p},m)=>{let{useTransitions:h}=Z.useContext(tl),g=Vu(),_=Hu(s,{relative:l}),v=o.toLowerCase()===`get`?`get`:`post`,y=typeof s==`string`&&Ws.test(s);return Z.createElement(`form`,{ref:m,method:v,action:_,onSubmit:r?c:e=>{if(c&&c(e),e.defaultPrevented)return;e.preventDefault();let r=e.nativeEvent.submitter,s=r?.getAttribute(`formmethod`)||o,p=()=>g(r||e.currentTarget,{fetcherKey:t,method:s,navigate:n,replace:i,state:a,relative:l,preventScrollReset:u,viewTransition:d,defaultShouldRevalidate:f});h&&n!==!1?Z.startTransition(()=>p()):p()},...p,"data-discover":!y&&e===`render`?`true`:void 0})});Pu.displayName=`Form`;function Fu(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function Iu(e){let t=Z.useContext(Jc);return Zs(t,Fu(e)),t}function Lu(e,{target:t,replace:n,mask:r,state:i,preventScrollReset:a,relative:o,viewTransition:s,defaultShouldRevalidate:c,useTransitions:l}={}){let u=hl(),d=fl(),f=bl(e,{relative:o});return Z.useCallback(p=>{if(eu(p,t)){p.preventDefault();let t=n===void 0?nc(d)===nc(f):n,m=()=>u(e,{replace:t,mask:r,state:i,preventScrollReset:a,relative:o,viewTransition:s,defaultShouldRevalidate:c});l?Z.startTransition(()=>m()):m()}},[d,u,f,n,r,i,t,e,a,o,s,c,l])}function Ru(e){Qs(typeof URLSearchParams<`u`,"You cannot use the `useSearchParams` hook in a browser that does not support the URLSearchParams API. If you need to support Internet Explorer 11, we recommend you load a polyfill such as https://github.com/ungap/url-search-params.");let t=Z.useRef(tu(e)),n=Z.useRef(!1),r=fl(),i=Z.useMemo(()=>nu(r.search,n.current?null:t.current),[r.search]),a=hl();return[i,Z.useCallback((e,t)=>{let r=tu(typeof e==`function`?e(new URLSearchParams(i)):e);n.current=!0,a(`?`+r,t)},[a,i])]}var zu=0,Bu=()=>`__${String(++zu)}__`;function Vu(){let{router:e}=Iu(`useSubmit`),{basename:t}=Z.useContext(tl),n=Fl(),r=e.fetch,i=e.navigate;return Z.useCallback(async(e,a={})=>{let{action:o,method:s,encType:c,formData:l,body:u}=su(e,t);if(a.navigate===!1){let e=a.fetcherKey||Bu();await r(e,n,a.action||o,{defaultShouldRevalidate:a.defaultShouldRevalidate,preventScrollReset:a.preventScrollReset,formData:l,body:u,formMethod:a.method||s,formEncType:a.encType||c,flushSync:a.flushSync})}else await i(a.action||o,{defaultShouldRevalidate:a.defaultShouldRevalidate,preventScrollReset:a.preventScrollReset,formData:l,body:u,formMethod:a.method||s,formEncType:a.encType||c,replace:a.replace,state:a.state,fromRouteId:n,flushSync:a.flushSync,viewTransition:a.viewTransition})},[r,i,t,n])}function Hu(e,{relative:t}={}){let{basename:n}=Z.useContext(tl),r=Z.useContext(rl);Zs(r,`useFormAction must be used inside a RouteContext`);let[i]=r.matches.slice(-1),a={...bl(e||`.`,{relative:t})},o=fl();if(e==null){a.search=o.search;let e=new URLSearchParams(a.search),t=e.getAll(`index`);if(t.some(e=>e===``)){e.delete(`index`),t.filter(e=>e).forEach(t=>e.append(`index`,t));let n=e.toString();a.search=n?`?${n}`:``}}return(!e||e===`.`)&&i.route.index&&(a.search=a.search?a.search.replace(/^\?/,`?index&`):`?index`),n!==`/`&&(a.pathname=a.pathname===`/`?n:Pc([n,a.pathname])),nc(a)}function Uu(e,{relative:t}={}){let n=Z.useContext(Qc);Zs(n!=null,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:r}=Iu(`useViewTransitionState`),i=bl(e,{relative:t});if(!n.isTransitioning)return!1;let a=Ec(n.currentLocation.pathname,r)||n.currentLocation.pathname,o=Ec(n.nextLocation.pathname,r)||n.nextLocation.pathname;return Sc(i.pathname,o)!=null||Sc(i.pathname,a)!=null}var Q=s(),$=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(gt,{ref:n,className:q(`text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70`,e),...t}));$.displayName=gt.displayName;var Wu=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`div`,{ref:n,className:q(`rounded-(--card-radius) border bg-card text-card-foreground shadow-elevation-1`,e),...t}));Wu.displayName=`Card`;var Gu=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`div`,{ref:n,className:q(`flex flex-col space-y-1.5 p-6`,e),...t}));Gu.displayName=`CardHeader`;var Ku=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`h3`,{ref:n,className:q(`text-2xl font-semibold leading-none tracking-tight`,e),...t}));Ku.displayName=`CardTitle`;var qu=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`p`,{ref:n,className:q(`text-sm text-muted-foreground`,e),...t}));qu.displayName=`CardDescription`;var Ju=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`div`,{ref:n,className:q(`p-6 pt-0`,e),...t}));Ju.displayName=`CardContent`;var Yu=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`div`,{ref:n,className:q(`flex items-center p-6 pt-0`,e),...t}));Yu.displayName=`CardFooter`;var Xu=`2.24.1`,Zu=e=>{window.particlesJS.load(e,`/js/particles.config.json`,()=>{console.log(`particles.js config loaded for`,e)})};function Qu(e){(0,Z.useEffect)(()=>{if(window.particlesJS!==void 0)Zu(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`),Zu(e)},document.head.appendChild(t)}return()=>{window.pJS&&window.pJS[e]?.destroy&&window.pJS[e].destroy()}},[e])}var $u=`session.open`,ed=`session.set`,td=`session.ids`,nd=`session.materialize`,rd=`session.close`,id=`session.delta`;function ad(){let[e,t]=(0,Z.useState)(null),[n,r]=(0,Z.useState)(!0),[i,a]=(0,Z.useState)(null);return(0,Z.useEffect)(()=>{let e=!0;async function n(){try{r(!0),a(null);let n=await Y.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 od=`https://github.com/canvas-ui/canvas-server`,sd=null;function cd(){return sd||=Y.get(`/ping`,{skipAuth:!0}).then(e=>{let t=e??{};return{sourceUrl:t.sourceUrl||od,version:t.version??null,commit:t.commit??null,license:t.license??null}}).catch(e=>(console.error(`Failed to fetch server source info:`,e),sd=null,{sourceUrl:od,version:null,commit:null,license:null})),sd}function ld(){let[e,t]=(0,Z.useState)(null);return(0,Z.useEffect)(()=>{let e=!0;return cd().then(n=>{e&&t(n)}),()=>{e=!1}},[]),e}function ud({className:e=``}){let t=ld();if(!t)return null;let n=[t.version?`v${t.version}`:null,t.commit?.slice(0,7)].filter(Boolean).join(` `);return(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground ${e}`,children:[`Powered by`,` `,(0,Q.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,Q.jsx)(`a`,{href:t.sourceUrl,target:`_blank`,rel:`noreferrer`,className:`underline underline-offset-2 hover:text-foreground`,children:`Get the source code`}),`.`]})}function dd({children:e}){Qu(`particle-js`);let{serverVersion:t,isLoading:n,error:r}=ad();return(0,Q.jsx)(`div`,{className:`flex min-h-viewport w-full items-center justify-center p-4 flex-col`,children:(0,Q.jsxs)(Wu,{className:`flex w-[95vw] h-viewport-modal overflow-hidden`,children:[(0,Q.jsxs)(`div`,{className:`hidden md:block w-1/2 relative bg-background`,"data-scheme":`dark`,id:`particle-js`,children:[(0,Q.jsxs)(Mu,{className:`absolute top-8 left-8 font-bold text-foreground flex items-center z-raised`,to:`/`,children:[(0,Q.jsx)(`img`,{src:`/images/logo-wr_128x128.png`,alt:`Canvas Logo`,className:`mr-2 h-6 w-6 touch-target`}),(0,Q.jsx)(`span`,{className:`text-2xl font-bold text-foreground`,children:`Canvas`})]}),(0,Q.jsxs)(`div`,{className:`absolute bottom-8 left-8 text-sm text-foreground max-w-[80%] z-raised`,children:[`Web UI: v`,Xu,`, Server: `,n?`Loading...`:r?`Unavailable`:t?`v${t}`:`Unknown`]})]}),(0,Q.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,Q.jsxs)(`div`,{className:`mx-auto w-full max-w-sm`,children:[e,(0,Q.jsxs)(`div`,{className:`mt-8 border-t pt-6`,children:[(0,Q.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,Q.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,Q.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,Q.jsx)(`span`,{children:`View on GitHub`})]}),(0,Q.jsx)(ud,{className:`mt-4 text-center`})]})]})})]})})}function fd(){let e=localStorage.getItem(`authToken`);return!e||e===`canvas-server-token`?null:e}var pd=new class{socket=null;connected=!1;authToken=null;handlers=new Map;socketWrappers=new Map;desiredSubscriptions=new Set;baseUrl;connectionId=``;constructor(){this.baseUrl=zr,this.connectionId=`socket-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}connect(e){let t=e||fd();!t||t===`canvas-server-token`||this.socket&&this.authToken===t||(this.cleanupSocket(),this.authToken=t,this.socket=Br(this.baseUrl,{transports:[`websocket`],autoConnect:!1,reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:1e4,forceNew:!0,extraHeaders:{Authorization:`Bearer ${t}`,"X-Connection-ID":this.connectionId},auth:{token:t}}),this.setupDefaultHandlers(),this.registerHandlers(),this.socket.connect())}cleanupSocket(){this.socket?.removeAllListeners(),this.socket?.disconnect(),this.socket=null,this.connected=!1,this.socketWrappers.clear()}setupDefaultHandlers(){this.socket&&(this.socket.on(`connect`,()=>{this.connected=!0;for(let e of this.desiredSubscriptions)this.socket?.emit(`subscribe`,{channel:e})}),this.socket.on(`disconnect`,()=>{this.connected=!1}),this.socket.on(`connect_error`,()=>{this.connected=!1}))}registerHandlers(){this.socket&&this.handlers.forEach((e,t)=>{e.forEach(e=>{this.attach(t,e)})})}attach(e,t){if(!this.socket)return;let n=this.socketWrappers.get(e);if(n||(n=new Map,this.socketWrappers.set(e,n)),n.has(t))return;let r=(...e)=>t(...e);n.set(t,r),this.socket.on(e,r)}detach(e,t){if(!this.socket)return;let n=this.socketWrappers.get(e),r=n?.get(t);r&&(this.socket.off(e,r),n?.delete(t),n&&n.size===0&&this.socketWrappers.delete(e))}on(e,t){this.handlers.has(e)||this.handlers.set(e,new Set);let n=this.handlers.get(e);return n.has(t)?()=>this.off(e,t):(n.add(t),this.socket&&this.attach(e,t),()=>this.off(e,t))}off(e,t){let n=this.handlers.get(e);n&&n.has(t)&&(n.delete(t),n.size===0&&this.handlers.delete(e),this.detach(e,t))}request(e,t,n=1e4){return new Promise((r,i)=>{if(!this.socket||!this.connected){i(Error(`Socket not connected`));return}let a=!1,o=setTimeout(()=>{a||(a=!0,i(Error(`Socket request timed out: ${e}`)))},n);try{this.socket.emit(e,t??{},t=>{a||(a=!0,clearTimeout(o),t?.status===`error`?i(Error(t.message||`${e} failed`)):r(t?.payload??t))})}catch(e){a=!0,clearTimeout(o),i(e instanceof Error?e:Error(String(e)))}})}emit(e,...t){if(e===`subscribe`){let e=t?.[0]?.channel;typeof e==`string`&&e&&this.desiredSubscriptions.add(e)}else if(e===`unsubscribe`){let e=t?.[0]?.channel;typeof e==`string`&&e&&this.desiredSubscriptions.delete(e)}if(this.socket&&this.connected)try{this.socket.emit(e,...t)}catch(t){console.error(`Error emitting event ${e}:`,t),this.reconnect()}else this.connect()}disconnect(){this.cleanupSocket(),this.authToken=null,this.desiredSubscriptions.clear()}isConnected(){return this.connected}retryNow(){this.connected||(this.cleanupSocket(),this.connect())}reconnect(){this.connect()}};async function md(e,t,n=`auto`){try{let r=await Y.post(Sr.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)+`...`),Y.setAuthToken(i.token),pd.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)+`...`),Y.setAuthToken(i.payload.token),pd.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),Y.clearAuthToken(),e}}async function hd(e,t,n){try{return await Y.post(Sr.register,{name:e,email:t,password:n},{skipAuth:!0})}catch(e){throw console.error(`Registration failed:`,e),e}}function gd(e){return e instanceof Error&&/^Network error/i.test(e.message)}function _d(){let e=localStorage.getItem(`authToken`);if(!e)return!1;if(e.startsWith(`canvas-`))return!0;try{return br(e).exp*1e3>Date.now()}catch{return!1}}function vd(){let e=localStorage.getItem(`authToken`);if(!e||e.startsWith(`canvas-`))return null;try{let t=br(e);return t.exp*1e3<Date.now()?(Y.clearAuthToken(),null):{id:t.sub,email:t.email,userType:t.userType||`user`}}catch(e){return console.error(`Failed to decode token:`,e),Y.clearAuthToken(),null}}async function yd(){try{if(!Y.isAuthenticated())return console.log(`Not authenticated, skipping getCurrentUser request`),null;let e=await Y.get(Sr.me);return console.log(`Current user response:`,e),e&&e?(pd.isConnected()||pd.reconnect(),e):(console.warn(`Invalid user profile response structure:`,e),null)}catch(e){if(console.error(`Failed to get current user:`,e),gd(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),Y.clearAuthToken(),pd.disconnect(),null):null}}function bd(){return Y.isAuthenticated()}function xd(){let e=new URL(`${Rr}/oauth/google/login`);e.searchParams.set(`origin`,window.location.origin),window.location.assign(e.toString())}async function Sd(e){let t=await Y.post(`${Rr}/oauth/google/exchange`,{code:e},{skipAuth:!0});if(!t?.token)throw Error(`Invalid login response: missing token`);Y.setAuthToken(t.token),pd.connect(t.token)}async function Cd(){try{let e=await Y.get(Sr.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 wd(e){try{await Y.post(Sr.verifyEmailRequest,{email:e},{skipAuth:!0})}catch(e){throw console.error(`Failed to request email verification:`,e),e}}var Td=e=>e?.strategies?.local?.enabled!==!1,Ed=e=>e?.allowUserRegistrations!==!1;function Dd(){let e=hl(),[t,n]=Z.useState(!1),[r,i]=Z.useState(``),[a,o]=Z.useState(``),[s,c]=Z.useState(!1),[l,u]=Z.useState({}),[d,p]=Z.useState(null),[m,h]=Z.useState({email:``,password:``,strategy:`auto`});Z.useEffect(()=>{bd()&&e(`/workspaces`),fetch(`${Rr}/runtime/capabilities`).then(e=>e.ok?e.json():null).then(e=>n(e?.payload?.local===!0)).catch(()=>{}),Cd().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 md(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,Q.jsx)(dd,{children:(0,Q.jsxs)(`form`,{className:`grid gap-4`,onSubmit:async t=>{t.preventDefault(),c(!0),o(``);try{if(Y.setAuthToken(r.trim()),!await yd())throw Error(`The local token was not accepted`);e(`/workspaces`)}catch(e){Y.clearAuthToken(),o(e instanceof Error?e.message:`Authentication failed`)}finally{c(!1)}},children:[(0,Q.jsx)(`h1`,{className:`text-2xl font-semibold`,children:`Connect to your local runtime`}),(0,Q.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Enter the token shown by `,(0,Q.jsx)(`code`,{children:`canvas runtime token`}),` in the runtime folder.`]}),(0,Q.jsx)($,{htmlFor:`local-token`,children:`Local access token`}),(0,Q.jsx)(J,{id:`local-token`,type:`password`,autoComplete:`off`,value:r,onChange:e=>i(e.target.value),required:!0}),a&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:a}),(0,Q.jsx)(X,{disabled:s,children:s?`Connecting…`:`Connect`})]})}):(0,Q.jsx)(dd,{children:(0,Q.jsxs)(`div`,{className:`flex flex-col space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col space-y-2 text-center`,children:[(0,Q.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Welcome back`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Enter your credentials to access your account`})]}),(0,Q.jsx)(`form`,{onSubmit:v,children:(0,Q.jsxs)(`div`,{className:`grid gap-4`,children:[d?.strategies?.imap?.enabled&&d.strategies.imap.domains.length>0&&(0,Q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Q.jsx)($,{htmlFor:`strategy`,children:`Authentication Method`}),(0,Q.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,Q.jsx)(`option`,{value:`auto`,children:`Auto-detect`}),(0,Q.jsx)(`option`,{value:`local`,children:`Local Account`}),(0,Q.jsx)(`option`,{value:`imap`,children:`Email Server (IMAP)`})]})]}),(0,Q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Q.jsx)($,{htmlFor:`email`,children:`Email`}),(0,Q.jsx)(J,{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,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:l.email})]}),(0,Q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Q.jsx)($,{htmlFor:`password`,children:`Password`}),(0,Q.jsx)(J,{id:`password`,name:`password`,type:`password`,disabled:s,value:m.password,onChange:_}),l.password&&(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:l.password})]}),(0,Q.jsxs)(`div`,{className:`flex flex-col space-y-4`,children:[(0,Q.jsx)(X,{type:`submit`,disabled:s,children:s?`Signing in...`:`Sign In`}),d?.strategies?.google?.enabled&&(0,Q.jsxs)(X,{type:`button`,variant:`outline`,disabled:s,onClick:()=>xd(),children:[(0,Q.jsx)(f,{icon:`logos:google-icon`,width:16,height:16,className:`mr-2`}),`Sign in with Google`]}),Td(d)&&Ed(d)&&(0,Q.jsx)(X,{variant:`outline`,type:`button`,disabled:s,onClick:()=>e(`/register`),children:`Don't have an account? Sign up`})]})]})})]})})}function Od(){let e=hl(),{showToast:t}=Hr(),[n,r]=Z.useState(!1),[i,a]=Z.useState({}),[o,s]=Z.useState({name:``,email:``,password:``}),[c,l]=Z.useState(!1),[u,d]=Z.useState(!1),[f,p]=Z.useState(null);Z.useEffect(()=>{(async()=>{let t=await Cd(),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=Z.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,Q.jsxs)(dd,{children:[(0,Q.jsxs)(`div`,{className:`flex flex-col space-y-2 text-center`,children:[(0,Q.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Registration Successful!`}),(0,Q.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,Q.jsx)(`div`,{className:`space-y-6 text-center pt-6`,children:!u&&(0,Q.jsx)(X,{asChild:!0,className:`w-full`,children:(0,Q.jsx)(Mu,{to:`/login`,children:`Go to Login`})})})]}):(0,Q.jsxs)(dd,{children:[(0,Q.jsxs)(`div`,{className:`flex flex-col space-y-2 text-center`,children:[(0,Q.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Create an account`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Enter your email below to create your account`})]}),(0,Q.jsxs)(`form`,{onSubmit:async e=>{if(e.preventDefault(),h()){r(!0);try{let e=await hd(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,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)($,{htmlFor:`name`,children:`Username`}),(0,Q.jsx)(J,{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,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:i.name}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`3-39 characters, lowercase letters, numbers, underscores, and hyphens only`})]}),(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)($,{htmlFor:`email`,children:`Email`}),(0,Q.jsx)(J,{id:`email`,type:`email`,placeholder:`name@example.com`,value:o.email,onChange:g,disabled:n,className:i.email?`border-destructive`:``}),i.email&&(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:i.email})]}),(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)($,{htmlFor:`password`,children:`Password`}),(0,Q.jsx)(J,{id:`password`,type:`password`,placeholder:`Enter your password`,value:o.password,onChange:g,disabled:n,className:i.password?`border-destructive`:``}),i.password&&(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:i.password}),f&&m&&(0,Q.jsxs)(`ul`,{className:`text-xs list-disc pl-4 space-y-1`,children:[(0,Q.jsxs)(`li`,{className:m.minLength?`text-success`:`text-muted-foreground`,children:[`At least `,f.minLength,` characters`]}),f.requireUppercase&&(0,Q.jsx)(`li`,{className:m.uppercase?`text-success`:`text-muted-foreground`,children:`At least one uppercase letter`}),f.requireLowercase&&(0,Q.jsx)(`li`,{className:m.lowercase?`text-success`:`text-muted-foreground`,children:`At least one lowercase letter`}),f.requireNumbers&&(0,Q.jsx)(`li`,{className:m.number?`text-success`:`text-muted-foreground`,children:`At least one number`}),f.requireSpecialChars&&(0,Q.jsx)(`li`,{className:m.special?`text-success`:`text-muted-foreground`,children:`At least one special character`}),f.maxLength&&(0,Q.jsxs)(`li`,{className:m.maxLength?`text-success`:`text-muted-foreground`,children:[`No more than `,f.maxLength,` characters`]})]})]}),(0,Q.jsx)(X,{type:`submit`,className:`w-full`,disabled:n,children:n?`Creating Account...`:`Create Account`})]}),(0,Q.jsxs)(`div`,{className:`mt-4 text-center text-sm`,children:[`Already have an account?`,` `,(0,Q.jsx)(Mu,{to:`/login`,className:`underline`,children:`Sign in`})]}),(0,Q.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,Q.jsx)(Mu,{to:`/terms`,className:`underline underline-offset-4 hover:text-primary`,children:`Terms of Service`}),` `,`and`,` `,(0,Q.jsx)(Mu,{to:`/privacy`,className:`underline underline-offset-4 hover:text-primary`,children:`Privacy Policy`}),`.`]})]})}function kd(){let e=hl(),[t]=Ru(),[n,r]=Z.useState(t.get(`error`)),i=Z.useRef(!1);return Z.useEffect(()=>{let n=t.get(`code`);!n||i.current||(i.current=!0,Sd(n).then(()=>e(`/home`,{replace:!0})).catch(e=>r(e instanceof Error?e.message:`Google sign-in failed`)))},[t,e]),(0,Q.jsx)(dd,{children:(0,Q.jsx)(`div`,{className:`flex flex-col space-y-4 text-center`,children:n?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Google sign-in failed`}),(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:n}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,onClick:()=>e(`/login`,{replace:!0}),children:`Back to sign in`})]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Signing you in…`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Completing Google sign-in.`})]})})})}function Ad({className:e=`h-5 w-5`,...t}){return(0,Q.jsxs)(`svg`,{className:`animate-spin ${e}`,xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,...t,children:[(0,Q.jsx)(`circle`,{className:`opacity-25`,cx:`12`,cy:`12`,r:`10`,stroke:`currentColor`,strokeWidth:`4`}),(0,Q.jsx)(`path`,{className:`opacity-75`,fill:`currentColor`,d:`M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z`})]})}function jd({children:e}){let[t,n]=(0,Z.useState)(`loading`);return(0,Z.useEffect)(()=>{(async()=>{try{if(!bd()){console.log(`No authentication token found, redirecting to login`),n(`unauthenticated`);return}let e=await yd();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),gd(e)){n(_d()?`authenticated`:`unauthenticated`);return}e instanceof Error&&e.message.includes(`Authentication required`)&&(console.log(`Clearing invalid token from ProtectedRoute`),Y.clearAuthToken()),n(`unauthenticated`)}})()},[]),t===`loading`?(0,Q.jsx)(`div`,{className:`flex h-screen items-center justify-center`,children:(0,Q.jsx)(Ad,{className:`h-8 w-8`})}):t===`unauthenticated`?(0,Q.jsx)(Vl,{to:`/login`,replace:!0}):(0,Q.jsx)(Q.Fragment,{children:e})}function Md({children:e}){let[t,n]=(0,Z.useState)(null);return(0,Z.useEffect)(()=>{(async()=>{try{await Y.get(`/auth/me`),n(!0)}catch(e){e instanceof Error&&e.message.includes(`Authentication required`)&&(console.log(`Clearing invalid token from PublicRoute`),Y.clearAuthToken()),n(!1)}})()},[]),t===null?null:t?(0,Q.jsx)(Vl,{to:`/workspaces`,replace:!0}):(0,Q.jsx)(Q.Fragment,{children:e})}var Nd=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})}))})),Pd=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)}})),Fd=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=ae,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=R,e.setTopLeft=z,e.setTransform=te,e.sortLayoutItems=ne,e.sortLayoutItemsByColRow=re,e.sortLayoutItemsByRowCol=B,e.synchronizeLayoutWithChildren=V,e.validateLayout=ie,e.withLayoutItem=p;var t=Nd(),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=Pd();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=ne(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=ne(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)}},L={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 R(e,t,n,r){let i=L[e];return i?i(t,a(a({},t),n),r):n}function te(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 z(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 ne(e,t){return t===`horizontal`?re(e):t===`vertical`?B(e):e}function B(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 re(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 V(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 ie(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 ae(e){let{verticalCompact:t,compactType:n}=e||{};return t===!1?null:n}e.noop=()=>{}})),Id=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)}})),Ld=i(((e,t)=>{t.exports=`SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED`})),Rd=i(((e,t)=>{var n=Ld();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}})),zd=i(((e,t)=>{t.exports=Rd()()})),Bd=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:()=>G,default:()=>K}),t.exports=f(p);var m=u(d()),g=u(zd()),_=u(h()),v=yr();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 L(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 R(e,t){let n=z(e,t,`px`);return{[E(`transform`,O)]:n}}function te(e,t){return z(e,t,``)}function z({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 ne(e,t){return e.targetTouches&&y(e.targetTouches,e=>t===e.identifier)||e.changedTouches&&y(e.changedTouches,e=>t===e.identifier)}function B(e){if(e.targetTouches&&e.targetTouches[0])return e.targetTouches[0].identifier;if(e.changedTouches&&e.changedTouches[0])return e.changedTouches[0].identifier}function re(){return typeof __webpack_nonce__<`u`?__webpack_nonce__:void 0}function V(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??re();r&&n.setAttribute(`nonce`,r),n.innerHTML=`.react-draggable-transparent-selection *::-moz-selection {all: inherit;}
5
- `,n.innerHTML+=`.react-draggable-transparent-selection *::selection {all: inherit;}
6
- `,e.getElementsByTagName(`head`)[0].appendChild(n)}e.body&&oe(e.body,`react-draggable-transparent-selection`)}function ie(e){window.requestAnimationFrame?window.requestAnimationFrame(()=>{ae(e)}):ae(e)}function ae(e){if(e)try{e.body&&H(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 oe(e,t){e.classList?e.classList.add(t):e.className.match(RegExp(`(?:^|\\s)${t}(?!\\S)`))||(e.className+=` ${t}`)}function H(e,t){e.classList?e.classList.remove(t):e.className=e.className.replace(RegExp(`(?:^|\\s)${t}(?!\\S)`,`g`),``)}function se(e,t,n){if(!e.props.bounds)return[t,n];let{bounds:r}=e.props;r=typeof r==`string`?r:pe(r);let i=me(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 ce(e,t,n){return[Math.round(t/e[0])*e[0],Math.round(n/e[1])*e[1]]}function U(e){return e.props.axis===`both`||e.props.axis===`x`}function le(e){return e.props.axis===`both`||e.props.axis===`y`}function ue(e,t,n){let r=typeof t==`number`?ne(e,t):null;if(typeof t==`number`&&!r)return null;let i=me(n),a=n.props.offsetParent||i.offsetParent||i.ownerDocument.body;return L(r||e,a,n.props.scale)}function de(e,t,n){let r=!x(e.lastX),i=me(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 fe(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 pe(e){return{left:e.left,top:e.top,right:e.right,bottom:e.bottom}}function me(e){let t=e.findDOMNode();if(!t)throw Error(`<DraggableCore>: Unmounted during event!`);return t}var he=u(d()),W=u(zd()),ge=u(h()),_e=typeof process<`u`&&{}.DRAGGABLE_DEBUG?console.log.bind(console):function(){},ve={touch:{start:`touchstart`,move:`touchmove`,stop:`touchend`},mouse:{start:`mousedown`,move:`mousemove`,stop:`mouseup`}},ye=ve.mouse,G=class extends he.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=B(e);this.touchIdentifier=r;let i=ue(e,r,this);if(i==null)return;let{x:a,y:o}=i,s=de(this,a,o);_e(`DraggableCore: handleDragStart: %j`,s),_e(`calling`,this.props.onStart),this.props.onStart(e,s)!==!1&&this.mounted!==!1&&(this.props.enableUserSelectHack&&V(n,this.props.nonce),this.dragging=!0,this.lastX=a,this.lastY=o,M(n,ye.move,this.handleDrag),M(n,ye.stop,this.handleDragStop))},this.handleDrag=e=>{let t=ue(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]=ce(this.props.grid,e,t),!e&&!t)return;n=this.lastX+e,r=this.lastY+t}let i=de(this,n,r);if(_e(`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=ue(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]=ce(this.props.grid,e,t),n=this.lastX+e,r=this.lastY+t}let i=de(this,n,r);if(this.props.onStop(e,i)===!1||this.mounted===!1)return!1;let a=this.findDOMNode();a&&this.props.enableUserSelectHack&&ie(a.ownerDocument),_e(`DraggableCore: handleDragStop: %j`,i),this.dragging=!1,this.lastX=NaN,this.lastY=NaN,a&&(_e(`DraggableCore: Removing handlers`),N(a.ownerDocument,ye.move,this.handleDrag),N(a.ownerDocument,ye.stop,this.handleDragStop))},this.onMouseDown=e=>(ye=ve.mouse,this.handleDragStart(e)),this.onMouseUp=e=>(ye=ve.mouse,this.handleDragStop(e)),this.onTouchStart=e=>(ye=ve.touch,this.handleDragStart(e)),this.onTouchEnd=e=>(ye=ve.touch,this.handleDragStop(e))}componentDidMount(){this.mounted=!0;let e=this.findDOMNode();e&&M(e,ve.touch.start,this.onTouchStart,{passive:!1})}componentWillUnmount(){this.mounted=!1;let e=this.findDOMNode();if(e){let{ownerDocument:t}=e;N(t,ve.mouse.move,this.handleDrag),N(t,ve.touch.move,this.handleDrag),N(t,ve.mouse.stop,this.handleDragStop),N(t,ve.touch.stop,this.handleDragStop),N(e,ve.touch.start,this.onTouchStart,{passive:!1}),this.props.enableUserSelectHack&&ie(t)}}findDOMNode(){if(this.props?.nodeRef)return this.props.nodeRef.current;let e=ge.default;return typeof e.findDOMNode==`function`?e.findDOMNode(this):(_e(`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 he.cloneElement(he.Children.only(this.props.children),{onMouseDown:this.onMouseDown,onMouseUp:this.onMouseUp,onTouchEnd:this.onTouchEnd})}};G.displayName=`DraggableCore`,G.propTypes={allowAnyClick:W.default.bool,allowMobileScroll:W.default.bool,children:W.default.node.isRequired,disabled:W.default.bool,enableUserSelectHack:W.default.bool,offsetParent:function(e,t){if(e[t]&&e[t].nodeType!==1)throw Error(`Draggable's offsetParent must be a DOM Node.`)},grid:W.default.arrayOf(W.default.number),handle:W.default.string,cancel:W.default.string,nodeRef:W.default.object,nonce:W.default.string,onStart:W.default.func,onDrag:W.default.func,onStop:W.default.func,onMouseDown:W.default.func,scale:W.default.number,className:C,style:C,transform:C},G.defaultProps={allowAnyClick:!1,allowMobileScroll:!1,disabled:!1,enableUserSelectHack:!0,onStart:function(){},onDrag:function(){},onStop:function(){},onMouseDown:function(){},scale:1};var K=class extends m.Component{constructor(e){super(e),this.onDragStart=(e,t)=>{if(_e(`Draggable: onDragStart: %j`,t),this.props.onStart(e,fe(this,t))===!1)return!1;this.setState({dragging:!0,dragged:!0})},this.onDrag=(e,t)=>{if(!this.state.dragging)return!1;_e(`Draggable: onDrag: %j`,t);let n=fe(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]=se(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,fe(this,t))===!1)return!1;_e(`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)?(_e(`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:U(this)&&p?this.state.x:h.x,y:le(this)&&p?this.state.y:h.y};this.state.isElementSVG?f=te(g,c):d=R(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(G,{...u,onStart:this.onDragStart,onDrag:this.onDrag,onStop:this.onDragStop},m.cloneElement(_,{className:y,style:{..._.props.style,...d},transform:f}))}};K.displayName=`Draggable`,K.propTypes={...G.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},K.defaultProps={...G.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:G})})),Vd=i(((e,t)=>{var n=Bd(),r=n.DraggableCore,i=n.default||n;t.exports=i,t.exports.default=i,t.exports.DraggableCore=r})),Hd=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)}})),Ud=i((e=>{e.__esModule=!0,e.resizableProps=void 0;var t=n(zd());Vd();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)}}})),Wd=i((e=>{e.__esModule=!0,e.default=void 0;var t=o(d()),n=Vd(),r=Hd(),i=Ud(),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}})),Gd=i((e=>{e.__esModule=!0,e.default=void 0;var t=s(d()),n=o(zd()),r=o(Wd()),i=Ud(),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})})),Kd=i(((e,t)=>{t.exports=function(){throw Error(`Don't instantiate Resizable directly! Use require('react-resizable').Resizable`)},t.exports.Resizable=Wd().default,t.exports.ResizableBox=Gd().default})),qd=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.resizeHandleType=e.resizeHandleAxesType=e.default=void 0;var t=r(zd()),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&&Fd().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}})),Jd=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=u(d()),n=h(),r=u(zd()),i=Vd(),a=Kd(),o=Fd(),s=Id(),c=qd(),l=u(yr());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})})),Yd=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=l(d()),n=Nd(),r=c(yr()),i=Fd(),a=Id(),o=c(Jd()),s=c(qd());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})})),Xd=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.findOrGenerateResponsiveLayout=i,e.getBreakpointFromWidth=n,e.getColsFromBreakpoint=r,e.sortBreakpoints=a;var t=Fd();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]})}})),Zd=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=l(d()),n=c(zd()),r=Nd(),i=Fd(),a=Xd(),o=c(Yd()),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})})),Qd=r({default:()=>Of});function $d(e,t){var n=!1,r=!1,i=0;function a(){n&&(n=!1,e()),r&&s()}function o(){pf(a)}function s(){var e=Date.now();if(n){if(e-i<mf)return;r=!0}else n=!0,r=!1,setTimeout(o,t);i=e}return s}function ef(e){return parseFloat(e)||0}function tf(e){return[...arguments].slice(1).reduce(function(t,n){var r=e[`border-`+n+`-width`];return t+ef(r)},0)}function nf(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]=ef(o)}return n}function rf(e){var t=e.getBBox();return lf(0,0,t.width,t.height)}function af(e){var t=e.clientWidth,n=e.clientHeight;if(!t&&!n)return xf;var r=bf(e).getComputedStyle(e),i=nf(r),a=i.left+i.right,o=i.top+i.bottom,s=ef(r.width),c=ef(r.height);if(r.boxSizing===`border-box`&&(Math.round(s+a)!==t&&(s-=tf(r,`left`,`right`)+a),Math.round(c+o)!==n&&(c-=tf(r,`top`,`bottom`)+o)),!of(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 lf(i.left,i.top,s,c)}function of(e){return e===bf(e).document.documentElement}function sf(e){return df?Sf(e)?rf(e):af(e):xf}function cf(e){var t=e.x,n=e.y,r=e.width,i=e.height,a=Object.create((typeof DOMRectReadOnly<`u`?DOMRectReadOnly:Object).prototype);return yf(a,{x:t,y:n,width:r,height:i,top:n,right:t+r,bottom:i+n,left:t}),a}function lf(e,t,n,r){return{x:e,y:t,width:n,height:r}}var uf,df,ff,pf,mf,hf,gf,_f,vf,yf,bf,xf,Sf,Cf,wf,Tf,Ef,Df,Of,kf=t((()=>{uf=(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}()})(),df=typeof window<`u`&&typeof document<`u`&&window.document===document,ff=(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`)()})(),pf=(function(){return typeof requestAnimationFrame==`function`?requestAnimationFrame.bind(ff):function(e){return setTimeout(function(){return e(Date.now())},1e3/60)}})(),mf=2,hf=20,gf=[`top`,`right`,`bottom`,`left`,`width`,`height`,`size`,`weight`],_f=typeof MutationObserver<`u`,vf=function(){function e(){this.connected_=!1,this.mutationEventsAdded_=!1,this.mutationsObserver_=null,this.observers_=[],this.onTransitionEnd_=this.onTransitionEnd_.bind(this),this.refresh=$d(this.refresh.bind(this),hf)}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(){!df||this.connected_||(document.addEventListener(`transitionend`,this.onTransitionEnd_),window.addEventListener(`resize`,this.refresh),_f?(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(){!df||!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;gf.some(function(e){return!!~n.indexOf(e)})&&this.refresh()},e.getInstance=function(){return this.instance_||=new e,this.instance_},e.instance_=null,e}(),yf=(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}),bf=(function(e){return e&&e.ownerDocument&&e.ownerDocument.defaultView||ff}),xf=lf(0,0,0,0),Sf=(function(){return typeof SVGGraphicsElement<`u`?function(e){return e instanceof bf(e).SVGGraphicsElement}:function(e){return e instanceof bf(e).SVGElement&&typeof e.getBBox==`function`}})(),Cf=function(){function e(e){this.broadcastWidth=0,this.broadcastHeight=0,this.contentRect_=lf(0,0,0,0),this.target=e}return e.prototype.isActive=function(){var e=sf(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}(),wf=function(){function e(e,t){var n=cf(t);yf(this,{target:e,contentRect:n})}return e}(),Tf=function(){function e(e,t,n){if(this.activeObservations_=[],this.observations_=new uf,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 bf(e).Element))throw TypeError(`parameter 1 is not of type "Element".`);var t=this.observations_;t.has(e)||(t.set(e,new Cf(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 bf(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 wf(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}(),Ef=typeof WeakMap<`u`?new WeakMap:new uf,Df=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 Tf(t,vf.getInstance(),this);Ef.set(this,n)}return e}(),[`observe`,`unobserve`,`disconnect`].forEach(function(e){Df.prototype[e]=function(){var t;return(t=Ef.get(this))[e].apply(t,arguments)}}),Of=(function(){return ff.ResizeObserver===void 0?Df:ff.ResizeObserver})()})),Af=i((t=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=_;var n=c(d()),r=s(zd()),i=s((kf(),e(Qd))),a=s(yr()),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}})),jf=n(i(((e,t)=>{t.exports=Yd().default,t.exports.utils=Fd(),t.exports.calculateUtils=Id(),t.exports.Responsive=Zd().default,t.exports.Responsive.utils=Xd(),t.exports.WidthProvider=Af().default}))(),1),Mf=new Map;function Nf(e){Mf.set(e.type,e)}function Pf(e){return Mf.get(e)}function Ff(){return[...Mf.values()]}async function If(e,t,n){let r={successful:[],failed:[],pending:[]},i=[...new Set(e)],a=0;n.onProgress(0,i.length);for(let e of i){if(n.shouldStop())break;try{let n=await t([e]);r.successful.push(...n.successful),r.failed.push(...n.failed)}catch(t){r.failed.push({id:e,reason:t instanceof Error?t.message:String(t)}),a++,n.onProgress(a,i.length);break}a++,n.onProgress(a,i.length)}return r.pending=i.slice(a),r}function Lf(e){return`/workspaces/${e}/hooks`}async function Rf(e){return await Y.get(Lf(e))||[]}async function zf(e,t){return(await Y.get(`${Lf(e)}/${t}`))?.content??``}async function Bf(e,t,n){await Y.put(`${Lf(e)}/${t}`,{content:n})}async function Vf(e,t){await Y.delete(`${Lf(e)}/${t}`)}var Hf=[`example-`,`disabled-`,`_`];function Uf(e){let t=e.lastIndexOf(`/`);return{dir:t===-1?``:e.slice(0,t+1),base:t===-1?e:e.slice(t+1)}}function Wf(e){return Hf.find(t=>e.startsWith(t))??null}function Gf(e){return Wf(Uf(e).base)===null}function Kf(e){return Uf(e).base.startsWith(`example-`)}function qf(e){let{dir:t,base:n}=Uf(e),r=Wf(n);return t+(r?n.slice(r.length):`disabled-${n}`)}async function Jf(e,t,n){if(Gf(t)===n)return t;let r=qf(t);return await Bf(e,r,await zf(e,t)),await Vf(e,t),r}function Yf(e){let t={};for(let n of e){let e;e=n.path.includes(`/`)?n.path.split(`/`)[0]:/^(?:example-|disabled-|_)?rules\.json$/.test(n.path)?`rules`:n.path.replace(/\.js$/,``),(t[e]||=[]).push(n)}return t}function Xf(e){let t=e.when?.event;return Array.isArray(t)?t.map(String):t?[String(t)]:[]}function Zf(e){let t=e.when?.eventPathExact??e.when?.pathExact??e.when?.path;return Array.isArray(t)?t.map(String):typeof t==`string`?[t]:[]}function Qf(e){let t=String(e||``).split(`/`).filter(Boolean);return t[0]===`workspace`&&t.length>=2?{backend:`workspace:${t[1]}`,rel:t.slice(2).join(`/`)}:t[0]===`device`?t.length>=3?{backend:t[2],rel:t.slice(3).join(`/`)}:null:t.length>=2?{backend:t[1],rel:t.slice(2).join(`/`)}:null}function $f(e){let t=new URLSearchParams;return e.kind&&e.kind!==`mirror`&&t.set(`addRuleKind`,e.kind),e.path&&t.set(`addRulePath`,e.path),e.target&&t.set(`addRuleTarget`,e.target),e.storeTo&&t.set(`addRuleStoreTo`,e.storeTo),e.storeFolder&&t.set(`addRuleStoreFolder`,e.storeFolder),t}function ep(e){return String(e||``).replace(/^[a-z]+:/i,``).split(`/`).filter(Boolean).join(`/`)}var tp=`rules.json`;async function np(e){try{let t=await zf(e,tp),n=JSON.parse(t||`{}`);return Array.isArray(n.rules)?n.rules:[]}catch{return[]}}async function rp(e,t){await Bf(e,tp,JSON.stringify({$schema:`canvas.hook-rules/v1`,rules:t},null,2)+`
7
- `)}async function ip(e,t={}){let n=new URLSearchParams;t.status&&n.set(`status`,t.status),t.handler&&n.set(`handler`,t.handler),t.limit&&n.set(`limit`,String(t.limit));let r=n.toString();return await Y.get(`${Lf(e)}/pending${r?`?${r}`:``}`)||[]}async function ap(e,t){return await Y.post(`${Lf(e)}/pending/decisions`,t)}async function op(e,t){return await Y.get(`${Lf(e)}/runs/${encodeURIComponent(t)}`)}async function sp(e,t={}){let n=new URLSearchParams;t.limit&&n.set(`limit`,String(t.limit)),t.handler&&n.set(`handler`,t.handler),t.event&&n.set(`event`,t.event),t.failed&&n.set(`failed`,`true`);let r=n.toString();return await Y.get(`${Lf(e)}/runs${r?`?${r}`:``}`)||[]}var cp=1e4,lp=`canvas.hooks.backfillLimit`;function up(e){let t=Math.floor(Number(e));return!Number.isFinite(t)||t<1?100:Math.min(t,cp)}function dp(){try{let e=localStorage.getItem(lp);return e?up(e):100}catch{return 100}}function fp(e){let t=up(e);try{localStorage.setItem(lp,String(t))}catch{}return t}function pp(e){if(e.includes(`/`)){let t=e.split(`/`)[0];return t===`lib`||t===`rules`?null:t}return e.endsWith(`.js`)?e.replace(/\.js$/,``).replace(/^(?:example-|disabled-|_)/,``):null}async function mp(e,t){return await Y.post(`${Lf(e)}/backfill`,t)}async function hp(e,t){return await Y.post(`${Lf(e)}/run`,t)}async function gp(e,t){return await Y.post(`${Lf(e)}/runs/${t}/replay`,{})}async function _p(e){return await Y.get(`${Lf(e)}/meta`)}async function vp(e,t){return await Y.post(`${Lf(e)}/generate`,t)}async function yp(e,t){let n=await zf(e,tp),r=JSON.parse(n),i=Array.isArray(r)?r:r?.rules;if(!Array.isArray(i))throw Error(`The workspace rules file is invalid. Fix it in Rules before adding a rule.`);let a=(Array.isArray(t)?t:[t]).filter(e=>!i.some(t=>t.id===e.id));if(!a.length)return;let o=Array.isArray(r)?[...i,...a]:{...r,rules:[...i,...a]};await Bf(e,tp,JSON.stringify(o,null,2)+`
8
- `)}var bp=yp;function xp(e){let t=[],n=!1;return{text:e.replace(/"[^"]*"|(^|\s)@id:([^\s]*)/g,(e,r,i)=>{if(i===void 0)return e;let a=i.replace(/^#/,``),o=Number(a);return!/^\d+$/.test(a)||!Number.isInteger(o)||o<=0||o>4294967295?n=!0:t.push(o),r}).trim(),ids:t,invalid:n}}function Sp(e,t){return e.slice(0,3).map(e=>{let n=t.get(e.id),r=e.reason===`not-found`?`Source missing from the storage index. Resync the source backend and retry.`:e.reason===`not found`?`Document no longer exists in this workspace. Refresh the list and select it again.`:e.reason;return`${n?`${n} (ID ${e.id})`:`Document ${e.id}`}: ${r}`}).join(`
9
- `)+(e.length>3?`\n…and ${e.length-3} more failed file${e.length===4?``:`s`}.`:``)}function Cp(){let e,t,n=!1,r=()=>{clearTimeout(e),e=void 0,t=void 0};return{cancel:r,start(i,a,o){r(),n=!1,t={x:i,y:a},e=setTimeout(()=>{e=void 0,n=!0,o()},500)},move(e,n){t&&Math.hypot(e-t.x,n-t.y)>10&&r()},consumeClick(){let e=n;return n=!1,e},contextMenu(){let e=n;return t&&(n=!0),r(),e},reset(){r(),n=!1}}}function wp(){let[e]=(0,Z.useState)(Cp);return(0,Z.useEffect)(()=>e.cancel,[e]),{onPointerDown:t=>{if(e.reset(),t.pointerType!==`touch`||!t.isPrimary)return;let n=t.target;if(!t.currentTarget.contains(n)||n.closest(`button, input, textarea, select, a, [contenteditable="true"], [role="dialog"]`))return;let{clientX:r,clientY:i}=t;e.start(r,i,()=>{n.dispatchEvent(new window.MouseEvent(`contextmenu`,{bubbles:!0,cancelable:!0,clientX:r,clientY:i}))})},onPointerMove:t=>e.move(t.clientX,t.clientY),onPointerUp:e.cancel,onPointerCancel:e.cancel,onPointerLeave:e.cancel,onDragStartCapture:t=>{e.cancel(),e.consumeClick()&&t.preventDefault()},onContextMenuCapture:t=>{t.isTrusted&&e.contextMenu()&&(t.preventDefault(),t.stopPropagation())},onClickCapture:t=>{e.consumeClick()&&(t.preventDefault(),t.stopPropagation())}}}function Tp(e,t,n,r,i=!1){let a=e.indexOf(n);if(a<0)return new Set(r);let o=t===null?-1:e.indexOf(t),s=o<0?a:o,c=i?new Set(r):new Set;for(let t of e.slice(Math.min(s,a),Math.max(s,a)+1))c.add(t);return c}function Ep(e){return e?e.remote?e.remote.permissions.includes(`admin`):e.access?e.access.isOwner||e.access.permissions.includes(`admin`):e.isShared||e.type===`shared`?typeof e.sharedVia==`object`&&e.sharedVia?.permissions?.includes(`admin`)===!0:!0:!1}var Dp=e=>typeof e==`string`?e:``,Op=e=>e&&typeof e==`object`?e:{},kp=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`).replace(/\r/g,`\\r`).replace(/\n/g,`\\n`).replace(/\t/g,`\\t`);function Ap(e){let t=e.data||{},n=e.schema===`data/schema/message/email`,r=!n&&e.schema.startsWith(`data/schema/message`),i=Dp(t.platform),a=Dp(Op(t.channel).id)||Dp(t.channel),o=[],s=(t,n,r)=>o.push({id:t,label:n,rule:{id:``,description:n,enabled:!0,when:{event:`document.inserted`,schema:e.schema,...r},then:[{action:`link`,paths:[]}]}}),c=i?{platform:{equals:i}}:{};if(n){let e=Dp(Op(t.from).address)||Dp(t.from);e&&s(`sender`,`Mail from ${e}`,{from:{equals:e}}),t.subject&&s(`subject`,`Subject matches regex`,{subject:{regex:kp(t.subject)}})}else if(r){let e=Dp(Op(t.sender).id)||Dp(Op(t.sender).username)||Dp(Op(t.sender).name)||Dp(t.sender),n=Dp(Op(t.sender).name)||Dp(Op(t.sender).username)||e;e&&s(`sender`,`Messages from ${n}`,{...c,sender:{equals:e}})}let l=Dp(t.body)||Dp(t.text)||Dp(t.content)||Dp(t.bodyHtml)||Dp(t.bodyPreview);if((n||r||l)&&s(`body`,n?`Email body matches regex`:`Text matches regex`,{...c,body:{regex:kp(l.slice(0,160))}}),r){let n=Dp(t.threadId)||([`slack`,`teams`].includes(i)?Dp(Op(e.metadata).remoteId):``);n&&a&&s(`thread`,`Messages in this thread`,{...c,channel:{equals:a},thread:{equals:n}}),a&&s(`channel`,i===`whatsapp`?`Messages in this conversation`:`Messages in this channel`,{...c,channel:{equals:a}})}return t.url&&s(`url`,`URL matches regex`,{url:{regex:kp(t.url)}}),s(`schema`,`All items of this type`,{}),o}var jp=[];function Mp(e){if(e.key!==`Escape`||e.isComposing||e.defaultPrevented)return;let t=jp[jp.length-1];t&&(e.preventDefault(),t())}function Np(e,t=!0){let n=(0,Z.useRef)(e);(0,Z.useEffect)(()=>{n.current=e});let r=t&&!!e;(0,Z.useEffect)(()=>{if(!r)return;let e=()=>n.current?.();return jp.push(e),jp.length===1&&window.addEventListener(`keydown`,Mp),()=>{let t=jp.indexOf(e);t>=0&&jp.splice(t,1),jp.length===0&&window.removeEventListener(`keydown`,Mp)}},[r])}var Pp=n(h(),1);function Fp({label:e,onClose:t,children:n}){return Np(t),(0,Pp.createPortal)((0,Q.jsx)(`div`,{className:`fixed inset-0 z-dialog flex items-center justify-center bg-scrim p-4`,onClick:t,children:(0,Q.jsx)(`section`,{"data-dialog-surface":!0,role:`dialog`,"aria-modal":`true`,"aria-label":e,className:`h-[86dvh] max-h-full min-h-0 w-full max-w-3xl overflow-y-auto rounded-(--panel-radius) border bg-popover text-popover-foreground shadow-elevation-4`,onClick:e=>e.stopPropagation(),children:n})}),window.document.body)}function Ip(e,t,n,r=new Date){let i=e=>String(e).padStart(2,`0`),a={YYYY:String(r.getFullYear()),YY:i(r.getFullYear()%100),MM:i(r.getMonth()+1),DD:i(r.getDate()),HH:i(r.getHours()),mm:i(r.getMinutes()),ss:i(r.getSeconds())},o=e=>e.replace(/\{\{\s*([A-Za-z]+)\s*\}\}/g,(e,t)=>a[t]??e),s=e=>e.split(/[\\/]+/).filter(e=>e&&e!==`.`&&e!==`..`).join(`/`),c=[e,s(o(t.trim()))].filter(Boolean).join(`/`),l=s(o(n.trim()));return{root:c,added:l,result:[c,l,`<attachment filename>`].filter(Boolean).join(`/`),date:`${a.YYYY}-${a.MM}-${a.DD}`}}function Lp(e){return`/workspaces/${e}/scripts`}async function Rp(e){return await Y.get(Lp(e))||[]}async function zp(e,t){return(await Y.get(`${Lp(e)}/${t}`))?.content??``}async function Bp(e,t,n){await Y.put(`${Lp(e)}/${t}`,{content:n})}async function Vp(e,t){await Y.delete(`${Lp(e)}/${t}`)}var Hp=`h-full w-[380px] max-w-[90vw] max-md:w-full`;function Up({onClose:e,children:t}){return(0,Pp.createPortal)((0,Q.jsx)(`div`,{className:`fixed inset-0 z-picker flex items-stretch justify-end bg-scrim animate-fade-in`,onClick:e,children:(0,Q.jsx)(`div`,{className:`h-full p-2 max-md:w-full max-md:p-1`,onClick:e=>e.stopPropagation(),children:t})}),window.document.body)}function Wp({x:e,y:t,onClose:n,className:r,children:i}){let a=(0,Z.useRef)(null),[o,s]=(0,Z.useState)({x:e,y:t});return Np(n),(0,Z.useLayoutEffect)(()=>{let n=a.current;if(!n)return;let{width:r,height:i}=n.getBoundingClientRect();s({x:Math.max(8,Math.min(e,window.innerWidth-r-8)),y:Math.max(8,Math.min(t,window.innerHeight-i-8))})},[e,t]),(0,Pp.createPortal)((0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`fixed inset-0 z-menu-scrim`,onClick:n,onContextMenu:e=>{e.preventDefault(),n()}}),(0,Q.jsx)(`div`,{ref:a,style:{left:o.x,top:o.y},className:q(`fixed z-menu max-h-viewport-modal overflow-y-auto`,r,`bg-popover text-popover-foreground`),children:i})]}),document.body)}var Gp=typeof navigator<`u`&&/Mac|iPhone|iPad/.test(navigator.platform||navigator.userAgent),Kp={Delete:`Del`,Backspace:`⌫`,Enter:`↵`,ArrowUp:`↑`,ArrowDown:`↓`};function qp(e){let t=e.split(`+`),n=t.pop()||``,r=Kp[n]||(n.length===1?n.toUpperCase():n);if(Gp){let e={Mod:`⌘`,Shift:`⇧`,Alt:`⌥`,Ctrl:`⌃`};return[...[`Ctrl`,`Alt`,`Shift`,`Mod`].filter(e=>t.includes(e)).map(t=>e[t]),r].join(``)}return[...t.map(e=>e===`Mod`?`Ctrl`:e),r].join(`+`)}function Jp(e,t){let n=t.split(`+`),r=n.pop()||``;return(Gp?e.metaKey:e.ctrlKey)!==n.includes(`Mod`)||e.shiftKey!==n.includes(`Shift`)||e.altKey!==n.includes(`Alt`)||Gp&&e.ctrlKey!==n.includes(`Ctrl`)?!1:r.length===1?e.key.toLowerCase()===r.toLowerCase():e.key===r}function Yp(e){if(e?.closest?.(`input, textarea, select, [contenteditable="true"], [role="dialog"], [role="menu"]`))return!0;let t=typeof window<`u`?window.getSelection():null;return!!t&&!t.isCollapsed&&t.toString().length>0}function Xp(e,t){if(e.defaultPrevented||e.nativeEvent.isComposing||Yp(e.target))return!1;let n=t.find(t=>t.shortcut&&!t.disabled&&Jp(e,t.shortcut));return n?(e.preventDefault(),e.stopPropagation(),n.run({shiftKey:e.shiftKey}),!0):!1}function Zp(e){return e.key===`ContextMenu`||e.key===`F10`&&e.shiftKey}function Qp(){return typeof window<`u`&&window.matchMedia(`(max-width: 767px)`).matches}function $p(e,t=`below`){let n=e.getBoundingClientRect();return t===`below`?{x:n.left,y:n.bottom+4}:{x:n.left+Math.min(24,n.width/2),y:n.top+Math.min(24,n.height/2)}}function em(e){let t=[];for(let n of e){let e=t[t.length-1];e&&(e[0].group??``)===(n.group??``)?e.push(n):t.push([n])}return t}function tm(e,t,n){t(),setTimeout(()=>{e.run({shiftKey:n})},0)}function nm({anchor:e,items:t,onClose:n,label:r}){let i=(0,Z.useRef)(null);return(0,Z.useEffect)(()=>{let e=document.activeElement;return i.current?.querySelector(`[role="menuitem"]:not([aria-disabled="true"])`)?.focus(),()=>{e?.isConnected&&e.focus({preventScroll:!0})}},[]),(0,Q.jsx)(Wp,{x:e.x,y:e.y,onClose:n,className:`min-w-[200px] rounded-lg border bg-popover text-popover-foreground py-1 shadow-elevation-3`,children:(0,Q.jsx)(`div`,{ref:i,role:`menu`,"aria-label":r,onKeyDown:e=>{let t=Array.from(i.current?.querySelectorAll(`[role="menuitem"]:not([aria-disabled="true"])`)??[]);if(t.length===0)return;let r=t.indexOf(document.activeElement),a=e=>t[(e+t.length)%t.length]?.focus();switch(e.key){case`ArrowDown`:e.preventDefault(),a(r+1);return;case`ArrowUp`:e.preventDefault(),a(r<0?-1:r-1);return;case`Home`:e.preventDefault(),a(0);return;case`End`:e.preventDefault(),a(-1);return;case`Tab`:e.preventDefault(),n();return}if(e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){let n=e.key.toLowerCase(),i=[...t.slice(r+1),...t.slice(0,r+1)].find(e=>e.textContent?.trim().toLowerCase().startsWith(n));i&&(e.preventDefault(),i.focus())}},onContextMenu:e=>e.preventDefault(),children:em(t).map((e,t)=>(0,Q.jsxs)(Z.Fragment,{children:[t>0&&(0,Q.jsx)(`div`,{role:`separator`,className:`my-1 h-px bg-border`}),e[0].groupLabel&&(0,Q.jsx)(`div`,{className:`px-3 py-1 text-[10px] font-medium uppercase tracking-wide text-muted-foreground`,children:e[0].groupLabel}),e.map(e=>{let t=e.icon;return(0,Q.jsxs)(`button`,{type:`button`,role:`menuitem`,tabIndex:-1,"aria-disabled":e.disabled||void 0,title:e.hint,onClick:t=>{e.disabled||tm(e,n,t.shiftKey)},className:q(`flex w-full items-center gap-2 px-3 py-1.5 text-left text-sm outline-none`,e.disabled?`cursor-default opacity-50`:e.destructive?`text-destructive hover:bg-destructive hover:text-destructive-foreground focus:bg-destructive focus:text-destructive-foreground`:`hover:bg-muted focus:bg-muted`),children:[t?(0,Q.jsx)(t,{className:`h-3.5 w-3.5 shrink-0`}):(0,Q.jsx)(`span`,{className:`w-3.5 shrink-0`}),(0,Q.jsx)(`span`,{className:`flex-1 truncate`,children:e.label}),e.shortcut&&(0,Q.jsx)(`kbd`,{className:`ml-4 shrink-0 font-sans text-[11px] text-muted-foreground`,children:qp(e.shortcut)})]},e.id)})]},`${e[0].group??``}:${t}`))})})}function rm({items:e,onClose:t,header:n}){Np(t);let r=`flex w-full items-center gap-3 rounded-xl border bg-card px-4 py-3.5 text-base font-medium transition-transform active:scale-[.98]`;return(0,Pp.createPortal)((0,Q.jsxs)(`div`,{role:`dialog`,"aria-modal":`true`,className:`fixed inset-0 z-fullscreen flex flex-col bg-popover text-popover-foreground animate-in slide-in-from-bottom-10 fade-in duration-normal`,onClick:t,onContextMenu:e=>e.preventDefault(),children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-start gap-3 border-b p-4`,onClick:e=>e.stopPropagation(),children:[(0,Q.jsx)(`div`,{className:`min-w-0 flex-1`,children:n}),(0,Q.jsx)(`button`,{type:`button`,onClick:t,className:`rounded-sm p-2 hover:bg-muted`,title:`Close`,"aria-label":`Close`,children:(0,Q.jsx)(W,{className:`h-5 w-5`})})]}),(0,Q.jsx)(`div`,{className:`min-h-4 flex-1`}),(0,Q.jsxs)(`div`,{className:`max-h-[75vh] shrink-0 space-y-2 overflow-y-auto px-4 pt-2`,style:{paddingBottom:`calc(var(--safe-bottom) + 1.25rem)`},onClick:e=>e.stopPropagation(),children:[em(e).map((e,n)=>(0,Q.jsxs)(`div`,{className:q(`space-y-2`,n>0&&`pt-2`),children:[e[0].groupLabel&&(0,Q.jsx)(`div`,{className:`px-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground`,children:e[0].groupLabel}),e.map(e=>{let n=e.icon;return(0,Q.jsxs)(`button`,{type:`button`,disabled:e.disabled,onClick:n=>tm(e,t,n.shiftKey),className:q(r,e.destructive&&`border-destructive/30 text-destructive`,e.disabled&&`opacity-50`),children:[n&&(0,Q.jsx)(n,{className:q(`h-5 w-5 shrink-0`,!e.destructive&&`text-muted-foreground`)}),e.label]},e.id)})]},`${e[0].group??``}:${n}`)),(0,Q.jsx)(`button`,{type:`button`,onClick:t,className:`${r} justify-center bg-muted`,children:`Cancel`})]})]}),window.document.body)}function im({anchor:e,items:t,onClose:n,label:r,header:i}){return t.length===0?null:Qp()?(0,Q.jsx)(rm,{items:t,onClose:n,header:i??(r&&(0,Q.jsx)(`div`,{className:`truncate text-base font-semibold`,children:r}))}):(0,Q.jsx)(nm,{anchor:e,items:t,onClose:n,label:r})}var am=null;function om(){return am||=fetch(`https://api.iconify.design/collection?prefix=ph`).then(e=>e.json()).then(e=>[...e.uncategorized??[],...Object.values(e.categories??{}).flat()].filter(e=>e.endsWith(`-fill`)).map(e=>`ph:${e}`)).catch(()=>(am=null,[])),am}async function sm(e,t=120){let n=e.trim();if(!n)return[];try{let e=await(await fetch(`https://api.iconify.design/search?query=${encodeURIComponent(n)}&limit=${t}`)).json();return Array.isArray(e.icons)?e.icons:[]}catch{return[]}}var cm=[`#ef4444`,`#f97316`,`#f59e0b`,`#eab308`,`#84cc16`,`#22c55e`,`#14b8a6`,`#06b6d4`,`#3b82f6`,`#6366f1`,`#8b5cf6`,`#a855f7`,`#ec4899`,`#f43f5e`,`#64748b`,`#78716c`],lm={home:{icon:`ph:house-fill`,color:`#3b82f6`},travel:{icon:`ph:airplane-tilt-fill`,color:`#06b6d4`},work:{icon:`ph:briefcase-fill`,color:`#64748b`},books:{icon:`ph:books-fill`,color:`#a855f7`},workouts:{icon:`ph:barbell-fill`,color:`#22c55e`},sport:{icon:`ph:barbell-fill`,color:`#22c55e`},sports:{icon:`ph:barbell-fill`,color:`#22c55e`},fitness:{icon:`ph:barbell-fill`,color:`#22c55e`},beauty:{icon:`ph:flower-lotus-fill`,color:`#ec4899`},recipes:{icon:`ph:cooking-pot-fill`,color:`#f97316`},"to watch":{icon:`ph:monitor-play-fill`,color:`#f43f5e`},"to read":{icon:`ph:book-open-text-fill`,color:`#8b5cf6`},learning:{icon:`ph:graduation-cap-fill`,color:`#6366f1`},tech:{icon:`ph:cpu-fill`,color:`#14b8a6`},music:{icon:`ph:music-notes-fill`,color:`#eab308`},finance:{icon:`ph:piggy-bank-fill`,color:`#84cc16`},shopping:{icon:`ph:shopping-cart-fill`,color:`#f59e0b`},ideas:{icon:`ph:lightbulb-filament-fill`,color:`#facc15`},data:{icon:`ph:database-fill`,color:`#14b8a6`}},um={"workspace:home":{icon:`ph:house-fill`,color:`#3b82f6`},"workspace:data":{icon:`ph:database-fill`,color:`#14b8a6`}},dm={file:{icon:`ph:folder-fill`,color:`#64748b`},cacache:{icon:`ph:database-fill`,color:`#14b8a6`},s3:{icon:`ph:cloud-fill`,color:`#0ea5e9`},gdrive:{icon:`mdi:google-drive`,color:`#fbbc04`},http:{icon:`ph:globe-fill`,color:`#0ea5e9`},imap:{icon:`ph:envelope-fill`,color:`#a855f7`}},fm={icon:`ph:hard-drive-fill`,color:`#64748b`};function pm(e){let t=e.config?.ui??{},n=e.address&&um[e.address]||e.driver&&dm[e.driver]||fm;return{icon:typeof t.icon==`string`?t.icon:n.icon??fm.icon,color:typeof t.color==`string`?t.color:n.color??fm.color}}function mm(e){let t=e.metadata?.ui??{},n=lm[String(e.label??e.name??``).trim().toLowerCase()];return{icon:typeof t.icon==`string`?t.icon:n?.icon,color:typeof t.color==`string`?t.color:e.color??n?.color}}function hm(e){let t=lm[(e.split(`/`).filter(Boolean).pop()??``).trim().toLowerCase()];return t?{metadata:gm(void 0,t)}:null}function gm(e,t){let n={...e??{}},r={...n.ui??{}};return`icon`in t&&(t.icon?r.icon=t.icon:delete r.icon),`color`in t&&(t.color?r.color=t.color:delete r.color),n.ui=r,n}var _m=(e,t)=>Math.floor(Math.random()*(t-e+1))+e,vm=()=>({h:_m(0,360),s:_m(42,98),l:_m(40,90)}),ym=(e,t,n)=>{t/=100,n/=100;let r=(1-Math.abs(2*n-1))*t,i=r*(1-Math.abs(e/60%2-1)),a=n-r/2,o=0,s=0,c=0;0<=e&&e<60?(o=r,s=i):60<=e&&e<120?(o=i,s=r):120<=e&&e<180?(s=r,c=i):180<=e&&e<240?(s=i,c=r):240<=e&&e<300?(o=i,c=r):300<=e&&e<360&&(o=r,c=i),o=Math.round((o+a)*255),s=Math.round((s+a)*255),c=Math.round((c+a)*255);let l=e=>e.toString(16).padStart(2,`0`);return`#${l(o)}${l(s)}${l(c)}`},bm=()=>{let{h:e,s:t,l:n}=vm();return ym(e,t,n)},xm=e=>{let t=e.trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);if(!t)return null;let n=t[1];n.length===3&&(n=n.split(``).map(e=>e+e).join(``));let r=e=>{let t=parseInt(n.slice(e*2,e*2+2),16)/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4};return .2126*r(0)+.7152*r(1)+.0722*r(2)},Sm=(e,t=.82)=>{let n=xm(e);return n===null||n>t},Cm=e=>e&&!Sm(e)?e:void 0,wm=e=>{if(!e)return`text-muted-foreground/70`;let t=xm(e);return t!==null&&t>.5?`text-black/45`:`text-white/80`},Tm=e=>{let t=xm(e);return t!==null&&(t+.05)/.05>=1.05/(t+.05)?`text-black`:`text-white`},Em=[{color:`text-data-1`,chip:`bg-data-1/15`},{color:`text-data-2`,chip:`bg-data-2/15`},{color:`text-data-3`,chip:`bg-data-3/15`},{color:`text-data-4`,chip:`bg-data-4/15`},{color:`text-data-5`,chip:`bg-data-5/15`},{color:`text-data-6`,chip:`bg-data-6/15`},{color:`text-data-7`,chip:`bg-data-7/15`},{color:`text-data-8`,chip:`bg-data-8/15`},{color:`text-data-9`,chip:`bg-data-9/15`},{color:`text-data-10`,chip:`bg-data-10/15`},{color:`text-data-11`,chip:`bg-data-11/15`},{color:`text-data-12`,chip:`bg-data-12/15`}];function Dm(e,t){return{Icon:e,...Em[t-1]}}var Om={tab:Dm(Xe,7),link:Dm(Xe,7),email:Dm(xt,3),note:Dm(qn,3),task:Dm(Ct,5),message:Dm(mt,6),identity:Dm(Ge,2),contact:Dm(Ge,2),device:Dm(In,10),application:Dm(Je,11),dotfile:Dm(en,4),document:Dm(rn,9)},km=[{test:/^image\//,spec:Dm(ln,5)},{test:/^video\//,spec:Dm(Cn,11)},{test:/^audio\//,spec:Dm(nt,10)},{test:/pdf$/,spec:Dm(rn,1)},{test:/zip|tar|gzip|7z|rar|compressed/,spec:Dm(mn,12)},{test:/json|javascript|typescript|xml|html|css|x-sh|python/,spec:Dm(At,6)},{test:/^text\//,spec:Dm(rn,12)}],Am=Dm(zn,6),jm=Dm(zn,9);function Mm(e){let t=(e.schema||``).split(`/`).pop()||``;if(t===`file`){let t=String(e.metadata?.contentType||``).toLowerCase();return km.find(({test:e})=>e.test(t))?.spec||Am}return Om[t]||jm}var Nm={3.5:`h-3.5 w-3.5`,4:`h-4 w-4`,5:`h-5 w-5`,10:`h-10 w-10`};function Pm(e){let t=[],n=typeof e?.favIconUrl==`string`?e.favIconUrl:``;/^https?:\/\//i.test(n)&&t.push(n);let r=typeof e?.url==`string`?e.url:``;try{let e=new URL(r).origin;if(/^https?:/i.test(e)){let n=`${e}/favicon.ico`;t.includes(n)||t.push(n)}}catch{}return t}function Fm({document:e,size:t=4,chip:n=!1,className:r}){let i=Mm(e),a=e.schema===`data/schema/tab`?Pm(e.data):[],[o,s]=(0,Z.useState)(0),c=a[o]??null,l=c?(0,Q.jsx)(`img`,{src:c,alt:``,loading:`lazy`,onError:()=>s(e=>e+1),className:q(Nm[t],`rounded-xs object-contain`,!n&&`shrink-0`,!n&&r)}):(0,Q.jsx)(i.Icon,{className:q(Nm[t],i.color,!n&&`shrink-0`,!n&&r)});return n?(0,Q.jsx)(`span`,{className:q(`inline-flex shrink-0 items-center justify-center rounded-md`,t>=10?`p-3`:`p-1`,i.chip,r),children:l}):l}function Im({items:e,onNavigate:t,disabled:n,className:r,label:i=`Tree path`}){let a=(0,Z.useRef)(null),o=e[e.length-1]?.path;return(0,Z.useEffect)(()=>{let e=a.current;e&&(e.scrollLeft=e.scrollWidth)},[o]),(0,Q.jsx)(`nav`,{"aria-label":i,className:q(`min-w-0 flex-1`,r),children:(0,Q.jsx)(`ol`,{ref:a,className:`flex min-w-0 items-center gap-1 overflow-x-auto py-0.5 text-sm`,children:e.map((r,i)=>{let a=i===e.length-1,o=q(`block max-w-56 truncate rounded px-1.5 py-1`,a?`font-medium text-foreground`:`text-muted-foreground`);return(0,Q.jsxs)(`li`,{className:`flex shrink-0 items-center gap-1`,children:[i>0&&(0,Q.jsx)(`span`,{"aria-hidden":`true`,className:`text-muted-foreground/60`,children:`/`}),t&&!a?(0,Q.jsx)(`button`,{type:`button`,title:r.path===`/`?`${r.label} (root)`:r.path,disabled:n,onClick:()=>t(r.path),className:q(o,`hover:bg-accent hover:text-foreground hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50`),children:r.label}):(0,Q.jsx)(`span`,{title:r.path===`/`?r.label:r.path,"aria-current":a?`location`:void 0,className:o,children:r.label})]},r.path)})})})}function Lm(e,t){let n=e.split(`/`).filter(Boolean);return[{label:t,path:`/`},...n.map((e,t)=>({label:e,path:`/${n.slice(0,t+1).join(`/`)}`}))]}var Rm={context:(0,Q.jsx)(ie,{className:`h-3.5 w-3.5`}),directory:(0,Q.jsx)(ne,{className:`h-3.5 w-3.5`}),backends:(0,Q.jsx)(Fe,{className:`h-3.5 w-3.5`}),relations:(0,Q.jsx)(Mn,{className:`h-3.5 w-3.5`})},zm={context:`Context tree`,directory:`Directory tree`,backends:`Backends tree`,relations:`Relations`};function Bm(e,t){return e===`/`?`/${t}`:`${e}/${t}`}function Vm(e,t){let n=(0,Z.useRef)(null),r=(0,Z.useRef)(!1),i=()=>{n.current&&=(clearTimeout(n.current),null)},a=e=>t=>{if(r.current){r.current=!1;return}t.detail>1||e()};return t?{guardClick:a,handlers:{onContextMenu:n=>{n.preventDefault(),n.stopPropagation(),t({clientX:n.clientX,clientY:n.clientY,path:e})},onPointerDown:a=>{if(a.pointerType!==`touch`)return;let{clientX:o,clientY:s}=a;i(),n.current=setTimeout(()=>{r.current=!0,t({clientX:o,clientY:s,path:e})},500)},onPointerUp:i,onPointerLeave:i,onPointerMove:i}}:{handlers:{},guardClick:a}}function Hm(e,t,n){let r=Bm(t,e.name);return r.toLowerCase().includes(n)||(e.label||``).toLowerCase().includes(n)?!0:e.children?.some(e=>Hm(e,r,n))??!1}var Um=200;function Wm({onConfirm:e,onCancel:t,busy:n}){let[r,i]=(0,Z.useState)(``);return(0,Q.jsxs)(`div`,{className:`flex min-h-11 items-center gap-2 rounded-(--card-radius) bg-card px-3 py-2.5 text-sm shadow-elevation-1`,children:[(0,Q.jsx)(Be,{className:`h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`input`,{type:`text`,value:r,onChange:e=>i(e.target.value),onKeyDown:n=>{n.key===`Enter`&&r.trim()&&e(r.trim()),n.key===`Escape`&&t()},onBlur:()=>{n||t()},placeholder:`New folder name…`,autoFocus:!0,disabled:n,className:`w-full flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground`}),n&&(0,Q.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:`Creating…`})]})}function Gm({node:e,parentPath:t,query:n,selected:r,onToggle:i,onActivate:a,onRowMenu:o,createParent:s,onCreateConfirm:c,onCreateCancel:l,creating:u}){let d=Bm(t,e.name),p=!!e.children?.length,[m,h]=(0,Z.useState)(!1),{handlers:g,guardClick:_}=Vm(d,o);if(n&&!Hm(e,t,n))return null;let v=s===d,y=m||n.length>0||v,b=r.has(d),x=e.type===`canvas`,S=mm(e);return(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:q(`group relative flex min-h-11 items-center gap-2 rounded-md px-3 py-2.5 cursor-pointer transition-all select-none text-sm shadow-elevation-1 hover:shadow`,`before:absolute before:left-0 before:top-0 before:bottom-0 before:w-1.5 before:transition-colors`,b?`bg-primary/[0.08] hover:bg-primary/[0.12] before:bg-primary`:`bg-card hover:bg-primary/[0.04] before:bg-transparent`),onClick:_(()=>i(d)),onDoubleClick:e=>{e.ctrlKey||e.metaKey||e.shiftKey||e.altKey||e.target.closest(`button,input,textarea,select,a,[contenteditable="true"]`)||(e.preventDefault(),e.stopPropagation(),p?h(e=>!e):a?.(d))},title:d,...g,children:[(0,Q.jsx)(`button`,{type:`button`,"aria-label":`${y?`Collapse`:`Expand`} ${e.label||e.name}`,"aria-expanded":p?y:void 0,disabled:!p,className:q(`shrink-0 text-muted-foreground hover:text-foreground`,!p&&`invisible`),onClick:e=>{e.stopPropagation(),e.detail<=1&&h(e=>!e)},children:y?(0,Q.jsx)(Ze,{className:`w-4 h-4`}):(0,Q.jsx)(gr,{className:`w-4 h-4`})}),(0,Q.jsx)(f,{icon:S.icon||(x?`ph:squares-four-fill`:`ph:folder-fill`),width:16,height:16,color:Cm(S.color),className:q(`shrink-0`,!Cm(S.color)&&(x?`text-primary`:`text-muted-foreground`))}),(0,Q.jsx)(`span`,{className:`flex-1 truncate font-medium`,title:e.description||void 0,children:e.label||e.name})]}),y&&p||v?(0,Q.jsxs)(`div`,{className:`ml-[22px] mt-1.5 space-y-1.5`,children:[v&&c&&l&&(0,Q.jsx)(Wm,{busy:u,onConfirm:e=>{h(!0),c(d,e)},onCancel:l}),y&&e.children?.map(e=>(0,Q.jsx)(Gm,{node:e,parentPath:d,query:n,selected:r,onToggle:i,onActivate:a,onRowMenu:o,createParent:s,onCreateConfirm:c,onCreateCancel:l,creating:u},e.id||e.name))]}):null]})}function Km({workspaces:e,loading:t,onPick:n}){return t&&e.length===0?(0,Q.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground`,children:`Loading…`}):e.length===0?(0,Q.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground`,children:`No workspaces found`}):(0,Q.jsx)(`div`,{className:`space-y-1.5`,children:e.map(e=>{let t=Cm(e.color);return(0,Q.jsxs)(`div`,{onClick:()=>n(e.name),className:`group relative flex cursor-pointer items-center gap-2 rounded-(--card-radius) bg-card px-3 py-2.5 shadow-elevation-1 transition-all hover:bg-accent/50 hover:shadow`,style:{borderRight:`6px solid ${t||`transparent`}`},children:[(0,Q.jsx)(f,{icon:e.icon||`ph:stack-fill`,width:18,height:18,color:t,className:q(`shrink-0`,!t&&`text-muted-foreground`)}),(0,Q.jsx)(`span`,{className:`flex-1 truncate text-sm font-medium`,children:e.label||e.name}),(0,Q.jsx)(gr,{className:`h-4 w-4 shrink-0 text-muted-foreground`})]},e.id||e.name)})})}function qm({workspaceName:e,treeTab:t,onTreeTabChange:n,selectedDocIds:r,onToggleDoc:i,onNavigate:a,excludeDocumentIds:o}){let[s,c]=(0,Z.useState)(`folder`),[l,u]=(0,Z.useState)(``),d=l.trim().toLowerCase(),[f,p]=(0,Z.useState)(`/`),[m,h]=(0,Z.useState)(null),[g,_]=(0,Z.useState)(!1),[v,y]=(0,Z.useState)([]),[b,x]=(0,Z.useState)(!1),[S,C]=(0,Z.useState)(``),[w,T]=(0,Z.useState)(``),[E,D]=(0,Z.useState)(t),O=n?t:E,k=e=>{p(`/`),c(`folder`),C(``),T(``),a?.(`/`),n?n(e):D(e)},[A,j]=(0,Z.useState)(O);O!==A&&(j(O),p(`/`),c(`folder`)),(0,Z.useEffect)(()=>{let e=setTimeout(()=>T(S.trim()),300);return()=>clearTimeout(e)},[S]),(0,Z.useEffect)(()=>{let t=!1;async function n(){_(!0);try{let n=await Ci(e,O);t||h(n)}catch{t||h(null)}finally{t||_(!1)}}return n(),()=>{t=!0}},[e,O]),(0,Z.useEffect)(()=>{if(s!==`documents`)return;let t=!1,n=O===`directory`?`directory`:lo,r=O===`context`?`context`:`directory`;async function i(){x(!0);try{let i=w?await Na(e,f,[],{treeName:n,treeType:r,q:w,limit:Um}):await to(e,f,n,{limit:Um});t||y(i.payload||[])}catch{t||y([])}finally{t||x(!1)}}return i(),()=>{t=!0}},[e,O,f,s,w]);let M=e=>{p(e),a?.(e)},N=o?.size?v.filter(e=>!o.has(e.id)):v;return s===`folder`?(0,Q.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col`,children:[(0,Q.jsxs)(`div`,{className:`shrink-0 space-y-2 border-b bg-muted/30 px-3 py-2`,children:[!n&&(0,Q.jsx)(`div`,{className:`flex items-center gap-1 rounded-md border border-input p-0.5`,children:[`context`,`directory`].map(e=>(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>k(e),className:q(`flex flex-1 items-center justify-center gap-1.5 rounded px-2 py-1 text-xs transition-colors`,O===e?`bg-primary text-primary-foreground`:`text-muted-foreground hover:bg-muted hover:text-foreground`),title:`Browse the ${zm[e].toLowerCase()}`,children:[Rm[e],(0,Q.jsx)(`span`,{className:`font-mono`,children:e===`directory`?`dir://`:`ctx://`})]},e))}),(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Step 1 of 2 · Pick a folder`}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>c(`documents`),className:`inline-flex items-center gap-1 rounded-md bg-primary px-2.5 py-1 text-xs font-medium text-primary-foreground transition-opacity hover:opacity-90`,children:[`Next `,(0,Q.jsx)(gr,{className:`h-3.5 w-3.5`})]})]}),(0,Q.jsx)(Im,{items:Lm(f,e),onNavigate:M,label:`Folder path`}),(0,Q.jsxs)(`div`,{className:`relative`,children:[(0,Q.jsx)(nr,{className:`pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground`}),(0,Q.jsx)(`input`,{type:`text`,placeholder:`Filter folders…`,value:l,onChange:e=>u(e.target.value),className:`w-full rounded-md border border-input bg-background py-1.5 pl-8 pr-3 text-xs placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring`})]})]}),(0,Q.jsx)(`div`,{className:`min-h-0 flex-1 space-y-1.5 overflow-y-auto p-3`,children:g?(0,Q.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground`,children:`Loading…`}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:q(`group relative flex min-h-11 items-center gap-2 rounded-md px-3 py-2.5 cursor-pointer transition-all select-none text-sm shadow-elevation-1 hover:shadow`,`before:absolute before:left-0 before:top-0 before:bottom-0 before:w-1.5 before:transition-colors`,f===`/`?`bg-primary/[0.08] hover:bg-primary/[0.12] before:bg-primary`:`bg-card hover:bg-primary/[0.04] before:bg-transparent`),onClick:()=>M(`/`),onDoubleClick:()=>{M(`/`),c(`documents`)},title:`/`,children:[(0,Q.jsx)(Ze,{className:`w-4 h-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`flex-1 truncate font-medium`,children:`/`})]}),(0,Q.jsx)(`div`,{className:`ml-[22px] space-y-1.5`,children:m?.children?.length?m.children.map(e=>(0,Q.jsx)(Gm,{node:e,parentPath:`/`,query:d,selected:new Set([f]),onToggle:M,onActivate:e=>{M(e),c(`documents`)}},e.id||e.name)):(0,Q.jsx)(`p`,{className:`px-2 py-1.5 text-xs text-muted-foreground`,children:`Empty tree`})})]})})]}):(0,Q.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col`,children:[(0,Q.jsxs)(`div`,{className:`shrink-0 space-y-2 border-b bg-muted/30 px-3 py-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>c(`folder`),className:`inline-flex min-w-0 items-center gap-1 rounded-md px-1.5 py-1 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,title:`Back to folders`,children:[(0,Q.jsx)(gr,{className:`h-3.5 w-3.5 shrink-0 rotate-180`}),(0,Q.jsx)(`span`,{children:`Folders`})]}),(0,Q.jsx)(`span`,{className:`ml-auto shrink-0 text-xs text-muted-foreground`,children:`Step 2 of 2 · Pick a document`})]}),(0,Q.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,Q.jsxs)(`span`,{className:`shrink-0 font-mono text-xs text-muted-foreground`,children:[`[`,O,`]`]}),(0,Q.jsx)(Im,{items:Lm(f,e),onNavigate:M,label:`Document folder path`})]}),(0,Q.jsxs)(`div`,{className:`relative`,children:[(0,Q.jsx)(nr,{className:`pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground`}),(0,Q.jsx)(`input`,{type:`text`,placeholder:`Search documents in this folder…`,value:S,onChange:e=>C(e.target.value),className:`w-full rounded-md border border-input bg-background py-1.5 pl-8 pr-7 text-xs placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring`}),S&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>C(``),className:`absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground`,"aria-label":`Clear document search`,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]})]}),(0,Q.jsx)(`div`,{className:`min-h-0 flex-1 space-y-1 overflow-y-auto p-3`,children:b?(0,Q.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground`,children:`Loading documents…`}):N.length===0?(0,Q.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground`,children:w?`No documents match “${w}” here.`:`No documents in this folder.`}):N.map(e=>{let t=Ni(e),n=r.has(e.id);return(0,Q.jsxs)(`div`,{onClick:()=>i(e.id),className:q(`flex min-h-9 items-center gap-2 rounded-md px-3 py-1.5 cursor-pointer transition-all select-none text-sm`,n?`bg-primary/[0.08] hover:bg-primary/[0.12]`:`hover:bg-primary/[0.04]`),children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:n,onChange:()=>i(e.id),className:`shrink-0`,onClick:e=>e.stopPropagation()}),(0,Q.jsx)(Fm,{document:e,size:3.5}),(0,Q.jsx)(`span`,{className:`flex-1 truncate`,children:t.title})]},e.id)})})]})}function Jm({onClose:e,onConfirm:t,documentCount:n,fixedWorkspaceName:r,excludeWorkspace:i,multiple:a=!0,saving:o=!1,savingContent:s,sizeClassName:c,tabs:l=[`context`,`directory`],title:u,confirmLabel:d,backendFolderCreation:f,onConfirmRelation:p,relationWorkspaceName:m,relationPredicates:h,relationExcludeIds:g}){let[_,v]=(0,Z.useState)(r?`tree`:`workspace`),[y,b]=(0,Z.useState)([]),[x,S]=(0,Z.useState)(!r),[C,w]=(0,Z.useState)(r??null),[T,E]=(0,Z.useState)(l.includes(`context`)||l.includes(`directory`)?`pins`:l[0]??`context`),D=h?.length?h:[...ro],[O,k]=(0,Z.useState)(D[0]??`references`),[A,j]=(0,Z.useState)(`out`),[M,N]=(0,Z.useState)(new Set),[P,ee]=(0,Z.useState)(null),[F,I]=(0,Z.useState)(`context`),[L,R]=(0,Z.useState)(!1),te=T===`pins`?F:T;(0,Z.useEffect)(()=>{if(!C)return;let e=!1;return si(C).then(t=>{e||ee(t)}).catch(()=>{e||R(!0)}),()=>{e=!0}},[C]);let z=T===`relations`,[ne,B]=(0,Z.useState)(null),[re,V]=(0,Z.useState)(!1),[ie,ae]=(0,Z.useState)(new Set),[oe,H]=(0,Z.useState)(``),se=oe.trim().toLowerCase(),{showErrorToast:ce}=Gr(),[U,le]=(0,Z.useState)(null),[ue,de]=(0,Z.useState)(null),[fe,pe]=(0,Z.useState)(!1);Np(e,!o&&!fe);let me=Vm(`/`,e=>le(e)),he=e=>!o&&(T===`backends`?f?.canCreate(e)===!0:T!==`pins`&&T!==`relations`),ge=async(e,t)=>{let n=t.trim().replace(/^\/+|\/+$/g,``);if(!(!n||!C||fe||!he(e))){pe(!0);try{let t=`${e===`/`?``:e}/${n}`,r=T===`context`?lo:T;T===`backends`?await f.create(e,n):await Ga(C,t,!0,r),Aa(C,r),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:C,treeName:r,cacheInvalidated:!0}}));let i=await Ci(C,T);B(i),ae(e=>a?new Set([...e,t]):new Set([t])),H(``),de(null)}catch(e){ce(e instanceof Error?e.message:`Failed to create folder`)}finally{pe(!1)}}},[_e,ve]=(0,Z.useState)(r);r!==_e&&(ve(r),r||S(!0)),(0,Z.useEffect)(()=>{r||ji().then(e=>b(e.filter(e=>e.id!==i&&e.name!==i))).catch(()=>b([])).finally(()=>S(!1))},[r,i]),(0,Z.useEffect)(()=>{if(!C||T===`relations`||T===`pins`)return;let e=!1,t=0;async function n(n=!1){let r=++t;n||V(!0);try{let n=await Ci(C,T);!e&&r===t&&B(n)}catch{!e&&r===t&&!n&&B(null)}finally{!e&&r===t&&V(!1)}}let r=e=>{let t=e.detail;t?.workspaceName&&t.workspaceName!==C||t?.treeName&&t.treeName!==T||(t?.cacheInvalidated||Aa(C,T),n(!0))};return window.addEventListener(`workspace:tree:refresh`,r),n(),()=>{e=!0,window.removeEventListener(`workspace:tree:refresh`,r)}},[C,T]);let ye=e=>{e!==C&&(ee(null),R(!1)),E(l.includes(`context`)||l.includes(`directory`)?`pins`:l[0]??`context`),w(e),ae(new Set),N(new Set),v(`tree`)},G=e=>{N(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},K=e=>{if(!a){ae(new Set([e]));return}ae(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},be=z?M.size>0&&!!p:ie.size>0,xe=async()=>{if(!(!C||o||!be)){if(z){await p?.({predicate:O,direction:A,targetIds:Array.from(M)},{workspaceName:m??C});return}await t(Array.from(ie),{workspaceName:C,treeName:te===`context`?lo:te,treeType:te===`context`?`context`:`directory`})}},Se=n??1;return o&&s?(0,Q.jsx)(`div`,{className:q(`flex flex-col overflow-hidden rounded-(--panel-radius) border bg-card shadow-elevation-4`,c||`h-viewport-card max-h-full w-[min(380px,90vw)] max-md:h-full max-md:w-full max-md:shadow-elevation-5`),children:s}):(0,Q.jsxs)(`div`,{className:q(`flex flex-col overflow-hidden rounded-(--panel-radius) border bg-card shadow-elevation-4`,c||`h-viewport-card max-h-full w-[min(380px,90vw)] max-md:h-full max-md:w-full max-md:shadow-elevation-5`),children:[(0,Q.jsxs)(`div`,{className:`flex h-12 shrink-0 items-center justify-between border-b px-4`,children:[(0,Q.jsxs)(`span`,{className:`flex items-center gap-2 text-sm font-medium`,children:[(0,Q.jsx)(Qt,{className:`h-4 w-4`}),u??(_===`workspace`?`Link to…`:z?`Relate ${Se} document${Se===1?``:`s`} to…`:`Link ${Se} document${Se===1?``:`s`} to…`)]}),(0,Q.jsx)(`button`,{type:`button`,onClick:e,disabled:o||fe,className:`text-muted-foreground transition-colors hover:text-foreground disabled:opacity-40`,"aria-label":`Close`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:(0,Q.jsxs)(`div`,{className:`grid h-full w-[200%] grid-cols-2 transition-transform duration-normal`,style:{transform:_===`workspace`?`translateX(0)`:`translateX(-50%)`},children:[(0,Q.jsx)(`div`,{className:`flex min-w-0 flex-col overflow-y-auto p-2`,children:(0,Q.jsx)(Km,{workspaces:y,loading:x,onPick:ye})}),(0,Q.jsxs)(`div`,{className:`flex min-w-0 flex-col overflow-hidden`,children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 overflow-x-auto border-b px-2 pt-2`,children:[!r&&(0,Q.jsx)(`button`,{type:`button`,disabled:fe,onClick:()=>v(`workspace`),className:`mr-1 rounded p-1.5 text-muted-foreground hover:bg-muted hover:text-foreground touch-target`,"aria-label":`Back to workspaces`,children:(0,Q.jsx)(gr,{className:`h-4 w-4 rotate-180`})}),(l.includes(`context`)||l.includes(`directory`))&&(0,Q.jsxs)(`button`,{type:`button`,disabled:fe,onClick:()=>{E(`pins`),ae(new Set),de(null)},className:q(`flex shrink-0 items-center gap-1.5 border-b-2 px-3 py-2 text-xs`,T===`pins`?`border-primary`:`border-transparent text-muted-foreground`),children:[(0,Q.jsx)(ke,{className:`h-3.5 w-3.5`}),`Pins`]}),l.map(e=>(0,Q.jsxs)(`button`,{type:`button`,disabled:fe,onClick:()=>{E(e),ae(new Set),de(null)},className:q(`flex shrink-0 items-center gap-1.5 rounded-t-md border-b-2 px-3 py-2 text-xs font-medium transition-colors`,T===e?`border-primary text-foreground`:`border-transparent text-muted-foreground hover:text-foreground`),children:[Rm[e],zm[e]]},e))]}),!z&&(0,Q.jsx)(`div`,{className:`shrink-0 border-b p-2`,children:(0,Q.jsxs)(`div`,{className:`relative`,children:[(0,Q.jsx)(nr,{className:`pointer-events-none absolute left-2.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground`}),(0,Q.jsx)(`input`,{type:`text`,placeholder:`Search paths…`,value:oe,onChange:e=>H(e.target.value),className:`w-full rounded-md border border-input bg-background py-2 pl-9 pr-3 text-sm placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring`})]})}),z&&(0,Q.jsxs)(`div`,{className:`shrink-0 space-y-2 border-b bg-primary/[0.04] px-3 py-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`label`,{htmlFor:`relation-predicate`,className:`shrink-0 text-xs text-muted-foreground`,children:`Predicate`}),(0,Q.jsx)(`select`,{id:`relation-predicate`,value:O,onChange:e=>k(e.target.value),className:`min-w-0 flex-1 rounded-md border border-input bg-background px-2 py-1.5 text-xs focus:outline-none focus:ring-2 focus:ring-ring`,children:D.map(e=>(0,Q.jsx)(`option`,{value:e,children:e},e))})]}),(0,Q.jsx)(`div`,{className:`flex items-center gap-1`,children:[{dir:`out`,label:`This → picked`,hint:`the ${Se===1?`document`:`documents`} you started from ${O} the picked one(s)`},{dir:`in`,label:`Picked → this`,hint:`the picked document(s) ${O} the ${Se===1?`one`:`ones`} you started from`}].map(({dir:e,label:t,hint:n})=>(0,Q.jsx)(`button`,{type:`button`,title:n,onClick:()=>j(e),className:q(`flex-1 rounded-md border px-2 py-1.5 text-xs transition-colors`,A===e?`border-primary bg-primary text-primary-foreground`:`border-input hover:bg-accent`),children:t},e))})]}),!z&&a&&ie.size>0&&(0,Q.jsx)(`div`,{className:`flex shrink-0 flex-wrap gap-1.5 border-b bg-primary/[0.04] px-3 py-2`,children:Array.from(ie).map(e=>(0,Q.jsxs)(`span`,{className:`inline-flex max-w-full items-center gap-1 rounded-full bg-primary px-2 py-0.5 text-xs text-primary-foreground`,children:[(0,Q.jsx)(`span`,{className:`truncate`,title:e,children:e}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>K(e),className:`shrink-0 rounded-full hover:bg-primary-foreground/20`,"aria-label":`Remove ${e}`,children:(0,Q.jsx)(W,{className:`h-3 w-3`})})]},e))}),z&&(m??C)&&(0,Q.jsx)(qm,{workspaceName:m??C,treeTab:`context`,selectedDocIds:M,onToggleDoc:G,excludeDocumentIds:g}),T===`pins`&&(0,Q.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-3 space-y-2`,children:[!P&&!L&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading pins…`}),L&&(0,Q.jsx)(`p`,{className:`text-xs text-destructive`,children:`Could not load pins. You can still browse the trees.`}),!L&&P?.length===0&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No pinned paths yet. Choose a path from a tree.`}),P?.filter(e=>e.resolvable!==!1&&l.includes(e.tree===`context`?`context`:e.tree)&&`${e.label??e.name??``} ${e.path}`.toLowerCase().includes(se)).map(e=>{let t=e.tree===`context`?`context`:e.tree;return(0,Q.jsxs)(`button`,{type:`button`,"aria-pressed":F===t&&ie.has(e.path),className:q(`w-full rounded-md border p-3 text-left text-sm hover:bg-muted`,F===t&&ie.has(e.path)&&`border-primary bg-primary/10`),onClick:()=>{F===t?K(e.path):(I(t),ae(new Set([e.path])))},children:[(0,Q.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(ke,{className:`h-3.5 w-3.5`}),e.label||e.name||e.path]}),(0,Q.jsxs)(`span`,{className:`block truncate text-xs text-muted-foreground`,children:[t,` · `,e.path]})]},e.id)})]}),(0,Q.jsx)(`div`,{className:q(`min-h-0 flex-1 space-y-1.5 overflow-y-auto p-3`,(z||T===`pins`)&&`hidden`),children:re?(0,Q.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground`,children:`Loading…`}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:q(`group relative flex min-h-11 items-center gap-2 rounded-md px-3 py-2.5 cursor-pointer transition-all select-none text-sm shadow-elevation-1 hover:shadow`,`before:absolute before:left-0 before:top-0 before:bottom-0 before:w-1.5 before:transition-colors`,ie.has(`/`)?`bg-primary/[0.08] hover:bg-primary/[0.12] before:bg-primary`:`bg-card hover:bg-primary/[0.04] before:bg-transparent`),onClick:me.guardClick(()=>K(`/`)),title:`/`,...he(`/`)?me.handlers:{},children:[(0,Q.jsx)(Ze,{className:`w-4 h-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`flex-1 truncate font-medium`,children:`/`})]}),(0,Q.jsxs)(`div`,{className:`ml-[22px] space-y-1.5`,children:[ue===`/`&&(0,Q.jsx)(Wm,{busy:fe,onConfirm:e=>ge(`/`,e),onCancel:()=>de(null)}),ne?.children?.length?ne.children.map(e=>(0,Q.jsx)(Gm,{node:e,parentPath:`/`,query:se,selected:ie,onToggle:K,onRowMenu:e=>{he(e.path)&&le(e)},createParent:ue,onCreateConfirm:ge,onCreateCancel:()=>de(null),creating:fe},e.id||e.name)):ue===`/`?null:(0,Q.jsx)(`p`,{className:`px-2 py-1.5 text-xs text-muted-foreground`,children:`Empty tree`})]})]})})]})]})}),_===`tree`&&(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between border-t px-4 py-3`,children:[(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:z?`${M.size} document${M.size===1?``:`s`} selected`:`${ie.size} path${ie.size===1?``:`s`} selected`}),(0,Q.jsx)(X,{size:`sm`,onClick:xe,disabled:!be||o||fe,children:o?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Ad,{className:`mr-1.5 h-3.5 w-3.5`}),z?`Relating…`:`Linking…`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Qt,{className:`mr-1 h-3.5 w-3.5`}),z?`Relate`:d??`Link`]})})]}),U&&(0,Q.jsx)(nm,{anchor:{x:U.clientX,y:U.clientY},onClose:()=>le(null),items:[{id:`new-folder`,label:`New folder in ${U.path}`,icon:ct,run:()=>de(U.path)}]})]})}function Ym({value:e,onChange:t,onPickTarget:n,fixedWorkspaceName:r,format:i=`url`,tabs:a=[`context`,`directory`],pickerTitle:o=`Pick a path…`,placeholder:s,id:c,disabled:l,className:u,inputClassName:d,presentation:f=`input`}){let[p,m]=(0,Z.useState)(!1),h=e.match(/^(.*?):\/\//)?.[0]||``,g=h?e.slice(h.length):e;return(0,Q.jsxs)(`div`,{className:q(`flex gap-2`,u),children:[f===`breadcrumbs`?(0,Q.jsx)(Im,{items:Lm(g,h.replace(`://`,``)||r||`Workspace`),onNavigate:e=>t(h?`${h}${e.replace(/^\/+/,``)}`:e),disabled:l,className:q(`rounded border px-1`,d)}):(0,Q.jsx)(J,{id:c,value:e,onChange:e=>t(e.target.value),placeholder:s,disabled:l,className:q(`font-mono`,d)}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`icon`,onClick:()=>m(!0),disabled:l,"aria-label":`Browse tree paths`,title:`Browse…`,className:`shrink-0`,children:(0,Q.jsx)(ne,{className:`h-4 w-4`})}),p&&(0,Q.jsx)(Up,{onClose:()=>m(!1),children:(0,Q.jsx)(Jm,{sizeClassName:`h-full w-[380px] max-w-[90vw] max-md:w-full`,multiple:!1,tabs:a,fixedWorkspaceName:r,title:o,confirmLabel:`Use path`,onConfirm:(e,r)=>{m(!1);let a=e[0];if(a){if(n){n(a,r);return}t(i===`url`?`${r.workspaceName}://${a.replace(/^\/+/,``)}`:a)}},onClose:()=>m(!1)})})]})}var Xm=[{value:``,label:`any item`},{value:`email`,label:`an email`},{value:`message`,label:`a message`},{value:`tab`,label:`a browser tab / link`},{value:`note`,label:`a note`},{value:`file`,label:`a file`},{value:`todo`,label:`a todo / task`}],Zm=[{value:`document.inserted`,label:`is added`,hint:`Fires when the item is created or uploaded.`},{value:`document.updated`,label:`is updated`,hint:`Fires on every edit of the item.`},{value:`document.linked`,label:`is filed into a folder`,hint:`Fires when the item is (re)filed into a tree path — the usual pair with "is added" for folder rules.`},{value:`document.unlinked`,label:`is removed from a folder`,hint:`Fires when the item leaves a tree path.`}],Qm=[{key:`toExact`,label:`recipient (To/Cc) is`,hint:`accounting@example.com`},{key:`fromExact`,label:`email sender is`,hint:`person@example.com`},{key:`senderExact`,label:`message sender is`,hint:`Sender ID`},{key:`sender`,label:`message sender contains`,hint:`Sender ID or name`},{key:`senderRegex`,label:`message sender matches regex`,hint:`Sender ID or name pattern`},{key:`body`,label:`body / text contains`,hint:`Words in the email preview or message text`},{key:`bodyRegex`,label:`body / text matches regex`,hint:`invoice\\s+\\d+`},{key:`threadExact`,label:`thread is`,hint:`Thread ID`},{key:`channelExact`,label:`channel / conversation is`,hint:`Channel or conversation ID`},{key:`platformExact`,label:`platform is`,hint:`slack, whatsapp, teams`},{key:`pathExact`,label:`is directly in the folder`,hint:`Current folder membership`},{key:`eventPathExact`,label:`is inserted / linked directly into`,hint:`Exact event destination, e.g. ctx:/foo/bar/baz. Descendant inserts do not match.`},{key:`path`,label:`is under the folder`,hint:`/projects/canvas/UI or backends:/workspace/home/foo`},{key:`mime`,label:`file type is`,hint:`image/*, application/pdf`},{key:`from`,label:`sender contains`,hint:`boss@company.tld`},{key:`to`,label:`recipient (To/Cc) contains`,hint:`invoice@my-company.tld`},{key:`subject`,label:`subject contains`,hint:`invoice`},{key:`fromRegex`,label:`sender matches regex`,hint:`@(acme|example)\\.com$`},{key:`toRegex`,label:`recipient (To/Cc) matches regex`,hint:`^(billing|accounts)@`},{key:`subjectRegex`,label:`subject matches regex`,hint:`^invoice\\s+\\d+`},{key:`urlRegex`,label:`URL matches regex`,hint:`/(invoice|receipt)/`},{key:`urlHost`,label:`website is`,hint:`youtube.com`},{key:`urlContains`,label:`URL contains`,hint:`/watch?v=`},{key:`attachment`,label:`has an attachment of type`,hint:`application/pdf, or * for any`}],$m=new Set([`toExact`,`fromExact`,`senderExact`,`threadExact`,`channelExact`,`platformExact`]),eh=e=>$m.has(e)?e.replace(/Exact$/,``):e.replace(/Regex$/,``),th=[{key:`extractAttachments`,label:`Extract email attachments to a folder`,icon:xt,tone:`text-amber-600 dark:text-amber-400 bg-amber-500/10`},{key:`store`,label:`Copy/Move file(s) to a storage backend`,icon:Fe,tone:`text-sky-600 dark:text-sky-400 bg-sky-500/10`},{key:`download`,label:`download what the link points at`,icon:Jt,tone:`text-rose-600 dark:text-rose-400 bg-rose-500/10`},{key:`link`,label:`file it into a folder`,icon:Pn,tone:`text-emerald-600 dark:text-emerald-400 bg-emerald-500/10`},{key:`unlink`,label:`remove it from a folder`,icon:Pn,tone:`text-amber-600 dark:text-amber-400 bg-amber-500/10`},{key:`tag`,label:`add tags`,icon:Ae,tone:`text-violet-600 dark:text-violet-400 bg-violet-500/10`},{key:`unstore`,label:`delete the file from a storage backend`,icon:st,tone:`text-amber-600 dark:text-amber-400 bg-amber-500/10`},{key:`notify`,label:`send me a message`,icon:xn,tone:`text-pink-600 dark:text-pink-400 bg-pink-500/10`},{key:`agent`,label:`ask an agent`,icon:Me,tone:`text-indigo-600 dark:text-indigo-400 bg-indigo-500/10`},{key:`script`,label:`run a script`,icon:dt,tone:`text-slate-600 dark:text-slate-300 bg-slate-500/10`},{key:`delete`,label:`delete it from Canvas`,icon:rt,tone:`text-destructive bg-destructive/10`},{key:`destroy`,label:`delete it everywhere`,icon:rt,tone:`text-destructive bg-destructive/10`}],nh=e=>th.find(t=>t.key===e)||th[1],rh=`{{title}}{{ext}}`,ih=`{{YYYY}}/{{MM}}/{{YYYY}}{{MM}}{{DD}}_{{HH}}{{mm}}{{ss}}{{ext}}`,ah=[{value:`auto`,label:`whatever it is (auto)`,hint:`arXiv → the PDF · YouTube, Vimeo, TikTok… → the video · image / video / PDF links → the file · anything else → the page.`},{value:`image`,label:`the file itself (image, PDF, …)`,hint:`Fetches the bytes the URL serves.`},{value:`video`,label:`the video (yt-dlp)`,hint:`Best video + audio, merged. Needs yt-dlp on the server.`},{value:`arxiv`,label:`the arXiv paper (PDF)`,hint:`Works for abs/ and pdf/ links.`},{value:`page`,label:`the page with its images & styles`,hint:`One page, offline-readable (wget --page-requisites).`},{value:`website`,label:`the whole website (mirror)`,hint:`Follows links on the same site up to the chosen depth.`}],oh=[{value:`keep`,label:`keep the original file name`},{value:`title`,label:`use the item title as file name`},{value:`dated`,label:`photo style: 2024/07/20240714_183012.jpg`},{value:`custom`,label:`custom template…`}],sh=e=>({kind:e,a:``,b:``,recursive:!1,storeFrom:``,storeFolder:``,storeName:`keep`,storeMode:`copy`,storeConflict:`rename`,attachmentMime:`application/pdf`,attachmentName:``,attachmentPath:`{{YYYY}}/{{MM}}`,includeInline:!1,dlKind:`auto`,dlDepth:`2`,dlTags:``,keepLast:!0,notePath:``,noteTitle:``,filePath:``,fileBackend:`home`,fileInsert:``,notifyReply:!1}),ch={id:null,description:``,events:[`document.inserted`],schema:``,cascade:!1,approval:!1,conditions:[],actions:[sh(`link`)]},lh=e=>e.split(`|`).map(e=>e.trim()).filter(Boolean);function uh(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)||`rule-${Math.random().toString(36).slice(2,7)}`}var dh=e=>e.split(`,`).map(e=>e.trim()).filter(Boolean),fh=[{id:`attachments`,title:`File PDF email attachments by month`,icon:xt,tone:`text-amber-600 dark:text-amber-400 bg-amber-500/10`,blurb:`Choose a recipient and extract PDF attachments into Accounting / year / month, using the email date. Add a subject or filename filter to narrow it to invoices.`,build:()=>({...ch,description:`File accounting PDF attachments by month`,schema:`email`,conditions:[{field:`toExact`,value:``}],actions:[{...sh(`extractAttachments`),a:`workspace:home`,storeFolder:`Accounting`}]})},{id:`store`,title:`Copy/Move file(s) to a storage backend`,icon:Fe,tone:`text-sky-600 dark:text-sky-400 bg-sky-500/10`,blurb:`Uploads land in the managed blob store. Pick a folder in Canvas and a folder on a storage backend — copy or move matching files and optionally recreate their sub-folder paths.`,build:({backend:e})=>({...ch,description:`Copy/Move file(s) to a storage backend`,schema:`file`,events:[`document.inserted`,`document.linked`],conditions:[{field:`path`,value:``}],actions:[{...sh(`store`),a:e,recursive:!0}]})},{id:`photos`,title:`Sort photos by date`,icon:ln,tone:`text-emerald-600 dark:text-emerald-400 bg-emerald-500/10`,blurb:`Images filed into a folder are stored as Photos / 2024 / 07 / 20240714_183012.jpg — by the time the photo was taken (EXIF), not uploaded.`,build:({backend:e})=>({...ch,description:`Sort photos by date`,schema:`file`,events:[`document.inserted`,`document.linked`],conditions:[{field:`path`,value:``},{field:`mime`,value:`image/*`}],actions:[{...sh(`store`),a:e,storeFolder:`Photos`,storeName:`dated`}]})},{id:`mirror`,title:`Mirror a storage folder`,icon:Pn,tone:`text-violet-600 dark:text-violet-400 bg-violet-500/10`,blurb:`Everything that appears under a folder of a storage backend shows up 1:1 in the Directory tree.`,build:()=>({...ch,description:`Mirror a storage folder`,events:[`document.inserted`,`document.linked`],conditions:[{field:`path`,value:`backends:/workspace/home/`}],actions:[{...sh(`link`),a:`dir:/`,recursive:!0}]})},{id:`mail`,title:`File mail from a sender`,icon:xt,tone:`text-amber-600 dark:text-amber-400 bg-amber-500/10`,blurb:`Emails from a person or domain are filed into a folder and you get a notification.`,build:()=>({...ch,description:`Mail from …`,schema:`email`,conditions:[{field:`from`,value:``}],actions:[{...sh(`link`),a:`/work/urgent`},{...sh(`notify`),a:`New mail from {{doc.data.from}}: {{doc.data.subject}}`}]})},{id:`download`,title:`Download what links point at`,icon:Jt,tone:`text-rose-600 dark:text-rose-400 bg-rose-500/10`,blurb:`Bookmarks filed into a folder are fetched for real — images, videos (yt-dlp), arXiv papers, a page or a whole website — saved to a folder and filed next to the link.`,build:({backend:e})=>({...ch,description:`Download what links point at`,schema:`tab`,events:[`document.inserted`,`document.linked`],conditions:[{field:`path`,value:``}],actions:[{...sh(`download`),a:e,storeFolder:`Downloads`,recursive:!0}]})},{id:`agent`,title:`Ask an agent`,icon:Me,tone:`text-indigo-600 dark:text-indigo-400 bg-indigo-500/10`,blurb:`Hand new items to an agent with a prompt; save its reply as a note or get it as a message.`,build:()=>({...ch,description:`Summarize new items`,actions:[{...sh(`agent`),b:`Read document #{{doc.id}} in full with canvas_get, then summarize it in three bullet points.`,notifyReply:!0}]})},{id:`blank`,title:`Start from scratch`,icon:On,tone:`text-muted-foreground bg-muted`,blurb:`An empty rule: choose what it reacts to, add conditions and actions.`,build:()=>({...ch})}];function ph(e){let t=e.filter(e=>[`path`,`pathExact`,`eventPathExact`].includes(e.field));if(t.length!==1||t[0].field!==`eventPathExact`)return null;let n=lh(t[0].value);return n.length===1&&/^(ctx|context):\//.test(n[0])?n[0].replace(/^(ctx|context):/,``).replace(/\/+$/,``)||`/`:null}function mh(e){if(ph(e)!==null)return!0;let t=e.filter(e=>[`path`,`pathExact`,`eventPathExact`].includes(e.field)).flatMap(e=>lh(e.value));return t.length>0&&t.every(e=>/^(dir|directory|backends):\//.test(e))}function hh(e,t,n){let r=e=>e.replace(/\\/g,`/`).split(`/`).filter(e=>e&&e!==`.`&&e!==`..`).join(`/`),i=`${n?.treePath?`backends:${n.treePath}`:e.a}/${r(e.storeFolder.trim())}`.replace(/\/+$/,``),a=ph(t),o=e.recursive?a===null?`<sub-folders>`:r(a):``;return{root:i,recreated:o,result:[i,o,e.storeName===`keep`?`<original filename>`:e.storeName===`title`?`<title>.<ext>`:e.storeName===`dated`?ih:e.b||`<filename>`].filter(Boolean).join(`/`)}}function gh(e,t=[]){let n={event:e.events.length===1?e.events[0]:e.events};e.schema&&(n.schema=e.schema);let r={},i={};for(let t of e.conditions){let e=t.field.endsWith(`Regex`),n=$m.has(t.field),a=e||n?t.value.trim()?[t.value]:[]:lh(t.value);if(e&&a.length)try{new RegExp(t.value,`i`)}catch{throw Error(`Invalid regular expression for ${Qm.find(e=>e.key===t.field)?.label}: ${t.value}`)}if(!a.length)throw Error(`Enter a value for ${Qm.find(e=>e.key===t.field)?.label||t.field}, or remove that condition.`);if(t.field===`urlHost`||t.field===`urlContains`||t.field===`urlRegex`){let e=t.field===`urlHost`?`host`:t.field===`urlRegex`?`regex`:`contains`,n=i[e],r=[...Array.isArray(n)?n:n==null?[]:[n],...a];i[e]=r.length===1?r[0]:r}else(r[eh(t.field)]||=[]).push(...e?a.map(e=>({regex:e})):n?a.map(e=>({equals:e})):a)}for(let[e,t]of Object.entries(r))t?.length&&(n[e]=t.length===1?t[0]:t);Object.keys(i).length&&(n.url=i);let a=e=>{let t={};return e.notePath.trim()&&(t.note={path:e.notePath.trim(),...e.noteTitle.trim()?{title:e.noteTitle.trim()}:{}}),e.filePath.trim()&&(t.file={path:e.filePath.trim(),...e.fileBackend===`data`?{backend:`data`}:{},...e.fileInsert.trim()?{insert:e.fileInsert.trim()}:{}}),e.notifyReply&&(t.notify=!0),Object.keys(t).length?t:null},o=[];for(let n of e.actions){let r=n.a.trim(),i=n.b.trim(),s=n.recursive?{recursive:!0}:{};if(n.kind===`link`&&r&&o.push({action:`link`,paths:dh(r),...s,...i?{tags:dh(i)}:{}}),n.kind===`unlink`&&r&&o.push({action:`unlink`,paths:dh(r),...s}),n.kind===`tag`&&r&&o.push({action:`tag`,tags:dh(r)}),n.kind===`store`&&r){if(n.storeMode===`move`&&!n.storeFrom.trim())throw Error(`Choose the source backend whose copy should be moved.`);if(n.recursive&&!mh(e.conditions))throw Error(`Choose a Directory/Backends source path, or one exact Context insertion path, to recreate the path.`);if(n.recursive&&t.find(e=>e.address===r)?.capabilities?.paths!==!0)throw Error(`This destination has not reported support for folder paths. Choose a supported backend or turn off path recreation.`);let a=n.storeFolder.trim().replace(/^\/+|\/+$/g,``),c=n.storeName===`title`?rh:n.storeName===`dated`?ih:n.storeName===`custom`?i:``;o.push({action:`store`,to:r,...n.storeFrom.trim()?{from:n.storeFrom.trim()}:{},mode:n.storeMode,...a?{folder:a}:{},...s,...n.recursive&&ph(e.conditions)!==null?{pathMode:`full`}:{},...c?{key:c}:{},onConflict:n.storeConflict})}if(n.kind===`extractAttachments`){if(!r)throw Error(`Choose a destination backend for the attachments.`);if(t.find(e=>e.address===r)?.capabilities?.paths!==!0)throw Error(`Choose an attachment destination with support for folder paths.`);let e=dh(n.attachmentMime);if(!e.length||e.some(e=>!/^(\*|[a-z0-9!#$&^_.+-]+\/(\*|[a-z0-9!#$&^_.+-]+)|\*\/\*)$/i.test(e)))throw Error(`Enter attachment MIME types, such as application/pdf or image/*. Use * for all attachments.`);if(![`rename`,`error`].includes(n.storeConflict))throw Error(`Choose rename or skip for attachment filename conflicts.`);o.push({action:`extractAttachments`,to:r,mime:e.length===1?e[0]:e,...n.storeFolder.trim()?{folder:n.storeFolder.trim()}:{},...n.attachmentPath.trim()?{subfolder:n.attachmentPath.trim()}:{},...n.attachmentName.trim()?{filename:n.attachmentName.trim()}:{},...n.includeInline?{includeInline:!0}:{},onConflict:n.storeConflict})}if(n.kind===`download`){let e=n.storeFolder.trim().replace(/^\/+|\/+$/g,``),t=Number(n.dlDepth);o.push({action:`download`,to:r||`workspace:home`,...e?{folder:e}:{},...s,...n.dlKind===`auto`?{}:{kind:n.dlKind},...i?{insert:dh(i)}:{},...n.dlTags.trim()?{tags:dh(n.dlTags)}:{},...n.dlKind===`website`&&Number.isFinite(t)&&t>0&&t!==2?{depth:t}:{}})}if(n.kind===`unstore`&&r&&o.push({action:`unstore`,from:r,...i?{ifOn:i}:{},...n.keepLast?{}:{keepLast:!1}}),n.kind===`notify`&&r&&o.push({action:`notify`,message:r}),n.kind===`delete`&&o.push({action:`delete`}),n.kind===`destroy`&&o.push({action:`destroy`}),n.kind===`agent`&&r&&i){let e=a(n);o.push({action:`agent`,slug:r,prompt:i,...e?{output:e}:{}})}if(n.kind===`script`&&r){let e=a(n);o.push({action:`script`,path:r,...e?{output:e}:{}})}}return{id:e.id||uh(e.description),enabled:!0,...e.description?{description:e.description}:{},...e.cascade?{cascade:!0}:{},...e.approval?{approval:!0}:{},...e.editable?.length?{editable:e.editable}:{},...e.ttl===void 0?{}:{ttl:e.ttl},when:n,then:o}}function _h(e){let{event:t,schema:n,from:r,to:i,subject:a,body:o,sender:s,thread:c,channel:l,platform:u,path:d,pathExact:f,eventPathExact:p,mime:m,url:h,attachment:g,..._}=e.when;if(Object.keys(_).length>0)return null;let v=Array.isArray(t)?t:[t];if(!v.length||!v.every(e=>typeof e==`string`&&Zm.some(t=>t.value===e))||n!==void 0&&typeof n!=`string`)return null;let y=[],b=(e,t)=>{let n=Array.isArray(t)?t:[t];if(e.endsWith(`Regex`)){if(!n.every(e=>typeof e==`string`))return!1;for(let t of n)y.push({field:e,value:t})}else if($m.has(e))for(let t of n){if(!t||typeof t!=`object`||Object.keys(t).length!==1||typeof t.equals!=`string`)return!1;y.push({field:e,value:t.equals})}else if([`from`,`to`,`subject`,`body`,`sender`].includes(e))for(let t of n)if(typeof t==`string`)y.push({field:e,value:t});else if([`from`,`to`,`sender`].includes(e)&&t&&typeof t==`object`&&Object.keys(t).length===1&&typeof t.equals==`string`)y.push({field:`${e}Exact`,value:t.equals});else if(t&&typeof t==`object`&&Object.keys(t).length===1&&typeof t.regex==`string`)y.push({field:`${e}Regex`,value:t.regex});else return!1;else{if(!n.every(e=>typeof e==`string`))return!1;y.push({field:e,value:n.join(` | `)})}return!0};if(d!==void 0&&!b(`path`,d)||f!==void 0&&!b(`pathExact`,f)||p!==void 0&&!b(`eventPathExact`,p)||m!==void 0&&!b(`mime`,m)||r!==void 0&&!b(`from`,r)||i!==void 0&&!b(`to`,i)||a!==void 0&&!b(`subject`,a)||o!==void 0&&!b(`body`,o)||s!==void 0&&!b(`sender`,s)||c!==void 0&&!b(`threadExact`,c)||l!==void 0&&!b(`channelExact`,l)||u!==void 0&&!b(`platformExact`,u)||g!==void 0&&!b(`attachment`,g))return null;if(h!==void 0){if(typeof h==`string`)y.push({field:`urlContains`,value:h});else if(h&&typeof h==`object`){let e=h;if(Object.keys(e).filter(e=>e!==`host`&&e!==`contains`&&e!==`regex`).length||e.host!==void 0&&!b(`urlHost`,e.host)||e.contains!==void 0&&!b(`urlContains`,e.contains)||e.regex!==void 0&&!b(`urlRegex`,e.regex))return null}else return null}let x=e=>{let t=e.output&&typeof e.output==`object`?e.output:{};if(Object.keys(t).filter(e=>e!==`note`&&e!==`file`&&e!==`notify`).length)return null;let n=t.note&&typeof t.note==`object`?t.note:{},r=t.file&&typeof t.file==`object`?t.file:{};return Object.keys(r).filter(e=>e!==`path`&&e!==`backend`&&e!==`insert`).length?null:{notePath:typeof n.path==`string`?n.path:``,noteTitle:typeof n.title==`string`?n.title:``,filePath:typeof r.path==`string`?r.path:``,fileBackend:r.backend===`data`?`data`:`home`,fileInsert:typeof r.insert==`string`?r.insert:``,notifyReply:t.notify===!0}},S=[];for(let t of e.then||[]){if(t.approval!==void 0)return null;if(t.action===`link`&&Array.isArray(t.paths))S.push({...sh(`link`),a:t.paths.join(`, `),b:Array.isArray(t.tags)?t.tags.join(`, `):``,recursive:t.recursive===!0});else if(t.action===`unlink`&&Array.isArray(t.paths))S.push({...sh(`unlink`),a:t.paths.join(`, `),recursive:t.recursive===!0});else if(t.action===`tag`&&Array.isArray(t.tags))S.push({...sh(`tag`),a:t.tags.join(`, `)});else if(t.action===`notify`&&typeof t.message==`string`)S.push({...sh(`notify`),a:t.message});else if(t.action===`store`&&typeof t.to==`string`){if(t.pathMode!==void 0&&(t.pathMode!==`full`||t.recursive!==!0||ph(y)===null)||t.recursive===!0&&ph(y)!==null&&t.pathMode!==`full`||t.folder!==void 0&&typeof t.folder!=`string`||t.key!==void 0&&typeof t.key!=`string`)return null;let e=typeof t.key==`string`?t.key:``;S.push({...sh(`store`),a:t.to,b:e===rh||e===ih?``:e,storeFolder:typeof t.folder==`string`?t.folder:``,recursive:t.recursive===!0,storeName:e?e===rh?`title`:e===ih?`dated`:`custom`:`keep`,storeFrom:typeof t.from==`string`?t.from:Array.isArray(t.from)?String(t.from[0]??``):``,storeMode:t.mode===`move`?`move`:`copy`,storeConflict:t.onConflict===`error`||t.onConflict===`overwrite`?t.onConflict:`rename`})}else if(t.action===`extractAttachments`){let e=new Set([`action`,`to`,`folder`,`subfolder`,`mime`,`filename`,`includeInline`,`onConflict`]);if(Object.keys(t).some(t=>!e.has(t))||typeof t.to!=`string`||[`folder`,`subfolder`,`filename`].some(e=>t[e]!==void 0&&typeof t[e]!=`string`)||t.includeInline!==void 0&&typeof t.includeInline!=`boolean`||t.onConflict!==void 0&&t.onConflict!==`rename`&&t.onConflict!==`error`)return null;let n=Array.isArray(t.mime)?t.mime:[t.mime??`*`];if(!n.every(e=>typeof e==`string`))return null;S.push({...sh(`extractAttachments`),a:t.to,storeFolder:typeof t.folder==`string`?t.folder:``,attachmentPath:typeof t.subfolder==`string`?t.subfolder:``,attachmentMime:n.join(`, `),attachmentName:typeof t.filename==`string`?t.filename:``,includeInline:t.includeInline===!0,storeConflict:t.onConflict===`error`?`error`:`rename`})}else if(t.action===`download`){let e=new Set([`action`,`to`,`folder`,`recursive`,`kind`,`insert`,`tags`,`depth`]);if(Object.keys(t).some(t=>!e.has(t)))return null;let n=typeof t.kind==`string`?t.kind:`auto`;if(!ah.some(e=>e.value===n))return null;let r=Array.isArray(t.insert)?t.insert:typeof t.insert==`string`?[t.insert]:[];if(!r.every(e=>typeof e==`string`))return null;S.push({...sh(`download`),a:typeof t.to==`string`?t.to:`workspace:home`,b:r.join(`, `),storeFolder:typeof t.folder==`string`?t.folder:``,recursive:t.recursive===!0,dlKind:n,dlDepth:typeof t.depth==`number`?String(t.depth):`2`,dlTags:Array.isArray(t.tags)?t.tags.join(`, `):``})}else if(t.action===`unstore`&&(typeof t.from==`string`||Array.isArray(t.from))){let e=e=>Array.isArray(e)?String(e[0]??``):typeof e==`string`?e:``;S.push({...sh(`unstore`),a:e(t.from),b:e(t.ifOn),keepLast:t.keepLast!==!1})}else if(t.action===`delete`)S.push(sh(`delete`));else if(t.action===`destroy`)S.push(sh(`destroy`));else if(t.action===`agent`&&typeof t.slug==`string`&&typeof t.prompt==`string`){let e=x(t);if(!e)return null;S.push({...sh(`agent`),a:t.slug,b:t.prompt,...e})}else if(t.action===`script`&&typeof t.path==`string`){let e=x(t);if(!e)return null;S.push({...sh(`script`),a:t.path,...e})}else return null}return{id:e.id,description:e.description||``,events:v,schema:typeof n==`string`?n:``,cascade:e.cascade===!0,approval:e.approval===!0,...e.editable?.length?{editable:e.editable}:{},...e.ttl===void 0?{}:{ttl:e.ttl},conditions:y,actions:S.length?S:[sh(`link`)]}}var vh=(e,t)=>t.find(t=>t.value===e)?.label?.replace(/\s\(\d+\)$/,``)||(e?String(e).replace(/^data\/schema\//,``):`any item`);function yh(e,t=Xm){let n=e.when,r=Xf(e).map(e=>Zm.find(t=>t.value===e)?.label||e).join(` or `),i=[`When ${vh(n.schema,t)} ${r}`],a=e=>Array.isArray(e)?e.join(` or `):typeof e==`object`&&e?JSON.stringify(e):String(e),o={path:`under`,pathExact:`directly in`,eventPathExact:`inserted / linked directly into`,mime:`type`,from:`from`,to:`to`,subject:`subject`,body:`body / text`,sender:`sender`,thread:`thread`,channel:`conversation`,platform:`platform`,url:`url`,attachment:`attachment`};for(let e of Object.keys(o))n[e]!==void 0&&i.push(`${o[e]} ${a(n[e])}`);return i.join(` · `)}function bh(e){let t=e.output||{},n=t.note||{},r=t.file||{};return[n.path?`reply → note ${n.path}`:``,r.path?`reply → file ${r.backend===`data`?`data:`:`home/`}${r.path}${r.insert?` (indexed at ${r.insert})`:``}`:``,t.notify?`reply → notify`:``].filter(Boolean).join(`, `)}function xh(e){if(e.action===`link`)return`file into ${e.paths?.join(`, `)}${e.recursive===!0?` (sub-folders kept)`:``}`;if(e.action===`unlink`)return`remove from ${e.paths?.join(`, `)}${e.recursive===!0?` (sub-folders kept)`:``}`;if(e.action===`tag`)return`tag ${e.tags?.join(`, `)}`;if(e.action===`store`){let t=typeof e.folder==`string`&&e.folder?`/${e.folder}`:``,n=e.key===rh?`, named by title`:e.key===ih?`, by date`:typeof e.key==`string`&&e.key?`, as ${e.key}`:``;return`${e.mode===`move`?`move`:`copy`} the file to ${e.to}${t}${e.recursive===!0?e.pathMode===`full`?` (full directory path recreated)`:` (sub-folder path recreated)`:``}${n}`}if(e.action===`extractAttachments`){let t=[e.to,e.folder,e.subfolder].filter(Boolean).join(`/`);return`extract ${Array.isArray(e.mime)?e.mime.join(`, `):e.mime||`all`} attachments to ${t}${e.filename?` (filename contains ${e.filename})`:``}`}if(e.action===`download`){let t=ah.find(t=>t.value===(e.kind||`auto`)),n=typeof e.folder==`string`&&e.folder?`/${e.folder}`:``,r=Array.isArray(e.insert)&&e.insert.length?`, filed at ${e.insert.join(`, `)}`:`, filed next to the link`;return`download ${t?.value===`auto`?`the link (auto-detected)`:t?.label||e.kind} to ${e.to||`workspace:home`}${n}${e.recursive===!0?` (sub-folders kept)`:``}${r}`}if(e.action===`unstore`)return`delete the file from ${Array.isArray(e.from)?e.from.join(`, `):e.from}${e.ifOn?` once it is on ${Array.isArray(e.ifOn)?e.ifOn.join(`, `):e.ifOn}`:``}`;if(e.action===`notify`)return`notify me`;if(e.action===`delete`)return`delete from Canvas (keeps stored files/mail)`;if(e.action===`destroy`)return`⚠ delete everywhere (index + storage)`;if(e.action===`agent`){let t=bh(e);return`ask agent "${e.slug}"${t?` (${t})`:``}`}if(e.action===`script`){let t=bh(e);return`run ${e.path}${t?` (${t})`:``}`}return e.action}function Sh(e){return(e.then||[]).map(xh).join(` · `)||`(no actions)`}function Ch(e){return Zf(e).length>0&&(e.then||[]).length>0&&(e.then||[]).every(e=>e.action===`link`||e.action===`unlink`||e.action===`store`||e.action===`unstore`)}function wh(e){let t={};for(let n of e){if(n.handlerType!==`rule`)continue;let e=t[n.handler]||={count:0,errors:0,last:n};e.count++,n.status===`error`&&e.errors++,n.ts>e.last.ts&&(e.last=n)}return t}function Th(e){let t=Date.now()-new Date(e).getTime();if(!Number.isFinite(t)||t<0)return``;let n=Math.floor(t/6e4);if(n<1)return`just now`;if(n<60)return`${n}m ago`;let r=Math.floor(n/60);return r<48?`${r}h ago`:`${Math.floor(r/24)}d ago`}function Eh(e){return e.some(e=>e.address===`workspace:home`)?`workspace:home`:e.find(e=>e.address!==`workspace:data`)?.address||e[0]?.address||``}function Dh(e){if(e.kind===`document`&&e.rule)return{..._h(e.rule)||ch,id:null};if(e.kind===`download`){let t=e.path?` filed under ${e.path.replace(/^(ctx|dir):/,``)}`:``;return{...ch,description:`Download links${t}`,schema:`tab`,events:[`document.inserted`,`document.linked`],conditions:[{field:`path`,value:e.path||``}],actions:[{...sh(`download`),a:e.storeTo||``,storeFolder:e.storeFolder||`Downloads`,recursive:!0}]}}if(e.kind===`store`){let t=e.path||``,n=/^(?:(?:ctx|context):)?\//.test(t),r=[{field:n?`eventPathExact`:`path`,value:n&&t.startsWith(`/`)?`ctx:${t}`:t}],i=e.path?`${n?` inserted / linked directly into`:` filed under`} ${e.path.replace(/^(ctx|context|dir|directory):/,``)}`:``;return{...ch,description:e.storeTo?`Copy files${i} to ${e.storeTo}${e.storeFolder?`/${e.storeFolder}`:``}`:`Copy files${i} to a storage backend`,schema:`file`,events:[`document.inserted`,`document.linked`],conditions:r,actions:[{...sh(`store`),a:e.storeTo||``,storeFolder:e.storeFolder||``,recursive:mh(r)}]}}return{...ch,description:`Mirror ${e.path} into ${e.target}`,events:[`document.inserted`,`document.linked`],conditions:[{field:`path`,value:e.path||``}],actions:[{...sh(`link`),a:e.target||`dir:/`,recursive:!0}]}}var Oh=`h-10 w-full rounded-md border bg-background px-3 text-sm outline-none focus:ring-2 focus:ring-ring disabled:opacity-50`,kh=`h-10 text-sm`;function Ah({label:e,hint:t,children:n,className:r}){return(0,Q.jsxs)(`label`,{className:q(`flex min-w-0 flex-col gap-1.5`,r),children:[(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:e}),n,t&&(0,Q.jsx)(`span`,{className:`text-xs leading-relaxed text-muted-foreground`,children:t})]})}function jh({checked:e,onChange:t,label:n,hint:r,disabled:i}){return(0,Q.jsxs)(`button`,{type:`button`,role:`switch`,"aria-checked":e,disabled:i,onClick:()=>t(!e),className:q(`flex w-full items-start gap-3 rounded-lg border p-3 text-left transition-colors hover:bg-accent/40 disabled:cursor-not-allowed disabled:opacity-50`,e&&`border-primary/40 bg-primary/5`),children:[(0,Q.jsx)(`span`,{className:q(`mt-0.5 inline-flex h-5 w-9 shrink-0 items-center rounded-full p-0.5 transition-colors`,e?`bg-primary`:`bg-muted-foreground/30`),children:(0,Q.jsx)(`span`,{className:q(`h-4 w-4 rounded-full bg-background shadow transition-transform`,e&&`translate-x-4`)})}),(0,Q.jsxs)(`span`,{className:`min-w-0`,children:[(0,Q.jsx)(`span`,{className:`block text-sm font-medium`,children:n}),r&&(0,Q.jsx)(`span`,{className:`block text-xs leading-relaxed text-muted-foreground`,children:r})]})]})}function Mh({value:e,options:t,onChange:n}){return(0,Q.jsx)(`div`,{className:`inline-flex h-10 rounded-md border bg-background p-1`,children:t.map(t=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>n(t.value),className:q(`rounded px-3 text-sm transition-colors`,e===t.value?`bg-primary text-primary-foreground shadow-sm`:`text-muted-foreground hover:text-foreground`),children:t.label},t.value))})}function Nh({active:e,onClick:t,children:n,title:r}){return(0,Q.jsx)(`button`,{type:`button`,title:r,onClick:t,"aria-pressed":e,className:q(`h-9 rounded-full border px-3.5 text-sm transition-colors`,e?`border-primary bg-primary/10 font-medium text-foreground`:`text-muted-foreground hover:bg-accent hover:text-foreground`),children:n})}function Ph({step:e,title:t,hint:n}){return(0,Q.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,Q.jsx)(`span`,{className:`mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-primary/10 text-sm font-semibold text-primary`,children:e}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h3`,{className:`text-base font-semibold leading-7`,children:t}),n&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n})]})]})}function Fh({icon:e,tone:t,size:n=`md`}){return(0,Q.jsx)(`span`,{className:q(`inline-flex shrink-0 items-center justify-center rounded-xl`,n===`lg`?`h-12 w-12`:`h-10 w-10`,t),children:(0,Q.jsx)(e,{className:n===`lg`?`h-6 w-6`:`h-5 w-5`})})}function Ih({workspaceId:e,onOpenJson:t,onShowRuns:n,backfillLimit:r,prefill:i,onPrefillConsumed:a,createOnly:o=!1,onCreated:s,onCancel:c}){let{showToast:l}=Hr(),[u,d]=(0,Z.useState)([]),[f,p]=(0,Z.useState)({}),m=e=>{sp(e,{limit:500}).then(e=>p(wh(e))).catch(()=>p({}))},[h,g]=(0,Z.useState)(!0),[_,v]=(0,Z.useState)(null),[y,b]=(0,Z.useState)(!1),[x,S]=(0,Z.useState)(!1),[C,w]=(0,Z.useState)([]),[T,E]=(0,Z.useState)([]),D=(0,Z.useRef)(null),[O,k]=(0,Z.useState)(e);e!==O&&(k(e),g(!0)),(0,Z.useEffect)(()=>{np(e).then(e=>d(e)).finally(()=>g(!1)),m(e)},[e]);let[A,j]=(0,Z.useState)(null);i!==A&&(j(i),i&&(v(Dh(i)),b(!1))),(0,Z.useEffect)(()=>{i&&a?.()},[i,a]),(0,Z.useEffect)(()=>{Rp(e).then(e=>w(e.map(e=>e.path))).catch(()=>w([]))},[e]),(0,Z.useEffect)(()=>{Eo(e).then(e=>{let t=e.filter(e=>e.kind===`storage`&&e.enabled!==!1&&e.config?.supported!==!1&&e.config?.readOnly!==!0&&e.capabilities?.write!==!1);E(t);let n=Eh(t);n&&v(e=>e&&e.actions.some(e=>(e.kind===`store`||e.kind===`download`)&&!e.a)?{...e,actions:e.actions.map(e=>(e.kind===`store`||e.kind===`download`)&&!e.a?{...e,a:n}:e)}:e)}).catch(()=>E([]))},[e]);let[M,N]=(0,Z.useState)(Xm);(0,Z.useEffect)(()=>{_p(e).then(e=>{e.schemas?.length&&N([{value:``,label:`any item`},...e.schemas.map(e=>({value:e.id,label:`${e.name} (${e.count})`}))])}).catch(()=>{})},[e]);let P=async(t,n)=>{S(!0);try{return await rp(e,t),d(t),l({title:n,description:`rules.json updated (committed to workspace git)`}),!0}catch(e){return l({title:`Error`,description:e instanceof Error?e.message:`Failed to save rules`,variant:`destructive`}),!1}finally{S(!1)}},ee=async()=>{if(!_||h||x)return;let t;try{t=gh(_,T)}catch(e){l({title:`Invalid rule`,description:e instanceof Error?e.message:`Check the rule conditions and actions`,variant:`destructive`});return}if(!t.then.length){l({title:`Add an action`,description:`Pick at least one "then" action and fill in its fields.`,variant:`destructive`});return}if(o){t.id=`${t.id}-${Math.random().toString(36).slice(2,10)}`,S(!0);try{await yp(e,t),l({title:`Rule created`,description:`The rule will run for matching new items.`}),s?.()}catch(e){l({title:`Could not create rule`,description:e instanceof Error?e.message:`Failed to save rule`,variant:`destructive`})}finally{S(!1)}return}!_.id&&u.some(e=>e.id===t.id)&&(t.id=`${t.id}-${Math.random().toString(36).slice(2,10)}`);let n=_.id?u.map(e=>e.id===_.id?{...t,enabled:e.enabled!==!1}:e):[...u,t];await P(n,_.id?`Rule updated`:`Rule created`)&&(v(null),s?.())},F=e=>P(u.map(t=>t.id===e?{...t,enabled:t.enabled===!1}:t),`Rule toggled`),I=e=>{confirm(`Delete rule "${e}"?`)&&P(u.filter(t=>t.id!==e),`Rule deleted`)},[L,R]=(0,Z.useState)(null),te=async t=>{R(t);try{let n=await mp(e,{ruleId:t,dryRun:!0,limit:r}),i=n.results.filter(e=>e.matched).length;if(!i){l({title:`Apply to existing items`,description:`No matches among ${n.processed} existing documents (conditions evaluate against each document's current tree placements). Raise the batch size in the toolbar to cover more.`});return}if(!confirm(`Rule "${t}" matches ${i} of ${n.processed} existing documents. Run its actions on them now?`))return;let a=await mp(e,{ruleId:t,limit:r});l({title:`Done`,description:`${a.matched} documents processed, ${a.failed} failed. Details in the Runs tab`,...a.failed?{variant:`destructive`}:{}})}catch(e){l({title:`Backfill failed`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{R(null),m(e)}},z=(e,t)=>v(n=>n&&{...n,[e]:t}),B=e=>{v(e.build({backend:Eh(T)})),b(!1),requestAnimationFrame(()=>D.current?.scrollIntoView({behavior:`smooth`,block:`start`}))},re=e=>{let n=_h(e);n?(v(n),b(!1),requestAnimationFrame(()=>D.current?.scrollIntoView({behavior:`smooth`,block:`start`}))):t?.()},[V,ie]=(0,Z.useState)(null),ae=(e,t)=>t.treeType===`context`?e:t.treeName===`directory`?`dir:${e}`:`${t.treeName}:${e}`,oe=(e,t)=>{if(!V||!_||!e.length){ie(null);return}if(V.target===`storeFolder`){let t=Qf(e[0]);z(`actions`,_.actions.map((e,n)=>n===V.index?{...e,storeFolder:t?.rel||``,...t?.backend&&T.some(e=>e.address===t.backend)?{a:t.backend}:{}}:e))}else if(V.target===`condition`){let n=e.map(e=>ae(e,t)),r=t.treeType===`context`&&_.actions.some(e=>e.kind===`store`);z(`conditions`,_.conditions.map((e,t)=>t===V.index?{...e,...r?{field:`eventPathExact`}:{},value:n.join(` | `)}:e))}else{let n=e.map(e=>ae(e,t));z(`actions`,_.actions.map((e,t)=>t===V.index?e.kind===`download`?{...e,b:n.join(`, `)}:{...e,a:n.join(`, `)}:e))}ie(null)},H=(e,t,n=`Browse…`)=>(0,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`outline`,className:`h-10 shrink-0 px-3`,title:n,onClick:()=>ie({target:e,index:t}),children:[(0,Q.jsx)(ne,{className:`h-4 w-4 sm:mr-1.5`}),(0,Q.jsx)(`span`,{className:`hidden sm:inline`,children:`Browse`})]}),se=mh(_?.conditions||[]),ce=!!_?.conditions.some(e=>[`path`,`pathExact`,`eventPathExact`].includes(e.field)&&e.value.trim()),U=e=>`${e.address}${e.address===`workspace:data`?` — managed blob store (default)`:e.address===`workspace:home`?` — workspace home folder`:e.driver?` — ${e.driver}`:``}`,le=(e,t,n,r=`workspace:home`)=>T.length?(0,Q.jsxs)(`select`,{className:Oh,value:e,onChange:e=>t(e.target.value),children:[(0,Q.jsx)(`option`,{value:``,children:n}),T.map(e=>(0,Q.jsx)(`option`,{value:e.address,children:U(e)},e.address)),e&&!T.some(t=>t.address===e)&&(0,Q.jsx)(`option`,{value:e,children:e})]}):(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:r,value:e,onChange:e=>t(e.target.value)}),ue=u.filter(Ch),de=u.filter(e=>!Ch(e)),fe=({rule:e})=>{let t=e.enabled!==!1,r=_h(e)!==null,i=f[e.id],a=nh(e.then?.[0]?.action||`link`),o=Zf(e);return(0,Q.jsxs)(`div`,{className:q(`rule-card rounded-xl border bg-card p-4 transition-opacity`,!t&&`opacity-60`),children:[(0,Q.jsx)(Fh,{icon:a.icon,tone:a.tone}),(0,Q.jsxs)(`div`,{className:`rule-card-content min-w-0 space-y-1.5`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-1`,children:[(0,Q.jsx)(`h3`,{className:`text-base font-semibold leading-6`,children:e.description||e.id}),e.approval===!0&&(0,Q.jsx)(`span`,{className:`rounded-full bg-warning/15 px-2 py-0.5 text-xs font-medium text-warning`,children:`needs approval`}),e.cascade===!0&&(0,Q.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground`,children:`incl. automation-created`}),!r&&(0,Q.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground`,title:`This rule uses matchers the builder cannot show; edit it as JSON.`,children:`JSON only`})]}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:yh(e,M)}),(0,Q.jsxs)(`p`,{className:`flex items-start gap-1.5 text-sm`,children:[(0,Q.jsx)(Ot,{className:`mt-1 h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`span`,{children:Sh(e)})]}),o.length>0&&(0,Q.jsx)(`p`,{className:`truncate font-mono text-xs text-muted-foreground`,title:o.join(` | `),children:o.join(` | `)}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i?(0,Q.jsxs)(`button`,{type:`button`,className:q(`text-left underline-offset-2 hover:underline`,i.last.status===`error`&&`text-destructive`,!n&&`cursor-default hover:no-underline`),title:n?`Show this rule's run log`:i.last.error||i.last.skipReason||``,onClick:()=>n?.(e.id),children:[`ran `,i.count,`×`,i.errors?` (${i.errors} failed)`:``,` · last `,i.last.status,` `,Th(i.last.ts)]}):`not run yet`})]}),(0,Q.jsxs)(`div`,{className:`rule-card-actions`,children:[(0,Q.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":t,disabled:x,title:t?`Enabled — click to pause`:`Paused — click to enable`,onClick:()=>F(e.id),className:q(`mr-1 inline-flex h-6 w-11 items-center rounded-full p-0.5 transition-colors`,t?`bg-primary`:`bg-muted-foreground/30`),children:(0,Q.jsx)(`span`,{className:q(`h-5 w-5 rounded-full bg-background shadow transition-transform`,t&&`translate-x-5`)})}),(0,Q.jsxs)(X,{size:`sm`,variant:`ghost`,className:`h-9 px-2.5`,title:e.when.eventPathExact===void 0?`Apply this rule to existing items (dry-run first)`:`Requires an original insert/link event. Current folder membership cannot reconstruct its destination.`,disabled:L!==null||e.when.eventPathExact!==void 0,onClick:()=>te(e.id),children:[L===e.id?(0,Q.jsx)(Xn,{className:`h-4 w-4 animate-spin`}):(0,Q.jsx)(G,{className:`h-4 w-4`}),(0,Q.jsx)(`span`,{className:`rule-card-action-label ml-1.5`,children:`Apply`})]}),(0,Q.jsxs)(X,{size:`sm`,variant:`ghost`,className:`h-9 px-2.5`,title:r?`Edit rule`:`Edit as JSON`,onClick:()=>re(e),children:[r?(0,Q.jsx)(ve,{className:`h-4 w-4`}):(0,Q.jsx)(at,{className:`h-4 w-4`}),(0,Q.jsx)(`span`,{className:`rule-card-action-label ml-1.5`,children:`Edit`})]}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,className:`h-9 px-2.5 text-destructive hover:text-destructive`,title:`Delete rule`,onClick:()=>I(e.id),children:(0,Q.jsx)(rt,{className:`h-4 w-4`})})]})]})},pe=(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsx)(`h3`,{className:`text-base font-semibold`,children:`What should happen automatically?`}),y&&(0,Q.jsxs)(X,{size:`sm`,variant:`ghost`,onClick:()=>b(!1),children:[(0,Q.jsx)(W,{className:`mr-1 h-4 w-4`}),` Close`]})]}),(0,Q.jsx)(`div`,{className:`grid min-w-0 grid-cols-[repeat(auto-fill,minmax(min(100%,17rem),1fr))] gap-3`,children:fh.map(e=>(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>B(e),className:`flex min-w-0 items-start gap-3 rounded-xl border bg-card p-4 text-left transition-colors hover:border-primary/50 hover:bg-accent/40`,children:[(0,Q.jsx)(Fh,{icon:e.icon,tone:e.tone,size:`lg`}),(0,Q.jsxs)(`span`,{className:`min-w-0`,children:[(0,Q.jsx)(`span`,{className:`block text-base font-semibold leading-6`,children:e.title}),(0,Q.jsx)(`span`,{className:`mt-1 block break-words text-sm leading-relaxed text-muted-foreground`,children:e.blurb})]})]},e.id))})]});return(0,Q.jsxs)(`div`,{className:`rule-builder min-w-0 space-y-5`,children:[!o&&(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-[1_1_20rem]`,children:[(0,Q.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Rules`}),(0,Q.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Rules run automatically as items arrive or get filed — no code needed. Stored in`,` `,(0,Q.jsx)(`span`,{className:`font-mono`,children:`rules.json`}),` in the workspace git.`]})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[t&&(0,Q.jsxs)(X,{variant:`ghost`,onClick:t,title:`Edit rules.json directly`,children:[(0,Q.jsx)(at,{className:`mr-1.5 h-4 w-4`}),` JSON`]}),(0,Q.jsxs)(X,{onClick:()=>{v(null),b(!0)},disabled:y,children:[(0,Q.jsx)(cn,{className:`mr-1.5 h-4 w-4`}),` New rule`]})]})]}),y&&!_&&pe,_&&(0,Q.jsxs)(`div`,{ref:D,className:`scroll-mt-4 space-y-6 rounded-xl border bg-card p-4 sm:p-6`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,Q.jsx)(`h3`,{className:`text-lg font-semibold`,children:_.id?`Edit rule`:`New rule`}),(0,Q.jsxs)(X,{variant:`ghost`,size:`sm`,onClick:()=>v(null),children:[(0,Q.jsx)(W,{className:`mr-1 h-4 w-4`}),` Cancel`]})]}),(0,Q.jsx)(Ah,{label:`Name`,hint:`Shown in the list and the run log.`,children:(0,Q.jsx)(J,{className:`h-11 text-base`,placeholder:`Keep UI designs in Projects/Canvas/UI`,value:_.description,onChange:e=>z(`description`,e.target.value)})}),(0,Q.jsxs)(`section`,{className:`space-y-4`,children:[(0,Q.jsx)(Ph,{step:1,title:`When…`,hint:`What the rule reacts to. All conditions must match; repeat a condition for either/or.`}),(0,Q.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-[minmax(0,220px)_1fr]`,children:[(0,Q.jsx)(Ah,{label:`Item`,children:(0,Q.jsxs)(`select`,{className:Oh,value:_.schema,onChange:e=>z(`schema`,e.target.value),children:[M.map(e=>(0,Q.jsx)(`option`,{value:e.value,children:e.label},e.value)),_.schema&&!M.some(e=>e.value===_.schema)&&(0,Q.jsx)(`option`,{value:_.schema,children:_.schema.replace(/^data\/schema\//,``)})]})}),(0,Q.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,Q.jsxs)(`span`,{className:`text-sm font-medium`,children:[`Event `,(0,Q.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`(any of)`})]}),(0,Q.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:Zm.map(e=>{let t=_.events.includes(e.value);return(0,Q.jsx)(Nh,{active:t,title:e.hint,onClick:()=>{let n=t?_.events.filter(t=>t!==e.value):[..._.events,e.value];n.length&&z(`events`,n)},children:e.label},e.value)})})]})]}),_.conditions.length>0&&(0,Q.jsx)(`div`,{className:`space-y-2`,children:_.conditions.map((e,t)=>{let n=Qm.find(t=>t.key===e.field);return(0,Q.jsxs)(`div`,{className:`grid grid-cols-[2.25rem_1fr_auto] items-center gap-2 sm:grid-cols-[2.25rem_minmax(0,240px)_1fr_auto]`,children:[(0,Q.jsx)(`span`,{className:`text-xs font-medium uppercase tracking-wide text-muted-foreground`,title:`Same condition again = either may match (OR); different conditions must all match (AND)`,children:_.conditions.slice(0,t).some(t=>eh(t.field)===eh(e.field))?`or`:`and`}),(0,Q.jsx)(`select`,{className:Oh,value:e.field,onChange:e=>z(`conditions`,_.conditions.map((n,r)=>r===t?{...n,field:e.target.value}:n)),children:Qm.map(e=>(0,Q.jsx)(`option`,{value:e.key,children:e.label},e.key))}),(0,Q.jsxs)(`div`,{className:`order-4 col-span-3 flex gap-2 sm:order-3 sm:col-span-1`,children:[(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:n?.hint,value:e.value,onChange:e=>z(`conditions`,_.conditions.map((n,r)=>r===t?{...n,value:e.target.value}:n))}),[`path`,`pathExact`,`eventPathExact`].includes(e.field)&&H(`condition`,t,`Browse the workspace trees`)]}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,className:`order-3 h-10 w-10 p-0 text-muted-foreground sm:order-4`,title:`Remove condition`,onClick:()=>z(`conditions`,_.conditions.filter((e,n)=>n!==t)),children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]},t)})}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,onClick:()=>z(`conditions`,[..._.conditions,{field:_.schema===`email`?`from`:`path`,value:``}]),children:[(0,Q.jsx)(cn,{className:`mr-1 h-4 w-4`}),` Add condition`]}),(0,Q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`Contains matches literal text. Regex is case-insensitive: enter the pattern without /…/ delimiters; | stays part of the expression. For other filters, separate alternatives with `,(0,Q.jsx)(`span`,{className:`font-mono`,children:`|`}),`, e.g. `,(0,Q.jsx)(`span`,{className:`font-mono`,children:`image/* | video/*`}),`.`]})]})]}),(0,Q.jsxs)(`section`,{className:`space-y-4`,children:[(0,Q.jsx)(Ph,{step:2,title:`Then…`,hint:`Actions run in order. The item keeps its id, tags and folders unless an action says otherwise.`}),_.actions.map((t,n)=>{let r=e=>z(`actions`,_.actions.map((t,r)=>r===n?{...t,...e}:t)),i=T.find(e=>e.address===t.a),a=i?.capabilities?.paths===!0,o=se&&a,s=nh(t.kind),c=n=>(0,Q.jsxs)(`div`,{className:`space-y-3 rounded-lg border border-dashed p-3`,children:[(0,Q.jsxs)(`p`,{className:`text-sm font-medium`,children:[`What to do with the `,n]}),(0,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsx)(Ah,{label:`Save as a note at`,hint:`Context path by default, dir:/path for the directory tree.`,children:(0,Q.jsx)(Ym,{inputClassName:kh,placeholder:`/notes/summaries (optional)`,value:t.notePath,onChange:e=>r({notePath:e}),fixedWorkspaceName:e,pickerTitle:`Save note under…`,onPickTarget:(e,t)=>r({notePath:t.treeType===`directory`?`dir:${e}`:e})})}),t.notePath.trim()&&(0,Q.jsx)(Ah,{label:`Note title`,children:(0,Q.jsx)(J,{className:kh,placeholder:`Summary: {{doc.data.subject}}`,value:t.noteTitle,onChange:e=>r({noteTitle:e.target.value})})}),(0,Q.jsx)(Ah,{label:`Save as a file at`,hint:`Relative path under the workspace home folder or in the data blob store.`,children:(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:`logs/agent.log (optional)`,value:t.filePath,onChange:e=>r({filePath:e.target.value})})}),t.filePath.trim()&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Ah,{label:`File lives in`,children:(0,Q.jsxs)(`select`,{className:Oh,value:t.fileBackend,onChange:e=>r({fileBackend:e.target.value}),children:[(0,Q.jsx)(`option`,{value:`home`,children:`the workspace home folder`}),(0,Q.jsx)(`option`,{value:`data`,children:`the data blob store`})]})}),(0,Q.jsx)(Ah,{label:`Also file the saved file under`,hint:`Index it as a document at this tree path.`,children:(0,Q.jsx)(Ym,{inputClassName:kh,placeholder:`/path (optional)`,value:t.fileInsert,onChange:e=>r({fileInsert:e}),fixedWorkspaceName:e,tabs:[`context`],pickerTitle:`File under…`,onPickTarget:e=>r({fileInsert:e})})})]})]}),(0,Q.jsx)(jh,{checked:t.notifyReply,onChange:e=>r({notifyReply:e}),label:`Send it to me as a message`})]}),l=ph(_.conditions),u=t.kind===`store`&&t.a&&(!t.recursive||o)?hh(t,_.conditions,i):null,d=t.kind===`extractAttachments`&&t.a?Ip(t.a,t.storeFolder,t.attachmentPath):null;return(0,Q.jsxs)(`div`,{className:`space-y-4 rounded-xl border bg-background p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Q.jsx)(Fh,{icon:s.icon,tone:s.tone}),(0,Q.jsx)(`select`,{className:q(Oh,`flex-1 font-medium`),value:t.kind,onChange:e=>r(sh(e.target.value)),children:th.map(e=>(0,Q.jsx)(`option`,{value:e.key,children:e.label},e.key))}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,className:`h-10 w-10 shrink-0 p-0 text-muted-foreground`,title:`Remove action`,disabled:_.actions.length===1,onClick:()=>z(`actions`,_.actions.filter((e,t)=>t!==n)),children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),(t.kind===`link`||t.kind===`unlink`)&&(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsx)(Ah,{label:t.kind===`link`?`Folder(s)`:`Remove from folder(s)`,hint:`Context-tree path by default; dir:/path for the directory tree. Comma-separate several.`,children:(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:t.kind===`link`?`/work/urgent or dir:/projects/x`:`/inbox or dir:/staging`,value:t.a,onChange:e=>r({a:e.target.value})}),H(`action`,n)]})}),t.kind===`link`&&(0,Q.jsx)(Ah,{label:`Tags`,hint:`Optional, comma-separated.`,children:(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:`custom/design, ui`,value:t.b,onChange:e=>r({b:e.target.value})})}),(0,Q.jsx)(jh,{checked:t.recursive,onChange:e=>r({recursive:e}),label:`Recreate sub-folder path in destination`,hint:ce?`The part of the item's path below the "is under the folder" prefix is appended to the target: …/foo/a/b → target/a/b.`:`Needs an "is under the folder" condition to know where sub-folders start.`,disabled:!ce})]}),t.kind===`tag`&&(0,Q.jsx)(Ah,{label:`Tags`,hint:`Comma-separated.`,children:(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:`urgent, follow-up`,value:t.a,onChange:e=>r({a:e.target.value})})}),t.kind===`store`&&(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,Q.jsx)(Ah,{label:`Storage backend`,hint:`Where the file's bytes should live. Only writable backends are listed.`,children:le(t.a,e=>r({a:e}),`pick a backend…`)}),(0,Q.jsx)(Ah,{label:`Destination root folder`,hint:`Choose the folder beneath which the path will be recreated. Leave empty to use the backend root.`,children:(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:`Projects/Canvas/UI`,value:t.storeFolder,onChange:e=>r({storeFolder:e.target.value})}),H(`storeFolder`,n,`Browse storage backends`)]})}),(0,Q.jsx)(Ah,{label:`File name`,children:(0,Q.jsx)(`select`,{className:Oh,value:t.storeName,onChange:e=>r({storeName:e.target.value}),children:oh.map(e=>(0,Q.jsx)(`option`,{value:e.value,children:e.label},e.value))})}),(0,Q.jsx)(Ah,{label:`Move or copy`,hint:t.storeMode===`move`?`Remove only the selected source copy after the destination is safely stored.`:`Preserve every existing copy.`,children:(0,Q.jsx)(Mh,{value:t.storeMode,onChange:e=>r({storeMode:e}),options:[{value:`copy`,label:`Copy`},{value:`move`,label:`Move`}]})}),t.storeMode===`move`&&(0,Q.jsx)(Ah,{className:`sm:col-span-2`,label:`Move bytes from (required)`,hint:`Context membership does not identify a source copy. If the file is absent here, nothing is moved. Multiple locations on this backend make the move ambiguous; use copy.`,children:le(t.storeFrom,e=>r({storeFrom:e}),`choose a source backend…`,`workspace:data`)}),t.storeName===`custom`&&(0,Q.jsx)(Ah,{className:`sm:col-span-2`,label:`Name template`,hint:`Tokens: {{YYYY}} {{MM}} {{DD}} {{HH}} {{mm}} {{ss}} (photo capture time when present), {{ext}} {{basename}} {{filename}} {{title}} {{id}}, plus {{doc.…}} fields. Slashes create sub-folders.`,children:(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:`{{YYYY}}-{{MM}}-{{DD}} {{title}}{{ext}}`,value:t.b,onChange:e=>r({b:e.target.value})})})]}),(0,Q.jsx)(jh,{checked:t.recursive,onChange:e=>r({recursive:e}),label:l===null?`Recreate sub-folder path in destination`:`Recreate directory path in destination`,hint:a?se?l===null?`The path below the source folder is appended beneath the destination root: …/UI/mobile → Root/mobile. Missing destination folders are created.`:`Only inserts or links directly into ctx:${l} trigger this rule. Its full path is appended beneath the destination root; descendant inserts do not match.`:`For Context, choose one folder with “is inserted / linked directly into”. Directory and Backends sources can include sub-folders.`:`Choose a destination that reports support for folder paths. Content-addressed blob stores cannot recreate sub-folder paths.`,disabled:!o&&!t.recursive}),u&&(0,Q.jsxs)(`div`,{className:`space-y-1.5 rounded-lg bg-muted/60 px-3 py-3 text-sm`,"aria-live":`polite`,children:[(0,Q.jsx)(`p`,{className:`font-medium`,children:`Destination preview`}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Root folder: `,(0,Q.jsxs)(`span`,{className:`break-all font-mono`,children:[u.root,`/`]})]}),t.recursive&&(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Path added beneath it: `,(0,Q.jsxs)(`span`,{className:`break-all font-mono`,children:[u.recreated||`(root)`,`/`]})]}),(0,Q.jsx)(`p`,{className:`break-all font-mono`,children:u.result})]}),(0,Q.jsxs)(`details`,{className:`group rounded-lg border`,children:[(0,Q.jsxs)(`summary`,{className:`flex cursor-pointer select-none items-center gap-2 px-3 py-2 text-sm font-medium`,children:[(0,Q.jsx)(Ze,{className:`h-4 w-4 transition-transform group-open:rotate-180`}),` More options`]}),(0,Q.jsxs)(`div`,{className:`grid gap-4 border-t p-3 sm:grid-cols-2`,children:[t.storeMode===`copy`&&(0,Q.jsx)(Ah,{label:`Copy bytes from`,hint:`Optional source restriction. Default: any readable copy outside the destination backend.`,children:le(t.storeFrom,e=>r({storeFrom:e}),`any readable source`,`workspace:data (optional)`)}),(0,Q.jsx)(Ah,{label:`If the name is already taken`,children:(0,Q.jsxs)(`select`,{className:Oh,value:t.storeConflict,onChange:e=>r({storeConflict:e.target.value}),children:[(0,Q.jsx)(`option`,{value:`rename`,children:`add -1, -2, … to the name`}),(0,Q.jsx)(`option`,{value:`error`,children:`skip the file`}),(0,Q.jsx)(`option`,{value:`overwrite`,children:`overwrite the existing file`})]})})]})]}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`The item keeps its id and virtual tree memberships. A move removes the chosen physical source location from the backend tree.`})]}),t.kind===`extractAttachments`&&(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,Q.jsx)(Ah,{label:`Attachment types`,hint:`MIME types, comma-separated. application/pdf for PDFs, image/* for images, or * for all.`,children:(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:`application/pdf`,value:t.attachmentMime,onChange:e=>r({attachmentMime:e.target.value})})}),(0,Q.jsx)(Ah,{label:`Attachment filename contains`,hint:`Optional: invoice, faktura, or another literal filename fragment. Every selected attachment must also match its type.`,children:(0,Q.jsx)(J,{className:kh,placeholder:`Any matching filename`,value:t.attachmentName,onChange:e=>r({attachmentName:e.target.value})})}),(0,Q.jsx)(Ah,{label:`Storage backend`,hint:`Choose a writable backend that supports folder paths.`,children:le(t.a,e=>r({a:e}),`pick a backend…`)}),(0,Q.jsx)(Ah,{label:`Destination root folder`,hint:`Choose the folder beneath which date subfolders will be created. Leave empty to use the backend root.`,children:(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:`Accounting`,value:t.storeFolder,onChange:e=>r({storeFolder:e.target.value})}),H(`storeFolder`,n,`Browse storage backends`)]})}),(0,Q.jsx)(Ah,{label:`Sub-folder path template`,hint:`Appended beneath the root folder. {{YYYY}} = year, {{MM}} = month, {{DD}} = day of the email. Leave empty to file directly in the root folder.`,children:(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:`No subfolders`,value:t.attachmentPath,onChange:e=>r({attachmentPath:e.target.value})})}),(0,Q.jsx)(Ah,{label:`If the attachment name is already taken`,children:(0,Q.jsxs)(`select`,{className:Oh,value:t.storeConflict,onChange:e=>r({storeConflict:e.target.value}),children:[(0,Q.jsx)(`option`,{value:`rename`,children:`add -1, -2, … to the name`}),(0,Q.jsx)(`option`,{value:`error`,children:`skip the file and report the conflict`})]})})]}),!a&&(0,Q.jsx)(`p`,{className:`text-sm text-amber-700 dark:text-amber-400`,children:`This destination has not reported support for folder paths. Select a supported backend before saving.`}),d&&(0,Q.jsxs)(`div`,{className:`space-y-1.5 rounded-lg bg-muted/60 px-3 py-3 text-sm`,"aria-live":`polite`,children:[(0,Q.jsx)(`p`,{className:`font-medium`,children:`Destination preview`}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Example email dated `,d.date,`. Each email supplies its own date.`]}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Root folder: `,(0,Q.jsxs)(`span`,{className:`break-all font-mono`,children:[d.root,`/`]})]}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Path added beneath it: `,(0,Q.jsx)(`span`,{className:`break-all font-mono`,children:d.added?`${d.added}/`:`(none)`})]}),(0,Q.jsx)(`p`,{className:`break-all font-mono`,children:d.result})]}),(0,Q.jsx)(jh,{checked:t.includeInline,onChange:e=>r({includeInline:e}),label:`Include inline attachments`,hint:`Off by default, so signature images and embedded resources are excluded.`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Copies matching attachments and keeps the email and its original files. Missing folders are created on the backend. Dates use the email's sent date (received/content date, then creation date if absent), in the server's timezone. This does not read the invoice date from the PDF.`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Use Apply on the saved rule to process existing mail within the selected batch size. Add a subject or attachment filename condition if you need to distinguish invoices from other PDFs.`})]}),t.kind===`download`&&(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,Q.jsx)(Ah,{label:`Download`,hint:ah.find(e=>e.value===t.dlKind)?.hint,children:(0,Q.jsx)(`select`,{className:Oh,value:t.dlKind,onChange:e=>r({dlKind:e.target.value}),children:ah.map(e=>(0,Q.jsx)(`option`,{value:e.value,children:e.label},e.value))})}),t.dlKind===`website`?(0,Q.jsx)(Ah,{label:`Mirror depth`,hint:`How many link hops to follow on the same site (1–5).`,children:(0,Q.jsx)(J,{type:`number`,min:1,max:5,className:q(kh,`sm:max-w-32`),value:t.dlDepth,onChange:e=>r({dlDepth:e.target.value})})}):(0,Q.jsx)(`div`,{className:`hidden sm:block`}),(0,Q.jsx)(Ah,{label:`Storage backend`,hint:`Where the downloaded file's bytes should live.`,children:le(t.a,e=>r({a:e}),`workspace:home (default)`)}),(0,Q.jsx)(Ah,{label:`Folder on that backend`,hint:`Relative to the backend root.`,children:(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:`Downloads`,value:t.storeFolder,onChange:e=>r({storeFolder:e.target.value})}),H(`storeFolder`,n,`Browse storage backends`)]})}),(0,Q.jsx)(Ah,{label:`File the download under`,hint:`Leave empty to file it in the same folder(s) as the link. Comma-separate several.`,children:(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:`same folders as the link`,value:t.b,onChange:e=>r({b:e.target.value})}),H(`action`,n)]})}),(0,Q.jsx)(Ah,{label:`Tags for the download`,hint:`Optional, comma-separated.`,children:(0,Q.jsx)(J,{className:q(kh,`font-mono`),placeholder:`downloaded, custom/paper`,value:t.dlTags,onChange:e=>r({dlTags:e.target.value})})})]}),(0,Q.jsx)(jh,{checked:t.recursive,onChange:e=>r({recursive:e}),label:`Recreate sub-folder path in destination`,hint:ce?`A link filed under …/folder/a/b is downloaded into Folder/a/b.`:`Add an "is under the folder" condition to mirror sub-folders.`,disabled:!ce}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`The link stays as it is; the download becomes a new file item next to it. Each link is downloaded once per rule. Videos need `,(0,Q.jsx)(`span`,{className:`font-mono`,children:`yt-dlp`}),`, pages and websites `,(0,Q.jsx)(`span`,{className:`font-mono`,children:`wget`}),` on the server.`]})]}),t.kind===`unstore`&&(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,Q.jsx)(Ah,{label:`Delete the file from`,children:le(t.a,e=>r({a:e}),`pick a backend…`,`workspace:data`)}),(0,Q.jsx)(Ah,{label:`…but only once it is also on`,hint:`Safety: the copy is dropped only after another backend holds the file.`,children:le(t.b,e=>r({b:e}),`anywhere else`,`workspace:home (optional)`)})]}),(0,Q.jsx)(jh,{checked:t.keepLast,onChange:e=>r({keepLast:e}),label:`Never delete the last copy`,hint:`Off means the rule may delete the only remaining copy of a file. Leave it on unless you mean exactly that.`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Deletes the stored bytes on that backend only — copies elsewhere and the item itself are kept.`})]}),t.kind===`notify`&&(0,Q.jsx)(Ah,{label:`Message`,hint:`Templates work: {{doc.data.subject}}, {{doc.data.from}}, {{doc.data.url}}, {{doc.data.title}}…`,children:(0,Q.jsx)(J,{className:kh,placeholder:`New mail from {{doc.data.from}}: {{doc.data.subject}}`,value:t.a,onChange:e=>r({a:e.target.value})})}),t.kind===`delete`&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Removes the item from the Canvas index. Files, blobs and mail on storage backends stay untouched.`}),t.kind===`destroy`&&(0,Q.jsx)(`p`,{className:`rounded-lg border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive`,children:`⚠ Irreversible: deletes the stored bytes too (blobs, workspace files, mail on the server), then removes the item from the index.`}),t.kind===`agent`&&(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsx)(Ah,{label:`Agent`,hint:`The agent's slug.`,children:(0,Q.jsx)(J,{className:q(kh,`font-mono sm:max-w-xs`),placeholder:`assistant`,value:t.a,onChange:e=>r({a:e.target.value})})}),(0,Q.jsx)(Ah,{label:`Prompt`,hint:`Templates use indexed fields: {{doc.id}}, {{doc.data.subject}}, {{doc.data.bodyPreview}} (emails), {{doc.data.url}}… Ask the agent to use canvas_get for full email content. Objects are inserted as JSON.`,children:(0,Q.jsx)(`textarea`,{className:`min-h-28 w-full rounded-md border bg-background p-3 text-sm outline-none focus:ring-2 focus:ring-ring`,placeholder:`Read email #{{doc.id}} in full with canvas_get and summarize it in plain markdown.
10
-
11
- Subject: {{doc.data.subject}}
12
- Preview: {{doc.data.bodyPreview}}`,value:t.b,onChange:e=>r({b:e.target.value})})}),c(`reply`)]}),t.kind===`script`&&(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsx)(Ah,{label:`Script`,hint:`From the Scripts section of this workspace.`,children:C.length?(0,Q.jsxs)(`select`,{className:q(Oh,`font-mono sm:max-w-md`),value:t.a,onChange:e=>r({a:e.target.value}),children:[(0,Q.jsx)(`option`,{value:``,children:`pick a script…`}),C.map(e=>(0,Q.jsx)(`option`,{value:`scripts/${e}`,children:e},e))]}):(0,Q.jsx)(J,{className:q(kh,`font-mono sm:max-w-md`),placeholder:`scripts/my-script.sh`,value:t.a,onChange:e=>r({a:e.target.value})})}),c(`output`)]})]},n)}),(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,onClick:()=>z(`actions`,[..._.actions,sh(`tag`)]),children:[(0,Q.jsx)(cn,{className:`mr-1 h-4 w-4`}),` Add another action`]})]}),(0,Q.jsxs)(`section`,{className:`space-y-3`,children:[(0,Q.jsx)(Ph,{step:3,title:`Options`}),(0,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsx)(jh,{checked:_.approval,onChange:e=>z(`approval`,e),label:`Ask me before running`,hint:`Actions are held in the Pending queue for review — approve (optionally amended) or decline — instead of running automatically.`}),(0,Q.jsx)(jh,{checked:_.cascade,onChange:e=>z(`cascade`,e),label:`Also react to items created by automation`,hint:`Off by default so rules, hooks and agents cannot trigger each other in a loop. A server-side depth limit still stops runaway chains.`})]})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-2 border-t pt-4`,children:[(0,Q.jsxs)(X,{className:`h-10 px-5`,onClick:ee,disabled:x||h,children:[x?(0,Q.jsx)(Xn,{className:`mr-1.5 h-4 w-4 animate-spin`}):(0,Q.jsx)(Ve,{className:`mr-1.5 h-4 w-4`}),` `,_.id?`Save changes`:`Create rule`]}),(0,Q.jsx)(X,{className:`h-10`,variant:`outline`,onClick:()=>{v(null),c?.()},children:`Cancel`})]})]}),V&&(0,Q.jsx)(Up,{onClose:()=>ie(null),children:(0,Q.jsx)(Jm,{sizeClassName:`h-full w-[380px] max-w-[90vw] max-md:w-full`,fixedWorkspaceName:e,multiple:V.target!==`storeFolder`&&!(V.target===`condition`&&_?.actions.some(e=>e.kind===`store`)),tabs:V.target===`condition`?[`context`,`directory`,`backends`]:V.target===`storeFolder`?[`backends`]:[`context`,`directory`],title:V.target===`condition`?`Choose source folder…`:V.target===`storeFolder`?`Store files under…`:`File into…`,confirmLabel:V.target===`storeFolder`?`Use folder`:`Use path`,onConfirm:oe,onClose:()=>ie(null)})}),!o&&(h?(0,Q.jsx)(`p`,{className:`rounded-xl border p-6 text-center text-sm text-muted-foreground`,children:`Loading…`}):u.length===0?!y&&!_&&(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`rounded-xl border border-dashed p-6 text-center`,children:[(0,Q.jsx)(`p`,{className:`text-base font-medium`,children:`No rules yet`}),(0,Q.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:`Pick a starting point below, or right-click a folder in the tree and choose “Create rule…”.`})]}),pe]}):(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[ue.length>0&&(0,Q.jsxs)(`section`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1 text-sm text-muted-foreground`,children:[(0,Q.jsxs)(`h3`,{className:`flex items-center gap-2 font-semibold uppercase tracking-wide`,children:[(0,Q.jsx)(Pn,{className:`h-4 w-4 shrink-0`}),` Folder & storage rules`]}),(0,Q.jsx)(`p`,{children:`Right-click a folder in the tree to add one`})]}),(0,Q.jsx)(`div`,{className:`space-y-3`,children:ue.map(e=>(0,Q.jsx)(fe,{rule:e},e.id))})]}),de.length>0&&(0,Q.jsxs)(`section`,{className:`space-y-3`,children:[ue.length>0&&(0,Q.jsxs)(`h3`,{className:`flex items-center gap-2 text-sm font-semibold uppercase tracking-wide text-muted-foreground`,children:[(0,Q.jsx)(On,{className:`h-4 w-4`}),` Other rules`]}),(0,Q.jsx)(`div`,{className:`space-y-3`,children:de.map(e=>(0,Q.jsx)(fe,{rule:e},e.id))})]})]}))]})}function Lh({workspaceId:e,document:t,onClose:n}){let[r,i]=(0,Z.useState)(null),[a,o]=(0,Z.useState)(``),[s,c]=(0,Z.useState)(``);Np(n),(0,Z.useEffect)(()=>{let n=!1;return(async()=>{if(!Ep(await Jr(e)))throw Error(`Only workspace administrators can create rules.`);let r=await Ja(e,t.id);n||i(r)})().catch(e=>{n||o(e instanceof Error?e.message:`Could not load document`)}),()=>{n=!0}},[e,t.id]);let l=(0,Z.useMemo)(()=>r?Ap(r):[],[r]),u=l.find(e=>e.id===s)||l[0],d=(0,Z.useMemo)(()=>u?{kind:`document`,rule:u.rule}:null,[u]);return(0,Q.jsx)(Fp,{label:`Create rule`,onClose:n,children:(0,Q.jsxs)(`div`,{className:`p-5`,children:[(0,Q.jsxs)(`div`,{className:`mb-4 flex items-start justify-between gap-3`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`h2`,{id:`document-rule-title`,className:`text-lg font-semibold`,children:`Create rule`}),(0,Q.jsx)(`p`,{className:`truncate text-sm text-muted-foreground`,children:Ni(t).title})]}),(0,Q.jsx)(`button`,{type:`button`,"aria-label":`Close`,onClick:n,className:`rounded-md p-2 hover:bg-accent`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),a?(0,Q.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:a}):r?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`label`,{className:`mb-4 block space-y-2 text-sm font-medium`,children:[(0,Q.jsx)(`span`,{children:`Start with`}),(0,Q.jsx)(`select`,{className:`h-10 w-full rounded-md border bg-background px-3`,value:u?.id,onChange:e=>c(e.target.value),children:l.map(e=>(0,Q.jsx)(`option`,{value:e.id,children:e.label},e.id))})]}),(0,Q.jsx)(Ih,{workspaceId:e,prefill:d,createOnly:!0,onCreated:n,onCancel:n})]}):(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading document…`})]})})}function Rh(e,t){return{left:Math.min(e.x,t.x),top:Math.min(e.y,t.y),width:Math.abs(t.x-e.x),height:Math.abs(t.y-e.y)}}function zh(e,t){return e.left<t.left+t.width&&e.left+e.width>t.left&&e.top<t.top+t.height&&e.top+e.height>t.top}function Bh(e,t,n,r){let i=new Set(r?n:[]);for(let n of t)zh(e,n.bounds)&&i.add(n.id);return i}var Vh=`[data-document-id], button, a, input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="button"], [role="dialog"], [role="menu"], [draggable="true"], thead, [data-selection-ignore]`;function Hh(e,t){let n=e.ownerDocument.defaultView,r=null,i=null,a=0,o=0,s=!1,c=!1,l=``,u=()=>{let t=e.getBoundingClientRect();return{left:t.left+e.clientLeft,top:t.top+e.clientTop,width:e.clientWidth,height:e.clientHeight}},d=t=>{let n=u();return{x:Math.max(0,Math.min(n.width,t.x-n.left))+e.scrollLeft,y:Math.max(0,Math.min(n.height,t.y-n.top))+e.scrollTop}},f=()=>{if(!r?.active||!i)return;let n=Rh(r.start,d(r.client));Object.assign(i.style,{left:`${n.left}px`,top:`${n.top}px`,width:`${n.width}px`,height:`${n.height}px`});let a=u(),o=Array.from(e.querySelectorAll(`[data-document-id]`)).filter(e=>e.getClientRects().length>0).map(t=>{let n=t.getBoundingClientRect();return{id:Number(t.dataset.documentId),bounds:{left:n.left-a.left+e.scrollLeft,top:n.top-a.top+e.scrollTop,width:n.width,height:n.height}}});t.onSelectionChange(Bh(n,o,r.initial,r.additive))},p=(e,t,n)=>{let r=Math.min(40,n/4);return e<t+r?-18*Math.min(1,(t+r-e)/r):e>t+n-r?18*Math.min(1,(e-t-n+r)/r):0},m=t=>{if(!r?.active)return;let i=u(),c=o?Math.min(2,(t-o)/(1e3/60)):1;o=t;let{scrollTop:l,scrollLeft:d}=e;e.scrollTop+=p(r.client.y,i.top,i.height)*c,e.scrollLeft+=p(r.client.x,i.left,i.width)*c,(s||e.scrollTop!==l||e.scrollLeft!==d)&&(f(),s=!1),a=n.requestAnimationFrame(m)},h=(s=!1)=>{if(!r)return;let u=r;r=null,n.cancelAnimationFrame(a),a=0,o=0,i?.remove(),i=null,u.active&&(e.style.userSelect=l,c=!0,s&&t.onSelectionChange(u.initial)),e.hasPointerCapture(u.pointerId)&&e.releasePointerCapture(u.pointerId)},g=n=>{if(c=!1,r||n.button!==0||!n.isPrimary||n.pointerType===`touch`)return;let i=n.target;if(!e.contains(i)||i.closest(Vh))return;let a=u();if(n.clientX<a.left||n.clientX>=a.left+a.width||n.clientY<a.top||n.clientY>=a.top+a.height)return;let o={x:n.clientX,y:n.clientY};r={pointerId:n.pointerId,start:d(o),clientStart:o,client:o,initial:new Set(t.getSelection()),additive:n.ctrlKey||n.metaKey||n.shiftKey,active:!1},n.preventDefault(),e.focus({preventScroll:!0}),e.setPointerCapture(n.pointerId)},_=t=>{if(!(!r||t.pointerId!==r.pointerId)){if(!(t.buttons&1)){h();return}if(r.client={x:t.clientX,y:t.clientY},!r.active){if(Math.hypot(t.clientX-r.clientStart.x,t.clientY-r.clientStart.y)<4)return;r.active=!0,l=e.style.userSelect,e.style.userSelect=`none`,n.getSelection()?.removeAllRanges(),i=e.ownerDocument.createElement(`div`),i.setAttribute(`aria-hidden`,`true`),i.dataset.selectionRectangle=``,i.className=`pointer-events-none absolute z-20 border border-info bg-info/15`,e.append(i),a=n.requestAnimationFrame(m)}s=!0,t.preventDefault()}},v=e=>{!r||e.pointerId!==r.pointerId||(r.client={x:e.clientX,y:e.clientY},r.active?f():r.additive||t.onSelectionChange(new Set),h())},y=()=>h(!0),b=e=>{e.pointerId===r?.pointerId&&y()},x=e=>{r&&e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),y())},S=e=>{c&&(c=!1,e.preventDefault(),e.stopImmediatePropagation())},C=()=>{s=!0};return e.addEventListener(`pointerdown`,g),e.addEventListener(`pointermove`,_),e.addEventListener(`pointerup`,v),e.addEventListener(`pointercancel`,b),e.addEventListener(`lostpointercapture`,b),e.addEventListener(`click`,S,!0),e.addEventListener(`scroll`,C,!0),n.addEventListener(`keydown`,x,!0),n.addEventListener(`blur`,y),()=>{h(),e.removeEventListener(`pointerdown`,g),e.removeEventListener(`pointermove`,_),e.removeEventListener(`pointerup`,v),e.removeEventListener(`pointercancel`,b),e.removeEventListener(`lostpointercapture`,b),e.removeEventListener(`click`,S,!0),e.removeEventListener(`scroll`,C,!0),n.removeEventListener(`keydown`,x,!0),n.removeEventListener(`blur`,y)}}function Uh({scope:e,selected:t,onSelectionChange:n,onContextMenu:r,children:i}){let a=(0,Z.useRef)(null),o=(0,Z.useRef)({selected:t,onSelectionChange:n});return(0,Z.useLayoutEffect)(()=>{o.current={selected:t,onSelectionChange:n}},[t,n]),(0,Z.useLayoutEffect)(()=>{if(a.current)return Hh(a.current,{getSelection:()=>o.current.selected,onSelectionChange:e=>o.current.onSelectionChange(e)})},[e]),(0,Q.jsx)(`div`,{ref:a,tabIndex:-1,"data-document-selection-area":``,onContextMenu:r,className:`relative isolate min-h-0 min-w-0 flex-1 overflow-auto p-2 outline-none`,children:i})}function Wh(e){let t=2166136261;for(let e of localStorage.getItem(`authToken`)||``)t=Math.imul(t^e.charCodeAt(0),16777619);return`canvas:workspace-copy:${t>>>0}:${e}`}function Gh({workspaceId:e,ids:t,onClose:n,modal:r=!1}){let{showProgress:i}=Hr();Np(n,r);let[a]=(0,Z.useState)(()=>{try{return Wh(e)}catch{return``}}),[o,s]=(0,Z.useState)(()=>{try{let e=JSON.parse(localStorage.getItem(a)||`null`);return e&&Array.isArray(e.ids)&&e.target&&e.index<e.ids.length?e:null}catch{return null}}),[c,l]=(0,Z.useState)(!1),[u,d]=(0,Z.useState)(``),f=(0,Z.useRef)(!1),p=(0,Z.useRef)(!1);(0,Z.useEffect)(()=>(f.current=!1,()=>{f.current=!0}),[]);let m=e=>{try{e.index>=e.ids.length?localStorage.removeItem(a):localStorage.setItem(a,JSON.stringify(e))}catch{}f.current||s(e)},h=async t=>{if(p.current)return;p.current=!0,l(!0),d(``);let n=t,r=()=>`${n.index} / ${n.ids.length} document(s) → ${n.target.workspaceName}`,a=i({title:`Copying to workspace…`,description:r()});m(n);try{for(;n.index<n.ids.length&&!f.current;){if(!navigator.onLine)throw Error(`Offline. Your copy is saved; resume when connected.`);await Oa(e,n.ids[n.index],{destination:n.target.workspaceName,context:n.paths,treeType:n.target.treeType,treeNameOrTreeId:n.target.treeName,operationId:`${n.id}:${n.index}`}),n={...n,index:n.index+1},m(n),a.update({title:`Copying to workspace…`,description:r()})}a.done({title:n.index>=n.ids.length?`Copy complete`:`Copy paused`,description:r()}),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`)),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`))}catch(e){a.fail({title:`Copy incomplete`,description:`${r()}. ${e instanceof Error?e.message:`Copy failed`}`,variant:`destructive`}),f.current||d(`Document ${n.ids[n.index]}: ${e instanceof Error?e.message:`Copy failed`}. Resume to retry.`)}finally{p.current=!1,f.current||l(!1)}},g=()=>{f.current=!0,n()},_=o!=null&&o.index>=o.ids.length,v=r?`h-full min-h-0 w-full`:Hp,y=(0,Q.jsx)(Q.Fragment,{children:o?(0,Q.jsxs)(`section`,{role:`dialog`,"aria-label":`Copy to workspace`,className:`${v} flex flex-col rounded-(--panel-radius) border bg-card p-4 shadow-elevation-4`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Copy to workspace`}),(0,Q.jsxs)(`p`,{className:`mt-3 break-words text-sm`,children:[o.target.workspaceName,`: `,o.paths.join(`, `)]}),(0,Q.jsxs)(`p`,{role:`status`,className:`mt-3 text-sm`,children:[o.index,` of `,o.ids.length,` copied`,_?`.`:c?`…`:` — paused.`]}),u&&(0,Q.jsx)(`p`,{role:`alert`,className:`mt-3 text-sm text-destructive`,children:u}),(0,Q.jsx)(`p`,{className:`mt-3 text-xs text-muted-foreground`,children:`Files go to workspace:data. Destination rules handle storage placement. Relationships and sharing permissions are not copied. Source documents stay unchanged.`}),!_&&(0,Q.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:`Closing lets the current item finish and pauses the rest. Reopen Copy to workspace to resume, including after reconnecting.`}),(0,Q.jsxs)(`div`,{className:`mt-auto flex flex-wrap justify-end gap-2 pt-4`,children:[!_&&!c&&(0,Q.jsx)(X,{variant:`ghost`,onClick:()=>{try{localStorage.removeItem(a)}catch{}s(null),d(``)},children:`Discard remaining`}),!_&&!c&&(0,Q.jsx)(X,{onClick:()=>void h(o),children:`Resume copy`}),(0,Q.jsx)(X,{variant:_?`default`:`outline`,onClick:g,children:_?`Done`:c?`Pause & close`:`Close`})]})]}):(0,Q.jsx)(Jm,{title:`Copy to workspace…`,confirmLabel:`Copy documents`,excludeWorkspace:e,documentCount:t.length,sizeClassName:v,onClose:g,onConfirm:(e,n)=>h({ids:t,target:n,paths:e,index:0,id:crypto.randomUUID()})})});return r?(0,Q.jsx)(Fp,{label:`Copy to workspace`,onClose:g,children:y}):(0,Q.jsx)(Up,{onClose:g,children:y})}function Kh({tags:e,onChange:t,placeholder:n=`Add tag, press Enter`,suggestions:r=[]}){let[i,a]=(0,Z.useState)(``),[o,s]=(0,Z.useState)(!1),c=i.trim().toLowerCase(),l=(c?r.filter(t=>t.toLowerCase().includes(c)&&!e.includes(t)):o?r.filter(t=>!e.includes(t)):[]).slice(0,8),u=()=>{let n=i.trim();n&&!e.includes(n)&&t([...e,n]),a(``)};return(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1.5 focus-within:ring-1 focus-within:ring-ring`,children:[e.map(n=>(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded bg-muted px-1.5 py-0.5 text-xs`,children:[n,(0,Q.jsx)(`button`,{type:`button`,onClick:()=>t(e.filter(e=>e!==n)),className:`text-muted-foreground hover:text-foreground`,"aria-label":`Remove ${n}`,children:(0,Q.jsx)(W,{className:`h-3 w-3`})})]},n)),(0,Q.jsxs)(`div`,{className:`relative flex-1 min-w-[8ch]`,children:[(0,Q.jsx)(`input`,{value:i,onChange:e=>a(e.target.value),onKeyDown:n=>{n.key===`Enter`||n.key===`,`?(n.preventDefault(),u()):n.key===`Backspace`&&!i&&e.length&&t(e.slice(0,-1))},onFocus:()=>s(!0),onBlur:()=>{setTimeout(u,150),s(!1)},placeholder:e.length?``:n,className:`w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground`}),l.length>0&&(0,Q.jsx)(`div`,{className:`absolute left-0 top-full z-50 mt-1 max-h-48 w-56 overflow-auto rounded-md border bg-popover p-1 text-sm shadow-elevation-2`,children:l.map(n=>(0,Q.jsx)(`button`,{type:`button`,onMouseDown:r=>{r.preventDefault(),e.includes(n)||t([...e,n]),a(``)},className:`block w-full rounded px-2 py-1 text-left hover:bg-accent`,children:n},n))})]})]})}function qh(e,t,n){return{...t.length?{features:[...new Set([...e.features??e.metadata?.features??[],...Jo(e.data?.tags??[]),...Jo(t)])]}:{},...n?{geo:n}:{}}}function Jh(e,t,n,r){return{id:e.id,schema:e.schema,schemaVersion:e.schemaVersion,metadata:qh(e,t,n),...r===void 0?{}:{comment:r.trim()}}}var Yh=n(Yo(),1),Xh=`#8b5cf6`,Zh=`https://nominatim.openstreetmap.org`,Qh=700,$h=e=>Math.round(e*1e6)/1e6;function eg(){let e=`<div style="display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:9999px 9999px 9999px 2px;transform:rotate(-45deg);background:${Xh};border:2px solid #fff;box-shadow:0 1px 4px rgba(0,0,0,.45)"><div style="width:8px;height:8px;border-radius:9999px;background:#fff"></div></div>`;return Yh.default.divIcon({html:e,className:`canvas-map-pick`,iconSize:[28,28],iconAnchor:[14,28]})}function tg({initial:e,onPick:t,onClose:n}){let r=(0,Z.useRef)(null),i=(0,Z.useRef)(null),a=(0,Z.useRef)(null),o=(0,Z.useRef)(null);(0,Z.useEffect)(()=>()=>o.current?.abort(),[]);let[s,c]=(0,Z.useState)(e?{lat:e.lat,lon:e.lon}:null),[l,u]=(0,Z.useState)(``),[d,f]=(0,Z.useState)([]),[p,m]=(0,Z.useState)(!1),[h,g]=(0,Z.useState)(null),[_,v]=(0,Z.useState)(!1),[y,b]=(0,Z.useState)(!1),[x,S]=(0,Z.useState)(!1);(0,Z.useEffect)(()=>{let e=requestAnimationFrame(()=>S(!0));return()=>cancelAnimationFrame(e)},[]),Np(n);let C=(0,Z.useCallback)((e,t,n)=>{let r=i.current;if(!r)return;let o=Yh.default.latLng(e,t);a.current?a.current.setLatLng(o):(a.current=Yh.default.marker(o,{icon:eg(),draggable:!0,autoPan:!0}).addTo(r),a.current.on(`dragend`,()=>{let e=a.current.getLatLng();c({lat:$h(e.lat),lon:$h(e.lng)})})),c({lat:$h(e),lon:$h(t),...n?{label:n}:{}})},[]);(0,Z.useEffect)(()=>{let t=r.current;if(!t||i.current)return;let n=Yh.default.map(t,{center:e?[e.lat,e.lon]:[20,0],zoom:e?13:2,worldCopyJump:!0,zoomControl:!0});Yh.default.tileLayer(`https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`,{attribution:`&copy; OpenStreetMap contributors`,maxZoom:19}).addTo(n),i.current=n,e&&C(e.lat,e.lon),n.on(`click`,e=>C(e.latlng.lat,e.latlng.lng));let o=new ResizeObserver(()=>n.invalidateSize());o.observe(t);let s=setTimeout(()=>n.invalidateSize(),260);return()=>{clearTimeout(s),o.disconnect(),n.remove(),i.current=null,a.current=null}},[]),(0,Z.useEffect)(()=>{if(!s||s.label)return;let{lat:e,lon:t}=s,n=new AbortController,r=setTimeout(()=>{v(!0),fetch(`${Zh}/reverse?format=jsonv2&zoom=16&lat=${e}&lon=${t}`,{signal:n.signal,headers:{Accept:`application/json`}}).then(e=>e.ok?e.json():null).then(n=>{let r=n?.display_name;typeof r==`string`&&r&&c(n=>n&&n.lat===e&&n.lon===t?{...n,label:r}:n)}).catch(()=>{}).finally(()=>v(!1))},Qh);return()=>{clearTimeout(r),n.abort()}},[s]);let w=(0,Z.useCallback)(async()=>{let e=l.trim();if(e.length<2)return;o.current?.abort();let t=new AbortController;o.current=t;let n=!1,r=window.setTimeout(()=>{n=!0,t.abort()},12e3);m(!0),f([]),g(null);try{let n=await fetch(`${Zh}/search?format=jsonv2&limit=6&q=${encodeURIComponent(e)}`,{signal:t.signal,headers:{Accept:`application/json`}});if(n.status===429)throw Error(`Place search is busy. Wait a moment and try again, or click the map`);if(!n.ok)throw Error(`Place search is unavailable (${n.status}). Try again, or click the map`);let r=await n.json();if(!Array.isArray(r))throw Error(`Place search returned an invalid response. Try again, or click the map`);if(t.signal.aborted||o.current!==t)return;f(r),r.length||g(`No match. Try a different spelling, or just click the map`)}catch(e){if(o.current!==t||t.signal.aborted&&!n)return;g(n?`Place search timed out. Try again, or click the map`:e instanceof TypeError?`Could not reach place search. Check your connection, or click the map`:e instanceof Error?e.message:`Search is unavailable right now. Click the map to place a pin`)}finally{window.clearTimeout(r),o.current===t&&(!t.signal.aborted||n)&&m(!1)}},[l]),T=(0,Z.useCallback)(()=>{if(!navigator.geolocation){g(`This browser has no geolocation`);return}b(!0),g(null),navigator.geolocation.getCurrentPosition(e=>{b(!1),i.current?.setView([e.coords.latitude,e.coords.longitude],16),C(e.coords.latitude,e.coords.longitude)},()=>{b(!1),g(`Could not read your location. Search or click the map instead`)},{enableHighAccuracy:!0,timeout:1e4,maximumAge:6e4})},[C]),E=(0,Z.useCallback)(e=>{let t=i.current,n=Number(e.lat),r=Number(e.lon);if(!t||!Number.isFinite(n)||!Number.isFinite(r))return;let a=e.boundingbox?.map(Number);a&&a.length===4&&a.every(Number.isFinite)?t.fitBounds(Yh.default.latLngBounds([a[0],a[2]],[a[1],a[3]]),{maxZoom:16}):t.setView([n,r],15),C(n,r,e.display_name),f([])},[C]);return(0,Pp.createPortal)((0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:q(`fixed inset-0 z-[60] bg-scrim transition-opacity duration-normal`,x?`opacity-100`:`opacity-0`),onClick:n}),(0,Q.jsxs)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-label":`Pick a location on the map`,className:q(`fixed inset-y-0 right-0 z-[61] flex w-[min(560px,100vw)] flex-col overflow-hidden rounded-(--panel-radius) bg-background shadow-elevation-4 transition-transform duration-normal ease-out`,x?`translate-x-0`:`translate-x-full`),children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-b px-3 py-2`,children:[(0,Q.jsxs)(`span`,{className:`flex items-center gap-2 text-sm font-medium`,children:[(0,Q.jsx)(nn,{className:`h-4 w-4 text-info`}),`Custom geotag`]}),(0,Q.jsx)(`button`,{type:`button`,onClick:n,"aria-label":`Close map`,className:`rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsxs)(`div`,{className:`relative z-10 shrink-0 border-b px-3 py-2`,children:[(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsxs)(`div`,{className:`relative flex-1`,children:[(0,Q.jsx)(nr,{className:`pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground`}),(0,Q.jsx)(`input`,{value:l,autoFocus:!0,onChange:e=>{o.current?.abort(),o.current=null,m(!1),f([]),u(e.target.value),g(null)},"aria-label":`Search for a place or address`,onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),w())},placeholder:`Search a place, e.g. Slavkovský štít`,spellCheck:!1,className:`h-8 w-full rounded-md border border-input bg-transparent pl-7 pr-2 text-sm outline-none placeholder:text-muted-foreground focus-visible:ring-1 focus-visible:ring-ring`})]}),(0,Q.jsx)(`button`,{type:`button`,onClick:T,disabled:y,title:`Use my current location`,"aria-label":`Use my current location`,className:`inline-flex h-8 w-8 items-center justify-center rounded-md border border-border text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50`,children:y?(0,Q.jsx)(Xn,{className:`h-3.5 w-3.5 animate-spin`}):(0,Q.jsx)(pn,{className:`h-3.5 w-3.5`})}),(0,Q.jsxs)(`button`,{type:`button`,onClick:w,disabled:p||l.trim().length<2,className:`inline-flex h-8 items-center gap-1.5 rounded-md bg-primary px-3 text-xs text-primary-foreground disabled:opacity-50`,children:[p?(0,Q.jsx)(Xn,{className:`h-3.5 w-3.5 animate-spin`}):(0,Q.jsx)(nr,{className:`h-3.5 w-3.5`}),`Search`]})]}),h&&(0,Q.jsx)(`p`,{role:`status`,className:`mt-1 text-xs text-warning`,children:h}),d.length>0&&(0,Q.jsx)(`div`,{className:`absolute inset-x-3 top-full z-10 mt-1 max-h-64 overflow-y-auto rounded-md border bg-popover shadow-elevation-4`,children:d.map(e=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>E(e),className:`block w-full border-b border-border/60 px-3 py-2 text-left text-xs last:border-0 hover:bg-muted`,children:e.display_name},`${e.lat},${e.lon},${e.display_name}`))})]}),(0,Q.jsxs)(`div`,{className:`relative isolate z-0 min-h-0 flex-1`,children:[(0,Q.jsx)(`div`,{ref:r,className:`h-full w-full`}),!s&&(0,Q.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 bottom-3 z-[1000] flex justify-center`,children:(0,Q.jsx)(`span`,{className:`rounded-full bg-background/90 px-3 py-1 text-xs text-muted-foreground shadow-elevation-2`,children:`Click the map to drop a pin, or drag it to fine-tune`})})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-3 border-t px-3 py-2`,children:[(0,Q.jsx)(`div`,{className:`min-w-0 text-xs`,children:s?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5 tabular-nums text-foreground`,children:[(0,Q.jsx)(fr,{className:`h-3 w-3 shrink-0 text-muted-foreground`}),s.lat.toFixed(5),`, `,s.lon.toFixed(5),_&&(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin text-muted-foreground`})]}),s.label&&(0,Q.jsx)(`div`,{className:`truncate text-muted-foreground`,children:s.label})]}):(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`No point selected`})}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:n,className:`rounded-md border border-border px-3 py-1.5 text-xs text-muted-foreground hover:bg-muted hover:text-foreground`,children:`Cancel`}),(0,Q.jsxs)(`button`,{type:`button`,disabled:!s,onClick:()=>{s&&(t(s),n())},className:`inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground disabled:opacity-50`,children:[(0,Q.jsx)(ae,{className:`h-3.5 w-3.5`}),`Use this point`]})]})]})]})]}),document.body)}var ng={exif:`from the photo's EXIF`,device:`from the device at capture`,manual:`placed by hand`};function rg(e){let t=`${e.lat.toFixed(5)}, ${e.lon.toFixed(5)}`,n=e.source?ng[e.source]:null;return[t,e.accuracy==null?null:`±${e.accuracy} m`,n].filter(Boolean).join(` · `)}function ig({value:e,onChange:t,idPrefix:n=`edit-geo`}){let[r,i]=(0,Z.useState)(!1);return(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${n}-action`,children:`Location`}),(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,Q.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2 text-xs`,children:[(0,Q.jsx)(nn,{className:e?`h-4 w-4 shrink-0 text-info`:`h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:e?`truncate tabular-nums`:`truncate text-muted-foreground`,children:e?rg(e):`No location on this document`})]}),(0,Q.jsxs)(`span`,{className:`flex shrink-0 items-center gap-1`,children:[(0,Q.jsxs)(`button`,{id:`${n}-action`,type:`button`,onClick:()=>i(!0),className:`inline-flex items-center gap-1.5 rounded-md border border-border px-2 py-1 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,children:[(0,Q.jsx)(Rn,{className:`h-3.5 w-3.5`}),e?`Move pin`:`Set on map`]}),e&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>t(null),"aria-label":`Remove location`,title:`Remove location`,className:`rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]})]}),r&&(0,Q.jsx)(tg,{initial:e,onPick:e=>t({lat:e.lat,lon:e.lon,source:`manual`}),onClose:()=>i(!1)})]})}function ag({workspaceId:e,documentIds:t,onClose:n}){let[r,i]=(0,Z.useState)([]),[a,o]=(0,Z.useState)(null),[s,c]=(0,Z.useState)(`keep`),[l,u]=(0,Z.useState)(``),d=(r.length>0||!!a||s!==`keep`)&&(s!==`replace`||l.trim().length>0),[f,p]=(0,Z.useState)(t),[m,h]=(0,Z.useState)(!1),[g,_]=(0,Z.useState)(``);return Np(n,!m),(0,Pp.createPortal)((0,Q.jsx)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center bg-scrim p-4`,children:(0,Q.jsxs)(`section`,{role:`dialog`,"aria-modal":`true`,"aria-labelledby":`bulk-edit-title`,className:`max-h-viewport-modal overflow-y-auto w-full max-w-md space-y-4 rounded-(--panel-radius) border bg-background p-5 shadow-elevation-4`,children:[(0,Q.jsxs)(`h2`,{id:`bulk-edit-title`,className:`font-semibold`,children:[`Bulk Edit · `,f.length,` documents`]}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Add tags to all selected documents. Choosing a location replaces their existing geotags; leaving it unset keeps them.`}),(0,Q.jsxs)(`fieldset`,{disabled:m,className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:`Add tags`}),(0,Q.jsx)(Kh,{tags:r,onChange:i,suggestions:[]})]}),(0,Q.jsx)(ig,{value:a,onChange:o,idPrefix:`bulk-geo`}),(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(`label`,{htmlFor:`bulk-comment-mode`,className:`text-sm font-medium`,children:`Comment`}),(0,Q.jsxs)(`select`,{id:`bulk-comment-mode`,value:s,onChange:e=>c(e.target.value),className:`w-full rounded-md border border-input bg-background px-3 py-2 text-sm`,children:[(0,Q.jsx)(`option`,{value:`keep`,children:`Keep existing comments`}),(0,Q.jsx)(`option`,{value:`replace`,children:`Replace comments`}),(0,Q.jsx)(`option`,{value:`clear`,children:`Clear comments`})]}),s===`replace`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`label`,{htmlFor:`bulk-comment`,className:`sr-only`,children:`New comment for all selected documents`}),(0,Q.jsx)(`textarea`,{id:`bulk-comment`,rows:3,value:l,onChange:e=>u(e.target.value),placeholder:`Comment for all selected documents…`,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`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`This replaces the comment on every selected document.`})]}),s===`clear`&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`This removes the comment from every selected document.`})]})]}),g&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:g}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Q.jsx)(X,{variant:`outline`,onClick:n,disabled:m,children:`Cancel`}),(0,Q.jsx)(X,{onClick:async()=>{if(m||!d)return;h(!0),_(``);let t=[];for(let n of f)try{let t=await Ja(e,n);await _o(e,Jh(t,r,a,s===`keep`?void 0:s===`clear`?``:l))}catch{t.push(n)}window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`)),h(!1),t.length?(p(t),_(`${f.length-t.length} saved; ${t.length} could not be updated. Retry applies only to those documents.`)):n()},disabled:m||!d,children:m?`Saving…`:g?`Retry failed`:`Apply to all`})]})]})}),window.document.body)}var og=e=>`/${e}`.replace(/\/+/g,`/`).replace(/\/$/,``)||`/`;function sg(e,t,n,r){return typeof e.sourcePath==`string`&&!!t&&e.sourceWorkspaceId===t&&!!n&&e.sourceTreeName===n&&og(e.sourcePath)===og(r)}var cg=[{mode:`copy`,label:`Copy to`,icon:(0,Q.jsx)(A,{className:`h-3.5 w-3.5`})},{mode:`move`,label:`Move to`,icon:(0,Q.jsx)(Ot,{className:`h-3.5 w-3.5`})},{mode:`delete`,label:`Delete from`,icon:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})}],lg=[{value:`rename`,label:`Rename mine (file-1.ext)`},{value:`overwrite`,label:`Overwrite the existing file`},{value:`error`,label:`Skip the document`}],ug=`h-9 w-full rounded-md border bg-background px-2 text-xs outline-none focus:ring-2 focus:ring-ring disabled:opacity-50`;function dg(e){return e.driver===`cacache`?tr:e.config?.remote===!0?F:Fe}function fg({workspaceId:e,documentCount:t,initialMode:n=`copy`,defaultFilename:r=``,onConfirm:i,onClose:a,saving:o=!1,sizeClassName:s,deleteFrom:c,progress:l,stopping:u=!1,onStop:d}){let{showErrorToast:f}=Gr(),[p,m]=(0,Z.useState)(!1);Np(a,!o&&!p);let[h,g]=(0,Z.useState)(n),[_,v]=(0,Z.useState)(null),[y,b]=(0,Z.useState)(null),[x,S]=(0,Z.useState)(()=>new Set(n===`delete`&&c?[c.backend]:[])),[C,w]=(0,Z.useState)(!1),[T,E]=(0,Z.useState)(``),[D,O]=(0,Z.useState)(r),[k,j]=(0,Z.useState)(`rename`);(0,Z.useEffect)(()=>{let t=!1;return Eo(e).then(e=>{if(t)return;v(e.filter(e=>e.kind===`storage`));let n=new Set(e.filter(e=>e.kind===`storage`&&e.enabled!==!1&&e.config?.readOnly!==!0&&e.config?.supported!==!1).map(e=>e.address));S(e=>new Set([...e].filter(e=>n.has(e))))}).catch(e=>{t||b(e instanceof Error?e.message:String(e))}),()=>{t=!0}},[e]);let M=h===`move`,N=e=>e.enabled===!1?`disabled`:e.config?.readOnly===!0?`read-only`:e.config?.supported===!1?`unsupported`:null,P=(0,Z.useMemo)(()=>(_||[]).filter(e=>!N(e)).map(e=>e.address),[_,h]),ee=e=>{g(e),S(t=>{let n=(_||[]).filter(e=>e.enabled!==!1&&e.config?.readOnly!==!0&&e.config?.supported!==!1).map(e=>e.address),r=[...t].filter(e=>n.includes(e));return new Set(e===`move`?r.slice(0,1):r)})},F=e=>{S(t=>{if(M)return t.has(e)?new Set:new Set([e]);let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},I=(0,Z.useMemo)(()=>(_||[]).filter(e=>x.has(e.address)&&Ba(e)),[_,x]),L=h!==`delete`&&I.length>0,R=e=>{let t=ma(e,_||[]),n=t&&_?.find(e=>e.address===t.address);return!!n&&!N(n)&&h!==`delete`&&!o},te=async(t,n)=>{let r=ma(t,_||[]);if(!r||!R(t))throw Error(`Choose a writable file backend folder`);await ca(e,r.driver,r.address,[[r.key,n].filter(Boolean).join(`/`)])},z=e=>{m(!1);let t=_a(e[0]||``,_||[]),n=t?(_||[]).find(e=>e.address===t.address):null;if(!t||!n){f(`Pick a folder inside a storage backend`);return}if(N(n)){f(`${n.address} is ${N(n)}`);return}if(!Ba(n)){f(`${n.address} does not keep folders — objects are stored by content`);return}E(t.key),S(e=>M?new Set([t.address]):new Set([...e,t.address]))},B=async()=>{x.size===0||o||await i([...x],h,{keepDocument:C,folder:L?T.trim():``,filename:L&&t===1?D.trim():``,onConflict:k})},re=t,V=re===1?``:`s`,ie=h===`delete`?`Delete ${re} document${V} from…`:`${h===`move`?`Move`:`Copy`} ${re} document${V} to…`,ae=h===`delete`?`Delete from`:h===`move`?`Move to`:`Copy to`,oe=x.size===0?ae.split(` `)[0]:`${ae} ${x.size} backend${x.size===1?``:`s`}`;return(0,Q.jsxs)(`div`,{className:q(`flex flex-col overflow-hidden rounded-(--panel-radius) border bg-card shadow-elevation-4`,s||`max-h-viewport-card w-[min(420px,90vw)] max-md:h-full max-md:w-full max-md:shadow-elevation-5`),children:[(0,Q.jsxs)(`div`,{className:`flex h-12 shrink-0 items-center justify-between border-b px-4`,children:[(0,Q.jsxs)(`span`,{className:`flex items-center gap-2 text-sm font-medium`,children:[(0,Q.jsx)(Fe,{className:`h-4 w-4`}),ie]}),(0,Q.jsx)(`button`,{type:`button`,onClick:a,disabled:o,className:`text-muted-foreground transition-colors hover:text-foreground disabled:opacity-40`,"aria-label":`Close`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsx)(`div`,{className:`flex shrink-0 items-center gap-1 border-b px-2 pt-2`,children:cg.map(({mode:e,label:t,icon:n})=>(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>ee(e),disabled:o,className:q(`flex items-center gap-1.5 rounded-t-md border-b-2 px-3 py-2 text-xs font-medium transition-colors disabled:opacity-50`,h===e?e===`delete`?`border-destructive text-destructive`:`border-primary text-foreground`:`border-transparent text-muted-foreground hover:text-foreground`),children:[n,t]},e))}),(0,Q.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-1.5 overflow-y-auto p-3`,children:[y&&(0,Q.jsx)(`p`,{className:`px-2 py-1.5 text-xs text-destructive`,children:y}),!_&&!y&&(0,Q.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground`,children:`Loading backends…`}),_?.length===0&&(0,Q.jsx)(`p`,{className:`px-2 py-1.5 text-xs text-muted-foreground`,children:`No storage backends configured.`}),_?.map(e=>{let t=dg(e),n=N(e),r=x.has(e.address),i=e.config?.remote===!0;return(0,Q.jsxs)(`div`,{onClick:()=>!n&&!o&&F(e.address),className:q(`group relative flex min-h-10 items-center gap-2 rounded-md px-3 py-2 text-sm shadow-elevation-1 transition-all select-none`,`before:absolute before:left-0 before:top-0 before:bottom-0 before:w-1.5 before:transition-colors`,n?`cursor-not-allowed bg-muted/40 opacity-60 before:bg-transparent`:`cursor-pointer hover:shadow`,!n&&r?h===`delete`?`bg-destructive/[0.08] hover:bg-destructive/[0.12] before:bg-destructive`:`bg-primary/[0.08] hover:bg-primary/[0.12] before:bg-primary`:n?``:`bg-card hover:bg-primary/[0.04] before:bg-transparent`),title:e.address,children:[(0,Q.jsx)(`input`,{type:M?`radio`:`checkbox`,checked:r,disabled:!!n||o,onChange:()=>F(e.address),onClick:e=>e.stopPropagation(),className:`h-4 w-4 shrink-0 accent-primary`,"aria-label":e.address}),(0,Q.jsx)(t,{className:`h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`span`,{className:`block truncate font-medium`,children:e.config?.label||e.address}),(0,Q.jsxs)(`span`,{className:`block truncate font-mono text-[10px] text-muted-foreground`,children:[e.driver,` · `,e.address]})]}),i&&(0,Q.jsx)(`span`,{className:`shrink-0 rounded bg-info-subtle px-1.5 py-0.5 text-[10px] uppercase text-muted-foreground`,title:`Network mount${e.config?.transport?` (${e.config.transport})`:``} — transfers cross the network`,children:e.config?.transport||`remote`}),n&&(0,Q.jsx)(`span`,{className:`shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] uppercase text-muted-foreground`,children:n})]},`${e.driver}/${e.address}`)}),h===`delete`&&(0,Q.jsxs)(`label`,{className:`mt-3 flex cursor-pointer items-start gap-2 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:C,onChange:e=>w(e.target.checked),disabled:o,className:`mt-0.5 h-3.5 w-3.5 accent-destructive`}),(0,Q.jsxs)(`span`,{children:[`Keep the index entry when its `,(0,Q.jsx)(`strong`,{children:`last`}),` copy is deleted.`,(0,Q.jsx)(`span`,{className:`block text-muted-foreground`,children:`Otherwise the document moves to workspace Trash once no locations remain.`})]})]}),L&&(0,Q.jsxs)(`div`,{className:`mt-3 space-y-2 rounded-md border px-3 py-2`,children:[(0,Q.jsxs)(`p`,{className:`text-xs font-medium`,children:[`Destination on `,I.map(e=>e.config?.label||e.address).join(`, `)]}),(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`label`,{htmlFor:`backend-transfer-folder`,className:`text-[11px] text-muted-foreground`,children:`Folder (relative to the backend root)`}),(0,Q.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,Q.jsx)(J,{id:`backend-transfer-folder`,value:T,onChange:e=>E(e.target.value),placeholder:`/`,disabled:o,className:`h-9 font-mono text-xs`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`icon`,className:`h-9 w-9 shrink-0`,onClick:()=>m(!0),disabled:o,"aria-label":`Browse backend folders`,title:`Browse…`,children:(0,Q.jsx)(ne,{className:`h-4 w-4`})})]})]}),t===1?(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`label`,{htmlFor:`backend-transfer-filename`,className:`text-[11px] text-muted-foreground`,children:`File name`}),(0,Q.jsx)(J,{id:`backend-transfer-filename`,value:D,onChange:e=>O(e.target.value),placeholder:r||`keeps the document's own name`,disabled:o,className:`h-9 font-mono text-xs`})]}):(0,Q.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Each document keeps its own file name and extension.`}),(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`label`,{htmlFor:`backend-transfer-conflict`,className:`text-[11px] text-muted-foreground`,children:`If a different file already has that name`}),(0,Q.jsx)(`select`,{id:`backend-transfer-conflict`,className:ug,value:k,onChange:e=>j(e.target.value),disabled:o,children:lg.map(e=>(0,Q.jsx)(`option`,{value:e.value,children:e.label},e.value))})]})]}),h===`move`&&P.length>0&&(0,Q.jsx)(`p`,{className:`px-1 pt-2 text-[11px] text-muted-foreground`,children:`The source copy is released only once the destination write is durable.`})]}),o&&l&&(0,Q.jsxs)(`div`,{role:`status`,className:`flex items-center justify-between gap-2 border-t px-4 py-2 text-xs`,children:[(0,Q.jsxs)(`span`,{children:[u?`Stopping after current file`:`Processing`,` · `,l.completed,`/`,l.total]}),d&&(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:d,disabled:u,children:`Stop`})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-t px-4 py-3`,children:[(0,Q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[x.size,` backend`,x.size===1?``:`s`,` selected`]}),(0,Q.jsx)(X,{size:`sm`,variant:h===`delete`?`destructive`:`default`,onClick:B,disabled:x.size===0||o,children:o?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Ad,{className:`mr-1.5 h-3.5 w-3.5`}),`Working…`]}):(0,Q.jsxs)(Q.Fragment,{children:[h===`delete`?(0,Q.jsx)(rt,{className:`mr-1 h-3.5 w-3.5`}):h===`move`?(0,Q.jsx)(Ot,{className:`mr-1 h-3.5 w-3.5`}):(0,Q.jsx)(A,{className:`mr-1 h-3.5 w-3.5`}),oe]})})]}),h===`delete`&&(0,Q.jsxs)(`div`,{className:`flex items-start gap-2 border-t bg-destructive/5 px-4 py-2 text-[11px] text-muted-foreground`,children:[(0,Q.jsx)(U,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 text-destructive`}),(0,Q.jsx)(`span`,{children:c&&x.has(c.backend)?`Deletes selected files in ${c.backend}/${c.folder}. Copies in other folders are kept.${x.size>1?` Other selected backends are also targeted.`:` Copies on other backends are kept.`}`:`Deletes the file data from the selected backends. Copies on other backends are untouched.`})]}),p&&(0,Q.jsx)(Up,{onClose:()=>m(!1),children:(0,Q.jsx)(Jm,{sizeClassName:`h-full w-[380px] max-w-[90vw] max-md:w-full`,multiple:!1,tabs:[`backends`],fixedWorkspaceName:e,title:`Pick a destination folder…`,confirmLabel:`Use folder`,backendFolderCreation:{canCreate:R,create:te},onConfirm:z,onClose:()=>m(!1)})})]})}function pg({onClose:e,onConfirm:t,fixedWorkspaceName:n,saving:r=!1,sizeClassName:i}){let[a,o]=(0,Z.useState)(n?`browse`:`workspace`),[s,c]=(0,Z.useState)([]),[l,u]=(0,Z.useState)(!n),[d,f]=(0,Z.useState)(n??null),[p,m]=(0,Z.useState)(`context`),[h,g]=(0,Z.useState)(new Set),[_,v]=(0,Z.useState)(n);return n!==_&&(v(n),n||u(!0)),(0,Z.useEffect)(()=>{n||ji().then(c).catch(()=>c([])).finally(()=>u(!1))},[n]),(0,Q.jsxs)(`div`,{className:q(`flex flex-col overflow-hidden rounded-(--panel-radius) border bg-card shadow-elevation-4`,i||`h-viewport-card max-h-full w-[min(420px,90vw)] max-md:h-full max-md:w-full max-md:shadow-elevation-5`),children:[(0,Q.jsxs)(`div`,{className:`flex h-12 shrink-0 items-center justify-between border-b px-4`,children:[(0,Q.jsxs)(`span`,{className:`flex items-center gap-2 text-sm font-medium`,children:[(0,Q.jsx)(Dn,{className:`h-4 w-4`}),a===`workspace`?`Add existing documents…`:`Pick documents…`]}),(0,Q.jsx)(`button`,{type:`button`,onClick:e,disabled:r,className:`text-muted-foreground transition-colors hover:text-foreground disabled:opacity-40`,"aria-label":`Close`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:(0,Q.jsxs)(`div`,{className:`grid h-full w-[200%] grid-cols-2 transition-transform duration-normal`,style:{transform:a===`workspace`?`translateX(0)`:`translateX(-50%)`},children:[(0,Q.jsx)(`div`,{className:`flex min-w-0 flex-col overflow-y-auto p-2`,children:(0,Q.jsx)(Km,{workspaces:s,loading:l,onPick:e=>{f(e),g(new Set),o(`browse`)}})}),(0,Q.jsxs)(`div`,{className:`flex min-w-0 flex-col overflow-hidden`,children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 border-b px-2 pt-2`,children:[!n&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>o(`workspace`),className:`mr-1 rounded p-1.5 text-muted-foreground hover:bg-muted hover:text-foreground touch-target`,"aria-label":`Back to workspaces`,children:(0,Q.jsx)(gr,{className:`h-4 w-4 rotate-180`})}),[`context`,`directory`].map(e=>(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>{m(e),g(new Set)},className:q(`flex items-center gap-1.5 rounded-t-md border-b-2 px-3 py-2 text-xs font-medium transition-colors`,p===e?`border-primary text-foreground`:`border-transparent text-muted-foreground hover:text-foreground`),children:[Rm[e],zm[e]]},e))]}),d&&(0,Q.jsx)(qm,{workspaceName:d,treeTab:p,onTreeTabChange:m,selectedDocIds:h,onToggleDoc:e=>{g(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},onNavigate:()=>g(new Set)})]})]})}),a===`browse`&&(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between border-t px-4 py-3`,children:[(0,Q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[h.size,` document`,h.size===1?``:`s`,` selected`]}),(0,Q.jsx)(X,{size:`sm`,onClick:async()=>{!d||h.size===0||r||await t(Array.from(h),{workspaceName:d,treeName:p===`directory`?`directory`:lo,treeType:p})},disabled:h.size===0||r,children:r?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Ad,{className:`mr-1.5 h-3.5 w-3.5`}),`Adding…`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Dn,{className:`mr-1 h-3.5 w-3.5`}),`Add`]})})]})]})}var mg=(0,Z.createContext)(null),hg={entry:null,open:()=>{},close:()=>{}};function gg(){return(0,Z.useContext)(mg)??hg}var _g=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`div`,{className:`relative w-full overflow-auto`,children:(0,Q.jsx)(`table`,{ref:n,className:q(`w-full caption-bottom text-sm`,e),...t})}));_g.displayName=`Table`;var vg=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`thead`,{ref:n,className:q(`[&_tr]:border-b`,e),...t}));vg.displayName=`TableHeader`;var yg=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`tbody`,{ref:n,className:q(`[&_tr:last-child]:border-0`,e),...t}));yg.displayName=`TableBody`;var bg=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`tfoot`,{ref:n,className:q(`border-t bg-muted/50 font-medium [&>tr]:last:border-b-0`,e),...t}));bg.displayName=`TableFooter`;var xg=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`tr`,{ref:n,className:q(`border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted`,e),...t}));xg.displayName=`TableRow`;var Sg=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`th`,{ref:n,className:q(`h-12 px-2 md:px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0`,e),...t}));Sg.displayName=`TableHead`;var Cg=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`td`,{ref:n,className:q(`p-2 md:p-4 align-middle [&:has([role=checkbox])]:pr-0`,e),...t}));Cg.displayName=`TableCell`;var wg=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(`caption`,{ref:n,className:q(`mt-4 text-sm text-muted-foreground`,e),...t}));wg.displayName=`TableCaption`;var Tg=({label:e,sortKey:t,sort:n,onSort:r,className:i})=>{let a=n.key===t;return(0,Q.jsx)(Sg,{"aria-sort":a?n.dir===`asc`?`ascending`:`descending`:`none`,className:q(`cursor-pointer select-none hover:text-foreground transition-colors`,i),onClick:()=>r(t),children:(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[e,a?n.dir===`asc`?(0,Q.jsx)(tn,{className:`h-3.5 w-3.5`}):(0,Q.jsx)(Nt,{className:`h-3.5 w-3.5`}):(0,Q.jsx)(se,{className:`h-3.5 w-3.5 opacity-40`})]})})};Tg.displayName=`SortableTableHead`;function Eg(e,t,n={key:null,dir:`asc`}){let[r,i]=Z.useState(n);return{sorted:Z.useMemo(()=>{let n=r.key?t[r.key]:null;if(!n)return e;let i=r.dir===`asc`?1:-1;return[...e].sort((e,t)=>{let r=n(e)??``,a=n(t)??``;return typeof r==`number`&&typeof a==`number`?(r-a)*i:String(r).localeCompare(String(a),void 0,{numeric:!0})*i})},[e,r,t]),sort:r,toggleSort:Z.useCallback(e=>{i(t=>t.key===e?{key:e,dir:t.dir===`asc`?`desc`:`asc`}:{key:e,dir:`asc`})},[])}}var Dg=`workspace:relations:refresh`;function Og(){window.dispatchEvent(new CustomEvent(Dg))}var kg=(0,Z.createContext)(null),Ag=`canvas:documentOpenMode`;function jg(){try{return localStorage.getItem(Ag)===`modal`?`modal`:`side`}catch{return`side`}}var Mg=jg(),Ng=new Set;function Pg(){return Mg}function Fg(e){try{localStorage.setItem(Ag,e)}catch{}Mg=e;for(let e of Ng)e()}function Ig(e){Ng.add(e);let t=t=>{(t.key===Ag||t.key===null)&&(Mg=jg(),e())};return window.addEventListener(`storage`,t),()=>{Ng.delete(e),window.removeEventListener(`storage`,t)}}function Lg(){return(0,Z.useSyncExternalStore)(Ig,Pg,()=>`side`)}function Rg({onSearch:e,onDraftChange:t,inputRef:n,label:r=`Search documents`,clearOnSubmit:i=!0,showSubmitButton:a=!0}){return(0,Q.jsxs)(`form`,{className:`canvas-search-input`,role:`search`,onSubmit:n=>{n.preventDefault();let r=n.currentTarget.elements.namedItem(`query`),a=r.value.trim();a&&(e(a),i&&(r.value=``,t?.(``)))},children:[(0,Q.jsx)(`input`,{ref:n,name:`query`,type:`search`,"aria-label":r,placeholder:r,autoComplete:`off`,enterKeyHint:`search`,onChange:e=>t?.(e.target.value),onKeyDown:e=>{e.key===`Enter`&&e.nativeEvent.isComposing&&e.preventDefault()}}),a&&(0,Q.jsx)(`button`,{type:`submit`,className:`canvas-nav-button`,"aria-label":`Run search`,title:`Run search`,children:(0,Q.jsx)(nr,{size:17})})]})}function zg({queries:e,onRemoveQuery:t,scope:n=`path`,onScopeChange:r}){return(0,Q.jsxs)(`div`,{className:`canvas-search-options`,children:[r&&(0,Q.jsxs)(`div`,{className:`canvas-search-scopes`,"aria-label":`Search scope`,children:[(0,Q.jsx)(`span`,{children:`Search in`}),(0,Q.jsx)(`button`,{type:`button`,"aria-pressed":n===`path`,onClick:()=>r(`path`),children:`This path`}),(0,Q.jsx)(`button`,{type:`button`,"aria-pressed":n===`workspace`,onClick:()=>r(`workspace`),children:`Workspace`})]}),e.length>0&&(0,Q.jsxs)(`div`,{className:`canvas-search-queries`,"aria-label":`Active searches`,children:[e.map((e,n)=>(0,Q.jsxs)(`span`,{className:`canvas-search-query`,children:[(0,Q.jsx)(nr,{size:12,"aria-hidden":`true`}),(0,Q.jsx)(`span`,{title:e,children:e}),t&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>t(n),"aria-label":`Remove search: ${e}`,children:(0,Q.jsx)(W,{size:14})})]},`${e}-${n}`)),t&&e.length>1&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>t(-1),className:`canvas-search-clear`,children:`Clear all`})]})]})}function Bg({children:e,accentColor:t}){return(0,Q.jsxs)(`div`,{className:`canvas-navigation-tabs`,children:[(0,Q.jsx)(`span`,{"aria-hidden":`true`,className:`canvas-tab-divider`,style:t?{backgroundColor:t}:void 0}),e]})}function Vg({workspace:e,workspaceIcon:t,tree:n,path:r,document:i,section:a,onBack:o,onBrowseWorkspaces:s,onBrowseTree:c,onNavigatePath:l,onDocument:u,onSection:d,onFilter:p,filtersActive:m,filtersOpen:h,onAdd:g,search:_,onDraftChange:v,tabs:y,accentColor:b,actions:x}){let[S,C]=(0,Z.useState)(!1),[w,T]=(0,Z.useState)(!1),E=(0,Z.useRef)(null),D=(0,Z.useRef)(null),O=(0,Z.useRef)(null),k=(0,Z.useRef)(!1),A=JSON.stringify([e,n,r,i]),[j,M]=(0,Z.useState)(A);j!==A&&(M(A),C(!1)),(0,Z.useEffect)(()=>{S?D.current?.focus():(E.current&&(E.current.scrollLeft=E.current.scrollWidth,T(E.current.scrollLeft>1)),k.current&&=(O.current?.focus(),!1))},[S,A,a]);let N=()=>{k.current=!0,C(!1),v?.(``)},P=S?N:o??c,ee=Lm(r,e).slice(1),F=(e,t,n,r,i=!1)=>n?(0,Q.jsx)(`button`,{type:`button`,className:t,onClick:n,title:r,"aria-current":i?`location`:void 0,children:e}):(0,Q.jsx)(`span`,{className:`canvas-address-label ${t}`,title:r,"aria-current":i?`location`:void 0,children:e});return(0,Q.jsxs)(`header`,{className:`canvas-navigation${y?` has-tabs`:``}`,style:b?{borderTopColor:b}:void 0,children:[y&&(0,Q.jsx)(Bg,{accentColor:b,children:y}),(0,Q.jsxs)(`div`,{className:`canvas-address-row`,children:[(0,Q.jsx)(`button`,{type:`button`,className:`canvas-nav-button`,"aria-label":S?`Back to address`:`Back to previous view`,title:S?`Back to address`:`Back to previous view`,disabled:!S&&!o&&!c,onClick:P,children:(0,Q.jsx)(Yn,{size:19})}),(0,Q.jsxs)(`div`,{className:`canvas-address-field`,onDoubleClick:e=>{_&&!e.target.closest(`button`)&&C(!0)},onKeyDown:e=>{e.key===`Escape`&&S&&(e.preventDefault(),e.stopPropagation(),N())},children:[S&&_?(0,Q.jsx)(Rg,{inputRef:D,onSearch:_.onSearch,onDraftChange:v,clearOnSubmit:!_.localOnly,showSubmitButton:!1,label:_.queries.length?`Refine search…`:`Search documents…`}):(0,Q.jsxs)(Q.Fragment,{children:[F((0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(f,{icon:t||`ph:stack-fill`,className:`h-4 w-4 shrink-0`,"aria-hidden":`true`}),(0,Q.jsx)(`span`,{className:`truncate`,children:e})]}),`canvas-address-workspace`,s,`Browse workspaces`),(0,Q.jsxs)(`div`,{ref:E,className:`canvas-address-crumbs${w?` is-scrolled`:``}`,onScroll:e=>T(e.currentTarget.scrollLeft>1),role:`navigation`,"aria-label":`Canvas address`,tabIndex:0,onKeyDown:e=>{e.key===`Enter`&&e.target===e.currentTarget&&_&&C(!0)},children:[n&&F(`[${n}]`,`canvas-address-tree`,c,`Browse tree: ${n}`),F(`:/`,`canvas-address-root`,l?()=>l(`/`):void 0,`Go to tree root`),ee.map((e,t)=>(0,Q.jsxs)(`span`,{className:`canvas-address-segment`,children:[t>0&&(0,Q.jsx)(`span`,{"aria-hidden":`true`,children:`/`}),F(e.label,``,l?()=>l(e.path):void 0,e.path,!i&&t===ee.length-1)]},e.path)),i&&(0,Q.jsxs)(`span`,{className:`canvas-address-segment`,children:[(0,Q.jsx)(`span`,{"aria-hidden":`true`,children:ee.length?`/`:``}),F(i,``,u,i)]}),a&&F(`#${a}`,`canvas-address-section`,d,a,!0)]})]}),_&&(0,Q.jsxs)(`button`,{ref:O,type:`button`,className:`canvas-nav-button canvas-address-search`,onClick:S?N:()=>C(!0),"aria-label":S?`Close search`:`Search this canvas`,"aria-expanded":S,title:S?`Close search`:`Search this canvas`,children:[(0,Q.jsx)(nr,{size:17}),_.queries.length>0&&(0,Q.jsx)(`span`,{className:`canvas-nav-dot`})]})]}),p&&(0,Q.jsxs)(`button`,{type:`button`,className:`canvas-nav-button canvas-filter-button`,onClick:p,"aria-label":m?`Filters active`:`Filters`,"aria-expanded":!!h,"data-active":!!m,title:m?`Filters active`:`Filters`,children:[(0,Q.jsx)(Wn,{size:19}),m&&(0,Q.jsx)(`span`,{className:`canvas-nav-dot`})]}),g&&(0,Q.jsx)(`button`,{type:`button`,className:`canvas-nav-button canvas-add-button`,onClick:g,"aria-label":`Add here`,title:`Add here`,children:(0,Q.jsx)(cn,{size:21})}),x]}),S&&_&&(0,Q.jsxs)(`div`,{className:`canvas-search-dropdown`,children:[(0,Q.jsxs)(`div`,{className:`canvas-search-heading`,children:[(0,Q.jsx)(`span`,{children:_.localOnly?`Filter documents on this page`:v?`Type to filter this page · Enter to search all results`:`Search text or an exact ID, e.g. @id:123`}),(0,Q.jsx)(`button`,{type:`button`,className:`canvas-nav-button`,onClick:N,"aria-label":`Close search`,children:(0,Q.jsx)(W,{size:16})})]}),(0,Q.jsx)(zg,{..._})]}),!S&&_&&_.queries.length>0&&(0,Q.jsx)(`div`,{className:`px-3 pb-2`,children:(0,Q.jsx)(zg,{queries:_.queries,onRemoveQuery:_.onRemoveQuery})})]})}function Hg({tabs:e,active:t,onChange:n,className:r=``,iconOnly:i=!1}){return(0,Q.jsx)(`div`,{className:`flex gap-1 border-b overflow-x-auto ${r}`,children:e.map(e=>{let r=e.icon;return(0,Q.jsxs)(`button`,{onClick:()=>n(e.id),title:e.label,className:`${i&&r?`px-3`:`px-4`} py-2 text-sm font-medium border-b-2 transition-colors whitespace-nowrap inline-flex items-center gap-1.5 ${t===e.id?`border-primary text-foreground`:`border-transparent text-muted-foreground hover:text-foreground`}`,children:[r&&(0,Q.jsx)(r,{className:`h-3.5 w-3.5`}),(!i||!r)&&e.label]},e.id)})})}var Ug=1,Wg=8,Gg=320,Kg=28,qg=2.5,Jg={scale:1,x:0,y:0};function Yg({src:e,alt:t,className:n=``,onZoomChange:r}){let i=(0,Z.useRef)(null),a=(0,Z.useRef)(null),[o,s]=(0,Z.useState)(Jg),c=(0,Z.useRef)(new Map),l=(0,Z.useRef)(null),u=(0,Z.useRef)(null),d=(0,Z.useRef)(!1),f=(0,Z.useRef)(null),[p,m]=(0,Z.useState)(!1),[h,g]=(0,Z.useState)(e);h!==e&&(g(e),s(Jg)),(0,Z.useEffect)(()=>{r?.(o.scale>1.001)},[o.scale,r]);let _=(0,Z.useCallback)(e=>{let t=i.current,n=a.current;if(!t||!n)return e;let r=Math.min(Wg,Math.max(Ug,e.scale)),o=Math.max(0,(n.offsetWidth*r-t.clientWidth)/2),s=Math.max(0,(n.offsetHeight*r-t.clientHeight)/2);return{scale:r,x:Math.min(o,Math.max(-o,e.x)),y:Math.min(s,Math.max(-s,e.y))}},[]),v=(0,Z.useCallback)((e,t,n)=>{let r=i.current;if(!r)return;let a=r.getBoundingClientRect(),o=t-a.left-a.width/2,c=n-a.top-a.height/2;s(t=>{let n=e/t.scale;return _({scale:e,x:o-(o-t.x)*n,y:c-(c-t.y)*n})})},[_]),y=(0,Z.useCallback)(()=>{let e=i.current,t=a.current;if(!e||!t||!t.offsetWidth||!t.offsetHeight)return qg;let n=Math.max(e.clientWidth/t.offsetWidth,e.clientHeight/t.offsetHeight),r=Math.max(t.naturalWidth/t.offsetWidth,t.naturalHeight/t.offsetHeight)||Wg;return Math.min(Wg,Math.max(qg,Math.min(Math.max(n,qg),r)))},[]),b=(0,Z.useCallback)((e,t)=>{o.scale>1.001?s(Jg):v(y(),e,t)},[o.scale,v,y]),x=e=>{if(c.current.set(e.pointerId,{x:e.clientX,y:e.clientY}),d.current=!1,c.current.size===2){let[e,t]=[...c.current.values()];l.current={dist:Math.hypot(e.x-t.x,e.y-t.y),scale:o.scale,cx:(e.x+t.x)/2,cy:(e.y+t.y)/2}}e.currentTarget.setPointerCapture(e.pointerId)},S=e=>{let t=c.current.get(e.pointerId);if(!t)return;if(c.current.set(e.pointerId,{x:e.clientX,y:e.clientY}),c.current.size>=2&&l.current){let[e,t]=[...c.current.values()],n=Math.hypot(e.x-t.x,e.y-t.y);l.current.dist>0&&(d.current=!0,m(!0),v(l.current.scale*(n/l.current.dist),l.current.cx,l.current.cy));return}if(o.scale<=1.001)return;let n=e.clientX-t.x,r=e.clientY-t.y;(Math.abs(n)>1||Math.abs(r)>1)&&(d.current=!0,m(!0)),s(e=>_({...e,x:e.x+n,y:e.y+r}))},C=e=>{if(c.current.delete(e.pointerId),c.current.size<2&&(l.current=null),c.current.size===0&&m(!1),d.current){u.current=null;return}let t=e.timeStamp,n=u.current;if(n&&t-n.t<Gg&&Math.hypot(e.clientX-n.x,e.clientY-n.y)<Kg){u.current=null,f.current=t,b(e.clientX,e.clientY);return}u.current={t,x:e.clientX,y:e.clientY}},w=e=>{e.preventDefault();let t=o.scale*(e.deltaY<0?1.15:1/1.15);t<=Ug?s(Jg):v(Math.min(Wg,t),e.clientX,e.clientY)},T=o.scale>1.001;return(0,Q.jsx)(`div`,{ref:i,className:`relative flex h-full w-full items-center justify-center overflow-hidden`,style:{touchAction:`none`,cursor:T?`grab`:`zoom-in`},onPointerDown:x,onPointerMove:S,onPointerUp:C,onPointerCancel:e=>{c.current.delete(e.pointerId),l.current=null,u.current=null,d.current=!0,c.current.size===0&&m(!1)},onWheel:w,onDoubleClick:e=>{e.preventDefault(),e.stopPropagation(),!(f.current!==null&&e.timeStamp-f.current<Gg)&&b(e.clientX,e.clientY)},children:(0,Q.jsx)(`img`,{ref:a,src:e,alt:t,draggable:!1,className:n,style:{transform:`translate3d(${o.x}px, ${o.y}px, 0) scale(${o.scale})`,transformOrigin:`center center`,transition:p?`none`:`transform var(--duration-normal) ease-out`,willChange:`transform`}})})}var Xg=`(max-width: 767px)`,Zg=new Map;function Qg(e){let t=Zg.get(e);if(!t){let n=()=>typeof window<`u`&&typeof window.matchMedia==`function`;t={subscribe:t=>{if(!n())return()=>{};let r=window.matchMedia(e);return r.addEventListener(`change`,t),()=>r.removeEventListener(`change`,t)},getSnapshot:()=>n()?window.matchMedia(e).matches:!1},Zg.set(e,t)}return t}function $g(){let e=Qg(Xg);return(0,Z.useSyncExternalStore)(e.subscribe,e.getSnapshot,()=>!1)}function e_(){return t_(`(max-width: 1023px)`)}function t_(e){let t=Qg(e);return(0,Z.useSyncExternalStore)(t.subscribe,t.getSnapshot,()=>!1)}function n_(){return!/android|iphone|ipad|mobile/i.test(navigator.userAgent)&&navigator.pdfViewerEnabled!==!1}var r_=40,i_=1600;function a_({blob:e,filename:t}){let n=(0,Z.useRef)(null),[r,i]=(0,Z.useState)({error:null,pages:0,truncated:!1});return(0,Z.useEffect)(()=>{let r=n.current;if(!r)return;let a=!1,o=null;return(async()=>{let n=await g(()=>import(`./pdf-Ciz5_WNq.js`),__vite__mapDeps([0,1])),s=(await g(async()=>{let{default:e}=await import(`./pdf.worker.min-C8Ts8bNu.js`);return{default:e}},[])).default;n.GlobalWorkerOptions.workerSrc=s;let c=await e.arrayBuffer();if(a)return;let l=n.getDocument({data:c});o=()=>{l.destroy()};let u=await l.promise;if(a)return;let d=Math.min(u.numPages,r_),f=r.clientWidth||600,p=window.devicePixelRatio||1;for(let e=1;e<=d;e++){if(a)return;let n=await u.getPage(e),o=n.getViewport({scale:1}),s=Math.min(f*p,i_*p)/o.width,c=n.getViewport({scale:s}),l=document.createElement(`canvas`);if(l.width=c.width,l.height=c.height,l.style.width=`100%`,l.style.height=`auto`,l.className=`rounded border bg-white`,l.setAttribute(`aria-label`,`${t}, page ${e}`),await n.render({canvas:l,viewport:c}).promise,n.cleanup(),a)return;r.appendChild(l),i({error:null,pages:e,truncated:u.numPages>r_})}})().catch(e=>{a||i(t=>({...t,error:e instanceof Error?e.message:String(e)}))}),()=>{a=!0,o?.(),r.replaceChildren()}},[e,t]),(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[r.error&&(0,Q.jsxs)(`p`,{className:`text-sm text-destructive`,children:[`Could not render PDF: `,r.error]}),!r.error&&r.pages===0&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Rendering PDF…`}),(0,Q.jsx)(`div`,{ref:n,className:`space-y-2`}),r.truncated&&(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Showing the first `,r_,` pages. Download the file for the full document.`]})]})}function o_({blob:e,blobUrl:t,filename:n,className:r=``}){let i=(0,Z.useMemo)(()=>e&&e.type!==`application/pdf`?URL.createObjectURL(e.slice(0,e.size,`application/pdf`)):null,[e]);return(0,Z.useEffect)(()=>()=>{i&&URL.revokeObjectURL(i)},[i]),n_()||!e?(0,Q.jsx)(`div`,{className:`min-h-[300px] ${r}`,children:(0,Q.jsx)(`iframe`,{src:i??t,className:`h-full min-h-[300px] w-full rounded border`,title:n})}):(0,Q.jsx)(`div`,{className:`max-h-viewport-pane overflow-y-auto ${r}`,children:(0,Q.jsx)(a_,{blob:e,filename:n})})}function s_(e,t,n=256,{enabled:r=!0,blobFallback:i=!0,version:a=null}={}){let{isPublic:o,fetchBlob:s,fetchThumbnail:c}=Fo(e),l=`${o?`pub`:`ws`}:${e}:${t}:${n}:${r}:${a??``}`,[u,d]=(0,Z.useState)({blobUrl:null,error:null,loading:r}),[f,p]=(0,Z.useState)(l);return l!==f&&(p(l),d({blobUrl:null,error:null,loading:r})),(0,Z.useEffect)(()=>{if(!r)return;let e=!1,o=null;return c(t,n,a).catch(e=>{if(!i)throw e;return s(t)}).then(({blob:t})=>{e||(o=URL.createObjectURL(t),d({blobUrl:o,error:null,loading:!1}))}).catch(t=>{e||d({blobUrl:null,error:String(t instanceof Error?t.message:t),loading:!1})}),()=>{e=!0,o&&URL.revokeObjectURL(o)}},[l]),u}function c_({workspaceId:e,document:t}){let{download:n}=Fo(e),[r,i]=(0,Z.useState)(!1),a=Zr(t)||`document-${t.id}`;return(0,Q.jsxs)(`button`,{type:`button`,onClick:async()=>{i(!0);try{await n(t.id,a)}finally{i(!1)}},disabled:r,className:`inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground disabled:opacity-50`,children:[(0,Q.jsx)(Jt,{className:`h-3.5 w-3.5`}),r?`Preparing…`:`Download`]})}var l_=1600;function u_({error:e,loading:t,children:n}){return e?(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:e}):t?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading preview...`}):(0,Q.jsx)(Q.Fragment,{children:n})}function d_({workspaceId:e,document:t,className:n=``}){let r=(0,Z.useContext)(kg),i=$g(),a=t_(`(pointer: coarse)`),{blobUrl:o,error:s,loading:c}=s_(e,t.id,l_,{version:t.checksumArray?.[0]??null}),{fetchBlob:l}=Fo(e),u=Zr(t)||`document-${t.id}`,[d,f]=(0,Z.useState)(!1);return(0,Q.jsx)(u_,{error:s,loading:c,children:o&&(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-2 ${n}`,children:[i||a?(0,Q.jsx)(`div`,{className:`min-h-0 flex-1`,children:(0,Q.jsx)(Yg,{src:o,alt:u,className:`max-h-full max-w-full object-contain`})}):(0,Q.jsx)(`img`,{src:o,alt:u,draggable:!1,onDoubleClick:r?e=>{e.preventDefault(),e.stopPropagation(),r()}:void 0,title:r?`Double-click to maximize or restore`:void 0,className:`min-h-0 w-full flex-1 object-contain ${r?`cursor-zoom-in`:``}`}),(0,Q.jsxs)(`button`,{type:`button`,onClick:async()=>{f(!0);try{let{blob:e}=await l(t.id),n=URL.createObjectURL(e),r=window.document.createElement(`a`);r.href=n,r.download=u,window.document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(n),3e4)}finally{f(!1)}},disabled:d,className:`inline-flex shrink-0 self-start items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground disabled:opacity-50`,children:[(0,Q.jsx)(Jt,{className:`h-3.5 w-3.5`}),d?`Preparing…`:`Download original`]})]})})}function f_({workspaceId:e,document:t,className:n=``}){let{src:r,error:i,loading:a}=Ho(e,t.id);return(0,Q.jsx)(u_,{error:i,loading:a,children:r&&(0,Q.jsxs)(`div`,{className:`space-y-2 ${n}`,children:[(0,Q.jsx)(`audio`,{src:r,controls:!0,preload:`metadata`,className:`w-full`}),(0,Q.jsx)(c_,{workspaceId:e,document:t})]})})}function p_({workspaceId:e,document:t,className:n=``}){let{src:r,error:i,loading:a}=Ho(e,t.id),[o,s]=(0,Z.useState)(!1);return(0,Q.jsx)(u_,{error:i,loading:a,children:r&&(0,Q.jsxs)(`div`,{className:`space-y-2 ${n}`,children:[(0,Q.jsx)(`video`,{src:r,controls:!0,playsInline:!0,preload:`metadata`,onError:()=>s(!0),className:`max-h-viewport-pane w-full rounded border`}),o&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`This video can’t be played inline in your browser. Download it to view.`}),(0,Q.jsx)(c_,{workspaceId:e,document:t})]})})}function m_({workspaceId:e,document:t,className:n=``}){let{blobUrl:r,blob:i,error:a,loading:o}=Po(e,t.id,{typeHint:`application/pdf`}),s=Zr(t)||`document-${t.id}`;return(0,Q.jsx)(u_,{error:a,loading:o,children:r&&(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-2 ${n}`,children:[(0,Q.jsx)(o_,{blob:i,blobUrl:r,filename:s,className:`min-h-0 flex-1`}),(0,Q.jsx)(`div`,{children:(0,Q.jsx)(c_,{workspaceId:e,document:t})})]})})}var h_=(0,Z.lazy)(()=>g(()=>import(`./markdown-html-XoABNf32.js`),__vite__mapDeps([2,3,4,5,6,7,8])));function g_({content:e,className:t=``,preview:n=!1}){return(0,Q.jsx)(Z.Suspense,{fallback:(0,Q.jsx)(`div`,{className:`whitespace-pre-wrap break-words ${t}`,children:e}),children:(0,Q.jsx)(h_,{content:e,className:t,preview:n})})}function __({workspaceId:e,document:t,className:n=``}){let{text:r,error:i,loading:a}=Po(e,t.id,{mode:`text`,version:t.checksumArray?.[0]});return i?(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:i}):a||r==null?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading...`}):(0,Q.jsx)(`pre`,{className:`bg-muted p-3 rounded text-xs overflow-auto max-h-viewport-pane whitespace-pre-wrap ${n}`,children:r})}function v_({workspaceId:e,document:t,className:n=``}){let r=t.schema===Ei,{text:i,error:a,loading:o}=Po(e,t.id,{mode:`text`,enabled:!r,version:t.checksumArray?.[0]});return r?(0,Q.jsxs)(`div`,{className:`markdown-note space-y-3 ${n}`,children:[t.data?.title?(0,Q.jsx)(`h3`,{className:`text-lg font-semibold`,children:String(t.data.title)}):null,(0,Q.jsx)(`div`,{className:`markdown-document-frame rounded-md border border-input bg-transparent`,children:(0,Q.jsx)(g_,{content:String(t.data?.content??``),className:`markdown-doc px-4 py-3`})})]}):a?(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:a}):o||i==null?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading...`}):(0,Q.jsx)(`div`,{className:`markdown-document-frame rounded-md border border-input bg-transparent overflow-auto max-h-viewport-pane ${n}`,children:(0,Q.jsx)(g_,{content:i,className:`markdown-doc px-4 py-3`})})}function y_({document:e,className:t=``}){let n=String(e.data?.url??e.data?.uri??``),r=_i(n);return r?(0,Q.jsx)(`div`,{className:`aspect-video w-full ${t}`,children:(0,Q.jsx)(`iframe`,{src:`https://www.youtube-nocookie.com/embed/${encodeURIComponent(r)}`,title:String(e.data?.title??e.data?.label??`YouTube video`),className:`h-full w-full rounded border`,allow:`accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture`,allowFullScreen:!0})}):null}function b_({document:e,className:t=``}){let n=String(e.data?.url??e.data?.uri??``),[r,i]=(0,Z.useState)({blobUrl:null,blob:null,failed:!1,loading:!0}),[a,o]=(0,Z.useState)(n);n!==a&&(o(n),i({blobUrl:null,blob:null,failed:!1,loading:!0})),(0,Z.useEffect)(()=>{let e=!1,t=null,r=async e=>{if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.blob();return new Blob([t],{type:`application/pdf`})},a=()=>{let e=localStorage.getItem(`authToken`);return fetch(`${Rr}/proxy/pdf?url=${encodeURIComponent(n)}`,{headers:e?{Authorization:`Bearer ${e}`}:{}})};return fetch(n).then(r).catch(()=>a().then(r)).then(n=>{e||(t=URL.createObjectURL(n),i({blobUrl:t,blob:n,failed:!1,loading:!1}))}).catch(()=>{e||i({blobUrl:null,blob:null,failed:!0,loading:!1})}),()=>{e=!0,t&&URL.revokeObjectURL(t)}},[n]);let{blobUrl:s,blob:c,failed:l,loading:u}=r,d=(()=>{try{let e=decodeURIComponent(new URL(n).pathname.split(`/`).filter(Boolean).pop()??``)||`document`;return/\.pdf$/i.test(e)?e:`${e}.pdf`}catch{return`document.pdf`}})();return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-2 ${t}`,children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-3`,children:[(0,Q.jsxs)(`a`,{href:n,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1 text-xs text-primary hover:underline`,children:[(0,Q.jsx)(Ut,{className:`h-3 w-3`}),` `,n]}),c&&(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>{if(!c)return;let e=URL.createObjectURL(c),t=window.document.createElement(`a`);t.href=e,t.download=d,window.document.body.appendChild(t),t.click(),t.remove(),setTimeout(()=>URL.revokeObjectURL(e),3e4)},className:`inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground`,children:[(0,Q.jsx)(Jt,{className:`h-3.5 w-3.5`}),` Download`]})]}),u&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading PDF…`}),l&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Inline preview unavailable (direct fetch and server proxy both failed). Use the link above.`}),s&&(0,Q.jsx)(o_,{blob:c,blobUrl:s,filename:d,className:`min-h-[300px] flex-1`})]})}function x_(e){if(!e)return!1;try{let t=new URL(e);return!!(/\.pdf$/i.test(t.pathname)||t.hostname.endsWith(`arxiv.org`)&&t.pathname.startsWith(`/pdf/`))}catch{return!1}}function S_(e){try{return new URL(e).hostname.replace(/^www\./,``)}catch{return e}}function C_({document:e,className:t=``}){let n=e.data||{},r=String(n.url??n.uri??``),i=String(n.title??n.label??``)||S_(r),a=typeof n.favIconUrl==`string`?n.favIconUrl:``,o=n.pinned===!0,s=typeof n.timestamp==`string`?n.timestamp:null,[c,l]=(0,Z.useState)(!1);return(0,Q.jsxs)(`div`,{className:`space-y-3 ${t}`,children:[(0,Q.jsxs)(`a`,{href:r,target:`_blank`,rel:`noopener noreferrer`,className:`group flex items-start gap-3 rounded-lg border bg-card p-3 transition-colors hover:bg-accent/40`,children:[(0,Q.jsx)(`div`,{className:`mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center overflow-hidden rounded bg-muted`,children:a&&!c?(0,Q.jsx)(`img`,{src:a,alt:``,className:`h-5 w-5`,onError:()=>l(!0)}):(0,Q.jsx)(Xe,{className:`h-4 w-4 text-muted-foreground`})}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(`span`,{className:`truncate font-medium leading-tight`,children:i}),o&&(0,Q.jsx)(ke,{className:`h-3 w-3 shrink-0 fill-warning text-warning`})]}),(0,Q.jsx)(`div`,{className:`mt-0.5 truncate text-xs text-muted-foreground`,children:S_(r)}),(0,Q.jsx)(`div`,{className:`mt-1 truncate font-mono text-[11px] text-muted-foreground/70`,children:r})]}),(0,Q.jsx)(Ut,{className:`mt-1 h-4 w-4 shrink-0 text-muted-foreground reveal-on-hover`})]}),s&&(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Saved `,new Date(s).toLocaleString()]})]})}var w_={enableHighAccuracy:!0,timeout:1e4,maximumAge:6e4};function T_(e){let t=e.coords,n={lat:t.latitude,lon:t.longitude,source:`device`};return t.altitude!=null&&Number.isFinite(t.altitude)&&(n.alt=t.altitude),Number.isFinite(t.accuracy)&&(n.accuracy=Math.round(t.accuracy)),n}function E_(){return new Promise((e,t)=>navigator.geolocation.getCurrentPosition(e,t,w_))}function D_(e){let t=e?.code;return t===1?`Location permission denied`:t===2?`Location unavailable; no fix right now`:t===3?`Timed out waiting for a location fix`:`Could not read your location`}function O_(){let e=typeof navigator<`u`&&`geolocation`in navigator&&typeof window<`u`&&window.isSecureContext,[t,n]=(0,Z.useState)(e?`prompt`:`unsupported`),[r,i]=(0,Z.useState)(!1),[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)(null),[l,u]=(0,Z.useState)(null),[d,f]=(0,Z.useState)(null),[p,m]=(0,Z.useState)(null),h=(0,Z.useRef)(!1),g=(0,Z.useRef)(null),_=(0,Z.useRef)(null);(0,Z.useEffect)(()=>{if(!e||!navigator.permissions?.query)return;let t=!1,r=null;return navigator.permissions.query({name:`geolocation`}).then(e=>{t||(r=e,n(e.state),e.onchange=()=>n(e.state))}).catch(()=>{}),()=>{t=!0,r&&(r.onchange=null)}},[e]);let v=(0,Z.useCallback)(e=>{if(c(null),!e){_.current=null,f(null),m(null),h.current||i(!1);return}let t={lat:e.lat,lon:e.lon,source:`manual`};_.current=t,f(t),m(e.label??null),i(!0)},[]);return{supported:e,permission:t,enabled:r,busy:a,error:s,fix:l,setEnabled:(0,Z.useCallback)(t=>{if(c(null),!t){h.current=!1,_.current=null,f(null),m(null),i(!1);return}_.current||e&&(h.current=!0,i(!0),o(!0),E_().then(e=>{let t=T_(e);g.current=t,u(t),n(`granted`)}).catch(e=>{c(D_(e)),e?.code===1&&(n(`denied`),h.current=!1,i(!1))}).finally(()=>o(!1)))},[e]),manual:d,manualLabel:p,setManual:v,capture:(0,Z.useCallback)(async()=>{if(_.current)return _.current;if(!h.current||!e)return null;try{return T_(await E_())}catch{return g.current}},[e])}}var k_=`2.1`,A_=[`pending`,`in-progress`,`completed`,`cancelled`],j_={pending:`Pending`,"in-progress":`In progress`,completed:`Completed`,cancelled:`Cancelled`};function M_(e){return String(e).padStart(2,`0`)}function N_(e){return`${e.getFullYear()}-${M_(e.getMonth()+1)}-${M_(e.getDate())}T${M_(e.getHours())}:${M_(e.getMinutes())}`}function P_(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:N_(t)}function F_(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t.toISOString()}function I_(){let e=new Date;return e.setHours(23,59,0,0),N_(e)}function L_(e){let t=F_(e.due);return{title:e.title.trim(),...e.description.trim()?{description:e.description.trim()}:{},status:e.status,completed:e.status===`completed`,...t?{dueDate:t}:{},...e.priority===``?{}:{priority:Number(e.priority)}}}function R_(){let[e,t]=(0,Z.useState)(``),[n,r]=(0,Z.useState)(``),[i,a]=(0,Z.useState)(`pending`),[o,s]=(0,Z.useState)(``),[c,l]=(0,Z.useState)(I_()),[u,d]=(0,Z.useState)([]),[f,p]=(0,Z.useState)(``),[m,h]=(0,Z.useState)(!1),g=O_(),_=e.trim().length>0&&!m;async function v(t){h(!0);try{let r=await g.capture(),a=f.trim(),s={schema:Oo,schemaVersion:k_,data:L_({title:e,description:n,status:i,priority:o,due:c}),...a?{comment:a}:{},metadata:{features:Jo(u),...r?{geo:r}:{}}};return await vs(t,[s])}finally{h(!1)}}return{title:e,setTitle:t,description:n,setDescription:r,status:i,setStatus:a,priority:o,setPriority:s,due:c,setDue:l,tags:u,setTags:d,comment:f,setComment:p,saving:m,canSave:_,save:v,geotag:g}}function z_(e){return e.data||{}}var B_={pending:`bg-muted text-muted-foreground`,"in-progress":`bg-info/15 text-info dark:text-info`,completed:`bg-success/15 text-success dark:text-success`,cancelled:`bg-muted text-muted-foreground line-through`};function V_(e){if(!e.dueDate||e.status===`completed`||e.status===`cancelled`)return!1;let t=new Date(e.dueDate).getTime();return Number.isFinite(t)&&t<Date.now()}function H_(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleString(void 0,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`})}async function U_(e,t,n){let r=n===`completed`,i={...t.data||{},status:n,completed:r};r?i.completedAt=new Date().toISOString():delete i.completedAt,await _o(e,{id:t.id,schema:t.schema,schemaVersion:t.schemaVersion,data:i}),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`))}function W_({document:e,workspaceId:t,className:n=``}){let r=z_(e),i=Ao()!=null,[a,o]=(0,Z.useState)(!1),{replicating:s,label:c}=Hi(e),l=r.status===`completed`,u=r.status??`pending`,d=V_(r);return(0,Q.jsx)(`div`,{className:`space-y-3 ${n}`,children:(0,Q.jsxs)(`div`,{className:`relative flex items-start gap-3 rounded-lg border bg-card p-3 transition-opacity ${s?`opacity-60`:``}`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:async()=>{if(!(i||a)){o(!0);try{await U_(t,e,l?`pending`:`completed`)}catch{}finally{o(!1)}}},disabled:i||a||s,"aria-pressed":l,title:l?`Mark not done`:`Mark done`,className:`mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded border transition-colors ${l?`border-success bg-success text-success-foreground`:`border-input hover:border-success`} ${i?`cursor-default opacity-70`:``}`,children:a?(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}):l&&(0,Q.jsx)(ae,{className:`h-3.5 w-3.5`})}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`div`,{className:`font-medium leading-tight ${l?`text-muted-foreground line-through`:``}`,children:r.title||`Todo ${e.id}`}),(0,Q.jsxs)(`div`,{className:`mt-1.5 flex flex-wrap items-center gap-2 text-xs`,children:[(0,Q.jsx)(`span`,{className:`rounded-full px-2 py-0.5 ${B_[u]}`,children:j_[u]}),r.dueDate&&(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-1 ${d?`font-medium text-destructive`:`text-muted-foreground`}`,children:[(0,Q.jsx)(me,{className:`h-3 w-3`}),H_(r.dueDate),d?` · overdue`:``]}),typeof r.priority==`number`&&(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-muted-foreground`,children:[(0,Q.jsx)(Rt,{className:`h-3 w-3`}),`P`,r.priority]})]}),r.description&&(0,Q.jsx)(g_,{content:String(r.description),className:`mt-2 text-sm text-muted-foreground`}),s&&(0,Q.jsxs)(`div`,{className:`mt-2 inline-flex items-center gap-1.5 text-xs text-muted-foreground`,role:`status`,children:[(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}),c]})]})]})})}function G_(e,t){let{fetchBlob:n}=Fo(e),r=Ao(),i=t.checksumArray?.[0]||t.updatedAt||``,a=JSON.stringify([e,r,t.id,i]),o=typeof t.data?.body==`string`?t.data.body:null,s=typeof t.data?.bodyHtml==`string`?t.data.bodyHtml:null,c=o!==null||s!==null,[l,u]=(0,Z.useState)(null);return(0,Z.useEffect)(()=>{if(c)return;let e=new AbortController;return n(t.id,{format:`email`,version:i,signal:e.signal}).then(async({blob:t})=>{let n=JSON.parse(await t.text());if(typeof n.body!=`string`||n.bodyHtml!=null&&typeof n.bodyHtml!=`string`)throw Error(`Invalid email content response`);e.signal.aborted||u({key:a,body:n.body,bodyHtml:n.bodyHtml||null,error:null})}).catch(t=>{e.signal.aborted||u({key:a,body:``,bodyHtml:null,error:t instanceof Error?t.message:String(t)})}),()=>e.abort()},[a,c,n,t.id,i]),c?{body:o||``,bodyHtml:s,loading:!1,error:null}:l?.key===a?{...l,loading:!1}:{body:``,bodyHtml:null,loading:!0,error:null}}function K_(e){return e?typeof e==`string`?e:e.name&&e.address?`${e.name} <${e.address}>`:e.address||e.name||``:``}function q_(e){return e?(Array.isArray(e)?e:[e]).map(e=>K_(e)).filter(Boolean).join(`, `):``}function J_(e){if(!Number.isFinite(e))return``;let t=Number(e);return t<1024?`${t} B`:t<1048576?`${(t/1024).toFixed(1)} KB`:`${(t/1024/1024).toFixed(1)} MB`}function Y_(e,t,n){let r=0;zs.addHook(`afterSanitizeAttributes`,e=>{if(e.tagName===`IMG`){let i=e.getAttribute(`src`)||``,a=i.toLowerCase();if(a.startsWith(`cid:`)){let n=i.slice(4).replace(/^<|>$/g,``),r=t.get(n)||t.get(`<${n}>`);r?e.setAttribute(`src`,r):e.removeAttribute(`src`)}else(a.startsWith(`http:`)||a.startsWith(`https:`)||a.startsWith(`//`))&&(r++,n?e.setAttribute(`src`,i.replace(/^http:/i,`https:`).replace(/^\/\//,`https://`)):e.removeAttribute(`src`))}e.tagName===`A`&&(e.setAttribute(`target`,`_blank`),e.setAttribute(`rel`,`noopener noreferrer`))});try{let t=zs.sanitize(e,{FORBID_TAGS:[`script`,`iframe`,`object`,`embed`,`form`,`base`,`link`,`meta`],FORBID_ATTR:[`srcset`]}),i=`<!doctype html><html><head>
13
- <meta charset="utf-8">
14
- <meta name="viewport" content="width=device-width,initial-scale=1">
15
- <meta http-equiv="Content-Security-Policy" content="${`default-src 'none'; img-src data:${n?` https:`:``}; style-src 'unsafe-inline'`}">
16
- <style>html{overflow:auto}body{margin:12px;font:14px/1.5 system-ui,sans-serif;color:#1a1a1a;background:#fff}@media(max-width:480px){body{margin:8px}}</style>
17
- </head><body>${t}</body></html>`;return{url:URL.createObjectURL(new Blob([i],{type:`text/html;charset=utf-8`})),remoteCount:r}}finally{zs.removeHook(`afterSanitizeAttributes`)}}function X_(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result)),r.onerror=()=>n(r.error),r.readAsDataURL(e)})}function Z_(e){return(0,Q.jsx)(Q_,{...e},`${e.workspaceId}:${e.document.id}`)}function Q_({workspaceId:e,document:t,className:n=``}){let{fetchBlob:r,download:i}=Fo(e),a=t.data||{},o=Array.isArray(a.attachments)?a.attachments:[],{body:s,bodyHtml:c,loading:l,error:u}=G_(e,t),[d,f]=(0,Z.useState)(null),[p,m]=(0,Z.useState)(!1),[h,g]=(0,Z.useState)(!1),[_,v]=(0,Z.useState)(0),[y,b]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{if(!c||p)return;let e=!1,n=[],i=o.filter(e=>e.contentId&&e.url);return Promise.all(i.slice(0,20).map(async e=>{try{let{blob:n}=await r(t.id,{url:e.url}),i=await X_(n);return[String(e.contentId).replace(/^<|>$/g,``),i]}catch{return null}})).then(t=>{if(e)return;let r=new Map(t.filter(Boolean)),{url:i,remoteCount:a}=Y_(c,r,h);n.push(i),f(i),v(a)}).catch(t=>{e||b(String(t instanceof Error?t.message:t))}),()=>{e=!0,n.forEach(e=>URL.revokeObjectURL(e)),f(null)}},[e,t.id,c,p,h]);let x=typeof a.date==`string`?new Date(a.date).toLocaleString():null,S=o.filter(e=>!e.isInline||!e.contentId),C=async e=>{if(e.url)try{await i(t.id,e.filename||`attachment`,{url:e.url})}catch(e){b(e instanceof Error?e.message:String(e))}};return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 min-w-0 flex-col gap-3 ${n}`,children:[(0,Q.jsx)(`div`,{className:`shrink-0 rounded-md border bg-muted/30 p-2 text-sm sm:p-3`,children:(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-2 sm:gap-3`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1 basis-64 space-y-1`,children:[(0,Q.jsx)(`div`,{className:`truncate text-base font-semibold`,children:String(a.subject??`(no subject)`)}),(0,Q.jsxs)(`details`,{className:`sm:hidden`,children:[(0,Q.jsxs)(`summary`,{className:`cursor-pointer text-xs`,children:[(0,Q.jsx)(`span`,{className:`inline-block max-w-[85%] truncate align-bottom`,children:typeof a.from==`object`&&a.from?a.from.name||a.from.address:String(a.from||`Unknown sender`)}),(0,Q.jsx)(`span`,{className:`ml-2 text-muted-foreground`,children:`Details`})]}),(0,Q.jsxs)(`div`,{className:`mt-2 space-y-1 break-words text-xs`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`From:`}),` `,K_(a.from)]}),q_(a.to)&&(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`To:`}),` `,q_(a.to)]}),q_(a.cc)&&(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`Cc:`}),` `,q_(a.cc)]}),x&&(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:x})]})]}),(0,Q.jsxs)(`div`,{className:`hidden space-y-1 break-words sm:block`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`From:`}),` `,K_(a.from)]}),q_(a.to)&&(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`To:`}),` `,q_(a.to)]}),q_(a.cc)&&(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`Cc:`}),` `,q_(a.cc)]}),x&&(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:x})]})]}),c&&(0,Q.jsxs)(`div`,{className:`flex max-w-full flex-wrap gap-2`,children:[(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,onClick:()=>m(!p),children:[p?(0,Q.jsx)(Ue,{className:`mr-1.5 h-3.5 w-3.5`}):(0,Q.jsx)(rn,{className:`mr-1.5 h-3.5 w-3.5`}),p?`HTML`:`Plain text`]}),!p&&_>0&&(0,Q.jsxs)(X,{size:`sm`,variant:h?`secondary`:`outline`,onClick:()=>g(!h),title:`Remote images can reveal your IP/read status to the sender`,children:[h?(0,Q.jsx)(on,{className:`mr-1.5 h-3.5 w-3.5`}):(0,Q.jsx)(ln,{className:`mr-1.5 h-3.5 w-3.5`}),h?`Hide remote images`:`Show remote images (${_})`]})]})]})}),(y||u)&&(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:y||u}),l?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading message…`}):u?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:String(a.bodyPreview||`Message content could not be loaded.`)}):!p&&c?d?(0,Q.jsx)(`iframe`,{src:d,sandbox:``,title:String(a.subject??`email`),className:`min-h-[12rem] w-full flex-1 rounded border bg-white`}):(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Rendering...`}):(0,Q.jsx)(`pre`,{className:`min-h-[12rem] flex-1 overflow-auto whitespace-pre-wrap rounded bg-muted p-3 text-sm`,children:s||`(empty body)`}),S.length>0&&(0,Q.jsxs)(`div`,{className:`shrink-0 space-y-1`,children:[(0,Q.jsxs)(`div`,{className:`text-xs font-medium text-muted-foreground`,children:[`Attachments (`,S.length,`)`]}),S.map((e,t)=>(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded border px-2 py-1.5 text-sm`,children:[(0,Q.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-2`,children:[(0,Q.jsx)(rn,{className:`h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`truncate`,children:e.filename||`attachment`}),(0,Q.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:J_(e.size)})]}),e.url&&(0,Q.jsxs)(`button`,{onClick:()=>C(e),className:`inline-flex shrink-0 items-center gap-1 text-xs text-primary hover:underline`,children:[(0,Q.jsx)(Jt,{className:`h-3 w-3`}),` Download`]})]},e.url||t))]})]})}function $_({attachment:e,workspaceId:t,document:n}){let{download:r}=Fo(t),i=e.mimeType||e.contentType||``,a=e.name||e.filename||`Attachment`,o=i.startsWith(`audio/`)||i.startsWith(`video/`),{blobUrl:s,error:c,loading:l}=Po(t,n.id,{url:e.url,typeHint:i,enabled:!o&&!!e.url}),{src:u,error:d,loading:f}=Ho(t,n.id,{url:e.url,enabled:o&&!!e.url}),[p,m]=(0,Z.useState)(!1),[h,g]=(0,Z.useState)(``),_=o?d:c;return(0,Q.jsxs)(`div`,{className:`space-y-2 rounded border p-2`,children:[_&&(0,Q.jsx)(`p`,{className:`text-xs text-destructive`,children:_}),(o?f:l)&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading attachment…`}),!o&&s&&i.startsWith(`image/`)&&(0,Q.jsx)(`img`,{src:s,alt:a,className:`max-h-96 max-w-full rounded object-contain`}),o&&u&&(i.startsWith(`video/`)?(0,Q.jsx)(`video`,{controls:!0,playsInline:!0,preload:`metadata`,src:u,onError:()=>m(!0),className:`max-h-96 w-full rounded`},u):(0,Q.jsx)(`audio`,{controls:!0,preload:`metadata`,src:u,onError:()=>m(!0),className:`w-full`},u)),p&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-xs text-destructive`,children:`This media could not be played in your browser. Download it to play in another app.`}),h&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-xs text-destructive`,children:h}),e.url&&(0,Q.jsxs)(`button`,{className:`text-sm text-primary underline`,onClick:()=>{r(n.id,a,{url:e.url}).catch(()=>g(`Attachment could not be downloaded.`))},children:[`Download `,a]})]})}function ev(e){let t=e.document.data,n=t.sender,r=t.channel,i=Array.isArray(t.attachments)?t.attachments:[],a=t.timestamp?new Date(String(t.timestamp)):null;return(0,Q.jsxs)(`article`,{className:`space-y-4 p-3 ${e.className||``}`,children:[(0,Q.jsxs)(`header`,{className:`space-y-1 border-b pb-3`,children:[(0,Q.jsx)(`p`,{className:`font-medium`,children:n?.name||n?.displayName||n?.username||n?.id||`Unknown sender`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:[r?.name||r?.id,String(t.platform||``),a&&!Number.isNaN(a.getTime())?a.toLocaleString():``].filter(Boolean).join(` · `)})]}),(0,Q.jsx)(`p`,{className:`whitespace-pre-wrap break-words text-sm`,children:String(t.text||`(No text)`)}),!!t.mediaError&&(0,Q.jsx)(`p`,{className:`text-xs text-destructive`,children:String(t.mediaError)}),i.map((t,n)=>(0,Q.jsx)($_,{...e,attachment:t},t.url||n))]})}var tv={email:xt,phone:ce,sms:mt,chat:mt,slack:mt,matrix:mt,web:Xe,url:Xe},nv={person:`Person`,organization:`Organization`,service:`Service`,bot:`Bot`},rv=e=>Array.isArray(e)?e:[];function iv(e,t){return t?e===`email`?`mailto:${t}`:e===`phone`||e===`sms`?`tel:${t.replace(/[^\d+]/g,``)}`:/^https?:\/\//i.test(t)?t:null:null}function av({title:e,count:t,children:n}){return t===0?null:(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`p`,{className:`text-xs font-medium text-muted-foreground`,children:e}),(0,Q.jsx)(`div`,{className:`space-y-1`,children:n})]})}function ov({icon:e,primary:t,children:n,title:r}){return(0,Q.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2 rounded-md border bg-card px-2.5 py-1.5 text-sm`,title:r,children:[(0,Q.jsx)(e,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`div`,{className:`min-w-0 flex-1 truncate`,children:n}),t&&(0,Q.jsx)(wn,{className:`h-3 w-3 shrink-0 fill-current text-data-5`,"aria-label":`Primary`})]})}function sv({document:e,className:t}){let n=e.data??{},r=rv(n.identifiers),i=rv(n.channels),a=rv(n.organizations),o=rv(n.links),s=rv(n.tags),c=String(n.displayName||``).trim(),l=Xi(e.schema,fi),u=String(n.primaryEmail||``).trim(),d=n.name&&typeof n.name==`object`?n.name:{},f=[d.prefix,d.given,d.middle,d.family,d.suffix].map(e=>String(e||``).trim()).filter(Boolean).join(` `),p=i.some(e=>e.kind===`email`&&e.value===u);return(0,Q.jsxs)(`div`,{className:q(`space-y-4`,t),children:[(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`h2`,{className:`text-lg font-semibold`,children:c||`Identity ${e.id}`}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-xs text-muted-foreground`,children:[l&&(0,Q.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5`,children:nv[l]||l}),f&&f!==c&&(0,Q.jsx)(`span`,{children:f}),String(n.timezone||``)&&(0,Q.jsx)(`span`,{children:String(n.timezone)}),String(n.locale||``)&&(0,Q.jsx)(`span`,{children:String(n.locale)})]})]}),u&&!p&&(0,Q.jsx)(av,{title:`Primary email`,count:1,children:(0,Q.jsx)(ov,{icon:xt,primary:!0,children:(0,Q.jsx)(`a`,{href:`mailto:${u}`,className:`hover:underline`,children:u})})}),(0,Q.jsx)(av,{title:`Channels`,count:i.length,children:i.map((e,t)=>{let n=String(e.kind||``).toLowerCase(),r=String(e.value||``),i=iv(n,r),a=tv[n]||mt;return(0,Q.jsxs)(ov,{icon:a,primary:e.primary,title:e.platform||n,children:[i?(0,Q.jsx)(`a`,{href:i,className:`hover:underline`,target:i.startsWith(`http`)?`_blank`:void 0,rel:`noopener noreferrer`,children:r}):r,e.label&&(0,Q.jsx)(`span`,{className:`ml-2 text-xs text-muted-foreground`,children:e.label})]},`${n}:${r}:${t}`)})}),(0,Q.jsx)(av,{title:`Identifiers`,count:r.length,children:r.map((e,t)=>(0,Q.jsxs)(ov,{icon:Kn,primary:e.primary,children:[(0,Q.jsx)(`span`,{className:`font-mono text-xs`,children:e.identifier}),(0,Q.jsx)(`span`,{className:`ml-2 text-xs text-muted-foreground`,children:[e.type,e.provider].filter(Boolean).join(` · `)})]},`${e.type}:${e.identifier}:${t}`))}),(0,Q.jsx)(av,{title:`Organizations`,count:a.length,children:a.map((e,t)=>(0,Q.jsxs)(ov,{icon:Fn,children:[e.name,e.role&&(0,Q.jsx)(`span`,{className:`ml-2 text-xs text-muted-foreground`,children:e.role})]},`${e.name}:${t}`))}),(0,Q.jsx)(av,{title:`Links`,count:o.length,children:o.map((e,t)=>(0,Q.jsxs)(ov,{icon:vn,children:[(0,Q.jsx)(`span`,{className:`font-mono text-xs`,children:e.target}),e.type&&(0,Q.jsx)(`span`,{className:`ml-2 text-xs text-muted-foreground`,children:e.type})]},`${e.type}:${e.target}:${t}`))}),s.length>0&&(0,Q.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:s.map(e=>(0,Q.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground`,children:e},e))})]})}function cv({document:e}){let t=String(e.metadata?.contentType||`application/octet-stream`);return(0,Q.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`No inline preview available for `,(0,Q.jsx)(`span`,{className:`font-mono`,children:t}),`. Use Download.`]})}function lv(e){let t=e.schema;if(t===`data/schema/note`)return v_;if(t===`data/schema/drawing`)return d_;if(t===`data/schema/task`)return W_;if(t===`data/schema/message/email`)return Z_;if(t===`data/schema/message`)return ev;if(t===`data/schema/identity`||t.startsWith(`data/schema/identity/`))return sv;if(t===`data/schema/tab`||t===`data/schema/link`){let t=String(e.data?.url??e.data?.uri??``);return _i(t)?y_:x_(t)?b_:C_}if(t!==`data/schema/file`)return null;let n=String(e.metadata?.contentType||``);switch(ei(n,Zr(e))){case`image`:return d_;case`audio`:return f_;case`video`:return p_;case`pdf`:return m_;case`markdown`:return v_;case`text`:return __;default:return cv}}function uv({workspaceId:e,document:t,className:n}){let r=lv(t);return r?(0,Q.jsx)(r,{workspaceId:e,document:t,className:n}):(0,Q.jsx)(`pre`,{className:`overflow-auto p-2 text-xs`,children:JSON.stringify(t.data,null,2)})}var dv=e=>`${Sr.workspaces}/${encodeURIComponent(e)}/messages`,fv=e=>Y.get(`${dv(e)}/accounts`),pv=(e,t)=>Y.get(`${dv(e)}/reply-target/${t}`),mv=(e,t)=>Y.post(`${dv(e)}/send`,t),hv=(e,t)=>Y.get(`${dv(e)}/whatsapp/${encodeURIComponent(t)}/connection`),gv=(e,t)=>Y.get(`${dv(e)}/outbox/${encodeURIComponent(t)}`),_v=(e,t)=>Y.delete(`${dv(e)}/whatsapp/${encodeURIComponent(t)}/connection`),vv=(e,t)=>Y.get(`${dv(e)}/thread/${t}`),yv=new Bs({html:!1});function bv(e){let t=e=>{let n=[];return e.map(e=>{if(e.children)return t(e.children);switch(e.type){case`strong_open`:case`strong_close`:return`*`;case`em_open`:case`em_close`:return`_`;case`s_open`:case`s_close`:return`~`;case`code_inline`:return`\`${e.content}\``;case`fence`:case`code_block`:return`\`\`\`\n${e.content}\`\`\`\n`;case`text`:return e.content;case`softbreak`:case`hardbreak`:return`
18
- `;case`paragraph_close`:case`heading_close`:return`
19
-
20
- `;case`list_item_open`:return`- `;case`link_open`:return n.push(String(e.attrGet(`href`)||``)),``;case`link_close`:return` (${n.pop()||``})`;case`image`:return e.content;default:return``}}).join(``)};return t(yv.parse(e,{})).trim()}function xv(e,t,n=!1){let r=2166136261;try{for(let e of localStorage.getItem(`authToken`)||``)r=Math.imul(r^e.charCodeAt(0),16777619)}catch{}return`canvas:message-draft:${r>>>0}:${e}:${t||`new`}${n?`:fwd`:``}`}var Sv={reply:`Reply`,replyAll:`Reply all`,forward:`Forward`};function Cv({workspaceId:e,replyToDocumentId:t,mode:n=`reply`,originalSubject:r,initialAccount:i,testEmail:a=!1,onClose:o}){let s=!!t&&n===`forward`,c=a?`${xv(e)}:smtp-test:${i?.address}`:xv(e,t,s),l=()=>({requestId:crypto.randomUUID(),text:a?`This is a test email sent from Canvas to check the SMTP configuration.`:``,replyToDocumentId:t,...i,...a?{subject:`Canvas SMTP test`}:{},...s?{forward:!0}:t?{replyAll:n===`replyAll`,quote:!0}:{}}),[u,d]=(0,Z.useState)(()=>{try{let e=localStorage.getItem(c);if(e){let r=JSON.parse(e),i=r.draft||r;if(s||!t||r.attempted)return i;let a=n===`replyAll`;return{...i,replyAll:a,...!!i.replyAll===a?{}:{to:void 0,cc:void 0}}}}catch{}return l()}),[f,p]=(0,Z.useState)(null),[m,h]=(0,Z.useState)([]),[g,_]=(0,Z.useState)(navigator.onLine);(0,Z.useEffect)(()=>{let e=()=>_(navigator.onLine);return window.addEventListener(`online`,e),window.addEventListener(`offline`,e),()=>{window.removeEventListener(`online`,e),window.removeEventListener(`offline`,e)}},[]);let v=(0,Z.useRef)(!1),[y,b]=(0,Z.useState)(!1),[x,S]=(0,Z.useState)(!1),[C,w]=(0,Z.useState)(()=>{try{return JSON.parse(localStorage.getItem(c)||`{}`).attempted===!0}catch{return!1}}),[T,E]=(0,Z.useState)(``),[D,O]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{let n=!0;return Promise.all([fv(e),t?pv(e,t):Promise.resolve(null)]).then(([e,r])=>{n&&(p(r),h(e.filter(e=>e.canSend&&(!r||e.driver===r.driver&&e.address===r.address))),t&&!r&&E(`This message has no supported reply account.`),r&&d(e=>{let t=e.replyAll?r.allRecipients:r.recipients;return{...e,driver:r.driver,address:r.address,...!s&&t&&!C?{to:e.to?.some(e=>e.trim())?e.to:t.to,cc:e.cc?.some(e=>e.trim())?e.cc:t.cc}:{}}}))}).catch(e=>{n&&E(e.message)}),()=>{n=!1}},[e,t,s,C]),(0,Z.useEffect)(()=>{try{D?.status===`accepted`?localStorage.removeItem(c):localStorage.setItem(c,JSON.stringify({draft:u,attempted:C}))}catch{}},[c,u,C,D]);let k=m.find(e=>e.driver===u.driver&&e.address===u.address),A=k?.driver===`imap`,j=k?.driver===`whatsapp`,M=!!u.images?.length,N=!!u.text.trim(),P=e=>d(t=>({...t,...e})),ee=async()=>{S(!0),E(``),w(!0);let t=A?N?u:{...u,html:void 0}:{...u,text:j?bv(u.text):u.text,html:void 0,quote:void 0,forward:void 0};try{let n=C?await gv(e,u.requestId).catch(n=>{if(n.statusCode===404)return mv(e,t);throw n}):await mv(e,t);if(O(n),n.status===`accepted`){try{localStorage.removeItem(c)}catch{}window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:e}}))}}catch(e){let t=e;E(t.message),!C&&t.statusCode&&t.statusCode>=400&&t.statusCode<500&&t.statusCode!==409&&w(!1)}finally{S(!1)}},F=async e=>{if(L||v.current)return;let t=e.filter(e=>[`image/png`,`image/jpeg`,`image/webp`,`image/gif`].includes(e.type));if(t.length){if((u.images?.length||0)+t.length>(j?1:8)){E(j?`One picture per WhatsApp reply.`:`Up to 8 pictures per email.`);return}if((u.images||[]).reduce((e,t)=>e+t.base64.length*3/4,0)+t.reduce((e,t)=>e+t.size,0)>8388608){E(`Pictures must total at most 8 MB.`);return}v.current=!0,b(!0);try{let e=await Promise.all(t.map(e=>new Promise((t,n)=>{let r=new FileReader;r.onerror=()=>n(Error(`Could not read picture`)),r.onload=()=>t({name:e.name,mimeType:e.type,base64:String(r.result).split(`,`)[1]}),r.readAsDataURL(e)})));d(t=>({...t,images:[...t.images||[],...e]})),E(``)}catch(e){E(e instanceof Error?e.message:`Could not read picture`)}finally{v.current=!1,b(!1)}}},I=u.replyAll?f?.allRecipients:f?.recipients,L=x||C||y,R=a?`Send test email`:t?s?Sv.forward:Sv[u.replyAll?`replyAll`:`reply`]:`New message`,te=t&&r?`${s?`Fwd`:`Re`}: ${r.replace(s?/^(fwd?|fw):\s*/i:/^re:\s*/i,``)}`:``;return(0,Q.jsxs)(`section`,{onPasteCapture:e=>{if(!(A||j))return;let t=Array.from(e.clipboardData.files);t.some(e=>e.type.startsWith(`image/`))&&(e.preventDefault(),e.stopPropagation(),F(t))},className:`max-h-[70dvh] overflow-y-auto rounded-md border bg-card p-3 space-y-3`,"aria-label":t?`${R} to message`:`New message`,children:[(0,Q.jsxs)(`div`,{className:`flex justify-between items-center`,children:[(0,Q.jsx)(`strong`,{className:`text-sm`,children:R}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,onClick:o,children:`Close`})]}),(0,Q.jsxs)(`label`,{className:`block text-xs`,children:[`Send from`,(0,Q.jsxs)(`select`,{"aria-label":`Sending account`,className:`w-full rounded border bg-background p-2`,value:k?`${k.driver}:${k.address}`:``,disabled:L||!!t||!!i,onChange:e=>{let t=m.find(t=>`${t.driver}:${t.address}`===e.target.value);t&&P({driver:t.driver,address:t.address,to:[],cc:[],bcc:[],subject:void 0,target:void 0,images:void 0,replyAll:!1})},children:[(0,Q.jsx)(`option`,{value:``,children:`Select an enabled sending account`}),m.map(e=>(0,Q.jsxs)(`option`,{value:`${e.driver}:${e.address}`,children:[e.driver,` · `,e.from||e.address]},`${e.driver}:${e.address}`))]})]}),a&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Uses the saved SMTP settings. Enter a recipient you control, then click Send. This sends a real email; provider acceptance does not guarantee inbox delivery.`}),!m.length&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Enable sending in the account’s workspace settings. Your draft stays on this device.`}),A?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`label`,{className:`block text-xs`,children:[`To `,t&&!s?`(leave blank to reply to the sender)`:``,(0,Q.jsx)(J,{"aria-label":`To`,disabled:L,value:u.to?.join(`, `)||``,onChange:e=>P({to:[e.target.value]})})]}),t&&!s&&!u.to?.some(e=>e.trim())&&I&&(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Reply to: `,I.to.join(`, `),I.cc.length?` · Cc: ${I.cc.join(`, `)}`:``]}),[`cc`,`bcc`].map(e=>(0,Q.jsxs)(`label`,{className:`block text-xs`,children:[e===`cc`?`Cc`:`Bcc`,(0,Q.jsx)(J,{"aria-label":e===`cc`?`Cc`:`Bcc`,disabled:L,value:u[e]?.join(`, `)||``,onChange:t=>P({[e]:[t.target.value]})})]},e)),(0,Q.jsxs)(`label`,{className:`block text-xs`,children:[`Subject`,(0,Q.jsx)(J,{"aria-label":`Subject`,disabled:L,value:u.subject||``,placeholder:te,onChange:e=>P({subject:e.target.value||void 0})})]}),t&&!s&&(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-4 text-xs`,children:[(0,Q.jsxs)(`label`,{className:`flex gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,disabled:L,checked:u.replyAll||!1,onChange:e=>{let t=e.target.checked?f?.allRecipients:f?.recipients;P({replyAll:e.target.checked,...t?{to:t.to,cc:t.cc}:{}})}}),`Reply all`]}),(0,Q.jsxs)(`label`,{className:`flex gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,disabled:L,checked:u.quote||!1,onChange:e=>P({quote:e.target.checked})}),`Quote original message`]})]}),s&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`The original message and its attachments are included below your note.`}),(0,Q.jsx)(No,{format:`html`,editable:!L,value:u.html||``,placeholder:s?`Add a note (optional)…`:`Write a message…`,onChange:(e,t)=>P({html:e,text:t.slice(0,32e3)})})]}):(0,Q.jsxs)(Q.Fragment,{children:[!t&&(0,Q.jsxs)(`label`,{className:`block text-xs`,children:[`Conversation (configured channel name or ID)`,(0,Q.jsx)(J,{"aria-label":`Conversation`,disabled:L,value:u.target||``,onChange:e=>P({target:e.target.value})})]}),j?(0,Q.jsx)(No,{format:`markdown`,editable:!L,value:u.text,placeholder:`Write a message…`,onChange:e=>P({text:e.slice(0,32e3)})}):(0,Q.jsx)(`textarea`,{"aria-label":`Message text`,className:`w-full rounded border bg-background p-2 text-sm`,rows:5,maxLength:32e3,disabled:L,value:u.text,onChange:e=>P({text:e.target.value}),placeholder:`Write a message…`})]}),(A||j)&&(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsxs)(`label`,{className:`block text-xs`,children:[`Paste a picture into the reply, or attach one`,(0,Q.jsx)(`input`,{"aria-label":`Attach pictures`,className:`block`,type:`file`,accept:`image/png,image/jpeg,image/webp,image/gif`,multiple:!j,disabled:L,onChange:e=>{F(Array.from(e.target.files||[])),e.target.value=``}})]}),u.images?.map((e,t)=>(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`img`,{className:`h-20 w-20 rounded object-contain`,src:`data:${e.mimeType};base64,${e.base64}`,alt:e.name}),(0,Q.jsx)(`span`,{className:`text-xs`,children:e.name}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,disabled:L,onClick:()=>P({images:u.images?.filter((e,n)=>n!==t)}),children:`Remove picture`})]},t)),j&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Bold, italic, strikethrough and code are supported. Your reply becomes the picture caption.`})]}),T&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:T}),D&&(0,Q.jsxs)(`p`,{role:`status`,className:`text-sm`,children:[D.status===`accepted`?`Accepted by the provider.`:D.message,` `,D.warnings?.join(` `),` `,D.rejected?.length?`Not accepted for: ${D.rejected.join(`, `)}`:``]}),D?.status!==`accepted`&&(0,Q.jsx)(X,{size:`sm`,disabled:x||y||!C&&(!k||!N&&!M&&!(A&&s)||s&&!u.to?.some(e=>e.trim()))||!g,onClick:()=>void ee(),children:x?`Sending…`:C?`Check send status`:`Send`}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,disabled:x,onClick:()=>{window.confirm(C?`This message may already have been sent. Discard this draft only after checking the conversation.`:`Discard this draft?`)&&(d({...l(),driver:u.driver,address:u.address}),w(!1),O(null),E(``))},children:`Discard draft`}),C&&D?.status!==`accepted`&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Do not start another send until you have checked the conversation. The same request will not be delivered twice by Canvas.`})]})}function wv(e){let t=(0,Z.useRef)(null),n=(0,Z.useRef)(e.onClose);return(0,Z.useEffect)(()=>{n.current=e.onClose}),(0,Z.useEffect)(()=>{let e=t.current;if(!e)return;let n=document.activeElement;return e.showModal(),()=>{e.close(),n?.focus()}},[]),(0,Q.jsx)(`dialog`,{ref:t,"aria-label":e.replyToDocumentId?`${e.mode===`forward`?`Forward`:e.mode===`replyAll`?`Reply all`:`Reply`} message`:`Send test email`,className:`m-auto w-[calc(100%-2rem)] max-w-3xl max-h-[90dvh] overflow-y-auto rounded-(--panel-radius) border bg-card p-0 text-foreground shadow-elevation-4 backdrop:bg-black/40`,onKeyDown:e=>e.stopPropagation(),onCancel:e=>{e.preventDefault(),e.stopPropagation(),n.current()},children:(0,Q.jsx)(Cv,{...e})})}function Tv({workspaceId:e,documentId:t}){let[n,r]=(0,Z.useState)(null),[i,a]=(0,Z.useState)(``),[o,s]=(0,Z.useState)({}),[c,l]=(0,Z.useState)(null),u=(0,Z.useCallback)(async()=>{try{let n=await vv(e,t);r(n),a(``)}catch(e){a(e instanceof Error?e.message:`Could not load thread`)}},[e,t]);return(0,Z.useEffect)(()=>{let n=!0;vv(e,t).then(e=>{n&&(r(e),a(``))}).catch(e=>{n&&a(e instanceof Error?e.message:`Could not load thread`)});let i=()=>{u()};return window.addEventListener(`workspace:documents:refresh`,i),window.addEventListener(Dg,i),()=>{n=!1,window.removeEventListener(`workspace:documents:refresh`,i),window.removeEventListener(Dg,i)}},[e,t,u]),i?(0,Q.jsxs)(`div`,{className:`p-3`,children:[(0,Q.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:i}),(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>void u(),children:`Retry`})]}):!n||n.documentId!==t?(0,Q.jsx)(`p`,{className:`p-3 text-sm text-muted-foreground`,children:`Loading thread…`}):(0,Q.jsxs)(`section`,{"aria-label":`Message thread`,className:`space-y-3 p-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Q.jsxs)(`h3`,{className:`text-sm font-medium`,children:[`Thread · `,n.documents.length,` message`,n.documents.length===1?``:`s`]}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>void u(),children:`Refresh`})]}),n.documents.length===1&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No linked replies have been indexed. Other messages in this conversation are separate from this reply thread.`}),n.truncated&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Showing up to 200 linked messages.`}),n.documents.map(r=>{let i=Ni(r),a=r.schema===`data/schema/message/email`,c=a||[`slack`,`whatsapp`].includes(String(r.data.platform)),u=r.data.timestamp||r.data.date,d=u?new Date(String(u)):null,f=(n.parents[r.id]||[]).flatMap(e=>{let t=n.documents.find(t=>Number(t.id)===e);return t?[Ni(t).title]:[]}),p=o[Number(r.id)]??Number(r.id)===t;return(0,Q.jsxs)(`details`,{open:p,onToggle:e=>{let t=e.currentTarget.open;s(e=>e[Number(r.id)]===t?e:{...e,[Number(r.id)]:t})},className:`rounded-lg border bg-card`,children:[(0,Q.jsxs)(`summary`,{className:`cursor-pointer space-y-1 p-3 text-sm`,children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:i.title}),(0,Q.jsxs)(`span`,{className:`block text-xs text-muted-foreground`,children:[i.subtitle,d&&!Number.isNaN(d.getTime())?` · ${d.toLocaleString()}`:``]}),f.length>0&&(0,Q.jsxs)(`span`,{className:`block text-xs text-muted-foreground`,children:[`Reply to `,f.join(`, `)]})]}),p&&c&&(0,Q.jsx)(`div`,{className:`flex flex-wrap gap-2 px-3 pb-2`,children:(a?[`reply`,`replyAll`,`forward`]:[`reply`]).map(e=>(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>l({document:r,mode:e}),children:e===`replyAll`?`Reply all`:e===`forward`?`Forward`:`Reply`},e))}),p&&(0,Q.jsx)(uv,{workspaceId:e,document:r})]},r.id)}),c&&(0,Q.jsx)(wv,{workspaceId:e,replyToDocumentId:Number(c.document.id),mode:c.mode,originalSubject:typeof c.document.data.subject==`string`?c.document.data.subject:void 0,onClose:()=>l(null)},`${c.document.id}:${c.mode}`)]})}var Ev=15,Dv=[`Mo`,`Tu`,`We`,`Th`,`Fr`,`Sa`,`Su`];function Ov(e){return String(e).padStart(2,`0`)}function kv(e){let t=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/.exec(e||``);return t?{date:`${t[1]}-${t[2]}-${t[3]}`,time:`${t[4]}:${t[5]}`}:null}function Av(e){return`${e.getFullYear()}-${Ov(e.getMonth()+1)}-${Ov(e.getDate())}`}function jv(e){let[t,n,r]=e.split(`-`).map(Number);return new Date(t,n-1,r)}function Mv(){let e=new Date;return e.setSeconds(0,0),e.setMinutes(Math.ceil(e.getMinutes()/Ev)*Ev),`${Ov(e.getHours())}:${Ov(e.getMinutes())}`}function Nv(){let e=[];for(let t=0;t<1440;t+=Ev)e.push(`${Ov(Math.floor(t/60))}:${Ov(t%60)}`);return e}var Pv=Nv();function Fv(e){let t=new Date(e.getFullYear(),e.getMonth(),1),n=(t.getDay()+6)%7,r=new Date(t);return r.setDate(t.getDate()-n),Array.from({length:42},(e,t)=>{let n=new Date(r);return n.setDate(r.getDate()+t),n})}function Iv(e){let[t,n]=e.split(`:`).map(Number);return new Date(2e3,0,1,t,n).toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`})}function Lv(e){let t=kv(e);if(!t)return``;let[n,r,i]=t.date.split(`-`).map(Number),[a,o]=t.time.split(`:`).map(Number);return new Date(n,r-1,i,a,o).toLocaleString(void 0,{weekday:`short`,day:`numeric`,month:`short`,year:`numeric`,hour:`2-digit`,minute:`2-digit`})}function Rv({value:e,onChange:t,id:n,placeholder:r=`Pick a date & time`,clearable:i=!0,disabled:a=!1,compact:o=!1,className:s=``}){let[c,l]=(0,Z.useState)(!1),u=(0,Z.useRef)(null),d=kv(e),f=d?Lv(e):``;return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`button`,{ref:u,id:n,type:`button`,disabled:a,onClick:()=>l(e=>!e),"aria-haspopup":`dialog`,"aria-expanded":c,className:q(`inline-flex w-full items-center gap-2 rounded-md border border-input bg-transparent text-left shadow-elevation-1 transition-colors`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50`,o?`h-6 px-1.5 text-[11px]`:`h-9 px-3 py-1 text-sm`,!d&&`text-muted-foreground`,s),children:[(0,Q.jsx)(me,{className:q(`shrink-0 text-muted-foreground`,o?`h-3 w-3`:`h-4 w-4`)}),(0,Q.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:f||r}),i&&d&&(0,Q.jsx)(`span`,{role:`button`,tabIndex:-1,"aria-label":`Clear date`,title:`Clear`,onClick:e=>{e.stopPropagation(),t(``)},className:`shrink-0 rounded p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground`,children:(0,Q.jsx)(W,{className:o?`h-2.5 w-2.5`:`h-3.5 w-3.5`})})]}),c&&(0,Q.jsx)(zv,{anchorRef:u,value:e,onChange:t,onClose:()=>l(!1)})]})}function zv({anchorRef:e,value:t,onChange:n,onClose:r}){let i=kv(t),a=i?.date??Av(new Date),o=i?.time??null,[s,c]=(0,Z.useState)(()=>{let e=jv(a);return new Date(e.getFullYear(),e.getMonth(),1)}),l=(0,Z.useRef)(null),u=(0,Z.useRef)(null),[d,f]=(0,Z.useState)(null);(0,Z.useLayoutEffect)(()=>{let t=l.current,n=e.current;if(!t||!n)return;let r=()=>{let e=n.getBoundingClientRect(),{width:r,height:i}=t.getBoundingClientRect(),a=e.bottom+4,o=a+i+8>window.innerHeight?Math.max(8,e.top-i-4):a,s=Math.max(8,Math.min(e.left,window.innerWidth-r-8));f({x:s,y:o})};r();let i=new ResizeObserver(r);return i.observe(t),window.addEventListener(`resize`,r),window.addEventListener(`scroll`,r,!0),()=>{i.disconnect(),window.removeEventListener(`resize`,r),window.removeEventListener(`scroll`,r,!0)}},[e]),(0,Z.useEffect)(()=>{let e=e=>{e.key===`Escape`&&(e.stopPropagation(),r())};return window.addEventListener(`keydown`,e,!0),()=>window.removeEventListener(`keydown`,e,!0)},[r]);let p=(0,Z.useMemo)(()=>!o||Pv.includes(o)?Pv:[...Pv,o].sort(),[o]);(0,Z.useEffect)(()=>{let e=u.current,t=e?.querySelector(`[data-selected="true"]`);e&&t&&(e.scrollTop=t.offsetTop-e.clientHeight/2+t.clientHeight/2)},[]);let m=(e,t)=>n(`${e}T${t}`),h=e=>{let t=o??Mv();m(Av(e),t),e.getMonth()!==s.getMonth()&&c(new Date(e.getFullYear(),e.getMonth(),1))},g=e=>{m(a,e),r()},_=e=>{let t=new Date;t.setDate(t.getDate()+e);let n=o??Mv();m(Av(t),n),c(new Date(t.getFullYear(),t.getMonth(),1))},v=Av(new Date),y=Fv(s);return(0,Pp.createPortal)((0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`fixed inset-0 z-40`,onClick:r}),(0,Q.jsxs)(`div`,{ref:l,role:`dialog`,"aria-label":`Choose date and time`,className:`fixed z-50 flex max-w-[95vw] gap-2 rounded-md border bg-popover p-2 text-popover-foreground shadow-elevation-4`,style:{left:d?.x??-9999,top:d?.y??-9999,visibility:d?`visible`:`hidden`},children:[(0,Q.jsxs)(`div`,{className:`w-[236px]`,children:[(0,Q.jsxs)(`div`,{className:`mb-1 flex items-center justify-between`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:()=>c(new Date(s.getFullYear(),s.getMonth()-1,1)),"aria-label":`Previous month`,className:`rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground`,children:(0,Q.jsx)(E,{className:`h-4 w-4`})}),(0,Q.jsx)(`span`,{className:`text-xs font-medium`,children:s.toLocaleDateString(void 0,{month:`long`,year:`numeric`})}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>c(new Date(s.getFullYear(),s.getMonth()+1,1)),"aria-label":`Next month`,className:`rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground`,children:(0,Q.jsx)(gr,{className:`h-4 w-4`})})]}),(0,Q.jsx)(`div`,{className:`grid grid-cols-7 gap-0.5 px-0.5 pb-1 text-center text-[10px] uppercase tracking-wide text-muted-foreground/70`,children:Dv.map(e=>(0,Q.jsx)(`span`,{children:e},e))}),(0,Q.jsx)(`div`,{className:`grid grid-cols-7 gap-0.5`,children:y.map(e=>{let t=Av(e),n=e.getMonth()!==s.getMonth(),r=t===a&&!!i;return(0,Q.jsx)(`button`,{type:`button`,onClick:()=>h(e),"aria-pressed":r,className:q(`h-7 rounded text-xs tabular-nums transition-colors`,n?`text-muted-foreground/40`:`text-foreground`,r?`bg-primary text-primary-foreground`:`hover:bg-muted`,!r&&t===v&&`font-semibold ring-1 ring-inset ring-border`),children:e.getDate()},t)})}),(0,Q.jsx)(`div`,{className:`mt-1.5 flex gap-1`,children:[[`Today`,0],[`Tomorrow`,1],[`Next week`,7]].map(([e,t])=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>_(t),className:`flex-1 rounded border border-border px-1.5 py-1 text-[11px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,children:e},e))})]}),(0,Q.jsxs)(`div`,{className:`flex w-[104px] flex-col`,children:[(0,Q.jsx)(`input`,{type:`time`,step:900,value:o??``,onChange:e=>{e.target.value&&m(a,e.target.value.slice(0,5))},"aria-label":`Time`,className:`mb-1 h-7 w-full rounded border border-input bg-transparent px-1.5 text-xs tabular-nums focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`}),(0,Q.jsx)(`div`,{ref:u,className:`max-h-[236px] flex-1 overflow-y-auto pr-0.5`,children:p.map(e=>{let t=e===o;return(0,Q.jsx)(`button`,{type:`button`,"data-selected":t,onClick:()=>g(e),"aria-pressed":t,className:q(`block w-full rounded px-2 py-1 text-left text-xs tabular-nums transition-colors`,t?`bg-primary text-primary-foreground`:`hover:bg-muted`),children:Iv(e)},e)})})]})]})]}),document.body)}var Bv={1:`1: Highest`,2:`2`,3:`3: High`,4:`4`,5:`5: Medium`,6:`6`,7:`7: Low`,8:`8`,9:`9: Lowest`},Vv=`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`,Hv=`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`;function Uv({title:e,setTitle:t,description:n,setDescription:r,status:i,setStatus:a,priority:o,setPriority:s,due:c,setDue:l,idPrefix:u=`todo`}){return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${u}-title`,children:`Title`}),(0,Q.jsx)(J,{id:`${u}-title`,value:e,onChange:e=>t(e.target.value),placeholder:`What needs doing?`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${u}-desc`,children:`Description`}),(0,Q.jsx)(`textarea`,{id:`${u}-desc`,value:n,onChange:e=>r(e.target.value),rows:3,placeholder:`Optional details…`,className:Hv})]}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${u}-due`,children:`Due`}),(0,Q.jsx)(Rv,{id:`${u}-due`,value:c,onChange:l,placeholder:`No due date`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${u}-priority`,children:`Priority`}),(0,Q.jsxs)(`select`,{id:`${u}-priority`,value:o===``?``:String(o),onChange:e=>s(e.target.value===``?``:Number(e.target.value)),className:Vv,children:[(0,Q.jsx)(`option`,{value:``,children:`None`}),[1,2,3,4,5,6,7,8,9].map(e=>(0,Q.jsx)(`option`,{value:e,children:Bv[e]},e))]})]})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${u}-status`,children:`Status`}),(0,Q.jsx)(`select`,{id:`${u}-status`,value:i,onChange:e=>a(e.target.value),className:Vv,children:A_.map(e=>(0,Q.jsx)(`option`,{value:e,children:j_[e]},e))})]})]})}var Wv=`3.0`,Gv=[`person`,`organization`,`service`,`bot`],Kv={person:`Person`,organization:`Organization`,service:`Service`,bot:`Bot`},qv=[`email`,`phone`,`sms`,`chat`,`web`],Jv=[`email`,`github`,`slack`,`matrix`,`gpg`,`url`];function Yv(e){let t=e.primaryEmail.trim().toLowerCase(),n=e.channels.map(e=>({...e,kind:e.kind.trim(),value:e.value.trim(),label:e.label?.trim()||void 0})).filter(e=>e.kind&&e.value);if(t&&!n.some(e=>e.kind===`email`&&e.value===t)){for(let e of n)e.kind===`email`&&(e.primary=!1);n.push({kind:`email`,value:t,label:void 0,primary:!0})}let r=e.given.trim(),i=e.family.trim();return{displayName:e.displayName.trim(),...t?{primaryEmail:t}:{},...r||i?{name:{...r?{given:r}:{},...i?{family:i}:{}}}:{},channels:n,identifiers:e.identifiers.map(e=>({...e,type:e.type.trim(),identifier:e.identifier.trim(),provider:e.provider?.trim()||void 0})).filter(e=>e.type&&e.identifier),organizations:e.organizations.map(({identityId:e,...t})=>({...t,name:t.name.trim(),role:t.role?.trim()||void 0,...e?{metadata:{identityId:e}}:{}})).filter(e=>e.name)}}function Xv(e){let t=e?.data??{},n=t.name&&typeof t.name==`object`?t.name:{},r=e=>Array.isArray(e)?e:[],i=Xi(String(e?.schema||``),fi);return{displayName:String(t.displayName||``),type:Gv.includes(i)?i:`person`,primaryEmail:String(t.primaryEmail||``),given:String(n.given||``),family:String(n.family||``),channels:r(t.channels),identifiers:r(t.identifiers),organizations:r(t.organizations).map(e=>({name:String(e.name||``),role:e.role?String(e.role):void 0,identityId:Number(e.metadata?.identityId)||void 0}))}}async function Zv(e,t,n){if(!t||!e||e.mode!==`workspace`)return;let r=n.filter(e=>e.identityId);for(let n of r)try{await go(e.workspaceName,t,`member-of`,[n.identityId])}catch(e){console.error(`Failed to link organization`,n.name,e)}}function Qv(e){let[t,n]=(0,Z.useState)(e?.displayName??``),[r,i]=(0,Z.useState)(e?.type??`person`),[a,o]=(0,Z.useState)(e?.primaryEmail??``),[s,c]=(0,Z.useState)(e?.given??``),[l,u]=(0,Z.useState)(e?.family??``),[d,f]=(0,Z.useState)(e?.channels??[]),[p,m]=(0,Z.useState)(e?.identifiers??[]),[h,g]=(0,Z.useState)(e?.organizations??[]),[_,v]=(0,Z.useState)([]),[y,b]=(0,Z.useState)(``),[x,S]=(0,Z.useState)(!1),C={displayName:t,type:r,primaryEmail:a,given:s,family:l,channels:d,identifiers:p,organizations:h},w=!a.trim()||/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(a.trim()),T=t.trim().length>0&&w&&!x;async function E(e){S(!0);try{let t=y.trim(),n={schema:`${fi}/${C.type}`,schemaVersion:Wv,data:Yv(C),...t?{comment:t}:{},metadata:{features:Jo(_)}},r=await vs(e,[n]);return await Zv(e,r[0],h),r}finally{S(!1)}}return{displayName:t,setDisplayName:n,type:r,setType:i,primaryEmail:a,setPrimaryEmail:o,given:s,setGiven:c,family:l,setFamily:u,channels:d,setChannels:f,identifiers:p,setIdentifiers:m,organizations:h,setOrganizations:g,tags:_,setTags:v,comment:y,setComment:b,values:C,saving:x,canSave:T,emailValid:w,save:E}}var $v=`h-9 shrink-0 rounded-md border border-input bg-transparent px-2 text-sm shadow-elevation-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`;function ey({label:e,rows:t,onChange:n,blank:r,addLabel:i,children:a}){return(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsx)($,{children:e}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>n([...t,r()]),className:`inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,children:[(0,Q.jsx)(cn,{className:`h-3 w-3`}),` `,i]})]}),t.length===0?(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`None yet.`}):(0,Q.jsx)(`div`,{className:`space-y-1.5`,children:t.map((r,i)=>(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[a(r,e=>n(t.map((t,n)=>n===i?{...t,...e}:t))),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>n(t.filter((e,t)=>t!==i)),className:`shrink-0 rounded p-1.5 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive`,"aria-label":`Remove ${e.toLowerCase()} row`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]},i))})]})}function ty(e,t){let n=e[t].kind,r=e[t].primary;return e.map((e,i)=>e.kind===n?{...e,primary:!r&&i===t}:e)}function ny(e){let[t,n]=(0,Z.useState)([]);return(0,Z.useEffect)(()=>{if(!e)return;let t=!1;async function r(){try{let r=await bo(e,`organization`);t||n(r.map(e=>({id:e.id,name:Ni(e).title})))}catch{t||n([])}}return r(),()=>{t=!0}},[e]),t}function ry({idPrefix:e,workspaceName:t,displayName:n,setDisplayName:r,type:i,setType:a,primaryEmail:o,setPrimaryEmail:s,given:c,setGiven:l,family:u,setFamily:d,channels:f,setChannels:p,identifiers:m,setIdentifiers:h,organizations:g,setOrganizations:_,emailValid:v=!0}){let y=ny(t);return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${e}-display-name`,children:`Display name`}),(0,Q.jsx)(J,{id:`${e}-display-name`,value:n,onChange:e=>r(e.target.value),placeholder:`Jane Doe, Acme Ltd, build-bot…`,autoFocus:!0})]}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsxs)(`div`,{className:`w-40 space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${e}-type`,children:`Type`}),(0,Q.jsx)(`select`,{id:`${e}-type`,value:i,onChange:e=>a(e.target.value),className:q($v,`w-full`),children:Gv.map(e=>(0,Q.jsx)(`option`,{value:e,children:Kv[e]},e))})]}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${e}-email`,children:`Primary email`}),(0,Q.jsx)(J,{id:`${e}-email`,type:`email`,value:o,onChange:e=>s(e.target.value),placeholder:`jane@example.com`}),!v&&(0,Q.jsx)(`p`,{className:`text-xs text-destructive`,children:`Enter a valid email address.`})]})]}),i===`person`&&(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${e}-given`,children:`Given name`}),(0,Q.jsx)(J,{id:`${e}-given`,value:c,onChange:e=>l(e.target.value),placeholder:`Jane`})]}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${e}-family`,children:`Family name`}),(0,Q.jsx)(J,{id:`${e}-family`,value:u,onChange:e=>d(e.target.value),placeholder:`Doe`})]})]}),(0,Q.jsx)(ey,{label:`Channels`,rows:f,onChange:p,blank:()=>({kind:`email`,value:``}),addLabel:`Add channel`,children:(e,t)=>(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`select`,{value:e.kind,onChange:e=>t({kind:e.target.value}),className:q($v,`w-24`),children:[qv.map(e=>(0,Q.jsx)(`option`,{value:e,children:e},e)),!qv.includes(e.kind)&&(0,Q.jsx)(`option`,{value:e.kind,children:e.kind})]}),(0,Q.jsx)(J,{value:e.value,onChange:e=>t({value:e.target.value}),placeholder:e.kind===`phone`?`+421…`:`address or handle`,className:`min-w-0 flex-1`}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>p(ty(f,f.indexOf(e))),className:q(`shrink-0 rounded p-1.5 transition-colors hover:bg-muted`,e.primary?`text-data-5`:`text-muted-foreground`),title:e.primary?`Primary for this kind`:`Make primary for this kind`,"aria-pressed":!!e.primary,children:(0,Q.jsx)(wn,{className:q(`h-3.5 w-3.5`,e.primary&&`fill-current`)})})]})}),(0,Q.jsx)(ey,{label:`Identifiers`,rows:m,onChange:h,blank:()=>({type:`github`,identifier:``}),addLabel:`Add identifier`,children:(e,t)=>(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`select`,{value:e.type,onChange:e=>t({type:e.target.value}),className:q($v,`w-24`),children:[Jv.map(e=>(0,Q.jsx)(`option`,{value:e,children:e},e)),!Jv.includes(e.type)&&(0,Q.jsx)(`option`,{value:e.type,children:e.type})]}),(0,Q.jsx)(J,{value:e.identifier,onChange:e=>t({identifier:e.target.value}),placeholder:`octocat, U024BE7LH, 0xABCD…`,className:`min-w-0 flex-1 font-mono text-xs`})]})}),(0,Q.jsx)(ey,{label:`Organizations`,rows:g,onChange:_,blank:()=>({name:``}),addLabel:`Add organization`,children:(e,t)=>(0,Q.jsxs)(Q.Fragment,{children:[y.length>0?(0,Q.jsxs)(`select`,{value:e.identityId?String(e.identityId):``,onChange:e=>{let n=y.find(t=>String(t.id)===e.target.value);t(n?{identityId:n.id,name:n.name}:{identityId:void 0})},className:q($v,`min-w-0 flex-1`),children:[(0,Q.jsx)(`option`,{value:``,children:`Other… (type a name)`}),y.map(e=>(0,Q.jsx)(`option`,{value:e.id,children:e.name},e.id))]}):null,!e.identityId&&(0,Q.jsx)(J,{value:e.name,onChange:e=>t({name:e.target.value}),placeholder:`Acme Ltd`,className:`min-w-0 flex-1`}),e.identityId&&(0,Q.jsx)(`span`,{className:`shrink-0 text-muted-foreground`,title:`Linked — saving relates this identity to that organization`,children:(0,Q.jsx)(Qt,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(J,{value:e.role??``,onChange:e=>t({role:e.target.value}),placeholder:`Role`,className:`w-28 shrink-0`})]})})]})}function iy(e){return e===`data/schema/note`||e===`data/schema/link`||e===`data/schema/tab`||e===`data/schema/task`||e===`data/schema/drawing`||e===`data/schema/identity`||e.startsWith(`data/schema/identity/`)}function ay(e){return iy(e.schema)||Lo(e)}function oy(e){return e===`data/schema/link`?{urlKey:`uri`,titleKey:`label`}:e===`data/schema/tab`?{urlKey:`url`,titleKey:`title`}:{urlKey:null,titleKey:`title`}}async function sy(e,t,n){try{let r=new Set(n.map(e=>e.identityId).filter(Boolean)),i=await ea(e,t,{resolve:!1}),a=new Set(i.outgoing.filter(e=>e.p===`member-of`).map(e=>e.to));for(let n of r)a.has(n)||await go(e,t,`member-of`,[n]);for(let n of a)r.has(n)||await Ji(e,t,`member-of`,n)}catch(e){console.error(`Failed to sync organization relations`,e)}}function cy({document:e,workspaceId:t,onClose:n}){let{showSuccessToast:r,showErrorToast:i}=Gr(),a=iy(e.schema),o=e.schema===Ei,s=Lo(e),c=Uo(e)??`markdown`,l=s&&jo(e),u=e.schema===Oo,d=e.schema===`data/schema/identity`||e.schema.startsWith(`data/schema/identity/`),{urlKey:f,titleKey:p}=oy(e.schema),[m,h]=(0,Z.useState)(f?String(e.data?.[f]??``):``),[g,_]=(0,Z.useState)(String(e.data?.[p]??``)),[v,y]=(0,Z.useState)(String(e.data?.content??``)),[b,x]=(0,Z.useState)(String(e.data?.description??``)),[S,C]=(0,Z.useState)(e.data?.status??`pending`),[w,T]=(0,Z.useState)(typeof e.data?.priority==`number`?e.data.priority:``),[E,D]=(0,Z.useState)(e.data?.dueDate?P_(String(e.data.dueDate)):I_()),O=Qv(Xv(e)),[k,A]=(0,Z.useState)(String(e.comment??``)),j=e.metadata?.geo??null,[M,N]=(0,Z.useState)(j),P=e.features??e.metadata?.features,[ee,F]=(0,Z.useState)(qo(P).length?qo(P):e.data?.tags??[]),I=Mo(e,t,o),{title:L,content:R,comment:te,tags:z,geo:ne,setTitle:B,setContent:re,setComment:V,setTags:ie,setGeo:ae}=o?I:{title:g,content:v,comment:k,tags:ee,geo:M,setTitle:_,setContent:y,setComment:A,setTags:F,setGeo:N},oe=JSON.stringify(ne??null)!==JSON.stringify(j??null),H=Po(t,e.id,{mode:`text`,enabled:s&&!l,maxTextLength:Bo,version:e.checksumArray?.[0]??null}),[se,ce]=(0,Z.useState)(null),U=`${e.id}:${e.checksumArray?.[0]??``}`;s&&H.text!=null&&se!==U&&(ce(U),re(H.text));let[le,ue]=(0,Z.useState)([]),[de,fe]=(0,Z.useState)(!1),{replicating:pe,mirror:me}=Hi(e);(0,Z.useEffect)(()=>{let e=!1;return za(t).then(t=>{e||ue(t)}).catch(()=>{}),()=>{e=!0}},[t]);let he=!f||(()=>{try{return new URL(m.trim()),!0}catch{return!1}})(),W=!de&&(s?!l&&H.text!=null&&!H.loading:a?d?O.displayName.trim().length>0&&O.emailValid:u?L.trim().length>0:o?I.canSave:he:!0),ge=async()=>{fe(!0);try{if(o){await I.save(),n();return}if(s){let i=await Go(t,e,R,{comment:te.trim(),...oe?{metadata:{geo:ne}}:{}});r(`Document updated`),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`)),n(i);return}let i={id:e.id,schema:e.schema,schemaVersion:e.schemaVersion,comment:te.trim()};if(d){let{type:t,...n}=e.data??{};i.schema=`${fi}/${O.values.type}`,i.data={...n,...Yv(O.values)},i.metadata={features:Jo(z)}}else if(u)i.data={...e.data,...L_({title:L,description:b,status:S,priority:w,due:E})},i.metadata={features:Jo(z)};else if(a){let t=z.map(e=>e.trim()).filter(Boolean),n;o?n={...L.trim()?{title:L.trim()}:{},content:R}:(n={...e.data},f&&(n[f]=m.trim()),L.trim()?n[p]=L.trim():delete n[p],n.tags=t),i.data=n,i.metadata={features:Jo(z)}}oe&&(i.metadata={...i.metadata??{},geo:ne}),await _o(t,i),d&&(await sy(t,e.id,O.values.organizations),Og()),r(`Document updated`),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`)),n()}catch(e){i(e instanceof Error?e.message:`Failed to update document`)}finally{fe(!1)}};return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[a&&f&&(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`edit-url`,children:`URL`}),(0,Q.jsx)(J,{id:`edit-url`,value:m,onChange:e=>h(e.target.value),placeholder:`https://example.com`,className:`font-mono text-xs`}),m.trim()&&!he&&(0,Q.jsx)(`p`,{className:`text-xs text-destructive`,children:`Enter a valid URL, e.g. https://example.com`})]}),a&&d&&(0,Q.jsx)(ry,{idPrefix:`edit-identity`,workspaceName:t,...O,emailValid:O.emailValid}),a&&u&&(0,Q.jsx)(Uv,{idPrefix:`edit-todo`,title:L,setTitle:B,description:b,setDescription:x,status:S,setStatus:C,priority:w,setPriority:T,due:E,setDue:D}),a&&!u&&!d&&(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`edit-title`,children:`Title`}),(0,Q.jsx)(J,{id:`edit-title`,value:L,onChange:e=>B(e.target.value),placeholder:o?`Optional; defaults to today's date`:`Optional display title`})]}),(o||s)&&(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Body`}),l?(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`This file is too large to edit here (`,`>`,1e3,` kB) — download it instead.`]}):s&&H.error?(0,Q.jsx)(`p`,{className:`text-xs text-destructive`,children:H.error}):s&&H.text==null?(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading content…`}):(0,Q.jsx)(Vo,{kind:o?`markdown`:c,value:R,onChange:re,placeholder:o?`Write your note…`:void 0})]}),a&&(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:z,onChange:ie,suggestions:le})]}),(0,Q.jsx)(ig,{value:ne,onChange:ae}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`edit-comment`,children:`Comment`}),(0,Q.jsx)(`textarea`,{id:`edit-comment`,value:te,onChange:e=>V(e.target.value),rows:3,placeholder:`Add context you can't infer from the content, e.g. “sofa from the cozmo bar in Košice”`,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`})]}),o&&(0,Q.jsx)(Wo,{...I,onRetry:I.save}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>n(),disabled:de,children:o?`Close`:`Cancel`}),(0,Q.jsx)(X,{size:`sm`,onClick:ge,disabled:!W,children:de?pe?`Replicating to ${me.label}…`:`Saving…`:`Save changes`})]})]})}var ly=(0,Z.createContext)(null),uy={open:()=>{},close:()=>{}};function dy(){return(0,Z.useContext)(ly)??uy}var fy=`main`,py=(0,Z.createContext)(null);function my(){return(0,Z.useContext)(py)}var hy=50;function gy({relation:e,workspaceId:t,direction:n,onRemove:r,removing:i}){let{open:a}=dy(),o=gg(),s=my(),c=n===`out`?e.to:e.from,l=e.document??null,u=l?Ni(l).title:``,[d,f]=(0,Z.useState)(!1),{showErrorToast:p}=Gr(),m=async()=>{if(!(c==null||!l)){f(!0);try{let n=e.preview?await Ja(t,c):l;s?o.open(n,t):a(n,t)}catch(e){p(e instanceof Error?e.message:`Failed to open document`)}finally{f(!1)}}},h=!e.meta||e.meta.src===`doc`;return(0,Q.jsxs)(`div`,{className:`group flex items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted/60`,children:[n===`out`?(0,Q.jsx)(Ot,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}):(0,Q.jsx)(Yn,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),l?(0,Q.jsx)(Fm,{document:l,size:3.5}):null,l?(0,Q.jsx)(`button`,{type:`button`,onClick:()=>void m(),disabled:d,className:`min-w-0 flex-1 truncate text-left hover:underline`,title:u,children:u}):(0,Q.jsxs)(`span`,{className:`min-w-0 flex-1 truncate italic text-muted-foreground`,children:[`Document `,c,` (not available)`]}),(0,Q.jsxs)(`span`,{className:`shrink-0 font-mono text-[10px] text-muted-foreground`,children:[`#`,c]}),!h&&(0,Q.jsx)(`span`,{className:`shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground`,title:`Derived by ${e.meta?.src}`,children:e.meta?.src}),h&&(0,Q.jsx)(`button`,{type:`button`,onClick:r,disabled:i,className:`shrink-0 rounded p-1 text-muted-foreground opacity-0 transition-opacity hover:bg-destructive/10 hover:text-destructive group-hover:opacity-100 disabled:opacity-40`,title:`Remove relation`,"aria-label":`Remove relation`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]})}function _y({document:e,workspaceId:t}){let{showSuccessToast:n,showErrorToast:r}=Gr(),[i,a]=(0,Z.useState)(null),[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)(!1),[u,d]=(0,Z.useState)(!1),[f,p]=(0,Z.useState)(null),[m,h]=(0,Z.useState)(0),[g,_]=(0,Z.useState)(1),v=(0,Z.useRef)(0),y=(0,Z.useCallback)(()=>{v.current++},[]),b=(0,Z.useCallback)(async()=>{let n=++v.current;try{let r=await ea(t,e.id,{offset:m*hy,limit:hy,summary:!0});if(n!==v.current)return;let i=Math.max(0,Math.ceil(Math.max(r.outgoingCount??r.outgoing.length,r.incomingCount??r.incoming.length)/hy)-1);if(_(i+1),m>i){h(i);return}a(r),s(null)}catch(e){if(n!==v.current)return;s(e instanceof Error?e.message:String(e))}},[t,e.id,m]),x=`${t}:${e.id}`,[S,C]=(0,Z.useState)(x);x!==S&&(C(x),a(null),s(null),h(0),_(1)),(0,Z.useEffect)(()=>{async function e(){await b()}return e(),window.addEventListener(Dg,e),()=>{y(),window.removeEventListener(Dg,e)}},[b,y]);let w=async(i,a)=>{let o=a===`out`?i.to:i.from;if(o==null)return;let s=`${a}:${i.p}:${o}`;p(s);try{await Ji(t,e.id,i.p,o,a),n(`Relation removed`),Og()}catch(e){r(e instanceof Error?e.message:`Failed to remove relation`)}finally{p(null)}},T=[{dir:`out`,title:`Points at`,hint:`this document as the subject`,entries:i?.outgoing??[]},{dir:`in`,title:`Pointed at by`,hint:`this document as the object`,entries:i?.incoming??[]}],E=e=>{a(null),h(e)};return(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[(0,Q.jsx)(`h3`,{className:`font-semibold`,children:`Documents`}),(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:()=>l(!0),children:[(0,Q.jsx)(cn,{className:`mr-1 h-3 w-3`}),` Add relation`]})]}),o?(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:o}):i?T.every(e=>e.entries.length===0)?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No related documents.`}):(0,Q.jsx)(`div`,{className:`space-y-4`,children:T.filter(e=>e.entries.length>0).map(({dir:e,title:n,hint:r,entries:i})=>(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`p`,{className:`mb-1 text-xs font-medium text-muted-foreground`,title:r,children:n}),Array.from(new Set(i.map(e=>e.p))).map(n=>(0,Q.jsxs)(`div`,{className:`mb-2`,children:[(0,Q.jsx)(`p`,{className:`px-2 font-mono text-[11px] text-muted-foreground`,children:n}),i.filter(e=>e.p===n).map(n=>{let r=e===`out`?n.to:n.from,i=`${e}:${n.p}:${r}`;return(0,Q.jsx)(gy,{relation:n,workspaceId:t,direction:e,removing:f===i,onRemove:()=>void w(n,e)},i)})]},n))]},e))}):(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading relations…`}),(g>1||m>0)&&(0,Q.jsxs)(`div`,{className:`mt-3 flex items-center justify-between gap-2 text-xs text-muted-foreground`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,disabled:m===0,onClick:()=>E(m-1),children:`Previous`}),(0,Q.jsxs)(`span`,{children:[`Page `,m+1,` of `,g]}),(0,Q.jsx)(X,{variant:`outline`,size:`sm`,disabled:!i||m+1>=g,onClick:()=>E(m+1),children:`Next`})]}),c&&(0,Q.jsx)(Up,{onClose:()=>{u||l(!1)},children:(0,Q.jsx)(Jm,{sizeClassName:`h-full w-[380px] max-w-[90vw] max-md:w-full`,title:`Relate to…`,tabs:[`relations`],fixedWorkspaceName:t,documentCount:1,saving:u,relationPredicates:i?.predicates,relationExcludeIds:new Set([e.id]),onClose:()=>l(!1),onConfirm:()=>{},onConfirmRelation:async({predicate:i,direction:a,targetIds:o})=>{d(!0);try{await go(t,e.id,i,o,a),n(`Related to ${o.length} document${o.length===1?``:`s`}`),l(!1),Og()}catch(e){r(e instanceof Error?e.message:`Failed to create relation`)}finally{d(!1)}}})})]})}window.EXCALIDRAW_ASSET_PATH=`/excalidraw/`;var vy=(0,Z.lazy)(()=>g(()=>import(`./SketchEditor-CCh9_zKT.js`),__vite__mapDeps([9,3,4,10,1,11,12,13,14,15,16,17,18,19,20,21,22,23]))),yy=(0,Z.lazy)(()=>g(()=>import(`./TextDocumentEditor-S5KKs7E_.js`),__vite__mapDeps([24,3,4,11,10,13,12,14,15,16,25,1,22]))),by={reply:`Reply`,replyAll:`Reply all`,forward:`Forward`},xy={reply:We,replyAll:I,forward:Ke};function Sy({document:e,workspaceId:t,initialEdit:n=!1,onChanged:r}){let i=Ao()!=null,{showErrorToast:a}=Gr(),[o,s]=(0,Z.useState)(!1),c=[`data/schema/message`,`data/schema/message/email`].includes(e.schema),[l,u]=(0,Z.useState)(null),d=e.schema===`data/schema/message/email`,f=!i&&(d||[`slack`,`whatsapp`].includes(String(e.data?.platform))),p=d?[`reply`,`replyAll`,`forward`]:[`reply`],m=e=>u(t=>t===e?null:e),h=!i,[g,_]=(0,Z.useState)(n&&ay(e)),v=e.schema===ki,[y,b]=(0,Z.useState)(!1),x=e.schema===`data/schema/note`||Lo(e),[S,C]=(0,Z.useState)(!1),w=`${t}:${e.id}:${n}:${i}`,[T,E]=(0,Z.useState)(w);w!==T&&(E(w),_(n&&ay(e)),u(null),s(!1),b(!1),C(!1));let D=t=>{if(!h||!ay(e)||t.defaultPrevented)return!1;let n=t.target;return n instanceof Element&&t.currentTarget.contains(n)&&!n.closest(`a, button, input, textarea, select, label, summary, audio, video, [role="button"], [role="checkbox"], [contenteditable]:not([contenteditable="false"])`)};return g&&h?(0,Q.jsx)(cy,{document:e,workspaceId:t,onClose:e=>{_(!1),r?.(e)}}):(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-3`,children:[h&&(0,Q.jsxs)(`div`,{className:`flex shrink-0 justify-end gap-2`,children:[c&&(0,Q.jsx)(X,{size:`sm`,variant:o?`secondary`:`outline`,onClick:()=>s(!o),children:o?`Show message`:`View thread`}),f&&p.map(e=>{let t=xy[e];return(0,Q.jsxs)(X,{size:`sm`,variant:l===e?`secondary`:`outline`,onClick:()=>m(e),children:[(0,Q.jsx)(t,{className:`mr-1.5 h-3.5 w-3.5`}),by[e]]},e)}),e.schema===`data/schema/file`&&(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:()=>Fi(t,e.id,Zr(e)||`document-${e.id}`).catch(e=>a(e instanceof Error?e.message:String(e))),children:[(0,Q.jsx)(Jt,{className:`mr-1 h-3 w-3`}),` Download`]}),v&&(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:()=>b(!0),children:[(0,Q.jsx)(ue,{className:`mr-1 h-3 w-3`}),` Edit sketch`]}),x&&(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:()=>C(!0),children:[(0,Q.jsx)(_r,{className:`mr-1 h-3 w-3`}),` Open editor`]}),(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:()=>_(!0),children:[(0,Q.jsx)(ve,{className:`mr-1 h-3 w-3`}),` Edit`]})]}),y&&h&&(0,Q.jsx)(Z.Suspense,{fallback:(0,Q.jsx)(`div`,{className:`fixed inset-0 z-fullscreen flex items-center justify-center bg-background surface-glass`,children:(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading sketch editor…`})}),children:(0,Q.jsx)(vy,{doc:e,workspaceName:t,onSaved:()=>{b(!1),r?.()},onClose:()=>b(!1),onDetails:()=>{b(!1),_(!0)}})}),S&&h&&(0,Q.jsx)(Z.Suspense,{fallback:(0,Q.jsx)(`div`,{className:`fixed inset-0 z-fullscreen flex items-center justify-center bg-background surface-glass`,children:(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading editor…`})}),children:(0,Q.jsx)(yy,{doc:e,workspaceName:t,onSaved:e=>{C(!1),r?.(e)},onClose:()=>C(!1),onDetails:()=>{C(!1),_(!0)}})}),(0,Q.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-auto`,onMouseDownCapture:e=>{e.button===0&&e.detail>1&&D(e)&&e.preventDefault()},onDoubleClickCapture:e=>{D(e)&&(e.preventDefault(),e.stopPropagation(),e.currentTarget.ownerDocument.getSelection()?.removeAllRanges(),_(!0))},children:[o&&!i?(0,Q.jsx)(Tv,{workspaceId:t,documentId:Number(e.id)},`${t}:${e.id}`):(0,Q.jsx)(uv,{workspaceId:t,document:e}),l&&f&&(0,Q.jsx)(wv,{workspaceId:t,replyToDocumentId:Number(e.id),mode:l,originalSubject:d&&typeof e.data?.subject==`string`?e.data.subject:void 0,onClose:()=>u(null)},`${e.id}:${l}`)]}),e.comment?.trim()&&(0,Q.jsxs)(`div`,{className:`shrink-0 rounded-md border border-border bg-muted/40 px-3 py-2`,children:[(0,Q.jsx)(`p`,{className:`text-xs font-medium text-muted-foreground mb-0.5`,children:`Comment`}),(0,Q.jsx)(`p`,{className:`text-sm whitespace-pre-wrap`,children:e.comment})]})]})}var Cy=e=>e?new Date(e).toLocaleDateString(`en-US`,{year:`numeric`,month:`long`,day:`numeric`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}):`—`,wy=e=>!Number.isFinite(e)||!e?null:e>=1?`${e}s`:`1/${Math.round(1/e)}s`;function Ty({meta:e}){let{geo:t,exif:n,dimensions:r}=e;if(!t&&!n&&!r)return null;let i=(e,t)=>t==null||t===``?null:(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`span`,{className:`font-medium`,children:[e,`:`]}),(0,Q.jsx)(`span`,{className:`ml-2`,children:t})]});return(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h3`,{className:`font-semibold mb-3`,children:`Photo`}),(0,Q.jsxs)(`div`,{className:`grid gap-3 text-sm`,children:[r&&i(`Dimensions`,r.width&&r.height?`${r.width} × ${r.height}`:null),n&&i(`Camera`,[n.make,n.model].filter(Boolean).join(` `)),n&&i(`Lens`,n.lensModel),n&&i(`Aperture`,Number.isFinite(n.fNumber)?`ƒ/${n.fNumber}`:null),n&&i(`Shutter`,wy(n.exposureTime)),n&&i(`ISO`,Number.isFinite(n.iso)?n.iso:null),n&&i(`Focal length`,Number.isFinite(n.focalLength)?`${n.focalLength} mm`:null),n&&i(`Captured`,Cy(n.capturedAt)),t&&Number.isFinite(t.lat)&&Number.isFinite(t.lon)&&i(`Location`,(0,Q.jsxs)(`a`,{href:`https://www.openstreetmap.org/?mlat=${t.lat}&mlon=${t.lon}#map=15/${t.lat}/${t.lon}`,target:`_blank`,rel:`noopener noreferrer`,className:`text-primary underline underline-offset-2`,children:[t.lat.toFixed(5),`, `,t.lon.toFixed(5),Number.isFinite(t.alt)?` · ${Math.round(t.alt)} m`:``]}))]})]})}function Ey({document:e}){let t=e.metadata;return(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h3`,{className:`font-semibold mb-3`,children:`Basic Information`}),(0,Q.jsxs)(`div`,{className:`grid gap-3 text-sm`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:`ID:`}),(0,Q.jsx)(`span`,{className:`ml-2 font-mono`,children:e.id})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:`Schema:`}),(0,Q.jsx)(`span`,{className:`ml-2 font-mono`,children:e.schema})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:`Schema Version:`}),(0,Q.jsx)(`span`,{className:`ml-2`,children:e.schemaVersion})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:`Created:`}),(0,Q.jsx)(`span`,{className:`ml-2`,children:Cy(e.createdAt)})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:`Updated:`}),(0,Q.jsx)(`span`,{className:`ml-2`,children:Cy(e.updatedAt)})]})]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h3`,{className:`font-semibold mb-3`,children:`Metadata`}),(0,Q.jsxs)(`div`,{className:`grid gap-3 text-sm`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:`Content Type:`}),(0,Q.jsx)(`span`,{className:`ml-2`,children:e.metadata?.contentType??`—`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:`Content Encoding:`}),(0,Q.jsx)(`span`,{className:`ml-2`,children:e.metadata?.contentEncoding??`—`})]}),Number.isFinite(e.metadata?.size)&&(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:`Size:`}),(0,Q.jsxs)(`span`,{className:`ml-2`,children:[e.metadata?.size,` bytes`]})]})]})]}),(0,Q.jsx)(Ty,{meta:t}),Array.isArray(e.locations)&&e.locations.length>0&&(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h3`,{className:`font-semibold mb-3`,children:`Locations`}),(0,Q.jsx)(`div`,{className:`space-y-2`,children:e.locations.map((e,t)=>{let{backend:n,key:r}=Ay(e.url);return(0,Q.jsxs)(`div`,{className:`flex items-baseline gap-2 text-sm font-mono`,children:[(0,Q.jsx)(`span`,{className:`font-medium shrink-0`,children:n}),r&&(0,Q.jsx)(`span`,{className:`break-all text-muted-foreground`,children:r})]},t)})})]}),Array.isArray(e.checksumArray)&&e.checksumArray.length>0&&(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h3`,{className:`font-semibold mb-3`,children:`Checksums`}),(0,Q.jsx)(`div`,{className:`space-y-2`,children:e.checksumArray.map((e,t)=>{let[n,r]=e.split(`/`);return(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm font-mono`,children:[(0,Q.jsxs)(`span`,{className:`font-medium`,children:[n,`:`]}),(0,Q.jsx)(`span`,{className:`break-all text-muted-foreground`,children:r})]},t)})})]}),e.indexOptions&&(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h3`,{className:`font-semibold mb-3`,children:`Index Options`}),(0,Q.jsxs)(`div`,{className:`space-y-3 text-sm`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:`FTS Search Fields:`}),(0,Q.jsx)(`div`,{className:`ml-2 mt-1`,children:(e.indexOptions.ftsSearchFields??[]).map((e,t)=>(0,Q.jsx)(`span`,{className:`mb-1 mr-2 inline-block rounded bg-muted px-2 py-1 text-xs`,children:e},t))})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:`Vector Embedding Fields:`}),(0,Q.jsx)(`div`,{className:`ml-2 mt-1`,children:(e.indexOptions.vectorEmbeddingFields??[]).map((e,t)=>(0,Q.jsx)(`span`,{className:`mb-1 mr-2 inline-block rounded bg-muted px-2 py-1 text-xs`,children:e},t))})]})]})]})]})}function Dy({document:e}){let{showSuccessToast:t,showErrorToast:n}=Gr(),r=JSON.stringify(e,null,2);return(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(`div`,{className:`flex justify-end`,children:(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:async()=>{try{await navigator.clipboard.writeText(r),t(`Copied to clipboard`)}catch{n(`Copy failed`)}},children:[(0,Q.jsx)(A,{className:`mr-1 h-3 w-3`}),` Copy to clipboard`]})}),(0,Q.jsx)(`pre`,{className:`overflow-x-auto rounded-lg bg-muted p-4 text-xs`,children:r})]})}function Oy({document:e,workspaceId:t}){let[n,r]=(0,Z.useState)(null),[i,a]=(0,Z.useState)(null),o=`${t}:${e.id}`,[s,c]=(0,Z.useState)(o);return o!==s&&(c(o),r(null),a(null)),(0,Z.useEffect)(()=>{let n=!1;return na(t,e.id).then(e=>{n||r(e)}).catch(e=>{n||a(e instanceof Error?e.message:String(e))}),()=>{n=!0}},[o]),i?(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:i}):n?(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[[{title:`Context tree`,type:`context`},{title:`Directory tree`,type:`directory`}].map(({title:e,type:t})=>{let r=n.filter(e=>e.type===t),i=r.flatMap(e=>e.paths.map(t=>({tree:e.tree,path:t})));return(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h3`,{className:`mb-3 font-semibold`,children:e}),i.length===0?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No placements.`}):(0,Q.jsx)(`div`,{className:`space-y-1`,children:i.map(({tree:e,path:t},n)=>(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,Q.jsx)(`span`,{className:`break-all font-mono text-xs`,children:t}),r.length>1&&(0,Q.jsxs)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:[`(`,e,`)`]})]},`${e}:${t}:${n}`))})]},t)}),(0,Q.jsx)(_y,{document:e,workspaceId:t})]}):(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading memberships...`})}function ky(e){return e===`stored`?tr:e===`workspace-file`?Fe:e===`imap`?xt:e===`readonly`?Xe:Un}function Ay(e){let t=e.match(/^([a-z][a-z0-9+.-]*):\/\/([^/]*)\/?(.*)$/i);return t?{backend:`${t[1]}://${t[2]}`,key:t[3]}:{backend:e,key:``}}function jy({document:e,workspaceId:t,onChanged:n}){let{showSuccessToast:r,showErrorToast:i}=Gr(),[a,o]=(0,Z.useState)(null),[s,c]=(0,Z.useState)(null),[l,u]=(0,Z.useState)(null),[d,f]=(0,Z.useState)(null),[p,m]=(0,Z.useState)(null),[h,g]=(0,Z.useState)(!1),_=`${t}:${e.id}`,[v,y]=(0,Z.useState)(_);_!==v&&(y(_),o(null),c(null),f(null));let b=()=>{xi(t,e.id).then(o).catch(e=>c(e instanceof Error?e.message:String(e)))};(0,Z.useEffect)(()=>{let n=!1;return xi(t,e.id).then(e=>{n||o(e)}).catch(e=>{n||c(e instanceof Error?e.message:String(e))}),()=>{n=!0}},[_]);let x=async(a,o)=>{u(a),f(null);try{let i=await La(t,[e.id],{urls:[a],...o===void 0?{}:{keepDocument:o}}),s=i.successful[0];if(!s)throw Error(i.failed[0]?.reason||`Destroy failed`);s.docDeleted?r(`Removed from backend; document removed from index`):s.deleted.includes(a)?r(`Removed from backend`):r(`Reference dropped (backend is read-only)`),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`)),n?.(),b()}catch(e){i(e instanceof Error?e.message:String(e))}finally{u(null)}},S=async(a,o,s)=>{g(!0);try{let i=await Ca(t,[e.id],{to:a,mode:o,keepDocument:s.keepDocument,folder:s.folder,filename:s.filename,onConflict:s.onConflict}),c=i.successful[0];if(!c)throw Error(Sp(i.failed,new Map([[e.id,Zr(e)||`Document ${e.id}`]]))||`Transfer failed`);let l=c.transfers?.flatMap(e=>e.state===`unchanged`?[]:[e.backend])??[],u=a.join(`, `);o===`delete`?r(`Deleted from ${u}`):l.length===0?r(`Nothing to do — already on ${u}`):r(`${o===`move`?`Moved to`:`Copied to`} ${l.join(`, `)}${c.transfers?.some(e=>e.state===`pending`)?` (pending sync)`:``}`),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`)),m(null),n?.(),b()}catch(e){i(e instanceof Error?e.message:String(e))}finally{g(!1)}},C=e=>{if((a?.length??0)<=1){f(e.url);return}window.confirm(`Remove this copy from the backend?\n\n${e.url}`)&&x(e.url)};if(s)return(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:s});if(!a)return(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading locations...`});let w=a.length===0,T=Zr(e);return(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded border px-3 py-2 text-sm`,children:[(0,Q.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-2`,children:[(0,Q.jsx)(tr,{className:`h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`font-mono text-xs`,children:`workspace:db`}),(0,Q.jsxs)(`span`,{className:`truncate text-xs text-muted-foreground`,children:[`index entry (id `,e.id,`)`]})]}),(0,Q.jsx)(`span`,{className:`shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] uppercase text-muted-foreground`,children:`json`})]}),w?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No byte locations; this object lives only in the workspace database, so there is no file data to copy or move.`}):(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:()=>m(`copy`),title:`Copy the file data to another storage backend (keeps the existing copies)`,children:[(0,Q.jsx)(A,{className:`mr-1 h-3.5 w-3.5`}),` Copy to…`]}),(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:()=>m(`move`),title:`Move the file data to another storage backend (source released once the copy is durable)`,children:[(0,Q.jsx)(Ot,{className:`mr-1 h-3.5 w-3.5`}),` Move to…`]})]}),a.map(n=>{let r=ky(n.kind),{backend:a,key:o}=Ay(n.url),s=l===n.url;return(0,Q.jsxs)(`div`,{className:`space-y-2 rounded border px-3 py-2 text-sm`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Q.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-2`,children:[(0,Q.jsx)(r,{className:`h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`shrink-0 font-mono text-xs`,children:n.backend||a}),(0,Q.jsx)(`span`,{className:`truncate font-mono text-xs text-muted-foreground`,title:n.url,children:o||n.url})]}),(0,Q.jsxs)(`span`,{className:`flex shrink-0 items-center gap-2`,children:[(0,Q.jsx)(`span`,{className:`rounded px-1.5 py-0.5 text-[10px] uppercase ${n.deletable?`bg-muted text-muted-foreground`:`bg-warning/15 text-warning`}`,children:n.deletable?n.kind:`read-only`}),(0,Q.jsx)(`button`,{onClick:()=>Fi(t,e.id,T||`document-${e.id}`,{url:n.url}).catch(e=>i(e instanceof Error?e.message:String(e))),className:`text-muted-foreground hover:text-foreground`,title:`Download this copy`,children:(0,Q.jsx)(Jt,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(`button`,{onClick:()=>C(n),disabled:s,className:`text-muted-foreground hover:text-destructive disabled:opacity-50`,title:n.deletable?`Remove from backend`:`Drop reference (bytes stay; backend is read-only)`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]})]}),d===n.url&&(0,Q.jsxs)(`div`,{className:`space-y-2 rounded border border-destructive/40 bg-destructive/5 p-2`,children:[(0,Q.jsxs)(`p`,{className:`text-xs`,children:[`This is the object's `,(0,Q.jsx)(`strong`,{children:`last`}),` location. Remove the bytes from the backend and…`]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Q.jsx)(X,{variant:`destructive`,size:`sm`,disabled:s,onClick:()=>void x(n.url,!1),children:`Also remove index entry`}),(0,Q.jsx)(X,{variant:`outline`,size:`sm`,disabled:s,onClick:()=>void x(n.url,!0),children:`Keep index entry (no bytes)`}),(0,Q.jsx)(X,{variant:`ghost`,size:`sm`,onClick:()=>f(null),children:`Cancel`})]})]})]},n.url)}),p&&(0,Pp.createPortal)((0,Q.jsx)(`div`,{className:`fixed inset-0 z-picker flex items-center justify-center bg-scrim p-4 max-md:p-2`,children:(0,Q.jsx)(fg,{workspaceId:t,documentCount:1,initialMode:p,defaultFilename:T,saving:h,onConfirm:S,onClose:()=>{h||m(null)}})}),window.document.body)]})}function My(e){let t=e.metadata?.geo,n=t?.lat,r=t?.lon;if(n==null||r==null||n===``||r===``)return null;let i=Number(n),a=Number(r);return!Number.isFinite(i)||!Number.isFinite(a)||i===0&&a===0?null:{lat:i,lon:a}}function Ny(e,t,n){let r=!1;for(let i=0,a=n.length-1;i<n.length;a=i++){let o=n[i].lat,s=n[i].lon,c=n[a].lat,l=n[a].lon;o>e!=c>e&&t<(l-s)*(e-o)/(c-o)+s&&(r=!r)}return r}function Py(e,t,n){if(n.kind===`rect`){let r=n.bbox;return e>=r.minLat&&e<=r.maxLat&&t>=r.minLon&&t<=r.maxLon}return n.points.length>=3&&Ny(e,t,n.points)}function Fy(e,t,n=!1){let r=My(e);return r?Py(r.lat,r.lon,t):n}var Iy=(0,Z.lazy)(()=>g(()=>import(`./LocationTab-BONJQfYM.js`),__vite__mapDeps([26,3,4,27,28]))),Ly=[{id:`view`,label:`View`,icon:Zn},{id:`location`,label:`Location`,icon:nn},{id:`metadata`,label:`Metadata`,icon:ee},{id:`json`,label:`JSON`,icon:at},{id:`synapses`,label:`Synapses`,icon:Mn},{id:`backends`,label:`Backends`,icon:tr}];function Ry({document:e,workspaceId:t,initialTab:n=`view`,initialEdit:r=!1,onChanged:i,className:a=``,compact:o=!1,navigation:s,tabActions:c,onTabChange:l}){let u=Ao()!=null,d=My(e),f=Ly.filter(e=>(e.id!==`location`||d!==null)&&(!u||![`synapses`,`backends`].includes(e.id))),[p,m]=(0,Z.useState)(n),h=`${e.id}:${n}`,[g,_]=(0,Z.useState)(h);h!==g&&(_(h),m(n));let v=f.some(e=>e.id===p)?p:`view`,y=e=>{m(e),l?.(e)},b=o&&!!c&&!s,x=(0,Q.jsx)(`div`,{className:q(b&&`document-detail-header shrink-0 border-b-[3px] bg-muted`),children:(0,Q.jsxs)(`div`,{className:q(`flex min-w-0 items-center`,b&&`mx-auto h-[calc(3rem-4px)] w-full max-w-[var(--document-reading-width,100%)] gap-1 pl-2 pr-2 sm:pl-4`),children:[(0,Q.jsx)(Hg,{tabs:f,active:v,onChange:y,className:q(`min-w-0 flex-1 px-1`,b&&`h-full border-b-0 px-0 max-sm:gap-0 max-sm:[&>button]:px-2.5`),iconOnly:o}),c]})});return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col ${a}`,children:[s?(0,Q.jsx)(Vg,{...s,tabs:x,section:v,onDocument:()=>y(`view`),onSection:()=>y(`view`),onBack:v===`view`?s.onBack:()=>y(`view`)}):x,(0,Q.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:(0,Q.jsxs)(`div`,{className:`mx-auto h-full w-full max-w-[var(--document-reading-width,100%)] p-4`,children:[v===`view`&&(0,Q.jsx)(Sy,{document:e,workspaceId:t,initialEdit:r&&!u,onChanged:i}),v===`location`&&d&&(0,Q.jsx)(Z.Suspense,{fallback:(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading map…`}),children:(0,Q.jsx)(Iy,{lat:d.lat,lon:d.lon})}),v===`metadata`&&(0,Q.jsx)(Ey,{document:e,workspaceId:t}),v===`json`&&(0,Q.jsx)(Dy,{document:e,workspaceId:t}),v===`synapses`&&!u&&(0,Q.jsx)(Oy,{document:e,workspaceId:t}),v===`backends`&&!u&&(0,Q.jsx)(jy,{document:e,workspaceId:t,onChanged:i})]})})]})}function zy(e,t){let[n,r]=(0,Z.useState)(null),i=t?.id??null,a=`${e}:${i}`,[o,s]=(0,Z.useState)(a);a!==o&&(s(a),r(null));let c=(0,Z.useRef)(a),l=(0,Z.useRef)(0);(0,Z.useEffect)(()=>(c.current=a,l.current++,()=>{c.current=``}),[a]);let u=n?.id??i,d=(0,Z.useCallback)(t=>{if(!e||u==null||c.current!==a)return;let n=++l.current;if(t){r(t);return}Ja(e,u).then(e=>{c.current===a&&l.current===n&&e&&r(e)}).catch(()=>{})},[e,u,a]);return{document:n??t,refresh:d}}function By(e){let t=Lg(),n=(0,Z.useContext)(mg),{document:r,workspaceId:i,isOpen:a,onClose:o,initialEdit:s,initialTab:c}=e,l=t===`side`&&!!n&&!!i&&!s&&!c;return(0,Z.useLayoutEffect)(()=>{!l||!a||!r||!i||!n||((n.preview??n.open)(r,i),o())},[l,a,r,i,n,o]),l?null:(0,Q.jsx)(Vy,{...e})}function Vy({document:e,isOpen:t,onClose:n,workspaceId:r,initialTab:i,initialEdit:a}){let[o,s]=(0,Z.useState)(!1),c=$o(),{document:l,refresh:u}=zy(r,e);if(Np(()=>o?s(!1):n(),t&&!!l),!t||!l)return null;let d=!!(c?.state.t1Open||c?.state.t2Open);return(0,Pp.createPortal)((0,Q.jsx)(`div`,{role:`dialog`,"aria-modal":`true`,className:q(`fixed inset-0 z-50 flex items-center justify-center bg-scrim`,o?`p-0`:`p-4 max-md:p-2`,o&&d&&`md:right-[min(436px,90vw)]`),onClick:n,children:(0,Q.jsxs)(`div`,{className:q(`flex w-full flex-col border bg-background max-md:h-full max-md:max-w-none`,o?`h-full max-w-none rounded-none md:rounded-(--panel-radius) md:m-2 md:h-[calc(var(--viewport-h)-1rem)]`:`h-viewport-card max-w-3xl rounded-(--panel-radius)`),onClick:e=>e.stopPropagation(),children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between p-4 pb-2`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`h2`,{className:`truncate text-lg font-bold`,children:Ni(l).title}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`ID: `,l.id,` · `,l.schema]})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1`,children:[(()=>{let e=Ra(l);return e?(0,Q.jsx)(`a`,{href:e,target:`_blank`,rel:`noopener noreferrer`,className:`rounded-sm p-2 text-muted-foreground hover:bg-muted hover:text-foreground`,title:`Open original: ${e}`,"aria-label":`Open original`,children:(0,Q.jsx)(Ut,{className:`h-4 w-4`})}):null})(),(0,Q.jsx)(`button`,{onClick:()=>s(!o),className:`hidden rounded-sm p-2 hover:bg-muted md:block`,title:o?`Restore`:`Fullscreen`,"aria-label":o?`Restore`:`Fullscreen`,children:o?(0,Q.jsx)(ut,{className:`h-4 w-4`}):(0,Q.jsx)(Sn,{className:`h-4 w-4`})}),(0,Q.jsx)(`button`,{onClick:n,className:`rounded-sm p-2 hover:bg-muted`,title:`Close`,children:`✕`})]})]}),(0,Q.jsx)(`div`,{className:`min-h-0 flex-1`,children:(0,Q.jsx)(kg.Provider,{value:()=>s(e=>!e),children:(0,Q.jsx)(Ry,{document:l,workspaceId:r??``,initialTab:i,initialEdit:a,onChanged:u})})})]})}),window.document.body)}var Hy={sortBy:`alphabetical`,order:`asc`};function Uy(e){return e?.sortBy===`crud:deleted`?{...Hy}:{sortBy:e?.sortBy??Hy.sortBy,order:e?.order??Hy.order}}var Wy={features:{allOf:[],anyOf:[],noneOf:[]},timeline:{quickFilter:null,customRanges:[],indexCreated:!0,indexUpdated:!0,indexDeleted:!1,contentEvents:!1,selectedTimelines:[]},geo:{bbox:null,includeUnlocated:!1},lens:{gps:null,ids:null},sort:{...Hy}};function Gy(e){let t=e.bbox;return t?[`geo:bbox:${t.minLat},${t.minLon},${t.maxLat},${t.maxLon}`,...e.includeUnlocated?[`geo:missing`]:[]]:[]}function Ky(e,t=!1){if(!e.gps)return[];let{lat:n,lon:r,radiusM:i}=e.gps;return[`geo:near:${n},${r},${Math.max(1,Math.round(i))}m`,...t?[`geo:missing`]:[]]}function qy(e){return e.customRanges?.length?e.customRanges:e.customRange?[e.customRange]:[]}function Jy(e){let{quickFilter:t,indexCreated:n,indexUpdated:r,indexDeleted:i,contentEvents:a,selectedTimelines:o}=e,s=qy(e),c=s.length>0?s.map(e=>`${e.start}..${e.end}`):t?[t]:[];if(c.length===0)return[];let l=[];return n&&l.push(`crud:created`),r&&l.push(`crud:updated`),i&&l.push(`crud:deleted`),a&&l.push(`content`),l.push(...o),l.flatMap(e=>c.map(t=>`t:${e}:${t}`))}function Yy(e,t,n=[]){return{features:e.features,filters:[...Jy(e.timeline),...Gy(e.geo),...Ky(e.lens,e.geo.includeUnlocated)],queryOptions:{ids:e.lens.ids,sortBy:e.sort.sortBy,order:e.sort.order,queries:n,geoSelection:t,includeUnlocated:e.geo.includeUnlocated??!1}}}var Xy=Hy,Zy={alphabetical:`Alphabetical`,type:`Type`,"crud:created":`Created`,"crud:updated":`Updated`,content:`Content`};function Qy(e){return Zy[e]??e}function $y(e){let[t,n]=(0,Z.useState)([]);return(0,Z.useEffect)(()=>{let t=!1;return Qr(e).then(e=>{t||n(e)}).catch(()=>{t||n([])}),()=>{t=!0}},[e]),(0,Z.useMemo)(()=>[...new Set([`alphabetical`,`type`,`crud:created`,`crud:updated`,`content`,...t.filter(e=>e!==`crud:deleted`)])].map(e=>({value:e,label:Qy(e)})),[t])}function eb({workspaceId:e,value:t,onChange:n}){let r=$y(e);return(0,Q.jsxs)(`div`,{className:`canvas-no-drag flex items-center gap-1`,children:[(0,Q.jsxs)(`select`,{value:t.sortBy,onChange:e=>n({...t,sortBy:e.target.value,order:[`alphabetical`,`type`].includes(e.target.value)?`asc`:t.order}),className:`h-7 rounded-md border bg-background px-1.5 text-xs`,title:`Sort by`,"aria-label":`Sort by`,children:[t.sortBy!==`crud:deleted`&&!r.some(e=>e.value===t.sortBy)&&(0,Q.jsx)(`option`,{value:t.sortBy,children:Qy(t.sortBy)}),r.map(e=>(0,Q.jsx)(`option`,{value:e.value,children:e.label},e.value))]}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>n({...t,order:t.order===`asc`?`desc`:`asc`}),title:t.order===`asc`?`Ascending`:`Descending`,"aria-label":t.order===`asc`?`Ascending`:`Descending`,className:`flex h-7 w-7 items-center justify-center rounded-md border text-muted-foreground hover:bg-accent hover:text-foreground touch-target`,children:t.order===`asc`?(0,Q.jsx)(bt,{className:`h-3.5 w-3.5`}):(0,Q.jsx)(Vt,{className:`h-3.5 w-3.5`})})]})}var tb={today:8,yesterday:7,thisWeek:6,lastWeek:5,thisMonth:4,lastMonth:3,thisYear:2,year:1,unknown:0},nb=e=>e*1e6;function rb(){try{let e=new Intl.Locale(navigator.language),t=(typeof e.getWeekInfo==`function`?e.getWeekInfo():e.weekInfo)?.firstDay;if(typeof t==`number`&&t>=1&&t<=7)return t}catch{}return 1}function ib(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function ab(e,t){let n=((e.getDay()===0?7:e.getDay())-t+7)%7,r=ib(e);return r.setDate(r.getDate()-n),r}var ob=864e5;function sb(e){let t=rb(),n=ib(e),r=ab(e,t);return{today:n.getTime(),yesterday:n.getTime()-ob,weekStart:r.getTime(),lastWeekStart:r.getTime()-7*ob,year:e.getFullYear(),month:e.getFullYear()*12+e.getMonth()}}function cb(e,t){if(e===null||!Number.isFinite(e))return{key:`unknown`,label:`Unknown date`,rank:nb(tb.unknown)};if(e>=t.today)return{key:`today`,label:`Today`,rank:nb(tb.today)};if(e>=t.yesterday)return{key:`yesterday`,label:`Yesterday`,rank:nb(tb.yesterday)};if(e>=t.weekStart)return{key:`this-week`,label:`Earlier this week`,rank:nb(tb.thisWeek)};if(e>=t.lastWeekStart)return{key:`last-week`,label:`Last week`,rank:nb(tb.lastWeek)};let n=new Date(e),r=n.getFullYear()*12+n.getMonth();if(r===t.month)return{key:`this-month`,label:`Earlier this month`,rank:nb(tb.thisMonth)};if(r===t.month-1)return{key:`last-month`,label:`Last month`,rank:nb(tb.lastMonth)};if(n.getFullYear()===t.year)return{key:`this-year`,label:`Earlier this year`,rank:nb(tb.thisYear)};let i=n.getFullYear();return{key:`year-${i}`,label:String(i),rank:nb(tb.year)+i}}function lb(e,t,n=`desc`,r=new Date){let i=sb(r),a=new Map;for(let n of e){let e=cb(t(n),i),r=a.get(e.key);r?r.items.push(n):a.set(e.key,{...e,items:[n]})}let o=[...a.values()].sort((e,t)=>n===`asc`?e.rank-t.rank:t.rank-e.rank),s=o.filter(e=>e.key===`unknown`);return s.length?[...o.filter(e=>e.key!==`unknown`),...s]:o}function ub(e,t){let n=t.split(`/`).filter(Boolean);if(e!==`backends`||n[0]!==`Trash`)return null;try{return{backend:n[1]?decodeURIComponent(n[1]):null,prefix:n.slice(2).join(`/`)}}catch{return null}}function db(e,t=``){return`/Trash${e?`/${encodeURIComponent(e)}`:``}${t?`/${t}`:``}`}function fb(e,t=``){let n=new Map,r=[],i=t?`${t}/`:``;for(let t of e){if(!t.key.startsWith(i))continue;let e=t.key.slice(i.length);if(!e)continue;let a=e.indexOf(`/`);if(a>=0){let r=e.slice(0,a),o=i+r,s=n.get(o)??{id:`folder:${o}`,name:r,key:o,directory:!0,navigable:!0,items:[]};s.items.push(t),n.set(o,s)}else r.push({id:t.id,name:e,key:t.key,directory:t.type===`directory`,navigable:!1,items:[t]})}return[...n.values(),...r].sort((e,t)=>Number(t.directory)-Number(e.directory)||e.name.localeCompare(t.name)||t.items[0].deletedAt-e.items[0].deletedAt||e.id.localeCompare(t.id))}var pb=(e,t)=>`${Sr.workspaces}/${encodeURIComponent(e)}/backends/file/${encodeURIComponent(t)}/trash`;async function mb(e,t){let n=[],r=new Set,i=null,a=null;do{let o=new URLSearchParams({limit:`1000`,...i?{cursor:i}:{}}),s=await Y.get(`${pb(e,t)}?${o}`);if(n.push(...s.items),a=s.retention?.days??null,i=s.cursor,i&&r.has(i))throw Error(`Trash listing returned a repeated cursor`);i&&r.add(i)}while(i);return{items:n,days:a}}function hb(e,t,n){return _b(e,t,n,`restore`)}function gb(e,t,n){return _b(e,t,n,`discard`)}async function _b(e,t,n,r){let i=[...new Set(n)],a=[];try{for(let n=0;n<i.length;n+=100){let o=await Y.post(`${pb(e,t)}/${r}`,{ids:i.slice(n,n+100)});a.push(...o.results)}return a}finally{Aa(e,`backends`),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:e,treeName:`backends`}})),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:e}})),window.dispatchEvent(new CustomEvent(`workspace:trash:refresh`,{detail:{workspaceName:e,backend:t}}))}}async function vb(e,t){let n=ub(`backends`,t);if(!n?.backend)return;let{items:r}=await mb(e,n.backend),i=r.filter(e=>!n.prefix||e.key===n.prefix||e.key.startsWith(`${n.prefix}/`)).sort((e,t)=>t.deletedAt-e.deletedAt),a=await hb(e,n.backend,i.map(e=>e.id)),o=a.filter(e=>!e.ok);if(o.length)throw Error(`${a.length-o.length} restored; ${o.length} remain in Trash. Existing paths were kept.`)}function yb(e,t){if(!t.length)return!1;let n=[...new Set(t.map(e=>e.key))],r=n.slice(0,5).join(`
21
- `)+(n.length>5?`\n…and ${n.length-5} more paths`:``);return window.confirm(`Permanently delete ${t.length} Trash item(s) from ${e}?\n\n${r}\n\nDeleted folders include all their contents. This cannot be undone. Files currently at the original paths are kept.`)}async function bb(e,t){let n=ub(`backends`,t);if(!n?.backend)return;let{items:r}=await mb(e,n.backend),i=r.filter(e=>!n.prefix||e.key===n.prefix||e.key.startsWith(`${n.prefix}/`));if(!yb(n.backend,i))return;let a=await gb(e,n.backend,i.map(e=>e.id)),o=a.filter(e=>!e.ok);if(o.length)throw Error(`${a.length-o.length} deleted; ${o.length} remain in Trash. ${o[0].message||o[0].reason||`Please retry.`}`)}function xb(){let{showProgress:e}=Hr();return(0,Z.useCallback)(async(t,n,r,i)=>{let a=e({title:t,description:n});try{let e=await i();if(e===!1)throw Error(`The operation could not be completed.`);return a.done({title:r,description:n}),e}catch(e){throw a.fail({title:`Operation failed`,description:e instanceof Error?e.message:String(e),variant:`destructive`}),e}},[e])}var Sb=new Map;function Cb(e,t,n,r,i){let a=JSON.stringify([t,n,r]),o=Sb.get(a);if(o)return o;let s=(async()=>{let a=e({title:`Resyncing…`,description:r});try{for(await Va(t,n,r);;){let e=await Qi(t,n,r);if(i?.(e),!e.resyncing&&e.status!==`syncing`){if(e.lastError)throw Error(e.lastError);a.done({title:e.resyncCancelledAt?`Resync stopped`:`Resync complete`,description:`${r}${e.progress?` · ${e.progress.scanned} files scanned`:``}`}),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:t,treeName:`backends`}}));return}let o=e.progress;a.update({title:`Resyncing…`,description:`${r}${o?` · ${o.scanned}${o.total==null?``:` / ${o.total}`} files scanned`:``}`}),await new Promise(e=>setTimeout(e,2e3))}}catch(e){throw a.fail({title:`Resync needs attention`,description:`${r}: ${e instanceof Error?e.message:String(e)}`,variant:`destructive`}),e}})();return Sb.set(a,s),s.finally(()=>{Sb.get(a)===s&&Sb.delete(a)}).catch(()=>{}),s}var wb=[`tree.path.inserted`,`tree.path.moved`,`tree.path.removed`,`tree.path.copied`,`tree.path.locked`,`tree.path.unlocked`,`tree.layer.updated`,`tree.layer.converted`,`tree.recalculated`,`tree.created`,`tree.deleted`,`tree.renamed`,`context.path.changed`,`backend.tree.changed`,`backend.changed`,`backend.resync.changed`,`dataBackends.changed`,`services.changed`,`connect`],Tb=new Map;function Eb(e,t,n){Aa(e,t),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:e,treeName:t,cacheInvalidated:!0}})),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:e,treeName:t,path:n}}))}function Db(e,t){let n=Tb.get(e);if(!n){let t=new Set([e]),r=new Set,i,a=wb.map(n=>{let a=(a={})=>{if(n===`backend.resync.changed`&&a.resyncing!==!1)return;let o=typeof a.workspaceId==`string`?a.workspaceId:null,s=typeof a.workspaceName==`string`?a.workspaceName:null;if(o&&!t.has(o)||!o&&s&&s!==e)return;let c=typeof a.treeName==`string`?a.treeName:void 0;n===`tree.renamed`?c=void 0:n===`context.path.changed`?c??=`context`:[`backend.tree.changed`,`backend.changed`,`backend.resync.changed`,`dataBackends.changed`,`services.changed`,`connect`].includes(n)&&(c??=`backends`),r.add(c),!i&&(i=setTimeout(()=>{i=void 0;let t=r.has(void 0)?[void 0]:[...r];r.clear();for(let n of t)Aa(e,n),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:e,treeName:n,cacheInvalidated:!0}}))},200))};return pd.on(n,a),[n,a]});n={users:0,workspaceIds:t,stop:()=>{clearTimeout(i);for(let t of r)Aa(e,t);a.forEach(([e,t])=>pd.off(e,t))}},Tb.set(e,n)}n.users++,t&&n.workspaceIds.add(t);let r=n;return()=>{--r.users===0&&(r.stop(),Tb.delete(e))}}function Ob({contextId:e,workspaceId:t,treeName:n,onRefresh:r}){let i=xb(),{showProgress:a}=Hr(),o=n||`context`,s=o===`directory`,c=(0,Z.useCallback)((e=150)=>{r&&setTimeout(r,e),t&&setTimeout(()=>window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:t}})),e)},[r,t]),l=(0,Z.useCallback)(async(n,r=!0)=>{let i;if(e)i=await _s(e,n,r);else if(t)i=await Ga(t,n,r,o);else return!1;let a=hm(n);if(i&&a)try{e?await us(e,n,a):t&&await fa(t,n,a,o)}catch{}return c(),i},[e,t,o,c]),u=(0,Z.useCallback)(async(n,r=!1,a=!1,s=!1)=>i(s?`Destroying…`:a?`Purging…`:`Removing…`,n,s?`Destroyed`:a?`Purged`:`Removed`,async()=>{try{return e?await ls(e,n,r):t?await no(t,n,r,o,a,s):!1}finally{c()}}),[e,t,o,c,i]),d=(0,Z.useCallback)(async(n,r)=>{let i;if(e){let t=n.split(`/`);t[t.length-1]=r,i=await ps(e,n,t.join(`/`),!1)}else if(t)i=await fa(t,n,{name:r},o);else return!1;return c(),i},[e,t,o,c]),f=(0,Z.useCallback)(async(n,r,a=!1,s=o,l=o,u={})=>i(`Moving…`,`${n} → ${r}`,`Moved`,async()=>{let i;if(e)i=await ps(e,n,r,a,u);else if(t)i=await Di(t,n,r,a,s,l,u);else return!1;return c(),i}),[e,t,o,c,i]),p=(0,Z.useCallback)(async n=>{let r;if(e)r=await Fs(e,n);else if(t)r=await pi(t,n,o);else return null;return c(),r},[e,t,o,c]),m=(0,Z.useCallback)(async n=>{let r;if(e)r=await ss(e,n);else if(t)r=await so(t,n,o);else return null;return c(),r},[e,t,o,c]),h=(0,Z.useCallback)(async(n,r,a=!1,s=o,l=o)=>i(`Copying…`,`${n} → ${r}`,`Copied`,async()=>{let i;if(e)i=await ys(e,n,r,a);else if(t)i=await Ta(t,n,r,a,s,l);else return!1;return c(),i}),[e,t,o,c,i]),_=(0,Z.useCallback)(async(n,r)=>e?await us(e,n,r):t?await fa(t,n,r,o):!1,[e,t,o]),v=(0,Z.useCallback)(async(n,r)=>{let i;if(e)i=await es(e,n,r);else if(t)i=await bi(t,n,r,o);else return null;return c(),i},[e,t,o,c]),y=(0,Z.useCallback)(async(n,r)=>{let i;if(e)i=await ws(e,n,r);else if(t)i=await ha(t,n,r,o);else return null;return c(),i},[e,t,o,c]),b=(0,Z.useCallback)(async e=>{if(!t)return!1;let n=await Ii(t,e,t,o);return c(300),n},[t,o,c]),x=(0,Z.useCallback)(async(e,n)=>{if(!t)return!1;try{await Wa(t,e,n??t,o)}catch(e){if(!(e instanceof Error)||!/still locked by/i.test(e.message))throw e}return c(300),!0},[t,o,c]),S=(0,Z.useCallback)(async e=>{if(!t)return!1;let n=await Xr(t,e,o);return c(),n},[t,o,c]),C=(0,Z.useCallback)(async e=>{if(!t)return!1;let n=await Eo(t).catch(()=>[]),r=oo(e,n);return r?(await Cb(a,t,r.driver,r.address),c(300),!0):!1},[t,c,a]),w=(0,Z.useCallback)(async(e,n)=>{if(!t)return!1;let r=await Eo(t).catch(()=>[]),i=ma(e,r);if(!i)return!1;let a=i.key?`${i.key}/${n}`:n;return await ca(t,i.driver,i.address,[a]),c(200),!0},[t,c]),T=(0,Z.useCallback)(async(e,n)=>{if(!t)return!1;let r=await Eo(t).catch(()=>[]),i=ma(e,r);return!i||!i.key?!1:(await Si(t,i.driver,i.address,i.key,n),c(200),!0)},[t,c]),E=(0,Z.useCallback)(async e=>t?i(`Deleting folder…`,e,`Folder deleted`,async()=>{let n=await Eo(t),r=po(e,n);if(!r)throw Error(`This folder is not on a writable backend, or is a backend root.`);try{return await vi(t,r.driver,r.address,r.key),!0}finally{c(200)}}):!1,[t,c,i]),D=(0,Z.useCallback)(async(e,n)=>{if(!t)return;let{showSubtreeTransfer:r}=await g(async()=>{let{showSubtreeTransfer:e}=await import(`./subtree-transfer-dialog-CSjPDp4d.js`);return{showSubtreeTransfer:e}},__vite__mapDeps([29,3,4,10,11,13,12,14]));r({mode:e,path:n,workspaceId:t,treeName:o,onImported:()=>{Eb(t,o),c()}})},[t,o,c]);return{onInsertPath:l,onRemovePath:u,onRenamePath:d,onMovePath:f,onCopyPath:h,onExportSubtree:t?e=>D(`export`,e):void 0,onImportSubtree:t&&o!==`backends`?e=>D(`import`,e):void 0,onUpdateNode:_,onMergeLayer:v,onSubtractLayer:y,onMergeDown:s?void 0:p,onSubtractDown:s?void 0:m,onLockLayer:t?b:void 0,onUnlockLayer:t?x:void 0,onDestroyLayer:t&&!s?S:void 0,onResyncBackend:t?C:void 0,onCreateBackendFolder:t?w:void 0,onRenameBackendFolder:t?T:void 0,onDeleteBackendFolder:t?E:void 0}}function kb({x:e,y:t,workspaceName:n,treeName:r,path:i,onClose:a,onOpen:o,onOpenToSide:s,pastedDocumentIds:c,onPasteDocuments:l}){let u=hl(),d=Ob({workspaceId:n,treeName:r}),f=r===`backends`,p=f?ma(i):null,[m,h]=(0,Z.useState)([]);(0,Z.useEffect)(()=>{if(!f)return;let e=!1;return Eo(n).then(t=>{e||h(t)}).catch(()=>{}),()=>{e=!0}},[n,f]);let g=f?po(i,m):null,_=i.split(`/`).filter(Boolean).pop()||i,[v,y]=(0,Z.useState)(void 0);(0,Z.useEffect)(()=>{let e=!1;return si(n).then(t=>{e||y(t.find(e=>e.tree===r&&e.path===i)??null)}).catch(()=>{e||y(null)}),()=>{e=!0}},[n,r,i]);let b=async e=>{a();try{await e()}catch(e){alert(e instanceof Error?e.message:String(e))}},x=(e,t,n,r=!1)=>(0,Q.jsxs)(`button`,{type:`button`,className:q(`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:()=>b(n),children:[e,t]}),S=(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`}),C=e=>{let t=f?(()=>{let t=Qf(i);return{kind:e,storeTo:t?.backend||``,storeFolder:t?.rel||``}})():{kind:e,path:`dir:${i}`,storeFolder:e===`download`?`Downloads`:ep(i)};u(`/workspaces/${n}/settings/hooks?${$f(t).toString()}`)},w=(e,t=``)=>{let n=prompt(e,t)?.trim();return n&&n!==t&&!n.includes(`/`)?n:null},T=ub(r,i);return T?(0,Q.jsxs)(Wp,{x:e,y:t,onClose:a,className:`min-w-44 rounded-md border bg-popover p-1 shadow-elevation-3`,children:[x((0,Q.jsx)(rt,{className:`h-3 w-3`}),`Open Trash`,()=>o(i)),T.backend&&x((0,Q.jsx)(ar,{className:`h-3 w-3`}),`Restore original paths`,()=>vb(n,i)),T.backend&&x((0,Q.jsx)(rt,{className:`h-3 w-3`}),`Empty Trash`,()=>bb(n,i),!0)]}):(0,Q.jsxs)(Wp,{x:e,y:t,onClose:a,className:`min-w-[11rem] rounded-md border bg-popover p-1 shadow-elevation-3`,children:[x((0,Q.jsx)(it,{className:`w-3 h-3`}),`Open`,()=>o(i)),s&&x((0,Q.jsx)(Zn,{className:`w-3 h-3`}),`Open to the side`,()=>s(i)),S,f?p&&(0,Q.jsxs)(Q.Fragment,{children:[x((0,Q.jsx)(cn,{className:`w-3 h-3`}),`New folder here`,async()=>{let e=w(`New folder name:`);e&&await d.onCreateBackendFolder?.(i,e)}),p.key&&x((0,Q.jsx)(Le,{className:`w-3 h-3`}),`Rename folder`,async()=>{let e=w(`New folder name:`,_);e&&await d.onRenameBackendFolder?.(i,e)}),x((0,Q.jsx)(Fe,{className:`w-3 h-3`}),`Create storage rule…`,()=>C(`store`))]}):(0,Q.jsxs)(Q.Fragment,{children:[x((0,Q.jsx)(cn,{className:`w-3 h-3`}),`New folder here`,async()=>{let e=w(`New folder name:`);e&&await d.onInsertPath(`${i===`/`?``:i}/${e}`)}),x((0,Q.jsx)(Le,{className:`w-3 h-3`}),`Rename`,async()=>{let e=w(`New name:`,_);e&&await d.onRenamePath(i,e)}),x((0,Q.jsx)(Fe,{className:`w-3 h-3`}),`Create rule…`,()=>C(`store`)),x((0,Q.jsx)(Jt,{className:`w-3 h-3`}),`Create download rule…`,()=>C(`download`))]}),v!==void 0&&x(v?(0,Q.jsx)(te,{className:`w-3 h-3`}):(0,Q.jsx)(ke,{className:`w-3 h-3`}),v?`Unpin`:`Pin`,async()=>{v?await ka(n,v.id):await ko(n,i,r),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:n}}))}),S,x((0,Q.jsx)(A,{className:`w-3 h-3`}),`Copy path`,()=>navigator.clipboard?.writeText(i)),!f&&l&&c&&c.length>0&&x((0,Q.jsx)(we,{className:`w-3 h-3`}),`Paste ${c.length} document(s)`,()=>l(i,c)),f?g&&(0,Q.jsxs)(Q.Fragment,{children:[S,x((0,Q.jsx)(rt,{className:`w-3 h-3`}),`Delete from backend`,async()=>{confirm(`Delete folder "${_}" and its contents from the backend?`)&&await d.onDeleteBackendFolder?.(i)},!0)]}):(0,Q.jsxs)(Q.Fragment,{children:[S,x((0,Q.jsx)(rt,{className:`w-3 h-3`}),`Remove`,async()=>{confirm(`Remove "${i}" and all children?`)&&await d.onRemovePath(i,!0)},!0)]})]})}function Ab({isOpen:e,onClose:t,documents:n,selectedDocuments:r}){let[i,a]=(0,Z.useState)(`idle`);if(!e)return null;let o=()=>{a(`idle`),t()},s=r.size>0?n.filter(e=>r.has(e.id)):n,c=s.map(e=>({schema:e.schema,schemaVersion:e.schemaVersion,data:e.data,metadata:e.metadata})),l=JSON.stringify(c,null,2),u=async()=>{try{await navigator.clipboard.writeText(l),a(`copied`),setTimeout(()=>a(`idle`),2e3)}catch(e){console.error(`Failed to copy to clipboard:`,e),a(`error`),setTimeout(()=>a(`idle`),2e3)}};return(0,Q.jsx)(Fp,{label:`Export Documents`,onClose:o,children:(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col p-4 sm:p-6`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between mb-6`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-2xl font-bold`,children:`Export Documents`}),(0,Q.jsxs)(`p`,{className:`text-muted-foreground`,children:[`Exporting `,s.length,` document`,s.length===1?``:`s`,i===`copied`&&(0,Q.jsx)(`span`,{className:`text-success ml-2`,children:`✓ Copied to clipboard!`}),i===`error`&&(0,Q.jsx)(`span`,{className:`text-destructive ml-2`,children:`✗ Failed to copy`})]})]}),(0,Q.jsx)(`button`,{onClick:o,className:`p-2 hover:bg-muted rounded-sm`,title:`Close`,children:`✕`})]}),(0,Q.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col`,children:(0,Q.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 mb-2`,children:[(0,Q.jsx)(`h3`,{className:`font-semibold`,children:`JSON Data (Press Ctrl+A to select all, Ctrl+C to copy)`}),(0,Q.jsxs)(X,{onClick:u,size:`sm`,className:`flex items-center gap-2`,children:[(0,Q.jsx)(A,{className:`h-4 w-4`}),`Copy to Clipboard`]})]}),(0,Q.jsx)(`textarea`,{className:`w-full min-h-24 flex-1 p-4 bg-muted border rounded-lg text-sm font-mono resize-none focus:outline-none focus:ring-2 focus:ring-primary`,value:l,readOnly:!0,autoFocus:!0,onKeyDown:e=>{if(e.ctrlKey||e.metaKey){if(e.key===`a`){e.preventDefault();let t=window.getSelection(),n=document.createRange();n.selectNodeContents(e.currentTarget),t?.removeAllRanges(),t?.addRange(n)}else e.key===`c`&&u()}},onFocus:e=>e.target.select()})]})}),(0,Q.jsx)(`div`,{className:`mt-8 pt-4 border-t flex justify-end`,children:(0,Q.jsx)(X,{onClick:o,children:`Close`})})]})})}function jb({isOpen:e,onClose:t,onImport:n}){let[r,i]=(0,Z.useState)(``),[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)(null);if(!e)return null;let l=async()=>{if(c(null),!r.trim()){c(`Please enter JSON data`);return}try{let e=JSON.parse(r),a=Array.isArray(e)?e:[e];for(let e of a)if(!e.schema||!e.data){c(`Each document must have "schema" and "data" fields`);return}o(!0),await n(a)?(i(``),t()):c(`Failed to import documents`)}catch{c(`Invalid JSON format`)}finally{o(!1)}},u=()=>{i(``),c(null),t()};return(0,Pp.createPortal)((0,Q.jsx)(`div`,{role:`dialog`,"aria-modal":`true`,className:`fixed inset-0 bg-scrim flex items-center justify-center z-50 p-4 max-md:p-2`,children:(0,Q.jsx)(`div`,{className:`bg-background border rounded-(--panel-radius) max-w-3xl w-full max-h-viewport-card overflow-y-auto max-md:h-full max-md:max-h-none max-md:max-w-none`,children:(0,Q.jsxs)(`div`,{className:`p-6`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between mb-6`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-2xl font-bold`,children:`Import Documents`}),(0,Q.jsx)(`p`,{className:`text-muted-foreground`,children:`Paste JSON data containing documents to import`})]}),(0,Q.jsx)(`button`,{onClick:u,className:`p-2 hover:bg-muted rounded-sm`,title:`Close`,children:`✕`})]}),(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`block text-sm font-medium mb-2`,children:`JSON Data (single document or array of documents)`}),(0,Q.jsx)(`textarea`,{value:r,onChange:e=>i(e.target.value),className:`w-full h-64 p-3 border rounded-lg font-mono text-sm`,placeholder:`[{"schema": "data/schema/tab", "schemaVersion": "2.0", "data": {...}, "metadata": {...}}]`,disabled:a,autoFocus:!0})]}),s&&(0,Q.jsx)(`div`,{className:`text-sm text-destructive bg-destructive/10 p-3 rounded-lg border`,children:s}),(0,Q.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`Format:`}),` Each document must have "schema", "schemaVersion", "data", and "metadata" fields.`]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`Example schemas:`}),` "data/schema/tab", "data/schema/file", etc.`]})]})]}),(0,Q.jsxs)(`div`,{className:`mt-8 pt-4 border-t flex justify-between`,children:[(0,Q.jsx)(X,{variant:`outline`,onClick:u,disabled:a,children:`Cancel`}),(0,Q.jsx)(X,{onClick:l,disabled:a||!r.trim(),children:a?`Importing...`:`Import Documents`})]})]})})}),window.document.body)}function Mb({document:e}){let{replicating:t,label:n}=Hi(e);return t?(0,Q.jsxs)(`span`,{role:`status`,className:`inline-flex shrink-0 items-center gap-1 rounded-full border bg-muted/60 px-2 py-0.5 text-[11px] font-normal text-muted-foreground`,children:[(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}),n]}):null}function Nb(e){return e.clientX||e.clientY?{x:e.clientX,y:e.clientY}:$p(e.currentTarget,`inside`)}function Pb({documentId:e,onOpenActions:t,className:n}){return t?(0,Q.jsx)(`button`,{type:`button`,onClick:n=>{n.stopPropagation(),t(n.currentTarget,e)},className:`rounded-sm p-1.5 text-muted-foreground hover:bg-muted hover:text-foreground ${n??``}`,title:`Actions`,"aria-label":`Document actions`,"aria-haspopup":`menu`,children:(0,Q.jsx)($t,{className:`h-4 w-4`})}):null}function Fb(e,t,n){e.target===e.currentTarget&&(e.key===`Enter`?(e.preventDefault(),t()):e.key===` `&&n&&(e.preventDefault(),n()))}function Ib({document:e,isSelected:t,workspaceId:n,onSelect:r,onRightClick:i,onOpenActions:a,onDragStart:o}){let s=wp(),[c,l]=(0,Z.useState)(!1),{replicating:u}=Hi(e),d=e.schema===`data/schema/tab`,f=d?e.data.url:null,p=Ni(e),m=Rb(e),h=m||Bb(e),{blobUrl:g}=s_(n??``,e.id,128,{enabled:h,blobFallback:m,version:e.checksumArray?.[0]??null}),_=t=>{o?.(t,e.id)},v=e=>new Date(e).toLocaleDateString(`en-US`,{year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}),y=(()=>{let t=e.checksumArray?.[0];if(t){let[e,n]=t.split(`/`);if(n)return{algo:e,hash:n.substring(0,8)+`...`}}return null})(),b=n=>{let i=n.ctrlKey||n.metaKey;if(n.shiftKey&&r){n.preventDefault(),r(e.id,!0,i,!0);return}r&&(i?r(e.id,!t,i):r(e.id,!0,i)),i||(d&&f?window.open(f,`_blank`,`noopener,noreferrer`):l(!0))},x=e=>{e.shiftKey&&e.preventDefault()},S=n=>{n.preventDefault(),n.stopPropagation(),r&&!t&&r(e.id,!0,!1),i?.(n,e.id)};return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(xg,{tabIndex:0,"data-document-id":e.id,"aria-selected":!!t,onKeyDown:n=>Fb(n,()=>d&&f?window.open(f,`_blank`,`noopener,noreferrer`):l(!0),()=>r?.(e.id,!t,!0)),className:`cursor-pointer outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring transition-opacity ${u?`opacity-60`:``} ${t?`bg-info-subtle hover:bg-info-subtle`:`hover:bg-muted/50`}`,onClick:b,onMouseDown:x,...s,onContextMenu:S,draggable:!0,onDragStart:_,children:[(0,Q.jsx)(Cg,{className:`w-10`,onClick:e=>e.stopPropagation(),children:(0,Q.jsx)(`input`,{type:`checkbox`,className:`h-4 w-4 cursor-pointer accent-primary align-middle`,checked:!!t,onClick:t=>{t.stopPropagation(),r?.(e.id,t.currentTarget.checked,!0,t.shiftKey)},onChange:()=>{}})}),(0,Q.jsx)(Cg,{className:`w-12`,children:g?(0,Q.jsx)(`img`,{src:g,alt:``,className:`h-8 w-8 rounded-md border object-cover`}):(0,Q.jsx)(Fm,{document:e,chip:!0})}),(0,Q.jsx)(Cg,{className:`font-medium w-full max-w-0 md:w-auto md:max-w-xs`,children:(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`span`,{className:`truncate`,title:p.title,children:p.title}),p.isExternal&&(0,Q.jsx)(Ut,{className:`h-3 w-3 text-muted-foreground flex-shrink-0`}),(0,Q.jsx)(Mb,{document:e})]}),p.subtitle&&(0,Q.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,title:p.subtitle,children:p.subtitle})]})}),(0,Q.jsx)(Cg,{className:`hidden md:table-cell`,children:(0,Q.jsx)(`span`,{className:`px-2 py-1 text-xs bg-muted rounded border`,children:p.schemaLabel})}),(0,Q.jsx)(Cg,{className:`hidden text-xs text-muted-foreground lg:table-cell`,children:e.id}),(0,Q.jsx)(Cg,{className:`hidden text-xs text-muted-foreground lg:table-cell`,children:y&&(0,Q.jsx)(`span`,{className:`font-mono`,title:`${y.algo} checksum`,children:y.hash})}),(0,Q.jsx)(Cg,{className:`hidden text-xs text-muted-foreground sm:table-cell`,children:v(e.createdAt)}),(0,Q.jsx)(Cg,{className:`w-12 text-right`,children:(0,Q.jsx)(Pb,{documentId:e.id,onOpenActions:a})})]}),(0,Q.jsx)(By,{document:e,isOpen:c,onClose:()=>l(!1),workspaceId:n})]})}function Lb({document:e,isSelected:t,workspaceId:n,onSelect:r,onRightClick:i,onOpenActions:a,onDragStart:o}){let s=wp(),[c,l]=(0,Z.useState)(!1),u=e.schema===`data/schema/tab`,{replicating:d}=Hi(e),f=u?e.data.url:null,p=Ni(e),m=Rb(e),h=m||Bb(e),{blobUrl:g,loading:_}=s_(n??``,e.id,128,{enabled:h,blobFallback:m,version:e.checksumArray?.[0]??null}),v=t=>{o?.(t,e.id)},y=e=>new Date(e).toLocaleDateString(`en-US`,{year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}),b=(()=>{let t=e.checksumArray?.[0];if(t){let[e,n]=t.split(`/`);if(n)return{algo:e,hash:n.substring(0,8)+`...`}}return null})(),x=n=>{let i=n.ctrlKey||n.metaKey;if(n.shiftKey&&r){n.preventDefault(),r(e.id,!0,i,!0);return}r&&(i?r(e.id,!t,i):r(e.id,!0,i)),i||(u&&f?window.open(f,`_blank`,`noopener,noreferrer`):l(!0))},S=e=>{e.shiftKey&&e.preventDefault()},C=n=>{n.preventDefault(),n.stopPropagation(),r&&!t&&r(e.id,!0,!1),i?.(n,e.id)};return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{tabIndex:0,"data-document-id":e.id,"aria-selected":!!t,onKeyDown:n=>Fb(n,()=>u&&f?window.open(f,`_blank`,`noopener,noreferrer`):l(!0),()=>r?.(e.id,!t,!0)),className:`border rounded-(--card-radius) p-4 transition cursor-pointer outline-none focus-visible:ring-2 focus-visible:ring-ring ${d?`opacity-60`:``} ${t?`bg-info-subtle border-info ring-1 ring-info`:``} ${u&&!t?`hover:bg-info-subtle hover:border-info`:t?``:`hover:bg-accent/50`}`,onClick:x,onMouseDown:S,...s,onContextMenu:C,draggable:!0,onDragStart:v,children:(0,Q.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[h&&(0,Q.jsx)(`div`,{className:`h-14 w-14 shrink-0 overflow-hidden rounded-md border bg-muted/40`,children:g?(0,Q.jsx)(`img`,{src:g,alt:p.title,loading:`lazy`,className:`h-full w-full object-cover`}):_?(0,Q.jsx)(`div`,{className:`h-full w-full animate-pulse bg-muted/60`}):(0,Q.jsx)(`div`,{className:`flex h-full w-full items-center justify-center`,children:(0,Q.jsx)(Fm,{document:e})})}),(0,Q.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 mb-2 overflow-hidden`,children:[(0,Q.jsx)(Fm,{document:e,chip:!0}),(0,Q.jsx)(`h4`,{className:`font-medium truncate min-w-0 flex-1 max-w-[640px]`,title:p.title,children:p.title}),p.isExternal&&(0,Q.jsx)(Ut,{className:`h-3 w-3 text-muted-foreground flex-shrink-0`}),(0,Q.jsx)(`span`,{className:`ml-auto px-2 py-0.5 text-xs bg-muted text-muted-foreground rounded border flex-shrink-0`,children:p.schemaLabel}),(0,Q.jsx)(Mb,{document:e})]}),p.subtitle&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground mb-2 truncate`,title:p.subtitle,children:p.subtitle}),p.preview&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground mb-3 line-clamp-2 break-all overflow-hidden`,children:p.preview}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-4 text-xs text-muted-foreground overflow-hidden`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-1 flex-shrink-0`,children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:`ID:`}),(0,Q.jsx)(`span`,{className:`font-mono truncate max-w-[60px]`,title:`ID: ${e.id}`,children:e.id})]}),b&&(0,Q.jsxs)(`div`,{className:`flex items-center gap-1 flex-shrink-0`,children:[(0,Q.jsx)(ge,{className:`h-3 w-3`}),(0,Q.jsx)(`span`,{className:`font-mono`,title:`${b.algo} checksum`,children:b.hash})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-1 flex-shrink-0`,children:[(0,Q.jsx)(tt,{className:`h-3 w-3`}),(0,Q.jsx)(`span`,{title:`Created: ${y(e.createdAt)}`,children:y(e.createdAt)})]})]})]}),(0,Q.jsx)(Pb,{documentId:e.id,onOpenActions:a,className:`-mr-1 -mt-1 p-2`})]})}),(0,Q.jsx)(By,{document:e,isOpen:c,onClose:()=>l(!1),workspaceId:n})]})}function Rb(e){return(e.schema===`data/schema/file`||e.schema===`data/schema/drawing`)&&String(e.metadata?.contentType||``).startsWith(`image/`)}function zb(e){return e.schema===`data/schema/file`&&String(e.metadata?.contentType||``).startsWith(`video/`)}function Bb(e){return e.schema===`data/schema/file`&&String(e.metadata?.contentType||``)===`application/pdf`}function Vb({workspaceId:e,documentId:t,fallback:n}){let{src:r,error:i}=Ho(e,t),[a,o]=(0,Z.useState)(!1);return i||a?(0,Q.jsx)(Q.Fragment,{children:n}):r?(0,Q.jsxs)(`div`,{className:`relative`,children:[(0,Q.jsx)(`video`,{src:r,preload:`metadata`,muted:!0,playsInline:!0,onError:()=>o(!0),className:`block h-auto w-full`}),(0,Q.jsx)(`span`,{className:`pointer-events-none absolute bottom-2 right-2 rounded-sm bg-scrim p-1 text-scrim-foreground`,children:(0,Q.jsx)(Se,{className:`h-3.5 w-3.5`})})]}):(0,Q.jsx)(`div`,{className:`aspect-video w-full animate-pulse bg-muted/60`})}function Hb({document:e,workspaceId:t,markdown:n}){let r=(0,Z.useRef)(null),[i,a]=(0,Z.useState)(()=>typeof IntersectionObserver>`u`);(0,Z.useEffect)(()=>{let e=r.current;if(!e||typeof IntersectionObserver>`u`)return;let t=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&(a(!0),t.disconnect())});return t.observe(e),()=>t.disconnect()},[]);let{text:o,loading:s,error:c}=Po(t,e.id,{mode:`text`,enabled:i,maxTextLength:8e3});return(0,Q.jsx)(`div`,{ref:r,className:`relative h-48 w-full overflow-hidden bg-card text-card-foreground`,children:o!=null&&!c?(0,Q.jsxs)(`div`,{className:`pointer-events-none p-3 pt-7 text-xs leading-relaxed`,"aria-hidden":`true`,children:[o.length===0?(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`Empty file`}):n?(0,Q.jsx)(g_,{content:o,preview:!0,className:`text-xs [&_pre]:whitespace-pre-wrap [&_pre]:break-words [&_table]:table-fixed [&_table]:w-full`}):(0,Q.jsx)(`pre`,{className:`whitespace-pre-wrap break-words font-mono`,children:o}),(0,Q.jsx)(`div`,{className:`absolute inset-x-0 bottom-0 h-8 bg-gradient-to-t from-card to-transparent`})]}):(0,Q.jsxs)(`div`,{className:`flex h-full items-center justify-center`,children:[(0,Q.jsx)(Fm,{document:e,size:10,chip:!0}),i&&s&&(0,Q.jsx)(`span`,{className:`sr-only`,children:`Loading text preview`})]})})}function Ub({document:e,isSelected:t,workspaceId:n,onSelect:r,onOpenToSide:i,onRightClick:a,onOpenActions:o,onDragStart:s}){let c=wp(),[l,u]=(0,Z.useState)(!1),d=e.schema===`data/schema/tab`,f=d?e.data.url:null,p=Rb(e),m=zb(e),h=p||Bb(e),g=Ni(e),_=ei(String(e.metadata?.contentType||``).split(`;`)[0].trim().toLowerCase(),e.metadata?.filename||Zr(e)),v=e.schema===`data/schema/file`&&(_===`markdown`||_===`text`)&&(e.metadata?.size??e.data?.size??0)<=1048576,y=!h&&e.schema!==`data/schema/file`&&!!(g.preview||g.subtitle),{replicating:b}=Hi(e),{blobUrl:x,loading:S}=s_(n??``,e.id,768,{enabled:h,blobFallback:p,version:e.checksumArray?.[0]??null}),C=n=>{let i=n.ctrlKey||n.metaKey;if(n.shiftKey&&r){n.preventDefault(),r(e.id,!0,i,!0);return}r&&r(e.id,!i||!t,i),i||(d&&f?window.open(f,`_blank`,`noopener,noreferrer`):u(!0))},w=n=>{n.preventDefault(),n.stopPropagation(),r&&!t&&r(e.id,!0,!1),a?.(n,e.id)};return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{tabIndex:0,"data-document-id":e.id,"aria-selected":!!t,onKeyDown:n=>Fb(n,()=>d&&f?window.open(f,`_blank`,`noopener,noreferrer`):u(!0),()=>r?.(e.id,!t,!0)),className:`group relative mb-3 flex break-inside-avoid flex-col overflow-hidden rounded-(--card-radius) border transition cursor-pointer outline-none hover:shadow-elevation-2 focus-visible:ring-2 focus-visible:ring-ring ${b?`opacity-60`:``} ${t?`ring-2 ring-info border-info`:``}`,onClick:C,onMouseDown:e=>{e.shiftKey&&e.preventDefault()},...c,onContextMenu:w,draggable:!0,onDragStart:t=>s?.(t,e.id),title:g.title,children:[(0,Q.jsx)(`input`,{type:`checkbox`,className:`absolute left-2 top-2 z-10 h-4 w-4 cursor-pointer accent-primary ${t?``:`reveal-on-hover`}`,checked:t,onClick:t=>{t.stopPropagation(),r?.(e.id,t.currentTarget.checked,!0,t.shiftKey)},onChange:()=>{}}),(0,Q.jsxs)(`div`,{className:`relative w-full bg-muted/40 ${h&&x||y||v&&n||m&&n?``:`aspect-square`}`,children:[h&&S&&(0,Q.jsx)(`div`,{className:`absolute inset-0 animate-pulse bg-muted/60`}),h&&x?(0,Q.jsx)(`img`,{src:x,alt:g.title,loading:`lazy`,className:`block h-auto w-full`}):m&&n?(0,Q.jsx)(Vb,{workspaceId:n,documentId:e.id,fallback:(0,Q.jsx)(`div`,{className:`flex aspect-square w-full items-center justify-center`,children:(0,Q.jsx)(Fm,{document:e,size:10,chip:!0})})}):v&&n?(0,Q.jsx)(Hb,{document:e,workspaceId:n,markdown:_===`markdown`},`${n}:${e.id}:${e.checksumArray?.[0]??``}`):y?(0,Q.jsxs)(`div`,{className:`flex min-h-28 w-full flex-col gap-1.5 overflow-hidden bg-card p-3 pt-7 text-left`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(Fm,{document:e}),(0,Q.jsx)(`span`,{className:`min-w-0 truncate text-[10px] uppercase tracking-wide text-muted-foreground`,children:g.schemaLabel})]}),(0,Q.jsx)(`div`,{className:`line-clamp-2 text-sm font-semibold leading-snug`,children:g.title}),g.subtitle&&(0,Q.jsx)(`div`,{className:`truncate text-[11px] text-info`,children:g.subtitle}),(0,Q.jsx)(`p`,{className:`line-clamp-[8] text-xs leading-relaxed text-muted-foreground`,children:g.preview})]}):(0,Q.jsx)(`div`,{className:`flex h-full w-full items-center justify-center`,children:(0,Q.jsx)(Fm,{document:e,size:10,chip:!0})}),(0,Q.jsxs)(`div`,{className:`absolute right-2 top-2 flex gap-1 reveal-on-hover`,children:[i&&(0,Q.jsx)(`button`,{onClick:t=>{t.stopPropagation(),i(e)},className:`rounded-sm bg-scrim p-1 text-scrim-foreground`,title:`Open to the side`,children:(0,Q.jsx)(Qe,{className:`h-3.5 w-3.5`})}),o&&(0,Q.jsx)(`button`,{onClick:t=>{t.stopPropagation(),o(t.currentTarget,e.id)},className:`rounded-sm bg-scrim p-1 text-scrim-foreground`,title:`Actions`,"aria-label":`Document actions`,"aria-haspopup":`menu`,children:(0,Q.jsx)($t,{className:`h-3.5 w-3.5`})})]})]}),!y&&(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5 border-t bg-card px-2 py-1.5`,children:[(0,Q.jsx)(`span`,{className:`truncate text-xs font-medium`,title:g.title,children:g.title}),g.isExternal&&(0,Q.jsx)(Ut,{className:`h-3 w-3 shrink-0 text-muted-foreground`})]})]}),(0,Q.jsx)(By,{document:e,isOpen:l,onClose:()=>u(!1),workspaceId:n})]})}function Wb(e,t,n,r,i){let[a,o]=(0,Z.useState)(!1),s=e=>Array.from(e.dataTransfer.types).includes(`application/json`);return{over:a,onDragOver:e=>{!t||!s(e)||(e.preventDefault(),e.dataTransfer.dropEffect=`link`,a||o(!0))},onDragLeave:()=>o(!1),onDrop:async a=>{if(o(!1),!t||!s(a))return;a.preventDefault(),a.stopPropagation();let c=null;try{c=JSON.parse(a.dataTransfer.getData(`application/json`))}catch{c=null}if(!(c?.type!==`document`||!Array.isArray(c.documentIds)||c.documentIds.length===0)&&!sg(c,i,r,e.path))try{await t(e.path,c.documentIds,{move:!1,sourcePath:c.sourcePath??n,sourceTreeName:c.sourceTreeName??r})}catch{}}}}function Gb(e,t,n){e.stopPropagation(),!(t.isParent||!n)&&(e.preventDefault(),n(t.path,e))}function Kb({folder:e,className:t=`h-4 w-4`}){if(e.isParent)return(0,Q.jsx)(cr,{className:`${t} text-muted-foreground`});let n=e.color?{color:e.color}:void 0;return(0,Q.jsx)(et,{className:`${t} ${e.color?``:`text-warning`}`,style:n})}var qb=e=>e.isParent?`Parent folder`:e.label&&e.label!==e.name?`${e.label} (${e.name})`:e.name;function Jb({folder:e,onOpen:t,onMenu:n,onPasteDocuments:r,contextPath:i,treeName:a,workspaceId:o}){let s=Wb(e,r,i,a,o);return(0,Q.jsxs)(`button`,{type:`button`,title:qb(e),onClick:()=>t?.(e.path),onContextMenu:t=>Gb(t,e,n),onDragOver:s.onDragOver,onDragLeave:s.onDragLeave,onDrop:s.onDrop,className:`folder-surface group flex min-w-0 max-w-full items-center gap-2 rounded-md border px-2.5 py-1.5 text-sm transition-colors hover:bg-accent ${s.over?`ring-2 ring-info border-info bg-accent`:``} ${e.isParent?`text-muted-foreground`:``}`,children:[(0,Q.jsxs)(`span`,{className:`relative shrink-0`,children:[(0,Q.jsx)(Kb,{folder:e,className:`h-4 w-4 group-hover:hidden`}),e.isParent?(0,Q.jsx)(cr,{className:`hidden h-4 w-4 group-hover:block`}):(0,Q.jsx)(it,{className:`hidden h-4 w-4 group-hover:block`,style:e.color?{color:e.color}:void 0})]}),(0,Q.jsx)(`span`,{className:`truncate`,children:e.isParent?`..`:e.label||e.name}),!e.isParent&&!!e.childCount&&(0,Q.jsx)(`span`,{className:`shrink-0 text-[11px] tabular-nums text-muted-foreground`,children:e.childCount})]})}function Yb({folder:e,onOpen:t,onMenu:n,onPasteDocuments:r,contextPath:i,treeName:a,workspaceId:o}){let s=Wb(e,r,i,a,o),c=e.color?{color:e.color}:void 0;return(0,Q.jsxs)(`button`,{type:`button`,title:qb(e),onClick:()=>t?.(e.path),onContextMenu:t=>Gb(t,e,n),onDragOver:s.onDragOver,onDragLeave:s.onDragLeave,onDrop:s.onDrop,className:`folder-surface group flex min-w-0 flex-col items-center gap-1.5 rounded-(--card-radius) border px-2 py-3 text-sm transition hover:bg-accent hover:shadow-elevation-2 ${s.over?`ring-2 ring-info border-info bg-accent`:``} ${e.isParent?`text-muted-foreground`:``}`,children:[(0,Q.jsx)(`span`,{className:`relative flex h-14 w-14 items-center justify-center`,children:e.isParent?(0,Q.jsx)(cr,{className:`h-10 w-10`,strokeWidth:1.5}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(et,{className:`h-14 w-14 group-hover:hidden ${e.color?``:`text-warning`}`,strokeWidth:1.25,fill:`currentColor`,fillOpacity:.18,style:c}),(0,Q.jsx)(it,{className:`hidden h-14 w-14 group-hover:block ${e.color?``:`text-warning`}`,strokeWidth:1.25,fill:`currentColor`,fillOpacity:.18,style:c})]})}),(0,Q.jsx)(`span`,{className:`w-full truncate text-center font-medium`,children:e.isParent?`..`:e.label||e.name}),!e.isParent&&!!e.childCount&&(0,Q.jsxs)(`span`,{className:`text-[11px] tabular-nums text-muted-foreground`,children:[e.childCount,` subfolder`,e.childCount===1?``:`s`]})]})}function Xb({folders:e,onOpen:t,onMenu:n,onPasteDocuments:r,contextPath:i,treeName:a,workspaceId:o}){return e.length===0?null:(0,Q.jsx)(`div`,{className:`mb-4 grid grid-cols-[repeat(auto-fill,minmax(120px,1fr))] gap-3 pr-2`,onContextMenu:e=>e.stopPropagation(),children:e.map(e=>(0,Q.jsx)(Yb,{folder:e,onOpen:t,onMenu:n,onPasteDocuments:r,contextPath:i,treeName:a,workspaceId:o},e.path))})}function Zb({folders:e,onOpen:t,onMenu:n,onPasteDocuments:r,contextPath:i,treeName:a,workspaceId:o}){return e.length===0?null:(0,Q.jsx)(`div`,{className:`mb-3 flex flex-wrap gap-2 pr-2`,onContextMenu:e=>e.stopPropagation(),children:e.map(e=>(0,Q.jsx)(Jb,{folder:e,onOpen:t,onMenu:n,onPasteDocuments:r,contextPath:i,treeName:a,workspaceId:o},e.path))})}function Qb({folder:e,onOpen:t,onMenu:n,onPasteDocuments:r,contextPath:i,treeName:a,workspaceId:o}){let s=Wb(e,r,i,a,o);return(0,Q.jsxs)(xg,{"data-selection-ignore":``,className:`cursor-pointer ${s.over?`bg-accent ring-1 ring-inset ring-info`:``} ${e.isParent?`text-muted-foreground`:``}`,onClick:()=>t?.(e.path),onContextMenu:t=>Gb(t,e,n),onDragOver:s.onDragOver,onDragLeave:s.onDragLeave,onDrop:s.onDrop,title:qb(e),children:[(0,Q.jsx)(Cg,{className:`w-10`}),(0,Q.jsx)(Cg,{className:`w-12`,children:(0,Q.jsx)(Kb,{folder:e})}),(0,Q.jsx)(Cg,{className:`w-full max-w-0 md:w-auto md:max-w-none`,children:(0,Q.jsx)(`span`,{className:`block truncate font-medium`,children:e.isParent?`..`:e.label||e.name})}),(0,Q.jsx)(Cg,{className:`hidden md:table-cell text-xs text-muted-foreground`,children:e.isParent?``:`Folder`}),(0,Q.jsx)(Cg,{className:`hidden lg:table-cell`}),(0,Q.jsx)(Cg,{className:`hidden lg:table-cell`}),(0,Q.jsx)(Cg,{className:`hidden sm:table-cell text-xs text-muted-foreground`,children:!e.isParent&&e.childCount?`${e.childCount} subfolder${e.childCount===1?``:`s`}`:``}),(0,Q.jsx)(Cg,{className:`w-12 md:w-auto`})]})}function $b({label:e,count:t,collapsed:n,allSelected:r,someSelected:i,onToggle:a,onSelectAll:o}){return(0,Q.jsxs)(`div`,{className:`sticky top-0 z-10 -mx-1 mb-2 flex items-center gap-2 bg-background/95 px-1 py-1.5 backdrop-blur-sm`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,className:`h-3.5 w-3.5 cursor-pointer accent-primary ${r||i?``:`reveal-on-hover`}`,checked:r,ref:e=>{e&&(e.indeterminate=i&&!r)},onChange:e=>o(e.target.checked),title:`Select everything in "${e}"`,onClick:e=>e.stopPropagation()}),(0,Q.jsxs)(`button`,{type:`button`,onClick:a,"aria-expanded":!n,className:`flex min-w-0 items-center gap-1.5 text-left text-muted-foreground transition-colors hover:text-foreground`,children:[(0,Q.jsx)(gr,{className:`h-3.5 w-3.5 shrink-0 transition-transform ${n?``:`rotate-90`}`}),(0,Q.jsx)(`span`,{className:`truncate text-xs font-semibold uppercase tracking-wide`,children:e}),(0,Q.jsx)(`span`,{className:`shrink-0 text-xs font-normal tabular-nums opacity-70`,children:t})]}),(0,Q.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}function ex({externalSearchQuery:e,toolbarActions:t,documents:n,isLoading:r,contextPath:i,treeName:a,workspaceId:o,totalCount:s,onRemoveDocument:c,onDeleteDocument:l,onDestroyDocument:u,onRemoveDocuments:d,onDeleteDocuments:f,onDestroyDocuments:p,onCopyDocuments:m,onCutDocuments:h,onPasteDocuments:g,onImportDocuments:v,onSelectionChange:y,pastedDocumentIds:b,viewMode:x=`card`,allowViewToggle:S=!1,activeContextUrl:C,currentContextUrl:w,currentPage:T=1,pageSize:D=50,onPageChange:O,onPageSizeChange:k,onPurgeDocuments:j,disablePurgeDocuments:M=!1,backendSearchQueries:N=[],onBackendSearch:P,onRemoveBackendQuery:ee,serverSort:F,onServerSortChange:I,scope:L=`path`,onScopeChange:R,canSaveChanges:te=!1,isSavingChanges:z=!1,onSaveChanges:ne,linkTree:V,folders:ie,onOpenFolder:ae}){let[oe,H]=(0,Z.useState)(()=>{if(!S)return x;try{let e=localStorage.getItem(`doclist:view`);if(e===`card`||e===`table`||e===`tile`)return e}catch{}return x}),se=S?oe:x,ce=(0,Z.useCallback)(e=>{H(e);try{localStorage.setItem(`doclist:view`,e)}catch{}},[]),[U,le]=(0,Z.useState)(()=>{try{return localStorage.getItem(`doclist:groupdates`)!==`off`}catch{return!0}}),ue=(0,Z.useCallback)(()=>{le(e=>{let t=!e;try{localStorage.setItem(`doclist:groupdates`,t?`on`:`off`)}catch{}return t})},[]),[de,fe]=(0,Z.useState)(new Set),pe=(0,Z.useCallback)(e=>{fe(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),[me,he]=(0,Z.useState)(new Set),[ge,ye]=(0,Z.useState)(null),[G,K]=(0,Z.useState)(null),be=$o(),xe=!!(be&&o),Se=(0,Z.useCallback)((e,t=!1)=>{if(!be||!o)return;let r=e.map(e=>n.find(t=>t.id===e)).filter(e=>!!e);r.length!==0&&be.openAddRelated({workspaceName:o,documents:r},t)},[be,o,n]),[Ce,Te]=(0,Z.useState)(!1),[Ee,De]=(0,Z.useState)(null),[Oe,ke]=(0,Z.useState)(!1),[Ae,je]=(0,Z.useState)(null),[Me,Ne]=(0,Z.useState)(!1),Pe=(0,Z.useRef)(!1),Le=(0,Z.useRef)(!1),Re=a===`backends`&&L===`path`?Qf(i):null;(0,Z.useEffect)(()=>()=>{Pe.current=!0},[]);let[ze,Be]=(0,Z.useState)(!1),[He,Ue]=(0,Z.useState)(null),[We,Ge]=(0,Z.useState)(!1),[Ke,qe]=(0,Z.useState)(null),Je=Ao()==null&&!!o,[Ye,Ze]=(0,Z.useState)(null),[et,tt]=(0,Z.useState)(null),nt=!!(V&&g),it=!!o,{showSuccessToast:at,showErrorToast:ot}=Gr(),{showProgress:st}=Hr(),ct=gg(),lt=o?e=>ct.open(e,o):void 0,ut=L===`workspace`,dt=ut?void 0:c,ft=ut?void 0:d,[pt,mt]=(0,Z.useState)(!1),[ht,gt]=(0,Z.useState)(!1),[_t,vt]=(0,Z.useState)(``),yt=e??_t,bt=e!==void 0,[xt,St]=(0,Z.useState)(!1),wt=N.length>0,Tt=(0,Z.useRef)(null),Et=(0,Z.useCallback)(()=>{vt(``),Tt.current&&(Tt.current.value=``)},[]);(0,Z.useEffect)(()=>{if(!S||window.matchMedia(`(max-width: 767px)`).matches)return;let e=Tt.current;if(!e)return;let t=setTimeout(()=>{let t=window.document.activeElement;t&&t!==window.document.body||e.focus()},60);return()=>clearTimeout(t)},[S]);let Ot=JSON.stringify([o,a,i]),[kt,At]=(0,Z.useState)(Ot);Ot!==kt&&(At(Ot),he(new Set),De(null),K(null),ye(null)),(0,Z.useEffect)(()=>{y?.(Array.from(me))},[me,y]);let jt=(0,Z.useCallback)(()=>{if(!P)return;let e=yt.trim();e&&(P(e),Et())},[P,yt,Et]),Mt=(0,Z.useCallback)(()=>{Et(),ee&&N.length>0&&ee(-1)},[ee,N.length,Et]),Nt=(0,Z.useCallback)((e,t)=>{let n;me.has(t)&&me.size>1?n=Array.from(me):(n=[t],he(new Set([t])));let r={type:`document`,documentIds:n,sourcePath:L===`path`?i:void 0,sourceTreeName:a,sourceWorkspaceId:o};e.dataTransfer.setData(`application/json`,JSON.stringify(r)),e.dataTransfer.effectAllowed=`copyMove`,e.dataTransfer.setDragImage(e.currentTarget,0,0)},[me,i,a,o,L]),Pt=(0,Z.useCallback)(async e=>{if(!g)return;let t=e.dataTransfer.getData(`application/json`);if(!t)return;let n=null;try{n=JSON.parse(t)}catch{return}n?.type!==`document`||!Array.isArray(n.documentIds)||n.documentIds.length===0||(e.preventDefault(),e.stopPropagation(),St(!1),!sg(n,o,a,i)&&(await g(i,n.documentIds,{move:e.shiftKey,sourcePath:n.sourcePath,sourceTreeName:n.sourceTreeName}),he(new Set)))},[i,a,o,g]),Ft=(0,Z.useCallback)(e=>{g&&Array.from(e.dataTransfer.types).includes(`application/json`)&&(e.preventDefault(),e.dataTransfer.dropEffect=e.shiftKey?`move`:`copy`,St(!0))},[g]),It=(0,Z.useCallback)(e=>{e.currentTarget.contains(e.relatedTarget)||St(!1)},[]),Lt=(0,Z.useMemo)(()=>({keys:[{name:`data.title`,weight:.4},{name:`data.name`,weight:.4},{name:`locations.url`,weight:.4},{name:`data.url`,weight:.3},{name:`data.content`,weight:.2},{name:`data.description`,weight:.2}],threshold:.4,location:0,distance:100,minMatchCharLength:1,includeScore:!0,includeMatches:!0,ignoreLocation:!0}),[]),Rt=(0,Z.useMemo)(()=>n.length===0?null:new Zo(n,Lt),[n,Lt]),zt=(0,Z.useDeferredValue)(yt),Bt=(0,Z.useMemo)(()=>{if(!zt.trim())return n;let{text:e,ids:t,invalid:r}=xp(zt);if(r)return[];let i=e&&Rt?Rt.search(e).map(e=>e.item):n;return t.length?i.filter(e=>t.every(t=>e.id===t)):i},[n,zt,Rt]),Vt=(0,Z.useMemo)(()=>{if(!ie||ie.length===0||zt.trim())return[];let e=F?.order===`desc`?-1:1;return[...ie].sort((t,n)=>Number(!!n.isParent)-Number(!!t.isParent)||(t.label||t.name).localeCompare(n.label||n.name,void 0,{numeric:!0,sensitivity:`base`})*e)},[ie,zt,F?.order]),Ht=Vt.length>0,[Wt,Gt]=(0,Z.useState)(null),Kt=(0,Z.useMemo)(()=>o&&a&&ae?(e,t)=>Gt({x:t.clientX,y:t.clientY,path:e}):void 0,[o,a,ae]),Yt={folders:Vt,onOpen:ae,onMenu:Kt,onPasteDocuments:g,contextPath:i,treeName:a,workspaceId:o},{sorted:Xt,sort:Zt,toggleSort:$t}=Eg(Bt,(0,Z.useMemo)(()=>({title:e=>Ni(e).title?.toLowerCase()??``,schema:e=>Ni(e).schemaLabel??``,type:ri,id:e=>e.id,created:e=>Date.parse(e.createdAt)||0}),[])),en=(0,Z.useCallback)(e=>{let t=F?.sortBy===`crud:updated`?e.updatedAt:e.createdAt,n=Date.parse(t??``);return Number.isNaN(n)?null:n},[F?.sortBy]),tn=(0,Z.useMemo)(()=>lb(Bt,en,F?.order===`asc`?`asc`:`desc`),[Bt,en,F?.order]),nn=U&&!Gi(F?.sortBy)&&tn.length>1,rn=(0,Z.useCallback)((e,t)=>{he(n=>{let r=new Set(n);for(let n of e)t?r.add(n):r.delete(n);return r})},[]),an=(0,Z.useMemo)(()=>(se===`table`?Xt:nn?tn.filter(e=>!de.has(e.key)).flatMap(e=>e.items):Bt).map(e=>e.id),[se,Xt,nn,tn,de,Bt]),on=(0,Z.useRef)(null),sn=JSON.stringify([o,i,a,T]),ln=(0,Z.useCallback)(e=>{on.current=null,he(t=>t.size===e.size&&[...t].every(t=>e.has(t))?t:e)},[]),un=(0,Z.useCallback)((e,t,n,r=!1)=>{let i=on.current,a=i?.scope===sn&&an.includes(i.id)?i.id:null;(!r||a===null)&&(on.current={scope:sn,id:e}),he(i=>{if(r)return Tp(an,a,e,i,n);let o=n?new Set(i):new Set;return t?o.add(e):o.delete(e),o})},[sn,an]),dn=(0,Z.useCallback)((e,t)=>{let n;me.has(e)?n=Array.from(me):(n=[e],he(new Set([e]))),ye({anchor:t,ids:n})},[me]),pn=(0,Z.useCallback)((e,t)=>{dn(t,$p(e))},[dn]),mn=(0,Z.useCallback)((e,t)=>{e.target.closest?.(`[role="dialog"]`)||(e.preventDefault(),e.stopPropagation(),dn(t,Nb(e)))},[dn]),hn=(0,Z.useCallback)(async(e,t)=>{if(t.length!==0&&e.targetIds.length!==0){Te(!0);try{for(let n of t)await go(o,n,e.predicate,e.targetIds,e.direction);let n=t.length*e.targetIds.length;at(`Created ${n} relation${n===1?``:`s`}`),Og(),K(null)}catch(e){ot(e instanceof Error?e.message:`Failed to create relations`)}finally{Te(!1)}}},[o,at,ot]),gn=(0,Z.useCallback)(async(e,t,n)=>{if(g){for(let r of e)await g(r,t,{move:!1,targetTreeName:n?.treeName,targetTreeType:n?.treeType});he(new Set)}},[g]),_n=(0,Z.useCallback)(async(e,t,r)=>{if(!o||!Ee||Le.current)return;Le.current=!0,Pe.current=!1,Ne(!1),ke(!0);let i=st({title:t===`delete`?`Deleting…`:t===`move`?`Moving…`:`Copying…`,description:`${Ee.ids.length} document(s) · ${e.join(`, `)}`});try{let a=n=>Ca(o,n,{to:e,mode:t,keepDocument:r.keepDocument,...t===`delete`&&Re?{deleteFrom:{backend:Re.backend,folder:Re.rel}}:{},folder:r.folder,filename:r.filename,onConflict:r.onConflict}),s=t===`delete`?await If(Ee.ids,a,{shouldStop:()=>Pe.current,onProgress:(t,n)=>{je({completed:t,total:n}),i.update({title:`Deleting…`,description:`${t} / ${n} document(s) · ${e.join(`, `)}`})}}):{...await a(Ee.ids),pending:[]},c=s.successful.filter(e=>e.transfers?.every(e=>e.state===`unchanged`)).length,l=s.successful.filter(e=>e.transfers?.some(e=>e.state===`pending`)).length,u=s.successful.length-c-l,d=s.failed.length,f=t===`delete`?`Deleted from`:t===`move`?`Moved to`:`Copied to`,p=e.join(`, `),m=[c?`${c} already there`:null,l?`${l} queued for backend sync`:null,d?`${d} skipped`:null,s.pending.length?`${s.pending.length} not processed`:null].filter(Boolean).join(` · `),h=`${f} ${p}: ${u} document${u===1?``:`s`}${m?` · ${m}`:``}`;d>0?(i.fail({title:`Operation incomplete`,description:`${h}. ${Sp(s.failed,new Map(n.map(e=>[e.id,Ni(e).title])))}`,variant:`destructive`}),console.warn(`Backend transfer skipped documents:`,s.failed)):i.done({title:s.pending.length?`Operation stopped`:l?`Transfer queued`:`Operation complete`,description:h}),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`));let g=[...s.failed.map(e=>e.id),...s.pending];De(g.length?{ids:g,mode:t}:null),he(new Set(g))}catch(e){i.fail({title:`Operation failed`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{Le.current=!1,ke(!1),je(null)}},[o,Ee,Re,n,st]),bn=(0,Z.useCallback)(()=>{me.size===Bt.length?he(new Set):he(new Set(Bt.map(e=>e.id)))},[me.size,Bt]),xn=(0,Z.useCallback)(async e=>{try{await navigator.clipboard.writeText(e)}catch{let t=window.document.createElement(`textarea`);t.value=e,window.document.body.appendChild(t),t.select(),window.document.execCommand(`copy`),window.document.body.removeChild(t)}},[]),Sn=e=>{if(e.length===0)return[];let t=e.length,r=t>1?` (${t})`:``,i=t===1?n.find(t=>t.id===e[0]):void 0,o=()=>he(new Set),s=e.some(e=>(n.find(t=>t.id===e)?.locations?.length??0)>0),c=[],d=e=>{e&&c.push(e)};if(i){let e=i.schema===`data/schema/tab`?i.data.url:null;d({id:`view`,group:`open`,label:`View details`,icon:Zn,run:()=>tt({document:i})}),d(ay(i)&&Je&&{id:`edit`,group:`open`,label:`Edit`,icon:ve,run:()=>tt({document:i,edit:!0})}),d(e&&{id:`open-url`,group:`open`,label:`Open URL`,icon:Ut,run:()=>{window.open(e,`_blank`,`noopener,noreferrer`)}}),d(lt&&{id:`open-side`,group:`open`,label:`Open to the side`,icon:Qe,run:()=>lt(i)})}return d(m&&{id:`copy`,group:`clipboard`,label:`Copy${r}`,icon:A,shortcut:`Mod+C`,run:()=>m(e)}),d(h&&{id:`cut`,group:`clipboard`,label:`Cut${r}`,icon:Dt,shortcut:`Mod+X`,run:()=>h(e)}),d(i&&{id:`copy-id`,group:`clipboard`,label:`Copy ID`,icon:vn,run:()=>xn(String(i.id))}),d(i&&Je&&{id:`create-rule`,group:`organize`,label:`Create rule…`,icon:On,run:()=>Ze(i)}),d(nt&&{id:`link-to`,group:`organize`,label:`Link to…${r}`,icon:Qt,run:()=>K(e)}),d(xe&&{id:`add-related`,group:`organize`,label:`Add related document…${r}`,icon:cn,run:t=>Se(e,t?.shiftKey)}),d(Je&&{id:`bulk-edit`,group:`organize`,label:`Bulk edit…${r}`,icon:ve,run:()=>qe(e)}),d(Je&&{id:`copy-workspace`,group:`organize`,label:`Copy to workspace…`,icon:A,run:t=>{Ge(!!t?.shiftKey),Ue(e)}}),d({id:`export`,group:`organize`,label:`Export…${r}`,icon:Jt,run:()=>mt(!0)}),d(a!==`backends`&&(dt||ft)&&{id:`remove`,group:`remove`,label:`Remove (unlink) from folder${r}`,icon:re,shortcut:`Delete`,hint:`Unlinks from this folder; the document stays in the index`,run:()=>{t===1&&dt?dt(e[0]):ft?.(e),o()}}),d(a!==`backends`&&(l||f)&&{id:`delete`,group:`remove`,label:`Delete from index${r}`,icon:rt,destructive:!0,hint:`Removes the document from the index entirely; file data stays on its backend(s)`,run:()=>{t===1&&l?l(e[0]):f?.(e),o()}}),s&&it?(d({id:`backend-copy`,group:`backends`,groupLabel:`Backends`,label:`Copy to backend…${r}`,icon:Fe,hint:`Copy the file data to another storage backend (keeps the existing copies)`,run:()=>De({ids:e,mode:`copy`})}),d({id:`backend-move`,group:`backends`,label:`Move to backend…${r}`,icon:fn,hint:`Move the file data to another storage backend (source released once the copy is durable)`,run:()=>De({ids:e,mode:`move`})}),d({id:`backend-delete`,group:`backends`,label:`Delete from backend…${r}`,icon:rt,destructive:!0,hint:`Delete the file data from selected backends (copies elsewhere are kept)`,run:()=>De({ids:e,mode:`delete`})})):s&&(u||p)&&d({id:`destroy`,group:`backends`,label:`Delete from backend(s)${r}`,icon:rt,destructive:!0,hint:`Deletes the document and its file data from the storage backend(s)`,run:()=>{t===1&&u?u(e[0]):p?.(e),o()}}),c},Cn=()=>{let e=[],t=t=>{t&&e.push(t)},r=b??[];return t(g&&r.length>0&&{id:`paste`,group:`clipboard`,label:`Paste (${r.length})`,icon:we,shortcut:`Mod+V`,run:async()=>{try{await g(i,r)}catch(e){console.error(`Failed to paste documents:`,e)}}}),t(Bt.length>0&&{id:`select-all`,group:`select`,label:yt?`Select all matches (${Bt.length})`:`Select all on this page`,icon:Ct,shortcut:`Mod+A`,run:()=>he(new Set(Bt.map(e=>e.id)))}),t(me.size>0&&{id:`select-none`,group:`select`,label:`Clear selection`,icon:Bn,run:()=>he(new Set)}),t(g&&{id:`add-existing`,group:`add`,label:`Add existing documents…`,icon:Dn,hint:`Browse and add existing documents to this folder`,run:()=>Be(!0)}),t(v&&{id:`import`,group:`add`,label:`Import…`,icon:$e,run:()=>gt(!0)}),t(n.length>0&&{id:`export-all`,group:`add`,label:`Export all…`,icon:Jt,run:()=>{he(new Set),mt(!0)}}),t(j&&s>0&&{id:`purge`,group:`purge`,label:`Purge all (${s})`,icon:rt,destructive:!0,disabled:M||!!yt,hint:yt?`Purge is disabled while local search is active`:M?`Purge requires loaded server results with no browser-only or live selection`:`Delete all documents matching the current server-side filters across all pages`,run:j}),e},wn=!!(I&&F&&o),Tn=ge?ge.ids?Sn(ge.ids):Cn():[],En=ge?.ids?.length===1?n.find(e=>e.id===ge.ids[0]):void 0,kn=En?(0,Q.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,Q.jsx)(Fm,{document:En,chip:!0}),(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`div`,{className:`truncate text-base font-semibold`,children:Ni(En).title}),(0,Q.jsxs)(`div`,{className:`truncate text-xs text-muted-foreground`,children:[`ID: `,En.id,` · `,En.schema]})]})]}):(0,Q.jsx)(`div`,{className:`truncate text-base font-semibold`,children:ge?.ids?`${ge.ids.length} documents`:`This folder`}),An=e=>{ye({anchor:$p(e.currentTarget),ids:me.size>0?Array.from(me):null})},jn=e=>{e.target.closest?.(`[role="dialog"]`)||(e.preventDefault(),e.stopPropagation(),he(new Set),ye({anchor:Nb(e),ids:null}))},Mn=e=>{if(e.defaultPrevented||Yp(e.target))return;let t=e.target.closest?.(`[data-document-id]`)??null;if(Zp(e)){e.preventDefault(),t?dn(Number(t.dataset.documentId),$p(t,`inside`)):ye({anchor:$p(e.target,`inside`),ids:me.size>0?Array.from(me):null});return}if(e.key===`ArrowDown`||e.key===`ArrowUp`){let n=Array.from(e.currentTarget.querySelectorAll(`[data-document-id]`));if(n.length===0)return;let r=t?n.indexOf(t):-1,i=n[e.key===`ArrowDown`?Math.min(r+1,n.length-1):Math.max(r-1,0)];e.preventDefault(),i.focus({preventScroll:!0}),i.scrollIntoView({block:`nearest`}),e.shiftKey&&un(Number(i.dataset.documentId),!0,!1,!0);return}if(e.key===`Escape`&&me.size>0){e.preventDefault(),he(new Set);return}Xp(e,[...Sn(Array.from(me)),...Cn()])},Nn=(0,Z.useCallback)(async e=>{if(!v)return!1;try{return await v(e,i)}catch(e){return console.error(`Failed to import documents:`,e),!1}},[v,i]),Pn=e=>nn?tn.map(t=>{let n=de.has(t.key),r=t.items.map(e=>e.id),i=r.reduce((e,t)=>e+ +!!me.has(t),0);return(0,Q.jsxs)(`section`,{className:`group mb-4`,children:[(0,Q.jsx)($b,{label:t.label,count:t.items.length,collapsed:n,allSelected:i===r.length,someSelected:i>0,onToggle:()=>pe(t.key),onSelectAll:e=>rn(r,e)}),!n&&e(t.items)]},t.key)}):e(Bt);return r?(0,Q.jsx)(`div`,{className:`flex-1 flex items-center justify-center`,children:(0,Q.jsxs)(`div`,{className:`text-center space-y-2`,children:[(0,Q.jsx)(`div`,{className:`animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading documents...`})]})}):(0,Q.jsxs)(`div`,{tabIndex:-1,onKeyDown:Mn,className:`flex-1 flex flex-col min-h-0 min-w-0 p-4 rounded-(--card-radius) outline-none transition-colors ${xt?`ring-2 ring-inset ring-primary bg-primary/5`:``}`,onDragOver:Ft,onDragLeave:It,onDrop:Pt,children:[(0,Q.jsxs)(`div`,{className:`border-b pb-3 mb-4 flex-shrink-0`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 space-y-0.5`,children:[(0,Q.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2`,children:[(0,Q.jsx)(`h3`,{className:`font-semibold text-sm text-muted-foreground`,children:`Documents`}),(0,Q.jsx)(`p`,{className:`shrink-0 text-sm font-medium`,children:yt?`${Bt.length} of ${n.length}`:`${s.toLocaleString()} document${s===1?``:`s`}`})]}),(0,Q.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-xs text-muted-foreground`,children:[(0,Q.jsxs)(`p`,{hidden:bt,className:`min-w-0 truncate`,children:[`Context: `,(0,Q.jsx)(`span`,{className:`font-mono`,children:i}),C&&w&&C!==w&&(0,Q.jsx)(`span`,{className:`text-warning ml-2`,children:`(not yet active)`})]}),(0,Q.jsxs)(`p`,{className:`shrink-0`,children:[me.size>0&&(0,Q.jsxs)(`span`,{className:`text-info`,children:[me.size,` selected`]}),me.size>0&&(yt||s>D)&&(0,Q.jsx)(`span`,{className:`mx-1`,children:`·`}),yt?`on this page`:s>D?`Showing ${Math.min((T-1)*D+1,s)}–${Math.min(T*D,s)}`:null]})]})]}),!bt&&(0,Q.jsxs)(`div`,{className:`mt-3 space-y-2`,children:[(0,Q.jsxs)(`div`,{className:`relative flex flex-wrap items-center gap-2`,children:[!bt&&R&&(0,Q.jsxs)(`div`,{className:`flex shrink-0 rounded-md border border-input overflow-hidden text-xs font-medium`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:()=>R(`path`),className:`px-2.5 py-2 transition-colors ${L===`path`?`bg-primary text-primary-foreground`:`bg-background text-muted-foreground hover:text-foreground hover:bg-muted`}`,title:`List documents in the selected path`,children:`This path`}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>R(`workspace`),className:`px-2.5 py-2 border-l border-input transition-colors flex items-center gap-1 ${L===`workspace`?`bg-primary text-primary-foreground`:`bg-background text-muted-foreground hover:text-foreground hover:bg-muted`}`,title:`List every document in the workspace (staging excluded)`,children:[(0,Q.jsx)(Xe,{className:`h-3.5 w-3.5`}),`Whole workspace`]})]}),!bt&&(0,Q.jsxs)(`div`,{className:`relative flex-1 min-w-[12rem]`,children:[(0,Q.jsx)(nr,{className:`absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none`}),(0,Q.jsx)(`input`,{ref:Tt,type:`text`,placeholder:P?wt?`Refine: add another query (Enter)…`:`Search documents (Enter for server search)…`:`Search documents...`,title:`Search text or an exact document ID, e.g. @id:101140. Press Enter to search the server.`,defaultValue:``,onChange:e=>vt(e.target.value),onFocus:e=>{let t=e.currentTarget;window.matchMedia(`(max-width: 767px)`).matches&&setTimeout(()=>t.scrollIntoView({block:`center`,behavior:`smooth`}),250)},onKeyDown:e=>{e.key===`Enter`&&P&&(e.preventDefault(),jt())},className:`w-full pl-10 pr-9 py-2 border border-input rounded-md bg-background text-sm placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent`}),(yt||wt)&&(0,Q.jsx)(`button`,{onClick:Mt,className:`absolute right-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground hover:text-foreground`,title:`Clear search`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),!bt&&P&&yt.trim()&&!N.includes(yt.trim())&&(0,Q.jsxs)(X,{size:`sm`,variant:`default`,onClick:jt,className:`shrink-0`,title:wt?`Refine: narrow the current results by this query`:`Run full-text search on the server`,children:[(0,Q.jsx)(nr,{className:`h-3.5 w-3.5 mr-1`}),wt?`Refine`:`Search server`]})]}),!bt&&wt&&(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 text-xs`,children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`Server search:`}),N.map((e,t)=>(0,Q.jsxs)(`span`,{className:`flex items-center gap-1`,children:[t>0&&(0,Q.jsx)(`span`,{className:`text-muted-foreground/70 font-medium uppercase text-[10px]`,children:`then`}),(0,Q.jsxs)(`span`,{className:`flex items-center gap-1 px-2 py-0.5 rounded bg-muted text-foreground border`,children:[(0,Q.jsxs)(`span`,{className:`font-mono`,children:[`"`,e,`"`]}),ee&&(0,Q.jsx)(`button`,{onClick:()=>ee(t),className:`text-muted-foreground hover:text-foreground`,title:`Remove this query`,children:(0,Q.jsx)(W,{className:`h-3 w-3`})})]})]},`${e}-${t}`)),ee&&N.length>1&&(0,Q.jsx)(`button`,{onClick:()=>ee(-1),className:`ml-1 text-muted-foreground hover:text-foreground underline`,title:`Clear all queries`,children:`clear all`})]})]}),(0,Q.jsx)(`div`,{className:`document-toolbar mt-3`,children:(0,Q.jsxs)(`div`,{className:`document-toolbar-row`,children:[(0,Q.jsxs)(`div`,{className:`document-toolbar-controls`,children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,role:`group`,"aria-label":`Document layout`,children:[S&&(0,Q.jsx)(`div`,{className:`flex shrink-0 items-center rounded-md border p-0.5 touch-target`,children:[[`table`,_,`Table view`],[`tile`,er,`Tile view`],[`card`,qt,`Card view`]].map(([e,t,n])=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>ce(e),title:n,"aria-pressed":se===e,className:`rounded-sm p-1.5 transition-colors focus-ring ${se===e?`bg-primary text-primary-foreground`:`text-muted-foreground hover:bg-accent/50`}`,children:(0,Q.jsx)(t,{className:`h-4 w-4`})},e))}),S&&se!==`table`&&!Gi(F?.sortBy)&&(0,Q.jsx)(`button`,{type:`button`,onClick:ue,title:U?`Grouping by date — click for a flat list`:`Group by date (Today, Yesterday, …)`,"aria-pressed":U,className:`touch-target shrink-0 rounded-md border p-1.5 transition-colors focus-ring ${U?`bg-primary text-primary-foreground`:`text-muted-foreground hover:bg-accent/50`}`,children:(0,Q.jsx)(B,{className:`h-4 w-4`})})]}),O&&s>0&&(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5`,children:[(0,Q.jsx)(`span`,{className:`document-toolbar-label`,children:`Show:`}),(0,Q.jsxs)(`select`,{value:D,onChange:e=>k?.(Number(e.target.value)),className:`h-control-sm rounded-(--input-radius) border-(length:--input-border-width) border-input bg-background px-2 text-sm focus-ring`,"aria-label":`Documents per page`,children:[(0,Q.jsx)(`option`,{value:25,children:`25`}),(0,Q.jsx)(`option`,{value:50,children:`50`}),(0,Q.jsx)(`option`,{value:100,children:`100`}),(0,Q.jsx)(`option`,{value:200,children:`200`})]}),(0,Q.jsx)(`span`,{className:`document-toolbar-label`,children:`per page`})]})]}),(0,Q.jsxs)(`div`,{className:`document-toolbar-secondary`,children:[wn&&(0,Q.jsxs)(`div`,{className:`document-toolbar-sort flex min-w-0 items-center gap-1.5`,children:[(0,Q.jsx)(`span`,{className:`document-toolbar-label`,children:`Sort`}),(0,Q.jsx)(eb,{workspaceId:o,value:F,onChange:I})]}),(0,Q.jsxs)(`div`,{className:`document-toolbar-actions`,children:[(n.length>0||v||g)&&(0,Q.jsxs)(`div`,{className:`contents`,children:[(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:An,"aria-haspopup":`menu`,"aria-label":me.size>0?`Actions (${me.size} selected)`:`Actions`,className:`document-toolbar-action-button flex items-center gap-1.5 touch-target`,title:`Actions (${qp(`Shift+F10`)} or right-click)`,children:[(0,Q.jsx)(yn,{className:`h-4 w-4`}),(0,Q.jsxs)(`span`,{className:`document-toolbar-action-label`,children:[`Actions`,me.size>0?` (${me.size} selected)`:``]})]}),me.size>0&&(0,Q.jsxs)(X,{variant:`ghost`,size:`sm`,onClick:()=>he(new Set),"aria-label":`Clear selection`,className:`document-toolbar-action-button touch-target`,title:`Clear selection (Esc)`,children:[(0,Q.jsx)(W,{className:`h-3.5 w-3.5`}),(0,Q.jsx)(`span`,{className:`document-toolbar-action-label`,children:`Clear`})]}),b&&b.length>0&&g&&(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:()=>g(i,b),className:`flex items-center gap-1.5`,title:`Paste into this folder (${qp(`Mod+V`)})`,children:[(0,Q.jsx)(we,{className:`h-4 w-4`}),`Paste (`,b.length,`)`]})]}),te&&ne&&(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:ne,disabled:z,className:`w-control-sm shrink-0 px-0 touch-target`,"aria-label":z?`Saving filters`:`Save current query and filters`,title:`Save current query and filters`,children:(0,Q.jsx)(Ve,{className:`h-3.5 w-3.5`})}),t]})]})]})}),O&&s>D&&(0,Q.jsxs)(`div`,{className:`document-pagination mt-3 flex min-w-0 flex-wrap items-center justify-end gap-2 border-t pt-3 max-sm:gap-0.5`,children:[(0,Q.jsxs)(`span`,{className:`text-sm text-muted-foreground max-md:hidden`,children:[`Showing `,Math.min((T-1)*D+1,s),` - `,Math.min(T*D,s),` of `,s]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-1 max-sm:gap-0.5`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,"aria-label":`First page`,onClick:()=>O(1),disabled:T===1,className:`p-1 touch-target`,children:(0,Q.jsx)(Ie,{className:`h-4 w-4`})}),(0,Q.jsx)(X,{variant:`outline`,size:`sm`,"aria-label":`Previous page`,onClick:()=>O(T-1),disabled:T===1,className:`p-1 touch-target`,children:(0,Q.jsx)(E,{className:`h-4 w-4`})}),(0,Q.jsxs)(`span`,{className:`whitespace-nowrap px-3 py-1 text-sm font-medium max-sm:px-1 max-sm:text-xs`,children:[(0,Q.jsx)(`span`,{className:`max-sm:sr-only`,children:`Page `}),T,(0,Q.jsx)(`span`,{className:`max-sm:hidden`,children:` of `}),(0,Q.jsx)(`span`,{className:`sm:hidden`,children:`/`}),Math.ceil(s/D)]}),(0,Q.jsx)(X,{variant:`outline`,size:`sm`,"aria-label":`Next page`,onClick:()=>O(T+1),disabled:T>=Math.ceil(s/D),className:`p-1 touch-target`,children:(0,Q.jsx)(gr,{className:`h-4 w-4`})}),(0,Q.jsx)(X,{variant:`outline`,size:`sm`,"aria-label":`Last page`,onClick:()=>O(Math.ceil(s/D)),disabled:T>=Math.ceil(s/D),className:`p-1 touch-target`,children:(0,Q.jsx)(_e,{className:`h-4 w-4`})})]})]})]}),(0,Q.jsx)(Uh,{scope:JSON.stringify([sn,se,an]),selected:me,onSelectionChange:ln,onContextMenu:jn,children:Bt.length===0&&!Ht?(0,Q.jsx)(`div`,{className:`min-h-full flex items-center justify-center`,children:(0,Q.jsxs)(`div`,{className:`text-center space-y-2`,children:[(0,Q.jsx)(zn,{className:`h-12 w-12 text-muted-foreground/50 mx-auto`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:yt?`No documents match your search`:`No documents found in this context`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:yt?(0,Q.jsxs)(Q.Fragment,{children:[`Search: `,(0,Q.jsxs)(`span`,{className:`font-mono`,children:[`"`,yt,`"`]})]}):(0,Q.jsxs)(Q.Fragment,{children:[`Path: `,(0,Q.jsx)(`span`,{className:`font-mono`,children:i})]})}),!bt&&yt&&(0,Q.jsx)(`button`,{onClick:Et,className:`text-xs text-primary hover:text-primary/80 underline mt-1`,children:`Clear search`}),!yt&&b&&b.length>0&&(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Right-click or press `,qp(`Mod+V`),` to paste `,b.length,` document(s)`]})]})}):se===`tile`?(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Xb,{...Yt}),Bt.length===0&&(0,Q.jsx)(`p`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`No documents in this folder`}),Pn(e=>(0,Q.jsx)(`div`,{className:`columns-[300px] gap-3 pr-2`,children:e.map(e=>(0,Q.jsx)(Ub,{document:e,isSelected:me.has(e.id),workspaceId:o,onSelect:un,onOpenToSide:lt,onRightClick:mn,onOpenActions:pn,onDragStart:Nt},e.id))}))]}):se===`table`?(0,Q.jsx)(`div`,{children:(0,Q.jsxs)(_g,{children:[(0,Q.jsx)(vg,{children:(0,Q.jsxs)(xg,{children:[(0,Q.jsx)(Sg,{className:`w-10`,children:(0,Q.jsx)(`input`,{type:`checkbox`,className:`h-4 w-4 cursor-pointer accent-primary align-middle`,checked:Bt.length>0&&me.size===Bt.length,ref:e=>{e&&(e.indeterminate=me.size>0&&me.size<Bt.length)},onChange:bn,title:`Select all on this page`})}),(0,Q.jsx)(Tg,{label:(0,Q.jsx)(`span`,{className:`max-md:sr-only`,children:`Type`}),sortKey:`type`,sort:Zt,onSort:$t,className:`w-12`}),(0,Q.jsx)(Tg,{label:`Title`,sortKey:`title`,sort:Zt,onSort:$t,className:`w-full max-w-0 md:w-auto md:max-w-none`}),(0,Q.jsx)(Tg,{label:`Schema`,sortKey:`schema`,sort:Zt,onSort:$t,className:`hidden md:table-cell`}),(0,Q.jsx)(Tg,{label:`ID`,sortKey:`id`,sort:Zt,onSort:$t,className:`hidden lg:table-cell`}),(0,Q.jsx)(Sg,{className:`hidden lg:table-cell`,children:`Checksum`}),(0,Q.jsx)(Tg,{label:`Created`,sortKey:`created`,sort:Zt,onSort:$t,className:`hidden sm:table-cell`}),(0,Q.jsx)(Sg,{className:`w-12 md:w-auto`,children:(0,Q.jsx)(`span`,{className:`max-md:sr-only`,children:`Actions`})})]})}),(0,Q.jsxs)(yg,{children:[Vt.map(e=>(0,Q.jsx)(Qb,{folder:e,onOpen:ae,onMenu:Kt,onPasteDocuments:g,contextPath:i,treeName:a,workspaceId:o},e.path)),Xt.map(e=>(0,Q.jsx)(Ib,{document:e,isSelected:me.has(e.id),workspaceId:o,onSelect:un,onOpenToSide:lt,onRightClick:mn,onOpenActions:pn,onDragStart:Nt},e.id))]})]})}):(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Zb,{...Yt}),Bt.length===0&&(0,Q.jsx)(`p`,{className:`py-6 text-center text-xs text-muted-foreground`,children:`No documents in this folder`}),Pn(e=>(0,Q.jsx)(`div`,{className:`space-y-3 pr-2`,children:e.map(e=>(0,Q.jsx)(`div`,{children:(0,Q.jsx)(Lb,{document:e,isSelected:me.has(e.id),workspaceId:o,onSelect:un,onOpenToSide:lt,onRightClick:mn,onOpenActions:pn,onDragStart:Nt})},e.id))}))]})}),ge&&(0,Q.jsx)(im,{anchor:ge.anchor,items:Tn,onClose:()=>ye(null),label:ge.ids?`Document actions`:`Folder actions`,header:kn}),(0,Q.jsx)(Ab,{isOpen:pt,onClose:()=>mt(!1),documents:n,selectedDocuments:me}),(0,Q.jsx)(jb,{isOpen:ht,onClose:()=>gt(!1),onImport:Nn}),He&&o&&(0,Q.jsx)(Gh,{modal:We,workspaceId:o,ids:He,onClose:()=>Ue(null)}),G&&V&&(0,Q.jsx)(Fp,{label:`Link to`,onClose:()=>K(null),children:(0,Q.jsx)(Jm,{sizeClassName:`h-full w-full rounded-none border-0 bg-popover text-popover-foreground shadow-none`,documentCount:G.length,fixedWorkspaceName:o,tabs:[`context`,`directory`,`relations`],saving:Ce,relationExcludeIds:new Set(G),onConfirm:(e,t)=>gn(e,G,t),onConfirmRelation:e=>hn(e,G),onClose:()=>K(null)})}),Ee&&o&&(0,Pp.createPortal)((0,Q.jsx)(`div`,{className:`fixed inset-0 z-picker flex items-center justify-center bg-scrim p-4 max-md:p-2`,children:(0,Q.jsx)(fg,{workspaceId:o,documentCount:Ee.ids.length,initialMode:Ee.mode,defaultFilename:Ee.ids.length===1?Zr(n.find(e=>e.id===Ee.ids[0])??{}):``,saving:Oe,progress:Ae,stopping:Me,onStop:()=>{Pe.current=!0,Ne(!0)},deleteFrom:Re?{backend:Re.backend,folder:Re.rel}:void 0,onConfirm:_n,onClose:()=>{Oe||De(null)}})}),window.document.body),ze&&g&&(0,Pp.createPortal)((0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`fixed inset-0 z-picker-scrim bg-scrim animate-fade-in md:hidden`,onClick:()=>Be(!1),"aria-hidden":!0}),(0,Q.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,Q.jsx)(pg,{sizeClassName:`h-full w-[420px] max-w-full max-md:w-full max-md:shadow-elevation-5`,fixedWorkspaceName:o,onConfirm:async e=>{await g(i,e),Be(!1)},onClose:()=>Be(!1)})})]}),window.document.body),Ye&&o&&(0,Q.jsx)(Lh,{workspaceId:o,document:Ye,onClose:()=>Ze(null)},`${o}:${Ye.id}`),Ke&&o&&(0,Q.jsx)(ag,{workspaceId:o,documentIds:Ke,onClose:()=>qe(null)}),(0,Q.jsx)(By,{document:et?.document??null,isOpen:!!et,onClose:()=>tt(null),workspaceId:o,initialEdit:et?.edit}),Wt&&o&&a&&ae&&(0,Q.jsx)(kb,{x:Wt.x,y:Wt.y,workspaceName:o,treeName:a,path:Wt.path,onClose:()=>Gt(null),onOpen:ae,onOpenToSide:e=>window.dispatchEvent(new CustomEvent(`workspace:open-to-side`,{detail:{workspaceName:o,treeName:a,path:e}})),pastedDocumentIds:b,onPasteDocuments:g?(e,t)=>g(e,t):void 0})]})}function tx(e,t){let n=typeof e.setCanvasQueries==`function`,[r,i]=(0,Z.useState)(e.canvasQueries??[]),a=(0,Z.useMemo)(()=>n?e.canvasQueries??[]:r,[n,e.canvasQueries,r]),o=(0,Z.useCallback)(r=>{n?e.setCanvasQueries(r):i(r),t?.()},[n,e,t]);return{queries:a,runSearch:(0,Z.useCallback)(e=>{let t=e.trim();!t||a.includes(t)||o([...a,t])},[a,o]),removeQuery:(0,Z.useCallback)(e=>{o(e<0?[]:a.filter((t,n)=>n!==e))},[a,o]),clearSearch:(0,Z.useCallback)(()=>o([]),[o])}}function nx({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,Z.useState)([]),[o,s]=(0,Z.useState)(0),[c,l]=(0,Z.useState)(1),[u,d]=(0,Z.useState)(!0),f=t.canvasSort??Xy,{queries:p,runSearch:m,removeQuery:h}=tx(t,()=>l(1));(0,Z.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,Z.useCallback)(e=>{t.setCanvasSort?.(e),l(1)},[t]),_=t.readOnly===!0;return(0,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[!_&&(0,Q.jsxs)(`div`,{className:`canvas-no-drag flex items-center gap-2 border-b px-1 pb-2`,children:[(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Sort`}),(0,Q.jsx)(eb,{workspaceId:t.workspaceId,value:f,onChange:g})]}),(0,Q.jsx)(`div`,{className:`min-h-0 flex-1 overflow-auto`,children:(0,Q.jsx)(ex,{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})})]})}Nf({type:`documents-table`,name:`Documents`,icon:_,defaultSize:{w:8,h:6,minW:4,minH:3},mobileHeight:.9,defaultConfig:{pageSize:50,viewMode:`table`},component:nx});function rx({config:e,setConfig:t,canvas:n}){let[r,i]=(0,Z.useState)(()=>new Date),a=e.format!==`24`;return(0,Z.useEffect)(()=>{let e=setInterval(()=>i(new Date),1e3);return()=>clearInterval(e)},[]),(0,Q.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-1`,children:[(0,Q.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,Q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:r.toLocaleDateString(void 0,{weekday:`short`,month:`short`,day:`numeric`})}),!n.readOnly&&(0,Q.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`})]})}Nf({type:`clock`,name:`Clock`,icon:N,defaultSize:{w:3,h:2,minW:2,minH:2},defaultConfig:{format:`24`},component:rx});var ix=450,ax=10;function ox(e,t){let{open:n}=dy(),r=(0,Z.useRef)(null),i=(0,Z.useRef)(null),a=(0,Z.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()},ix))},onPointerMove:e=>{i.current&&Math.hypot(e.clientX-i.current.x,e.clientY-i.current.y)>ax&&s()},onPointerUp:s,onPointerCancel:s,onPointerLeave:s},stopRowActivation:e=>e.stopPropagation()}}function sx({doc:e,workspaceId:t}){let n=Ni(e),{activationProps:r}=ox(e,t);return(0,Q.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,Q.jsx)(`div`,{className:`truncate font-medium`,children:n.title}),n.preview&&(0,Q.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:n.preview})]})}function cx({config:e,canvas:t}){let n=typeof e.limit==`number`?e.limit:10,[r,i]=(0,Z.useState)([]),[a,o]=(0,Z.useState)(!0),[s,c]=(0,Z.useState)(null);return(0,Z.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,Q.jsx)(`div`,{className:`text-xs text-muted-foreground p-1`,children:`Loading…`}):s?(0,Q.jsx)(`div`,{className:`text-xs text-destructive p-1`,children:s}):r.length===0?(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground p-1`,children:`No documents on this canvas.`}):(0,Q.jsx)(`ul`,{className:`divide-y text-sm`,children:r.map(e=>(0,Q.jsx)(sx,{doc:e,workspaceId:t.workspaceId},e.id))})}Nf({type:`recent-documents`,name:`Recent documents`,icon:St,defaultSize:{w:4,h:4,minW:3,minH:2},mobileHeight:.5,defaultConfig:{limit:10},component:cx});function lx({config:e,setConfig:t,canvas:n}){let r=typeof e.text==`string`?e.text:``;return(0,Q.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`})}Nf({type:`note`,name:`Note`,icon:qn,defaultSize:{w:3,h:3,minW:2,minH:2},defaultConfig:{text:``},component:lx});var ux=`data/schema/file`,dx=`data/schema/drawing`;function fx(e){return(e.schema===ux||e.schema===dx)&&String(e.metadata?.contentType||``).startsWith(`image/`)}function px(e){return e.schema===ux&&String(e.metadata?.contentType||``).startsWith(`video/`)}var mx=`data/mime/image`;function hx(e,t,n=!1){let[r,i]=(0,Z.useState)([]),[a,o]=(0,Z.useState)(0),[s,c]=(0,Z.useState)(1),[l,u]=(0,Z.useState)(!0),[d,f]=(0,Z.useState)(null),[p,m]=(0,Z.useState)(``),{queries:h,runSearch:g,removeQuery:_,clearSearch:v}=tx(e,()=>c(1)),y=e.canvasSort??Xy;(0,Z.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:[mx,`data/mime/video`]}:{allOf:[mx]}});if(r)return;i((a.payload||[]).filter(e=>fx(e)||n&&px(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,Z.useCallback)(()=>{let e=p.trim();m(``),g(e)},[p,g]),x=(0,Z.useCallback)(()=>{m(``),v()},[v]),S=(0,Z.useCallback)(e=>{_(e)},[_]),C=(0,Z.useCallback)(t=>{e.setCanvasSort?.(t),c(1)},[e]);return{images:r,isLoading:l,error:d,page:s,setPage:c,totalCount:a,totalPages:(0,Z.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}}function gx({workspaceId:e,doc:t,onClick:n,className:r=`aspect-square`,comments:i=`off`}){let{blobUrl:a,error:o,loading:s}=s_(e,t.id,512,{blobFallback:!px(t),version:t.checksumArray?.[0]??null}),c=Zr(t)||`image-${t.id}`,l=oi(t),u=l!==``&&i!==`off`;return(0,Q.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,Q.jsx)(`div`,{className:`absolute inset-0 animate-pulse bg-muted/60`}),o&&!px(t)&&(0,Q.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center p-1 text-[10px] text-destructive`,children:o}),a&&(0,Q.jsx)(`img`,{src:a,alt:c,loading:`lazy`,className:`h-full w-full object-cover transition-transform duration-normal group-hover:scale-105`}),px(t)&&(0,Q.jsxs)(`span`,{className:`absolute inset-0 flex items-center justify-center`,children:[(0,Q.jsx)(Se,{className:`h-10 w-10 rounded-full bg-black/60 p-2 text-white`}),(0,Q.jsx)(`span`,{className:`sr-only`,children:`Play video`})]}),u&&(0,Q.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,Q.jsx)(`span`,{className:`line-clamp-2`,children:l})}),l!==``&&i!==`caption`&&(0,Q.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,Q.jsx)(Ne,{className:`h-3 w-3`})})]})}function _x({workspaceId:e,docs:t,index:n,onClose:r,onNavigate:i}){let a=t[n],{blobUrl:o,error:s,loading:c}=Po(e,a.id,{version:a.checksumArray?.[0]??null,enabled:!px(a)}),l=Zr(a)||`image-${a.id}`,u=oi(a),[d,f]=(0,Z.useState)(!1);return Np(r),(0,Z.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,Pp.createPortal)((0,Q.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,Q.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,Q.jsx)(W,{className:`h-5 w-5`})}),n>0&&!d&&(0,Q.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,Q.jsx)(E,{className:`h-6 w-6 touch-target`})}),n<t.length-1&&!d&&(0,Q.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,Q.jsx)(gr,{className:`h-6 w-6 touch-target`})}),(0,Q.jsxs)(`figure`,{className:`flex min-h-0 flex-1 flex-col`,onClick:e=>e.stopPropagation(),children:[(0,Q.jsxs)(`div`,{className:`flex min-h-0 flex-1 items-center justify-center`,children:[c&&(0,Q.jsx)(`div`,{className:`text-sm text-foreground/70`,children:`Loading…`}),s&&(0,Q.jsx)(`div`,{className:`text-sm text-destructive`,children:s}),px(a)&&(0,Q.jsx)(yx,{workspaceId:e,doc:a},a.id),o&&(0,Q.jsx)(Yg,{src:o,alt:l,onZoomChange:f,className:`max-h-full max-w-full rounded object-contain`})]}),(0,Q.jsxs)(`figcaption`,{className:`shrink-0 px-4 py-2 text-center text-xs text-foreground/70`,children:[u&&(0,Q.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&&!px(a)&&(0,Q.jsx)(`span`,{className:`ml-2 opacity-70`,children:`· double-tap to zoom`})]})]})]}),document.body)}function vx({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,Q.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,Q.jsxs)(`div`,{className:`relative min-w-[9rem] flex-1 basis-full sm:basis-auto`,children:[(0,Q.jsx)(nr,{className:`pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground`}),(0,Q.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,Q.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,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]}),_&&(0,Q.jsx)(`div`,{className:`flex w-full flex-wrap items-center gap-1 order-last`,children:l.map((e,t)=>(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[t>0&&(0,Q.jsx)(`span`,{className:`text-[10px] uppercase text-muted-foreground`,children:`then`}),(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-full border bg-accent/50 px-2 py-0.5 text-xs`,children:[(0,Q.jsx)(`span`,{className:`max-w-[10rem] truncate`,children:e}),(0,Q.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,Q.jsx)(W,{className:`h-3 w-3`})})]})]},`${e}-${t}`))}),(0,Q.jsxs)(`div`,{className:`flex flex-1 basis-full items-center justify-between gap-2 sm:basis-auto sm:justify-end`,children:[r&&(0,Q.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,Q.jsx)(Ne,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(eb,{workspaceId:e,value:u,onChange:d}),(0,Q.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1`,children:[g&&(0,Q.jsx)(Ad,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,Q.jsxs)(`span`,{className:`shrink-0 whitespace-nowrap tabular-nums text-xs text-muted-foreground`,children:[h.toLocaleString(),(0,Q.jsxs)(`span`,{className:`hidden sm:inline`,children:[` item`,h===1?``:`s`]})]}),(0,Q.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,Q.jsx)(E,{className:`h-3.5 w-3.5`})}),(0,Q.jsxs)(`span`,{className:`shrink-0 tabular-nums text-xs text-muted-foreground`,children:[f,`/`,m]}),(0,Q.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,Q.jsx)(gr,{className:`h-3.5 w-3.5`})})]})]})]})}function yx({workspaceId:e,doc:t}){let{src:n,loading:r,error:i}=Ho(e,t.id);return(0,Q.jsxs)(Q.Fragment,{children:[r&&(0,Q.jsx)(`span`,{children:`Loading video…`}),i&&(0,Q.jsx)(`span`,{role:`alert`,children:i}),n&&(0,Q.jsx)(`video`,{src:n,controls:!0,playsInline:!0,preload:`metadata`,className:`max-h-full max-w-full`})]})}function bx({config:e,setConfig:t,canvas:n}){let r=hx(n,typeof e.pageSize==`number`?e.pageSize:60,!0),i=Ao()==null&&(n.interactive??!n.readOnly),[a,o]=(0,Z.useState)(new Set),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)(null),[d,f]=(0,Z.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,Z.useState)(null),{images:g,isLoading:_,error:v,activeQueries:y}=r,b=e.showComments===!1?`off`:`caption`;return(0,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[!n.readOnly&&(0,Q.jsx)(vx,{workspaceId:n.workspaceId,state:r,comments:b,onToggleComments:()=>t({...e,showComments:b===`off`})}),i&&(0,Q.jsxs)(`div`,{className:`canvas-no-drag flex items-center gap-2 py-1`,children:[(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,onClick:()=>{c(!s),o(new Set)},children:s?`Done selecting`:`Select`}),s&&(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,onClick:()=>o(new Set(g.map(e=>e.id))),children:`Select page`}),a.size>0&&(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,onClick:()=>u([...a]),children:[`Bulk Edit… (`,a.size,`)`]})]}),(0,Q.jsx)(`div`,{className:`flex-1 overflow-y-auto p-1`,children:v?(0,Q.jsx)(`div`,{className:`p-4 text-sm text-destructive`,children:v}):g.length===0?(0,Q.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,Q.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,Q.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,Q.jsx)(gx,{workspaceId:n.workspaceId,doc:e,onClick:()=>s?p(e.id):h(t),comments:b}),s&&(0,Q.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,Q.jsx)(im,{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:ve,run:()=>u(d.ids)}]}),l&&(0,Q.jsx)(ag,{workspaceId:n.workspaceId,documentIds:l,onClose:()=>u(null)}),m!=null&&g[m]&&(0,Q.jsx)(_x,{workspaceId:n.workspaceId,docs:g,index:m,onClose:()=>h(null),onNavigate:h})]})}Nf({type:`gallery`,name:`Gallery`,icon:Ce,defaultSize:{w:8,h:6,minW:3,minH:3},mobileHeight:.9,defaultConfig:{pageSize:60,showComments:!0},component:bx});var xx=150;function Sx(e){let t=typeof e==`string`?parseFloat(e):e;return Number.isFinite(t)&&t>0?t:0}function Cx(e){let t=e.metadata??{},n=e.data??{};return{w:Sx(t.width)||Sx(t.imageWidth)||Sx(n.width)||Sx(n.imageWidth),h:Sx(t.height)||Sx(t.imageHeight)||Sx(n.height)||Sx(n.imageHeight)}}function wx(e,t){if(t%9==0)return{cols:2,rows:2};let{w:n,h:r}=Cx(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 Tx({config:e,setConfig:t,canvas:n}){let r=hx(n,typeof e.pageSize==`number`?e.pageSize:60),[i,a]=(0,Z.useState)(null),{images:o,isLoading:s,error:c,activeQueries:l}=r,u=e.showComments===!1?`off`:`reveal`;return(0,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[!n.readOnly&&(0,Q.jsx)(vx,{workspaceId:n.workspaceId,state:r,comments:u,onToggleComments:()=>t({...e,showComments:u===`off`})}),(0,Q.jsx)(`div`,{className:`flex-1 overflow-y-auto p-1`,children:c?(0,Q.jsx)(`div`,{className:`p-4 text-sm text-destructive`,children:c}):o.length===0?(0,Q.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,Q.jsx)(`div`,{className:`grid gap-2`,style:{gridTemplateColumns:`repeat(auto-fill, minmax(${xx}px, 1fr))`,gridAutoRows:`${xx}px`,gridAutoFlow:`dense`},children:o.map((e,t)=>{let{cols:r,rows:i}=wx(e,t);return(0,Q.jsx)(`div`,{style:{gridColumn:`span ${r}`,gridRow:`span ${i}`},children:(0,Q.jsx)(gx,{workspaceId:n.workspaceId,doc:e,onClick:()=>a(t),className:`h-full`,comments:u})},e.id)})})}),i!=null&&o[i]&&(0,Q.jsx)(_x,{workspaceId:n.workspaceId,docs:o,index:i,onClose:()=>a(null),onNavigate:a})]})}Nf({type:`mosaic`,name:`Mosaic`,icon:_t,defaultSize:{w:8,h:7,minW:4,minH:4},mobileHeight:.9,defaultConfig:{pageSize:60,showComments:!0},component:Tx});var Ex=`data/schema/task`;function Dx({doc:e,workspaceId:t,readOnly:n,onChanged:r}){let i=z_(e),[a,o]=(0,Z.useState)(!1),{replicating:s,label:c}=Hi(e),l=i.status===`completed`,u=i.status??`pending`,d=V_(i),{activationProps:f,stopRowActivation:p}=ox(e,t),m=async()=>{if(!(n||a)){o(!0);try{await U_(t,e,l?`pending`:`completed`),r()}catch{}finally{o(!1)}}};return(0,Q.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,Q.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,Q.jsx)(Xn,{className:`h-2.5 w-2.5 animate-spin`}):l&&(0,Q.jsx)(ae,{className:`h-3 w-3`})}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`div`,{className:`truncate text-sm ${l?`text-muted-foreground line-through`:``}`,children:i.title||`Todo ${e.id}`}),(0,Q.jsxs)(`div`,{className:`mt-0.5 flex flex-wrap items-center gap-1.5 text-[11px]`,children:[(0,Q.jsx)(`span`,{className:`rounded-full px-1.5 py-0.5 ${B_[u]}`,children:j_[u]}),i.dueDate&&(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-0.5 ${d?`font-medium text-destructive`:`text-muted-foreground`}`,children:[(0,Q.jsx)(me,{className:`h-3 w-3`}),H_(i.dueDate)]}),typeof i.priority==`number`&&(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-0.5 text-muted-foreground`,children:[(0,Q.jsx)(Rt,{className:`h-3 w-3`}),`P`,i.priority]}),s&&(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-muted-foreground`,role:`status`,children:[(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}),c]})]})]})]})}function Ox({config:e,setConfig:t,canvas:n}){let r=typeof e.pageSize==`number`?e.pageSize:50,[i,a]=(0,Z.useState)([]),[o,s]=(0,Z.useState)(!0),[c,l]=(0,Z.useState)(0),u=n.interactive===!1,d=n.readOnly!==!0,[f,p]=(0,Z.useState)(e.hideDone===!0),m=d?e.hideDone===!0:f,h=n=>{d?t({...e,hideDone:n}):p(n)};(0,Z.useEffect)(()=>{let e=!1;return(async()=>{s(!0);try{let t=await n.fetchDocuments({limit:r,allOf:[Ex],sortBy:`tasks`,order:`asc`});if(e)return;a((t.payload||[]).filter(e=>e.schema===Oo))}catch{e||a([])}finally{e||s(!1)}})(),()=>{e=!0}},[n,r,c]),(0,Z.useEffect)(()=>{let e=()=>l(e=>e+1);return window.addEventListener(`workspace:documents:refresh`,e),()=>window.removeEventListener(`workspace:documents:refresh`,e)},[]);let g=(0,Z.useCallback)(()=>l(e=>e+1),[]),_=m?i.filter(e=>z_(e).status!==`completed`):i,v=i.filter(e=>{let t=z_(e).status;return t!==`completed`&&t!==`cancelled`}).length;return(0,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Q.jsxs)(`div`,{className:`canvas-no-drag flex items-center justify-between gap-2 border-b px-1 pb-2`,children:[(0,Q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[v,` open`]}),(0,Q.jsxs)(`label`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:m,onChange:e=>h(e.target.checked),className:`h-3 w-3`}),`Hide done`]})]}),(0,Q.jsx)(`div`,{className:`flex-1 space-y-1.5 overflow-y-auto p-1`,children:o&&i.length===0?(0,Q.jsx)(`div`,{className:`p-3 text-sm text-muted-foreground`,children:`Loading todos…`}):_.length===0?(0,Q.jsx)(`div`,{className:`p-3 text-sm text-muted-foreground`,children:`No todos in this canvas' context.`}):_.map(e=>(0,Q.jsx)(Dx,{doc:e,workspaceId:n.workspaceId,readOnly:u,onChanged:g},e.id))})]})}Nf({type:`todos`,name:`Todos`,icon:Ht,defaultSize:{w:4,h:6,minW:3,minH:3},mobileHeight:.6,defaultConfig:{pageSize:50,hideDone:!1},component:Ox});function kx(e){if(!e)return`/`;let t=e.replace(/\/+/g,`/`);return t.startsWith(`/`)?t:`/${t}`}var Ax=`context`;function jx(e){let t=e=>{try{return decodeURIComponent(e)}catch{return e}},n=e.split(`/`).filter(Boolean);if(n[0]!==`workspaces`)return{treeName:Ax,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:Ax,path:e?`/${e}`:`/`}}return{treeName:Ax,path:`/`}}function Mx(e,t,n){let r=n&&n!==Ax?`/trees/${encodeURIComponent(n)}`:``,i=kx(t);return`/workspaces/${e}${r}${i===`/`?``:`/path/${i.split(`/`).filter(Boolean).map(encodeURIComponent).join(`/`)}`}`}function Nx({canvas:e}){return Ao()!=null||!bd()?(0,Q.jsx)(`p`,{className:`p-3 text-sm text-muted-foreground`,children:`Workspace pins are available in the signed-in workspace view.`}):(0,Q.jsx)(Px,{workspaceId:e.workspaceId},e.workspaceId)}function Px({workspaceId:e}){let[t,n]=(0,Z.useState)([]),[r,i]=(0,Z.useState)(`Workspace`),[a,o]=(0,Z.useState)(!0),[s,c]=(0,Z.useState)(null),[l,u]=(0,Z.useState)(0);return(0,Z.useEffect)(()=>{let t=!1,r=0,a=async()=>{let a=++r;o(!0);try{let[o,s]=await Promise.all([Jr(e),si(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=pd.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,Q.jsxs)(`div`,{className:`canvas-no-drag flex h-full min-h-0 flex-col`,children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-b px-2 pb-2`,children:[(0,Q.jsx)(`span`,{className:`truncate text-sm font-medium`,children:r}),(0,Q.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,Q.jsx)(P,{className:`h-3.5 w-3.5 ${a?`animate-spin`:``}`})})]}),(0,Q.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-1`,children:s?(0,Q.jsx)(`p`,{role:`alert`,className:`p-2 text-sm text-muted-foreground`,children:s}):t.length?(0,Q.jsx)(`ul`,{className:`space-y-2`,children:t.map(t=>{let n=t.resolvable===!1,r=Cm(t.color),i=(0,Q.jsxs)(Q.Fragment,{children:[n?(0,Q.jsx)(U,{className:`h-5 w-5 shrink-0 text-warning`}):(0,Q.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,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`p`,{className:`truncate text-sm font-medium`,children:t.label||t.name||t.path}),(0,Q.jsxs)(`p`,{className:`truncate text-xs text-muted-foreground`,children:[t.tree,`:`,t.path]}),t.description&&(0,Q.jsx)(`p`,{className:`line-clamp-2 text-xs text-muted-foreground`,children:t.description}),n&&(0,Q.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,Q.jsx)(`li`,{children:n?(0,Q.jsx)(`div`,{className:`${a} opacity-60`,style:o,children:i}):(0,Q.jsx)(Mu,{to:Mx(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,Q.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.`})})]})}Nf({type:`workspace-pins`,name:`Workspace pins`,icon:ke,defaultSize:{w:4,h:6,minW:3,minH:2},mobileHeight:.6,defaultConfig:{},component:Nx});function Fx({title:e,icon:t,onRemove:n,fill:r,onToggleFill:i,readOnly:a=!1,stacked:o=!1,children:s}){let[c,l]=(0,Z.useState)(!1),u=c?document.getElementById(`content-area`):null,d=(0,Q.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,Q.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,Q.jsx)(t,{className:`w-3.5 h-3.5 text-muted-foreground shrink-0`}),(0,Q.jsx)(`span`,{className:`text-xs font-medium truncate flex-1`,children:e}),!a&&i&&!c&&!o&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Ix,{on:r?.w===!0,onClick:()=>i(`w`),label:`Fill width`,icon:Nn}),(0,Q.jsx)(Ix,{on:r?.h===!0,onClick:()=>i(`h`),label:`Fill height`,icon:fe})]}),(0,Q.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,Q.jsx)(ut,{className:`w-3.5 h-3.5`}):(0,Q.jsx)(Sn,{className:`w-3.5 h-3.5`})}),!a&&n&&(0,Q.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,Q.jsx)(W,{className:`w-3.5 h-3.5`})})]}),(0,Q.jsx)(`div`,{className:`flex-1 min-h-0 overflow-auto p-2`,children:s})]});return c?(0,Pp.createPortal)(d,u??document.body):d}function Ix({on:e,onClick:t,label:n,icon:r}){return(0,Q.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,Q.jsx)(r,{className:`w-3.5 h-3.5`})})}var Lx=(0,jf.WidthProvider)(jf.default),Rx=12,zx=80,Bx=40,Vx=[12,12],Hx=[8,8],Ux={w:!1,h:!1};function Wx(e){return Math.max(1,...e.map(e=>e.y+e.h).filter(Number.isFinite))}function Gx(e){return Math.max(0,...e.map(e=>e.y+e.h).filter(Number.isFinite))}function Kx(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 qx(e,t,n=0){let r=n>0?n:Wx(e);return e.map(e=>{let n=t[e.i]??Ux;return!n.w&&!n.h?e:{...e,x:n.w?0:e.x,w:n.w?Rx:e.w,y:n.h?0:e.y,h:n.h?Math.max(e.minH??1,r):e.h}})}var Jx=4;function Yx(e,t,n=Vx[1]){return Math.max(1,Math.ceil((e-n-Jx)/(t+n)))}var Xx=45,Zx=640;function Qx(e,t,n=0,r){let i=[...qx(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:Rx,y:a,h:n};return a+=n,i})}var $x=e=>e&&e.trim()?[e]:[];function eS(e){let t=e?.ui??{},n=Array.isArray(t.layout)?t.layout.map(Kx):[],r={};for(let e of n)r[e.i]={w:e.fillW??e.w>=Rx,h:e.fillH===!0};return{layout:n,fills:r,widgets:t.widgets&&typeof t.widgets==`object`?t.widgets:{}}}function tS({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,Z.useMemo)(()=>eS(a),[a]),[p,m]=(0,Z.useState)(f.layout),[h,g]=(0,Z.useState)(f.widgets),[_,v]=(0,Z.useState)(f.fills),y=(0,Z.useRef)(f.fills),[b,x]=(0,Z.useState)(!1),[S,C]=(0,Z.useState)(!1),[w,T]=(0,Z.useState)(!1),[E,D]=(0,Z.useState)(null),[O,k]=(0,Z.useState)(!1),[A,j]=(0,Z.useState)(0),M=(0,Z.useRef)(0),N=(0,Z.useCallback)(e=>{y.current=e,v(e)},[]),[P,ee]=(0,Z.useState)(()=>Uy(i?.sort)),F=(0,Z.useRef)(!1),[I,L]=(0,Z.useState)(()=>$x(i?.query)),R=(0,Z.useRef)(!1),te=(0,Z.useRef)(null),z=(0,Z.useRef)(f),ne=(0,Z.useCallback)(e=>{let t=Pf(h[e]?.type??``)?.mobileHeight;if(!(!t||A<=0))return Math.max(1,Math.round(A*t))},[h,A]),B=(0,Z.useMemo)(()=>O?Qx(p,_,A,ne):qx(p,_,A),[p,_,O,A,ne]),re=O?Bx:zx,V=(0,Z.useMemo)(()=>JSON.stringify(a?.ui??null),[a?.ui]);(0,Z.useEffect)(()=>{let e=eS(a);m(e.layout),g(e.widgets),N(e.fills),z.current=e,ee(Uy(i?.sort)),F.current=!1,L($x(i?.query)),R.current=!1,C(!1)},[n,r]),(0,Z.useEffect)(()=>{if(!s)return;let e=eS(a);m(e.layout),g(e.widgets),N(e.fills),z.current=e},[s,V,a,N]),(0,Z.useEffect)(()=>{let e=te.current;if(!e)return;let t=()=>{let t=e.clientHeight,n=e.clientWidth>0&&e.clientWidth<Zx;k(n),M.current=t,e.style.setProperty(`--canvas-host-h`,`${t}px`);let r=n?Hx:Vx;e.style.setProperty(`--canvas-grid-gutter`,`${r[1]}px`),t>0&&j(Yx(t,n?Bx:zx,r[1]))};t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[p]);let ie=(0,Z.useCallback)(e=>{ee(e),F.current=!0,C(!0)},[]),ae=(0,Z.useCallback)(e=>{L(e),R.current=!0,C(!0)},[]),oe=(0,Z.useMemo)(()=>({workspaceId:e,treeName:t,path:n,layerId:r,querySpec:i,readOnly:!d,interactive:c,canvasSort:P,setCanvasSort:d?ie:void 0,canvasQueries:I,setCanvasQueries:d?ae:void 0,fetchDocuments:l??(async r=>{let i;if(r?.anyOf?.length&&(i=((await to(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 to(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,ie,I,ae]),H=(0,Z.useCallback)((e,t,n)=>{z.current={layout:e,widgets:t,fills:n??y.current},C(!0)},[]),se=(0,Z.useCallback)(async()=>{if(!(!d||w)){T(!0),D(null);try{let r={widgets:z.current.widgets,layout:z.current.layout.map(e=>({...e,fillW:y.current[e.i]?.w===!0,fillH:y.current[e.i]?.h===!0}))};z.current={...r,fills:y.current};let o=F.current||R.current?{...i||{},...F.current?{sort:P.sortBy?P:null}:{},...R.current?{query:I.join(` `).trim()||null}:{}}:void 0;await uo(e,n,t,{...a||{},ui:r},o),F.current=!1,R.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]),ce=(0,Z.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 H(n,h),n})},[d,O,H,h]),U=(0,Z.useCallback)((e,t,n)=>{if(!d)return;let r=y.current[n.i]??Ux,i=Vx[1]+(n.y+n.h)*(zx+Vx[1]),a={w:n.x+n.w>=Rx,h:M.current>0&&i>=M.current-Xx};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),H(z.current.layout,h,o)},[d,N,H,h]),le=(0,Z.useCallback)((e,t)=>{if(!d)return;let n=y.current[e]??Ux,r={...y.current,[e]:{...n,[t]:!n[t]}};N(r),H(p,h,r)},[d,N,H,p,h]),ue=(0,Z.useCallback)(e=>{let t=Pf(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:Gx(B),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>=Rx,h:!1}};m(l),g(u),N(d),x(!1),H(l,u,d)},[p,B,h,N,H]),de=(0,Z.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),H(t,n,r)},[p,h,N,H]),fe=(0,Z.useCallback)((e,t)=>{g(n=>{let r={...n,[e]:{...n[e],config:t}};return H(p,r),r})},[p,H]),pe=Object.keys(h);return(0,Q.jsxs)(`div`,{className:`flex flex-col h-full min-h-0`,children:[d&&(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b shrink-0 sm:px-3`,children:[(0,Q.jsxs)(`div`,{className:`relative shrink-0`,children:[(0,Q.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,Q.jsx)(cn,{className:`w-3.5 h-3.5`}),`Add`,(0,Q.jsx)(`span`,{className:`hidden sm:inline`,children:` widget`})]}),b&&(0,Q.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:Ff().map(e=>(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>ue(e.type),className:`flex items-center gap-2 w-full px-3 py-1.5 text-xs text-left hover:bg-accent`,children:[(0,Q.jsx)(e.icon,{className:`w-3.5 h-3.5 text-muted-foreground`}),e.name]},e.type))})]}),(0,Q.jsxs)(`button`,{type:`button`,onClick:se,disabled:!S||w,className:q(`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,Q.jsx)(Ve,{className:`w-3.5 h-3.5`}),w?`Saving…`:`Save`]}),(0,Q.jsxs)(`span`,{className:`min-w-0 truncate text-xs text-muted-foreground`,children:[pe.length,` widget`,pe.length===1?``:`s`,S?` · unsaved`:``,E?` · ${E}`:``]})]}),(0,Q.jsx)(`div`,{ref:te,className:`canvas-grid-host flex-1 min-h-0 bg-muted/10 overflow-y-auto overflow-x-hidden`,children:pe.length===0?(0,Q.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-2 text-sm text-muted-foreground`,children:[(0,Q.jsx)(`p`,{children:`No widgets yet.`}),d&&(0,Q.jsx)(`p`,{className:`text-xs`,children:`Use “Add widget” to place one on the canvas.`})]}):(0,Q.jsx)(Lx,{className:`layout`,layout:B,cols:Rx,rowHeight:re,margin:O?Hx:Vx,isDraggable:d&&!O,isResizable:d&&!O,resizeHandles:[`s`,`e`,`se`],draggableHandle:`.canvas-drag-handle`,draggableCancel:`.canvas-no-drag`,onLayoutChange:ce,onResizeStop:U,compactType:`vertical`,children:pe.map(e=>{let t=h[e],n=Pf(t.type),r=_[e]??Ux,i=[r.w?`w`:``,r.h?`h`:``].filter(Boolean).join(` `);return(0,Q.jsx)(`div`,{"data-fill":i||void 0,children:n?(0,Q.jsx)(Fx,{title:n.name,icon:n.icon,readOnly:!d,stacked:O,onRemove:()=>de(e),fill:_[e]??Ux,onToggleFill:d?t=>le(e,t):void 0,children:(0,Q.jsx)(n.component,{config:t.config??{...n.defaultConfig||{}},setConfig:t=>fe(e,t),canvas:oe})}):(0,Q.jsx)(Fx,{title:`Unknown: ${t.type}`,readOnly:!d,stacked:O,onRemove:()=>de(e),children:(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`This widget type is not available.`})})},e)})})})]})}var nS=`data/schema/file`;function rS(e){return String(e.locations?.[0]?.url||``).trim()}function iS(e){let t=rS(e);if(!t)return``;let n=t.split(/[?#]/)[0].split(`/`).filter(Boolean).pop()||``;try{return decodeURIComponent(n)}catch{return n}}function aS(e){return e.schema===nS&&String(e.metadata?.contentType||``).startsWith(`image/`)}function oS(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 sS(e){if(e.schema!==nS)return Ni(e);let t=iS(e),n=String(e.metadata?.contentType||``).trim(),r=oS(e.metadata?.size);return{...Ni(e),title:t||`File ${e.id}`,preview:[n,r].filter(Boolean).join(` · `),subtitle:rS(e),schemaLabel:`file`}}function cS(e){return/^https?:\/\/[^\s]+$/i.test(e)}function lS(e,t){if(e.schema===`data/schema/tab`){let t=String(e.data?.url||``).trim();return cS(t)?t:null}return t.isExternal&&cS(t.subtitle)?t.subtitle:cS(t.title)?t.title:null}function uS(e,t,n=!1){return Io(e,t,{download:n})}function dS(e){return e.split(/(https?:\/\/[^\s]+)/gi).map((e,t)=>cS(e)?(0,Q.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 fS(e){return e?new Date(e).toLocaleString():``}function pS(){let{code:e=``}=yl(),[t,n]=(0,Z.useState)(null),[r,i]=(0,Z.useState)(!0),[a,o]=(0,Z.useState)(null),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)(``),d=(0,Z.useMemo)(()=>t?.documents?Array.isArray(t.documents)?t.documents:t.documents.data||[]:[],[t]),f=(0,Z.useMemo)(()=>{let e=l.trim().toLowerCase();return e?d.filter(t=>{let n=sS(t);return[t.schema,n.title,n.preview,n.subtitle,iS(t),t.metadata?.contentType].join(` `).toLowerCase().includes(e)}):d},[d,l]),p=(0,Z.useCallback)(async()=>{if(e){i(!0);try{let t=await Y.get(`${Rr}/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,Z.useEffect)(()=>{p()},[p]),(0,Z.useEffect)(()=>{if(!e)return;let t=Br(`${zr}/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,Z.useCallback)(e=>{e?.preventDefault(),u(l.trim())},[l]),h=(0,Z.useCallback)(()=>{u(``)},[]),g=(0,Z.useCallback)(async e=>({payload:Gi(e?.sortBy)?li(d,e.sortBy,e?.order):d,totalCount:t?.stats.documentCount??d.length}),[d,t]);if(r&&!t)return(0,Q.jsx)(`main`,{className:`min-h-screen bg-muted flex items-center justify-center p-6`,children:(0,Q.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Loading canvas...`})});if(a||!t)return(0,Q.jsxs)(`main`,{className:`min-h-screen bg-muted flex flex-col items-center justify-center p-6`,children:[(0,Q.jsxs)(Wu,{className:`max-w-md bg-card`,children:[(0,Q.jsx)(Gu,{children:(0,Q.jsx)(Ku,{children:`Canvas unavailable`})}),(0,Q.jsx)(Ju,{className:`text-sm text-muted-foreground`,children:a||`This public canvas does not exist.`})]}),(0,Q.jsx)(ud,{className:`mt-6 text-center`})]});let _=t.canvas.metadata?.ui??{},v=!!_.widgets&&Object.keys(_.widgets).length>0;return(0,Q.jsx)(zo.Provider,{value:e,children:(0,Q.jsx)(`main`,{className:`min-h-screen bg-muted p-2 text-foreground sm:p-4 md:p-10`,children:(0,Q.jsxs)(`div`,{className:`mx-auto max-w-6xl`,children:[(0,Q.jsxs)(Wu,{className:`bg-card shadow-elevation-3`,children:[(0,Q.jsx)(Gu,{className:`border-b p-3 sm:p-6`,children:(0,Q.jsxs)(`div`,{className:`flex flex-col gap-3 md:flex-row md:items-start md:justify-between md:gap-4`,children:[(0,Q.jsxs)(`div`,{className:`flex min-w-0 gap-3 sm:gap-4`,children:[(0,Q.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,Q.jsx)(_t,{className:`h-5 w-5 sm:h-6 sm:w-6`})}),(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`span`,{className:`truncate text-xs uppercase tracking-wide text-muted-foreground`,children:t.workspace.label||t.workspace.name}),(0,Q.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,Q.jsx)(mr,{className:`h-3 w-3 text-success`}):(0,Q.jsx)(w,{className:`h-3 w-3 text-muted-foreground`}),s?`Live`:`Offline`]})]}),(0,Q.jsx)(Ku,{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,Q.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,Q.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,Q.jsx)(mr,{className:`h-3.5 w-3.5 text-success`}):(0,Q.jsx)(w,{className:`h-3.5 w-3.5 text-muted-foreground`}),s?`Live`:`Offline`]})]})}),(0,Q.jsxs)(Ju,{className:`space-y-4 p-3 sm:space-y-6 sm:p-6 md:p-8`,children:[(0,Q.jsxs)(`section`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1 text-xs text-muted-foreground md:hidden`,children:[(0,Q.jsx)(`span`,{className:`w-full truncate font-mono text-foreground`,children:t.share.path}),(0,Q.jsxs)(`span`,{className:`tabular-nums`,children:[t.stats.documentCount,` docs`]}),f.length!==t.stats.documentCount&&(0,Q.jsxs)(`span`,{className:`tabular-nums`,children:[`· `,f.length,` shown`]}),(0,Q.jsxs)(`span`,{className:`truncate`,children:[`· `,fS(t.stats.refreshedAt)]})]}),(0,Q.jsxs)(`section`,{className:`hidden gap-3 md:grid md:grid-cols-4`,children:[(0,Q.jsx)(mS,{label:`Path`,value:t.share.path,mono:!0}),(0,Q.jsx)(mS,{label:`Documents`,value:String(t.stats.documentCount)}),(0,Q.jsx)(mS,{label:`Shown`,value:String(f.length)}),(0,Q.jsx)(mS,{label:`Refreshed`,value:fS(t.stats.refreshedAt)})]}),v&&(0,Q.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,Q.jsx)(tS,{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,Q.jsxs)(`section`,{className:`rounded-2xl border`,children:[(0,Q.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,Q.jsx)(`h2`,{className:`font-semibold`,children:`Content`}),(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 md:flex-row md:items-center`,children:[(0,Q.jsxs)(`form`,{onSubmit:m,className:`flex min-w-0 items-center gap-2`,children:[(0,Q.jsxs)(`div`,{className:`relative min-w-0`,children:[(0,Q.jsx)(nr,{className:`pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground`}),(0,Q.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,Q.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,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsx)(`button`,{type:`submit`,className:`rounded-md border px-3 py-1.5 text-xs hover:bg-muted`,children:`Search`})]}),(0,Q.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,Q.jsx)(P,{className:`h-3.5 w-3.5 ${r?`animate-spin`:``}`}),`Refresh`]})]})]}),l.trim()&&(0,Q.jsxs)(`div`,{className:`border-b bg-muted px-4 py-2 text-xs text-muted-foreground`,children:[`Local search: `,(0,Q.jsxs)(`span`,{className:`font-mono`,children:[`"`,l.trim(),`"`]})]}),(0,Q.jsx)(`div`,{className:`divide-y`,children:f.length===0?(0,Q.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=sS(t),r=lS(t,n),i=t.schema===nS,a=i?uS(e,t.id):null,o=a||r;return(0,Q.jsxs)(`article`,{className:`p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-1 md:flex-row md:items-start md:justify-between`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`h3`,{className:`truncate font-medium`,children:o?(0,Q.jsx)(`a`,{href:o,target:`_blank`,rel:`noreferrer`,className:`hover:text-primary hover:underline`,children:n.title}):n.title}),(0,Q.jsx)(`div`,{className:`mt-1 font-mono text-xs text-muted-foreground`,children:n.schemaLabel})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-3`,children:[i&&(0,Q.jsxs)(`a`,{href:uS(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,Q.jsx)(Jt,{className:`h-3.5 w-3.5`}),`Download`]}),(0,Q.jsx)(`time`,{className:`text-xs text-muted-foreground`,children:fS(t.updatedAt||t.createdAt)})]})]}),n.preview&&(0,Q.jsx)(`p`,{className:`mt-3 line-clamp-3 text-sm leading-6 text-foreground`,children:dS(n.preview)}),aS(t)&&(0,Q.jsx)(`a`,{href:a||void 0,target:`_blank`,rel:`noreferrer`,className:`mt-3 block w-fit`,children:(0,Q.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,Q.jsx)(ud,{className:`mt-6 text-center`})]})})})}function mS({label:e,value:t,mono:n=!1}){return(0,Q.jsxs)(`div`,{className:`min-w-0 rounded-xl border bg-muted p-4`,children:[(0,Q.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:e}),(0,Q.jsx)(`div`,{className:`mt-2 truncate text-lg font-semibold ${n?`font-mono text-sm`:``}`,children:t||`-`})]})}var hS={title:``,content:``,comment:``,tags:[]};function gS(e,t,n=`add`){let r=O_(),i=Ko(`new:${n}:${e?.mode===`workspace`?`${e.workspaceName}:${e.treeName}:${e.path}`:e?.contextId??`home`}`),a=e=>async(n,i,a)=>{let o=typeof i.workspace==`string`?i.workspace:(await js(e)).workspaceName,s=await r.capture(),c={schema:`data/schema/note`,schemaVersion:`2.0`,comment:n.comment,data:{title:n.title.trim(),content:n.content},metadata:{features:Jo(n.tags),...s?{geo:s}:{}}},l=typeof i.id==`number`?i.id:void 0;if(l==null){let t=await vs(e,[c],{refresh:!1});if(!t.length)throw Error(`The server did not return the saved note`);l=t[0],a({id:l,workspace:o})}else await _o(o,{...c,id:l});await t?.([l]),gs(e)},o=Ro(i,hS,{retainAfterSave:!0,valid:e=>!!e.content.trim(),save:e?a(e):void 0});async function s(e){await o.saveWith(a(e));let t=o.getSnapshot().meta.id;if(typeof t!=`number`)throw Error(`Write a note before saving`);return[t]}return{...o.value,status:o.status,error:o.error,storageError:o.storageError,setTitle:e=>o.update({title:e}),setContent:e=>o.update({content:e}),setComment:e=>o.update({comment:e}),setTags:e=>o.update({tags:e}),saving:o.status===`saving`,canSave:!!o.value.content.trim()&&o.status!==`saving`,save:s,finish:o.clear,retry:o.flush,geotag:r}}var _S=(0,Z.createContext)(void 0);function vS(){let e=(0,Z.useContext)(_S),t=$o()?.state,n=!!t,r=t?.activeContextType,i=t?.activeContextId,a=t?.activeWorkspaceName,o=t?.activeContextPath,s=t?.activeTreeName;return(0,Z.useMemo)(()=>e===void 0?n?r===`context`&&i?{mode:`context`,contextId:i}:a&&o?{mode:`workspace`,workspaceName:a,path:o,treeName:s||`context`,treeType:s===`directory`||s===`backends`?`directory`:`context`}:null:null:e,[e,n,r,i,a,o,s])}function yS({value:e,onChange:t,onBlur:n,placeholder:r,innerRef:i}){let a=(0,Z.useRef)(null),o=(0,Z.useCallback)(()=>{let e=a.current;e&&(e.style.height=`auto`,e.style.height=`${e.scrollHeight}px`)},[]);return(0,Z.useEffect)(()=>{o()},[e,o]),(0,Q.jsx)(`textarea`,{ref:e=>{a.current=e,i?.(e)},value:e,onChange:e=>t(e.target.value),onBlur:n,placeholder:r,rows:1,spellCheck:!1,className:`w-full resize-none overflow-hidden border-0 bg-transparent p-0 text-sm leading-relaxed text-foreground outline-none placeholder:text-muted-foreground/60`})}function bS({onLinkTo:e,onDelete:t}){return(0,Q.jsxs)(`span`,{className:`reveal-on-hover flex items-center gap-0.5`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:e,className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,"aria-label":`Link to…`,title:`Link to…`,children:(0,Q.jsx)(Qt,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(`button`,{type:`button`,onClick:t,className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-destructive`,"aria-label":`Delete`,title:`Delete (moves to trash)`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]})}function xS({documentId:e,workspaceName:t,onClose:n}){let{showSuccessToast:r,showErrorToast:i}=Gr(),[a,o]=(0,Z.useState)(!1);return(0,Q.jsx)(Up,{onClose:n,children:(0,Q.jsx)(Jm,{onClose:n,onConfirm:async(t,a)=>{if(t.length){o(!0);try{for(let n of t)await Bi(a.workspaceName,n,[e],a.treeName,a.treeType);r(`Linked to ${t.length} path${t.length>1?`s`:``}`),n()}catch(e){i(e instanceof Error?e.message:`Failed to link document`),o(!1)}}},documentCount:1,saving:a,sizeClassName:Hp,tabs:t?[`context`,`directory`,`relations`]:[`context`,`directory`],relationWorkspaceName:t,relationExcludeIds:new Set([e]),onConfirmRelation:async({predicate:a,direction:s,targetIds:c})=>{if(!(!t||!c.length)){o(!0);try{await go(t,e,a,c,s),r(`Related to ${c.length} document${c.length===1?``:`s`}`),Og(),n()}catch(e){i(e instanceof Error?e.message:`Failed to create relation`),o(!1)}}}})})}var SS=1200;function CS(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleDateString(void 0,{year:`numeric`,month:`short`,day:`numeric`})+` `+t.toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`})}function wS(e,t){let[n,r]=(0,Z.useState)([]),[i,a]=(0,Z.useState)(!1),[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)(null),u=(0,Z.useCallback)(()=>{if(!e)return Promise.resolve();if(e.mode===`context`){let{contextId:n}=e;return Promise.all([xs(n,[t]),Ss(n)]).then(([e,t])=>{r(Array.isArray(e)?e:[]);let n=t.workspaceName||t.workspaceId;l(n?{workspaceName:n,path:t.path||`/`,treeName:t.treeId||`context`,treeType:`context`}:null)}).catch(e=>s(e instanceof Error?e.message:`Failed to load documents`)).finally(()=>a(!1))}let{workspaceName:n,path:i,treeName:o,treeType:c}=e;return Na(n,i,[t],{treeName:o,treeType:c,limit:50}).then(e=>{r(e.payload||[]),l({workspaceName:n,path:i,treeName:o,treeType:c})}).catch(e=>s(e instanceof Error?e.message:`Failed to load documents`)).finally(()=>a(!1))},[e,t]),d=(0,Z.useCallback)(async()=>{if(!e){r([]),l(null);return}a(!0),s(null),await u()},[e,u]),[f,p]=(0,Z.useState)(null);return(!f||f.target!==e||f.schema!==t)&&(p({target:e,schema:t}),e?(a(!0),s(null)):(r([]),l(null))),(0,Z.useEffect)(()=>{u()},[u]),(0,Z.useEffect)(()=>{let e=()=>d();return window.addEventListener(`workspace:documents:refresh`,e),()=>window.removeEventListener(`workspace:documents:refresh`,e)},[d]),{docs:n,setDocs:r,loading:i,error:o,scope:c,reload:d,removeDoc:(0,Z.useCallback)(async e=>{if(!c)throw Error(`No workspace scope resolved`);await ci(c.workspaceName,[e],c.path,[],c.treeName,c.treeType),r(t=>t.filter(t=>t.id!==e))},[c])}}function TS({doc:e,updateWorkspace:t,registerEl:n,registerBody:r,highlighted:i,onLinkTo:a,onDelete:o}){let s=Mo(e,t||``,!!t),{title:c,content:l,setTitle:u,setContent:d}=s,f=()=>{s.save().catch(()=>{})};return(0,Q.jsxs)(`div`,{ref:t=>n(e.id,t),className:q(`group border-t border-border/60 px-4 py-3 transition-colors`,i&&`bg-primary/5`),children:[(0,Q.jsxs)(`div`,{className:`mb-1 flex items-baseline justify-between gap-2`,children:[(0,Q.jsxs)(`span`,{className:`text-[10px] uppercase tracking-wide text-muted-foreground/70`,children:[CS(e.createdAt),` · #`,e.id]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-1 text-[10px] text-muted-foreground/70`,children:[(0,Q.jsx)(Wo,{...s,onRetry:s.save}),(0,Q.jsx)(bS,{onLinkTo:a,onDelete:o})]})]}),(0,Q.jsx)(`input`,{value:c,onChange:e=>u(e.target.value),onBlur:f,placeholder:`Untitled`,spellCheck:!1,className:`mb-1 w-full border-0 bg-transparent p-0 text-sm font-semibold text-foreground outline-none placeholder:text-muted-foreground/50`}),(0,Q.jsx)(yS,{value:l,onChange:d,onBlur:f,innerRef:t=>r(e.id,t)})]})}function ES({target:e,onCreated:t,onCancel:n}){let r=gS(e,void 0,`applet`),{title:i,content:a,setTitle:o,setContent:s,saving:c}=r,[l,u]=(0,Z.useState)(null),d=async()=>{try{await r.save(e),r.finish(),t()}catch(e){u(e instanceof Error?e.message:`Failed to save note`)}};return(0,Q.jsxs)(`div`,{className:`border-t border-border/60 bg-muted/30 px-4 py-3`,children:[(0,Q.jsxs)(`div`,{className:`mb-1 flex items-baseline justify-between`,children:[(0,Q.jsx)(`span`,{className:`text-[10px] uppercase tracking-wide text-muted-foreground/70`,children:`New note`}),(0,Q.jsx)(`button`,{type:`button`,onClick:n,className:`text-muted-foreground hover:text-foreground`,"aria-label":`Close note`,children:(0,Q.jsx)(W,{className:`h-3 w-3`})})]}),(0,Q.jsx)(`input`,{value:i,onChange:e=>o(e.target.value),placeholder:`Untitled`,autoFocus:!0,spellCheck:!1,className:`mb-1 w-full border-0 bg-transparent p-0 text-sm font-semibold text-foreground outline-none placeholder:text-muted-foreground/50`}),(0,Q.jsx)(yS,{value:a,onChange:s,placeholder:`Write your note…`}),(0,Q.jsx)(Wo,{...r,onRetry:r.retry}),l&&(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-destructive`,children:l}),(0,Q.jsx)(`div`,{className:`mt-2 flex justify-end`,children:(0,Q.jsx)(`button`,{type:`button`,onClick:d,disabled:!a.trim()||c,className:`rounded-md bg-primary px-2.5 py-1 text-xs text-primary-foreground disabled:opacity-50`,children:c?`Saving…`:`Done`})})]})}function DS({autoAdd:e=!1}){let t=vS(),{docs:n,loading:r,error:i,scope:a,reload:o,removeDoc:s}=wS(t,Ei),[c,l]=(0,Z.useState)(``),[u,d]=(0,Z.useState)(0),[f,p]=(0,Z.useState)(`desc`),[m,h]=(0,Z.useState)(e),[g,_]=(0,Z.useState)(null),v=(0,Z.useRef)(new Map),y=(0,Z.useRef)(new Map),b=(0,Z.useCallback)((e,t)=>{t?v.current.set(e,t):v.current.delete(e)},[]),x=(0,Z.useCallback)((e,t)=>{t?y.current.set(e,t):y.current.delete(e)},[]),S=(0,Z.useCallback)(async e=>{let t=e.data?.title?`"${e.data.title}"`:`#${e.id}`;if(window.confirm(`Delete note ${t}?\n\nIt is removed from this path and moves to the workspace trash if nothing else links it.`))try{await s(e.id)}catch{}},[s]),C=(0,Z.useMemo)(()=>{let e=[...n];return e.sort((e,t)=>{let n=new Date(e.createdAt).getTime()-new Date(t.createdAt).getTime();return f===`asc`?n:-n}),e},[n,f]),w=(0,Z.useMemo)(()=>{let e=c.trim().toLowerCase();if(!e)return[];let t=[];for(let n of C){let r=String(n.data?.content??``),i=String(n.data?.title??``),a=r.toLowerCase().indexOf(e);a>=0?t.push({docId:n.id,offset:a}):i.toLowerCase().includes(e)&&t.push({docId:n.id,offset:-1})}return t},[c,C]),T=w.length?w[Math.min(u,w.length-1)]:null;(0,Z.useEffect)(()=>{T&&v.current.get(T.docId)?.scrollIntoView({block:`center`,behavior:`smooth`})},[T]);let E=(0,Z.useCallback)(e=>{if(!w.length)return;let t=e?(u+1)%w.length:u;e&&d(t);let n=w[t],r=y.current.get(n.docId);r&&n.offset>=0&&(r.focus(),r.setSelectionRange(n.offset,n.offset+c.trim().length)),v.current.get(n.docId)?.scrollIntoView({block:`center`,behavior:`smooth`})},[w,u,c]);return t?(0,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 border-b border-border px-3 py-2`,children:[(0,Q.jsxs)(`div`,{className:`relative flex-1`,children:[(0,Q.jsx)(nr,{className:`pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground`}),(0,Q.jsx)(`input`,{value:c,onChange:e=>{l(e.target.value),d(0)},onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),E(!0))},placeholder:`Search notes…`,spellCheck:!1,className:`w-full rounded-md border border-input bg-transparent py-1 pl-7 pr-14 text-xs outline-none placeholder:text-muted-foreground focus-visible:ring-1 focus-visible:ring-ring`}),c.trim()&&(0,Q.jsx)(`span`,{className:`absolute right-2 top-1/2 -translate-y-1/2 text-[10px] tabular-nums text-muted-foreground`,children:w.length?`${Math.min(u+1,w.length)}/${w.length}`:`0/0`})]}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>p(e=>e===`desc`?`asc`:`desc`),className:`rounded-md border border-border p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,title:f===`desc`?`Newest first (click for oldest first)`:`Oldest first (click for newest first)`,"aria-label":`Toggle sort order`,children:f===`desc`?(0,Q.jsx)(Vt,{className:`h-3.5 w-3.5`}):(0,Q.jsx)(Tn,{className:`h-3.5 w-3.5`})}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>h(!0),className:`flex items-center gap-1 rounded-md bg-primary px-2 py-1.5 text-xs text-primary-foreground`,title:`Add a note`,children:[(0,Q.jsx)(cn,{className:`h-3.5 w-3.5`}),`Note`]})]}),(0,Q.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:[m&&(0,Q.jsx)(ES,{target:t,onCreated:()=>{h(!1),o()},onCancel:()=>h(!1)},JSON.stringify(t)),r&&!n.length&&(0,Q.jsx)(`div`,{className:`flex items-center justify-center py-10`,children:(0,Q.jsx)(Xn,{className:`h-5 w-5 animate-spin text-muted-foreground`})}),i&&(0,Q.jsx)(`p`,{className:`px-4 py-6 text-center text-sm text-destructive`,children:i}),!r&&!i&&!C.length&&!m&&(0,Q.jsx)(`p`,{className:`px-4 py-10 text-center text-sm text-muted-foreground`,children:`No notes here yet - add the first one.`}),C.map(e=>(0,Q.jsx)(TS,{doc:e,updateWorkspace:a?.workspaceName??null,registerEl:b,registerBody:x,highlighted:T?.docId===e.id,onLinkTo:()=>_(e.id),onDelete:()=>S(e)},e.id))]}),g!==null&&(0,Q.jsx)(xS,{documentId:g,workspaceName:a?.workspaceName,onClose:()=>_(null)})]}):(0,Q.jsx)(`div`,{className:`flex h-full items-center justify-center p-6 text-center text-sm text-muted-foreground`,children:As(t)})}var OS=`2.1`,kS=new Set([`completed`,`cancelled`]);function AS({doc:e,updateWorkspace:t,registerEl:n,registerBody:r,highlighted:i,onLinkTo:a,onDelete:o,onStatusSaved:s}){let[c,l]=(0,Z.useState)(String(e.data?.title??``)),[u,d]=(0,Z.useState)(String(e.data?.description??``)),[f,p]=(0,Z.useState)(e.data?.status||`pending`),[m,h]=(0,Z.useState)(P_(e.data?.dueDate)),[g,_]=(0,Z.useState)(`idle`),{replicating:v,label:y}=Hi(e),b=(0,Z.useRef)({title:String(e.data?.title??``),description:String(e.data?.description??``)}),x=(0,Z.useRef)(null),S=(0,Z.useRef)(0),C=(0,Z.useCallback)(async n=>{if(!t||!n.title.trim())return!1;let r=++S.current;_(`saving`);try{let i=F_(n.due),a={...e.data||{},title:n.title.trim(),...n.description.trim()?{description:n.description.trim()}:{description:void 0},status:n.status,completed:n.status===`completed`};return i?a.dueDate=i:delete a.dueDate,await _o(t,{id:e.id,schema:e.schema,schemaVersion:e.schemaVersion,data:a,metadata:e.metadata}),r!==S.current||(b.current={title:n.title,description:n.description},_(`saved`),setTimeout(()=>_(e=>e===`saved`?`idle`:e),1500),!0)}catch{return r===S.current&&_(`error`),!1}},[e.id,e.schema,e.schemaVersion,e.data,e.metadata,t]),w=(0,Z.useCallback)((e,t)=>{(e!==b.current.title||t!==b.current.description)&&(_(`dirty`),x.current&&clearTimeout(x.current),x.current=setTimeout(()=>C({title:e,description:t,status:f,due:m}),SS))},[C,f,m]),T=(0,Z.useCallback)(()=>{x.current&&=(clearTimeout(x.current),null),C({title:c,description:u,status:f,due:m})},[C,c,u,f,m]);(0,Z.useEffect)(()=>()=>{x.current&&clearTimeout(x.current)},[]);let E=(0,Z.useCallback)(async()=>{let t=f,n=f===`completed`?`pending`:`completed`;p(n),await C({title:c,description:u,status:n,due:m})?s(e.id,n):p(t)},[f,C,c,u,m,e.id,s]),D=(0,Z.useCallback)(e=>{h(e),x.current&&=(clearTimeout(x.current),null),C({title:c,description:u,status:f,due:e})},[C,c,u,f]),O=kS.has(f);return(0,Q.jsxs)(`div`,{ref:t=>n(e.id,t),className:q(`group border-t border-border/60 px-4 py-3 transition-colors`,i&&`bg-primary/5`),children:[(0,Q.jsxs)(`div`,{className:`mb-1 flex items-baseline justify-between gap-2`,children:[(0,Q.jsxs)(`span`,{className:`flex min-w-0 items-center gap-1.5 text-[10px] uppercase tracking-wide text-muted-foreground/70`,children:[(0,Q.jsxs)(`span`,{className:`shrink-0`,children:[CS(e.createdAt),` · #`,e.id,f!==`pending`&&(0,Q.jsxs)(`span`,{children:[` · `,j_[f]??f]})]}),(0,Q.jsx)(Rv,{value:m,onChange:D,compact:!0,placeholder:`No due date`,className:`w-[168px] shrink-0 normal-case tracking-normal`})]}),(0,Q.jsxs)(`span`,{className:`flex items-center gap-1 text-[10px] text-muted-foreground/70`,children:[g===`saving`&&(0,Q.jsx)(Xn,{className:`inline h-3 w-3 animate-spin`}),v&&(0,Q.jsx)(`span`,{className:`whitespace-nowrap`,children:y}),g===`saved`&&(0,Q.jsx)(ae,{className:`inline h-3 w-3 text-success`}),g===`dirty`&&`·`,g===`error`&&(0,Q.jsx)(`span`,{className:`text-destructive`,children:`save failed`}),(0,Q.jsx)(bS,{onLinkTo:a,onDelete:o})]})]}),(0,Q.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:E,className:`mt-0.5 shrink-0 text-muted-foreground transition-colors hover:text-foreground`,"aria-label":O?`Mark as pending`:`Mark as completed`,title:O?`Mark as pending`:`Mark as completed`,children:O?(0,Q.jsx)(xe,{className:`h-4 w-4 text-success`}):(0,Q.jsx)(un,{className:`h-4 w-4`})}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`input`,{value:c,onChange:e=>{l(e.target.value),w(e.target.value,u)},onBlur:T,placeholder:`Untitled`,spellCheck:!1,className:q(`mb-1 w-full border-0 bg-transparent p-0 text-sm font-semibold outline-none placeholder:text-muted-foreground/50`,O?`text-muted-foreground line-through`:`text-foreground`)}),(0,Q.jsx)(yS,{value:u,onChange:e=>{d(e),w(c,e)},onBlur:T,placeholder:`Description…`,innerRef:t=>r(e.id,t)})]})]})]})}function jS({target:e,onCreated:t,onCancel:n}){let[r,i]=(0,Z.useState)(``),[a,o]=(0,Z.useState)(``),[s,c]=(0,Z.useState)(I_()),[l,u]=(0,Z.useState)(!1),[d,f]=(0,Z.useState)(null);return(0,Q.jsxs)(`div`,{className:`border-t border-border/60 bg-muted/30 px-4 py-3`,children:[(0,Q.jsxs)(`div`,{className:`mb-1 flex items-baseline justify-between`,children:[(0,Q.jsx)(`span`,{className:`text-[10px] uppercase tracking-wide text-muted-foreground/70`,children:`New todo`}),(0,Q.jsx)(`button`,{type:`button`,onClick:n,className:`text-muted-foreground hover:text-foreground`,"aria-label":`Discard draft`,children:(0,Q.jsx)(W,{className:`h-3 w-3`})})]}),(0,Q.jsx)(`input`,{value:r,onChange:e=>i(e.target.value),placeholder:`What needs doing?`,autoFocus:!0,spellCheck:!1,className:`mb-1 w-full border-0 bg-transparent p-0 text-sm font-semibold text-foreground outline-none placeholder:text-muted-foreground/50`}),(0,Q.jsx)(yS,{value:a,onChange:o,placeholder:`Description (optional)…`}),(0,Q.jsx)(`div`,{className:`mt-2`,children:(0,Q.jsx)(Rv,{value:s,onChange:c,compact:!0,placeholder:`No due date`,className:`w-[188px]`})}),d&&(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-destructive`,children:d}),(0,Q.jsx)(`div`,{className:`mt-2 flex justify-end`,children:(0,Q.jsx)(`button`,{type:`button`,onClick:async()=>{if(!(!r.trim()||!e||l)){u(!0),f(null);try{await vs(e,[{schema:Oo,schemaVersion:OS,data:L_({title:r,description:a,status:`pending`,priority:``,due:s}),metadata:{features:[]}}]),t()}catch(e){f(e instanceof Error?e.message:`Failed to create todo`),u(!1)}}},disabled:!r.trim()||l,className:`rounded-md bg-primary px-2.5 py-1 text-xs text-primary-foreground disabled:opacity-50`,children:l?`Saving…`:`Save todo`})})]})}function MS({autoAdd:e=!1}){let t=vS(),{docs:n,setDocs:r,loading:i,error:a,scope:o,reload:s,removeDoc:c}=wS(t,Oo),[l,u]=(0,Z.useState)(``),[d,f]=(0,Z.useState)(0),[p,m]=(0,Z.useState)(`desc`),[h,g]=(0,Z.useState)(!1),[_,v]=(0,Z.useState)(e),[y,b]=(0,Z.useState)(null),x=(0,Z.useRef)(new Map),S=(0,Z.useRef)(new Map),C=(0,Z.useCallback)((e,t)=>{t?x.current.set(e,t):x.current.delete(e)},[]),w=(0,Z.useCallback)((e,t)=>{t?S.current.set(e,t):S.current.delete(e)},[]),T=(0,Z.useCallback)(async e=>{let t=e.data?.title?`"${e.data.title}"`:`#${e.id}`;if(window.confirm(`Delete todo ${t}?\n\nIt is removed from this path and moves to the workspace trash if nothing else links it.`))try{await c(e.id)}catch{}},[c]),E=(0,Z.useCallback)((e,t)=>{r(n=>n.map(n=>n.id===e?{...n,data:{...n.data||{},status:t,completed:t===`completed`}}:n))},[r]),D=(0,Z.useMemo)(()=>{let e=h?[...n]:n.filter(e=>!kS.has(String(e.data?.status??`pending`)));return e.sort((e,t)=>{let n=new Date(e.createdAt).getTime()-new Date(t.createdAt).getTime();return p===`asc`?n:-n}),e},[n,p,h]),O=(0,Z.useMemo)(()=>n.filter(e=>kS.has(String(e.data?.status??`pending`))).length,[n]),k=(0,Z.useMemo)(()=>{let e=l.trim().toLowerCase();if(!e)return[];let t=[];for(let n of D){let r=String(n.data?.description??``),i=String(n.data?.title??``),a=r.toLowerCase().indexOf(e);a>=0?t.push({docId:n.id,offset:a}):i.toLowerCase().includes(e)&&t.push({docId:n.id,offset:-1})}return t},[l,D]),A=k.length?k[Math.min(d,k.length-1)]:null;(0,Z.useEffect)(()=>{A&&x.current.get(A.docId)?.scrollIntoView({block:`center`,behavior:`smooth`})},[A]);let j=(0,Z.useCallback)(e=>{if(!k.length)return;let t=e?(d+1)%k.length:d;e&&f(t);let n=k[t],r=S.current.get(n.docId);r&&n.offset>=0&&(r.focus(),r.setSelectionRange(n.offset,n.offset+l.trim().length)),x.current.get(n.docId)?.scrollIntoView({block:`center`,behavior:`smooth`})},[k,d,l]);return t?(0,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 border-b border-border px-3 py-2`,children:[(0,Q.jsxs)(`div`,{className:`relative flex-1`,children:[(0,Q.jsx)(nr,{className:`pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground`}),(0,Q.jsx)(`input`,{value:l,onChange:e=>{u(e.target.value),f(0)},onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),j(!0))},placeholder:`Search todos…`,spellCheck:!1,className:`w-full rounded-md border border-input bg-transparent py-1 pl-7 pr-14 text-xs outline-none placeholder:text-muted-foreground focus-visible:ring-1 focus-visible:ring-ring`}),l.trim()&&(0,Q.jsx)(`span`,{className:`absolute right-2 top-1/2 -translate-y-1/2 text-[10px] tabular-nums text-muted-foreground`,children:k.length?`${Math.min(d+1,k.length)}/${k.length}`:`0/0`})]}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>g(e=>!e),className:q(`rounded-md border p-1.5 transition-colors`,h?`border-foreground text-foreground`:`border-border text-muted-foreground hover:bg-muted hover:text-foreground`),title:h?`Hide done items`:`Show done items${O?` (${O})`:``}`,"aria-label":h?`Hide done items`:`Show done items`,children:h?(0,Q.jsx)(Zn,{className:`h-3.5 w-3.5`}):(0,Q.jsx)(Pt,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>m(e=>e===`desc`?`asc`:`desc`),className:`rounded-md border border-border p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,title:p===`desc`?`Newest first (click for oldest first)`:`Oldest first (click for newest first)`,"aria-label":`Toggle sort order`,children:p===`desc`?(0,Q.jsx)(Vt,{className:`h-3.5 w-3.5`}):(0,Q.jsx)(Tn,{className:`h-3.5 w-3.5`})}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>v(!0),className:`flex items-center gap-1 rounded-md bg-primary px-2 py-1.5 text-xs text-primary-foreground`,title:`Add a todo`,children:[(0,Q.jsx)(cn,{className:`h-3.5 w-3.5`}),`Todo`]})]}),(0,Q.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:[_&&(0,Q.jsx)(jS,{target:t,onCreated:()=>{v(!1),s()},onCancel:()=>v(!1)}),i&&!n.length&&(0,Q.jsx)(`div`,{className:`flex items-center justify-center py-10`,children:(0,Q.jsx)(Xn,{className:`h-5 w-5 animate-spin text-muted-foreground`})}),a&&(0,Q.jsx)(`p`,{className:`px-4 py-6 text-center text-sm text-destructive`,children:a}),!i&&!a&&!D.length&&!_&&(0,Q.jsx)(`p`,{className:`px-4 py-10 text-center text-sm text-muted-foreground`,children:O?`Nothing pending - ${O} done item${O>1?`s`:``} hidden.`:`No todos here yet - add the first one.`}),D.map(e=>(0,Q.jsx)(AS,{doc:e,updateWorkspace:o?.workspaceName??null,registerEl:C,registerBody:w,highlighted:A?.docId===e.id,onLinkTo:()=>b(e.id),onDelete:()=>T(e),onStatusSaved:E},e.id))]}),y!==null&&(0,Q.jsx)(xS,{documentId:y,workspaceName:o?.workspaceName,onClose:()=>b(null)})]}):(0,Q.jsx)(`div`,{className:`flex h-full items-center justify-center p-6 text-center text-sm text-muted-foreground`,children:As(t)})}var NS=(0,Z.createContext)(null);function PS(){let e=(0,Z.useContext)(NS);if(!e)throw Error(`useLensFeed must be used within a LensFeedProvider`);return e}function FS(e=!0){let{registerViewer:t}=PS();(0,Z.useEffect)(()=>{if(e)return t()},[e,t])}var IS=[{id:`720p`,label:`720p`,width:1280,height:720},{id:`1080p`,label:`1080p`,width:1920,height:1080},{id:`4k`,label:`4K`,width:3840,height:2160}],LS=`canvas.lens.camera`,RS={min:1,max:4,step:.1,hardware:!1};function zS(){let e={deviceId:null,resolution:`1080p`};try{let t=JSON.parse(localStorage.getItem(LS)||`null`);return t?{deviceId:typeof t.deviceId==`string`?t.deviceId:null,resolution:IS.some(e=>e.id===t.resolution)?t.resolution:e.resolution}:e}catch{return e}}function BS(e,t){let n=IS.find(t=>t.id===e.resolution)??IS[1];return{...t&&e.deviceId?{deviceId:{exact:e.deviceId}}:{facingMode:`environment`},width:{ideal:n.width},height:{ideal:n.height}}}function VS(e={}){let t=(0,Z.useRef)(null),n=(0,Z.useRef)(e.onEnded);(0,Z.useEffect)(()=>{n.current=e.onEnded});let r=(0,Z.useRef)(null),i=(0,Z.useRef)(null),[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)(null),[l,u]=(0,Z.useState)(null),[d,f]=(0,Z.useState)(zS),p=(0,Z.useRef)(d),[m,h]=(0,Z.useState)([]),[g,_]=(0,Z.useState)(!1),[v,y]=(0,Z.useState)(null),[b,x]=(0,Z.useState)(null),[S,C]=(0,Z.useState)(1),w=(0,Z.useRef)(1),[T,E]=(0,Z.useState)(!1),D=(0,Z.useRef)(null),O=()=>r.current?.getVideoTracks()[0]??null,k=(0,Z.useCallback)(async e=>{let t=O();if(!t)return!1;try{return await t.applyConstraints({advanced:[e]}),!0}catch{return!1}},[]),A=(0,Z.useCallback)(async()=>{try{let e=(await navigator.mediaDevices.enumerateDevices()).filter(e=>e.kind===`videoinput`&&e.deviceId);h(e.map((e,t)=>({deviceId:e.deviceId,label:e.label||`Camera ${t+1}`})))}catch{}},[]),j=(0,Z.useCallback)(()=>{D.current&&window.clearTimeout(D.current),r.current?.getTracks().forEach(e=>e.stop()),r.current=null,t.current&&(t.current.srcObject=null),c(null),o(!1),_(!1),y(null),x(null),C(1),w.current=1,E(!1)},[]),M=(0,Z.useCallback)(async(e,i)=>{r.current=e,e.getVideoTracks().forEach(e=>{e.onended=()=>{j(),n.current?.()}}),t.current&&(t.current.srcObject=e,await t.current.play().catch(()=>{}));let a=e.getVideoTracks()[0],s=a?.getSettings();if(x(s?.width&&s?.height?{width:s.width,height:s.height}:null),_(i),E(!1),i&&a){let e=a.getCapabilities?.()??{};y(e),e.focusMode?.includes(`continuous`)&&await k({focusMode:`continuous`});let t=a.getSettings().zoom;C(e.zoom?t??e.zoom.min:1),w.current=1,A()}c(e),o(!0)},[j,k,A]),N=(0,Z.useCallback)(async e=>{try{return await navigator.mediaDevices.getUserMedia({video:BS(e,!0),audio:!1})}catch(t){let n=t?.name;if(e.deviceId&&(n===`OverconstrainedError`||n===`NotFoundError`||n===`NotReadableError`))return navigator.mediaDevices.getUserMedia({video:BS(e,!1),audio:!1});throw t}},[]),P=(0,Z.useCallback)(async()=>{if(u(null),!window.isSecureContext)return u(`Camera needs a secure context (https or localhost).`),!1;if(!navigator.mediaDevices?.getUserMedia)return u(`Camera API not available in this browser.`),!1;try{let e=await N(p.current);return await M(e,!0),!0}catch(e){let t=e?.name;return u(t===`NotAllowedError`?`Camera permission denied.`:t===`NotFoundError`?`No camera found.`:`Camera failed: ${e?.message||t||`unknown error`}`),o(!1),!1}},[M,N]),ee=(0,Z.useCallback)(async()=>{if(u(null),!window.isSecureContext)return u(`Screen capture needs a secure context (https or localhost).`),!1;if(!navigator.mediaDevices?.getDisplayMedia)return u(`Screen capture API not available in this browser.`),!1;try{let e=await navigator.mediaDevices.getDisplayMedia({video:{width:{ideal:1280},height:{ideal:720}},audio:!1});return await M(e,!1),!0}catch(e){let t=e?.name;return u(t===`NotAllowedError`?`Screen capture cancelled.`:`Screen capture failed: ${e?.message||t||`unknown error`}`),o(!1),!1}},[M]),F=(0,Z.useCallback)(e=>{let t={...p.current,...e};p.current=t,f(t);try{localStorage.setItem(LS,JSON.stringify(t))}catch{}!r.current||!g||(r.current.getTracks().forEach(e=>{e.onended=null,e.stop()}),r.current=null,P().then(e=>{e||(j(),n.current?.())}))},[g,P,j]),I=(0,Z.useCallback)(e=>{C(e),v?.zoom?k({zoom:e}):w.current=e},[v,k]),L=(0,Z.useCallback)(e=>{k({torch:e}).then(t=>{t&&E(e)})},[k]),R=!!v?.focusMode?.some(e=>e===`single-shot`||e===`continuous`),te=(0,Z.useCallback)(e=>{let t=v?.focusMode??[];if(!t.length)return;D.current&&window.clearTimeout(D.current);let n=navigator.mediaDevices.getSupportedConstraints(),r=e&&n.pointsOfInterest?{pointsOfInterest:[e]}:{};t.includes(`single-shot`)?(k({...r,focusMode:`single-shot`}),t.includes(`continuous`)&&(D.current=window.setTimeout(()=>void k({...r,focusMode:`continuous`}),1500))):k({...r,focusMode:`continuous`})},[v,k]),z=(0,Z.useCallback)((e=640,n=.72)=>{let r=t.current;if(!r||r.readyState<2||!r.videoWidth)return null;let a=Math.max(1,w.current),o=r.videoWidth/a,s=r.videoHeight/a,c=(r.videoWidth-o)/2,l=(r.videoHeight-s)/2,u=Math.min(1,e/Math.max(o,s)),d=Math.round(o*u),f=Math.round(s*u);i.current||=document.createElement(`canvas`);let p=i.current;p.width=d,p.height=f;let m=p.getContext(`2d`);return m?(m.drawImage(r,c,l,o,s,0,0,d,f),p.toDataURL(`image/jpeg`,n)):null},[]);return(0,Z.useEffect)(()=>j,[j]),{videoRef:t,stream:s,active:a,error:l,start:P,startScreen:ee,stop:j,captureFrame:z,camera:(0,Z.useMemo)(()=>g?{devices:m,prefs:d,setPrefs:F,size:b,zoomRange:v?.zoom?{min:v.zoom.min,max:v.zoom.max,step:v.zoom.step||.1,hardware:!0}:RS,zoom:S,setZoom:I,torchSupported:!!v?.torch,torch:T,setTorch:L,focusSupported:R,focusAt:te}:null,[g,m,d,F,b,v,S,I,T,L,R,te])}}async function HS(e,t,n={}){let r={limit:n.limit??12,scope:n.contextPath?`path`:`workspace`};t&&(r.image=t),n.similarTo&&(r.similarTo=n.similarTo);let i=n.q?.trim();i&&(r.q=i),n.maxDistance!=null&&Number.isFinite(n.maxDistance)&&(r.maxDistance=n.maxDistance),n.minDistance!=null&&Number.isFinite(n.minDistance)&&(r.minDistance=n.minDistance),n.debug&&(r.debug=!0),n.idsOnly&&(r.idsOnly=!0),n.contextPath&&(r.context=n.contextPath),n.treeId&&(r.treeNameOrTreeId=n.treeId),n.features&&Object.assign(r,n.features),n.filters&&(r.filters=n.filters),n.applyCanvasQuerySpec!==void 0&&(r.applyCanvasQuerySpec=n.applyCanvasQuerySpec);let a=await Y.postEnvelope(`${Sr.workspaces}/${encodeURIComponent(e)}/documents/search/image`,r,n.signal?{signal:n.signal}:void 0),o=a.payload??[],s=n.idsOnly===!0;return{documents:s?[]:o,ids:s?o:o.map(e=>e.id),count:a.count??o.length,totalCount:a.totalCount??o.length,distances:a.debug?.distances??a.debug?.imageDistances??null}}var US=[{label:`0.5 fps`,ms:2e3},{label:`1 fps`,ms:1e3},{label:`2 fps`,ms:500},{label:`5 fps`,ms:200},{label:`10 fps`,ms:100},{label:`15 fps`,ms:67},{label:`30 fps`,ms:33}],WS=1e3,GS=32,KS=12,qS=`canvas.lens.fit`;function JS({className:e,interactive:t=!1}){let{stream:n,camera:r,fit:i}=PS(),a=(0,Z.useRef)(null),[o,s]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{let e=a.current;if(e)return e.srcObject=n,n&&e.play().catch(()=>{}),()=>{e.srcObject=null}},[n]),(0,Z.useEffect)(()=>{if(!o)return;let e=window.setTimeout(()=>s(null),900);return()=>window.clearTimeout(e)},[o]);let c=r&&!r.zoomRange.hardware?r.zoom:1;return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`video`,{ref:a,muted:!0,playsInline:!0,onClick:t?e=>{let t=a.current;if(!t||!r?.focusSupported||!t.videoWidth)return;let n=t.getBoundingClientRect(),o=(e.clientX-n.left)/n.width,l=(e.clientY-n.top)/n.height,u=.5+(o-.5)/c,d=.5+(l-.5)/c,f=i===`contain`?Math.min(n.width/t.videoWidth,n.height/t.videoHeight):Math.max(n.width/t.videoWidth,n.height/t.videoHeight),p=t.videoWidth*f/n.width,m=t.videoHeight*f/n.height,h=.5+(u-.5)/p,g=.5+(d-.5)/m;h<0||h>1||g<0||g>1||(r.focusAt({x:h,y:g}),s({x:o,y:l,key:Date.now()}))}:void 0,style:c===1?void 0:{transform:`scale(${c})`},className:q(e,i===`contain`?`object-contain`:`object-cover`,t&&r?.focusSupported&&`cursor-crosshair`)}),o&&(0,Q.jsx)(`span`,{"aria-hidden":!0,className:`pointer-events-none absolute h-10 w-10 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white/90 animate-fade-in`,style:{left:`${o.x*100}%`,top:`${o.y*100}%`}},o.key)]})}function YS({children:e}){let t=$o(),n=(0,Z.useRef)(t);(0,Z.useEffect)(()=>{n.current=t});let r=t?.state.activeWorkspaceName??null,i=t!==null,a=(0,Z.useRef)(()=>{}),{videoRef:o,stream:s,camera:c,error:l,start:u,startScreen:d,stop:f,captureFrame:p}=VS({onEnded:()=>a.current()}),[m,h]=(0,Z.useState)(null),g=(0,Z.useRef)(m);(0,Z.useEffect)(()=>{g.current=m},[m]);let[_,v]=(0,Z.useState)(null),[y,b]=(0,Z.useState)(!1),[x,S]=(0,Z.useState)(WS),[C,w]=(0,Z.useState)(``),[T,E]=(0,Z.useState)(``),[D,O]=(0,Z.useState)(null),[k,A]=(0,Z.useState)(null),[j,M]=(0,Z.useState)(null),[N,P]=(0,Z.useState)([]),[ee,F]=(0,Z.useState)(null),[I,L]=(0,Z.useState)(null),R=I&&I.frame===ee?I:null,te=(0,Z.useRef)(null),[z,ne]=(0,Z.useState)(0),[B,re]=(0,Z.useState)(``),[V,ie]=(0,Z.useState)(()=>{try{return localStorage.getItem(qS)===`cover`?`cover`:`contain`}catch{return`contain`}}),ae=(0,Z.useCallback)(e=>{ie(e);try{localStorage.setItem(qS,e)}catch{}},[]),oe=(0,Z.useRef)({running:!1,paused:!1,consumer:null,workspaceRef:``,contextPath:null,text:``,maxDistance:NaN,rateMs:WS,snapshot:!1}),H=(0,Z.useRef)([]),se=(0,Z.useRef)(new Map),ce=(0,Z.useRef)(null),U=(0,Z.useRef)(null),le=(0,Z.useRef)(null),ue=(0,Z.useRef)(0),de=(0,Z.useRef)(``),fe=(0,Z.useRef)(!1),pe=(0,Z.useRef)(async()=>{}),me=(0,Z.useRef)(()=>{});(0,Z.useEffect)(()=>{oe.current.text=T,oe.current.maxDistance=C===``?NaN:Number(C),oe.current.rateMs=x,oe.current.paused=y},[T,C,x,y]);let he=(0,Z.useCallback)(()=>(ne(e=>e+1),()=>ne(e=>Math.max(0,e-1))),[]),W=(0,Z.useCallback)(e=>{H.current=[...H.current.slice(-2),e];let t=H.current,r=[...new Set(t.flat())],i=t.length<2?e:r.filter(e=>t.filter(t=>t.includes(e)).length>=2);M(i.length);let a=ce.current;(!a||a.length!==i.length||a.some((e,t)=>e!==i[t]))&&(ce.current=i,n.current?.setLensIds(i))},[]),ge=(0,Z.useCallback)((e,t)=>{for(let n of e)se.current.set(n.id,{doc:n,distance:t.get(n.id)});let n=e.map(e=>e.id);H.current=[...H.current.slice(-2),n];let r=H.current,i=r[r.length-1]??[],a=r.length<2?i:i.filter(e=>r.filter(t=>t.includes(e)).length>=2),o=[...se.current.keys()].filter(e=>!i.includes(e)&&r.filter(t=>t.includes(e)).length>=2),s=[...a,...o].map(e=>se.current.get(e)).filter(e=>!!e);M(s.length),P(s)},[]),_e=(0,Z.useCallback)(async(e,t)=>{let r=performance.now(),i=t.consumer===`applet`;le.current?.abort();let a=new AbortController;le.current=a;try{let o=n.current?.state,s=!i&&o?.activeContextType===`context`,c=await HS(t.workspaceRef,e,{q:i&&t.text||void 0,maxDistance:Number.isFinite(t.maxDistance)?t.maxDistance:void 0,contextPath:s?o.activeContextPath:i?t.contextPath:null,treeId:s?o.activeTreeName:null,features:s?o.filters.features:void 0,filters:s?[...Jy(o.filters.timeline),...Gy(o.filters.geo),...Ky(o.filters.lens,o.filters.geo.includeUnlocated)]:void 0,applyCanvasQuerySpec:!s&&void 0,limit:i?KS:GS,idsOnly:!i,debug:i,signal:a.signal});return a.signal.aborted||oe.current!==t||!t.running?!1:(ue.current=0,A(Math.round(performance.now()-r)),O(null),i?ge(c.documents,new Map((c.distances??[]).map(e=>[e.id,e.distance]))):W(c.ids),!0)}catch(e){return a.signal.aborted||oe.current!==t||!t.running?!1:(ue.current++,e?.name!==`AbortError`&&O(e?.message||`search failed`),!1)}},[ge,W]),ve=(0,Z.useCallback)(async()=>{let e=oe.current;if(!e.running)return;let t=performance.now();if(!e.paused&&!e.snapshot){let t=p();t&&e.workspaceRef&&await _e(t,e)}if(oe.current.running){let e=Math.max(ue.current?Math.min(3e4,1e3*2**Math.min(ue.current-1,5)):0,oe.current.rateMs-(performance.now()-t));U.current=window.setTimeout(()=>void pe.current(),e)}},[p,_e]);(0,Z.useEffect)(()=>{pe.current=ve},[ve]);let ye=(0,Z.useCallback)(()=>{let e=oe.current.consumer===`filter`;oe.current.running=!1,ue.current=0,oe.current.consumer=null,U.current&&window.clearTimeout(U.current),le.current?.abort(),f(),H.current=[],se.current.clear(),ce.current=null,h(null),v(null),b(!1),re(``),P([]),F(null),M(null),A(null),O(null),e&&n.current?.state.activeContextType!==`context`&&n.current?.setLensIds(null)},[f]);(0,Z.useEffect)(()=>{a.current=ye},[ye]);let G=(0,Z.useCallback)(async(e,t,r)=>{if(!r.workspaceRef||fe.current||(oe.current.running&&ye(),e===`photo`&&!r.image))return!1;fe.current=!0;let i=e===`photo`?!0:e===`camera`?await u():await d();return fe.current=!1,i?(H.current=[],se.current.clear(),ce.current=null,P([]),M(null),O(null),re(r.workspaceRef),oe.current={...oe.current,running:!0,paused:!1,consumer:t,workspaceRef:r.workspaceRef,contextPath:r.contextPath??null,snapshot:e===`photo`},F(e===`photo`?r.image:null),h(e),v(t),b(!1),t===`filter`&&n.current?.setLensIds([]),e===`photo`?me.current(r.image):ve(),!0):!1},[u,d,ye,ve]),K=JSON.stringify(t?{contextId:t.state.activeContextId,path:t.state.activeContextPath,tree:t.state.activeTreeName,features:t.state.filters.features,timeline:t.state.filters.timeline,geo:t.state.filters.geo,gps:t.state.filters.lens.gps}:null);(0,Z.useEffect)(()=>{de.current!==K&&(de.current=K,oe.current.consumer===`filter`&&(le.current?.abort(),H.current=[],ce.current=null,n.current?.setLensIds([])))},[K]);let be=(0,Z.useCallback)(e=>{oe.current.contextPath=e},[]),xe=(0,Z.useCallback)(e=>{oe.current.paused=e,b(e)},[]),Se=JSON.stringify([T,C,K]),Ce=(0,Z.useRef)(Se);(0,Z.useEffect)(()=>{Ce.current=Se});let we=(0,Z.useCallback)(e=>{let t=oe.current;!t.running||!t.workspaceRef||(te.current={frame:e,key:Ce.current},H.current=[],se.current.clear(),ce.current=null,M(null),_e(e,t))},[_e]);(0,Z.useEffect)(()=>{me.current=we},[we]);let Te=(0,Z.useCallback)(()=>{let e=oe.current;if(!e.running)return;let t=p(1280,.85);t&&(e.snapshot=!0,F(t),we(t))},[p,we]),Ee=(0,Z.useCallback)(()=>{if(oe.current.running&&g.current===`photo`){ye();return}oe.current.snapshot=!1,le.current?.abort(),H.current=[],se.current.clear(),F(null)},[ye]),De=(0,Z.useCallback)(async(e,t,n)=>{let r=oe.current;return r.running&&r.consumer===t&&g.current===`camera`?(r.snapshot=!0,F(e),we(e),!0):G(`photo`,t,{...n,image:e})},[G,we]);(0,Z.useEffect)(()=>{if(!ee)return;let e=!0,t=new Image;return t.onload=()=>{e&&L({frame:ee,width:t.naturalWidth,height:t.naturalHeight})},t.src=ee,()=>{e=!1}},[ee]),(0,Z.useEffect)(()=>{if(!ee)return;let e=te.current;if(e&&e.frame===ee&&e.key===Se)return;let t=window.setTimeout(()=>we(ee),350);return()=>window.clearTimeout(t)},[ee,Se,we]),(0,Z.useEffect)(()=>{!i||!oe.current.running||r&&r===oe.current.workspaceRef||ye()},[i,r,ye]);let Oe=(0,Z.useCallback)(()=>{let e=n.current;if(e){if(oe.current.consumer===`applet`){e.setView(`apps`),e.openApplet(`lens`);return}e.setView(`tools`),e.setToolsTab(`lens`)}},[]);(0,Z.useEffect)(()=>ye,[ye]);let ke=(0,Z.useMemo)(()=>({source:m,running:m!==null,paused:y,consumer:_,stream:s,camera:c,fit:V,setFit:ae,workspaceRef:B,rateMs:x,setRateMs:S,maxDistance:C,setMaxDistance:w,text:T,setText:E,error:l||D,latencyMs:k,lastCount:j,hits:N,start:G,setContextPath:be,stop:ye,setPaused:xe,snapshot:ee,takeSnapshot:Te,clearSnapshot:Ee,snapshotSize:R,searchPhoto:De,reopen:Oe,hasViewer:z>0,registerViewer:he}),[m,y,_,s,c,V,ae,B,x,C,T,l,D,k,j,N,G,be,ye,xe,ee,Te,Ee,R,De,Oe,z,he]);return(0,Q.jsxs)(NS.Provider,{value:ke,children:[e,(0,Q.jsx)(`video`,{ref:o,muted:!0,playsInline:!0,"aria-hidden":!0,className:`pointer-events-none fixed bottom-0 left-0 h-px w-px opacity-0`})]})}var XS=`h-7 min-w-0 rounded-md border border-input bg-transparent px-1.5 text-xs outline-none focus-visible:ring-1 focus-visible:ring-ring`,ZS=`flex h-7 items-center gap-1 rounded-md border border-border px-2 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,QS=e=>`${e<10?e.toFixed(1):Math.round(e)}×`;function $S({className:e}){let{camera:t,fit:n,setFit:r}=PS();if(!t)return null;let{devices:i,prefs:a,setPrefs:o,size:s,zoomRange:c,zoom:l,setZoom:u}=t,d=c.max>c.min;return(0,Q.jsxs)(`div`,{className:q(`flex flex-col gap-2`,e),children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[i.length>1&&(0,Q.jsxs)(`select`,{className:q(XS,`max-w-[12rem] flex-1`),value:a.deviceId??``,onChange:e=>o({deviceId:e.target.value||null}),title:`Camera / lens. On phones with several rear cameras, pick the main or wide one if the picture is too zoomed in.`,"aria-label":`Camera`,children:[(0,Q.jsx)(`option`,{value:``,children:`Default rear camera`}),i.map(e=>(0,Q.jsx)(`option`,{value:e.deviceId,children:e.label},e.deviceId))]}),(0,Q.jsx)(`select`,{className:XS,value:a.resolution,onChange:e=>o({resolution:e.target.value}),title:s?`Requested resolution — camera is delivering ${s.width}×${s.height}`:`Requested resolution`,"aria-label":`Resolution`,children:IS.map(e=>(0,Q.jsx)(`option`,{value:e.id,children:e.label},e.id))}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>r(n===`contain`?`cover`:`contain`),className:ZS,title:n===`contain`?`Showing the whole frame — switch to fill the preview`:`Filling the preview (edges cropped) — switch to the whole frame`,"aria-label":n===`contain`?`Fill preview`:`Fit whole frame`,children:n===`contain`?(0,Q.jsx)(jn,{className:`h-3.5 w-3.5`}):(0,Q.jsx)(jt,{className:`h-3.5 w-3.5`})}),t.focusSupported&&(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>t.focusAt(),className:ZS,title:`Refocus (or tap the preview to focus on a spot)`,children:[(0,Q.jsx)(fr,{className:`h-3.5 w-3.5`}),` Focus`]}),t.torchSupported&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>t.setTorch(!t.torch),className:q(ZS,t.torch&&`border-foreground text-foreground`),"aria-pressed":t.torch,title:t.torch?`Torch off`:`Torch on`,children:t.torch?(0,Q.jsx)(je,{className:`h-3.5 w-3.5`}):(0,Q.jsx)(v,{className:`h-3.5 w-3.5`})}),s&&(0,Q.jsxs)(`span`,{className:`text-[11px] tabular-nums text-muted-foreground`,children:[s.width,`×`,s.height]})]}),d&&(0,Q.jsxs)(`label`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,title:c.hardware?`Optical/sensor zoom`:`Digital zoom — crops the searched frame too`,children:[(0,Q.jsx)(L,{className:`h-3.5 w-3.5 shrink-0`}),(0,Q.jsx)(`input`,{type:`range`,min:c.min,max:c.max,step:c.step,value:l,onChange:e=>u(Number(e.target.value)),onDoubleClick:()=>u(c.min),className:`h-1 min-w-0 flex-1 accent-foreground`,"aria-label":`Zoom`}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>u(c.min),className:`w-10 shrink-0 text-right tabular-nums hover:text-foreground`,title:`Reset zoom`,children:QS(l)})]})]})}function eC(){let{running:e,source:t,snapshot:n,takeSnapshot:r,clearSnapshot:i,fit:a}=PS();return e?n?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`img`,{src:n,alt:`Snapshot being searched`,className:q(`absolute inset-0 h-full w-full bg-black`,a===`contain`?`object-contain`:`object-cover`)}),(0,Q.jsx)(`span`,{className:`pointer-events-none absolute left-2 top-2 rounded bg-black/60 px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-white`,children:t===`photo`?`Photo`:`Snapshot`}),(0,Q.jsx)(`button`,{type:`button`,onClick:i,className:`absolute bottom-2 left-1/2 flex h-9 -translate-x-1/2 items-center gap-1.5 rounded-full bg-black/60 px-3 text-xs font-medium text-white backdrop-blur transition-colors hover:bg-black/75`,title:t===`photo`?`Close the photo and clear its matches`:`Discard the snapshot and go back to the live feed`,children:t===`photo`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(W,{className:`h-3.5 w-3.5`}),` Close`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(ar,{className:`h-3.5 w-3.5`}),` Live`]})})]}):t===`photo`?null:(0,Q.jsx)(`button`,{type:`button`,onClick:r,"aria-label":`Take a snapshot and search it`,title:`Snapshot: freeze this frame and search for similar items`,className:`absolute bottom-2 left-1/2 flex h-12 w-12 -translate-x-1/2 items-center justify-center rounded-full border-4 border-white/90 bg-white/25 text-white shadow-lg backdrop-blur transition-transform hover:bg-white/40 active:scale-90`,children:(0,Q.jsx)(Zt,{className:`h-5 w-5`})}):null}async function tC(e,t=1280,n=.85){let r,i=null;try{r=await createImageBitmap(e,{imageOrientation:`from-image`})}catch{i=URL.createObjectURL(e);let t=new Image;t.src=i,await t.decode(),r=t}try{let e=r.width,i=r.height,a=Math.min(1,t/Math.max(e,i)),o=document.createElement(`canvas`);o.width=Math.round(e*a),o.height=Math.round(i*a);let s=o.getContext(`2d`);if(!s)throw Error(`canvas unavailable`);return s.drawImage(r,0,0,o.width,o.height),o.toDataURL(`image/jpeg`,n)}finally{`close`in r&&r.close(),i&&URL.revokeObjectURL(i)}}function nC({consumer:e,workspaceRef:t,contextPath:n,disabled:r,className:i}){let{searchPhoto:a}=PS(),o=(0,Z.useRef)(null),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)(null),d=async r=>{if(r){c(!0),u(null);try{let i=await tC(r);await a(i,e,{workspaceRef:t,contextPath:n})}catch{u(`Could not read that image.`)}finally{c(!1),o.current&&(o.current.value=``)}}};return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>o.current?.click(),disabled:r||s||!t,className:i,title:l??`Search with a photo from the camera app or gallery`,children:[(0,Q.jsx)(x,{className:`h-3.5 w-3.5`}),` `,s?`Reading…`:`Photo`]}),(0,Q.jsx)(`input`,{ref:o,type:`file`,accept:`image/*`,className:`hidden`,onChange:e=>void d(e.target.files?.[0])}),l&&(0,Q.jsx)(`span`,{className:`text-xs text-destructive`,children:l})]})}var rC=`h-8 rounded-md border border-input bg-transparent px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring`,iC=`h-8 rounded-md border border-input bg-transparent px-2 text-xs outline-none focus-visible:ring-1 focus-visible:ring-ring`;function aC({workspaceRef:e,doc:t,distance:n,onOpen:r}){let i=Fa(t),{blobUrl:a}=s_(e,t.id,256,{enabled:i}),o=Ni(t);return(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>r(t),title:`Open ${o.title}`,className:`rounded-(--card-radius) border border-border bg-card overflow-hidden flex flex-col text-left cursor-pointer transition-colors hover:border-foreground/30 hover:bg-muted/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,children:[(0,Q.jsx)(`div`,{className:`aspect-square bg-muted/40 flex items-center justify-center overflow-hidden`,children:i&&a?(0,Q.jsx)(`img`,{src:a,alt:o.title,className:`h-full w-full object-cover`}):(0,Q.jsx)(Fm,{document:t,size:10})}),(0,Q.jsxs)(`div`,{className:`p-2 min-w-0`,children:[(0,Q.jsx)(`div`,{className:`text-xs font-medium truncate`,title:o.title,children:o.title}),(0,Q.jsxs)(`div`,{className:`text-[10px] text-muted-foreground truncate`,children:[o.schemaLabel,n==null?``:` · d=${n.toFixed(3)}`]})]})]})}function oC(){let e=vS(),t=dy(),n=PS(),{rateMs:r,setRateMs:i,text:a,setText:o,maxDistance:s,setMaxDistance:c,latencyMs:l,error:u}=n,d=e?.mode===`workspace`?e.workspaceName:``,f=e?.mode===`workspace`&&e.path!==`/`?e.path:null,p=n.running&&n.consumer===`applet`,m=n.running&&n.consumer!==`applet`,h=p?n.hits:[];FS(p);let g=p?n.snapshotSize??n.camera?.size:null,_=!!g&&g.height>g.width,v=e=>{d&&n.start(e,`applet`,{workspaceRef:d,contextPath:f})},{setContextPath:y}=n;return(0,Z.useEffect)(()=>{p&&y(f)},[p,f,y]),e?.mode===`workspace`?(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-3 overflow-y-auto p-3`,children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-2`,children:[(0,Q.jsx)(`select`,{className:rC,value:r,onChange:e=>i(Number(e.target.value)),title:`Frame rate. High rates (10–30 fps) are experimental; the loop never overlaps requests, so the effective rate is capped by search latency.`,children:US.map(e=>(0,Q.jsx)(`option`,{value:e.ms,children:e.label},e.ms))}),(0,Q.jsx)(`input`,{className:q(iC,`w-44`),placeholder:`Optional text (fused mode)`,value:a,onChange:e=>o(e.target.value)}),(0,Q.jsx)(`input`,{className:q(iC,`w-28`),placeholder:`max distance`,inputMode:`decimal`,value:s,onChange:e=>c(e.target.value),title:`Cosine-distance floor (0 = identical). Empty = top-K.`}),p?(0,Q.jsxs)(`button`,{type:`button`,onClick:n.stop,className:`flex h-8 items-center gap-1 rounded-md bg-destructive px-3 text-xs font-medium text-destructive-foreground transition-colors hover:bg-destructive/90`,children:[(0,Q.jsx)(sn,{className:`h-3.5 w-3.5`}),` `,n.source===`photo`?`Close photo`:`Stop`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>v(`camera`),disabled:m,className:`flex h-8 items-center gap-1 rounded-md bg-foreground px-3 text-xs font-medium text-background transition-colors hover:bg-foreground/90 disabled:opacity-50`,children:[(0,Q.jsx)(qe,{className:`h-3.5 w-3.5`}),` Camera`]}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>v(`screen`),disabled:m,className:`flex h-8 items-center gap-1 rounded-md bg-foreground px-3 text-xs font-medium text-background transition-colors hover:bg-foreground/90 disabled:opacity-50`,children:[(0,Q.jsx)(In,{className:`h-3.5 w-3.5`}),` Desktop`]})]}),(0,Q.jsx)(nC,{consumer:`applet`,workspaceRef:d,contextPath:f,disabled:m,className:`flex h-8 items-center gap-1 rounded-md bg-foreground px-3 text-xs font-medium text-background transition-colors hover:bg-foreground/90 disabled:opacity-50`})]}),(0,Q.jsxs)(`div`,{className:q(`relative shrink-0 overflow-hidden rounded-xl border border-border bg-black/80`,_?`aspect-[3/4] max-h-[60vh]`:`aspect-video max-h-80`),children:[p&&(0,Q.jsx)(JS,{className:`h-full w-full`,interactive:!0}),p&&(0,Q.jsx)(eC,{}),!p&&(0,Q.jsxs)(`div`,{className:`absolute inset-0 flex items-center justify-center text-sm text-muted-foreground`,children:[(0,Q.jsx)(ft,{className:`mr-2 h-4 w-4`}),` camera off · or pick a photo`]})]}),p&&(0,Q.jsx)($S,{className:`shrink-0`}),(0,Q.jsx)(`div`,{className:`shrink-0 text-xs text-muted-foreground`,children:u?(0,Q.jsx)(`span`,{className:`text-destructive`,children:u}):p?(0,Q.jsxs)(Q.Fragment,{children:[n.snapshot?`snapshot`:`live`,` · `,l==null?`searching…`:`${l} ms/frame`,` · `,h.length,` match`,h.length===1?``:`es`,f?` · scoped to ${f}`:``]}):m?`The Lens filter is using the camera. Stop it there first.`:`Frames are ephemeral: embedded for the query, never stored or indexed.`}),h.length===0?(0,Q.jsx)(`div`,{className:`flex min-h-24 flex-1 items-center justify-center rounded-xl border border-dashed border-border text-sm text-muted-foreground`,children:p?n.snapshot?`Nothing similar in the snapshot`:`Nothing matching in view`:`Matches appear here`}):(0,Q.jsx)(`div`,{className:`grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4`,children:h.map(e=>(0,Q.jsx)(aC,{workspaceRef:d,doc:e.doc,distance:e.distance,onOpen:e=>t.open(e,d)},e.doc.id))})]}):(0,Q.jsx)(`div`,{className:`flex h-full items-center justify-center p-6 text-center text-sm text-muted-foreground`,children:`Lens searches a workspace. Bind it to a workspace path to start.`})}var sC=`data/schema/`,cC={"data/schema/file":{label:`Files`,icon:rn},"data/schema/note":{label:`Notes`,icon:qn},"data/schema/task":{label:`Todos`,icon:Ht},"data/schema/tab":{label:`Tabs`,icon:Xe},"data/schema/message/email":{label:`Emails`,icon:xt},"data/schema/link":{label:`Links`,icon:vn},"data/schema/identity":{label:`Identities`,icon:Ge},"data/schema/drawing":{label:`Sketches`,icon:ue}};function lC(e){return cC[e]??{label:e.startsWith(`data/schema/`)?e.slice(12).replace(/(^|\/)(\w)/g,(e,t,n)=>t+n.toUpperCase()):e,icon:Ae}}function uC(e){return cC[e]?.icon??Ae}function dC(e){return{...e,lens:Wy.lens}}function fC(e,t,n=!1){let r=n?e=>e:dC;return JSON.stringify(r(e))!==JSON.stringify(r(t??Wy))}var pC={savedGeoSelection:null,liveEnabled:!1,liveError:null,t1Open:!1,t1View:null,toolsTab:`features`,appsAppletId:null,t2Open:!1,t2AgentId:null,addModal:!1,addOpen:!1,addKind:null,addRelateTo:null,editDocument:null,editWorkspaceId:null,activeContextPath:null,activeContextType:null,activeWorkspaceName:null,activeTreeName:null,activeCanvasId:null,activeContextId:null,activeAccentColor:null,filters:Wy,geoSelection:null,mapDocuments:[],mapWorkspaceId:null,savedFilters:null,savedSearchQuery:null,isDirty:!1,isSaving:!1,availableBitmaps:[],bitmapsLoading:!1,availableTimelines:[],timelineScales:{},timelinesLoading:!1};function mC(e,t){switch(t.type){case`SET_VIEW`:return{...e,t1Open:t.view!==null,t1View:t.view};case`TOGGLE_VIEW`:return e.t1View===t.view?{...e,t1Open:!1,t1View:null}:{...e,t1Open:!0,t1View:t.view};case`CLOSE_T1`:return{...e,t1Open:!1,t1View:null,t2Open:!1,t2AgentId:null};case`OPEN_T2_AGENT`:return{...e,t2Open:!0,t2AgentId:t.agentId};case`CLOSE_T2`:return{...e,t2Open:!1,t2AgentId:null};case`OPEN_ADD`:return{...e,addOpen:!0,addModal:t.modal??(e.addOpen&&e.addModal),addKind:t.kind,addRelateTo:t.relateTo===void 0?e.addRelateTo:t.relateTo,editDocument:null,editWorkspaceId:null};case`CLOSE_ADD`:return{...e,addOpen:!1,addModal:!1,addKind:null,addRelateTo:null,editDocument:null,editWorkspaceId:null};case`OPEN_EDIT`:return{...e,addOpen:!0,addModal:!1,addKind:null,addRelateTo:null,editDocument:t.document,editWorkspaceId:t.workspaceId};case`SET_TOOLS_TAB`:return{...e,toolsTab:t.tab};case`SET_APPS_APPLET`:return{...e,appsAppletId:t.appletId};case`SET_ACCENT_COLOR`:return e.activeAccentColor===t.color?e:{...e,activeAccentColor:t.color};case`SET_GEO_SELECTION`:return{...e,geoSelection:t.selection,isDirty:e.activeContextType===`context`?fC(e.filters,e.savedFilters,!0)||JSON.stringify(t.selection)!==JSON.stringify(e.savedGeoSelection):e.isDirty};case`SET_SAVED_GEO_SELECTION`:return{...e,savedGeoSelection:t.selection,isDirty:e.activeContextType===`context`?fC(e.filters,e.savedFilters,!0)||JSON.stringify(e.geoSelection)!==JSON.stringify(t.selection):e.isDirty};case`SET_MAP_DOCUMENTS`:return e.mapDocuments===t.documents&&e.mapWorkspaceId===t.workspaceId?e:{...e,mapDocuments:t.documents,mapWorkspaceId:t.workspaceId};case`SET_NAVIGATION`:{let n=e.activeContextType===t.contextType&&e.activeContextId===t.contextId&&e.activeCanvasId===t.canvasId;return{...e,activeWorkspaceName:t.workspaceName,activeTreeName:t.treeName,activeCanvasId:t.canvasId,activeContextId:t.contextId,activeContextType:t.contextType,activeContextPath:t.contextPath,geoSelection:null,...n?{}:{filters:Wy,savedFilters:null,savedSearchQuery:null,isDirty:!1,savedGeoSelection:null,liveEnabled:!1,liveError:null}}}case`SET_CONTEXT_SCOPE`:return e.activeContextType!==`context`||e.activeWorkspaceName===t.workspaceName&&e.activeContextPath===t.contextPath&&e.activeTreeName===t.treeId?e:{...e,activeWorkspaceName:t.workspaceName,activeContextPath:t.contextPath,activeTreeName:t.treeId};case`SET_LIVE`:return{...e,liveEnabled:t.enabled,liveError:null};case`SET_LIVE_ERROR`:return{...e,liveError:t.error};case`SET_FILTERS`:return{...e,filters:t.filters,isDirty:e.activeContextType===null?!1:fC(t.filters,e.savedFilters,e.activeContextType===`context`)||e.activeContextType===`context`&&JSON.stringify(e.geoSelection)!==JSON.stringify(e.savedGeoSelection)};case`SET_SAVED_FILTERS`:{let n=t.hydrating===!0&&e.isDirty,r=n?e.filters:t.savedFilters??Wy;return{...e,savedFilters:t.savedFilters,savedSearchQuery:t.savedSearchQuery??null,filters:r,isDirty:n?fC(r,t.savedFilters,e.activeContextType===`context`):!1}}case`SET_SAVING`:return{...e,isSaving:t.isSaving};case`SET_BITMAPS`:return{...e,availableBitmaps:t.keys,bitmapsLoading:!1};case`SET_BITMAPS_LOADING`:return{...e,bitmapsLoading:t.loading};case`SET_TIMELINES`:return{...e,availableTimelines:t.names,timelineScales:t.scales??e.timelineScales,timelinesLoading:!1};case`SET_TIMELINES_LOADING`:return{...e,timelinesLoading:t.loading};default:return e}}var hC=`toolbox:session:filters`;function gC(){try{let e=localStorage.getItem(hC);if(!e)return null;let t=JSON.parse(e);return{...Wy,...t,features:{...Wy.features,...t.features??{}},timeline:{...Wy.timeline,...t.timeline??{}},geo:{...Wy.geo,...t.geo??{}},lens:Wy.lens,sort:Uy(t.sort)}}catch{return null}}function _C(e){try{localStorage.setItem(hC,JSON.stringify(dC(e)))}catch{}}function vC(e,t=!1){if(!e?.toolbox)return null;try{let n=e.toolbox;return{features:{allOf:n.features?.allOf??[],anyOf:n.features?.anyOf??[],noneOf:n.features?.noneOf??[]},timeline:{quickFilter:n.timeline?.quickFilter??null,customRanges:n.timeline?.customRanges??(n.timeline?.customRange?[n.timeline.customRange]:[]),indexCreated:n.timeline?.indexCreated??!0,indexUpdated:n.timeline?.indexUpdated??!0,indexDeleted:n.timeline?.indexDeleted??!1,contentEvents:n.timeline?.contentEvents??!1,selectedTimelines:n.timeline?.selectedTimelines??[]},geo:{bbox:n.geo?.bbox??null,includeUnlocated:n.geo?.includeUnlocated??!1},lens:t?{...Wy.lens,...n.lens??{}}:Wy.lens,sort:Uy(n.sort)}}catch{return null}}function yC(e,t){let n=e;for(let e of t.split(`/`).filter(Boolean))if(n=n?.children?.find(t=>t.name===e)??null,!n)break;return n}function bC({children:e,target:t}){let[n,r]=(0,Z.useReducer)(mC,pC),i=fl(),a=hl(),o=new URLSearchParams(i.search).get(`ownerId`)||void 0,s=(0,Z.useRef)(null),c=(0,Z.useRef)(n);(0,Z.useEffect)(()=>{c.current=n}),(0,Z.useEffect)(()=>{let e=!1,n=i.pathname.split(`/`).filter(Boolean),a=t===void 0?n[0]===`workspaces`&&decodeURIComponent(n[1]||``)||null:t?.mode===`workspace`?t.workspaceName:null,o=t===void 0?n[0]===`contexts`&&decodeURIComponent(n[1]||``)||null:t?.mode===`context`?t.contextId:null,{path:s,treeName:l}=t?.mode===`workspace`?t:a?jx(i.pathname):{path:`/`,treeName:``},u=t=>{if(e)return;let n=t?`canvas`:o?`context`:null,i=c.current;i.activeContextType!==null&&n===null&&_C(i.filters),r({type:`SET_NAVIGATION`,workspaceName:a,treeName:a?l:null,canvasId:t,contextId:o,contextType:n,contextPath:a?s:null})};return a&&s!==`/`?(Ci(a,l).then(t=>{if(e)return;let n=yC(t,s);u(n?.type===`canvas`?n.id:null)}).catch(()=>u(null)),()=>{e=!0}):(u(null),()=>{e=!0})},[i.pathname,t]),(0,Z.useEffect)(()=>{let e=n.activeWorkspaceName;e&&(r({type:`SET_BITMAPS_LOADING`,loading:!0}),Ui(e).then(e=>{r({type:`SET_BITMAPS`,keys:e})}))},[n.activeWorkspaceName]),(0,Z.useEffect)(()=>{let e=n.activeWorkspaceName;e&&(r({type:`SET_TIMELINES_LOADING`,loading:!0}),Ia(e).then(e=>{r({type:`SET_TIMELINES`,names:e.map(e=>e.name),scales:Object.fromEntries(e.filter(e=>e.scales?.length).map(e=>[e.name,e.scales]))})}))},[n.activeWorkspaceName]),(0,Z.useEffect)(()=>{let{activeContextType:e,activeCanvasId:t,activeWorkspaceName:i,activeTreeName:a,activeContextPath:o}=n;if(e!==`context`){if(e===`canvas`&&t&&i&&o)Ci(i,a||`context`).then(e=>{let t=yC(e,o),n=vC(t?.metadata);r({type:`SET_SAVED_FILTERS`,savedFilters:n,savedSearchQuery:t?.querySpec?.query??null,hydrating:!0})}).catch(()=>{r({type:`SET_SAVED_FILTERS`,savedFilters:null,savedSearchQuery:null,hydrating:!0})});else{let e=gC();r({type:`SET_SAVED_FILTERS`,savedFilters:e,savedSearchQuery:null})}}},[n.activeCanvasId,n.activeContextPath,n.activeContextType,n.activeTreeName,n.activeWorkspaceName]),(0,Z.useEffect)(()=>{let{activeContextType:e,activeContextId:t}=n;if(e!==`context`||!t)return;let l=!1;s.current=null;let u=0,d=e=>{let t=new URLSearchParams(window.location.search);t.delete(`q`),t.delete(`search`);for(let n of e)t.append(`q`,n);let n=t.toString();a(`${i.pathname}${n?`?${n}`:``}${window.location.hash}`,{replace:!0})},f=(e,t,n,i=null,a=n?[n]:[])=>{let o=e?.filters??t??Wy,c=e?.geoSelection??i;s.current=JSON.stringify({filters:o,geoSelection:c,queries:e?.queries??a}),r({type:`SET_SAVED_FILTERS`,savedFilters:t,savedSearchQuery:n}),r({type:`SET_FILTERS`,filters:o}),r({type:`SET_GEO_SELECTION`,selection:c}),r({type:`SET_SAVED_GEO_SELECTION`,selection:i}),r({type:`SET_LIVE`,enabled:e!==null}),d(e?.queries??a)},p=e=>{let n=++u;return Ss(t,o).then(t=>{if(l||n!==u)return;let i=t.metadata,a=vC(i,!0),o=typeof i?.toolboxSearchQuery==`string`?i.toolboxSearchQuery:null;if(r({type:`SET_CONTEXT_SCOPE`,workspaceName:t.workspaceName||t.workspaceId||null,contextPath:t.path||`/`,treeId:t.treeId||null}),t.liveQuery)f(t.liveQuery,a,o,i?.toolboxGeoSelection??null,t.queryOptions?.queries);else if(e){r({type:`SET_LIVE`,enabled:!1});let e=c.current.isDirty?c.current.filters:a??Wy,n=i?.toolboxGeoSelection??null;s.current=JSON.stringify({filters:e,geoSelection:n,queries:[]}),r({type:`SET_SAVED_FILTERS`,savedFilters:a,savedSearchQuery:o,hydrating:!0}),r({type:`SET_GEO_SELECTION`,selection:n}),r({type:`SET_SAVED_GEO_SELECTION`,selection:n});let l=new URLSearchParams(window.location.search),u=t.queryOptions?.queries?.length?t.queryOptions.queries:o?[o]:[];!l.has(`q`)&&!l.has(`search`)&&u.length&&d(u)}}).catch(e=>{l||n!==u||r({type:`SET_LIVE_ERROR`,error:e instanceof Error?e.message:`Could not load context`})})};p(!0);let m=()=>{p(!1)},h=pd.on(`context.url.set`,e=>{e?.id===t&&m()}),g=pd.on(`context.updated`,e=>{let n=e;if((n.contextId||n.id)!==t)return;if(!n.metadata){p(!0);return}++u;let r=vC(n.metadata,!0);f(n.liveQuery??null,r,typeof n.metadata.toolboxSearchQuery==`string`?n.metadata.toolboxSearchQuery:null,n.metadata.toolboxGeoSelection??null,n.queryOptions?.queries)}),_=pd.on(`connect`,()=>{p(!0)}),v=pd.on(`disconnect`,()=>{c.current.liveEnabled&&r({type:`SET_LIVE_ERROR`,error:`Disconnected — Live updates will resume when connected.`})});return window.addEventListener(`contexts:refresh`,m),()=>{l=!0,s.current=null,h(),g(),_(),v(),window.removeEventListener(`contexts:refresh`,m)}},[n.activeContextId,n.activeContextType,o]);let l=(0,Z.useMemo)(()=>{let e=new URLSearchParams(i.search),t=e.getAll(`q`).map(e=>e.trim()).filter(Boolean),n=(e.get(`search`)||``).trim();return t.length?t:n?[n]:[]},[i.search]),u=(0,Z.useRef)(l);(0,Z.useEffect)(()=>{u.current=l},[l]);let d=(0,Z.useRef)(!1),f=(0,Z.useRef)(null),[p,m]=(0,Z.useState)(0);(0,Z.useEffect)(()=>()=>{f.current!==null&&window.clearTimeout(f.current),f.current=null},[n.activeContextType,n.activeContextId,n.liveEnabled,o]),(0,Z.useEffect)(()=>{n.activeContextType!==`context`||!n.activeContextId||o||!n.liveEnabled||s.current===null||d.current||f.current!==null||!pd.isConnected()||JSON.stringify({filters:n.filters,geoSelection:n.geoSelection,queries:l})!==s.current&&(f.current=window.setTimeout(()=>{f.current=null;let e=c.current;if(e.activeContextId!==n.activeContextId||!e.liveEnabled)return;let t=u.current,i=JSON.stringify({filters:e.filters,geoSelection:e.geoSelection,queries:t});if(i===s.current)return;let a=s.current;d.current=!0;let o={filters:e.filters,geoSelection:e.geoSelection,queries:t,binding:Yy(e.filters,e.geoSelection,t)};pd.request(`context.filters.set`,{contextId:e.activeContextId,liveQuery:o}).then(()=>{c.current.activeContextId===e.activeContextId&&s.current===a&&(s.current=i,r({type:`SET_LIVE_ERROR`,error:null}))}).catch(t=>{c.current.activeContextId===e.activeContextId&&r({type:`SET_LIVE_ERROR`,error:t instanceof Error?t.message:`Live update failed`})}).finally(()=>{d.current=!1,m(e=>e+1)})},n.liveError?1500:100))},[n.activeContextType,n.activeContextId,n.liveEnabled,n.filters,n.geoSelection,l,o,p,n.liveError]);let h=(0,Z.useCallback)(async e=>{let t=c.current;if(t.activeContextType!==`context`||!t.activeContextId||o)return;let n=l,i=e?{filters:t.filters,geoSelection:t.geoSelection,queries:n,binding:Yy(t.filters,t.geoSelection,n)}:null;try{await pd.request(`context.filters.set`,{contextId:t.activeContextId,liveQuery:i}),s.current=JSON.stringify({filters:t.filters,geoSelection:t.geoSelection,queries:n}),r({type:`SET_LIVE`,enabled:e})}catch(e){r({type:`SET_LIVE_ERROR`,error:e instanceof Error?e.message:`Could not change Live mode`})}},[o,l]);(0,Z.useEffect)(()=>{n.activeContextType===null&&_C(n.filters)},[n.filters,n.activeContextType]);let g=(0,Z.useCallback)(e=>r({type:`SET_VIEW`,view:e}),[]),_=(0,Z.useCallback)(e=>r({type:`TOGGLE_VIEW`,view:e}),[]),v=(0,Z.useCallback)(()=>r({type:`CLOSE_T1`}),[]),y=(0,Z.useCallback)(e=>r({type:`OPEN_T2_AGENT`,agentId:e}),[]),b=(0,Z.useCallback)(()=>r({type:`CLOSE_T2`}),[]),x=(0,Z.useCallback)(e=>r({type:`OPEN_ADD`,kind:e}),[]),S=(0,Z.useCallback)(e=>r({type:`OPEN_ADD`,kind:null,modal:e?.modal,relateTo:e?.fresh?null:void 0}),[]),C=(0,Z.useCallback)((e,t=!1)=>r({type:`OPEN_ADD`,kind:null,relateTo:e,modal:t}),[]),w=(0,Z.useCallback)(()=>r({type:`CLOSE_ADD`}),[]),T=(0,Z.useCallback)((e,t)=>r({type:`OPEN_EDIT`,document:e,workspaceId:t}),[]),E=(0,Z.useCallback)(e=>r({type:`SET_TOOLS_TAB`,tab:e}),[]),D=(0,Z.useCallback)(e=>r({type:`SET_APPS_APPLET`,appletId:e}),[]),O=(0,Z.useCallback)(e=>r({type:`SET_ACCENT_COLOR`,color:e}),[]),k=(0,Z.useCallback)(e=>{r({type:`SET_FILTERS`,filters:e})},[]),A=(0,Z.useCallback)((e,t)=>{let{filters:n}=c.current,i=e.startsWith(sC),a=i?n.features.allOf.filter(t=>t!==e):t?[...new Set([...n.features.allOf,e])]:n.features.allOf.filter(t=>t!==e),o=i&&t?[...new Set([...n.features.anyOf,e])]:n.features.anyOf.filter(t=>t!==e),s=n.features.noneOf.filter(t=>t!==e);r({type:`SET_FILTERS`,filters:{...n,features:{allOf:a,anyOf:o,noneOf:s}}})},[]),j=(0,Z.useCallback)((e,t)=>{let{filters:n}=c.current,i=n.features.allOf.filter(t=>t!==e),a=n.features.anyOf.filter(t=>t!==e),o=n.features.noneOf.filter(t=>t!==e);t===`allOf`?i.push(e):t===`anyOf`?a.push(e):t===`noneOf`&&o.push(e),r({type:`SET_FILTERS`,filters:{...n,features:{allOf:i,anyOf:a,noneOf:o}}})},[]),M=(0,Z.useCallback)(()=>{let{filters:e}=c.current;r({type:`SET_GEO_SELECTION`,selection:null}),r({type:`SET_FILTERS`,filters:{...Wy,timeline:{...e.timeline,quickFilter:null,customRanges:[],customRange:null,selectedTimelines:[]}}});let t=new URLSearchParams(i.search);t.delete(`q`),t.delete(`search`),t.set(`q`,``),a({pathname:i.pathname,search:t.toString(),hash:i.hash},{replace:!0})},[i.pathname,i.search,i.hash,a]),N=(0,Z.useCallback)(e=>{let{filters:t}=c.current;r({type:`SET_FILTERS`,filters:{...t,sort:e}})},[]),P=(0,Z.useCallback)(e=>{let{filters:t}=c.current;r({type:`SET_FILTERS`,filters:{...t,timeline:{...t.timeline,...e}}})},[]),ee=(0,Z.useCallback)(e=>{let{filters:t}=c.current;r({type:`SET_FILTERS`,filters:{...t,geo:{...t.geo,bbox:e}}})},[]),F=(0,Z.useCallback)(e=>{let{filters:t}=c.current;r({type:`SET_FILTERS`,filters:{...t,lens:{...t.lens,gps:e}}})},[]),I=(0,Z.useCallback)(e=>{let{filters:t}=c.current;r({type:`SET_FILTERS`,filters:{...t,lens:{...t.lens,ids:e}}})},[]),L=(0,Z.useCallback)(e=>{r({type:`SET_GEO_SELECTION`,selection:e})},[]),R=(0,Z.useCallback)((e,t=null)=>{r({type:`SET_MAP_DOCUMENTS`,documents:e,workspaceId:t})},[]),te=(0,Z.useCallback)(async()=>{let{activeContextType:e,activeContextId:t,activeWorkspaceName:n,activeTreeName:a,activeContextPath:s,filters:u,geoSelection:d,isSaving:f}=c.current;if(!f){r({type:`SET_SAVING`,isSaving:!0});try{if(e===`canvas`&&n&&s){let e=a||`context`,t=yC(await Ci(n,e),s),r=new URLSearchParams(i.search).get(`q`)||new URLSearchParams(i.search).get(`search`)||``;await fa(n,s,{metadata:{...t?.metadata||{},toolbox:dC(u)},querySpec:{features:u.features,filters:[...Jy(u.timeline),...Gy(u.geo)],query:r.trim()||void 0,sort:u.sort?.sortBy?u.sort:null}},e),Aa(n,e)}else if(e===`context`&&t){let e=(await Ss(t,o)).metadata||{},n=new URLSearchParams(i.search).get(`q`)||new URLSearchParams(i.search).get(`search`)||``;await ts(t,{metadata:{...e,toolbox:u,toolboxGeoSelection:d,toolboxSearchQuery:n.trim()||void 0},...Yy(u,d,l)},o)}let c=new URLSearchParams(i.search).get(`q`)||new URLSearchParams(i.search).get(`search`)||``;r({type:`SET_SAVED_FILTERS`,savedFilters:u,savedSearchQuery:c.trim()||null,hydrating:!0}),e===`context`&&r({type:`SET_SAVED_GEO_SELECTION`,selection:d})}finally{r({type:`SET_SAVING`,isSaving:!1})}}},[i.search,o,l]),z=(0,Z.useCallback)(e=>{let t=c.current.availableBitmaps.filter(t=>t!==e);r({type:`SET_BITMAPS`,keys:t});let n=c.current.filters,i={...n,features:{allOf:n.features.allOf.filter(t=>t!==e),anyOf:n.features.anyOf.filter(t=>t!==e),noneOf:n.features.noneOf.filter(t=>t!==e)}};JSON.stringify(i.features)!==JSON.stringify(n.features)&&r({type:`SET_FILTERS`,filters:i})},[]),ne=(0,Z.useCallback)(async e=>{let t=c.current.activeWorkspaceName;if(!t)throw Error(`No active workspace`);await yo(t,e),z(e)},[z]),B=(0,Z.useCallback)(async e=>{let t=c.current.activeWorkspaceName;if(!t)throw Error(`No active workspace`);let n=await Wi(t,e);return z(e),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:t}})),n.documentsDeleted},[z]),re=(0,Z.useCallback)(()=>{let e=c.current.activeWorkspaceName;e&&(r({type:`SET_TIMELINES_LOADING`,loading:!0}),Ia(e).then(e=>{r({type:`SET_TIMELINES`,names:e.map(e=>e.name),scales:Object.fromEntries(e.filter(e=>e.scales?.length).map(e=>[e.name,e.scales]))})}))},[]),V=(0,Z.useCallback)(async e=>{let t=c.current.activeWorkspaceName;if(!t)throw Error(`No active workspace`);await Vi(t,e),re()},[re]),ie=(0,Z.useCallback)(async e=>{let t=c.current.activeWorkspaceName;if(!t)throw Error(`No active workspace`);await Mi(t,e);let n=c.current.availableTimelines.filter(t=>t!==e);r({type:`SET_TIMELINES`,names:n});let i=c.current.filters,a=i.timeline.selectedTimelines.filter(t=>t!==e);a.length!==i.timeline.selectedTimelines.length&&r({type:`SET_FILTERS`,filters:{...i,timeline:{...i.timeline,selectedTimelines:a}}})},[]),{features:ae,timeline:oe,geo:H,lens:se}=n.filters,ce=ae.allOf.length>0||ae.anyOf.length>0||ae.noneOf.length>0||oe.quickFilter!==null||(oe.customRanges?.length??0)>0||(oe.selectedTimelines?.length??0)>0||H.bbox!==null||se.gps!==null||se.ids!==null||n.geoSelection!==null;return(0,Q.jsx)(ds.Provider,{value:{state:n,setView:g,toggleView:_,closeT1:v,openAgentT2:y,closeT2:b,openAdd:x,openAddPicker:S,openAddRelated:C,closeAdd:w,openEdit:T,setToolsTab:E,openApplet:D,setAccentColor:O,setFilters:k,setFeatureToggle:A,setFeatureMode:j,clearFilters:M,hasActiveFilters:ce,setTimelineFilter:P,setGeoBBox:ee,setLensGps:F,setLensIds:I,setGeoSelection:L,setMapDocuments:R,setSort:N,setLiveEnabled:h,saveFilters:te,deleteBitmap:ne,deleteDataset:B,createTimeline:V,deleteTimeline:ie,refreshTimelines:re},children:e})}function xC(e){let t=new URLSearchParams(e),n=t.getAll(`q`).map(e=>e.trim()).filter(Boolean),r=(t.get(`search`)||``).trim();return t.has(`q`)?n:r?[r]:[]}function SC(){let{state:e,setFilters:t}=Rs();return(0,Q.jsxs)(`label`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:e.filters.geo.includeUnlocated??!1,onChange:n=>t({...e.filters,geo:{...e.filters.geo,includeUnlocated:n.target.checked}})}),`Include documents without a location`]})}var CC=p();Xo();var wC=`#8b5cf6`,TC=`#94a3b8`,EC={color:wC,weight:2,fillColor:wC,fillOpacity:.12},DC={color:wC,weight:2,dashArray:`5,5`,fillColor:wC,fillOpacity:.06},OC=e=>Math.round(e*1e6)/1e6;function kC(e){let t=e<10?32:e<100?38:44,n=`<div style="display:flex;align-items:center;justify-content:center;width:${t}px;height:${t}px;border-radius:9999px;background:${wC};color:#fff;border:2px solid #fff;box-shadow:0 1px 4px rgba(0,0,0,.4);font:600 12px system-ui,sans-serif;cursor:pointer">${e}</div>`;return Yh.default.divIcon({html:n,className:`canvas-map-cluster`,iconSize:[t,t],iconAnchor:[t/2,t/2]})}var AC=e=>e.replace(/[&<>"']/g,e=>({"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`})[e]),jC=new Map;function MC(e){let t=jC.get(e);return t??(t=(0,CC.renderToStaticMarkup)((0,Z.createElement)(uC(e),{width:13,height:13,strokeWidth:2.5})),jC.set(e,t)),t}var NC=new Map;function PC(e,t){let n=`${e}|${+!!t}`,r=NC.get(n);if(!r){let i=`<div style="display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:9999px;background:${t?wC:TC};color:#fff;border:2px solid #fff;box-shadow:0 1px 3px rgba(0,0,0,.4);cursor:pointer">${MC(e)}</div>`;r=Yh.default.divIcon({html:i,className:`canvas-map-pin`,iconSize:[26,26],iconAnchor:[13,13]}),NC.set(n,r)}return r}function FC(){let{state:e,setGeoSelection:t,setGeoBBox:n}=Rs(),{mapDocuments:r,geoSelection:i,mapWorkspaceId:a}=e,o=e.filters.geo.bbox,{open:s}=dy(),c=(0,Z.useRef)(null),l=(0,Z.useRef)(null),u=(0,Z.useRef)(null),d=(0,Z.useRef)(null),f=(0,Z.useRef)(null),p=(0,Z.useRef)([]),m=(0,Z.useRef)(!1),[h,g]=(0,Z.useState)(`idle`),[_,v]=(0,Z.useState)(0),y=(0,Z.useRef)(h),b=(0,Z.useMemo)(()=>r.reduce((e,t)=>e+ +!!My(t),0),[r]),x=(0,Z.useMemo)(()=>i?r.reduce((e,t)=>{let n=My(t);return e+(n&&Py(n.lat,n.lon,i)?1:0)},0):0,[r,i]),S=(0,Z.useCallback)(()=>{let e=f.current;if(!e)return;e.clearLayers();let t=p.current;t.length!==0&&(t.length>=2&&Yh.default.polyline(t,DC).addTo(e),t.forEach(t=>Yh.default.circleMarker(t,{radius:4,color:wC,weight:2,fillColor:`#fff`,fillOpacity:1}).addTo(e)))},[]),C=(0,Z.useCallback)(()=>{p.current=[],v(0),f.current?.clearLayers()},[]),w=(0,Z.useCallback)(()=>{let e=p.current;e.length>=3&&t({kind:`polygon`,points:e.map(e=>({lat:OC(e.lat),lon:OC(e.lng)}))}),C(),g(`idle`)},[t,C]),T=(0,Z.useCallback)(()=>{C(),g(`idle`),t(null),n(null)},[C,t,n]);(0,Z.useEffect)(()=>{let e=c.current;if(!e||l.current)return;let t=Yh.default.map(e,{center:[20,0],zoom:2,worldCopyJump:!0});Yh.default.tileLayer(`https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`,{attribution:`&copy; OpenStreetMap contributors`,maxZoom:19}).addTo(t),u.current=Yh.default.markerClusterGroup({showCoverageOnHover:!1,maxClusterRadius:44,spiderfyOnMaxZoom:!0,chunkedLoading:!0,iconCreateFunction:e=>kC(e.getChildCount())}).addTo(t),f.current=Yh.default.layerGroup().addTo(t),l.current=t;let r=t.getContainer(),i=null,a=null,o=()=>{a&&=(a.remove(),null)},s=e=>{if(y.current===`rect`){e.preventDefault(),i=t.mouseEventToLatLng(e),o();try{r.setPointerCapture(e.pointerId)}catch{}}},m=e=>{if(y.current!==`rect`||!i)return;e.preventDefault();let n=Yh.default.latLngBounds(i,t.mouseEventToLatLng(e));a?a.setBounds(n):a=Yh.default.rectangle(n,DC).addTo(t)},h=e=>{if(y.current!==`rect`||!i)return;let a=Yh.default.latLngBounds(i,t.mouseEventToLatLng(e));i=null,o();try{r.releasePointerCapture(e.pointerId)}catch{}let s=a.getSouthWest(),c=a.getNorthEast();s.lat!==c.lat&&s.lng!==c.lng&&n({minLat:OC(s.lat),minLon:OC(s.lng),maxLat:OC(c.lat),maxLon:OC(c.lng)}),g(`idle`)};r.addEventListener(`pointerdown`,s),r.addEventListener(`pointermove`,m),r.addEventListener(`pointerup`,h),r.addEventListener(`pointercancel`,h);let _=e=>{y.current===`polygon`&&(p.current=[...p.current,e.latlng],v(p.current.length),S())};t.on(`click`,_);let b=new ResizeObserver(()=>t.invalidateSize());b.observe(e);let x=window.setTimeout(()=>t.invalidateSize(),120);return()=>{r.removeEventListener(`pointerdown`,s),r.removeEventListener(`pointermove`,m),r.removeEventListener(`pointerup`,h),r.removeEventListener(`pointercancel`,h),t.off(`click`,_),b.disconnect(),window.clearTimeout(x),t.remove(),l.current=null,u.current=null,f.current=null,d.current=null}},[t,n,S]),(0,Z.useEffect)(()=>{y.current=h;let e=l.current;if(!e)return;let t=e.getContainer();h!==`polygon`&&p.current.length&&C(),h===`rect`?(e.dragging.disable(),e.doubleClickZoom.disable(),t.style.cursor=`crosshair`,t.style.touchAction=`none`):h===`polygon`?(e.dragging.enable(),e.doubleClickZoom.disable(),t.style.cursor=`crosshair`,t.style.touchAction=``):(e.dragging.enable(),e.doubleClickZoom.enable(),t.style.cursor=``,t.style.touchAction=``)},[h,C]),(0,Z.useEffect)(()=>{let e=l.current,t=c.current;if(!e||!t)return;let n=new ResizeObserver(()=>e.invalidateSize());return n.observe(t),()=>n.disconnect()},[]),(0,Z.useEffect)(()=>{let e=l.current,t=u.current;if(!e||!t)return;t.clearLayers();let n=[],o=[];for(let e of r){let t=My(e);if(!t)continue;n.push([t.lat,t.lon]);let r=!i||Py(t.lat,t.lon,i),c=Yh.default.marker([t.lat,t.lon],{icon:PC(e.schema,r),opacity:i&&!r?.55:1,zIndexOffset:r?1e3:0});c.bindTooltip(AC(Ni(e).title),{direction:`top`,offset:[0,-14]}),c.on(`click`,()=>{y.current===`idle`&&s(e,a??``)}),o.push(c)}t.addLayers(o),!m.current&&n.length&&!i&&(m.current=!0,e.fitBounds(Yh.default.latLngBounds(n),{padding:[30,30],maxZoom:14,animate:!1}))},[r,i,s,a]),(0,Z.useEffect)(()=>{let e=l.current;if(!e||(d.current&&=(d.current.remove(),null),!o&&!i))return;let t=Yh.default.layerGroup();o&&Yh.default.rectangle(Yh.default.latLngBounds([o.minLat,o.minLon],[o.maxLat,o.maxLon]),EC).addTo(t),i?.kind===`polygon`&&Yh.default.polygon(i.points.map(e=>[e.lat,e.lon]),EC).addTo(t),t.addTo(e),d.current=t},[o,i]);let E=h===`rect`?`Drag a box on the map…`:h===`polygon`?`Tap to add points${_?` · ${_}`:``}`:o||i?`Area selected`:`Pan & pick an area`,D=`flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium transition-colors`;return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 border-b border-border px-3 py-2 shrink-0`,children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>g(h===`rect`?`idle`:`rect`),className:q(D,h===`rect`?`border-primary bg-primary/10 text-foreground`:`border-border text-muted-foreground hover:bg-muted hover:text-foreground`),title:`Drag a rectangle to select an area`,children:[(0,Q.jsx)(Bn,{className:`h-3.5 w-3.5`}),`Box`]}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>g(h===`polygon`?`idle`:`polygon`),className:q(D,h===`polygon`?`border-primary bg-primary/10 text-foreground`:`border-border text-muted-foreground hover:bg-muted hover:text-foreground`),title:`Tap points to enclose an area`,children:[(0,Q.jsx)(De,{className:`h-3.5 w-3.5`}),`Polygon`]}),h===`polygon`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:w,disabled:_<3,className:q(D,`border-primary bg-primary text-primary-foreground hover:bg-primary disabled:opacity-40 disabled:hover:bg-primary`),title:`Close the polygon and filter`,children:[(0,Q.jsx)(ae,{className:`h-3.5 w-3.5`}),`Finish`]}),_>0&&(0,Q.jsx)(`button`,{type:`button`,onClick:C,className:q(D,`border-border text-muted-foreground hover:bg-muted hover:text-foreground`),title:`Discard the points placed so far`,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]}),(0,Q.jsxs)(`button`,{type:`button`,onClick:T,disabled:!o&&!i&&h===`idle`,className:q(D,`border-border text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-40 disabled:hover:bg-transparent`),title:`Clear the area selection`,children:[(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`}),`Clear`]}),(0,Q.jsx)(`span`,{className:`ml-auto text-[11px] text-muted-foreground`,children:E})]}),(0,Q.jsxs)(`div`,{className:`relative isolate flex-1 min-h-0`,children:[(0,Q.jsx)(`div`,{ref:c,className:`absolute inset-0`}),b===0&&(0,Q.jsx)(`div`,{className:`pointer-events-none absolute inset-0 z-[2] flex items-center justify-center`,children:(0,Q.jsxs)(`div`,{className:`rounded-lg border bg-card/95 px-4 py-3 text-center shadow-elevation-2`,children:[(0,Q.jsx)(`p`,{className:`text-sm font-medium text-foreground`,children:`No located documents`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`None of the current results carry location metadata.`})]})})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5 border-t border-border px-3 py-2 shrink-0 text-[11px] text-muted-foreground`,children:[(0,Q.jsx)(nn,{className:`h-3 w-3`}),b,` of `,r.length,` located`,i&&(0,Q.jsxs)(`span`,{className:`text-foreground font-medium`,children:[`· `,x,` in area`]})]})]})}var IC=[{label:`25 m`,m:25},{label:`100 m`,m:100},{label:`500 m`,m:500},{label:`2 km`,m:2e3},{label:`10 km`,m:1e4}],LC=`h-7 rounded-md border border-input bg-transparent px-1.5 text-xs outline-none focus-visible:ring-1 focus-visible:ring-ring`,RC=`h-7 rounded-md border border-input bg-transparent px-2 text-xs outline-none focus-visible:ring-1 focus-visible:ring-ring`,zC=e=>Math.round(e*1e4)/1e4;function BC(){let{state:e,setLensGps:t,setLensIds:n}=Rs(),r=e.filters.lens,i=e.activeWorkspaceName,a=r.gps?.radiusM??100,[o,s]=(0,Z.useState)(!1),[c,l]=(0,Z.useState)(r.gps?.radiusM??100),[u,d]=(0,Z.useState)(null),[f,p]=(0,Z.useState)(0),[m,h]=(0,Z.useState)(`prompt`),g=(0,Z.useRef)(null),_=(0,Z.useRef)(c);(0,Z.useEffect)(()=>{_.current=c},[c]);let v=`geolocation`in navigator&&window.isSecureContext;(0,Z.useEffect)(()=>{if(!navigator.permissions?.query)return;let e=null;return navigator.permissions.query({name:`geolocation`}).then(t=>{e=t,h(t.state===`granted`?`granted`:t.state===`denied`?`denied`:`prompt`),t.onchange=()=>h(t.state===`granted`?`granted`:t.state===`denied`?`denied`:`prompt`)}).catch(()=>{}),()=>{e&&(e.onchange=null)}},[]),(0,Z.useEffect)(()=>{if(!o||!v)return;let e=navigator.geolocation.watchPosition(e=>{let n=zC(e.coords.latitude),r=zC(e.coords.longitude);t({lat:n,lon:r,radiusM:_.current})},e=>d(e.code===e.PERMISSION_DENIED?`Location permission denied.`:e.message),{enableHighAccuracy:!0,maximumAge:15e3,timeout:2e4});return g.current=e,()=>{navigator.geolocation.clearWatch(e),g.current=null}},[o,v,f,t]);let y=e=>{s(e),d(null),e||t(null)},b=()=>{d(null),s(!0),p(e=>e+1)},x=e=>{l(e),r.gps&&t({...r.gps,radiusM:e})},S=PS(),{rateMs:C,setRateMs:w,maxDistance:T,setMaxDistance:E,error:D}=S,O=S.running&&S.consumer===`filter`,k=S.running&&S.consumer!==`filter`;FS(O);let A=t=>{i&&S.start(t,`filter`,{workspaceRef:i,contextPath:e.activeContextPath})},j=O,M=S.snapshotSize??S.camera?.size,N=!!M&&M.height>M.width;return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4 p-3 text-sm`,children:[e.activeContextType===`context`&&(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Point the camera at an object to find visually related content in this context. `,e.liveEnabled?`Bound devices follow your matches as you move.`:`Enable Live to show the matches on your other devices.`]}),(0,Q.jsx)(SC,{}),(0,Q.jsxs)(`section`,{className:`space-y-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:o,disabled:!v,onChange:e=>y(e.target.checked)}),(0,Q.jsx)(pn,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`span`,{children:`Track this device’s GPS`})]}),(0,Q.jsx)(`select`,{className:LC,value:c,onChange:e=>x(Number(e.target.value)),disabled:!o,children:IC.map(e=>(0,Q.jsx)(`option`,{value:e.m,children:e.label},e.m))})]}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:v?m===`denied`?(0,Q.jsx)(`span`,{className:`text-destructive`,children:`Location is blocked for this site. Allow it in your browser/app settings, then retry.`}):u?(0,Q.jsxs)(`span`,{className:`text-destructive`,children:[u,` `,(0,Q.jsx)(`button`,{type:`button`,onClick:b,className:`underline hover:text-foreground`,children:`Request again`})]}):r.gps?`Showing documents within ${a>=1e3?`${a/1e3} km`:`${a} m`} of ${r.gps.lat}, ${r.gps.lon}.`:o?`Waiting for a position fix…`:`Resurface documents geotagged near your current position.`:`Needs a secure context (https or localhost) with location access.`})]}),(0,Q.jsxs)(`section`,{className:`space-y-2 border-t border-border pt-3`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[j?(0,Q.jsxs)(`button`,{type:`button`,onClick:S.stop,className:`flex h-7 items-center gap-1 rounded-md bg-destructive px-2.5 text-xs font-medium text-destructive-foreground hover:bg-destructive/90`,children:[(0,Q.jsx)(sn,{className:`h-3.5 w-3.5`}),` `,S.source===`photo`?`Close photo`:`Stop ${S.source===`camera`?`camera`:`recording`}`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>A(`camera`),disabled:!i||k,className:`flex h-7 items-center gap-1 rounded-md bg-foreground px-2.5 text-xs font-medium text-background hover:bg-foreground/90 disabled:opacity-50`,children:[(0,Q.jsx)(qe,{className:`h-3.5 w-3.5`}),` Camera`]}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>A(`screen`),disabled:!i||k,className:`flex h-7 items-center gap-1 rounded-md bg-foreground px-2.5 text-xs font-medium text-background hover:bg-foreground/90 disabled:opacity-50`,children:[(0,Q.jsx)(In,{className:`h-3.5 w-3.5`}),` Desktop`]})]}),(0,Q.jsx)(nC,{consumer:`filter`,workspaceRef:i??``,contextPath:e.activeContextPath,disabled:k,className:`flex h-7 items-center gap-1 rounded-md bg-foreground px-2.5 text-xs font-medium text-background hover:bg-foreground/90 disabled:opacity-50`}),(0,Q.jsx)(`select`,{className:LC,value:C,onChange:e=>w(Number(e.target.value)),disabled:!i,title:`Frame rate. High rates (10–30 fps) are experimental; the loop never overlaps requests, so the effective rate is capped by search latency.`,children:US.map(e=>(0,Q.jsx)(`option`,{value:e.ms,children:e.label},e.ms))}),(0,Q.jsx)(`input`,{className:q(RC,`w-24`),placeholder:`max dist`,inputMode:`decimal`,value:T,onChange:e=>E(e.target.value),title:`Cosine-distance floor (0 = identical). Empty = top-K (loose but tunable).`})]}),(0,Q.jsxs)(`div`,{className:q(`relative overflow-hidden rounded-lg border border-border bg-black/80`,j?N?`aspect-[3/4] max-h-[60vh]`:`aspect-video`:`hidden`),children:[(0,Q.jsx)(JS,{className:`h-full w-full`,interactive:!0}),(0,Q.jsx)(eC,{})]}),j&&(0,Q.jsx)($S,{}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:D?(0,Q.jsx)(`span`,{className:`text-destructive`,children:D}):j?S.snapshot?`Snapshot: view narrowed to ${S.lastCount??`…`} match${S.lastCount===1?``:`es`}. The photo is not stored. Tap Live to resume the feed.`:`Live: view narrowed to ${S.lastCount??`…`} match${S.lastCount===1?``:`es`}. Tap the shutter to search one still frame. Frames are ephemeral, never stored. Closing the toolbox keeps it running.`:k?`The Lens applet is using the camera. Stop it there first.`:r.ids===null?i?`Point a camera (or share a screen). The view narrows to what the feed matches.`:`Open a workspace to refine with a live feed.`:`The current view holds ${r.ids.length} camera match${r.ids.length===1?``:`es`}. Save to keep this view, or clear matches to remove the camera filter.`}),!j&&r.ids!==null&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>n(null),className:`min-h-10 rounded-md border border-border px-3 text-xs hover:bg-muted`,children:`Clear matches`})]})]})}var VC={"crud:created":`var(--data-5)`,"crud:updated":`var(--data-8)`,"crud:deleted":`var(--data-3)`,content:`var(--data-10)`,tasks:`var(--data-1)`};function HC(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)|0;return(t%360+360)%360}function UC(e){return VC[e]??`oklch(var(--data-l) var(--data-c) ${HC(e)})`}var WC=[{label:`Day`,cells:[`yesterday`,`today`,`tomorrow`]},{label:`Week`,cells:[`lastWeek`,`thisWeek`,`nextWeek`]},{label:`Month`,cells:[`lastMonth`,`thisMonth`,`nextMonth`]},{label:`Year`,cells:[`lastYear`,`thisYear`,`nextYear`]}],GC=[{label:`Decade`,cells:[`lastDecade`,`thisDecade`,`nextDecade`]},{label:`Century`,cells:[`lastCentury`,`thisCentury`,`nextCentury`]},{label:`Millennium`,cells:[`lastMillennium`,`thisMillennium`,`nextMillennium`]}],KC=[`Yesterday`,`Today`,`Tomorrow`],qC=[{label:`Millennium`,unit:`millennium`},{label:`Century`,unit:`century`},{label:`Decade`,unit:`decade`},{label:`Year`,unit:`year`},{label:`Month`,unit:`month`},{label:`Week`,unit:`week`}],JC=10,YC=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function XC(e,t){let n=new Date;switch(e){case`millennium`:{let e=Math.floor(n.getFullYear()/1e3)*1e3;return new Date(e-t*1e3,0,1)}case`century`:{let e=Math.floor(n.getFullYear()/100)*100;return new Date(e-t*100,0,1)}case`decade`:{let e=Math.floor(n.getFullYear()/10)*10;return new Date(e-t*10,0,1)}case`year`:return new Date(n.getFullYear()-t,0,1);case`month`:return new Date(n.getFullYear(),n.getMonth()-t,1);case`week`:{let e=(n.getDay()+6)%7,r=new Date(n.getFullYear(),n.getMonth(),n.getDate()-e);return r.setDate(r.getDate()-t*7),r}}}function ZC(e,t){let n=new Date(t);switch(e){case`millennium`:n.setFullYear(n.getFullYear()+1e3);break;case`century`:n.setFullYear(n.getFullYear()+100);break;case`decade`:n.setFullYear(n.getFullYear()+10);break;case`year`:n.setFullYear(n.getFullYear()+1);break;case`month`:n.setMonth(n.getMonth()+1);break;case`week`:n.setDate(n.getDate()+7)}return n}function QC(e,t,n){if(n===0)return`Now`;switch(e){case`millennium`:case`century`:case`decade`:{let e=t.getFullYear();return e<=0?`${1-e} BCE`:`${e}`}case`year`:return`${t.getFullYear()}`;case`month`:return`${YC[t.getMonth()]} ${t.getFullYear()}`;case`week`:{let e=new Date(t);return e.setDate(e.getDate()+6),`${t.getDate()} ${YC[t.getMonth()]} – ${e.getDate()} ${YC[e.getMonth()]}`}}}function $C(e,t){return Array.from({length:t},(t,n)=>{let r=XC(e,n),i=ZC(e,r);return{offset:n,label:QC(e,r,n),start:r,end:i,isNow:n===0}})}var ew={yesterday:5,today:5,tomorrow:5,lastWeek:5,thisWeek:5,nextWeek:5,lastMonth:4,thisMonth:4,nextMonth:4,lastYear:3,thisYear:3,nextYear:3,lastDecade:2,thisDecade:2,nextDecade:2,lastCentury:1,thisCentury:1,nextCentury:1,lastMillennium:0,thisMillennium:0,nextMillennium:0};function tw(e){let t=e=>String(e).padStart(2,`0`);return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function nw(e,t){let n=sw(e);return n?(n.setDate(n.getDate()+t),tw(n)):e}function rw(e){let t=[...e].sort((e,t)=>e.start.localeCompare(t.start)),n=[];for(let e of t){let t=n[n.length-1];t&&e.start<=nw(t.end,1)?e.end>t.end&&(t.end=e.end):n.push({...e})}return n}function iw(e,t){let n=e.find(e=>t>=e.start&&t<=e.end);if(!n)return rw([...e,{start:t,end:t}]);let r=e.filter(e=>e!==n);return n.start<=nw(t,-1)&&r.push({start:n.start,end:nw(t,-1)}),nw(t,1)<=n.end&&r.push({start:nw(t,1),end:n.end}),r.sort((e,t)=>e.start.localeCompare(t.start))}function aw(e,t){if(e===`week`||e===`month`){let e=new Date(t.end);return e.setDate(e.getDate()-1),{start:tw(t.start),end:tw(e)}}return{start:String(t.start.getFullYear()),end:String(t.end.getFullYear()-1)}}function ow({quickFilterKey:e,activeRangeCount:t,onSelectRanges:n,histogramNames:r}){let{state:i}=Rs(),{activeWorkspaceName:a,activeTreeName:o,activeContextPath:s,filters:c}=i,[l,u]=(0,Z.useState)(3),[d,f]=(0,Z.useState)(JC),[p,m]=(0,Z.useState)(new Set),[h,g]=(0,Z.useState)([]),[_,v]=(0,Z.useState)(e);e!==_&&(v(e),e&&ew[e]!==void 0&&u(ew[e]),m(new Set));let[y,b]=(0,Z.useState)(t);t!==y&&(b(t),t===0&&m(new Set));let x=qC[l],S=$C(x.unit,d),C=JSON.stringify(c.features)+JSON.stringify(c.geo),w=r.join(`,`);(0,Z.useEffect)(()=>{if(!a||r.length===0)return;let e=!1,t=setTimeout(()=>{Yi(a,{names:r,buckets:$C(x.unit,d).map(e=>aw(x.unit,e)),context:s??`/`,...o?{treeNameOrTreeId:o}:{},allOf:c.features.allOf,anyOf:c.features.anyOf,noneOf:c.features.noneOf,filters:Gy(c.geo),applyCanvasSpec:!1}).then(t=>{e||g(t)}).catch(()=>{e||g([])})},250);return()=>{e=!0,clearTimeout(t)}},[a,o,s,x.unit,d,w,C]);let T=a&&r.length>0?h:[],E=Math.max(1,...T.map(e=>e.total)),D=e=>{u(t=>Math.max(0,Math.min(5,t+e))),f(JC),m(new Set)},O=(0,Z.useCallback)((e,t)=>{m(r=>{let i;if(t&&r.size>0){let t=Math.min(e,...r),n=Math.max(e,...r);i=new Set(r);for(let e=t;e<=n;e++)i.add(e)}else i=new Set(r),i.has(e)?i.delete(e):i.add(e);let a=[...i].sort((e,t)=>e-t),o=[];for(let e of a){let t=o[o.length-1];t&&e===t[1]+1?t[1]=e:o.push([e,e])}return n(o.map(([e,t])=>{let n=S.find(e=>e.offset===t).start,r=new Date(S.find(t=>t.offset===e).end);return r.setDate(r.getDate()-1),{start:tw(n),end:tw(r)}})),i})},[S,n]);return(0,Q.jsxs)(`div`,{className:`w-48 shrink-0 flex flex-col border-r border-border bg-muted/20`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-1 px-2 py-1.5 border-b border-border shrink-0`,children:[(0,Q.jsx)(`span`,{className:`text-[11px] font-semibold text-foreground/80 select-none`,children:x.label}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:()=>D(1),className:`p-1 rounded text-muted-foreground hover:text-foreground hover:bg-muted transition-colors`,title:`Zoom in (finer periods)`,children:(0,Q.jsx)(L,{className:`w-3.5 h-3.5`})}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>D(-1),className:`p-1 rounded text-muted-foreground hover:text-foreground hover:bg-muted transition-colors`,title:`Zoom out (coarser periods)`,children:(0,Q.jsx)(Ee,{className:`w-3.5 h-3.5`})})]})]}),(0,Q.jsxs)(`div`,{className:`flex-1 min-h-0 overflow-y-auto p-1.5 space-y-1 touch-target`,children:[S.map(e=>{let t=p.has(e.offset),n=T[e.offset],r=n?.total??0,i=r>0?Math.log1p(r)/Math.log1p(E):0,a=n&&r>0?`: ${r} doc${r===1?``:`s`} (${Object.entries(n.counts).map(([e,t])=>`${e}: ${t}`).join(`, `)})`:``;return(0,Q.jsxs)(`button`,{type:`button`,onClick:t=>O(e.offset,t.shiftKey),title:`${e.isNow?`Now`:e.label}${a}. Click to tag, shift-click to fill range`,className:q(`w-full flex items-center gap-2 rounded-2xl px-3 py-1.5 text-xs font-medium transition-colors select-none text-left`,t?`bg-primary text-primary-foreground`:e.isNow?`bg-primary/10 text-primary hover:bg-primary/20`:`bg-card text-foreground hover:bg-muted shadow-elevation-1`),children:[e.isNow&&(0,Q.jsx)(N,{className:`w-3 h-3 shrink-0`}),(0,Q.jsxs)(`span`,{className:`flex-1 min-w-0 flex flex-col`,children:[(0,Q.jsxs)(`span`,{className:`flex items-baseline justify-between gap-1`,children:[(0,Q.jsx)(`span`,{className:`truncate`,children:e.label}),r>0&&(0,Q.jsx)(`span`,{className:q(`text-[9px] tabular-nums shrink-0`,t?`text-primary-foreground/80`:`text-muted-foreground/70`),children:r})]}),r>0&&(0,Q.jsx)(`span`,{className:`mt-1 flex h-[3px] overflow-hidden rounded-full`,style:{width:`${Math.max(8,i*100)}%`},children:Object.entries(n.counts).map(([e,t])=>(0,Q.jsx)(`span`,{style:{width:`${t/r*100}%`,backgroundColor:UC(e)}},e))})]})]},e.offset)}),d<200&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>f(e=>e+JC),className:`w-full text-[11px] text-muted-foreground/60 hover:text-muted-foreground py-1.5 transition-colors text-center`,children:`Show older…`})]})]})}function sw(e){let t=/^(-?\d{1,6})-(\d{2})-(\d{2})$/.exec(e);return t?new Date(Number(t[1]),Number(t[2])-1,Number(t[3])):null}function cw({ranges:e,onCommitRange:t,onToggleDay:n}){let r=new Date,[i,a]=(0,Z.useState)(()=>{let t=e[0]?.start&&sw(e[0].start)||r;return{y:t.getFullYear(),m:t.getMonth()}}),[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)(null),u=e=>a(t=>{let n=new Date(t.y,t.m+e,1);return{y:n.getFullYear(),m:n.getMonth()}}),d=(e,r)=>{if(r){n(e),s(null),l(null);return}if(!o){s(e);return}let[i,a]=o<=e?[o,e]:[e,o];t(i,a),s(null),l(null)},f=new Date(i.y,i.m,1),p=new Date(f);p.setDate(p.getDate()-(f.getDay()+6)%7);let m=Array.from({length:42},(e,t)=>{let n=new Date(p);return n.setDate(n.getDate()+t),n}),[h,g]=o?c&&c!==o?o<=c?[o,c]:[c,o]:[o,o]:[null,null],_=t=>e.some(e=>t>=e.start&&t<=e.end),v=t=>e.some(e=>t===e.start||t===e.end),y=tw(r);return(0,Q.jsxs)(`div`,{className:`select-none`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between mb-1.5`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:()=>u(-12),className:`p-1 rounded text-muted-foreground hover:text-foreground hover:bg-muted transition-colors`,title:`Previous year`,children:(0,Q.jsx)(Ie,{className:`w-3.5 h-3.5`})}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>u(-1),className:`p-1 rounded text-muted-foreground hover:text-foreground hover:bg-muted transition-colors`,title:`Previous month`,children:(0,Q.jsx)(E,{className:`w-3.5 h-3.5`})})]}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>a({y:r.getFullYear(),m:r.getMonth()}),className:`text-xs font-semibold text-foreground hover:text-primary transition-colors`,title:`Jump to current month`,children:[YC[i.m],` `,i.y]}),(0,Q.jsxs)(`div`,{className:`flex items-center`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:()=>u(1),className:`p-1 rounded text-muted-foreground hover:text-foreground hover:bg-muted transition-colors`,title:`Next month`,children:(0,Q.jsx)(gr,{className:`w-3.5 h-3.5`})}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>u(12),className:`p-1 rounded text-muted-foreground hover:text-foreground hover:bg-muted transition-colors`,title:`Next year`,children:(0,Q.jsx)(_e,{className:`w-3.5 h-3.5`})})]})]}),(0,Q.jsx)(`div`,{className:`grid grid-cols-7 mb-0.5`,children:[`Mo`,`Tu`,`We`,`Th`,`Fr`,`Sa`,`Su`].map(e=>(0,Q.jsx)(`span`,{className:`text-center text-[9px] font-semibold uppercase text-muted-foreground/60 py-0.5`,children:e},e))}),(0,Q.jsx)(`div`,{className:`grid grid-cols-7 gap-y-0.5`,children:m.map(e=>{let t=tw(e),n=e.getMonth()===i.m,r=h!==null&&g!==null&&t>=h&&t<=g,a=t===h||t===g,s=!o&&_(t),c=a||s&&v(t);return(0,Q.jsx)(`button`,{type:`button`,onClick:e=>d(t,e.ctrlKey||e.metaKey),onMouseEnter:()=>o&&l(t),className:q(`h-6 text-[11px] tabular-nums transition-colors`,c?`bg-primary text-primary-foreground rounded-md`:r||s?`bg-primary/15 text-foreground`:n?`text-foreground hover:bg-muted rounded-md`:`text-muted-foreground/40 hover:bg-muted rounded-md`,t===y&&!c&&`font-bold text-primary`),children:e.getDate()},t)})}),(0,Q.jsx)(`p`,{className:`mt-1.5 text-[10px] text-muted-foreground/70`,children:o?`From ${o}: pick the end date`:`Click start + end. Ctrl+click adds/removes single days.`})]})}function lw({label:e,checked:t,onChange:n,color:r}){return(0,Q.jsxs)(`div`,{role:`switch`,"aria-checked":t,tabIndex:0,onClick:()=>n(!t),onKeyDown:e=>(e.key===` `||e.key===`Enter`)&&n(!t),className:`flex items-center justify-between gap-3 cursor-pointer select-none outline-none focus-visible:ring-2 focus-visible:ring-ring rounded`,children:[(0,Q.jsxs)(`span`,{className:`flex items-center gap-2 min-w-0`,children:[(0,Q.jsx)(`span`,{className:`w-2 h-2 rounded-full shrink-0`,style:{backgroundColor:r}}),(0,Q.jsx)(`span`,{className:`text-sm text-foreground truncate`,children:e})]}),(0,Q.jsx)(`div`,{className:q(`relative w-10 h-5 rounded-full transition-colors shrink-0`,!t&&`bg-accent dark:bg-muted-foreground`),style:t?{backgroundColor:r}:void 0,children:(0,Q.jsx)(`div`,{className:q(`absolute top-[2px] w-4 h-4 rounded-full bg-background shadow-elevation-1 transition-transform`,t?`translate-x-[22px]`:`translate-x-[2px]`)})})]})}function uw(){let{state:e,setTimelineFilter:t,createTimeline:n,deleteTimeline:r,refreshTimelines:i}=Rs(),{timeline:a}=e.filters,{availableTimelines:o,timelineScales:s,timelinesLoading:c}=e,[l,u]=(0,Z.useState)(``),[d,f]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)(null),[h,g]=(0,Z.useState)(`quick`),[_,v]=(0,Z.useState)(!1),{showToast:y}=Hr(),b=new Set(a.selectedTimelines??[]),x=(0,Z.useMemo)(()=>{let e=[];return a.indexCreated&&e.push(`crud:created`),a.indexUpdated&&e.push(`crud:updated`),a.indexDeleted&&e.push(`crud:deleted`),a.contentEvents&&e.push(`content`),e.push(...a.selectedTimelines??[]),e.length>0?e:[`crud:created`]},[a.indexCreated,a.indexUpdated,a.indexDeleted,a.contentEvents,a.selectedTimelines]),S=e=>{let n=new Set(b);n.has(e)?n.delete(e):n.add(e),t({selectedTimelines:[...n]})},C=async()=>{let e=l.trim();if(e){f(!0);try{await n(e),u(``),y({title:`Timeline created`,description:e})}catch(e){y({title:`Failed to create timeline`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{f(!1)}}},w=async e=>{if(window.confirm(`Delete timeline "${e}"?\n\nThis removes all interval data for this timeline.`)){m(e);try{await r(e),y({title:`Timeline deleted`,description:e})}catch(e){y({title:`Failed to delete timeline`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{m(null)}}},T=o.filter(e=>!e.startsWith(`crud:`)&&e!==`content`),E=qy(a),D=E.length>0,O=(0,Z.useCallback)(e=>{t({customRanges:e,customRange:null,...e.length>0?{quickFilter:null}:{}})},[t]),k=e=>{t({quickFilter:a.quickFilter===e?null:e,customRanges:[],customRange:null})},A=e=>{t({customRanges:E.filter((t,n)=>n!==e),customRange:null})},j=(e,t)=>(0,Q.jsxs)(`div`,{className:`grid grid-cols-[3.5rem_1fr_1fr_1fr] gap-1 items-center`,children:[(0,Q.jsx)(`span`,{className:`text-[11px] text-muted-foreground`,children:e.label}),e.cells.map((e,n)=>{let r=a.quickFilter===e&&!D;return(0,Q.jsx)(`button`,{type:`button`,onClick:()=>k(e),className:q(`text-xs px-1.5 py-1 rounded-md transition-colors truncate`,r?`bg-primary text-primary-foreground font-medium`:`bg-muted/50 text-foreground hover:bg-muted`),title:e,children:t?KC[n]:[`Last`,`This`,`Next`][n]},e)})]},e.label);return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0`,children:[(0,Q.jsx)(ow,{quickFilterKey:a.quickFilter,activeRangeCount:E.length,onSelectRanges:O,histogramNames:x}),(0,Q.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-4 space-y-5`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,Q.jsx)(`p`,{className:`text-[11px] font-semibold uppercase tracking-wide text-muted-foreground`,children:h===`quick`?`Quick filter`:`Date range`}),(0,Q.jsxs)(`div`,{className:`flex rounded-md overflow-hidden border border-border divide-x divide-border`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:()=>g(`quick`),className:q(`px-2 py-0.5 transition-colors`,h===`quick`?`bg-primary text-primary-foreground`:`text-muted-foreground hover:bg-muted hover:text-foreground`),title:`Quick filters`,children:(0,Q.jsx)(H,{className:`w-3 h-3`})}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>g(`calendar`),className:q(`px-2 py-0.5 transition-colors`,h===`calendar`?`bg-primary text-primary-foreground`:`text-muted-foreground hover:bg-muted hover:text-foreground`),title:`Calendar range picker`,children:(0,Q.jsx)(B,{className:`w-3 h-3`})})]})]}),h===`quick`?(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsxs)(`div`,{className:`grid grid-cols-[3.5rem_1fr_1fr_1fr] gap-1`,children:[(0,Q.jsx)(`span`,{}),[`Last`,`This`,`Next`].map(e=>(0,Q.jsx)(`span`,{className:`text-center text-[9px] font-semibold uppercase tracking-wide text-muted-foreground/60`,children:e},e))]}),WC.map((e,t)=>j(e,t===0)),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>v(e=>!e),className:`flex items-center gap-1 text-[11px] text-muted-foreground/70 hover:text-muted-foreground pt-1 transition-colors`,children:[(0,Q.jsx)(Ze,{className:q(`w-3 h-3 transition-transform`,!_&&`-rotate-90`)}),`Deep time`]}),_&&GC.map(e=>j(e,!1))]}):(0,Q.jsx)(cw,{ranges:E,onCommitRange:(e,n)=>t({customRanges:[{start:e,end:n}],customRange:null,quickFilter:null}),onToggleDay:e=>t({customRanges:iw(E,e),customRange:null,quickFilter:null})}),D&&(0,Q.jsx)(`div`,{className:`mt-2 space-y-1`,children:E.map((e,t)=>(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded-md bg-primary/10 border border-primary/30 px-2.5 py-1.5`,children:[(0,Q.jsx)(`span`,{className:`text-xs text-foreground truncate`,children:e.start===e.end?e.start:`${e.start} → ${e.end}`}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>A(t),className:`text-muted-foreground hover:text-foreground shrink-0`,title:`Remove range`,children:(0,Q.jsx)(W,{className:`w-3.5 h-3.5`})})]},`${e.start}..${e.end}`))})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`p`,{className:`text-[11px] font-semibold uppercase tracking-wide text-muted-foreground mb-2`,children:`Apply to`}),(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(lw,{label:`crud:created`,checked:a.indexCreated,onChange:e=>t({indexCreated:e}),color:UC(`crud:created`)}),(0,Q.jsx)(lw,{label:`crud:updated`,checked:a.indexUpdated,onChange:e=>t({indexUpdated:e}),color:UC(`crud:updated`)}),(0,Q.jsx)(lw,{label:`crud:deleted`,checked:a.indexDeleted,onChange:e=>t({indexDeleted:e}),color:UC(`crud:deleted`)}),(0,Q.jsx)(lw,{label:`content`,checked:a.contentEvents,onChange:e=>t({contentEvents:e}),color:UC(`content`)})]}),(0,Q.jsx)(`p`,{className:`text-[10px] text-muted-foreground/70 mt-1`,children:`content = content-derived timestamps (EXIF, logs, extracted periods)`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,Q.jsx)(`p`,{className:`text-[11px] font-semibold uppercase tracking-wide text-muted-foreground`,children:`Domain timelines`}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>i(),className:`text-muted-foreground/60 hover:text-muted-foreground transition-colors`,title:`Refresh timelines`,children:(0,Q.jsx)(P,{className:`w-3 h-3`})})]}),c?(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 py-2 text-xs text-muted-foreground`,children:[(0,Q.jsx)(Xn,{className:`w-3 h-3 animate-spin`}),`Loading…`]}):T.length===0?(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground py-1`,children:`No domain timelines yet`}):(0,Q.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:T.map(e=>{let t=b.has(e),n=UC(e);return(0,Q.jsxs)(`div`,{className:q(`flex items-center gap-2.5 group rounded-md px-2 py-1.5 cursor-pointer transition-colors`,t?`bg-muted/60`:`hover:bg-muted/30`),onClick:()=>S(e),children:[(0,Q.jsx)(`div`,{className:q(`shrink-0 w-4 h-4 rounded border-2 flex items-center justify-center transition-colors`,!t&&`border-muted-foreground/40 bg-transparent group-hover:border-muted-foreground/70`),style:t?{backgroundColor:n,borderColor:n}:void 0,children:t&&(0,Q.jsx)(`svg`,{className:q(`w-2.5 h-2.5`,wm(n)),viewBox:`0 0 10 10`,fill:`none`,children:(0,Q.jsx)(`path`,{d:`M2 5l2.5 2.5L8 3`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`})})}),(0,Q.jsx)(`span`,{className:`flex-1 text-sm text-foreground truncate select-none`,children:e}),(s[e]?.length??0)>0&&(0,Q.jsx)(`span`,{className:`shrink-0 text-[10px] px-1 py-0.5 rounded bg-muted text-muted-foreground select-none`,title:`Observed granularity for "${e}" — each entry is indexed at its own precision (a bare year at year cells, a full date at day cells)`,children:(s[e]??[]).join(`·`)}),(0,Q.jsx)(`button`,{type:`button`,disabled:p===e,onClick:t=>{t.stopPropagation(),w(e)},className:`shrink-0 p-1 rounded text-muted-foreground/40 hover:text-destructive hover:bg-destructive/10 transition-colors disabled:opacity-50 reveal-on-hover`,title:`Delete timeline "${e}"`,children:p===e?(0,Q.jsx)(Xn,{className:`w-3 h-3 animate-spin`}):(0,Q.jsx)(rt,{className:`w-3 h-3`})})]},e)})}),(0,Q.jsxs)(`div`,{className:`mt-3 flex gap-1.5`,children:[(0,Q.jsx)(`input`,{type:`text`,value:l,onChange:e=>u(e.target.value),onKeyDown:e=>e.key===`Enter`&&C(),placeholder:`New timeline (e.g. wikipedia, trips)…`,title:`A timeline is a named time axis. Entries index at their own precision — a bare year at year granularity, a full date at day granularity — nothing to configure.`,className:`flex-1 px-2 py-1 text-xs rounded-md bg-muted border border-transparent focus:border-ring focus:outline-none`}),(0,Q.jsx)(`button`,{type:`button`,onClick:C,disabled:d||!l.trim(),className:`shrink-0 p-1.5 rounded-md bg-muted hover:bg-muted/80 text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50 touch-target`,title:`Create timeline`,children:d?(0,Q.jsx)(Xn,{className:`w-3.5 h-3.5 animate-spin`}):(0,Q.jsx)(cn,{className:`w-3.5 h-3.5`})})]})]})]})]})}var dw={data:`Data`,"data/backend":`Backends`,"data/mime":`MIME types`,"data/dataset":`Datasets`,client:`Client`,tag:`Tags`,device:`Device`,custom:`Custom`,feature:`Feature`},fw=`data/dataset/default`;function pw(e){let t=new Map;for(let n of e){let e=n.startsWith(`data/backend/`)?`data/backend`:n.startsWith(`data/mime/`)?`data/mime`:n.startsWith(`data/dataset/`)?`data/dataset`:n.split(`/`)[0];t.has(e)||t.set(e,[]),t.get(e).push(n)}return t}var mw=[`off`,`anyOf`,`allOf`,`noneOf`];function hw(e){return mw[(mw.indexOf(e)+1)%mw.length]}var gw=[{m:`anyOf`,label:`any`,on:`bg-info text-info-foreground`},{m:`allOf`,label:`all`,on:`bg-success text-success-foreground`},{m:`noneOf`,label:`not`,on:`bg-destructive text-destructive-foreground`}];function _w({mode:e,onSet:t}){return(0,Q.jsx)(`div`,{className:`flex shrink-0 rounded-md overflow-hidden border border-border divide-x divide-border`,children:gw.map(n=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>t(e===n.m?`off`:n.m),className:q(`px-2 py-0.5 text-[11px] font-medium transition-colors`,e===n.m?n.on:`bg-transparent text-muted-foreground hover:bg-muted hover:text-foreground`),title:`${n.label}: ${n.m}`,children:n.label},n.m))})}function vw({keys:e,modeOf:t,onCycle:n}){return e.length?(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`p`,{className:`text-[11px] font-semibold uppercase tracking-wide text-muted-foreground mb-2`,children:`Document types`}),(0,Q.jsx)(`div`,{className:`grid grid-cols-2 gap-2 sm:grid-cols-3`,children:e.map(e=>{let{label:r,icon:i}=lC(e),a=t(e),o=gw.find(e=>e.m===a);return(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>n(e),title:`${e}: ${a===`off`?`tap to filter`:a}`,className:q(`relative flex flex-col items-center justify-center gap-1.5 rounded-(--card-radius) border p-3 min-h-[4.5rem] transition-colors select-none`,a===`off`?`border-border bg-muted/40 text-foreground hover:bg-muted`:a===`anyOf`?`border-info bg-info/10 text-foreground`:a===`allOf`?`border-success bg-success/10 text-foreground`:`border-destructive bg-destructive/10 text-foreground`),children:[o&&(0,Q.jsx)(`span`,{className:q(`absolute right-1.5 top-1.5 rounded px-1 py-0.5 text-[9px] font-semibold leading-none`,o.on),children:o.label}),(0,Q.jsx)(i,{className:`h-5 w-5 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`text-xs font-medium leading-none`,children:r})]},e)})})]}):null}function yw(){let{state:e,setFeatureMode:t,clearFilters:n,hasActiveFilters:r,deleteBitmap:i,deleteDataset:a}=Rs(),{availableBitmaps:o,bitmapsLoading:s,filters:c}=e,l=new Set(c.features.allOf),u=new Set(c.features.anyOf),d=new Set(c.features.noneOf),f=e=>l.has(e)?`allOf`:u.has(e)?`anyOf`:d.has(e)?`noneOf`:`off`,[p,m]=(0,Z.useState)(``),[h,g]=(0,Z.useState)(null),{showToast:_}=Hr(),v=async e=>{if(e.startsWith(`data/dataset/`)&&e!==fw){let t=e.slice(13);if(!window.confirm(`Drop dataset "${t}"?\n\nALL documents stamped with this dataset will be PERMANENTLY DELETED. Documents in other datasets (or the default dataset) are unaffected. Re-ingesting recreates the dataset from scratch.`))return;g(e);try{let n=await a(e);_({title:`Dataset dropped`,description:`"${t}": ${n} document(s) deleted`})}catch(e){_({title:`Dataset drop failed`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{g(null)}return}if(!e.startsWith(`data/`)&&window.confirm(`Delete bitmap "${e}"?\n\nThis removes the bitmap from the database. Documents are unaffected, but any features/filters relying on this bitmap will lose their grouping.`)){g(e);try{await i(e),_({title:`Bitmap deleted`,description:e})}catch(e){_({title:`Delete failed`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{g(null)}}};if(s)return(0,Q.jsx)(`div`,{className:`flex items-center justify-center py-10`,children:(0,Q.jsx)(Xn,{className:`w-4 h-4 animate-spin text-muted-foreground`})});let y=[...c.features.allOf,...c.features.anyOf,...c.features.noneOf],b=[...new Set([...o,...y])];if(!b.length)return(0,Q.jsx)(`div`,{className:`p-4 text-xs text-muted-foreground text-center py-10`,children:`No feature bitmaps found`});let x=p.trim().toLowerCase(),S=x?b.filter(e=>e.toLowerCase().includes(x)):b,C=S.filter(e=>e.startsWith(sC)).sort((e,t)=>{let n=Object.keys(cC),r=n.indexOf(e),i=n.indexOf(t);return(r===-1?n.length:r)-(i===-1?n.length:i)||e.localeCompare(t)}),w=pw(S.filter(e=>!e.startsWith(sC))),T=w.get(`data/dataset`);return T&&!T.includes(fw)&&(!x||fw.includes(x))&&T.unshift(fw),(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,Q.jsxs)(`div`,{className:`px-4 py-2 border-b border-border shrink-0 space-y-2`,children:[(0,Q.jsxs)(`div`,{className:`relative`,children:[(0,Q.jsx)(nr,{className:`absolute left-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-muted-foreground pointer-events-none`}),(0,Q.jsx)(`input`,{type:`text`,value:p,onChange:e=>m(e.target.value),placeholder:`Search features…`,className:`w-full pl-7 pr-3 py-1.5 text-xs rounded-md bg-muted border border-transparent focus:border-ring focus:outline-none`})]}),(0,Q.jsxs)(`button`,{type:`button`,onClick:n,disabled:!r,className:`flex items-center gap-1.5 w-full justify-center px-2.5 py-1.5 text-xs rounded-md border border-border text-muted-foreground hover:text-foreground hover:bg-muted transition-colors disabled:opacity-40 disabled:hover:bg-transparent`,children:[(0,Q.jsx)(W,{className:`w-3 h-3`}),`Clear all filters`]})]}),(0,Q.jsxs)(`div`,{className:`flex-1 min-h-0 overflow-y-auto p-4 space-y-5`,children:[(0,Q.jsx)(vw,{keys:C,modeOf:f,onCycle:e=>t(e,hw(f(e)))}),w.size===0&&C.length===0?(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground text-center py-6`,children:`No matches`}):Array.from(w.entries()).map(([e,n])=>(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`p`,{className:`text-[11px] font-semibold uppercase tracking-wide text-muted-foreground mb-2`,children:dw[e]??e}),(0,Q.jsx)(`div`,{className:`flex flex-col gap-1`,children:n.map((e,n)=>{let r=e.startsWith(`data/`),i=e===fw,a=e.startsWith(`data/dataset/`)&&!i,o=f(e);return(0,Q.jsxs)(`div`,{onClick:()=>t(e,hw(o)),role:`button`,tabIndex:0,onKeyDown:n=>{(n.key===`Enter`||n.key===` `)&&(n.preventDefault(),t(e,hw(o)))},className:q(`flex items-center gap-2 group rounded-md pl-2 pr-1.5 py-1 border-l-2 transition-colors cursor-pointer select-none`,n%2==0?`bg-muted/50`:`bg-transparent`,`hover:bg-muted`,o===`off`?`border-l-transparent`:o===`anyOf`?`border-l-blue-500 !bg-info/10`:o===`allOf`?`border-l-emerald-500 !bg-success/10`:`border-l-rose-500 !bg-destructive/10`),children:[(0,Q.jsxs)(`span`,{className:`flex-1 min-w-0 text-xs font-mono text-foreground truncate`,title:i?`Virtual dataset: documents not stamped with any dataset. Included by default; "not" hides them, "all" shows only them.`:e,children:[e,i&&(0,Q.jsx)(`span`,{className:`ml-1.5 text-[10px] text-muted-foreground font-sans`,children:`virtual · on by default`})]}),(0,Q.jsx)(`span`,{onClick:e=>e.stopPropagation(),children:(0,Q.jsx)(_w,{mode:o,onSet:n=>t(e,n)})}),(!r||a)&&(0,Q.jsx)(`button`,{type:`button`,disabled:h===e,onClick:t=>{t.stopPropagation(),v(e)},className:`shrink-0 p-1 rounded text-muted-foreground/40 hover:text-destructive hover:bg-destructive/10 transition-colors disabled:opacity-50 reveal-on-hover`,title:a?`Drop dataset "${e.slice(13)}" (DELETES its documents)`:`Delete bitmap "${e}" from database`,"aria-label":a?`Drop dataset ${e}`:`Delete bitmap ${e}`,children:h===e?(0,Q.jsx)(Xn,{className:`w-3.5 h-3.5 animate-spin`}):(0,Q.jsx)(rt,{className:`w-3.5 h-3.5`})})]},e)})})]},e))]})]})}function bw(){let{state:e,setToolsTab:t,saveFilters:n,clearFilters:r,hasActiveFilters:i,setLiveEnabled:a}=Rs(),{toolsTab:o,isDirty:s,isSaving:c,activeContextType:l,savedSearchQuery:u}=e,d=fl(),f=(new URLSearchParams(d.search).has(`q`)||new URLSearchParams(d.search).has(`search`)?xC(d.search):u?[u]:[])[0]||``,p=l!==null&&f.trim()!==(u||``),m=e.filters.sort??Wy.sort,h=m.sortBy!==Wy.sort.sortBy||m.order!==Wy.sort.order,g=i||!!f.trim()||h,_=(0,Q.jsxs)(Q.Fragment,{children:[g&&(0,Q.jsxs)(`button`,{type:`button`,onClick:r,title:`Clear all active filters`,className:`flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,children:[(0,Q.jsx)(W,{className:`h-3 w-3`}),`Clear`]}),l!==null&&g&&(s||p)&&(0,Q.jsxs)(`button`,{type:`button`,onClick:n,disabled:c,className:`flex items-center gap-1.5 rounded-md bg-primary px-2.5 py-1 text-xs text-primary-foreground transition-colors hover:bg-primary disabled:opacity-60`,children:[c?(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}):(0,Q.jsx)(Ve,{className:`h-3 w-3`}),`Save filters`]})]});return(0,Q.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Q.jsx)(`div`,{className:`flex border-b border-border shrink-0`,children:[{id:`features`,label:`Features`},{id:`timeline`,label:`Timeline`},{id:`map`,label:`Map`},{id:`lens`,label:`Lens`}].map(e=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>t(e.id),className:q(`flex-1 py-2.5 text-xs transition-colors`,o===e.id?`-mb-px border-b-2 border-foreground font-semibold text-foreground`:`font-medium text-muted-foreground hover:text-foreground`),children:e.label},e.id))}),l===`context`&&(0,Q.jsxs)(`div`,{className:`shrink-0 space-y-1 border-b border-border px-3 py-1.5`,children:[(0,Q.jsxs)(`div`,{className:`flex min-h-8 flex-wrap items-center justify-between gap-x-3 gap-y-1`,children:[(0,Q.jsxs)(`label`,{className:`flex min-h-8 cursor-pointer items-center gap-2 text-sm font-medium`,title:`Live view updates every device bound to this context. Save filters to keep the current view.`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,className:`h-4 w-4 accent-current`,checked:e.liveEnabled,disabled:new URLSearchParams(d.search).has(`ownerId`),onChange:e=>{a(e.target.checked)}}),`Live view`]}),(0,Q.jsx)(`div`,{className:`ml-auto flex items-center gap-2`,children:_})]}),e.liveError&&(0,Q.jsx)(`p`,{role:`status`,className:`text-xs text-destructive`,children:e.liveError})]}),l!==`context`&&g&&(0,Q.jsx)(`div`,{className:`flex items-center justify-end gap-2 border-b border-border px-3 py-1.5 shrink-0`,children:_}),(0,Q.jsxs)(`div`,{className:`flex-1 min-h-0 overflow-hidden`,children:[o===`features`&&(0,Q.jsx)(yw,{}),o===`timeline`&&(0,Q.jsx)(uw,{}),o===`map`&&(0,Q.jsx)(FC,{}),o===`lens`&&(0,Q.jsx)(BC,{})]})]})}function xw(){let e=vS(),t=$o()?.state,n=!!t&&(e?.mode===`context`?t.activeContextType===`context`&&t.activeContextId===e.contextId:e?.mode===`workspace`?t.activeContextType!==`context`&&t.activeWorkspaceName===e.workspaceName&&t.activeTreeName===e.treeName&&t.activeContextPath===e.path:!t.activeWorkspaceName&&!t.activeContextId),r=!n&&e?.mode===`context`?e.contextId:null;return(0,Z.useEffect)(()=>{if(!r)return;let e=`context:${r}`,t=()=>pd.emit(`subscribe`,{channel:e}),n=pd.on(`connect`,t);return t(),()=>{n(),pd.emit(`unsubscribe`,{channel:e})}},[r]),n?(0,Q.jsx)(bw,{}):(0,Q.jsx)(bC,{target:e,children:(0,Q.jsx)(YS,{children:(0,Q.jsx)(bw,{})})})}function Sw({doc:e,scope:t,onOpen:n,onRemove:r}){let{blobUrl:i,loading:a}=s_(t.workspaceName,e.id,256,{version:e.checksumArray?.[0]??null}),o=String(e.data?.title??`Sketch`);return(0,Q.jsxs)(`div`,{className:`group relative overflow-hidden rounded-(--card-radius) border bg-card shadow-elevation-2 transition-shadow hover:shadow-elevation-3`,children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:n,className:`block w-full text-left`,children:[(0,Q.jsx)(`div`,{className:`flex aspect-[4/3] items-center justify-center overflow-hidden bg-muted/30`,children:i?(0,Q.jsx)(`img`,{src:i,alt:o,className:`h-full w-full object-contain`}):(0,Q.jsx)(ue,{className:`h-6 w-6 text-muted-foreground ${a?`animate-pulse`:``}`})}),(0,Q.jsxs)(`div`,{className:`px-2 py-1.5`,children:[(0,Q.jsx)(`div`,{className:`truncate text-xs font-medium`,children:o}),(0,Q.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,children:CS(e.updatedAt||e.createdAt)})]})]}),(0,Q.jsx)(`button`,{type:`button`,onClick:r,"aria-label":`Delete ${o}`,className:`absolute right-1.5 top-1.5 rounded-md bg-background/80 p-1 opacity-0 transition-opacity hover:text-destructive group-hover:opacity-100`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]})}function Cw({autoAdd:e}){let t=vS(),{docs:n,loading:r,error:i,scope:a,reload:o,removeDoc:s}=wS(t,ki),[c,l]=(0,Z.useState)(e?`new`:null),{showErrorToast:u}=Gr();return t?(0,Q.jsxs)(`div`,{className:`flex flex-col gap-3 p-3`,children:[(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,className:`self-start`,onClick:()=>l(`new`),children:[(0,Q.jsx)(cn,{className:`mr-1.5 h-4 w-4`}),`New sketch`]}),i&&(0,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:i}),r&&!n.length&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading sketches…`}),!r&&!n.length&&!i&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No sketches here yet.`}),a&&n.length>0&&(0,Q.jsx)(`div`,{className:`grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-4`,children:n.map(e=>(0,Q.jsx)(Sw,{doc:e,scope:a,onOpen:()=>l(e),onRemove:()=>{confirm(`Delete "${String(e.data?.title??`Sketch`)}"?`)&&s(e.id).catch(e=>u(e instanceof Error?e.message:`Failed to delete sketch`))}},`${e.id}:${e.checksumArray?.[0]??``}`))}),c&&a&&(0,Q.jsx)(Z.Suspense,{fallback:(0,Q.jsx)(`div`,{className:`fixed inset-0 z-fullscreen flex items-center justify-center bg-background surface-glass`,children:(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading sketch editor…`})}),children:(0,Q.jsx)(vy,{doc:c===`new`?null:c,workspaceName:a.workspaceName,target:t,onSaved:()=>{l(null),o()},onClose:()=>l(null)})}),c&&!a&&(0,Q.jsx)(`div`,{className:`fixed inset-0 z-fullscreen flex items-center justify-center bg-background surface-glass`,children:(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Resolving destination…`})})]}):(0,Q.jsx)(`p`,{className:`p-4 text-sm text-muted-foreground`,children:`Select a context or workspace path first.`})}var ww=[{id:`filters`,label:`Filters`,icon:Wn,modes:[`context`,`global`],description:`Search and filter a workspace or a live context`,Component:xw},{id:`notes`,label:`Notes`,icon:qn,modes:[`context`],description:`All notes in the current context, editable in place`,Component:DS},{id:`todo`,label:`Todos`,icon:Ht,modes:[`context`],description:`Todos in the current context, done items hidden by default`,Component:MS},{id:`sketch`,label:`Sketch`,icon:ue,modes:[`context`],description:`Quick-sketch into the current context; tap a sketch to keep editing`,Component:Cw},{id:`lens`,label:`Lens`,icon:lr,modes:[`context`],description:`Point a camera at things; matching documents surface live`,Component:oC}];function Tw(e){return ww.filter(t=>t.modes.includes(e))}function Ew({target:e,children:t}){return(0,Q.jsx)(_S.Provider,{value:e,children:t})}function Dw({children:e}){let[t,n]=(0,Z.useState)(null),r=(0,Z.useCallback)((e,t)=>n({document:e,workspaceId:t}),[]),i=(0,Z.useCallback)(()=>n(null),[]),a=(0,Z.useMemo)(()=>({open:r,close:i}),[r,i]);return(0,Q.jsxs)(ly.Provider,{value:a,children:[e,(0,Q.jsx)(By,{document:t?.document??null,isOpen:!!t,onClose:i,workspaceId:t?.workspaceId})]})}var Ow=`universe`;function kw(){let{appletId:e}=yl(),[t,n]=Ru(),r=ww.find(t=>t.id===e),i=t.get(`context`),a=t.get(`workspace`)||Ow,o=t.get(`path`)||`/`,s=t.get(`tree`)||`context`,c=t.get(`add`)===`1`,l=(0,Z.useMemo)(()=>i?{mode:`context`,contextId:i}:{mode:`workspace`,workspaceName:a,path:o,treeName:s,treeType:s===`directory`?`directory`:`context`},[i,a,o,s]),[u,d]=(0,Z.useState)([]),[f,p]=(0,Z.useState)([]);(0,Z.useEffect)(()=>{ji().then(d).catch(()=>d([])),fs().then(p).catch(()=>p([]))},[]);let[m,h]=(0,Z.useState)(o),[g,_]=(0,Z.useState)(o);g!==o&&(_(o),h(o));let v=e=>{let r=new URLSearchParams(t);r.delete(`add`);for(let[t,n]of Object.entries(e))n===null?r.delete(t):r.set(t,n);n(r,{replace:!0})};if(!r)return(0,Q.jsxs)(`div`,{className:`flex h-viewport flex-col items-center justify-center gap-3 surface-desk`,children:[(0,Q.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Unknown app`,e?` "${e}"`:``,`.`]}),(0,Q.jsx)(`div`,{className:`flex gap-2`,children:ww.map(e=>(0,Q.jsx)(Mu,{to:`/apps/${e.id}`,className:`rounded-md border border-border px-3 py-1.5 text-sm hover:bg-muted`,children:e.label},e.id))})]});let y=i?`context`:`path`;return(0,Q.jsx)(Dw,{children:(0,Q.jsx)(YS,{children:(0,Q.jsxs)(`div`,{className:`flex h-viewport flex-col surface-desk p-shell gap-shell`,children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-2 rounded-xl border bg-card px-3 py-2 shadow-elevation-2`,children:[(0,Q.jsx)(r.icon,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`text-sm font-semibold`,children:r.label}),(0,Q.jsx)(`div`,{className:`ml-2 flex overflow-hidden rounded-md border border-border`,children:[`path`,`context`].map(e=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>{e!==y&&v(e===`path`?{context:null}:{context:f[0]?.id??``,workspace:null,path:null,tree:null})},className:q(`px-2.5 py-1 text-xs capitalize transition-colors`,y===e?`bg-foreground text-background`:`text-muted-foreground hover:bg-muted hover:text-foreground`),children:e},e))}),y===`path`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`select`,{value:a,onChange:e=>v({workspace:e.target.value,path:`/`}),className:`h-7 rounded-md border border-input bg-transparent px-1.5 text-xs`,"aria-label":`Workspace`,children:[!u.some(e=>e.name===a)&&(0,Q.jsx)(`option`,{value:a,children:a}),u.map(e=>(0,Q.jsx)(`option`,{value:e.name,children:e.label||e.name},e.id))]}),(0,Q.jsx)(`input`,{value:m,onChange:e=>h(e.target.value),onBlur:()=>{let e=m.trim()||`/`;e!==o&&v({path:e})},onKeyDown:e=>{e.key===`Enter`&&e.target.blur()},spellCheck:!1,placeholder:`/`,className:`h-7 w-40 rounded-md border border-input bg-transparent px-2 text-xs outline-none focus-visible:ring-1 focus-visible:ring-ring`,"aria-label":`Path`})]}):(0,Q.jsxs)(`select`,{value:i??``,onChange:e=>v({context:e.target.value}),className:`h-7 max-w-56 rounded-md border border-input bg-transparent px-1.5 text-xs`,"aria-label":`Context`,children:[!i&&(0,Q.jsx)(`option`,{value:``,children:`Pick a context…`}),f.map(e=>(0,Q.jsxs)(`option`,{value:e.id,children:[e.id,e.url?` (${e.url})`:``]},e.id))]}),(0,Q.jsx)(`div`,{className:`grow`}),(0,Q.jsx)(Mu,{to:`/home`,className:`flex items-center gap-1 rounded-md p-1.5 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,title:`Open the full Canvas app`,children:(0,Q.jsx)(ye,{className:`h-3.5 w-3.5`})})]}),(0,Q.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border bg-card shadow-elevation-2`,children:y===`context`&&!i?(0,Q.jsxs)(`div`,{className:`flex h-full items-center justify-center p-6 text-center text-sm text-muted-foreground`,children:[`Pick a context above to bind `,r.label,` to it.`]}):(0,Q.jsx)(Ew,{target:l,children:(0,Q.jsx)(r.Component,{autoAdd:c},JSON.stringify(l))})})]})})})}var Aw=`false`,jw=`false`,Mw=Aw===`true`,Nw=jw===`true`;function Pw(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,Mw||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()},!Nw){if(Mw)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 Fw=new Set,Iw=!1,Lw=Pw({immediate:!0,onRegisteredSW(e,t){t&&setInterval(()=>{t.update()},36e5)},onNeedRefresh(){Iw=!0,Fw.forEach(e=>e())}});function Rw(e){return Fw.add(e),Iw&&e(),()=>{Fw.delete(e)}}function zw(){Lw(!0)}function Bw(){let[e,t]=(0,Z.useState)(!1),[n,r]=(0,Z.useState)(!1);return(0,Z.useEffect)(()=>Rw(()=>t(!0)),[]),!e||n?null:(0,Q.jsx)(`div`,{className:`fixed bottom-4 left-1/2 z-50 -translate-x-1/2`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-3 rounded-full border border-border bg-card px-4 py-2 shadow-elevation-2`,children:[(0,Q.jsx)(`span`,{className:`text-sm`,children:`A new version of Canvas is ready`}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>zw(),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,Q.jsx)(P,{className:`h-3 w-3`}),` Reload`]}),(0,Q.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,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]})})}var Vw;function Hw(){let[e,t]=(0,Z.useState)({local:!1});return(0,Z.useEffect)(()=>{Vw??=fetch(`${Rr}/runtime/capabilities`).then(async e=>e.ok?(await e.json()).payload:{local:!1}).catch(()=>({local:!1}));let e=!0;return Vw.then(n=>{e&&t(n)}),()=>{e=!1}},[]),e}function Uw(e){return e.isShared||e.type===`shared`?e.id:e.name}function Ww({title:e,description:t,actions:n,backTo:r,onBack:i,className:a,compact:o}){let s=hl();return(0,Q.jsxs)(`div`,{className:q(`flex flex-wrap items-start gap-x-3 gap-y-2`,!o&&`border-b pb-4`,a),children:[(0,Q.jsxs)(`div`,{className:`flex min-w-[14rem] flex-1 items-start gap-3`,children:[(i||r)&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>i?i():s(r),"aria-label":`Back`,title:`Back`,className:`mt-1 shrink-0 text-muted-foreground transition-colors hover:text-foreground touch-target`,children:(0,Q.jsx)(Yn,{className:`h-5 w-5`})}),(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`h1`,{className:q(`truncate font-bold tracking-tight`,o?`text-xl`:`text-3xl`),children:e}),t&&(0,Q.jsx)(`p`,{className:q(`break-words text-muted-foreground`,o?`mt-1 text-xs`:`mt-2`),children:t})]})]}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>s(`/`),"aria-label":`Close`,title:`Close`,className:`order-2 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border text-muted-foreground transition-colors hover:bg-muted hover:text-foreground touch-target`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})}),n&&(0,Q.jsx)(`div`,{className:`order-3 flex w-full items-center gap-2 max-sm:flex-wrap sm:order-1 sm:w-auto`,children:n})]})}function Gw({className:e}){let t=hl();return(0,Q.jsx)(`button`,{type:`button`,onClick:()=>t(`/`),"aria-label":`Close`,title:`Close`,className:q(`flex h-7 w-7 shrink-0 items-center justify-center rounded-md border text-muted-foreground transition-colors hover:bg-accent hover:text-foreground touch-target`,e),children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})}function Kw({onBack:e,title:t=`Back`,className:n}){return(0,Q.jsx)(`button`,{type:`button`,onClick:e,"aria-label":t,title:t,className:q(`flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground touch-target`,n),children:(0,Q.jsx)(Yn,{className:`h-4 w-4`})})}var qw=180;function Jw({x:e,y:t,current:n,onChange:r,onClose:i}){Np(i);let[a,o]=(0,Z.useState)(``),[s,c]=(0,Z.useState)([]),[l,u]=(0,Z.useState)({q:``,list:[]}),[d,p]=(0,Z.useState)(!0),m=(0,Z.useRef)(null),h=(0,Z.useRef)({name:``,t:0}),g=(e,t)=>{r({icon:e}),h.current.name===e&&t-h.current.t<350&&i(),h.current={name:e,t}};(0,Z.useEffect)(()=>{m.current?.focus()},[]),(0,Z.useEffect)(()=>{let e=!0;return om().then(t=>{e&&(c(t),p(!1))}),()=>{e=!1}},[]),(0,Z.useEffect)(()=>{let e=a.trim();if(!e)return;let t=setTimeout(()=>{sm(e).then(t=>{u({q:e,list:t})})},250);return()=>clearTimeout(t)},[a]);let _=a.trim(),v=l.q===_,y=_!==``&&!v,b=(0,Z.useMemo)(()=>(_?v?l.list:[]:s).slice(0,qw),[_,v,l.list,s]),x=(0,Z.useRef)(null),[S,C]=(0,Z.useState)({x:e,y:t});return(0,Z.useLayoutEffect)(()=>{let n=x.current;if(!n)return;let r=()=>{let{width:r,height:i}=n.getBoundingClientRect();C({x:Math.max(8,Math.min(e,window.innerWidth-r-8)),y:Math.max(8,Math.min(t,window.innerHeight-i-8))})};r();let i=new ResizeObserver(r);return i.observe(n),window.addEventListener(`resize`,r),()=>{i.disconnect(),window.removeEventListener(`resize`,r)}},[e,t]),(0,Pp.createPortal)((0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`fixed inset-0 z-40`,onClick:i}),(0,Q.jsxs)(`div`,{ref:x,className:`fixed z-50 w-[270px] max-w-[90vw] rounded-md border bg-popover p-2 shadow-elevation-4`,style:{left:S.x,top:S.y},children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between px-1 pb-1.5`,children:[(0,Q.jsx)(`span`,{className:`text-xs font-medium`,children:`Icon & color`}),(0,Q.jsx)(`button`,{type:`button`,onClick:i,className:`text-muted-foreground hover:text-foreground`,children:(0,Q.jsx)(W,{className:`w-3.5 h-3.5`})})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-1.5 px-1 pb-2`,children:[cm.map(e=>(0,Q.jsx)(`button`,{type:`button`,title:e,onClick:()=>r({color:e}),className:q(`w-5 h-5 rounded-full border transition-transform hover:scale-110`,n.color===e?`ring-2 ring-offset-1 ring-foreground`:`border-border`),style:{backgroundColor:e}},e)),(0,Q.jsx)(`button`,{type:`button`,title:`No color`,onClick:()=>r({color:void 0}),className:q(`w-5 h-5 rounded-full border flex items-center justify-center text-muted-foreground hover:scale-110 transition-transform`,!n.color&&`ring-2 ring-offset-1 ring-foreground`),children:(0,Q.jsx)(W,{className:`w-3 h-3`})}),(0,Q.jsx)(`label`,{title:`Custom color`,className:q(`relative w-5 h-5 rounded-full border border-border cursor-pointer hover:scale-110 transition-transform overflow-hidden`,n.color&&!cm.includes(n.color)&&`ring-2 ring-offset-1 ring-foreground`),style:{background:n.color&&!cm.includes(n.color)?n.color:`conic-gradient(from 0deg, #ef4444, #eab308, #22c55e, #06b6d4, #6366f1, #ec4899, #ef4444)`},children:(0,Q.jsx)(`input`,{type:`color`,value:n.color??`#3b82f6`,onChange:e=>r({color:e.target.value}),className:`absolute inset-0 opacity-0 cursor-pointer`})})]}),(0,Q.jsx)(`input`,{ref:m,value:a,onChange:e=>o(e.target.value),placeholder:`Search icons…`,className:`w-full mb-2 rounded-sm border bg-background px-2 py-1 text-xs outline-none focus:ring-1 focus:ring-primary`}),d||y?(0,Q.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-8 text-xs text-muted-foreground`,children:[(0,Q.jsx)(Xn,{className:`w-4 h-4 animate-spin`}),` `,y?`Searching…`:`Loading icons…`]}):(0,Q.jsxs)(`div`,{className:`grid grid-cols-7 gap-0.5 max-h-[200px] overflow-y-auto`,children:[(0,Q.jsx)(`button`,{type:`button`,title:`No icon`,onClick:()=>r({icon:void 0}),className:q(`aspect-square flex items-center justify-center rounded-sm hover:bg-accent text-muted-foreground`,!n.icon&&`bg-accent ring-1 ring-primary`),children:(0,Q.jsx)(W,{className:`w-4 h-4`})}),b.map(e=>(0,Q.jsx)(`button`,{type:`button`,title:e.replace(/^[^:]+:/,``).replace(`-fill`,``),onClick:t=>g(e,t.timeStamp),className:q(`aspect-square flex items-center justify-center rounded-sm hover:bg-accent`,n.icon===e&&`bg-accent ring-1 ring-primary`),children:(0,Q.jsx)(f,{icon:e,width:18,height:18,color:n.color})},e))]}),!d&&!y&&b.length===0&&(0,Q.jsxs)(`div`,{className:`px-1 py-3 text-center text-[11px] text-muted-foreground`,children:[`No icons match “`,a,`”`]})]})]}),document.body)}function Yw(e,t,n){let r=(0,Z.useRef)(n);(0,Z.useEffect)(()=>{r.current=n}),(0,Z.useEffect)(()=>{if(!e)return;e.emit(`subscribe`,{channel:t});let n=Object.keys(r.current).map(t=>{let n=(...e)=>{r.current[t]?.(...e)};return e.on(t,n),[t,n]});return()=>{e.emit(`unsubscribe`,{channel:t});for(let[t,r]of n)e.off(t,r)}},[e,t])}function Xw({title:e,onClose:t,children:n}){return(0,Q.jsxs)(`div`,{className:`space-y-4 rounded-(--card-radius) border bg-card p-4 shadow-elevation-1`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsx)(`h2`,{className:`text-xl font-semibold`,children:e}),(0,Q.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`Close`,className:`rounded p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground touch-target`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),n]})}function Zw({workspace:e,onStart:t,onStop:n,onEnter:r,onEdit:i,onSettings:a,onDestroy:o}){let[s,c]=(0,Z.useState)(!1),l=e.status===`active`,u=e.type===`universe`||e.name===`universe`,d=e.status===`error`,f=e.status===`not_found`,p=e.isShared===!0||e.type===`shared`,m=e.ownerEmail||e.owner,h=typeof e.sharedVia==`object`&&e.sharedVia?e.sharedVia:null,g=h?.permissions||[],_=g.includes(`admin`)?`admin`:g.includes(`write`)?`read/write`:`read-only`,v=h?.type===`group`?`via group ${h.principal}`:h?.type===`user`?`shared with you`:``,y=e.origin===`remote`,b=e.status===`offline`,x=Cm(e.color),S=x?``:`border-border`,C=x?{borderLeftColor:x,borderLeftWidth:`4px`}:{borderLeftWidth:`4px`};return(0,Q.jsx)(Q.Fragment,{children:(0,Q.jsxs)(Wu,{className:`relative ${S}`,style:C,children:[(0,Q.jsx)(Gu,{children:(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-2`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1 basis-40`,children:[(0,Q.jsx)(Ku,{className:`truncate`,children:e.label||e.name}),(0,Q.jsx)(qu,{children:p?`Shared from ${m}`:e.description||``})]}),(0,Q.jsxs)(`div`,{className:`flex w-full shrink-0 flex-wrap items-center gap-2 sm:w-auto`,children:[l?(0,Q.jsx)(X,{variant:`outline`,size:`icon`,onClick:()=>n(Uw(e)),title:`Stop Workspace`,disabled:d||f,children:(0,Q.jsx)(Bn,{className:`h-4 w-4`})}):(0,Q.jsx)(X,{variant:`outline`,size:`icon`,onClick:()=>t(Uw(e)),title:b?`Remote unreachable${e.statusMessage?`: ${e.statusMessage}`:``}`:`Start Workspace`,disabled:d||f||b,children:(0,Q.jsx)(Se,{className:`h-4 w-4`})}),l&&(0,Q.jsx)(X,{variant:`outline`,size:`icon`,onClick:()=>r(Uw(e)),title:`Enter Workspace`,disabled:d||f,children:(0,Q.jsx)(vt,{className:`h-4 w-4`})}),a&&(0,Q.jsx)(X,{variant:`outline`,size:`icon`,onClick:()=>a(e),title:Ep(e)?`Workspace settings`:`Workspace settings require admin access`,"aria-label":`Workspace settings`,disabled:f||!Ep(e),children:(0,Q.jsx)(bn,{className:`h-4 w-4`})}),i&&!u&&!p&&(0,Q.jsx)(X,{variant:`outline`,size:`icon`,onClick:()=>i(e),title:`Edit Workspace`,disabled:d||f,children:(0,Q.jsx)(an,{className:`h-4 w-4`})}),o&&!u&&!p&&(0,Q.jsxs)(Lr,{open:s,onOpenChange:c,children:[(0,Q.jsx)(Ar,{asChild:!0,children:(0,Q.jsx)(X,{variant:`outline`,size:`icon`,title:y?`Remove remote workspace reference`:`Delete Workspace`,disabled:l&&!y,className:`text-destructive hover:text-destructive hover:bg-destructive/10`,children:(0,Q.jsx)(rt,{className:`h-4 w-4`})})}),(0,Q.jsxs)(kr,{children:[(0,Q.jsxs)(Ir,{children:[(0,Q.jsx)(wr,{children:y?`Remove remote workspace`:`Delete Workspace`}),(0,Q.jsx)(Cr,{children:y?(0,Q.jsxs)(Q.Fragment,{children:[`Remove the reference to "`,e.label||e.name,`" from this server?`,(0,Q.jsx)(`br`,{}),(0,Q.jsx)(`br`,{}),`The workspace itself stays untouched on `,e.remote?.url||e.host,`; only the stored share token and the local cache entry are dropped.`]}):(0,Q.jsxs)(Q.Fragment,{children:[`Are you sure you want to delete the workspace "`,e.label||e.name,`"?`,(0,Q.jsx)(`br`,{}),(0,Q.jsx)(`br`,{}),(0,Q.jsx)(`strong`,{children:`This action cannot be undone.`}),` All data associated with this workspace, including documents, contexts, and configurations will be permanently removed.`]})})]}),(0,Q.jsxs)(Nr,{children:[(0,Q.jsx)(Fr,{children:`Cancel`}),(0,Q.jsx)(Mr,{onClick:()=>{o(e),c(!1)},className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:y?`Remove reference`:`Delete Workspace`})]})]})]})]})]})}),(0,Q.jsx)(Ju,{children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`div`,{className:`h-3 w-3 rounded-full ${(()=>{switch(e.status){case`active`:return`bg-success`;case`inactive`:case`available`:return`bg-muted-foreground`;case`error`:case`offline`:return`bg-destructive`;case`not_found`:return`bg-muted-foreground`;default:return`bg-accent`}})()}`}),(0,Q.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:(()=>{switch(e.status){case`active`:return`Active`;case`inactive`:return`Inactive`;case`error`:return`Error`;case`not_found`:return`Not Found`;case`available`:return`Available`;case`removed`:return`Removed`;case`destroyed`:return`Destroyed`;case`offline`:return`Offline`;default:return e.status}})()}),u&&(0,Q.jsx)(`span`,{className:`ml-2 rounded-full bg-primary/10 px-2 py-1 text-xs text-primary`,children:`Universe`}),y&&(0,Q.jsxs)(`span`,{className:`ml-2 rounded-full bg-info/10 px-2 py-1 text-xs text-info`,title:e.remote?.url?`${e.remote.url} (${(e.remote.permissions||[]).join(`, `)||`no permissions`})`:void 0,children:[`Remote · `,e.host]}),p&&(0,Q.jsxs)(`span`,{className:`ml-2 rounded-full bg-info/10 px-2 py-1 text-xs text-info`,title:[v,`${_} access`].filter(Boolean).join(` · `),children:[`Shared · `,_]})]})})]})})}function Qw(){let[e,t]=Ru(),n=e.get(`create`)===`1`,[r,i]=(0,Z.useState)(n),[a,o]=(0,Z.useState)(n);return n!==a&&(o(n),n&&i(!0)),[r,(0,Z.useCallback)(r=>{if(i(r),!r&&n){let n=new URLSearchParams(e);n.delete(`create`),t(n,{replace:!0})}},[e,n,t])]}var $w=`canvas:lastPath`,eT=200;function tT(){try{let e=localStorage.getItem($w);if(!e)return{};let t=JSON.parse(e);return t&&typeof t==`object`?t:{}}catch{return{}}}function nT(e){try{localStorage.setItem($w,JSON.stringify(e))}catch{}}function rT(e,t,n){if(!e)return;let r=tT(),i=r[e];if(i&&i.tree===t&&i.path===n)return;delete r[e],r[e]={tree:t,path:n};let a=Object.keys(r);if(a.length>eT)for(let e of a.slice(0,a.length-eT))delete r[e];nT(r)}function iT(e){let t=tT()[e];return!t||typeof t.path!=`string`||typeof t.tree!=`string`?null:t}function aT(e){let t=iT(e);return t?Mx(e,t.path,t.tree):`/workspaces/${e}`}var oT=[{id:`device`,label:`This device`,description:`Personalize this browser and manage content available offline.`,items:[{path:`/appearance`,icon:oe,label:`Appearance`,description:`Choose the theme, layout, colours, display density and document reading pane.`},{path:`/key-bindings`,icon:sr,label:`Keyboard shortcuts`,description:`View and customize shortcuts for navigation and actions.`},{path:`/offline`,icon:hr,label:`Offline & cache`,description:`Manage cached content and storage on this device.`}]},{id:`account`,label:`Your account`,description:`Manage your access and the defaults your workspaces inherit.`,items:[{path:`/api-tokens`,icon:ze,label:`API access tokens`,description:`Create and revoke credentials for apps and integrations.`},{path:`/devices`,icon:In,label:`Registered devices`,description:`Manage devices connected to your account.`},{path:`/embedding`,icon:On,label:`Search & AI defaults`,description:`Choose default embedding providers and models for your workspaces.`},{path:`/shared`,icon:Mn,label:`Shared with you`,description:`Find content other people have shared with your account.`}]},{id:`server`,label:`Server administration`,description:`Administrator controls for everyone using this Canvas server.`,items:[{path:`/admin/users`,icon:V,label:`Users`,description:`Manage accounts and server access.`},{path:`/admin/roles`,icon:hn,label:`Roles & permissions`,description:`Manage reusable permissions across the server.`},{path:`/admin/auth`,icon:k,label:`Authentication`,description:`Configure sign-in backends: local passwords, LDAP and IMAP.`},{path:`/admin/embedding`,icon:On,label:`Server search & AI defaults`,description:`Set the embedding providers and models accounts inherit.`},{path:`/admin/logs`,icon:pr,label:`Server logs`,description:`Inspect server activity and troubleshoot failures.`},{path:`/admin/contexts`,icon:dr,label:`All contexts`,description:`Inspect and manage contexts across the server.`},{path:`/admin/workspaces`,icon:it,label:`All workspaces`,description:`Inspect and manage workspaces across the server.`},{path:`/admin/agents`,icon:lt,label:`All agents`,description:`Inspect and manage agents across the server.`}]},{id:`information`,label:`Information`,description:`Information about your Canvas installation.`,items:[{path:`/about`,icon:ee,label:`About Canvas`,description:`View versions and information about this installation.`}]}],sT=[`/settings`,...oT.filter(e=>e.id!==`server`).flatMap(e=>e.items.map(e=>e.path))];function cT(e,...t){let n=t.join(` `).toLocaleLowerCase();return e.toLocaleLowerCase().trim().split(/\s+/).every(e=>n.includes(e))}var lT=[{id:`classic`,name:`Classic`,description:`Menu panel on the left, one content sheet.`},{id:`strip`,name:`Canvas strip (beta)`,description:`Experimental. Menus and canvases side by side in a strip you walk with the arrow keys or a swipe. Shift+click opens a second canvas to the right; pins open their own row.`}],uT=`canvas:layout`;function dT(){try{return localStorage.getItem(uT)===`strip`?`strip`:`classic`}catch{return`classic`}}var fT=dT(),pT=new Set;function mT(){for(let e of pT)e()}function hT(){return fT}function gT(e){try{e===`strip`?localStorage.setItem(uT,e):localStorage.removeItem(uT)}catch{}fT=e,mT()}function _T(e){pT.add(e);let t=t=>{(t.key===uT||t.key===null)&&(fT=dT(),e())};return window.addEventListener(`storage`,t),()=>{pT.delete(e),window.removeEventListener(`storage`,t)}}function vT(){return(0,Z.useSyncExternalStore)(_T,hT,()=>`classic`)}var yT=[{id:`shift`,name:`Shift + arrows`,description:`Shift with an arrow key moves between columns and rows.`},{id:`alt`,name:`Alt + arrows`,description:`Alt with an arrow key. Some browsers use Alt+Left/Right for history.`},{id:`ctrl`,name:`Ctrl + arrows`,description:`Ctrl (Cmd on macOS) with an arrow key.`},{id:`none`,name:`Bare arrows`,description:`Plain arrow keys, except while typing in a field.`}],bT=`canvas:layout-nav`;function xT(){try{let e=localStorage.getItem(bT);return e===`alt`||e===`ctrl`||e===`none`?e:`shift`}catch{return`shift`}}var ST=xT(),CT=new Set;function wT(){return ST}function TT(e){try{e===`shift`?localStorage.removeItem(bT):localStorage.setItem(bT,e)}catch{}ST=e;for(let e of CT)e()}function ET(e){CT.add(e);let t=t=>{(t.key===bT||t.key===null)&&(ST=xT(),e())};return window.addEventListener(`storage`,t),()=>{CT.delete(e),window.removeEventListener(`storage`,t)}}function DT(){return(0,Z.useSyncExternalStore)(ET,wT,()=>`shift`)}function OT(e,t){let n=e.ctrlKey||e.metaKey;switch(t){case`shift`:return e.shiftKey&&!e.altKey&&!n;case`alt`:return e.altKey&&!e.shiftKey&&!n;case`ctrl`:return n&&!e.shiftKey&&!e.altKey;case`none`:return!e.shiftKey&&!e.altKey&&!n}}function kT(){return window.matchMedia(`(max-width: 767px)`).matches&&hT()!==`strip`}var AT=(0,Z.createContext)(null);function jT(){let e=(0,Z.useContext)(AT);if(!e)throw Error(`useMenu must be used within a MenuProvider`);return e}function MT(e){let t=e.split(`/`).filter(Boolean),n=t[0]||``,r=t[1]||null,i=t[2]||null;return n===`contexts`?{section:`contexts`,entityId:r,m2View:i===`settings`?`settings`:r?`detail`:null}:n===`workspaces`?{section:`workspaces`,entityId:r,m2View:i===`settings`?`settings`:r?`detail`:null}:n===`agents`?{section:`agents`,entityId:r,m2View:i===`settings`?`settings`:r?`detail`:null}:n===`admin`||sT.includes(`/${n}`)?{section:`settings`,entityId:null,m2View:null}:{section:null,entityId:null,m2View:null}}function NT(e,t){let n=fl(),r=hl(),i=(0,Z.useRef)(!1),a=(0,Z.useRef)(e);return(0,Z.useEffect)(()=>{a.current=e},[e]),(0,Z.useLayoutEffect)(()=>{if(i.current){i.current=!1;return}let{section:e,entityId:r,m2View:o}=MT(n.pathname);if(e===null&&n.pathname!==`/`&&hT()===`strip`){let t=a.current;e=t.activeSection,r=t.selectedEntityId,o=t.m2View}let s=kT(),c=s?n.state?.canvasMenu:void 0;t(c?{type:`RESTORE_MENU`,menu:c}:{type:`SYNC_FROM_URL`,section:e,entityId:r,m2View:o,mobile:s})},[n.key,n.pathname,n.state,t]),{navigateToEntity:(0,Z.useCallback)(e=>{i.current=!0,r(e)},[r])}}function PT(){let[e,t]=(0,Z.useState)(null);return(0,Z.useEffect)(()=>{let e=localStorage.getItem(`authToken`);if(!e)return;let n=Br(Sr.ws,{auth:{token:e},transports:[`websocket`],reconnection:!0,reconnectionAttempts:5,reconnectionDelay:1e3});return n.on(`connect`,()=>{console.log(`WebSocket connected`)}),n.on(`connect_error`,e=>{console.error(`WebSocket connection error:`,e)}),n.on(`error`,e=>{console.error(`WebSocket error:`,e)}),t(n),()=>{n.close()}},[]),e}var FT=[`Home`,`Travel`,`Work`,`Books`,`Workouts`,`Beauty`,`Recipes`,`To Watch`,`To Read`,`Learning`,`Tech`,`Music`,`Finance`,`Shopping`,`Ideas`];async function IT(e,t,n){let r=0,i=0,a=n===`directory`?`directory`:`context`;for(let n of t)try{await Ga(e,`/${n}`,!0,a);let t=hm(`/${n}`);t&&await fa(e,`/${n}`,t,a).catch(()=>{}),r+=1}catch{i+=1}return Aa(e),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:e,treeName:n}})),{ok:r,failed:i}}function LT(){let[e,t]=(0,Z.useState)(new Set),[n,r]=(0,Z.useState)(`context`);return{selected:e,setSelected:t,tree:n,setTree:r,toggle:e=>{t(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}}}function RT({selected:e,onToggle:t,tree:n,onTreeChange:r,disabled:i=!1,idPrefix:a=`default-folders`,stacked:o=!1}){return(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-3 text-xs`,children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`Create in:`}),[`context`,`directory`].map(e=>(0,Q.jsxs)(`label`,{className:`flex items-center gap-1`,children:[(0,Q.jsx)(`input`,{type:`radio`,name:`${a}-tree`,checked:n===e,onChange:()=>r(e),disabled:i}),e,` tree`]},e))]}),(0,Q.jsx)(`div`,{className:`mt-3 grid gap-1.5 ${o?`grid-cols-1`:`grid-cols-2 sm:grid-cols-3 md:grid-cols-4`}`,children:FT.map(n=>{let r=lm[n.toLowerCase()];return(0,Q.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-2 rounded border px-2 py-1.5 text-sm hover:bg-accent/50`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:e.has(n),onChange:()=>t(n),disabled:i}),r?.icon&&(0,Q.jsx)(f,{icon:r.icon,width:16,height:16,color:r.color}),(0,Q.jsx)(`span`,{className:`truncate`,children:n})]},n)})})]})}var zT=[{value:`full`,icon:ne,title:`Standard`,blurb:`Everything in one folder: your files in home/, alongside db/, data/, git/.`,tree:[`workspace.json`,`home/ ← your files`,`db/ data/ cache/ Git/`]},{value:`home`,icon:Fe,title:`Roaming home`,blurb:`The workspace folder IS your drive. Mount it over WebDAV and it looks like a plain home directory. Canvas keeps its files in a hidden .workspace/.`,tree:[`your files, at the top level`,`.workspace/ ← hidden, ignored`]}];function BT({value:e,onChange:t,disabled:n=!1,idPrefix:r=`workspace-layout`,compact:i=!1}){return(0,Q.jsx)(`div`,{className:i?`space-y-1.5`:`grid gap-2 sm:grid-cols-2`,children:zT.map(i=>{let a=e===i.value,o=i.icon;return(0,Q.jsxs)(`button`,{id:`${r}-${i.value}`,type:`button`,role:`radio`,"aria-checked":a,disabled:n,onClick:()=>t(i.value),className:`flex w-full gap-2 rounded-md border p-2.5 text-left transition-colors disabled:opacity-50 ${a?`border-primary bg-accent/40`:`hover:bg-accent/20`}`,children:[(0,Q.jsx)(o,{className:`mt-0.5 h-4 w-4 shrink-0 ${a?`text-primary`:`text-muted-foreground`}`}),(0,Q.jsxs)(`span`,{className:`min-w-0`,children:[(0,Q.jsx)(`span`,{className:`block text-xs font-medium`,children:i.title}),(0,Q.jsx)(`span`,{className:`mt-0.5 block text-[11px] leading-snug text-muted-foreground`,children:i.blurb}),(0,Q.jsx)(`span`,{className:`mt-1 block font-mono text-[10px] leading-relaxed text-muted-foreground/80`,children:i.tree.map(e=>(0,Q.jsx)(`span`,{className:`block truncate`,children:e},e))})]})]},i.value)})})}function VT(){let[e,t]=(0,Z.useState)(`full`),[n,r]=(0,Z.useState)(!1);return(0,Z.useEffect)(()=>{let e=!0;return Y.get(`/ping`,{skipAuth:!0}).then(r=>{let i=r?.defaults?.workspaceLayout;e&&!n&&(i===`home`||i===`full`)&&t(i)}).catch(()=>{}),()=>{e=!1}},[]),[e,e=>{r(!0),t(e)}]}function HT({disabled:e}){let[t,n]=(0,Z.useState)(0),[r,i]=(0,Z.useState)(!0),[a,o]=(0,Z.useState)([]),[s,c]=(0,Z.useState)(null),[l,u]=(0,Z.useState)(``),d=(0,Z.useRef)(null);return(0,Z.useEffect)(()=>{let e=!0;return d.current?.id!==t&&(d.current={id:t,promise:qa()}),d.current.promise.then(t=>{if(!e)return;let n=[...t.discovered,...t.adopted];o(e=>[...new Map([...e,...n].map(e=>[e.id,e])).values()]),c(t),(n.length||t.updated.length||t.missing.length)&&window.dispatchEvent(new CustomEvent(`workspaces:refresh`))}).catch(t=>{e&&u(t instanceof Error?t.message:`Workspace scan failed`)}).finally(()=>{e&&i(!1)}),()=>{e=!1}},[t]),(0,Q.jsxs)(`section`,{className:`space-y-2 rounded-md border p-3`,"aria-label":`Find workspace folders`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h3`,{className:`text-sm font-medium`,children:`Workspaces folder`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Copied a workspace folder here? Scan to add it to your workspaces.`})]}),(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:e||r,onClick:()=>{i(!0),u(``),n(e=>e+1)},children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5 ${r?`animate-spin`:``}`}),r?`Scanning…`:`Rescan`]})]}),r&&(0,Q.jsx)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:`Looking for workspace folders…`}),!r&&!l&&(0,Q.jsx)(`p`,{role:`status`,className:`text-sm`,children:a.length?`Found ${a.length} ${a.length===1?`workspace`:`workspaces`}. Added to your workspace list.`:`No new workspace folders found.`}),a.length>0&&(0,Q.jsx)(`ul`,{className:`space-y-2`,children:a.map(e=>(0,Q.jsxs)(`li`,{children:[(0,Q.jsx)(Mu,{className:`text-sm font-medium underline underline-offset-2`,to:`/workspaces/${encodeURIComponent(e.name)}`,children:e.label||e.name}),(0,Q.jsx)(`p`,{className:`break-all text-xs text-muted-foreground`,children:e.dir})]},e.id))}),l&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:l}),!!s?.skipped.length&&(0,Q.jsxs)(`details`,{className:`text-sm text-muted-foreground`,children:[(0,Q.jsxs)(`summary`,{children:[s.skipped.length,` `,s.skipped.length===1?`folder could`:`folders could`,` not be added`]}),(0,Q.jsx)(`ul`,{className:`mt-1 space-y-1`,children:s.skipped.map(e=>(0,Q.jsxs)(`li`,{className:`break-all`,children:[e.dir,`: `,e.reason]},e.dir))})]})]})}function UT({name:e,label:t,setName:n,setLabel:r,disabled:i=!1}){return(0,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsxs)(`label`,{className:`grid gap-1 text-sm`,children:[`Workspace name`,(0,Q.jsx)(J,{required:!0,pattern:`[a-zA-Z0-9]([a-zA-Z0-9_]|-)*`,placeholder:`my-workspace`,value:e,onChange:e=>n(e.target.value),disabled:i}),(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Used in addresses. Archive imports also use it as the folder name.`})]}),(0,Q.jsxs)(`label`,{className:`grid gap-1 text-sm`,children:[`Display label`,(0,Q.jsx)(J,{required:!0,placeholder:`My Workspace`,value:t,onChange:e=>r(e.target.value),disabled:i})]})]})}function WT({onImported:e,disabled:t=!1}){let[n,r]=(0,Z.useState)(`upload`),[i,a]=(0,Z.useState)(null),[o,s]=(0,Z.useState)(``),[c,l]=(0,Z.useState)(``),[u,d]=(0,Z.useState)(``),[f,p]=(0,Z.useState)(!1),[m,h]=(0,Z.useState)(``),[g,_]=(0,Z.useState)(``),[v,y]=(0,Z.useState)(null),b=t||f,x=async t=>{t.preventDefault(),p(!0),_(``),y(null),h(`Starting…`);let r={name:c.trim(),label:u.trim()},a=e=>h(Ka[e.phase]||e.phase);try{let t=n===`upload`?await ya(i,e=>h(e<1?`Uploading… ${Math.round(e*100)}%`:`Extracting…`),a,r):await wa(o.trim(),r,a);y(t),window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),e?.(t)}catch(e){_(e instanceof Error?e.message:`Workspace import failed`)}finally{p(!1)}};return(0,Q.jsxs)(`form`,{className:`space-y-3`,onSubmit:e=>void x(e),children:[(0,Q.jsx)(HT,{disabled:b}),(0,Q.jsxs)(`label`,{className:`grid gap-1 text-sm`,children:[`Import from`,(0,Q.jsxs)(`select`,{value:n,disabled:b,onChange:e=>r(e.target.value),className:`rounded-md border bg-background p-2`,children:[(0,Q.jsx)(`option`,{value:`upload`,children:`Upload an archive`}),(0,Q.jsx)(`option`,{value:`path`,children:`Path on this server`})]})]}),n===`upload`?(0,Q.jsxs)(`label`,{className:`grid gap-1 text-sm`,children:[`Workspace archive`,(0,Q.jsx)(J,{required:!0,type:`file`,accept:`.tar.gz,.tgz,.tar.bz2,.tbz2,.tbz`,disabled:b,onChange:e=>a(e.target.files?.[0]||null)})]}):(0,Q.jsxs)(`label`,{className:`grid gap-1 text-sm`,children:[`Server path`,(0,Q.jsx)(J,{required:!0,placeholder:`/tmp/workspace.tar.gz`,value:o,disabled:b,onChange:e=>s(e.target.value)}),(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`An archive or workspace folder on the server. Archives are extracted into your Workspaces directory.`})]}),(0,Q.jsx)(UT,{name:c,label:u,setName:l,setLabel:d,disabled:b}),(0,Q.jsxs)(X,{type:`submit`,disabled:b||!c.trim()||!u.trim()||(n===`upload`?!i:!o.trim()),children:[f?(0,Q.jsx)(P,{className:`mr-2 h-4 w-4 animate-spin`}):(0,Q.jsx)($e,{className:`mr-2 h-4 w-4`}),f?`Importing…`:`Import workspace`]}),f&&(0,Q.jsx)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:m}),g&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:g}),v&&(0,Q.jsxs)(`p`,{role:`status`,className:`text-sm`,children:[`Imported `,v.label||v.name,`.`]})]})}function GT(e){return[...e].sort((e,t)=>{let n=typeof e.order==`number`&&Number.isFinite(e.order)?e.order:2**53-1,r=typeof t.order==`number`&&Number.isFinite(t.order)?t.order:2**53-1;if(n!==r)return n-r;let i=e.createdAt??``,a=t.createdAt??``;return i===a?(e.name??``).localeCompare(t.name??``):i<a?-1:1})}function KT(e,t,n){let r=[...e],[i]=r.splice(t,1);return r.splice(n,0,i),r}async function qT(e,t){return{failed:(await Promise.allSettled(e.map((e,n)=>e.order===n?Promise.resolve():t(e,n)))).filter(e=>e.status===`rejected`).length}}function JT(e){let[t,n]=(0,Z.useState)(null),[r,i]=(0,Z.useState)(null);return{rowProps:e=>({"data-reorder-index":e}),handleProps:t=>({onPointerDown:r=>{if(r.pointerType===`mouse`&&r.button!==0)return;r.preventDefault(),r.stopPropagation();let a=r.currentTarget.closest(`[data-reorder-index]`);if(!a)return;let o=a.parentElement,s=(o?[...o.querySelectorAll(`:scope > [data-reorder-index]`)]:[a]).map(e=>({index:Number(e.dataset.reorderIndex),rect:e.getBoundingClientRect()})).filter(e=>Number.isFinite(e.index)).sort((e,t)=>e.index-t.index).map(e=>e.rect.top+e.rect.height/2),c=a.getBoundingClientRect(),l=a.cloneNode(!0);Object.assign(l.style,{position:`fixed`,left:`${c.left}px`,top:`${c.top}px`,width:`${c.width}px`,height:`${c.height}px`,margin:`0`,pointerEvents:`none`,zIndex:`100`,opacity:`0.92`,boxShadow:`0 12px 32px rgba(0,0,0,.28)`,willChange:`transform`}),document.body.appendChild(l);let u={x:r.clientX,y:r.clientY},d=t;n(t),i(t);let f={x:r.clientX,y:r.clientY},p=0,m=()=>{p=0,l.style.transform=`translate(${f.x-u.x}px, ${f.y-u.y}px) scale(1.02)`;let e=s.length;for(let t=0;t<s.length;t++)if(f.y<s[t]){e=t;break}e!==d&&(d=e,i(e))},h=e=>{f={x:e.clientX,y:e.clientY},p||=requestAnimationFrame(m)},g=()=>{window.removeEventListener(`pointermove`,h),window.removeEventListener(`pointerup`,g),window.removeEventListener(`pointercancel`,g),p&&cancelAnimationFrame(p),l.remove(),n(null),i(null),d!==t&&d!==t+1&&e(t,d>t?d-1:d)};window.addEventListener(`pointermove`,h),window.addEventListener(`pointerup`,g),window.addEventListener(`pointercancel`,g)},onClick:e=>{e.preventDefault(),e.stopPropagation()},style:{touchAction:`none`}}),insertIndex:r,draggingIndex:t,insertLineClass:(e,n)=>r===null||t===null?!1:r===e?`shadow-[0_-3px_0_0_var(--color-primary)]`:r===n&&e===n-1&&`shadow-[0_3px_0_0_var(--color-primary)]`}}function YT(){let[e,t]=(0,Z.useState)([]),[n,r]=(0,Z.useState)(!0),[i,a]=(0,Z.useState)(null),[o,s]=(0,Z.useState)(``),[c,l]=(0,Z.useState)(``),[u,d]=(0,Z.useState)(bm()),[p,m]=(0,Z.useState)(null),[h,g]=(0,Z.useState)(``),[_,v]=VT(),[y,b]=(0,Z.useState)(null),[x,S]=(0,Z.useState)(null),[C,w]=(0,Z.useState)(!1),E=Hw(),[D,O]=Qw(),k=LT(),[A,j]=(0,Z.useState)(!1),[M,N]=(0,Z.useState)(!1),[P,ee]=(0,Z.useState)(!1),[F,I]=(0,Z.useState)(!1),[L,R]=(0,Z.useState)(null),{showToast:te}=Hr(),z=hl(),ne=$g(),{openM2Drawer:B}=jT(),re=PT();Yw(re,`workspace`,{"workspace:status:changed":e=>t(t=>t.map(t=>t.id===e.workspaceId?{...t,status:e.status}:t)),"workspace:created":e=>t(t=>[...t,e.workspace]),"workspace:deleted":e=>t(t=>t.filter(t=>t.id!==e.workspaceId))}),(0,Z.useEffect)(()=>{let e=async()=>{try{r(!0);let e=await ji();t(GT(e)),a(null)}catch(e){console.error(`Workspace fetch error:`,e);let t=`Failed to fetch workspaces`;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 workspaces`}a(t),te({title:`Error`,description:t,variant:`destructive`})}finally{r(!1)}};e();let n=()=>{e()};return window.addEventListener(`workspaces:refresh`,n),()=>{window.removeEventListener(`workspaces:refresh`,n)}},[re,te]);let V=async e=>{if(e.preventDefault(),o.trim()){w(!0);try{let e=await da({name:o,description:c||void 0,color:u,icon:p,label:h||o,layout:_});if(t(t=>[...t,e]),window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),k.selected.size>0){try{await la(e.name);let{ok:t,failed:n}=await IT(e.name,Array.from(k.selected),k.tree);n&&te({title:`Folders`,description:`${t} folder(s) created, ${n} failed`,variant:`destructive`})}catch(e){console.error(`Default folder creation failed:`,e),te({title:`Folders`,description:`Workspace created, but default folders failed`,variant:`destructive`})}k.setSelected(new Set)}s(``),l(``),d(bm()),m(null),g(``),te({title:`Success`,description:`Workspace '${e.label||e.name}' created.`}),O(!1)}catch(e){console.error(`Workspace creation error:`,e);let t=`Failed to create workspace`;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 workspace`}te({title:`Error`,description:t,variant:`destructive`})}finally{w(!1)}}},ie=async e=>{if(e.preventDefault(),L)try{let e={label:L.label,description:L.description,color:L.color,icon:L.icon??null};await oa(L.name,e),t(t=>t.map(t=>t.id===L.id?{...t,...e}:t)),window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),te({title:`Success`,description:`Workspace '${L.label}' details updated.`}),R(null)}catch(e){let t=e instanceof Error?e.message:`Failed to update workspace`;te({title:`Error`,description:t,variant:`destructive`})}},ae=e=>{R(e)},oe=async e=>{try{await hi(e.name),t(t=>t.filter(t=>t.id!==e.id)),te({title:`Success`,description:`Workspace '${e.label||e.name}' has been destroyed.`})}catch(e){let t=e instanceof Error?e.message:`Failed to destroy workspace`;te({title:`Error`,description:t,variant:`destructive`})}},H=async e=>{try{let n=await la(e);t(e=>e.map(e=>e.id===n.id?{...e,...n}:e)),te({title:`Success`,description:`Workspace '${n.label||n.name}' started.`}),window.dispatchEvent(new CustomEvent(`workspaces:refresh`))}catch(e){console.error(`Workspace start error:`,e);let t=`Failed to start workspace`;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 workspace`}te({title:`Error`,description:t,variant:`destructive`})}},se=async e=>{try{let n=await Xa(e);t(e=>e.map(e=>e.id===n.id?{...e,...n}:e)),te({title:`Success`,description:`Workspace '${n.label||n.name}' stopped.`}),window.dispatchEvent(new CustomEvent(`workspaces:refresh`))}catch(e){console.error(`Workspace stop error:`,e);let t=`Failed to stop workspace`;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 workspace`}te({title:`Error`,description:t,variant:`destructive`})}},ce=e=>{z(aT(e))},{rowProps:U,handleProps:le,draggingIndex:ue,insertLineClass:de}=JT((n,r)=>{let i=KT(e,n,r);t(i),qT(i,(e,t)=>oa(Uw(e),{order:t})).then(({failed:e})=>{window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),e&&te({title:`Partial reorder`,description:`${e} workspace(s) could not be reordered`,variant:`destructive`})})});return(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{title:`Workspaces`,description:`Divide your Universe into self-contained workspaces`,actions:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(X,{variant:`outline`,onClick:()=>j(e=>!e),className:`max-sm:hidden`,children:`Open shared Workspace (local)…`}),(0,Q.jsx)(X,{variant:`outline`,onClick:()=>ee(e=>!e),children:`Import workspace`}),(0,Q.jsx)(X,{variant:`outline`,onClick:()=>N(e=>!e),className:`max-sm:hidden`,children:`Import remote…`}),(0,Q.jsx)(X,{variant:`outline`,onClick:()=>I(e=>!e),className:`max-sm:hidden`,children:`Open remote…`}),!E.local&&!D&&(0,Q.jsxs)(X,{onClick:()=>O(!0),className:`max-sm:h-9 max-sm:w-9 max-sm:p-0`,"aria-label":`Create workspace`,title:`Create workspace`,children:[(0,Q.jsx)(cn,{className:`h-4 w-4 sm:mr-2`}),(0,Q.jsx)(`span`,{className:`max-sm:hidden`,children:`Create Workspace`})]})]})}),!E.local&&D&&(0,Q.jsx)(Xw,{title:`Create New Workspace`,onClose:()=>O(!1),children:(0,Q.jsxs)(`form`,{onSubmit:V,className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsx)(J,{value:o,onChange:e=>s(e.target.value),placeholder:`Workspace Name (e.g., 'my-project')`,disabled:C}),(0,Q.jsx)(J,{value:h,onChange:e=>g(e.target.value),placeholder:`Workspace Label (display name, optional)`,disabled:C})]}),(0,Q.jsx)(J,{value:c,onChange:e=>l(e.target.value),placeholder:`Description (optional)`,disabled:C}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`label`,{htmlFor:`workspace-color`,className:`text-sm font-medium`,children:`Icon & Color`}),(0,Q.jsx)(`button`,{type:`button`,title:`Pick icon & color`,disabled:C,onClick:e=>b({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,Q.jsx)(f,{icon:p||`ph:stack-fill`,width:22,height:22,color:Cm(u)})}),(0,Q.jsx)(J,{id:`workspace-color`,type:`color`,value:u,onChange:e=>d(e.target.value),className:`h-10 w-16 p-1`,disabled:C}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>d(bm()),disabled:C,children:`Randomize`})]}),y&&(0,Q.jsx)(Jw,{x:y.x,y:y.y,current:{icon:p??void 0,color:u},onChange:e=>{`icon`in e&&m(e.icon??null),`color`in e&&e.color&&d(e.color)},onClose:()=>b(null)}),(0,Q.jsxs)(`div`,{className:`rounded-lg border p-3`,children:[(0,Q.jsx)(`p`,{className:`text-sm font-medium`,children:`Folder structure`}),(0,Q.jsx)(`p`,{className:`mb-3 mt-0.5 text-xs text-muted-foreground`,children:`How the workspace directory is laid out on disk. Fixed once created.`}),(0,Q.jsx)(BT,{value:_,onChange:v,disabled:C,idPrefix:`create-workspace-layout`})]}),(0,Q.jsxs)(`div`,{className:`rounded-lg border p-3`,children:[(0,Q.jsxs)(`p`,{className:`text-sm font-medium`,children:[`Default folders `,(0,Q.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`(optional)`})]}),(0,Q.jsx)(`p`,{className:`mb-3 mt-0.5 text-xs text-muted-foreground`,children:`Ticked folders are created right after the workspace, with matching icons and colors.`}),(0,Q.jsx)(RT,{selected:k.selected,onToggle:k.toggle,tree:k.tree,onTreeChange:k.setTree,disabled:C,idPrefix:`create-default-folders`})]}),(0,Q.jsxs)(X,{type:`submit`,disabled:C||!o.trim(),children:[(0,Q.jsx)(cn,{className:`mr-2 h-4 w-4`}),`Create Workspace`]})]})}),A&&(0,Q.jsx)(ZT,{}),F&&(0,Q.jsx)(QT,{onClose:()=>I(!1),onChanged:async()=>{try{t(GT(await ji()))}catch{}window.dispatchEvent(new CustomEvent(`workspaces:refresh`))}}),P&&(0,Q.jsx)(Xw,{title:`Import workspace`,onClose:()=>ee(!1),children:(0,Q.jsx)(WT,{onImported:()=>ee(!1)})}),M&&(0,Q.jsx)(XT,{onImported:e=>{t(t=>t.some(t=>t.id===e.id)?t:[...t,e]),window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),N(!1)},onClose:()=>N(!1)}),(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsx)(`h2`,{className:`text-xl font-semibold`,children:`Your Workspaces`}),n&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading workspaces...`}),i&&(0,Q.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Q.jsx)(`p`,{children:i})}),!n&&!i&&e.length===0&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No workspaces found`}),e.length>0&&(0,Q.jsx)(`div`,{className:`grid gap-4`,children:e.map((t,n)=>{let r={...t,createdAt:t.createdAt,updatedAt:t.updatedAt,color:t.color===null?void 0:t.color},i=Cm(t.color);return(0,Q.jsxs)(`div`,{...U(n),className:`flex items-stretch rounded-lg ${de(n,e.length)||``} ${ue===n?`opacity-60`:``}`,children:[(0,Q.jsx)(`button`,{type:`button`,...le(n),title:`Drag to reorder`,"aria-label":`Drag to reorder`,className:`hidden w-5 shrink-0 cursor-grab items-center justify-center rounded-l-lg active:cursor-grabbing md:flex ${i?``:`bg-muted`}`,style:i?{backgroundColor:i}:void 0,children:(0,Q.jsx)(T,{className:`h-4 w-4 ${wm(i)}`})}),(0,Q.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,Q.jsx)(Zw,{workspace:r,onStart:H,onStop:se,onEnter:ce,onEdit:ae,onSettings:e=>{ne?B(`workspaces`,`settings`,Uw(e)):z(`/workspaces/${Uw(e)}/settings/general`)},onDestroy:oe})})]},t.id)})})]}),L&&(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`h2`,{className:`text-xl font-semibold`,children:[`Edit Workspace: `,L.label]}),(0,Q.jsxs)(`form`,{onSubmit:ie,className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`edit-label`,className:`text-sm font-medium`,children:`Label`}),(0,Q.jsx)(J,{id:`edit-label`,value:L.label,onChange:e=>R(t=>t?{...t,label:e.target.value}:null),placeholder:`Workspace Label`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`edit-description`,className:`text-sm font-medium`,children:`Description`}),(0,Q.jsx)(J,{id:`edit-description`,value:L.description||``,onChange:e=>R(t=>t?{...t,description:e.target.value}:null),placeholder:`Description (optional)`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`edit-color`,className:`text-sm font-medium`,children:`Icon & Color`}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`button`,{type:`button`,title:`Pick icon & color`,onClick:e=>S({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,Q.jsx)(f,{icon:L.icon||`ph:stack-fill`,width:22,height:22,color:Cm(L.color)})}),(0,Q.jsx)(J,{id:`edit-workspace-color`,type:`color`,value:L.color||`#FFFFFF`,onChange:e=>R(t=>t?{...t,color:e.target.value}:null),className:`h-10 w-16 p-1`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>R(e=>e?{...e,color:bm()}:null),children:`Randomize Color`})]})]}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(X,{type:`submit`,disabled:!L.label?.trim(),children:`Save Changes`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,onClick:()=>R(null),children:`Cancel`})]})]}),x&&(0,Q.jsx)(Jw,{x:x.x,y:x.y,current:{icon:L.icon??void 0,color:L.color??void 0},onChange:e=>{R(t=>{if(!t)return null;let n={...t};return`icon`in e&&(n.icon=e.icon??null),`color`in e&&e.color&&(n.color=e.color),n})},onClose:()=>S(null)})]})]})}function XT({onImported:e,onClose:t}){let{showToast:n}=Hr(),[r,i]=(0,Z.useState)(``),[a,o]=(0,Z.useState)(``),[s,c]=(0,Z.useState)(``),[l,u]=(0,Z.useState)(``),[d,f]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)(``);return(0,Q.jsx)(Xw,{title:`Import (pull) a remote Workspace`,onClose:t,children:(0,Q.jsxs)(`form`,{onSubmit:async t=>{t.preventDefault();let i;try{i=new URL(r.trim()).origin}catch{n({title:`Error`,description:`Invalid server URL`,variant:`destructive`});return}if(!a.trim().startsWith(`canvas-`)){n({title:`Error`,description:`Invalid access token (expected canvas-...)`,variant:`destructive`});return}f(!0),m(`Starting…`);try{let t=await eo(i,a.trim(),e=>{m(Ka[e.phase]||e.phase)},{name:s.trim(),label:l.trim()});n({title:`Success`,description:`Workspace '${t.label||t.name}' imported from ${i}.`}),e(t)}catch(e){let t=e,r=t?.message||t?.payload?.message||`Failed to import remote workspace`;n({title:`Error`,description:r,variant:`destructive`})}finally{f(!1),m(``)}},className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-2 md:grid-cols-3`,children:[(0,Q.jsx)(J,{placeholder:`Server URL (e.g., https://my.canvas-server.tld)`,value:r,onChange:e=>i(e.target.value),disabled:d}),(0,Q.jsx)(J,{placeholder:`Workspace share token (canvas-...)`,value:a,onChange:e=>o(e.target.value),disabled:d}),(0,Q.jsx)(X,{type:`submit`,disabled:d||!r.trim()||!a.trim()||!s.trim()||!l.trim(),children:d?`Importing…`:`Import Workspace`})]}),(0,Q.jsx)(UT,{name:s,label:l,setName:c,setLabel:u,disabled:d}),d&&p&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:p}),(0,Q.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Pulls a full `,(0,Q.jsx)(`strong`,{children:`copy`}),` of the workspace from the remote canvas-server into this one, where it then lives independently. The remote workspace is stopped while it is packed, and large workspaces can take several minutes — progress is shown above.`]})]})})}function ZT(){let{showToast:e}=Hr(),[t,n]=(0,Z.useState)(``),[r,i]=(0,Z.useState)(``),[a,o]=(0,Z.useState)(!1),s=e=>{try{return new URL(e)}catch{return null}};return(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsx)(`h2`,{className:`text-xl font-semibold`,children:`Open shared Workspace (local)`}),(0,Q.jsxs)(`div`,{className:`grid gap-2 md:grid-cols-3`,children:[(0,Q.jsx)(J,{placeholder:`Shared URL (e.g., https://host/rest/v2/pub/workspaces/ID)`,value:t,onChange:e=>n(e.target.value)}),(0,Q.jsx)(J,{placeholder:`Access token (canvas-...)`,value:r,onChange:e=>i(e.target.value)}),(0,Q.jsx)(X,{onClick:async()=>{if(!s(t.trim())){e({title:`Error`,description:`Invalid URL`,variant:`destructive`});return}if(!r.trim().startsWith(`canvas-`)){e({title:`Error`,description:`Invalid access token`,variant:`destructive`});return}o(!0);try{sessionStorage.setItem(`sharedToken:last`,r.trim());let e=new URLSearchParams({url:t.trim()}).toString();window.location.href=`/shared?${e}`}catch(t){e({title:`Error`,description:t instanceof Error?t.message:`Failed to open shared resource`,variant:`destructive`})}finally{o(!1)}},disabled:a||!t.trim()||!r.trim(),children:`Open`})]}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`We use your provided URL and token to fetch via the remote's public API.`})]})}function QT({onClose:e,onChanged:t}){let{showToast:n}=Hr(),r=hl(),[i,a]=(0,Z.useState)(``),[o,s]=(0,Z.useState)(``),[c,l]=(0,Z.useState)(!1),[u,d]=(0,Z.useState)([]),f=(0,Z.useCallback)(async()=>{try{d(await pa())}catch{d([])}},[]);(0,Z.useEffect)(()=>{f()},[f]);let p=async e=>{e.preventDefault();let r;try{r=new URL(i.trim()).origin}catch{n({title:`Error`,description:`Invalid server URL`,variant:`destructive`});return}l(!0);try{let e=await Ya(r,o.trim());n({title:`Remote workspace added`,description:`'${e.label}' is available as ${e.address}.`}),a(``),s(``),await f(),t?.()}catch(e){let t=e;n({title:`Error`,description:t?.message||t?.payload?.message||`Failed to add remote workspace`,variant:`destructive`})}finally{l(!1)}},m=async e=>{try{await $i(e.id),await f(),t?.()}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to remove remote workspace`,variant:`destructive`})}};return(0,Q.jsxs)(Xw,{title:`Open a remote Workspace`,onClose:e,children:[(0,Q.jsxs)(`form`,{onSubmit:p,className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-2 md:grid-cols-3`,children:[(0,Q.jsx)(J,{placeholder:`Server URL (e.g., https://my.canvas-server.tld)`,value:i,onChange:e=>a(e.target.value),disabled:c}),(0,Q.jsx)(J,{placeholder:`Workspace share token (canvas-...)`,value:o,onChange:e=>s(e.target.value),disabled:c}),(0,Q.jsx)(X,{type:`submit`,disabled:c||!i.trim()||!o.trim(),children:c?`Checking…`:`Add Remote`})]}),(0,Q.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Keeps the workspace on its own server and registers it here as`,` `,(0,Q.jsx)(`code`,{className:`font-mono text-xs`,children:`name@host`}),` — nothing is copied. Every call you make to it is forwarded to the remote with the share token (its permissions apply); document content and thumbnails are cached locally so they stay readable when the remote is offline. Use “Import remote…” if you want an independent local copy instead.`]})]}),u.length>0&&(0,Q.jsx)(`ul`,{className:`mt-4 space-y-2 border-t pt-3`,children:u.map(e=>(0,Q.jsxs)(`li`,{className:`flex flex-col gap-2 rounded-md border p-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsxs)(`div`,{className:`truncate text-sm font-medium`,children:[e.label,(0,Q.jsx)(`span`,{className:`ml-2 rounded bg-muted px-1.5 py-0.5 text-[10px] uppercase tracking-wide text-muted-foreground`,children:`remote`})]}),(0,Q.jsxs)(`div`,{className:`mt-0.5 truncate font-mono text-[11px] text-muted-foreground`,children:[e.address,` · `,e.remote.url]})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>r(`/workspaces/${e.address}`),children:`Open`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>m(e),className:`text-destructive hover:text-destructive`,children:`Remove`})]})]},e.id))})]})}var $T={membership:`keep`,propagation:`never`,targets:[],acceptPropagatedDeletions:!1},eE=e=>`/workspaces/${encodeURIComponent(e)}/trash/operations`,tE=(e,t)=>Y.get(`${eE(e)}?${new URLSearchParams(Object.entries(t).map(([e,t])=>[e,String(t)]))}`),nE=(e,t,n,r={})=>Y.post(`${eE(e)}/${n}`,{ids:t,...r}),rE=(e,t,n,r)=>Y.patch(`/workspaces/${encodeURIComponent(e)}/backends/imap/${encodeURIComponent(t)}/containers/${encodeURIComponent(n)}`,{removalPolicy:r});function iE(e){let t=ub(`backends`,e.path)?.backend;return(0,Q.jsx)(aE,{...e},JSON.stringify([e.workspace,t]))}function aE({workspace:e,path:t,onNavigate:n}){let r=ub(`backends`,t),i=r.backend,a=r.prefix,[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)(null),u=(0,Z.useRef)(!1),[d,f]=(0,Z.useState)(null),[p,m]=(0,Z.useState)(null),[h,g]=(0,Z.useState)(0),[_,v]=(0,Z.useState)(new Set),[y,b]=(0,Z.useState)(null),x=(0,Z.useCallback)(()=>g(e=>e+1),[]),[S,C]=(0,Z.useState)(t);S!==t&&(C(t),v(new Set),b(null),m(null),f(null));let w=o?.revision!==h,T=w?[]:o.items,E=w?[]:o.backends,D=o?.days;(0,Z.useEffect)(()=>{let t=!1;return(i?mb(e,i).then(e=>({...e,backends:[]})):Eo(e).then(e=>({items:[],days:null,backends:e.filter(e=>e.driver===`file`&&e.enabled!==!1)}))).then(e=>{t||s({...e,revision:h,error:null})}).catch(e=>{t||s({revision:h,items:[],backends:[],days:null,error:e instanceof Error?e.message:String(e)})}),()=>{t=!0}},[e,i,h]),(0,Z.useEffect)(()=>{let t=null,n=n=>{let r=n.detail;r?.workspaceName&&r.workspaceName!==e||r?.treeName&&r.treeName!==`backends`||(t||=setTimeout(()=>{t=null,x()},500))};return window.addEventListener(`workspace:trash:refresh`,n),window.addEventListener(`workspace:tree:refresh`,n),()=>{window.removeEventListener(`workspace:trash:refresh`,n),window.removeEventListener(`workspace:tree:refresh`,n),t&&clearTimeout(t)}},[e,x]);let O=fb(T,a),k=async(t,n)=>{if(!(!i||u.current||w||!n.length)&&!(t===`discard`&&!yb(i,n))){u.current=!0,l(t),f(null),m(null),b(null);try{let r=await(t===`restore`?hb:gb)(e,i,[...n].sort((e,t)=>t.deletedAt-e.deletedAt).map(e=>e.id)),a=r.filter(e=>!e.ok);m(`${r.length-a.length} item(s) ${t===`restore`?`restored to their original paths`:`permanently deleted`}.`),a.length&&f(`${a.length} item(s) remain in Trash. ${a.slice(0,3).map(e=>`${e.key||`Item`}: ${e.reason===`precondition-failed`||e.reason===`target-exists`?`original path is occupied`:e.message||e.reason}`).join(`; `)}`),v(new Set)}catch(e){f(e instanceof Error?e.message:String(e))}finally{u.current=!1,l(null),x()}}},A=(e,t,n)=>b({x:e,y:t,row:n});return(0,Q.jsxs)(`section`,{className:`flex h-full min-h-0 flex-col bg-background`,"aria-label":`Backend Trash`,children:[(0,Q.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2 border-b px-4 py-3`,children:[(0,Q.jsx)(rt,{className:`h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(Im,{items:Lm(t,e).map((e,t)=>t===2&&i?{...e,label:i}:e),onNavigate:n,className:`basis-48`}),(0,Q.jsxs)(`div`,{className:`ml-auto flex max-w-full flex-wrap items-center gap-2`,children:[_.size>0&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`button`,{className:`flex items-center gap-1 rounded border px-2 py-1 text-sm disabled:opacity-50`,disabled:!!c||w,onClick:()=>void k(`restore`,O.filter(e=>_.has(e.id)).flatMap(e=>e.items)),children:[(0,Q.jsx)(ar,{className:`h-3.5 w-3.5`}),`Restore selected`]}),(0,Q.jsxs)(`button`,{className:`flex items-center gap-1 rounded border px-2 py-1 text-sm text-destructive disabled:opacity-50`,disabled:!!c||w,onClick:()=>void k(`discard`,O.filter(e=>_.has(e.id)).flatMap(e=>e.items)),children:[(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`}),`Delete selected`]})]}),i&&O.length>0&&(0,Q.jsxs)(`button`,{className:`flex items-center gap-1 rounded border px-2 py-1 text-sm text-destructive disabled:opacity-50`,disabled:!!c||w,onClick:()=>void k(`discard`,O.flatMap(e=>e.items)),children:[(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`}),a?`Empty this folder`:`Empty Trash`]}),(0,Q.jsx)(`button`,{title:`Refresh Trash`,"aria-label":`Refresh Trash`,className:`rounded p-2 hover:bg-accent`,disabled:!!c||w,onClick:x,children:(0,Q.jsx)(P,{className:`h-4 w-4 ${w?`animate-spin`:``}`})})]})]}),(0,Q.jsxs)(`div`,{className:`border-b px-4 py-2 text-xs text-muted-foreground`,children:[`Restore files and folders to their original paths. Existing files are kept.`,D?` Deleted items are kept for ${D} days.`:``]}),p&&(0,Q.jsx)(`p`,{role:`status`,className:`px-4 py-2 text-sm`,children:p}),(d||o?.error)&&(0,Q.jsx)(`p`,{role:`alert`,className:`px-4 py-2 text-sm text-destructive`,children:d||o?.error}),c&&(0,Q.jsx)(`p`,{role:`status`,className:`px-4 py-2 text-sm`,children:c===`restore`?`Restoring…`:`Deleting permanently…`}),(0,Q.jsx)(`div`,{className:`min-h-0 flex-1 overflow-auto p-3`,children:w?(0,Q.jsx)(`p`,{className:`p-4 text-sm text-muted-foreground`,children:`Loading Trash…`}):i?O.length===0?(0,Q.jsx)(`p`,{className:`p-4 text-sm text-muted-foreground`,children:`This Trash folder is empty.`}):(0,Q.jsxs)(`table`,{className:`w-full text-left text-sm`,children:[(0,Q.jsx)(`thead`,{className:`border-b text-xs text-muted-foreground`,children:(0,Q.jsxs)(`tr`,{children:[(0,Q.jsx)(`th`,{className:`w-8 p-2`,children:(0,Q.jsx)(`input`,{type:`checkbox`,"aria-label":`Select all visible items`,checked:O.length>0&&O.every(e=>_.has(e.id)),onChange:e=>v(e.target.checked?new Set(O.map(e=>e.id)):new Set)})}),(0,Q.jsx)(`th`,{className:`p-2`,children:`Name`}),(0,Q.jsx)(`th`,{className:`p-2 max-sm:hidden`,children:`Original path`}),(0,Q.jsx)(`th`,{className:`p-2 max-md:hidden`,children:`Deleted`}),(0,Q.jsx)(`th`,{className:`p-2`,children:(0,Q.jsx)(`span`,{className:`sr-only`,children:`Actions`})})]})}),(0,Q.jsx)(`tbody`,{children:O.map(e=>(0,Q.jsxs)(`tr`,{className:`border-b border-border/50 hover:bg-accent/50`,onContextMenu:t=>{t.preventDefault(),A(t.clientX,t.clientY,e)},onDoubleClick:()=>e.navigable&&n(db(i,e.key)),children:[(0,Q.jsx)(`td`,{className:`p-2`,children:(0,Q.jsx)(`input`,{type:`checkbox`,"aria-label":`Select ${e.name}`,checked:_.has(e.id),disabled:!!c,onChange:t=>v(n=>{let r=new Set(n);return t.target.checked?r.add(e.id):r.delete(e.id),r})})}),(0,Q.jsx)(`td`,{className:`p-2`,children:(0,Q.jsxs)(`button`,{className:`flex items-center gap-2 text-left`,onClick:()=>e.navigable&&n(db(i,e.key)),children:[e.directory?(0,Q.jsx)(et,{className:`h-4 w-4 shrink-0`}):(0,Q.jsx)(zn,{className:`h-4 w-4 shrink-0`}),(0,Q.jsxs)(`span`,{children:[e.name,e.navigable&&(0,Q.jsxs)(`span`,{className:`ml-2 text-xs text-muted-foreground`,children:[e.items.length,` items`]})]})]})}),(0,Q.jsx)(`td`,{className:`p-2 text-xs text-muted-foreground max-sm:hidden`,children:e.key}),(0,Q.jsx)(`td`,{className:`p-2 text-xs text-muted-foreground max-md:hidden`,children:new Date(e.items.reduce((e,t)=>Math.max(e,t.deletedAt),0)).toLocaleString()}),(0,Q.jsx)(`td`,{className:`p-2 text-right`,children:(0,Q.jsx)(`button`,{title:`Actions for ${e.name}`,"aria-label":`Actions for ${e.name}`,disabled:!!c,className:`rounded p-2 hover:bg-accent`,onClick:t=>A(t.clientX,t.clientY,e),children:(0,Q.jsx)(yn,{className:`h-4 w-4`})})})]},e.id))})]}):(0,Q.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-2 lg:grid-cols-3`,children:[E.map(e=>(0,Q.jsxs)(`button`,{onClick:()=>n(db(e.address)),className:`flex items-center gap-3 rounded-lg border p-4 text-left hover:bg-accent`,children:[(0,Q.jsx)(rt,{className:`h-6 w-6 text-muted-foreground`}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`span`,{className:`block text-sm font-medium`,children:e.label||e.address}),(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.address})]})]},e.address)),!E.length&&(0,Q.jsx)(`p`,{className:`p-4 text-sm text-muted-foreground`,children:`No file backends are available.`})]})}),y&&(0,Q.jsxs)(Wp,{x:y.x,y:y.y,onClose:()=>b(null),className:`min-w-44 rounded-md border bg-popover p-1 shadow-elevation-3`,children:[y.row.navigable&&(0,Q.jsxs)(`button`,{className:`flex w-full items-center gap-2 rounded px-3 py-2 text-sm hover:bg-accent`,onClick:()=>{n(db(i,y.row.key)),b(null)},children:[(0,Q.jsx)(et,{className:`h-4 w-4`}),`Open folder`]}),(0,Q.jsxs)(`button`,{disabled:!!c,className:`flex w-full items-center gap-2 rounded px-3 py-2 text-sm hover:bg-accent disabled:opacity-50`,onClick:()=>void k(`restore`,y.row.items),children:[(0,Q.jsx)(ar,{className:`h-4 w-4`}),`Restore `,y.row.directory?`folder`:`file`]}),(0,Q.jsxs)(`button`,{disabled:!!c||w,className:`flex w-full items-center gap-2 rounded px-3 py-2 text-sm text-destructive hover:bg-destructive/10 disabled:opacity-50`,onClick:()=>void k(`discard`,y.row.items),children:[(0,Q.jsx)(rt,{className:`h-4 w-4`}),`Delete permanently`]})]})]})}function oE({value:e,backends:t,source:n,onSave:r,destination:i=!0}){let[a,o]=(0,Z.useState)({...$T,...e}),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)(``),d=`rounded border bg-background px-2 py-1.5 text-xs w-full`,f=async()=>{c(!0),u(``);try{await r(a),u(`Removal policy saved.`)}catch(e){u(e instanceof Error?e.message:`Could not save policy`)}finally{c(!1)}};return(0,Q.jsxs)(`details`,{className:`border-t pt-3 text-xs`,children:[(0,Q.jsx)(`summary`,{className:`cursor-pointer font-medium`,children:`Source removals and Trash`}),(0,Q.jsxs)(`div`,{className:`mt-3 space-y-3`,children:[(0,Q.jsx)(`p`,{className:`text-muted-foreground`,children:`A completed scan removes missing locations from the backend tree. Items with no remaining locations go to Trash until you purge them.`}),(0,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsxs)(`label`,{className:`space-y-1 block`,children:[`When an item disappears from this source`,(0,Q.jsxs)(`select`,{className:d,value:a.membership,disabled:s,onChange:e=>o({...a,membership:e.target.value}),children:[(0,Q.jsx)(`option`,{value:`keep`,children:`Keep in managed trees`}),(0,Q.jsx)(`option`,{value:`review`,children:`Review removal in Trash`}),(0,Q.jsx)(`option`,{value:`trash`,children:`Move to Trash automatically`})]})]}),(0,Q.jsxs)(`label`,{className:`space-y-1 block`,children:[`Remove tracked copies from other backends`,(0,Q.jsxs)(`select`,{className:d,value:a.propagation,disabled:s,onChange:e=>o({...a,propagation:e.target.value}),children:[(0,Q.jsx)(`option`,{value:`never`,children:`Never`}),(0,Q.jsx)(`option`,{value:`review`,children:`Review in Trash`}),(0,Q.jsx)(`option`,{value:`automatic`,children:`Automatically, retaining recovery copies`})]})]})]}),a.propagation!==`never`&&(0,Q.jsxs)(`fieldset`,{className:`space-y-2`,children:[(0,Q.jsx)(`legend`,{className:`mb-1 font-medium`,children:`Destinations`}),(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:a.targets===`all`,disabled:s,onChange:e=>o({...a,targets:e.target.checked?`all`:[]})}),`All eligible backends`]}),a.targets!==`all`&&t.filter(e=>e.address!==n&&e.kind===`storage`).map(e=>(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,disabled:s||e.config?.propagatedRemovalSupported!==!0,checked:a.targets.includes(e.address),onChange:t=>o({...a,targets:t.target.checked?[...a.targets,e.address]:a.targets.filter(t=>t!==e.address)})}),String(e.config?.label||e.address),e.config?.propagatedRemovalSupported===!0?!e.config?.removalPolicy?.acceptPropagatedDeletions&&` · protected`:` · recovery removal unavailable`]},e.address)),(0,Q.jsx)(`p`,{className:`text-muted-foreground`,children:`Only tracked, Canvas-owned copies are eligible. Protected destinations refuse propagated deletion. Recovery removal currently supports filesystem and workspace blob storage; remote destinations remain protected.`})]}),i&&(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,disabled:s,checked:a.acceptPropagatedDeletions,onChange:e=>o({...a,acceptPropagatedDeletions:e.target.checked})}),`Accept propagated deletions on this backend`]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Q.jsx)(X,{size:`sm`,variant:`outline`,disabled:s,onClick:()=>void f(),children:s?`Saving…`:`Save removal policy`}),(0,Q.jsx)(`span`,{role:`status`,children:l})]})]})]})}function sE({workspaceName:e,canWrite:t}){let{showToast:n}=Hr(),[r,i]=(0,Z.useState)([]),[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)([]),[l,u]=(0,Z.useState)(!1),d=(0,Z.useCallback)(async()=>{o(!0);try{i(await Co(e))}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to load the trash`,variant:`destructive`})}finally{o(!1)}},[e]);(0,Z.useEffect)(()=>{d()},[d]);let f=(0,Z.useCallback)(e=>s.includes(e),[s]),p=async(e,t)=>{c(t=>[...t,...e]);try{await t()}finally{c(t=>t.filter(t=>!e.includes(t)))}},m=t=>p([t.id],async()=>{try{let r=await Ri(e,[t.id]);r.failed?.length?n({title:`Not restored`,description:r.failed[0]?.error||`No restore target recorded`,variant:`destructive`}):(n({title:`Restored`,description:`Document put back where it was.`}),i(e=>e.filter(e=>e.id!==t.id)))}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to restore`,variant:`destructive`})}}),h=t=>p([t.id],async()=>{try{let r=await yi(e,[t.id]);if(r.failed?.length)throw Error(`The item could not be purged. Refresh and retry.`);n({title:`Cleared from Trash`,description:r.preserved?.length?`Existing backend copies remain indexed.`:`Document permanently deleted.`}),i(e=>e.filter(e=>e.id!==t.id))}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to delete`,variant:`destructive`})}}),g=async()=>{if(!l){u(!0);return}u(!1);try{let t=await yi(e);n({title:`Trash emptied`,description:`${t.destroyed?.length??0} document(s) purged. ${t.preserved?.length??0} item(s) cleared with backend copies preserved.`}),await d()}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to empty the trash`,variant:`destructive`})}},_=(0,Z.useMemo)(()=>r.map(e=>{let t=Ni(e),n=(e.trashed?.placements??[]).flatMap(e=>e.paths.map(t=>`${e.tree}:${t}`));return{document:e,title:t.title,origin:n,trashedAt:e.trashed?.trashedAt||null}}),[r]);return(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-medium`,children:`Managed-tree items`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1 max-w-2xl`,children:`Restore managed-tree placements or permanently purge these items. Pending removals require separate approval. Backend copies are managed below.`})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 max-sm:flex-wrap`,children:[(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:()=>d(),disabled:a,children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5 ${a?`animate-spin`:``}`}),`Refresh`]}),(0,Q.jsxs)(X,{variant:l?`destructive`:`outline`,size:`sm`,onClick:g,onBlur:()=>u(!1),disabled:!t||r.length===0,children:[(0,Q.jsx)(rt,{className:`mr-2 h-3.5 w-3.5`}),l?`Click again to delete everything`:`Empty trash`]})]})]}),a&&r.length===0&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading…`}),!a&&r.length===0&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`The trash is empty.`}),_.length>0&&(0,Q.jsx)(`div`,{className:`border rounded-md divide-y`,children:_.map(({document:e,title:n,origin:r,trashedAt:i})=>(0,Q.jsxs)(`div`,{className:`flex items-center gap-3 px-3 py-2`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`div`,{className:`truncate text-sm`,children:n}),(0,Q.jsxs)(`div`,{className:`truncate text-xs text-muted-foreground`,children:[r.length>0?`from ${r.join(`, `)}`:`no recorded origin`,i?` · ${new Date(i).toLocaleString()}`:``]})]}),(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:()=>m(e),disabled:!t||f(e.id)||r.length===0,title:r.length===0?`Nothing recorded to restore to`:`Put it back where it was`,children:[(0,Q.jsx)(ar,{className:`mr-2 h-3.5 w-3.5`}),`Restore placements`]}),(0,Q.jsx)(X,{variant:`ghost`,size:`sm`,onClick:()=>h(e),disabled:!t||f(e.id),title:`Delete permanently`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]},e.id))})]})}function cE({workspaceName:e}){return(0,Q.jsx)(lE,{workspaceName:e},e)}function lE({workspaceName:e}){let[t,n]=(0,Z.useState)(`pending`),[r,i]=(0,Z.useState)(``),[a,o]=(0,Z.useState)(``),[s,c]=(0,Z.useState)(0),[l,u]=(0,Z.useState)(0),[d,f]=(0,Z.useState)(null),[p,m]=(0,Z.useState)(``),[h,g]=(0,Z.useState)(!1),[_,v]=(0,Z.useState)(new Set),[y,b]=(0,Z.useState)({}),[x,S]=(0,Z.useState)(`/Trash`),[C,w]=(0,Z.useState)([]),[T,E]=(0,Z.useState)({write:!1,admin:!1});(0,Z.useEffect)(()=>{let t=!0;return Jr(e).then(e=>{let n=e.remote?.permissions||e.access?.permissions||(typeof e.sharedVia==`object`?e.sharedVia?.permissions:[])||[],r=Ep(e);t&&E({admin:r,write:r||n.includes(`write`)})}).catch(()=>{}),()=>{t=!1}},[e]);let[D,O]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{let t=!0;return Eo(e).then(e=>{t&&w(e)}).catch(()=>{}),()=>{t=!1}},[e]),(0,Z.useEffect)(()=>{let n=!1,i=()=>tE(e,{view:t,search:r,...a?{backend:a}:{},offset:s}).then(e=>{n||(f(e),m(``))}).catch(e=>{n||m(e instanceof Error?e.message:`Could not load Trash`)});i();let o=setInterval(()=>{h||i()},5e3);return()=>{n=!0,clearInterval(o)}},[e,t,r,a,s,l,h]);let k=d?.operations||[],A=()=>{v(new Set),u(e=>e+1)},j=()=>{Aa(e),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:e}})),window.dispatchEvent(new CustomEvent(`workspace:trash:refresh`,{detail:{workspaceName:e}}))},M=async(t,n=[..._])=>{if(!(!n.length||h)&&!(t===`purge`&&!window.confirm(`Permanently delete retained recovery copies for ${n.length} operation(s)?`))){g(!0),m(``);try{let r=(t===`approve`?(await Promise.all(n.map(n=>nE(e,[n],t,y[n])))).flatMap(e=>e.results):(await nE(e,n,t)).results).filter(e=>!e.ok||e.operation?.state===`failed`);r.length&&m(r.map(e=>e.error||e.operation?.error||`A destination could not be changed. Expand the item for details.`).join(` `)),j(),A()}catch(e){m(e instanceof Error?e.message:`Trash action failed`)}finally{g(!1)}}},N=e=>{n(e),c(0),f(null),v(new Set),b({})};return(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-base font-semibold`,children:`Workspace Trash`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:`Review source removals, recover items, and see what automatic policies changed.`})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,role:`tablist`,"aria-label":`Trash views`,children:[[[`pending`,`Pending removal`],[`trashed`,`In Trash`],[`activity`,`Activity`]].map(([e,n])=>(0,Q.jsx)(X,{role:`tab`,"aria-selected":t===e,size:`sm`,variant:t===e?`default`:`outline`,onClick:()=>N(e),children:n},e)),(0,Q.jsxs)(X,{size:`sm`,variant:`ghost`,className:`ml-auto`,onClick:A,disabled:h,children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})]}),t===`trashed`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(sE,{workspaceName:e,canWrite:T.write},l),(0,Q.jsxs)(`details`,{className:`rounded border p-3`,children:[(0,Q.jsx)(`summary`,{className:`cursor-pointer text-sm font-medium`,children:`Browse backend recovery copies`}),(0,Q.jsx)(`div`,{className:`mt-3 min-h-48`,children:(0,Q.jsx)(iE,{workspace:e,path:x,onNavigate:S})})]})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Q.jsx)(J,{"aria-label":`Filter Trash items`,placeholder:`Filter by item or path…`,className:`max-w-xs`,value:r,onChange:e=>{i(e.target.value),f(null),c(0),v(new Set)}}),(0,Q.jsx)(J,{"aria-label":`Filter by backend`,placeholder:`Backend name…`,className:`max-w-56`,value:a,onChange:e=>{o(e.target.value),f(null),c(0),v(new Set)}}),_.size>0&&(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,Q.jsxs)(`span`,{children:[_.size,` selected`]}),t===`pending`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(X,{size:`sm`,disabled:h,onClick:()=>void M(`approve`),children:`Approve selected`}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,disabled:h,onClick:()=>void M(`keep`),children:`Keep selected`}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,disabled:h,onClick:()=>void M(`retry`),children:`Retry`})]}),t===`trashed`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(X,{size:`sm`,variant:`outline`,disabled:h,onClick:()=>void M(`restore`),children:`Restore copies`}),(0,Q.jsx)(X,{size:`sm`,variant:`destructive`,disabled:h,onClick:()=>void M(`purge`),children:`Purge copies`})]})]})]}),D&&(0,Q.jsxs)(`div`,{className:`rounded border p-3 space-y-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsxs)(`p`,{className:`text-sm font-medium`,children:[`Removal policy · `,D.source.account||D.source.backend,D.source.folder?` / ${D.source.folder}`:``]}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,onClick:()=>O(null),children:`Close`})]}),(0,Q.jsx)(oE,{source:D.source.backend,backends:C,destination:!1,value:{...$T,...C.find(e=>e.address===D.source.backend)?.config?.removalPolicy,membership:y[D.id]?.membership??D.membership!==`keep`?`review`:`keep`,propagation:D.targets.length?`review`:`never`,targets:[...new Set(D.targets.filter(e=>!y[D.id]||y[D.id].targets.includes(JSON.stringify([e.backend,e.key]))).map(e=>e.backend))]},onSave:async t=>{D.source.driver===`imap`?await rE(e,D.source.account,D.source.folder,t):await Ea(e,D.source.driver,D.source.backend,{removalPolicy:t}),w(await Eo(e))}},D.id)]}),p&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:p}),(0,Q.jsxs)(`div`,{className:`overflow-x-auto rounded border`,children:[(0,Q.jsxs)(`table`,{className:`w-full text-left text-xs`,children:[(0,Q.jsx)(`thead`,{className:`bg-muted`,children:(0,Q.jsxs)(`tr`,{children:[(0,Q.jsx)(`th`,{className:`p-3 w-8`,children:(0,Q.jsx)(`input`,{type:`checkbox`,"aria-label":`Select visible operations`,disabled:!T.write||h||!k.length||t===`activity`,checked:k.length>0&&k.every(e=>_.has(e.id)),onChange:e=>v(e.target.checked?new Set(k.map(e=>e.id)):new Set)})}),(0,Q.jsx)(`th`,{className:`p-3`,children:`Item and affected copies`}),(0,Q.jsx)(`th`,{className:`p-3`,children:`Source`}),(0,Q.jsx)(`th`,{className:`p-3`,children:`Status`}),(0,Q.jsx)(`th`,{className:`p-3`,children:`Detected`})]})}),(0,Q.jsx)(`tbody`,{children:k.map(e=>{let n=y[e.id]||{targets:e.targets.filter(e=>e.state!==`kept`).map(e=>JSON.stringify([e.backend,e.key])),membership:e.membership!==`keep`};return(0,Q.jsxs)(`tr`,{className:`border-t align-top`,children:[(0,Q.jsx)(`td`,{className:`p-3`,children:(0,Q.jsx)(`input`,{type:`checkbox`,"aria-label":`Select ${e.title}`,disabled:!T.write||h||t===`activity`,checked:_.has(e.id),onChange:t=>v(n=>{let r=new Set(n);return t.target.checked?r.add(e.id):r.delete(e.id),r})})}),(0,Q.jsx)(`td`,{className:`p-3 min-w-64`,children:(0,Q.jsxs)(`details`,{children:[(0,Q.jsx)(`summary`,{className:`cursor-pointer font-medium`,children:e.title}),(0,Q.jsxs)(`div`,{className:`mt-2 space-y-2 text-muted-foreground`,children:[(0,Q.jsx)(`p`,{children:e.orphan?`No remaining byte locations. Restore placements only unless recovery bytes are available.`:`${e.remainingLocations.length} remaining location(s) when detected.`}),e.placements.map(e=>(0,Q.jsxs)(`p`,{children:[e.tree,`: `,e.paths.join(`, `)]},e.tree)),e.membership!==`keep`&&(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:n.membership,disabled:h||t!==`pending`||e.membershipApplied,onChange:t=>b({...y,[e.id]:{...n,membership:t.target.checked}})}),e.membershipApplied?`Managed placements moved to Trash`:`Move managed placements to Trash`]}),e.targets.map(r=>{let i=JSON.stringify([r.backend,r.key]);return(0,Q.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,disabled:h||t!==`pending`||!!r.trashId,checked:n.targets.includes(i),onChange:t=>b({...y,[e.id]:{...n,targets:t.target.checked?[...n.targets,i]:n.targets.filter(e=>e!==i)}})}),(0,Q.jsxs)(`span`,{className:`break-all`,children:[r.backend,`:`,r.key,` · `,r.state,r.error&&(0,Q.jsx)(`span`,{className:`block text-destructive`,children:r.error})]})]},i)}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,disabled:!T.admin,onClick:()=>O(e),children:`Use these choices as a source policy`}),e.remainingLocations.map(e=>(0,Q.jsx)(`p`,{className:`break-all`,children:e.url},e.url))]})]})}),(0,Q.jsxs)(`td`,{className:`p-3 break-all`,children:[e.source.account||e.source.backend,e.source.folder&&(0,Q.jsx)(`span`,{className:`block text-muted-foreground`,children:e.source.folder})]}),(0,Q.jsxs)(`td`,{className:`p-3`,children:[e.state,e.error&&(0,Q.jsx)(`p`,{className:`mt-1 max-w-xs text-destructive`,children:e.error})]}),(0,Q.jsx)(`td`,{className:`p-3 whitespace-nowrap text-muted-foreground`,children:new Date(e.createdAt).toLocaleString()})]},e.id)})})]}),!k.length&&(0,Q.jsx)(`p`,{className:`p-5 text-center text-sm text-muted-foreground`,children:d?`No matching operations.`:`Loading…`})]}),(0,Q.jsxs)(`div`,{className:`flex items-center justify-between text-xs text-muted-foreground`,children:[(0,Q.jsxs)(`span`,{children:[d?.total??0,` operation(s)`]}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(X,{size:`sm`,variant:`outline`,disabled:!s||h,onClick:()=>{c(Math.max(0,s-200)),v(new Set)},children:`Previous`}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,disabled:s+k.length>=(d?.total??0)||h,onClick:()=>{c(s+200),v(new Set)},children:`Next`})]})]})]})}function uE({workspaceName:e,children:t}){let n=e,[r,i]=(0,Z.useState)(null),[a,o]=(0,Z.useState)(``),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)(0),[d,f]=(0,Z.useState)(null);if((0,Z.useEffect)(()=>{let t=!1,r=0,a,s=!1,c=async()=>{if(s||t)return;s=!0;let c=++r;try{let s=a?await co(e):await Jr(e);!t&&c===r&&(`id`in s&&(a=s.id,f({identity:n,allowed:Ep(s)})),i({identity:n,state:Er()||s.status===`active`?`active`:s.status===`inactive`?`stopped`:`unavailable`}),o(``))}catch(e){if(!t&&c===r){let t=e instanceof Error?e.message:`Unable to check workspace status`,r=Tr(t);i(e=>r&&e?.identity===n&&e.state===`active`?e:{identity:n,state:r?`offline`:`unavailable`}),o(t)}}finally{s=!1}},l=t=>{let s=t.detail?.refs;!s?.includes(e)&&!(a&&s?.includes(a))||(r++,i({identity:n,state:`stopped`}),o(``))},u=t=>{let s=t.workspaceId||t.id;!s||s!==e&&s!==a||!t.status||(r++,i({identity:n,state:t.status===`active`?`active`:t.status===`inactive`?`stopped`:`unavailable`}),o(``))};c(),window.addEventListener(`workspaces:refresh`,c),window.addEventListener(`workspace:stopped`,l),window.addEventListener(`focus`,c);let d=pd.on(`connect`,c);pd.on(`workspace:status:changed`,u),pd.on(`workspace.status.changed`,u);let p=Pr(e=>{e||c()});return()=>{t=!0,d?.(),p(),pd.off(`workspace:status:changed`,u),pd.off(`workspace.status.changed`,u),window.removeEventListener(`workspaces:refresh`,c),window.removeEventListener(`workspace:stopped`,l),window.removeEventListener(`focus`,c)}},[e,n,l]),r?.identity!==n)return(0,Q.jsx)(`p`,{className:`p-6 text-sm text-muted-foreground`,children:`Checking workspace…`});if(r.state===`active`)return t;let p=r.state===`stopped`;return(0,Q.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-3 p-6 text-center`,children:[(0,Q.jsx)(`p`,{className:`font-medium`,children:p?`Workspace stopped`:r.state===`offline`?`Server unreachable`:`Workspace unavailable`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:p?`Start this workspace to view its content.`:r.state===`offline`?`Reconnect to load this workspace. Previously loaded content stays available offline.`:`Unable to check this workspace. Try again or check its settings.`}),a&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:a}),(0,Q.jsx)(X,{disabled:s,onClick:async()=>{c(!0),o(``);try{p&&await la(e),u(e=>e+1)}catch(e){o(e instanceof Error?e.message:`Unable to start workspace`)}finally{c(!1)}},children:s?p?`Starting…`:`Checking…`:p?`Start workspace`:`Retry`}),d?.identity===n&&d.allowed&&(0,Q.jsx)(Mu,{className:`text-sm underline`,to:`/workspaces/${encodeURIComponent(e)}/settings`,children:`Workspace settings`})]})}function dE({workspaceId:e,workspaceName:t}){let[n,r]=(0,Z.useState)([]),[i,a]=(0,Z.useState)(new Set),o=t=>`${e}:${t.address}:${t.resyncStartedAt||``}`;(0,Z.useEffect)(()=>{let t=!1,n=!1,i=!1,a=0,o=new Map,s=new Map,c=(e,t)=>{let n=e.filter(e=>e.address!==t.backend);if(!t.resyncing)return n;let r=e.find(e=>e.address===t.backend)||s.get(t.backend);return[...n,{address:t.backend,config:r?.config,resyncStartedAt:r?.resyncStartedAt||new Date().toISOString(),progress:t.progress??r?.progress}]},l=async()=>{if(n){i=!0;return}n=!0;let u=a;try{let n=await Eo(e);if(!t){s=new Map(n.map(e=>[e.address,e]));let e=n.filter(e=>e.resyncing);for(let t of o.values())t.version>u&&(e=c(e,t.event));r(e)}}catch{}finally{n=!1,i&&!t&&(i=!1,l())}},u=t=>{t.workspaceId!==e||!t.backend||typeof t.resyncing!=`boolean`||(o.set(t.backend,{version:++a,event:t}),r(e=>c(e,t)))},d=t=>{t.workspaceId===e&&l()};l();let f=pd.on(`connect`,l);return pd.on(`backend.resync.changed`,u),pd.on(`backend.changed`,d),window.addEventListener(`focus`,l),()=>{t=!0,f?.(),pd.off(`backend.resync.changed`,u),pd.off(`backend.changed`,d),window.removeEventListener(`focus`,l)}},[e]);let s=n.filter(e=>!i.has(o(e)));return s.length?(0,Q.jsxs)(`aside`,{"aria-label":`Storage scans for ${t}`,className:`absolute bottom-5 right-5 z-50 w-72 max-w-[calc(100vw-2.5rem)] rounded-lg border bg-popover/95 p-3 text-popover-foreground shadow-lg backdrop-blur`,children:[(0,Q.jsxs)(`div`,{role:`status`,className:`mb-2 flex items-center gap-2 text-sm font-medium`,children:[(0,Q.jsx)(Xn,{"aria-hidden":`true`,className:`h-4 w-4 animate-spin`}),(0,Q.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`span`,{className:`block`,children:`Scanning storage`}),(0,Q.jsx)(`span`,{className:`block truncate text-xs font-normal text-muted-foreground`,title:t,children:t})]}),(0,Q.jsx)(`button`,{type:`button`,"aria-label":`Hide scan progress for ${t}`,title:`Hide progress; scanning continues`,className:`rounded p-1 hover:bg-muted focus-visible:outline focus-visible:outline-2`,onClick:()=>a(e=>new Set([...e,...s.map(o)])),children:(0,Q.jsx)(W,{"aria-hidden":`true`,className:`h-4 w-4`})})]}),(0,Q.jsx)(`div`,{className:`max-h-48 space-y-3 overflow-y-auto`,children:s.map(e=>{let{scanned:t=0,total:n=null}=e.progress||{},r=n&&n>0?Math.min(100,Math.round(t/n*100)):null,i=typeof e.config?.label==`string`?e.config.label:e.address;return(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-3 text-xs`,children:[(0,Q.jsx)(`span`,{className:`truncate`,children:i}),(0,Q.jsx)(`span`,{className:`shrink-0 text-muted-foreground`,children:n===null?`${t} files`:`${t} / ${n}`})]}),(0,Q.jsx)(`div`,{role:`progressbar`,"aria-label":`Scanning ${i}`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":r??void 0,className:`mt-1.5 h-1 overflow-hidden rounded-full bg-muted`,children:(0,Q.jsx)(`div`,{className:`h-full rounded-full bg-primary ${r===null?`animate-pulse`:`transition-all`}`,style:{width:r===null?`35%`:`${r}%`}})})]},e.address)})})]}):null}function fE({navigationTabs:e,navigationActions:t,onBack:n,accentColor:r,frameContent:i=!0,urlType:a,urlDisplay:o,contextPath:s,treeName:c,workspaceId:l,workspaceLabel:u,workspaceIcon:d,documentSchema:f,documents:p,isLoading:m,totalCount:h,currentPage:g,pageSize:_,onPageChange:v,onPageSizeChange:y,onRemoveDocument:b,onDeleteDocument:x,onDestroyDocument:S,onRemoveDocuments:C,onDeleteDocuments:w,onDestroyDocuments:T,onCopyDocuments:E,onCutDocuments:D,onPasteDocuments:O,onImportDocuments:k,onSelectionChange:A,pastedDocumentIds:j,onPurgeDocuments:M,disablePurgeDocuments:N,canvasInfo:P,isCanvasPinned:ee,onTogglePinCanvas:F,onSaveAsCanvas:I,onShareCanvas:L,onUnshareCanvas:R,onDeleteCanvas:ne,isSharingCanvas:B,isDeletingCanvas:re,isCanvasShared:V,isCanvasLocked:ie,backendSearchQueries:ae,onBackendSearch:oe,onRemoveBackendQuery:H,serverSort:se,onServerSortChange:ce,scope:U,onScopeChange:le,canSaveChanges:ue,isSavingChanges:de,onSaveChanges:fe,onBrowseWorkspaces:pe,onBrowseTree:me,onNavigatePath:he,linkTree:W,children:ge,contentBanner:_e,folders:ve,onOpenFolder:ye}){let G=a===`canvas`,{state:K,toggleView:be,hasActiveFilters:xe,openAddPicker:Se}=Rs(),Ce=gg(),[we,Te]=(0,Z.useState)(``),Ee=JSON.stringify([l,c,s,f]),[De,Oe]=(0,Z.useState)(Ee);De!==Ee&&(Oe(Ee),Te(``));let Ae=(0,Q.jsxs)(Q.Fragment,{children:[t,I&&(0,Q.jsx)(`button`,{type:`button`,onClick:I,title:`Save as canvas`,"aria-label":`Save as canvas`,className:`flex h-control-sm w-control-sm shrink-0 items-center justify-center rounded-md border text-muted-foreground hover:bg-accent touch-target`,children:(0,Q.jsx)(It,{className:`h-4 w-4`})})]});return(0,Q.jsxs)(`div`,{className:`flex flex-col h-full min-h-0 bg-background`,children:[e&&(0,Q.jsx)(Bg,{accentColor:r,children:e}),(0,Q.jsxs)(`div`,{className:`canvas-surface-body${i?` is-framed`:``}`,children:[(0,Q.jsx)(Vg,{workspaceIcon:d,workspace:u||l||o.split(`://`)[0]||`Workspace`,tree:c?`${c}${a.endsWith(`-layer`)?`:layer`:``}`:a.replace(`-layer`,``),path:s,accentColor:r,onBack:Ce.location?Ce.location.section===`view`?Ce.close:()=>Ce.update?.({section:`view`}):n,section:Ce.location?`document/${Ce.location.documentId}/${Ce.location.section}`:void 0,onSection:Ce.location?()=>Ce.update?.({section:`view`}):void 0,onBrowseWorkspaces:pe,onBrowseTree:me,onNavigatePath:he,onFilter:()=>be(`tools`),filtersActive:xe,filtersOpen:K.t1Open&&K.t1View===`tools`,onAdd:e=>Se({modal:e.shiftKey,fresh:!0}),search:oe||!ge?{queries:ae||[],onSearch:oe??Te,localOnly:!oe,onRemoveQuery:H,scope:U,onScopeChange:le}:void 0,onDraftChange:ge?void 0:Te}),G&&P?(0,Q.jsx)(Q.Fragment,{children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-3 px-4 py-2.5 border-b bg-muted/20 shrink-0 min-w-0`,children:[P.color&&(0,Q.jsx)(`div`,{className:`w-1 h-6 rounded-full shrink-0`,style:{backgroundColor:P.color}}),(0,Q.jsx)(_t,{className:`w-4 h-4 shrink-0 text-primary`}),(0,Q.jsxs)(`div`,{className:`flex flex-col min-w-0 flex-1`,children:[(0,Q.jsx)(`span`,{className:`text-lg font-semibold leading-tight truncate`,children:P.label||o.split(`://`)[1]||`Canvas`}),P.description&&(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground truncate leading-tight`,children:P.description})]}),ue&&fe&&(0,Q.jsxs)(`button`,{type:`button`,onClick:fe,disabled:de,className:`shrink-0 flex items-center gap-1.5 px-2.5 py-1 text-xs border rounded-md hover:bg-accent transition-colors text-muted-foreground hover:text-foreground disabled:opacity-50`,title:`Save filters`,children:[(0,Q.jsx)(Ve,{className:`w-3 h-3`}),(0,Q.jsx)(`span`,{className:`hidden sm:inline`,children:de?`Saving...`:`Save filters`})]}),F&&(0,Q.jsxs)(`button`,{type:`button`,onClick:F,"aria-pressed":!!ee,className:`shrink-0 flex items-center gap-1.5 px-2.5 py-1 text-xs border rounded-md hover:bg-accent transition-colors text-muted-foreground hover:text-foreground`,title:ee?`Unpin from home`:`Pin to home`,children:[ee?(0,Q.jsx)(te,{className:`w-3 h-3`}):(0,Q.jsx)(ke,{className:`w-3 h-3`}),(0,Q.jsx)(`span`,{className:`hidden sm:inline`,children:ee?`Unpin`:`Pin`})]}),L&&(0,Q.jsxs)(`button`,{type:`button`,onClick:L,disabled:B||re,className:`shrink-0 flex items-center gap-1.5 px-2.5 py-1 text-xs border rounded-md hover:bg-accent transition-colors text-muted-foreground hover:text-foreground disabled:opacity-50`,title:V?`Copy public link`:`Share canvas`,children:[(0,Q.jsx)(Mn,{className:`w-3 h-3`}),(0,Q.jsx)(`span`,{className:`hidden sm:inline`,children:B?`Sharing...`:V?`Copy link`:`Share`})]}),V&&R&&(0,Q.jsxs)(`button`,{type:`button`,onClick:R,disabled:B||re,className:`shrink-0 flex items-center gap-1.5 px-2.5 py-1 text-xs border rounded-md hover:bg-destructive/10 transition-colors text-muted-foreground hover:text-destructive disabled:opacity-50`,children:[(0,Q.jsx)(z,{className:`w-3 h-3`}),(0,Q.jsx)(`span`,{className:`hidden sm:inline`,children:`Unshare`})]}),ne&&(0,Q.jsxs)(`button`,{type:`button`,onClick:ne,disabled:re||ie&&!V,title:ie&&!V?`Unlock this canvas before deleting it`:`Delete canvas`,className:`shrink-0 flex items-center gap-1.5 px-2.5 py-1 text-xs border rounded-md hover:bg-destructive/10 transition-colors text-muted-foreground hover:text-destructive disabled:opacity-50`,children:[(0,Q.jsx)(rt,{className:`w-3 h-3`}),(0,Q.jsx)(`span`,{className:`hidden sm:inline`,children:re?`Deleting…`:`Delete`})]})]})}):null,ge&&(I||t)&&(0,Q.jsx)(`div`,{className:`flex items-center gap-2 border-b px-3 py-1`,children:Ae}),(0,Q.jsxs)(`div`,{className:`flex-1 min-h-0 overflow-y-auto`,children:[_e,ge||(0,Q.jsx)(ex,{externalSearchQuery:we,toolbarActions:Ae,documents:f?p.filter(e=>e.schema===f):p,isLoading:m,folders:f?void 0:ve,onOpenFolder:ye,contextPath:s,treeName:c,workspaceId:l,totalCount:h,viewMode:f?`card`:`table`,allowViewToggle:!0,currentPage:g,pageSize:_,onPageChange:v,onPageSizeChange:y,onRemoveDocument:b,onDeleteDocument:x,onDestroyDocument:S,onRemoveDocuments:C,onDeleteDocuments:w,onDestroyDocuments:T,onCopyDocuments:E,onCutDocuments:D,onPasteDocuments:O,onImportDocuments:k,onSelectionChange:A,pastedDocumentIds:j,onPurgeDocuments:f?void 0:M,disablePurgeDocuments:N,backendSearchQueries:ae,onBackendSearch:oe,serverSort:se,onServerSortChange:ce,onRemoveBackendQuery:H,scope:U,onScopeChange:le,canSaveChanges:!G&&ue,isSavingChanges:de,onSaveChanges:fe,linkTree:W},f??`documents`)]})]})]})}var pE=[{id:`todos`,label:`Todo list`},{id:`todo-app`,label:`Todo App`},{id:`notes`,label:`Notes list`},{id:`notes-app`,label:`Notes App`},{id:`sketch`,label:`Sketch`}];function mE(e){return e?.kind===`app`&&e.app===`notes`?`data/schema/note`:void 0}var hE={id:`default`,name:`All`,kind:`documents`};function gE(){return[{id:`emails`,label:`Emails`,schemas:[`data/schema/message`]},{id:`todos`,label:`Todos`,schemas:[`data/schema/task`]},{id:`notes`,label:`Notes`,schemas:[`data/schema/note`]},{id:`links`,label:`Links`,schemas:[`data/schema/tab`,`data/schema/link`]},{id:`files`,label:`Files`,schemas:[`data/schema/file`]}]}function _E(e){let t=e?.views;if(!Array.isArray(t))return[hE];let n=t.filter(e=>{let t=e;return!t||typeof t.id!=`string`||typeof t.name!=`string`?!1:t.kind===`documents`||t.kind===`columns`||t.kind===`app`&&(pE.some(e=>e.id===t.app)||t.app===`filters`||t.app===`lens`)});return n.length>0?n:[hE]}var vE={todos:Ht,"todo-app":Ht,notes:qn,"notes-app":qn,filters:Wn,sketch:ue,lens:lr};function yE({views:e,activeId:t,onSelect:n,onSave:r,readOnly:i=!1,className:a,accentColor:o,onOpenToSide:s}){let[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.useState)(``),[f,p]=(0,Z.useState)(!1),[m,h]=(0,Z.useState)(null),[g,_]=(0,Z.useState)(null),v=(0,Z.useRef)(null);(0,Z.useEffect)(()=>{let e=v.current;if(!e)return;let t=t=>{if(t.ctrlKey||e.scrollWidth<=e.clientWidth)return;let n=Math.abs(t.deltaX)>Math.abs(t.deltaY)?t.deltaX:t.deltaY,r=t.deltaMode===1?16:t.deltaMode===2?e.clientWidth:1;t.preventDefault(),e.scrollLeft+=n*r};return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[]),(0,Z.useEffect)(()=>{v.current?.querySelector(`[aria-pressed="true"], input`)?.scrollIntoView({block:`nearest`,inline:`nearest`})},[t,c]);let y=()=>{h(null),_(null)},b=()=>{if(m&&g&&m!==g.id){let t=e.find(e=>e.id===m),n=e.filter(e=>e.id!==m),i=n.findIndex(e=>e.id===g.id);t&&i>=0&&(n.splice(g.before?i:i+1,0,t),n.some((t,n)=>t.id!==e[n].id)&&r(n))}y()},x=()=>{if(!c)return;let t=u.trim();t&&r(e.map(e=>e.id===c?{...e,name:t}:e)),l(null)},S=(t,n)=>{p(!1);let i=`view-${Date.now().toString(36)}`,a=t===`columns`?`Board`:t===`app`?pE.find(e=>e.id===n)?.label??`App`:`List`,o=t===`columns`?{id:i,name:a,kind:t,columns:gE()}:t===`app`?{id:i,name:a,kind:t,app:n}:{id:i,name:a,kind:t};r([...e,o],i),l(i),d(a)},C=n=>{let i=e.filter(e=>e.id!==n);r(i.length>0?i:[hE],n===t?i[0]?.id??hE.id:void 0)};return(0,Q.jsxs)(`div`,{className:q(`relative flex h-full min-w-0 items-end`,a),children:[(0,Q.jsx)(`div`,{ref:v,className:`flex min-w-0 items-end gap-0.5 overflow-x-auto overscroll-x-contain pt-1 [scrollbar-width:none]`,children:e.map(r=>{let a=r.id===t,f=r.kind===`columns`?ir:r.kind===`app`&&r.app?vE[r.app]:qt;return c===r.id?(0,Q.jsx)(`input`,{autoFocus:!0,"aria-label":`Tab name`,value:u,onChange:e=>d(e.target.value),onBlur:x,onKeyDown:e=>{e.key===`Enter`&&x(),e.key===`Escape`&&l(null)},className:q(`relative h-[2.3rem] w-28 shrink-0 rounded-t-[.5rem] border-0 px-3 pb-1 text-xs outline-none ring-0`,a?q(`z-[2] bg-background font-medium`,o?Tm(o):`text-foreground`):`bg-muted text-muted-foreground`),style:{backgroundColor:a?o:void 0}},r.id):(0,Q.jsxs)(`button`,{type:`button`,"aria-pressed":a,onClick:()=>n(r.id),onDoubleClick:()=>{i||(l(r.id),d(r.name))},title:i?r.name:`${r.name}: double-click to rename, drag to reorder`,draggable:!i,onDragStart:e=>{e.dataTransfer.setData(`text/plain`,r.name),e.dataTransfer.effectAllowed=`move`,h(r.id)},onDragOver:e=>{if(!m||m===r.id)return;e.preventDefault(),e.dataTransfer.dropEffect=`move`;let t=e.currentTarget.getBoundingClientRect(),n=e.clientX<t.left+t.width/2;_(e=>e?.id===r.id&&e.before===n?e:{id:r.id,before:n})},onDrop:e=>{e.preventDefault(),b()},onDragEnd:y,className:q(`group relative flex h-[2.3rem] shrink-0 items-center gap-1.5 rounded-t-[.5rem] border-0 px-3 pb-1 text-xs transition-colors`,a?q(`z-[2] bg-background font-medium`,o?Tm(o):`text-foreground`):`bg-muted text-muted-foreground hover:bg-accent hover:text-foreground`,m===r.id&&`opacity-50`),style:{backgroundColor:a?o:void 0,boxShadow:g?.id===r.id?`inset ${g.before?`2px`:`-2px`} 0 0 var(--primary)`:void 0},children:[(0,Q.jsx)(f,{className:`h-3 w-3 shrink-0`}),(0,Q.jsx)(`span`,{className:`max-w-32 truncate`,children:r.name}),s&&(0,Q.jsx)(Qe,{className:`h-3 w-3 shrink-0 opacity-0 transition-opacity hover:opacity-100 group-hover:opacity-60`,"aria-label":`Open to the side`,onClick:e=>{e.stopPropagation(),s(r.id)}}),!i&&e.length>1&&(0,Q.jsx)(W,{className:q(`h-3 w-3 shrink-0 transition-opacity hover:text-destructive`,a?`opacity-60 hover:opacity-100`:`opacity-0 group-hover:opacity-100`),onClick:e=>{e.stopPropagation(),C(r.id)}})]},r.id)})}),!i&&(f?(0,Q.jsxs)(`span`,{className:`absolute left-0 top-full z-30 flex w-full min-w-64 flex-wrap items-center gap-2 rounded-b-xl border bg-card p-2 shadow-lg`,children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>S(`documents`),className:`flex h-10 items-center gap-1.5 rounded-md border px-2 text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground`,children:[(0,Q.jsx)(qt,{className:`h-3 w-3`}),` List`]}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>S(`columns`),className:`flex h-10 items-center gap-1.5 rounded-md border px-2 text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground`,children:[(0,Q.jsx)(ir,{className:`h-3 w-3`}),` Board`]}),pE.map(e=>{let t=vE[e.id];return(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>S(`app`,e.id),className:`flex h-10 items-center gap-1.5 rounded-md border px-2 text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground`,children:[(0,Q.jsx)(t,{className:`h-3 w-3`}),` `,e.label]},e.id)}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>p(!1),className:`p-1 text-muted-foreground hover:text-foreground`,"aria-label":`Cancel`,children:(0,Q.jsx)(W,{className:`h-3 w-3`})})]}):(0,Q.jsx)(`button`,{type:`button`,onClick:()=>p(!0),title:`Add view`,"aria-label":`Add view`,className:`relative ml-1 flex h-[2.3rem] w-10 shrink-0 items-center justify-center rounded-md pb-1 text-muted-foreground hover:bg-accent/50 hover:text-foreground`,children:(0,Q.jsx)(cn,{className:`h-3.5 w-3.5`})}))]})}function bE(e,t,n,r,i){let a=`${e}\0${t}\0${n}\0${r}\0${i??``}`,[o,s]=(0,Z.useState)(0),[c,l]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{let o=!1;return to(e,n,t,{limit:200,allOf:[r],...i?{sortBy:i,order:`asc`}:{}}).then(e=>{o||l({key:a,docs:e.payload||[]})}).catch(()=>{o||l({key:a,docs:[]})}),()=>{o=!0}},[a,o]);let u=c?.key===a?c.docs:[],d=c?.key!==a;return(0,Z.useEffect)(()=>{let e=()=>s(e=>e+1);return window.addEventListener(`workspace:documents:refresh`,e),()=>window.removeEventListener(`workspace:documents:refresh`,e)},[]),{docs:u,isLoading:d,refresh:(0,Z.useCallback)(()=>s(e=>e+1),[])}}function xE({workspaceId:e,treeName:t,path:n}){let{docs:r,isLoading:i,refresh:a}=bE(e,t,n,Oo,`tasks`),[o,s]=(0,Z.useState)(!1),c=o?r.filter(e=>e.data?.status!==`completed`):r,l=r.filter(e=>{let t=e.data?.status;return t!==`completed`&&t!==`cancelled`}).length;return(0,Q.jsxs)(`div`,{className:`mx-auto flex h-full w-full max-w-3xl flex-col p-4`,children:[(0,Q.jsxs)(`div`,{className:`mb-2 flex shrink-0 items-center justify-between gap-2`,children:[(0,Q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[l,` open`]}),(0,Q.jsxs)(`label`,{className:`flex cursor-pointer items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:o,onChange:e=>s(e.target.checked)}),`hide done`]})]}),(0,Q.jsx)(`div`,{className:`min-h-0 flex-1 space-y-1 overflow-y-auto`,children:i?(0,Q.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,children:`Loading…`}):c.length===0?(0,Q.jsx)(`p`,{className:`py-4 text-sm text-muted-foreground`,children:`No todos here.`}):c.map(t=>(0,Q.jsx)(Dx,{doc:t,workspaceId:e,readOnly:!1,onChanged:a},t.id))})]})}function SE({app:e,contextId:t,...n}){let r=t&&e!==`lens`?{mode:`context`,contextId:t}:{mode:`workspace`,workspaceName:n.workspaceId,treeName:n.treeName,path:n.path,treeType:n.treeName===`directory`||n.treeName===`backends`?`directory`:`context`},i=e===`todo-app`?`todo`:e===`notes-app`?`notes`:e,a=ww.find(e=>e.id===i);return(0,Q.jsx)(Ew,{target:r,children:e===`todos`?(0,Q.jsx)(xE,{...n}):a?(0,Q.jsx)(a.Component,{}):null})}var CE=[{id:`emails`,label:`Emails`,schemas:[`data/schema/message`]},{id:`todos`,label:`Todos`,schemas:[`data/schema/task`]},{id:`notes`,label:`Notes`,schemas:[`data/schema/note`]},{id:`links`,label:`Links`,schemas:[`data/schema/tab`,`data/schema/link`]},{id:`files`,label:`Files`,schemas:[`data/schema/file`]}];function wE(e,t){return t.some(t=>e.schema===t||e.schema.startsWith(`${t}/`))}function TE({documents:e,workspaceId:t,columns:n,onColumnsChange:r,readOnly:i=!1}){let[a,o]=(0,Z.useState)(null),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)({}),[d,f]=(0,Z.useState)({}),p=(0,Z.useRef)(null),[m,h]=(0,Z.useState)(!1),g=(0,Z.useCallback)(()=>{let e=p.current;e&&h(e.scrollWidth-e.clientWidth-e.scrollLeft>8)},[]);(0,Z.useEffect)(()=>{let e=p.current;if(!e)return;let t=new ResizeObserver(()=>g());return t.observe(e),()=>t.disconnect()},[g]);let _=(e,t)=>{e.preventDefault();let i=e.currentTarget.parentElement;if(!i)return;let a=e.clientX,o=i.getBoundingClientRect().width,s=o,c=e=>{s=Math.min(900,Math.max(220,o+e.clientX-a)),f(e=>({...e,[t]:s}))},l=()=>{window.removeEventListener(`pointermove`,c),window.removeEventListener(`pointerup`,l),r(n.map(e=>e.id===t?{...e,width:Math.round(s)}:e))};window.addEventListener(`pointermove`,c),window.addEventListener(`pointerup`,l)},v=e=>{f(t=>{let n={...t};return delete n[e],n}),r(n.map(t=>t.id===e?{...t,width:void 0}:t))},y=e=>{let t=l[e];if(t===void 0)return;let i=n.find(t=>t.id===e);i&&(i.filter||``)!==t&&r(n.map(n=>n.id===e?{...n,filter:t||void 0}:n))},b=CE.filter(e=>!n.some(t=>t.id===e.id));return(0,Q.jsxs)(`div`,{className:`relative h-full`,children:[(0,Q.jsx)(`div`,{ref:p,onScroll:g,className:`flex h-full snap-x snap-mandatory gap-3 overflow-x-auto overscroll-x-contain p-2`,"data-testid":`schema-columns-board`,children:n.map(t=>{let a=(l[t.id]??t.filter??``).toLowerCase(),s=e.filter(e=>wE(e,t.schemas)).filter(e=>{if(!a)return!0;let t=Ni(e);return`${t.title}\n${t.preview}\n${t.subtitle}`.toLowerCase().includes(a)}),c=d[t.id]??t.width;return(0,Q.jsxs)(`div`,{className:`relative flex h-full min-h-0 min-w-0 shrink-0 grow-0 basis-full snap-start flex-col rounded-(--card-radius) border bg-muted/20 ${c?`sm:basis-[var(--col-w)]`:`sm:basis-[48%] lg:basis-[32%] xl:basis-[24%]`}`,style:c?{"--col-w":`${c}px`}:void 0,children:[!i&&(0,Q.jsx)(`div`,{onPointerDown:e=>_(e,t.id),onDoubleClick:()=>v(t.id),title:`Drag to resize; double-click to reset`,className:`absolute right-0 inset-y-0 z-10 w-2 cursor-col-resize touch-none rounded-r-lg transition-colors hover:bg-primary/25 active:bg-primary/40 max-sm:hidden`}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 px-3 pb-1 pt-2.5 max-sm:pr-10`,children:[(0,Q.jsx)(`span`,{className:`truncate text-sm font-medium`,children:t.label}),(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:s.length}),(0,Q.jsx)(`span`,{className:`flex-1`}),!i&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>r(n.filter(e=>e.id!==t.id)),title:`Remove column`,className:`rounded-sm p-0.5 text-muted-foreground hover:text-destructive`,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]}),(0,Q.jsx)(`div`,{className:`px-3 pb-2`,children:(0,Q.jsx)(`input`,{value:l[t.id]??t.filter??``,onChange:e=>u(n=>({...n,[t.id]:e.target.value})),onBlur:()=>y(t.id),onKeyDown:e=>{e.key===`Enter`&&y(t.id)},placeholder:`Filter…`,readOnly:i,className:`h-7 w-full rounded-md border border-input bg-background px-2 text-xs placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})}),(0,Q.jsxs)(`div`,{className:`flex-1 space-y-1.5 overflow-y-auto px-2 pb-2`,children:[s.map(e=>{let t=Ni(e);return(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>o(e),className:`w-full min-w-0 rounded-md border bg-card px-2.5 py-2 text-left transition-colors hover:bg-accent/50`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(Fm,{document:e,size:3.5}),(0,Q.jsx)(`span`,{className:`truncate text-xs font-medium`,title:t.title,children:t.title})]}),t.preview&&(0,Q.jsx)(`p`,{className:`mt-1 line-clamp-2 break-words text-[11px] leading-snug text-muted-foreground`,children:t.preview}),(0,Q.jsx)(`p`,{className:`mt-1 text-[10px] text-muted-foreground/70`,children:new Date(e.updatedAt||e.createdAt).toLocaleDateString()})]},e.id)}),s.length===0&&(0,Q.jsx)(`p`,{className:`px-2 py-3 text-center text-xs text-muted-foreground/60`,children:`Empty`})]})]},t.id)})}),(!i&&b.length>0||m)&&(0,Q.jsxs)(`div`,{className:`pointer-events-none absolute inset-y-0 right-0 z-20 flex w-7 flex-col items-end bg-gradient-to-l from-background via-background/60 to-transparent py-2`,children:[!i&&b.length>0&&(0,Q.jsxs)(`div`,{className:`pointer-events-auto relative`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:()=>c(e=>!e),title:`Add column`,"aria-label":`Add column`,className:`flex h-7 w-6 items-center justify-center rounded-l-md border border-r-0 bg-background text-muted-foreground shadow-elevation-1 hover:bg-accent hover:text-foreground`,children:(0,Q.jsx)(cn,{className:`h-3.5 w-3.5`})}),s&&(0,Q.jsxs)(`div`,{className:`absolute right-0 top-8 w-44 rounded-lg border bg-background p-2 shadow-elevation-2`,children:[(0,Q.jsx)(`p`,{className:`px-2 pb-1 text-[10px] uppercase tracking-wide text-muted-foreground`,children:`Add column`}),b.map(e=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>{c(!1),r([...n,{...e}])},className:`w-full rounded-md px-2 py-1.5 text-left text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground`,children:e.label},e.id)),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>c(!1),className:`mt-1 w-full rounded-md px-2 py-1.5 text-left text-xs text-muted-foreground/60 hover:bg-accent/50`,children:`Cancel`})]})]}),m&&(0,Q.jsx)(gr,{className:`my-auto h-4 w-4 self-center text-muted-foreground/70`,"aria-label":`More columns`})]}),(0,Q.jsx)(By,{document:a,isOpen:a!==null,onClose:()=>o(null),workspaceId:t})]})}var EE=e=>e&&typeof e==`object`&&!Array.isArray(e)?e:null;function DE(e){return`/${e}`.replace(/\/+/g,`/`).replace(/\/$/,``)||`/`}function OE(e,t,n){if(e==null)return[];if(Array.isArray(e))return e.flatMap(e=>OE(e,t,n));if(typeof e==`string`)return[{tree:null,kind:t,path:DE(e)}];let r=EE(e);if(!r)return[];let i=r.tree??r.treeId,a=typeof i==`string`?n.get(i)??null:null;return[].concat(r.paths??r.path??`/`).filter(e=>typeof e==`string`).map(e=>({tree:a,kind:t,path:DE(e)}))}function kE(e){let t=[],n=e=>{let n=Number(e);Number.isSafeInteger(n)&&n>0&&t.push(n)};return Array.isArray(e.ids)&&e.ids.forEach(n),Array.isArray(e.documentIds)&&e.documentIds.forEach(n),e.id!=null&&n(e.id),e.documentId!=null&&n(e.documentId),t}function AE(e){let t=new Map;for(let n of e)t.set(n.id,n.name),t.set(n.name,n.name);return t}function jE(e,t,n=new Map){let r=EE(t);if(!r)return{targets:[],ids:[],unknown:!0};if(e.startsWith(`tree.`)){let e=typeof r.treeName==`string`?r.treeName:null,t=r.treeType===`directory`||r.treeType===`context`?r.treeType:null,n=r.contextSpec??r.path;return typeof n==`string`?{targets:[{tree:e,kind:t,path:DE(n)}],ids:kE(r),unknown:!1}:{targets:[],ids:[],unknown:!0}}let i=[...OE(r.context,`context`,n),...OE(r.directory,`directory`,n)],a=EE(r.changed);a&&i.push(...OE(a.context,`context`,n),...OE(a.directory,`directory`,n));let o=kE(r);if(i.length)return{targets:i,ids:o,unknown:!1};let s=r.reason===`content`||r.reason===`relations`;return e.startsWith(`document.updated`)&&s&&o.length?{targets:[],ids:o,unknown:!1}:{targets:[],ids:o,unknown:!0}}function ME(e,t){return e===t||e===`/`||t===`/`||e.startsWith(`${t}/`)||t.startsWith(`${e}/`)}function NE(e,t){if(e.kind&&e.kind!==t.kind||e.tree&&e.tree!==t.tree)return!1;if(t.kind===`context`){let n=e=>DE(e).split(`/`).filter(Boolean).map(e=>e.normalize(`NFKC`).trim().replace(/\s+/g,` `).replace(/[^\p{L}\p{N}\p{M} .+_@-]/gu,`_`).replace(/_+/g,`_`).toLowerCase()||`_`),r=new Set(n(e.path)),i=n(t.path);return r.size===0||i.length===0||i.some(e=>r.has(e))}return ME(e.path,t.path)}function PE(e){return jE(`tree.refresh`,{treeName:e?.treeName,path:e?.path||`/`})}function FE(e,t,n){if(e.unknown||e.targets.length&&(t.wholeWorkspace||e.targets.some(e=>NE(e,t))))return!0;if(e.ids.length&&n){let t=n instanceof Set?n:new Set(n);if(e.ids.some(e=>t.has(e)))return!0}return!1}var IE=(0,Z.createContext)(null);function LE(){let e=(0,Z.useContext)(IE);if(!e)throw Error(`useCanvasPins must be used within a CanvasPinsProvider`);return e}function RE(e,t,n={}){return pd.request($u,{workspace:e,specs:t,opts:n})}function zE(e,t,n){return pd.request(ed,{sessionId:e,label:t,spec:n})}function BE(e){return pd.request(td,{sessionId:e})}function VE(e,t={}){return pd.request(nd,{sessionId:e,...t})}function HE(e){return pd.request(rd,{sessionId:e})}function UE(e){return pd.on(id,e)}var WE=100;function GE({workspaceRef:e,specs:t,opts:n,enabled:r=!0}){let[i,a]=(0,Z.useState)([]),[o,s]=(0,Z.useState)(0),[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.useState)(null),f=(0,Z.useRef)([]),p=(0,Z.useRef)(new Map),m=(0,Z.useRef)(null),h=(0,Z.useRef)(null),g=(0,Z.useRef)(null),_=(0,Z.useRef)({}),v=(0,Z.useRef)(null),y=(0,Z.useMemo)(()=>JSON.stringify(t),[t]),b=(0,Z.useMemo)(()=>JSON.stringify(n??{}),[n]),x=(0,Z.useCallback)(()=>{let e=p.current;a(f.current.map(t=>e.get(t)).filter(Boolean))},[]),S=(0,Z.useCallback)(async e=>{let t=h.current;if(!t||e.length===0)return[];let n=[];for(let r=0;r<e.length;r+=WE){let i=e.slice(r,r+WE),a=await Na(t,`/`,[],{ids:i,scope:`workspace`,limit:i.length});n.push(...a.payload||[])}return n},[]),C=(0,Z.useCallback)(async(e,t,n)=>{if(t.length>0){let e=new Set(t);f.current=f.current.filter(t=>!e.has(t));for(let t of e)p.current.delete(t)}let r=e.filter(e=>!p.current.has(e)),i=new Set(f.current);for(let t of e)i.has(t)||(f.current.push(t),i.add(t));if(n!==null&&s(n),x(),r.length===0)return;let a=await S(r);for(let e of a)p.current.set(e.id,e);let o=new Set(a.map(e=>e.id)),c=r.filter(e=>!o.has(e));if(c.length>0){let e=new Set(c);f.current=f.current.filter(t=>!e.has(t))}x()},[S,x]),w=(0,Z.useCallback)(async(e,t)=>{let n=e??[],r=new Set(n);f.current=f.current.filter(e=>r.has(e));for(let e of p.current.keys())r.has(e)||p.current.delete(e);let i=new Set(f.current),a=n.filter(e=>!i.has(e));await C(a,[],t)},[C]);(0,Z.useEffect)(()=>{if(h.current=e??null,!r||!e)return;let t=!1,n=null,i=async()=>{try{let r=await RE(e,JSON.parse(y),JSON.parse(b));if(t){HE(r.sessionId).catch(()=>{});return}n=r.sessionId,m.current=r.sessionId,l(r.sessionId),d(null),f.current=[],p.current=new Map,await w(r.ids,r.count)}catch(e){if(t)return;d(e instanceof Error?e.message:`Failed to open query session`),l(null),m.current=null}};i();let o=pd.on(`connect`,()=>{i()});return()=>{t=!0,o?.();let e=n??m.current;e&&HE(e).catch(()=>{}),m.current=null,f.current=[],p.current=new Map,l(null),a([]),s(0)}},[e,y,b,r]),(0,Z.useEffect)(()=>{if(!c)return;let e=UE(e=>{if(e.sessionId===c){if(g.current!==null){v.current?.(g.current,_.current);return}e.ids===void 0?C(e.added??[],e.removed??[],e.count):w(e.ids,e.count)}});return()=>{e?.()}},[c,C,w]);let T=(0,Z.useCallback)(async()=>{let e=m.current;if(e)try{let t=await BE(e);await w(t.ids,t.count)}catch{}},[w]),E=(0,Z.useCallback)(async(e,t)=>{let n=m.current;if(!n)throw Error(`No open query session`);let r=await zE(n,e,t);if(g.current!==null){await v.current?.(g.current,_.current);return}await w(r.ids,r.count)},[w]),D=(0,Z.useCallback)(async(e,t={})=>{let n=m.current;if(!n)throw Error(`No open query session`);if(g.current=e,_.current=t,e===null){await T();return}let r=await VE(n,{match:e,...t});for(let e of r.documents)p.current.set(e.id,e);f.current=r.ids,s(r.totalCount),x()},[x,T]);(0,Z.useEffect)(()=>{v.current=D},[D]);let O=(0,Z.useCallback)(async(e,t,n={})=>{let r=m.current;if(!r)throw Error(`No open query session`);let i=await VE(r,{match:t,limit:n.limit??100,...n.mode?{mode:n.mode}:{}});for(let e of i.documents)p.current.set(e.id,e);let a=await zE(r,e,{ids:i.ids});return await w(a.ids,a.count),i.ids},[w]);return{documents:i,count:o,ready:c!==null,error:u,setCue:E,resync:T,rank:D,rankAndPin:O}}var KE=`canvas:query-debug`,qE=`canvas:query-debug-changed`;function JE(){try{return localStorage.getItem(KE)===`1`}catch{return!1}}function YE(e){try{e?localStorage.setItem(KE,`1`):localStorage.removeItem(KE)}catch{}window.dispatchEvent(new CustomEvent(qE,{detail:e}))}function XE(){let[e,t]=(0,Z.useState)(JE);return(0,Z.useEffect)(()=>{let e=()=>t(JE());return window.addEventListener(qE,e),window.addEventListener(`storage`,e),()=>{window.removeEventListener(qE,e),window.removeEventListener(`storage`,e)}},[]),e}function ZE({data:e,className:t}){let[n,r]=(0,Z.useState)(!0),{rows:i,gapIndex:a,span:o}=(0,Z.useMemo)(()=>{let t=[...e.distances].sort((e,t)=>e.distance-t.distance),n=[];for(let e=1;e<t.length;e++)n.push(t[e].distance-t[e-1].distance);let r=n.length?[...n].sort((e,t)=>e-t)[Math.floor(n.length/2)]:0,i=-1,a=0;for(let e=0;e<n.length;e++)n[e]>a&&(a=n[e],i=e+1);let o=i>0&&a>=Math.max(r*4,1e-6),s=t[0]?.distance??0,c=t[t.length-1]?.distance??0;return{rows:t,gapIndex:o?i:-1,span:{first:s,last:c,biggest:a,median:r}}},[e.distances]);if(i.length===0)return(0,Q.jsxs)(`div`,{className:q(`rounded-md border border-dashed border-border px-3 py-2 text-xs text-muted-foreground`,t),children:[`Query debug: no image distances for “`,e.query,`”. The dense side returned nothing: either no photos are embedded in this scope, or the image space is not ready.`]});let s=a>0?i[a].distance:null;return(0,Q.jsxs)(`div`,{className:q(`rounded-md border border-border bg-muted/30 text-xs`,t),children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>r(e=>!e),className:`flex w-full items-center gap-1.5 px-3 py-2 text-left font-medium`,children:[n?(0,Q.jsx)(Ze,{className:`h-3.5 w-3.5`}):(0,Q.jsx)(gr,{className:`h-3.5 w-3.5`}),`Query debug`,(0,Q.jsxs)(`span`,{className:`font-normal text-muted-foreground`,children:[`: image distances for “`,e.query,`” (`,i.length,` nearest, unfloored)`]})]}),n&&(0,Q.jsxs)(`div`,{className:`space-y-2 border-t border-border px-3 py-2`,children:[(0,Q.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`Best-first cosine distance (0 = identical). Scroll to where the photos stop being relevant and set the image relevance floor just above that value in Settings → Database → Search tuning.`,s===null?(0,Q.jsxs)(Q.Fragment,{children:[` `,(0,Q.jsx)(`span`,{className:`text-amber-600 dark:text-amber-500`,children:`No boundary in this window`}),`; the distances step evenly (typical Δ`,o.median.toFixed(4),`), so there is nothing here to set a floor from. Relevance probably ends further down the list than this window reaches, or the model is not separating this query at all.`]}):(0,Q.jsxs)(Q.Fragment,{children:[` A jump at `,(0,Q.jsx)(`span`,{className:`font-mono`,children:s.toFixed(4)}),` (Δ`,o.biggest.toFixed(4),`, vs typical Δ`,o.median.toFixed(4),`) stands out (a likely boundary).`]})]}),(0,Q.jsx)(`div`,{className:`max-h-56 overflow-y-auto`,children:(0,Q.jsx)(`table`,{className:`w-full font-mono text-[11px]`,children:(0,Q.jsx)(`tbody`,{children:i.map((e,t)=>(0,Q.jsxs)(`tr`,{className:q(`border-b border-border/40 last:border-0`,t===a&&`border-t-2 border-t-amber-500/70`),children:[(0,Q.jsx)(`td`,{className:`py-0.5 pr-3 text-muted-foreground`,children:t+1}),(0,Q.jsxs)(`td`,{className:`py-0.5 pr-3`,children:[`#`,e.id]}),(0,Q.jsx)(`td`,{className:`py-0.5 tabular-nums`,children:e.distance.toFixed(4)}),t===a&&(0,Q.jsx)(`td`,{className:`py-0.5 pl-2 font-sans text-[10px] text-amber-600 dark:text-amber-500`,children:`← biggest gap`})]},e.id))})})}),(0,Q.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`Range `,o.first.toFixed(4),` – `,o.last.toFixed(4),` (spread `,(o.last-o.first).toFixed(4),`) over `,i.length,` rows. Absolute values shift with the model and are not comparable across models. After a re-embed every floor has to be picked again. A spread this narrow relative to the range means ranking is doing the work, not distance.`]})]})]})}function QE(e,t){if(!e)return[];let n=t.split(`/`).filter(Boolean),r=e;for(let e of n)if(r=r?.children?.find(t=>t.name===e)??null,!r)return[];let i=n.length?`/${n.join(`/`)}`:``,a=(r.children??[]).filter(e=>e.type!==`canvas`).map(e=>({name:e.name,path:`${i}/${e.name}`,label:e.label,color:e.color,childCount:e.children?.length??0})).sort((e,t)=>(e.label||e.name).localeCompare(t.label||t.name,void 0,{numeric:!0,sensitivity:`base`}));return n.length>0&&a.unshift({name:`..`,path:n.length>1?`/${n.slice(0,-1).join(`/`)}`:`/`,isParent:!0}),a}var $E=new Map;function eD(e,t,n){return`${e}\0${t}\0${n}`}function tD(e,t,n,r,i,a,o=``,s=``,c=`path`){return`${eD(e,t,n)}\0${r}\0${i}\0${a}\0${o}\0${s}\0${c}`}function nD(e,t,n){let r=eD(e,t,n);for(let e of $E.keys())e.startsWith(r)&&$E.delete(e)}function rD(e,t){let n=`${e}\0`;for(let[e,r]of $E){if(!e.startsWith(n))continue;let[,i,a,,,,,,o=`path`]=e.split(`\0`);FE(t,{tree:i,kind:$a(i),path:a,wholeWorkspace:o.startsWith(`workspace`)},r.documents.map(e=>Number(e.id)))&&$E.delete(e)}}function iD(e,t){rD(t?.workspaceName??e,PE(t))}function aD(){let{workspaceName:e}=yl();return e?(0,Q.jsx)(uE,{workspaceName:e,children:(0,Q.jsx)(oD,{})}):null}function oD(){let{workspaceName:e,treeName:t}=yl(),n=fl(),r=hl(),{showToast:i,showProgress:a}=Hr(),o=new URLSearchParams(n.search),s=(()=>{let e=o.getAll(`q`).map(e=>e.trim()).filter(Boolean);if(e.length>0)return e;let t=(o.get(`search`)||``).trim();return t?[t]:[]})(),[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.useState)(!0),[f,p]=(0,Z.useState)([]),[m,h]=(0,Z.useState)(!1),[g,_]=(0,Z.useState)(0),v=XE(),[y,b]=(0,Z.useState)(null),[x,S]=(0,Z.useState)(v);x!==v&&(S(v),v||b(null));let[C,w]=(0,Z.useState)(`path`),[T,E]=(0,Z.useState)(!1),[D,O]=(0,Z.useState)(null),[k,A]=(0,Z.useState)(null),[j,M]=(0,Z.useState)(``),[N,P]=(0,Z.useState)(!1),[ee,F]=(0,Z.useState)(!1),[I,L]=(0,Z.useState)(!1),[R,te]=(0,Z.useState)(null),[z,ne]=(0,Z.useState)(1),[B,re]=(0,Z.useState)(50),[V,ie]=(0,Z.useState)(s),[ae,oe]=(0,Z.useState)(null),{state:H,saveFilters:se,setSort:ce,setAccentColor:U,setMapDocuments:le}=Rs(),ue=H.filters.features.allOf,de=H.filters.features.anyOf,fe=H.filters.features.noneOf,pe=Jy(H.filters.timeline),me=Gy(H.filters.geo),he=Ky(H.filters.lens,H.filters.geo.includeUnlocated),W=H.filters.lens.ids,ge=[...pe,...me,...he],_e=H.filters.sort??Hy,ve=JSON.stringify({a:ue,b:de,c:fe,d:ge,i:W,s:_e}),ye=JSON.stringify({a:ue,b:de,c:fe,d:ge,s:_e}),G=jx(n.pathname).path,K=t??`context`,be=K===`backends`,[xe,Se]=(0,Z.useState)([]);(0,Z.useEffect)(()=>{!be||!e||Eo(e).then(Se).catch(()=>Se([]))},[be,e]);let Ce=be?oo(G,xe):null,[we,Te]=(0,Z.useState)(!1),Ee=`${K}\0${G}`,[De,Oe]=(0,Z.useState)(Ee);De!==Ee&&(Oe(Ee),Te(!1));let ke=o.get(`layer`)===`1`,Ae=o.get(`layerId`)||null,[je,Me]=(0,Z.useState)(null),[Ne,Pe]=(0,Z.useState)(null),Fe=(0,Z.useRef)(null);(0,Z.useEffect)(()=>{Fe.current=Ne},[Ne]);let[Ie,Le]=(0,Z.useState)(`left`),[Re,ze]=(0,Z.useState)([]),{openM1Drawer:Be,openM2Drawer:Ve,goBack:He}=jT(),[Ue,We]=(0,Z.useState)([]),Ge=(0,Z.useMemo)(()=>{if(!je||G===`/`||ke)return null;let e=G.split(`/`).filter(Boolean),t=je;for(let n of e)if(t=t?.children?.find(e=>e.name===n)??null,!t)return null;return t},[je,G,ke]),Ke=Ge?.type===`canvas`?`canvas`:null,qe=(0,Z.useRef)(null);(0,Z.useEffect)(()=>{!e||!je||ke||qe.current===`${e}/${K}`&&(G!==`/`&&!Ge||rT(e,K,G))},[e,je,ke,G,Ge,K]);let Je=(0,Z.useMemo)(()=>ke||C===`workspace`||V.length>0||$a(K)!==`directory`?[]:QE(je,G),[je,G,K,ke,C,V]),Ye=ke?null:G===`/`?je:Ge,Xe=`${K}\0${G}`,[Ze,Qe]=(0,Z.useState)(null),$e=Ze?.key===Xe?Ze.views:_E(Ye?.metadata),et=Ze?.key===Xe?Ze.activeId:$e[0]?.id??hE.id,tt=$e.find(e=>e.id===et)??$e[0]??hE,nt=be?void 0:mE(tt),rt=nt?[...ue,nt]:ue,it=e=>{ne(1),ze([]),Qe({key:Xe,views:$e,activeId:e})},at=(t,n)=>{n&&n!==et&&(ne(1),ze([])),Qe({key:Xe,views:t,activeId:n??et}),fa(e,G,{metadata:{...Ye?.metadata??{},views:t}},K).catch(()=>{i({title:`View not saved`,description:`Could not persist views to the layer`,variant:`destructive`})})},ot=Ke===`canvas`&&typeof Ge?.querySpec?.query==`string`?Ge.querySpec.query:``,st=Ke===`canvas`?{label:Ge?.label,description:Ge?.description,color:Ge?.color}:null,{isPinned:ct,pin:lt,unpin:ut,pins:dt}=LE(),ft=c?.name,pt=(0,Z.useMemo)(()=>ft&&Ke===`canvas`&&!ke?{workspaceName:ft,treeName:K,path:G}:null,[ft,Ke,ke,K,G]),mt=pt?ct(pt):!1,ht=Ge?.id,gt=Ge?.label,_t=(0,Z.useCallback)(async()=>{if(pt)try{let e=dt.find(e=>e.workspaceName===pt.workspaceName&&e.treeName===pt.treeName&&e.path===pt.path);e?await ut(e.id):await lt({...pt,layerId:ht,label:gt})}catch(e){console.error(`Failed to update home pins:`,e)}},[pt,dt,lt,ut,ht,gt]),vt=e?`${e}://${G===`/`?``:G.replace(/^\//,``)}`:``,yt=Cm(c?.color)||null;(0,Z.useEffect)(()=>(U(yt),()=>U(null)),[yt,U]);let bt=(0,Z.useCallback)(async t=>{let n=W;if(t?.anyOf?.length&&de.length&&(n=((await to(e,G,K,{limit:0,anyOf:de,ids:W,applyCanvasSpec:!1})).payload||[]).map(e=>e.id),!n.length))return{payload:[],count:0,totalCount:0};let r=await to(e,G,K,{limit:t?.limit,offset:t?.offset,page:t?.page,sortBy:t?.sortBy,order:t?.order,allOf:[...ue,...t?.allOf??[]],anyOf:t?.anyOf?.length?t.anyOf:de,noneOf:fe,filters:ge,ids:n,queries:[...V,...t?.queries??[],...t?.q?[t.q]:[]],applyCanvasSpec:!1});return{payload:r.payload||[],count:r.count??void 0,totalCount:r.totalCount??void 0}},[e,G,K,ve,V]);(0,Z.useEffect)(()=>{e&&(async()=>{d(!0);try{let t=await Y.get(`${Sr.workspaces}/${e}`),n;n=t&&`workspace`in t?t.workspace:t,l(n)}catch(t){let n=t instanceof Error?t.message:`Failed to fetch workspace ${e}`;i({title:`Error`,description:n,variant:`destructive`}),l(null)}finally{d(!1)}})()},[e,i]),(0,Z.useEffect)(()=>{let e=e=>{let t=e.detail?.workspace;t&&l(e=>e&&(t===e.name||t===e.id)&&e.status!==`active`?{...e,status:`active`}:e)};return window.addEventListener(`workspace:autostarted`,e),()=>window.removeEventListener(`workspace:autostarted`,e)},[]);let xt=(W?.length??0)>0&&!ke&&!(we&&Ce)&&V.length<=1,{documents:St,count:Ct,ready:wt,setCue:Tt,resync:Et,rank:Dt}=GE({workspaceRef:e,specs:(0,Z.useMemo)(()=>{let e={features:{allOf:rt,anyOf:de,noneOf:fe},filters:ge};return C!==`workspace`&&($a(K)===`directory`?e.directory={tree:K,path:G}:e.context=G),[{label:`scope`,spec:e}]},[ye,G,K,C,nt]),opts:(0,Z.useMemo)(()=>({mode:`live`,debounceMs:150}),[]),enabled:xt}),Ot=xt&&wt,kt=(0,Z.useRef)(!1);(0,Z.useEffect)(()=>{kt.current=Ot},[Ot]);let At=V.length===1?V[0].trim():``;(0,Z.useEffect)(()=>{wt&&Dt(At?{text:At}:null,{limit:B,offset:(z-1)*B}).catch(()=>{})},[wt,At,B,z,Dt]);let jt=(W??[]).join(`,`);(0,Z.useEffect)(()=>{wt&&Tt(`lens`,{ids:W??[]}).catch(()=>{})},[wt,jt,Tt,W]);let Mt=Ot?St:f,Nt=Ot?Ct:g,Pt=(0,Z.useRef)(new Set);(0,Z.useEffect)(()=>{Pt.current=new Set(Mt.map(e=>Number(e.id)))},[Mt]);let Ft=H.geoSelection;(0,Z.useEffect)(()=>{le(Mt,c?.name??null)},[Mt,c?.name,le]),(0,Z.useEffect)(()=>()=>le([]),[le]);let It=(0,Z.useMemo)(()=>Ft?Mt.filter(e=>Fy(e,Ft,H.filters.geo.includeUnlocated)):Mt,[Mt,Ft,H.filters.geo.includeUnlocated]),Lt=Sa(G,rt,{treeName:K,treeType:$a(K),scope:C,queries:V,anyOf:de,noneOf:fe,filters:ge,ids:W,layerId:ke&&Ae?Ae:void 0}),Rt=JSON.stringify([e,Lt]),[zt,Bt]=(0,Z.useState)(``),[Vt,Ht]=(0,Z.useState)(!1),Ut=(0,Z.useRef)(!1),Wt=m||Vt||zt!==Rt||Ot||!!Ft,Gt=(0,Z.useRef)(0),Kt=(0,Z.useRef)(null);(0,Z.useEffect)(()=>()=>{Gt.current++,Kt.current=null},[]);let qt=(0,Z.useRef)(``),Jt=(0,Z.useCallback)(async t=>{if(!e)return;if(ub(K,G)){Gt.current++,Kt.current=null,qt.current=``,p([]),_(0),h(!1);return}if(kt.current)return;let n=`${we&&Ce?`${C}:unfiled`:C}:${nt??``}`,r=(W?.length??0)>0,a=tD(e,K,G,z,B,V.join(`␟`),ye,ke&&Ae?Ae:``,n),o=r&&a===qt.current;qt.current=a;let s=tD(e,K,G,z,B,V.join(`␟`),ve,ke&&Ae?Ae:``,n),c=`${s}\0${v}`;if(t?.silent&&Kt.current?.key===c){Kt.current.refreshPending=!0;return}let l=++Gt.current,u=t?.silent||r||v?void 0:$E.get(s);u&&(p(u.documents),_(u.totalCount),Bt(Rt),h(!1)),(t?.silent??(o||!!u))||h(!0);let d={key:c,refreshPending:!1};Kt.current=d;try{let t;t=we&&Ce?await sa(e,Ce.driver,Ce.address,{linked:!1,limit:B,offset:(z-1)*B}):ke&&Ae&&C!==`workspace`?await ua(e,K,Ae,{limit:B,page:z,queries:V,allOf:rt,anyOf:de,noneOf:fe,filters:ge,ids:W,sortBy:_e.sortBy||void 0,order:_e.order}):await Na(e,G,rt,{limit:B,page:z,treeName:K,treeType:K===`directory`||K===`backends`?`directory`:`context`,queries:V,anyOf:de,noneOf:fe,filters:ge,ids:W,sortBy:_e.sortBy||void 0,order:_e.order,scope:C,debug:v&&V.length>0,debugLimit:200});let n=t.payload||[],i=t.totalCount||t.count||0;if(!r&&!d.refreshPending&&$E.set(s,{documents:n,totalCount:i}),l!==Gt.current)return;let a=t.debug,c=a?.imageDistances??a?.distances??null;b(c?{query:V[V.length-1]??``,distances:c}:null),p(o?e=>e.length===n.length&&e.every((e,t)=>e.id===n[t].id)?e:n:n),_(i),Bt(Rt)}catch(e){if(l!==Gt.current)return;let t=e instanceof Error?e.message:`Failed to fetch documents`;i({title:`Error`,description:t,variant:`destructive`}),p([]),_(0)}finally{Kt.current===d&&(Kt.current=null),l===Gt.current&&h(!1),l===Gt.current&&d.refreshPending&&Jt({silent:!0})}},[e,G,K,Ae,ke,z,B,c?.status,V,ve,C,we,v,nt]);(0,Z.useEffect)(()=>{Jt()},[Jt]),(0,Z.useEffect)(()=>{let t=t=>{let n=t.detail;!n||n.workspaceName!==e||(Pe({treeName:n.treeName||`context`,path:kx(n.path||`/`)}),Le(`left`))};return window.addEventListener(`workspace:open-to-side`,t),()=>window.removeEventListener(`workspace:open-to-side`,t)},[e,K,G]),(0,Z.useEffect)(()=>{let t=t=>{let n=t.detail;if(!(n?.workspaceName&&n.workspaceName!==e)&&(e&&iD(e,n),FE(PE(n),{tree:K,kind:$a(K),path:G,wholeWorkspace:C===`workspace`}))){if(e&&nD(e,K,G),kt.current){Et();return}Jt({silent:!0})}};return window.addEventListener(`workspace:documents:refresh`,t),()=>window.removeEventListener(`workspace:documents:refresh`,t)},[Jt,e,G,K,C,Et]);let Yt=c?.name,Xt=c?.id;(0,Z.useEffect)(()=>{if(!e||!Yt&&!Xt)return;let t=[Yt,Xt].filter(Boolean).map(e=>`workspace:${e}`),n=()=>t.forEach(e=>pd.emit(`subscribe`,{channel:e}));n();let r=pd.on(`connect`,n),i=new Map,a=!1,o=()=>{Ai(e).then(e=>{a||(i=AE(e))}).catch(()=>{})};o();let s=null,c=0,l=!1,u=null,d=()=>{if(s=null,c=Date.now(),u){let{treeName:t,path:n}=u;u=null,window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:e,treeName:t,path:n}}))}if(l){if(l=!1,kt.current){Et();return}Jt({silent:!0})}},f=t=>n=>{(t.startsWith(`tree.created`)||t.startsWith(`tree.renamed`))&&o();let r=jE(t,n,i);rD(e,r);let a={tree:K,kind:$a(K),path:G,wholeWorkspace:C===`workspace`},f=Fe.current;f&&FE(r,{tree:f.treeName,kind:$a(f.treeName),path:f.path})&&(u=f),FE(r,a,Pt.current)&&(l=!0),!(!l&&!u)&&(s||=setTimeout(d,Math.max(200,c+1500-Date.now())))},p=[`document.inserted`,`document.inserted.batch`,`document.updated`,`document.removed`,`document.deleted`,`document.removed.batch`,`document.deleted.batch`,`document.linked`,`document.unlinked`,`document.linked.batch`,`document.unlinked.batch`,`tree.document.inserted`,`tree.document.inserted.batch`,`tree.document.removed`,`tree.document.removed.batch`,`tree.document.deleted`,`tree.document.deleted.batch`,`tree.layer.merged`,`tree.layer.subtracted`,`tree.created`,`tree.renamed`].map(e=>[e,f(e)]);return p.forEach(([e,t])=>pd.on(e,t)),()=>{a=!0,s&&clearTimeout(s),r?.(),p.forEach(([e,t])=>pd.off(e,t))}},[e,Xt,Yt,K,G,C,Jt,Et]);let Zt=`${G}\0${K}\0${Ae??``}\0${C}`,[Qt,$t]=(0,Z.useState)(Zt);Qt!==Zt&&($t(Zt),ne(1),oe(null));let en=`${G}\0${K}\0${Ae??``}`,[tn,nn]=(0,Z.useState)(en);tn!==en&&(nn(en),w(`path`));let rn=(e,t)=>{let n=e===`/`?`canvas`:e.split(`/`).pop()||`canvas`;M(n),A({parentPath:e,captureView:t})},an=o.get(`createCanvas`)===`1`,[on,sn]=(0,Z.useState)(!1);on!==an&&(sn(an),an&&rn(G,!1)),(0,Z.useEffect)(()=>{if(!an)return;let e=new URLSearchParams(n.search);e.delete(`createCanvas`);let t=e.toString();r(`${n.pathname}${t?`?${t}`:``}${n.hash}`,{replace:!0})},[an,G]);let cn=(0,Z.useCallback)(e=>{let t=new URLSearchParams(n.search);t.delete(`q`),t.delete(`search`);for(let n of e)t.append(`q`,n);let i=t.toString();r(`${n.pathname}${i?`?${i}`:``}${n.hash}`)},[n.pathname,n.search,n.hash,r]),ln=JSON.stringify([o.has(`q`),...s]),[un,dn]=(0,Z.useState)(ln);un!==ln&&(dn(ln),ie(s),ne(1));let fn=`${ln}\0${Ke??``}\0${ot}\0${G}\0${ae??``}`,[pn,mn]=(0,Z.useState)(fn);pn!==fn&&(mn(fn),o.has(`q`)||s.length>0||Ke!==`canvas`||ae===G||(ie(ot?[ot]:[]),ne(1)));let hn=(0,Z.useCallback)(e=>{let t=e.trim();t&&(oe(null),ie(e=>{if(e.includes(t))return e;let n=[...e,t];return cn(n),ne(1),n}))},[cn,oe,ie,ne]),gn=(0,Z.useCallback)(e=>{ie(t=>{let n=e<0?[]:t.filter((t,n)=>n!==e);return n.length===0&&oe(G),cn(n),ne(1),n})},[cn,G,oe,ie,ne]),_n=V.join(` `).trim(),vn=!!H.activeContextType&&(H.isDirty||_n!==(Ke===`canvas`?ot:H.savedSearchQuery||``));!e&&je!==null&&Me(null),(0,Z.useEffect)(()=>{let t=!1;if(!e)return;let n=0,r=!1,i=(i=!1)=>{let a=++n;i&&Aa(e,K),Ci(e,K).then(i=>{!t&&a===n&&(r=!0,qe.current=`${e}/${K}`,Me(i))}).catch(()=>{!t&&a===n&&!r&&Me(null)})};i(!1);let a=t=>{let n=t.detail;n?.workspaceName&&n.workspaceName!==e||n?.treeName&&n.treeName!==K||i(!n?.cacheInvalidated)};window.addEventListener(`workspace:tree:refresh`,a);let o=Db(e,Xt);return()=>{t=!0,o(),window.removeEventListener(`workspace:tree:refresh`,a)}},[e,K,Xt]),!(e&&Ke===`canvas`&&!ke)&&R!==null&&te(null),(0,Z.useEffect)(()=>{let t=!1;if(!(!e||Ke!==`canvas`||ke))return ia(e,G,K).then(e=>{t||te(e)}).catch(()=>{t||te(null)}),()=>{t=!0}},[e,G,K,Ke,ke]);let yn=async()=>{if(c){E(!0);try{let t=await la(e||c.id);l(t),i({title:`Success`,description:`Workspace started successfully`}),window.dispatchEvent(new CustomEvent(`workspaces:refresh`))}catch(e){let t=e instanceof Error?e.message:`Failed to start workspace`;i({title:`Error`,description:t,variant:`destructive`})}finally{E(!1)}}},bn=async t=>{if(!c)return;let n=a({title:`Removing…`,description:`Document from "${G}"`});try{await wi(e||c.id,[t],G,[],K,On,{trashIfOrphaned:!0}),nD(e||c.id,K,G),p(e=>e.filter(e=>e.id!==t)),_(e=>Math.max(0,e-1)),n.done({title:`Success`,description:`Document removed from workspace path.`})}catch(e){n.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to remove document`,variant:`destructive`})}},xn=async t=>{if(!c)return;let n=a({title:`Deleting…`,description:`Document from "${G}"`});try{await ci(e||c.id,[t],G,[],K,On),nD(e||c.id,K,G),p(e=>e.filter(e=>e.id!==t)),_(e=>Math.max(0,e-1)),n.done({title:`Success`,description:`Document deleted.`})}catch(e){n.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to delete document`,variant:`destructive`})}},Sn=async t=>{if(!c)return;let n=a({title:`Removing…`,description:`${t.length} document(s) from "${G}"`});try{await wi(e||c.id,t,G,[],K,On,{trashIfOrphaned:!0}),nD(e||c.id,K,G),p(e=>e.filter(e=>!t.includes(e.id))),_(e=>Math.max(0,e-t.length)),n.done({title:`Success`,description:`${t.length} document(s) removed.`})}catch(e){n.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to remove documents`,variant:`destructive`})}},Cn=async t=>{if(!c)return;let n=a({title:`Deleting…`,description:`${t.length} document(s)`});try{await ci(e||c.id,t,G,[],K,On),nD(e||c.id,K,G),p(e=>e.filter(e=>!t.includes(e.id))),_(e=>Math.max(0,e-t.length)),n.done({title:`Success`,description:`${t.length} document(s) deleted.`})}catch(e){n.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to delete documents`,variant:`destructive`})}},wn=async t=>{if(!c)return;let n=a({title:`Destroying…`,description:`Document and its backend copies`});try{let r=await La(e||c.id,[t]);if(r.failed?.length){n.fail({title:`Error`,description:r.failed[0].reason,variant:`destructive`});return}p(e=>e.filter(e=>e.id!==t)),_(e=>Math.max(0,e-1)),n.done({title:`Destroyed`,description:`Document removed from all backends.`})}catch(e){n.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to destroy document`,variant:`destructive`})}},Tn=async t=>{if(!c)return;let n=a({title:`Destroying…`,description:`${t.length} document(s) and their backend copies`});try{let r=await La(e||c.id,t),i=new Set(r.successful?.filter(e=>e.docDeleted).map(e=>e.id)??[]);p(e=>e.filter(e=>!i.has(e.id))),_(e=>Math.max(0,e-i.size));let a=[r.successful?.length?`${r.successful.length} destroyed`:null,r.failed?.length?`${r.failed.length} failed`:null].filter(Boolean).join(`, `);r.failed?.length?n.fail({title:`Destroy incomplete`,description:a,variant:`destructive`}):n.done({title:`Destroyed`,description:a||`No documents destroyed`})}catch(e){n.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to destroy documents`,variant:`destructive`})}},En=e=>{O({documentIds:e,operation:`copy`,sourcePath:G,sourceTreeName:K}),window.dispatchEvent(new CustomEvent(`documents:clipboard`,{detail:{documentIds:e,operation:`copy`}})),i({title:`Copied`,description:`${e.length} document(s) copied to clipboard`})},Dn=e=>{O({documentIds:e,operation:`cut`,sourcePath:G,sourceTreeName:K}),window.dispatchEvent(new CustomEvent(`documents:clipboard`,{detail:{documentIds:e,operation:`cut`}})),i({title:`Cut`,description:`${e.length} document(s) cut to clipboard`})},On=$a(K),kn=async(t,n,r={})=>{if(!e)return!1;let i=r.targetTreeName??K,o=r.targetTreeType??On,s=r.move??D?.operation===`cut`,c=a({title:s?`Moving…`:`Pasting…`,description:`${n.length} document(s) → "${t}"`});try{let a=await Bi(e,t,n,i,o);if(a){nD(e,i,t);let a=r.sourceTreeName||D?.sourceTreeName,o=r.sourcePath||D?.sourcePath;if((r.move??D?.operation===`cut`)&&o&&a){let t=$a(a);await wi(e,n,o,[],a,t),nD(e,a,o),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:e,path:o,treeName:a}}))}c.done({title:`Success`,description:`${n.length} document(s) ${s?`moved`:`pasted`} to "${t}"`}),O(null),window.dispatchEvent(new CustomEvent(`documents:clipboard`,{detail:null}));let l=performance.now();await Jt(),console.info(`[paste] list refresh ${Math.round(performance.now()-l)} ms`),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:e,path:t,treeName:i}}))}else c.done();return a}catch(e){return c.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to paste documents`,variant:`destructive`}),!1}},An=async(t,n)=>{if(!e)return!1;try{let r=(await ho(e,n,t,K,On)).length>0;return r&&(Eb(e,K,n),i({title:`Success`,description:`Imported ${t.length} document(s) to "${n}"`})),r}catch(e){return i({title:`Error`,description:e instanceof Error?e.message:`Failed to import documents`,variant:`destructive`}),!1}},jn=async()=>{if(!c||Nt===0||Wt||Ut.current||window.prompt(`Type PURGE to permanently delete all ${Nt} matching documents across all pages.`)!==`PURGE`)return;Ut.current=!0,Ht(!0);let t=a({title:`Purging…`,description:`${Nt} matching document(s)`});try{let n=await ti(e||c.id,Lt,Nt);n.deleted===n.requested?t.done({title:`Success`,description:`${n.deleted} document(s) purged.`}):t.fail({title:`Purge incomplete`,description:`${n.deleted} of ${n.requested} document(s) purged. Refresh and review the remaining results before retrying.`})}catch(e){t.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to purge documents`,variant:`destructive`})}finally{nD(e||c.id,K,G),await Jt({silent:!0}),Ut.current=!1,Ht(!1)}},Mn=()=>rn(G,!0),Nn=async()=>{if(!(!e||!k||!j.trim())){P(!0);try{let t=j.trim(),n=k.parentPath,i=n===`/`?`/${t}`:`${n}/${t}`,a={...H.filters,features:{...H.filters.features,allOf:rt}};await xo(e,i,K,k.captureView?{metadata:{toolbox:a},querySpec:{features:a.features,filters:[...Jy(H.filters.timeline),...Gy(H.filters.geo)],query:_n||void 0,sort:H.filters.sort?.sortBy?H.filters.sort:null}}:{}),A(null),Aa(e,K);try{let t=await Ci(e,K,{force:!0});Me(t)}catch{}window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:e}})),r(Mx(e,i,K))}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to create canvas`,variant:`destructive`})}finally{P(!1)}}},Pn=async()=>{if(!(!e||Ke!==`canvas`)){F(!0);try{let t=R||await wo(e,G,K);te(t);let n=`${window.location.origin}${t.url}`;await navigator.clipboard?.writeText(n),i({title:`Public canvas link copied`,description:n})}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to share canvas`,variant:`destructive`})}finally{F(!1)}}},Fn=async()=>{if(R){F(!0);try{await ni(R.code),te(null),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:e,treeName:K}})),i({title:`Canvas unshared`,description:`The public link no longer works.`})}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to unshare canvas`,variant:`destructive`})}finally{F(!1)}}},In=async()=>{if(!e||Ke!==`canvas`||G===`/`)return;let t=st?.label||G.split(`/`).pop()||`canvas`,n=R?` Its public link will stop working.`:``;if(window.confirm(`Delete canvas "${t}"? This cannot be undone.${n}`)){L(!0);try{if(R)await ni(R.code),te(null);else if(Ge?.locked){i({title:`Canvas is locked`,description:`Unlock it before deleting.`,variant:`destructive`});return}await no(e,G,!1,K);let n=G.split(`/`).filter(Boolean);n.pop();let a=n.length?`/${n.join(`/`)}`:`/`;window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:e,treeName:K}})),r(Mx(e,a,K)),i({title:`Canvas deleted`,description:`"${t}" was removed.`})}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to delete canvas`,variant:`destructive`})}finally{L(!1)}}},Ln=(0,Z.useCallback)(async t=>{if(!e||!Ne)return;let n={treeName:K,path:G},r=Ie===`left`?n:Ne,o=Ie===`left`?Ne:n,s=Ie===`left`?Re:Ue;if(s.length===0){i({title:`Nothing selected`,description:`Tick documents in the focused pane first.`});return}let c=$a(o.treeName),l=a({title:t?`Moving…`:`Copying…`,description:`${s.length} document(s) → "${o.path}"`});try{if(!await Bi(e,o.path,s,o.treeName,c)){l.done();return}if(nD(e,o.treeName,o.path),t){let t=$a(r.treeName);await wi(e,s,r.path,[],r.treeName,t),nD(e,r.treeName,r.path)}[r,o].forEach(t=>window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:e,path:t.path,treeName:t.treeName}}))),l.done({title:t?`Moved`:`Copied`,description:`${s.length} document(s) → "${o.path}"`})}catch(e){l.fail({title:`Error`,description:e instanceof Error?e.message:`Transfer failed`,variant:`destructive`})}},[e,Ne,Ie,K,G,Re,Ue,i,a]);if((0,Z.useEffect)(()=>{if(!Ne)return;let e=e=>{if(e.key!==`F5`&&e.key!==`F6`)return;let t=e.target;t.tagName!==`INPUT`&&t.tagName!==`TEXTAREA`&&(e.preventDefault(),Ln(e.key===`F6`))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[Ne,Ln]),u)return(0,Q.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,Q.jsxs)(`div`,{className:`text-center space-y-2`,children:[(0,Q.jsx)(`div`,{className:`animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading workspace...`})]})});if(!c)return(0,Q.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:`Workspace not found.`});let Rn=Ke===`canvas`&&!ke&&!!Ge,zn=!Rn&&!be&&Ye?(0,Q.jsx)(yE,{views:$e,activeId:et,onSelect:it,onSave:at,accentColor:Cm(c.color),onOpenToSide:e=>{Pe({treeName:K,path:G,viewId:e}),Le(`right`)}}):void 0,Bn=Ce||c.status!==`active`?(0,Q.jsxs)(Q.Fragment,{children:[Ce&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>{Te(!we),ne(1)},"aria-pressed":we,className:q(`min-h-10 rounded-md border px-2 text-xs`,we&&`bg-warning/15 text-warning`),children:`Unfiled only`}),c.status!==`active`&&(0,Q.jsx)(`button`,{type:`button`,onClick:yn,disabled:T,className:`min-h-10 rounded-md border px-2 text-xs`,children:T?`Starting…`:`Start`})]}):void 0,Vn=ub(K,G)?G===`/Trash`?(0,Q.jsx)(`div`,{className:`h-full overflow-auto p-4`,children:(0,Q.jsx)(cE,{workspaceName:e||c.id})}):(0,Q.jsx)(iE,{workspace:e||c.id,path:G,onNavigate:t=>r(Mx(e,t,`backends`))},e):(0,Q.jsx)(fE,{navigationTabs:zn,navigationActions:Bn,onBack:He,accentColor:Cm(c.color),urlType:ke?$a(K)===`directory`?`${K}-layer`:`context-layer`:Ke===`canvas`?`canvas`:$a(K)===`directory`?K:`context`,urlDisplay:vt,contextPath:G,treeName:K,workspaceId:e||c.id,workspaceLabel:c.label||c.name,workspaceIcon:c.icon,documentSchema:nt,documents:It,isLoading:m,totalCount:Nt,currentPage:z,pageSize:B,onPageChange:ne,onPageSizeChange:e=>{re(e),ne(1)},onRemoveDocument:G===`/`?void 0:bn,onDeleteDocument:xn,onDestroyDocument:wn,onRemoveDocuments:G===`/`?void 0:Sn,onDeleteDocuments:Cn,onDestroyDocuments:Tn,onCopyDocuments:En,onCutDocuments:Dn,onPasteDocuments:be?void 0:kn,onImportDocuments:be?void 0:An,onSelectionChange:ze,onBrowseTree:()=>Ve(`workspaces`,`detail`,e??null),onBrowseWorkspaces:()=>Be(`workspaces`),onNavigatePath:t=>r(Mx(e,t,K)),folders:Je,onOpenFolder:t=>r(Mx(e,kx(t),K)),scope:C,onScopeChange:w,pastedDocumentIds:D?.documentIds,linkTree:je,onPurgeDocuments:be?void 0:jn,disablePurgeDocuments:Wt,canvasInfo:st??void 0,isCanvasPinned:mt,onTogglePinCanvas:pt?_t:void 0,onSaveAsCanvas:je&&Ke!==`canvas`&&!ke&&!be?Mn:void 0,onShareCanvas:Ke===`canvas`&&!ke?Pn:void 0,onUnshareCanvas:R?Fn:void 0,onDeleteCanvas:Ke===`canvas`&&!ke?In:void 0,isSharingCanvas:ee,isDeletingCanvas:I,isCanvasShared:!!R,isCanvasLocked:!!Ge?.locked,backendSearchQueries:V,onBackendSearch:hn,serverSort:H.filters.sort,onServerSortChange:ce,onRemoveBackendQuery:gn,canSaveChanges:vn,isSavingChanges:H.isSaving,onSaveChanges:se,contentBanner:v&&y?(0,Q.jsx)(ZE,{data:y,className:`mb-3`}):null,children:Rn&&Ge?(0,Q.jsx)(tS,{workspaceId:e||c.id,treeName:K,path:G,layerId:Ge.id,querySpec:Ge.querySpec,metadata:Ge.metadata,isLocked:!!Ge.locked,fetchDocuments:H.isDirty?bt:void 0}):!be&&tt.kind===`columns`?(0,Q.jsx)(TE,{documents:It,workspaceId:e||c.id,columns:tt.columns??[],onColumnsChange:e=>at($e.map(t=>t.id===tt.id?{...t,columns:e}:t))}):!be&&tt.kind===`app`&&tt.app&&tt.app!==`notes`?(0,Q.jsx)(SE,{app:tt.app,workspaceId:e||c.id,treeName:K,path:G}):null});return(0,Q.jsxs)(`div`,{className:`relative flex flex-col h-full min-h-0`,children:[(0,Q.jsx)(dE,{workspaceId:c.id,workspaceName:c.label||c.name},c.id),ub(K,G)&&(0,Q.jsx)(Vg,{workspace:c.label||c.name,workspaceIcon:c.icon,tree:K,path:G,onBack:He,onBrowseTree:()=>Ve(`workspaces`,`detail`,e||c.id),onBrowseWorkspaces:()=>Be(`workspaces`),onNavigatePath:t=>r(Mx(e,t,K)),accentColor:Cm(c.color)}),k&&(0,Q.jsx)(`div`,{className:`shrink-0 px-2 pt-2`,children:(0,Q.jsx)(Xw,{title:`New canvas`,onClose:()=>A(null),children:(0,Q.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),Nn()},className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`canvas-name`,className:`mb-1 block text-sm font-medium`,children:`Name`}),(0,Q.jsx)(`input`,{id:`canvas-name`,className:`w-full rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary`,placeholder:`Canvas name…`,value:j,onChange:e=>M(e.target.value),onKeyDown:e=>{e.key===`Escape`&&A(null)},autoFocus:!0})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`mb-1 block text-sm font-medium`,children:`Parent path`}),(0,Q.jsx)(`div`,{className:`flex h-10 items-center rounded-md bg-muted px-3 font-mono text-sm text-muted-foreground`,children:k.parentPath===`/`?`/`:k.parentPath})]})]}),(0,Q.jsxs)(`label`,{className:`flex items-start gap-2 text-sm`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,className:`mt-0.5`,checked:k.captureView,onChange:e=>A({...k,captureView:e.target.checked})}),(0,Q.jsxs)(`span`,{children:[`Capture the current view`,(0,Q.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:`Freezes the active filters, search and sort into the canvas.`})]})]}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(X,{type:`submit`,disabled:!j.trim()||N,children:N?`Creating…`:`Create canvas`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,onClick:()=>A(null),children:`Cancel`})]})]})})}),(0,Q.jsxs)(`div`,{"data-canvas-panes":!0,className:`flex-1 min-h-0 flex gap-2`,children:[(0,Q.jsx)(`div`,{"data-canvas-pane":!0,className:q(`flex-1 min-w-0 bg-background overflow-hidden`,Ne&&(Ie===`left`?`ring-2 ring-primary`:`ring-1 ring-primary/20`)),onMouseDown:e=>{e.target.closest(`button,input,textarea,select,a`)||Le(`left`)},children:Vn}),Ne&&e&&(0,Q.jsx)(cD,{workspaceName:e,workspaceLabel:c.label||c.name,workspaceIcon:c.icon,pane:Ne,isFocused:Ie===`right`,clipboard:D,setClipboard:O,onFocus:()=>Le(`right`),onSelectionChange:We,onNavigate:e=>Pe(t=>t&&{...t,path:e,viewId:void 0}),onClose:()=>{Pe(null),Le(`left`),We([])}})]})]})}function sD(e,t){if(!e||t===`/`)return e;let n=e;for(let e of t.split(`/`).filter(Boolean))if(n=n?.children?.find(t=>t.name===e)??null,!n)return null;return n}function cD({workspaceName:e,workspaceLabel:t,workspaceIcon:n,pane:r,isFocused:i=!1,clipboard:a,setClipboard:o,onFocus:s,onSelectionChange:c,onNavigate:l,onClose:u}){let{openM1Drawer:d,openM2Drawer:f}=jT(),{showToast:p,showProgress:m}=Hr(),[h,g]=(0,Z.useState)(null),[_,v]=(0,Z.useState)([]),[y,b]=(0,Z.useState)(!1),[x,S]=(0,Z.useState)(0),[C,w]=(0,Z.useState)(1),[T,E]=(0,Z.useState)(50),D=$a(r.treeName),O=sD(h,r.path),k=O?.type===`canvas`,A=(0,Z.useMemo)(()=>D===`directory`?QE(h,r.path):[],[h,r.path,D]),j=r.viewId?_E(O?.metadata).find(e=>e.id===r.viewId)??null:null,M=`${e}://${r.path===`/`?``:r.path.replace(/^\//,``)}`,N=mE(j),P=(0,Z.useCallback)(async()=>{if(ub(r.treeName,r.path)){v([]),S(0),b(!1);return}let t=tD(e,r.treeName,r.path,C,T,``,N??``),n=$E.get(t);if(n){v(n.documents),S(n.totalCount);return}b(!0);try{let n=await Na(e,r.path,N?[N]:[],{limit:T,page:C,treeName:r.treeName,treeType:D}),i=n.payload||[],a=n.totalCount||n.count||0;v(i),S(a),$E.set(t,{documents:i,totalCount:a})}catch(e){p({title:`Error`,description:e instanceof Error?e.message:`Failed to fetch side pane documents`,variant:`destructive`}),v([]),S(0)}finally{b(!1)}},[e,r.path,r.treeName,D,T,C,p,N]);(0,Z.useEffect)(()=>{let t=!1,n=0,i=!1,a=(a=!1)=>{let o=++n;a&&Aa(e,r.treeName),Ci(e,r.treeName).then(e=>{!t&&o===n&&(i=!0,g(e))}).catch(()=>{!t&&o===n&&!i&&g(null)})};a(!1);let o=t=>{let n=t.detail;n?.workspaceName&&n.workspaceName!==e||n?.treeName&&n.treeName!==r.treeName||a(!n?.cacheInvalidated)};return window.addEventListener(`workspace:tree:refresh`,o),()=>{t=!0,window.removeEventListener(`workspace:tree:refresh`,o)}},[e,r.treeName]),(0,Z.useEffect)(()=>{P()},[P]),(0,Z.useEffect)(()=>{let t=t=>{let n=t.detail;n?.workspaceName&&n.workspaceName!==e||(iD(e,n),FE(PE(n),{tree:r.treeName,kind:$a(r.treeName),path:r.path})&&(nD(e,r.treeName,r.path),P()))};return window.addEventListener(`workspace:documents:refresh`,t),()=>window.removeEventListener(`workspace:documents:refresh`,t)},[P,e,r.treeName,r.path]);let ee=(0,Z.useCallback)(async(t,n,i={})=>{let s=i.targetTreeName??r.treeName,c=i.targetTreeType??D,l=i.move??a?.operation===`cut`,u=m({title:l?`Moving…`:`Pasting…`,description:`${n.length} document(s) → "${t}"`});try{let r=await Bi(e,t,n,s,c);if(r){nD(e,s,t);let r=i.sourcePath||a?.sourcePath,c=i.sourceTreeName||a?.sourceTreeName;if((i.move??a?.operation===`cut`)&&r&&c){let t=$a(c);await wi(e,n,r,[],c,t),nD(e,c,r),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:e,path:r,treeName:c}}))}u.done({title:`Success`,description:`${n.length} document(s) ${l?`moved`:`pasted`} to "${t}"`}),o(null),await P(),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:e,path:t,treeName:s}}))}else u.done();return r}catch(e){return u.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to paste documents`,variant:`destructive`}),!1}},[e,r.treeName,D,P,m,a,o]),F=(0,Z.useCallback)(()=>{nD(e,r.treeName,r.path),P()},[e,r.treeName,r.path,P]),I=(0,Z.useCallback)(async t=>{let n=m({title:`Removing…`,description:`${t.length} document(s) from "${r.path}"`});try{await wi(e,t,r.path,[],r.treeName,D),F(),n.done({title:`Removed`,description:`${t.length} document(s) removed from "${r.path}"`})}catch(e){n.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to remove documents`,variant:`destructive`})}},[e,r.path,r.treeName,D,F,m]),L=(0,Z.useCallback)(async t=>{let n=m({title:`Deleting…`,description:`${t.length} document(s)`});try{await ci(e,t,r.path,[],r.treeName,D),F(),n.done({title:`Deleted`,description:`${t.length} document(s) deleted.`})}catch(e){n.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to delete documents`,variant:`destructive`})}},[e,r.path,r.treeName,D,F,m]),R=(0,Z.useCallback)(async t=>{let n=m({title:`Destroying…`,description:`${t.length} document(s) and their backend copies`});try{let r=await La(e,t);if(r.failed?.length&&!r.successful?.length){n.fail({title:`Error`,description:r.failed[0].reason,variant:`destructive`});return}F();let i=`${r.successful?.length??0} document(s) destroyed${r.failed?.length?` · ${r.failed.length} failed`:``}.`;r.failed?.length?n.fail({title:`Destroy incomplete`,description:i,variant:`destructive`}):n.done({title:`Destroyed`,description:i})}catch(e){n.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to destroy documents`,variant:`destructive`})}},[e,F,m]);return(0,Q.jsxs)(`div`,{className:q(`relative flex-1 min-w-0 rounded-(--sheet-radius) border bg-background overflow-hidden`,i?`ring-2 ring-primary`:`ring-1 ring-primary/20`),onMouseDown:e=>{e.target.closest(`button,input,textarea,select,a`)||s()},children:[u&&(0,Q.jsx)(`button`,{type:`button`,onClick:u,className:`absolute right-2 top-2 z-10 px-2 py-1 text-xs rounded-md border bg-background/90 hover:bg-accent`,children:`Close`}),ub(r.treeName,r.path)?r.path===`/Trash`?(0,Q.jsx)(`div`,{className:`h-full overflow-auto p-4`,children:(0,Q.jsx)(cE,{workspaceName:e})}):(0,Q.jsx)(iE,{workspace:e,path:r.path,onNavigate:l||(()=>{})}):(0,Q.jsx)(fE,{frameContent:!1,onBrowseWorkspaces:()=>d(`workspaces`),onBrowseTree:()=>f(`workspaces`,`detail`,e),urlType:k?`canvas`:D===`directory`?r.treeName:`context`,urlDisplay:M,contextPath:r.path,treeName:r.treeName,workspaceId:e,workspaceLabel:t,workspaceIcon:n,documentSchema:N,documents:_,isLoading:y,totalCount:x,currentPage:C,pageSize:T,onPageChange:w,onPageSizeChange:e=>{E(e),w(1)},onRemoveDocument:r.path===`/`?void 0:e=>I([e]),onRemoveDocuments:r.path===`/`?void 0:I,onDeleteDocument:e=>L([e]),onDeleteDocuments:L,onDestroyDocument:e=>R([e]),onDestroyDocuments:R,onCopyDocuments:e=>{o({documentIds:e,operation:`copy`,sourcePath:r.path,sourceTreeName:r.treeName}),window.dispatchEvent(new CustomEvent(`documents:clipboard`,{detail:{documentIds:e,operation:`copy`}}))},onCutDocuments:e=>{o({documentIds:e,operation:`cut`,sourcePath:r.path,sourceTreeName:r.treeName}),window.dispatchEvent(new CustomEvent(`documents:clipboard`,{detail:{documentIds:e,operation:`cut`}}))},onPasteDocuments:r.treeName===`backends`?void 0:ee,onSelectionChange:c,pastedDocumentIds:a?.documentIds,linkTree:h,folders:A,onOpenFolder:l,onNavigatePath:l,canvasInfo:k?{label:O?.label,description:O?.description,color:O?.color}:void 0,children:j?.kind===`columns`?(0,Q.jsx)(TE,{documents:_,workspaceId:e,columns:j.columns??[],onColumnsChange:()=>{},readOnly:!0}):j?.kind===`app`&&j.app&&j.app!==`notes`?(0,Q.jsx)(SE,{app:j.app,workspaceId:e,treeName:r.treeName,path:r.path}):null})]})}function lD(e){let[t,n]=(0,Z.useState)(null);return(0,Z.useEffect)(()=>{if(!e)return;let t=!1,r=()=>{Jr(e).then(r=>{t||n({ref:e,workspace:r})}).catch(()=>{})};return r(),window.addEventListener(`workspaces:refresh`,r),()=>{t=!0,window.removeEventListener(`workspaces:refresh`,r)}},[e]),t?.ref===e?t?.workspace:void 0}function uD(){let{workspaceName:e}=yl();return e?(0,Q.jsx)(uE,{workspaceName:e,children:(0,Q.jsx)(dD,{})}):(0,Q.jsx)(`p`,{role:`alert`,className:`p-6`,children:`Workspace not specified.`})}function dD(){let{workspaceName:e=``,documentId:t=``,algo:n=``,checksum:r=``}=yl(),i=hl(),a=fl(),{goBack:o,openM1Drawer:s,openM2Drawer:c}=jT(),l=lD(e),u=!!n&&!!r,d=u?`${n}/${r}`:t,f=JSON.stringify([e,t,n,r]),p=Number(t),m=/^\d+$/.test(t)&&Number.isSafeInteger(p)&&p>0,h=u||m,[g,_]=(0,Z.useState)(0),[v,y]=(0,Z.useState)(null),b=v?.identity===f?v:null,x=h&&(!b||b.revision!==g);(0,Z.useEffect)(()=>{let t=!1;if(h)return(u?ao(e,n,r):Ja(e,p)).then(e=>{t||y({identity:f,revision:g,document:e||null,missing:!e,error:``})}).catch(e=>{t||y({identity:f,revision:g,document:null,missing:e?.statusCode===404,error:e instanceof Error?e.message:`Unable to retrieve this document.`})}),()=>{t=!0}},[e,p,f,g,h,u,n,r]);let S={workspace:l?.label||e,workspaceIcon:l?.icon,path:`/`,tree:`context`,document:b?.document?Ni(b.document).title:`Document ${d}`,onBack:o,onBrowseWorkspaces:()=>s(`workspaces`),onBrowseTree:()=>c(`workspaces`,`detail`,e),onNavigatePath:t=>i(Mx(e,t,`context`))},C=a.hash.slice(1),w=[`view`,`location`,`metadata`,`json`,`synapses`,`backends`].includes(C)?C:`view`;return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[!b?.document&&(0,Q.jsx)(Vg,{...S}),b?.document?(0,Q.jsx)(Ry,{document:b.document,workspaceId:e,onChanged:()=>_(e=>e+1),navigation:S,initialTab:w,onTabChange:e=>i(`${a.pathname}${a.search}#${e}`,{replace:!0}),tabActions:(0,Q.jsx)(X,{variant:`ghost`,disabled:x,onClick:()=>_(e=>e+1),children:`Refresh`})},f):x?(0,Q.jsx)(`p`,{role:`status`,className:`p-6 text-sm text-muted-foreground`,children:`Loading document…`}):(0,Q.jsxs)(`div`,{role:`alert`,className:`space-y-2 p-6 text-sm`,children:[(0,Q.jsx)(`p`,{className:`font-medium`,children:b?.missing?`Document ${d} not found`:`Unable to load document`}),h&&(0,Q.jsx)(X,{variant:`outline`,onClick:()=>_(e=>e+1),children:`Retry`}),(0,Q.jsx)(`p`,{className:`text-muted-foreground`,children:h?b?.missing?`This record is no longer available in this workspace. Subtree exports skip missing records and report their IDs.`:b?.error:`Document ID must be a positive integer.`})]})]})}function fD(e){let t=new URLSearchParams;return e?.mode===`context`&&t.set(`context`,e.contextId),e?.mode===`workspace`&&(t.set(`workspace`,e.workspaceName),t.set(`path`,e.path),t.set(`tree`,e.treeName)),t}var pD={id:`sketch`,label:`Sketch`,icon:ue,schemas:[ki],canCreate:!0,canEdit:e=>e.schema===ki,createUrl(e){let t=fD(e);return t.set(`add`,`1`),`/apps/sketch?${t.toString()}`},editUrl(e,t){let n=fD(t);return n.set(`doc`,String(e.id)),`/apps/sketch?${n.toString()}`}},mD=[{kind:`message`,label:`New Message`,icon:b},{kind:`note`,label:`Note`,icon:qn},{kind:`link`,label:`Link`,icon:vn},{kind:`todo`,label:`Todo`,icon:Ht},{kind:`identity`,label:`Identity`,icon:Ge},{kind:`sketch`,label:`Sketch`,icon:ue},{kind:`plaintext`,label:`Plaintext file`,icon:rn},{kind:`file`,label:`File`,icon:$e},{kind:`photo`,label:`Photo/Video`,icon:qe},{kind:`existing`,label:`Existing document`,icon:Dn},{kind:`folder`,label:`Folder`,icon:ct}];function hD(){return typeof navigator<`u`&&navigator.mediaDevices?.getUserMedia?mD:mD.filter(e=>e.kind!==`photo`)}function gD({onSelect:e,variant:t=`list`,omit:n}){let r=hD().filter(e=>!n?.includes(e.kind));return t===`stack`?(0,Q.jsx)(Q.Fragment,{children:r.map(({kind:t,label:n,icon:r})=>(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>e(t),className:`flex items-center gap-2 rounded-full bg-card px-3 py-1.5 text-sm font-medium shadow-elevation-3 transition-transform hover:scale-105`,children:[n,(0,Q.jsx)(r,{className:`h-3.5 w-3.5`})]},t))}):(0,Q.jsx)(`div`,{className:`p-2`,children:r.map(({kind:t,label:n,icon:r})=>(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>e(t),className:`flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-medium text-foreground transition-colors hover:bg-muted`,children:[(0,Q.jsx)(r,{className:`h-4 w-4 text-muted-foreground`}),n]},t))})}function _D(e){if(e.manual){let t=`${e.manual.lat.toFixed(5)}, ${e.manual.lon.toFixed(5)}`;return e.manualLabel?`${e.manualLabel} · ${t}`:`Custom pin · ${t}`}if(!e.supported)return`Needs a secure (https) connection, or pick a point on the map`;if(e.permission===`denied`)return`Blocked. Allow location for this site, or pick a point on the map`;if(e.error)return e.error;if(e.busy)return`Getting your location…`;if(e.enabled&&e.fix){let{lat:t,lon:n,accuracy:r}=e.fix;return`${t.toFixed(5)}, ${n.toFixed(5)}${r==null?``:` · ±${r} m`}`}return e.enabled?`Location will be attached when you save`:`Attach where you are, or pick any point on the map`}function vD({geotag:e,idPrefix:t=`geotag`}){let[n,r]=(0,Z.useState)(!1),i=!e.supported||e.permission===`denied`,a=!e.manual&&(!e.supported||e.permission===`denied`||!!e.error);return(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,Q.jsxs)(`div`,{role:`switch`,"aria-checked":e.enabled,"aria-disabled":i,"aria-label":`Geotag this document`,"aria-describedby":`${t}-hint`,tabIndex:i?-1:0,onClick:()=>!i&&e.setEnabled(!e.enabled),onKeyDown:t=>{i||(t.key===` `||t.key===`Enter`)&&(t.preventDefault(),e.setEnabled(!e.enabled))},className:q(`flex flex-1 items-center justify-between gap-3 select-none outline-none rounded focus-visible:ring-2 focus-visible:ring-ring`,i?`cursor-not-allowed opacity-50`:`cursor-pointer`),children:[(0,Q.jsxs)(`span`,{className:`flex items-center gap-2 text-sm text-foreground`,children:[e.busy?(0,Q.jsx)(Xn,{className:`h-4 w-4 shrink-0 animate-spin text-muted-foreground`}):(0,Q.jsx)(nn,{className:q(`h-4 w-4 shrink-0`,e.enabled?`text-info`:`text-muted-foreground`)}),`Geotag`]}),(0,Q.jsx)(`div`,{className:q(`relative h-5 w-10 shrink-0 rounded-full transition-colors`,e.enabled?`bg-info`:`bg-muted-foreground/30`),children:(0,Q.jsx)(`div`,{className:q(`absolute top-[2px] h-4 w-4 rounded-full bg-background shadow-elevation-1 transition-transform`,e.enabled?`translate-x-[22px]`:`translate-x-[2px]`)})})]}),(0,Q.jsxs)(`span`,{className:`flex shrink-0 items-center gap-1`,children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>r(!0),title:`Pick a point on the map`,className:`inline-flex items-center gap-1.5 rounded-md border border-border px-2 py-1 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,children:[(0,Q.jsx)(Rn,{className:`h-3.5 w-3.5`}),e.manual?`Change pin`:`Pick on map`]}),e.manual&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>e.setManual(null),"aria-label":`Remove custom pin`,title:`Remove custom pin`,className:`rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground`,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]})]}),(0,Q.jsx)(`p`,{id:`${t}-hint`,className:q(`text-xs`,a?`text-warning`:`text-muted-foreground`),children:_D(e)}),n&&(0,Q.jsx)(tg,{initial:e.manual??e.fix??null,onPick:t=>e.setManual(t),onClose:()=>r(!1)})]})}function yD(e){let t=`/workspaces/${encodeURIComponent(e.workspaceName)}`,n=e.path.replace(/^\/+/,``).split(`/`).map(encodeURIComponent).join(`/`);return e.treeName===`context`?`${t}/path/${n}`:`${t}/trees/${encodeURIComponent(e.treeName)}/path/${n}`}function bD({title:e,icon:t,onClose:n,onSave:r,navigateAfterSave:i=!1,canSave:a=!1,saving:o=!1,saveProgress:s,successMessage:c=`Saved`,lockedWorkspaceName:l,fillParent:u=!1,fullWidthContent:d=!1,relationSubjectId:f,frame:p,children:m,maximized:h,onMaximizedChange:g}){let _=hl(),[v,y]=(0,Z.useState)(`portrait`),[b,x]=(0,Z.useState)(!1),S=h??b,C=e=>{x(e),g?.(e)},[w,T]=(0,Z.useState)(!1),[E,D]=(0,Z.useState)(!1),[O,k]=(0,Z.useState)(!1),A=o||O;Np(()=>T(!1),w&&!A),Np(()=>C(!1),S&&!w);let M=(0,Z.useRef)(null),N=$g(),{showSuccessToast:P,showErrorToast:ee}=Gr(),F=N&&!u&&!S,[I,L]=(0,Z.useState)(!1),R=!u&&!S&&!p&&!I;(0,Z.useEffect)(()=>{w&&M.current?.scrollIntoView({behavior:`smooth`,inline:`end`,block:`nearest`})},[w]);let te=async(e,t)=>{if(!(!r||A)){k(!0);try{let a=await r({...t,path:e[0]}),o=e.slice(1);a.length&&o.length&&await Promise.all(o.map(e=>Bi(t.workspaceName,e,a,t.treeName,t.treeType))),P(c),n(),i&&_(yD({...t,path:e[0]}),{replace:!0})}catch(e){ee(e instanceof Error?e.message:`Failed to save`)}finally{k(!1)}}},z=async e=>{if(!(!f||!l||e.targetIds.length===0)){D(!0);try{await go(l,f,e.predicate,e.targetIds,e.direction),P(`Created ${e.targetIds.length} relation${e.targetIds.length===1?``:`s`}`),Og(),T(!1)}catch(e){ee(e instanceof Error?e.message:`Failed to create relations`)}finally{D(!1)}}},ne=S?w?{flex:`1 1 auto`,minWidth:0,height:`100%`}:{width:`100%`,height:`100%`}:u?{height:`100%`,flexShrink:0}:F?void 0:v===`portrait`?{aspectRatio:`0.707 / 1`,height:`calc(var(--viewport-h) * 0.85)`,width:`auto`,maxWidth:`min(90vw, 100%)`,flexShrink:0}:{aspectRatio:`1 / 0.707`,width:`min(90vw, 900px)`,maxWidth:`100%`,height:`auto`,maxHeight:`calc(var(--viewport-h) * 0.85)`,flexShrink:0},B=!!(f&&l),re=r&&w&&(0,Q.jsx)(Jm,{onClose:()=>T(!1),onConfirm:te,fixedWorkspaceName:l,saving:A||E,savingContent:s,tabs:B?[`context`,`directory`,`relations`]:[`context`,`directory`],onConfirmRelation:B?z:void 0,relationWorkspaceName:l,relationExcludeIds:B?new Set([f]):void 0,sizeClassName:p?`h-full max-h-full w-full min-w-0 rounded-none border-0 shadow-none`:u?`h-full max-h-full w-[min(380px,90vw)] max-md:h-full max-md:w-full max-md:shadow-elevation-5`:void 0}),V=(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1`,children:[!u&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>y(e=>e===`portrait`?`landscape`:`portrait`),className:`rounded p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground max-md:hidden touch-target`,"aria-label":`Toggle orientation`,title:`Toggle orientation`,children:(0,Q.jsx)(j,{className:`h-4 w-4`})}),r&&(typeof m==`function`?(0,Q.jsx)(`button`,{type:`button`,onClick:()=>T(!0),disabled:!a||A,className:`flex h-8 w-8 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-40 touch-target`,"aria-label":A?`Saving…`:`Add relations / Link to…`,title:`Add relations / Link to…`,children:(0,Q.jsx)(Qt,{className:`h-4 w-4`})}):(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>T(!0),disabled:!a||A,children:A?`Saving…`:`Save / Link to…`})),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>p&&!S?p.onToggleExpanded():C(!S),className:q(`rounded p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,typeof m==`function`&&`flex h-8 w-8 items-center justify-center`,!S&&!p&&`max-md:hidden`),"aria-label":p&&!S?p.expanded?`Card size`:`Expand to full width`:S?`Restore`:`Maximize`,title:p&&!S?p.expanded?`Card size`:`Expand to full width`:S?`Restore`:`Maximize`,children:S||p?.expanded?(0,Q.jsx)(ut,{className:`h-4 w-4`}):(0,Q.jsx)(Sn,{className:`h-4 w-4`})}),(0,Q.jsx)(`button`,{type:`button`,onClick:n,disabled:A,className:q(`rounded p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-40 touch-target`,typeof m==`function`&&`flex h-8 w-8 items-center justify-center`),"aria-label":`Close`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),ie=(0,Q.jsxs)(`div`,{style:{...p&&!S?{width:`100%`,height:`100%`,minWidth:0}:ne,"--document-reading-width":S&&!d?`48rem`:`100%`},onAnimationEnd:e=>{R&&e.target===e.currentTarget&&L(!0)},className:q(`flex flex-col overflow-hidden`,p&&!S?`strip-document-card`:`rounded-(--card-radius) border bg-card shadow-elevation-4 transition-[width,height]`,u&&!S&&!p&&`w-full`,F&&`fixed inset-2 z-40 shadow-elevation-5`,R&&`animate-card-in`),children:[typeof m!=`function`&&(0,Q.jsxs)(`div`,{className:`flex h-12 shrink-0 items-center justify-between gap-2 border-b px-4`,children:[(0,Q.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2 truncate text-sm font-medium`,children:[(0,Q.jsx)(t,{className:`h-4 w-4 shrink-0`}),(0,Q.jsx)(`span`,{className:`truncate`,children:e})]}),V]}),(0,Q.jsx)(kg.Provider,{value:()=>C(!S),children:(0,Q.jsx)(`div`,{className:q(`min-h-0 flex-1 overflow-y-auto`,S&&!d&&typeof m!=`function`&&`mx-auto w-full max-w-3xl`),children:p&&re?re:typeof m==`function`?m(V):m})})]});return S?(0,Pp.createPortal)((0,Q.jsxs)(`div`,{className:`fixed inset-0 z-picker flex items-center justify-center gap-4 bg-scrim p-4 max-md:p-2`,children:[ie,re&&(0,Q.jsx)(`div`,{className:`flex max-md:absolute max-md:inset-2 max-md:z-10`,children:re})]}),document.body):(0,Q.jsxs)(Q.Fragment,{children:[ie,!p&&re&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`fixed inset-0 z-card bg-scrim animate-fade-in md:hidden`,onClick:()=>!A&&T(!1),"aria-hidden":!0}),(0,Q.jsx)(`div`,{ref:M,className:`relative shrink-0 md:z-panel md:ml-2 md:pr-2 max-md:fixed max-md:bottom-2 max-md:left-2 max-md:right-2 max-md:top-2 max-md:z-card-overlay max-md:animate-fade-in`,children:re})]})]})}function xD({onClose:e,initialData:t,draftId:n}){let r=gS(void 0,void 0,`home-card:${n}`);return(0,Z.useEffect)(()=>{t?.title&&r.setTitle(t.title),t?.content&&r.setContent(t.content)},[]),(0,Q.jsx)(bD,{title:`New Note`,icon:qn,onClose:e,onSave:async e=>{let t=await r.save({mode:`workspace`,...e});return r.finish(),t},canSave:r.canSave,saving:r.saving,successMessage:`Note created`,children:(0,Q.jsxs)(`div`,{className:`flex h-full flex-col gap-4 p-4`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`qa-note-title`,children:`Title`}),(0,Q.jsx)(J,{id:`qa-note-title`,value:r.title,onChange:e=>r.setTitle(e.target.value),placeholder:`Optional; defaults to today's date`})]}),(0,Q.jsxs)(`div`,{className:`flex flex-1 flex-col gap-1.5`,children:[(0,Q.jsx)($,{children:`Body`}),(0,Q.jsx)(`div`,{className:`flex-1`,children:(0,Q.jsx)(Vo,{kind:`markdown`,value:r.content,onChange:r.setContent,placeholder:`Write your note…`})})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:r.tags,onChange:r.setTags})]}),(0,Q.jsx)(Wo,{...r,onRetry:r.retry}),(0,Q.jsx)(vD,{geotag:r.geotag,idPrefix:`qa-note-geotag`})]})})}var SD=`data/schema/tab`,CD=`2.0`;function wD(e){try{return new URL(e),!0}catch{return!1}}function TD(){let[e,t]=(0,Z.useState)(``),[n,r]=(0,Z.useState)(``),[i,a]=(0,Z.useState)([]),[o,s]=(0,Z.useState)(!1),c=O_(),l=e.trim(),u=wD(l),d=l.length>0&&!u,f=u&&!o;async function p(e){if(!u)throw Error(`Enter a valid URL`);s(!0);try{let t=await c.capture(),r=i.map(e=>e.trim()).filter(Boolean),a={schema:SD,schemaVersion:CD,data:{url:l,...n.trim()?{title:n.trim()}:{},...r.length?{tags:r}:{}},metadata:{features:Jo(i),...t?{geo:t}:{}}};return await vs(e,[a])}finally{s(!1)}}return{url:e,setUrl:t,title:n,setTitle:r,tags:i,setTags:a,saving:o,canSave:f,urlValid:u,showUrlError:d,save:p,geotag:c}}function ED({onClose:e,initialData:t}){let n=TD();return(0,Z.useEffect)(()=>{t?.url&&n.setUrl(t.url),t?.title&&n.setTitle(t.title)},[]),(0,Q.jsx)(bD,{title:`New Link`,icon:vn,onClose:e,onSave:e=>n.save({mode:`workspace`,...e}),canSave:n.canSave,saving:n.saving,successMessage:`Link created`,children:(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`qa-link-url`,children:`URL`}),(0,Q.jsx)(J,{id:`qa-link-url`,value:n.url,onChange:e=>n.setUrl(e.target.value),placeholder:`https://example.com`,autoFocus:!0}),n.showUrlError&&(0,Q.jsx)(`p`,{className:`text-xs text-destructive`,children:`Enter a valid URL, e.g. https://example.com`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`qa-link-title`,children:`Title`}),(0,Q.jsx)(J,{id:`qa-link-title`,value:n.title,onChange:e=>n.setTitle(e.target.value),placeholder:`Optional display title`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:n.tags,onChange:n.setTags})]}),(0,Q.jsx)(vD,{geotag:n.geotag,idPrefix:`qa-link-geotag`})]})})}function DD({onClose:e,initialData:t}){let n=R_();return(0,Z.useEffect)(()=>{t?.title&&n.setTitle(t.title),t?.content&&n.setDescription(t.content)},[]),(0,Q.jsx)(bD,{title:`New Todo`,icon:Ht,onClose:e,onSave:e=>n.save({mode:`workspace`,...e}),canSave:n.canSave,saving:n.saving,successMessage:`Todo created`,children:(0,Q.jsxs)(`div`,{className:`flex h-full flex-col gap-4 p-4`,children:[(0,Q.jsx)(Uv,{...n,idPrefix:`qa-todo`}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:n.tags,onChange:n.setTags})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`qa-todo-comment`,children:`Comment`}),(0,Q.jsx)(`textarea`,{id:`qa-todo-comment`,value:n.comment,onChange:e=>n.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`})]}),(0,Q.jsx)(vD,{geotag:n.geotag,idPrefix:`qa-todo-geotag`})]})})}function OD({onClose:e,initialData:t}){let n=Qv();return(0,Z.useEffect)(()=>{t?.title&&n.setDisplayName(t.title)},[]),(0,Q.jsx)(bD,{title:`New Identity`,icon:Ge,onClose:e,onSave:e=>n.save({mode:`workspace`,...e}),canSave:n.canSave,saving:n.saving,successMessage:`Identity created`,children:(0,Q.jsxs)(`div`,{className:`flex h-full flex-col gap-4 p-4`,children:[(0,Q.jsx)(ry,{idPrefix:`qa-identity`,...n,emailValid:n.emailValid}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:n.tags,onChange:n.setTags})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`qa-identity-comment`,children:`Comment`}),(0,Q.jsx)(`textarea`,{id:`qa-identity-comment`,value:n.comment,onChange:e=>n.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`})]})]})})}var kD=3;function AD(e){return`${e.name}:${e.size}:${e.lastModified}`}function jD(e=[]){let[t,n]=(0,Z.useState)(()=>e.map(e=>({id:AD(e),file:e,status:`queued`,progress:0}))),[r,i]=(0,Z.useState)(!1),a=(0,Z.useRef)(t),o=(0,Z.useRef)(null),s=(0,Z.useRef)(null);(0,Z.useEffect)(()=>()=>s.current?.abort(),[]);let c=(0,Z.useCallback)(e=>{a.current=e,n(e)},[]),l=(0,Z.useCallback)((e,t)=>{let r=a.current.map(n=>n.id===e?{...n,...t}:n);a.current=r,n(r)},[]),u=(0,Z.useCallback)(e=>{let t=new Set(a.current.map(e=>e.id)),n=e.filter(e=>!t.has(AD(e))).map(e=>({id:AD(e),file:e,status:`queued`,progress:0}));n.length&&c([...a.current,...n])},[c]),d=(0,Z.useCallback)(e=>{c(a.current.filter(t=>t.id!==e))},[c]),f=(0,Z.useCallback)(()=>{s.current?.abort(),s.current=null,c([]),i(!1)},[c]),p=(0,Z.useCallback)(()=>{s.current?.abort()},[]);return{items:t,running:r,addFiles:u,removeItem:d,reset:f,start:(0,Z.useCallback)(async(e,t)=>{if(!e)throw Error(`No active workspace or context to add to`);let{workspaceName:n,treeName:r,path:u}=await js(e),d=r===`backends`?await Os(n,u):null,f=JSON.stringify([n,r,u]);o.current!==null&&o.current!==f&&c(a.current.map(({id:e,file:t})=>({id:e,file:t,status:`queued`,progress:0}))),o.current=f;let p=new AbortController;s.current=p,i(!0);let m=a.current.filter(e=>e.status!==`done`);for(let e of m)l(e.id,{status:`queued`,progress:0,error:void 0});try{if(d){let e=0;await Promise.all(Array.from({length:Math.min(kD,m.length)},async()=>{for(;e<m.length&&!p.signal.aborted;){let t=m[e++];try{l(t.id,{status:`uploading`,progress:0,resumed:!1});let e=await Wr(n,{...d,key:ms(d.key,t.file.name)},t.file,{signal:p.signal,onProgress:(e,n)=>l(t.id,{progress:n?e/n:0})});l(t.id,{status:`done`,progress:1,docId:e.docId??void 0})}catch(e){l(t.id,{status:`error`,error:e instanceof Error?e.message:`Upload failed`})}}}))}else{let r=new Map;for(let e of m){if(p.signal.aborted)throw new DOMException(`cancelled`,`AbortError`);l(e.id,{status:`hashing`});try{let t=await Ms(e.file,t=>l(e.id,{progress:t}));r.set(e.id,t),l(e.id,{status:`checking`,progress:0})}catch(t){l(e.id,{status:`error`,error:t instanceof Error?t.message:`Failed to read file`})}}let i={};if(r.size)try{i=await qr(n,[...new Set(r.values())])}catch{i={}}let a=m.filter(e=>r.has(e.id)),o=0;await Promise.all(Array.from({length:Math.min(kD,a.length)},async()=>{for(;o<a.length;){if(p.signal.aborted)return;let s=a[o++],c=r.get(s.id);try{let r=i[c]??null;r?l(s.id,{status:`linking`,progress:1,resumed:!0}):(l(s.id,{status:`uploading`,progress:0}),r=await Ur(n,s.file,{signal:p.signal,onProgress:(e,t)=>l(s.id,{progress:t?e/t:0})}),l(s.id,{status:`linking`,progress:1}));let a=await vs(e,[t(r,s.file)],{refresh:!1});l(s.id,{status:`done`,docId:a[0]})}catch(e){let t=e instanceof DOMException&&e.name===`AbortError`;l(s.id,{status:`error`,error:t?`Cancelled`:e instanceof Error?e.message:`Upload failed`})}}}))}}finally{if(p.signal.aborted)for(let e of a.current)e.status!==`done`&&e.status!==`error`&&l(e.id,{status:`error`,error:`Cancelled`});i(!1),s.current===p&&(s.current=null),a.current.some(e=>e.status===`done`)&&gs(e)}let h=a.current;return{done:h.filter(e=>e.status===`done`).length,resumed:h.filter(e=>e.status===`done`&&e.resumed).length,failed:h.filter(e=>e.status===`error`).length,total:h.length,docIds:h.flatMap(e=>e.status===`done`&&e.docId!=null?[e.docId]:[])}},[l,c]),cancel:p}}function MD(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}function ND(e){switch(e.status){case`hashing`:return`hashing`;case`checking`:return`checking`;case`uploading`:return`${Math.round(e.progress*100)}%`;case`linking`:return`saving`;case`done`:return e.resumed?`already uploaded`:`done`;case`error`:return e.error||`failed`;default:return MD(e.file.size)}}function PD({item:e}){switch(e.status){case`done`:return(0,Q.jsx)(ae,{className:`h-3.5 w-3.5 shrink-0 text-green-600 dark:text-green-500`});case`error`:return(0,Q.jsx)(R,{className:`h-3.5 w-3.5 shrink-0 text-destructive`});case`queued`:return(0,Q.jsx)(zn,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`});default:return(0,Q.jsx)(Xn,{className:`h-3.5 w-3.5 shrink-0 animate-spin text-muted-foreground`})}}function FD({item:e}){if(e.status===`queued`)return null;let t=e.status===`done`||e.status===`error`||e.status===`linking`?1:e.status===`checking`?0:e.progress;return(0,Q.jsx)(`div`,{className:`h-1 w-full overflow-hidden rounded-full bg-muted`,children:(0,Q.jsx)(`div`,{className:q(`h-full rounded-full transition-[width] duration-normal`,e.status===`error`?`bg-destructive`:e.status===`done`?`bg-green-600 dark:bg-green-500`:`bg-primary`),style:{width:`${Math.round(t*100)}%`}})})}function ID({items:e,running:t,onRemove:n}){let r=e.filter(e=>e.status===`done`).length,i=e.filter(e=>e.status===`error`).length;return(0,Q.jsx)(Q.Fragment,{children:e.length>0&&(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsxs)($,{children:[e.length,` file(s)`,r>0&&(0,Q.jsxs)(`span`,{className:`ml-1 text-muted-foreground`,children:[`— `,r,` done`,i>0?`, ${i} failed`:``]})]}),(0,Q.jsx)(`ul`,{className:`max-h-48 space-y-1 overflow-y-auto`,children:e.map(e=>(0,Q.jsxs)(`li`,{className:`flex flex-col gap-1 rounded border border-input px-2 py-1 text-sm`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(PD,{item:e}),(0,Q.jsx)(`span`,{className:`flex-1 truncate`,title:e.file.name,children:e.file.name}),(0,Q.jsx)(`span`,{className:q(`shrink-0 text-xs`,e.status===`error`?`text-destructive`:`text-muted-foreground`),title:e.status===`error`?e.error:void 0,children:ND(e)}),!t&&e.status!==`done`&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>n(e.id),className:`text-muted-foreground hover:text-foreground`,"aria-label":`Remove ${e.file.name}`,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]}),(0,Q.jsx)(FD,{item:e})]},e.id))})]})})}function LD({items:e,running:t,onCancel:n}){return(0,Q.jsxs)(`div`,{className:`space-y-4 overflow-y-auto p-4`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-medium`,children:`Uploading files`}),!t&&(0,Q.jsx)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:`Preparing / finishing upload…`}),(0,Q.jsx)(ID,{items:e,running:!0,onRemove:()=>{}}),(0,Q.jsx)(X,{variant:`outline`,size:`sm`,disabled:!t,onClick:n,children:`Cancel upload`})]})}function RD(e){let[t,n]=(0,Z.useState)(null);return(0,Z.useEffect)(()=>{if(!e)return;let t=!1;return za(e).then(r=>{t||n({workspace:e,tags:r})}).catch(()=>{}),()=>{t=!0}},[e]),t&&t.workspace===e?t.tags:[]}var zD=`data/schema/file`,BD=`3.0`;function VD(e){let[t,n]=(0,Z.useState)([]),[r,i]=(0,Z.useState)(``);return{tags:t,setTags:n,comment:r,setComment:i,suggestions:RD(e),geotag:O_()}}function HD(e,t,n={}){let r=Jo(n.tags??[]),i=n.comment?.trim();return{schema:zD,schemaVersion:BD,data:{},checksumArray:[`sha256/${e.checksum}`],locations:[{url:e.url,metadata:{filename:t.name}}],...i?{comment:i}:{},metadata:{contentType:t.type,size:e.size,...r.length?{features:r}:{},...n.geo?{geo:n.geo}:{}}}}var UD=`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`;function WD({fields:e,idPrefix:t=`file`,multiple:n=!1}){return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:e.tags,onChange:e.setTags,suggestions:e.suggestions})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`${t}-comment`,children:`Comment`}),(0,Q.jsx)(`textarea`,{id:`${t}-comment`,value:e.comment,onChange:t=>e.setComment(t.target.value),rows:3,placeholder:`Optional; searchable, and the only text a photo has`,className:UD}),n&&e.tags.length+e.comment.trim().length>0&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Applied to every file in this upload`})]}),(0,Q.jsx)(vD,{geotag:e.geotag,idPrefix:`${t}-geotag`})]})}var GD={jpg:`image/jpeg`,jpeg:`image/jpeg`,png:`image/png`,gif:`image/gif`,webp:`image/webp`,avif:`image/avif`,heic:`image/heic`,heif:`image/heif`,bmp:`image/bmp`,tif:`image/tiff`,tiff:`image/tiff`,svg:`image/svg+xml`,mp4:`video/mp4`,mov:`video/quicktime`,webm:`video/webm`,"3gp":`video/3gpp`};function KD(e){return/^(image|video)\//.test(e.type)}async function qD(e){let t=await Promise.all(e.map(async e=>{let t=new Uint8Array(await e.slice(0,64).arrayBuffer()),n=(e,n)=>String.fromCharCode(...t.slice(e,e+n)),r=``;if(t[0]===255&&t[1]===216&&t[2]===255)r=`image/jpeg`;else if(n(0,8)===`‰PNG\r
22
- 
23
- `)r=`image/png`;else if([`GIF87a`,`GIF89a`].includes(n(0,6)))r=`image/gif`;else if(n(0,4)===`RIFF`&&n(8,4)===`WEBP`)r=`image/webp`;else if(n(0,5)===`%PDF-`)r=`application/pdf`;else if(n(0,4)===`PK`)r=`application/zip`;else if(n(4,4)===`ftyp`){let e=[n(8,4)],i=new DataView(t.buffer).getUint32(0);for(let r=16;r+4<=Math.min(t.length,i);r+=4)e.push(n(r,4));e.some(e=>[`avif`,`avis`].includes(e))?r=`image/avif`:e.some(e=>[`heic`,`heix`,`hevc`,`hevx`].includes(e))?r=`image/heic`:e.some(e=>[`mif1`,`msf1`].includes(e))?r=`image/heif`:e.includes(`qt `)?r=`video/quicktime`:e.some(e=>[`isom`,`iso2`,`mp41`,`mp42`,`avc1`,`M4V `].includes(e))&&(r=`video/mp4`)}let i=e.type.toLowerCase().split(`;`)[0].trim(),a=!i||[`application/octet-stream`,`binary/octet-stream`,`*/*`].includes(i),o=e.name.split(`.`).pop()?.toLowerCase()??``,s=r||a&&GD[o]||i;return s===e.type?e:new File([e],e.name,{type:s,lastModified:e.lastModified})}));return{kind:t.length>0&&t.every(KD)?`photo`:`file`,files:t}}function JD({file:e}){let t=(0,Z.useRef)(null),[n,r]=(0,Z.useState)(!1);return(0,Z.useEffect)(()=>{let n=t.current;if(!n)return;let r=URL.createObjectURL(e);return n.src=r,()=>{n.removeAttribute(`src`),URL.revokeObjectURL(r)}},[e]),(0,Q.jsx)(`div`,{className:`flex min-h-24 items-center justify-center overflow-hidden rounded-md border border-input bg-muted/30`,children:n?(0,Q.jsxs)(`p`,{className:`p-4 text-center text-sm text-muted-foreground`,children:[`Preview unavailable for `,e.name,`. You can still save the original.`]}):e.type.startsWith(`video/`)?(0,Q.jsx)(`video`,{ref:t,controls:!0,preload:`metadata`,"aria-label":e.name,onError:()=>r(!0),className:`max-h-64 max-w-full`}):(0,Q.jsx)(`img`,{ref:t,alt:e.name,onError:()=>r(!0),className:`max-h-64 max-w-full object-contain`})})}function YD({onClose:e,initialData:t}){let n=(0,Z.useRef)(null),r=jD(t?.files),i=r.items.map(e=>e.file),[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)(!1),{state:l}=Rs(),u=VD(l.activeWorkspaceName),d=e=>{e&&(s||r.addFiles(Array.from(e)))},f=e=>{e.preventDefault(),o(!1),d(e.dataTransfer.files)},p=i.length>0;return(0,Q.jsx)(bD,{title:`Upload File`,icon:$e,onClose:e,onSave:async e=>{c(!0);try{let t={mode:`workspace`,...e},n=await u.geotag.capture(),i=await r.start(t,(e,t)=>HD(e,t,{tags:u.tags,comment:u.comment,geo:n}));if(i.failed)throw Error(`${i.failed} file(s) failed or cancelled. Retry keeps completed uploads.`);return i.docIds}finally{c(!1)}},navigateAfterSave:!0,canSave:p,saving:s,saveProgress:(0,Q.jsx)(LD,{items:r.items,running:r.running,onCancel:r.cancel}),successMessage:`File(s) uploaded`,children:(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Q.jsxs)(`div`,{onDragOver:e=>{e.preventDefault(),o(!0)},onDragLeave:()=>o(!1),onDrop:f,onClick:()=>n.current?.click(),className:q(`flex cursor-pointer flex-col items-center justify-center gap-2 rounded-md border border-dashed px-4 py-8 text-center transition-colors`,a?`border-primary bg-primary/5`:`border-input hover:bg-muted/40`),children:[(0,Q.jsx)($e,{className:`h-6 w-6 text-muted-foreground touch-target`}),(0,Q.jsx)(`p`,{className:`text-sm`,children:`Drag & drop files here`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`or click to browse`}),(0,Q.jsx)(`input`,{ref:n,type:`file`,multiple:!0,disabled:s,className:`hidden`,onChange:e=>{d(e.target.files),e.target.value=``}})]}),r.items.filter(e=>KD(e.file)).map(e=>(0,Q.jsx)(JD,{file:e.file},e.id)),(0,Q.jsx)(ID,{items:r.items,running:s,onRemove:r.removeItem}),(0,Q.jsx)(WD,{fields:u,idPrefix:`qa-file`,multiple:i.length>1})]})})}function XD({onClose:e,initialData:t}){let n=jD(t?.files),r=(0,Z.useRef)(null),i=n.items.length>0,[a,o]=(0,Z.useState)(!1),{state:s}=Rs(),c=VD(s.activeWorkspaceName),l=e=>{!a&&e&&n.addFiles([e])};return(0,Q.jsx)(bD,{title:`Photo/Video`,icon:qe,onClose:e,onSave:async e=>{if(!i)return[];o(!0);try{let t=await c.geotag.capture(),r={mode:`workspace`,...e},i=await n.start(r,(e,n)=>HD(e,n,{tags:c.tags,comment:c.comment,geo:t}));if(i.failed)throw Error(`Upload failed or cancelled. You can retry.`);return i.docIds}finally{o(!1)}},navigateAfterSave:!0,canSave:i,saving:a,saveProgress:(0,Q.jsx)(LD,{items:n.items,running:n.running,onCancel:n.cancel}),successMessage:`Upload saved`,children:(0,Q.jsxs)(`div`,{className:q(`flex h-full flex-col gap-4 p-4`,!i&&`items-center justify-center`),children:[i?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`flex min-h-0 w-full flex-1 flex-col gap-3 overflow-y-auto`,children:n.items.map(({id:e,file:t,status:r})=>(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(JD,{file:t}),(0,Q.jsxs)(`div`,{className:`flex w-full items-center gap-2 rounded border border-input px-3 py-2 text-sm`,children:[(0,Q.jsx)(zn,{className:`h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`flex-1 truncate`,children:t.name}),(0,Q.jsxs)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:[(t.size/1024/1024).toFixed(1),` MB`]}),(0,Q.jsx)(`button`,{type:`button`,disabled:a||r===`done`,onClick:()=>n.removeItem(e),"aria-label":`Remove ${t.name}`,className:`text-muted-foreground hover:text-foreground disabled:opacity-40`,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]})]},e))}),(0,Q.jsx)(`div`,{className:`w-full shrink-0 space-y-4`,children:(0,Q.jsx)(WD,{fields:c,idPrefix:`qa-photo`,multiple:n.items.length>1})})]}):(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>r.current?.click(),className:`flex flex-col items-center gap-2 rounded-md border border-dashed border-input px-6 py-10 text-center transition-colors hover:bg-muted/40`,children:[(0,Q.jsx)(qe,{className:`h-8 w-8 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`text-sm`,children:`Open camera`})]}),(0,Q.jsx)(`input`,{ref:r,type:`file`,accept:`image/*,video/*`,capture:`environment`,className:`hidden`,disabled:a,onChange:e=>{l(e.target.files?.[0]??null),e.target.value=``}})]})})}var ZD=`shrink-0 h-viewport-card w-[min(380px,90vw)] max-md:fixed max-md:inset-2 max-md:z-40 max-md:h-auto max-md:w-auto max-md:shadow-elevation-5`;function QD({onClose:e}){let{showSuccessToast:t,showErrorToast:n}=Gr(),[r,i]=(0,Z.useState)(null),[a,o]=(0,Z.useState)(!1);return r?(0,Q.jsx)(Jm,{sizeClassName:ZD,documentCount:r.length,saving:a,onClose:e,onConfirm:async(i,a)=>{o(!0);try{await Promise.all(i.map(e=>Bi(a.workspaceName,e,r,a.treeName,a.treeType))),t(`${r.length} document${r.length===1?``:`s`} linked`),e()}catch(e){n(e instanceof Error?e.message:`Failed to link documents`)}finally{o(!1)}}}):(0,Q.jsx)(pg,{sizeClassName:ZD,onConfirm:e=>{e.length&&i(e)},onClose:e})}function $D(){let e=Ko(`new:home-card:`);try{return Object.keys(localStorage).filter(t=>t.startsWith(e)&&t.endsWith(`:home`)).filter(e=>{let t=JSON.parse(localStorage.getItem(e)||`null`)?.value;return t&&(t.title||t.content||t.comment||t.tags?.length)}).map(t=>t.slice(e.length,-5))}catch{return[]}}var eO=0;function tO(){return eO+=1,`card-${eO}`}function nO({initialKind:e,initialData:t,onInitialCardClose:n,onCardsOpenChange:r}){let[i,a]=(0,Z.useState)(!1),o=$g(),s=$o(),c=!!(s?.state.t1Open||s?.state.addOpen),[l,u]=(0,Z.useState)(()=>e?[{id:`initial`,kind:e,initialData:t,noteDraftId:crypto.randomUUID()}]:$D().map(e=>({id:e,kind:`note`,noteDraftId:e}))),d=l.length>0,f=(0,Z.useRef)(r);(0,Z.useEffect)(()=>{f.current=r},[r]),(0,Z.useEffect)(()=>{f.current?.(d)},[d]),c&&i&&a(!1);let p=hl(),m=e=>{if(e===`sketch`){a(!1),p(pD.createUrl(null));return}let t=e===`note`?$D().find(e=>!l.some(t=>t.noteDraftId===e))||crypto.randomUUID():void 0;u(n=>[...n,{id:tO(),kind:e,noteDraftId:t}]),a(!1)},h=e=>{u(t=>t.filter(t=>t.id!==e)),e===`initial`&&n?.()},g=(0,Q.jsxs)(`div`,{className:q(`pointer-events-none fixed right-6 z-40 flex flex-col items-end gap-2`,`bottom-fab-inset md:bottom-[calc(var(--spacing-fab-inset)+5rem)]`,l.length>0&&`max-md:hidden`,c&&`hidden`),children:[(0,Q.jsx)(`div`,{className:q(`flex flex-col items-end gap-2 transition-all duration-fast`,i?`pointer-events-auto opacity-100`:`pointer-events-none translate-y-2 opacity-0`),children:(0,Q.jsx)(gD,{variant:`stack`,omit:[`plaintext`,`folder`,`message`],onSelect:m})}),(0,Q.jsx)(`div`,{className:`pointer-events-none flex w-16 justify-center`,children:(0,Q.jsx)(`button`,{type:`button`,onClick:()=>a(e=>!e),"aria-label":i?`Close quick add`:`Quick add`,className:`pointer-events-auto flex h-11 w-11 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-elevation-3 transition-transform hover:scale-105`,children:i?(0,Q.jsx)(W,{className:`h-5 w-5`}):(0,Q.jsx)(cn,{className:`h-5 w-5`})})})]});return(0,Q.jsxs)(`div`,{className:`relative flex h-full w-full flex-col`,children:[l.length>0&&(0,Q.jsx)(`div`,{className:`pointer-events-auto flex flex-1 items-center gap-4 overflow-x-auto p-6 md:pr-28`,children:l.map(e=>{let t=()=>h(e.id);switch(e.kind){case`note`:return(0,Q.jsx)(xD,{draftId:e.noteDraftId,onClose:t,initialData:e.initialData},e.id);case`link`:return(0,Q.jsx)(ED,{onClose:t,initialData:e.initialData},e.id);case`todo`:return(0,Q.jsx)(DD,{onClose:t,initialData:e.initialData},e.id);case`identity`:return(0,Q.jsx)(OD,{onClose:t,initialData:e.initialData},e.id);case`file`:return(0,Q.jsx)(YD,{onClose:t,initialData:e.initialData},e.id);case`photo`:return(0,Q.jsx)(XD,{onClose:t,initialData:e.initialData},e.id);case`existing`:return(0,Q.jsx)(QD,{onClose:t},e.id);case`sketch`:return null;case`folder`:case`message`:return null}})}),o?(0,Pp.createPortal)(g,document.body):g]})}function rO(e){let t=`${e.workspaceName}\0${e.treeName}\0${e.path}`,[n,r]=(0,Z.useState)(null);return(0,Z.useEffect)(()=>{let n=!1;return ga(e.workspaceName,e.treeName).then(i=>{n||r({key:t,node:gi(i,e.path)})}).catch(()=>{n||r({key:t,node:null})}),()=>{n=!0}},[t,e.workspaceName,e.treeName,e.path]),!n||n.key!==t?{state:`loading`}:n.node?{state:`ready`,node:n.node}:{state:`missing`}}function iO(e){let t=`/workspaces/${encodeURIComponent(e.workspaceName)}`,n=e.path.replace(/^\//,``);return e.treeName===`context`?`${t}/path/${n}`:`${t}/trees/${encodeURIComponent(e.treeName)}/path/${n}`}var aO=`application/x-canvas-pin`;function oO({pin:e,onUnpin:t,onMinimize:n,onDropPin:r}){let i=rO(e),[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)(null),l=!!r&&!a,u=e=>{let t=e.currentTarget.getBoundingClientRect();return e.clientX>t.left+t.width/2?`after`:`before`},d=l?{onDragOver:e=>{e.dataTransfer.types.includes(`application/x-canvas-pin`)&&(e.preventDefault(),e.dataTransfer.dropEffect=`move`,c(u(e)))},onDragLeave:()=>c(null),onDrop:t=>{let n=t.dataTransfer.getData(aO);c(null),!(!n||n===e.id)&&(t.preventDefault(),r?.(n,u(t)===`after`))}}:{},f=i.state===`ready`?i.node:null,p=f?.label||e.label||e.path.split(`/`).filter(Boolean).pop()||`Canvas`,m=f?.color;return(0,Z.useEffect)(()=>{if(!a)return;let e=e=>{e.key===`Escape`&&o(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[a]),(0,Q.jsxs)(`section`,{...d,className:a?`fixed inset-0 z-picker flex flex-col bg-background`:`flex flex-col rounded-(--card-radius) border bg-background overflow-hidden min-h-0 min-w-0 ${s?`ring-2 ring-primary/60`:``}`,children:[(0,Q.jsxs)(`header`,{draggable:l,onDragStart:l?t=>{t.dataTransfer.setData(aO,e.id),t.dataTransfer.effectAllowed=`move`}:void 0,className:`flex items-center gap-2 px-3 py-2 border-b bg-muted/20 shrink-0 min-w-0 ${l?`cursor-grab active:cursor-grabbing`:``}`,children:[l&&(0,Q.jsx)(T,{className:`w-3.5 h-3.5 shrink-0 text-muted-foreground/60`,"aria-hidden":!0}),m&&(0,Q.jsx)(`div`,{className:`w-1 h-5 rounded-full shrink-0`,style:{backgroundColor:m}}),(0,Q.jsx)(_t,{className:`w-4 h-4 shrink-0 text-primary`}),(0,Q.jsxs)(`div`,{className:`flex flex-col min-w-0 flex-1`,children:[(0,Q.jsx)(`span`,{className:`text-sm font-semibold leading-tight truncate`,children:p}),(0,Q.jsxs)(`span`,{className:`text-[11px] text-muted-foreground truncate leading-tight font-mono`,children:[e.workspaceName,`://`,e.path.replace(/^\//,``)]})]}),n&&(0,Q.jsx)(`button`,{type:`button`,onClick:n,title:`Minimize to tab bar`,"aria-label":`Minimize to tab bar`,className:`shrink-0 flex items-center justify-center w-7 h-7 rounded-md text-muted-foreground hover:bg-accent hover:text-foreground transition-colors`,children:(0,Q.jsx)(de,{className:`w-3.5 h-3.5`})}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>o(e=>!e),"aria-pressed":a,title:a?`Restore tile (Esc)`:`Fill view area`,"aria-label":a?`Restore tile`:`Fill view area`,className:`shrink-0 flex items-center justify-center w-7 h-7 rounded-md text-muted-foreground hover:bg-accent hover:text-foreground transition-colors`,children:a?(0,Q.jsx)(ut,{className:`w-3.5 h-3.5`}):(0,Q.jsx)(Sn,{className:`w-3.5 h-3.5`})}),(0,Q.jsx)(Mu,{to:iO(e),title:`Open in workspace`,"aria-label":`Open in workspace`,className:`shrink-0 flex items-center justify-center w-7 h-7 rounded-md text-muted-foreground hover:bg-accent hover:text-foreground transition-colors`,children:(0,Q.jsx)(Ut,{className:`w-3.5 h-3.5`})}),(0,Q.jsx)(`button`,{type:`button`,onClick:t,title:`Unpin from home`,"aria-label":`Unpin from home`,className:`shrink-0 flex items-center justify-center w-7 h-7 rounded-md text-muted-foreground hover:bg-destructive/10 hover:text-destructive transition-colors`,children:(0,Q.jsx)(te,{className:`w-3.5 h-3.5`})})]}),(0,Q.jsxs)(`div`,{className:`flex-1 min-h-0`,children:[i.state===`loading`&&(0,Q.jsx)(`div`,{className:`flex items-center justify-center h-full text-xs text-muted-foreground`,children:`Loading…`}),i.state===`missing`&&(0,Q.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-2 px-4 text-center`,children:[(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`This canvas is no longer available.`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`It may have been renamed, moved or deleted.`}),(0,Q.jsx)(`button`,{type:`button`,onClick:t,className:`mt-1 px-2.5 py-1 text-xs border rounded-md hover:bg-accent`,children:`Remove pin`})]}),i.state===`ready`&&(0,Q.jsx)(tS,{workspaceId:e.workspaceName,treeName:e.treeName,path:e.path,layerId:i.node.id,querySpec:i.node.querySpec,metadata:i.node.metadata,readOnly:!0})]})]})}function sO(e,t,n){let r=Promise.resolve();return i=>{let a=r.then(async()=>{let r=await e(),a=i(r.home?.pinnedCanvases??[]);n(await t({...r,home:{...r.home,pinnedCanvases:a}}))});return r=a.catch(()=>{}),a}}function cO(e,t){return e.minimized===!0||t.has(e.id)}function lO(e){return e.label||e.path.split(`/`).filter(Boolean).pop()||`Canvas`}function uO({pins:e,onRestore:t}){let[n,r]=(0,Z.useState)(!1),[i,a]=(0,Z.useState)(e.length);return i!==e.length&&(a(e.length),e.length===0&&r(!1)),e.length===0?null:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`pointer-events-none absolute bottom-0 left-0 right-0 z-40 max-md:hidden`,children:(0,Q.jsx)(`div`,{className:`pointer-events-auto flex items-end gap-1 overflow-x-auto px-3 pr-28 pb-safe-bottom`,children:e.map(e=>(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>t(e.id),title:`Restore ${lO(e)}`,className:`flex max-w-[180px] shrink-0 items-center gap-1.5 rounded-t-lg border border-b-0 bg-background px-3 py-1.5 text-xs shadow-elevation-1 hover:bg-accent`,children:[(0,Q.jsx)(_t,{className:`h-3.5 w-3.5 shrink-0 text-primary`}),(0,Q.jsx)(`span`,{className:`truncate`,children:lO(e)})]},e.id))})}),n&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`fixed inset-0 z-drawer md:hidden`,onClick:()=>r(!1),"aria-hidden":!0}),(0,Q.jsx)(`div`,{className:`fixed bottom-rail-stack left-2 z-rail w-60 max-w-[calc(100vw-1rem)] rounded-xl border bg-card p-1.5 shadow-elevation-5 animate-fade-in md:hidden touch-target`,children:e.map(e=>(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>t(e.id),className:`flex w-full items-center gap-2 rounded-lg px-2.5 py-2 text-left text-sm hover:bg-accent`,children:[(0,Q.jsx)(_t,{className:`h-4 w-4 shrink-0 text-primary`}),(0,Q.jsx)(`span`,{className:`truncate`,children:lO(e)})]},e.id))})]}),(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>r(e=>!e),"aria-label":n?`Close minimized canvases`:`Minimized canvases (${e.length})`,className:`fixed bottom-rail-inset left-16 z-nav flex h-12 w-12 items-center justify-center rounded-full bg-foreground text-background shadow-elevation-4 md:hidden`,children:[(0,Q.jsx)(_t,{className:`h-5 w-5`}),(0,Q.jsx)(`span`,{className:`absolute -top-1 -right-1 flex h-5 min-w-5 items-center justify-center rounded-full bg-primary px-1 text-[10px] font-semibold`,children:e.length})]})]})}function dO(){let{pins:e,unpin:t,movePin:n,setMinimized:r,isLoading:i}=LE(),{showErrorToast:a}=Gr(),[o,s]=(0,Z.useState)(new Set),c=(0,Z.useRef)(e);(0,Z.useEffect)(()=>{c.current=e},[e]);let l=e=>{r(e,!0).catch(()=>a(`Could not save minimized state`))},u=t=>{s(e=>{let n=new Set(e);return n.delete(t),n}),e.find(e=>e.id===t)?.minimized&&r(t,!1).catch(()=>a(`Could not save restored state`))},d=(0,Z.useCallback)(e=>{s(e?new Set(c.current.filter(e=>!e.minimized).map(e=>e.id)):new Set)},[]),f=e.filter(e=>!cO(e,o)),p=e.filter(e=>cO(e,o)),m=(t,r,i)=>{let a=e.findIndex(e=>e.id===r.id);if(a===-1)return;let o=i?e[a+1]?.id??null:r.id;n(t,o)};return(0,Q.jsxs)(`div`,{className:`relative h-full`,children:[(0,Q.jsx)(`div`,{className:`h-full overflow-y-auto`,children:i?(0,Q.jsx)(`div`,{className:`flex items-center justify-center h-full text-xs text-muted-foreground`,children:`Loading…`}):(0,Q.jsx)(`div`,{className:`grid gap-4 p-4 h-full grid-cols-[repeat(auto-fit,minmax(min(640px,100%),1fr))] auto-rows-fr ${p.length>0?`md:pb-12`:``}`,children:f.map(e=>(0,Q.jsx)(oO,{pin:e,onUnpin:()=>{t(e.id)},onMinimize:()=>l(e.id),onDropPin:(t,n)=>m(t,e,n)},e.id))})}),(0,Q.jsx)(`div`,{className:`pointer-events-none absolute inset-0`,children:(0,Q.jsx)(nO,{onCardsOpenChange:d})}),(0,Q.jsx)(uO,{pins:p,onRestore:u})]})}function fO(){return(0,Q.jsx)(`div`,{className:`h-full w-full`,"aria-hidden":!0})}var pO=`share-target-inbox`,mO={"too-large":`Android shares are limited to 100 MiB in total for temporary device storage. Nothing was uploaded. Use Add File to upload larger files directly.`,"stash-failed":`Canvas couldn't hold on to the shared file — device storage may be full. Try again, or upload it from the app.`,"empty-share":`Canvas received no files or text from the sharing app. Try again, or use Add File to select the photo directly.`,"empty-file":`The sharing app delivered an empty file. Try again, or use Add File to select the original directly.`,expired:`Nothing shared, or the share expired.`};async function hO(e){let t=await caches.open(pO),n=null,r=Date.now()+3e5;for(;Date.now()<r;){let r=await t.match(`/share-target-inbox/${e}/meta`);if(!r)return null;if(n=await r.json(),n?.status===`error`)throw Error(n.error||`stash-failed`);if(n?.status!==`receiving`)break;await new Promise(e=>setTimeout(e,300))}if(!n||n.status===`receiving`)throw Error(`stash-failed`);let i=[];for(let r=0;r<n.fileNames.length;r++){let a=await t.match(`/share-target-inbox/${e}/file-${r}`);if(!a)throw Error(`stash-failed`);let o=await a.blob();i.push(new File([o],n.fileNames[r],{type:o.type}))}let a=i.length?await qD(i):null;if(await Promise.all(n.fileNames.map((n,r)=>t.delete(`/share-target-inbox/${e}/file-${r}`))),await t.delete(`/share-target-inbox/${e}/meta`),a)return{kind:a.kind,data:{files:a.files}};if(![n.title,n.text,n.url].some(e=>e.trim()))throw Error(`empty-share`);let o=n.text.trim(),s=n.url||(vO(o)?o:``);return s?{kind:`link`,data:{url:s,title:n.title}}:{kind:`note`,data:{title:n.title,content:n.text}}}var gO=new Map;function _O(e){let t=gO.get(e);return t||(t=hO(e),gO.set(e,t),t.finally(()=>setTimeout(()=>gO.delete(e),6e4)).catch(()=>{})),t}function vO(e){if(!e||/\s/.test(e))return!1;try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function yO(){let[e]=Ru(),t=hl(),[n,r]=(0,Z.useState)(null),[i,a]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{let t=!1;async function n(){let n=e.get(`error`);if(n){a(n);return}let i=e.get(`token`),o=i?await _O(i):null;t||(o?r(o):a(`expired`))}return n().catch(e=>{t||a(e instanceof Error?e.message:`stash-failed`)}),()=>{t=!0}},[e]);let o=()=>t(`/home`,{replace:!0});return i?(0,Q.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-3 px-6 text-center`,children:[(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:mO[i]??mO.expired}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>t(`/apps/add/file`,{replace:!0}),className:`text-sm font-medium text-primary underline underline-offset-4`,children:`Add File`}),(0,Q.jsx)(`button`,{type:`button`,onClick:o,className:`text-sm font-medium text-primary underline underline-offset-4`,children:`Go to Canvas`})]}):n?(0,Q.jsx)(nO,{initialKind:n.kind,initialData:n.data,onInitialCardClose:o}):(0,Q.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`Receiving shared content on this device… No upload has started.`})}function bO(e,t=`An error occurred`){if(e instanceof Error)return e.message;if(typeof e==`object`&&e){let n=e;return n.message||n.error||n.payload?.message||n.payload?.error||n.statusText||t}return t}function xO(e,t,n=`An error occurred`){return console.error(t,e),bO(e,n)}function SO(){let e=hl(),[t,n]=(0,Z.useState)([]),[r,i]=(0,Z.useState)([]),[a,o]=(0,Z.useState)(!0),[s,c]=(0,Z.useState)(null),[l,u]=(0,Z.useState)(``),[d,f]=(0,Z.useState)(``),[p,m]=(0,Z.useState)(`context`),[h,g]=(0,Z.useState)(`/`),[_,v]=(0,Z.useState)(``),[y,b]=(0,Z.useState)(null),[x,S]=(0,Z.useState)(`/`),[C,w]=(0,Z.useState)(``),[T,E]=(0,Z.useState)(!1),[D,O]=Qw(),[k,A]=(0,Z.useState)(null),[j,M]=(0,Z.useState)(null),{showToast:N}=Hr();(0,Z.useEffect)(()=>{pd.isConnected()||(console.log(`Socket not connected, attempting to connect...`),pd.reconnect())},[]);let P=(0,Z.useCallback)(async()=>{try{o(!0);let[e,t]=await Promise.all([fs(),ji()]),r=e?.filter(e=>e&&typeof e==`object`&&e.id&&e.userId)||[];n(r);let a=t||[];if(i(a),a.length>0){let e=a.some(e=>e.id===C);(!C||!e)&&w(a[0].id)}else w(``);c(null)}catch(e){console.error(`Data fetch error:`,e),n([]),i([]);let t=`Failed to fetch data`;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 data`}c(t),N({title:`Error`,description:t,variant:`destructive`})}finally{o(!1)}},[C,N]);(0,Z.useEffect)(()=>{P()},[P]),(0,Z.useEffect)(()=>{let e=()=>pd.emit(`subscribe`,{channel:`context`}),t=()=>pd.emit(`unsubscribe`,{channel:`context`}),r=pd.on(`connect`,e);console.log(`Subscribing to context events`),e();let i=e=>{let t=e;if(console.log(`Received context created:`,t),!t||!t.id||!t.userId){console.error(`Invalid context data received in context:created event:`,t);return}n(e=>e.some(e=>e&&e.id===t.id&&e.userId===t.userId)?(console.log(`Context ${t.id} already exists, skipping duplicate add`),e):[...e,t])},a=e=>{let t=e;if(console.log(`Received context update:`,t),!t||!t.id||!t.userId){console.error(`Invalid context data received in context:updated event:`,t);return}n(e=>e.map(e=>e&&e.id===t.id&&e.userId===t.userId?{...e,...t}:e))},o=e=>{let t=e;console.log(`Received context deletion:`,t);let r=t?.contextId??t?.id;if(!r){console.error(`Invalid context deletion data received:`,t);return}n(e=>e.filter(e=>e&&e.id!==r))},s=e=>{let t=e;if(console.log(`Received context URL change:`,t),!t||!t.id||!t.userId){console.error(`Invalid context data received in context:url:changed event:`,t);return}n(e=>e.map(e=>e&&e.id===t.id&&e.userId===t.userId?{...e,...t}:e))},c=[[`context:created`,i],[`context.created`,i],[`context:updated`,a],[`context.updated`,a],[`context:deleted`,o],[`context.deleted`,o],[`context:url:changed`,s],[`context.url.set`,s],[`context:url:set`,s]];return c.forEach(([e,t])=>pd.on(e,t)),()=>{console.log(`Unsubscribing from context events`),t(),r?.(),c.forEach(([e,t])=>pd.off(e,t))}},[]);let ee=async t=>{if(t.preventDefault(),!h.trim()||!C||!l.trim()){N({title:`Missing Fields`,description:`Context ID, Context URL and Workspace are required.`,variant:`destructive`});return}E(!0);try{let t={id:l,name:d.trim()||void 0,url:h,description:_.trim()||void 0,metadata:{ui:{color:y}},workspaceId:C,baseUrl:x||void 0,treeType:p},n=await bs(t);u(``),f(``),g(`/`),v(``),b(null),S(`/`),await P(),N({title:`Success`,description:`Context created successfully`}),O(!1),window.dispatchEvent(new CustomEvent(`contexts:refresh`)),e(`/contexts/${n.id}`)}catch(e){let t=xO(e,`Context creation error:`,`Failed to create context`);N({title:`Error`,description:t,variant:`destructive`})}finally{E(!1)}},F=async e=>{let n=t.find(t=>t.id===e);if(n&&n.url&&(n.url.endsWith(`/default`)||n.url.includes(`://default`))){N({title:`Error`,description:`Cannot delete the default context`,variant:`destructive`});return}M(e)},I=async()=>{if(j)try{await ks(j),n(e=>e.filter(e=>!os(e,{id:j}))),N({title:`Success`,description:`Context deleted successfully`})}catch(e){console.error(`Context deletion error:`,e);let t=`Failed to delete context`;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 delete context`}N({title:`Error`,description:t,variant:`destructive`})}finally{M(null)}},L=t=>{let n=t.isShared||t.type===`shared`;e(n?`/contexts/${t.id}?ownerId=${encodeURIComponent(t.userId)}`:`/contexts/${t.id}`)},R=e=>{A(e)},te=async e=>{if(e.preventDefault(),k)try{n(e=>e.map(e=>e.id===k.id&&e.userId===k.userId?k:e)),N({title:`Success`,description:`Context updated successfully (mock update)`}),A(null)}catch(e){let t=e instanceof Error?e.message:`Failed to update context`;N({title:`Error`,description:t,variant:`destructive`})}},z=(0,Z.useMemo)(()=>({type:e=>e.isShared||e.type===`shared`?`shared`:`owned`,id:e=>e.id??``,owner:e=>e.isShared||e.type===`shared`?e.ownerEmail||e.userId||``:`you`,url:e=>e.url??``,workspaceId:e=>e.workspaceId??``,baseUrl:e=>e.baseUrl??``,path:e=>e.path??``,locked:e=>+!!e.locked,created:e=>Date.parse(e.createdAt)||0,updated:e=>Date.parse(e.updatedAt)||0}),[]),{sorted:ne,sort:B,toggleSort:re}=Eg(t.filter(e=>e!=null),z);return(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{title:`Contexts`,description:`Create and manage contexts in your workspaces. View contexts shared with you.`,actions:!D&&(0,Q.jsxs)(X,{onClick:()=>O(!0),className:`max-sm:h-9 max-sm:w-9 max-sm:p-0`,"aria-label":`Create context`,title:`Create context`,children:[(0,Q.jsx)(cn,{className:`h-4 w-4 sm:mr-2`}),(0,Q.jsx)(`span`,{className:`max-sm:hidden`,children:`Create Context`})]})}),D&&(0,Q.jsx)(Xw,{title:`Create New Context`,onClose:()=>O(!1),children:(0,Q.jsxs)(`form`,{onSubmit:ee,className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`workspace`,className:`block text-sm font-medium mb-1`,children:`Workspace`}),(0,Q.jsxs)(`select`,{id:`workspace`,className:`w-full px-3 py-2 border border-border rounded-md shadow-elevation-1 focus:outline-none focus:ring-primary focus:border-primary`,value:C,onChange:e=>w(e.target.value),disabled:T||r.length===0,children:[r.length===0&&(0,Q.jsx)(`option`,{value:``,children:`No workspaces available. Create one first.`}),r.map(e=>(0,Q.jsx)(`option`,{value:e.id,children:e.label||e.name},`${e.owner}-${e.id}`))]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`newContextId`,className:`block text-sm font-medium mb-1`,children:`Context ID`}),(0,Q.jsx)(J,{id:`newContextId`,value:l,onChange:e=>u(e.target.value),placeholder:`e.g., my-new-context`,disabled:T})]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`url`,className:`block text-sm font-medium mb-1`,children:`Context URL`}),(0,Q.jsx)(Ym,{id:`url`,value:h,onChange:g,placeholder:`e.g., /project/path/resource`,disabled:T,pickerTitle:`Context URL path…`,onPickTarget:(e,t)=>{g(e),m(t.treeType);let n=r.find(e=>e.name===t.workspaceName||e.id===t.workspaceName);n&&w(n.id)}})]}),(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`baseUrl`,className:`block text-sm font-medium mb-1`,children:`Base URL (Optional)`}),(0,Q.jsx)(Ym,{id:`baseUrl`,value:x,onChange:S,format:`path`,placeholder:`e.g., /base/path`,disabled:T,pickerTitle:`Base path…`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`description`,className:`block text-sm font-medium mb-1`,children:`Description (Optional)`}),(0,Q.jsx)(J,{id:`description`,value:_,onChange:e=>v(e.target.value),placeholder:`Description`,disabled:T})]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`contextColor`,className:`block text-sm font-medium mb-1`,children:`Color (Optional)`}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(J,{id:`contextColor`,type:`color`,value:y||`#808080`,onChange:e=>b(e.target.value),className:`h-10 w-16 p-1`,disabled:T}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:T||y===null,onClick:()=>b(null),children:`Use inherited color`})]}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:y===null?`Uses the tree folder or workspace color.`:`Applies only to this context.`})]}),(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`contextName`,className:`block text-sm font-medium mb-1`,children:`Name (Optional)`}),(0,Q.jsx)(J,{id:`contextName`,value:d,onChange:e=>f(e.target.value),placeholder:`My Context`,disabled:T})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`treeType`,className:`block text-sm font-medium mb-1`,children:`Tree`}),(0,Q.jsxs)(`select`,{id:`treeType`,className:`w-full px-3 py-2 border border-border rounded-md shadow-elevation-1 focus:outline-none focus:ring-primary focus:border-primary`,value:p,onChange:e=>m(e.target.value),disabled:T,children:[(0,Q.jsx)(`option`,{value:`context`,children:`Context tree`}),(0,Q.jsx)(`option`,{value:`directory`,children:`Directory tree`})]}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Which workspace tree this context navigates.`})]})]}),(0,Q.jsxs)(X,{type:`submit`,disabled:T||!h.trim()||!C||!l.trim(),children:[(0,Q.jsx)(cn,{className:`mr-2 h-4 w-4`}),`Create Context`]})]})}),(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsx)(`h2`,{className:`text-xl font-semibold`,children:`Your Contexts & Shared Contexts`}),a&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading contexts...`}),s&&(0,Q.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Q.jsx)(`p`,{children:s})}),!a&&!s&&t.length===0&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No contexts found. Create one above.`}),t.length>0&&(0,Q.jsx)(`div`,{className:`border rounded-lg overflow-hidden`,children:(0,Q.jsxs)(_g,{children:[(0,Q.jsx)(vg,{children:(0,Q.jsxs)(xg,{children:[(0,Q.jsx)(Tg,{label:`Type`,sortKey:`type`,sort:B,onSort:re}),(0,Q.jsx)(Tg,{label:`ID`,sortKey:`id`,sort:B,onSort:re}),(0,Q.jsx)(Tg,{label:`Owner`,sortKey:`owner`,sort:B,onSort:re}),(0,Q.jsx)(Tg,{label:`Context URL`,sortKey:`url`,sort:B,onSort:re}),(0,Q.jsx)(Tg,{label:`Workspace ID`,sortKey:`workspaceId`,sort:B,onSort:re}),(0,Q.jsx)(Tg,{label:`Base URL`,sortKey:`baseUrl`,sort:B,onSort:re}),(0,Q.jsx)(Tg,{label:`Path`,sortKey:`path`,sort:B,onSort:re}),(0,Q.jsx)(Tg,{label:`Locked`,sortKey:`locked`,sort:B,onSort:re}),(0,Q.jsx)(Tg,{label:`Created`,sortKey:`created`,sort:B,onSort:re}),(0,Q.jsx)(Tg,{label:`Updated`,sortKey:`updated`,sort:B,onSort:re}),(0,Q.jsx)(Sg,{className:`text-right`,children:`Actions`})]})}),(0,Q.jsx)(yg,{children:ne.map(e=>{if(!e)return console.warn(`Found null/undefined context in contexts array, skipping`),null;let t=e.createdAt?new Date(e.createdAt).toLocaleDateString():`-`,n=e.updatedAt?new Date(e.updatedAt).toLocaleDateString():`-`,r=e.isShared||e.type===`shared`,i=r?e.ownerEmail||e.userId||`-`:`You`,a=r&&e.sharedVia?typeof e.sharedVia==`string`?e.sharedVia:e.sharedVia.accessLevel||`-`:`-`;return(0,Q.jsxs)(xg,{children:[(0,Q.jsx)(Cg,{children:r?(0,Q.jsxs)(`div`,{className:`flex items-center gap-1 text-info`,title:`Shared with you (${a})`,children:[(0,Q.jsx)(Mn,{className:`h-4 w-4`}),(0,Q.jsx)(`span`,{className:`text-xs`,children:`Shared`})]}):(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Owned`})}),(0,Q.jsx)(Cg,{className:`font-mono text-sm`,children:e.id||`-`}),(0,Q.jsx)(Cg,{className:`font-mono text-sm`,title:r?`Owned by: ${i}`:`You are the owner`,children:i}),(0,Q.jsx)(Cg,{className:`font-mono text-sm max-w-xs truncate`,title:e.url||`-`,children:e.url||`-`}),(0,Q.jsx)(Cg,{className:`font-mono text-sm`,children:e.workspaceId||`-`}),(0,Q.jsx)(Cg,{className:`font-mono text-sm`,children:e.baseUrl||`-`}),(0,Q.jsx)(Cg,{className:`font-mono text-sm`,children:e.path||`-`}),(0,Q.jsx)(Cg,{children:e.locked?`Yes`:`No`}),(0,Q.jsx)(Cg,{children:t}),(0,Q.jsx)(Cg,{children:n}),(0,Q.jsx)(Cg,{className:`text-right`,children:(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[!r&&(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>R(e),title:`Edit Context`,children:(0,Q.jsx)(an,{className:`h-4 w-4`})}),(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>L(e),title:r?`Open Shared Context`:`Open Context Details`,children:(0,Q.jsx)(vt,{className:`h-4 w-4`})}),!r&&(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>F(e.id),disabled:!!(e.url&&(e.url.endsWith(`/default`)||e.url.includes(`://default`))),className:`text-destructive hover:bg-destructive/10 hover:text-destructive disabled:opacity-50 disabled:cursor-not-allowed`,title:e.url&&(e.url.endsWith(`/default`)||e.url.includes(`://default`))?`Cannot delete default context`:`Delete Context`,children:(0,Q.jsx)(st,{className:`h-4 w-4`})})]})})]},`${e.userId}-${e.id}`)})})]})})]}),k&&(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsx)(`h2`,{className:`text-xl font-semibold`,children:`Edit Context`}),(0,Q.jsxs)(`form`,{onSubmit:te,className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`edit-context-id`,className:`block text-sm font-medium mb-1`,children:`Context ID (read-only)`}),(0,Q.jsx)(J,{id:`edit-context-id`,value:k.id,disabled:!0,className:`bg-muted`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`edit-context-url`,className:`block text-sm font-medium mb-1`,children:`Context URL`}),(0,Q.jsx)(Ym,{id:`edit-context-url`,value:k.url,onChange:e=>A(t=>t?{...t,url:e}:null),placeholder:`workspace://path or /path`,pickerTitle:`Context URL path…`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`Use format: workspace://path or /path for current workspace`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`edit-base-url`,className:`block text-sm font-medium mb-1`,children:`Base URL (optional)`}),(0,Q.jsx)(Ym,{id:`edit-base-url`,value:k.baseUrl||``,onChange:e=>A(t=>t?{...t,baseUrl:e||null}:null),format:`path`,placeholder:`/base/path`,pickerTitle:`Base path…`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`Restricts context navigation to this base path`})]}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(X,{type:`submit`,children:`Save Changes`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,onClick:()=>A(null),children:`Cancel`})]})]})]}),(0,Q.jsx)(Lr,{open:j!==null,onOpenChange:e=>!e&&M(null),children:(0,Q.jsxs)(kr,{children:[(0,Q.jsxs)(Ir,{children:[(0,Q.jsx)(wr,{children:`Delete Context`}),(0,Q.jsx)(Cr,{children:`Are you sure you want to delete this context? This action cannot be undone.`})]}),(0,Q.jsxs)(Nr,{children:[(0,Q.jsx)(Fr,{children:`Cancel`}),(0,Q.jsx)(Mr,{onClick:I,className:`bg-destructive text-destructive-foreground hover:bg-destructive/90`,children:`Delete`})]})]})})]})}function CO(e,t){if(!e||!t)return`/`;let n=`${t}://`;if(!e.startsWith(n))return`/`;let r=e.slice(n.length).replace(/^\/+/,``).replace(/\/+$/,``);return r?`/${r}`:`/`}function wO(){let{contextId:e}=yl(),t=fl(),n=hl(),r=new URLSearchParams(t.search).get(`ownerId`)||void 0,i=(0,Z.useMemo)(()=>{let e=new URLSearchParams(t.search),n=e.getAll(`q`).map(e=>e.trim()).filter(Boolean),r=(e.get(`search`)||``).trim();return n.length?n:r?[r]:[]},[t.search]),{showToast:a,showProgress:o}=Hr(),{state:s,saveFilters:c,setSort:l,setAccentColor:u,setMapDocuments:d}=Rs(),{openM1Drawer:f,openM2Drawer:p,goBack:m}=jT(),h=s.filters.features.allOf,g=s.filters.features.anyOf,_=s.filters.features.noneOf,v=[...Jy(s.filters.timeline),...Gy(s.filters.geo),...Ky(s.filters.lens,s.filters.geo.includeUnlocated)],y=JSON.stringify({a:h,b:g,c:_,d:v,ids:s.filters.lens.ids,sort:s.filters.sort,geoSelection:s.geoSelection,includeUnlocated:s.filters.geo.includeUnlocated}),b=(0,Z.useMemo)(()=>JSON.parse(y),[y]),[x,S]=(0,Z.useState)(null),[C,w]=(0,Z.useState)(!0),[T,E]=(0,Z.useState)(null),[D,O]=(0,Z.useState)([]),[k,A]=(0,Z.useState)(!1),[j,M]=(0,Z.useState)(0),[N,P]=(0,Z.useState)([]),[ee,F]=(0,Z.useState)(1),[I,L]=(0,Z.useState)(50),[R,te]=(0,Z.useState)(i),[z,ne]=(0,Z.useState)(!1),[B,re]=(0,Z.useState)(null),[V,ie]=(0,Z.useState)(!1),ae=(0,Z.useRef)(!1),oe=B?.id===x?.id&&B?.url===x?.url?B?.path:null,H=new URLSearchParams(t.search).get(`layer`),se=!!r,ce=lD(se?void 0:x?.workspaceName||x?.workspaceId),U=x?CO(x.url,x.workspaceName):`/`,le=H?`context-layer`:`context`,ue=!s.liveEnabled&&typeof x?.metadata?.toolboxSearchQuery==`string`?x.metadata.toolboxSearchQuery:``,de=se?null:x?.workspaceName??null,[fe,pe]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{if(!de)return;let e=!1;return Ci(de,lo).then(t=>{e||pe({key:de,tree:t})}).catch(()=>{e||pe({key:de,tree:null})}),()=>{e=!0}},[de]);let me=de&&fe?.key===de?fe.tree:null,he=!H&&!se&&me?U===`/`?me:gi(me,U):null,W=`${x?.workspaceName??``}\0${U}`,[ge,_e]=(0,Z.useState)(null),ve=ge?.key===W?ge.views:_E(he?.metadata),ye=ge?.key===W?ge.activeId:ve[0]?.id??hE.id,G=ve.find(e=>e.id===ye)??ve[0]??hE,K=mE(G),be=e=>{F(1),_e({key:W,views:ve,activeId:e})},xe=(e,t)=>{t&&t!==ye&&F(1),_e({key:W,views:e,activeId:t??ye}),x?.workspaceName&&fa(x.workspaceName,U,{metadata:{...he?.metadata??{},views:e}},lo).catch(()=>{a({title:`View not saved`,description:`Could not persist views to the layer`,variant:`destructive`})})},Se=(0,Z.useRef)(null);(0,Z.useEffect)(()=>()=>Se.current?.abort(),[]);let Ce=(0,Z.useCallback)(async()=>{if(!e)return;Se.current?.abort();let t=new AbortController;Se.current=t,A(!0);try{let n=await xs(e,K?[...b.a,K]:b.a,b.d,{...b.sort,geoSelection:b.geoSelection,includeUnlocated:b.includeUnlocated,ids:b.ids,signal:t.signal,limit:I,page:ee,queries:R.length?R:void 0,anyOf:b.b,noneOf:b.c,applyContextSpec:!1},r);if(t.signal.aborted)return;O(n),M(n.totalCount||n.count||n.length)}catch(e){if(t.signal.aborted)return;a({title:`Error`,description:e instanceof Error?e.message:`Failed to fetch documents`,variant:`destructive`}),O([]),M(0)}finally{t.signal.aborted||A(!1)}},[e,ee,I,r,R,b,a,K]),we=(0,Z.useCallback)(async()=>{if(e){w(!0);try{let t=se?await Ss(e,r):await Ss(e);if(!t)throw Error(`No context data received.`);let n=t.workspace,i=t.workspaceId||(typeof n==`string`?n:n?.id)||``,a=t.workspaceName||(typeof n==`string`?n:n?.name)||``;S({id:t.id,userId:t.userId,url:t.url,baseUrl:t.baseUrl||null,path:t.path||null,pathArray:t.pathArray||[],workspaceId:i,workspaceName:a,acl:t.acl||{},createdAt:t.createdAt,updatedAt:t.updatedAt,locked:t.locked||!1,serverContextArray:t.serverContextArray||[],clientContextArray:t.clientContextArray||[],contextBitmapArray:t.contextBitmapArray||[],featureBitmapArray:t.featureBitmapArray||[],filterArray:t.filterArray||[],pendingUrl:t.pendingUrl||null,description:t.description||null,metadata:t.metadata||{},name:t.name??null,color:t.color??null,icon:t.icon??null}),E(null)}catch(t){let n=t instanceof Error?t.message:`Failed to fetch context ${e}`;E(n),S(null),a({title:`Error`,description:n,variant:`destructive`})}w(!1)}},[e,r,se,a]);(0,Z.useEffect)(()=>{we()},[we]);let Te=Cm(x?.color)||null;(0,Z.useEffect)(()=>(u(Te),()=>u(null)),[Te,u]);let Ee=s.geoSelection,De=x?.workspaceName||x?.workspaceId||null;(0,Z.useEffect)(()=>{d(D,De)},[D,De,d]),(0,Z.useEffect)(()=>()=>d([]),[d]);let Oe=(0,Z.useMemo)(()=>Ee?D.filter(e=>Fy(e,Ee,s.filters.geo.includeUnlocated)):D,[D,Ee,s.filters.geo.includeUnlocated]),ke=x?.id,Ae=x?.url;(0,Z.useEffect)(()=>{ke&&Ce()},[ke,Ae,Ce]),(0,Z.useEffect)(()=>{let e=()=>Ce();return window.addEventListener(`workspace:documents:refresh`,e),()=>window.removeEventListener(`workspace:documents:refresh`,e)},[Ce]);let[je,Me]=(0,Z.useState)(y);je!==y&&(Me(y),F(1));let[Ne,Pe]=(0,Z.useState)(e);Ne!==e&&(Pe(e),F(1),ne(!1));let[Fe,Ie]=(0,Z.useState)(i);Fe!==i&&(Ie(i),te(i),F(1));let[Le,Re]=(0,Z.useState)({urlSearchQueries:i,ignoreSavedSearch:z,savedContextSearchQuery:ue});(Le.urlSearchQueries!==i||Le.ignoreSavedSearch!==z||Le.savedContextSearchQuery!==ue)&&(Re({urlSearchQueries:i,ignoreSavedSearch:z,savedContextSearchQuery:ue}),!new URLSearchParams(t.search).has(`q`)&&!i.length&&!z&&(te(ue?[ue]:[]),F(1)));let ze=(0,Z.useCallback)(e=>{let r=new URLSearchParams(t.search);r.delete(`q`),r.delete(`search`);for(let t of e)r.append(`q`,t);let i=r.toString();n(`${t.pathname}${i?`?${i}`:``}${t.hash}`)},[t.pathname,t.search,t.hash,n]),Be=(0,Z.useCallback)(e=>{let t=e.trim();if(!t)return;ne(!1);let n=R.includes(t)?R:[...R,t];te(n),ze(n)},[R,ze]),Ve=(0,Z.useCallback)(e=>{let t=e<0?[]:R.filter((t,n)=>n!==e);t.length===0&&ne(!0),te(t),ze(t)},[R,ze]),He=(R[0]||``).trim(),Ue=!!s.activeContextType&&(s.isDirty||He!==(s.savedSearchQuery||ue||``));(0,Z.useEffect)(()=>{if(!e)return;let t=`context:${r?`${r}/`:``}${e}`,n=()=>pd.emit(`subscribe`,{channel:t}),i=()=>pd.emit(`unsubscribe`,{channel:t}),a=pd.on(`connect`,n);n();let o=new Map,s=(t,n)=>{let r=Date.now(),i=`${t}:${n?.id||n?.contextId||e}`;return(o.get(i)||0)+1e3>r?!1:(o.set(i,r),!0)},c=t=>{let n=t,r=n?.context||n;(r?.id===e||r?.contextId===e)&&s(`ctx:updated`,r)&&(S(e=>e?{...e,...r}:null),r.url&&Ce())},l=t=>{let n=t,r=n?.id||n?.contextId||n?.context?.id,i=n?.url||n?.context?.url;r===e&&typeof i==`string`&&s(`ctx:url`,n)&&(S(e=>e?{...e,url:i}:null),Ce())},u=t=>{let n=t;(n?.contextId||n?.id||n?.context?.id)===e&&s(`doc:changed`,n)&&Ce()},d=[[`context.updated`,c],[`context:updated`,c],[`context.url.set`,l],[`context:url:set`,l],[`document.inserted`,u],[`document.updated`,u],[`document.removed`,u],[`document.removed.batch`,u],[`document.linked`,u],[`document.unlinked`,u],[`document.linked.batch`,u],[`document.unlinked.batch`,u],[`document.deleted`,u],[`document.deleted.batch`,u]];return d.forEach(([e,t])=>pd.on(e,t)),()=>{a(),i(),d.forEach(([e,t])=>pd.off(e,t))}},[e,r,Ce]);let We=async e=>{if(x)try{await Ts(x.id,[e],r,U),O(t=>t.filter(t=>t.id!==e)),M(e=>Math.max(0,e-1)),a({title:`Success`,description:`Document removed from context.`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Failed to remove document`,variant:`destructive`})}},Ge=async e=>{if(x)try{await Ds(x.id,[e],r,U),O(t=>t.filter(t=>t.id!==e)),M(e=>Math.max(0,e-1)),a({title:`Success`,description:`Document deleted.`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Failed to delete document`,variant:`destructive`})}},Ke=async e=>{if(x)try{await Ts(x.id,e,r,U),O(t=>t.filter(t=>!e.includes(t.id))),M(t=>Math.max(0,t-e.length)),a({title:`Success`,description:`${e.length} document(s) removed.`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Failed to remove documents`,variant:`destructive`})}},qe=async e=>{if(x)try{await Ds(x.id,e,r,U),O(t=>t.filter(t=>!e.includes(t.id))),M(t=>Math.max(0,t-e.length)),a({title:`Success`,description:`${e.length} document(s) deleted.`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Failed to delete documents`,variant:`destructive`})}},Je=e=>{P(e),a({title:`Copied`,description:`${e.length} document(s) copied to clipboard`})},Ye=async(e,t,n={})=>{if(!x)return!1;let i=o({title:`Pasting…`,description:`${t.length} document(s) → "${e}"`});try{let a=n.targetTreeName&&!se?await Bi(x.workspaceName||x.workspaceId,e,t,n.targetTreeName,n.targetTreeType):await ns(x.id,e,t,r);return i.done(a?{title:`Success`,description:`${t.length} document(s) pasted to "${e}"`}:void 0),a&&(P([]),await Ce()),a}catch(e){return i.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to paste documents`,variant:`destructive`}),!1}},Xe=async(e,t)=>{if(!x)return!1;try{let n=await Ls(x.workspaceId,t,e);return n&&(Eb(x.workspaceName||x.workspaceId,`context`,t),a({title:`Success`,description:`Imported ${e.length} document(s) to "${t}"`})),n}catch(e){return a({title:`Error`,description:e instanceof Error?e.message:`Failed to import documents`,variant:`destructive`}),!1}},Ze=async()=>{if(!x||!oe||se||ae.current)return;let e={id:x.id,url:x.url,path:oe};ae.current=!0,ie(!0);try{let t=await rs(e.id,`${x.workspaceName}://${e.path.replace(/^\/+/,``)}`);S(n=>n?.id===e.id&&n.url===e.url?{...n,url:t.url,path:e.path}:n),re(null),F(1),window.dispatchEvent(new CustomEvent(`contexts:refresh`,{detail:{contextId:e.id}})),a({title:`Saved`,description:`Context path updated`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Could not update context path`,variant:`destructive`})}finally{ae.current=!1,ie(!1)}};if(C)return(0,Q.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,Q.jsxs)(`div`,{className:`text-center space-y-2`,children:[(0,Q.jsx)(`div`,{className:`animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading context...`})]})});if(T&&!x)return(0,Q.jsxs)(`div`,{className:`flex items-center justify-center h-full text-destructive`,children:[`Error: `,T]});if(!x)return(0,Q.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:`Context not found.`});let Qe=Cm(x.color);return(0,Q.jsx)(`div`,{className:`flex flex-col h-full min-h-0`,children:(0,Q.jsx)(fE,{onBack:m,accentColor:Qe,navigationTabs:he?(0,Q.jsx)(yE,{views:ve,activeId:ye,onSelect:be,onSave:xe,accentColor:Qe}):void 0,workspaceLabel:ce?.label||x.workspaceName||x.workspaceId,workspaceIcon:ce?.icon,treeName:lo,urlType:le,urlDisplay:x.url,contextPath:U,workspaceId:x.workspaceName||x.workspaceId,documentSchema:K,linkTree:me,documents:Oe,isLoading:k,totalCount:j,currentPage:ee,pageSize:I,onPageChange:F,onPageSizeChange:e=>{L(e),F(1)},onRemoveDocument:U===`/`?void 0:We,onDeleteDocument:Ge,onRemoveDocuments:U===`/`?void 0:Ke,onDeleteDocuments:qe,onCopyDocuments:Je,onPasteDocuments:Ye,onImportDocuments:se?void 0:Xe,pastedDocumentIds:N,backendSearchQueries:R,onBackendSearch:Be,serverSort:s.filters.sort,onServerSortChange:l,onRemoveBackendQuery:Ve,canSaveChanges:Ue,isSavingChanges:s.isSaving,onSaveChanges:c,onBrowseTree:!se&&e?()=>p(`contexts`,`detail`,e):void 0,onBrowseWorkspaces:()=>f(`workspaces`),onNavigatePath:se?void 0:e=>{ae.current||re({id:x.id,url:x.url,path:e})},contentBanner:oe?(0,Q.jsxs)(`div`,{className:`border-b bg-warning/10 px-4 py-2`,role:`status`,children:[(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Set this context to the selected path? Contents stay at the current path until you apply it.`}),(0,Q.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,Q.jsx)(Im,{items:Lm(oe,x.workspaceName),label:`Selected context path`}),(0,Q.jsx)(`button`,{type:`button`,disabled:V,onClick:()=>void Ze(),className:`shrink-0 rounded border px-3 py-1 text-sm hover:bg-accent disabled:opacity-50`,children:V?`Setting…`:`Set`}),(0,Q.jsx)(`button`,{type:`button`,disabled:V,onClick:()=>re(null),className:`shrink-0 rounded px-2 py-1 text-sm hover:bg-accent disabled:opacity-50`,children:`Cancel`})]})]}):void 0,children:G.kind===`columns`?(0,Q.jsx)(TE,{documents:Oe,workspaceId:x.workspaceName||x.workspaceId,columns:G.columns??[],onColumnsChange:e=>xe(ve.map(t=>t.id===G.id?{...t,columns:e}:t))}):G.kind===`app`&&G.app&&G.app!==`notes`?(0,Q.jsx)(SE,{app:G.app,contextId:e,workspaceId:x.workspaceName||x.workspaceId,treeName:lo,path:U}):null})})}function TO(){let{goBack:e}=jT();return e}function EO(){let[e,t]=(0,Z.useState)([]),[n,r]=(0,Z.useState)(!0),[i,a]=(0,Z.useState)(null),[o,s]=(0,Z.useState)(``),[c,l]=(0,Z.useState)(!1),[u,d]=(0,Z.useState)(``),[f,p]=(0,Z.useState)(!1),{showToast:m}=Hr(),h=(0,Z.useRef)(null),g=(0,Z.useCallback)(async()=>{try{r(!0);let e=await Y.get(Sr.tokens),n=Array.isArray(e)?e:e.tokens||[];t(n),a(null)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch tokens`;a(t),m({title:`Error`,description:t,variant:`destructive`})}finally{r(!1)}},[m]);(0,Z.useEffect)(()=>{g()},[g]);let _=async()=>{if(!(!o.trim()||c)){l(!0);try{let e=await Y.post(Sr.tokens,{name:o});s(``),await g(),e&&e.token&&(d(e.token),setTimeout(()=>{if(h.current){h.current.focus();let e=document.createRange();e.selectNodeContents(h.current);let t=window.getSelection();t&&(t.removeAllRanges(),t.addRange(e))}},100)),m({title:`Success`,description:`Token generated successfully`,variant:`default`})}catch(e){let t=e instanceof Error?e.message:`Failed to generate token`;a(t),m({title:`Error`,description:t,variant:`destructive`})}finally{l(!1)}}},v=async e=>{if(confirm(`Are you sure you want to revoke this API token? This action cannot be undone.`))try{await Y.delete(`${Sr.tokens}/${e}`),await g(),m({title:`Success`,description:`API token revoked successfully`})}catch(e){let t=e instanceof Error?e.message:`Failed to revoke API token`;m({title:`Error`,description:t,variant:`destructive`})}},y=async e=>{try{await navigator.clipboard.writeText(e),p(!0),m({title:`Success`,description:`Token copied to clipboard`}),setTimeout(()=>p(!1),2e3)}catch{m({title:`Error`,description:`Failed to copy token to clipboard`,variant:`destructive`})}};return(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{title:`API Tokens`,onBack:TO(),description:`Create and manage API tokens for programmatic access`}),(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsx)(`h2`,{className:`text-xl font-semibold`,children:`Generate New API Token`}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(J,{value:o,onChange:e=>s(e.target.value),placeholder:`Token Name (e.g., 'CLI Access', 'Automation')`,disabled:c,className:`flex-1`}),(0,Q.jsxs)(X,{type:`button`,disabled:c||!o.trim(),onClick:_,children:[(0,Q.jsx)(cn,{className:`mr-2 h-4 w-4`}),c?`Generating...`:`Generate`]})]}),u&&(0,Q.jsxs)(`div`,{className:`p-4 border rounded-md bg-muted/50`,children:[(0,Q.jsxs)(`div`,{className:`flex justify-between items-center mb-2`,children:[(0,Q.jsx)(`h3`,{className:`font-semibold`,children:`Your New API Token`}),(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>y(u),children:f?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(ae,{className:`mr-2 h-4 w-4`}),`Copied`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(A,{className:`mr-2 h-4 w-4`}),`Copy`]})})]}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground mb-2`,children:`Make sure to copy your API token now. You won't be able to see it again!`}),(0,Q.jsx)(`div`,{ref:h,tabIndex:0,className:`p-2 bg-background border rounded font-mono text-sm break-all outline-none focus:ring-2 focus:ring-ring`,children:u})]})]}),(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsx)(`h2`,{className:`text-xl font-semibold`,children:`Your API Tokens`}),n&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading API tokens...`}),i&&(0,Q.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Q.jsx)(`p`,{children:i})}),!n&&!i&&e.length===0&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No API tokens found`}),e.length>0&&(0,Q.jsx)(`div`,{className:`border rounded-md`,children:(0,Q.jsx)(`div`,{className:`overflow-x-auto`,children:(0,Q.jsxs)(`table`,{className:`w-full`,children:[(0,Q.jsx)(`thead`,{children:(0,Q.jsxs)(`tr`,{className:`bg-muted/50`,children:[(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Name`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Created`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Last Used`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Expires`}),(0,Q.jsx)(`th`,{className:`text-right p-3 font-medium`,children:`Actions`})]})}),(0,Q.jsx)(`tbody`,{children:e.map(e=>(0,Q.jsxs)(`tr`,{className:`border-t`,children:[(0,Q.jsx)(`td`,{className:`p-3 font-medium`,children:e.name}),(0,Q.jsx)(`td`,{className:`p-3`,children:new Date(e.createdAt).toLocaleDateString()}),(0,Q.jsx)(`td`,{className:`p-3`,children:e.lastUsedAt?new Date(e.lastUsedAt).toLocaleDateString():`Never`}),(0,Q.jsx)(`td`,{className:`p-3`,children:e.expiresAt?new Date(e.expiresAt).toLocaleDateString():`Never`}),(0,Q.jsx)(`td`,{className:`p-3 text-right`,children:(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>v(e.id),className:`text-destructive hover:bg-destructive/10 hover:text-destructive`,children:(0,Q.jsx)(st,{className:`h-4 w-4`})})})]},e.id))})]})})})]})]})}async function DO(){return await Y.get(Sr.devices)||[]}async function OO(e,t){return await Y.patch(`${Sr.devices}/${encodeURIComponent(e)}`,t)}async function kO(e){await Y.delete(`${Sr.devices}/${encodeURIComponent(e)}`)}async function AO(e){return await Y.get(`${Sr.workspaces}/${e}/devices`)||[]}async function jO(e,t){let n=await Y.post(`${Sr.workspaces}/${e}/devices`,{deviceId:t});return Array.isArray(n)?n:[n]}async function MO(e,t){await Y.delete(`${Sr.workspaces}/${e}/devices/${encodeURIComponent(t)}`)}function NO({device:e,onUpdated:t,onRemoved:n}){let[r,i]=(0,Z.useState)(!1),[a,o]=(0,Z.useState)(e.name),[s,c]=(0,Z.useState)(e.description??``),[l,u]=(0,Z.useState)(!1),[d,f]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)(!1),{showToast:h}=Hr(),g=Object.values(e.mirrors??{}),_=async()=>{m(!0);try{await kO(e.deviceId),n(e.deviceId),h({title:`Revoked`,description:`${e.name} can no longer sign in; a running mirror stops on its next request.`})}catch(e){h({title:`Error`,description:e instanceof Error?e.message:`Failed to revoke device`,variant:`destructive`}),f(!1)}finally{m(!1)}},v=async()=>{let n=a.trim();if(n){if(n===e.name&&s.trim()===(e.description??``)){i(!1);return}u(!0);try{let r=await OO(e.deviceId,{name:n,description:s.trim()||void 0});t({...e,...r}),i(!1),h({title:`Saved`,description:`Device updated`})}catch(e){h({title:`Error`,description:e instanceof Error?e.message:`Failed to update device`,variant:`destructive`})}finally{u(!1)}}},y=()=>{o(e.name),c(e.description??``),i(!1)},b=e=>e?new Date(e).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):`—`;return(0,Q.jsx)(`div`,{className:`rounded-lg border p-4`,children:(0,Q.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start gap-3 min-w-0`,children:[(0,Q.jsx)(In,{className:`h-4 w-4 text-muted-foreground mt-0.5 shrink-0`}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[r?(0,Q.jsxs)(`div`,{className:`space-y-2 mb-2`,children:[(0,Q.jsx)(J,{value:a,onChange:e=>o(e.target.value),className:`h-7 text-sm`,placeholder:`Device name`,autoFocus:!0,disabled:l,onKeyDown:e=>{e.key===`Enter`&&v(),e.key===`Escape`&&y()}}),(0,Q.jsx)(J,{value:s,onChange:e=>c(e.target.value),className:`h-7 text-xs`,placeholder:`Description (optional)`,disabled:l,onKeyDown:e=>{e.key===`Enter`&&v(),e.key===`Escape`&&y()}})]}):(0,Q.jsxs)(`div`,{className:`mb-1`,children:[(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:e.name}),e.description&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5`,children:e.description})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-x-3 gap-y-0.5 text-[11px] font-mono text-muted-foreground`,children:[(0,Q.jsx)(`span`,{title:`Device ID`,children:e.deviceId}),e.platform&&(0,Q.jsx)(`span`,{children:e.platform}),e.arch&&(0,Q.jsx)(`span`,{children:e.arch}),e.type&&(0,Q.jsx)(`span`,{className:`capitalize`,children:e.type})]}),(0,Q.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-x-4 text-[11px] text-muted-foreground`,children:[e.createdAt&&(0,Q.jsxs)(`span`,{children:[`registered `,b(e.createdAt)]}),e.updatedAt&&e.updatedAt!==e.createdAt&&(0,Q.jsxs)(`span`,{children:[`updated `,b(e.updatedAt)]}),e.lastSeen&&(0,Q.jsxs)(`span`,{children:[`seen `,b(e.lastSeen)]})]}),g.length>0&&(0,Q.jsx)(`div`,{className:`mt-3 space-y-1.5`,children:g.map(e=>(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-0.5 rounded-md bg-muted/50 px-2 py-1.5 text-[11px]`,children:[(0,Q.jsx)(pe,{className:`h-3.5 w-3.5 text-muted-foreground shrink-0`}),(0,Q.jsx)(`span`,{className:`font-medium`,children:e.workspaceName||e.workspaceId}),e.client&&(0,Q.jsx)(`span`,{className:`font-mono uppercase text-muted-foreground`,children:e.client}),e.path&&(0,Q.jsx)(`span`,{className:`font-mono text-muted-foreground truncate max-w-[24rem]`,title:e.path,children:e.path}),(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:e.state||`idle`}),(e.pending??0)>0&&(0,Q.jsxs)(`span`,{className:`text-muted-foreground`,children:[`pending `,e.pending]}),(e.conflicts??0)>0&&(0,Q.jsxs)(`span`,{className:`text-amber-600 dark:text-amber-400`,children:[`conflicts `,e.conflicts]}),(0,Q.jsxs)(`span`,{className:`text-muted-foreground`,children:[`synced `,b(e.lastSync)]})]},e.workspaceId))})]})]}),(0,Q.jsx)(`div`,{className:`flex shrink-0 items-center gap-2`,children:d?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(X,{type:`button`,variant:`destructive`,size:`sm`,onClick:_,disabled:p,children:p?`Revoking…`:`Confirm revoke`}),(0,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>f(!1),disabled:p,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]}):r?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:v,disabled:l||!a.trim(),children:(0,Q.jsx)(ae,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`sm`,onClick:y,disabled:l,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>i(!0),title:`Edit name / description`,children:(0,Q.jsx)(ve,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>f(!0),title:`Revoke this device: its tokens stop working and its mirrors stop syncing`,children:(0,Q.jsx)(Qn,{className:`h-3.5 w-3.5`})})]})})]})})}function PO(){let[e,t]=(0,Z.useState)([]),[n,r]=(0,Z.useState)(!0),{showToast:i}=Hr(),a=async()=>{r(!0);try{t(await DO())}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to load devices`,variant:`destructive`})}finally{r(!1)}};(0,Z.useEffect)(()=>{(async()=>{try{t(await DO())}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to load devices`,variant:`destructive`})}finally{r(!1)}})()},[i]);let o=e=>t(t=>t.map(t=>t.deviceId===e.deviceId?e:t)),s=e=>t(t=>t.filter(t=>t.deviceId!==e));return(0,Q.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,Q.jsxs)(`div`,{className:`mx-auto max-w-3xl p-6 pb-12 space-y-6`,children:[(0,Q.jsx)(Ww,{compact:!0,title:`Devices`,onBack:TO(),description:`All devices registered to your account. Link them to individual workspaces in Workspace › Settings › Devices.`,actions:(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:a,disabled:n,children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5 ${n?`animate-spin`:``}`}),`Refresh`]})}),n?(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Q.jsx)(P,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):e.length===0?(0,Q.jsxs)(`div`,{className:`rounded-lg border p-6 text-center text-sm text-muted-foreground space-y-2`,children:[(0,Q.jsx)(In,{className:`h-8 w-8 mx-auto text-muted-foreground/40`}),(0,Q.jsx)(`p`,{children:`No devices registered yet.`}),(0,Q.jsxs)(`p`,{className:`text-xs`,children:[`Devices register themselves automatically on first connection via`,` `,(0,Q.jsx)(`span`,{className:`font-mono`,children:`POST /auth/devices/register`}),`.`]})]}):(0,Q.jsx)(`div`,{className:`space-y-2`,children:e.map(e=>(0,Q.jsx)(NO,{device:e,onUpdated:o,onRemoved:s},e.deviceId))}),e.length>0&&(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border border-dashed p-3 text-xs text-muted-foreground`,children:[(0,Q.jsx)(Qt,{className:`h-3.5 w-3.5 shrink-0`}),`To link a device to a workspace, go to Workspace › Settings › Devices.`]})]})})}var FO=[{id:`general`,label:`Workspace details`,description:`Rename, change appearance or remove this workspace`,icon:en},{id:`backups`,label:`Backups`,description:`Save or restore documents, relations and tree placements`,icon:_n},{id:`data`,label:`Files & storage`,description:`Connect folders and data sources, check disk usage or restore trash`,icon:Fe},{id:`db`,label:`Search & indexing`,description:`Rebuild indexes, tune search and choose embedding models`,icon:tr},{id:`devices`,label:`Devices`,description:`Link devices to this workspace`,icon:In},{id:`sync`,label:`Synchronization`,description:`Manage device copies and resolve sync conflicts`,icon:P},{id:`services`,label:`Connected services`,description:`Configure Git, WebDAV, IMAP and other connectors`,icon:Yt},{id:`shares`,label:`Sharing & permissions`,description:`Create public links and manage workspace access`,icon:Qt},{id:`policies`,label:`Storage policies`,description:`Mirror folders of the virtual tree to physical backends`,icon:pe},{id:`hooks`,label:`Automation`,description:`Run hooks in response to workspace events`,icon:Ye}],IO={embedding:`db`,trash:`data`};function LO(e){return e?IO[e]?IO[e]:FO.some(t=>t.id===e)?e:`general`:`general`}var RO=[{id:`general`,label:`Context details`,description:`Change the name, description or color, or remove this context`,icon:en},{id:`location`,label:`Tree & path`,description:`Choose the workspace, tree and path this context opens`,icon:Qt},{id:`shares`,label:`Sharing & permissions`,description:`Choose who can access this context`,icon:V}];function zO(e){return e&&RO.some(t=>t.id===e)?e:`general`}var BO=[{id:`identity`,label:`Identity & instructions`,description:`Set the agent’s name, role and instructions`,icon:en},{id:`provider`,label:`AI connection`,description:`Connect a chat model provider and manage its credentials`,icon:K},{id:`models`,label:`Chat model`,description:`Choose the model and tune how it responds`,icon:Et},{id:`tools`,label:`Tools & skills`,description:`Choose the skills and MCP tools the agent can use`,icon:Pe},{id:`access`,label:`Access & permissions`,description:`Choose which Canvas content the agent can access`,icon:k},{id:`memory`,label:`Memory`,description:`Configure how the agent remembers information`,icon:lt},{id:`integrations`,label:`Integrations`,description:`Connect mail, chat, databases and external APIs`,icon:pt}];function VO(e){return e&&BO.some(t=>t.id===e)?e:`identity`}var HO=class{static async handleStreamingResponse(e,t={}){let{onChunk:n,onError:r,onComplete:i,signal:a}=t;try{if(!e.body)throw Error(`Response body is null - streaming not supported`);if(typeof e.body.getReader!=`function`){console.warn(`ReadableStream.getReader not available, falling back to text response`);let t=await e.text();n&&n(t),i&&i();return}let t=e.body.getReader(),r=new TextDecoder;try{for(;;){if(a?.aborted)throw t.cancel(),Error(`Stream aborted`);let{done:e,value:o}=await t.read();if(e){i&&i();break}let s=r.decode(o,{stream:!0});s&&n&&n(s)}}finally{t.releaseLock()}}catch(e){console.error(`Streaming error:`,e),r&&r(e instanceof Error?e:Error(String(e)))}}static processSSEChunk(e){let t=[],n=e.split(`
24
- `),r={};for(let e of n){let n=e.trim();if(n.startsWith(`data: `))try{let e=JSON.parse(n.slice(6));r={...r,...e}}catch{console.warn(`Failed to parse SSE data:`,n)}else n===``&&(r.agentId&&r.messageId&&t.push(r),r={})}return t}},UO=class{baseUrl;constructor(e,t=`/rest/v2/agents/anthropic`){this.baseUrl=t}async chatStream(e,t){let{agentId:n,messageId:r,onMessage:i,onError:a,onComplete:o,signal:s}=t;try{let t=await fetch(`${this.baseUrl}/chat/stream`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`text/plain, text/event-stream`,"Cache-Control":`no-cache`},body:JSON.stringify({message:e,agentId:n,messageId:r}),signal:s});if(!t.ok)throw Error(`HTTP ${t.status}: ${t.statusText}`);await HO.handleStreamingResponse(t,{onChunk:e=>{try{HO.processSSEChunk(e).forEach(e=>{i&&i(e)})}catch(e){console.warn(`Failed to process streaming chunk:`,e)}},onError:e=>{let t=Error(`Chat stream failed: AnthropicConnector chatStream failed: ${e.message}`);console.error(`Chat stream error:`,{agentId:n,messageId:r,error:t.message}),a&&a(t)},onComplete:o,signal:s})}catch(e){let t=Error(`Chat stream failed: AnthropicConnector chatStream failed: ${e instanceof Error?e.message:String(e)}`);console.error(`Chat stream error:`,{agentId:n,messageId:r,error:t.message}),a&&a(t)}}},WO=class{wsUrl;socket=null;messageHandlers=new Map;constructor(e){this.wsUrl=e}connect(){return new Promise((e,t)=>{try{this.socket=new WebSocket(this.wsUrl),this.socket.onopen=()=>{console.log(`WebSocket connected for streaming`),e()},this.socket.onerror=e=>{console.error(`WebSocket error:`,e),t(Error(`WebSocket connection failed`))},this.socket.onmessage=e=>{try{let t=JSON.parse(e.data),n=`${t.agentId}-${t.messageId}`,r=this.messageHandlers.get(n);r&&r(t)}catch(e){console.error(`Failed to parse WebSocket message:`,e)}},this.socket.onclose=()=>{console.log(`WebSocket disconnected`),this.socket=null}}catch(e){t(e)}})}startChatStream(e,t,n,r,i){if(!this.socket||this.socket.readyState!==WebSocket.OPEN){i&&i(Error(`WebSocket not connected`));return}let a=`${e}-${t}`;this.messageHandlers.set(a,r);try{this.socket.send(JSON.stringify({type:`chat_stream`,agentId:e,messageId:t,message:n}))}catch(e){i&&i(e instanceof Error?e:Error(String(e)))}}stopChatStream(e,t){let n=`${e}-${t}`;this.messageHandlers.delete(n)}disconnect(){this.socket&&=(this.socket.close(),null),this.messageHandlers.clear()}};function GO(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(`
25
- `)||``}function KO(e){return e?typeof e?.metadata?.reasoning==`string`&&e.metadata.reasoning.trim()?e.metadata.reasoning.trim():Array.isArray(e.content)?e.content.filter(e=>e?.type===`thinking`||e?.type===`reasoning`).map(e=>typeof e?.thinking==`string`?e.thinking:typeof e?.reasoning==`string`?e.reasoning:typeof e?.text==`string`?e.text:``).filter(Boolean).join(`
26
- `).trim():``:``}function qO(e){if(!e)return;let t=KO(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 JO(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 YO(e=[]){return e.filter(e=>e?.role===`user`||e?.role===`assistant`).map(e=>({role:e.role,content:GO(e),timestamp:JO(e.timestamp),...e.role===`assistant`?{metadata:qO(e)}:{}})).filter(e=>e.content||e.metadata?.reasoning)}function XO(e){return{mode:e?.mode,sessionId:e?.sessionId,sessionFile:e?.sessionFile,thinkingLevel:e?.thinkingLevel,model:e?.model,messages:YO(e?.messages||[])}}function ZO(e){return{current:XO(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 WO(e)}catch(e){console.warn(`WebSocket fallback not available:`,e)}}registerAgent(e){if(e.type===`anthropic`){let t=new UO(e.apiKey||``,e.endpoint||`${Rr}/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 Y.stream(`${Rr}/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 Y.get(`${Rr}/agents`)).agents||[]}catch(e){return console.error(`Failed to fetch available agents:`,e),[]}}async createAgent(e){let t=await Y.post(`${Rr}/agents`,e);return this.registerAgent(t),t}dispose(){this.connectors.clear(),this.messageCallbacks.clear(),this.wsService&&this.wsService.disconnect()}};async function QO(e){return await Y.get(`${Rr}/agents/${e}/access`)||null}async function $O(e,t){return await Y.put(`${Rr}/agents/${e}/access`,t)}async function ek(e){return await Y.post(`${Rr}/agents/${e}/access/token`)}async function tk(e){await Y.delete(`${Rr}/agents/${e}/access`)}async function nk(e){return await Y.get(`${Rr}/agents/${e}/tools`)||{tools:[],config:{}}}async function rk(){try{return await Y.get(`${Rr}/agents`)||[]}catch(e){return console.error(`Failed to list agents:`,e),[]}}async function ik(e){return await Y.get(`${Rr}/agents/${e}`)}async function ak(e){return XO(await Y.get(`${Rr}/agents/${e}/session`))}async function ok(e){return await Y.get(`${Rr}/agents/${e}/sessions`)}async function sk(e,t){return ZO(await Y.post(`${Rr}/agents/${e}/sessions`,t))}async function ck(e,t){return ZO(await Y.put(`${Rr}/agents/${e}/session`,t))}async function lk(e,t,n){return ZO(await Y.patch(`${Rr}/agents/${e}/sessions/${t}`,n))}async function uk(e,t){return ZO(await Y.delete(`${Rr}/agents/${e}/sessions/${t}`))}async function dk(e){return await Y.get(`${Rr}/agents/${e}/skills`)||[]}async function fk(e,t){return await Y.post(`${Rr}/agents/${e}/skills`,t)||[]}async function pk(e,t){return await Y.delete(`${Rr}/agents/${e}/skills/${encodeURIComponent(t)}`)||[]}async function mk(e){return await Y.post(`${Rr}/agents`,e)}async function hk(e,t){return await Y.put(`${Rr}/agents/${e}`,t)}async function gk(e){await Y.delete(`${Rr}/agents/${e}`)}async function _k(e){return await Y.post(`${Rr}/agents/${e}/start`)}async function vk(e){return await Y.post(`${Rr}/agents/${e}/stop`)}async function yk(e){return await Y.get(`${Rr}/agents/${e}/status`)}async function bk(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 Y.stream(`${Rr}/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(`
27
-
28
- `);f=t.pop()||``;for(let e of t){let t=e.split(`
29
- `).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||{},...qO(t)||{}})}else e.type===`error`&&a&&a(Error(e.error||`Prompt stream failed`))}catch{}}}},onError:a,onComplete:o})}async function xk(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 Y.post(`${Rr}/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:GO(i),metadata:qO(i)};return r&&r(d.content,!0,d.metadata),a&&a(),d}catch(e){throw i&&i(e),e}}function Sk(e){return e.map(e=>({...e,timestamp:typeof e.timestamp==`string`?e.timestamp:new Date().toISOString()}))}async function Ck(){return await Y.get(`${Rr}/voice/status`)}async function wk(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 Y.post(`${Rr}/agents/${e}/voice${o}`,r)}var Tk=[{id:`workspace`,label:`Workspace`,path:`workspaces`,description:`Files, search, devices and sharing for one workspace. These settings override account defaults.`,sections:FO,load:async()=>(await ji()).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:RO,load:async()=>(await fs()).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:BO,load:async()=>(await rk()).map(e=>({id:e.id,label:e.label||e.name}))}];function Ek({to:e,label:t,description:n,icon:r}){return(0,Q.jsxs)(Mu,{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,Q.jsx)(r,{className:`mt-0.5 h-5 w-5 shrink-0 text-muted-foreground`}),(0,Q.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`span`,{className:`block text-sm font-semibold`,children:t}),(0,Q.jsx)(`span`,{className:`mt-1 block text-sm leading-relaxed text-muted-foreground`,children:n})]}),(0,Q.jsx)(Ot,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground group-hover:text-primary`})]})}function Dk({group:e,query:t}){let[n,r]=(0,Z.useState)([]),[i,a]=(0,Z.useState)(``),[o,s]=(0,Z.useState)(`loading`),[c,l]=(0,Z.useState)(0);(0,Z.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=>cT(t,e.label,n.label,n.description));return u.length?(0,Q.jsxs)(`section`,{id:e.id,className:`scroll-mt-6 space-y-3`,children:[(0,Q.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.label}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description}),(0,Q.jsxs)(`label`,{className:`block max-w-md text-sm font-medium`,children:[`Choose a `,e.label.toLowerCase(),(0,Q.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,Q.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,Q.jsx)(`option`,{value:e.id,children:e.label},e.id))]})]}),o===`error`&&(0,Q.jsxs)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:[`The list could not be loaded. `,(0,Q.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>{s(`loading`),l(e=>e+1)},children:`Retry`})]}),(0,Q.jsxs)(`details`,{open:!!(i||t.trim()),children:[(0,Q.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,Q.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fit,minmax(min(100%,16rem),1fr))] gap-3`,children:u.map(t=>i?(0,Q.jsx)(Ek,{to:`/${e.path}/${encodeURIComponent(i)}/settings/${t.id}`,...t},t.id):(0,Q.jsxs)(`div`,{className:`rounded-lg border border-dashed p-4`,children:[(0,Q.jsx)(`p`,{className:`text-sm font-medium`,children:t.label}),(0,Q.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:t.description})]},t.id))})]})]}):null}function Ok(){let{state:e}=jT(),[t,n]=(0,Z.useState)(``),r=oT.filter(t=>t.id!==`server`||e.user?.userType===`admin`).map(e=>({...e,items:e.items.filter(n=>cT(t,e.label,n.label,n.description))})).filter(e=>e.items.length),i=Tk.some(e=>e.sections.some(n=>cT(t,e.label,n.label,n.description)));return(0,Q.jsxs)(`div`,{className:`mx-auto max-w-6xl space-y-8 pb-8 max-md:pb-rail-stack`,children:[(0,Q.jsx)(Ww,{title:`Settings`,description:`Start with what you want to change. Each section explains where your changes apply.`}),(0,Q.jsx)(J,{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,Q.jsxs)(`section`,{className:`space-y-3`,children:[(0,Q.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.label}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description}),(0,Q.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fit,minmax(min(100%,16rem),1fr))] gap-3`,children:e.items.map(e=>(0,Q.jsx)(Ek,{to:e.path,...e},e.path))})]},e.id)),Tk.map(e=>(0,Q.jsx)(Dk,{group:e,query:t},e.id)),r.filter(e=>e.id===`server`||e.id===`information`).map(e=>(0,Q.jsxs)(`section`,{className:`space-y-3`,children:[(0,Q.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.label}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description}),(0,Q.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fit,minmax(min(100%,16rem),1fr))] gap-3`,children:e.items.map(e=>(0,Q.jsx)(Ek,{to:e.path,...e},e.path))})]},e.id)),!r.length&&!i&&(0,Q.jsxs)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:[`No settings match “`,t,`”. Try a shorter phrase or clear the search.`]})]})}var kk=[{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`}],Ak=`/wallpapers`;function jk(e){return kk.find(t=>t.id===e)}function Mk(e,t={}){let n=typeof e==`string`?jk(e):e;if(!n)return null;let{base:r=Ak,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 Nk(e,t=Ak){let n=typeof e==`string`?jk(e):e;return n?`${t.replace(/\/$/,``)}/${n.thumb}`:null}var Pk=[{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`}],Fk=`canvas:wallpaper`,Ik=`canvas-wallpaper`,Lk=`settings`,Rk=`builtin:`,zk=kk;function Bk(e){return Nk(e)??``}function Vk(e){return`${Rk}${e}`}function Hk(e){return e?.startsWith(Rk)?e.slice(8):null}function Uk(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 Wk(){try{let e=localStorage.getItem(Fk);if(e){let t=Uk(JSON.parse(e));if(t)return t}}catch{}return{image:null,fit:`cover`}}var Gk=Wk(),Kk=null;function qk(){return Gk}async function Jk(e){let t=await new Promise((e,t)=>{let n=indexedDB.open(Ik,1),r=!1;n.onupgradeneeded=()=>n.result.createObjectStore(Lk),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(Lk,e?`readwrite`:`readonly`),a=i.objectStore(Lk),o=e?a.put(e,Fk):a.get(Fk);i.oncomplete=()=>n(o.result),i.onerror=()=>r(i.error),i.onabort=()=>r(i.error)})}finally{t.close()}}function Yk(){try{localStorage.removeItem(Fk)}catch{}}function Xk(){return Kk||=(async()=>{try{let e=Uk(await Jk());e?Gk=e:await Jk(Gk),Yk()}catch{}return iA(Gk),Gk})(),Kk.then(()=>Gk)}async function Zk(e){await Xk(),await Jk(e),Gk=e,Yk(),iA(e)}function Qk(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 $k=typeof CSS<`u`&&CSS.supports(`background-image`,`image-set(url("a.avif") type("image/avif"))`);function eA(e){if(!e)return null;let t=Hk(e);if(t===null)return`url("${e}")`;let n=jk(t);if(!n)return null;let r=`url("${Mk(n,{types:[n.sources[n.sources.length-1].type]})}")`;return!$k||n.sources.length===1?r:`image-set(${n.sources.map(e=>`url("${Mk(n,{types:[e.type]})}") type("${e.type}")`).join(`, `)})`}function tA(e){return e===`fill`?`100% 100%`:e===`center`?`auto`:`cover`}var nA=null;function rA(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 iA(e=qk()){let t=document.documentElement.style,n=nA,r=e.image;if(r?.startsWith(`data:`))try{nA?.dataUrl!==r&&(nA={dataUrl:r,objectUrl:URL.createObjectURL(rA(r))}),r=nA.objectUrl}catch{nA=null,r=null}else nA=null;let i=eA(r);i?(t.setProperty(`--wallpaper-image`,i),t.setProperty(`--wallpaper-size`,tA(e.fit))):(t.removeProperty(`--wallpaper-image`),t.removeProperty(`--wallpaper-size`)),n&&n!==nA&&URL.revokeObjectURL(n.objectUrl)}var aA=[{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.`}],oA=`canvas:treeStyle`;function sA(){try{let e=localStorage.getItem(oA);return e===`accordion`||e===`accordion-mobile`?e:`cards`}catch{return`cards`}}var cA=sA(),lA=new Set;function uA(){return cA}function dA(e){try{e===`cards`?localStorage.removeItem(oA):localStorage.setItem(oA,e)}catch{}cA=e;for(let e of lA)e()}function fA(e){lA.add(e);let t=t=>{(t.key===oA||t.key===null)&&(cA=sA(),e())};return window.addEventListener(`storage`,t),()=>{lA.delete(e),window.removeEventListener(`storage`,t)}}function pA(){return(0,Z.useSyncExternalStore)(fA,uA,()=>`cards`)}function mA(){let e=pA(),t=$g();return e===`accordion`||e===`accordion-mobile`&&t}var hA=[{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)`]}],gA=hA.map(e=>e.id),_A=[{id:`system`,name:`System`},{id:`light`,name:`Light`},{id:`dark`,name:`Dark`}],vA=[{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`}],yA={theme:`canvas`,scheme:`light`,density:`auto`},bA=`canvas.ui.theme`;function xA(e){return typeof e==`string`&&gA.includes(e)}function SA(e){return e===`light`||e===`dark`||e===`system`}function CA(e){return e===`auto`||e===`compact`||e===`comfortable`||e===`touch`}function wA(e){let t=typeof e==`object`&&e?e:{};return{theme:xA(t.theme)?t.theme:yA.theme,scheme:SA(t.scheme)?t.scheme:yA.scheme,density:CA(t.density)?t.density:yA.density}}var TA=`(prefers-color-scheme: dark)`;function EA(){return typeof document<`u`}function DA(){return typeof window>`u`||typeof window.matchMedia!=`function`?!1:window.matchMedia(TA).matches}function OA(e){return e===`system`?DA()?`dark`:`light`:e}function kA(e){if(typeof window>`u`||typeof window.matchMedia!=`function`)return()=>{};let t=window.matchMedia(TA),n=t=>e(t.matches?`dark`:`light`);return t.addEventListener(`change`,n),()=>t.removeEventListener(`change`,n)}function AA(e){return kA(e)}function jA(){return DA()?`dark`:`light`}function MA(){return`light`}function NA(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 PA(e,t=EA()?document.documentElement:void 0){let n=OA(e.scheme);return t?(t.dataset.theme=e.theme,t.dataset.scheme=n,t.dataset.density=e.density,NA(t),n):n}function FA(e,t=EA()?document.documentElement:void 0){if(!t||typeof window>`u`)return PA(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=PA(e,t);return window.getComputedStyle(n).opacity,document.head.removeChild(n),r}function IA(e){let t=e??zA();if(!t)return yA;try{let e=t.getItem(bA);return e?wA(JSON.parse(e)):yA}catch{return yA}}function LA(e,t){let n=t??zA();if(n)try{n.setItem(bA,JSON.stringify(e))}catch{}}function RA(e){let t=e??zA();if(t)try{t.removeItem(bA)}catch{}}function zA(){try{return typeof localStorage<`u`?localStorage:void 0}catch{return}}function BA({children:e,initial:t,storage:n,persist:r=!0}){let[i,a]=(0,Z.useState)(()=>({...IA(n),...t})),o=(0,Z.useSyncExternalStore)(AA,jA,MA),s=i.scheme===`system`?o:i.scheme;(0,Z.useEffect)(()=>{FA({...i,scheme:s})},[i,s]),(0,Z.useEffect)(()=>{r&&LA(i,n)},[i,r,n]);let c=(0,Z.useCallback)(e=>{a(t=>t.theme===e?t:{...t,theme:e})},[]),l=(0,Z.useCallback)(e=>{a(t=>t.scheme===e?t:{...t,scheme:e})},[]),u=(0,Z.useCallback)(e=>{a(t=>t.density===e?t:{...t,density:e})},[]),d=(0,Z.useCallback)(()=>{a(e=>({...e,scheme:(e.scheme===`system`?jA():e.scheme)===`dark`?`light`:`dark`}))},[]),f=(0,Z.useCallback)(()=>{RA(n),a(yA)},[n]),p=(0,Z.useMemo)(()=>({...i,resolvedScheme:s,setTheme:c,setScheme:l,setDensity:u,toggleScheme:d,reset:f}),[i,s,c,l,u,d,f]);return(0,Q.jsx)(Vs.Provider,{value:p,children:e})}var VA={system:In,light:zt,dark:he};function HA(){let{theme:e,scheme:t,density:n,resolvedScheme:r,setTheme:i,setScheme:a,setDensity:o,reset:s}=Hs(),c=Lg(),l=vT(),u=pA(),d=DT();return(0,Q.jsxs)(`div`,{className:`space-y-8`,children:[(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(KA,{title:`Theme`,description:`Palette, shape and typography. Each theme defines its own light and dark variants.`}),(0,Q.jsx)(`div`,{className:`grid gap-3 sm:grid-cols-2 lg:grid-cols-3`,children:hA.map(t=>{let n=t.id===e;return(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>i(t.id),"aria-pressed":n,className:q(`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,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:t.name}),n&&(0,Q.jsx)(ae,{className:`size-4 shrink-0 text-primary`})]}),(0,Q.jsx)(`div`,{className:`flex gap-1.5`,"aria-hidden":!0,children:t.swatches.map(e=>(0,Q.jsx)(`span`,{className:`size-6 rounded-full border border-border`,style:{backgroundColor:e}},e))}),(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:t.description})]},t.id)})})]}),(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(KA,{title:`Colour scheme`,description:t===`system`?`Following your system setting, currently ${r}.`:`Overrides your system setting.`}),(0,Q.jsx)(qA,{options:_A.map(e=>{let t=VA[e.id];return{id:e.id,label:e.name,icon:(0,Q.jsx)(t,{className:`size-4 shrink-0`})}}),value:t,onChange:a})]}),(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(KA,{title:`Density`,description:`Controls row height, hit-target size and shell spacing across the whole app.`}),(0,Q.jsx)(qA,{options:vA.map(e=>({id:e.id,label:e.name,title:e.description})),value:n,onChange:o}),(0,Q.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:vA.find(e=>e.id===n)?.description})]}),(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(KA,{title:`Layout`,description:`How menus and content share the screen. Device-local, like the wallpaper.`}),(0,Q.jsx)(qA,{options:lT.map(e=>({id:e.id,label:e.name,title:e.description})),value:l,onChange:gT}),(0,Q.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:lT.find(e=>e.id===l)?.description}),l===`strip`&&(0,Q.jsxs)(`div`,{className:`mt-4`,children:[(0,Q.jsx)(`p`,{className:`mb-2 text-sm font-medium`,children:`Navigation keys`}),(0,Q.jsx)(qA,{options:yT.map(e=>({id:e.id,label:e.name,title:e.description})),value:d,onChange:TT}),(0,Q.jsxs)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:[yT.find(e=>e.id===d)?.description,` `,`Left and right walk the columns, up and down switch pin rows.`]})]})]}),(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(KA,{title:`Tree style`,description:`How workspace and context trees are drawn in the menu. Device-local.`}),(0,Q.jsx)(qA,{options:aA.map(e=>({id:e.id,label:e.name,title:e.description})),value:u,onChange:dA}),(0,Q.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:aA.find(e=>e.id===u)?.description})]}),(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(KA,{title:`Open documents`,description:`Choose how documents open from lists, tiles and boards. Saved on this device.`}),(0,Q.jsx)(qA,{options:[{id:`modal`,label:`Modal`},{id:`side`,label:`Side reading pane`}],value:c,onChange:Fg}),(0,Q.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,Q.jsx)(UA,{}),(0,Q.jsx)(`section`,{children:(0,Q.jsx)(`button`,{type:`button`,onClick:()=>{s(),Fg(`modal`)},className:`focus-ring rounded-md text-sm text-muted-foreground underline-offset-4 hover:text-foreground hover:underline`,children:`Reset to defaults`})})]})}function UA(){let[e,t]=(0,Z.useState)(qk),[n,r]=(0,Z.useState)(null),[i,a]=(0,Z.useState)(!0),[o,s]=(0,Z.useState)(!1),c=(0,Z.useRef)(!1);(0,Z.useEffect)(()=>{let e=!1;return Xk().then(()=>{e||(t(qk()),a(!1))}),()=>{e=!0}},[]);let l=async(e,n)=>{if(!c.current){c.current=!0,s(!0);try{let i=n?{...e,image:await Qk(n)}:e;await Zk(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&&Hk(e.image)===null,f=eA(e.image);return(0,Q.jsx)(`section`,{children:(0,Q.jsxs)(`fieldset`,{disabled:i||o,className:`min-w-0`,children:[(0,Q.jsx)(KA,{title:`Wallpaper`,description:`Background image for the desk behind all panels. Without one, the theme's desk color shows (the default).`}),(0,Q.jsxs)(`div`,{role:`radiogroup`,"aria-label":`Wallpaper`,className:`grid grid-cols-3 gap-3 sm:grid-cols-4 lg:grid-cols-6`,children:[(0,Q.jsx)(GA,{label:`None`,isActive:e.image===null,onSelect:()=>l({...e,image:null}),children:(0,Q.jsx)(`span`,{className:`flex size-full items-center justify-center surface-desk text-xs text-muted-foreground`,style:{backgroundImage:`none`},children:`None`})}),zk.map(t=>(0,Q.jsx)(GA,{label:t.title,title:`${t.title} — suits the ${t.scheme} scheme`,isActive:Hk(e.image)===t.id,onSelect:()=>l({...e,image:Vk(t.id)}),children:(0,Q.jsx)(`img`,{src:Bk(t),alt:``,loading:`lazy`,className:`size-full object-cover`,style:{backgroundColor:t.background}})},t.id)),d&&(0,Q.jsx)(GA,{label:`Your image`,isActive:!0,onSelect:()=>{},children:(0,Q.jsx)(`img`,{src:e.image??void 0,alt:``,className:`size-full object-cover`})})]}),(0,Q.jsx)(WA,{}),(0,Q.jsxs)(`div`,{className:`mt-4 flex flex-wrap items-center gap-3`,children:[(0,Q.jsx)(`div`,{className:`h-20 w-32 shrink-0 rounded-md border surface-desk`,style:f?{backgroundImage:f,backgroundSize:tA(e.fit),backgroundPosition:`center`,backgroundRepeat:`no-repeat`}:void 0,"aria-hidden":!0}),(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Q.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,Q.jsx)(`input`,{type:`file`,accept:`image/*,.gif`,className:`hidden`,onChange:e=>{u(e.target.files?.[0]),e.target.value=``}})]}),e.image&&(0,Q.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,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Images and animated GIFs up to 10 MB. Stored on this device.`}),(0,Q.jsx)(qA,{options:Pk.map(e=>({id:e.id,label:e.label,title:e.description})),value:e.fit,onChange:t=>l({...e,fit:t})}),n&&(0,Q.jsx)(`p`,{className:`text-xs text-destructive`,children:n}),o&&(0,Q.jsx)(`p`,{role:`status`,className:`text-xs text-muted-foreground`,children:`Saving wallpaper…`})]})]})]})})}function WA(){let e=zk.filter(e=>e.author!==`Canvas`);return e.length===0?null:(0,Q.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:e.map((e,t)=>(0,Q.jsxs)(`span`,{children:[t>0&&` · `,e.title,` © `,e.author,e.source&&(0,Q.jsxs)(Q.Fragment,{children:[` `,(0,Q.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 GA({label:e,title:t,isActive:n,onSelect:r,children:i}){return(0,Q.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":n,"aria-label":e,title:t??e,onClick:r,className:q(`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,Q.jsx)(`span`,{className:`absolute right-1 top-1 rounded-full bg-primary p-0.5 text-primary-foreground`,children:(0,Q.jsx)(ae,{className:`size-3`})})]})}function KA({title:e,description:t}){return(0,Q.jsxs)(`div`,{className:`mb-3`,children:[(0,Q.jsx)(`h2`,{className:`text-base font-semibold`,children:e}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t})]})}function qA({options:e,value:t,onChange:n}){return(0,Q.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,Q.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":r,title:e.title,onClick:()=>n(e.id),className:q(`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 JA(){return(0,Q.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Q.jsx)(Ww,{className:`mb-6`,title:`Appearance`,onBack:TO(),description:`Theme, colour scheme and density. Changes apply immediately and are remembered on this device.`}),(0,Q.jsx)(HA,{})]})}var YA={previousTree:`Alt+Q`,nextTree:`Alt+W`},XA=`canvas:key-bindings`,ZA=/^(Alt|Alt\+Shift|Ctrl\+Shift|Meta\+Shift)\+[A-Z]$/;function QA(){try{let e=JSON.parse(localStorage.getItem(XA)||`{}`),t={...YA};for(let n of Object.keys(t))(e[n]===``||ZA.test(e[n]))&&(t[n]=e[n]);return t.previousTree&&t.previousTree===t.nextTree?{...YA}:t}catch{return{...YA}}}function $A(e){localStorage.setItem(XA,JSON.stringify(e))}function ej(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 tj(e,t,n){return e[(Math.max(0,e.indexOf(t))+n+e.length)%e.length]}function nj(e,t){return Math.abs(e)>=48&&Math.abs(e)>Math.abs(t)*1.5?e<0?1:-1:0}function rj(){let[e,t]=(0,Z.useState)(QA),[n,r]=(0,Z.useState)(``),i=e=>{if(e.previousTree&&e.previousTree===e.nextTree){r(`Choose a different shortcut: that combination is already assigned.`);return}try{$A(e),t(e),r(`Saved on this device.`)}catch{r(`Could not save shortcuts in this browser.`)}};return(0,Q.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Q.jsx)(Ww,{className:`mb-6`,title:`Key bindings`,onBack:TO(),description:`Web UI shortcuts, saved on this device and available offline.`}),(0,Q.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Q.jsx)(`h2`,{className:`font-medium`,children:`Tree navigation`}),(0,Q.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,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,Q.jsx)(`label`,{htmlFor:t,className:`min-w-32 text-sm`,children:t===`previousTree`?`Previous tree`:`Next tree`}),(0,Q.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)||YA[t].slice(-1)}`:``}),children:[(0,Q.jsx)(`option`,{value:``,children:`Disabled`}),[`Alt`,`Alt+Shift`,`Ctrl+Shift`,`Meta+Shift`].map(e=>(0,Q.jsx)(`option`,{value:e,children:e},e))]}),(0,Q.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)||YA[t].slice(-1),onChange:n=>i({...e,[t]:`${e[t].split(`+`).slice(0,-1).join(`+`)}+${n.target.value}`}),children:`ABCDEFGHIJKLMNOPQRSTUVWXYZ`.split(``).map(e=>(0,Q.jsx)(`option`,{value:e,children:e},e))})]},t)),(0,Q.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,Q.jsx)(`button`,{type:`button`,className:`rounded-md border px-3 py-2 text-sm hover:bg-accent`,onClick:()=>i({...YA}),children:`Restore defaults`}),(0,Q.jsx)(`p`,{role:`status`,className:`text-sm`,children:n})]})]})}var ij=`offline-content-v1`,aj=`offline-api-v1`,oj=1073741824,sj={enabled:!1,budgetBytes:4*oj,excludedWorkspaces:[]},cj=1e3;function lj(e){return(e.startsWith(`/`)?e:`/${e}`).replace(/\/+$/,``)||`/`}function uj(e,t,n){return`${e}:${t}:${lj(n)}`}var dj=`canvas-offline`,fj=2,pj=null;function mj(){return pj||(pj=new Promise((e,t)=>{let n=indexedDB.open(dj,fj);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(),pj=null},e(n.result)},n.onerror=()=>{pj=null,t(n.error)}}),pj)}function hj(e){return new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error),e.onabort=()=>n(e.error)})}function gj(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}async function _j(e,t){return gj((await mj()).transaction(e).objectStore(e).get(t))}async function vj(e){return gj((await mj()).transaction(e).objectStore(e).getAll())}async function yj(e,t,n){let r=(await mj()).transaction(e,`readwrite`);return r.objectStore(e).put(t,n),hj(r)}async function bj(e,t){let n=(await mj()).transaction(e,`readwrite`);return n.objectStore(e).delete(t),hj(n)}async function xj(e){let t=(await mj()).transaction(e,`readwrite`);return t.objectStore(e).clear(),hj(t)}async function Sj(){try{let e=await _j(`config`,`settings`);return e?{...sj,...e}:sj}catch{return sj}}async function Cj(e){await yj(`config`,e,`settings`)}async function wj(e,t){let n=(await mj()).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 hj(n)}async function Tj(e){let t=await vj(`entries`),n=t.filter(e=>e.kind===`api`).sort((e,t)=>e.lastAccess-t.lastAccess),r=n.slice(0,Math.max(0,n.length-cj)),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(aj),caches.open(ij)]);await Promise.all([...r.map(async e=>{await c.delete(e.url),await bj(`entries`,e.url)}),...s.map(async e=>{await l.delete(e.url),await bj(`entries`,e.url)})])}async function Ej(){let e=await vj(`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 Dj(){await Promise.all([caches.delete(ij),caches.delete(aj)]),await xj(`entries`),await xj(`scopes`)}async function Oj(){return vj(`scopes`)}async function kj(e){return _j(`scopes`,e)}async function Aj(e){await yj(`scopes`,e)}async function jj(e){let t=await _j(`scopes`,e);await bj(`scopes`,e),t?.urls.length&&await Mj(t.urls)}async function Mj(e){let t=await vj(`scopes`),n=new Set(t.flatMap(e=>e.urls)),r=e.filter(e=>!n.has(e));r.length&&await wj(r,!1)}var Nj=3,Pj=`data/schema/file`,Fj=128;async function Ij({workspaceRef:e,path:t,treeName:n,treeType:r},i){let a=await Sj();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=uj(e,n,t),s=lj(t),c=await kj(o),l=((await Na(e,s,[],{limit:1e4,treeName:n,treeType:r})).payload??[]).filter(e=>e.schema===Pj),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(Nj,l.length)},async()=>{for(;h<l.length;){let t=l[h++];if(d>=a.budgetBytes*.9){p=!0;return}try{let{blob:n}=await Do(e,t.id);d+=n.size,u.push(`${Sr.workspaces}/${e}/documents/${t.id}/content`);try{await $r(e,t.id,Fj),u.push(`${Sr.workspaces}/${e}/documents/${t.id}/thumbnail?size=${Fj}`)}catch{}}catch{}f+=1,i?.({done:f,total:m,bytes:d})}})),await wj(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 Aj(g),c){let e=new Set(u),t=c.urls.filter(t=>!e.has(t));t.length&&await Mj(t)}return g}var Lj=[{label:`1 GB`,bytes:1*oj},{label:`2 GB`,bytes:2*oj},{label:`4 GB`,bytes:4*oj},{label:`8 GB`,bytes:8*oj}];function Rj(e){return e<1048576?`${(e/1024).toFixed(0)} KB`:e<1073741824?`${(e/1048576).toFixed(1)} MB`:`${(e/oj).toFixed(2)} GB`}function zj(){navigator.serviceWorker?.controller?.postMessage({type:`OFFLINE_SETTINGS_CHANGED`})}function Bj(){let{showSuccessToast:e,showErrorToast:t}=Gr(),[n,r]=(0,Z.useState)(null),[i,a]=(0,Z.useState)(null),[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)([]),[u,d]=(0,Z.useState)([]),[f,p]=(0,Z.useState)({}),[m,h]=(0,Z.useState)(!1),[g,_]=(0,Z.useState)(!1),v=(0,Z.useCallback)(()=>{Sj().then(r).catch(()=>{}),Ej().then(a).catch(()=>{}),Oj().then(e=>d(e.sort((e,t)=>e.id.localeCompare(t.id)))).catch(()=>{}),navigator.storage?.persisted?.().then(s).catch(()=>{})},[]);(0,Z.useEffect)(()=>{v(),ji().then(e=>l(e.map(e=>e.name).filter(Boolean).sort())).catch(()=>{})},[v]);let y=async e=>{r(e),await Cj(e),zj(),e.enabled&&navigator.storage?.persist?.().then(s).catch(()=>{}),Tj(e.budgetBytes).then(v).catch(()=>{})},b=e=>{if(!n)return;let t=n.excludedWorkspaces.includes(e)?n.excludedWorkspaces.filter(t=>t!==e):[...n.excludedWorkspaces,e];y({...n,excludedWorkspaces:t})},x=async()=>{h(!0);try{await Dj(),e(`Offline cache cleared`),v()}catch(e){t(e instanceof Error?e.message:`Failed to clear cache`)}finally{h(!1)}},S=async n=>{let r=uj(n.workspaceRef,n.treeName,n.path);p(e=>({...e,[r]:{done:0,total:0,bytes:0}}));try{let t=await Ij(n,e=>p(t=>({...t,[r]:e})));e(t.truncated?`Pinned ${Rj(t.bytes)} — stopped at the size budget`:`Pinned ${t.workspaceRef}:/${t.path} (${Rj(t.bytes)})`)}catch(e){t(e instanceof Error?e.message:`Failed to pin`)}finally{p(e=>{let{[r]:t,...n}=e;return n}),v()}},C=(e,t)=>{_(!1);for(let n of e)S({workspaceRef:t.workspaceName,path:n,treeName:t.treeName,treeType:t.treeType})},w=e=>({workspaceRef:e.workspaceRef,path:e.path,treeName:e.treeName||`context`,treeType:e.treeType||`context`}),T=async e=>{await jj(e),v()};return n?(0,Q.jsxs)(`div`,{className:`space-y-8`,children:[(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(Vj,{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,Q.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>y({...n,enabled:!n.enabled}),"aria-pressed":n.enabled,className:q(`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,Q.jsx)(hr,{className:`h-5 w-5 shrink-0 text-muted-foreground`}),(0,Q.jsxs)(`span`,{className:`flex-1`,children:[(0,Q.jsx)(`span`,{className:`block text-sm font-medium`,children:n.enabled?`Enabled`:`Disabled`}),(0,Q.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,Q.jsx)(ae,{className:`h-4 w-4 shrink-0 text-primary`})]}),n.enabled&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`p`,{className:`mb-2 text-sm font-medium`,children:`Size budget`}),(0,Q.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:Lj.map(e=>(0,Q.jsx)(X,{variant:n.budgetBytes===e.bytes?`default`:`outline`,size:`sm`,onClick:()=>y({...n,budgetBytes:e.bytes}),children:e.label},e.bytes))})]}),i&&(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsxs)(`div`,{className:`flex items-baseline justify-between text-sm`,children:[(0,Q.jsxs)(`span`,{children:[Rj(i.contentBytes),` of `,Rj(n.budgetBytes),` used`]}),(0,Q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[i.contentCount,` file(s)`,i.pinnedBytes>0?`, ${Rj(i.pinnedBytes)} pinned`:``]})]}),(0,Q.jsx)(`div`,{className:`h-2 w-full overflow-hidden rounded-full bg-muted`,children:(0,Q.jsx)(`div`,{className:`h-full rounded-full bg-primary`,style:{width:`${Math.min(100,i.contentBytes/n.budgetBytes*100)}%`}})})]}),(0,Q.jsx)(`div`,{children:(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,onClick:x,disabled:m,children:[m?(0,Q.jsx)(Xn,{className:`mr-1.5 h-3.5 w-3.5 animate-spin`}):(0,Q.jsx)(rt,{className:`mr-1.5 h-3.5 w-3.5`}),`Clear offline cache`]})})]})]})]}),n.enabled&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(Vj,{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,Q.jsx)(`div`,{className:`mb-3`,children:(0,Q.jsxs)(X,{size:`sm`,onClick:()=>_(!0),disabled:!!Object.keys(f).length,children:[(0,Q.jsx)(ke,{className:`mr-1.5 h-3.5 w-3.5`}),`Pin a path…`]})}),(0,Q.jsxs)(`ul`,{className:`space-y-1`,children:[u.map(e=>{let t=f[e.id];return(0,Q.jsxs)(`li`,{className:`flex items-center gap-3 rounded-md border border-input px-3 py-2 text-sm`,children:[(0,Q.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,Q.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,Q.jsxs)(`span`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,Q.jsx)(Xn,{className:`h-3.5 w-3.5 animate-spin`}),t.total>0?`${t.done}/${t.total} · ${Rj(t.bytes)}`:`listing…`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[Rj(e.bytes),e.truncated?` (partial)`:``]}),(0,Q.jsx)(X,{variant:`ghost`,size:`sm`,onClick:()=>S(w(e)),"aria-label":`Re-warm ${e.id}`,title:`Re-warm: re-resolve the scope and download anything new`,children:(0,Q.jsx)(P,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(X,{variant:`ghost`,size:`sm`,onClick:()=>T(e.id),"aria-label":`Unpin ${e.id}`,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]})]},e.id)}),u.length===0&&(0,Q.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,Q.jsxs)(`section`,{children:[(0,Q.jsx)(Vj,{title:`Workspace caching`,description:`Excluded workspaces are never cached — not even as you browse — and are not served from cache.`}),(0,Q.jsx)(`ul`,{className:`space-y-1`,children:c.map(e=>{let t=n.excludedWorkspaces.includes(e);return(0,Q.jsxs)(`li`,{className:`flex items-center gap-3 rounded-md border border-input px-3 py-2 text-sm`,children:[(0,Q.jsx)(`span`,{className:q(`flex-1 truncate`,t&&`text-muted-foreground line-through`),children:e}),t&&(0,Q.jsx)(Ln,{className:`h-3.5 w-3.5 text-muted-foreground`}),(0,Q.jsx)(X,{variant:t?`outline`:`ghost`,size:`sm`,onClick:()=>b(e),children:t?`Include`:`Exclude`})]},e)})})]})]}),g&&(0,Q.jsx)(Up,{onClose:()=>_(!1),children:(0,Q.jsx)(Jm,{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:C,onClose:()=>_(!1)})})]}):null}function Vj({title:e,description:t}){return(0,Q.jsxs)(`div`,{className:`mb-4`,children:[(0,Q.jsx)(`h2`,{className:`text-base font-semibold`,children:e}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t})]})}function Hj(){return(0,Q.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Q.jsx)(Ww,{className:`mb-6`,title:`Offline`,onBack:TO(),description:`Per-device offline cache: browse notes, files, photos and saved websites without a connection.`}),(0,Q.jsx)(Bj,{})]})}function Uj(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 Wj({name:e,version:t,detail:n}){return(0,Q.jsxs)(`div`,{className:`flex items-baseline justify-between gap-4 px-4 py-2.5`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`div`,{className:`text-sm font-medium truncate`,children:e}),n&&(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground truncate`,children:n})]}),(0,Q.jsx)(`code`,{className:`text-xs text-muted-foreground shrink-0`,children:t})]})}function Gj(){let[e,t]=(0,Z.useState)(null),[n,r]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{let e=!0;return Y.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 ${Uj(e.uptime)}`:null].filter(Boolean).join(` · `),a=Object.entries(e?.components??{}).sort(([e],[t])=>e.localeCompare(t));return(0,Q.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Q.jsx)(Ww,{className:`mb-6`,title:`About`,onBack:TO(),description:`Versions of every Canvas component this installation is running.`}),(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsxs)(`section`,{className:`rounded-md border border-border divide-y divide-border`,children:[(0,Q.jsx)(Wj,{name:`Canvas Web`,detail:`this interface`,version:`v2.24.1`}),e?.version&&(0,Q.jsx)(Wj,{name:e.productName||e.appName||`Canvas Server`,detail:i||void 0,version:`v${e.version}`})]}),a.length>0&&(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(`h2`,{className:`mb-2 px-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:`Server components`}),(0,Q.jsx)(`div`,{className:`rounded-md border border-border divide-y divide-border`,children:a.map(([e,t])=>(0,Q.jsx)(Wj,{name:e,version:`v${t}`},e))})]}),n&&(0,Q.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Server details unavailable: `,n]}),e?.sourceUrl&&(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[e.license?`Licensed ${e.license}. `:``,(0,Q.jsx)(`a`,{href:e.sourceUrl,target:`_blank`,rel:`noreferrer`,className:`underline underline-offset-2 hover:text-foreground`,children:`Get the source code`}),`.`]})]})]})}var Kj=[`onnx`,`clip`,`blip`,`openai`],qj=[`onnx`,`clip`,`blip`,`ollama`,`vllm`],Jj=[{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`}],Yj=e=>`${Sr.workspaces}/${encodeURIComponent(e)}/inferd`;function Xj(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 Zj(e){return await Y.get(`${Yj(e)}/status`)}async function Qj(e,t={}){let n={};return t.force!==void 0&&(n.force=t.force),await Y.post(`${Yj(e)}/summarize/images`,n)}async function $j(e){return await Y.post(`${Yj(e)}/summarize/images/stop`,{})}async function eM(e){return await Y.get(`${Yj(e)}/config`)}async function tM(e,t){return await Y.put(`${Yj(e)}/config`,t)}async function nM(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 Y.post(`${Yj(e)}/reindex`,n)}async function rM(e){return await Y.get(`${Yj(e)}/vector-tables`)}async function iM(e,t){return await Y.delete(`${Yj(e)}/vector-tables/${encodeURIComponent(t)}`)}async function aM(){return await Y.get(`${Sr.inferd}/config`)}async function oM(e){return await Y.put(`${Sr.inferd}/config`,e)}async function sM(){return await Y.get(`${Sr.inferd}/defaults`)}async function cM(e){return await Y.put(`${Sr.inferd}/defaults`,e)}async function lM(e,t){let n={...e};return delete n.apiKeySet,delete n.headerNames,(await Y.post(`${Sr.inferd}/test`,{provider:n,...t?{model:t}:{},probe:!0})).cached??null}async function uM(e,t,n=`text`){let r={...e};return delete r.apiKeySet,delete r.headerNames,await Y.post(`${Sr.inferd}/test`,{provider:r,...t?{model:t}:{},modality:n})}var dM=`h-8 w-full rounded-md border bg-background px-2 text-sm outline-none focus:ring-2 focus:ring-ring`,fM=`font-semibold uppercase tracking-[0.08em]`,pM={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`}},mM=[`baseUrl`,`host`,`apiKey`,`cacheDir`,`imageInput`,`timeoutMs`],hM=[{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.`}],gM=12e4;function _M(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 vM({title:e,hint:t}){return(0,Q.jsxs)(`div`,{className:`mb-2`,children:[(0,Q.jsx)(`h3`,{className:q(`text-[11px] text-muted-foreground`,fM),children:e}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:t})]})}function yM({overridden:e,source:t}){return e?(0,Q.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,Q.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 bM({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,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:e}),(0,Q.jsx)(yM,{overridden:u,source:n===void 0?void 0:String(n)}),u&&!o&&(0,Q.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,Q.jsx)(J,{type:i,value:t??``,disabled:o,onChange:e=>r(e.target.value),placeholder:a??(n===void 0?`—`:String(n)),className:q(`h-8 text-sm`,l&&`font-mono`,c&&`border-destructive focus-visible:ring-destructive`)}),c&&(0,Q.jsx)(`p`,{className:`text-[11px] font-medium text-destructive`,children:c}),s&&(0,Q.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:s})]})}function xM({label:e,checked:t,overridden:n,disabled:r,onChange:i}){return(0,Q.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,disabled:r,checked:t,onChange:e=>i(e.target.checked)}),e,(0,Q.jsx)(yM,{overridden:n})]})}function SM({storedNames:e,value:t,disabled:n,onChange:r}){let i=t!==void 0,[a,o]=(0,Z.useState)([]),s=e=>{o(e),r(Object.fromEntries(e.filter(([e])=>e.trim()!==``)))};return(0,Q.jsxs)(`div`,{className:`mt-3 space-y-2`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`Custom headers`}),i?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.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,Q.jsx)(`button`,{type:`button`,onClick:()=>{o([]),r(void 0)},className:`text-[10px] text-muted-foreground underline hover:text-foreground`,children:`cancel`})]}):(0,Q.jsx)(yM,{overridden:!1,source:e?.join(`, `)})]}),!i&&(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:e?.length?(0,Q.jsxs)(Q.Fragment,{children:[`Stored: `,(0,Q.jsx)(`span`,{className:`font-mono`,children:e.join(`, `)}),` (values are never sent back)`]}):`None set.`}),!n&&(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>{o([[``,``]]),r({})},children:e?.length?`Replace headers`:`Add headers`})]}),i&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.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,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(J,{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,Q.jsx)(J,{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,Q.jsx)(X,{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,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]},r)),!n&&(0,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>s([...a,[``,``]]),children:[(0,Q.jsx)(cn,{className:`mr-1.5 h-3.5 w-3.5`}),`Add header`]})]})]})}function CM({open:e,onClick:t,label:n}){return(0,Q.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,Q.jsx)(Ze,{className:q(`h-4 w-4 transition-transform motion-reduce:transition-none`,e&&`rotate-180`)})})}var wM={configured:`bg-success`,"needs-fill":`bg-warning`,unresolved:`bg-destructive`,unset:`bg-muted-foreground/30`};function TM({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}=Hr(),[f,p]=(0,Z.useState)(()=>structuredClone(e)),[m,h]=(0,Z.useState)(new Set),[g,_]=(0,Z.useState)(null),[v,y]=(0,Z.useState)(!1),[b,x]=(0,Z.useState)(``),[S,C]=(0,Z.useState)(``),[w,T]=(0,Z.useState)(null),E=(0,Z.useMemo)(()=>[...new Set([...Object.keys(t.spaces||{}),...Object.keys(f.spaces||{})])].sort(),[t.spaces,f.spaces]),D=(0,Z.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?pM[i.type]?.url?.key:void 0,o=a?_M(i[a]):null;if(o){d({title:`Backend '${n}'`,description:o,variant:`destructive`});return}_(e);try{try{await lM(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 uM(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,Z.useMemo)(()=>{let e=[];for(let[n,r]of Object.entries(f.providers||{})){let i=r.type??t.providers?.[n]?.type,a=i?pM[i]?.url?.key:void 0;if(!a)continue;let o=_M(r[a]);o&&e.push(`${n}: ${o}`)}return e},[f.providers,t.providers]),L=(0,Z.useMemo)(()=>JSON.stringify(f)!==JSON.stringify(e)||m.size>0,[f,e,m]),R=async()=>{if(I.length>0){d({title:`Fix the endpoint first`,description:I.join(` · `),variant:`destructive`});return}await u(Xj(f,m)),h(new Set)},te=e=>T(t=>t===e?null:e);return(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[i&&(0,Q.jsxs)(`div`,{className:`flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive-subtle p-3 text-xs`,children:[(0,Q.jsx)(U,{className:`mt-0.5 h-4 w-4 shrink-0 text-destructive`}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`p`,{className:`font-medium text-destructive`,children:`Stored config does not resolve; defaults are standing in`}),(0,Q.jsx)(`p`,{className:`mt-0.5 font-mono text-[11px] text-muted-foreground`,children:i})]})]}),(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(vM,{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,Q.jsxs)(`div`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Q.jsx)(`p`,{className:`text-sm font-medium`,children:`No spaces on this layer`}),(0,Q.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,Q.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,Q.jsxs)(`div`,{className:`relative`,children:[(0,Q.jsx)(`span`,{className:q(`absolute inset-y-0 left-0 w-[3px]`,wM[i?`unresolved`:x?`needs-fill`:h?`configured`:`unset`]),"aria-hidden":!0}),(0,Q.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,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1`,children:[(0,Q.jsx)(`span`,{className:q(`text-[11px]`,fM),children:e}),(0,Q.jsx)(`span`,{className:`truncate font-mono text-sm`,children:h||`no model set`}),_&&(0,Q.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,Q.jsxs)(`span`,{className:`text-xs tabular-nums text-muted-foreground`,children:[y,`-d`]}),b&&(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`chunked`})]}),r&&h&&(0,Q.jsxs)(`p`,{className:`mt-1 truncate font-mono text-[11px] text-muted-foreground`,title:`Vector table backing this space`,children:[`└─ `,d?.table??(0,Q.jsx)(`span`,{className:`not-italic`,children:`not created yet`})]}),x&&(0,Q.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,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 max-sm:justify-end`,children:[x&&o&&(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>o(e),children:`Fill`}),(0,Q.jsxs)(X,{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,Q.jsx)(H,{className:`mr-1.5 h-3.5 w-3.5`}),g===e?v?`Downloading…`:`Testing…`:`Test`]}),(0,Q.jsx)(CM,{open:m,onClick:()=>te(p),label:`Edit ${e}`})]})]}),m&&(0,Q.jsxs)(`div`,{className:`border-t bg-muted/40 py-4 pl-4 pr-3`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`Backend`}),(0,Q.jsx)(yM,{overridden:s.provider!==void 0,source:u.provider})]}),(0,Q.jsxs)(`select`,{className:dM,disabled:c,value:s.provider??``,onChange:t=>O(e,`provider`,t.target.value),children:[(0,Q.jsx)(`option`,{value:``,children:l.provider?`inherited: ${l.provider}`:`inherited`}),D.map(e=>(0,Q.jsx)(`option`,{value:e,children:e},e))]})]}),(0,Q.jsx)(bM,{label:`Model`,mono:!0,value:s.model,inheritedValue:l.model,onChange:t=>O(e,`model`,t),disabled:c}),(0,Q.jsx)(bM,{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,Q.jsx)(bM,{label:`Max length`,type:`number`,value:s.maxLength,inheritedValue:l.maxLength,onChange:t=>O(e,`maxLength`,t),disabled:c})]}),(0,Q.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-4`,children:[(0,Q.jsx)(xM,{label:`Chunk long inputs`,checked:b,overridden:s.chunk!==void 0,disabled:c,onChange:t=>k(e,`chunk`,t)}),(0,Q.jsx)(xM,{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,Q.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(J,{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,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`ghost`,onClick:N,children:[(0,Q.jsx)(cn,{className:`mr-1.5 h-3.5 w-3.5`}),`Add space`]})]})]}),(0,Q.jsxs)(`section`,{children:[(0,Q.jsx)(vM,{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,Q.jsx)(`div`,{className:`divide-y overflow-hidden rounded-lg border`,children:D.map(e=>{let n=f.providers?.[e]||{},r=t.providers?.[e]||{},i=qj.includes(e),a=f.providers?.[e]!==void 0,o=`provider:${e}`,s=w===o,l=n.type??r.type,u=l?pM[l]:void 0,d=u?.url?_M(n[u.url.key]):null,p={...r,...n},h=mM.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,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 px-4 py-3 sm:flex-row sm:items-start sm:gap-3`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1`,children:[(0,Q.jsx)(`span`,{className:`font-mono text-sm font-semibold`,children:e}),(0,Q.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground`,children:l??`no type`}),i&&(0,Q.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`built-in`}),p.apiKeySet&&!m.has(e)&&(0,Q.jsx)(`span`,{className:`text-[10px] font-medium text-success`,children:`key set`}),d&&(0,Q.jsx)(`span`,{className:`text-[10px] font-medium text-destructive`,children:`check endpoint`})]}),(0,Q.jsx)(`p`,{className:`mt-1 truncate font-mono text-[11px] text-muted-foreground`,children:u?u.where(p):`—`}),g.length>0&&(0,Q.jsxs)(`p`,{className:`mt-1 text-[11px] text-muted-foreground`,children:[`used by `,g.join(`, `)]})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 max-sm:justify-end`,children:[a&&!i&&!c&&(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>M(e),title:`Remove this override`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(CM,{open:s,onClick:()=>te(o),label:`Edit ${e}`})]})]}),s&&(0,Q.jsxs)(`div`,{className:`border-t bg-muted/40 px-4 py-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`Type`}),(0,Q.jsx)(yM,{overridden:n.type!==void 0,source:r.type})]}),(0,Q.jsxs)(`select`,{className:dM,disabled:c,value:n.type??``,onChange:t=>A(e,`type`,t.target.value),children:[(0,Q.jsx)(`option`,{value:``,children:r.type?`inherited: ${r.type}`:`inherited`}),Kj.map(e=>(0,Q.jsx)(`option`,{value:e,children:e},e)),l&&!Kj.includes(l)&&(0,Q.jsxs)(`option`,{value:l,children:[l,` (legacy)`]})]}),u?.note&&(0,Q.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:u.note})]}),u?.url&&(0,Q.jsx)(bM,{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,Q.jsx)(bM,{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,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`Image input shape`}),(0,Q.jsx)(yM,{overridden:n.imageInput!==void 0,source:r.imageInput})]}),(0,Q.jsxs)(`select`,{className:dM,disabled:c,value:n.imageInput??``,onChange:t=>A(e,`imageInput`,t.target.value),children:[(0,Q.jsx)(`option`,{value:``,children:r.imageInput?`inherited: ${r.imageInput}`:`inherited: data-uri`}),hM.map(e=>(0,Q.jsx)(`option`,{value:e.value,children:e.label},e.value))]}),(0,Q.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:hM.find(e=>e.value===(n.imageInput??r.imageInput??`data-uri`))?.hint})]}),u?.timeoutMs&&(0,Q.jsx)(bM,{label:`Request timeout (ms)`,type:`number`,value:n.timeoutMs,inheritedValue:r.timeoutMs??gM,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,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`API key`}),m.has(e)&&(0,Q.jsx)(`span`,{className:`rounded bg-warning-subtle px-1.5 py-0.5 text-[10px] font-medium text-warning`,children:`will be written`})]}),(0,Q.jsx)(J,{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,Q.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,Q.jsx)(SM,{disabled:c,storedNames:r.headerNames,value:n.headers,onChange:t=>j(e,`headers`,t)}),h.length>0&&!c&&(0,Q.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,Q.jsxs)(`span`,{children:[`Not used by type `,(0,Q.jsx)(`span`,{className:`font-mono`,children:l}),`:`,` `,(0,Q.jsx)(`span`,{className:`font-mono`,children:h.join(`, `)})]}),(0,Q.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,Q.jsxs)(`p`,{className:`mt-3 text-[11px] text-muted-foreground`,children:[`Stored custom headers: `,(0,Q.jsx)(`span`,{className:`font-mono`,children:r.headerNames.join(`, `)}),` (values not shown)`]})]})]},e)})}),!c&&(0,Q.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(J,{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,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>P(b.trim()),children:[(0,Q.jsx)(cn,{className:`mr-1.5 h-3.5 w-3.5`}),`Add backend`]}),Jj.filter(e=>!D.includes(e.id)).map(e=>(0,Q.jsx)(X,{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,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 border-t pt-4`,children:[(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:L?`default`:`outline`,onClick:R,disabled:s||!L||I.length>0,children:s?`Saving…`:l}),(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`ghost`,disabled:s||!L,onClick:()=>{p(structuredClone(e)),h(new Set)},children:`Discard changes`}),(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:I.length>0?(0,Q.jsxs)(`span`,{className:`font-medium text-destructive`,children:[I.length,` endpoint `,I.length===1?`needs`:`need`,` fixing`]}):L?`Unsaved changes`:`Everything saved`})]})]})}function EM(){let{showToast:e}=Hr(),[t,n]=(0,Z.useState)(null),[r,i]=(0,Z.useState)(!0),[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)(null),l=(0,Z.useCallback)(()=>aM().then(e=>{n(e),c(null)}).catch(e=>c(e instanceof Error?e.message:`Failed to load embedding defaults`)).finally(()=>i(!1)),[]);(0,Z.useEffect)(()=>{l()},[l]);let u=()=>{i(!0),l()};return(0,Q.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6`,children:[(0,Q.jsx)(Ww,{compact:!0,className:`mb-6`,title:`Search & AI defaults`,onBack:TO(),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,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:u,disabled:r,children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})}),r?(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Q.jsx)(P,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):s||!t?(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/5 p-4 text-sm`,children:[(0,Q.jsx)(`p`,{className:`font-medium text-destructive`,children:`Embedding defaults unavailable`}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:s||`No config returned.`})]}),(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:u,children:`Retry`})]}):(0,Q.jsx)(TM,{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 oM(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 DM(){let e=fl(),{showToast:t}=Hr(),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,Z.useState)(i),[c,l]=(0,Z.useState)(a),[u,d]=(0,Z.useState)(null),[f,p]=(0,Z.useState)([]),[m,h]=(0,Z.useState)(!1),g=(0,Z.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 Y.get(e,{skipAuth:!0,headers:_()});d(t);let n=await Y.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,Z.useRef)(v);return(0,Z.useEffect)(()=>{y.current()},[]),(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsx)(Ww,{onBack:TO(),title:`Shared Resource Viewer`,description:`Open a resource someone shared with you.`}),(0,Q.jsxs)(`div`,{className:`grid gap-2 md:grid-cols-3`,children:[(0,Q.jsx)(J,{value:o,onChange:e=>s(e.target.value),placeholder:`Full pub URL`}),(0,Q.jsx)(J,{value:c,onChange:e=>l(e.target.value),placeholder:`Access token (canvas-...)`}),(0,Q.jsx)(X,{onClick:v,disabled:m||!o||!c,children:`Load`})]}),(0,Q.jsxs)(`div`,{className:`text-sm text-muted-foreground`,children:[`Type: `,g]}),m?(0,Q.jsx)(`div`,{className:`text-center py-8 text-muted-foreground`,children:`Loading...`}):(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{className:`border rounded p-3`,children:[(0,Q.jsx)(`h2`,{className:`font-semibold mb-2`,children:`Metadata`}),(0,Q.jsx)(`pre`,{className:`text-xs overflow-auto max-h-80`,children:JSON.stringify(u,null,2)})]}),(0,Q.jsxs)(`div`,{className:`border rounded p-3`,children:[(0,Q.jsxs)(`h2`,{className:`font-semibold mb-2`,children:[`Documents (`,f.length,`)`]}),f.length===0?(0,Q.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`No documents`}):(0,Q.jsx)(`ul`,{className:`space-y-2 text-sm`,children:f.slice(0,100).map((e,t)=>(0,Q.jsxs)(`li`,{className:`border rounded p-2`,children:[(0,Q.jsx)(`div`,{className:`font-mono text-xs`,children:e.id}),(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.schema})]},t))})]})]}),(0,Q.jsx)(ud,{className:`mt-8`})]})}function OM(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 kM(){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 AM={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?`${Sr.admin.users}?${n}`:Sr.admin.users;return await Y.get(r)},async getUser(e){return await Y.get(`${Sr.admin.users}/${e}`)},async createUser(e){return await Y.post(Sr.admin.users,e)},async updateUser(e,t){return await Y.put(`${Sr.admin.users}/${e}`,t)},async deleteUser(e){await Y.delete(`${Sr.admin.users}/${e}`)}},jM={async listAllWorkspaces(){return await Y.get(Sr.admin.workspaces)},async createWorkspace(e){return await Y.post(Sr.admin.workspaces,e)},async deleteWorkspace(e){await Y.delete(`${Sr.admin.workspaces}/${e}`)}},MM={async getLogs(e={}){return(await Y.get(`${Sr.admin.logs}${OM(e)}`)).logs||[]},async streamLogs(e={},t={}){let{signal:n,onEntry:r,onError:i}=t;try{let t=await fetch(`${Sr.admin.logsStream}${OM(e)}`,{method:`GET`,headers:kM(),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(`
30
- `),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(`
31
- `));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(`
32
-
33
- `);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}}};async function NM(e,t,n){let r=await Y.postEnvelope(`${Sr.admin.workspaces}/${encodeURIComponent(e)}/${t}`,n??{});return{message:r.message??``,payload:r.payload}}function PM(e){return NM(e,`reindex-timelines`)}function FM(e,t=!1){return NM(e,`reindex-search${t?`?rebuild=true`:``}`)}function IM(e,t){return NM(e,`optimize`,t?{space:t}:{})}function LM(e){return NM(e,`reindex-mime`)}var RM={users:AM,workspaces:jM,logs:MM},zM=()=>{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 BM(){let e=vd()?.userType===`admin`,[t,n]=(0,Z.useState)([]),[r,i]=(0,Z.useState)([]),[a,o]=(0,Z.useState)(e),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)(e?null:`Access denied. Admin privileges required.`),[d,f]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)(!1),[h,g]=(0,Z.useState)({search:``,owner:``,type:``,status:``}),[_,v]=(0,Z.useState)({userId:``,name:``,label:``,description:``,color:zM(),type:`workspace`}),{showToast:y}=Hr(),b=(0,Z.useCallback)(async()=>{try{o(!0);let e=await RM.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,Z.useEffect)(()=>{e&&b()},[e,b]);let x=(0,Z.useCallback)(async()=>{try{c(!0);let e=await RM.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 RM.workspaces.createWorkspace(e),v({userId:``,name:``,label:``,description:``,color:zM(),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 RM.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:zM(),type:`workspace`}),m(!0),await x()},T=()=>{m(!1)};Np(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,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{title:`Workspace Administration`,description:`Manage workspaces across all users`}),t.some(e=>e.status!==`active`&&e.protection?.mode&&e.protection.mode!==`none`)&&(0,Q.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,Q.jsxs)(`div`,{className:`flex flex-col gap-4 md:flex-row md:items-center md:justify-between`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 md:flex-row md:items-center`,children:[(0,Q.jsx)(J,{placeholder:`Search workspaces...`,value:h.search,onChange:e=>g(t=>({...t,search:e.target.value})),className:`md:w-64`}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`All Owners`}),D.map(e=>(0,Q.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`All Types`}),(0,Q.jsx)(`option`,{value:`workspace`,children:`Workspace`}),(0,Q.jsx)(`option`,{value:`universe`,children:`Universe`})]}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`All Statuses`}),(0,Q.jsx)(`option`,{value:`active`,children:`Active`}),(0,Q.jsx)(`option`,{value:`inactive`,children:`Inactive`}),(0,Q.jsx)(`option`,{value:`error`,children:`Error`})]})]}),(0,Q.jsxs)(X,{onClick:w,children:[(0,Q.jsx)(cn,{className:`mr-2 h-4 w-4`}),`Create Workspace`]})]}),(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[a&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading workspaces...`}),l&&!t.length&&(0,Q.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Q.jsx)(`p`,{children:l})}),!a&&!l&&E.length===0&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No workspaces found`}),E.length>0&&(0,Q.jsx)(`div`,{className:`border rounded-md`,children:(0,Q.jsx)(`div`,{className:`overflow-x-auto`,children:(0,Q.jsxs)(`table`,{className:`w-full`,children:[(0,Q.jsx)(`thead`,{children:(0,Q.jsxs)(`tr`,{className:`bg-muted/50`,children:[(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Name`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Label`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Owner`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Type`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Status`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Color`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Created`}),(0,Q.jsx)(`th`,{className:`text-right p-3 font-medium`,children:`Actions`})]})}),(0,Q.jsx)(`tbody`,{children:E.map(e=>(0,Q.jsxs)(`tr`,{className:`border-t`,children:[(0,Q.jsx)(`td`,{className:`p-3 font-medium font-mono text-sm`,children:e.name}),(0,Q.jsx)(`td`,{className:`p-3`,children:e.label}),(0,Q.jsx)(`td`,{className:`p-3`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(V,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{className:`font-medium`,children:e.ownerName||`Unknown`}),(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.ownerEmail})]})]})}),(0,Q.jsx)(`td`,{className:`p-3`,children:(0,Q.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,Q.jsx)(`td`,{className:`p-3`,children:(0,Q.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,Q.jsx)(`td`,{className:`p-3`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`div`,{className:`w-4 h-4 rounded border`,style:{backgroundColor:e.color}}),(0,Q.jsx)(`span`,{className:`font-mono text-xs`,children:e.color})]})}),(0,Q.jsx)(`td`,{className:`p-3`,children:new Date(e.createdAt).toLocaleDateString()}),(0,Q.jsxs)(`td`,{className:`p-3 text-right space-x-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>window.open(`/workspaces/${e.name}`,`_blank`),title:`View workspace`,children:(0,Q.jsx)(Zn,{className:`h-4 w-4`})}),(0,Q.jsx)(X,{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,Q.jsx)(st,{className:`h-4 w-4`})})]})]},e.id))})]})})})]}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 gap-4 mt-8`,children:[(0,Q.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Q.jsx)(`div`,{className:`text-2xl font-bold`,children:t.length}),(0,Q.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Total Workspaces`})]}),(0,Q.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Q.jsx)(`div`,{className:`text-2xl font-bold`,children:t.filter(e=>e.status===`active`).length}),(0,Q.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Active Workspaces`})]}),(0,Q.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Q.jsx)(`div`,{className:`text-2xl font-bold`,children:t.filter(e=>e.type===`universe`).length}),(0,Q.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Universe Workspaces`})]}),(0,Q.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Q.jsx)(`div`,{className:`text-2xl font-bold`,children:D.length}),(0,Q.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Unique Owners`})]})]}),p&&(0,Q.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Q.jsxs)(`div`,{className:`bg-card rounded-lg p-6 w-full max-w-md mx-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,Q.jsx)(`h3`,{className:`text-lg font-semibold`,children:`Create New Workspace`}),(0,Q.jsx)(X,{variant:`ghost`,size:`sm`,onClick:T,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsxs)(`form`,{onSubmit:S,className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`userId`,children:`User`}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`Select a user...`}),r.map(e=>(0,Q.jsxs)(`option`,{value:e.id,children:[e.name,` (`,e.email,`)`]},e.id))]}),s&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:`Loading users...`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`name`,children:`Workspace Name`}),(0,Q.jsx)(J,{id:`name`,type:`text`,value:_.name,onChange:e=>v(t=>({...t,name:e.target.value})),placeholder:`my-workspace`,disabled:d,required:!0}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:`Lowercase letters, numbers, and hyphens only`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`label`,children:`Display Label`}),(0,Q.jsx)(J,{id:`label`,type:`text`,value:_.label,onChange:e=>v(t=>({...t,label:e.target.value})),placeholder:`My Workspace`,disabled:d})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`description`,children:`Description`}),(0,Q.jsx)(J,{id:`description`,type:`text`,value:_.description,onChange:e=>v(t=>({...t,description:e.target.value})),placeholder:`Workspace description (optional)`,disabled:d})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`type`,children:`Type`}),(0,Q.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,Q.jsx)(`option`,{value:`workspace`,children:`Workspace`}),(0,Q.jsx)(`option`,{value:`universe`,children:`Universe`})]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`color`,children:`Color`}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(J,{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,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>v(e=>({...e,color:zM()})),disabled:d,children:`Random`})]})]}),(0,Q.jsxs)(`div`,{className:`flex gap-2 pt-4`,children:[(0,Q.jsx)(X,{type:`submit`,disabled:d||s,className:`flex-1`,children:d?`Creating...`:`Create Workspace`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,onClick:T,disabled:d,children:`Cancel`})]})]})]})})]}):(0,Q.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Q.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function VM(){let e=vd()?.userType===`admin`;return(0,Z.useEffect)(()=>{},[e]),e?(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{title:`All Contexts`,description:`Manage all contexts across all users`}),(0,Q.jsx)(`div`,{className:`flex flex-col items-center justify-center py-12 space-y-4`,children:(0,Q.jsxs)(`div`,{className:`text-center`,children:[(0,Q.jsx)(`h2`,{className:`text-2xl font-semibold mb-2`,children:`Coming Soon`}),(0,Q.jsx)(`p`,{className:`text-muted-foreground max-w-md`,children:`Global context management is currently under development. Check back later for updates.`})]})})]}):(0,Q.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Q.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function HM(){let e=vd()?.userType===`admin`;return(0,Z.useEffect)(()=>{},[e]),e?(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{title:`All Agents`,description:`Manage all AI agents across all users`}),(0,Q.jsx)(`div`,{className:`flex flex-col items-center justify-center py-12 space-y-4`,children:(0,Q.jsxs)(`div`,{className:`text-center`,children:[(0,Q.jsx)(`h2`,{className:`text-2xl font-semibold mb-2`,children:`Coming Soon`}),(0,Q.jsx)(`p`,{className:`text-muted-foreground max-w-md`,children:`Global agent management is currently under development. Check back later for updates.`})]})})]}):(0,Q.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Q.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}var UM={tail:200,level:``,module:``};function WM(e){return e.slice(-1e3)}function GM(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 KM(){let e=TO(),t=vd()?.userType===`admin`,{showToast:n}=Hr(),r=(0,Z.useRef)(null),[i,a]=(0,Z.useState)(UM),[o,s]=(0,Z.useState)(UM),[c,l]=(0,Z.useState)([]),[u,d]=(0,Z.useState)(t),[f,p]=(0,Z.useState)(!1),[m,h]=(0,Z.useState)(!1),[g,_]=(0,Z.useState)(t?null:`Access denied. Admin privileges required.`),v=(0,Z.useCallback)(async e=>{try{d(!0);let t=await RM.logs.getLogs(e);l(WM(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,Z.useEffect)(()=>{t&&v(i)},[i,t,v]),(0,Z.useEffect)(()=>{if(!t||m)return;let e=new AbortController;return p(!0),RM.logs.streamLogs(i,{signal:e.signal,onEntry:e=>{l(t=>WM([...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,Z.useEffect)(()=>{!r.current||m||(r.current.scrollTop=r.current.scrollHeight)},[c,m]);let y=()=>{a({tail:Math.min(Math.max(Number(o.tail)||UM.tail,1),500),level:o.level||``,module:o.module.trim()})},b=(0,Z.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,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{onBack:e,title:`Server Logs`,description:`Live tail for the unified canvas-server logger`,actions:(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,Q.jsx)(Kt,{className:`w-4 h-4 ${f?`text-success`:`text-muted-foreground`}`}),(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:m?`Paused`:f?`Streaming`:`Disconnected`})]})}),(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-[140px_180px_1fr_auto]`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`tail`,children:`Tail`}),(0,Q.jsx)(J,{id:`tail`,type:`number`,min:1,max:500,value:o.tail,onChange:e=>s(t=>({...t,tail:Number(e.target.value)}))})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`level`,children:`Level`}),(0,Q.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,Q.jsx)(`option`,{value:e.value,children:e.label},e.value||`all`))})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`module`,children:`Module filter`}),(0,Q.jsx)(J,{id:`module`,placeholder:`auth, http, workspace...`,value:o.module,onChange:e=>s(t=>({...t,module:e.target.value}))})]}),(0,Q.jsx)(`div`,{className:`flex items-end`,children:(0,Q.jsx)(X,{onClick:y,className:`w-full`,children:`Apply`})})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsxs)(X,{variant:`outline`,onClick:()=>h(e=>!e),children:[m?(0,Q.jsx)(Se,{className:`w-4 h-4 mr-2`}):(0,Q.jsx)(D,{className:`w-4 h-4 mr-2`}),m?`Resume`:`Pause`]}),(0,Q.jsxs)(X,{variant:`outline`,onClick:()=>v(i),children:[(0,Q.jsx)(j,{className:`w-4 h-4 mr-2`}),`Refresh`]}),(0,Q.jsxs)(X,{variant:`outline`,onClick:()=>l([]),children:[(0,Q.jsx)(rt,{className:`w-4 h-4 mr-2`}),`Clear buffer`]}),(0,Q.jsxs)(`span`,{className:`text-sm text-muted-foreground ml-auto`,children:[`Showing `,c.length,` lines`]})]}),g&&(0,Q.jsx)(`div`,{className:`rounded-md border border-destructive/30 bg-destructive/5 px-4 py-3 text-sm text-destructive`,children:g}),(0,Q.jsx)(`div`,{className:`border rounded-lg overflow-hidden`,children:(0,Q.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,Q.jsx)(`div`,{className:`text-muted-foreground`,children:`Loading logs...`}):c.length===0?(0,Q.jsx)(`div`,{className:`text-muted-foreground`,children:`No logs available`}):(0,Q.jsx)(`div`,{className:`whitespace-pre-wrap break-words`,children:c.map((e,t)=>(0,Q.jsx)(`div`,{className:GM(e),children:e.line},`${e.time||`log`}-${t}`))})})})]}):(0,Q.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Q.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}var qM={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?`${Sr.roles}?${n}`:Sr.roles;return(await Y.get(r)).roles||[]},async getRole(e){return(await Y.get(`${Sr.roles}/${e}`)).role},async createRole(e){return(await Y.post(Sr.roles,e)).role},async deleteRole(e,t=!1){let n=t?`?force=true`:``;await Y.delete(`${Sr.roles}/${e}${n}`)},async startRole(e){return(await Y.post(`${Sr.roles}/${e}/start`,{})).role},async stopRole(e){await Y.post(`${Sr.roles}/${e}/stop`,{})},async restartRole(e){return(await Y.post(`${Sr.roles}/${e}/restart`,{})).role},async getRoleLogs(e,t=100){return(await Y.get(`${Sr.roles}/${e}/logs?tail=${t}`)).logs||[]},async getRoleStats(e){return(await Y.get(`${Sr.roles}/${e}/stats`)).stats},async getRoleHealth(e){return(await Y.get(`${Sr.roles}/${e}/health`)).health},async listTemplates(){return(await Y.get(`${Sr.roleTemplates}`)).templates||[]},async getTemplate(e){return(await Y.get(`${Sr.roleTemplates}/${e}`)).template}};function JM({status:e}){let t={running:{icon:Oe,color:`text-success`,bg:`bg-success-subtle`,label:`Running`},stopped:{icon:S,color:`text-muted-foreground`,bg:`bg-muted`,label:`Stopped`},starting:{icon:N,color:`text-info`,bg:`bg-info-subtle`,label:`Starting`},stopping:{icon:N,color:`text-warning`,bg:`bg-warning-subtle`,label:`Stopping`},error:{icon:R,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Error`},created:{icon:Kt,color:`text-muted-foreground`,bg:`bg-muted`,label:`Created`},configured:{icon:Kt,color:`text-info`,bg:`bg-info-subtle`,label:`Configured`},removed:{icon:S,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Removed`}},n=t[e]||t.created,r=n.icon;return(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium ${n.bg} ${n.color}`,children:[(0,Q.jsx)(r,{className:`w-3 h-3`}),n.label]})}function YM({type:e}){return(0,Q.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,Q.jsx)(Yt,{className:`w-3 h-3`}),e===`global`?`Global`:`Workspace`]})}function XM(){let e=TO(),t=vd()?.userType===`admin`,[n,r]=(0,Z.useState)([]),[i,a]=(0,Z.useState)([]),[o,s]=(0,Z.useState)(t),[c,l]=(0,Z.useState)(t?null:`Access denied. Admin privileges required.`),[u,d]=(0,Z.useState)(!1);Np(()=>d(!1),u);let[f,p]=(0,Z.useState)(null),[m,h]=(0,Z.useState)(!1);Np(()=>h(!1),m);let[g,_]=(0,Z.useState)([]),[v,y]=(0,Z.useState)({type:``,status:``,search:``}),[b,x]=(0,Z.useState)({template:``,name:``,type:`global`}),{showToast:S}=Hr(),C=(0,Z.useRef)(v);(0,Z.useEffect)(()=>{C.current=v},[v]);let w=(0,Z.useCallback)(async()=>{try{s(!0);let{type:e,status:t}=C.current,n=await qM.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,Z.useCallback)(async()=>{try{let e=await qM.listTemplates();a(e)}catch(e){console.error(`Failed to fetch templates:`,e)}},[]);(0,Z.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 qM.createRole(b),S({title:`Success`,description:`Role "${b.name}" created successfully`}),d(!1),N(),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 qM.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 qM.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 qM.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 qM.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`})}},M=async e=>{try{let t=await qM.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`})}},N=()=>{x({template:``,name:``,type:`global`})},P=()=>{N(),d(!0)},ee=()=>{d(!1),N()},F=n.filter(e=>!v.search||e.name.toLowerCase().includes(v.search.toLowerCase())||e.template.toLowerCase().includes(v.search.toLowerCase()));return t?c&&!t?(0,Q.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Q.jsx)(`div`,{className:`text-destructive`,children:c})}):(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{onBack:e,title:`Role Management`,description:`Manage global and workspace roles for Canvas services`,actions:(0,Q.jsxs)(X,{onClick:P,className:`gap-2`,children:[(0,Q.jsx)(cn,{className:`w-4 h-4`}),`Create Role`]})}),(0,Q.jsxs)(`div`,{className:`flex gap-4 items-end`,children:[(0,Q.jsxs)(`div`,{className:`flex-1`,children:[(0,Q.jsx)($,{htmlFor:`search`,children:`Search`}),(0,Q.jsx)(J,{id:`search`,placeholder:`Search by name or template...`,value:v.search,onChange:e=>y({...v,search:e.target.value})})]}),(0,Q.jsxs)(`div`,{className:`w-48`,children:[(0,Q.jsx)($,{htmlFor:`type`,children:`Type`}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`All Types`}),(0,Q.jsx)(`option`,{value:`global`,children:`Global`}),(0,Q.jsx)(`option`,{value:`workspace`,children:`Workspace`})]})]}),(0,Q.jsxs)(`div`,{className:`w-48`,children:[(0,Q.jsx)($,{htmlFor:`status`,children:`Status`}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`All Statuses`}),(0,Q.jsx)(`option`,{value:`running`,children:`Running`}),(0,Q.jsx)(`option`,{value:`stopped`,children:`Stopped`}),(0,Q.jsx)(`option`,{value:`starting`,children:`Starting`}),(0,Q.jsx)(`option`,{value:`error`,children:`Error`})]})]}),(0,Q.jsxs)(X,{onClick:w,variant:`outline`,children:[(0,Q.jsx)(j,{className:`w-4 h-4 mr-2`}),`Refresh`]})]}),o?(0,Q.jsx)(`div`,{className:`text-center py-8`,children:`Loading roles...`}):F.length===0?(0,Q.jsxs)(`div`,{className:`text-center py-8 border rounded-lg`,children:[(0,Q.jsx)(Yt,{className:`w-12 h-12 mx-auto text-muted-foreground mb-4`}),(0,Q.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,Q.jsxs)(X,{onClick:P,variant:`outline`,className:`mt-4`,children:[(0,Q.jsx)(cn,{className:`w-4 h-4 mr-2`}),`Create Your First Role`]})]}):(0,Q.jsx)(`div`,{className:`border rounded-lg`,children:(0,Q.jsxs)(`table`,{className:`w-full`,children:[(0,Q.jsx)(`thead`,{className:`bg-muted/50`,children:(0,Q.jsxs)(`tr`,{children:[(0,Q.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Name`}),(0,Q.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Template`}),(0,Q.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Type`}),(0,Q.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Status`}),(0,Q.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Container`}),(0,Q.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Created`}),(0,Q.jsx)(`th`,{className:`text-right p-4 font-medium`,children:`Actions`})]})}),(0,Q.jsx)(`tbody`,{className:`divide-y`,children:F.map(e=>(0,Q.jsxs)(`tr`,{className:`hover:bg-muted/50`,children:[(0,Q.jsx)(`td`,{className:`p-4 font-medium`,children:e.name}),(0,Q.jsx)(`td`,{className:`p-4 text-sm text-muted-foreground`,children:e.template}),(0,Q.jsx)(`td`,{className:`p-4`,children:(0,Q.jsx)(YM,{type:e.type})}),(0,Q.jsx)(`td`,{className:`p-4`,children:(0,Q.jsx)(JM,{status:e.status})}),(0,Q.jsx)(`td`,{className:`p-4 text-sm text-muted-foreground`,children:e.container?.name||`-`}),(0,Q.jsx)(`td`,{className:`p-4 text-sm text-muted-foreground`,children:new Date(e.createdAt).toLocaleDateString()}),(0,Q.jsx)(`td`,{className:`p-4`,children:(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[e.status===`stopped`||e.status===`created`?(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>D(e),title:`Start`,children:(0,Q.jsx)(Se,{className:`w-4 h-4`})}):e.status===`running`?(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>O(e),title:`Stop`,children:(0,Q.jsx)(Bn,{className:`w-4 h-4`})}):null,e.status===`running`&&(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>k(e),title:`Restart`,children:(0,Q.jsx)(j,{className:`w-4 h-4`})}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>M(e),title:`View Logs`,children:(0,Q.jsx)(rn,{className:`w-4 h-4`})}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>A(e),title:`Delete`,className:`text-destructive hover:text-destructive`,children:(0,Q.jsx)(st,{className:`w-4 h-4`})})]})})]},e.id))})]})}),u&&(0,Q.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Q.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,Q.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsx)(`h2`,{className:`text-xl font-bold`,children:`Create New Role`}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,onClick:ee,children:(0,Q.jsx)(W,{className:`w-4 h-4`})})]}),(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`template`,children:`Template *`}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`Select a template...`}),i.map(e=>(0,Q.jsxs)(`option`,{value:e.id,children:[e.name,` - `,e.description]},e.id))]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`name`,children:`Role Name *`}),(0,Q.jsx)(J,{id:`name`,placeholder:`e.g., canvas-sshd`,value:b.name,onChange:e=>x({...b,name:e.target.value})})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`roleType`,children:`Type *`}),(0,Q.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,Q.jsx)(`option`,{value:`global`,children:`Global (Server-wide)`}),(0,Q.jsx)(`option`,{value:`workspace`,children:`Workspace (User-scoped)`})]})]}),b.template&&(0,Q.jsxs)(`div`,{className:`p-4 bg-muted rounded-lg`,children:[(0,Q.jsx)(`h3`,{className:`font-medium mb-2`,children:`Template Info`}),i.find(e=>e.id===b.template)&&(0,Q.jsxs)(`div`,{className:`text-sm space-y-1 text-muted-foreground`,children:[(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`Image:`}),` `,i.find(e=>e.id===b.template)?.container.image]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`Category:`}),` `,i.find(e=>e.id===b.template)?.category]}),i.find(e=>e.id===b.template)?.documentation?.readme&&(0,Q.jsx)(`p`,{className:`mt-2`,children:i.find(e=>e.id===b.template)?.documentation?.readme})]})]})]}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2 pt-4 border-t`,children:[(0,Q.jsx)(X,{variant:`outline`,onClick:ee,children:`Cancel`}),(0,Q.jsx)(X,{onClick:E,children:`Create Role`})]})]})})}),m&&f&&(0,Q.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Q.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,Q.jsxs)(`div`,{className:`p-6 border-b flex items-center justify-between`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-xl font-bold`,children:`Role Logs`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:f.name})]}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,onClick:()=>h(!1),children:(0,Q.jsx)(W,{className:`w-4 h-4`})})]}),(0,Q.jsx)(`div`,{className:`flex-1 overflow-y-auto p-6`,children:(0,Q.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,Q.jsx)(`div`,{className:`text-muted-foreground`,children:`No logs available`}):(0,Q.jsx)(`pre`,{children:g.join(`
34
- `)})})}),(0,Q.jsx)(`div`,{className:`p-4 border-t flex justify-end`,children:(0,Q.jsx)(X,{onClick:()=>h(!1),children:`Close`})})]})})]}):(0,Q.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Q.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function ZM(){let e=TO(),t=vd(),n=t?.userType===`admin`,[r,i]=(0,Z.useState)([]),[a,o]=(0,Z.useState)(n),[s,c]=(0,Z.useState)(n?null:`Access denied. Admin privileges required.`),[l,u]=(0,Z.useState)(!1),[d,f]=(0,Z.useState)(null),[p,m]=(0,Z.useState)(!1),[h,g]=(0,Z.useState)(!1),[_,v]=(0,Z.useState)(null),[y,b]=(0,Z.useState)({status:``,userType:``,search:``}),[x,S]=(0,Z.useState)({name:``,email:``,password:``,userType:`user`,status:`active`}),{showToast:C}=Hr();(0,Z.useEffect)(()=>{n&&(async()=>{try{let e=await Cd(),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 wd(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,Z.useCallback)(async()=>{try{o(!0);let{status:e,userType:t}=y,n=await RM.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,Z.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 RM.users.createUser(e),h&&x.status===`pending`)try{await wd(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 RM.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 RM.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)};Np(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,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{onBack:e,title:`User Management`,description:`Manage user accounts and permissions`}),(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4 md:flex-row md:items-center md:justify-between`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 md:flex-row md:items-center`,children:[(0,Q.jsx)(J,{placeholder:`Search users...`,value:y.search,onChange:e=>b(t=>({...t,search:e.target.value})),className:`md:w-64`}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`All Statuses`}),(0,Q.jsx)(`option`,{value:`active`,children:`Active`}),(0,Q.jsx)(`option`,{value:`inactive`,children:`Inactive`}),(0,Q.jsx)(`option`,{value:`pending`,children:`Pending`}),(0,Q.jsx)(`option`,{value:`deleted`,children:`Deleted`})]}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`All Types`}),(0,Q.jsx)(`option`,{value:`user`,children:`User`}),(0,Q.jsx)(`option`,{value:`admin`,children:`Admin`})]})]}),(0,Q.jsxs)(X,{onClick:N,children:[(0,Q.jsx)(cn,{className:`mr-2 h-4 w-4`}),`Create User`]})]}),(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[a&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading users...`}),s&&!r.length&&(0,Q.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Q.jsx)(`p`,{children:s})}),!a&&!s&&F.length===0&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No users found`}),F.length>0&&(0,Q.jsx)(`div`,{className:`border rounded-md`,children:(0,Q.jsx)(`div`,{className:`overflow-x-auto`,children:(0,Q.jsxs)(`table`,{className:`w-full`,children:[(0,Q.jsx)(`thead`,{children:(0,Q.jsxs)(`tr`,{className:`bg-muted/50`,children:[(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Name`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Email`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Type`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Status`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Created`}),(0,Q.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Updated`}),(0,Q.jsx)(`th`,{className:`text-right p-3 font-medium`,children:`Actions`})]})}),(0,Q.jsx)(`tbody`,{children:F.map(e=>(0,Q.jsxs)(`tr`,{className:`border-t`,children:[(0,Q.jsx)(`td`,{className:`p-3 font-medium`,children:e.name}),(0,Q.jsx)(`td`,{className:`p-3`,children:e.email}),(0,Q.jsx)(`td`,{className:`p-3`,children:(0,Q.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,Q.jsx)(`td`,{className:`p-3`,children:(0,Q.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,Q.jsx)(`td`,{className:`p-3`,children:D(e.createdAt)}),(0,Q.jsx)(`td`,{className:`p-3`,children:D(e.updatedAt)}),(0,Q.jsxs)(`td`,{className:`p-3 text-right space-x-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>P(e),children:(0,Q.jsx)(Le,{className:`h-4 w-4`})}),h&&e.status===`pending`&&(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>O(e.email),title:`Resend activation email`,children:`Resend activation`}),(0,Q.jsx)(X,{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,Q.jsx)(st,{className:`h-4 w-4`})})]})]},e.id))})]})})})]}),p&&(0,Q.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Q.jsxs)(`div`,{className:`bg-card rounded-lg p-6 w-full max-w-md mx-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,Q.jsx)(`h3`,{className:`text-lg font-semibold`,children:d?`Edit User`:`Create New User`}),(0,Q.jsx)(X,{variant:`ghost`,size:`sm`,onClick:ee,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsxs)(`form`,{onSubmit:d?j:A,className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`name`,children:`Username`}),(0,Q.jsx)(J,{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,Q.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:`3-39 characters, lowercase letters, numbers, underscores, and hyphens only`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`email`,children:`Email`}),(0,Q.jsx)(J,{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,Q.jsxs)(`div`,{children:[(0,Q.jsxs)($,{htmlFor:`password`,children:[`Password `,d&&`(leave blank to keep current)`]}),(0,Q.jsx)(J,{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,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:[`Must satisfy: `,E()]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`userType`,children:`User Type`}),(0,Q.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,Q.jsx)(`option`,{value:`user`,children:`User`}),(0,Q.jsx)(`option`,{value:`admin`,children:`Admin`})]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)($,{htmlFor:`status`,children:`Status`}),(0,Q.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,Q.jsx)(`option`,{value:`active`,children:`Active`}),(0,Q.jsx)(`option`,{value:`inactive`,children:`Inactive`}),(0,Q.jsx)(`option`,{value:`pending`,children:`Pending`}),(0,Q.jsx)(`option`,{value:`deleted`,children:`Deleted`})]})]}),(0,Q.jsxs)(`div`,{className:`flex gap-2 pt-4`,children:[(0,Q.jsx)(X,{type:`submit`,disabled:l,className:`flex-1`,children:l?`Processing...`:d?`Update User`:`Create User`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,onClick:ee,disabled:l,children:`Cancel`})]})]})]})})]}):(0,Q.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Q.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function QM(){let e=TO(),{showToast:t}=Hr(),[n,r]=(0,Z.useState)(null),[i,a]=(0,Z.useState)(!0),[o,s]=(0,Z.useState)(!1),[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.useState)(``),f=vd()?.userType===`admin`,p=(0,Z.useCallback)(()=>sM().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,Z.useEffect)(()=>{p()},[p]);let m=()=>{a(!0),p()};return(0,Q.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6`,children:[(0,Q.jsx)(Ww,{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,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:m,disabled:i,children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})}),!f&&(0,Q.jsxs)(`div`,{className:`mb-4 flex items-start gap-2 rounded-md border p-3 text-xs`,children:[(0,Q.jsx)(Wt,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`p`,{className:`text-muted-foreground`,children:`Read-only. Changing server defaults requires an admin account. This is what your workspaces inherit.`})]}),i?(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Q.jsx)(P,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):c||!n?(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/5 p-4 text-sm`,children:[(0,Q.jsx)(`p`,{className:`font-medium text-destructive`,children:`Server defaults unavailable`}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:c||`No config returned.`})]}),(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:m,children:`Retry`})]}):(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`Config file: `,(0,Q.jsx)(`span`,{className:`font-mono`,children:n.configPath})]}),(0,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsx)(`h3`,{className:`text-sm font-semibold`,children:`Endpoint allowlist`}),(0,Q.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,Q.jsx)(J,{value:u,disabled:!f,onChange:e=>d(e.target.value),placeholder:`gpu.internal, embeddings.example.com`,className:`h-8 text-sm`})]}),(0,Q.jsx)(TM,{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 cM({...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 $M(){return Y.get(Sr.admin.authConfig)}function eN(e){return Y.put(Sr.admin.authConfig,e)}function tN(e,t,n){return Y.post(`${Sr.admin.authConfig}/test`,{strategy:`ldap`,name:e,server:t,email:n})}function nN(e,t,n){return Y.post(`${Sr.admin.authConfig}/test`,{strategy:`imap`,domain:e,email:t,password:n})}var rN=0,iN=()=>`row-${++rN}`;function aN(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:iN(),name:e,originalName:e}))},imap:{...i,domains:Object.entries(r).map(([e,t])=>({...t,id:iN(),domain:e}))},google:e.strategies.google??{enabled:!1,defaultUserType:`user`,defaultStatus:`active`,clientId:``,clientSecretSet:!1,allowedDomains:[],autoCreateUsers:!0,webOrigins:[]}}}function oN(e){let{id:t,name:n,originalName:r,...i}=e;return{...i,...r&&r!==e.name?{previousName:r}:{}}}function sN(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(),oN(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 cN({value:e,onChange:t,placeholder:n,disabled:r}){let i=e.join(`, `),[a,o]=(0,Z.useState)(i),[s,c]=(0,Z.useState)(i);return i!==s&&(c(i),a.split(/[\s,]+/).filter(Boolean).join(`, `)!==i&&o(i)),(0,Q.jsx)(J,{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 lN={originalName:null,url:`ldap://`,bindDN:``,bindPasswordSet:!1,bindPassword:void 0,searchBase:``,searchFilter:`(mail={{email}})`,attributes:[`mail`,`cn`,`displayName`,`memberOf`],groupAttribute:`memberOf`,tls:!1},uN={domain:``,name:``,host:``,port:993,secure:!0,startTLS:!1,requireAppPassword:!1},dN=`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 fN({label:e,hint:t,children:n,className:r}){return(0,Q.jsxs)(`label`,{className:q(`flex min-w-0 flex-col gap-1`,r),children:[(0,Q.jsx)(`span`,{className:`text-xs font-medium`,children:e}),n,t&&(0,Q.jsx)(`span`,{className:`text-[11px] text-muted-foreground`,children:t})]})}function pN({checked:e,onChange:t,disabled:n,label:r,hint:i}){return(0,Q.jsxs)(`label`,{className:`flex items-start gap-2 text-sm`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,className:`mt-0.5`,checked:e,disabled:n,onChange:e=>t(e.target.checked)}),(0,Q.jsxs)(`span`,{children:[r,i&&(0,Q.jsx)(`span`,{className:`block text-[11px] text-muted-foreground`,children:i})]})]})}function mN({title:e,description:t,enabled:n,onToggle:r,disabled:i,children:a}){return(0,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`h3`,{className:`text-sm font-semibold`,children:e}),(0,Q.jsx)(`p`,{className:`mt-1 text-[11px] text-muted-foreground`,children:t})]}),r&&(0,Q.jsxs)(`label`,{className:`flex shrink-0 items-center gap-2 text-xs font-medium`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:!!n,disabled:i,onChange:e=>r(e.target.checked)}),n?`Enabled`:`Disabled`]})]}),(0,Q.jsx)(`div`,{className:q(`mt-4 space-y-4`,r&&!n&&`opacity-60`),children:a})]})}function hN({result:e}){return e?(0,Q.jsxs)(`div`,{className:q(`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,Q.jsx)(xe,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 text-emerald-600`}):(0,Q.jsx)(S,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 text-destructive`}),(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`p`,{children:e.message}),e.user&&e.user.groups.length>0&&(0,Q.jsxs)(`p`,{className:`mt-1 break-all text-muted-foreground`,children:[`Groups: `,e.user.groups.join(` · `)]})]})]}):null}function gN({value:e,onChange:t,disabled:n}){return(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-4`,children:[(0,Q.jsx)(fN,{label:`New accounts are`,children:(0,Q.jsxs)(`select`,{className:dN,value:e.defaultUserType,disabled:n,onChange:e=>t({defaultUserType:e.target.value}),children:[(0,Q.jsx)(`option`,{value:`user`,children:`Users`}),(0,Q.jsx)(`option`,{value:`admin`,children:`Admins`})]})}),(0,Q.jsx)(fN,{label:`Initial status`,children:(0,Q.jsxs)(`select`,{className:dN,value:e.defaultStatus,disabled:n,onChange:e=>t({defaultStatus:e.target.value}),children:[(0,Q.jsx)(`option`,{value:`active`,children:`Active — can sign in right away`}),(0,Q.jsx)(`option`,{value:`pending`,children:`Pending — an admin activates them`}),(0,Q.jsx)(`option`,{value:`inactive`,children:`Inactive`})]})})]}),e.defaultUserType===`admin`&&(0,Q.jsxs)(`p`,{className:`flex items-start gap-1.5 text-[11px] text-destructive`,children:[(0,Q.jsx)(Wt,{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 _N({row:e,index:t,onChange:n,onRemove:r,disabled:i}){let[a,o]=(0,Z.useState)(``),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)(null),d=async()=>{c(!0),u(null);try{u(await tN(e.originalName??e.name,oN(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,Q.jsxs)(`div`,{className:`space-y-3 rounded-md border p-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsxs)(`span`,{className:`shrink-0 text-[11px] text-muted-foreground`,children:[`#`,t+1]}),(0,Q.jsx)(J,{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,Q.jsx)(`div`,{className:`flex-1`}),(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`ghost`,onClick:r,disabled:i,"aria-label":`Remove server`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]}),(0,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsx)(fN,{label:`Server URL`,hint:`ldap:// or ldaps://host:port`,children:(0,Q.jsx)(J,{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,Q.jsx)(fN,{label:`Search base`,children:(0,Q.jsx)(J,{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,Q.jsx)(fN,{label:`Bind DN`,hint:`Service account used to look users up. Empty = anonymous search.`,children:(0,Q.jsx)(J,{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,Q.jsx)(fN,{label:`Bind password`,hint:(0,Q.jsxs)(Q.Fragment,{children:[`Currently: `,f,e.bindPasswordSet&&e.bindPassword!==null&&(0,Q.jsxs)(Q.Fragment,{children:[` · `,(0,Q.jsx)(`button`,{type:`button`,className:`underline hover:text-foreground`,disabled:i,onClick:()=>n({bindPassword:null}),children:`clear`})]})]}),children:(0,Q.jsx)(J,{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,Q.jsx)(fN,{label:`User search filter`,hint:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`span`,{className:`font-mono`,children:`{{email}}`}),` is replaced by the address typed at sign-in.`]}),children:(0,Q.jsx)(J,{className:`h-8 font-mono text-sm`,value:e.searchFilter,disabled:i,onChange:e=>n({searchFilter:e.target.value})})}),(0,Q.jsx)(fN,{label:`Group attribute`,hint:`Group memberships drive team workspace sharing.`,children:(0,Q.jsx)(J,{className:`h-8 font-mono text-sm`,value:e.groupAttribute,disabled:i,onChange:e=>n({groupAttribute:e.target.value}),placeholder:`memberOf`})}),(0,Q.jsx)(fN,{label:`Attributes to read`,hint:`Comma-separated.`,className:`sm:col-span-2`,children:(0,Q.jsx)(J,{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,Q.jsx)(pN,{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,Q.jsxs)(`div`,{className:`flex flex-wrap items-end gap-2 border-t pt-3`,children:[(0,Q.jsx)(fN,{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,Q.jsx)(J,{className:`h-8 text-sm`,type:`email`,value:a,onChange:e=>o(e.target.value),placeholder:`someone@example.com (optional)`})}),(0,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:d,disabled:s||i,className:`mb-5`,children:[s&&(0,Q.jsx)(Xn,{className:`mr-2 h-3.5 w-3.5 animate-spin`}),`Test connection`]})]}),(0,Q.jsx)(hN,{result:l})]})}function vN({row:e,onChange:t,onRemove:n,disabled:r}){let[i,a]=(0,Z.useState)(``),[o,s]=(0,Z.useState)(``),[c,l]=(0,Z.useState)(!1),[u,d]=(0,Z.useState)(null);return(0,Q.jsxs)(`div`,{className:`space-y-3 rounded-md border p-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:`@`}),(0,Q.jsx)(J,{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,Q.jsx)(`div`,{className:`flex-1`}),(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`ghost`,onClick:n,disabled:r,"aria-label":`Remove domain`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]}),(0,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-[1fr_6rem_1fr]`,children:[(0,Q.jsx)(fN,{label:`IMAP host`,children:(0,Q.jsx)(J,{className:`h-8 font-mono text-sm`,value:e.host,disabled:r,onChange:e=>t({host:e.target.value}),placeholder:`imap.example.com`})}),(0,Q.jsx)(fN,{label:`Port`,children:(0,Q.jsx)(J,{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,Q.jsx)(fN,{label:`Label on the sign-in form`,hint:`Optional.`,children:(0,Q.jsx)(J,{className:`h-8 text-sm`,value:e.name,disabled:r,onChange:e=>t({name:e.target.value}),placeholder:`Example Mail`})})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-2`,children:[(0,Q.jsx)(pN,{checked:e.secure,disabled:r,onChange:e=>t({secure:e,...e?{startTLS:!1}:{}}),label:`TLS from the start`,hint:`Usually port 993.`}),(0,Q.jsx)(pN,{checked:e.startTLS,disabled:r||e.secure,onChange:e=>t({startTLS:e}),label:`Require STARTTLS`,hint:`Plain port 143 upgraded to TLS.`}),(0,Q.jsx)(pN,{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,Q.jsxs)(`div`,{className:`flex flex-wrap items-end gap-2 border-t pt-3`,children:[(0,Q.jsx)(fN,{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,Q.jsx)(J,{className:`h-8 text-sm`,type:`email`,value:i,onChange:e=>a(e.target.value),placeholder:`someone@${e.domain||`example.com`}`})}),(0,Q.jsx)(fN,{label:`Password`,className:`mb-5 min-w-[10rem] flex-1`,children:(0,Q.jsx)(J,{className:`h-8 text-sm`,type:`password`,autoComplete:`off`,value:o,onChange:e=>s(e.target.value)})}),(0,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:async()=>{l(!0),d(null);try{let{id:t,domain:n,...r}=e;d(await nN(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,Q.jsx)(Xn,{className:`mr-2 h-3.5 w-3.5 animate-spin`}),`Test`]})]}),(0,Q.jsx)(hN,{result:u})]})}function yN(){let e=TO(),{showToast:t}=Hr(),n=vd()?.userType===`admin`,[r,i]=(0,Z.useState)(``),[a,o]=(0,Z.useState)(null),[s,c]=(0,Z.useState)(null),[l,u]=(0,Z.useState)(!0),[d,f]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)(null),[h,g]=(0,Z.useState)(null),_=(0,Z.useCallback)(()=>$M().then(e=>{let t=aN(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,Z.useEffect)(()=>{n&&_()},[n,_]);let v=(0,Z.useMemo)(()=>!!s&&!!a&&JSON.stringify(sN(s))!==JSON.stringify(sN(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=aN((await eN(sN(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,Q.jsx)(Ww,{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,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>{u(!0),_()},disabled:l||d,children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5`}),`Reload`]})});return n?(0,Q.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6 pb-24`,children:[C,l&&!s?(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Q.jsx)(P,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):p||!s?(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/5 p-4 text-sm`,children:[(0,Q.jsx)(`p`,{className:`font-medium text-destructive`,children:`Authentication settings unavailable`}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:p||`No config returned.`})]}),(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>{u(!0),_()},children:`Retry`})]}):(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`Config file: `,(0,Q.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,Q.jsxs)(mN,{title:`Sign-up & local passwords`,description:`Accounts whose password is stored on this server.`,children:[(0,Q.jsx)(pN,{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,Q.jsx)(pN,{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,Q.jsx)(pN,{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,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`p`,{className:`mb-2 text-xs font-medium`,children:`Password policy`}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-start gap-4`,children:[(0,Q.jsx)(fN,{label:`Min length`,children:(0,Q.jsx)(J,{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,Q.jsx)(fN,{label:`Max length`,children:(0,Q.jsx)(J,{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,Q.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,Q.jsx)(pN,{checked:s.local.passwordPolicy[e],label:t,onChange:t=>y(n=>({...n,local:{...n.local,passwordPolicy:{...n.local.passwordPolicy,[e]:t}}}))},e))})]})]})]}),(0,Q.jsxs)(mN,{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,Q.jsx)(gN,{value:s.ldap,onChange:e=>y(t=>({...t,ldap:{...t.ldap,...e}}))}),s.ldap.servers.map((e,t)=>(0,Q.jsx)(_N,{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,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>y(e=>({...e,ldap:{...e.ldap,servers:[...e.ldap.servers,{...lN,id:iN(),name:e.ldap.servers.length?`server${e.ldap.servers.length+1}`:`primary`}]}})),children:[(0,Q.jsx)(cn,{className:`mr-2 h-3.5 w-3.5`}),` Add LDAP server`]})]}),(0,Q.jsxs)(mN,{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,Q.jsx)(gN,{value:s.imap,onChange:e=>y(t=>({...t,imap:{...t.imap,...e}}))}),s.imap.domains.map(e=>(0,Q.jsx)(vN,{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,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>y(e=>({...e,imap:{...e.imap,domains:[...e.imap.domains,{...uN,id:iN()}]}})),children:[(0,Q.jsx)(cn,{className:`mr-2 h-3.5 w-3.5`}),` Add mail domain`]})]}),(0,Q.jsxs)(mN,{title:`Google sign-in`,description:(0,Q.jsxs)(Q.Fragment,{children:[`One-click sign-in with a Google account via OAuth. Needs a Google Cloud OAuth client of type `,(0,Q.jsx)(`em`,{children:`Web application`}),` whose authorized redirect URI is `,(0,Q.jsx)(`code`,{className:`select-all`,children:`${Rr}/oauth/google/callback`}),`.`]}),enabled:s.google.enabled,onToggle:e=>y(t=>({...t,google:{...t.google,enabled:e}})),children:[(0,Q.jsx)(gN,{value:s.google,onChange:e=>y(t=>({...t,google:{...t.google,...e}}))}),(0,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsx)(fN,{label:`OAuth client id`,children:(0,Q.jsx)(J,{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,Q.jsx)(fN,{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,Q.jsx)(J,{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,Q.jsx)(fN,{label:`Allowed e-mail domains`,hint:`Comma separated. Empty = any Google account may sign in.`,children:(0,Q.jsx)(cN,{value:s.google.allowedDomains,placeholder:`example.com, example.org`,onChange:e=>y(t=>({...t,google:{...t.google,allowedDomains:e}}))})}),(0,Q.jsx)(fN,{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,Q.jsx)(cN,{value:s.google.webOrigins,placeholder:`http://localhost:5173`,onChange:e=>y(t=>({...t,google:{...t.google,webOrigins:e}}))})})]}),(0,Q.jsx)(pN,{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,Q.jsxs)(`div`,{className:`sticky bottom-4 z-10 rounded-lg border bg-card p-3 shadow-elevation-4`,children:[h&&(0,Q.jsx)(`ul`,{className:`mb-2 space-y-0.5 text-xs text-destructive`,children:h.split(`; `).map(e=>(0,Q.jsx)(`li`,{children:e},e))}),(0,Q.jsxs)(`div`,{className:`flex items-center justify-end gap-2`,children:[(0,Q.jsx)(`span`,{className:`mr-auto text-xs text-muted-foreground`,children:v?`Unsaved changes`:``}),(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`ghost`,disabled:d,onClick:()=>{c(a),g(null)},children:`Discard`}),(0,Q.jsxs)(X,{type:`button`,size:`sm`,disabled:d||!v,onClick:()=>void S(),children:[d&&(0,Q.jsx)(Xn,{className:`mr-2 h-3.5 w-3.5 animate-spin`}),`Save`]})]})]})]})]}):(0,Q.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6`,children:[C,(0,Q.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border p-3 text-xs`,children:[(0,Q.jsx)(Wt,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`p`,{className:`text-muted-foreground`,children:`Authentication settings are only available to server admins.`})]})]})}function bN({agent:e,onStart:t,onStop:n,onEnter:r}){let[i,a]=(0,Z.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,Q.jsx)(Et,{className:`h-4 w-4 text-success`});case`inactive`:return(0,Q.jsx)(Et,{className:`h-4 w-4 text-warning`});case`error`:return(0,Q.jsx)(Et,{className:`h-4 w-4 text-destructive`});default:return(0,Q.jsx)(Et,{className:`h-4 w-4 text-muted-foreground`})}},l=()=>{switch(e.llmProvider){case`anthropic`:return(0,Q.jsx)(lt,{className:`h-4 w-4 text-warning`});case`openai`:return(0,Q.jsx)(lt,{className:`h-4 w-4 text-success`});case`ollama`:return(0,Q.jsx)(H,{className:`h-4 w-4 text-info`});default:return(0,Q.jsx)(lt,{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,Q.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-4 hover:shadow-elevation-2 transition-shadow bg-card`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start justify-between`,children:[(0,Q.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[l(),(0,Q.jsx)(`h3`,{className:`text-lg font-semibold truncate`,children:e.label||e.name}),e.color&&(0,Q.jsx)(`div`,{className:`w-4 h-4 rounded border flex-shrink-0`,style:{backgroundColor:e.color},title:`Color: ${e.color}`})]}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground font-mono`,children:e.name}),e.description&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1 line-clamp-2`,children:e.description})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 flex-shrink-0`,children:[c(),(0,Q.jsx)(`span`,{className:`px-2 py-1 rounded-full text-xs font-medium border ${u()}`,children:e.status})]})]}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 text-sm`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`Provider:`}),(0,Q.jsx)(`div`,{className:`font-medium capitalize`,children:e.llmProvider})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`Model:`}),(0,Q.jsx)(`div`,{className:`font-mono text-xs`,children:e.model})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`Created:`}),(0,Q.jsx)(`div`,{children:new Date(e.createdAt).toLocaleDateString()})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`Last Access:`}),(0,Q.jsx)(`div`,{children:e.lastAccessed?new Date(e.lastAccessed).toLocaleDateString():`Never`})]})]}),e.config.mcp?.servers&&e.config.mcp.servers.length>0&&(0,Q.jsxs)(`div`,{className:`text-sm`,children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`MCP Servers:`}),(0,Q.jsx)(`div`,{className:`flex flex-wrap gap-1 mt-1`,children:e.config.mcp.servers.map((e,t)=>(0,Q.jsx)(`span`,{className:`px-2 py-1 bg-secondary text-secondary-foreground rounded text-xs`,children:e.name},t))})]}),(0,Q.jsxs)(`div`,{className:`flex gap-2 pt-2 border-t`,children:[d&&(0,Q.jsxs)(X,{onClick:o,disabled:i,size:`sm`,variant:`outline`,className:`flex-1`,children:[(0,Q.jsx)(Se,{className:`mr-2 h-4 w-4`}),`Start`]}),f&&(0,Q.jsxs)(X,{onClick:s,disabled:i,size:`sm`,variant:`outline`,className:`flex-1`,children:[(0,Q.jsx)(Bn,{className:`mr-2 h-4 w-4`}),`Stop`]}),(0,Q.jsxs)(X,{onClick:()=>r(e.name),size:`sm`,className:`flex-1`,children:[(0,Q.jsx)(Lt,{className:`mr-2 h-4 w-4`}),`Chat`]})]})]})}function xN(){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,Z.useState)([]),[i,a]=(0,Z.useState)(!0),[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)(``),[u,d]=(0,Z.useState)(``),[f,p]=(0,Z.useState)(bm()),[m,h]=(0,Z.useState)(``),[g,_]=(0,Z.useState)(`anthropic`),[v,y]=(0,Z.useState)(t.anthropic),[b,x]=(0,Z.useState)({apiKey:``,baseUrl:e.anthropic,maxTokens:4096,temperature:.7,topP:1,frequencyPenalty:0,presencePenalty:0,numCtx:4096}),[S,C]=(0,Z.useState)(``),[w,T]=(0,Z.useState)(!1),E=Hw(),[D,O]=Qw(),{showToast:k}=Hr(),A=hl(),j=PT();Yw(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,Z.useEffect)(()=>((async()=>{try{a(!0);let e=await rk();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 mk({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(bm()),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 _k(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 vk(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,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{title:`AI Agents`,description:`Create and manage your AI agents with multiple LLM providers`,actions:!E.local&&!D&&(0,Q.jsxs)(X,{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,Q.jsx)(cn,{className:`h-4 w-4 sm:mr-2`}),(0,Q.jsx)(`span`,{className:`max-sm:hidden`,children:`Create Agent`})]})}),!E.local&&D&&(0,Q.jsx)(Xw,{title:`Create New Agent`,onClose:()=>O(!1),children:(0,Q.jsxs)(`form`,{onSubmit:N,className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsx)(J,{value:c,onChange:e=>l(e.target.value),placeholder:`Agent Name (e.g., 'my-assistant')`,disabled:w}),(0,Q.jsx)(J,{value:m,onChange:e=>h(e.target.value),placeholder:`Agent Label (display name, optional)`,disabled:w})]}),(0,Q.jsx)(J,{value:u,onChange:e=>d(e.target.value),placeholder:`Description (optional)`,disabled:w}),(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`agent-provider`,className:`text-sm font-medium`,children:`LLM Provider`}),(0,Q.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,Q.jsx)(`option`,{value:`anthropic`,children:`Anthropic Claude`}),(0,Q.jsx)(`option`,{value:`openai`,children:`OpenAI GPT`}),(0,Q.jsx)(`option`,{value:`ollama`,children:`Ollama (Local)`})]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`agent-model`,className:`text-sm font-medium`,children:`Model`}),(0,Q.jsx)(J,{id:`agent-model`,value:v,onChange:e=>y(e.target.value),placeholder:`Model name (e.g., 'gpt-4o')`,disabled:w})]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`system-prompt`,className:`text-sm font-medium`,children:`System Prompt (Optional)`}),(0,Q.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,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`api-key`,className:`text-sm font-medium`,children:`API Key (Optional)`}),(0,Q.jsx)(J,{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,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`baseUrl`,className:`text-sm font-medium`,children:`Base URL (Optional)`}),(0,Q.jsx)(J,{id:`baseUrl`,value:b.baseUrl,onChange:e=>x(t=>({...t,baseUrl:e.target.value})),placeholder:e[g],disabled:w})]})]}),(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsx)(`h3`,{className:`text-lg font-medium`,children:`LLM Parameters`}),(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2 lg:grid-cols-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`max-tokens`,className:`text-sm font-medium`,children:`Max Tokens`}),(0,Q.jsx)(J,{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,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`temperature`,className:`text-sm font-medium`,children:`Temperature`}),(0,Q.jsx)(J,{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,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`top-p`,className:`text-sm font-medium`,children:`Top P`}),(0,Q.jsx)(J,{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,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`num-ctx`,className:`text-sm font-medium`,children:`Context Length`}),(0,Q.jsx)(J,{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,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`frequency-penalty`,className:`text-sm font-medium`,children:`Frequency Penalty`}),(0,Q.jsx)(J,{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,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`presence-penalty`,className:`text-sm font-medium`,children:`Presence Penalty`}),(0,Q.jsx)(J,{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,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`label`,{htmlFor:`agent-color`,className:`text-sm font-medium`,children:`Agent Color`}),(0,Q.jsx)(J,{id:`agent-color`,type:`color`,value:f,onChange:e=>p(e.target.value),className:`h-10 w-16 p-1`,disabled:w}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>p(bm()),disabled:w,children:`Randomize`})]}),(0,Q.jsxs)(X,{type:`submit`,disabled:w||!c.trim(),children:[(0,Q.jsx)(cn,{className:`mr-2 h-4 w-4`}),`Create Agent`]})]})}),(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsx)(`h2`,{className:`text-xl font-semibold`,children:`Your Agents`}),i&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading agents...`}),o&&(0,Q.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Q.jsx)(`p`,{children:o})}),!i&&!o&&n.length===0&&(0,Q.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No agents found`}),n.length>0&&(0,Q.jsx)(`div`,{className:`grid gap-4`,children:n.map(e=>(0,Q.jsx)(bN,{agent:e,onStart:P,onStop:ee,onEnter:F},e.id))})]})]})}function SN(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 CN(e){let t=e?.usage?.cost?.total;return typeof t==`number`?`$${t.toFixed(t<.01?6:4)}`:null}function wN({reasoning:e,metadata:t,isStreaming:n=!1,compact:r=!1}){let i=t?.model,a=[t?.provider,i,SN(t),CN(t)].filter(Boolean);return!e&&a.length===0?null:(0,Q.jsxs)(Q.Fragment,{children:[e&&(0,Q.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,Q.jsx)(`summary`,{className:`cursor-pointer font-medium text-foreground ${r?`text-[11px]`:`text-xs`}`,children:`Reasoning`}),(0,Q.jsx)(g_,{content:e,className:`mt-1 text-foreground ${r?`text-[11px]`:`text-xs`}`})]}),a.length>0&&(0,Q.jsx)(`div`,{className:`mt-2 text-muted-foreground ${r?`text-[11px]`:`text-xs`}`,children:a.join(` • `)})]})}function TN({message:e,isStreaming:t=!1,connectionStatus:n=`disconnected`}){let[r,i]=(0,Z.useState)(``),[a,o]=(0,Z.useState)(!0);(0,Z.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,Z.useEffect)(()=>{if(!t||e.isComplete)return;let n=setInterval(()=>{o(e=>!e)},500);return()=>{clearInterval(n),o(!0)}},[t,e.isComplete]),(0,Q.jsx)(`div`,{className:`flex ${e.role===`user`?`justify-end`:`justify-start`}`,children:(0,Q.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,Q.jsx)(wN,{reasoning:e.role===`assistant`?e.metadata?.reasoning?.trim():void 0,metadata:e.role===`assistant`?e.metadata:void 0,isStreaming:t&&!e.isComplete}),(0,Q.jsxs)(`div`,{className:`text-sm`,children:[e.role===`assistant`?(0,Q.jsx)(g_,{content:s}):(0,Q.jsx)(`span`,{className:`whitespace-pre-wrap break-words`,children:s}),t&&!e.isComplete&&(0,Q.jsx)(`span`,{className:`inline-block w-2 ${a?`bg-current`:`bg-transparent`}`,children:`|`})]}),(0,Q.jsxs)(`div`,{className:`flex items-center justify-between text-xs mt-2 opacity-70`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`span`,{children:new Date(e.timestamp).toLocaleTimeString()}),t&&!e.isComplete&&(0,Q.jsx)(`span`,{className:`text-info`,children:`• streaming...`})]}),e.role===`assistant`&&(()=>{switch(n){case`websocket`:return(0,Q.jsx)(`span`,{title:`WebSocket`,children:(0,Q.jsx)(mr,{className:`h-3 w-3 text-success`})});case`sse`:return(0,Q.jsx)(`span`,{title:`Server-Sent Events`,children:(0,Q.jsx)(Te,{className:`h-3 w-3 text-info`})});case`rest`:return(0,Q.jsx)(`span`,{title:`REST API`,children:(0,Q.jsx)(Et,{className:`h-3 w-3 text-warning`})});default:return(0,Q.jsx)(`span`,{title:`Disconnected`,children:(0,Q.jsx)(w,{className:`h-3 w-3 text-destructive`})})}})()]})]})})}var EN=(0,Z.createContext)(null);function DN(e){let t=(0,Z.useContext)(EN);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,Z.useCallback)(()=>r(e),[r,e]),u=(0,Z.useCallback)(t=>i(e,t),[i,e]),d=(0,Z.useCallback)(t=>a(e,t),[a,e]),f=(0,Z.useCallback)((t,n)=>o(e,t,n),[o,e]),p=(0,Z.useCallback)(t=>s(e,t),[s,e]);return(0,Z.useMemo)(()=>({...c,refresh:l,create:u,select:d,rename:f,remove:p}),[c,l,u,d,f,p])}function ON(e={}){let[t,n]=(0,Z.useState)(null),[r,i]=(0,Z.useState)(!1),[a,o]=(0,Z.useState)(!1),s=(0,Z.useRef)(e),c=(0,Z.useRef)(null),l=(0,Z.useRef)(!1);(0,Z.useEffect)(()=>{s.current=e},[e]);let u=(0,Z.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=Br(Sr.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,Z.useCallback)(()=>{let e=c.current;e&&(e.removeAllListeners(),e.close()),c.current=null,l.current=!1,n(null),i(!1),o(!1)},[]),f=(0,Z.useCallback)(e=>{t&&r&&(console.log(`Subscribing to agent channel: ${e}`),t.emit(`agent:subscribe`,{agentId:e}))},[t,r]),p=(0,Z.useCallback)(e=>{t&&r&&(console.log(`Unsubscribing from agent channel: ${e}`),t.emit(`agent:unsubscribe`,{agentId:e}))},[t,r]),m=(0,Z.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,Z.useEffect)(()=>{if(e.agentId)return u(),()=>{d()}},[e.agentId,u,d]),(0,Z.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 kN(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(`
35
- `)||``}function AN(e,t){return`${e||``}${t||``}`.trim()||void 0}function jN(e,t){if(!e&&!t)return;let{reasoningDelta:n,...r}=e||{};return{...r,...t?{reasoning:t}:{}}}function MN(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,Z.useState)(Sk(n)),[f,p]=(0,Z.useState)(!1),[m,h]=(0,Z.useState)(null),[g,_]=(0,Z.useState)(`disconnected`),[v,y]=(0,Z.useState)(null),b=(0,Z.useRef)(n);(0,Z.useEffect)(()=>{b.current=n});let x=`${t}${String(i)}${r??``}`,[S,C]=(0,Z.useState)(x);S!==x&&(C(x),(!t||!i)&&d(Sk(n))),(0,Z.useEffect)(()=>{let e=!1;if(!(!t||!i))return ak(t).then(t=>{e||d(Sk(t.messages))}).catch(()=>{e||d(Sk(b.current))}),()=>{e=!0}},[t,i,r]);let w=(0,Z.useRef)(null),T=(0,Z.useRef)(null),{isConnected:E,startStreamingChat:D}=ON({agentId:o?t:void 0,onMessage:j,onComplete:M,onError:N}),O=o&&E,[k,A]=(0,Z.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=AN(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=kN(e),r=qO(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,Z.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 bk(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||AN(e?.metadata?.reasoning,i);return{role:`assistant`,content:r,timestamp:e?.timestamp||new Date().toISOString(),isComplete:t,metadata:jN({...e?.metadata||{},...n},a)}}),t){let e=n?.reasoning;d(t=>[...t,{role:`assistant`,content:r,timestamp:new Date().toISOString(),isComplete:!0,metadata:jN(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 xk(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,Z.useCallback)(()=>{d([]),h(null),y(null)},[]),F=(0,Z.useCallback)(()=>{w.current&&=(w.current.abort(),null),T.current=null,p(!1),h(null)},[]);return(0,Z.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 NN(e){let{sessions:t,create:n}=DN(e),r=(t?.sessions.length??0)>0;return{hasSession:r,ensureSession:async()=>r?null:n({mode:`persistent`})}}async function PN(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 FN(e){return String(e||``).trim().toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)}function IN({agentId:e,routeAgentId:t,initialMessages:n,llmProvider:r,sessionKey:i}){let{showToast:a}=Hr(),{hasSession:o,ensureSession:s}=NN(e),c=hl(),l=(0,Z.useRef)(null),u=(0,Z.useRef)(null),[d,f]=(0,Z.useState)(``),[p,m]=(0,Z.useState)([]),{allMessages:h,isStreaming:g,currentStreamingMessage:_,connectionStatus:v,error:y,sendMessage:b,clearMessages:x,stopStreaming:S}=MN({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,Z.useEffect)(()=>{l.current?.scrollIntoView({behavior:`smooth`})},[h,_]),(0,Z.useEffect)(()=>{g||u.current?.focus()},[g,i]),(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col rounded-lg border`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between border-b px-4 py-3`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Chat`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Current session conversation`})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground`,children:[(0,Q.jsx)(`span`,{children:v}),h.length>0&&(0,Q.jsx)(`button`,{type:`button`,onClick:x,disabled:g,className:`text-destructive hover:underline disabled:opacity-50`,children:`Clear visible chat`})]})]}),(0,Q.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-4 space-y-4`,children:[h.length===0?(0,Q.jsx)(`div`,{className:`flex h-full items-center justify-center text-center text-muted-foreground`,children:(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Lt,{className:`mx-auto mb-4 h-10 w-10 opacity-40`}),(0,Q.jsx)(`p`,{className:`text-sm`,children:o?`No messages yet.`:`No session yet.`}),(0,Q.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,Q.jsx)(TN,{message:e,isStreaming:g&&e===_,connectionStatus:v},`${e.timestamp}-${t}`)),y&&(0,Q.jsx)(`div`,{className:`rounded-lg bg-destructive/10 p-3 text-sm text-destructive`,children:y}),(0,Q.jsx)(`div`,{ref:l})]}),(0,Q.jsxs)(`div`,{className:`border-t p-4`,children:[p.length>0&&(0,Q.jsx)(`div`,{className:`mb-3 flex flex-wrap gap-2`,children:p.map(e=>(0,Q.jsxs)(`div`,{className:`group relative overflow-hidden rounded-md border bg-muted/20`,children:[(0,Q.jsx)(`img`,{src:`data:${e.mimeType};base64,${e.data}`,alt:e.name||`Pasted image`,className:`h-16 w-16 object-cover`}),(0,Q.jsx)(`div`,{className:`max-w-16 truncate px-2 py-1 text-[10px] text-muted-foreground`,children:e.name||e.mimeType}),(0,Q.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,Q.jsx)(W,{className:`h-3 w-3`})})]},e.id))}),(0,Q.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,Q.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(PN));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,Q.jsx)(X,{type:`button`,variant:`outline`,onClick:S,children:`Stop`}):(0,Q.jsx)(X,{type:`submit`,disabled:!d.trim()&&p.length===0,children:`Send`})]}),(0,Q.jsxs)(`div`,{className:`mt-2 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,Q.jsx)(ln,{className:`h-3.5 w-3.5`}),`Paste image files from clipboard directly into the input.`]})]})]})}function LN(){let{agentId:e,sessionId:t}=yl(),n=fl(),r=hl(),{showToast:i}=Hr(),{selectEntity:a,goBack:o}=jT(),[s,c]=(0,Z.useState)(null),[l,u]=(0,Z.useState)(!0),[d,f]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)(!1),[h,g]=(0,Z.useState)(null),[_,v]=(0,Z.useState)(!1),y=(0,Z.useRef)(null),{current:b,sessions:x,refresh:S,select:C}=DN(e||``),w=(0,Z.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,Z.useEffect)(()=>{e&&(async()=>{u(!0);try{let i=await ik(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,Z.useEffect)(()=>{if(!e||!t||!x)return;let n=decodeURIComponent(t),r=FN(n),a=x.sessions.find(e=>e.id===n||e.slug===n||FN(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,Z.useEffect)(()=>{if(!e)return;let t=async()=>{try{let t=await yk(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,Q.jsx)(`div`,{className:`flex h-full items-center justify-center`,children:(0,Q.jsxs)(`div`,{className:`text-center text-muted-foreground`,children:[(0,Q.jsx)(Me,{className:`mx-auto mb-3 h-8 w-8 animate-pulse`}),(0,Q.jsx)(`p`,{children:`Loading agent...`})]})}):!s||h?(0,Q.jsx)(`div`,{className:`flex h-full items-center justify-center`,children:(0,Q.jsxs)(`div`,{className:`text-center text-destructive`,children:[(0,Q.jsx)(Me,{className:`mx-auto mb-3 h-8 w-8`}),(0,Q.jsx)(`p`,{children:h||`Agent not found`})]})}):(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-4 p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Q.jsx)(Kw,{title:`Back to previous view`,onBack:o}),(0,Q.jsx)(`span`,{className:`h-3 w-3 shrink-0 rounded-full`,style:{backgroundColor:s.color||`#9ca3af`}}),(0,Q.jsx)(`h1`,{className:`truncate text-xl font-semibold`,children:s.label||s.name}),(0,Q.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground`,children:s.status})]}),(0,Q.jsx)(`p`,{className:`mt-1 truncate text-sm text-muted-foreground`,children:s.description||`${s.llmProvider} / ${s.model}`})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[s.isActive?(0,Q.jsxs)(X,{variant:`outline`,onClick:async()=>{if(e){m(!0);try{let t=await vk(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,Q.jsx)(Bn,{className:`mr-2 h-4 w-4`}),p?`Stopping...`:`Stop`]}):(0,Q.jsxs)(X,{onClick:async()=>{if(e){f(!0);try{let t=await _k(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,Q.jsx)(Se,{className:`mr-2 h-4 w-4`}),d?`Starting...`:`Start`]}),(0,Q.jsxs)(X,{variant:`outline`,onClick:()=>{a(s.id),r(`/agents/${encodeURIComponent(s.name||s.id)}/settings/identity`)},children:[(0,Q.jsx)(bn,{className:`mr-2 h-4 w-4`}),`Settings`]}),(0,Q.jsx)(Gw,{className:`h-9 w-9`})]})]}),(0,Q.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,Q.jsx)(IN,{agentId:s.id,routeAgentId:s.name||s.id,initialMessages:b?.messages||[],llmProvider:s.llmProvider,sessionKey:T},T),(0,Q.jsxs)(`div`,{className:`flex min-h-0 flex-col rounded-lg border`,children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>v(e=>!e),"aria-expanded":_,className:q(`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,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Contextual Information`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Current session and runtime state.`})]}),(0,Q.jsx)(Ze,{className:q(`h-4 w-4 shrink-0 text-muted-foreground transition-transform xl:hidden`,_&&`rotate-180`)})]}),(0,Q.jsxs)(`div`,{className:q(`space-y-4 overflow-y-auto p-4 text-sm max-xl:max-h-viewport-half`,!_&&`max-xl:hidden`),children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Mode`}),(0,Q.jsx)(`div`,{className:`mt-1`,children:b?.mode||x?.mode||`persistent`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Selected Session`}),(0,Q.jsx)(`div`,{className:`mt-1 break-all`,children:w?.name||(w?.isExperimental?`Experimental`:null)||b?.sessionId||`Default session`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Known Sessions`}),(0,Q.jsx)(`div`,{className:`mt-1`,children:x?.sessions.length||0})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Thinking Level`}),(0,Q.jsx)(`div`,{className:`mt-1`,children:b?.thinkingLevel||`high`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Model`}),(0,Q.jsx)(`div`,{className:`mt-1`,children:b?.model?.modelId||s.model||`Not set`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Session File`}),(0,Q.jsx)(`div`,{className:`mt-1 break-all text-xs text-muted-foreground`,children:b?.sessionFile||`In-memory / not persisted yet`})]}),(0,Q.jsxs)(`div`,{className:`rounded-lg border bg-muted/20 p-4 text-sm text-muted-foreground`,children:[(0,Q.jsxs)(`div`,{className:`mb-2 flex items-center gap-2 font-medium text-foreground`,children:[(0,Q.jsx)(Et,{className:`h-4 w-4`}),`Shape`]}),(0,Q.jsx)(`p`,{children:`Session selection lives in M2. Main content stays focused on the active conversation and its context.`})]})]})]})]})]})}var RN={anthropic:`claude-3-5-sonnet-20241022`,openai:`gpt-4o`,ollama:`qwen2.5-coder:latest`,"lm-studio":``,vllm:``,custom:``},zN={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 BN(e){return zN[e]||``}function VN(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(`
36
-
37
- `)}function HN({label:e,hint:t,children:n}){return(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`text-sm font-medium`,children:e}),t&&(0,Q.jsx)(`p`,{className:`mb-1 mt-0.5 text-xs text-muted-foreground`,children:t}),(0,Q.jsx)(`div`,{className:t?void 0:`mt-1`,children:n})]})}var UN=`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`,WN=`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 GN(){let{agentId:e,tab:t}=yl(),n=hl(),{showToast:r}=Hr(),{selectEntity:i,goBack:a}=jT(),o=$g(),s=VO(t);(0,Z.useEffect)(()=>{t!==s&&e&&n(`/agents/${encodeURIComponent(e)}/settings/${s}`,{replace:!0})},[t,s,e,n]);let[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.useState)(!0),[f,p]=(0,Z.useState)(null),[m,h]=(0,Z.useState)(!1),[g,_]=(0,Z.useState)(!1),[v,y]=(0,Z.useState)(``),[b,x]=(0,Z.useState)(``),[S,C]=(0,Z.useState)(``),[w,T]=(0,Z.useState)(bm()),[E,D]=(0,Z.useState)(``),[O,k]=(0,Z.useState)(``),[A,j]=(0,Z.useState)(``),[M,N]=(0,Z.useState)(``),[P,ee]=(0,Z.useState)(`anthropic`),[F,I]=(0,Z.useState)(``),[L,R]=(0,Z.useState)(``),[te,z]=(0,Z.useState)(``),[ne,B]=(0,Z.useState)(.7),[re,V]=(0,Z.useState)(4096),[ie,ae]=(0,Z.useState)(1),[oe,H]=(0,Z.useState)([]),[se,ce]=(0,Z.useState)(``),[U,le]=(0,Z.useState)(``),[ue,de]=(0,Z.useState)(``),[fe,pe]=(0,Z.useState)(``),[me,he]=(0,Z.useState)(!1),[W,ge]=(0,Z.useState)(null),[_e,ve]=(0,Z.useState)(null),[ye,G]=(0,Z.useState)(null),[K,be]=(0,Z.useState)(!1),[xe,Se]=(0,Z.useState)(null),[Ce,we]=(0,Z.useState)(`context`),[Te,Ee]=(0,Z.useState)(``),[De,Oe]=(0,Z.useState)(`/`),[ke,Ae]=(0,Z.useState)(``),[je,Me]=(0,Z.useState)(!0),[Ne,Pe]=(0,Z.useState)(!1),[Fe,Ie]=(0,Z.useState)([]),[Le,Re]=(0,Z.useState)([]),[ze,Be]=(0,Z.useState)(null),[Ve,He]=(0,Z.useState)(`{}`),[Ue,We]=(0,Z.useState)(null),[Ge,Ke]=(0,Z.useState)(e);Ge!==e&&(Ke(e),d(!0),l(null)),(0,Z.useEffect)(()=>{if(!e)return;let t=!1;return ik(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||bm()),D(n.role||``),k(n.identity||``),j(n.instructions||``),N(e.config?.prompts?.system||``),ee(e.llmProvider||`anthropic`),I(e.config?.apiKey||``),R(e.config?.baseUrl||BN(e.llmProvider)),z(e.model||RN[e.llmProvider]||``);let r=e.config?.connectors?.[e.llmProvider];r&&(B(r.temperature??.7),V(r.maxTokens??4096),ae(r.topP??1)),He(JSON.stringify(e.config?.tools??{},null,2)),We(null),p(null);try{H(await dk(e.id))}catch{H([])}}).catch(e=>{t||p(e instanceof Error?e.message:`Failed to load agent`)}).finally(()=>{t||d(!1)}),()=>{t=!0}},[e,i]),(0,Z.useEffect)(()=>{if(s!==`access`&&s!==`tools`||!c?.id)return;let e=c.id,t=!1;return Promise.all([QO(c.id).catch(()=>null),ji().catch(()=>[]),fs().catch(()=>[]),nk(c.id).catch(()=>null)]).then(([n,r,i,a])=>{t||(ve(n),Ie(r),Re(i),Be(a?a.tools:[]),n&&(we(n.binding.type),Ee(n.binding.workspace||``),Oe(n.binding.path||`/`),Ae(n.binding.context||``),Me(n.permissions.includes(`read`)),Pe(n.permissions.includes(`write`))),G(e))}),()=>{t=!0}},[s,c?.id]);let qe=()=>{let e=VN(E,O,A),t;try{let e=JSON.parse(Ve);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:te,apiKey:F||void 0,baseUrl:L||void 0,config:{type:P,model:te,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:ne,maxTokens:re,topP:ie}}}}},Je=async e=>{if(e.preventDefault(),c){h(!0);try{let e=await hk(c.id,qe());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)}}},Ye=async()=>{if(c&&window.confirm(`Delete agent "${c.label||c.name}"? This cannot be undone.`)){_(!0);try{await gk(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)}}},Xe=()=>{ce(``),le(``),de(``),pe(``)},Ze=async()=>{if(!(!c||!fe.trim()&&!ue.trim())){he(!0);try{let e=await fk(c.id,fe.trim()?{source:fe.trim()}:{name:se,description:U,content:ue});H(e),Xe(),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{he(!1)}}},Qe=async e=>{if(c){ge(e);try{let t=await pk(c.id,e);H(t),(se===e||fe===e)&&Xe(),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{ge(null)}}},$e=()=>Ce===`global`?{type:`global`}:Ce===`context`?ke?{type:`context`,context:ke}:null:Te?Ce===`path`?{type:`path`,workspace:Te,path:De.trim()||`/`}:{type:`workspace`,workspace:Te}:null,et=async()=>{if(!c||K)return;let e=$e(),t=[];if(je&&t.push(`read`),Ne&&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 ${Ne?`read and write`:`read`} ALL your workspaces. Continue?`))){be(!0);try{let n=await $O(c.id,{binding:e,permissions:t});ve(n.access),Se(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{be(!1)}}},tt=async()=>{if(!(!c||K)){be(!0);try{let e=await ek(c.id);ve(e.access),Se(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{be(!1)}}},nt=async()=>{if(!(!c||K)&&window.confirm(`Revoke this agent's canvas access? Its token stops working immediately.`)){be(!0);try{await tk(c.id),ve(null),Se(null),r({title:`Revoked`,description:`Agent access removed`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Revoke failed`,variant:`destructive`})}finally{be(!1)}}},it=e=>{if(e.type===`global`)return`Global — all workspaces`;if(e.type===`context`){let t=Le.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,Q.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Loading...`});if(!c||f)return(0,Q.jsx)(`div`,{className:`p-6 text-sm text-destructive`,children:f||`Agent not found`});let at=BO.find(e=>e.id===s),ot=encodeURIComponent(c.name||c.id),st=s===`identity`||s===`provider`||s===`models`||s===`tools`;return(0,Q.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,Q.jsxs)(`div`,{className:`mx-auto max-w-5xl p-6 pb-12 max-md:px-4 max-md:pb-rail-stack`,children:[(0,Q.jsx)(Ww,{compact:!0,className:`mb-6 border-b pb-4`,title:`${at.label} - ${c.label||c.name}`,description:at.description,backTo:`/agents/${ot}`,onBack:o?a:void 0}),(0,Q.jsxs)(`form`,{onSubmit:Je,className:`space-y-6`,children:[s===`identity`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsx)(HN,{label:`Name`,hint:`ID: ${c.id}`,children:(0,Q.jsx)(J,{value:v,onChange:e=>y(e.target.value),placeholder:`lucy`})}),(0,Q.jsx)(HN,{label:`Label`,children:(0,Q.jsx)(J,{value:b,onChange:e=>x(e.target.value),placeholder:`Display name`})})]}),(0,Q.jsx)(HN,{label:`Description`,children:(0,Q.jsx)(J,{value:S,onChange:e=>C(e.target.value),placeholder:`Short description`})}),(0,Q.jsx)(HN,{label:`Color`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(J,{type:`color`,value:w,onChange:e=>T(e.target.value),className:`h-10 w-16 p-1`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>T(bm()),children:`Randomize`})]})})]}),(0,Q.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Persona`}),(0,Q.jsx)(HN,{label:`Role`,children:(0,Q.jsx)(J,{value:E,onChange:e=>D(e.target.value),placeholder:`e.g. Software Engineer`})}),(0,Q.jsx)(HN,{label:`Identity`,children:(0,Q.jsx)(`textarea`,{value:O,onChange:e=>k(e.target.value),placeholder:`Who this agent is…`,className:`${UN} min-h-[80px]`})}),(0,Q.jsx)(HN,{label:`Instructions`,children:(0,Q.jsx)(`textarea`,{value:A,onChange:e=>j(e.target.value),placeholder:`Behavioral instructions…`,className:`${UN} min-h-[80px]`})}),(0,Q.jsx)(HN,{label:`System Prompt`,hint:`Compiled from Role + Identity + Instructions. Override manually.`,children:(0,Q.jsx)(`textarea`,{value:M,onChange:e=>N(e.target.value),placeholder:`System prompt sent to the LLM…`,className:`${UN} min-h-[140px] font-mono text-xs`})})]}),(0,Q.jsxs)(`section`,{className:`rounded-lg border border-destructive/30 p-4`,children:[(0,Q.jsx)(`h2`,{className:`mb-3 text-sm font-semibold text-destructive`,children:`Danger Zone`}),(0,Q.jsxs)(X,{type:`button`,variant:`destructive`,disabled:g,onClick:Ye,children:[(0,Q.jsx)(rt,{className:`mr-2 h-4 w-4`}),g?`Deleting...`:`Delete Agent`]})]})]}),s===`provider`&&(0,Q.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Q.jsx)(HN,{label:`Provider`,children:(0,Q.jsxs)(`select`,{value:P,onChange:e=>{let t=e.target.value;ee(t),z(RN[t]||``),R(BN(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,Q.jsx)(`option`,{value:`anthropic`,children:`Anthropic Claude`}),(0,Q.jsx)(`option`,{value:`openai`,children:`OpenAI GPT`}),(0,Q.jsx)(`option`,{value:`ollama`,children:`Ollama (Local)`}),(0,Q.jsx)(`option`,{value:`lm-studio`,children:`LM Studio (Local)`}),(0,Q.jsx)(`option`,{value:`vllm`,children:`vLLM (Local)`}),(0,Q.jsx)(`option`,{value:`custom`,children:`Custom`})]})}),(0,Q.jsx)(HN,{label:`API Key`,hint:[`ollama`,`lm-studio`,`vllm`].includes(P)?`Any value works for local providers.`:void 0,children:(0,Q.jsx)(J,{type:`password`,value:F,onChange:e=>I(e.target.value),placeholder:P===`ollama`?`ollama`:P===`lm-studio`?`lm-studio`:`sk-…`})}),(0,Q.jsx)(HN,{label:`Host / Base URL`,children:(0,Q.jsx)(J,{value:L,onChange:e=>R(e.target.value),placeholder:BN(P)||`https://api.example.com`})})]}),s===`models`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Main Model`}),(0,Q.jsx)(HN,{label:`Model`,children:(0,Q.jsx)(J,{value:te,onChange:e=>z(e.target.value),placeholder:`Model name`})}),(0,Q.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-3`,children:[(0,Q.jsx)(HN,{label:`Temperature`,children:(0,Q.jsx)(J,{type:`number`,min:0,max:2,step:.1,value:ne,onChange:e=>B(parseFloat(e.target.value)||.7)})}),(0,Q.jsx)(HN,{label:`Max Tokens`,children:(0,Q.jsx)(J,{type:`number`,min:1,max:2e5,value:re,onChange:e=>V(parseInt(e.target.value)||4096)})}),(0,Q.jsx)(HN,{label:`Top P`,children:(0,Q.jsx)(J,{type:`number`,min:0,max:1,step:.1,value:ie,onChange:e=>ae(parseFloat(e.target.value)||1)})})]})]}),[`Governance`,`Memory Management`,`Subagent / Tool Use`].map(e=>(0,Q.jsxs)(`section`,{className:`rounded-lg border border-dashed p-4`,children:[(0,Q.jsxs)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:[e,` Model`]}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Coming soon`})]},e))]}),s===`tools`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Runtime Tools`}),(0,Q.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.`})]}),ze===null?(0,Q.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Loading…`}):ze.length===0?(0,Q.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No tools resolved.`}):(0,Q.jsx)(`div`,{className:`space-y-1.5`,children:ze.map(e=>(0,Q.jsxs)(`details`,{className:`rounded-md border px-3 py-2`,children:[(0,Q.jsxs)(`summary`,{className:`cursor-pointer text-sm`,children:[(0,Q.jsx)(`code`,{className:`font-mono text-xs font-medium`,children:e.name}),(0,Q.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,Q.jsx)(`p`,{className:`mt-2 whitespace-pre-wrap text-xs text-muted-foreground`,children:e.description}),e.parameters!=null&&(0,Q.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,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:_e?it(_e.binding):`Unbound — no canvas tools are injected. Bind under Access / ACL.`})]}),(0,Q.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Tools Config`}),(0,Q.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,Q.jsx)(`textarea`,{value:Ve,onChange:e=>{He(e.target.value);try{JSON.parse(e.target.value),We(null)}catch(e){We(e instanceof Error?e.message:`Invalid JSON`)}},className:`${UN} min-h-[120px] font-mono text-xs`}),Ue&&(0,Q.jsxs)(`p`,{className:`text-xs text-destructive`,children:[`Invalid JSON (not saved): `,Ue]})]}),(0,Q.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Skills`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Installed skills are saved immediately, independent of Save Changes.`})]}),oe.length===0?(0,Q.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No skills installed.`}):oe.map(e=>(0,Q.jsxs)(`div`,{className:`flex items-start justify-between gap-3 rounded-md border p-3`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.name}),(0,Q.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:e.package?e.source:e.description||`No description`})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{ce(e.name),le(e.description||``),de(e.content||``),pe(e.source||``)},children:`Edit`}),(0,Q.jsx)(X,{type:`button`,variant:`destructive`,size:`sm`,disabled:W===(e.source||e.name),onClick:()=>Qe(e.source||e.name),children:W===(e.source||e.name)?`Removing…`:`Remove`})]})]},e.name)),(0,Q.jsxs)(`div`,{className:`space-y-4 rounded-md border p-4`,children:[(0,Q.jsx)(HN,{label:`Package Source`,hint:`Use this for whole pi packages. Leave empty to save inline SKILL.md content.`,children:(0,Q.jsx)(J,{value:fe,onChange:e=>pe(e.target.value),placeholder:`npm:@foo/pi-tools or git:github.com/badlogic/pi-doom`})}),(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsx)(HN,{label:`Name`,children:(0,Q.jsx)(J,{value:se,onChange:e=>ce(e.target.value),placeholder:`skill-name, or read from frontmatter`,disabled:!!fe.trim()})}),(0,Q.jsx)(HN,{label:`Description`,children:(0,Q.jsx)(J,{value:U,onChange:e=>le(e.target.value),placeholder:`What this skill helps with`,disabled:!!fe.trim()})})]}),(0,Q.jsx)(HN,{label:`SKILL.md Content`,children:(0,Q.jsx)(`textarea`,{value:ue,onChange:e=>de(e.target.value),placeholder:`# Skill instructions…`,disabled:!!fe.trim(),className:`${UN} min-h-[160px] font-mono text-xs`})}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(X,{type:`button`,disabled:me||!fe.trim()&&!ue.trim(),onClick:Ze,children:me?`Saving…`:`Install / Update Skill`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,onClick:Xe,children:`Clear`})]})]})]}),(0,Q.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`MCP Servers`}),(c.config?.mcp?.servers||[]).length===0?(0,Q.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,Q.jsxs)(`div`,{className:`rounded-md border p-3`,children:[(0,Q.jsx)(`div`,{className:`text-sm font-medium`,children:e.name}),(0,Q.jsxs)(`div`,{className:`font-mono text-xs text-muted-foreground`,children:[e.command,` `,(e.args||[]).join(` `)]})]},t))]})]}),s===`access`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Canvas Access`}),(0,Q.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.`})]}),ye===c.id?_e?(0,Q.jsxs)(`div`,{className:`space-y-2 rounded-md border p-3`,children:[(0,Q.jsx)(`div`,{className:`text-sm font-medium`,children:it(_e.binding)}),(0,Q.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`Permissions: `,_e.permissions.join(`, `)||`none`,_e.boundAt?` · bound ${new Date(_e.boundAt).toLocaleString()}`:``,_e.rotatedAt?` · token rotated ${new Date(_e.rotatedAt).toLocaleString()}`:``]}),(0,Q.jsxs)(`div`,{className:`flex gap-2 pt-1`,children:[(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:K,onClick:tt,children:`Rotate Token`}),(0,Q.jsx)(X,{type:`button`,variant:`destructive`,size:`sm`,disabled:K,onClick:nt,children:`Revoke Access`})]})]}):(0,Q.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Unbound — this agent has no canvas access.`}):(0,Q.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Loading…`}),xe&&(0,Q.jsxs)(`div`,{className:`space-y-2 rounded-md border border-warning/50 bg-warning/10 p-3`,children:[(0,Q.jsx)(`div`,{className:`text-xs font-medium`,children:`Agent token — shown once, store it now`}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`code`,{className:`flex-1 truncate rounded bg-background px-2 py-1 font-mono text-xs`,children:xe}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>navigator.clipboard?.writeText(xe),children:`Copy`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>Se(null),children:`Dismiss`})]}),(0,Q.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,Q.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:_e?`Rebind`:`Bind`}),(0,Q.jsx)(HN,{label:`Scope`,hint:`Context bindings follow the context live; global spans all workspaces.`,children:(0,Q.jsxs)(`select`,{value:Ce,onChange:e=>we(e.target.value),className:WN,children:[(0,Q.jsx)(`option`,{value:`context`,children:`Context (follows live)`}),(0,Q.jsx)(`option`,{value:`workspace`,children:`Workspace`}),(0,Q.jsx)(`option`,{value:`path`,children:`Workspace path`}),(0,Q.jsx)(`option`,{value:`global`,children:`Global (all workspaces)`})]})}),Ce===`context`&&(0,Q.jsx)(HN,{label:`Context`,children:(0,Q.jsxs)(`select`,{value:ke,onChange:e=>Ae(e.target.value),className:WN,children:[(0,Q.jsx)(`option`,{value:``,children:`Select a context…`}),Le.map(e=>(0,Q.jsxs)(`option`,{value:e.id,children:[e.id,` — `,e.url]},e.id))]})}),(Ce===`workspace`||Ce===`path`)&&(0,Q.jsx)(HN,{label:`Workspace`,children:(0,Q.jsxs)(`select`,{value:Te,onChange:e=>Ee(e.target.value),className:WN,children:[(0,Q.jsx)(`option`,{value:``,children:`Select a workspace…`}),Fe.map(e=>(0,Q.jsx)(`option`,{value:e.name||e.id,children:e.label||e.name},e.id))]})}),Ce===`path`&&(0,Q.jsx)(HN,{label:`Base path`,hint:`The agent is clamped to this subtree.`,children:(0,Q.jsx)(J,{value:De,onChange:e=>Oe(e.target.value),placeholder:`/work/projects/foo`})}),(0,Q.jsx)(HN,{label:`Permissions`,children:(0,Q.jsxs)(`div`,{className:`flex gap-4 text-sm`,children:[(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:je,onChange:e=>Me(e.target.checked)}),` read`]}),(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:Ne,onChange:e=>Pe(e.target.checked)}),` write`]})]})}),(0,Q.jsx)(X,{type:`button`,disabled:K,onClick:et,children:K?`Working…`:_e?`Rebind & Mint Token`:`Bind & Mint Token`})]})]}),s===`memory`&&(0,Q.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:`Memory Engine`}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Loop-based memory management. Settings coming soon.`})]}),s===`integrations`&&(0,Q.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:`Integrations`}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`IMAP, chat, SQL and REST API accounts. Coming soon.`})]}),st&&(0,Q.jsx)(X,{type:`submit`,disabled:m,children:m?`Saving…`:`Save Changes`})]})]})})}var KN=`workspace:backups`,qN=e=>`${Sr.workspaces}/${encodeURIComponent(e)}/db/backups`,JN=e=>Y.get(qN(e)),YN=e=>Y.post(qN(e),{action:`backup`}),XN=(e,t)=>Y.post(qN(e),{action:`restore`,backupId:t,confirm:!0}),ZN=new Map;function QN(e,t,n){let r=JSON.stringify([t,n.id]),i=ZN.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 JN(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(KN,{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 ZN.set(r,a),a.finally(()=>ZN.delete(r)).catch(()=>{}),a}var $N={startup:`Startup`,hourly:`Hourly`,manual:`Manual`,"pre-restore":`Before restore`};function eP({workspaceId:e,onRestored:t}){let{showToast:n,showProgress:r}=Hr(),[i,a]=(0,Z.useState)(null),[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.useState)(!1),f=(0,Z.useRef)(!1),p=(0,Z.useRef)(!1),m=(0,Z.useRef)(0),h=(0,Z.useCallback)(()=>{let t=++m.current;return JN(e).then(n=>{if(!(!f.current||t!==m.current)){a(n),s(null);for(let t of n.jobs.filter(e=>e.status===`running`))QN(r,e,t).catch(()=>{})}}).catch(e=>{f.current&&t===m.current&&s(e instanceof Error?e.message:String(e))})},[e,r]);(0,Z.useEffect)(()=>{f.current=!0,h();let t=t=>{let n=t.detail;n.workspace===e&&a(n.status)};return window.addEventListener(KN,t),()=>{f.current=!1,window.removeEventListener(KN,t)}},[e,h]);let g=async i=>{if(!p.current){p.current=!0,d(!0);try{let n=i?await XN(e,i.id):await YN(e);f.current&&a(e=>e&&{...e,jobs:[n,...e.jobs]}),await QN(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,Q.jsxs)(`div`,{className:`min-w-0 space-y-5`,children:[(0,Q.jsxs)(`section`,{className:`space-y-4 rounded border p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,Q.jsx)(_n,{className:`h-5 w-5 text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`font-semibold`,children:`Workspace checkpoints`}),(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,className:`ml-auto`,disabled:_||!i||!!o,onClick:()=>void g(),children:[_?(0,Q.jsx)(Xn,{className:`mr-2 h-4 w-4 animate-spin`}):(0,Q.jsx)(_n,{className:`mr-2 h-4 w-4`}),`Back up now`]})]}),(0,Q.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,Q.jsxs)(`div`,{className:`flex flex-wrap gap-x-5 gap-y-2 text-sm`,children:[(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`strong`,{children:i?.retention.hourly??24}),` hourly backups`]}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`strong`,{children:i?.retention.startup??14}),` startup backups`]}),(0,Q.jsx)(`span`,{children:`Manual checkpoints kept`})]}),(0,Q.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,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Q.jsxs)(`h2`,{className:`text-sm font-semibold`,children:[`Verified checkpoints`,i?` · ${i.backups.length}`:``]}),(0,Q.jsx)(X,{variant:`ghost`,size:`icon`,className:`h-8 w-8`,onClick:()=>void h(),"aria-label":`Refresh backups`,children:(0,Q.jsx)(P,{className:`h-4 w-4`})})]}),o&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:o}),v&&(0,Q.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,Q.jsx)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:`Loading backups…`}),i?.backups.length===0&&(0,Q.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,Q.jsx)(`div`,{className:`space-y-2`,children:i?.backups.map(e=>(0,Q.jsxs)(`article`,{className:`flex min-w-0 flex-wrap items-center gap-3 rounded border p-3`,children:[(0,Q.jsx)(ae,{className:`h-4 w-4 shrink-0 text-muted-foreground`,"aria-label":`Verified`}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1 basis-40`,children:[(0,Q.jsx)(`p`,{className:`text-sm font-medium`,children:new Date(e.createdAt).toLocaleString()}),(0,Q.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[$N[e.kind],` · `,qi(e.bytes),` · `,(e.datasets.documents?.count??0).toLocaleString(),` documents`]})]}),(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,disabled:_,onClick:()=>l(e),children:[(0,Q.jsx)(ar,{className:`mr-2 h-3.5 w-3.5`}),`Restore`]})]},e.id))}),(0,Q.jsx)(Lr,{open:!!c,onOpenChange:e=>{e||l(null)},children:(0,Q.jsxs)(kr,{className:`max-w-[calc(100vw-2rem)] sm:max-w-lg`,children:[(0,Q.jsxs)(Ir,{children:[(0,Q.jsx)(wr,{children:`Restore this workspace checkpoint?`}),(0,Q.jsxs)(Cr,{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,Q.jsxs)(Nr,{children:[(0,Q.jsx)(Fr,{children:`Cancel`}),(0,Q.jsx)(Mr,{disabled:_,onClick:()=>{c&&g(c)},children:`Back up current & restore`})]})]})})]})}var tP={collect:`Collect unused blobs`,verify:`Verify integrity`,compact:`Compact index`},nP=e=>e.status===`queued`||e.status===`running`,rP=e=>`${Sr.workspaces}/${encodeURIComponent(e)}/cache/maintenance`,iP=e=>Y.get(rP(e)),aP=(e,t,n)=>Y.post(rP(e),{store:t,action:n,...n===`verify`?{confirm:!0}:{}});function oP(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 · ${qi(t.reclaimedSize||0)} reclaimed`:`${(t.reclaimedCount||0).toLocaleString()} unused blobs removed · ${qi(t.reclaimedSize||0)} reclaimed`}var sP=new Map,cP=`workspace:cache-maintenance`;function lP(e,t,n){let r=JSON.stringify([t,n.id]),i=sP.get(r);if(i)return i;let a=(async()=>{let r=e({title:tP[n.action],description:`${n.store} · ${oP(n)}`});try{let e=n;for(;nP(e);){let i=await iP(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(cP,{detail:{workspace:t,status:i}})),!nP(e))break;r.update({title:tP[e.action],description:`${e.store} · ${oP(e)}`}),await new Promise(e=>setTimeout(e,2e3))}if(e.status===`failed`)throw Error(oP(e));r.done({title:`${tP[e.action]} complete`,description:`${e.store} · ${oP(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 sP.set(r,a),a.finally(()=>{sP.get(r)===a&&sP.delete(r)}).catch(()=>{}),a}function uP({workspaceId:e,children:t}){let{showToast:n,showProgress:r}=Hr(),[i,a]=(0,Z.useState)(null),[o,s]=(0,Z.useState)(`workspace:cache`),[c,l]=(0,Z.useState)(!1),[u,d]=(0,Z.useState)(!1),[f,p]=(0,Z.useState)(null),m=(0,Z.useRef)(!1),h=(0,Z.useRef)(!1),g=(0,Z.useCallback)(()=>iP(e).then(t=>{if(h.current){a(t),p(null);for(let n of t.jobs.filter(nP))lP(r,e,n).catch(()=>{})}}).catch(e=>{h.current&&p(e instanceof Error?e.message:`Cannot load maintenance status`)}),[e,r]);(0,Z.useEffect)(()=>{h.current=!0,g();let t=t=>{let{workspace:n,status:r}=t.detail;n===e&&(a(r),p(null))};return window.addEventListener(cP,t),()=>{h.current=!1,window.removeEventListener(cP,t)}},[e,g]);let _=async t=>{if(!(m.current||i?.jobs.some(nP))){m.current=!0,l(!0);try{let n=await aP(e,o,t);h.current&&a(e=>e&&{...e,jobs:[n,...e.jobs.filter(e=>e.id!==n.id)]}),lP(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(nP),y=i?.stores.find(e=>e.id===o),b=i?.jobs[0];return(0,Q.jsxs)(`section`,{className:`space-y-4 rounded-(--panel-radius) border p-4`,"aria-label":`Workspace cache maintenance`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsxs)(`h2`,{className:`flex items-center gap-2 text-sm font-semibold`,children:[(0,Q.jsx)(tr,{className:`h-4 w-4 shrink-0`}),`Workspace cache`]}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Thumbnails, cached resources and pending transfers. Maintenance runs only when requested.`})]}),t&&(0,Q.jsx)(`fieldset`,{disabled:v,children:t})]}),(0,Q.jsxs)(`div`,{className:`space-y-3 border-t pt-3`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(`label`,{htmlFor:`cache-maintenance-store`,className:`text-xs font-medium`,children:`Store`}),(0,Q.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,Q.jsx)(`option`,{value:`workspace:cache`,children:`workspace:cache`}),(0,Q.jsx)(`option`,{value:`workspace:data`,children:`workspace:data`})]}),(0,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`icon`,onClick:()=>void g(),"aria-label":`Refresh cache maintenance status`,className:`ml-auto h-8 w-8`,children:(0,Q.jsx)(P,{className:`h-3.5 w-3.5`})})]}),(0,Q.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,Q.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:v||!y?.canCollect||!!f,onClick:()=>void _(`collect`),children:[(0,Q.jsx)(rt,{className:`mr-2 h-3.5 w-3.5`}),`Collect unused blobs`]}),(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:v||!y?.canCompact||!!f,onClick:()=>void _(`compact`),children:[(0,Q.jsx)(_n,{className:`mr-2 h-3.5 w-3.5`}),`Compact index`]}),(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:v||!y?.canVerify||!!f,onClick:()=>d(!0),children:[(0,Q.jsx)(Ft,{className:`mr-2 h-3.5 w-3.5`}),`Verify integrity`]})]}),(0,Q.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,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,role:`status`,children:`Loading maintenance status…`}),y&&!y.canCollect&&!y.canVerify&&!y.canCompact&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Update canvas-stored to enable maintenance for this store.`}),f&&(0,Q.jsx)(`p`,{className:`text-xs text-destructive`,role:`alert`,children:f}),b&&(0,Q.jsxs)(`div`,{className:`rounded-md bg-muted/50 p-3 text-xs`,role:`status`,"aria-live":`polite`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 font-medium`,children:[nP(b)&&(0,Q.jsx)(Xn,{className:`h-3.5 w-3.5 animate-spin`}),tP[b.action],` · `,b.store]}),(0,Q.jsx)(`p`,{className:`mt-1 ${b.status===`failed`?`text-destructive`:`text-muted-foreground`}`,children:oP(b)}),(0,Q.jsx)(`p`,{className:`mt-1 text-muted-foreground`,children:b.finishedAt?`Finished ${new Date(b.finishedAt).toLocaleString()}`:`Requested ${new Date(b.createdAt).toLocaleString()}`})]})]}),(0,Q.jsx)(Lr,{open:u,onOpenChange:d,children:(0,Q.jsxs)(kr,{className:`max-w-[calc(100vw-2rem)] sm:max-w-lg`,children:[(0,Q.jsxs)(Ir,{children:[(0,Q.jsxs)(wr,{children:[`Verify `,o,`?`]}),(0,Q.jsx)(Cr,{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,Q.jsxs)(Nr,{children:[(0,Q.jsx)(Fr,{children:`Cancel`}),(0,Q.jsx)(Mr,{disabled:v,onClick:()=>void _(`verify`),children:`Verify and repair`})]})]})})]})}function dP({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,Z.useState)(!1),[s,c]=(0,Z.useState)(i),[l,u]=(0,Z.useState)(r.forcePathStyle!==!1),[d,f]=(0,Z.useState)(r.readOnly===!0),[p,m]=(0,Z.useState)(r.watch===!0),[h,g]=(0,Z.useState)(!1),[_,v]=(0,Z.useState)(!1),{showToast:y}=Hr(),b=e=>({value:s[e],onChange:t=>c(n=>({...n,[e]:t.target.value}))});return a?(0,Q.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 Ea(e,`s3`,t.address,r):await ja(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,Q.jsxs)(`h2`,{className:`flex items-center gap-2 text-sm font-semibold`,children:[(0,Q.jsx)(tr,{className:`h-4 w-4`}),t?`Edit S3 connection`:`Add S3-compatible bucket`]}),(0,Q.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,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Name`,(0,Q.jsx)(J,{...b(`name`),required:!0,placeholder:`Accounting archive`})]}),(0,Q.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Bucket`,(0,Q.jsx)(J,{...b(`bucket`),disabled:!!t,required:!0,placeholder:`accounting`})]}),(0,Q.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Endpoint (blank for Amazon S3)`,(0,Q.jsx)(J,{...b(`endpoint`),disabled:!!t,type:`url`,placeholder:`https://s3.example.com`})]}),(0,Q.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Region`,(0,Q.jsx)(J,{...b(`region`),required:!0,placeholder:`us-east-1`})]}),(0,Q.jsxs)(`label`,{className:`space-y-1 text-xs sm:col-span-2`,children:[`Prefix (optional)`,(0,Q.jsx)(J,{...b(`prefix`),disabled:!!t,placeholder:`Augmentd/Accounting`})]}),(0,Q.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Access key ID`,(0,Q.jsx)(J,{...b(`accessKeyId`),required:!t,autoComplete:`off`,placeholder:t?`Leave blank to keep stored value`:``})]}),(0,Q.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Secret access key`,(0,Q.jsx)(J,{...b(`secretAccessKey`),type:`password`,required:!t,autoComplete:`off`,placeholder:t?`Leave blank to keep stored value`:``})]}),(0,Q.jsxs)(`label`,{className:`space-y-1 text-xs sm:col-span-2`,children:[`Session token (optional)`,(0,Q.jsx)(J,{...b(`sessionToken`),disabled:h,type:`password`,autoComplete:`off`,placeholder:t?`Leave blank to keep stored value`:``})]}),t&&(0,Q.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:h,onChange:e=>g(e.target.checked)}),`Clear stored session token`]})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-4 text-xs`,children:[(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:l,onChange:e=>u(e.target.checked)}),`Path-style addressing`]}),(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:d,onChange:e=>f(e.target.checked)}),`Read-only`]}),(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:p,onChange:e=>m(e.target.checked)}),`Poll for changes`]})]}),(0,Q.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,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Q.jsx)(X,{type:`button`,variant:`ghost`,disabled:_,onClick:()=>{o(!1),c(i())},children:`Cancel`}),(0,Q.jsx)(X,{disabled:_,children:_?`Checking connection…`:`Save connection`})]})]}):(0,Q.jsxs)(X,{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,Q.jsx)(ve,{className:`mr-2 h-3.5 w-3.5`}):(0,Q.jsx)(cn,{className:`mr-2 h-3.5 w-3.5`}),t?`Edit S3 connection`:`Add S3 bucket`]})}function fP({workspaceId:e,isActive:t,currentMode:n,onChanged:r}){let[i,a]=(0,Z.useState)(n===`workspace`?`workspace`:`secrets`),[o,s]=(0,Z.useState)(``),[c,l]=(0,Z.useState)(``),[u,d]=(0,Z.useState)(``),[f,p]=(0,Z.useState)(``),[m,h]=(0,Z.useState)(``),[g,_]=(0,Z.useState)(!1);return(0,Q.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Q.jsx)(`h2`,{className:`font-semibold text-sm`,children:`Workspace protection`}),(0,Q.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,Q.jsx)(`p`,{className:`text-sm`,children:`Stop the workspace before changing protection.`}),(0,Q.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 Y.put(`${Sr.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,Q.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`Protection mode`,(0,Q.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,Q.jsx)(`option`,{value:`secrets`,children:`Secrets only — allow start without integrations`}),(0,Q.jsx)(`option`,{value:`workspace`,children:`Whole workspace — require PIN/password to start`})]})]}),(0,Q.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`Current PIN/password or recovery key (if already protected)`,(0,Q.jsx)(J,{type:`password`,autoComplete:`current-password`,value:u,onChange:e=>d(e.target.value),disabled:t||g})]}),(0,Q.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`New PIN/password`,(0,Q.jsx)(J,{type:`password`,autoComplete:`new-password`,minLength:4,maxLength:1024,required:!0,value:o,onChange:e=>s(e.target.value),disabled:t||g})]}),(0,Q.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`Confirm new PIN/password`,(0,Q.jsx)(J,{type:`password`,autoComplete:`new-password`,required:!0,value:c,onChange:e=>l(e.target.value),disabled:t||g})]}),(0,Q.jsx)(X,{disabled:t||g||!!f,children:g?`Saving…`:`Save protection`})]}),m&&(0,Q.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:m}),f&&(0,Q.jsxs)(`div`,{className:`space-y-2 rounded border p-3`,children:[(0,Q.jsx)(`p`,{className:`text-sm`,children:`Save this recovery key now. It is shown only once and replaces any previous recovery key.`}),(0,Q.jsx)(`code`,{className:`block break-all select-all`,children:f}),(0,Q.jsx)(X,{variant:`outline`,onClick:()=>{p(``),r()},children:`I saved the recovery key`})]})]})}var pP=`h-8 rounded-md border bg-background px-2 text-sm outline-none focus:ring-2 focus:ring-ring`;function mP({title:e,hint:t,children:n}){let[r,i]=(0,Z.useState)(!1);return(0,Q.jsxs)(`section`,{className:`overflow-hidden rounded-lg border`,children:[(0,Q.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,Q.jsxs)(`span`,{className:`min-w-0`,children:[(0,Q.jsx)(`span`,{className:`block text-sm font-medium`,children:e}),(0,Q.jsx)(`span`,{className:`mt-0.5 block text-xs text-muted-foreground`,children:t})]}),(0,Q.jsx)(Ze,{className:q(`h-4 w-4 shrink-0 text-muted-foreground transition-transform motion-reduce:transition-none`,r&&`rotate-180`)})]}),r&&(0,Q.jsx)(`div`,{className:`border-t p-4`,children:n})]})}function hP({workspaceId:e,workspaceName:t,refreshKey:n,onRefresh:r}){let{showToast:i}=Hr(),[a,o]=(0,Z.useState)(null),[s,c]=(0,Z.useState)(!1),l=(0,Z.useCallback)(()=>Zj(e).then(e=>o(e.queue??null)).catch(()=>{}),[e]);(0,Z.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 io(!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,Q.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,Q.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2 text-sm`,children:[(0,Q.jsxs)(`span`,{className:`relative flex h-2 w-2 shrink-0`,"aria-hidden":!0,children:[d&&(0,Q.jsx)(`span`,{className:`absolute inline-flex h-full w-full animate-ping rounded-full bg-success opacity-60 motion-reduce:hidden`}),(0,Q.jsx)(`span`,{className:q(`relative inline-flex h-2 w-2 rounded-full`,f)})]}),(0,Q.jsx)(`span`,{className:`font-medium`,children:a?a.pending>0?(0,Q.jsxs)(Q.Fragment,{children:[a.pending.toLocaleString(),` `,(0,Q.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`pending`})]}):a.paused?`Paused`:`Idle`:`Queue unavailable`}),a?.paused&&a.pending>0&&(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`held`}),a?.ingestDisabled&&(0,Q.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,Q.jsxs)(`div`,{className:`flex items-center gap-1`,children:[a&&(0,Q.jsx)(X,{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,Q.jsx)(X,{type:`button`,size:`sm`,variant:`ghost`,onClick:r,title:`Reload config, queue and tables`,children:(0,Q.jsx)(P,{className:`h-3.5 w-3.5`})})]})]})}function gP({workspaceId:e,tables:t,error:n,onChanged:r}){let{showToast:i}=Hr(),[a,o]=(0,Z.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 iM(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,Q.jsxs)(`section`,{className:`rounded-lg border border-destructive/40 bg-destructive-subtle p-4`,children:[(0,Q.jsx)(`p`,{className:`text-sm font-medium text-destructive`,children:`Vector tables unavailable`}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:n})]}):s.length===0?null:(0,Q.jsx)(mP,{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,Q.jsx)(`div`,{className:`divide-y`,children:s.map(e=>(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-4 py-2 first:pt-0 last:pb-0`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsxs)(`p`,{className:`truncate font-mono text-xs`,children:[e.model||`unknown model`,e.dim?` · ${e.dim}-d`:``]}),(0,Q.jsxs)(`p`,{className:`truncate font-mono text-[11px] text-muted-foreground`,children:[`└─ `,e.name]})]}),(0,Q.jsxs)(X,{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,Q.jsx)(rt,{className:`mr-1.5 h-3.5 w-3.5`}),a===e.name?`Reclaiming…`:`Reclaim`]})]},e.name))})})}function _P({workspaceId:e,workspaceName:t,spaces:n,onDone:r}){let{showToast:i}=Hr(),[a,o]=(0,Z.useState)(``),[s,c]=(0,Z.useState)(``),[l,u]=(0,Z.useState)(!1),[d,f]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)(!1);return(0,Q.jsxs)(mP,{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,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`Space`}),(0,Q.jsxs)(`select`,{className:`${pP} w-full`,value:a,onChange:e=>o(e.target.value),children:[(0,Q.jsx)(`option`,{value:``,children:`all spaces`}),n.map(e=>(0,Q.jsx)(`option`,{value:e,children:e},e))]})]}),(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsxs)(`label`,{className:`text-xs font-medium`,children:[`Limit to a path `,(0,Q.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`(optional)`})]}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(J,{value:s,onChange:e=>c(e.target.value),placeholder:`ctx://work/project or dir://photos`,className:`h-8 font-mono text-sm`}),(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>m(!0),title:`Pick a context or directory path from the tree`,children:(0,Q.jsx)(le,{className:`h-3.5 w-3.5`})})]})]})]}),(0,Q.jsxs)(`label`,{className:`mt-3 flex items-start gap-2 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,className:`mt-0.5`,checked:l,onChange:e=>u(e.target.checked)}),(0,Q.jsxs)(`span`,{children:[`Re-embed documents that are already embedded`,l&&s.trim()&&(0,Q.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,Q.jsx)(X,{type:`button`,size:`sm`,className:`mt-3`,onClick:async()=>{f(!0);try{let t=await nM(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,Q.jsx)(Up,{onClose:()=>m(!1),children:(0,Q.jsx)(Jm,{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 vP=[{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.`}],yP=`custom`,bP=[{value:`instruct`,label:`Instruct VLM (image + prompt)`},{value:`florence2`,label:`Florence-2 (task token)`},{value:`caption`,label:`Plain captioner (image only)`}],xP=`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 SP({workspaceId:e,config:t,saving:n,onSave:r}){let{showToast:i}=Hr(),a=t.workspace||{},o=t.effective||{},s=vP[0],c=a.summarize?.image||o.summarize?.image||{},[l,u]=(0,Z.useState)(()=>o.summarize?.image?.enabled===!0||a.summarize?.image?.enabled===!0),[d,f]=(0,Z.useState)(()=>{let e=vP.find(e=>e.provider===(c.provider||s.provider)&&e.model===c.model);return e?`${e.provider}::${e.model}`:c.model?yP:`${s.provider}::${s.model}`}),[p,m]=(0,Z.useState)(()=>vP.some(e=>e.model===c.model)?``:c.model||``),[h,g]=(0,Z.useState)(()=>c.task||`instruct`),[_,v]=(0,Z.useState)(()=>c.prompt||``),[y,b]=(0,Z.useState)(!1),[x,S]=(0,Z.useState)(null),[C,w]=(0,Z.useState)(!1),[T,E]=(0,Z.useState)(!1),[D,O]=(0,Z.useState)(!1),k=vP.find(e=>`${e.provider}::${e.model}`===d),A=d===yP,j=A?{provider:s.provider,model:p.trim(),task:h,label:`Custom`,note:``}:k||s,M=j.task===`instruct`,N=(0,Z.useCallback)(()=>Zj(e).then(e=>S(e.summarize||null)).catch(()=>{}),[e]);(0,Z.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 $j(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 Qj(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,L=x?.running===!0,R=x?.errors?.[0]?.error;return(0,Q.jsx)(mP,{title:`Summaries`,hint:`Generate descriptions for indexed images (metadata.summary); searchable via full-text and dense search`,children:(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsxs)(`label`,{className:`flex items-center gap-2 text-sm`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:l,disabled:n,onChange:e=>{u(e.target.checked),b(!0)}}),`Images`]}),(0,Q.jsxs)(`select`,{className:pP,value:d,disabled:n||!l,onChange:e=>{f(e.target.value),b(!0)},children:[vP.map(e=>(0,Q.jsx)(`option`,{value:`${e.provider}::${e.model}`,children:e.label},`${e.provider}::${e.model}`)),(0,Q.jsx)(`option`,{value:yP,children:`Custom model…`})]}),!A&&(0,Q.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:j.model})]}),A&&(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(J,{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,Q.jsx)(`select`,{className:pP,value:h,disabled:n||!l,onChange:e=>{g(e.target.value),b(!0)},children:bP.map(e=>(0,Q.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),l&&j.note&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:j.note}),l&&M&&(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.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:xP,value:_,disabled:n,onChange:e=>{v(e.target.value),b(!0)}}),(0,Q.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,Q.jsxs)(`p`,{className:q(`text-xs`,x.aborted?`text-destructive`:`text-muted-foreground`),children:[L?`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.`:R?`. ${R}`:``]}),(0,Q.jsxs)(`label`,{className:`flex items-start gap-2 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,className:`mt-0.5`,checked:D,disabled:n||L,onChange:e=>O(e.target.checked)}),(0,Q.jsxs)(`span`,{children:[`Re-caption images that already have a summary`,D&&(0,Q.jsxs)(`span`,{className:`mt-1 block text-[11px] text-warning`,children:[`Replaces every existing `,(0,Q.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,Q.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,Q.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,Q.jsx)(`span`,{className:`font-mono`,children:`data/mime/image`}),`.`]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>void P(),disabled:n||!y,children:`Save summaries`}),(0,Q.jsx)(X,{size:`sm`,onClick:()=>void F(D),disabled:n||y||C||L||!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:L||C?`Running…`:D?`Rebuild`:`Backfill`}),L&&(0,Q.jsx)(X,{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 CP({workspaceId:e,workspaceName:t}){let{showToast:n}=Hr(),[r,i]=(0,Z.useState)(null),[a,o]=(0,Z.useState)([]),[s,c]=(0,Z.useState)(),[l,u]=(0,Z.useState)(!0),[d,f]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)(null),[h,g]=(0,Z.useState)([]),[_,v]=(0,Z.useState)(0),y=(0,Z.useCallback)(()=>eM(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,Z.useCallback)(()=>rM(e).then(e=>{o(e.tables||[]),c(e.error)}).catch(e=>c(e instanceof Error?e.message:`Failed to list vector tables`)),[e]);(0,Z.useEffect)(()=>{y(),b()},[y,b]);let x=()=>{u(!0),y(),b(),v(e=>e+1)},S=async t=>{f(!0);try{let r=await tM(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 nM(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,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Q.jsx)(P,{className:`h-4 w-4 animate-spin`}),`Loading the embedding config…`]});if(p||!r)return(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`rounded-lg border border-destructive/40 bg-destructive-subtle p-4 text-sm`,children:[(0,Q.jsx)(`p`,{className:`font-medium text-destructive`,children:`Embedding config unavailable`}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:p||`No config returned.`})]}),(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:x,children:`Try again`})]});let w=Object.keys(r.effective.spaces||{}).sort();return(0,Q.jsxs)(`div`,{className:`space-y-5`,children:[(0,Q.jsx)(hP,{workspaceId:e,workspaceName:t,refreshKey:_,onRefresh:x}),(0,Q.jsx)(TM,{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,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsx)(SP,{workspaceId:e,config:r,saving:d,onSave:S},`summarize:${JSON.stringify(r.workspace?.summarize||{})}`),(0,Q.jsx)(_P,{workspaceId:e,workspaceName:t,spaces:w,onDone:()=>{b(),v(e=>e+1)}}),(0,Q.jsx)(gP,{workspaceId:e,tables:a,error:s,onChanged:()=>{b()}})]}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Stored in this workspace's own `,(0,Q.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 wP(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 TP({value:e,onChange:t,path:n,className:r=``}){let i=(0,Z.useMemo)(()=>wP(n),[n]),{resolvedScheme:a}=Hs();return(0,Q.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 EP=[`pending`,`approved`,`declined`,`failed`,`expired`,`all`],DP={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 OP(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 kP(e,t){return t.split(`.`).reduce((e,t)=>typeof e==`object`&&e?e[t]:void 0,e)}function AP(e){let t=e.split(`.`);return t.slice(Math.max(t.length-2,2)).join(`.`)}var jP=/(body|content|message|text|prompt)$/i;function MP({action:e,amend:t,onAmend:n}){return e.editable?.length?(0,Q.jsx)(`div`,{className:`space-y-2`,children:e.editable.map(r=>{let i=kP(e,r),a=typeof i==`string`,o=r in t?t[r]:i,s=a?String(o??``):JSON.stringify(o,null,2),c=a&&(jP.test(r)||s.length>80);return(0,Q.jsxs)(`label`,{className:`block text-xs`,children:[(0,Q.jsxs)(`span`,{className:`font-medium text-muted-foreground`,children:[AP(r),(0,Q.jsx)(`span`,{className:`ml-1.5 font-mono text-[10px] opacity-60`,children:r}),r in t&&(0,Q.jsx)(`span`,{className:`ml-1.5 text-warning dark:text-warning`,children:`edited`})]}),c?(0,Q.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,Q.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 NP({workspaceId:e,onPendingCount:t}){let{showToast:n}=Hr(),r=PT(),[i,a]=(0,Z.useState)(`pending`),[o,s]=(0,Z.useState)([]),[c,l]=(0,Z.useState)(!0),[u,d]=(0,Z.useState)(new Set),[f,p]=(0,Z.useState)(null),[m,h]=(0,Z.useState)({}),[g,_]=(0,Z.useState)(!1),v=(0,Z.useCallback)(()=>ip(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,Z.useCallback)(async()=>{l(!0),await v()},[v]),[b,x]=(0,Z.useState)(`${e}|${i}`),S=`${e}|${i}`;S!==b&&(x(S),l(!0)),(0,Z.useEffect)(()=>{v()},[v]),Yw(r,`workspace:${e}`,(0,Z.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 ap(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,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2 flex-wrap`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.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:EP.map(e=>(0,Q.jsx)(`option`,{value:e,children:e},e))}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,onClick:()=>void y(),title:`Reload`,children:(0,Q.jsx)(P,{className:`h-4 w-4`})})]}),u.size>0&&(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[u.size,` selected`]}),(0,Q.jsxs)(X,{size:`sm`,disabled:g,onClick:()=>void O([...u],[]),children:[(0,Q.jsx)(ae,{className:`mr-1 h-3.5 w-3.5`}),` Approve`]}),(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,disabled:g,onClick:()=>void O([],[...u]),children:[(0,Q.jsx)(W,{className:`mr-1 h-3.5 w-3.5`}),` Decline`]})]})]}),(0,Q.jsx)(`div`,{className:`border rounded-lg overflow-auto max-h-[560px]`,children:c?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground p-3`,children:`Loading...`}):o.length===0?(0,Q.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,Q.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,Q.jsx)(`thead`,{className:`text-xs text-muted-foreground border-b sticky top-0 bg-background`,children:(0,Q.jsxs)(`tr`,{children:[(0,Q.jsx)(`th`,{className:`px-3 py-2 w-8`,children:C.length>0&&(0,Q.jsx)(`input`,{type:`checkbox`,checked:w,onChange:T,title:`Select all pending`})}),(0,Q.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Proposed action`}),(0,Q.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Handler`}),(0,Q.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Age`}),(0,Q.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Status`}),(0,Q.jsx)(`th`,{className:`px-2 py-2 w-40`})]})}),(0,Q.jsx)(`tbody`,{children:o.map(e=>{let t=e.status===`pending`||e.status===`failed`,n=f===e.actionId,r=e.envelope?.payload?.document;return(0,Q.jsxs)(Z.Fragment,{children:[(0,Q.jsxs)(`tr`,{className:`border-b last:border-0 align-top hover:bg-muted/40 cursor-pointer`,onClick:()=>p(n?null:e.actionId),children:[(0,Q.jsx)(`td`,{className:`px-3 py-2`,onClick:e=>e.stopPropagation(),children:e.status===`pending`&&(0,Q.jsx)(`input`,{type:`checkbox`,checked:u.has(e.actionId),onChange:()=>E(e.actionId)})}),(0,Q.jsxs)(`td`,{className:`px-3 py-2`,children:[(0,Q.jsxs)(`span`,{className:`flex items-center gap-1 font-medium`,children:[n?(0,Q.jsx)(Ze,{className:`h-3 w-3 shrink-0`}):(0,Q.jsx)(gr,{className:`h-3 w-3 shrink-0`}),e.title,e.editable?.length>0&&(0,Q.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`})]}),e.summary&&(0,Q.jsx)(`span`,{className:`block text-xs text-muted-foreground pl-4`,children:e.summary})]}),(0,Q.jsxs)(`td`,{className:`px-3 py-2 font-mono text-xs whitespace-nowrap`,children:[(0,Q.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.handlerType,`:`]}),e.handler,e.event&&(0,Q.jsxs)(`span`,{className:`block text-muted-foreground`,children:[e.event,r?.id?` · doc ${r.id}`:``]})]}),(0,Q.jsx)(`td`,{className:`px-3 py-2 text-xs whitespace-nowrap`,title:e.ts,children:OP(e.ts)}),(0,Q.jsxs)(`td`,{className:`px-3 py-2 text-xs`,children:[(0,Q.jsx)(`span`,{className:DP[e.status],children:e.status}),e.amended&&(0,Q.jsx)(`span`,{className:`block text-muted-foreground`,children:`amended`}),e.decidedBy&&(0,Q.jsx)(`span`,{className:`block text-muted-foreground truncate max-w-[120px]`,title:e.decidedBy,children:e.decidedBy})]}),(0,Q.jsx)(`td`,{className:`px-2 py-2 whitespace-nowrap text-right`,onClick:e=>e.stopPropagation(),children:t&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(X,{size:`sm`,className:`h-7 px-2`,disabled:g,title:e.status===`failed`?`Retry (re-approve)`:`Approve and execute`,onClick:()=>void O([e.actionId],[]),children:(0,Q.jsx)(ae,{className:`h-3.5 w-3.5`})}),e.status===`pending`&&(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,className:`h-7 px-2 text-muted-foreground`,disabled:g,title:`Decline`,onClick:()=>void O([],[e.actionId]),children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]})})]}),n&&(0,Q.jsxs)(`tr`,{className:`border-b last:border-0 bg-muted/20`,children:[(0,Q.jsx)(`td`,{className:`px-3 py-3`}),(0,Q.jsxs)(`td`,{className:`px-3 py-3 space-y-3`,colSpan:5,children:[t&&e.editable?.length>0&&(0,Q.jsx)(MP,{action:e,amend:m[e.actionId]??{},onAmend:(t,n)=>D(e.actionId,t,n)}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:`Actions on approve`}),(0,Q.jsx)(`pre`,{className:`mt-1 rounded border bg-background p-2 font-mono text-xs overflow-auto max-h-56`,children:JSON.stringify(e.actions,null,2)})]}),e.result&&e.result.length>0&&(0,Q.jsx)(`div`,{className:`text-xs font-mono`,children:e.result.map((e,t)=>(0,Q.jsxs)(`span`,{className:`mr-2 ${e.status===`error`?`text-destructive`:`text-muted-foreground`}`,children:[e.action,`:`,e.status,e.error?` (${e.error})`:``]},t))}),(0,Q.jsxs)(`p`,{className:`text-[11px] text-muted-foreground font-mono`,children:[e.actionId,` · origin `,e.provenance?.origin,e.provenance?.causedBy?` · causedBy ${e.provenance.causedBy}`:``,e.expiresAt?` · expires ${new Date(e.expiresAt).toLocaleString()}`:``]})]})]})]},e.actionId)})})]})})]})}var PP=`#!/usr/bin/env bash
38
- # Called from a hook via: spawn('bash', [script, ...args])
39
- set -euo pipefail
40
- `;function FP({workspaceId:e,prefillRule:t,onPrefillConsumed:n,initialSection:r,initialRunsHandler:i,initialRunId:a}){let{showToast:o}=Hr(),[s,c]=(0,Z.useState)(r??`rules`),[l,u]=(0,Z.useState)(t);t!==l&&(u(t),t&&c(`rules`));let[d,f]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)([]),[h,g]=(0,Z.useState)(!0),[_,v]=(0,Z.useState)(null),[b,x]=(0,Z.useState)(``),[S,w]=(0,Z.useState)(!1),[T,E]=(0,Z.useState)(!1),[D,O]=(0,Z.useState)(!1),[k,A]=(0,Z.useState)(null),[j,N]=(0,Z.useState)(`document.inserted`),[ee,F]=(0,Z.useState)(``),[I,L]=(0,Z.useState)([]),[R,te]=(0,Z.useState)(!1),[z,ne]=(0,Z.useState)([]),[B,re]=(0,Z.useState)(!1),[V,ae]=(0,Z.useState)(i||null),[oe,H]=(0,Z.useState)(a?{runId:a,run:null}:null),se=e=>{H(t=>t?.runId===e?null:{runId:e,run:null})};(0,Z.useEffect)(()=>{if(!oe||oe.run||oe.error)return;let t=!1;return op(e,oe.runId).then(e=>{t||H(t=>t?.runId===e.runId?{runId:e.runId,run:e}:t)}).catch(e=>{t||H(t=>t?.runId===oe.runId?{...t,error:e instanceof Error?e.message:`Failed to load run`}:t)}),()=>{t=!0}},[e,oe]);let[ce,U]=(0,Z.useState)(null),[le,ue]=(0,Z.useState)(!1),[de,fe]=(0,Z.useState)(0),[pe,me]=(0,Z.useState)(null),[he,ge]=(0,Z.useState)(()=>dp()),[_e,ve]=(0,Z.useState)(()=>String(dp())),ye=()=>{let e=fp(up(_e));ge(e),ve(String(e))};(0,Z.useEffect)(()=>{let t=!1;return ip(e,{status:`pending`,limit:500}).then(e=>{t||fe(e.length)}).catch(()=>{}),()=>{t=!0}},[e]),Np(()=>ue(!1),le);let G=async t=>{if(confirm(`Replay ${t.handlerType} "${t.handler}" for ${t.event} (docs ${(t.docIds||[]).join(`, `)})?`)){U(t.runId);try{let n=await gp(e,t.runId);o({title:`Replayed`,description:`${t.handler} → ${n.status}`}),await Ce()}catch(e){o({title:`Replay failed`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{U(null)}}},K=s===`scripts`?{list:Rp,get:zp,save:Bp,del:Vp}:{list:Rf,get:zf,save:Bf,del:Vf},xe=s===`hooks`||s===`scripts`,Ce=async()=>{if(s!==`rules`&&s!==`pending`){if(s===`runs`){try{g(!0),ne(await sp(e,{limit:100,failed:B||void 0,handler:V||void 0}))}catch{o({title:`Error`,description:`Failed to load hook runs`,variant:`destructive`})}finally{g(!1)}return}try{g(!0),m(await K.list(e))}catch{o({title:`Error`,description:`Failed to load ${s}`,variant:`destructive`})}finally{g(!1)}}};(0,Z.useEffect)(()=>{Ce()},[e,s,B,V]);let we=e=>{e!==s&&(S&&!confirm(`Discard unsaved changes?`)||(c(e),v(null),x(``),w(!1),O(!1)))},Te=async t=>{if(!(S&&!confirm(`Discard unsaved changes?`)))try{v(t),x(await K.get(e,t)),w(!1)}catch{o({title:`Error`,description:`Failed to open ${t}`,variant:`destructive`})}},Ee=async()=>{if(_)try{E(!0),await K.save(e,_,b),w(!1),o({title:`Saved`,description:`${_} saved`}),await Ce()}catch{o({title:`Error`,description:`Failed to save ${_}`,variant:`destructive`})}finally{E(!1)}},De=async t=>{let n=Gf(t);try{let r=await Jf(e,t,!n);_===t&&v(r),await Ce(),o({title:n?`Disabled`:`Enabled`,description:r})}catch{o({title:`Error`,description:`Failed to toggle ${t}`,variant:`destructive`})}},Oe=async t=>{let n=pp(t);if(!n||!Gf(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 mp(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 hp(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)}}},ke=async t=>{if(confirm(`Delete ${s===`hooks`?`hook`:`script`} ${t}?`))try{await K.del(e,t),_===t&&(v(null),x(``),w(!1)),await Ce(),o({title:`Deleted`,description:`${t} deleted`})}catch{o({title:`Error`,description:`Failed to delete ${t}`,variant:`destructive`})}},Ae=async()=>{if(!k)try{A(await _p(e))}catch{o({title:`Error`,description:`Failed to load hook metadata`,variant:`destructive`})}},je=async()=>{O(!D),s===`hooks`&&await Ae()},Me=async()=>{f(!d),await Ae()},Ne=async()=>{let t=ee.trim().replace(/^\/+/,``);if(!t){o({title:`Error`,description:`Give the script a name (e.g. on-image.sh)`,variant:`destructive`});return}try{te(!0),await Bp(e,t,PP),O(!1),F(``),await Ce(),await Te(t)}catch{o({title:`Error`,description:`Failed to create script`,variant:`destructive`})}finally{te(!1)}},Pe=e=>{L(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},Fe=async()=>{if(!ee.trim()){o({title:`Error`,description:`Give the hook a name`,variant:`destructive`});return}try{te(!0);let{path:t}=await vp(e,{event:j,name:ee.trim(),actions:I});O(!1),F(``),L([]),await Ce(),await Te(t),o({title:`Created`,description:`${t}. Edit the TODOs, then enable it`})}catch{o({title:`Error`,description:`Failed to create hook`,variant:`destructive`})}finally{te(!1)}},Ie=s===`hooks`?Yf(p):{scripts:p},Le=`${Rr}/workspaces/${e}/git/internal`;return(0,Q.jsxs)(`div`,{className:`@container space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-3 @3xl:flex-row @3xl:items-start @3xl:justify-between`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 @3xl:min-w-[18rem] @3xl:flex-1`,children:[(0,Q.jsx)(`h3`,{className:`text-lg font-medium`,children:`Automation`}),(0,Q.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,Q.jsx)(`div`,{className:`flex min-w-0 flex-col gap-2 @3xl:max-w-[60%] @3xl:flex-row @3xl:items-center`,children:(0,Q.jsx)(`div`,{className:`w-full min-w-0 @3xl:w-auto`,children:(0,Q.jsx)(Hg,{className:`border-b-0`,active:s,onChange:we,tabs:[{id:`pending`,label:de>0?`Pending (${de})`:`Pending`,icon:M},{id:`rules`,label:`Rules`,icon:On},{id:`hooks`,label:`Hooks`,icon:ie},{id:`scripts`,label:`Scripts`,icon:dt},{id:`runs`,label:`Runs`,icon:be}]})})})]}),(s===`runs`||xe)&&(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center justify-end gap-2`,children:[s===`runs`&&(0,Q.jsxs)(Q.Fragment,{children:[V&&(0,Q.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:[V,` `,(0,Q.jsx)(W,{className:`h-3 w-3`})]}),(0,Q.jsxs)(`label`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground cursor-pointer`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:B,onChange:e=>re(e.target.checked)}),`failed only`]}),(0,Q.jsxs)(X,{size:`sm`,variant:`ghost`,onClick:Ce,title:`Reload`,children:[(0,Q.jsx)(P,{className:`mr-1.5 h-4 w-4`}),` Reload`]})]}),xe&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(X,{size:`sm`,variant:`ghost`,onClick:Ce,title:`Reload`,children:[(0,Q.jsx)(P,{className:`mr-1.5 h-4 w-4`}),` Reload`]}),(0,Q.jsxs)(X,{size:`sm`,variant:`ghost`,onClick:Me,title:`Hook context API & classifier reference`,children:[(0,Q.jsx)(y,{className:`mr-1.5 h-4 w-4`}),` Reference`]}),(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,onClick:je,children:[(0,Q.jsx)(cn,{className:`mr-2 h-4 w-4`}),` `,s===`hooks`?`New Hook`:`New Script`]})]})]}),s===`pending`&&(0,Q.jsx)(NP,{workspaceId:e,onPendingCount:fe}),s===`rules`&&(0,Q.jsx)(Ih,{workspaceId:e,backfillLimit:he,onShowRuns:e=>{ae(e),we(`runs`)},prefill:t,onPrefillConsumed:n,onOpenJson:async()=>{try{await zf(e,`rules.json`)}catch{await Bf(e,`rules.json`,JSON.stringify({$schema:`canvas.hook-rules/v1`,rules:[]},null,2)+`
41
- `).catch(()=>{})}c(`hooks`),Te(`rules.json`)}}),s===`runs`&&(0,Q.jsx)(`div`,{className:`border rounded-lg overflow-auto max-h-[560px]`,children:h?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground p-3`,children:`Loading...`}):z.length===0?(0,Q.jsxs)(`p`,{className:`text-sm text-muted-foreground p-3`,children:[`No runs recorded yet`,B?` (failed only)`:``,`. Runs appear here every time a rule or hook executes.`]}):(0,Q.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,Q.jsx)(`thead`,{className:`text-xs text-muted-foreground border-b sticky top-0 bg-background`,children:(0,Q.jsxs)(`tr`,{children:[(0,Q.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Time`}),(0,Q.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Handler`}),(0,Q.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Event`}),(0,Q.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Docs`}),(0,Q.jsx)(`th`,{className:`text-right font-medium px-3 py-2`,children:`ms`}),(0,Q.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Status`}),(0,Q.jsx)(`th`,{className:`px-2 py-2`})]})}),(0,Q.jsx)(`tbody`,{children:z.map(e=>(0,Q.jsxs)(Z.Fragment,{children:[(0,Q.jsxs)(`tr`,{className:`border-b last:border-0 align-top hover:bg-muted/40`,children:[(0,Q.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,Q.jsxs)(`td`,{className:`px-3 py-1.5 font-mono text-xs`,children:[(0,Q.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.handlerType,`:`]}),e.handler,e.origin!==`user`&&(0,Q.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,Q.jsxs)(`td`,{className:`px-3 py-1.5 font-mono text-xs`,children:[e.event,e.batch?` (batch)`:``]}),(0,Q.jsx)(`td`,{className:`px-3 py-1.5 font-mono text-xs`,children:(e.docIds||[]).join(`, `)}),(0,Q.jsx)(`td`,{className:`px-3 py-1.5 text-right font-mono text-xs`,children:e.durationMs}),(0,Q.jsxs)(`td`,{className:`px-3 py-1.5 text-xs`,children:[(0,Q.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,Q.jsx)(`span`,{className:`block text-destructive/80 font-mono break-all`,children:e.error}),e.skipReason&&(0,Q.jsx)(`span`,{className:`block text-muted-foreground`,children:e.skipReason}),e.actions&&e.actions.length>0&&(0,Q.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,Q.jsxs)(`span`,{className:`block break-all font-mono ${e.status===`error`?`text-destructive/80`:`text-muted-foreground`}`,children:[e.action,`: `,e.error]},t))]}),(0,Q.jsxs)(`td`,{className:`px-2 py-1.5 whitespace-nowrap`,children:[(0,Q.jsxs)(X,{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,Q.jsx)(pr,{className:`h-3.5 w-3.5`}),(0,Q.jsx)(Ze,{className:`ml-0.5 h-3 w-3 transition-transform ${oe?.runId===e.runId?`rotate-180`:``}`})]}),e.handlerType!==`dispatch`&&(0,Q.jsx)(X,{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:ce!==null,onClick:()=>G(e),children:(0,Q.jsx)(ar,{className:`h-3 w-3 ${ce===e.runId?`animate-spin`:``}`})})]})]}),oe?.runId===e.runId&&(0,Q.jsx)(`tr`,{className:`border-b last:border-0 bg-muted/30`,children:(0,Q.jsx)(`td`,{colSpan:7,className:`px-3 py-2`,children:(0,Q.jsx)(IP,{state:oe})})})]},e.runId))})]})}),xe&&d&&k&&(0,Q.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-4 bg-muted/30 text-sm`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`h4`,{className:`font-medium mb-2`,children:[`Hook context (`,(0,Q.jsx)(`span`,{className:`font-mono`,children:`ctx`}),`)`]}),(0,Q.jsx)(`div`,{className:`space-y-2`,children:k.contextApi?.map(e=>(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 font-mono text-xs`,children:e.signature}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5`,children:e.description})]},e.name))})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`h4`,{className:`font-medium mb-2`,children:[`Classifier (`,(0,Q.jsx)(`span`,{className:`font-mono`,children:`const c = ctx.classify()`}),`)`]}),(0,Q.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:k.classifier.predicates.map(e=>(0,Q.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 font-mono text-xs`,children:e},e))}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-2`,children:[`Fields: `,k.classifier.fields.map(e=>(0,Q.jsxs)(`code`,{className:`font-mono`,children:[e,` `]},e)),`(never throws; all predicates are false for a null/unknown document).`]})]}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Full reference: `,(0,Q.jsx)(`span`,{className:`font-mono`,children:`docs/hooks.md`}),` in the server repo.`]})]}),D&&s===`scripts`&&(0,Q.jsxs)(`div`,{className:`border rounded-lg p-3 flex gap-2 items-center bg-muted/50`,children:[(0,Q.jsx)(J,{placeholder:`on-image.sh`,value:ee,onChange:e=>F(e.target.value),className:`font-mono text-sm`}),(0,Q.jsx)(X,{size:`sm`,onClick:Ne,disabled:R,children:`Create`}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>O(!1),children:`Cancel`})]}),D&&s===`hooks`&&(0,Q.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-3 bg-muted/50`,children:[(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`text-xs font-semibold text-muted-foreground block mb-1`,children:`1. When (event)`}),(0,Q.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:j,onChange:e=>N(e.target.value),children:(k?.events??[]).map(e=>(0,Q.jsxs)(`option`,{value:e.name,children:[e.name,`: `,e.description]},e.name))}),k&&(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1 font-mono`,children:[`payload: `,k.events.find(e=>e.name===j)?.payload]}),(0,Q.jsx)(`label`,{className:`text-xs font-semibold text-muted-foreground block mt-3 mb-1`,children:`2. Name`}),(0,Q.jsx)(J,{placeholder:`my-hook`,value:ee,onChange:e=>F(e.target.value),className:`font-mono text-sm`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`text-xs font-semibold text-muted-foreground block mb-1`,children:`3. Then (actions; pick any)`}),(0,Q.jsx)(`div`,{className:`space-y-1 max-h-52 overflow-auto pr-1`,children:(k?.actions??[]).map(e=>(0,Q.jsxs)(`label`,{className:`flex items-start gap-2 text-sm rounded px-2 py-1 hover:bg-muted cursor-pointer`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,className:`mt-1`,checked:I.includes(e.id),onChange:()=>Pe(e.id)}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`span`,{className:`font-medium`,children:e.label}),(0,Q.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:e.description})]})]},e.id))})]})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(X,{size:`sm`,onClick:Fe,disabled:R||!k,children:R?`Creating…`:`Create skeleton`}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>O(!1),children:`Cancel`}),(0,Q.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,Q.jsx)(`span`,{className:`font-mono`,children:`rules.json`}),` (no code).`]})]})]}),xe&&(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:[(0,Q.jsx)(`div`,{className:`md:col-span-1 border rounded-lg p-2 max-h-[480px] overflow-auto`,children:h?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground p-2`,children:`Loading...`}):p.length===0?(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground p-2`,children:`No hooks yet.`}):Object.entries(Ie).map(([e,t])=>(0,Q.jsxs)(`div`,{className:`mb-2`,children:[(0,Q.jsx)(`div`,{className:`text-xs font-semibold text-muted-foreground px-2 py-1`,children:e}),t.map(e=>{let t=Gf(e.path);return(0,Q.jsxs)(`div`,{className:`flex items-center justify-between rounded px-2 py-1 cursor-pointer text-sm ${_===e.path?`bg-muted`:`hover:bg-muted/50`} ${t?``:`opacity-50`}`,onClick:()=>Te(e.path),children:[(0,Q.jsxs)(`span`,{className:`font-mono truncate flex items-center gap-1.5`,children:[e.path,s===`hooks`&&Kf(e.path)&&(0,Q.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,Q.jsxs)(`div`,{className:`flex items-center`,children:[s===`hooks`&&pp(e.path)&&(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,className:`h-6 w-6 p-0 touch-target`,title:pp(e.path)?.startsWith(`document.`)?`Run against up to ${he} existing documents`:`Run now`,disabled:pe!==null,onClick:t=>{t.stopPropagation(),Oe(e.path)},children:(0,Q.jsx)(Se,{className:`h-3 w-3 ${pe===e.path?`animate-pulse`:``}`})}),s===`hooks`&&(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,className:`h-6 w-6 p-0 touch-target`,title:t?`Disable`:`Enable`,onClick:t=>{t.stopPropagation(),De(e.path)},children:t?(0,Q.jsx)(dn,{className:`h-3 w-3`}):(0,Q.jsx)(C,{className:`h-3 w-3 text-muted-foreground`})}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,className:`h-6 w-6 p-0 text-destructive hover:text-destructive touch-target`,onClick:t=>{t.stopPropagation(),ke(e.path)},children:(0,Q.jsx)(rt,{className:`h-3 w-3`})})]})]},e.path)})]},e))}),(0,Q.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:_?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`mb-2 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Q.jsxs)(`span`,{className:`font-mono text-sm truncate`,children:[_,S?` •`:``]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-1`,children:[s===`hooks`&&pp(_)&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(X,{size:`sm`,variant:`outline`,className:`h-8`,title:Gf(_)?`Disable this hook (renames it with a disabled- prefix)`:`Enable this hook (strips the prefix)`,onClick:()=>De(_),children:Gf(_)?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(dn,{className:`mr-1.5 h-3.5 w-3.5`}),` Enabled`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(C,{className:`mr-1.5 h-3.5 w-3.5 text-muted-foreground`}),` Disabled`]})}),(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,className:`h-8`,title:`Run this hook now`,disabled:pe!==null||S,onClick:()=>Oe(_),children:[(0,Q.jsx)(Se,{className:`mr-1.5 h-3.5 w-3.5 ${pe===_?`animate-pulse`:``}`}),` Run`]})]}),(0,Q.jsxs)(X,{size:`sm`,onClick:Ee,disabled:T||!S,children:[(0,Q.jsx)(Ve,{className:`mr-2 h-4 w-4`}),` Save`]}),(0,Q.jsx)(X,{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,Q.jsx)(ut,{className:`h-4 w-4`}):(0,Q.jsx)(Sn,{className:`h-4 w-4`})})]})]}),(0,Q.jsx)(`div`,{className:`flex-1 overflow-auto rounded border text-sm ${le?``:`min-h-[400px] max-h-viewport-pane`}`,children:(0,Q.jsx)(TP,{value:b,path:_,onChange:e=>{x(e),w(!0)}})})]}):(0,Q.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,Q.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,Q.jsx)(Wn,{className:`h-3.5 w-3.5 shrink-0`}),(0,Q.jsx)(`span`,{children:`Apply / run in batches of`}),(0,Q.jsx)(J,{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,Q.jsx)(`span`,{children:`documents per pass — the rule "Apply" button and manual hook runs stop after that many.`})]}),(0,Q.jsxs)(`p`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,Q.jsx)(ie,{className:`h-3.5 w-3.5 shrink-0`}),(0,Q.jsxs)(`span`,{children:[`Everything here lives in the workspace git repo. Clone it with`,` `,(0,Q.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,Q.jsx)(`span`,{className:`font-mono`,children:`canvas@`}),` username is arbitrary but git needs one). Pushes hot-reload hooks.`]})]})]})}function IP({state:e}){if(e.error)return(0,Q.jsx)(`p`,{className:`text-xs text-destructive`,children:e.error});if(!e.run)return(0,Q.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,Q.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-1 text-muted-foreground`,children:[(0,Q.jsxs)(`span`,{children:[`run `,(0,Q.jsx)(`span`,{className:`font-mono`,children:t.runId})]}),(0,Q.jsxs)(`span`,{children:[`trigger `,(0,Q.jsx)(`span`,{className:`font-mono`,children:t.trigger})]}),t.eventId&&(0,Q.jsxs)(`span`,{children:[`event `,(0,Q.jsx)(`span`,{className:`font-mono`,children:t.eventId})]}),(0,Q.jsxs)(`span`,{children:[t.durationMs,` ms`]})]}),t.actions&&t.actions.length>0&&(0,Q.jsx)(`ol`,{className:`space-y-0.5 font-mono`,children:t.actions.map((e,t)=>(0,Q.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,Q.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,Q.jsxs)(`span`,{className:`block ${n[e.level]||``}`,children:[(0,Q.jsxs)(`span`,{className:`text-muted-foreground`,children:[`+`,String(e.t).padStart(5,` `),`ms `]}),(0,Q.jsxs)(`span`,{className:`uppercase text-muted-foreground`,children:[e.level.padEnd(5,` `),` `]}),e.msg]},t))}):(0,Q.jsxs)(`p`,{className:`text-muted-foreground`,children:[`No execution log recorded for this run`,t.error?``:` (older runs predate tracing)`,`.`]})]})}var LP=e=>`/workspaces/${e}/storage-policies`;function RP(){return`policy-${crypto.randomUUID().slice(0,8)}`}function zP(e){return e.filter(e=>e.enabled&&e.capabilities?.upload&&!e.config?.readOnly&&e.driver!==`cacache`)}var BP=new Set([`file`]);function VP(e,t){return`${e===`directory`?`dir`:`ctx`}:${t.startsWith(`/`)?t:`/${t}`}`}function HP(e){let t=/^(ctx|dir):(\/.*)$/.exec(e);return t?{tree:t[1]===`dir`?`directory`:`context`,path:t[2]}:null}function UP(e){return(HP(e)?.path??e).replace(/^\/+/,``)}function WP(e){return`${e.backend}:${e.folder||`/`}`}async function GP(e){let t=await Y.get(LP(e));return{...t,policies:t?.policies??[],revision:t.revision,blobBackend:t?.blobBackend??null}}async function KP(e,t,n){return Y.put(LP(e),{policies:t,revision:n})}async function qP(e,t,n={}){return await Y.post(`${LP(e)}/${encodeURIComponent(t)}/apply`,n)}async function JP(e,t,n){let{policies:r,revision:i}=n??await GP(e),a=r.findIndex(e=>e.id===t.id);return KP(e,a===-1?[...r,t]:r.map((e,n)=>n===a?t:e),i)}async function YP(e,t,n,r={}){let i={folders:0,processed:0,matched:0,failed:0},a=0;for(;a!==null;){let o=await qP(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 XP(e,t,n){let r=VP(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 ZP(e){let t=new Set;for(let n of e)for(let e of n.targets)t.add(WP(e));return[...t].join(`, `)}async function QP(e,t){await Y.post(`${LP(e)}/operations/${encodeURIComponent(t)}/retry`,{})}function $P(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 eF(e,t){return{backend:e?.address??``,folder:t,recursive:!0,recreateDirectories:!!e&&BP.has(e.driver),onConflict:`error`}}function tF({workspaceId:e,path:t,policy:n,onClose:r,onSaved:i}){let a=!!n,[o]=(0,Z.useState)(()=>n?.id??RP()),[s,c]=(0,Z.useState)(n?.kind||`mirror`),[l,u]=(0,Z.useState)(n?.description??``),[d,f]=(0,Z.useState)(n?.recursive??!0),[p,m]=(0,Z.useState)(()=>$P(n?.filter)),[h,g]=(0,Z.useState)(n?.filter?.mime??``),[_,v]=(0,Z.useState)(n?.filter?.filename??``),[y,b]=(0,Z.useState)(n?.targets??[]),[x,S]=(0,Z.useState)(null),[C,w]=(0,Z.useState)(null),[T,E]=(0,Z.useState)(!1),[D,O]=(0,Z.useState)(!1),[k,A]=(0,Z.useState)(!1),[j,M]=(0,Z.useState)(``),[N,P]=(0,Z.useState)(0),[ee,F]=(0,Z.useState)(0),[I,L]=(0,Z.useState)(0);Np(r,!D);let R=()=>{D||r()},te=(0,Z.useMemo)(()=>UP(t),[t]),z=(0,Z.useMemo)(()=>zP(C??[]).filter(e=>s===`filing`||e.driver===`file`),[C,s]),ne=(0,Z.useMemo)(()=>new Map(z.map(e=>[e.address,e])),[z]);(0,Z.useEffect)(()=>{let t=!1;return Promise.all([Eo(e),GP(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=zP(e).find(e=>n?.kind===`filing`||e.driver===`file`);i&&b(e=>e.length?e:[eF(i,te)])}).catch(e=>{t||(w([]),M(e instanceof Error?e.message:`Could not load backends`))}),()=>{t=!0}},[e,te,n]);let B=(e,t)=>b(n=>n.map((n,r)=>r===e?{...n,...t}:n)),re=(e,t)=>{let n=ne.get(t),r=!!n&&BP.has(n.driver);B(e,{backend:t,recreateDirectories:r?y[e].recreateDirectories:!1})},V=()=>{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}},ie=async()=>{if(!D){O(!0),M(``);try{let t=V();T||(await JP(e,t,x),E(!0),i?.(t)),P(0),F(0),L(0),await YP(e,o,(e,t)=>{P(t.matched),F(t.folders),L(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)}}},ae=!!x&&y.length>0&&y.every(e=>e.backend);return(0,Q.jsx)(Up,{onClose:R,children:(0,Q.jsxs)(`section`,{role:`dialog`,"aria-modal":`true`,"aria-labelledby":`storage-policy-title`,className:`${Hp} flex flex-col overflow-hidden rounded-(--panel-radius) border bg-card shadow-elevation-4`,children:[(0,Q.jsxs)(`div`,{className:`flex h-12 shrink-0 items-center justify-between border-b px-4`,children:[(0,Q.jsxs)(`h2`,{id:`storage-policy-title`,className:`flex items-center gap-2 text-sm font-medium`,children:[(0,Q.jsx)(pe,{className:`h-4 w-4`}),a?`Edit storage policy`:`Storage policy`]}),(0,Q.jsx)(`button`,{type:`button`,onClick:R,disabled:D,"aria-label":`Close`,className:`p-1 disabled:opacity-40`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-5 overflow-y-auto p-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Virtual path`}),(0,Q.jsx)(`p`,{className:`mt-1 break-words text-sm`,children:t})]}),(0,Q.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,Q.jsxs)(`fieldset`,{disabled:D||T,className:`space-y-3 text-sm`,children:[(0,Q.jsxs)(`label`,{className:`block`,children:[`Behavior`,(0,Q.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,Q.jsx)(`option`,{value:`mirror`,children:`Mirror (recoverable removal)`}),(0,Q.jsx)(`option`,{value:`filing`,children:`File copies (keep after unlink)`})]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-description`,children:`Description (optional)`}),(0,Q.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,Q.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:d,onChange:e=>f(e.target.checked),className:`mt-1`}),`Apply to subfolders`]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-filter`,children:`Documents`}),(0,Q.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,Q.jsx)(`option`,{value:`files`,children:`Files`}),(0,Q.jsx)(`option`,{value:`images`,children:`Images`}),(0,Q.jsx)(`option`,{value:`custom`,children:`Custom…`})]}),p===`custom`&&(0,Q.jsxs)(`div`,{className:`mt-2 grid grid-cols-2 gap-2`,children:[(0,Q.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,Q.jsx)(`input`,{"aria-label":`Filename glob`,className:`rounded-md border bg-background p-2`,value:_,onChange:e=>v(e.target.value),placeholder:`img*`})]})]})]}),(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(`h3`,{className:`text-sm font-medium`,children:`Targets`}),C===null&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading backends…`}),C!==null&&!z.length&&(0,Q.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=ne.get(e.backend),r=s===`mirror`&&!!n&&BP.has(n.driver);return(0,Q.jsxs)(`fieldset`,{disabled:D||T,className:`space-y-2 rounded-lg border p-2 text-sm`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsxs)(`select`,{"aria-label":`Backend`,className:`min-w-0 flex-1 rounded-md border bg-background p-2`,value:e.backend,onChange:e=>re(t,e.target.value),children:[!e.backend&&(0,Q.jsx)(`option`,{value:``,children:`Choose a backend…`}),z.map(e=>(0,Q.jsxs)(`option`,{value:e.address,children:[e.address,` (`,e.driver,`)`]},e.address)),e.backend&&!n&&(0,Q.jsxs)(`option`,{value:e.backend,children:[e.backend,` (unavailable)`]})]}),(0,Q.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,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-folder-${t}`,children:`Folder on the backend`}),(0,Q.jsx)(`input`,{id:`policy-folder-${t}`,className:`mt-1 w-full rounded-md border bg-background p-2`,value:e.folder,onChange:e=>B(t,{folder:e.target.value}),placeholder:`(backend root)`})]}),(0,Q.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:e.recursive,onChange:e=>B(t,{recursive:e.target.checked}),className:`mt-1`}),`Recreate sub-folder path in destination`]}),(0,Q.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,Q.jsx)(`input`,{type:`checkbox`,checked:r&&e.recreateDirectories,disabled:!r,onChange:e=>B(t,{recreateDirectories:e.target.checked}),className:`mt-1`}),`Create folders on the backend`]}),(0,Q.jsxs)(`details`,{children:[(0,Q.jsx)(`summary`,{className:`cursor-pointer text-xs text-muted-foreground`,children:`Advanced`}),(0,Q.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[s===`filing`&&(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-key-${t}`,children:`File-name template (optional)`}),(0,Q.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=>B(t,{key:e.target.value}),placeholder:`{{YYYY}}{{MM}}{{DD}}_{{basename}}{{ext}}`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-conflict-${t}`,children:`On name conflict`}),(0,Q.jsxs)(`select`,{id:`policy-conflict-${t}`,className:`mt-1 w-full rounded-md border bg-background p-2`,value:e.onConflict??`error`,onChange:e=>B(t,{onConflict:e.target.value}),children:[(0,Q.jsx)(`option`,{value:`error`,children:`Stop with an error`}),(0,Q.jsx)(`option`,{value:`rename`,children:`Rename the new file`}),n?.driver===`file`&&(0,Q.jsx)(`option`,{value:`overwrite`,children:`Overwrite (retain previous bytes)`})]})]})]})]})]},t)}),!T&&(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,disabled:D||!z.length,onClick:()=>b(e=>[...e,eF(z.find(t=>!e.some(e=>e.backend===t.address))??z[0],te)]),children:[(0,Q.jsx)(cn,{className:`mr-1 h-4 w-4`}),`Add target…`]})]}),(0,Q.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,Q.jsx)(`p`,{role:`status`,className:`text-sm`,children:T?`Applying to existing documents… ${N} planned, ${ee} folders`:`Saving storage policy…`}),k&&(0,Q.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,Q.jsxs)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:[I,` document operations failed. Check operation status in Storage policies settings.`]}),j&&(0,Q.jsxs)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:[T?`The policy is saved. `:``,j]})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 justify-end gap-2 border-t p-3`,children:[(0,Q.jsx)(X,{variant:`ghost`,disabled:D,onClick:R,children:`Cancel`}),k?(0,Q.jsx)(X,{onClick:r,children:`Done`}):(0,Q.jsx)(X,{disabled:D||!ae,onClick:ie,children:D?`Applying…`:T?`Retry existing documents`:a?`Save policy`:`Enable policy`})]})]})})}var nF={policies:[],revision:``,loading:!1,error:``},rF=new Map,iF=new Set;function aF(){for(let e of iF)e()}function oF(e){return iF.add(e),()=>{iF.delete(e)}}function sF(e,t){rF.set(e,t),aF()}async function cF(e){sF(e,{...rF.get(e)??nF,loading:!0,error:``});try{let{policies:t,revision:n,status:r}=await GP(e);sF(e,{policies:t,revision:n,status:r,loading:!1,error:``})}catch(t){sF(e,{policies:[],revision:``,loading:!1,error:t instanceof Error?t.message:`Could not load storage policies`})}}function lF(e){rF.delete(e),aF()}function uF(e){let t=(0,Z.useSyncExternalStore)(oF,()=>e&&rF.get(e)||nF),n=!!e&&!rF.has(e);(0,Z.useEffect)(()=>{e&&n&&cF(e)},[e,n]);let r=(0,Z.useCallback)(async()=>{e&&await cF(e)},[e]);return(0,Z.useEffect)(()=>{if(!e||!t.policies.length)return;let n=window.setInterval(()=>{!document.hidden&&!rF.get(e)?.loading&&cF(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 dF({checked:e,disabled:t,onClick:n,label:r}){return(0,Q.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,Q.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 fF({children:e,title:t}){return(0,Q.jsx)(`span`,{title:t,className:`rounded border px-1 py-px text-[10px] uppercase tracking-wide text-muted-foreground`,children:e})}function pF(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 mF({workspaceId:e}){let{policies:t,revision:n,status:r,loading:i,error:a,refresh:o}=uF(e),{showToast:s}=Hr(),[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.useState)(null),[f,p]=(0,Z.useState)(``),m=(e,t)=>s({title:`Error`,description:e instanceof Error?e.message:t,variant:`destructive`}),h=async r=>{d(r.id);try{await KP(e,t.map(e=>e.id===r.id?{...e,enabled:!e.enabled}:e),n),lF(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 KP(e,t.filter(e=>e.id!==r.id),n),lF(e)}catch(e){m(e,`Could not delete the policy`)}finally{d(null)}}},_=async t=>{d(t.id),p(`Applying…`);try{let n=await YP(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,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(pe,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Storage policies`})]}),(0,Q.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,Q.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,Q.jsxs)(`div`,{className:`mt-2 rounded border p-2 text-xs`,children:[(0,Q.jsxs)(`p`,{children:[t.owner,`: `,t.state]}),(0,Q.jsx)(`p`,{children:t.error?.message}),t.outcomes.map(e=>(0,Q.jsxs)(`p`,{children:[e.backend,`:`,e.key,` — `,e.state]},`${e.backend}:${e.key}`)),t.state===`blocked`&&(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>{QP(e,t.id).then(o).catch(e=>m(e,`Retry failed`))},children:`Retry`})]},t.id)),a&&(0,Q.jsx)(`p`,{role:`alert`,className:`mt-2 text-xs text-destructive`,children:a})]}),i&&!t.length&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading…`}),!i&&!t.length&&(0,Q.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Q.jsx)(pe,{className:`mx-auto h-6 w-6 text-muted-foreground`}),(0,Q.jsx)(`p`,{className:`mt-2 text-sm`,children:`No storage policies yet.`}),(0,Q.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Right-click a folder in the context or directory tree and choose `,(0,Q.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,Q.jsxs)(`section`,{className:`rounded-lg border p-4 ${e.enabled?``:`opacity-70`}`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(`h3`,{className:`break-all font-mono text-sm font-semibold`,children:e.path}),e.recursive&&(0,Q.jsx)(fF,{children:`subfolders`}),(0,Q.jsx)(fF,{children:pF(e)}),!e.enabled&&(0,Q.jsx)(fF,{children:`disabled`})]}),e.description&&(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:e.description}),(0,Q.jsx)(`ul`,{className:`mt-2 space-y-1`,children:e.targets.map((e,t)=>(0,Q.jsxs)(`li`,{className:`flex flex-wrap items-center gap-2 text-xs`,children:[(0,Q.jsx)(`span`,{className:`font-mono`,children:WP(e)}),e.recursive&&(0,Q.jsx)(fF,{children:`sub-path`}),e.recreateDirectories&&(0,Q.jsx)(fF,{children:`folders`}),e.key&&(0,Q.jsx)(fF,{title:e.key,children:`named`}),e.onConflict&&e.onConflict!==`error`&&(0,Q.jsx)(fF,{children:e.onConflict})]},`${e.backend}:${t}`))}),t&&f&&(0,Q.jsx)(`p`,{role:`status`,className:`mt-2 text-xs text-muted-foreground`,children:f})]}),(0,Q.jsx)(dF,{checked:e.enabled,disabled:t,onClick:()=>h(e),label:e.enabled?`Disable policy`:`Enable policy`})]}),(0,Q.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2`,children:[(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,disabled:t,onClick:()=>l(e),children:[(0,Q.jsx)(ve,{className:`mr-1 h-3.5 w-3.5`}),`Edit`]}),(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,disabled:t||!e.enabled,onClick:()=>_(e),children:[(0,Q.jsx)(Se,{className:`mr-1 h-3.5 w-3.5`}),`Apply to existing`]}),(0,Q.jsxs)(X,{variant:`ghost`,size:`sm`,onClick:()=>{o()},children:[(0,Q.jsx)(Kt,{className:`mr-1 h-3.5 w-3.5`}),`Refresh status`]}),(0,Q.jsxs)(X,{variant:`ghost`,size:`sm`,disabled:t,className:`text-destructive`,onClick:()=>g(e),children:[(0,Q.jsx)(rt,{className:`mr-1 h-3.5 w-3.5`}),`Delete`]})]})]},e.id)}),c&&(0,Q.jsx)(tF,{workspaceId:e,path:c.path,policy:c,onClose:()=>l(null),onSaved:()=>{lF(e),o()}})]})}var hF=e=>`${Sr.workspaces}/${encodeURIComponent(e)}`;async function gF(e){return await Y.get(`${hF(e)}/mirrors`)||[]}async function _F(e,t){await Y.delete(`${hF(e)}/mirrors/${encodeURIComponent(t)}`)}async function vF(e,t=10){return Y.get(`${hF(e)}/mirrors/protection?sample=${t}`)}async function yF(e,t,n){return(await Y.patch(`${hF(e)}/mirrors/${encodeURIComponent(t)}`,n)).replica}async function bF(e){return await Y.get(`${hF(e)}/sync/conflicts`)||[]}async function xF(e,t,n){return Y.post(`${hF(e)}/sync/conflicts/${t}/resolve`,{keep:n})}var SF=e=>{if(e==null||e===``)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?`—`:t.toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})},CF=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`,wF=e=>e?e.slice(0,12):`—`;function TF({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,Q.jsx)(`div`,{className:`rounded-lg border p-3`,children:(0,Q.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start gap-3 min-w-0`,children:[(0,Q.jsx)(Tt,{className:`h-4 w-4 text-muted-foreground mt-0.5 shrink-0`}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:e.name||e.deviceId}),a.client&&(0,Q.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] font-mono uppercase`,children:a.client}),l&&(0,Q.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,Q.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,Q.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,Q.jsx)(`p`,{className:`mt-0.5 text-[11px] font-mono text-muted-foreground truncate`,children:a.path}),(0,Q.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-x-4 gap-y-0.5 text-[11px] text-muted-foreground`,children:[(0,Q.jsxs)(`span`,{title:`Change-log entries the device has not applied yet`,children:[`lag `,e.lag??`—`]}),(0,Q.jsxs)(`span`,{title:`Local changes waiting to be pushed`,children:[`pending `,a.pending??0]}),(a.failed??0)>0&&(0,Q.jsxs)(`span`,{className:`text-destructive`,children:[`failed `,a.failed]}),(a.conflicts??0)>0&&(0,Q.jsxs)(`span`,{className:`text-amber-600 dark:text-amber-400`,children:[`conflicts `,a.conflicts]}),(a.skipped??0)>0&&(0,Q.jsxs)(`span`,{children:[`skipped `,a.skipped]}),(a.reverted??0)>0&&(0,Q.jsxs)(`span`,{title:`Local edits parked in .workspace/conflicts and replaced by the hub version`,children:[`reverted `,a.reverted]}),e.behind!=null&&(0,Q.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,Q.jsxs)(`span`,{children:[`last sync `,SF(a.lastSync)]}),(0,Q.jsxs)(`span`,{children:[`seen `,SF(e.lastSeen)]}),a.prefixes&&a.prefixes.length>0&&(0,Q.jsx)(`span`,{className:`font-mono`,children:a.prefixes.join(`, `)})]}),a.lastError&&(0,Q.jsx)(`p`,{className:`mt-1 text-[11px] text-destructive`,children:a.lastError}),(0,Q.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,Q.jsx)(`input`,{type:`checkbox`,className:`h-3 w-3`,checked:c,disabled:n||s,onChange:e=>i(e.target.checked)}),`required for protection`]})]})]}),(0,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`sm`,onClick:r,disabled:n,title:`Forget this mirror record (the device is not revoked)`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]})})}function EF({p:e}){let t=e.required.length===0,n=e.unprotected??0,r=t||n>0?Wt:Ft,i=t?`text-muted-foreground`:n>0?`text-amber-600 dark:text-amber-400`:`text-emerald-700 dark:text-emerald-300`;return(0,Q.jsx)(`div`,{className:`rounded-lg border p-3`,children:(0,Q.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,Q.jsx)(r,{className:`h-4 w-4 mt-0.5 shrink-0 ${i}`}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1 text-[11px]`,children:[t?(0,Q.jsxs)(`p`,{className:`text-sm`,children:[`No replica is marked `,(0,Q.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,Q.jsxs)(`p`,{className:`text-sm`,children:[(0,Q.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,Q.jsxs)(`span`,{className:i,children:[` · `,n,` not yet`]}),e.partial&&(0,Q.jsxs)(`span`,{className:`text-muted-foreground`,children:[` (first `,e.total,` checked)`]})]}),e.oldestUnprotected.length>0&&(0,Q.jsxs)(`ul`,{className:`mt-1 space-y-0.5 font-mono text-muted-foreground`,children:[e.oldestUnprotected.slice(0,5).map(e=>(0,Q.jsxs)(`li`,{className:`truncate`,title:`document ${e.docId} v${e.version}`,children:[e.key,` `,(0,Q.jsxs)(`span`,{className:`opacity-70`,children:[`· `,SF(e.mtime)]})]},`${e.docId}:${e.key}`)),e.oldestUnprotected.length>5&&(0,Q.jsxs)(`li`,{children:[`… and `,e.oldestUnprotected.length-5,` more`]})]})]})]})})}function DF({conflict:e,busy:t,onResolve:n}){let r=!e.hub;return(0,Q.jsxs)(`div`,{className:`rounded-lg border p-3 space-y-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,Q.jsx)(U,{className:`h-4 w-4 text-amber-500 mt-0.5 shrink-0`}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`p`,{className:`text-sm font-medium font-mono break-all`,children:e.key}),(0,Q.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`from `,(0,Q.jsx)(`span`,{className:`font-medium`,children:e.deviceName||e.device||`unknown device`}),` · `,SF(e.ts),e.mode===`rename`&&e.conflictKey&&(0,Q.jsxs)(Q.Fragment,{children:[` · already on disk as `,(0,Q.jsx)(`span`,{className:`font-mono`,children:e.conflictKey})]})]})]})]}),(0,Q.jsxs)(`div`,{className:`grid grid-cols-1 gap-2 text-[11px] sm:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{className:`rounded border border-dashed p-2`,children:[(0,Q.jsx)(`div`,{className:`text-muted-foreground`,children:`Hub version (keeps the name)`}),e.hub?(0,Q.jsxs)(`div`,{className:`font-mono`,children:[wF(e.hub.sha256),` · `,CF(e.hub.size),` · `,SF(e.hub.mtime)]}):(0,Q.jsx)(`div`,{className:`italic text-muted-foreground`,children:`no file at this key any more`})]}),(0,Q.jsxs)(`div`,{className:`rounded border border-dashed p-2`,children:[(0,Q.jsx)(`div`,{className:`text-muted-foreground`,children:`Incoming version (the device’s)`}),(0,Q.jsxs)(`div`,{className:`font-mono`,children:[wF(e.incoming.sha256),` · `,CF(e.incoming.size),` · `,SF(e.incoming.mtime)]})]})]}),e.resolvable?(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:t||r,onClick:()=>n(`hub`),title:`Discard the device's version`,children:`Keep hub`}),(0,Q.jsx)(X,{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,Q.jsx)(X,{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,Q.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 OF({workspaceId:e,workspaceUuid:t}){let{showToast:n}=Hr(),[r,i]=(0,Z.useState)([]),[a,o]=(0,Z.useState)([]),[s,c]=(0,Z.useState)(null),[l,u]=(0,Z.useState)(!1),[d,f]=(0,Z.useState)(null),[p,m]=(0,Z.useState)(0),h=(0,Z.useRef)(null),g=(0,Z.useCallback)(async(t=!1)=>{if(e){t||u(!0);try{let[t,n,r]=await Promise.all([gF(e),bF(e),vF(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,Z.useEffect)(()=>{g()},[g]),(0,Z.useEffect)(()=>{if(!t)return;let e=`workspace:${t}`,n=()=>pd.emit(`subscribe`,{channel:e}),r=pd.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=>pd.on(e,i));return()=>{r(),a.forEach(e=>e()),pd.emit(`unsubscribe`,{channel:e}),h.current&&=(clearTimeout(h.current),null)}},[t,g]);let _=async t=>{f(`mirror:${t}`);try{await _F(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 yF(e,t,{required:r});i(e=>e.map(e=>e.deviceId===t?{...e,replica:{role:n.role,required:n.required}}:e)),c(await vF(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 xF(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,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Device mirrors`}),(0,Q.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Devices keeping this workspace’s files in sync (canvas-fuse `,(0,Q.jsx)(`span`,{className:`font-mono`,children:`--mirror`}),`, canvas-edge). Lag counts change-log entries the device has not applied yet.`]})]}),(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>g(),disabled:l,children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5 ${l?`animate-spin`:``}`}),`Refresh`]})]}),l&&r.length===0&&a.length===0?(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Q.jsx)(P,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):r.length===0?(0,Q.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,Q.jsx)(`span`,{className:`font-mono`,children:`canvas-fuse mount -w <workspace> ~/Workspaces --mirror`}),` on a device and it shows up here.`]}):(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[s&&(0,Q.jsx)(EF,{p:s}),r.map(e=>(0,Q.jsx)(TF,{mirror:e,now:p,busy:d===`mirror:${e.deviceId}`,onForget:()=>_(e.deviceId),onRequired:t=>v(e.deviceId,t)},e.deviceId))]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Conflicts`}),(0,Q.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,Q.jsx)(`div`,{className:`rounded-lg border border-dashed p-4 text-xs text-muted-foreground`,children:`Nothing to resolve.`}):(0,Q.jsx)(`div`,{className:`space-y-2`,children:a.map(e=>(0,Q.jsx)(DF,{conflict:e,busy:d===`conflict:${e.docId}`,onResolve:t=>y(e,t)},e.docId))})]})}function kF({workspaceId:e,address:t,selectedChats:n=[],onSaved:r}){let[i,a]=(0,Z.useState)(n),[o,s]=(0,Z.useState)(!1),[c,l]=(0,Z.useState)(!1),[u,d]=(0,Z.useState)(null),[f,p]=(0,Z.useState)(``);return(0,Z.useEffect)(()=>{if(!c)return;let n=!1,r,i=async()=>{try{let r=await hv(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,Q.jsxs)(`div`,{className:`mb-2`,children:[(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>{c||a(n),l(!c)},children:c?`Close connection panel`:`Pair / connection status`}),c&&(0,Q.jsxs)(`div`,{className:`space-y-2 p-2 text-xs`,children:[(0,Q.jsx)(`p`,{children:f||u?.state||`Connecting…`}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>{window.confirm(`Forget the current session and pair this account again?`)&&_v(e,t).catch(e=>p(e.message))},children:`Pair again`}),u?.qr&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`p`,{children:`WhatsApp → Settings → Linked devices → Link a device.`}),(0,Q.jsx)(`img`,{className:`max-w-full`,src:u.qr,width:256,height:256,alt:`WhatsApp device pairing QR code`})]}),u?.chats.length?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`p`,{children:`Select conversations to synchronize into this workspace.`}),(0,Q.jsx)(`div`,{className:`max-h-48 overflow-auto`,children:u.chats.map(e=>(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.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,Q.jsx)(`code`,{children:e.id})]},e.id))}),(0,Q.jsx)(X,{size:`sm`,disabled:o,onClick:async()=>{s(!0),p(``);try{await Ea(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,Q.jsx)(`p`,{children:`No conversations selected; messages will not be synchronized.`})]}):null]})]})}async function AF(){return(await Y.get(`/oauth/google/redirect-uri`)).redirectUri}async function jF(e){let t=window.open(`about:blank`,`canvas-google-oauth`,`popup=yes,width=540,height=720`),n;try{n=await Y.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(Rr,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 MF({clientId:e,clientSecret:t,scope:n,onLinked:r,disabled:i}){let[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)(null),{showToast:l}=Hr(),u=e.trim().length>0&&t.trim().length>0;(0,Z.useEffect)(()=>{let e=!1;return AF().then(t=>{e||c(t)}).catch(()=>{}),()=>{e=!0}},[]);let d=async()=>{o(!0);try{let i=await jF({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,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsxs)(X,{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,Q.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,Q.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,Q.jsx)(`code`,{className:`select-all`,children:s})]})]})}var NF={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 PF(e){return e.split(/[\n,]/).map(e=>e.trim()).filter(Boolean)}function FF({workspaceId:e}){let{showToast:t}=Hr(),[n,r]=(0,Z.useState)([]),[i,a]=(0,Z.useState)(null),[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)({}),[u,d]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)(!1),h=(0,Z.useCallback)(async()=>{let t=await Eo(e).catch(()=>[]);r(t.filter(e=>e.kind===`connector`))},[e]),g=async()=>{m(!0);try{await h()}finally{m(!1)}};(0,Z.useEffect)(()=>{let t=!1;return Eo(e).then(e=>{t||r(e.filter(e=>e.kind===`connector`))}).catch(()=>{}),()=>{t=!0}},[e]);let _=n.some(e=>e.status===`syncing`);(0,Z.useEffect)(()=>{if(!_)return;let e=setInterval(()=>{h()},4e3);return()=>clearInterval(e)},[_,h]);let v=e=>{let t=NF[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(`
42
- `):``;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=NF[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?PF(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 Ea(e,o.driver,o.address,r):await ja(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 Ea(e,n.driver,n.address,{enabled:!0}):await Va(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 Zi(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,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Connectors`}),(0,Q.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,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:p,onClick:()=>{g()},title:`Refresh`,children:(0,Q.jsx)(P,{className:`h-3.5 w-3.5 ${p?`animate-spin`:``}`})})]}),n.length>0&&(0,Q.jsx)(`div`,{className:`mt-3 space-y-2`,children:n.map(t=>{let n=NF[t.driver];return(0,Q.jsxs)(`div`,{className:`rounded-md border p-3`,children:[t.driver===`whatsapp`&&(0,Q.jsx)(kF,{workspaceId:e,address:t.address,selectedChats:Array.isArray(t.config?.chats)?t.config.chats:[],onSaved:h}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(f,{icon:n?.icon||`mdi:cloud-sync`,width:16,height:16,className:`shrink-0`}),(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:n?.label||t.driver}),(0,Q.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:t.address}),(0,Q.jsx)(`span`,{className:`flex-1`}),(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:t.status===`syncing`,onClick:()=>{x(t)},children:[(0,Q.jsx)(P,{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,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>v(t),title:`Edit connector`,children:(0,Q.jsx)(ve,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(X,{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,Q.jsx)(rt,{className:`h-3.5 w-3.5 text-destructive`})})]}),(0,Q.jsxs)(`div`,{className:`mt-1.5 flex flex-wrap gap-2 text-[11px] text-muted-foreground`,children:[(0,Q.jsxs)(`span`,{children:[`status: `,t.status]}),t.lastSyncAt&&(0,Q.jsxs)(`span`,{children:[`last sync: `,new Date(t.lastSyncAt).toLocaleString()]}),t.treePath&&(0,Q.jsx)(`span`,{className:`font-mono`,children:t.treePath})]}),t.lastError&&(0,Q.jsx)(`p`,{className:`mt-1 text-[11px] text-destructive`,children:t.lastError})]},`${t.driver}:${t.address}`)})}),i?(0,Q.jsxs)(`div`,{className:`mt-3 rounded-md border p-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(f,{icon:NF[i].icon,width:16,height:16}),(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:o?`Edit ${NF[i].label}`:NF[i].label}),o&&(0,Q.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:o.address}),(0,Q.jsx)(`span`,{className:`flex-1`}),(0,Q.jsx)(`button`,{type:`button`,onClick:y,className:`p-1 text-muted-foreground hover:text-foreground`,"aria-label":`Cancel`,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:NF[i].blurb}),(0,Q.jsx)(`div`,{className:`mt-2 grid gap-2 sm:grid-cols-2`,children:NF[i].fields.map(e=>(0,Q.jsxs)(`label`,{className:`text-xs ${e.list||e.bool?`sm:col-span-2`:``}`,children:[!e.bool&&(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:e.label}),e.bool?(0,Q.jsxs)(`span`,{className:`mt-1 flex items-center gap-2`,children:[(0,Q.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,Q.jsx)(`span`,{children:e.label})]}):e.list?(0,Q.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,Q.jsx)(J,{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,Q.jsx)(`span`,{className:`mt-0.5 block text-[11px] text-muted-foreground/80`,children:e.hint}),e.oauth===`google`&&(0,Q.jsx)(`span`,{className:`mt-1.5 block`,children:(0,Q.jsx)(MF,{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,Q.jsx)(X,{type:`button`,size:`sm`,className:`mt-3`,disabled:u,onClick:()=>{b()},children:u?`Saving…`:o?`Save changes & sync`:`Save & sync`})]}):(0,Q.jsx)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:Object.entries(NF).map(([e,t])=>(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{a(e),l({})},children:[(0,Q.jsx)(cn,{className:`mr-1 h-3 w-3`}),(0,Q.jsx)(f,{icon:t.icon,width:14,height:14,className:`mr-1`}),t.label]},e))})]})}var IF={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 LF(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:{...IF.smtp,...t.smtp||{},password:``}}}function RF(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 zF({workspaceId:e,enabled:t}){let[n,r]=(0,Z.useState)([]),[i,a]=(0,Z.useState)([]);(0,Z.useEffect)(()=>{let t=!0;return Eo(e).then(e=>{t&&a(e.filter(e=>e.kind===`storage`))}).catch(()=>{}),()=>{t=!1}},[e]);let[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.useState)(!1),[f,p]=(0,Z.useState)(IF),[m,h]=(0,Z.useState)(!1),[g,_]=(0,Z.useState)(!1),[v,y]=(0,Z.useState)(!1),b=(0,Z.useRef)(0),[x,S]=(0,Z.useState)([]),[C,w]=(0,Z.useState)([`INBOX`]),[T,E]=(0,Z.useState)(!0),[D,O]=(0,Z.useState)(!1),[k,A]=(0,Z.useState)(!1),[j,M]=(0,Z.useState)(null),{showToast:N,showProgress:ee}=Hr(),F=(0,Z.useMemo)(()=>[...n].sort((e,t)=>e.address.localeCompare(t.address)),[n]),I=(0,Z.useMemo)(()=>n.find(e=>e.address===c)||null,[n,c]),L=(0,Z.useCallback)(()=>Eo(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]),R=(0,Z.useCallback)(async()=>{E(!0),await L()},[L]),[te,z]=(0,Z.useState)(e);e!==te&&(z(e),E(!0),l(null),d(!1),p(IF),S([]),w([`INBOX`]),y(!1),h(!1),_(!1)),(0,Z.useEffect)(()=>{L()},[L]),(0,Z.useEffect)(()=>()=>{b.current++},[e]);let ne=(0,Z.useCallback)(async(t,n)=>{let r=++b.current;O(!0);try{let i=t?await vo(e,`imap`,t.address):await Oi(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]),B=()=>{b.current++,O(!1),d(!1),l(null),p(IF),S([]),w([`INBOX`]),h(!1),_(!1),y(!1)},re=e=>{if(!k){if(c===e.address){B();return}b.current++,O(!1),d(!1),l(e.address),p(LF(e)),S([]),w((e.containers||[]).map(e=>e.name)),h(!1),_(!1),y(!1)}},V=()=>{B(),d(!0)},ie=(e,t)=>{y(!0),p(n=>({...n,[e]:t}))},ae=e=>{y(!0),w(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},oe=(0,Z.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]),H=async()=>{A(!0);try{let t=C.length?C:[`INBOX`],n=RF(f,!!I,m,g);if(I){await Ea(e,`imap`,I.address,n);let r=new Set((I.containers||[]).map(e=>e.name)),i=t.filter(e=>!r.has(e)),a=[...r].filter(e=>!t.includes(e));i.length&&await ca(e,`imap`,I.address,i);for(let t of a)await vi(e,`imap`,I.address,t)}else{await ja(e,`imap`,{...n,password:f.password,folder:t[0]});let r=f.user.trim();t.length>1&&await ca(e,`imap`,r,t.slice(1))}await R(),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)}},se=async()=>{if(!(!I||!window.confirm(`Delete IMAP account ${I.address} and all its folders?`))){M(`delete:${I.address}`);try{await Zi(e,`imap`,I.address),await R(),B(),N({title:`Deleted`,description:`IMAP account ${I.address} deleted`})}catch(e){N({title:`Error`,description:e instanceof Error?e.message:`Failed to delete account`,variant:`destructive`})}finally{M(null)}}},ce=async(t,n)=>{M(`${t}:${n}`);try{t===`test`?await va(e,`imap`,n):await Cb(ee,e,`imap`,n,e=>{r(t=>t.map(t=>t.address===n?e:t))}),await R(),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)}},U=async(t,n)=>{M(`folder-sync:${t}:${n}`);try{await mo(e,`imap`,t,n),await R(),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)}},le=(0,Q.jsxs)(`form`,{className:`grid gap-3`,autoComplete:`off`,"aria-label":`IMAP account settings`,onSubmit:e=>e.preventDefault(),children:[(0,Q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Q.jsx)($,{htmlFor:`imap-host`,children:`Host`}),(0,Q.jsx)(J,{id:`imap-host`,name:`imap-host`,autoComplete:`off`,value:f.host,readOnly:!!I,onChange:e=>ie(`host`,e.target.value),placeholder:`imap.example.com`})]}),(0,Q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Q.jsx)($,{htmlFor:`imap-user`,children:`User (account)`}),(0,Q.jsx)(J,{id:`imap-user`,name:`imap-username`,autoComplete:`section-imap username`,value:f.user,readOnly:!!I,onChange:e=>ie(`user`,e.target.value),placeholder:`me@example.com`})]}),(0,Q.jsx)(`div`,{className:`grid gap-2`,children:!I||m?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)($,{htmlFor:`imap-password`,children:I?`New IMAP password`:`Password`}),(0,Q.jsx)(J,{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=>ie(`password`,e.target.value),placeholder:I?`Leave blank to keep current password`:`Password`})]}):(0,Q.jsxs)(`div`,{className:`flex items-center gap-3 text-sm`,children:[(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`Saved IMAP password`}),(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>h(!0),children:`Change IMAP password`})]})}),(0,Q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Q.jsx)($,{htmlFor:`imap-port`,children:`Port`}),(0,Q.jsx)(J,{id:`imap-port`,type:`number`,value:String(f.port),onChange:e=>ie(`port`,Number(e.target.value||993))})]}),(0,Q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsx)($,{children:`Folders to sync`}),(0,Q.jsxs)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>void ne(I,f),disabled:D||!!I&&v||!I&&(!f.host.trim()||!f.user.trim()||!f.password),children:[D?(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}):(0,Q.jsx)(ct,{className:`h-3 w-3`}),` Discover folders`]})]}),(0,Q.jsx)(`div`,{className:`max-h-56 overflow-y-auto rounded-md border p-2`,children:oe.length===0?(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:D?`Discovering folders…`:I?`No folders found on the server.`:`Fill in host, user and password, then discover the account’s folders. INBOX is synced by default.`}):(0,Q.jsx)(`div`,{className:`space-y-0.5`,children:oe.map(e=>{let t=e.path.split(e.delimiter||`/`).length-1,n=x.some(t=>t.path===e.path);return(0,Q.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,Q.jsx)(`input`,{type:`checkbox`,checked:C.includes(e.path),onChange:()=>ae(e.path)}),(0,Q.jsx)(`span`,{className:`font-mono truncate`,children:e.path}),!n&&x.length>0&&(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:`(subscribed, not on server)`})]},e.path)})})}),(0,Q.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,Q.jsxs)(`fieldset`,{className:`rounded border p-3 space-y-3 sm:col-span-2`,children:[(0,Q.jsx)(`legend`,{className:`px-1 text-sm font-medium`,children:`Outgoing email (SMTP)`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:!I||!f.smtp.enabled||k,onClick:()=>s(I.address),children:`Send test email`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Save your SMTP settings before testing. The test uses the saved account.`}),o&&(0,Q.jsx)(wv,{workspaceId:e,initialAccount:{driver:`imap`,address:o},testEmail:!0,onClose:()=>s(null)}),(0,Q.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:f.smtp.enabled,onChange:e=>ie(`smtp`,{...f.smtp,enabled:e.target.checked})}),`Allow sending from Canvas`]}),(0,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[[`host`,`user`,`from`,`sentFolder`].map(e=>(0,Q.jsxs)(`label`,{className:`text-xs`,children:[{host:`SMTP host`,user:`SMTP username`,from:`From address`,sentFolder:`Sent folder`}[e],(0,Q.jsx)(J,{name:`smtp-${e}`,value:f.smtp[e],autoComplete:e===`user`?`section-smtp username`:`off`,onChange:t=>ie(`smtp`,{...f.smtp,[e]:t.target.value})})]},e)),f.smtp.enabled&&(!I||g)&&(0,Q.jsxs)(`label`,{className:`text-xs`,children:[`SMTP password (blank keeps current)`,(0,Q.jsx)(J,{name:`smtp-password`,type:`password`,autoComplete:`section-smtp new-password`,"data-lpignore":`true`,"data-1p-ignore":`true`,value:f.smtp.password,onChange:e=>ie(`smtp`,{...f.smtp,password:e.target.value})})]}),I&&f.smtp.enabled&&!g&&(0,Q.jsx)(X,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>_(!0),children:`Change SMTP password`}),(0,Q.jsxs)(`label`,{className:`text-xs`,children:[`Port`,(0,Q.jsx)(J,{type:`number`,min:1,max:65535,value:f.smtp.port,onChange:e=>ie(`smtp`,{...f.smtp,port:Number(e.target.value)})})]})]}),(0,Q.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:f.smtp.secure,onChange:e=>ie(`smtp`,{...f.smtp,secure:e.target.checked})}),`Implicit TLS (usually port 465; otherwise STARTTLS is required)`]}),(0,Q.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:f.smtp.appendSent,onChange:e=>ie(`smtp`,{...f.smtp,appendSent:e.target.checked})}),`Save a copy in the IMAP Sent folder (leave off if your provider does this automatically)`]}),(0,Q.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:f.smtp.allowAgentSend,onChange:e=>ie(`smtp`,{...f.smtp,allowAgentSend:e.target.checked})}),`Allow agents with workspace write access to send`]})]}),(0,Q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Q.jsx)($,{htmlFor:`imap-lookback`,children:`Sync lookback (days)`}),(0,Q.jsx)(J,{id:`imap-lookback`,type:`number`,min:`0`,value:String(f.initialSyncDays),onChange:e=>ie(`initialSyncDays`,Number(e.target.value||0))}),(0,Q.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,Q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Q.jsx)($,{htmlFor:`imap-poll`,children:`Poll interval (ms)`}),(0,Q.jsx)(J,{id:`imap-poll`,type:`number`,value:String(f.pollInterval),onChange:e=>ie(`pollInterval`,Number(e.target.value||6e4))})]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-4 text-xs`,children:[(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:f.tls,onChange:e=>ie(`tls`,e.target.checked)}),` TLS`]}),(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:f.allowSelfSigned,onChange:e=>ie(`allowSelfSigned`,e.target.checked)}),` Allow self-signed`]})]})]});return(0,Q.jsxs)(`div`,{className:`space-y-3 border-t pt-4`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`h4`,{className:`text-sm font-medium`,children:`IMAP Accounts`}),(0,Q.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,Q.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,Q.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,onClick:u?B:V,children:[(0,Q.jsx)(xt,{className:`h-3 w-3`}),` `,u?`Cancel`:`New Account`]}),(0,Q.jsxs)(X,{size:`sm`,variant:`ghost`,onClick:R,disabled:T,children:[T?(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}):(0,Q.jsx)(P,{className:`h-3 w-3`}),` Refresh`]})]}),(0,Q.jsx)(`div`,{className:`rounded-md border`,children:(0,Q.jsx)(`div`,{className:`max-h-[32rem] overflow-y-auto p-2 space-y-1`,children:F.length===0?(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No IMAP accounts configured.`}):F.map(t=>{let n=c===t.address;return(0,Q.jsxs)(`div`,{className:`rounded px-2 py-2 text-xs transition-colors ${n?`bg-accent/40`:`hover:bg-accent/50`}`,children:[(0,Q.jsxs)(`button`,{onClick:()=>re(t),className:`w-full text-left`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Q.jsxs)(`span`,{className:`flex items-center gap-1.5 font-medium`,children:[n?(0,Q.jsx)(Ze,{className:`h-3 w-3 shrink-0`}):(0,Q.jsx)(gr,{className:`h-3 w-3 shrink-0`}),t.address]}),(0,Q.jsx)(`span`,{className:`shrink-0 ${t.status===`error`?`text-destructive`:`text-muted-foreground`}`,children:t.status})]}),(0,Q.jsxs)(`div`,{className:`pl-[18px] text-muted-foreground`,children:[String(t.config?.host||``),` · `,(t.containers||[]).length,` folder(s)`]}),t.lastError&&(0,Q.jsxs)(`div`,{className:`pl-[18px] text-destructive`,children:[`error: `,t.lastError]})]}),n&&(0,Q.jsxs)(`div`,{className:`mt-2 space-y-3 border-t pt-2`,children:[(0,Q.jsx)(`div`,{className:`space-y-0.5`,children:(t.containers||[]).map(n=>(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded bg-background/60 px-2 py-1`,children:[(0,Q.jsx)(`span`,{className:`font-mono truncate`,children:n.name}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,Q.jsx)(`button`,{title:`Resync folder`,className:`p-1 hover:bg-accent rounded`,onClick:()=>U(t.address,n.name),disabled:!!j||v||k,children:j===`folder-sync:${t.address}:${n.name}`?(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}):(0,Q.jsx)(P,{className:`h-3 w-3`})}),(0,Q.jsx)(`button`,{title:`Remove folder`,className:`p-1 hover:bg-destructive/10 text-destructive rounded`,onClick:()=>vi(e,`imap`,t.address,n.name).then(R).catch(e=>N({title:`Error`,description:e instanceof Error?e.message:`Failed to remove folder`,variant:`destructive`})),disabled:!!j,children:(0,Q.jsx)(rt,{className:`h-3 w-3`})})]})]},n.name))}),(t.containers||[]).map(n=>(0,Q.jsxs)(`div`,{className:`rounded border p-2`,children:[(0,Q.jsx)(`p`,{className:`mb-2 font-medium`,children:n.name}),(0,Q.jsx)(oE,{value:n.removalPolicy,backends:i,source:`imap:${n.mailboxId}`,destination:!1,onSave:async r=>{await rE(e,t.address,n.name,r),await R()}})]},`removal:${n.name}`)),le,(0,Q.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,Q.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Q.jsxs)(X,{size:`sm`,onClick:H,disabled:k||!v,children:[k?(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}):(0,Q.jsx)(Ve,{className:`h-3 w-3`}),` Save`]}),(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,disabled:!!j||v||k,onClick:()=>ce(`test`,t.address),children:[j===`test:${t.address}`?(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}):(0,Q.jsx)(xt,{className:`h-3 w-3`}),` Test`]}),(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,disabled:!!j||v||k,onClick:()=>ce(`sync`,t.address),children:[j===`sync:${t.address}`?(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}):(0,Q.jsx)(P,{className:`h-3 w-3`}),` Resync all`]}),(0,Q.jsxs)(X,{size:`sm`,variant:`destructive`,disabled:!!j,onClick:se,children:[j===`delete:${t.address}`?(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}):(0,Q.jsx)(rt,{className:`h-3 w-3`}),` Delete`]})]})]})]},t.address)})})}),u&&(0,Q.jsxs)(`div`,{className:`space-y-3 rounded-md border p-3`,children:[(0,Q.jsx)(`h5`,{className:`text-xs font-medium`,children:`New IMAP account`}),le,(0,Q.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Q.jsxs)(X,{size:`sm`,onClick:H,disabled:k,children:[k?(0,Q.jsx)(Xn,{className:`h-3 w-3 animate-spin`}):(0,Q.jsx)(Ve,{className:`h-3 w-3`}),` Save`]}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,onClick:B,children:`Cancel`})]})]})]})}function BF({workspaceId:e}){let[t,n]=(0,Z.useState)([]),[r,i]=(0,Z.useState)(!0),[a,o]=(0,Z.useState)(!1),[s,c]=(0,Z.useState)(``),[l,u]=(0,Z.useState)([`read`]),[d,f]=(0,Z.useState)(``),[p,m]=(0,Z.useState)(!0),[h,g]=(0,Z.useState)(!1),[_,v]=(0,Z.useState)(new Set),[y,b]=(0,Z.useState)(``),[x,S]=(0,Z.useState)(!1),{showToast:C}=Hr(),[w,T]=(0,Z.useState)(e);e!==w&&(T(e),i(!0));let E=(0,Z.useCallback)(()=>Y.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,Z.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 Y.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 Y.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)},j=e=>_.has(e)?e:`${e.substring(0,8)}...${e.substring(e.length-8)}`,M=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,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Q.jsx)(`h3`,{className:`text-lg font-medium`,children:`Workspace Sharing Tokens`}),(0,Q.jsxs)(X,{onClick:()=>g(!h),size:`sm`,variant:`outline`,children:[(0,Q.jsx)(cn,{className:`mr-2 h-4 w-4`}),`Create Token`]})]}),h&&(0,Q.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-4 bg-muted/50`,children:[(0,Q.jsx)(J,{placeholder:`Token description (e.g., 'John's laptop')`,value:s,onChange:e=>c(e.target.value)}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`text-sm font-medium mb-2 block`,children:`Permissions`}),(0,Q.jsx)(`div`,{className:`flex gap-2 flex-wrap`,children:[`read`,`write`,`admin`].map(e=>(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:l.includes(e),onChange:t=>{t.target.checked?u([...l,e]):u(l.filter(t=>t!==e))}}),(0,Q.jsx)(`span`,{className:`text-sm`,children:e})]},e))})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`text-sm font-medium mb-2 block`,children:`Token Expiry`}),(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:p,onChange:e=>{m(e.target.checked),e.target.checked&&f(``)}}),(0,Q.jsx)(`span`,{className:`text-sm`,children:`Never expires`})]}),!p&&(0,Q.jsx)(J,{type:`date`,placeholder:`Expiry date`,value:d,onChange:e=>f(e.target.value),min:new Date().toISOString().split(`T`)[0]})]})]}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(X,{onClick:D,disabled:a,children:`Create Token`}),(0,Q.jsx)(X,{variant:`outline`,onClick:()=>g(!1),children:`Cancel`})]})]}),y&&(0,Q.jsxs)(`div`,{className:`p-4 border rounded-md bg-muted/50`,children:[(0,Q.jsxs)(`div`,{className:`flex justify-between items-center mb-2`,children:[(0,Q.jsx)(`h3`,{className:`font-semibold`,children:`Your New Workspace Sharing Token`}),(0,Q.jsx)(X,{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,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(ae,{className:`mr-2 h-4 w-4`}),`Copied`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(A,{className:`mr-2 h-4 w-4`}),`Copy`]})})]}),(0,Q.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,Q.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,Q.jsx)(X,{variant:`outline`,size:`sm`,className:`mt-2`,onClick:()=>b(``),children:`Dismiss`})]}),(0,Q.jsx)(VF,{workspaceId:e}),r?(0,Q.jsxs)(`div`,{className:`text-center py-4`,children:[(0,Q.jsx)(`div`,{className:`animate-spin rounded-full h-6 w-6 border-b-2 border-primary mx-auto touch-target`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2`,children:`Loading tokens...`})]}):t.length===0?(0,Q.jsxs)(`div`,{className:`text-center py-8 text-muted-foreground`,children:[(0,Q.jsx)(`p`,{children:`No sharing tokens created yet.`}),(0,Q.jsx)(`p`,{className:`text-sm`,children:`Create a token to share this workspace with others.`})]}):(0,Q.jsx)(`div`,{className:`space-y-3`,children:t.map(e=>(0,Q.jsxs)(`div`,{className:`border rounded-lg p-3 flex items-center justify-between`,children:[(0,Q.jsxs)(`div`,{className:`flex-1`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[(0,Q.jsx)(`span`,{className:`font-medium text-sm`,children:e.description}),(0,Q.jsx)(`span`,{className:`text-xs bg-muted px-2 py-1 rounded`,children:e.permissions.join(`, `)})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,Q.jsx)(`span`,{className:`font-mono`,children:j(e.hash)}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,onClick:()=>k(e.hash),children:_.has(e.hash)?(0,Q.jsx)(Pt,{className:`h-3 w-3`}):(0,Q.jsx)(Zn,{className:`h-3 w-3`})}),(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,onClick:()=>M(e.hash),children:(0,Q.jsx)(A,{className:`h-3 w-3`})})]}),(0,Q.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`Created: `,new Date(e.createdAt).toLocaleDateString(),e.expiresAt?(0,Q.jsxs)(`span`,{children:[` • Expires: `,new Date(e.expiresAt).toLocaleDateString()]}):(0,Q.jsx)(`span`,{children:` • Never expires`})]})]}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>O(e.hash),className:`text-destructive hover:text-destructive`,children:(0,Q.jsx)(rt,{className:`h-4 w-4`})})]},e.hash))})]})}function VF({workspaceId:e}){let{showToast:t}=Hr(),[n,r]=(0,Z.useState)(``),[i,a]=(0,Z.useState)([`read`]),[o,s]=(0,Z.useState)(!1),[c,l]=(0,Z.useState)([]),u=(0,Z.useCallback)(()=>Y.get(`/workspaces/${e}/shares`).then(e=>l(Array.isArray(e)?e:e?.emailShares||[])).catch(()=>{}),[e]);(0,Z.useEffect)(()=>{u()},[u]);let d=async()=>{if(n.trim())try{s(!0),await Y.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 Y.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,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsx)(`h4`,{className:`font-medium`,children:`Email-based Shares`}),(0,Q.jsxs)(`div`,{className:`flex gap-2 flex-wrap items-center`,children:[(0,Q.jsx)(J,{placeholder:`user@local.server`,value:n,onChange:e=>r(e.target.value),className:`max-w-xs`}),(0,Q.jsx)(`div`,{className:`flex gap-2`,children:[`read`,`write`,`admin`].map(e=>(0,Q.jsxs)(`label`,{className:`flex items-center gap-2 text-sm`,children:[(0,Q.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,Q.jsx)(X,{size:`sm`,onClick:d,disabled:o,children:`Add`})]}),c.length>0&&(0,Q.jsx)(`div`,{className:`space-y-2`,children:c.map(e=>(0,Q.jsxs)(`div`,{className:`flex items-center justify-between border rounded p-2`,children:[(0,Q.jsxs)(`div`,{className:`text-sm`,children:[(0,Q.jsx)(`div`,{className:`font-medium`,children:e.userEmail}),(0,Q.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[e.permissions.join(`, `),e.grantedAt?` • ${new Date(e.grantedAt).toLocaleDateString()}`:``]})]}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>f(e.userEmail),className:`text-destructive hover:text-destructive`,children:`Revoke`})]},e.userEmail))})]})}var HF=[{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`}],UF=e=>e.includes(`admin`)?`admin`:e.includes(`write`)?`write`:`read`;function WF({workspaceId:e}){let{showToast:t}=Hr(),[n,r]=(0,Z.useState)(null),[i,a]=(0,Z.useState)(!0),[o,s]=(0,Z.useState)(null),[c,l]=(0,Z.useState)(`user`),[u,d]=(0,Z.useState)(``),[f,p]=(0,Z.useState)(`read`),[m,h]=(0,Z.useState)(e);e!==m&&(h(e),a(!0));let g=(0,Z.useCallback)(()=>ui(e).then(r).catch(()=>r(null)).finally(()=>a(!1)),[e]);(0,Z.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 Ha(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 To(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 Yr(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,Q.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,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.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,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{a(!0),g()},disabled:i,children:[(0,Q.jsx)(P,{className:q(`mr-2 h-3.5 w-3.5`,i&&`animate-spin`)}),`Refresh`]})]}),i?(0,Q.jsx)(`div`,{className:`rounded-md border p-4 text-sm text-muted-foreground`,children:`Loading members…`}):v.length===0?(0,Q.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=UF(e.permissions);return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 rounded-md border p-3 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Q.jsxs)(`div`,{className:`flex min-w-0 items-start gap-2`,children:[e.type===`group`?(0,Q.jsx)(V,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}):(0,Q.jsx)(Ge,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`div`,{className:`truncate text-sm font-medium`,title:e.principal,children:e.principal}),(0,Q.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,Q.jsxs)(`div`,{className:`mt-1 flex items-center gap-1 text-[11px] text-warning`,children:[(0,Q.jsx)(R,{className:`h-3 w-3`}),` No account yet — applies at first sign-in`]})]})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[_?(0,Q.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:HF.map(e=>(0,Q.jsx)(`option`,{value:e.value,children:e.label},e.value))}):(0,Q.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-xs`,children:HF.find(e=>e.value===n)?.label}),_&&(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,className:`text-destructive hover:text-destructive`,disabled:o===t,onClick:()=>x(e),title:`Revoke access`,children:(0,Q.jsx)(z,{className:`h-3.5 w-3.5`})})]})]},t)})]}),_&&(0,Q.jsxs)(`form`,{onSubmit:y,className:`space-y-3 rounded-md border p-3`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-sm font-medium`,children:[`Share with`,(0,Q.jsx)(`div`,{className:`inline-flex overflow-hidden rounded-md border`,children:[`user`,`group`].map(e=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>l(e),className:q(`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,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-[1fr_auto]`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(J,{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,Q.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,Q.jsx)(`div`,{children:(0,Q.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:HF.find(e=>e.value===f)?.hint,children:HF.map(e=>(0,Q.jsx)(`option`,{value:e.value,children:e.label},e.value))})})]}),(0,Q.jsx)(X,{type:`submit`,size:`sm`,disabled:o===`grant`||!u.trim(),children:o===`grant`?`Sharing…`:`Share workspace`})]})]})}function GF({workspaceId:e,workspaceName:t,isActive:n,onChanged:r}){let{showToast:i}=Hr(),[a,o]=(0,Z.useState)([]),[s,c]=(0,Z.useState)(!0),[l,u]=(0,Z.useState)(!1),[d,f]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)(!1),[h,g]=(0,Z.useState)(null),[_,v]=(0,Z.useState)(!1),y=(0,Z.useCallback)(async()=>{try{o(await ii(e))}catch{o([])}finally{c(!1)}},[e]);(0,Z.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 zi(e,{stop:!0});f(t.stoppedWorkspace),i({title:`Workspace exported`,description:`${t.name} — ${qi(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 la(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 di(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 ai(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,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(Je,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Export & Import`})]}),(0,Q.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,Q.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2`,children:[(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:l,onClick:b,children:[(0,Q.jsx)(Je,{className:`mr-2 h-3.5 w-3.5 ${l?`animate-pulse`:``}`}),l?`Exporting…`:`Export Workspace`]}),(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:s||l,onClick:()=>void y(),children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5 ${s?`animate-spin`:``}`}),`Refresh`]}),d&&(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:p,onClick:x,children:p?`Starting…`:`Start workspace again`})]}),(0,Q.jsxs)(`div`,{className:`mt-4 border-t pt-3`,children:[(0,Q.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:`Archives`}),s?(0,Q.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:`Loading…`}):a.length===0?(0,Q.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:`No exports yet.`}):(0,Q.jsx)(`ul`,{className:`mt-2 space-y-2`,children:a.map(e=>(0,Q.jsxs)(`li`,{className:`flex flex-col gap-2 rounded-md border p-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`div`,{className:`truncate font-mono text-xs`,children:e.name}),(0,Q.jsxs)(`div`,{className:`mt-0.5 text-[11px] text-muted-foreground`,children:[qi(e.size),` · `,new Date(e.createdAt).toLocaleString()]})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:h===e.name,onClick:()=>S(e),title:`Download (${qi(e.size)})`,children:(0,Q.jsx)(Jt,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:h===e.name,onClick:()=>C(e),className:`text-destructive hover:text-destructive`,title:`Delete archive`,children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]})]},e.name))})]}),(0,Q.jsxs)(`div`,{className:`mt-4 space-y-3 border-t pt-3`,children:[(0,Q.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:`Import workspace`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:l,onClick:()=>v(e=>!e),children:_?`Close import`:`Import workspace…`}),_&&(0,Q.jsx)(WT,{disabled:l,onImported:()=>r?.()})]})]})}var KF={"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.`}},qF=[{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 JF({checked:e,disabled:t,onClick:n}){return(0,Q.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,Q.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 YF({workspaceId:e,onAdded:t}){let[n,r]=(0,Z.useState)(!1),[i,a]=(0,Z.useState)(``),[o,s]=(0,Z.useState)(``),[c,l]=(0,Z.useState)(!1),[u,d]=(0,Z.useState)(!1),[f,p]=(0,Z.useState)(!1),{showToast:m}=Hr(),h=()=>{a(``),s(``),l(!1),d(!1)};return n?(0,Q.jsxs)(`form`,{onSubmit:async n=>{if(n.preventDefault(),!(!i.trim()||!o.trim())){p(!0);try{await ja(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,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(ct,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Add local folder`})]}),(0,Q.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,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`Name`}),(0,Q.jsx)(J,{value:i,onChange:e=>a(e.target.value),placeholder:`Financial Reports`,required:!0})]}),(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`Absolute path on server`}),(0,Q.jsx)(J,{value:o,onChange:e=>s(e.target.value),placeholder:`/mnt/data/reports`,required:!0,className:`font-mono`})]})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-6 text-[11px] text-muted-foreground`,children:[(0,Q.jsxs)(`label`,{className:`flex items-center gap-1.5`,children:[`watch`,(0,Q.jsx)(JF,{checked:c,onClick:()=>l(e=>!e)})]}),(0,Q.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,Q.jsx)(JF,{checked:u,onClick:()=>d(e=>!e)})]})]}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(X,{type:`submit`,size:`sm`,disabled:f||!i.trim()||!o.trim(),children:f?`Adding…`:`Add folder`}),(0,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`sm`,disabled:f,onClick:()=>{h(),r(!1)},children:`Cancel`})]})]}):(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>r(!0),children:[(0,Q.jsx)(ct,{className:`mr-2 h-3.5 w-3.5`}),`Add local folder`]})}function XF({workspaceId:e,onAdded:t}){let[n,r]=(0,Z.useState)(!1),[i,a]=(0,Z.useState)({name:``,clientId:``,clientSecret:``,refreshToken:``,folderId:``}),[o,s]=(0,Z.useState)(!1),[c,l]=(0,Z.useState)(!1),[u,d]=(0,Z.useState)(!1),{showToast:p}=Hr(),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,Q.jsxs)(`form`,{onSubmit:async n=>{if(n.preventDefault(),g){d(!0);try{await ja(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,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(f,{icon:`mdi:google-drive`,width:16,height:16,className:`text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Add Google Drive`})]}),(0,Q.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,Q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`Name`}),(0,Q.jsx)(J,{value:i.name,onChange:m(`name`),placeholder:`Work Drive`,required:!0})]}),(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`Folder id (empty = My Drive root)`}),(0,Q.jsx)(J,{value:i.folderId,onChange:m(`folderId`),placeholder:`1AbC…`,className:`font-mono`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`OAuth client id`}),(0,Q.jsx)(J,{value:i.clientId,onChange:m(`clientId`),required:!0,className:`font-mono`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`OAuth client secret`}),(0,Q.jsx)(J,{type:`password`,value:i.clientSecret,onChange:m(`clientSecret`),required:!0,className:`font-mono`,autoComplete:`off`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1 sm:col-span-2`,children:[(0,Q.jsx)(`label`,{className:`text-xs font-medium`,children:`Refresh token`}),(0,Q.jsx)(J,{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,Q.jsx)(MF,{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,Q.jsxs)(`div`,{className:`flex items-center gap-6 text-[11px] text-muted-foreground`,children:[(0,Q.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,Q.jsx)(JF,{checked:o,onClick:()=>s(e=>!e)})]}),(0,Q.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,Q.jsx)(JF,{checked:c,onClick:()=>l(e=>!e)})]})]}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(X,{type:`submit`,size:`sm`,disabled:u||!g,children:u?`Checking…`:`Add Drive`}),(0,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`sm`,disabled:u,onClick:()=>{h(),r(!1)},children:`Cancel`})]})]}):(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>r(!0),children:[(0,Q.jsx)(f,{icon:`mdi:google-drive`,width:14,height:14,className:`mr-2`}),`Add Google Drive`]})}function ZF({workspaceId:e,backend:t}){let[n,r]=(0,Z.useState)(t.usage??null),[i,a]=(0,Z.useState)(!1),{showToast:o}=Hr();return(0,Q.jsxs)(`button`,{type:`button`,onClick:async()=>{a(!0);try{r(await mi(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,Q.jsx)(Fe,{className:`h-3 w-3 ${i?`animate-pulse`:``}`}),i?`Calculating…`:n?qi(n.bytes):`Size`]})}function QF({workspaceId:e}){let[t,n]=(0,Z.useState)(!1),{showToast:r}=Hr();return(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:t,onClick:async()=>{n(!0);try{let{removed:t}=await Ua(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,Q.jsx)(rt,{className:`mr-2 h-3.5 w-3.5 ${t?`animate-pulse`:``}`}),t?`Clearing…`:`Clear thumbnails`]})}function $F({workspaceId:e}){let[t,n]=(0,Z.useState)(null),[r,i]=(0,Z.useState)(!1),{showToast:a}=Hr();return(0,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(Fe,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Disk usage`})]}),(0,Q.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,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-3`,children:[t&&(0,Q.jsx)(`span`,{className:`text-sm font-semibold`,children:qi(t.bytes)}),(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:r,onClick:async()=>{i(!0);try{n(await fo(e))}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Failed to compute workspace size`,variant:`destructive`})}finally{i(!1)}},children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5 ${r?`animate-spin`:``}`}),r?`Calculating…`:t?`Recalculate`:`Calculate size`]})]})]}),t&&(0,Q.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,Q.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-xs`,children:[(0,Q.jsx)(`span`,{className:`truncate font-mono text-muted-foreground`,children:e}),(0,Q.jsx)(`span`,{children:qi(t)})]},e))})]})}function eI({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,Z.useState)(!1),[l,u]=(0,Z.useState)(i.join(`
43
- `)),[d,f]=(0,Z.useState)(!1),p=i.join(`
44
- `),[m,h]=(0,Z.useState)(p);return m!==p&&(h(p),u(p)),(0,Q.jsxs)(`div`,{className:`mt-3 border-t pt-3`,children:[(0,Q.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,Q.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,Q.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`One glob pattern per line, e.g. `,(0,Q.jsx)(`code`,{className:`font-mono`,children:`**/node_modules/**`}),` or `,(0,Q.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,Q.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/**
45
- **/dist/**`,spellCheck:!1}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(X,{type:`button`,size:`sm`,disabled:t||l.split(`
46
- `).map(e=>e.trim()).filter(Boolean).join(`
47
- `)===i.join(`
48
- `),onClick:()=>n(l.split(`
49
- `).map(e=>e.trim()).filter(Boolean)),children:`Save exclusions`}),o>0&&(0,Q.jsxs)(`button`,{type:`button`,className:`text-[11px] text-muted-foreground hover:text-foreground`,onClick:()=>f(!d),children:[d?`Hide`:`Show`,` default patterns`]})]}),d&&(0,Q.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(`
50
- `)})]})]})}function tI({device:e,linked:t,busy:n,onLink:r,onUnlink:i,onUpdate:a}){let[o,s]=(0,Z.useState)(!1),[c,l]=(0,Z.useState)(e.name),[u,d]=(0,Z.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,Q.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Q.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start gap-3 min-w-0`,children:[(0,Q.jsx)(In,{className:`h-4 w-4 text-muted-foreground mt-0.5 shrink-0`}),(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[o?(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(J,{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,Q.jsx)(J,{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,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`text-sm font-medium`,children:e.name}),e.description&&(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:e.description})]}),(0,Q.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,Q.jsx)(`span`,{children:e.deviceId}),e.platform&&(0,Q.jsx)(`span`,{children:e.platform}),e.arch&&(0,Q.jsx)(`span`,{children:e.arch}),e.type&&(0,Q.jsx)(`span`,{children:e.type})]})]})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[o?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:f,disabled:!c.trim(),children:(0,Q.jsx)(ae,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`sm`,onClick:p,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]}):(0,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>s(!0),title:`Edit name/description`,children:(0,Q.jsx)(ve,{className:`h-3.5 w-3.5`})}),t?(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:n,onClick:i,className:`text-destructive hover:text-destructive`,title:`Remove from workspace`,children:(0,Q.jsx)(z,{className:`h-3.5 w-3.5`})}):(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:n,onClick:r,title:`Link to workspace`,children:(0,Q.jsx)(Qt,{className:`h-3.5 w-3.5`})}),t&&(0,Q.jsx)(`span`,{className:`rounded-full bg-primary/10 px-2 py-0.5 text-[11px] font-medium text-primary`,children:`linked`})]})]})})}function nI({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,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Q.jsx)(P,{className:`h-4 w-4 animate-spin`}),`Loading devices…`]}):(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.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,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:i,disabled:n,children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})]}),e.length===0?(0,Q.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,Q.jsx)(`span`,{className:`font-mono`,children:`POST /auth/devices/register`}),`.`]}):(0,Q.jsx)(`div`,{className:`space-y-2`,children:e.map(e=>(0,Q.jsx)(tI,{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 rI({label:e,value:t,mono:n=!1}){return(0,Q.jsxs)(`div`,{className:`flex items-start justify-between gap-4 py-2 border-b last:border-0`,children:[(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground shrink-0`,children:e}),(0,Q.jsx)(`span`,{className:`text-xs text-right ${n?`font-mono`:``}`,children:t??`—`})]})}function iI({workspaceName:e,current:t,weights:n,floorMode:r,relativeMargin:i,onDone:a}){let[o,s]=(0,Z.useState)(t==null?``:String(t)),[c,l]=(0,Z.useState)(r??`relative`),[u,d]=(0,Z.useState)(i==null?`0.035`:String(i)),[f,p]=(0,Z.useState)(n?.fts==null?`2`:String(n.fts)),[m,h]=(0,Z.useState)(n?.dense==null?`1`:String(n.dense)),[g,_]=(0,Z.useState)(n?.image==null?`2`:String(n.image)),[v,y]=(0,Z.useState)(!1),[b,x]=(0,Z.useState)(null),[S,C]=(0,Z.useState)(JE);return(0,Q.jsxs)(`div`,{className:`mt-3 space-y-3`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)(`label`,{className:`text-xs text-muted-foreground`,children:`How photo relevance is decided`}),(0,Q.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,Q.jsx)(`option`,{value:`relative`,children:`Relative to the best match (recommended)`}),(0,Q.jsx)(`option`,{value:`absolute`,children:`Absolute distance cutoff`})]}),(0,Q.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,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)(`label`,{className:`text-xs text-muted-foreground`,children:`Window width (distance from the best match)`}),(0,Q.jsx)(J,{value:u,onChange:e=>d(e.target.value),placeholder:`0.035`,className:`h-8 w-28 font-mono text-xs`,inputMode:`decimal`}),(0,Q.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,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.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,Q.jsx)(J,{value:o,onChange:e=>s(e.target.value),placeholder:`0.95`,className:`h-8 w-28 font-mono text-xs`,inputMode:`decimal`}),(0,Q.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,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)(`label`,{className:`text-xs text-muted-foreground`,children:`Hybrid fusion weights (0 disables a signal)`}),(0,Q.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,Q.jsxs)(`div`,{className:`space-y-1`,children:[(0,Q.jsx)(`span`,{className:`block text-[11px] text-muted-foreground`,children:e}),(0,Q.jsx)(J,{value:t,onChange:e=>n(e.target.value),className:`h-8 w-16 font-mono text-xs`,inputMode:`decimal`})]},e))}),(0,Q.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,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(X,{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 Ma(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,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:b})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5 border-t border-border pt-3`,children:[(0,Q.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:S,onChange:e=>{YE(e.target.checked),C(e.target.checked)}}),(0,Q.jsx)(`span`,{children:`Debug query`})]}),(0,Q.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 aI({stats:e,isLoading:t,onRefresh:n,workspaceName:r}){return t?(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Q.jsx)(P,{className:`h-4 w-4 animate-spin`}),`Loading stats…`]}):(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Live snapshot from synapsd. Click refresh for updated counts.`}),(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:n,disabled:t,children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})]}),(0,Q.jsx)(lI,{workspaceName:r,vectorSpaces:Object.keys(e?.semantic?.vectorSpaces||{}),onDone:n}),e?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,Q.jsx)(tr,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Core Index`})]}),(0,Q.jsx)(rI,{label:`Backend`,value:e.dbBackend,mono:!0}),(0,Q.jsx)(rI,{label:`Status`,value:e.status}),(0,Q.jsx)(rI,{label:`Path`,value:e.dbPath,mono:!0}),(0,Q.jsx)(rI,{label:`Documents`,value:e.documentCount?.toLocaleString()}),(0,Q.jsx)(rI,{label:`Metadata entries`,value:e.metadataCount?.toLocaleString()}),(0,Q.jsx)(rI,{label:`Checksum index`,value:e.checksumIndexSize?.toLocaleString()}),(0,Q.jsx)(rI,{label:`Bitmap store`,value:e.bitmapStoreSize?.toLocaleString()}),(0,Q.jsx)(rI,{label:`Bitmap cache`,value:e.bitmapCacheSize?.toLocaleString()}),(0,Q.jsx)(rI,{label:`Deleted (pending GC)`,value:e.deletedDocumentsCount?.toLocaleString()})]}),e.fts&&(0,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,Q.jsx)(Kt,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Full-Text Search (LanceDB)`})]}),`ready`in e.fts&&(0,Q.jsx)(rI,{label:`Ready`,value:String(e.fts.ready)}),e.fts.rowCount!==void 0&&(0,Q.jsx)(rI,{label:`Row count`,value:e.fts.rowCount?.toLocaleString()}),e.fts.error&&(0,Q.jsx)(rI,{label:`Error`,value:(0,Q.jsx)(`span`,{className:`text-destructive`,children:e.fts.error})})]}),e.semantic&&(0,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,Q.jsx)(Kt,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Semantic / Vector Search`})]}),(0,Q.jsx)(rI,{label:`Enabled`,value:String(e.semantic.enabled)}),e.semantic.enabled&&(0,Q.jsxs)(Q.Fragment,{children:[e.inferd?.routing?Object.entries(e.inferd.routing).map(([e,t])=>(0,Q.jsx)(rI,{label:`Embeds → ${e}`,value:(0,Q.jsx)(`span`,{className:`font-mono text-[11px]`,children:t.join(`, `)})},`route-${e}`)):(0,Q.jsx)(rI,{label:`Text-embeddable (gap default)`,value:e.semantic.embeddableSchemas?.join(`, `)}),e.semantic.vectorSpaces&&Object.entries(e.semantic.vectorSpaces).map(([e,t])=>(0,Q.jsx)(rI,{label:`Space: ${e} (${t.dim??`?`}-d)`,value:t.error?(0,Q.jsx)(`span`,{className:`text-destructive`,children:t.error}):`${(t.embeddedDocs??0).toLocaleString()} docs · ${(t.chunkRows??0).toLocaleString()} vectors`},e)),(0,Q.jsx)(rI,{label:`Photo relevance`,value:e.semantic.imageFloorMode===`absolute`?`absolute cutoff`:`relative ±${e.semantic.imageRelativeMargin??.035}`,mono:!0}),(0,Q.jsx)(rI,{label:e.semantic.imageFloorMode===`absolute`?`Image relevance floor`:`Hard ceiling`,value:e.semantic.imageMaxDistance==null?`off`:e.semantic.imageMaxDistance,mono:!0}),(0,Q.jsx)(rI,{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,Q.jsx)(iI,{workspaceName:r,current:e.semantic.imageMaxDistance,weights:e.semantic.searchWeights,floorMode:e.semantic.imageFloorMode,relativeMargin:e.semantic.imageRelativeMargin,onDone:n})]})]})]}):(0,Q.jsx)(`div`,{className:`rounded-md border p-4 text-sm text-muted-foreground`,children:`No stats available.`})]})}function oI(){let{workspaceName:e}=yl();return(0,Q.jsx)(sI,{},e)}function sI(){let{workspaceName:e,tab:t}=yl(),[n,r]=Ru(),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,Z.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,Z.useCallback)(()=>{r(e=>{for(let t of[`addRuleKind`,`addRulePath`,`addRuleTarget`,`addRuleStoreTo`,`addRuleStoreFolder`])e.delete(t);return e},{replace:!0})},[r]),g=hl(),{showToast:_,showProgress:v}=Hr(),y=$g(),{goBack:b}=jT(),x=LO(t);(0,Z.useEffect)(()=>{t!==x&&g(`/workspaces/${e}/settings/${x}`,{replace:!0})},[t,x,e,g]);let[S,C]=(0,Z.useState)(null),w=Ep(S),[T,E]=(0,Z.useState)(0),[D,O]=(0,Z.useState)(!0),[k,j]=(0,Z.useState)(!1),[M,N]=(0,Z.useState)(!1),[ee,F]=(0,Z.useState)(``),[I,L]=(0,Z.useState)(``),[R,te]=(0,Z.useState)(`#FFFFFF`),[ne,B]=(0,Z.useState)(null),[re,V]=(0,Z.useState)(null),[ie,ae]=(0,Z.useState)([]),[oe,H]=(0,Z.useState)(null),[se,ce]=(0,Z.useState)([]),[U,le]=(0,Z.useState)(null),[ue,de]=(0,Z.useState)(null),[fe,pe]=(0,Z.useState)(!1),[me,he]=(0,Z.useState)([]),[W,ge]=(0,Z.useState)([]),[_e,ve]=(0,Z.useState)(!1),[ye,G]=(0,Z.useState)(null),K=e||S?.id||``,be=(0,Z.useRef)(K);(0,Z.useEffect)(()=>{be.current=K});let xe=(0,Z.useCallback)(async e=>{let t=e??be.current;if(t)try{let e=await Pi(t);ae(e.publicCanvasShares)}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to load shares`,variant:`destructive`})}},[_]),Se=(0,Z.useCallback)(async e=>{let t=e??be.current;if(t){pe(!0);try{let e=await xa(t);de(e)}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to load DB stats`,variant:`destructive`})}finally{pe(!1)}}},[_]),Ce=(0,Z.useCallback)(async e=>{let t=e??be.current;if(t){ve(!0);try{let[e,n]=await Promise.all([DO(),AO(t)]);he(e),ge(n)}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to load devices`,variant:`destructive`})}finally{ve(!1)}}},[_]),we=async e=>{G(e);try{await jO(K,e),await Ce(),_({title:`Linked`,description:`Device linked to workspace`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to link device`,variant:`destructive`})}finally{G(null)}},Te=async e=>{G(e);try{await MO(K,e),ge(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{G(null)}},Ee=async(e,t)=>{G(`edit:${e}`);try{let n=await OO(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{G(null)}},De=(0,Z.useCallback)(async e=>{let t=e??be.current;if(!t)return;let[n,r]=await Promise.all([Za(t).catch(()=>null),Eo(t).catch(()=>[])]);H(n),ce(r.filter(e=>e.kind===`storage`))},[]),Oe=se.some(e=>e.resyncing);(0,Z.useEffect)(()=>{if(!w||!Oe||!K)return;let e=setInterval(()=>{De()},4e3);return()=>clearInterval(e)},[w,Oe,K,De]),(0,Z.useEffect)(()=>{let t=!1;async function n(){try{let n=await ji();if(t)return;let r=n.find(t=>t.id===e)??n.find(t=>t.name===e);if(C(r??null),r){if(!Ep(r))return;F(r.label||``),L(r.description||``),te(r.color||`#FFFFFF`),B(r.icon??null),r.status===`active`&&await Promise.all([xe(e||r.id),De(e||r.id)])}}catch{t||_({title:`Error`,description:`Failed to load workspace`,variant:`destructive`})}finally{t||O(!1)}}return n(),()=>{t=!0}},[e,xe,De,_,T]),(0,Z.useEffect)(()=>{let e=()=>E(e=>e+1);return window.addEventListener(`workspaces:refresh`,e),()=>window.removeEventListener(`workspaces:refresh`,e)},[]);let ke=(0,Z.useRef)(!1),Ae=(0,Z.useRef)(!1);(0,Z.useEffect)(()=>{ke.current=!!ue||fe,Ae.current=_e||me.length>0}),(0,Z.useEffect)(()=>{w&&(S?.status===`active`&&x===`db`&&K&&!ke.current&&Se(),S?.status===`active`&&x===`devices`&&K&&!Ae.current&&Ce())},[w,x,K,S?.status,Se,Ce]);let je=async e=>{if(e.preventDefault(),S){j(!0);try{await oa(K,{label:ee.trim(),description:I.trim(),color:R,icon:ne}),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{j(!1)}}},Me=async()=>{if(S&&window.confirm(`Destroy workspace "${S.label||S.name}"? This cannot be undone.`)){N(!0);try{await hi(K),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{N(!1)}}},Ne=()=>{for(let t of[e,S?.name,S?.id])t&&Aa(t,`backends`);window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:K}}))},Pe=async e=>{if(e.config?.supported!==!1){le(`backend:${e.address}`);try{await Ea(K,e.driver,e.address,{enabled:!e.enabled}),await De(),Ne(),_({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)}}},Fe=async(e,t,n)=>{le(`${n}:${e.address}`);try{await Ea(K,e.driver,e.address,t),await De()}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to update backend`,variant:`destructive`})}finally{le(null)}},Ie=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 Zi(K,e.driver,e.address),await De(),Ne(),_({title:`Removed`,description:`${t} unmounted`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to remove backend`,variant:`destructive`})}finally{le(null)}}},Le=async e=>{le(`resync:${e.address}`);try{await Cb(v,K,e.driver,e.address,e=>{ce(t=>t.map(t=>t.driver===e.driver&&t.address===e.address?e:t))}),await De()}catch{}finally{le(null)}},Re=async e=>{le(`test:${e.address}`);try{await va(K,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)}},ze=async e=>{le(`stopsync:${e.address}`);try{await Qa(K,e.driver,e.address),await De(),_({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)}},Be=async(e,t)=>{le(`service:${e}`);try{t?await Pa(K,e):await Ti(K,e),await De(),_({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)}},Ve=async e=>{let t=`${window.location.origin}${e.url}`;await navigator.clipboard?.writeText(t),_({title:`Copied`,description:t})},He=async e=>{if(S&&window.confirm(`Revoke public share for "${e.path}"?`)){le(`share:${e.code}`);try{await ba(K,e.code),await xe(K),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:K}})),_({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)}}},Ue=FO.find(e=>e.id===x);return D?(0,Q.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Loading...`}):S?w?(0,Q.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,Q.jsxs)(`div`,{className:`mx-auto max-w-5xl p-6 pb-12 max-md:px-4 max-md:pb-rail-stack`,children:[(0,Q.jsx)(Ww,{compact:!0,className:`mb-6 border-b pb-4`,title:`${Ue.label} - ${S.label||S.name}`,description:`This workspace · ${Ue.description}`,backTo:`/workspaces/${e}`,onBack:y?b:void 0}),S.status!==`active`&&x!==`general`&&x!==`backups`&&(0,Q.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,Q.jsx)(eP,{workspaceId:K,onRestored:()=>E(e=>e+1)}),x===`general`&&(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsxs)(`form`,{onSubmit:je,className:`space-y-4 rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`ws-id`,className:`text-sm font-medium`,children:`Workspace ID`}),(0,Q.jsx)(J,{id:`ws-id`,value:S.id,readOnly:!0,className:`font-mono text-sm`,onFocus:e=>e.currentTarget.select()})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`ws-label`,className:`text-sm font-medium`,children:`Label`}),(0,Q.jsx)(J,{id:`ws-label`,value:ee,onChange:e=>F(e.target.value),placeholder:`Workspace Label`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`ws-description`,className:`text-sm font-medium`,children:`Description`}),(0,Q.jsx)(J,{id:`ws-description`,value:I,onChange:e=>L(e.target.value),placeholder:`Description (optional)`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`text-sm font-medium`,children:`Icon & color`}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`button`,{type:`button`,title:`Pick icon & color`,onClick:e=>V({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,Q.jsx)(f,{icon:ne||`ph:stack-fill`,width:22,height:22,color:Cm(R)})}),(0,Q.jsx)(J,{id:`ws-color`,type:`color`,value:R,onChange:e=>te(e.target.value),className:`h-10 w-16 p-1`}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>te(bm()),children:`Randomize`})]})]}),(0,Q.jsx)(X,{type:`submit`,disabled:k||!ee.trim(),children:k?`Saving...`:`Save Changes`})]}),re&&(0,Q.jsx)(Jw,{x:re.x,y:re.y,current:{icon:ne??void 0,color:R},onChange:e=>{`icon`in e&&B(e.icon??null),`color`in e&&e.color&&te(e.color)},onClose:()=>V(null)}),(0,Q.jsx)(fP,{currentMode:S.protection?.mode,workspaceId:K,isActive:S.status===`active`,onChanged:()=>E(e=>e+1)}),S.status===`active`&&(0,Q.jsx)(cI,{workspaceName:e}),S.status===`active`&&(0,Q.jsx)($F,{workspaceId:K}),(0,Q.jsx)(GF,{workspaceId:K,workspaceName:S.label||S.name,isActive:S.status===`active`,onChanged:()=>E(e=>e+1)}),(0,Q.jsxs)(`section`,{className:`rounded-lg border border-destructive/30 p-4`,children:[(0,Q.jsx)(`h2`,{className:`mb-3 text-sm font-semibold text-destructive`,children:`Danger Zone`}),(0,Q.jsxs)(X,{variant:`destructive`,disabled:M,onClick:Me,children:[(0,Q.jsx)(rt,{className:`mr-2 h-4 w-4`}),M?`Destroying...`:`Destroy Workspace`]})]})]}),S.status===`active`&&x===`shares`&&(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`mb-3`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Members`}),(0,Q.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,Q.jsx)(WF,{workspaceId:K})]}),(0,Q.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Public Canvas Shares`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Active public canvas links for this workspace.`})]}),(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>xe(),children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})]}),ie.length===0?(0,Q.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,Q.jsxs)(`div`,{className:`rounded-md border p-3`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-3`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`div`,{className:`truncate font-mono text-sm`,children:e.path}),(0,Q.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,Q.jsxs)(`div`,{className:`mt-1 text-[11px] text-muted-foreground`,children:[`locks: `,e.lockedBy.join(`, `)]})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>Ve(e),children:(0,Q.jsx)(A,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>window.open(t,`_blank`,`noreferrer`),children:(0,Q.jsx)(Ut,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:U===`share:${e.code}`,onClick:()=>He(e),className:`text-destructive hover:text-destructive`,children:(0,Q.jsx)(z,{className:`h-3.5 w-3.5`})})]})]}),(0,Q.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,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`mb-3`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Workspace ACL Tokens`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Generate token-based workspace access for devices, scripts, and other users.`})]}),(0,Q.jsx)(BF,{workspaceId:K})]})]}),S.status===`active`&&x===`data`&&(0,Q.jsxs)(`div`,{className:`space-y-3`,children:[se.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&&!KF[n],s=KF[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=pm(e);return(0,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(f,{icon:p.icon,width:16,height:16,color:p.color,className:`shrink-0`}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:s.title}),!c&&(0,Q.jsx)(`span`,{className:`rounded bg-muted px-2 py-0.5 text-[11px] text-muted-foreground`,children:`unsupported`})]}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:s.description}),typeof t.root==`string`&&t.root&&(0,Q.jsx)(`p`,{className:`mt-2 truncate font-mono text-xs text-muted-foreground`,children:t.root}),(0,Q.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2 text-[11px] text-muted-foreground`,children:[(0,Q.jsxs)(`span`,{children:[`status: `,e.status]}),e.resyncing&&(0,Q.jsxs)(`span`,{className:`flex items-center gap-1 rounded bg-primary/10 px-1.5 py-0.5 font-medium text-primary`,children:[(0,Q.jsx)(P,{className:`h-3 w-3 animate-spin`}),`indexing`,e.progress?` ${e.progress.scanned}${e.progress.total==null?``:` / ${e.progress.total}`}`:``]}),r?.name&&(0,Q.jsxs)(`span`,{title:r.id,children:[`device: `,r.name]}),t.readOnly===!0&&(0,Q.jsx)(`span`,{className:`rounded bg-warning/15 px-1.5 py-0.5 font-medium text-warning`,children:`read-only`}),e.lastSyncAt&&(0,Q.jsxs)(`span`,{children:[`last scan: `,new Date(e.lastSyncAt).toLocaleString()]})]}),e.lastError&&(0,Q.jsx)(`p`,{className:`mt-2 text-xs text-destructive`,children:e.lastError}),t.readOnly===!0&&(0,Q.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,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 border-t pt-3`,children:[e.capabilities?.sync&&c&&(0,Q.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,Q.jsx)(JF,{checked:t.scanOnStart===!0,disabled:U===`startup:${n}`,onClick:()=>Fe(e,{scanOnStart:t.scanOnStart!==!0},`startup`)})]}),(e.driver===`file`||i||a)&&u&&(0,Q.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,Q.jsx)(JF,{checked:!!t.watch,disabled:!e.enabled||U===`watch:${n}`,onClick:()=>Fe(e,{watch:!t.watch},`watch`)})]}),d&&(0,Q.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,Q.jsx)(JF,{checked:t.readOnly===!0,disabled:U===`readonly:${n}`,onClick:()=>Fe(e,{readOnly:t.readOnly!==!0},`readonly`)})]}),(e.driver===`file`||e.driver===`cacache`)&&c&&(0,Q.jsx)(ZF,{workspaceId:K,backend:e}),e.capabilities?.test&&(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:U===`test:${n}`,onClick:()=>Re(e),title:`Verify credentials and root folder`,children:[(0,Q.jsx)(Kt,{className:`mr-2 h-3.5 w-3.5`}),U===`test:${n}`?`Testing…`:`Test`]}),e.capabilities?.sync&&(e.resyncing?(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:U===`stopsync:${n}`,onClick:()=>ze(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,Q.jsx)(Bn,{className:`mr-2 h-3.5 w-3.5 fill-current`}),U===`stopsync:${n}`?`Stopping…`:`Stop sync`]}):(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:U===`resync:${n}`,onClick:()=>Le(e),children:[(0,Q.jsx)(P,{className:`mr-2 h-3.5 w-3.5 ${U===`resync:${n}`?`animate-spin`:``}`}),`Re-sync`]})),l?(0,Q.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,Q.jsx)(JF,{checked:!!e.enabled,disabled:!u||U===`backend:${n}`,onClick:()=>Pe(e)}),o&&(0,Q.jsx)(X,{type:`button`,variant:`ghost`,size:`sm`,className:`text-destructive hover:text-destructive`,disabled:U===`remove:${n}`,title:`Unmount this folder (no files are deleted)`,onClick:()=>Ie(e),children:(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]})]}),c&&(0,Q.jsx)(oE,{value:t.removalPolicy,backends:se,source:n,destination:t.propagatedRemovalSupported===!0,onSave:async t=>{await Ea(K,e.driver,e.address,{removalPolicy:t}),await De()}}),a&&(0,Q.jsx)(dP,{workspaceId:K,backend:e,onSaved:async()=>{await De(),Ne()}}),e.driver===`file`&&c&&!l&&(0,Q.jsx)(eI,{backend:e,busy:U===`exclude:${n}`,onSave:t=>Fe(e,{exclude:t},`exclude`)})]},n)}),(0,Q.jsx)(uP,{workspaceId:K,children:(0,Q.jsx)(QF,{workspaceId:K})},K),(0,Q.jsxs)(`div`,{className:`flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-start`,children:[(0,Q.jsx)(YF,{workspaceId:K,onAdded:async()=>{await De(),Ne()}}),(0,Q.jsx)(XF,{workspaceId:K,onAdded:async()=>{await De(),Ne()}}),(0,Q.jsx)(dP,{workspaceId:K,onSaved:async()=>{await De(),Ne()}})]}),e&&(0,Q.jsx)(`section`,{className:`border-t pt-4`,children:(0,Q.jsx)(cE,{workspaceName:e})})]}),S.status===`active`&&x===`db`&&(0,Q.jsxs)(`div`,{className:`space-y-8`,children:[K&&(0,Q.jsxs)(`section`,{className:`space-y-3`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Embeddings`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Which model turns this workspace's content into vectors, and where those vectors live.`})]}),(0,Q.jsx)(CP,{workspaceId:K,workspaceName:e})]}),(0,Q.jsx)(aI,{stats:ue,isLoading:fe,onRefresh:()=>Se(),workspaceName:e})]}),S.status===`active`&&x===`devices`&&(0,Q.jsx)(nI,{allDevices:me,linkedDevices:W,isLoading:_e,deviceBusy:ye,onRefresh:()=>Ce(),onLink:we,onUnlink:Te,onUpdate:Ee}),S.status===`active`&&x===`sync`&&(0,Q.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Q.jsx)(OF,{workspaceId:K,workspaceUuid:S?.id})}),S.status===`active`&&x===`services`&&(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[K&&(0,Q.jsx)(FF,{workspaceId:K}),(0,Q.jsx)(`div`,{className:`space-y-3`,children:qF.map(e=>{let t=oe?.[e.id]||oe?.[e.id===`git`?`dotfiles`:e.id===`webdav`?`home`:`imap`],n=!!t?.enabled;return(0,Q.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(Yt,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:e.title})]}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:e.description}),(0,Q.jsxs)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:[`initialized: `,t?.initialized?`true`:`false`]})]}),(0,Q.jsx)(JF,{checked:n,disabled:U===`service:${e.id}`,onClick:()=>Be(e.id,n)})]})},e.id)})}),(0,Q.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Q.jsx)(zF,{workspaceId:K,enabled:!!(oe?.imap?.enabled||oe?.imapSync?.enabled)})})]}),S.status===`active`&&x===`policies`&&(0,Q.jsx)(mF,{workspaceId:K}),S.status===`active`&&x===`hooks`&&(0,Q.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Q.jsx)(FP,{workspaceId:K,prefillRule:m,onPrefillConsumed:h,initialSection:a,initialRunsHandler:o,initialRunId:s})})]})}):(0,Q.jsxs)(`div`,{className:`space-y-3 p-6`,children:[(0,Q.jsx)(`h1`,{className:`font-semibold`,children:S.label||S.name}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Workspace settings are available to owners and admins.`}),(0,Q.jsx)(X,{variant:`outline`,onClick:()=>g(`/workspaces/${e}`),children:`Back to workspace`})]}):(0,Q.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Workspace not found`})}function cI({workspaceName:e}){let{selected:t,setSelected:n,tree:r,setTree:i,toggle:a}=LT(),[o,s]=(0,Z.useState)(!1),[c,l]=(0,Z.useState)(null);return(0,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Default folders`}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Create a set of common folders with matching icons and colors.`}),(0,Q.jsx)(`div`,{className:`mt-3`,children:(0,Q.jsx)(RT,{selected:t,onToggle:a,tree:r,onTreeChange:i,disabled:o,idPrefix:`settings-default-folders`})}),(0,Q.jsxs)(`div`,{className:`mt-3 flex items-center gap-3`,children:[(0,Q.jsx)(X,{type:`button`,size:`sm`,disabled:o||t.size===0,onClick:async()=>{s(!0),l(null);let{ok:i,failed:a}=await IT(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,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:c})]})]})}function lI({workspaceName:e,vectorSpaces:t,onDone:n}){let[r,i]=(0,Z.useState)(null),[a,o]=(0,Z.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:()=>PM(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:()=>LM(e)}]},{title:`Full-text (BM25)`,ops:[{key:`fts`,label:`Backfill`,description:`Index documents missing from the full-text table. Fast, skips already-indexed.`,fn:()=>FM(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:()=>FM(e,!0)},{key:`fts-optimize`,label:`Optimize`,description:`Compact fragments + prune old versions of the full-text table.`,fn:()=>IM(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:()=>IM(e,t)}))}]:[]];return(0,Q.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`mb-1 flex items-center gap-2`,children:[(0,Q.jsx)(P,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Index maintenance`})]}),(0,Q.jsx)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:`Runs against this workspace. Reindex operations are idempotent.`}),(0,Q.jsx)(`div`,{className:`space-y-4`,children:c.map(e=>(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h3`,{className:`mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:e.title}),(0,Q.jsx)(`div`,{className:`space-y-2`,children:e.ops.map(e=>(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1`,children:[(0,Q.jsxs)(X,{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,Q.jsx)(P,{className:`mr-2 h-3 w-3 animate-spin`}),e.label]}),(0,Q.jsx)(`span`,{className:`min-w-0 flex-1 basis-52 text-xs text-muted-foreground`,children:e.description})]},e.key))})]},e.title))}),a&&(0,Q.jsx)(`p`,{className:`mt-3 text-xs text-muted-foreground`,children:a})]})}var uI=[{value:`documentRead`,label:`Read`},{value:`documentWrite`,label:`Write`},{value:`documentReadWrite`,label:`Read & write`}];function dI(){let{contextId:e,tab:t}=yl(),[n]=Ru(),r=n.get(`ownerId`)||void 0,i=hl(),{showToast:a}=Hr(),{selectEntity:o,goBack:s,closeM2:c}=jT(),l=$g(),u=zO(t),d=r?`?ownerId=${encodeURIComponent(r)}`:``;(0,Z.useEffect)(()=>{t!==u&&e&&i(`/contexts/${e}/settings/${u}${d}`,{replace:!0})},[t,u,e,d,i]);let[f,p]=(0,Z.useState)(null),[m,h]=(0,Z.useState)(!0),[g,_]=(0,Z.useState)(!1),[v,y]=(0,Z.useState)(!1),[b,x]=(0,Z.useState)(``),[S,C]=(0,Z.useState)(``),[w,T]=(0,Z.useState)(null),[E,D]=(0,Z.useState)(``),[O,k]=(0,Z.useState)(``),[A,j]=(0,Z.useState)(),[M,N]=(0,Z.useState)([]),[ee,F]=(0,Z.useState)(!1),[I,L]=(0,Z.useState)(``),[R,te]=(0,Z.useState)(uI[0].value),[ne,B]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{if(!e)return;let t=!1;return Ss(e,r).then(e=>{t||(p(e),o(e.id),x(e.name||``),C(e.description||``),T(typeof e.metadata?.ui?.color==`string`?e.metadata.ui.color:null),D(e.url||``),k(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 re=(t=e)=>{t&&(F(!0),Is(t).then(N).catch(()=>N([])).finally(()=>F(!1)))};(0,Z.useEffect)(()=>{if(u!==`shares`||!e)return;let t=!1;return Is(e).then(e=>{t||N(e)}).catch(()=>{t||N([])}),()=>{t=!0}},[u,e]);let V=async t=>{if(t.preventDefault(),e){_(!0);try{let t=await ts(e,{name:b.trim(),description:S.trim(),metadata:{...f?.metadata,ui:{...f?.metadata?.ui,color:w}}},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)}}},ie=async t=>{if(t.preventDefault(),e){_(!0);try{await Promise.all([rs(e,E.trim(),r,A),cs(e,{baseUrl:O.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)}}},ae=async()=>{if(e&&window.confirm(`Delete context "${e}"? This cannot be undone.`)){y(!0);try{await ks(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)}}},oe=async t=>{if(t.preventDefault(),!(!e||!I.trim())){B(`grant`);try{await Ps(e,I.trim(),R),L(``),re(),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{B(null)}}},H=async t=>{if(e&&window.confirm(`Revoke ${t.userEmail}'s access to "${e}"?`)){B(t.userEmail);try{await Qo(e,t.userEmail),re(),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{B(null)}}};if(m)return(0,Q.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Loading...`});if(!f)return(0,Q.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Context not found`});let se=RO.find(e=>e.id===u),ce=`/contexts/${e}${d}`;return(0,Q.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,Q.jsxs)(`div`,{className:`mx-auto max-w-3xl p-6 pb-12 max-md:px-4 max-md:pb-rail-stack`,children:[(0,Q.jsx)(Ww,{compact:!0,className:`mb-6 border-b pb-4`,title:`${se.label} - ${f.name||f.id}`,description:se.description,backTo:ce,onBack:l?s:void 0}),u===`general`&&(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsxs)(`form`,{onSubmit:V,className:`space-y-4 rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`text-sm font-medium`,children:`Context ID`}),(0,Q.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,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`ctx-name`,className:`text-sm font-medium`,children:`Name`}),(0,Q.jsx)(J,{id:`ctx-name`,value:b,onChange:e=>x(e.target.value),placeholder:`My Context`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`ctx-description`,className:`text-sm font-medium`,children:`Description`}),(0,Q.jsx)(J,{id:`ctx-description`,value:S,onChange:e=>C(e.target.value),placeholder:`Optional description`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`ctx-color`,className:`text-sm font-medium`,children:`Color`}),(0,Q.jsxs)(`div`,{className:`mt-1 flex items-center gap-2`,children:[(0,Q.jsx)(J,{id:`ctx-color`,type:`color`,value:/^#[0-9a-f]{6}$/i.test(w||f.color||``)?w||f.color:`#808080`,onChange:e=>T(e.target.value),className:`h-10 w-16 p-1`,disabled:g}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,disabled:g||w===null,onClick:()=>T(null),children:`Use inherited color`})]}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:w===null?`Using the tree folder or workspace color.`:`Applies only to this context.`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{className:`text-sm font-medium`,children:`Workspace`}),(0,Q.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,Q.jsx)(X,{type:`submit`,disabled:g,children:g?`Saving...`:`Save Changes`})]}),(0,Q.jsxs)(`section`,{className:`rounded-lg border border-destructive/30 p-4`,children:[(0,Q.jsx)(`h2`,{className:`mb-3 text-sm font-semibold text-destructive`,children:`Danger Zone`}),(0,Q.jsxs)(X,{variant:`destructive`,disabled:v,onClick:ae,children:[(0,Q.jsx)(rt,{className:`mr-2 h-4 w-4`}),v?`Deleting...`:`Delete Context`]})]})]}),u===`location`&&(0,Q.jsxs)(`form`,{onSubmit:ie,className:`space-y-4 rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`ctx-url`,className:`text-sm font-medium`,children:`URL`}),(0,Q.jsx)(Ym,{id:`ctx-url`,value:E,onChange:D,fixedWorkspaceName:f.workspaceName,pickerTitle:`Switch context to…`,placeholder:`workspace://path`,onPickTarget:(e,t)=>{D(`${t.workspaceName}://${e.replace(/^\/+/,``)}`),j(t.treeName)}}),A&&(0,Q.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Destination tree: `,A]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`label`,{htmlFor:`ctx-base-url`,className:`text-sm font-medium`,children:[`Base URL `,(0,Q.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`(optional)`})]}),(0,Q.jsx)(Ym,{id:`ctx-base-url`,value:O,onChange:k,fixedWorkspaceName:f.workspaceName,placeholder:`workspace://base/path`,pickerTitle:`Pick a base path…`})]}),(0,Q.jsx)(X,{type:`submit`,disabled:g,children:g?`Saving...`:`Save Changes`})]}),u===`shares`&&(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`People with access`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Only the context owner can see and change this list.`})]}),(0,Q.jsxs)(X,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>re(),disabled:ee,children:[(0,Q.jsx)(P,{className:q(`mr-2 h-3.5 w-3.5`,ee&&`animate-spin`)}),`Refresh`]})]}),M.length===0?(0,Q.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Not shared with anyone.`}):M.map(e=>(0,Q.jsxs)(`div`,{className:`flex items-start justify-between gap-3 rounded-md border p-3`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.userEmail}),(0,Q.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[uI.find(t=>t.value===e.accessLevel)?.label||e.accessLevel||`unknown access`,e.sharedAt&&` - since ${new Date(e.sharedAt).toLocaleDateString()}`]})]}),(0,Q.jsx)(X,{type:`button`,variant:`outline`,size:`sm`,className:`text-destructive hover:text-destructive`,disabled:ne===e.userEmail,onClick:()=>H(e),children:(0,Q.jsx)(z,{className:`h-3.5 w-3.5`})})]},e.userEmail))]}),(0,Q.jsxs)(`form`,{onSubmit:oe,className:`space-y-4 rounded-lg border p-4`,children:[(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Grant access`}),(0,Q.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`share-email`,className:`text-sm font-medium`,children:`User email`}),(0,Q.jsx)(J,{id:`share-email`,type:`email`,value:I,onChange:e=>L(e.target.value),placeholder:`person@example.com`}),(0,Q.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`The user must already have an account on this server.`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`share-level`,className:`text-sm font-medium`,children:`Access level`}),(0,Q.jsx)(`select`,{id:`share-level`,value:R,onChange:e=>te(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:uI.map(e=>(0,Q.jsx)(`option`,{value:e.value,children:e.label},e.value))})]})]}),(0,Q.jsx)(X,{type:`submit`,disabled:ne===`grant`||!I.trim(),children:ne===`grant`?`Sharing...`:`Share context`})]})]})]})})}function fI({status:e}){let t={running:{icon:Oe,color:`text-success`,bg:`bg-success-subtle`,label:`Running`},stopped:{icon:S,color:`text-muted-foreground`,bg:`bg-muted`,label:`Stopped`},starting:{icon:N,color:`text-info`,bg:`bg-info-subtle`,label:`Starting`},stopping:{icon:N,color:`text-warning`,bg:`bg-warning-subtle`,label:`Stopping`},error:{icon:R,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Error`},created:{icon:Kt,color:`text-muted-foreground`,bg:`bg-muted`,label:`Created`},configured:{icon:Kt,color:`text-info`,bg:`bg-info-subtle`,label:`Configured`},removed:{icon:S,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Removed`}},n=t[e]||t.created,r=n.icon;return(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium ${n.bg} ${n.color}`,children:[(0,Q.jsx)(r,{className:`w-3 h-3`}),n.label]})}function pI(){let[e,t]=(0,Z.useState)([]),[n,r]=(0,Z.useState)(!0),[i,a]=(0,Z.useState)(null),[o,s]=(0,Z.useState)(null);Np(()=>s(null),o!==null);let[c,l]=Qw(),[u,d]=(0,Z.useState)([]),[f,p]=(0,Z.useState)([]),[m,h]=(0,Z.useState)(``),[g,_]=(0,Z.useState)(``),[v,y]=(0,Z.useState)(``),[b,x]=(0,Z.useState)(!1),{showToast:S}=Hr(),C=vd(),w=(0,Z.useCallback)(async()=>{try{r(!0);let e=await qM.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,Z.useEffect)(()=>{let e=()=>w();e();let t=setInterval(e,3e4);return()=>clearInterval(t)},[w]),(0,Z.useEffect)(()=>{c&&(qM.listTemplates().then(e=>{let t=e.filter(e=>e.type===`workspace`);d(t),h(e=>e||t[0]?.id||``)}).catch(()=>d([])),ji().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 qM.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 qM.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 qM.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 qM.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 qM.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,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{title:`My Roles`,description:`Manage your workspace roles and services`,actions:(0,Q.jsxs)(Q.Fragment,{children:[!c&&(0,Q.jsxs)(X,{onClick:()=>l(!0),children:[(0,Q.jsx)(cn,{className:`mr-2 h-4 w-4`}),`Create Role`]}),(0,Q.jsxs)(X,{onClick:w,variant:`outline`,children:[(0,Q.jsx)(j,{className:`mr-2 h-4 w-4`}),`Refresh`]})]})}),c&&(0,Q.jsx)(Xw,{title:`Create New Role`,onClose:()=>l(!1),children:(0,Q.jsxs)(`form`,{onSubmit:T,className:`space-y-4`,children:[(0,Q.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`role-template`,className:`mb-1 block text-sm font-medium`,children:`Template`}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`No workspace templates available`}),u.map(e=>(0,Q.jsxs)(`option`,{value:e.id,children:[e.name,` - `,e.description]},e.id))]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`role-name`,className:`mb-1 block text-sm font-medium`,children:`Role Name`}),(0,Q.jsx)(J,{id:`role-name`,value:g,onChange:e=>_(e.target.value),placeholder:`e.g., canvas-sshd`,disabled:b})]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`label`,{htmlFor:`role-workspace`,className:`mb-1 block text-sm font-medium`,children:`Workspace`}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`No workspaces available. Create one first.`}),f.map(e=>(0,Q.jsx)(`option`,{value:e.id,children:e.label||e.name},e.id))]})]}),(0,Q.jsxs)(X,{type:`submit`,disabled:b||!m||!g.trim()||!v,children:[(0,Q.jsx)(cn,{className:`mr-2 h-4 w-4`}),b?`Creating…`:`Create Role`]})]})}),n?(0,Q.jsx)(`div`,{className:`text-center py-8`,children:`Loading roles...`}):i?(0,Q.jsx)(`div`,{className:`text-center py-8 text-destructive`,children:i}):e.length===0?(0,Q.jsxs)(`div`,{className:`text-center py-12 border rounded-lg`,children:[(0,Q.jsx)(Yt,{className:`w-12 h-12 mx-auto text-muted-foreground mb-4`}),(0,Q.jsx)(`p`,{className:`text-muted-foreground`,children:`You don't have any workspace roles yet`}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2`,children:`Contact your administrator to set up roles for your workspaces`})]}):(0,Q.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:e.map(e=>(0,Q.jsxs)(`div`,{className:`border rounded-lg p-6 space-y-4 hover:shadow-elevation-2 transition-shadow`,children:[(0,Q.jsxs)(`div`,{className:`flex items-start justify-between`,children:[(0,Q.jsxs)(`div`,{className:`flex-1`,children:[(0,Q.jsx)(`h3`,{className:`font-semibold text-lg`,children:e.name}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.template})]}),(0,Q.jsx)(fI,{status:e.status})]}),e.container&&(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Q.jsx)(Yt,{className:`w-3 h-3`}),(0,Q.jsx)(`span`,{className:`truncate`,children:e.container.name})]})}),(0,Q.jsxs)(`div`,{className:`flex gap-2 pt-2`,children:[e.status===`stopped`||e.status===`created`?(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,onClick:()=>E(e),className:`flex-1`,children:[(0,Q.jsx)(Se,{className:`w-4 h-4 mr-2`}),`Start`]}):e.status===`running`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,onClick:()=>D(e),className:`flex-1`,children:[(0,Q.jsx)(Bn,{className:`w-4 h-4 mr-2`}),`Stop`]}),(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,onClick:()=>O(e),className:`flex-1`,children:[(0,Q.jsx)(j,{className:`w-4 h-4 mr-2`}),`Restart`]})]}):(0,Q.jsxs)(X,{size:`sm`,variant:`outline`,disabled:!0,className:`flex-1`,children:[(0,Q.jsx)(N,{className:`w-4 h-4 mr-2`}),e.status]}),(0,Q.jsx)(X,{size:`sm`,variant:`outline`,onClick:()=>k(e),title:`View Logs`,children:(0,Q.jsx)(rn,{className:`w-4 h-4`})})]})]},e.id))}),(0,Q.jsxs)(`div`,{className:`border-t pt-6`,children:[(0,Q.jsx)(`h2`,{className:`text-lg font-semibold mb-4`,children:`Global Services`}),(0,Q.jsxs)(`div`,{className:`text-sm text-muted-foreground space-y-2`,children:[(0,Q.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,Q.jsx)(`p`,{children:`To check the status of global services, contact your system administrator.`})]})]}),o&&(0,Q.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Q.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,Q.jsxs)(`div`,{className:`p-6 border-b`,children:[(0,Q.jsxs)(`h2`,{className:`text-xl font-bold`,children:[o.role.name,` - Logs`]}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:o.role.template})]}),(0,Q.jsx)(`div`,{className:`flex-1 overflow-y-auto p-6`,children:(0,Q.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,Q.jsx)(`div`,{className:`text-muted-foreground`,children:`No logs available`}):(0,Q.jsx)(`pre`,{children:o.logs.join(`
51
- `)})})}),(0,Q.jsx)(`div`,{className:`p-4 border-t flex justify-end`,children:(0,Q.jsx)(X,{onClick:()=>s(null),children:`Close`})})]})})]})}function mI(){return(0,Q.jsxs)(`div`,{className:`space-y-6`,children:[(0,Q.jsx)(Ww,{title:`Remotes`,description:`Connect to remote Canvas instances`}),(0,Q.jsx)(`div`,{className:`flex flex-col items-center justify-center py-12 space-y-4`,children:(0,Q.jsxs)(`div`,{className:`text-center`,children:[(0,Q.jsx)(`h2`,{className:`text-2xl font-semibold mb-2`,children:`Coming Soon`}),(0,Q.jsx)(`p`,{className:`text-muted-foreground max-w-md`,children:`Remote connection management is currently under development. Check back later for updates.`})]})})]})}var hI=[`note`,`todo`,`link`,`file`,`photo`];function gI(){let{kind:e}=yl(),t=hl();return e===`sketch`?(0,Q.jsx)(Vl,{to:`/apps/sketch?add=1`,replace:!0}):!e||!hI.includes(e)?(0,Q.jsx)(Vl,{to:`/home`,replace:!0}):(0,Q.jsx)(nO,{initialKind:e,onInitialCardClose:()=>t(`/home`)})}var _I=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Ul,{index:!0,element:(0,Q.jsx)(fO,{})},`r1`),(0,Q.jsx)(Ul,{path:`home`,element:(0,Q.jsx)(dO,{})},`r2`),(0,Q.jsx)(Ul,{path:`share-target`,element:(0,Q.jsx)(yO,{})},`r3`),(0,Q.jsx)(Ul,{path:`apps/add/:kind`,element:(0,Q.jsx)(gI,{})},`r4`),(0,Q.jsx)(Ul,{path:`workspaces`,element:(0,Q.jsx)(YT,{})},`r5`),(0,Q.jsx)(Ul,{path:`workspaces/:workspaceName`,element:(0,Q.jsx)(aD,{})},`r6`),(0,Q.jsx)(Ul,{path:`workspaces/:workspaceName/documents/by-id/:documentId`,element:(0,Q.jsx)(uD,{})},`workspace-document-by-id`),(0,Q.jsx)(Ul,{path:`workspaces/:workspaceName/documents/:documentId`,element:(0,Q.jsx)(uD,{})},`workspace-document`),(0,Q.jsx)(Ul,{path:`workspaces/:workspaceName/documents/by-hash/:algo/:checksum`,element:(0,Q.jsx)(uD,{})},`workspace-document-by-hash`),(0,Q.jsx)(Ul,{path:`workspaces/:workspaceName/documents/by-checksum/:algo/:checksum`,element:(0,Q.jsx)(uD,{})},`workspace-document-by-checksum`),(0,Q.jsx)(Ul,{path:`workspaces/:workspaceName/settings`,element:(0,Q.jsx)(oI,{})},`r7`),(0,Q.jsx)(Ul,{path:`workspaces/:workspaceName/settings/:tab`,element:(0,Q.jsx)(oI,{})},`r8`),(0,Q.jsx)(Ul,{path:`workspaces/:workspaceName/path/*`,element:(0,Q.jsx)(aD,{})},`r9`),(0,Q.jsx)(Ul,{path:`workspaces/:workspaceName/trees/:treeName`,element:(0,Q.jsx)(aD,{})},`r10`),(0,Q.jsx)(Ul,{path:`workspaces/:workspaceName/trees/:treeName/path/*`,element:(0,Q.jsx)(aD,{})},`r11`),(0,Q.jsx)(Ul,{path:`contexts`,element:(0,Q.jsx)(SO,{})},`r12`),(0,Q.jsx)(Ul,{path:`contexts/:contextId`,element:(0,Q.jsx)(wO,{})},`r13`),(0,Q.jsx)(Ul,{path:`contexts/:contextId/settings`,element:(0,Q.jsx)(dI,{})},`r14`),(0,Q.jsx)(Ul,{path:`contexts/:contextId/settings/:tab`,element:(0,Q.jsx)(dI,{})},`r15`),(0,Q.jsx)(Ul,{path:`agents`,element:(0,Q.jsx)(xN,{})},`r16`),(0,Q.jsx)(Ul,{path:`agents/:agentId`,element:(0,Q.jsx)(LN,{})},`r17`),(0,Q.jsx)(Ul,{path:`agents/:agentId/:sessionId`,element:(0,Q.jsx)(LN,{})},`r18`),(0,Q.jsx)(Ul,{path:`agents/:agentId/settings`,element:(0,Q.jsx)(GN,{})},`r19`),(0,Q.jsx)(Ul,{path:`agents/:agentId/settings/:tab`,element:(0,Q.jsx)(GN,{})},`r20`),(0,Q.jsx)(Ul,{path:`roles`,element:(0,Q.jsx)(pI,{})},`r21`),(0,Q.jsx)(Ul,{path:`remotes`,element:(0,Q.jsx)(mI,{})},`r22`),(0,Q.jsx)(Ul,{path:`settings`,element:(0,Q.jsx)(Ok,{})},`settings`),(0,Q.jsx)(Ul,{path:`appearance`,element:(0,Q.jsx)(JA,{})},`r23`),(0,Q.jsx)(Ul,{path:`key-bindings`,element:(0,Q.jsx)(rj,{})},`key-bindings`),(0,Q.jsx)(Ul,{path:`offline`,element:(0,Q.jsx)(Hj,{})},`r24`),(0,Q.jsx)(Ul,{path:`about`,element:(0,Q.jsx)(Gj,{})},`r25`),(0,Q.jsx)(Ul,{path:`api-tokens`,element:(0,Q.jsx)(EO,{})},`r26`),(0,Q.jsx)(Ul,{path:`devices`,element:(0,Q.jsx)(PO,{})},`r27`),(0,Q.jsx)(Ul,{path:`embedding`,element:(0,Q.jsx)(EM,{})},`r28`),(0,Q.jsx)(Ul,{path:`shared`,element:(0,Q.jsx)(DM,{})},`r29`),(0,Q.jsx)(Ul,{path:`admin/users`,element:(0,Q.jsx)(ZM,{})},`r30`),(0,Q.jsx)(Ul,{path:`admin/contexts`,element:(0,Q.jsx)(VM,{})},`r31`),(0,Q.jsx)(Ul,{path:`admin/workspaces`,element:(0,Q.jsx)(BM,{})},`r32`),(0,Q.jsx)(Ul,{path:`admin/agents`,element:(0,Q.jsx)(HM,{})},`r33`),(0,Q.jsx)(Ul,{path:`admin/logs`,element:(0,Q.jsx)(KM,{})},`r34`),(0,Q.jsx)(Ul,{path:`admin/roles`,element:(0,Q.jsx)(XM,{})},`r35`),(0,Q.jsx)(Ul,{path:`admin/embedding`,element:(0,Q.jsx)(QM,{})},`r36`),(0,Q.jsx)(Ul,{path:`admin/auth`,element:(0,Q.jsx)(yN,{})},`r37`)]});function vI(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 yI(e){let t=2166136261;for(let n of e)t=Math.imul(t^n.charCodeAt(0),16777619);return`canvas:last-screen:${t>>>0}`}var bI=Kl(_I),xI=e=>{let t=vI(e);return t&&oc(bI,t)?t:null};function SI(){let e=fl(),[t]=(0,Z.useState)(()=>{if(e.pathname!==`/`||e.search||e.hash)return null;try{let t=localStorage.getItem(`authToken`);return t?{key:e.key,path:xI(localStorage.getItem(yI(t)))||`/home`}:null}catch{return{key:e.key,path:`/home`}}}),n=t&&e.key===t.key&&e.pathname===`/`;return(0,Z.useEffect)(()=>{if(n)return;let t=xI(e.pathname+e.search+e.hash);if(t)try{let e=localStorage.getItem(`authToken`);e&&localStorage.setItem(yI(e),t)}catch{}},[e.pathname,e.search,e.hash,n]),n?(0,Q.jsx)(Vl,{to:t.path,replace:!0}):null}var CI={activeSection:null,m0Open:!1,m1Open:!1,m2Open:!1,m2View:null,selectedEntityId:null,user:null};function wI(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`: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:t.m2View!==null,m2View:t.m2View};case`SET_USER`:return{...e,user:t.user};default:return e}}function TI({children:e}){let[t,n]=(0,Z.useReducer)(wI,CI),r=fl(),i=hl(),a=(0,Z.useRef)(t);(0,Z.useLayoutEffect)(()=>{a.current=t},[t]),NT(t,n);let o=(0,Z.useCallback)((e,t=!1,o=!1)=>{let s=wI(a.current,e);if(a.current=s,n(e),!kT())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,Z.useCallback)(e=>{if(kT()&&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,Z.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}=MT(r.pathname);if(!kT()){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,Z.useEffect)(()=>{let e=vd();if(e){n({type:`SET_USER`,user:e});return}let t=!1;return yd().then(e=>{!t&&e&&n({type:`SET_USER`,user:e})}).catch(()=>{}),()=>{t=!0}},[]);let l={state:t,dispatch:n,setSection:(0,Z.useCallback)(e=>{o({type:`SET_SECTION`,section:e})},[o]),toggleSection:(0,Z.useCallback)(e=>{o({type:`TOGGLE_SECTION`,section:e})},[o]),toggleM0:(0,Z.useCallback)(()=>{o({type:`TOGGLE_M0`},a.current.m0Open)},[o]),closeM0:(0,Z.useCallback)(()=>{o({type:`CLOSE_M0`},!0)},[o]),closeM1:(0,Z.useCallback)(()=>{o({type:`CLOSE_M1`},!0)},[o]),openM2:(0,Z.useCallback)((e,t)=>{o({type:`OPEN_M2`,view:e,entityId:t})},[o]),openM2Drawer:(0,Z.useCallback)((e,t,n)=>{o({type:`OPEN_M2_DRAWER`,section:e,view:t,entityId:n})},[o]),openM1Drawer:(0,Z.useCallback)(e=>{o({type:`OPEN_M1_DRAWER`,section:e})},[o]),closeM2:(0,Z.useCallback)(()=>{kT()&&a.current.m1Open&&a.current.m2Open?c():n({type:`CLOSE_M2`})},[c]),selectEntity:(0,Z.useCallback)(e=>{n({type:`SELECT_ENTITY`,entityId:e})},[]),goBack:c,navigateFromMenu:s};return(0,Q.jsx)(AT.Provider,{value:l,children:e})}function EI(){return(0,Z.useSyncExternalStore)(Pr,Er,()=>!1)}function DI(e,t){let n=null,r=!1,i,a;function o(){clearTimeout(i),!r&&Er()&&(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=Er();return Or(),(i||s)&&t(),!0}catch{return r||jr(),!1}finally{clearTimeout(c),n=null,o()}})(),n}let c=Pr(o),l=()=>{s()};return window.addEventListener(`online`,l),o(),{retry:s,stop(){r=!0,clearTimeout(i),a?.abort(),c(),window.removeEventListener(`online`,l)}}}var OI;function kI(){OI=DI(`${Rr}/ping`,()=>pd.retryNow());let e=()=>{OI?.retry()},t=pd.on(`connect_error`,e),n=pd.on(`disconnect`,e);return()=>{t(),n(),OI?.stop(),OI=void 0}}function AI(){return OI?.retry(!0)??Promise.resolve(!1)}function jI(){let e=EI(),[t,n]=(0,Z.useState)(!1);return e?(0,Q.jsxs)(`details`,{className:`relative`,children:[(0,Q.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,Q.jsx)(w,{className:`h-5 w-5`})}),(0,Q.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,Q.jsx)(`p`,{className:`text-sm font-medium`,role:`status`,children:`Offline`}),(0,Q.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,Q.jsx)(`button`,{type:`button`,disabled:t,onClick:async()=>{n(!0);try{await AI()}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 MI=Re,NI=O,PI=rr,FI=Z.forwardRef(({className:e,sideOffset:t=4,...n},r)=>(0,Q.jsx)(or,{children:(0,Q.jsx)(wt,{ref:r,sideOffset:t,className:q(`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})}));FI.displayName=wt.displayName;var II=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(ht,{ref:n,className:q(`relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full`,e),...t}));II.displayName=ht.displayName;var LI=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(ur,{ref:n,className:q(`aspect-square h-full w-full`,e),...t}));LI.displayName=ur.displayName;var RI=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)($n,{ref:n,className:q(`flex h-full w-full items-center justify-center rounded-full bg-muted`,e),...t}));RI.displayName=$n.displayName;function zI({section:e,icon:t,label:n,disabled:r}){let{state:i,toggleSection:a}=jT(),o=i.activeSection===e;return(0,Q.jsxs)(NI,{children:[(0,Q.jsx)(PI,{asChild:!0,children:(0,Q.jsxs)(`button`,{type:`button`,disabled:r,"aria-label":n,onClick:()=>!r&&e&&a(e),className:q(`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,Q.jsx)(`span`,{className:`absolute right-0 top-1/2 -translate-y-1/2 w-0.5 h-5 bg-foreground rounded-l`}),t]})}),(0,Q.jsx)(FI,{side:`right`,sideOffset:8,children:n})]})}function BI({path:e,icon:t,label:n,section:r=`settings`}){let i=hl(),{setSection:a}=jT();return(0,Q.jsxs)(NI,{children:[(0,Q.jsx)(PI,{asChild:!0,children:(0,Q.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,Q.jsx)(FI,{side:`right`,sideOffset:8,children:n})]})}function VI(){let{state:e,toggleM0:t}=jT(),n=EI();return(0,Q.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,Q.jsx)(W,{className:`h-5 w-5`}):(0,Q.jsx)(Gn,{className:`h-5 w-5`}),n&&(0,Q.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 HI(){let{state:e,closeM0:t,closeM1:n}=jT(),{state:r,setView:i,closeT1:a}=Rs(),o=hl(),{showToast:s}=Hr(),c=e.user?.userType===`admin`,l=Hw(),u=()=>{r.t1Open?a():i(`tools`),n(),t()},d=(0,Z.useCallback)(async()=>{try{await Y.post(`/auth/logout`),localStorage.removeItem(`authToken`),o(`/login`)}catch{s({title:`Error`,description:`Logout failed`,variant:`destructive`})}},[o,s]);return(0,Q.jsxs)(MI,{delayDuration:200,children:[e.m0Open&&(0,Q.jsx)(`div`,{className:`fixed inset-0 z-nav-scrim bg-scrim animate-fade-in md:hidden`,onClick:t,"aria-hidden":!0}),(0,Q.jsxs)(`div`,{"data-shell":`rail`,className:q(`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,Q.jsx)(`div`,{className:`flex items-center justify-center h-12 w-full shrink-0`,children:(0,Q.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,Q.jsx)(`img`,{src:`/images/logo-br_128x128.png`,alt:``,className:`w-6 h-6`})})}),(0,Q.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,Q.jsx)(zI,{section:`contexts`,icon:(0,Q.jsx)(dr,{className:`w-5 h-5`}),label:`Contexts`}),(!l.local||l.workspace!==!1)&&(0,Q.jsx)(zI,{section:`workspaces`,icon:(0,Q.jsx)(er,{className:`w-5 h-5`}),label:`Workspaces`}),(!l.local||l.agent)&&(0,Q.jsx)(zI,{section:`agents`,icon:(0,Q.jsx)(lt,{className:`w-5 h-5`}),label:`Agents`}),(!l.local||l.workspace!==!1)&&(0,Q.jsx)(BI,{path:`/roles`,section:null,icon:(0,Q.jsx)(hn,{className:`w-5 h-5`}),label:`Roles`}),c&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`w-6 h-px bg-border my-2`}),(0,Q.jsx)(BI,{path:`/admin/users`,icon:(0,Q.jsx)(V,{className:`w-5 h-5`}),label:`All Users`}),(0,Q.jsx)(BI,{path:`/admin/logs`,icon:(0,Q.jsx)(rn,{className:`w-5 h-5`}),label:`Server Logs`}),(0,Q.jsx)(BI,{path:`/admin/workspaces`,icon:(0,Q.jsx)(it,{className:`w-5 h-5`}),label:`All Workspaces`}),(0,Q.jsx)(BI,{path:`/admin/agents`,icon:(0,Q.jsx)(lt,{className:`w-5 h-5`}),label:`All Agents`}),(0,Q.jsx)(BI,{path:`/admin/roles`,icon:(0,Q.jsx)(hn,{className:`w-5 h-5`}),label:`All Roles`})]})]}),(0,Q.jsxs)(`div`,{className:`flex flex-col items-center gap-1 py-2 shrink-0`,children:[(0,Q.jsx)(`div`,{className:`w-6 h-px bg-border mb-2`}),(0,Q.jsx)(jI,{}),(0,Q.jsxs)(NI,{children:[(0,Q.jsx)(PI,{asChild:!0,children:(0,Q.jsx)(`button`,{type:`button`,onClick:u,"aria-label":r.t1Open?`Close toolbox`:`Open toolbox`,className:q(`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,Q.jsx)(Pe,{className:`w-5 h-5`})})}),(0,Q.jsx)(FI,{side:`right`,sideOffset:8,children:`Toolbox`})]}),!l.local&&(0,Q.jsx)(BI,{path:`/settings`,section:`settings`,icon:(0,Q.jsx)(bn,{className:`w-5 h-5`}),label:`Settings`}),(0,Q.jsxs)(NI,{children:[(0,Q.jsx)(PI,{asChild:!0,children:(0,Q.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,Q.jsx)(II,{className:`h-7 w-7 touch-target`,children:(0,Q.jsx)(RI,{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,Q.jsx)(FI,{side:`right`,sideOffset:8,children:e.user?.email?.split(`@`)[0]||`Profile`})]}),(0,Q.jsxs)(NI,{children:[(0,Q.jsx)(PI,{asChild:!0,children:(0,Q.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,Q.jsx)(En,{className:`w-5 h-5`})})}),(0,Q.jsx)(FI,{side:`right`,sideOffset:8,children:`Logout`})]})]})]})]})}function UI(e,t,n,r=!0){let i=$g(),a=fl(),o=(0,Z.useRef)(null);(0,Z.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 WI(e){let[t,n]=(0,Z.useState)([]),[r,i]=(0,Z.useState)(!1),a=(0,Z.useRef)(!1),o=(0,Z.useRef)(!1),s=(0,Z.useCallback)(async()=>{if(!o.current){o.current=!0,i(!0);try{let e=await fs();n(e||[]),a.current=!0}catch(e){console.error(`Failed to fetch contexts:`,e)}finally{o.current=!1,i(!1)}}},[]),c=(0,Z.useRef)(s);(0,Z.useEffect)(()=>{c.current=s});let l=(0,Z.useCallback)(()=>{a.current=!1,s()},[s]);return(0,Z.useEffect)(()=>{e&&!a.current&&s()},[e,s]),(0,Z.useEffect)(()=>{if(!e)return;let t=()=>pd.emit(`subscribe`,{channel:`context`}),r=()=>pd.emit(`unsubscribe`,{channel:`context`}),i=pd.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])=>pd.on(e,t)),()=>{r(),i?.(),p.forEach(([e,t])=>pd.off(e,t))}},[e,s]),(0,Z.useEffect)(()=>{let e=e=>{let t=e.detail;n(e=>e.filter(e=>!os(e,t)))};return window.addEventListener(as,e),()=>window.removeEventListener(as,e)},[]),(0,Z.useEffect)(()=>{let e=()=>{a.current=!1,s()};return window.addEventListener(`contexts:refresh`,e),()=>window.removeEventListener(`contexts:refresh`,e)},[s]),{contexts:(0,Z.useMemo)(()=>GT(t),[t]),isLoading:r,refresh:l}}function GI(){let{goBack:e}=jT();return(0,Q.jsx)(`button`,{type:`button`,onClick:e,"aria-label":`Back to previous view`,title:`Back to previous view`,className:`-ml-2 mr-1 flex h-11 w-11 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent md:hidden`,children:(0,Q.jsx)(Yn,{className:`h-5 w-5`})})}function KI(){let{state:e,selectEntity:t,openM2:n,closeM2:r}=jT(),i=$g(),{contexts:a,isLoading:o}=WI(e.activeSection===`contexts`),{showToast:s}=Hr(),c=hl(),[l,u]=(0,Z.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:_}=JT((e,t)=>{let n=KT(d,e,t);u({base:a,order:n}),qT(n,(e,t)=>p(e)?Promise.resolve():cs(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,Q.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:[(0,Q.jsxs)(`div`,{className:`flex min-w-0 items-center`,children:[(0,Q.jsx)(GI,{}),(0,Q.jsx)(`span`,{className:`text-sm font-semibold`,children:`Contexts`})]}),(0,Q.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,Q.jsx)(cn,{className:`w-3.5 h-3.5`})})]}),(0,Q.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:o&&a.length===0?(0,Q.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading...`}):a.length===0?(0,Q.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`No contexts found`}):(0,Q.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=Cm(r.color);return(0,Q.jsxs)(`div`,{...m(a),"data-active":o||void 0,className:q(`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,Q.jsx)(`div`,{className:q(`absolute inset-y-0 right-0 w-4 rounded-r-(--card-radius)`,!u&&`bg-muted`),style:u?{backgroundColor:u}:void 0}):(0,Q.jsx)(`button`,{type:`button`,...h(a),title:`Drag to reorder`,"aria-label":`Drag to reorder`,className:q(`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,Q.jsx)(T,{className:q(`h-3.5 w-3.5`,wm(u))})}),(0,Q.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Q.jsx)(f,{icon:r.icon||`ph:stack-fill`,width:16,height:16,color:u,className:q(`mt-0.5 shrink-0`,!u&&`text-muted-foreground`)}),(0,Q.jsx)(`span`,{className:`text-sm font-medium truncate flex-1`,children:r.name||r.id}),s&&(0,Q.jsx)(`span`,{className:`rounded-full bg-info/10 px-1.5 py-0.5 text-[9px] text-info shrink-0`,children:`Shared`}),l&&(0,Q.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,Q.jsx)(Qt,{className:`w-3.5 h-3.5 text-muted-foreground hover:text-foreground`})}),(0,Q.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,Q.jsx)(bn,{className:`w-3.5 h-3.5 text-muted-foreground hover:text-foreground`})})]}),r.name&&(0,Q.jsx)(`div`,{className:`text-[10px] text-muted-foreground/60 truncate font-mono`,children:r.id}),(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5`,children:r.url||`/`}),r.ownerEmail&&(0,Q.jsx)(`div`,{className:`text-[10px] text-muted-foreground truncate mt-0.5`,children:r.ownerEmail})]},`${r.userId||`u`}-${r.id}`)})})})]})}function qI({title:e,onBack:t,action:n,className:r,icon:i,accentColor:a}){let{closeM1:o}=jT(),s=Cm(a);return(0,Q.jsxs)(`div`,{className:q(`flex items-center h-12 px-2 border-b border-border shrink-0 gap-1`,r),style:{borderBottomWidth:4,...s?{borderBottomColor:s}:{}},children:[(0,Q.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,Q.jsx)(E,{className:`w-4 h-4 shrink-0`}),i&&(0,Q.jsx)(f,{icon:i,width:16,height:16,color:s,className:q(`mr-1 shrink-0`,!s&&`text-muted-foreground`)}),(0,Q.jsx)(`span`,{className:`text-sm font-semibold truncate`,children:e})]}),n&&(0,Q.jsx)(`div`,{className:`shrink-0`,children:n}),(0,Q.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,Q.jsx)(W,{className:`w-4 h-4`})})]})}var JI=22,YI=44,XI=4;function ZI(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 QI(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 $I({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,onLock:x,onUnlock:S,onDestroy:C,onMerge:w,onSubtract:T,onMergeDown:E,onSubtractDown:D,onResyncBackend:O,onAddRule:k,onAddStoreRule:j,onStoragePolicy:M,onRenameBackendFolder:N,onDeleteBackendFolder:ee,onRestoreTrash:F,onDiscardTrash:I,onCopy:L,onCut:R,onPaste:z,pastedDocumentIds:B,onPasteDocuments:re,isPinned:V,onTogglePin:ie}){let ae=u&&d.size>0&&u.path===r,H=!i&&(E||D)&&r!==`/`&&n.type!==`canvas`&&r.split(`/`).filter(Boolean).length>1,se=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))}},U=(e,t,n,r=!1)=>(0,Q.jsxs)(`button`,{type:`button`,className:q(`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,Q.jsxs)(Wp,{x:e,y:t,onClose:s,className:`min-w-44 rounded-md border bg-popover p-1 shadow-elevation-3`,children:[c&&U((0,Q.jsx)(rt,{className:`h-3 w-3`}),`Open Trash`,async()=>c(r)),r!==`/Trash`&&F&&U((0,Q.jsx)(ar,{className:`h-3 w-3`}),`Restore original paths`,()=>F(r)),r!==`/Trash`&&I&&U((0,Q.jsx)(rt,{className:`h-3 w-3`}),`Empty Trash`,()=>I(r),!0)]}):(0,Q.jsxs)(Wp,{x:e,y:t,onClose:s,className:`min-w-[11rem] rounded-md border bg-popover p-1 shadow-elevation-3`,children:[c&&U((0,Q.jsx)(Zn,{className:`w-3 h-3`}),`Show layer content`,async()=>{c(r,n.id||void 0)}),l&&U((0,Q.jsx)(Zn,{className:`w-3 h-3`}),`Open to the side`,async()=>{l(r)}),(c||l)&&(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`}),n.type===`canvas`&&g&&U((0,Q.jsx)(Mn,{className:`w-3 h-3`}),`Share canvas`,async()=>{await g(r)}),n.type===`canvas`&&g&&(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`}),O&&QI(r,i)&&(0,Q.jsxs)(Q.Fragment,{children:[U((0,Q.jsx)(P,{className:`w-3 h-3`}),`Resync backend (${QI(r,i)})`,async()=>{await O(r)}),(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`})]}),i&&QI(r,i)&&(k||j)&&(0,Q.jsxs)(Q.Fragment,{children:[k&&U((0,Q.jsx)(Pn,{className:`w-3 h-3`}),`Auto-Link documents to…`,async()=>{k(r)}),j&&ZI(r,i)&&U((0,Q.jsx)(Fe,{className:`w-3 h-3`}),`Create storage rule…`,async()=>{j(r)}),(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`})]}),!i&&(j||M)&&r!==`/`&&(0,Q.jsxs)(Q.Fragment,{children:[j&&U((0,Q.jsx)(Fe,{className:`w-3 h-3`}),`Create rule…`,async()=>{j(r)}),j&&U((0,Q.jsx)(Jt,{className:`w-3 h-3`}),`Create download rule…`,async()=>{j(r,`download`)}),M&&n.type!==`canvas`&&U((0,Q.jsx)(pe,{className:`w-3 h-3`}),`Storage policy…`,async()=>{M(r)}),(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`})]}),(!i||ZI(r,i))&&(0,Q.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,Q.jsx)(cn,{className:`w-3 h-3`}),`New folder here`]}),N&&ZI(r,i)?.key&&U((0,Q.jsx)(Le,{className:`w-3 h-3`}),`Rename folder`,async()=>{let e=r.split(`/`).pop()||``,t=prompt(`New folder name:`,e);!t||t===e||await N(r,t)}),ee&&i&&po(r,o)&&U((0,Q.jsx)(rt,{className:`w-3 h-3`}),`Delete from backend`,async()=>{confirm(`Delete folder "${r.split(`/`).pop()}" and its contents from the backend?`)&&await ee(r)},!0),h&&!i&&(0,Q.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,Q.jsx)(_t,{className:`w-3 h-3 text-primary`}),`New canvas here…`]}),r!==`/`&&ie&&U(V?(0,Q.jsx)(te,{className:`w-3 h-3`}):(0,Q.jsx)(ke,{className:`w-3 h-3`}),V?`Unpin`:`Pin`,async()=>{await ie()}),r!==`/`&&m&&(0,Q.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,Q.jsx)(oe,{className:`w-3 h-3`}),`Change icon`]}),r!==`/`&&!n.locked&&v&&!i&&U((0,Q.jsx)(Le,{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,Q.jsx)(`div`,{className:`my-1 h-px bg-border`}),U((0,Q.jsx)(A,{className:`w-3 h-3`}),`Copy`,async()=>L(r)),!i&&U((0,Q.jsx)(Dt,{className:`w-3 h-3`}),`Cut`,async()=>R(r)),f&&!i&&U((0,Q.jsx)(we,{className:`w-3 h-3`}),`Paste (${f.mode})`,async()=>z(r)),B&&B.length>0&&re&&U((0,Q.jsx)(we,{className:`w-3 h-3`}),`Paste ${B.length} document(s)`,async()=>{await re(r,B)}),(y||b)&&(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`}),y&&n.type!==`canvas`&&U((0,Q.jsx)(Jt,{className:`w-3 h-3`}),`Export subtree…`,()=>y(r)),b&&!i&&n.type!==`canvas`&&U((0,Q.jsx)(ne,{className:`w-3 h-3`}),`Import subtree here…`,()=>b(r)),!i&&r!==`/`&&!n.locked&&_&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`}),U((0,Q.jsx)(rt,{className:`w-3 h-3`}),`Remove`,async()=>{confirm(`Remove "${r}"${a?` and all children`:``}?`)&&await _(r,a)},!0),!a&&U((0,Q.jsx)(rt,{className:`w-3 h-3`}),`Remove recursive`,async()=>{confirm(`Remove "${r}" and all children?`)&&await _(r,!0)},!0)]}),!i&&(x||S||C)&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`}),n.locked?S&&U((0,Q.jsx)(kt,{className:`w-3 h-3`}),`Unlock layer`,async()=>{await S(n.id)}):x&&U((0,Q.jsx)(Hn,{className:`w-3 h-3`}),`Lock layer`,async()=>{await x(n.id)}),n.locked&&n.lockedBy&&n.lockedBy.length>0&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.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,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2 px-3 py-1 text-xs`,children:[(0,Q.jsx)(`span`,{className:`truncate`,title:e,children:e}),S&&(0,Q.jsx)(`button`,{type:`button`,title:`Remove lock held by ${e}`,className:`shrink-0 text-muted-foreground hover:text-destructive`,onClick:()=>ce(async()=>{await S(n.id,e)}),children:(0,Q.jsx)(kt,{className:`w-3 h-3`})})]},e))]}),r!==`/`&&!n.locked&&C&&U((0,Q.jsx)(rt,{className:`w-3 h-3`}),`Destroy layer`,async()=>{confirm(`Permanently destroy layer "${n.label||n.name}" and its bitmap?`)&&await C(n.id)},!0)]}),H&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`}),E&&U((0,Q.jsx)(An,{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 E(r)}),D&&U((0,Q.jsx)(Vn,{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 D(r)})]}),ae&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`}),w&&U((0,Q.jsx)(dr,{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
- `)}\n\nThe selected layers gain this layer's documents. This layer is unchanged.`)&&await w(n.id,Array.from(d.values()))}),T&&U((0,Q.jsx)(dr,{className:`w-3 h-3`}),`Subtract this layer from ${d.size} selected`,async()=>{confirm(`Subtract "${r}" (source) FROM:\n${Array.from(d.keys()).join(`
53
- `)}\n\nThe selected layers lose this layer's documents. This layer is unchanged.`)&&await T(n.id,Array.from(d.values()))})]}),se&&!ae&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`my-1 h-px bg-border`}),(0,Q.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 eL({onConfirm:e,onCancel:t,placeholder:n=`folder name…`}){let r=(0,Z.useRef)(null);(0,Z.useEffect)(()=>{r.current?.focus()},[]);let i=()=>{let n=r.current?.value.trim()??``;n?e(n):t()};return(0,Q.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,Q.jsx)(gr,{className:`w-4 h-4 opacity-0 shrink-0`}),(0,Q.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 tL(e,t){return e===`/`?`/${t}`:`${e}/${t}`}function nL(e,t,n){let r=tL(t,e.name);return r.toLowerCase().includes(n)||(e.label||``).toLowerCase().includes(n)?!0:e.children?.some(e=>nL(e,r,n))??!1}function rL({node:e,parentPath:t,depth:n,isLast:r,selectedPath:i,pendingPath:a,contentPath:o,readOnly:s,sourceLayer:c,targetLayers:l,clipboard:u,searchQuery:d,inlineCreateParent:p,onSelect:m,onShiftSelect:h,onShowContent:g,onCtrl:_,onCtxMenu:v,onConfirmCreate:y,onCancelCreate:b,onOpenPicker:x,styleOverrides:S,dragOverPath:C,isCopyDrag:w,onDragStart:T,onDragEnter:E,onDragOver:D,onDragLeave:O,onDragEnd:k,onDrop:A,resyncingPaths:j,policyBadgeFor:M,removingPaths:N,accordion:ee=!1,trail:F=[]}){let I=wp(),L=tL(t,e.name),R=M?.(L)??null,te=S.get(L)??mm(e),[z,ne]=(0,Z.useState)(()=>i!==`/`&&(i===L||i.startsWith(L+`/`))),[B,re]=(0,Z.useState)(i);if(B!==i&&(re(i),i!==`/`&&i.startsWith(L+`/`)&&ne(!0)),d&&!nL(e,t,d))return null;let V=z||p===L||d.length>0,ie=e.children&&e.children.length>0,ae=i===L,oe=a===L,H=c?.path===L,se=l.has(L),ce=e.type===`canvas`,U=t=>{if(t.ctrlKey||t.metaKey){_(L,e.id);return}if(t.shiftKey&&h){h(L);return}m(L)},le=e=>{!ie||e.ctrlKey||e.metaKey||e.shiftKey||e.altKey||e.target.closest(`button, input, textarea, select, a, [contenteditable="true"]`)||(e.preventDefault(),e.stopPropagation(),ne(e=>!e))},ue=[...F].reverse().find(Boolean)??null,de=te.color||ue,fe=ee?[...F,de]:F,me=i!==`/`&&i.startsWith(L+`/`),he=!H&&!se,W=he&&ae,ge=(e,t)=>`color-mix(in oklab, ${e} ${t}%, var(--card))`,_e=e=>`color-mix(in oklab, currentColor ${e}%, transparent)`,ve=Math.min(n,5),ye=V&&!!ie,G=n>0&&ue?ue:de,K=he&&!W&&!e.locked&&ye,be=G?Math.min(12+ve*5+(me?6:0),34):Math.min(ve*7+(me?5:0)+(oe?3:0),30),xe=W?`var(--primary)`:H?ge(`var(--info)`,22):se?ge(`var(--warning)`,22):e.locked?ge(`var(--warning)`,20+ve*4):K?de?ge(de,84):ge(`var(--foreground)`,38):ge(G||`var(--foreground)`,be),Se=W?`text-primary-foreground`:K&&de?Tm(de):`text-foreground`,Ce=ee&&V&&ie&&n<XI,we=(0,Q.jsxs)(`div`,{"data-active":ae||void 0,className:q(`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]`,Se,H&&`ring-1 ring-inset ring-info/40`,se&&!H&&`ring-1 ring-inset ring-warning/40`,C===L&&!s&&!w&&`ring-2 ring-inset ring-info`,C===L&&!s&&w&&`ring-2 ring-inset ring-success`),style:{height:YI,background:xe,borderBottom:`1px solid ${_e(14)}`,...Ce?{position:`sticky`,top:n*YI,zIndex:20-n}:{}},draggable:!s&&!e.metadata?.backendTrash,onClick:U,onDoubleClick:le,...s?{}:I,onContextMenu:t=>{s||(t.preventDefault(),v(t,L,e))},onDragStart:e=>{s||T(L,e)},onDragEnter:e=>{s||E(L,e)},onDragOver:e=>{s||D(L,e)},onDragLeave:e=>O(L,e),onDragEnd:()=>k(),onDrop:e=>{s||A(L,e)},children:[F.length>0&&(0,Q.jsx)(`span`,{className:`flex shrink-0 gap-px`,"aria-hidden":!0,children:F.map((e,t)=>(0,Q.jsx)(`span`,{className:`w-[3px]`,style:{background:e||_e(28)}},t))}),(()=>{let t=te.color?{background:te.color}:ue?{background:`color-mix(in oklab, ${ue} 45%, transparent)`}:{background:_e(10)},n=(0,Q.jsx)(f,{icon:te.icon||(ce?`ph:squares-four-fill`:`ph:folder-fill`),width:18,height:18,className:q(`shrink-0`,te.color?wm(te.color):W?`text-primary-foreground`:K?`text-current`:`text-foreground/80`)}),r=`flex w-10 shrink-0 items-center justify-center`;return x?(0,Q.jsx)(`button`,{type:`button`,className:r,style:t,title:`Change icon`,onClick:t=>{xr()||(t.stopPropagation(),x(t,L,e))},onContextMenu:t=>{t.preventDefault(),t.stopPropagation(),x(t,L,e)},children:n}):(0,Q.jsx)(`span`,{className:r,style:t,children:n})})(),(0,Q.jsx)(`span`,{className:q(`min-w-0 flex-1 self-center truncate px-2.5`,ae||me||ye?`font-semibold`:`font-medium`),title:e.description||void 0,children:e.label||e.name}),N.has(L)&&(0,Q.jsx)(P,{className:`mr-1 h-3.5 w-3.5 shrink-0 animate-spin self-center`,"aria-label":N.get(L)}),j?.has(L)&&(0,Q.jsx)(P,{className:`mr-1 h-3.5 w-3.5 shrink-0 animate-spin self-center opacity-70`,"aria-label":`Indexing`}),R&&(0,Q.jsx)(pe,{className:`mr-1 h-3 w-3 shrink-0 self-center text-muted-foreground`,"aria-label":R,children:(0,Q.jsx)(`title`,{children:R})}),!s&&(0,Q.jsx)(`button`,{type:`button`,className:`reveal-on-hover shrink-0 self-center rounded p-1 hover:bg-foreground/10`,onClick:t=>{t.stopPropagation(),v(t,L,e)},children:(0,Q.jsx)(yn,{className:`h-4 w-4`})}),(0,Q.jsx)(`button`,{type:`button`,className:q(`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)]`,!ie&&p!==L&&`invisible`),style:{borderLeft:`1px solid ${_e(16)}`},"aria-label":V?`Collapse`:`Expand`,"aria-expanded":V,title:V?`Collapse`:`Expand`,onClick:e=>{e.stopPropagation(),ne(e=>!e)},children:V?(0,Q.jsx)(Ze,{className:`h-5 w-5`,strokeWidth:2.25}):(0,Q.jsx)(gr,{className:`h-5 w-5`,strokeWidth:2.25})})]});return(0,Q.jsxs)(`div`,{className:`relative`,children:[ee?we:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`pointer-events-none absolute top-0 w-px bg-border`,style:{left:`-${JI/2}px`,...r?{height:`1.375rem`}:{bottom:0}}}),(0,Q.jsx)(`div`,{className:`pointer-events-none absolute top-[1.375rem] h-px bg-border`,style:{left:`-${JI/2}px`,width:`${JI/2}px`}}),(0,Q.jsxs)(`div`,{"data-active":ae||void 0,className:q(`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`,H&&`ring-1 ring-info/40 bg-info/10 before:bg-info`,se&&!H&&`ring-1 ring-warning/40 bg-warning/10 before:bg-warning`,!H&&!se&&ae&&!e.locked&&`bg-primary/[0.08] hover:bg-primary/[0.12] before:bg-primary`,!H&&!se&&ae&&e.locked&&`bg-warning/15 hover:bg-warning/20 before:bg-primary`,!H&&!se&&!ae&&oe&&`bg-primary/[0.03] before:bg-transparent`,!H&&!se&&!ae&&!oe&&!e.locked&&`bg-card hover:bg-primary/[0.04] before:bg-transparent`,!H&&!se&&!ae&&e.locked&&`bg-warning/15 hover:bg-warning/20 before:bg-warning`,C===L&&!s&&!w&&`ring-2 ring-info bg-info-subtle/50`,C===L&&!s&&w&&`ring-2 ring-success bg-success-subtle/50`),style:{borderRight:te.color?`4px solid ${te.color}`:`4px solid transparent`},draggable:!s&&!e.metadata?.backendTrash,onClick:U,onDoubleClick:le,...s?{}:I,onContextMenu:t=>{s||(t.preventDefault(),v(t,L,e))},onDragStart:e=>{s||T(L,e)},onDragEnter:e=>{s||E(L,e)},onDragOver:e=>{s||D(L,e)},onDragLeave:e=>O(L,e),onDragEnd:()=>k(),onDrop:e=>{s||A(L,e)},children:[(0,Q.jsx)(`button`,{type:`button`,className:q(`shrink-0 text-muted-foreground hover:text-foreground`,!ie&&p!==L&&`invisible`),"aria-label":V?`Collapse`:`Expand`,"aria-expanded":V,onClick:e=>{e.stopPropagation(),ne(e=>!e)},children:V?(0,Q.jsx)(Ze,{className:`w-4 h-4`}):(0,Q.jsx)(gr,{className:`w-4 h-4`})}),(()=>{let t=(0,Q.jsx)(f,{icon:te.icon||(ce?`ph:squares-four-fill`:`ph:folder-fill`),width:16,height:16,color:te.color||void 0,className:q(`shrink-0`,!te.color&&(ce?`text-primary`:`text-muted-foreground`))});return x?(0,Q.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:t=>{xr()||(t.stopPropagation(),x(t,L,e))},onContextMenu:t=>{t.preventDefault(),t.stopPropagation(),x(t,L,e)},children:t}):t})(),(0,Q.jsx)(`span`,{className:`flex-1 truncate font-medium`,title:e.description||void 0,children:e.label||e.name}),N.has(L)&&(0,Q.jsx)(P,{className:`h-3.5 w-3.5 shrink-0 animate-spin`,"aria-label":N.get(L)}),j?.has(L)&&(0,Q.jsx)(P,{className:`w-3.5 h-3.5 shrink-0 animate-spin text-muted-foreground`,"aria-label":`Indexing`}),R&&(0,Q.jsx)(pe,{className:`w-3 h-3 shrink-0 text-muted-foreground`,"aria-label":R,children:(0,Q.jsx)(`title`,{children:R})}),!s&&(0,Q.jsx)(`button`,{type:`button`,className:`shrink-0 reveal-on-hover p-1 rounded hover:bg-muted-foreground/10 text-muted-foreground`,onClick:t=>{t.stopPropagation(),v(t,L,e)},children:(0,Q.jsx)(yn,{className:`w-4 h-4`})})]})]}),V&&(ie||p===L)&&(0,Q.jsxs)(`div`,{className:ee?void 0:`ml-[22px] mt-2 mb-1 space-y-1.5`,children:[p===L&&(0,Q.jsx)(eL,{onConfirm:e=>y(L,e),onCancel:b}),e.children?.map((t,r)=>(0,Q.jsx)(rL,{node:t,parentPath:L,depth:n+1,isLast:r===(e.children?.length??0)-1,selectedPath:i,pendingPath:a,contentPath:o,readOnly:s,sourceLayer:c,targetLayers:l,clipboard:u,searchQuery:d,inlineCreateParent:p,onSelect:m,onShiftSelect:h,onShowContent:g,onCtrl:_,onCtxMenu:v,onConfirmCreate:y,onCancelCreate:b,onOpenPicker:x,styleOverrides:S,dragOverPath:C,isCopyDrag:w,onDragStart:T,onDragEnter:E,onDragOver:D,onDragLeave:O,onDragEnd:k,onDrop:A,resyncingPaths:j,policyBadgeFor:M,removingPaths:N,accordion:ee,trail:fe},t.id||t.name))]})]})}function iL({root:e,workspaceId:t,treeName:n=`context`,isBackendsTree:r=!1,onRestoreTrash:i,onDiscardTrash:a,selectedPath:o,pendingPath:s,onSelect:c,isLoading:l=!1,readOnly:u=!1,onAddRule:d,onAddStoreRule:f,onStoragePolicy:p,policyBadgeFor:m,rootLabel:h,contentPath:g,onShowContent:_,onOpenToSide:v,onShiftSelect:y,onInsertPath:b,onNewCanvas:x,onShareCanvas:S,onRemovePath:C,onRenamePath:w,onMovePath:T,onCopyPath:E,onExportSubtree:D,onImportSubtree:O,pastedDocumentIds:k,onPasteDocuments:A,onLockLayer:j,onUnlockLayer:M,onDestroyLayer:N,onMergeLayer:ee,onSubtractLayer:F,onMergeDown:I,onSubtractDown:L,onResyncBackend:R,onCreateBackendFolder:te,onRenameBackendFolder:z,onDeleteBackendFolder:ne,onUpdateNode:B,isPathPinned:re,onTogglePin:V,searchQuery:ie=``,resyncingPaths:ae,backends:oe}){let H=mA(),[se,ce]=(0,Z.useState)(null),[U,le]=(0,Z.useState)(null),[ue,de]=(0,Z.useState)(new Map),[fe,pe]=(0,Z.useState)(null),[me,he]=(0,Z.useState)(new Map),W=(0,Z.useRef)(new Set),ge=(0,Z.useCallback)(async(e,t=!1,i=!1,a=!1)=>{if(!(r?ne:C)||[...W.current].some(t=>t===e||t.startsWith(e+`/`)||e.startsWith(t+`/`)))return!1;W.current.add(e);let o=r?`Deleting from backend…`:a?`Removing documents and backend files…`:i?`Removing and purging documents…`:`Removing folder…`;he(t=>new Map(t).set(e,o));try{return r?await ne(e):await C(e,n===`directory`||t,i,a)}finally{W.current.delete(e),he(t=>{let n=new Map(t);return n.delete(e),n})}},[C,ne,r,n]),[_e,ve]=(0,Z.useState)(null),[ye,G]=(0,Z.useState)(new Map),[K,be]=(0,Z.useState)(e),xe=(0,Z.useRef)(new Map),Se=(0,Z.useRef)(null),[Ce,we]=(0,Z.useState)(null);if(e!==K){be(e);let t=Ce;G(t?new Map([[t.path,t.style]]):new Map)}let[Te,Ee]=(0,Z.useState)(null),[De,Oe]=(0,Z.useState)(null),[ke,Ae]=(0,Z.useState)(!1),[je,Me]=(0,Z.useState)(!1),[Ne,Pe]=(0,Z.useState)(!1),Fe=(0,Z.useRef)(!1),Ie=(0,Z.useRef)(null),Le=(0,Z.useRef)(n),Re=(0,Z.useRef)(!1),ze=(0,Z.useRef)(!1);(0,Z.useEffect)(()=>{let e=e=>{ce(e.detail??null)};return window.addEventListener(`tree:path-clipboard`,e),()=>window.removeEventListener(`tree:path-clipboard`,e)},[]),(0,Z.useEffect)(()=>{let e=e=>{let t=e.ctrlKey||e.altKey||ze.current;Re.current=t,Ae(t)};return window.addEventListener(`keydown`,e),window.addEventListener(`keyup`,e),()=>{window.removeEventListener(`keydown`,e),window.removeEventListener(`keyup`,e)}},[]);let Be=(0,Z.useCallback)((e,t,r)=>{if(ub(Le.current,e)||ub(n,t))return!1;if(Le.current!==n)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||!r&&a===o)},[n]),Ve=(0,Z.useCallback)((e,t)=>{if(ub(n,e)){t.preventDefault();return}Ie.current=e,Le.current=n,t.dataTransfer.setData(`text/plain`,e),t.dataTransfer.setData(`application/x-canvas-tree-path`,JSON.stringify({path:e,treeName:n})),t.dataTransfer.effectAllowed=`copyMove`},[n]),He=e=>e.ctrlKey||e.altKey||ze.current,Ue=(0,Z.useCallback)((e,t)=>{if(ub(n,e))return;let r=Ie.current,i=He(t);i!==Re.current&&(Re.current=i,Ae(i)),!(r&&!Be(r,e,i))&&(t.preventDefault(),Oe(e))},[Be,n]),We=(0,Z.useCallback)((e,t)=>{if(ub(n,e)){t.dataTransfer.dropEffect=`none`;return}let r=He(t);r!==Re.current&&(Re.current=r,Ae(r));let i=Ie.current;if(i&&!Be(i,e,r)){t.dataTransfer.dropEffect=`none`;return}t.preventDefault(),t.dataTransfer.dropEffect=r?`copy`:`move`},[Be,n]),Ge=(0,Z.useCallback)((e,t)=>{t.currentTarget.contains(t.relatedTarget)||Oe(t=>t===e?null:t)},[]),Ke=(0,Z.useCallback)(()=>{Ie.current=null,Le.current=n,Re.current=!1,Ae(!1),Oe(null)},[n]),qe=(0,Z.useCallback)(async(e,i)=>{if(i.preventDefault(),i.stopPropagation(),ub(n,e))return;let a=(()=>{try{return JSON.parse(i.dataTransfer.getData(`application/json`))}catch{return null}})();if(a?.type===`document`&&Array.isArray(a.documentIds)&&a.documentIds.length){if(Ie.current=null,Re.current=!1,Ae(!1),Oe(null),sg(a,t,n,e))return;if(A)try{await A(e,a.documentIds)}catch(e){alert(e instanceof Error?e.message:String(e))}return}let o=(()=>{try{return JSON.parse(i.dataTransfer.getData(`application/x-canvas-tree-path`))}catch{return null}})(),s=o?.path||i.dataTransfer.getData(`text/plain`),c=o?.treeName||Le.current||n;if(ub(c,s))return;let l=He(i)||Re.current;if(Ie.current=null,Le.current=n,Re.current=!1,Ae(!1),Oe(null),!s)return;let u=i.shiftKey,d=c!==n;if(!(!d&&s===e)&&!(!d&&!Be(s,e,l)))try{if(l&&E)await E(s,e,u,c,n);else if(!l&&T){let t=Fe.current&&!r&&!!I;await T(s,e,u,c,n,t?{mergeDown:t}:void 0)}}catch(e){alert(e instanceof Error?e.message:String(e))}},[Be,E,T,A,t,n,r,I]),Je=ie.toLowerCase().trim(),Ye=(0,Z.useCallback)((e,t,n)=>{e.stopPropagation(),pe({x:e.clientX,y:e.clientY,path:t,node:n})},[]),Xe=(0,Z.useCallback)((e,t,n)=>{e.stopPropagation(),!n.metadata?.backendTrash&&(Se.current=null,we(null),ve({x:e.clientX,y:e.clientY,path:t,node:n}))},[]),Qe=(0,Z.useCallback)(e=>{if(!_e||!B)return;let t=_e.path,n={...ye.get(t)??(Se.current?.path===t?Se.current.style:mm(_e.node)),...e};Se.current={path:t,style:n},we({path:t,style:n}),G(e=>new Map(e).set(t,n));let r=gm(_e.node.metadata,n),i=xe.current,a=i.get(t);a&&clearTimeout(a),i.set(t,setTimeout(()=>{i.delete(t),B(t,{metadata:r}).catch(e=>alert(e instanceof Error?e.message:String(e)))},350))},[_e,B,ye]),$e=(0,Z.useCallback)((e,t)=>{U?e===U.path?(le(null),de(new Map)):de(n=>{let r=new Map(n);return r.has(e)?r.delete(e):r.set(e,t),r}):(le({path:e,id:t}),de(new Map))},[U]),et=(0,Z.useCallback)(async e=>{!se||!T||!E||se.treeName===n&&(e===se.path||e.startsWith(se.path+`/`))||(se.mode===`cut`?(await T(se.path,e,!1,se.treeName,n),ce(null),window.dispatchEvent(new CustomEvent(`tree:path-clipboard`,{detail:null}))):await E(se.path,e,!0,se.treeName,n))},[se,T,E,n]);(0,Z.useEffect)(()=>{if(u)return;let e=e=>{let t=e.target;if(t?.tagName===`INPUT`||t?.tagName===`TEXTAREA`||e.key!==`F6`)return;if(e.preventDefault(),se?.mode===`cut`){et(o);return}let r={mode:`cut`,path:o,treeName:n};ce(r),window.dispatchEvent(new CustomEvent(`tree:path-clipboard`,{detail:r}))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[se,et,u,o,n]);let tt=(0,Z.useCallback)(async(e,t)=>{Ee(null);let n=e===`/`?`/${t}`:`${e}/${t}`;try{ZI(e,r)&&te?await te(e,t)&&c(n):b&&await b(n,!0)&&c(n)}catch(e){alert(e instanceof Error?e.message:String(e))}},[b,te,c,r]),nt=(0,Z.useCallback)(()=>{Ee(null)},[]),rt=(0,Z.useCallback)((e,t)=>{let r={mode:t,path:e,treeName:n};ce(r),window.dispatchEvent(new CustomEvent(`tree:path-clipboard`,{detail:r}))},[n]),it=(0,Z.useCallback)(t=>{if(u||Yp(t.target)||o&&ub(n,o))return;if(Jp(t,`Mod+V`)){k?.length&&A&&o?(t.preventDefault(),A(o,k).catch(()=>{})):se&&o&&(t.preventDefault(),et(o).catch(e=>alert(e instanceof Error?e.message:String(e))));return}if(o&&o!==`/`&&(Jp(t,`Mod+C`)||!r&&Jp(t,`Mod+X`))){t.preventDefault(),rt(o,t.key.toLowerCase()===`x`?`cut`:`copy`);return}if((r?!ne||!po(o||``,oe):!C)||t.key!==`Delete`&&t.key!==`Backspace`||!o||o===`/`)return;t.preventDefault();let i=gi(e,o);if(!r&&i?.locked){alert(`"${o}" is locked`);return}confirm(r?`Delete "${o}" and its contents from this backend?`:`Remove "${o}"${n===`directory`?` and all children`:``}?`)&&ge(o,!1).catch(e=>alert(e instanceof Error?e.message:String(e)))},[u,C,ne,ge,o,e,k,A,se,et,r,rt,n,oe]),at=(0,Z.useCallback)(()=>{Me(e=>{let t=!e;return ze.current=t,Re.current=t,Ae(t),t})},[]);if(l)return(0,Q.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`Loading tree…`});if(!e)return(0,Q.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`No tree available`});let ot=U||ue.size>0,st={accordion:H,selectedPath:o,pendingPath:s,contentPath:g,readOnly:u,sourceLayer:U,targetLayers:ue,clipboard:se,searchQuery:Je,inlineCreateParent:Te,onSelect:c,onShiftSelect:y,onShowContent:_,onCtrl:$e,onCtxMenu:Ye,onConfirmCreate:tt,onCancelCreate:nt,onOpenPicker:B?Xe:void 0,styleOverrides:ye,dragOverPath:De,isCopyDrag:ke,onDragStart:Ve,onDragEnter:Ue,onDragOver:We,onDragLeave:Ge,onDragEnd:Ke,onDrop:qe,resyncingPaths:ae,backends:oe,policyBadgeFor:r?void 0:m,removingPaths:me};return(0,Q.jsxs)(`div`,{className:`px-3 py-2 space-y-1.5 outline-none`,tabIndex:0,onKeyDown:it,children:[me.size>0&&(0,Q.jsx)(`div`,{role:`status`,"aria-live":`polite`,className:`space-y-1 rounded-md border bg-muted/50 p-2 text-xs`,children:[...me].map(([e,t])=>(0,Q.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Q.jsx)(P,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 animate-spin`,"aria-hidden":`true`}),(0,Q.jsxs)(`span`,{className:`min-w-0`,children:[(0,Q.jsx)(`span`,{className:`block`,children:t}),(0,Q.jsx)(`span`,{className:`block truncate text-muted-foreground`,title:e,children:e})]})]},e))}),!u&&(0,Q.jsxs)(`div`,{className:`flex items-center justify-end px-1 pb-0.5 text-[10px]`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:at,title:`Toggle drag-drop mode (or hold Ctrl / Alt while dragging)`,className:q(`px-2 py-0.5 rounded-full border transition-colors select-none`,je?`border-success bg-success/15 text-success dark:text-success`:`border-border text-muted-foreground hover:bg-muted`),children:je?`Drag → Copy`:`Drag → Move`}),I&&!r&&!je&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>Pe(e=>(Fe.current=!e,!e)),title:`When moving a layer, also merge it into its new ancestors so the new path lists its documents`,className:q(`ml-1 px-2 py-0.5 rounded-full border transition-colors select-none`,Ne?`border-info bg-info/15 text-info dark:text-info`:`border-border text-muted-foreground hover:bg-muted`),children:Ne?`+ merge down`:`merge down: off`})]}),ot&&(0,Q.jsxs)(`div`,{className:`flex items-center justify-between px-1 pb-1 text-[10px] text-muted-foreground`,children:[(0,Q.jsx)(`span`,{children:U?`Source: ${U.path} · ${ue.size} target(s)`:`Select source with ⌃-click`}),(0,Q.jsx)(`button`,{type:`button`,className:`hover:text-foreground underline`,onClick:()=>{le(null),de(new Map)},children:`clear`})]}),(0,Q.jsxs)(`div`,{"data-active":o===`/`&&!g||void 0,className:q(`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`,o===`/`&&!g?`bg-primary/[0.06]`:`bg-card hover:bg-primary/[0.04]`,De===`/`&&!u&&!ke&&`ring-2 ring-info bg-info-subtle/50`,De===`/`&&!u&&ke&&`ring-2 ring-success bg-success-subtle/50`),style:{borderRight:`4px solid transparent`},onClick:()=>c(`/`),onDragEnter:e=>{u||Ue(`/`,e)},onDragOver:e=>{u||We(`/`,e)},onDragLeave:e=>Ge(`/`,e),onDrop:e=>{u||qe(`/`,e)},onContextMenu:e=>{!u&&b&&(e.preventDefault(),pe({x:e.clientX,y:e.clientY,path:`/`,node:{id:``,name:`/`,label:`/`,type:`root`,description:``,color:null,locked:!1,children:[]}}))},children:[(0,Q.jsx)(Ze,{className:`w-4 h-4 shrink-0 text-muted-foreground`}),(0,Q.jsxs)(`span`,{className:`flex-1 font-medium truncate`,children:[`/ `,h&&(0,Q.jsxs)(`span`,{className:`text-muted-foreground font-normal`,children:[`[`,h,`]`]})]}),!u&&b&&(0,Q.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(),pe({x:e.clientX,y:e.clientY,path:`/`,node:{id:``,name:`/`,label:`/`,type:`root`,description:``,color:null,locked:!1,children:[]}})},children:(0,Q.jsx)(yn,{className:`w-4 h-4`})})]}),(0,Q.jsxs)(`div`,{className:H?`mt-1.5 border-t border-border/60`:`ml-[22px] mt-1.5 space-y-1.5`,children:[Te===`/`&&(0,Q.jsx)(eL,{onConfirm:e=>tt(`/`,e),onCancel:nt}),e.children?.map((t,n)=>(0,Q.jsx)(rL,{node:t,parentPath:`/`,depth:0,isLast:n===(e.children?.length??0)-1,...st},t.id||t.name)),!e.children?.length&&Te!==`/`&&(0,Q.jsx)(`div`,{className:`px-2 py-1.5 text-xs text-muted-foreground`,children:`Empty tree`})]}),fe&&(0,Q.jsx)($I,{x:fe.x,y:fe.y,node:fe.node,path:fe.path,isBackendsTree:r,backends:oe,isDirectoryTree:n===`directory`,onClose:()=>pe(null),onShowContent:fe.node.metadata?.backendTrash?c:_,onRestoreTrash:u?void 0:i,onDiscardTrash:u?void 0:a,onOpenToSide:v?e=>v(e,n):void 0,sourceLayer:U,targetLayers:ue,clipboard:se,onStartInlineCreate:e=>Ee(e),onChangeIcon:B?()=>Xe({clientX:fe.x,clientY:fe.y,stopPropagation:()=>{}},fe.path,fe.node):void 0,onNewCanvas:x,onShareCanvas:S,onExportSubtree:D,onImportSubtree:u?void 0:O,onRemove:!u&&C&&![...me.keys()].some(e=>e===fe.path||e.startsWith(fe.path+`/`)||fe.path.startsWith(e+`/`))?ge:void 0,onRename:u?void 0:w,onLock:u?void 0:j,onUnlock:u?void 0:M,onDestroy:u?void 0:N,onMerge:u?void 0:ee,onSubtract:u?void 0:F,onMergeDown:u?void 0:I,onSubtractDown:u?void 0:L,onResyncBackend:R,onAddRule:d,onAddStoreRule:f,onStoragePolicy:!u&&!r?p:void 0,onRenameBackendFolder:z,onDeleteBackendFolder:!u&&ne&&![...me.keys()].some(e=>e===fe.path||e.startsWith(fe.path+`/`)||fe.path.startsWith(e+`/`))?e=>ge(e,!0):void 0,onCopy:e=>rt(e,`copy`),onCut:e=>rt(e,`cut`),onPaste:et,pastedDocumentIds:k,onPasteDocuments:A,isPinned:re?re(fe.path):!1,onTogglePin:V?()=>V(fe.path,fe.node):void 0}),_e&&B&&(0,Q.jsx)(Jw,{x:_e.x,y:_e.y,current:ye.get(_e.path)??mm(_e.node),onChange:Qe,onClose:()=>ve(null)})]})}function aL(){let{state:e,closeM2:t,closeM1:n,closeM0:r,openM2:i}=jT(),a=$g(),o=hl(),s=e.selectedEntityId,{showToast:c}=Hr(),[l,u]=(0,Z.useState)(null),[d,f]=(0,Z.useState)(null),[p,m]=(0,Z.useState)(``),[h,g]=(0,Z.useState)(),[_,v]=(0,Z.useState)(``),[y,b]=(0,Z.useState)(`/`),[x,S]=(0,Z.useState)(null),[C,w]=(0,Z.useState)(!1),[T,E]=(0,Z.useState)(null),[D,O]=(0,Z.useState)(!1),k=(0,Z.useCallback)(async e=>{w(!0);try{let t=await hs(e);f(t),E(null)}catch(e){E(e instanceof Error?e.message:`Failed to load the tree`)}finally{w(!1)}},[]);(0,Z.useEffect)(()=>{if(!s)return;let e=s,t=!1;async function n(){try{let n=await Ss(e);if(t)return;u(n),m(n.url||``),g(void 0),v(``),S(null),b(n.path||`/`),w(!0);try{let n=await hs(e);t||(f(n),E(null))}catch(e){t||E(e instanceof Error?e.message:`Failed to load the tree`)}finally{t||w(!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 A=Ob({contextId:s??void 0,onRefresh:()=>{s&&k(s)}}),j=e=>{g(void 0),S(e),m(l?.workspaceName?`${l.workspaceName}://${e.replace(/^\//,``)}`:e)},M=l!=null&&(p.trim()!==(l.url||``)||h!==void 0);return(0,Q.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Q.jsx)(qI,{title:s||`Context`,icon:l?.icon||`ph:stack-fill`,accentColor:l?.color,onBack:t,action:(0,Q.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,Q.jsx)(bn,{className:`w-3.5 h-3.5`})})}),(0,Q.jsxs)(`div`,{className:`p-3 border-b border-border shrink-0`,children:[(0,Q.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-1.5 font-medium uppercase tracking-wide`,children:`Context URL`}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(Ym,{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:D,className:`min-w-0 flex-1`,inputClassName:q(`text-xs transition-colors`,M&&`border-warning/60 bg-warning/10`),placeholder:`workspace://path`}),(0,Q.jsx)(X,{size:`sm`,className:`h-9 px-2 text-xs shrink-0`,onClick:async()=>{if(!s)return;let e=s;O(!0);try{await rs(e,p,void 0,h);let t=await Ss(e);u(t),m(t.url||``),b(t.path||`/`),S(null),g(void 0),window.dispatchEvent(new CustomEvent(`contexts:refresh`)),await k(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{O(!1)}},disabled:D||!M,children:D?`…`:`Set`})]})]}),h&&(0,Q.jsxs)(`p`,{className:`px-3 py-1 text-xs text-muted-foreground`,children:[`Destination tree: `,h,` · press Set to apply`]}),(0,Q.jsx)(`div`,{className:`px-3 py-2 border-b shrink-0`,children:(0,Q.jsx)(J,{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,Q.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[(0,Q.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`]}),T&&!d&&(0,Q.jsx)(`p`,{className:`px-3 pb-1 text-xs text-destructive`,children:T}),(0,Q.jsx)(iL,{root:d,workspaceId:l?.workspaceName,searchQuery:_,selectedPath:y,pendingPath:x,onSelect:j,isLoading:C,rootLabel:l?.workspaceName,...A})]})]})}function oL({items:e,activeId:t,onSelect:n}){let[r,i]=(0,Z.useState)(``),a=e.filter(e=>cT(r,e.label,e.description||``));return(0,Q.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:(0,Q.jsxs)(`div`,{className:`space-y-1 px-2`,children:[(0,Q.jsx)(J,{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,Q.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,Q.jsxs)(`button`,{type:`button`,"aria-current":r?`page`:void 0,onClick:()=>n(e.id),className:q(`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,Q.jsx)(`span`,{className:q(`shrink-0`,r?`text-foreground`:`text-muted-foreground`),children:e.icon}),(0,Q.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:e.label}),e.description&&(0,Q.jsx)(`span`,{className:`mt-1 block text-xs leading-relaxed text-muted-foreground`,children:e.description})]}),(0,Q.jsx)(gr,{className:q(`h-3.5 w-3.5 shrink-0`,r?`opacity-100`:`opacity-0`)})]},e.id)})]})})}function sL(){let{state:e,closeM2:t}=jT(),n=$g(),r=hl(),i=fl(),a=e.selectedEntityId,[o,s]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{if(!a)return;let e=!1;return Ss(a).then(t=>{e||s(t)}).catch(()=>{}),()=>{e=!0}},[a]);let c=i.pathname.split(`/`).filter(Boolean),l=c[2]===`settings`?zO(c[3]):null,u=a?`/contexts/${a}`:null,d=(0,Z.useMemo)(()=>RO.map(({id:e,label:t,description:n,icon:r})=>({id:e,label:t,description:n,icon:(0,Q.jsx)(r,{className:`h-4 w-4`})})),[]);return(0,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Q.jsx)(qI,{title:`Settings: ${o?.name||a||`Context`}`,icon:o?.icon||`ph:stack-fill`,accentColor:o?.color??null,onBack:()=>u&&!n?r(u):t(),action:(0,Q.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,Q.jsx)(Ut,{className:`h-3.5 w-3.5`})})}),(0,Q.jsx)(oL,{items:d,activeId:l,onSelect:e=>a&&r(`/contexts/${a}/settings/${e}`)})]})}function cL(e){let[t,n]=(0,Z.useState)([]),[r,i]=(0,Z.useState)(!1),a=(0,Z.useRef)(!1),o=(0,Z.useRef)(!1),s=(0,Z.useCallback)(async()=>{if(!o.current){o.current=!0,i(!0);try{let e=await ji();n(e||[]),a.current=!0}catch(e){console.error(`Failed to fetch workspaces:`,e)}finally{o.current=!1,i(!1)}}},[]),c=(0,Z.useCallback)(()=>{a.current=!1,s()},[s]);return(0,Z.useEffect)(()=>{e&&!a.current&&s()},[e,s]),(0,Z.useEffect)(()=>{if(!e)return;let t=()=>pd.emit(`subscribe`,{channel:`workspace`}),r=()=>pd.emit(`unsubscribe`,{channel:`workspace`}),i=pd.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=[[`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])=>pd.on(e,t)),()=>{r(),i?.(),l.forEach(([e,t])=>pd.off(e,t))}},[e,s]),(0,Z.useEffect)(()=>{let e=()=>{a.current=!1,s()};return window.addEventListener(`workspaces:refresh`,e),()=>{window.removeEventListener(`workspaces:refresh`,e)}},[s]),{workspaces:(0,Z.useMemo)(()=>GT(t),[t]),isLoading:r,refresh:c}}function lL({status:e}){return(0,Q.jsx)(`span`,{className:q(`inline-block w-2 h-2 rounded-full shrink-0`,e===`active`?`bg-success`:e===`error`?`bg-destructive`:`bg-muted-foreground`),title:e})}function uL(){let e=Hw(),{state:t,selectEntity:n,openM2:r,closeM2:i}=jT(),a=$g(),{workspaces:o,isLoading:s}=cL(t.activeSection===`workspaces`),{showToast:c}=Hr(),l=hl(),[u,d]=(0,Z.useState)(new Set),[p,m]=(0,Z.useState)(null),[h,g]=(0,Z.useState)(new Map),_=(0,Z.useRef)(new Map),[v,y]=(0,Z.useState)(null),b=v&&v.base===o?v.order:o,{rowProps:x,handleProps:S,draggingIndex:C,insertLineClass:w}=JT((e,t)=>{let n=KT(b,e,t);y({base:o,order:n}),qT(n,(e,t)=>oa(Uw(e),{order:t})).then(({failed:e})=>{window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),e&&c({title:`Partial reorder`,description:`${e} workspace(s) could not be reordered`,variant:`destructive`})})}),E=e=>h.get(Uw(e))??{icon:e.icon??void 0,color:e.color??void 0},D=(e,t,n)=>{let r={...t,...n};g(t=>new Map(t).set(e,r));let i=_.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),oa(e,t).then(()=>window.dispatchEvent(new CustomEvent(`workspaces:refresh`))).catch(e=>c({title:`Error`,description:e instanceof Error?e.message:`Update failed`,variant:`destructive`}))},350))},O=e=>{n(Uw(e)),r(`detail`,Uw(e)),!a&&iT(Uw(e))&&l(aT(Uw(e)))},k=async(e,t)=>{e.stopPropagation(),d(e=>new Set(e).add(Uw(t)));try{await la(Uw(t)),c({title:`Success`,description:`${t.label||t.name} started`}),window.dispatchEvent(new CustomEvent(`workspaces:refresh`))}catch(e){c({title:`Error`,description:e instanceof Error?e.message:`Start failed`,variant:`destructive`})}finally{d(e=>{let n=new Set(e);return n.delete(Uw(t)),n})}},A=async(e,t)=>{e.stopPropagation(),d(e=>new Set(e).add(Uw(t)));try{await Xa(Uw(t)),c({title:`Success`,description:`${t.label||t.name} stopped`}),window.dispatchEvent(new CustomEvent(`workspaces:refresh`))}catch(e){c({title:`Error`,description:e instanceof Error?e.message:`Stop failed`,variant:`destructive`})}finally{d(e=>{let n=new Set(e);return n.delete(Uw(t)),n})}};return(0,Q.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:[(0,Q.jsxs)(`div`,{className:`flex min-w-0 items-center`,children:[(0,Q.jsx)(GI,{}),(0,Q.jsx)(`span`,{className:`text-sm font-semibold`,children:`Workspaces`})]}),!e.local&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>{i(),l(`/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,Q.jsx)(cn,{className:`w-3.5 h-3.5`})})]}),(0,Q.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:s&&o.length===0?(0,Q.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading...`}):o.length===0?(0,Q.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`No workspaces found`}):(0,Q.jsx)(`div`,{className:`space-y-1.5 px-2`,children:b.map((e,i)=>{let o=t.selectedEntityId===Uw(e),s=Ep(e),c=u.has(Uw(e)),d=e.status!==`active`,p=E(e),h=Cm(p.color);return(0,Q.jsxs)(`div`,{...x(i),"data-active":o||void 0,className:q(`group relative rounded-(--card-radius) py-2.5 pl-3 pr-7 transition-all shadow-elevation-1`,o?`bg-accent shadow cursor-pointer hover:shadow`:d?`bg-card opacity-60 cursor-not-allowed`:`bg-card hover:bg-accent/50 cursor-pointer hover:shadow`,w(i,b.length),C===i&&`opacity-60`),onClick:()=>{d||O(e)},children:[(0,Q.jsx)(`button`,{type:`button`,...S(i),title:`Drag to reorder`,"aria-label":`Drag to reorder`,className:q(`absolute inset-y-0 right-0 flex w-4 cursor-grab items-center justify-center rounded-r-(--card-radius) active:cursor-grabbing`,!h&&`bg-muted`),style:h?{backgroundColor:h}:void 0,children:(0,Q.jsx)(T,{className:q(`h-3.5 w-3.5`,wm(h))})}),(0,Q.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Q.jsx)(`button`,{type:`button`,title:s?`Change icon`:`Workspace appearance requires admin access`,onClick:t=>{!s||xr()||(t.stopPropagation(),m({x:Math.min(t.clientX,window.innerWidth-290),y:Math.min(t.clientY,window.innerHeight-360),name:Uw(e)}))},onContextMenu:t=>{s&&(t.preventDefault(),t.stopPropagation(),m({x:Math.min(t.clientX,window.innerWidth-290),y:Math.min(t.clientY,window.innerHeight-360),name:Uw(e)}))},className:`shrink-0 rounded p-0.5 hover:bg-muted-foreground/10 touch-target`,children:(0,Q.jsx)(f,{icon:p.icon||`ph:stack-fill`,width:18,height:18,color:h,className:q(!h&&`text-muted-foreground`)})}),(0,Q.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(lL,{status:e.status}),(0,Q.jsx)(`span`,{className:`text-sm font-medium truncate`,children:e.label||e.name})]})}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-0.5 shrink-0`,children:[e.status===`active`?(0,Q.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:`Stop`,children:(0,Q.jsx)(Bn,{className:`w-3.5 h-3.5`})}):(0,Q.jsx)(`button`,{type:`button`,disabled:c,onClick:t=>k(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,Q.jsx)(Se,{className:`w-3.5 h-3.5`})}),(0,Q.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),n(Uw(e)),a?r(`settings`,Uw(e)):l(`/workspaces/${Uw(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:!s,title:s?`Settings`:`Workspace settings require admin access`,children:(0,Q.jsx)(bn,{className:`w-3.5 h-3.5`})})]})]}),e.description&&(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5 pl-3.5`,children:e.description}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 mt-1 pl-3.5`,children:[e.host&&(0,Q.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate`,children:e.host}),e.ownerEmail&&(0,Q.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate`,children:e.ownerEmail})]})]},e.id||e.name)})})}),p&&(()=>{let e=o.find(e=>Uw(e)===p.name);if(!e)return null;let t=E(e);return(0,Q.jsx)(Jw,{x:p.x,y:p.y,current:t,onChange:e=>D(p.name,t,e),onClose:()=>m(null)})})()]})}function dL(e,t){let n=(0,Z.useRef)(null),r=(0,Z.useRef)(0);return(0,Z.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=ej(e);if(!r)return;let i=QA(),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=nj(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 fL(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 pL(e,t,n,r=!1,i=`forward`,a=`copy`,o,s){let c=fL(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 mL({workspaceId:e,sourcePath:t,onClose:n,onManageRules:r}){let[i,a]=(0,Z.useState)([]),[o,s]=(0,Z.useState)(!1),[c,l]=(0,Z.useState)(`forward`),u=c===`forward`||!i.some(e=>e.tree===`context`),[d,f]=(0,Z.useState)(`copy`),[p,m]=(0,Z.useState)(``),[h,g]=(0,Z.useState)([]),[_,v]=(0,Z.useState)(0),[y,b]=(0,Z.useState)(!1),[x,S]=(0,Z.useState)(!0),[C]=(0,Z.useState)(()=>`autolink-${crypto.randomUUID()}`),[w,T]=(0,Z.useState)(!1),[E,D]=(0,Z.useState)(!1),[O,k]=(0,Z.useState)(!1),[A,j]=(0,Z.useState)(``),[M,N]=(0,Z.useState)(0),[P,ee]=(0,Z.useState)(0),[F,I]=(0,Z.useState)(0),[L]=(0,Z.useState)(dp),[R,te]=(0,Z.useState)(1),[z,ne]=(0,Z.useState)(0),[B,re]=(0,Z.useState)(),[V,ie]=(0,Z.useState)(0);Np(n,!E&&!o);let ae=()=>{E||n()};return(0,Z.useEffect)(()=>{let t=!1;return Eo(e).then(e=>{t||g(e.filter(e=>e.kind===`storage`&&e.enabled&&e.config?.readOnly!==!0))}).catch(()=>{t||j(`Could not load source backends. Reopen Auto-Link to retry.`)}),()=>{t=!0}},[e]),(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Up,{onClose:ae,children:(0,Q.jsxs)(`section`,{role:`dialog`,"aria-modal":`true`,"aria-labelledby":`autolink-title`,className:`${Hp} flex flex-col overflow-hidden rounded-(--panel-radius) border bg-card shadow-elevation-4`,children:[(0,Q.jsxs)(`div`,{className:`flex h-12 shrink-0 items-center justify-between border-b px-4`,children:[(0,Q.jsxs)(`h2`,{id:`autolink-title`,className:`flex items-center gap-2 text-sm font-medium`,children:[(0,Q.jsx)(Qt,{className:`h-4 w-4`}),`Auto-Link folder`]}),(0,Q.jsx)(`button`,{type:`button`,onClick:ae,disabled:E,"aria-label":`Close`,className:`p-1 disabled:opacity-40`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-5 overflow-y-auto p-4`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Backend folder`}),(0,Q.jsx)(`p`,{className:`mt-1 break-words text-sm`,children:t})]}),(0,Q.jsxs)(`fieldset`,{disabled:E||w,className:`space-y-2 text-sm`,children:[(0,Q.jsx)(`label`,{className:`block font-medium`,htmlFor:`autolink-direction`,children:`Direction`}),(0,Q.jsxs)(`select`,{id:`autolink-direction`,className:`w-full rounded-md border bg-background p-2`,value:c,onChange:e=>{let t=e.target.value;l(t),t!==`forward`&&i.some(e=>e.tree===`context`)&&b(!1)},children:[(0,Q.jsx)(`option`,{value:`forward`,children:`Backend → virtual tree`}),(0,Q.jsx)(`option`,{value:`reverse`,children:`Virtual tree → backend`}),(0,Q.jsx)(`option`,{value:`both`,children:`Both`})]}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:c===`forward`?`Link indexed files into your virtual paths. Files stay where they are.`:`Store matching files in the backend folder. Only directory sources can preserve their subfolder structure.`}),c!==`forward`&&(0,Q.jsxs)(`details`,{children:[(0,Q.jsx)(`summary`,{className:`cursor-pointer`,children:`Advanced: storage operation`}),(0,Q.jsxs)(`label`,{className:`mt-2 flex items-start gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:d===`move`,onChange:e=>f(e.target.checked?`move`:`copy`)}),`Move instead of copy`]}),d===`move`&&(0,Q.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,Q.jsx)(`label`,{className:`block`,htmlFor:`autolink-source-backend`,children:`Move bytes from`}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`Choose a source backend…`}),h.map(e=>(0,Q.jsx)(`option`,{value:e.address,children:e.address},e.address))]}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Only the copy on this backend is moved, after the destination is stored. No source copy means no move. Multiple copies on that backend make the move ambiguous; use copy. Context membership does not imply a copy in workspace:data.`})]})]})]}),(0,Q.jsxs)(`div`,{className:`space-y-2`,children:[(0,Q.jsx)(`h3`,{className:`text-sm font-medium`,children:`Virtual paths`}),i.map((e,t)=>(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 rounded-lg border p-2 text-sm`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.tree===`context`?`Context tree`:`Directory tree`}),(0,Q.jsx)(`p`,{className:`break-words`,children:e.path})]}),!w&&(0,Q.jsx)(`button`,{type:`button`,"aria-label":`Remove ${e.tree}:${e.path}`,disabled:E,onClick:()=>a(e=>e.filter((e,n)=>n!==t)),children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]},`${e.tree}:${e.path}`)),!w&&(0,Q.jsxs)(X,{variant:`outline`,size:`sm`,disabled:E,onClick:()=>s(!0),children:[(0,Q.jsx)(cn,{className:`mr-1 h-4 w-4`}),`Add virtual path…`]}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Choose a context path, a directory path, or both.`})]}),(0,Q.jsxs)(`fieldset`,{disabled:E||w,className:`space-y-3 text-sm`,children:[(0,Q.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:y,disabled:!u,onChange:e=>b(e.target.checked),className:`mt-1`}),`Recursive — include subfolders and recreate their structure at each destination`]}),!u&&(0,Q.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,Q.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:x,onChange:e=>S(e.target.checked),className:`mt-1`}),`Apply to existing documents`]})]}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Without Recursive, only direct folder contents are included. Context paths keep their usual layer membership. Both creates two independently manageable rules in workspace Rules. Removing rules keeps existing files and links. Renames and deletions are not synchronized. Filename conflicts stop the transfer without overwriting.`}),E&&(0,Q.jsx)(`p`,{role:`status`,className:`text-sm`,children:w?`${R>1?`Rule ${Math.min(_+1,R)}/${R}: `:``}Processing ${z}${B===void 0?``:`/${B}`} existing documents… ${P} matches applied.`:`Saving Auto-Link…`}),O&&(0,Q.jsxs)(`p`,{role:`status`,className:`text-sm`,children:[`Auto-Link is enabled for future documents.`,x?` ${V} document${R>1?` checks across ${R} rules`:`s checked`}. ${P} matches applied.`:``]}),F>0&&(0,Q.jsxs)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:[F,` document operations failed. Check the rule’s run log in Rules and rerun it after resolving the errors.`]}),A&&(0,Q.jsxs)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:[w?`Auto-Link is enabled. `:``,A]})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 justify-end gap-2 border-t p-3`,children:[(0,Q.jsx)(X,{variant:`ghost`,disabled:E,onClick:r,children:`Manage rules`}),O?(0,Q.jsx)(X,{onClick:n,children:`Done`}):(0,Q.jsx)(X,{disabled:E||!i.length||c!==`forward`&&d===`move`&&!p,onClick:async()=>{if(!E){D(!0),j(``);try{let n=c===`forward`?void 0:is(t,await Eo(e));if(n?.driver===`cacache`)throw Error(`Choose a backend that preserves folder paths.`);let r=pL(C,t,i,y,c,d,n,p);if(te(r.length),w||(await bp(e,r),T(!0)),x){for(let t=_;t<r.length;t++){let n=t===_?M:0;ne(n),re(void 0);let i=await mp(e,{ruleId:r[t].id,limit:1,offset:n,dryRun:!0});for(re(i.total);n!==null;){let i=await mp(e,{ruleId:r[t].id,limit:L,offset:n});if(ee(e=>e+i.matched-i.failed),I(e=>e+i.failed),ne(n+i.processed),ie(e=>e+i.processed),re(i.total),i.nextOffset===void 0)throw Error(`The rule is enabled, but applying the full folder needs an updated server. Use Rules to rerun existing documents after updating.`);n=i.nextOffset,n!==null&&N(n)}v(t+1),N(0)}window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`)),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`))}k(!0)}catch(e){j(e instanceof Error?e.message:`Could not configure Auto-Link`)}finally{D(!1)}}},children:E?`Applying…`:w?`Retry existing documents`:`Enable Auto-Link`})]})]})}),o&&(0,Q.jsx)(Up,{onClose:()=>s(!1),children:(0,Q.jsx)(Jm,{fixedWorkspaceName:e,tabs:c!==`forward`&&y?[`directory`]:[`context`,`directory`],title:`Choose virtual paths`,confirmLabel:`Add paths`,sizeClassName:`h-full w-[380px] max-w-[90vw] max-md:w-full`,onClose:()=>s(!1),onConfirm:(e,t)=>{c!==`forward`&&t.treeType===`context`&&b(!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)}})})]})}async function hL(){return await Y.get(`${Rr}/users/me/config/webui`)??{}}async function gL(e){return await Y.put(`${Rr}/users/me/config/webui`,e)??e}var _L=`application/x-canvas-workspace-pin`;function vL({pins:e,isLoading:t,searchQuery:n=``,activeKey:r,onOpen:i,onShowInTree:a,onUnpin:o,onMove:s}){let[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.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,Q.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`Loading pins…`}):e.length?m.length?(0,Q.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=Cm(e.color),s=e.icon||(e.type===`canvas`?`ph:squares-four-fill`:`ph:folder-fill`),m=r===So(e.tree,e.path),_=u?.id===e.id&&u.before,v=u?.id===e.id&&!u.before;return(0,Q.jsxs)(`div`,{role:`button`,tabIndex:0,"data-active":m||void 0,draggable:!p,onDragStart:t=>{t.dataTransfer.setData(_L,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:q(`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,Q.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,Q.jsx)(U,{className:`w-5 h-5 text-warning`}):(0,Q.jsx)(f,{icon:s,width:22,height:22,color:n,className:q(!n&&(e.type===`canvas`?`text-primary`:`text-muted-foreground`))})}),(0,Q.jsxs)(`div`,{className:`flex flex-col min-w-0 flex-1 py-2 pr-1`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5 min-w-0`,children:[(0,Q.jsx)(`span`,{className:`text-sm font-semibold leading-tight truncate`,children:e.label||e.name||e.path.split(`/`).pop()}),e.locked&&(0,Q.jsx)(Hn,{className:`w-3 h-3 shrink-0 text-warning`})]}),(0,Q.jsxs)(`span`,{className:`text-[11px] text-muted-foreground truncate leading-tight font-mono mt-0.5`,children:[e.tree,`:`,e.path]}),e.description&&(0,Q.jsx)(`span`,{className:`text-[11px] text-muted-foreground/80 truncate leading-tight mt-1`,children:e.description}),t&&(0,Q.jsx)(`span`,{className:`text-[11px] text-warning leading-tight mt-1`,children:`Folder no longer exists`})]}),(0,Q.jsxs)(`div`,{className:`flex flex-col items-center justify-between py-1.5 pr-1.5 shrink-0`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,Q.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,Q.jsx)(ne,{className:`w-3.5 h-3.5`})}),(0,Q.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,Q.jsx)(te,{className:`w-3.5 h-3.5`})})]}),!p&&(0,Q.jsx)(T,{className:`w-3.5 h-3.5 text-muted-foreground/50 cursor-grab active:cursor-grabbing`,"aria-hidden":!0})]})]},e.id)})}):(0,Q.jsxs)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:[`No pins match “`,n,`”`]}):(0,Q.jsxs)(`div`,{className:`px-3 py-6 text-xs text-muted-foreground text-center space-y-1`,children:[(0,Q.jsx)(`p`,{children:`No pinned folders yet.`}),(0,Q.jsxs)(`p`,{className:`text-muted-foreground/70`,children:[`Right-click a folder in the context, directory or backends tree and choose `,(0,Q.jsx)(`span`,{className:`font-medium`,children:`Pin`}),`.`]})]})}var yL=[`pins`,`context`,`layers`,`directory`,`backends`],bL=e=>typeof e==`string`&&yL.includes(e),xL=e=>{let t=Array.isArray(e)?e.filter(bL).filter((e,t,n)=>n.indexOf(e)===t):[];return[...t,...yL.filter(e=>!t.includes(e))]},SL={pins:(0,Q.jsx)(ke,{className:`w-3.5 h-3.5`}),context:(0,Q.jsx)(ie,{className:`w-3.5 h-3.5`}),layers:(0,Q.jsx)(dr,{className:`w-3.5 h-3.5`}),directory:(0,Q.jsx)(ne,{className:`w-3.5 h-3.5`}),backends:(0,Q.jsx)(tr,{className:`w-3.5 h-3.5`})},CL={pins:`Pins`,context:`Context tree`,layers:`Context layers`,directory:`Directory tree`,backends:`Backends tree`},wL=e=>e===`directory`||e===`backends`?e:lo,TL=(e,t)=>t?`layers`:e===`directory`?`directory`:e===`backends`?`backends`:`context`;function EL(){let{state:e}=jT();return e.selectedEntityId?(0,Q.jsx)(uE,{workspaceName:e.selectedEntityId,children:(0,Q.jsx)(DL,{},e.selectedEntityId)}):null}function DL(){let{state:e,closeM2:t,openM2:n,navigateFromMenu:r}=jT(),i=my(),a=$g(),o=e.selectedEntityId,s=hl(),c=fl(),{treeName:l,path:u}=jx(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?TL(l,f):yL[0],[h,g]=(0,Z.useState)(!1),[_,v]=(0,Z.useState)(null),[y,b]=(0,Z.useState)(null),[x,S]=(0,Z.useState)({icon:null,color:null}),[C,w]=(0,Z.useState)(m),[T,E]=(0,Z.useState)(null),[D,O]=(0,Z.useState)(null),[k,A]=(0,Z.useState)(null),[j,M]=(0,Z.useState)([]),[N,P]=(0,Z.useState)(!1),[ee,F]=(0,Z.useState)(!1),[I,L]=(0,Z.useState)(!1),[R,te]=(0,Z.useState)(!1),[z,ne]=(0,Z.useState)(u),[B,re]=(0,Z.useState)([]),[V,ie]=(0,Z.useState)(new Set),[ae,oe]=(0,Z.useState)(d&&u!==`/`?u:null),[H,se]=(0,Z.useState)(``),[ce,U]=(0,Z.useState)(null),[le,ue]=(0,Z.useState)(null),[de,fe]=(0,Z.useState)(null),{policies:pe,refresh:me}=uF(o),he=(0,Z.useCallback)(e=>{if(C!==`context`&&C!==`directory`||!pe.length)return null;let t=XP(pe,C,e);return t.length?`Storage policy targets: ${ZP(t)} (see Settings for transfer status)`:null},[C,pe]),[W,ge]=(0,Z.useState)([]),[_e,ve]=(0,Z.useState)(!1),[ye,G]=(0,Z.useState)(!1),K=(0,Z.useRef)(null),be=(0,Z.useRef)(!1),[xe,Se]=(0,Z.useState)(!1),[Ce,we]=(0,Z.useState)(yL),Te=!p;(0,Z.useEffect)(()=>{let e=!1;return hL().then(t=>{if(e)return;let n=xL(t?.m2?.tabOrder);we(n),Te&&w(e=>e===yL[0]?n[0]:e)}).catch(()=>{}),()=>{e=!0}},[]);let Ee=(0,Z.useCallback)(async e=>{let t=Ce;we(e);try{let t=await hL();await gL({...t,m2:{...t.m2,tabOrder:e}})}catch{we(t)}},[Ce]),[De,Oe]=(0,Z.useState)(null),[ke,Ae]=(0,Z.useState)(null),je=()=>{Oe(null),Ae(null)},Me=()=>{if(De&&ke&&De!==ke.id){let e=Ce.filter(e=>e!==De),t=e.indexOf(ke.id);t>=0&&(e.splice(ke.before?t:t+1,0,De),e.some((e,t)=>e!==Ce[t])&&Ee(e))}je()};(0,Z.useEffect)(()=>{let e=e=>U(e.detail??null);return window.addEventListener(`documents:clipboard`,e),()=>window.removeEventListener(`documents:clipboard`,e)},[]);let[Ne,Pe]=(0,Z.useState)(u);u!==Ne&&(Pe(u),ne(u));let Fe=(0,Z.useRef)(new Map),Ie=(0,Z.useCallback)(async(e,t,n=!1,r=!1)=>{let i=Symbol();Fe.current.set(t,i);let a=()=>Fe.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&&Aa(e,t);let i=await Ci(e,t);a()&&s(i)}catch{}finally{a()&&o(!1)}},[]),Le=(0,Z.useCallback)(async(e,t=!1)=>{let n=Symbol();Fe.current.set(`pins`,n);let r=()=>Fe.current.get(`pins`)===n;t||ve(!0);try{let t=await si(e);r()&&ge(t)}catch{}finally{r()&&ve(!1)}},[]),Re=(0,Z.useCallback)(async(e,t=!1)=>{let n=Symbol();Fe.current.set(`layers`,n);let r=()=>Fe.current.get(`layers`)===n;t||te(!0);try{let t=await Ki(e,`context`);r()&&M(t)}catch{}finally{r()&&te(!1)}},[]);(0,Z.useEffect)(()=>{if(!o)return;let e=o,t=!1,n=Fe.current;async function r(){Jr(e).then(e=>{t||(v(e.label||e.name),g(Ep(e)),b(e.id||null),S({icon:e.icon??null,color:e.color??null}))}).catch(()=>{}),await Promise.all([Ie(e,`context`),Ie(e,`directory`),Ie(e,`backends`),Re(e),Le(e)])}return r(),()=>{t=!0,n.clear()}},[o,Ie,Re,Le]);let ze=(0,Z.useCallback)((e,t,n=!1)=>{for(let r of[`context`,`directory`,`backends`])(!t||t===r)&&Ie(e,r,!0,n);(!t||t===`context`)&&Re(e,!0),Le(e,!0)},[Ie,Re,Le]),Be=(0,Z.useCallback)(()=>{o&&ze(o)},[o,ze]);(0,Z.useEffect)(()=>{if(!o)return;let e=e=>{e.detail?.workspaceName&&e.detail.workspaceName!==o||ze(o,e.detail?.treeName,e.detail?.cacheInvalidated)};return window.addEventListener(`workspace:tree:refresh`,e),()=>window.removeEventListener(`workspace:tree:refresh`,e)},[o,ze]),(0,Z.useEffect)(()=>{if(!o)return;let e=!1,t=()=>Eo(o).then(t=>{e||(re(t),ie(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,Z.useEffect)(()=>{if(!o)return;let e=[`workspace:${o}`,y?`workspace:${y}`:null].filter(Boolean),t=()=>e.forEach(e=>pd.emit(`subscribe`,{channel:e})),n=pd.on(`connect`,t);t();let r=Db(o,y),i=e=>{if(e?.workspaceId&&y&&e.workspaceId!==y)return;let t=e?.treePath;t&&ie(n=>{let r=new Set(n);return e.resyncing?r.add(t):r.delete(t),r})};pd.on(`backend.resync.changed`,i);let a=e=>{e?.workspaceId&&y&&e.workspaceId!==y||Le(o,!0)};return pd.on(`pins.changed`,a),()=>{r(),n?.(),pd.off(`backend.resync.changed`,i),pd.off(`pins.changed`,a)}},[o,y,Le]);let[Ve,He]=(0,Z.useState)(null),Ue=`${c.pathname}|${c.search}`;if(Ue!==Ve){He(Ue);let{treeName:e,path:t}=jx(c.pathname),n=new URLSearchParams(c.search).get(`layerId`),r=/\/trees\/|\/path(\/|$)/.test(c.pathname)||!!n;ye?G(!1):w(r||xe?r?TL(e,n):C:Ce[0]),ne(t),oe(t===`/`?null:t)}let{showProgress:We}=Hr(),Ge=Ob({workspaceId:o??void 0,treeName:wL(C),onRefresh:Be}),Ke=new Set(W.map(e=>So(e.tree,e.path))),qe=wL(C),Je=(0,Z.useCallback)(e=>Ke.has(So(qe,e)),[W,qe]),Ye=(0,Z.useCallback)(async e=>{if(!o)return;let t=W.find(t=>So(t.tree,t.path)===So(qe,e));t?await ka(o,t.id):await ko(o,e,qe),await Le(o)},[o,W,qe,Le]),Xe=(0,Z.useCallback)(async e=>{if(o){ge(t=>t.filter(t=>t.id!==e.id));try{await ka(o,e.id)}finally{await Le(o)}}},[o,Le]),Ze=(0,Z.useCallback)(async(e,t)=>{if(!o)return;let n=W.find(t=>t.id===e);if(!n)return;let r=W.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===W[t])){ge(a);try{ge(await ta(o,a.map(e=>e.id)))}catch(e){throw await Le(o),e}}},[o,W,Le]),Qe=(0,Z.useCallback)(e=>{if(!o)return;G(!0),ne(e.path),oe(null);let t=Mx(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]),$e=(0,Z.useCallback)(e=>{!o||e.resolvable===!1||(G(!1),Se(!0),w(TL(e.tree)),ne(e.path),oe(null),se(``),be.current=!0,i?.setFocus(`main`),r(Mx(o,e.path,e.tree)))},[o,r,i]),et=C===`context`?T:C===`directory`?D:C===`backends`?k:null,tt=C===`context`?N:C===`directory`?ee:C===`backends`&&I;(0,Z.useEffect)(()=>{if(!be.current||tt||C===`pins`)return;let e=K.current?.querySelector(`[data-active="true"]`);e&&(e.scrollIntoView({block:`nearest`,inline:`nearest`}),be.current=!1)},[C,z,et,tt]);let nt=(0,Z.useCallback)(e=>{Se(!0),w(e),ne(`/`),oe(null),se(``)},[]),rt=(0,Z.useCallback)(e=>{nt(tj(Ce,C,e))},[Ce,C,nt]),it=dL(e.m2Open,rt),at=e=>{oe(null),ne(e);let t=wL(C);i?.setFocus(`main`),r(Mx(o,e,t))},ot=(0,Z.useCallback)((e,t)=>{ne(e),oe(e);let n=wL(C),a=new URLSearchParams;a.set(`layer`,`1`),t&&a.set(`layerId`,t),i?.setFocus(`main`),r(`${Mx(o,e,n)}?${a.toString()}`)},[o,C,r,i]),st=(0,Z.useCallback)((e,t)=>{if(o){if(i){i.openCanvas({kind:`route`,location:Mx(o,e,t)});return}window.dispatchEvent(new CustomEvent(`workspace:open-to-side`,{detail:{workspaceName:o,treeName:t,path:e}}))}},[o,i]),ct=(0,Z.useCallback)(async e=>{if(!o)return;let t=wL(C),n=await wo(o,e,t),r=`${window.location.origin}${n.url}`;await navigator.clipboard?.writeText(r),alert(`Canvas share link copied:\n${r}`)},[o,C]),lt=H.toLowerCase().trim(),ut=lt?j.filter(e=>e.name.toLowerCase().includes(lt)||(e.label||``).toLowerCase().includes(lt)||(e.description||``).toLowerCase().includes(lt)):j;return(0,Q.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Q.jsx)(qI,{title:_||o||`Workspace`,icon:x.icon||`ph:stack-fill`,accentColor:x.color,onBack:t,action:(0,Q.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:()=>o&&r(aT(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,Q.jsx)(Ut,{className:`w-3.5 h-3.5`})}),(0,Q.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,Q.jsx)(bn,{className:`w-3.5 h-3.5`})})]})}),(0,Q.jsx)(`div`,{...it,className:`flex border-b border-border shrink-0 touch-pan-y`,"aria-label":`Workspace trees`,children:Ce.map(e=>(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>nt(e),title:`${CL[e]} — drag to reorder; the first tab opens by default`,"aria-label":CL[e],"aria-pressed":C===e,draggable:!0,onDragStart:t=>{t.dataTransfer.setData(`text/plain`,e),t.dataTransfer.effectAllowed=`move`,Oe(e)},onDragEnd:je,onDragOver:t=>{if(!De||De===e)return;t.preventDefault(),t.dataTransfer.dropEffect=`move`;let n=t.currentTarget.getBoundingClientRect(),r=t.clientX<n.left+n.width/2;Ae(t=>t?.id===e&&t.before===r?t:{id:e,before:r})},onDrop:e=>{e.preventDefault(),Me()},className:q(`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`,De===e&&`opacity-40`,ke?.id===e&&ke.before&&`shadow-[inset_2px_0_0_0_hsl(var(--primary))]`,ke?.id===e&&!ke.before&&`shadow-[inset_-2px_0_0_0_hsl(var(--primary))]`),children:[SL[e],e===`pins`&&W.length>0&&(0,Q.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:W.length})]},e))}),(0,Q.jsx)(`div`,{className:`px-2 py-1.5 border-b border-border shrink-0 shadow-elevation-2 z-10`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5 rounded-md border bg-muted/40 px-2 py-1`,children:[(0,Q.jsx)(nr,{className:`w-3 h-3 shrink-0 text-muted-foreground`}),(0,Q.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:H,onChange:e=>se(e.target.value)})]})}),(0,Q.jsx)(`div`,{ref:K,className:`flex-1 overflow-y-auto`,children:C===`pins`?(0,Q.jsx)(vL,{pins:W,isLoading:_e,searchQuery:H,activeKey:So(l,u),onOpen:Qe,onShowInTree:$e,onUnpin:Xe,onMove:Ze}):C===`layers`?(0,Q.jsx)(PL,{layers:ut,isLoading:R,wsName:o??``,onSelect:e=>{let t=new URLSearchParams;t.set(`layerId`,e.id),t.set(`layer`,`1`),r(`${Mx(o,`/`)}?${t.toString()}`)},onLock:async e=>{await Ii(o,e.id,o,`context`),ze(o)},onUnlock:async e=>{await Wa(o,e.id,o,`context`),ze(o)},onRename:async(e,t)=>{await ra(o,e.id,t,`context`),ze(o)},onDestroy:async e=>{confirm(`Destroy layer "${e.label||e.name}"? This cannot be undone.`)&&(await Xr(o,e.id,`context`),ze(o))}}):(0,Q.jsx)(iL,{root:et,workspaceId:o??void 0,treeName:C,isBackendsTree:C===`backends`,onRestoreTrash:o?e=>vb(o,e):void 0,onDiscardTrash:o?e=>bb(o,e):void 0,onShiftSelect:i?e=>st(e,wL(C)):void 0,selectedPath:z,contentPath:ae,onSelect:at,onShowContent:C===`context`?ot:void 0,onOpenToSide:st,onShareCanvas:ct,onNewCanvas:o&&C!==`backends`?e=>{s(`${Mx(o,e,C)}?createCanvas=1`)}:void 0,isLoading:tt,rootLabel:o??void 0,searchQuery:H,backends:B,resyncingPaths:C===`backends`?V:void 0,onAddRule:o&&C===`backends`?ue:void 0,onAddStoreRule:o?(e,t=`store`)=>{let n=C===`backends`?(()=>{let n=Qf(e);return{kind:t,storeTo:n?.backend||``,storeFolder:n?.rel||``}})():{kind:t,path:`${C===`directory`?`dir`:`ctx`}:${e}`,storeFolder:t===`download`?`Downloads`:ep(e)};s(`/workspaces/${o}/settings/hooks?${$f(n).toString()}`)}:void 0,onStoragePolicy:o&&(C===`context`||C===`directory`)?e=>fe(VP(C,e)):void 0,policyBadgeFor:he,pastedDocumentIds:ce?.documentIds,isPathPinned:Je,onTogglePin:o?Ye:void 0,onPasteDocuments:o&&C!==`backends`?async(e,t)=>{let n=C===`directory`?`directory`:`context`,r=C===`directory`?`directory`:lo,i=We({title:`Pasting…`,description:`${t.length} document(s) → "${e}"`}),a=!1;try{a=await Bi(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&&(ce&&(U(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,...Ge})}),le&&o&&(0,Q.jsx)(mL,{workspaceId:o,sourcePath:le,onClose:()=>ue(null),onManageRules:()=>{ue(null),s(`/workspaces/${o}/settings/hooks?section=rules`)}}),de&&o&&(0,Q.jsx)(tF,{workspaceId:o,path:de,onClose:()=>fe(null),onSaved:()=>{me()}})]})}var OL={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}},kL=100,AL=e=>e&&e.charAt(0).toUpperCase()+e.slice(1),jL=e=>OL[e]??{label:`${AL(e)} layers`,order:kL};function ML({type:e}){return e===`canvas`?(0,Q.jsx)(_t,{className:`w-3.5 h-3.5 shrink-0 text-primary`,"aria-label":`Canvas`}):e===`dataset`?(0,Q.jsx)(tr,{className:`w-3.5 h-3.5 shrink-0 text-secondary`,"aria-label":`Dataset`}):(0,Q.jsx)(dr,{className:`w-3.5 h-3.5 shrink-0 text-muted-foreground/60`,"aria-label":`Layer`})}function NL(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:jL(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 PL({layers:e,isLoading:t,onSelect:n,onLock:r,onUnlock:i,onRename:a,onDestroy:o}){let[s,c]=(0,Z.useState)(null),l=(0,Z.useRef)(null);if((0,Z.useEffect)(()=>{s&&l.current?.focus()},[s]),t)return(0,Q.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`Loading layers…`});if(!e.length)return(0,Q.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=NL(e);return(0,Q.jsx)(`div`,{className:`px-2 py-1.5 space-y-2`,children:f.map(e=>(0,Q.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,Q.jsxs)(`div`,{className:`px-1 pt-1 pb-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground`,children:[e.label,(0,Q.jsxs)(`span`,{className:`ml-1 text-muted-foreground/60`,children:[`(`,e.items.length,`)`]})]}),e.items.map(e=>(0,Q.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,Q.jsx)(`div`,{className:q(`w-2 h-2 rounded-full shrink-0`,!e.color&&`bg-muted-foreground/20`),style:e.color?{backgroundColor:e.color}:void 0}),(0,Q.jsx)(ML,{type:e.type}),s===e.id?(0,Q.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,Q.jsx)(`span`,{className:`flex-1 truncate font-medium`,children:e.label||e.name}),e.locked&&s!==e.id&&(0,Q.jsx)(Hn,{className:`w-2.5 h-2.5 shrink-0 text-warning group-hover:hidden`}),s!==e.id&&(0,Q.jsxs)(`div`,{className:`flex items-center gap-0.5 reveal-on-hover`,children:[e.locked?(0,Q.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,Q.jsx)(kt,{className:`w-3 h-3`})}):(0,Q.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,Q.jsx)(Hn,{className:`w-3 h-3`})}),!e.locked&&(0,Q.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,Q.jsx)(Le,{className:`w-3 h-3`})}),!e.locked&&(0,Q.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,Q.jsx)(rt,{className:`w-3 h-3`})})]})]},e.id))]},e.type))})}function FL(){let{state:e,closeM2:t}=jT(),n=$g(),r=hl(),i=fl(),a=e.selectedEntityId,[o,s]=(0,Z.useState)(null),c=o?.address===a?o.workspace:null,l=c?.label||c?.name,u=Ep(c);(0,Z.useEffect)(()=>{if(!a)return;let e=!1;return Jr(a).then(t=>{e||s({address:a,workspace:t})}).catch(()=>{}),()=>{e=!0}},[a]);let d=i.pathname.split(`/`).filter(Boolean),f=d[2]===`settings`?LO(d[3]):null,p=(0,Z.useMemo)(()=>FO.map(({id:e,label:t,description:n,icon:r})=>({id:e,label:t,description:n,icon:(0,Q.jsx)(r,{className:`h-4 w-4`})})),[]);return(0,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Q.jsx)(qI,{title:`Settings: ${l||a||`Workspace`}`,icon:c?.icon||`ph:stack-fill`,accentColor:c?.color,onBack:()=>{n||!a?t():r(`/workspaces/${a}`)},action:(0,Q.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,Q.jsx)(Ut,{className:`h-3.5 w-3.5`})})}),u?(0,Q.jsx)(oL,{items:p,activeId:f,onSelect:e=>a&&r(`/workspaces/${a}/settings/${e}`)}):(0,Q.jsx)(`p`,{className:`p-4 text-sm text-muted-foreground`,children:c?`Workspace settings are available to owners and admins.`:`Loading workspace…`})]})}function IL(e){let[t,n]=(0,Z.useState)([]),[r,i]=(0,Z.useState)(!1),a=(0,Z.useRef)(!1),o=(0,Z.useRef)(!1),s=(0,Z.useCallback)(async()=>{if(!o.current){o.current=!0,i(!0);try{let e=await rk();n(e||[]),a.current=!0}catch(e){console.error(`Failed to fetch agents:`,e)}finally{o.current=!1,i(!1)}}},[]),c=(0,Z.useCallback)(()=>{a.current=!1,s()},[s]);return(0,Z.useEffect)(()=>{e&&!a.current&&s()},[e,s]),(0,Z.useEffect)(()=>{if(!e)return;let t=()=>pd.emit(`subscribe`,{channel:`agent`}),r=()=>pd.emit(`unsubscribe`,{channel:`agent`}),i=pd.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])=>pd.on(e,t)),()=>{r(),i?.(),u.forEach(([e,t])=>pd.off(e,t))}},[e,s]),(0,Z.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 LL({status:e}){return(0,Q.jsx)(`span`,{className:q(`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 RL(){let e=Hw(),{state:t,selectEntity:n,openM2:r,closeM2:i}=jT(),a=$g(),{agents:o,isLoading:s,refresh:c}=IL(t.activeSection===`agents`),{showToast:l}=Hr(),[u,d]=(0,Z.useState)(new Set),f=hl(),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 _k(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 vk(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,Q.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:[(0,Q.jsxs)(`div`,{className:`flex min-w-0 items-center`,children:[(0,Q.jsx)(GI,{}),(0,Q.jsx)(`span`,{className:`text-sm font-semibold`,children:`Agents`})]}),!e.local&&(0,Q.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,Q.jsx)(cn,{className:`w-3.5 h-3.5`})})]}),(0,Q.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:s&&o.length===0?(0,Q.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading...`}):o.length===0?(0,Q.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`No agents found`}):(0,Q.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,Q.jsxs)(`div`,{"data-active":i||void 0,className:q(`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,Q.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Q.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(LL,{status:e.status}),(0,Q.jsx)(`span`,{className:`text-sm font-medium truncate`,children:e.label||e.name})]})}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-0.5 shrink-0`,children:[e.status===`active`?(0,Q.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,Q.jsx)(Bn,{className:`w-3.5 h-3.5`})}):(0,Q.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,Q.jsx)(Se,{className:`w-3.5 h-3.5`})}),(0,Q.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,Q.jsx)(bn,{className:`w-3.5 h-3.5`})})]})]}),e.description&&(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5 pl-3.5`,children:e.description})]},e.id)})})})]})}function zL(e){return e.name?.trim()?e.name.trim():e.firstMessage?.trim()?e.firstMessage.trim():e.isExperimental?`Experimental`:e.id.slice(0,8)}function BL(e){let t=new Date(e.updatedAt).toLocaleString();return e.messageCount>0?`${e.messageCount} msg${e.messageCount===1?``:`s`} • ${t}`:`Empty • ${t}`}function VL(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 HL(){let{state:e,closeM2:t}=jT(),n=e.selectedEntityId||``,r=hl(),{showToast:i}=Hr(),[a,o]=(0,Z.useState)(null),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)(``),[d,f]=(0,Z.useState)(null),[p,m]=(0,Z.useState)(``),{current:h,sessions:g,isLoading:_,error:v,refresh:y,create:b,select:x,rename:S,remove:C}=DN(n);(0,Z.useEffect)(()=>{n&&(ik(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,Z.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(VL(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(VL(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 "${zL(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,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Q.jsx)(qI,{title:a?.label||a?.name||n,onBack:t,action:(0,Q.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,Q.jsx)(bn,{className:`h-3.5 w-3.5`})})}),(0,Q.jsxs)(`div`,{className:`border-b border-border px-4 py-3`,children:[(0,Q.jsx)(`div`,{className:`text-sm font-semibold`,children:`Sessions`}),(0,Q.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:g?.mode===`incognito`?`Incognito mode`:g?.mode===`experimental`?`Experimental mode`:`Persistent history`}),(0,Q.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:[(0,Q.jsxs)(X,{size:`sm`,variant:s?`default`:`outline`,onClick:()=>{c(e=>!e),u(``)},disabled:_,children:[(0,Q.jsx)(cn,{className:`mr-1 h-3.5 w-3.5`}),`New`]}),(0,Q.jsxs)(X,{size:`sm`,variant:g?.mode===`experimental`?`default`:`outline`,onClick:k,disabled:_,children:[(0,Q.jsx)(He,{className:`mr-1 h-3.5 w-3.5`}),`Experimental`]}),(0,Q.jsx)(X,{size:`sm`,variant:g?.mode===`incognito`?`default`:`outline`,onClick:A,disabled:_,children:`Incognito`})]})]}),(0,Q.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-2`,children:[v&&(0,Q.jsx)(`div`,{className:`px-2 py-2 text-xs text-destructive`,children:v}),s&&(0,Q.jsxs)(`div`,{className:`mb-2 rounded-md border bg-muted/20 p-2`,children:[(0,Q.jsx)(`div`,{className:`mb-2 text-xs text-muted-foreground`,children:`Name the new session or leave it blank.`}),(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(J,{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,Q.jsx)(X,{size:`sm`,onClick:O,disabled:_,children:`Create`})]})]}),g?.sessions.length?(0,Q.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,Q.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,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Q.jsx)(`div`,{className:`min-w-0 flex-1`,children:n?(0,Q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Q.jsx)(J,{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,Q.jsx)(X,{size:`sm`,onClick:t=>{t.stopPropagation(),M(e)},disabled:!p.trim()||_,children:`Save`})]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`span`,{className:`truncate text-sm font-medium`,children:zL(e)}),e.isExperimental&&(0,Q.jsx)(`span`,{className:`rounded-full bg-primary/10 px-1.5 py-0.5 text-[10px] text-primary`,children:`∞`}),e.isCurrent&&(0,Q.jsx)(`span`,{className:`rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground`,children:`Current`})]}),(0,Q.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:BL(e)})]})}),!n&&(0,Q.jsxs)(`div`,{className:`flex items-center gap-0.5 reveal-on-hover`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),f(e.id),m(e.name||zL(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,Q.jsx)(_r,{className:`h-3.5 w-3.5`})}),!e.isExperimental&&(0,Q.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,Q.jsx)(rt,{className:`h-3.5 w-3.5`})})]})]})},e.id)})}):(0,Q.jsx)(`div`,{className:`flex h-full items-center justify-center text-center text-muted-foreground`,children:(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{className:`text-sm`,children:_?`Loading sessions...`:`No persistent sessions yet.`}),(0,Q.jsx)(`div`,{className:`mt-1 text-xs`,children:"Use `New`, `Experimental`, or `Incognito`."})]})}),h?.mode===`incognito`&&(0,Q.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 UL(){let{state:e,closeM2:t}=jT(),n=$g(),r=hl(),i=fl(),a=e.selectedEntityId,[o,s]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{if(!a)return;let e=!1;return ik(a).then(t=>{e||s(t)}).catch(()=>{}),()=>{e=!0}},[a]);let c=i.pathname.split(`/`).filter(Boolean),l=c[2]===`settings`?VO(c[3]):null,u=encodeURIComponent(o?.name||a||``),d=(0,Z.useMemo)(()=>BO.map(({id:e,label:t,description:n,icon:r})=>({id:e,label:t,description:n,icon:(0,Q.jsx)(r,{className:`h-4 w-4`})})),[]);return(0,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Q.jsx)(qI,{title:`Settings: ${o?.label||o?.name||a||`Agent`}`,accentColor:o?.color??null,onBack:()=>{n||!u?t():r(`/agents/${u}`)},action:(0,Q.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,Q.jsx)(Ut,{className:`h-3.5 w-3.5`})})}),(0,Q.jsx)(oL,{items:d,activeId:l,onSelect:e=>u&&r(`/agents/${u}/settings/${e}`)})]})}function WL(){let e=fl(),{state:t}=jT(),[n,r]=(0,Z.useState)(``),i=(0,Z.useRef)(null);(0,Z.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=oT.filter(e=>e.id!==`server`||t.user?.userType===`admin`).map(e=>({...e,items:e.items.filter(t=>cT(n,e.label,t.label,t.description))})).filter(e=>e.items.length);return(0,Q.jsxs)(`nav`,{"aria-label":`Settings`,className:`flex h-full flex-col`,children:[(0,Q.jsxs)(`div`,{className:`shrink-0 space-y-3 border-b border-border p-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center`,children:[(0,Q.jsx)(GI,{}),(0,Q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Settings`})]}),(0,Q.jsx)(J,{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,Q.jsxs)(`div`,{ref:i,className:`min-h-0 flex-1 space-y-4 overflow-y-auto p-2`,children:[a.map(t=>(0,Q.jsxs)(`section`,{"aria-label":t.label,children:[(0,Q.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,Q.jsxs)(Mu,{to:t,"aria-current":e.pathname===t?`page`:void 0,className:q(`flex items-start gap-3 rounded-md px-3 py-2 text-left hover:bg-accent/50`,e.pathname===t&&`bg-accent`),children:[(0,Q.jsx)(n,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(`span`,{className:`block text-sm font-medium`,children:r}),(0,Q.jsx)(`span`,{className:`mt-0.5 block text-xs leading-relaxed text-muted-foreground`,children:i})]})]},t))]},t.id)),!a.length&&(0,Q.jsx)(`p`,{role:`status`,className:`p-3 text-sm text-muted-foreground`,children:`No settings match. Try “cache”, “model” or “token”.`})]})]})}var GL=280,KL=220,qL=560;function JL(){let{state:e}=jT(),{activeSection:t,m2View:n}=e;if(t===`contexts`){if(n===`settings`)return(0,Q.jsx)(sL,{});if(n===`detail`)return(0,Q.jsx)(aL,{})}if(t===`workspaces`){if(n===`settings`)return(0,Q.jsx)(FL,{});if(n===`detail`)return(0,Q.jsx)(EL,{})}if(t===`agents`){if(n===`settings`)return(0,Q.jsx)(UL,{});if(n===`detail`)return(0,Q.jsx)(HL,{})}return null}function YL(){let{state:e,closeM1:t,closeM2:n}=jT();Np(t,e.m1Open&&!e.m2Open),Np(n,e.m1Open&&e.m2Open);let r=$g(),i=(0,Z.useRef)(null),a=(0,Z.useRef)(null);UI(i,e.m1Open&&!e.m2Open,e.activeSection??``),UI(a,e.m1Open&&e.m2Open,`${e.activeSection}:${e.selectedEntityId}:${e.m2View}`);let[o,s]=(0,Z.useState)(GL),[c,l]=(0,Z.useState)(!1),u=(0,Z.useRef)(null),d=(0,Z.useCallback)(e=>{e.preventDefault(),l(!0),u.current={startX:e.clientX,startWidth:o};let t=e=>{if(!u.current)return;let t=e.clientX-u.current.startX,n=Math.min(qL,Math.max(KL,u.current.startWidth+t));s(n)},n=()=>{u.current=null,l(!1),window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,n)};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},[o]),f=r&&e.m1Open;return(0,Q.jsxs)(Q.Fragment,{children:[f&&(0,Q.jsx)(`div`,{className:`fixed inset-0 z-40 bg-scrim animate-fade-in`,onClick:t,"aria-hidden":!0}),(0,Q.jsxs)(`div`,{style:e.m1Open&&!f?{width:o}:void 0,className:q(`flex-shrink-0 overflow-hidden bg-card surface-glass`,!c&&!f&&`transition-[width] duration-normal ease-out`,e.m1Open?`rounded-[var(--panel-radius)] shadow-elevation-2`:`w-0`,f?`fixed bottom-2 left-[calc(0.5rem+var(--spacing-rail)+0.5rem)] right-2 top-2 z-40 shadow-elevation-5`:`relative`),children:[(0,Q.jsxs)(`div`,{ref:i,"data-menu-view":`list`,inert:!e.m1Open||e.m2Open,className:q(`absolute inset-0 flex flex-col transition-opacity duration-normal ease-out`,e.m2Open&&`opacity-0 pointer-events-none`),style:f?void 0:{minWidth:o},children:[e.activeSection===`contexts`&&(0,Q.jsx)(KI,{}),e.activeSection===`workspaces`&&(0,Q.jsx)(uL,{}),e.activeSection===`agents`&&(0,Q.jsx)(RL,{}),e.activeSection===`admin`&&(0,Q.jsx)(WL,{}),e.activeSection===`settings`&&(0,Q.jsx)(WL,{})]}),(0,Q.jsx)(`div`,{ref:a,"data-menu-view":`detail`,inert:!e.m1Open||!e.m2Open,className:q(`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,Q.jsx)(JL,{})}),e.m1Open&&!f&&(0,Q.jsx)(`div`,{onMouseDown:d,className:`absolute right-0 top-0 bottom-0 z-20 w-1 cursor-col-resize hover:bg-primary/20 transition-colors`})]})]})}var XL=`canvas:readerWidth`,ZL=320,QL=1600;function $L(){try{let e=Number(sessionStorage.getItem(XL));return Number.isFinite(e)&&e>=ZL&&e<=QL?e:null}catch{return null}}var eR=$L(),tR=new Set;function nR(e){return tR.add(e),()=>{tR.delete(e)}}function rR(e){eR=e===null?null:Math.round(Math.max(ZL,Math.min(QL,e)));try{eR===null?sessionStorage.removeItem(XL):sessionStorage.setItem(XL,String(eR))}catch{}tR.forEach(e=>e())}function iR(){return(0,Z.useSyncExternalStore)(nR,()=>eR,()=>null)}var aR=320,oR=1600;function sR({edge:e}){let t=iR(),n=(0,Z.useRef)(null),r=e===`left`?-1:1;return(0,Q.jsx)(`div`,{role:`separator`,"aria-label":`Resize document reader`,"aria-orientation":`vertical`,"aria-valuemin":aR,"aria-valuemax":oR,"aria-valuenow":t??420,tabIndex:0,title:`Drag to resize; arrow keys adjust width; double-click to reset`,className:`absolute inset-y-0 ${e===`left`?`left-0`:`right-0`} z-20 hidden w-2 touch-none cursor-col-resize select-none hover:bg-primary/20 focus-visible:bg-primary/20 focus-visible:outline-none md:block`,onPointerDown:t=>{if(t.button!==0)return;t.preventDefault(),t.stopPropagation();let r=t.currentTarget.closest(`[data-reader-pane]`),i=e===`left`?(r.parentElement?.clientWidth??window.innerWidth)-248:window.innerWidth;n.current={x:t.clientX,width:r.getBoundingClientRect().width,max:Math.max(aR,i)},t.currentTarget.setPointerCapture(t.pointerId)},onPointerMove:e=>{n.current&&rR(Math.min(n.current.max,n.current.width+r*(e.clientX-n.current.x)))},onPointerUp:e=>{n.current=null,e.currentTarget.hasPointerCapture(e.pointerId)&&e.currentTarget.releasePointerCapture(e.pointerId)},onPointerCancel:()=>{n.current=null},onLostPointerCapture:()=>{n.current=null},onDoubleClick:()=>rR(null),onKeyDown:e=>{if(e.key!==`ArrowLeft`&&e.key!==`ArrowRight`&&e.key!==`Home`)return;e.preventDefault(),e.stopPropagation();let t=e.currentTarget.closest(`[data-reader-pane]`);e.key===`Home`?rR(null):rR(t.getBoundingClientRect().width+(e.key===`ArrowRight`?1:-1)*r*(e.shiftKey?64:16))}})}function cR(e){return e.schema===`data/schema/note`?qn:e.schema===`data/schema/tab`?vn:e.schema===`data/schema/file`?zn:e.schema===`data/schema/message/email`?xt:Un}function lR({entry:e,onClose:t,frame:n}={}){let r=gg(),i=e??r.entry,a=t??r.close,{document:o,refresh:s}=zy(i?.workspaceId,i?.document??null);if(!i||!o)return!e&&(r.loading||r.error)?(0,Q.jsxs)(`div`,{className:`flex h-full w-full flex-col overflow-hidden rounded-(--card-radius) border bg-card`,children:[(0,Q.jsxs)(`div`,{className:`flex h-[calc(3rem-1px)] shrink-0 items-center justify-between border-b-[3px] bg-muted pl-4 pr-2`,children:[(0,Q.jsx)(`span`,{className:`text-sm`,children:`Document`}),(0,Q.jsx)(`button`,{type:`button`,onClick:a,className:`flex h-8 w-8 items-center justify-center rounded hover:bg-accent`,"aria-label":`Close`,children:(0,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsxs)(`div`,{className:`p-4 text-sm`,role:r.error?`alert`:`status`,children:[r.error||`Loading document…`,r.error&&(0,Q.jsx)(`button`,{type:`button`,className:`ml-2 underline`,onClick:r.retry,children:`Retry`})]})]}):null;let{workspaceId:c}=i,l=t=>{s(t),t&&t.id!==i.document.id&&!e&&r.replace?.(t,c)};return(0,Q.jsx)(bD,{title:Ni(o).title,icon:cR(o),onClose:a,onSave:async e=>(await Bi(c,e.path,[o.id],e.treeName,e.treeType),[o.id]),canSave:!0,successMessage:`Linked`,lockedWorkspaceName:c,relationSubjectId:o.id,frame:n,fillParent:!0,fullWidthContent:lv(o)===d_,maximized:e?void 0:r.location?.maximized,onMaximizedChange:e?void 0:e=>r.update?.({maximized:e}),children:t=>(0,Q.jsx)(`div`,{className:`document-side-content h-full min-h-0 min-w-0 w-full`,children:(0,Q.jsx)(Ry,{document:o,workspaceId:c,onChanged:l,compact:!0,tabActions:t,initialTab:e?void 0:r.location?.section,onTabChange:e?void 0:e=>r.update?.({section:e})},`${c}:${o.id}`)})})}function uR(e){let[t]=e.split(`/`).filter(Boolean);return!t||t===`home`||t===`share-target`}function dR(e){let[t,n]=e.split(`/`).filter(Boolean);return[`contexts`,`workspaces`,`agents`].includes(t)&&!!n}var fR=`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`,pR=`fixed inset-0 z-side-scrim bg-scrim animate-fade-in md:hidden`;function mR(){let e=iR(),{pathname:t,search:n}=fl(),{state:r}=jT(),i=(0,Z.useRef)(null);UI(i,!r.m1Open,t+n,!r.m0Open);let a=dR(t),o=uR(t),{entry:s,loading:c,error:l,close:u}=gg();return(0,Q.jsx)(`div`,{className:q(`relative flex flex-col flex-1 min-w-0`,!o&&`surface-sheet`),children:(0,Q.jsxs)(`div`,{className:`flex flex-1 min-h-0 gap-shell`,children:[(0,Q.jsx)(`main`,{ref:i,id:`content-area`,className:q(`relative flex-1 min-h-0 min-w-0 overflow-auto`,!a&&!o&&`p-page max-md:pb-rail-stack`),children:(0,Q.jsx)(Hl,{})}),(s||c||l)&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:pR,onClick:u,"aria-hidden":!0}),(0,Q.jsxs)(`div`,{"data-reader-pane":!0,style:{"--reader-width":`${e??420}px`},className:q(`relative z-10 flex shrink-0 items-stretch py-2 mr-2 md:w-[var(--reader-width)] md:max-w-[calc(100%_-_248px)]`,fR),children:[(0,Q.jsx)(sR,{edge:`left`}),(0,Q.jsx)(lR,{},s?`${s.workspaceId}:${s.document.id}`:`loading`)]})]})]})})}function hR(){let{state:e,setView:t}=Rs(),{pathname:n}=fl();return e.t1Open||e.addOpen||!uR(n)?null:(0,Q.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,Q.jsx)(Wn,{className:`h-7 w-7`,strokeWidth:1.75,"aria-hidden":!0})})}var gR={current:null,sessions:null,isLoading:!1,error:null};function _R(e){return e instanceof Error?e.message:`Session request failed`}function vR({children:e}){let[t,n]=(0,Z.useState)({}),r=(0,Z.useCallback)((e,t)=>{n(n=>({...n,[e]:{...n[e]||gR,...t}}))},[]),i=(0,Z.useCallback)((e,t)=>(r(e,{current:t.current,sessions:t.sessions,isLoading:!1,error:null}),t),[r]),a=(0,Z.useCallback)(async e=>{if(e){r(e,{isLoading:!0,error:null});try{let[t,n]=await Promise.all([ak(e),ok(e)]);r(e,{current:t,sessions:n,isLoading:!1,error:null})}catch(t){throw r(e,{isLoading:!1,error:_R(t)}),t}}},[r]),o=(0,Z.useCallback)(async(e,t)=>{r(e,{isLoading:!0,error:null});try{return i(e,await sk(e,t))}catch(t){throw r(e,{isLoading:!1,error:_R(t)}),t}},[i,r]),s=(0,Z.useCallback)(async(e,t)=>{r(e,{isLoading:!0,error:null});try{return i(e,await ck(e,t))}catch(t){throw r(e,{isLoading:!1,error:_R(t)}),t}},[i,r]),c=(0,Z.useCallback)(async(e,t,n)=>{r(e,{isLoading:!0,error:null});try{return i(e,await lk(e,t,{name:n}))}catch(t){throw r(e,{isLoading:!1,error:_R(t)}),t}},[i,r]),l=(0,Z.useCallback)(async(e,t)=>{r(e,{isLoading:!0,error:null});try{return i(e,await uk(e,t))}catch(t){throw r(e,{isLoading:!1,error:_R(t)}),t}},[i,r]),u=(0,Z.useMemo)(()=>({getState:e=>t[e]||gR,refresh:a,create:o,select:s,rename:c,remove:l}),[t,a,o,s,c,l]);return(0,Q.jsx)(EN.Provider,{value:u,children:e})}function yR(){let e=Es(),{closeAdd:t}=Rs(),{showSuccessToast:n,showErrorToast:r}=Gr(),[i,a]=(0,Z.useState)(`Untitled.txt`),[o,s]=(0,Z.useState)(``),[c,l]=(0,Z.useState)(!1),u=!1;try{ms(``,i.trim()),u=!0}catch{}return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`plaintext-filename`,children:`Filename`}),(0,Q.jsx)(J,{id:`plaintext-filename`,autoFocus:!0,value:i,onChange:e=>a(e.target.value)})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Content`}),(0,Q.jsx)(Vo,{kind:`text`,value:o,onChange:s,placeholder:`Write plain text…`})]}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Creates a file in the current storage folder. Existing files are never overwritten.`}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:t,disabled:c,children:`Cancel`}),(0,Q.jsx)(X,{size:`sm`,onClick:async()=>{if(!(c||!u||e?.mode!==`workspace`||e.treeName!==`backends`)){l(!0);try{let r=await Os(e.workspaceName,e.path);await Vr(e.workspaceName,{...r,key:ms(r.key,i.trim())},new Blob([o],{type:`text/plain;charset=utf-8`}),{contentType:`text/plain;charset=utf-8`}),gs(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`})]})]})}var bR=`references`;function xR(e){return e?e.documents.map(e=>({predicate:bR,direction:`out`,targetId:e.id,document:e})):[]}function SR(e,t){let[n,r]=(0,Z.useState)(()=>xR(t)),[i,a]=(0,Z.useState)([...ro]),o=e?.mode===`context`?e.contextId:null,[s,c]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{if(!o)return;let e=!1;return js({mode:`context`,contextId:o}).then(t=>{e||c({contextId:o,workspaceName:t.workspaceName})}).catch(()=>{}),()=>{e=!0}},[o]);let l=e?.mode===`workspace`?e.workspaceName:o&&s?.contextId===o?s.workspaceName:t?.workspaceName??null;return(0,Z.useEffect)(()=>{let e=!1;if(l)return Li(l).then(t=>{e||a(t)}),()=>{e=!0}},[l]),{rows:n,predicates:i,workspaceName:l,add:(0,Z.useCallback)(async(e,t,i)=>{let a=i.filter(r=>!n.some(n=>n.targetId===r&&n.predicate===e&&n.direction===t));if(a.length===0)return;let o=await Promise.all(a.map(e=>l?Ja(l,e).catch(()=>null):Promise.resolve(null)));r(n=>[...n,...a.map((n,r)=>({predicate:e,direction:t,targetId:n,document:o[r]??null}))])},[n,l]),update:(0,Z.useCallback)((e,t)=>{r(n=>n.map((n,r)=>r===e?{...n,...t}:n))},[]),remove:(0,Z.useCallback)(e=>{r(t=>t.filter((t,n)=>n!==e))},[]),write:(0,Z.useCallback)(async e=>{if(n.length===0||e.length===0||!l)return 0;let t=new Map;for(let e of n){let n=`${e.direction}:${e.predicate}`,r=t.get(n)??{predicate:e.predicate,direction:e.direction,targets:[]};r.targets.push(e.targetId),t.set(n,r)}let r=0;for(let n of e)for(let e of t.values())try{await go(l,n,e.predicate,e.targets,e.direction)}catch(t){r+=1,console.error(`Failed to relate document`,n,e.predicate,t)}return r<e.length*t.size&&Og(),r},[n,l]),hasRows:n.length>0}}function CR({f:e,idPrefix:t}){let[n,r]=(0,Z.useState)(!1),[i,a]=(0,Z.useState)(!1),o=!e.workspaceName;return(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Q.jsx)($,{children:`Related documents`}),(0,Q.jsxs)(X,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 px-2 text-xs`,disabled:o,onClick:()=>r(!0),title:o?`No workspace to relate within`:`Pick documents the new one relates to`,children:[(0,Q.jsx)(cn,{className:`mr-1 h-3 w-3`}),` Add`]})]}),e.rows.length===0?(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`None. Relations are written right after the document is created.`}):(0,Q.jsx)(`ul`,{className:`space-y-1`,children:e.rows.map((n,r)=>{let i=n.document?Ni(n.document).title:`Document ${n.targetId}`,a=`${t}-relation-${r}`;return(0,Q.jsxs)(`li`,{className:`flex items-center gap-1.5 rounded-md border border-input px-2 py-1.5 text-sm`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:()=>e.update(r,{direction:n.direction===`out`?`in`:`out`}),className:`shrink-0 rounded p-0.5 text-muted-foreground hover:bg-accent hover:text-foreground`,title:n.direction===`out`?`The new document ${n.predicate} this one (click to flip)`:`This document ${n.predicate} the new one (click to flip)`,"aria-label":`Flip relation direction`,children:n.direction===`out`?(0,Q.jsx)(Ot,{className:`h-3.5 w-3.5`}):(0,Q.jsx)(Yn,{className:`h-3.5 w-3.5`})}),(0,Q.jsx)(`label`,{htmlFor:a,className:`sr-only`,children:`Predicate`}),(0,Q.jsx)(`select`,{id:a,value:n.predicate,onChange:t=>e.update(r,{predicate:t.target.value}),className:`w-[9.5rem] shrink-0 rounded-md border border-input bg-background px-1.5 py-1 font-mono text-[11px] focus:outline-none focus:ring-2 focus:ring-ring`,children:(e.predicates.includes(n.predicate)?e.predicates:[n.predicate,...e.predicates]).map(e=>(0,Q.jsx)(`option`,{value:e,children:e},e))}),n.document?(0,Q.jsx)(Fm,{document:n.document,size:3.5}):null,(0,Q.jsx)(`span`,{className:q(`min-w-0 flex-1 truncate`,!n.document&&`italic text-muted-foreground`),title:i,children:i}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>e.remove(r),className:`shrink-0 rounded p-0.5 text-muted-foreground hover:bg-destructive/10 hover:text-destructive`,title:`Remove`,"aria-label":`Remove relation`,children:(0,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]},`${n.direction}:${n.predicate}:${n.targetId}`)})}),n&&e.workspaceName&&(0,Q.jsx)(Up,{onClose:()=>{i||r(!1)},children:(0,Q.jsx)(Jm,{sizeClassName:`h-full w-[380px] max-w-[90vw] max-md:w-full`,title:`Relate to…`,confirmLabel:`Add`,tabs:[`relations`],fixedWorkspaceName:e.workspaceName,documentCount:1,saving:i,relationPredicates:e.predicates.length?e.predicates:[`references`],relationExcludeIds:new Set(e.rows.map(e=>e.targetId)),onClose:()=>r(!1),onConfirm:()=>{},onConfirmRelation:async({predicate:t,direction:n,targetIds:i})=>{a(!0);try{await e.add(t,n,i),r(!1)}finally{a(!1)}}})})]})}function wR(){let{closeAdd:e,state:t}=Rs(),n=Es(),{showSuccessToast:r,showErrorToast:i}=Gr(),a=SR(n,t.addRelateTo),o=gS(n,a.write,t.addRelateTo?`related:${t.addRelateTo.documents.map(e=>e.id).sort().join(`,`)}`:`add`),s=RD(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,Q.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`note-title`,children:`Title`}),(0,Q.jsx)(J,{id:`note-title`,value:o.title,onChange:e=>o.setTitle(e.target.value),placeholder:`Optional; defaults to today's date`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Body`}),(0,Q.jsx)(Vo,{kind:`markdown`,value:o.content,onChange:o.setContent,placeholder:`Write your note…`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`note-comment`,children:`Comment`}),(0,Q.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,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:o.tags,onChange:o.setTags,suggestions:s})]}),(0,Q.jsx)(vD,{geotag:o.geotag,idPrefix:`note-geotag`}),(0,Q.jsx)(CR,{f:a,idPrefix:`note`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:As(n)}),(0,Q.jsx)(Wo,{...o,onRetry:o.retry}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:e,disabled:o.saving,children:`Close`}),(0,Q.jsx)(X,{size:`sm`,onClick:l,disabled:!c,children:o.saving?`Saving…`:`Done`})]})]})}function TR(){let{closeAdd:e,state:t}=Rs(),n=Es(),{showSuccessToast:r,showErrorToast:i}=Gr(),a=TD(),o=SR(n,t.addRelateTo),s=RD(t.activeWorkspaceName),c=!!n&&a.canSave;return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`link-url`,children:`URL`}),(0,Q.jsx)(J,{id:`link-url`,value:a.url,onChange:e=>a.setUrl(e.target.value),placeholder:`https://example.com`,autoFocus:!0}),a.showUrlError&&(0,Q.jsx)(`p`,{className:`text-xs text-destructive`,children:`Enter a valid URL, e.g. https://example.com`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`link-title`,children:`Title`}),(0,Q.jsx)(J,{id:`link-title`,value:a.title,onChange:e=>a.setTitle(e.target.value),placeholder:`Optional display title`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:a.tags,onChange:a.setTags,suggestions:s})]}),(0,Q.jsx)(vD,{geotag:a.geotag,idPrefix:`link-geotag`}),(0,Q.jsx)(CR,{f:o,idPrefix:`link`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:As(n)}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:e,disabled:a.saving,children:`Cancel`}),(0,Q.jsx)(X,{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 ER(e){let[t,n]=(0,Z.useState)({key:``,list:[]});return(0,Z.useEffect)(()=>{if(!e)return;let t=!1;return Eo(e,`github`).then(async r=>{let i=r.filter(e=>e.capabilities?.write),a=[];for(let t of i){let n=await Da(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 DR(){let{closeAdd:e,state:t}=Rs(),n=Es(),{showSuccessToast:r,showErrorToast:i}=Gr(),a=R_(),o=SR(n,t.addRelateTo),s=RD(t.activeWorkspaceName),c=ER(t.activeWorkspaceName),[l,u]=(0,Z.useState)(`canvas`),[d,f]=(0,Z.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 aa(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,Q.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Q.jsx)(Uv,{...a}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:a.tags,onChange:a.setTags,suggestions:s})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`todo-comment`,children:`Comment`}),(0,Q.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,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`todo-destination`,children:`Save to`}),(0,Q.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,Q.jsxs)(`option`,{value:`canvas`,children:[`Canvas: `,As(n)]}),c.map(e=>(0,Q.jsx)(`option`,{value:`${e.driver}:${e.address}:${e.container}`,children:e.label},`${e.driver}:${e.address}:${e.container}`))]}),p&&(0,Q.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,Q.jsx)(vD,{geotag:a.geotag,idPrefix:`todo-geotag`}),!p&&(0,Q.jsx)(CR,{f:o,idPrefix:`todo`}),!p&&(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:As(n)}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:e,disabled:a.saving||d,children:`Cancel`}),(0,Q.jsx)(X,{size:`sm`,onClick:h,disabled:!m,children:a.saving||d?`Saving…`:p?`Create issue`:`Save todo`})]})]})}function OR(){let{closeAdd:e,state:t}=Rs(),n=Es(),{showSuccessToast:r,showErrorToast:i}=Gr(),a=Qv(),o=SR(n,t.addRelateTo),s=RD(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,Q.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Q.jsx)(ry,{idPrefix:`add-identity`,workspaceName:t.activeWorkspaceName??void 0,...a,emailValid:a.emailValid}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:a.tags,onChange:a.setTags,suggestions:s})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`identity-comment`,children:`Comment`}),(0,Q.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,Q.jsx)(CR,{f:o,idPrefix:`identity`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:As(n)}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:e,disabled:a.saving,children:`Cancel`}),(0,Q.jsx)(X,{size:`sm`,onClick:c,disabled:!n||!a.canSave,children:a.saving?`Saving…`:`Save identity`})]})]})}function kR({capture:e=!1}={}){let{closeAdd:t,state:n}=Rs(),r=Es(),i=r?.mode===`workspace`&&r.treeName===`backends`,a=SR(r,n.addRelateTo),{showSuccessToast:o,showErrorToast:s}=Gr(),c=(0,Z.useRef)(null),[l,u]=(0,Z.useState)(!1),d=jD(),{items:f,running:p}=d,[m,h]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{if(r?.mode!==`context`)return;let e=!1;return js(r).then(t=>{e||h({contextId:r.contextId,workspaceName:t.workspaceName})}).catch(()=>{}),()=>{e=!0}},[r]);let g=VD(r?.mode===`workspace`?r.workspaceName:r&&m?.contextId===r.contextId?m.workspaceName:null),_=e=>{e&&d.addFiles(Array.from(e))},v=e=>{e.preventDefault(),u(!1),_(e.dataTransfer.files)},y=f.filter(e=>e.status===`error`).length,b=f.filter(e=>e.status===`done`).length,x=f.length-b,S=!!r&&!p&&x>0;return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Q.jsxs)(`div`,{onDragOver:e=>{e.preventDefault(),u(!0)},onDragLeave:()=>u(!1),onDrop:v,onClick:()=>c.current?.click(),className:q(`flex cursor-pointer flex-col items-center justify-center gap-2 rounded-md border border-dashed px-4 py-8 text-center transition-colors`,l?`border-primary bg-primary/5`:`border-input hover:bg-muted/40`),children:[(0,Q.jsx)($e,{className:`h-6 w-6 text-muted-foreground touch-target`}),(0,Q.jsx)(`p`,{className:`text-sm`,children:e?`Take a photo or video`:`Drag & drop files here`}),(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e?`click to open the camera`:`or click to browse`}),(0,Q.jsx)(`input`,{ref:c,type:`file`,multiple:!0,accept:e?`image/*,video/*`:void 0,capture:e?`environment`:void 0,className:`hidden`,onChange:e=>{_(e.target.files),e.target.value=``}})]}),(0,Q.jsx)(ID,{items:f,running:p,onRemove:d.removeItem}),!i&&(0,Q.jsx)(WD,{fields:g,idPrefix:`file`,multiple:f.length>1}),(0,Q.jsx)(CR,{f:a,idPrefix:`file`}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[As(r),i?`. Existing files are never overwritten.`:``]}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:()=>p?d.cancel():t(),children:`Cancel`}),(0,Q.jsx)(X,{size:`sm`,onClick:async()=>{if(!(!S||!r))try{let e=i?null:await g.geotag.capture(),n=await d.start(r,(t,n)=>HD(t,n,{tags:g.tags,comment:g.comment,geo:e})),c=await a.write(n.docIds);if(n.failed===0){let e=n.resumed?` (${n.resumed} already uploaded)`:``,r=c?`; some relations failed`:``;o(`${n.done} file(s) uploaded${e}${r}`),t()}else s(`${n.failed} of ${n.total} file(s) failed — retry keeps what already made it`)}catch(e){s(e instanceof Error?e.message:`Failed to upload files`)}},disabled:!S,children:p?`Uploading…`:y>0?(0,Q.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,Q.jsx)(ar,{className:`h-3.5 w-3.5`}),`Retry failed (`,y,`)`]}):`Add files`})]})]})}function AR(){let{closeAdd:e}=Rs(),t=Es(),{showSuccessToast:n,showErrorToast:r}=Gr(),[i,a]=(0,Z.useState)(``),[o,s]=(0,Z.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 js(t),o=i===`/`?``:i;if(a===`backends`){let e=await Os(r,i);await ca(r,e.driver,e.address,[[e.key,c].filter(Boolean).join(`/`)]),gs(t)}else await Ga(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,Q.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`add-folder-name`,children:`Folder name`}),(0,Q.jsx)(J,{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,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Nested paths are created as needed. Target: `,As(t)]})]}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:e,disabled:o,children:`Cancel`}),(0,Q.jsx)(X,{size:`sm`,onClick:u,disabled:!l,children:o?`Creating…`:`Create folder`})]})]})}function jR(){let{openAddPicker:e,closeAdd:t}=Rs(),n=Es(),{showSuccessToast:r,showErrorToast:i}=Gr(),[a,o]=(0,Z.useState)(!1);return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`fixed inset-0 z-picker-scrim bg-scrim animate-fade-in md:hidden`,onClick:()=>e(),"aria-hidden":!0}),(0,Q.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,Q.jsx)(pg,{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 Cs(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 MR(){let{state:e,closeAdd:t}=Rs(),{editDocument:n,editWorkspaceId:r}=e,{showSuccessToast:i,showErrorToast:a}=Gr();return!n||!r?null:(0,Q.jsx)(NR,{doc:n,workspaceId:r,onCancel:t,onSaved:t,showSuccessToast:i,showErrorToast:a},`${r}:${n.id}`)}function NR({doc:e,workspaceId:t,onCancel:n,onSaved:r,showSuccessToast:i,showErrorToast:a}){let o=Mo(e,t),s=RD(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,Q.jsxs)(`div`,{className:`flex h-full flex-col gap-4 p-4`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`edit-note-title`,children:`Title`}),(0,Q.jsx)(J,{id:`edit-note-title`,value:o.title,onChange:e=>o.setTitle(e.target.value),placeholder:`Optional; defaults to today's date`})]}),(0,Q.jsxs)(`div`,{className:`flex flex-1 flex-col gap-1.5`,children:[(0,Q.jsx)($,{children:`Body`}),(0,Q.jsx)(`div`,{className:`flex-1`,children:(0,Q.jsx)(Vo,{kind:`markdown`,value:o.content,onChange:o.setContent,placeholder:`Write your note…`})})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:o.tags,onChange:o.setTags,suggestions:s})]}),(0,Q.jsx)(Wo,{...o,onRetry:o.save}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 justify-end gap-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:n,disabled:o.saving,children:`Close`}),(0,Q.jsx)(X,{size:`sm`,onClick:c,disabled:!o.canSave,children:o.saving?`Saving…`:`Done`})]})]})}function PR(e,t){let n=qo(e.metadata?.features),[r,i]=(0,Z.useState)(String(e.data?.label??``)),[a,o]=(0,Z.useState)(n.length?n:e.data?.tags??[]),[s,c]=(0,Z.useState)(!1),l=!s;async function u(){c(!0);try{let n=a.map(e=>e.trim()).filter(Boolean);await _o(t,{id:e.id,schema:e.schema,schemaVersion:e.schemaVersion,data:{...e.data,...r.trim()?{label:r.trim()}:{},tags:n},metadata:{features:Jo(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 FR(){let{state:e,closeAdd:t}=Rs(),{editDocument:n,editWorkspaceId:r}=e,{showSuccessToast:i,showErrorToast:a}=Gr();return!n||!r?null:(0,Q.jsx)(IR,{doc:n,workspaceId:r,onCancel:t,onSaved:t,showSuccessToast:i,showErrorToast:a})}function IR({doc:e,workspaceId:t,onCancel:n,onSaved:r,showSuccessToast:i,showErrorToast:a}){let o=PR(e,t),s=RD(t);return(0,Q.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsxs)($,{children:[`URL `,(0,Q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`(frozen)`})]}),(0,Q.jsx)(J,{value:o.url,disabled:!0,className:`font-mono text-xs`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{htmlFor:`edit-link-label`,children:`Label`}),(0,Q.jsx)(J,{id:`edit-link-label`,value:o.label,onChange:e=>o.setLabel(e.target.value),placeholder:`Optional display name`,autoFocus:!0})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)($,{children:`Tags`}),(0,Q.jsx)(Kh,{tags:o.tags,onChange:o.setTags,suggestions:s})]}),(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Q.jsx)(X,{variant:`outline`,size:`sm`,onClick:n,disabled:o.saving,children:`Cancel`}),(0,Q.jsx)(X,{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 LR=380,RR=300,zR=560,BR={message:{label:`New Message`,icon:b},note:{label:`New Note`,icon:qn},link:{label:`New Link`,icon:vn},todo:{label:`New Todo`,icon:Ht},identity:{label:`New Identity`,icon:Ge},sketch:{label:`New Sketch`,icon:ue},plaintext:{label:`New Plaintext File`,icon:rn},file:{label:`Add Files`,icon:$e},photo:{label:`Photo/Video`,icon:qe},existing:{label:`Add Existing`,icon:Dn},folder:{label:`New Folder`,icon:ct}};function VR(){let{state:e,openAdd:t,openAddPicker:n,closeAdd:r}=Rs();Np(r,e.addOpen);let{addOpen:i,addKind:a,editDocument:o,addModal:s}=e,c=Es(),l=Ns(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=hl();(0,Z.useEffect)(()=>{!i||a!==`sketch`||l.isBackend||(r(),g(pD.createUrl(c)))},[i,a,c,r,g,l.isBackend]);let _=e_(),[v,y]=(0,Z.useState)(LR),b=(0,Z.useRef)(null),x=(0,Z.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(zR,Math.max(RR,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`?qn:vn):a&&!p?(w=BR[a].label,T=BR[a].icon):(w=`Add`,T=cn);let E=(0,Q.jsxs)(Q.Fragment,{children:[_&&!s&&(0,Q.jsx)(`div`,{className:`fixed inset-0 z-panel-scrim bg-scrim animate-fade-in`,onClick:r,"aria-hidden":!0}),(0,Q.jsxs)(`div`,{style:_||s?void 0:{width:v},className:q(`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,Q.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,Q.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,Q.jsx)(`button`,{type:`button`,className:`canvas-nav-button`,"aria-label":`Back one level`,onClick:()=>C||S?r():n(),children:(0,Q.jsx)(Yn,{className:`h-5 w-5`})}),(0,Q.jsxs)(`span`,{className:`flex flex-1 items-center gap-2 text-sm font-medium`,children:[S?(0,Q.jsx)(ve,{className:`h-4 w-4`}):(0,Q.jsx)(T,{className:`h-4 w-4`}),w]}),(0,Q.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,Q.jsx)(W,{className:`h-4 w-4`})})]}),(0,Q.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[S&&o.schema===`data/schema/note`&&(0,Q.jsx)(MR,{}),S&&o.schema===`data/schema/link`&&(0,Q.jsx)(FR,{}),!S&&C&&e.addRelateTo&&(0,Q.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,Q.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,Q.jsx)(gD,{onSelect:t,omit:m}),!S&&a===`message`&&!f&&d&&(0,Q.jsx)(Cv,{workspaceId:d,onClose:r},d),!S&&!l.isBackend&&a===`note`&&(0,Q.jsx)(wR,{},h),!S&&!l.isBackend&&a===`link`&&(0,Q.jsx)(TR,{}),!S&&!l.isBackend&&a===`todo`&&(0,Q.jsx)(DR,{}),!S&&!l.isBackend&&a===`identity`&&(0,Q.jsx)(OR,{}),!S&&l.destination&&a===`plaintext`&&(0,Q.jsx)(yR,{},h),!S&&(!l.isBackend||l.destination)&&a===`file`&&(0,Q.jsx)(kR,{},h),!S&&(!l.isBackend||l.destination)&&a===`photo`&&(0,Q.jsx)(kR,{capture:!0},h),!S&&!l.isBackend&&a===`existing`&&(0,Q.jsx)(jR,{}),!S&&(!l.isBackend||l.destination)&&a===`folder`&&(0,Q.jsx)(AR,{},h)]})]})]});return s?(0,Q.jsx)(Fp,{label:w,onClose:r,children:E}):E}var HR=(0,Z.createContext)(null);function UR(){return(0,Z.useContext)(HR)}function WR(){let e=UR(),t=e?.notifications??[];return(0,Q.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Q.jsx)(`div`,{className:`flex items-center justify-between px-4 h-12 bg-foreground shrink-0`,children:(0,Q.jsx)(`span`,{className:`text-sm font-medium text-background`,children:`Home`})}),(0,Q.jsx)(`div`,{className:`px-4 py-4 border-b border-border shrink-0`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,children:[(0,Q.jsx)(N,{className:`w-4 h-4`}),(0,Q.jsx)(`span`,{className:`text-xs font-mono`,children:new Date().toLocaleTimeString()})]})}),(0,Q.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-4`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(xn,{className:`w-3.5 h-3.5 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground uppercase tracking-wide`,children:`Notifications`})]}),t.length>0&&(0,Q.jsx)(X,{size:`sm`,variant:`ghost`,className:`h-6 px-1.5 text-xs text-muted-foreground`,onClick:()=>void e?.clear(),title:`Clear notifications`,children:(0,Q.jsx)(rt,{className:`w-3 h-3`})})]}),t.length===0?(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground text-center py-10 border border-dashed rounded-(--card-radius)`,children:`No notifications`}):(0,Q.jsx)(`div`,{className:`space-y-2`,children:[...t].reverse().map(e=>(0,Q.jsxs)(`div`,{className:`rounded-(--card-radius) border p-2.5`,children:[(0,Q.jsx)(`p`,{className:`text-xs whitespace-pre-wrap break-words`,children:e.text}),(0,Q.jsx)(`p`,{className:`mt-1 text-[10px] text-muted-foreground`,children:new Date(e.timestamp).toLocaleString()})]},e.id))})]})]})}function GR({status:e}){return(0,Q.jsx)(`span`,{className:q(`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 KR(){let{openAgentT2:e}=Rs(),{setSection:t}=jT(),n=hl(),{agents:r,isLoading:i,refresh:a}=IL(!0),{showToast:o}=Hr(),[s,c]=(0,Z.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 _k(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 vk(t.id),a()}catch(e){o({title:`Error`,description:e instanceof Error?e.message:`Failed`,variant:`destructive`})}finally{l(t.id,!1)}};return(0,Q.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Q.jsx)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:(0,Q.jsx)(`span`,{className:`text-sm font-semibold`,children:`Agents`})}),(0,Q.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:i&&r.length===0?(0,Q.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading…`}):r.length===0?(0,Q.jsxs)(`div`,{className:`flex flex-col items-center gap-3 py-12 text-muted-foreground`,children:[(0,Q.jsx)(lt,{className:`w-8 h-8 opacity-30`}),(0,Q.jsx)(`span`,{className:`text-xs`,children:`No agents yet`}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>{t(`agents`),n(`/agents?create=1`)},className:`text-xs text-primary hover:underline`,children:`Create an agent`})]}):(0,Q.jsx)(`div`,{className:`space-y-1 px-2`,children:r.map(t=>{let n=s.has(t.id);return(0,Q.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,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(GR,{status:t.status}),(0,Q.jsx)(`span`,{className:`text-sm font-medium flex-1 truncate`,children:t.label||t.name}),(0,Q.jsx)(`div`,{className:`flex items-center gap-0.5 shrink-0 reveal-on-hover`,children:t.status===`active`?(0,Q.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,Q.jsx)(Bn,{className:`w-3 h-3`})}):(0,Q.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,Q.jsx)(Se,{className:`w-3 h-3`})})})]}),t.description&&(0,Q.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5 pl-4`,children:t.description})]},t.id)})})})]})}function qR(){let e=UR(),[t,n]=(0,Z.useState)(50),r=e?.notifications??[],i=r.slice(-t).reverse();return(0,Q.jsxs)(`section`,{"aria-label":`Notification history`,className:`flex h-full min-h-0 flex-col`,children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-3 border-b px-4 py-3`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`h2`,{className:`text-sm font-semibold`,children:[`Notifications`,r.length>0&&(0,Q.jsx)(`span`,{className:`ml-2 font-normal text-muted-foreground`,children:r.length})]}),(0,Q.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:`Saved on this browser`})]}),r.length>0&&(0,Q.jsxs)(X,{variant:`ghost`,size:`sm`,onClick:()=>void e?.clear(),title:`Clear all notifications`,className:`shrink-0 gap-1.5`,children:[(0,Q.jsx)(rt,{className:`h-3.5 w-3.5`}),`Clear all`]})]}),e?.storageError&&(0,Q.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,Q.jsx)(`p`,{role:`status`,className:`p-4 text-sm text-muted-foreground`,children:`Loading notifications…`}):r.length===0?(0,Q.jsxs)(`div`,{className:`flex flex-1 flex-col items-center justify-center gap-3 p-8 text-center`,children:[(0,Q.jsx)(`div`,{className:`flex h-12 w-12 items-center justify-center rounded-full bg-muted`,children:(0,Q.jsx)(xn,{className:`h-5 w-5 text-muted-foreground`})}),(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No notifications yet`})]}):(0,Q.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-3`,children:[(0,Q.jsx)(`ol`,{className:`space-y-2`,children:i.map(t=>{let n=t.status===`error`?R:t.status===`completed`?xe:t.status===`started`?N:xn;return(0,Q.jsx)(`li`,{"data-notification-id":t.id,className:`rounded-(--card-radius) border bg-card p-3`,children:(0,Q.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Q.jsx)(n,{"aria-hidden":!0,className:`mt-0.5 h-4 w-4 shrink-0 ${t.status===`error`?`text-destructive`:`text-muted-foreground`}`}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`p`,{className:`break-words text-sm font-medium`,children:t.title}),t.text&&(0,Q.jsx)(`p`,{className:`mt-1 whitespace-pre-wrap break-words text-xs text-muted-foreground`,children:t.text}),(0,Q.jsxs)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:[(0,Q.jsx)(`time`,{dateTime:t.timestamp,children:new Date(t.timestamp).toLocaleString()}),t.status===`started`&&(0,Q.jsx)(`span`,{children:` · Started`}),t.status===`completed`&&(0,Q.jsx)(`span`,{children:` · Completed`}),t.status===`error`&&(0,Q.jsx)(`span`,{children:` · Error`})]})]}),(0,Q.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,Q.jsx)(W,{className:`h-3.5 w-3.5`})})]})},t.id)})}),r.length>t&&(0,Q.jsx)(X,{variant:`ghost`,size:`sm`,className:`mt-3 w-full`,onClick:()=>n(e=>e+50),children:`Show older notifications`})]})]})}function JR(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(`
54
- `)||``}function YR(e){let[t,n]=(0,Z.useState)([]),[r,i]=(0,Z.useState)(!1),[a,o]=(0,Z.useState)(null),s=(0,Z.useRef)(null),[c,l]=(0,Z.useState)(e);return c!==e&&(l(e),e||n([])),(0,Z.useEffect)(()=>{let t=!1;if(e)return ak(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,Z.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 _k(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 Y.stream(`${Rr}/agents/${e}/prompt/stream`,{message:t},{signal:s.current.signal,onChunk:e=>{a+=e;let t=a.split(`
55
- `);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=JR(t),i=KO(t)||l;u=qO(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,Z.useCallback)(async t=>{if(!(r||!e)){o(null),i(!0),n(e=>[...e,{role:`user`,content:`🎤 Transcribing…`,isComplete:!1}]);try{let r=await wk(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,Z.useCallback)(()=>{s.current?.abort(),i(!1)},[]),clear:(0,Z.useCallback)(()=>{n([]),o(null)},[])}}function XR(){let[e,t]=(0,Z.useState)(!1),[n,r]=(0,Z.useState)(null),i=(0,Z.useRef)(null),a=(0,Z.useRef)([]);return{isRecording:e,recorderError:n,start:(0,Z.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,Z.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,Z.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 ZR({agentId:e,onClose:t}){let[n,r]=(0,Z.useState)(null),[i,a]=(0,Z.useState)(``),[o,s]=(0,Z.useState)(!1),[c,l]=(0,Z.useState)(null),[u,d]=(0,Z.useState)(!1),[f,p]=(0,Z.useState)(null),{showToast:m}=Hr(),h=$o(),g=h?.state.activeContextType===`context`?h.state.activeContextId:null,_=h?.state.activeContextPath??null,v=(0,Z.useRef)(null),y=(0,Z.useRef)(null),{messages:b,isStreaming:x,error:S,send:C,sendVoice:w,stop:T,clear:E}=YR(e),{isRecording:D,recorderError:O,start:k,stop:A}=XR();(0,Z.useEffect)(()=>{ik(e).then(r).catch(()=>{}),QO(e).then(l).catch(()=>l(null))},[e]),(0,Z.useEffect)(()=>{Ck().then(e=>s(!!(e.enabled&&e.stt))).catch(()=>s(!1))},[]),(0,Z.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 $O(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,Q.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 px-3 h-12 border-b border-border shrink-0`,children:[(0,Q.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,Q.jsx)(Yn,{className:`w-4 h-4`})}),n?.color&&(0,Q.jsx)(`span`,{className:`w-2.5 h-2.5 rounded-full shrink-0`,style:{backgroundColor:n.color}}),(0,Q.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Q.jsx)(`div`,{className:`text-sm font-medium truncate`,children:n?.label||n?.name||e}),(0,Q.jsx)(`div`,{className:`text-[10px] leading-tight text-muted-foreground truncate`,title:M,children:M})]}),(0,Q.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,Q.jsx)(rt,{className:`w-3.5 h-3.5`})})]}),g&&!j&&(0,Q.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,Q.jsxs)(`span`,{className:`flex-1 truncate text-muted-foreground`,title:g||_||void 0,children:[`Toolbox context: `,g||_]}),(0,Q.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,Q.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,Q.jsx)(`span`,{className:`shrink-0 text-muted-foreground`,children:`Token (shown once):`}),(0,Q.jsx)(`code`,{className:`flex-1 truncate font-mono`,children:f}),(0,Q.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,Q.jsx)(`button`,{type:`button`,onClick:()=>p(null),className:`shrink-0 rounded px-1.5 py-1 hover:bg-accent`,title:`Dismiss`,children:`×`})]}),(0,Q.jsxs)(`div`,{className:`flex-1 overflow-y-auto px-4 py-3 space-y-3`,children:[b.length===0&&(0,Q.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,Q.jsxs)(`div`,{className:q(`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,Q.jsx)(wN,{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,Q.jsx)(g_,{content:e.content||(e.isComplete?``:`…`)}):(0,Q.jsx)(`span`,{className:`whitespace-pre-wrap`,children:e.content})]},t)),(S||O)&&(0,Q.jsx)(`div`,{className:`text-xs text-destructive text-center py-1`,children:S||O}),(0,Q.jsx)(`div`,{ref:v})]}),(0,Q.jsx)(`div`,{className:`p-3 border-t border-border shrink-0`,children:(0,Q.jsxs)(`div`,{className:`flex gap-2 items-end`,children:[(0,Q.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,Q.jsx)(`button`,{type:`button`,onClick:async()=>{if(D){let e=await A();e&&await w(e)}else x||await k()},disabled:x&&!D,className:q(`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,Q.jsx)(Bn,{className:`w-4 h-4`}):(0,Q.jsx)(ot,{className:`w-4 h-4`})}),x?(0,Q.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,Q.jsx)(Bn,{className:`w-4 h-4`})}):(0,Q.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,Q.jsx)(yt,{className:`w-4 h-4`})})]})})]})}function QR(){let{state:e,openApplet:t}=Rs(),[n,r]=(0,Z.useState)(`context`),i=e.appsAppletId,a=i?ww.find(e=>e.id===i):null;if(a)return(0,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 border-b border-border px-2 py-1.5`,children:[(0,Q.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,Q.jsx)(Yn,{className:`h-4 w-4`})}),(0,Q.jsx)(a.icon,{className:`h-4 w-4 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:a.label})]}),(0,Q.jsx)(`div`,{className:`min-h-0 flex-1`,children:(0,Q.jsx)(a.Component,{})})]});let o=Tw(n);return(0,Q.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Q.jsx)(`div`,{className:`flex shrink-0 border-b border-border`,children:[`context`,`global`].map(e=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>r(e),className:q(`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,Q.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-3`,children:[!o.length&&(0,Q.jsxs)(`p`,{className:`py-10 text-center text-sm text-muted-foreground`,children:[`No `,n,` applets yet.`]}),(0,Q.jsx)(`div`,{className:`grid grid-cols-2 gap-2`,children:o.map(e=>(0,Q.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,Q.jsx)(e.icon,{className:`h-5 w-5 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`text-xs font-medium leading-none`,children:e.label})]},e.id))})]})]})}var $R=[{view:`apps`,icon:er,label:`Apps`},{view:`tools`,icon:Wn,label:`Filters`},{view:`agents`,icon:lt,label:`Agents`},{view:`notifications`,icon:xn,label:`Notifications`}],ez=340,tz=`toolbox:width`,nz=360,rz=48,iz=e=>{let t=typeof window<`u`?window.innerWidth:1600,n=Math.max(ez,Math.min(Math.round(t*.7),t-rz-nz));return Math.max(ez,Math.min(e,n))},az=()=>typeof window<`u`?Math.round(window.innerWidth/2):720;function oz(){let{state:e,setView:t,closeT1:n,closeT2:r}=Rs();Np(n,e.t1Open&&!e.t2Open),Np(r,e.t2Open);let{t1Open:i,t1View:a,t2Open:o,t2AgentId:s,activeAccentColor:c}=e,l=e_(),[u,d]=(0,Z.useState)(()=>{let e=typeof window<`u`?Number(localStorage.getItem(tz)):NaN;return Number.isFinite(e)&&e>0?e:420}),f=(0,Z.useCallback)(e=>{d(e);try{localStorage.setItem(tz,String(e))}catch{}},[]),p=(0,Z.useRef)(null),m=(0,Z.useCallback)(e=>{e.preventDefault(),p.current={startX:e.clientX,startWidth:u};let t=e=>{if(!p.current)return;let t=iz(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(tz,String(e))}catch{}return e})};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},[u]),h=u>=az()*.9;return(0,Z.useEffect)(()=>{let e=()=>d(e=>iz(e));return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),!i||!a?null:(0,Q.jsxs)(Q.Fragment,{children:[l&&(0,Q.jsx)(`div`,{className:`fixed inset-0 z-panel-scrim bg-scrim animate-fade-in`,onClick:n,"aria-hidden":!0}),(0,Q.jsxs)(`div`,{style:l?void 0:{width:u},className:q(`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,Q.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,Q.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,Q.jsx)(`div`,{className:`flex items-center gap-1`,children:$R.map(({view:e,icon:n,label:r})=>(0,Q.jsx)(`button`,{type:`button`,onClick:()=>t(e),"aria-label":r,title:r,className:q(`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,Q.jsx)(n,{className:`h-4 w-4 shrink-0`})},e))}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[!l&&(0,Q.jsx)(`button`,{type:`button`,onClick:()=>f(h?420:iz(az())),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,Q.jsx)(ut,{className:`h-4 w-4`}):(0,Q.jsx)(Sn,{className:`h-4 w-4`})}),(0,Q.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,Q.jsx)(W,{className:`h-4 w-4`})})]})]}),(0,Q.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 flex-col`,children:[(0,Q.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col ${o&&s?`invisible`:``}`,children:[a===`home`&&(0,Q.jsx)(WR,{}),a===`apps`&&(0,Q.jsx)(QR,{}),a===`tools`&&(0,Q.jsx)(bw,{}),a===`agents`&&(0,Q.jsx)(KR,{}),a===`notifications`&&(0,Q.jsx)(qR,{})]}),o&&s&&(0,Q.jsx)(`div`,{className:`absolute inset-0 z-10 flex flex-col bg-background`,children:(0,Q.jsx)(ZR,{agentId:s,onClose:r})})]})]})]})}function sz(){let{running:e,hasViewer:t,paused:n,snapshot:r,source:i,lastCount:a,error:o,setPaused:s,stop:c,reopen:l}=PS();if(!e||t)return null;let u=i===`screen`?In:i===`photo`?ln:qe;return(0,Q.jsxs)(`div`,{className:q(`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,Q.jsxs)(`button`,{type:`button`,onClick:l,title:`Back to Lens`,className:`relative block w-full cursor-pointer bg-black/80 aspect-video`,children:[(0,Q.jsx)(JS,{className:`h-full w-full`}),r&&(0,Q.jsx)(`img`,{src:r,alt:``,className:`absolute inset-0 h-full w-full bg-black object-contain`}),n&&(0,Q.jsx)(`span`,{className:`absolute inset-0 flex items-center justify-center bg-black/50 text-xs font-medium text-white`,children:`paused`})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1.5`,children:[(0,Q.jsx)(u,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-[11px] text-muted-foreground`,children:o?(0,Q.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,Q.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,Q.jsx)(Se,{className:`h-3.5 w-3.5`}):(0,Q.jsx)(D,{className:`h-3.5 w-3.5`})}),(0,Q.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,Q.jsx)(Sn,{className:`h-3.5 w-3.5`})}),(0,Q.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,Q.jsx)(sn,{className:`h-3.5 w-3.5`})})]})]})}var cz=[`view`,`location`,`metadata`,`json`,`synapses`,`backends`];function lz(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:cz.includes(i)?i:`view`,maximized:t.get(`fullscreen`)===`1`}}function uz(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 dz({children:e}){let t=fl(),n=hl(),r=(0,Z.useMemo)(()=>lz(t.hash),[t.hash]),i=r?.workspaceId,a=r?.documentId,o=i&&a?JSON.stringify([i,a]):null,[s,c]=(0,Z.useState)(0),[l,u]=(0,Z.useState)(null),d=l?.key===o&&l?.revision===s?l:null;(0,Z.useEffect)(()=>{if(!o||!i||!a||d)return;let e=!1;return Ja(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,Z.useCallback)((e,r)=>{u({key:JSON.stringify([r,e.id]),revision:s,document:e}),n({pathname:t.pathname,search:t.search,hash:uz({workspaceId:r,documentId:e.id,section:`view`,maximized:!1})},{state:t.state})},[n,t.pathname,t.search,t.state,s]),p=(0,Z.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,Z.useCallback)((e,i)=>{r&&(u({key:JSON.stringify([i,e.id]),revision:s,document:e}),n({pathname:t.pathname,search:t.search,hash:uz({...r,workspaceId:i,documentId:e.id})},{replace:!0,state:t.state}))},[r,s,n,t.pathname,t.search,t.state]),h=(0,Z.useCallback)(e=>{r&&n({pathname:t.pathname,search:t.search,hash:uz({...r,...e})},{replace:!0,state:t.state})},[r,n,t.pathname,t.search,t.state]),g=(0,Z.useCallback)(()=>c(e=>e+1),[]),_=(0,Z.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,Q.jsx)(mg.Provider,{value:_,children:e})}var fz={key:`desk`,label:`Desk`,main:`/`,mainExpanded:!1,entries:[]},pz=0,mz=()=>`c${++pz}`;function hz(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 gz({children:e}){let t=fl(),n=hl(),[r,i]=(0,Z.useState)([fz]),[a,o]=(0,Z.useState)(0),[s,c]=(0,Z.useState)(fy),l=(0,Z.useRef)(r),u=(0,Z.useRef)(a),d=(0,Z.useRef)(s);(0,Z.useEffect)(()=>{l.current=r,u.current=a,d.current=s},[r,a,s]);let f=(0,Z.useCallback)((e,t)=>{let n=l.current.slice();n[e]=t,l.current=n,i(n)},[]),p=(0,Z.useCallback)(e=>{let t=u.current,n=l.current[t];n&&f(t,e(n))},[f]),m=t.pathname+t.search;(0,Z.useEffect)(()=>{p(e=>e.main===m?e:{...e,main:m})},[m,p]);let h=(0,Z.useCallback)(e=>{let t=l.current[u.current];if(!t)return;let n=t.entries.find(t=>hz(e,t));if(n){c(n.id);return}let r={...e,id:mz()},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,Z.useCallback)((e,t)=>{h({kind:`document`,document:e,workspaceId:t})},[h]),_=(0,Z.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,Z.useCallback)(e=>{p(t=>({...t,entries:t.entries.filter(t=>t.id!==e)})),c(t=>t===e?fy:t)},[p]),y=(0,Z.useCallback)((e,t)=>{p(n=>({...n,entries:n.entries.map(n=>n.id===e&&n.kind===`route`?{...n,location:t}:n)}))},[p]),b=(0,Z.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,Z.useCallback)(e=>{let t=l.current[e];t&&(u.current=e,o(e),c(fy),n(t.main))},[n]),S=(0,Z.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]),C=(0,Z.useCallback)(e=>{x(u.current+e)},[x]),w=(0,Z.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]),T=(0,Z.useMemo)(()=>({rows:r,activeRow:a,focus:s,setFocus:c,openCanvas:h,openDocument:g,closeCanvas:v,navigateCanvas:y,toggleExpanded:b,activateRow:S,moveRow:C,closeRow:w}),[r,a,s,h,g,v,y,b,S,C,w]),E=(0,Z.useMemo)(()=>({entry:null,open:g,preview:_,close:()=>{}}),[g,_]);return(0,Q.jsx)(py.Provider,{value:T,children:(0,Q.jsx)(mg.Provider,{value:E,children:e})})}function _z(e){return nc(typeof e==`string`?rc(e):e)}function vz({location:e,onNavigate:t}){let n=(0,Z.useMemo)(()=>{let t=rc(e);return{pathname:t.pathname||`/`,search:t.search||``,hash:t.hash||``,state:null,key:e}},[e]),r=(0,Z.useMemo)(()=>({basename:`/`,static:!1,useTransitions:void 0,future:{},navigator:{createHref:_z,go:()=>{},push:e=>t(_z(e)),replace:e=>t(_z(e))}}),[t]);return(0,Q.jsx)(tl.Provider,{value:r,children:(0,Q.jsx)(nl.Provider,{value:{location:n,navigationType:qs.Push},children:(0,Q.jsx)(rl.Provider,{value:{outlet:null,matches:[],isDataRoute:!1},children:(0,Q.jsx)(Gl,{children:_I})})})})}var yz=`input, textarea, select, [contenteditable=""], [contenteditable="true"]`,bz=420,xz=e=>e<=0?0:e>=1?1:e<.5?2**(20*e-10)/2:(2-2**(-20*e+10))/2;function Sz(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)/bz);e.scrollLeft=r+i*xz(l),l<1?s=requestAnimationFrame(c):(e.style.scrollSnapType=a,n?.())};return s=requestAnimationFrame(c),()=>{cancelAnimationFrame(s),e.style.scrollSnapType=a}}function Cz(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 wz({section:e}){return e===`contexts`?(0,Q.jsx)(KI,{}):e===`workspaces`?(0,Q.jsx)(uL,{}):e===`agents`?(0,Q.jsx)(RL,{}):e===`admin`||e===`settings`?(0,Q.jsx)(WL,{}):null}function Tz(e,t,n){if(e?.kind===`document`)return Ni(e.document).title;let r=(e?.kind===`route`?e.location:t).split(/[?#]/)[0];if(r===`/settings`)return`Settings`;let i=oT.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 Ez({id:e,title:t,expanded:n,focused:r,onFocus:i,onToggleExpanded:a,onClose:o,badge:s,contentHeader:c,children:l}){let u=iR();return(0,Q.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:q(`strip-canvas surface-sheet relative`,n&&`strip-canvas--wide`,r&&`strip-canvas--focused`),onPointerDownCapture:()=>i(e),"aria-label":t,children:[c&&!n&&(0,Q.jsx)(sR,{edge:`right`}),!c&&(0,Q.jsxs)(`header`,{className:`strip-canvas-bar`,children:[s&&(0,Q.jsx)(`span`,{className:`strip-row-label`,children:s}),(0,Q.jsx)(`span`,{className:`strip-canvas-title`,title:t,children:t}),(0,Q.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,Q.jsx)(ut,{className:`size-3.5`}):(0,Q.jsx)(Sn,{className:`size-3.5`})}),o&&(0,Q.jsx)(`button`,{type:`button`,className:`strip-canvas-btn`,title:s?`Close row`:`Close canvas`,onClick:()=>o(e),children:(0,Q.jsx)(W,{className:`size-3.5`})})]}),(0,Q.jsx)(`div`,{className:`strip-canvas-body`,children:l})]})}function Dz(e){return q(`relative flex-1 min-h-0 min-w-0 overflow-auto`,!dR(e)&&!uR(e)&&`p-page`)}function Oz({row:e,pathname:t,rowLabel:n,onCloseRow:r,workspaces:i}){let{focus:a,setFocus:o,toggleExpanded:s,closeCanvas:c,navigateCanvas:l}=my(),u=(0,Z.useCallback)(e=>t=>l(e,t),[l]);return(0,Q.jsxs)(Q.Fragment,{children:[t===`/`?(0,Q.jsx)(`div`,{hidden:!0,children:(0,Q.jsx)(Hl,{})}):(0,Q.jsx)(Ez,{id:fy,title:Tz(null,t,i),expanded:e.mainExpanded,focused:a===fy,onFocus:o,onToggleExpanded:s,badge:n,onClose:r,children:(0,Q.jsx)(`main`,{id:`content-area`,className:Dz(t),children:(0,Q.jsx)(Hl,{})})}),e.entries.map(e=>(0,Q.jsx)(Ez,{id:e.id,title:Tz(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,Q.jsx)(`div`,{className:Dz(e.location.split(`?`)[0]),children:(0,Q.jsx)(vz,{location:e.location,onNavigate:u(e.id)})}):(0,Q.jsx)(`div`,{className:`flex flex-1 min-h-0 min-w-0 items-stretch`,children:(0,Q.jsx)(lR,{entry:e,onClose:()=>c(e.id),frame:{expanded:!!e.expanded,onToggleExpanded:()=>s(e.id)}})})},e.id))]})}function kz({row:e,workspaces:t}){return(0,Q.jsxs)(`div`,{className:`strip-ghost-row`,"aria-hidden":!0,children:[(0,Q.jsx)(`span`,{className:`strip-ghost-chip strip-ghost-chip--main`,children:Tz(null,e.main,t)}),e.entries.map(n=>(0,Q.jsx)(`span`,{className:`strip-ghost-chip`,children:Tz(n,e.main,t)},n.id))]})}function Az(){let{state:e,closeM1:t,closeM2:n}=jT(),{rows:r,activeRow:i,focus:a,setFocus:o,moveRow:s,closeRow:c}=my(),{pathname:l}=fl(),{workspaces:u}=cL(l.startsWith(`/workspaces/`)||r.some(e=>e.main.startsWith(`/workspaces/`)||e.entries.some(e=>e.kind===`route`&&e.location.startsWith(`/workspaces/`)))),d=DT(),f=(0,Z.useRef)(null);Np(t,e.m1Open&&!e.m2Open),Np(n,e.m2Open),(0,Z.useLayoutEffect)(()=>{let e=f.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 p=(0,Z.useRef)(e.m1Open);(0,Z.useEffect)(()=>{e.m1Open&&!p.current&&!e.m2Open&&o(`m1`),p.current=e.m1Open},[e.m1Open,e.m2Open,o]);let m=(0,Z.useRef)(e.m2Open);(0,Z.useEffect)(()=>{e.m2Open&&!m.current&&o(`m2`),!e.m2Open&&m.current&&a===`m2`&&o(e.m1Open?`m1`:fy),m.current=e.m2Open},[e.m2Open,e.m1Open,a,o]),(0,Z.useEffect)(()=>{!e.m1Open&&a===`m1`&&o(fy)},[e.m1Open,a,o]),(0,Z.useEffect)(()=>{let e=f.current,t=e?.querySelector(`[data-strip-col="${CSS.escape(a)}"]`);if(!(!e||!t))return Sz(e,Cz(e,t))},[a,r,i,e.m1Open,e.m2Open]);let h=(0,Z.useCallback)(()=>{let t=r[i];return[...e.m1Open?[`m1`]:[],...e.m2Open?[`m2`]:[],...l===`/`?[]:[fy],...t?t.entries.map(e=>e.id):[]]},[r,i,e.m1Open,e.m2Open,l]);return(0,Z.useEffect)(()=>{let e=e=>{if(e.defaultPrevented||e.isComposing||!e.key.startsWith(`Arrow`)||!OT(e,d))return;let t=e.target;if(!(t?.closest(yz)||t?.closest(`[role="dialog"]`))){if(e.key===`ArrowLeft`||e.key===`ArrowRight`){let t=h(),n=t[Math.max(0,t.indexOf(a))+(e.key===`ArrowRight`?1:-1)];if(!n)return;e.preventDefault(),o(n)}else(e.key===`ArrowUp`||e.key===`ArrowDown`)&&r.length>1&&(e.preventDefault(),s(e.key===`ArrowDown`?1:-1))}};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[h,a,o,s,r.length,d]),(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`strip-shell flex h-viewport w-full overflow-hidden surface-desk gap-shell p-shell`,children:[(0,Q.jsx)(HI,{}),(0,Q.jsxs)(`div`,{ref:f,className:`strip-scroller`,children:[e.m1Open&&(0,Q.jsx)(`div`,{"data-strip-col":`m1`,className:q(`strip-col strip-menu-col`,a===`m1`&&`strip-col--focused`),onPointerDownCapture:()=>o(`m1`),children:(0,Q.jsx)(wz,{section:e.activeSection})}),e.m2Open&&(0,Q.jsx)(`div`,{"data-strip-col":`m2`,className:q(`strip-col strip-menu-col`,a===`m2`&&`strip-col--focused`),onPointerDownCapture:()=>o(`m2`),children:(0,Q.jsx)(JL,{})}),(0,Q.jsx)(`div`,{className:`strip-rows`,style:{transform:`translateY(${-i*100}%)`},children:r.map((e,t)=>(0,Q.jsx)(`div`,{className:q(`strip-row`,t===i&&`strip-row--active`),children:(0,Q.jsx)(`div`,{className:`strip-row-canvases`,children:t===i?(0,Q.jsx)(Oz,{row:e,workspaces:u,pathname:l,rowLabel:r.length>1?e.label:void 0,onCloseRow:t>0?()=>c(e.key):void 0}):(0,Q.jsx)(kz,{row:e,workspaces:u})})},e.key))})]}),(0,Q.jsx)(VR,{}),(0,Q.jsx)(oz,{})]}),(0,Q.jsx)(hR,{}),(0,Q.jsx)(VI,{}),(0,Q.jsx)(sz,{})]})}function jz(){let e=vT();return(0,Q.jsx)(TI,{children:(0,Q.jsx)(vR,{children:(0,Q.jsx)(bC,{children:(0,Q.jsx)(YS,{children:(0,Q.jsx)(dz,{children:e===`strip`?(0,Q.jsx)(gz,{children:(0,Q.jsx)(Dw,{children:(0,Q.jsx)(Az,{})})}):(0,Q.jsxs)(Dw,{children:[(0,Q.jsxs)(`div`,{className:`flex h-viewport w-full overflow-hidden surface-desk gap-shell p-shell`,children:[(0,Q.jsx)(HI,{}),(0,Q.jsx)(YL,{}),(0,Q.jsx)(mR,{}),(0,Q.jsx)(VR,{}),(0,Q.jsx)(oz,{})]}),(0,Q.jsx)(hR,{}),(0,Q.jsx)(VI,{}),(0,Q.jsx)(sz,{})]})})})})})})}var Mz=kn,Nz=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(Gt,{ref:n,className:q(`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}));Nz.displayName=Gt.displayName;var Pz=vr(`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`}}),Fz=Z.forwardRef(({className:e,variant:t,...n},r)=>(0,Q.jsx)(gn,{ref:r,className:q(Pz({variant:t}),e),...n}));Fz.displayName=gn.displayName;var Iz=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(Jn,{ref:n,className:q(`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}));Iz.displayName=Jn.displayName;var Lz=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(Mt,{ref:n,className:q(`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,Q.jsx)(W,{className:`h-4 w-4`})}));Lz.displayName=Mt.displayName;var Rz=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(Xt,{ref:n,className:q(`text-sm font-semibold`,e),...t}));Rz.displayName=Xt.displayName;var zz=Z.forwardRef(({className:e,...t},n)=>(0,Q.jsx)(Bt,{ref:n,className:q(`text-sm opacity-90`,e),...t}));zz.displayName=Bt.displayName;var Bz=`canvas-notifications`,Vz=`notifications`,Hz=`canvas:notification-history`,Uz,Wz;function Gz(){try{let e=localStorage.getItem(`authToken`);if(e){let t=br(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 Kz(){return Uz||=new Promise((e,t)=>{let n=indexedDB.open(Bz,1);n.onupgradeneeded=()=>{n.result.createObjectStore(Vz,{keyPath:[`account`,`id`]}).createIndex(`account`,`account`)},n.onsuccess=()=>{let t=n.result;t.onversionchange=()=>{t.close(),Uz=void 0},e(t)},n.onerror=()=>t(n.error)}).catch(e=>{throw Uz=void 0,e}),Uz}function qz(){return!Wz&&typeof BroadcastChannel<`u`&&(Wz=new BroadcastChannel(Hz),Wz.onmessage=e=>window.dispatchEvent(new CustomEvent(Hz,{detail:e.data}))),Wz}function Jz(e,t=!1){let n={account:e,error:t};window.dispatchEvent(new CustomEvent(Hz,{detail:n})),t||qz()?.postMessage(n)}function Yz(e,t){qz();let n=n=>{let r=n.detail;r?.account===e&&t(!!r.error)};return window.addEventListener(Hz,n),()=>window.removeEventListener(Hz,n)}async function Xz(e){let t=await Kz();return new Promise((n,r)=>{let i=t.transaction(Vz,`readonly`),a=i.objectStore(Vz).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 Zz(e,t){try{let n=await Kz();await new Promise((e,r)=>{let i=n.transaction(Vz,`readwrite`);i.oncomplete=()=>e(),i.onabort=()=>r(i.error),i.onerror=()=>r(i.error),t(i.objectStore(Vz))}),Jz(e)}catch(t){throw Jz(e,!0),t}}function Qz(e,t){return Zz(e,n=>{let r=n.get([e,t.id]);r.onsuccess=()=>{r.result||n.put({...t,account:e})}})}function $z(e,t,n){return Zz(e,r=>{let i=r.get([e,t]);i.onsuccess=()=>{i.result&&r.put({...i.result,...n})}})}function eB(e,t){return Zz(e,n=>{n.delete([e,t])})}function tB(e){return Zz(e,t=>{let n=t.index(`account`).openKeyCursor(e);n.onsuccess=()=>{n.result&&(t.delete(n.result.primaryKey),n.result.continue())}})}function nB({children:e}){let[t,n]=(0,Z.useState)([]),r=(0,Z.useRef)(new Set),i=(0,Z.useCallback)((e,t=!0)=>{if(Tr(e.description)||Tr(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;Qz(Gz(),{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,Z.useCallback)(e=>{let t=crypto.randomUUID(),r=Gz();Qz(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)),$z(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,Z.useMemo)(()=>({showToast:i,showProgress:a}),[i,a]);return(0,Q.jsx)(Kr.Provider,{value:o,children:(0,Q.jsxs)(Mz,{children:[e,t.map(e=>(0,Q.jsxs)(Fz,{variant:e.variant,duration:e.busy?1/0:void 0,children:[(0,Q.jsxs)(`div`,{className:`grid gap-1`,children:[(0,Q.jsxs)(Rz,{className:`flex items-center gap-2`,children:[e.busy&&(0,Q.jsx)(Xn,{className:`h-3.5 w-3.5 shrink-0 animate-spin`}),e.title]}),e.description!=null&&(0,Q.jsx)(zz,{children:e.description})]}),!e.busy&&(0,Q.jsx)(Lz,{})]},e.id)),(0,Q.jsx)(Nz,{})]})})}function rB({children:e}){let[t]=(0,Z.useState)(Gz),[n,r]=(0,Z.useState)([]),[i,a]=(0,Z.useState)(!0),[o,s]=(0,Z.useState)(!1),{showToast:c}=Hr();(0,Z.useEffect)(()=>{let e=!0,n=0,i=async()=>{let i=++n;try{let o=await Xz(t);e&&i===n&&(r(o),a(!1))}catch{e&&(s(!0),a(!1))}},o=Yz(t,e=>{s(e),e||i()});return i(),()=>{e=!1,o()}},[t]),(0,Z.useEffect)(()=>pd.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,Z.useCallback)(async()=>{try{await tB(t)}catch{}},[t]),u=(0,Z.useCallback)(async e=>{try{await eB(t,e)}catch{}},[t]);return(0,Q.jsx)(HR.Provider,{value:{notifications:n,loading:i,storageError:o,clear:l,remove:u},children:e})}var iB=e=>`${e.workspaceName}\0${e.treeName}\0${e.path}`;function aB({children:e}){let[t,n]=(0,Z.useState)(null),[r,i]=(0,Z.useState)(!0);(0,Z.useEffect)(()=>{let e=!1;return hL().then(t=>{e||n(t)}).catch(()=>{e||n({})}).finally(()=>{e||i(!1)}),()=>{e=!0}},[]);let a=(0,Z.useMemo)(()=>t?.home?.pinnedCanvases??[],[t]),[o]=(0,Z.useState)(()=>sO(hL,gL,n)),s=(0,Z.useCallback)(e=>a.some(t=>iB(t)===iB(e)),[a]),c=(0,Z.useCallback)(async e=>{let t=crypto.randomUUID();await o(n=>n.some(t=>iB(t)===iB(e))?n:[...n,{id:t,...e}])},[o]),l=(0,Z.useCallback)(async e=>{await o(t=>t.filter(t=>t.id!==e))},[o]),u=(0,Z.useCallback)(async(e,t)=>{await o(n=>n.map(n=>n.id===e?{...n,minimized:t}:n))},[o]),d=(0,Z.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,Z.useMemo)(()=>({pins:a,isLoading:r,isPinned:s,pin:c,unpin:l,movePin:d,setMinimized:u}),[a,r,s,c,l,d,u]);return(0,Q.jsx)(IE.Provider,{value:f,children:e})}var oB=(0,Z.lazy)(()=>g(()=>import(`./NextShell-CX994BbA.js`),__vite__mapDeps([30,3,4,16,10,13,11,12,14,31])));function sB(){let{showToast:e}=Hr();return(0,Z.useEffect)(()=>{Dr((t,n)=>{e({title:`Error`,description:n?`${t.message} (${n})`:t.message,variant:`destructive`})})},[e]),(0,Z.useEffect)(()=>kI(),[]),(0,Q.jsxs)(ju,{children:[(0,Q.jsx)(SI,{}),(0,Q.jsx)(Bw,{}),(0,Q.jsxs)(Gl,{children:[(0,Q.jsx)(Ul,{path:`/login`,element:(0,Q.jsx)(Md,{children:(0,Q.jsx)(Dd,{})})}),(0,Q.jsx)(Ul,{path:`/register`,element:(0,Q.jsx)(Md,{children:(0,Q.jsx)(Od,{})})}),(0,Q.jsx)(Ul,{path:`/auth/google/callback`,element:(0,Q.jsx)(Md,{children:(0,Q.jsx)(kd,{})})}),(0,Q.jsx)(Ul,{path:`/pub/c/:code`,element:(0,Q.jsx)(pS,{})}),(0,Q.jsx)(Ul,{path:`/apps/:appletId`,element:(0,Q.jsx)(jd,{children:(0,Q.jsx)(kw,{})})}),(0,Q.jsx)(Ul,{path:`/next/*`,element:(0,Q.jsx)(jd,{children:(0,Q.jsx)(Z.Suspense,{fallback:null,children:(0,Q.jsx)(oB,{})})})}),(0,Q.jsx)(Ul,{path:`/`,element:(0,Q.jsx)(jd,{children:(0,Q.jsx)(rB,{children:(0,Q.jsx)(aB,{children:(0,Q.jsx)(jz,{})})})}),children:_I}),(0,Q.jsx)(Ul,{path:`*`,element:(0,Q.jsx)(Vl,{to:`/`,replace:!0})})]})]})}function cB(){return(0,Q.jsx)(BA,{children:(0,Q.jsx)(nB,{children:(0,Q.jsx)(sB,{})})})}iA(),Xk(),(0,Us.createRoot)(document.getElementById(`root`)).render((0,Q.jsx)(Z.StrictMode,{children:(0,Q.jsx)(cB,{})}));