@grackle-ai/web 0.75.3 → 0.75.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/KnowledgePage-
|
|
2
|
-
import{r as h1,a as b,j as r,v as m1,b as p1,t as Ar,i as v1,f as g1,M as Rf,c as Mf}from"./markdown-gcy1Jmzi.js";import{r as y1,d as jg,H as Ng,P as wg,i as b1,B as x1,a as _1,C as S1,M as T1}from"./dagview-BA5TtMAQ.js";import{c as k1,a as C1,G as j1,e as N1,w as w1,t as E1,p as Dr,b as A1,C as Of,f as D1,M as R1,R as Oo,S as Eg}from"./grpc-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/KnowledgePage-CjoZR4_t.js","assets/markdown-gcy1Jmzi.js","assets/dagview-BA5TtMAQ.js","assets/grpc-C9KtwZNl.js","assets/KnowledgePage-DMqJ4jlP.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as h1,a as b,j as r,v as m1,b as p1,t as Ar,i as v1,f as g1,M as Rf,c as Mf}from"./markdown-gcy1Jmzi.js";import{r as y1,d as jg,H as Ng,P as wg,i as b1,B as x1,a as _1,C as S1,M as T1}from"./dagview-BA5TtMAQ.js";import{c as k1,a as C1,G as j1,e as N1,w as w1,t as E1,p as Dr,b as A1,C as Of,f as D1,M as R1,R as Oo,S as Eg}from"./grpc-C9KtwZNl.js";(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))l(c);new MutationObserver(c=>{for(const d of c)if(d.type==="childList")for(const f of d.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&l(f)}).observe(document,{childList:!0,subtree:!0});function i(c){const d={};return c.integrity&&(d.integrity=c.integrity),c.referrerPolicy&&(d.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?d.credentials="include":c.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function l(c){if(c.ep)return;c.ep=!0;const d=i(c);fetch(c.href,d)}})();var Rd={exports:{}},Bo={},Md={exports:{}},Od={};/**
|
|
3
3
|
* @license React
|
|
4
4
|
* scheduler.production.js
|
|
5
5
|
*
|
|
@@ -34,7 +34,7 @@ Error generating stack: `+o.message+`
|
|
|
34
34
|
* @license MIT
|
|
35
35
|
*/var Bg="popstate";function Lg(n){return typeof n=="object"&&n!=null&&"pathname"in n&&"search"in n&&"hash"in n&&"state"in n&&"key"in n}function F1(n={}){function a(l,c){var v;let d=(v=c.state)==null?void 0:v.masked,{pathname:f,search:m,hash:p}=d||l.location;return lf("",{pathname:f,search:m,hash:p},c.state&&c.state.usr||null,c.state&&c.state.key||"default",d?{pathname:l.location.pathname,search:l.location.search,hash:l.location.hash}:void 0)}function i(l,c){return typeof c=="string"?c:Jo(c)}return X1(a,i,null,n)}function ot(n,a){if(n===!1||n===null||typeof n>"u")throw new Error(a)}function wn(n,a){if(!n){typeof console<"u"&&console.warn(a);try{throw new Error(a)}catch{}}}function Z1(){return Math.random().toString(36).substring(2,10)}function Ig(n,a){return{usr:n.state,key:n.key,idx:a,masked:n.unstable_mask?{pathname:n.pathname,search:n.search,hash:n.hash}:void 0}}function lf(n,a,i=null,l,c){return{pathname:typeof n=="string"?n:n.pathname,search:"",hash:"",...typeof a=="string"?Li(a):a,state:i,key:a&&a.key||l||Z1(),unstable_mask:c}}function Jo({pathname:n="/",search:a="",hash:i=""}){return a&&a!=="?"&&(n+=a.charAt(0)==="?"?a:"?"+a),i&&i!=="#"&&(n+=i.charAt(0)==="#"?i:"#"+i),n}function Li(n){let a={};if(n){let i=n.indexOf("#");i>=0&&(a.hash=n.substring(i),n=n.substring(0,i));let l=n.indexOf("?");l>=0&&(a.search=n.substring(l),n=n.substring(0,l)),n&&(a.pathname=n)}return a}function X1(n,a,i,l={}){let{window:c=document.defaultView,v5Compat:d=!1}=l,f=c.history,m="POP",p=null,v=g();v==null&&(v=0,f.replaceState({...f.state,idx:v},""));function g(){return(f.state||{idx:null}).idx}function y(){m="POP";let N=g(),C=N==null?null:N-v;v=N,p&&p({action:m,location:j.location,delta:C})}function x(N,C){m="PUSH";let A=Lg(N)?N:lf(j.location,N,C);v=g()+1;let E=Ig(A,v),R=j.createHref(A.unstable_mask||A);try{f.pushState(E,"",R)}catch(w){if(w instanceof DOMException&&w.name==="DataCloneError")throw w;c.location.assign(R)}d&&p&&p({action:m,location:j.location,delta:1})}function S(N,C){m="REPLACE";let A=Lg(N)?N:lf(j.location,N,C);v=g();let E=Ig(A,v),R=j.createHref(A.unstable_mask||A);f.replaceState(E,"",R),d&&p&&p({action:m,location:j.location,delta:0})}function T(N){return Q1(N)}let j={get action(){return m},get location(){return n(c,f)},listen(N){if(p)throw new Error("A history only accepts one active listener");return c.addEventListener(Bg,y),p=N,()=>{c.removeEventListener(Bg,y),p=null}},createHref(N){return a(c,N)},createURL:T,encodeLocation(N){let C=T(N);return{pathname:C.pathname,search:C.search,hash:C.hash}},push:x,replace:S,go(N){return f.go(N)}};return j}function Q1(n,a=!1){let i="http://localhost";typeof window<"u"&&(i=window.location.origin!=="null"?window.location.origin:window.location.href),ot(i,"No window.location.(origin|href) available to create URL");let l=typeof n=="string"?n:Jo(n);return l=l.replace(/ $/,"%20"),!a&&l.startsWith("//")&&(l=i+l),new URL(l,i)}function A0(n,a,i="/"){return W1(n,a,i,!1)}function W1(n,a,i,l){let c=typeof a=="string"?Li(a):a,d=ga(c.pathname||"/",i);if(d==null)return null;let f=D0(n);J1(f);let m=null;for(let p=0;m==null&&p<f.length;++p){let v=M0(d);m=rT(f[p],v,l)}return m}function D0(n,a=[],i=[],l="",c=!1){let d=(f,m,p=c,v)=>{let g={relativePath:v===void 0?f.path||"":v,caseSensitive:f.caseSensitive===!0,childrenIndex:m,route:f};if(g.relativePath.startsWith("/")){if(!g.relativePath.startsWith(l)&&p)return;ot(g.relativePath.startsWith(l),`Absolute route path "${g.relativePath}" nested under path "${l}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),g.relativePath=g.relativePath.slice(l.length)}let y=Pn([l,g.relativePath]),x=i.concat(g);f.children&&f.children.length>0&&(ot(f.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${y}".`),D0(f.children,a,x,y,p)),!(f.path==null&&!f.index)&&a.push({path:y,score:oT(y,f.index),routesMeta:x})};return n.forEach((f,m)=>{var p;if(f.path===""||!((p=f.path)!=null&&p.includes("?")))d(f,m);else for(let v of R0(f.path))d(f,m,!0,v)}),a}function R0(n){let a=n.split("/");if(a.length===0)return[];let[i,...l]=a,c=i.endsWith("?"),d=i.replace(/\?$/,"");if(l.length===0)return c?[d,""]:[d];let f=R0(l.join("/")),m=[];return m.push(...f.map(p=>p===""?d:[d,p].join("/"))),c&&m.push(...f),m.map(p=>n.startsWith("/")&&p===""?"/":p)}function J1(n){n.sort((a,i)=>a.score!==i.score?i.score-a.score:lT(a.routesMeta.map(l=>l.childrenIndex),i.routesMeta.map(l=>l.childrenIndex)))}var eT=/^:[\w-]+$/,tT=3,nT=2,aT=1,sT=10,iT=-2,zg=n=>n==="*";function oT(n,a){let i=n.split("/"),l=i.length;return i.some(zg)&&(l+=iT),a&&(l+=nT),i.filter(c=>!zg(c)).reduce((c,d)=>c+(eT.test(d)?tT:d===""?aT:sT),l)}function lT(n,a){return n.length===a.length&&n.slice(0,-1).every((l,c)=>l===a[c])?n[n.length-1]-a[a.length-1]:0}function rT(n,a,i=!1){let{routesMeta:l}=n,c={},d="/",f=[];for(let m=0;m<l.length;++m){let p=l[m],v=m===l.length-1,g=d==="/"?a:a.slice(d.length)||"/",y=el({path:p.relativePath,caseSensitive:p.caseSensitive,end:v},g),x=p.route;if(!y&&v&&i&&!l[l.length-1].route.index&&(y=el({path:p.relativePath,caseSensitive:p.caseSensitive,end:!1},g)),!y)return null;Object.assign(c,y.params),f.push({params:c,pathname:Pn([d,y.pathname]),pathnameBase:hT(Pn([d,y.pathnameBase])),route:x}),y.pathnameBase!=="/"&&(d=Pn([d,y.pathnameBase]))}return f}function el(n,a){typeof n=="string"&&(n={path:n,caseSensitive:!1,end:!0});let[i,l]=cT(n.path,n.caseSensitive,n.end),c=a.match(i);if(!c)return null;let d=c[0],f=d.replace(/(.)\/+$/,"$1"),m=c.slice(1);return{params:l.reduce((v,{paramName:g,isOptional:y},x)=>{if(g==="*"){let T=m[x]||"";f=d.slice(0,d.length-T.length).replace(/(.)\/+$/,"$1")}const S=m[x];return y&&!S?v[g]=void 0:v[g]=(S||"").replace(/%2F/g,"/"),v},{}),pathname:d,pathnameBase:f,pattern:n}}function cT(n,a=!1,i=!0){wn(n==="*"||!n.endsWith("*")||n.endsWith("/*"),`Route path "${n}" will be treated as if it were "${n.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${n.replace(/\*$/,"/*")}".`);let l=[],c="^"+n.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(f,m,p,v,g)=>{if(l.push({paramName:m,isOptional:p!=null}),p){let y=g.charAt(v+f.length);return y&&y!=="/"?"/([^\\/]*)":"(?:/([^\\/]*))?"}return"/([^\\/]+)"}).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return n.endsWith("*")?(l.push({paramName:"*"}),c+=n==="*"||n==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):i?c+="\\/*$":n!==""&&n!=="/"&&(c+="(?:(?=\\/|$))"),[new RegExp(c,a?void 0:"i"),l]}function M0(n){try{return n.split("/").map(a=>decodeURIComponent(a).replace(/\//g,"%2F")).join("/")}catch(a){return wn(!1,`The URL path "${n}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${a}).`),n}}function ga(n,a){if(a==="/")return n;if(!n.toLowerCase().startsWith(a.toLowerCase()))return null;let i=a.endsWith("/")?a.length-1:a.length,l=n.charAt(i);return l&&l!=="/"?null:n.slice(i)||"/"}var uT=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function dT(n,a="/"){let{pathname:i,search:l="",hash:c=""}=typeof n=="string"?Li(n):n,d;return i?(i=i.replace(/\/\/+/g,"/"),i.startsWith("/")?d=Ug(i.substring(1),"/"):d=Ug(i,a)):d=a,{pathname:d,search:mT(l),hash:pT(c)}}function Ug(n,a){let i=a.replace(/\/+$/,"").split("/");return n.split("/").forEach(c=>{c===".."?i.length>1&&i.pop():c!=="."&&i.push(c)}),i.length>1?i.join("/"):"/"}function Bd(n,a,i,l){return`Cannot include a '${n}' character in a manually specified \`to.${a}\` field [${JSON.stringify(l)}]. Please separate it out to the \`to.${i}\` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.`}function fT(n){return n.filter((a,i)=>i===0||a.route.path&&a.route.path.length>0)}function Bf(n){let a=fT(n);return a.map((i,l)=>l===a.length-1?i.pathname:i.pathnameBase)}function lc(n,a,i,l=!1){let c;typeof n=="string"?c=Li(n):(c={...n},ot(!c.pathname||!c.pathname.includes("?"),Bd("?","pathname","search",c)),ot(!c.pathname||!c.pathname.includes("#"),Bd("#","pathname","hash",c)),ot(!c.search||!c.search.includes("#"),Bd("#","search","hash",c)));let d=n===""||c.pathname==="",f=d?"/":c.pathname,m;if(f==null)m=i;else{let y=a.length-1;if(!l&&f.startsWith("..")){let x=f.split("/");for(;x[0]==="..";)x.shift(),y-=1;c.pathname=x.join("/")}m=y>=0?a[y]:"/"}let p=dT(c,m),v=f&&f!=="/"&&f.endsWith("/"),g=(d||f===".")&&i.endsWith("/");return!p.pathname.endsWith("/")&&(v||g)&&(p.pathname+="/"),p}var Pn=n=>n.join("/").replace(/\/\/+/g,"/"),hT=n=>n.replace(/\/+$/,"").replace(/^\/*/,"/"),mT=n=>!n||n==="?"?"":n.startsWith("?")?n:"?"+n,pT=n=>!n||n==="#"?"":n.startsWith("#")?n:"#"+n,vT=class{constructor(n,a,i,l=!1){this.status=n,this.statusText=a||"",this.internal=l,i instanceof Error?(this.data=i.toString(),this.error=i):this.data=i}};function gT(n){return n!=null&&typeof n.status=="number"&&typeof n.statusText=="string"&&typeof n.internal=="boolean"&&"data"in n}function yT(n){return n.map(a=>a.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}var O0=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function B0(n,a){let i=n;if(typeof i!="string"||!uT.test(i))return{absoluteURL:void 0,isExternal:!1,to:i};let l=i,c=!1;if(O0)try{let d=new URL(window.location.href),f=i.startsWith("//")?new URL(d.protocol+i):new URL(i),m=ga(f.pathname,a);f.origin===d.origin&&m!=null?i=m+f.search+f.hash:c=!0}catch{wn(!1,`<Link to="${i}"> contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:l,isExternal:c,to:i}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var L0=["POST","PUT","PATCH","DELETE"];new Set(L0);var bT=["GET",...L0];new Set(bT);var Ii=b.createContext(null);Ii.displayName="DataRouter";var rc=b.createContext(null);rc.displayName="DataRouterState";var xT=b.createContext(!1),I0=b.createContext({isTransitioning:!1});I0.displayName="ViewTransition";var _T=b.createContext(new Map);_T.displayName="Fetchers";var ST=b.createContext(null);ST.displayName="Await";var dn=b.createContext(null);dn.displayName="Navigation";var ll=b.createContext(null);ll.displayName="Location";var En=b.createContext({outlet:null,matches:[],isDataRoute:!1});En.displayName="Route";var Lf=b.createContext(null);Lf.displayName="RouteError";var z0="REACT_ROUTER_ERROR",TT="REDIRECT",kT="ROUTE_ERROR_RESPONSE";function CT(n){if(n.startsWith(`${z0}:${TT}:{`))try{let a=JSON.parse(n.slice(28));if(typeof a=="object"&&a&&typeof a.status=="number"&&typeof a.statusText=="string"&&typeof a.location=="string"&&typeof a.reloadDocument=="boolean"&&typeof a.replace=="boolean")return a}catch{}}function jT(n){if(n.startsWith(`${z0}:${kT}:{`))try{let a=JSON.parse(n.slice(40));if(typeof a=="object"&&a&&typeof a.status=="number"&&typeof a.statusText=="string")return new vT(a.status,a.statusText,a.data)}catch{}}function NT(n,{relative:a}={}){ot(Ns(),"useHref() may be used only in the context of a <Router> component.");let{basename:i,navigator:l}=b.useContext(dn),{hash:c,pathname:d,search:f}=rl(n,{relative:a}),m=d;return i!=="/"&&(m=d==="/"?i:Pn([i,d])),l.createHref({pathname:m,search:f,hash:c})}function Ns(){return b.useContext(ll)!=null}function wt(){return ot(Ns(),"useLocation() may be used only in the context of a <Router> component."),b.useContext(ll).location}function St(n){ot(Ns(),"useMatch() may be used only in the context of a <Router> component.");let{pathname:a}=wt();return b.useMemo(()=>el(n,M0(a)),[a,n])}var U0="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function V0(n){b.useContext(dn).static||b.useLayoutEffect(n)}function cc(){let{isDataRoute:n}=b.useContext(En);return n?GT():wT()}function wT(){ot(Ns(),"useNavigate() may be used only in the context of a <Router> component.");let n=b.useContext(Ii),{basename:a,navigator:i}=b.useContext(dn),{matches:l}=b.useContext(En),{pathname:c}=wt(),d=JSON.stringify(Bf(l)),f=b.useRef(!1);return V0(()=>{f.current=!0}),b.useCallback((p,v={})=>{if(wn(f.current,U0),!f.current)return;if(typeof p=="number"){i.go(p);return}let g=lc(p,JSON.parse(d),c,v.relative==="path");n==null&&a!=="/"&&(g.pathname=g.pathname==="/"?a:Pn([a,g.pathname])),(v.replace?i.replace:i.push)(g,v.state,v)},[a,i,d,c,n])}var ET=b.createContext(null);function AT(n){let a=b.useContext(En).outlet;return b.useMemo(()=>a&&b.createElement(ET.Provider,{value:n},a),[a,n])}function Qa(){let{matches:n}=b.useContext(En),a=n[n.length-1];return a?a.params:{}}function rl(n,{relative:a}={}){let{matches:i}=b.useContext(En),{pathname:l}=wt(),c=JSON.stringify(Bf(i));return b.useMemo(()=>lc(n,JSON.parse(c),l,a==="path"),[n,c,l,a])}function DT(n,a){return H0(n,a)}function H0(n,a,i){var N;ot(Ns(),"useRoutes() may be used only in the context of a <Router> component.");let{navigator:l}=b.useContext(dn),{matches:c}=b.useContext(En),d=c[c.length-1],f=d?d.params:{},m=d?d.pathname:"/",p=d?d.pathnameBase:"/",v=d&&d.route;{let C=v&&v.path||"";P0(m,!v||C.endsWith("*")||C.endsWith("*?"),`You rendered descendant <Routes> (or called \`useRoutes()\`) at "${m}" (under <Route path="${C}">) 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.
|
|
36
36
|
|
|
37
|
-
Please change the parent <Route path="${C}"> to <Route path="${C==="/"?"*":`${C}/*`}">.`)}let g=wt(),y;if(a){let C=typeof a=="string"?Li(a):a;ot(p==="/"||((N=C.pathname)==null?void 0:N.startsWith(p)),`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 "${p}" but pathname "${C.pathname}" was given in the \`location\` prop.`),y=C}else y=g;let x=y.pathname||"/",S=x;if(p!=="/"){let C=p.replace(/^\//,"").split("/");S="/"+x.replace(/^\//,"").split("/").slice(C.length).join("/")}let T=A0(n,{pathname:S});wn(v||T!=null,`No routes matched location "${y.pathname}${y.search}${y.hash}" `),wn(T==null||T[T.length-1].route.element!==void 0||T[T.length-1].route.Component!==void 0||T[T.length-1].route.lazy!==void 0,`Matched leaf route at location "${y.pathname}${y.search}${y.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 j=LT(T&&T.map(C=>Object.assign({},C,{params:Object.assign({},f,C.params),pathname:Pn([p,l.encodeLocation?l.encodeLocation(C.pathname.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:C.pathname]),pathnameBase:C.pathnameBase==="/"?p:Pn([p,l.encodeLocation?l.encodeLocation(C.pathnameBase.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:C.pathnameBase])})),c,i);return a&&j?b.createElement(ll.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",unstable_mask:void 0,...y},navigationType:"POP"}},j):j}function RT(){let n=HT(),a=gT(n)?`${n.status} ${n.statusText}`:n instanceof Error?n.message:JSON.stringify(n),i=n instanceof Error?n.stack:null,l="rgba(200,200,200, 0.5)",c={padding:"0.5rem",backgroundColor:l},d={padding:"2px 4px",backgroundColor:l},f=null;return console.error("Error handled by React Router default ErrorBoundary:",n),f=b.createElement(b.Fragment,null,b.createElement("p",null,"💿 Hey developer 👋"),b.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",b.createElement("code",{style:d},"ErrorBoundary")," or"," ",b.createElement("code",{style:d},"errorElement")," prop on your route.")),b.createElement(b.Fragment,null,b.createElement("h2",null,"Unexpected Application Error!"),b.createElement("h3",{style:{fontStyle:"italic"}},a),i?b.createElement("pre",{style:c},i):null,f)}var MT=b.createElement(RT,null),G0=class extends b.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,a){return a.location!==n.location||a.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:a.error,location:a.location,revalidation:n.revalidation||a.revalidation}}componentDidCatch(n,a){this.props.onError?this.props.onError(n,a):console.error("React Router caught the following error during render",n)}render(){let n=this.state.error;if(this.context&&typeof n=="object"&&n&&"digest"in n&&typeof n.digest=="string"){const i=jT(n.digest);i&&(n=i)}let a=n!==void 0?b.createElement(En.Provider,{value:this.props.routeContext},b.createElement(Lf.Provider,{value:n,children:this.props.component})):this.props.children;return this.context?b.createElement(OT,{error:n},a):a}};G0.contextType=xT;var Ld=new WeakMap;function OT({children:n,error:a}){let{basename:i}=b.useContext(dn);if(typeof a=="object"&&a&&"digest"in a&&typeof a.digest=="string"){let l=CT(a.digest);if(l){let c=Ld.get(a);if(c)throw c;let d=B0(l.location,i);if(O0&&!Ld.get(a))if(d.isExternal||l.reloadDocument)window.location.href=d.absoluteURL||d.to;else{const f=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(d.to,{replace:l.replace}));throw Ld.set(a,f),f}return b.createElement("meta",{httpEquiv:"refresh",content:`0;url=${d.absoluteURL||d.to}`})}}return n}function BT({routeContext:n,match:a,children:i}){let l=b.useContext(Ii);return l&&l.static&&l.staticContext&&(a.route.errorElement||a.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=a.route.id),b.createElement(En.Provider,{value:n},i)}function LT(n,a=[],i){let l=i==null?void 0:i.state;if(n==null){if(!l)return null;if(l.errors)n=l.matches;else if(a.length===0&&!l.initialized&&l.matches.length>0)n=l.matches;else return null}let c=n,d=l==null?void 0:l.errors;if(d!=null){let g=c.findIndex(y=>y.route.id&&(d==null?void 0:d[y.route.id])!==void 0);ot(g>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(d).join(",")}`),c=c.slice(0,Math.min(c.length,g+1))}let f=!1,m=-1;if(i&&l){f=l.renderFallback;for(let g=0;g<c.length;g++){let y=c[g];if((y.route.HydrateFallback||y.route.hydrateFallbackElement)&&(m=g),y.route.id){let{loaderData:x,errors:S}=l,T=y.route.loader&&!x.hasOwnProperty(y.route.id)&&(!S||S[y.route.id]===void 0);if(y.route.lazy||T){i.isStatic&&(f=!0),m>=0?c=c.slice(0,m+1):c=[c[0]];break}}}}let p=i==null?void 0:i.onError,v=l&&p?(g,y)=>{var x,S;p(g,{location:l.location,params:((S=(x=l.matches)==null?void 0:x[0])==null?void 0:S.params)??{},unstable_pattern:yT(l.matches),errorInfo:y})}:void 0;return c.reduceRight((g,y,x)=>{let S,T=!1,j=null,N=null;l&&(S=d&&y.route.id?d[y.route.id]:void 0,j=y.route.errorElement||MT,f&&(m<0&&x===0?(P0("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),T=!0,N=null):m===x&&(T=!0,N=y.route.hydrateFallbackElement||null)));let C=a.concat(c.slice(0,x+1)),A=()=>{let E;return S?E=j:T?E=N:y.route.Component?E=b.createElement(y.route.Component,null):y.route.element?E=y.route.element:E=g,b.createElement(BT,{match:y,routeContext:{outlet:g,matches:C,isDataRoute:l!=null},children:E})};return l&&(y.route.ErrorBoundary||y.route.errorElement||x===0)?b.createElement(G0,{location:l.location,revalidation:l.revalidation,component:j,error:S,children:A(),routeContext:{outlet:null,matches:C,isDataRoute:!0},onError:v}):A()},null)}function If(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function IT(n){let a=b.useContext(Ii);return ot(a,If(n)),a}function zT(n){let a=b.useContext(rc);return ot(a,If(n)),a}function UT(n){let a=b.useContext(En);return ot(a,If(n)),a}function zf(n){let a=UT(n),i=a.matches[a.matches.length-1];return ot(i.route.id,`${n} can only be used on routes that contain a unique "id"`),i.route.id}function VT(){return zf("useRouteId")}function HT(){var l;let n=b.useContext(Lf),a=zT("useRouteError"),i=zf("useRouteError");return n!==void 0?n:(l=a.errors)==null?void 0:l[i]}function GT(){let{router:n}=IT("useNavigate"),a=zf("useNavigate"),i=b.useRef(!1);return V0(()=>{i.current=!0}),b.useCallback(async(c,d={})=>{wn(i.current,U0),i.current&&(typeof c=="number"?await n.navigate(c):await n.navigate(c,{fromRouteId:a,...d}))},[n,a])}var Vg={};function P0(n,a,i){!a&&!Vg[n]&&(Vg[n]=!0,wn(!1,i))}b.memo(PT);function PT({routes:n,future:a,state:i,isStatic:l,onError:c}){return H0(n,void 0,{state:i,isStatic:l,onError:c})}function Gn({to:n,replace:a,state:i,relative:l}){ot(Ns(),"<Navigate> may be used only in the context of a <Router> component.");let{static:c}=b.useContext(dn);wn(!c,"<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:d}=b.useContext(En),{pathname:f}=wt(),m=cc(),p=lc(n,Bf(d),f,l==="path"),v=JSON.stringify(p);return b.useEffect(()=>{m(JSON.parse(v),{replace:a,state:i,relative:l})},[m,v,l,a,i]),null}function ws(n){return AT(n.context)}function ke(n){ot(!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 $T({basename:n="/",children:a=null,location:i,navigationType:l="POP",navigator:c,static:d=!1,unstable_useTransitions:f}){ot(!Ns(),"You cannot render a <Router> inside another <Router>. You should never have more than one in your app.");let m=n.replace(/^\/*/,"/"),p=b.useMemo(()=>({basename:m,navigator:c,static:d,unstable_useTransitions:f,future:{}}),[m,c,d,f]);typeof i=="string"&&(i=Li(i));let{pathname:v="/",search:g="",hash:y="",state:x=null,key:S="default",unstable_mask:T}=i,j=b.useMemo(()=>{let N=ga(v,m);return N==null?null:{location:{pathname:N,search:g,hash:y,state:x,key:S,unstable_mask:T},navigationType:l}},[m,v,g,y,x,S,l,T]);return wn(j!=null,`<Router basename="${m}"> is not able to match the URL "${v}${g}${y}" because it does not start with the basename, so the <Router> won't render anything.`),j==null?null:b.createElement(dn.Provider,{value:p},b.createElement(ll.Provider,{children:a,value:j}))}function qT({children:n,location:a}){return DT(rf(n),a)}function rf(n,a=[]){let i=[];return b.Children.forEach(n,(l,c)=>{if(!b.isValidElement(l))return;let d=[...a,c];if(l.type===b.Fragment){i.push.apply(i,rf(l.props.children,d));return}ot(l.type===ke,`[${typeof l.type=="string"?l.type:l.type.name}] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`),ot(!l.props.index||!l.props.children,"An index route cannot have child routes.");let f={id:l.props.id||d.join("-"),caseSensitive:l.props.caseSensitive,element:l.props.element,Component:l.props.Component,index:l.props.index,path:l.props.path,middleware:l.props.middleware,loader:l.props.loader,action:l.props.action,hydrateFallbackElement:l.props.hydrateFallbackElement,HydrateFallback:l.props.HydrateFallback,errorElement:l.props.errorElement,ErrorBoundary:l.props.ErrorBoundary,hasErrorBoundary:l.props.hasErrorBoundary===!0||l.props.ErrorBoundary!=null||l.props.errorElement!=null,shouldRevalidate:l.props.shouldRevalidate,handle:l.props.handle,lazy:l.props.lazy};l.props.children&&(f.children=rf(l.props.children,d)),i.push(f)}),i}var Pr="get",$r="application/x-www-form-urlencoded";function uc(n){return typeof HTMLElement<"u"&&n instanceof HTMLElement}function YT(n){return uc(n)&&n.tagName.toLowerCase()==="button"}function KT(n){return uc(n)&&n.tagName.toLowerCase()==="form"}function FT(n){return uc(n)&&n.tagName.toLowerCase()==="input"}function ZT(n){return!!(n.metaKey||n.altKey||n.ctrlKey||n.shiftKey)}function XT(n,a){return n.button===0&&(!a||a==="_self")&&!ZT(n)}function cf(n=""){return new URLSearchParams(typeof n=="string"||Array.isArray(n)||n instanceof URLSearchParams?n:Object.keys(n).reduce((a,i)=>{let l=n[i];return a.concat(Array.isArray(l)?l.map(c=>[i,c]):[[i,l]])},[]))}function QT(n,a){let i=cf(n);return a&&a.forEach((l,c)=>{i.has(c)||a.getAll(c).forEach(d=>{i.append(c,d)})}),i}var Mr=null;function WT(){if(Mr===null)try{new FormData(document.createElement("form"),0),Mr=!1}catch{Mr=!0}return Mr}var JT=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Id(n){return n!=null&&!JT.has(n)?(wn(!1,`"${n}" is not a valid \`encType\` for \`<Form>\`/\`<fetcher.Form>\` and will default to "${$r}"`),null):n}function ek(n,a){let i,l,c,d,f;if(KT(n)){let m=n.getAttribute("action");l=m?ga(m,a):null,i=n.getAttribute("method")||Pr,c=Id(n.getAttribute("enctype"))||$r,d=new FormData(n)}else if(YT(n)||FT(n)&&(n.type==="submit"||n.type==="image")){let m=n.form;if(m==null)throw new Error('Cannot submit a <button> or <input type="submit"> without a <form>');let p=n.getAttribute("formaction")||m.getAttribute("action");if(l=p?ga(p,a):null,i=n.getAttribute("formmethod")||m.getAttribute("method")||Pr,c=Id(n.getAttribute("formenctype"))||Id(m.getAttribute("enctype"))||$r,d=new FormData(m,n),!WT()){let{name:v,type:g,value:y}=n;if(g==="image"){let x=v?`${v}.`:"";d.append(`${x}x`,"0"),d.append(`${x}y`,"0")}else v&&d.append(v,y)}}else{if(uc(n))throw new Error('Cannot submit element that is not <form>, <button>, or <input type="submit|image">');i=Pr,l=null,c=$r,f=n}return d&&c==="text/plain"&&(f=d,d=void 0),{action:l,method:i.toLowerCase(),encType:c,formData:d,body:f}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");function Uf(n,a){if(n===!1||n===null||typeof n>"u")throw new Error(a)}function tk(n,a,i,l){let c=typeof n=="string"?new URL(n,typeof window>"u"?"server://singlefetch/":window.location.origin):n;return i?c.pathname.endsWith("/")?c.pathname=`${c.pathname}_.${l}`:c.pathname=`${c.pathname}.${l}`:c.pathname==="/"?c.pathname=`_root.${l}`:a&&ga(c.pathname,a)==="/"?c.pathname=`${a.replace(/\/$/,"")}/_root.${l}`:c.pathname=`${c.pathname.replace(/\/$/,"")}.${l}`,c}async function nk(n,a){if(n.id in a)return a[n.id];try{let i=await import(n.module);return a[n.id]=i,i}catch(i){return console.error(`Error loading route module \`${n.module}\`, reloading page...`),console.error(i),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}function ak(n){return n==null?!1:n.href==null?n.rel==="preload"&&typeof n.imageSrcSet=="string"&&typeof n.imageSizes=="string":typeof n.rel=="string"&&typeof n.href=="string"}async function sk(n,a,i){let l=await Promise.all(n.map(async c=>{let d=a.routes[c.route.id];if(d){let f=await nk(d,i);return f.links?f.links():[]}return[]}));return rk(l.flat(1).filter(ak).filter(c=>c.rel==="stylesheet"||c.rel==="preload").map(c=>c.rel==="stylesheet"?{...c,rel:"prefetch",as:"style"}:{...c,rel:"prefetch"}))}function Hg(n,a,i,l,c,d){let f=(p,v)=>i[v]?p.route.id!==i[v].route.id:!0,m=(p,v)=>{var g;return i[v].pathname!==p.pathname||((g=i[v].route.path)==null?void 0:g.endsWith("*"))&&i[v].params["*"]!==p.params["*"]};return d==="assets"?a.filter((p,v)=>f(p,v)||m(p,v)):d==="data"?a.filter((p,v)=>{var y;let g=l.routes[p.route.id];if(!g||!g.hasLoader)return!1;if(f(p,v)||m(p,v))return!0;if(p.route.shouldRevalidate){let x=p.route.shouldRevalidate({currentUrl:new URL(c.pathname+c.search+c.hash,window.origin),currentParams:((y=i[0])==null?void 0:y.params)||{},nextUrl:new URL(n,window.origin),nextParams:p.params,defaultShouldRevalidate:!0});if(typeof x=="boolean")return x}return!0}):[]}function ik(n,a,{includeHydrateFallback:i}={}){return ok(n.map(l=>{let c=a.routes[l.route.id];if(!c)return[];let d=[c.module];return c.clientActionModule&&(d=d.concat(c.clientActionModule)),c.clientLoaderModule&&(d=d.concat(c.clientLoaderModule)),i&&c.hydrateFallbackModule&&(d=d.concat(c.hydrateFallbackModule)),c.imports&&(d=d.concat(c.imports)),d}).flat(1))}function ok(n){return[...new Set(n)]}function lk(n){let a={},i=Object.keys(n).sort();for(let l of i)a[l]=n[l];return a}function rk(n,a){let i=new Set;return new Set(a),n.reduce((l,c)=>{let d=JSON.stringify(lk(c));return i.has(d)||(i.add(d),l.push({key:d,link:c})),l},[])}function $0(){let n=b.useContext(Ii);return Uf(n,"You must render this element inside a <DataRouterContext.Provider> element"),n}function ck(){let n=b.useContext(rc);return Uf(n,"You must render this element inside a <DataRouterStateContext.Provider> element"),n}var Vf=b.createContext(void 0);Vf.displayName="FrameworkContext";function q0(){let n=b.useContext(Vf);return Uf(n,"You must render this element inside a <HydratedRouter> element"),n}function uk(n,a){let i=b.useContext(Vf),[l,c]=b.useState(!1),[d,f]=b.useState(!1),{onFocus:m,onBlur:p,onMouseEnter:v,onMouseLeave:g,onTouchStart:y}=a,x=b.useRef(null);b.useEffect(()=>{if(n==="render"&&f(!0),n==="viewport"){let j=C=>{C.forEach(A=>{f(A.isIntersecting)})},N=new IntersectionObserver(j,{threshold:.5});return x.current&&N.observe(x.current),()=>{N.disconnect()}}},[n]),b.useEffect(()=>{if(l){let j=setTimeout(()=>{f(!0)},100);return()=>{clearTimeout(j)}}},[l]);let S=()=>{c(!0)},T=()=>{c(!1),f(!1)};return i?n!=="intent"?[d,x,{}]:[d,x,{onFocus:Lo(m,S),onBlur:Lo(p,T),onMouseEnter:Lo(v,S),onMouseLeave:Lo(g,T),onTouchStart:Lo(y,S)}]:[!1,x,{}]}function Lo(n,a){return i=>{n&&n(i),i.defaultPrevented||a(i)}}function dk({page:n,...a}){let{router:i}=$0(),l=b.useMemo(()=>A0(i.routes,n,i.basename),[i.routes,n,i.basename]);return l?b.createElement(hk,{page:n,matches:l,...a}):null}function fk(n){let{manifest:a,routeModules:i}=q0(),[l,c]=b.useState([]);return b.useEffect(()=>{let d=!1;return sk(n,a,i).then(f=>{d||c(f)}),()=>{d=!0}},[n,a,i]),l}function hk({page:n,matches:a,...i}){let l=wt(),{future:c,manifest:d,routeModules:f}=q0(),{basename:m}=$0(),{loaderData:p,matches:v}=ck(),g=b.useMemo(()=>Hg(n,a,v,d,l,"data"),[n,a,v,d,l]),y=b.useMemo(()=>Hg(n,a,v,d,l,"assets"),[n,a,v,d,l]),x=b.useMemo(()=>{if(n===l.pathname+l.search+l.hash)return[];let j=new Set,N=!1;if(a.forEach(A=>{var R;let E=d.routes[A.route.id];!E||!E.hasLoader||(!g.some(w=>w.route.id===A.route.id)&&A.route.id in p&&((R=f[A.route.id])!=null&&R.shouldRevalidate)||E.hasClientLoader?N=!0:j.add(A.route.id))}),j.size===0)return[];let C=tk(n,m,c.unstable_trailingSlashAwareDataRequests,"data");return N&&j.size>0&&C.searchParams.set("_routes",a.filter(A=>j.has(A.route.id)).map(A=>A.route.id).join(",")),[C.pathname+C.search]},[m,c.unstable_trailingSlashAwareDataRequests,p,l,d,g,a,n,f]),S=b.useMemo(()=>ik(y,d),[y,d]),T=fk(y);return b.createElement(b.Fragment,null,x.map(j=>b.createElement("link",{key:j,rel:"prefetch",as:"fetch",href:j,...i})),S.map(j=>b.createElement("link",{key:j,rel:"modulepreload",href:j,...i})),T.map(({key:j,link:N})=>b.createElement("link",{key:j,nonce:i.nonce,...N,crossOrigin:N.crossOrigin??i.crossOrigin})))}function mk(...n){return a=>{n.forEach(i=>{typeof i=="function"?i(a):i!=null&&(i.current=a)})}}var pk=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";try{pk&&(window.__reactRouterVersion="7.13.2")}catch{}function vk({basename:n,children:a,unstable_useTransitions:i,window:l}){let c=b.useRef();c.current==null&&(c.current=F1({window:l,v5Compat:!0}));let d=c.current,[f,m]=b.useState({action:d.action,location:d.location}),p=b.useCallback(v=>{i===!1?m(v):b.startTransition(()=>m(v))},[i]);return b.useLayoutEffect(()=>d.listen(p),[d,p]),b.createElement($T,{basename:n,children:a,location:f.location,navigationType:f.action,navigator:d,unstable_useTransitions:i})}var Y0=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Hf=b.forwardRef(function({onClick:a,discover:i="render",prefetch:l="none",relative:c,reloadDocument:d,replace:f,unstable_mask:m,state:p,target:v,to:g,preventScrollReset:y,viewTransition:x,unstable_defaultShouldRevalidate:S,...T},j){let{basename:N,navigator:C,unstable_useTransitions:A}=b.useContext(dn),E=typeof g=="string"&&Y0.test(g),R=B0(g,N);g=R.to;let w=NT(g,{relative:c}),H=wt(),I=null;if(m){let ne=lc(m,[],H.unstable_mask?H.unstable_mask.pathname:"/",!0);N!=="/"&&(ne.pathname=ne.pathname==="/"?N:Pn([N,ne.pathname])),I=C.createHref(ne)}let[U,q,ee]=uk(l,T),ae=xk(g,{replace:f,unstable_mask:m,state:p,target:v,preventScrollReset:y,relative:c,viewTransition:x,unstable_defaultShouldRevalidate:S,unstable_useTransitions:A});function ce(ne){a&&a(ne),ne.defaultPrevented||ae(ne)}let re=!(R.isExternal||d),K=b.createElement("a",{...T,...ee,href:(re?I:void 0)||R.absoluteURL||w,onClick:re?ce:a,ref:mk(j,q),target:v,"data-discover":!E&&i==="render"?"true":void 0});return U&&!E?b.createElement(b.Fragment,null,K,b.createElement(dk,{page:w})):K});Hf.displayName="Link";var gk=b.forwardRef(function({"aria-current":a="page",caseSensitive:i=!1,className:l="",end:c=!1,style:d,to:f,viewTransition:m,children:p,...v},g){let y=rl(f,{relative:v.relative}),x=wt(),S=b.useContext(rc),{navigator:T,basename:j}=b.useContext(dn),N=S!=null&&Ck(y)&&m===!0,C=T.encodeLocation?T.encodeLocation(y).pathname:y.pathname,A=x.pathname,E=S&&S.navigation&&S.navigation.location?S.navigation.location.pathname:null;i||(A=A.toLowerCase(),E=E?E.toLowerCase():null,C=C.toLowerCase()),E&&j&&(E=ga(E,j)||E);const R=C!=="/"&&C.endsWith("/")?C.length-1:C.length;let w=A===C||!c&&A.startsWith(C)&&A.charAt(R)==="/",H=E!=null&&(E===C||!c&&E.startsWith(C)&&E.charAt(C.length)==="/"),I={isActive:w,isPending:H,isTransitioning:N},U=w?a:void 0,q;typeof l=="function"?q=l(I):q=[l,w?"active":null,H?"pending":null,N?"transitioning":null].filter(Boolean).join(" ");let ee=typeof d=="function"?d(I):d;return b.createElement(Hf,{...v,"aria-current":U,className:q,ref:g,style:ee,to:f,viewTransition:m},typeof p=="function"?p(I):p)});gk.displayName="NavLink";var yk=b.forwardRef(({discover:n="render",fetcherKey:a,navigate:i,reloadDocument:l,replace:c,state:d,method:f=Pr,action:m,onSubmit:p,relative:v,preventScrollReset:g,viewTransition:y,unstable_defaultShouldRevalidate:x,...S},T)=>{let{unstable_useTransitions:j}=b.useContext(dn),N=Tk(),C=kk(m,{relative:v}),A=f.toLowerCase()==="get"?"get":"post",E=typeof m=="string"&&Y0.test(m),R=w=>{if(p&&p(w),w.defaultPrevented)return;w.preventDefault();let H=w.nativeEvent.submitter,I=(H==null?void 0:H.getAttribute("formmethod"))||f,U=()=>N(H||w.currentTarget,{fetcherKey:a,method:I,navigate:i,replace:c,state:d,relative:v,preventScrollReset:g,viewTransition:y,unstable_defaultShouldRevalidate:x});j&&i!==!1?b.startTransition(()=>U()):U()};return b.createElement("form",{ref:T,method:A,action:C,onSubmit:l?p:R,...S,"data-discover":!E&&n==="render"?"true":void 0})});yk.displayName="Form";function bk(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function K0(n){let a=b.useContext(Ii);return ot(a,bk(n)),a}function xk(n,{target:a,replace:i,unstable_mask:l,state:c,preventScrollReset:d,relative:f,viewTransition:m,unstable_defaultShouldRevalidate:p,unstable_useTransitions:v}={}){let g=cc(),y=wt(),x=rl(n,{relative:f});return b.useCallback(S=>{if(XT(S,a)){S.preventDefault();let T=i!==void 0?i:Jo(y)===Jo(x),j=()=>g(n,{replace:T,unstable_mask:l,state:c,preventScrollReset:d,relative:f,viewTransition:m,unstable_defaultShouldRevalidate:p});v?b.startTransition(()=>j()):j()}},[y,g,x,i,l,c,a,n,d,f,m,p,v])}function Gf(n){wn(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 a=b.useRef(cf(n)),i=b.useRef(!1),l=wt(),c=b.useMemo(()=>QT(l.search,i.current?null:a.current),[l.search]),d=cc(),f=b.useCallback((m,p)=>{const v=cf(typeof m=="function"?m(new URLSearchParams(c)):m);i.current=!0,d("?"+v,p)},[d,c]);return[c,f]}var _k=0,Sk=()=>`__${String(++_k)}__`;function Tk(){let{router:n}=K0("useSubmit"),{basename:a}=b.useContext(dn),i=VT(),l=n.fetch,c=n.navigate;return b.useCallback(async(d,f={})=>{let{action:m,method:p,encType:v,formData:g,body:y}=ek(d,a);if(f.navigate===!1){let x=f.fetcherKey||Sk();await l(x,i,f.action||m,{unstable_defaultShouldRevalidate:f.unstable_defaultShouldRevalidate,preventScrollReset:f.preventScrollReset,formData:g,body:y,formMethod:f.method||p,formEncType:f.encType||v,flushSync:f.flushSync})}else await c(f.action||m,{unstable_defaultShouldRevalidate:f.unstable_defaultShouldRevalidate,preventScrollReset:f.preventScrollReset,formData:g,body:y,formMethod:f.method||p,formEncType:f.encType||v,replace:f.replace,state:f.state,fromRouteId:i,flushSync:f.flushSync,viewTransition:f.viewTransition})},[l,c,a,i])}function kk(n,{relative:a}={}){let{basename:i}=b.useContext(dn),l=b.useContext(En);ot(l,"useFormAction must be used inside a RouteContext");let[c]=l.matches.slice(-1),d={...rl(n||".",{relative:a})},f=wt();if(n==null){d.search=f.search;let m=new URLSearchParams(d.search),p=m.getAll("index");if(p.some(g=>g==="")){m.delete("index"),p.filter(y=>y).forEach(y=>m.append("index",y));let g=m.toString();d.search=g?`?${g}`:""}}return(!n||n===".")&&c.route.index&&(d.search=d.search?d.search.replace(/^\?/,"?index&"):"?index"),i!=="/"&&(d.pathname=d.pathname==="/"?i:Pn([i,d.pathname])),Jo(d)}function Ck(n,{relative:a}={}){let i=b.useContext(I0);ot(i!=null,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:l}=K0("useViewTransitionState"),c=rl(n,{relative:a});if(!i.isTransitioning)return!1;let d=ga(i.currentLocation.pathname,l)||i.currentLocation.pathname,f=ga(i.nextLocation.pathname,l)||i.nextLocation.pathname;return el(c.pathname,f)!=null||el(c.pathname,d)!=null}function Rt(){const n=cc();return b.useCallback((a,i)=>{typeof a=="number"?n(a):n(a,i)},[n])}function F0(n){return`/sessions/${encodeURIComponent(n)}`}function Ei(n,a){return a?`/environments/${encodeURIComponent(a)}/workspaces/${encodeURIComponent(n)}`:`/workspaces/${encodeURIComponent(n)}`}function ya(n,a,i,l){const c=encodeURIComponent(n);let d;return i&&l?d=`/environments/${encodeURIComponent(l)}/workspaces/${encodeURIComponent(i)}/tasks/${c}`:i?d=`/workspaces/${encodeURIComponent(i)}/tasks/${c}`:d=`/tasks/${c}`,a?`${d}/${a}`:d}function jk(n,a,i){return a&&i?`/environments/${encodeURIComponent(i)}/workspaces/${encodeURIComponent(a)}/tasks/${encodeURIComponent(n)}/edit`:a?`/workspaces/${encodeURIComponent(a)}/tasks/${encodeURIComponent(n)}/edit`:`/tasks/${encodeURIComponent(n)}/edit`}function zi(n,a,i){const l=new URLSearchParams;n&&l.set("workspace",n),a&&l.set("parent",a);const c=l.toString();if(n&&i){const d=`/environments/${encodeURIComponent(i)}/workspaces/${encodeURIComponent(n)}/tasks/new`;return a?`${d}?parent=${encodeURIComponent(a)}`:d}return c?`/tasks/new?${c}`:"/tasks/new"}function Z0(n){return`/sessions/new?${new URLSearchParams({env:n}).toString()}`}const Ai="/environments",Nk="/environments/new";function Di(n){return`/environments/${encodeURIComponent(n)}`}function wk(n){return`/environments/${encodeURIComponent(n)}/edit`}const Yo="/settings",Ek="/settings/credentials",Ak="/pair",Dk="/chat",Cs="/",Rk="/tasks",X0="/workspaces/new",Q0="/knowledge";function Mk(n,a){const i=typeof window<"u"?`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}`:"ws://localhost:3000",l=b.useRef(void 0),[c,d]=b.useState(!1),f=b.useRef(a.onMessage);f.current=a.onMessage;const m=b.useRef(a.onConnect);m.current=a.onConnect;const p=b.useRef(a.onDisconnect);p.current=a.onDisconnect;const v=b.useCallback(g=>{var y;((y=l.current)==null?void 0:y.readyState)===WebSocket.OPEN&&l.current.send(JSON.stringify(g))},[]);return b.useEffect(()=>{let g,y;function x(){g=new WebSocket(i),l.current=g,g.onopen=()=>{d(!0),m.current(v)},g.onmessage=S=>{if(typeof S.data!="string"){console.warn("[ws] Received non-string WebSocket message; ignoring");return}const T=q1(S.data);T&&f.current(T)},g.onclose=S=>{var T;if(d(!1),l.current=void 0,(T=p.current)==null||T.call(p),clearTimeout(y),S.code===K1){window.location.href=Ak;return}y=setTimeout(x,Y1)},g.onerror=()=>{g.close()}}return x(),()=>{clearTimeout(y),g==null||g.close()}},[i,v]),{connected:c,send:v}}const Ok=new Proxy(globalThis.fetch,{apply(n,a,i){return Reflect.apply(globalThis.fetch,a,i)}}),Bk=k1({baseUrl:"/",fetch:Ok}),Ce=C1(j1,Bk);function Lk(n){return{id:n.id,displayName:n.displayName,adapterType:n.adapterType,adapterConfig:n.adapterConfig||"{}",status:n.status,bootstrapped:n.bootstrapped}}function Gg(n){return{id:n.id,environmentId:n.environmentId,runtime:n.runtime,status:n.status,prompt:n.prompt,startedAt:n.startedAt,endedAt:n.endedAt||void 0,error:n.error||void 0,endReason:n.endReason||void 0,personaId:n.personaId||void 0,inputTokens:n.inputTokens,outputTokens:n.outputTokens,costUsd:n.costUsd}}function Ik(n){return{sessionId:n.sessionId,eventType:N1(n.type),timestamp:n.timestamp,content:n.content,raw:n.raw||void 0}}function zk(n){return{id:n.id,name:n.name,description:n.description,repoUrl:n.repoUrl,environmentId:n.environmentId,status:w1(n.status),worktreeBasePath:n.worktreeBasePath,useWorktrees:n.useWorktrees,defaultPersonaId:n.defaultPersonaId,createdAt:n.createdAt,updatedAt:n.updatedAt}}function Pg(n){return{id:n.id,workspaceId:n.workspaceId??void 0,title:n.title,description:n.description,status:E1(n.status),branch:n.branch,latestSessionId:n.latestSessionId,dependsOn:[...n.dependsOn],sortOrder:n.sortOrder,createdAt:n.createdAt,startedAt:n.startedAt||void 0,completedAt:n.completedAt||void 0,parentTaskId:n.parentTaskId,depth:n.depth,childTaskIds:[...n.childTaskIds],canDecompose:n.canDecompose,defaultPersonaId:n.defaultPersonaId}}function Uk(n){return{id:n.id,workspaceId:n.workspaceId,taskId:n.taskId,sessionId:n.sessionId,category:n.category,title:n.title,content:n.content,tags:[...n.tags],createdAt:n.createdAt}}function Vk(n){return{name:n.name,tokenType:n.type,envVar:n.envVar,filePath:n.filePath,expiresAt:n.expiresAt}}function Hk(n){return{claude:A1(n.claude),github:Dr(n.github),copilot:Dr(n.copilot),codex:Dr(n.codex),goose:Dr(n.goose)}}function Gk(n){return{name:n.name,repository:n.repository,state:n.state,gitStatus:n.gitStatus}}function Pk(n){return{id:n.id,name:n.name,description:n.description,systemPrompt:n.systemPrompt,toolConfig:n.toolConfig?JSON.stringify({allowedTools:[...n.toolConfig.allowedTools],disallowedTools:[...n.toolConfig.disallowedTools]}):"{}",runtime:n.runtime,model:n.model,maxTurns:n.maxTurns,mcpServers:JSON.stringify(n.mcpServers.map(a=>({name:a.name,command:a.command,args:[...a.args],tools:[...a.tools]}))),createdAt:n.createdAt,updatedAt:n.updatedAt,type:n.type||"agent",script:n.script}}function $k(n){return{inputTokens:n.inputTokens,outputTokens:n.outputTokens,costUsd:n.costUsd,sessionCount:n.sessionCount}}const $g=5e3;function qk(){const[n,a]=b.useState([]),[i,l]=b.useState({}),c=b.useCallback(()=>{Ce.listEnvironments({}).then(x=>{a(x.environments.map(Lk))},()=>{})},[]),d=b.useCallback(x=>{switch(x.type){case"environment.added":return!0;case"environment.removed":{const S=x.payload.environmentId;return S&&(a(T=>T.filter(j=>j.id!==S)),l(T=>{const j={...T};return delete j[S],j})),!0}case"environment.changed":return c(),!0;case"environment.provision_progress":{const S=x.payload;if(typeof S.environmentId!="string"||typeof S.stage!="string"||typeof S.message!="string"||typeof S.progress!="number")return N0("environment.provision_progress","invalid payload"),!0;if(l(T=>({...T,[S.environmentId]:{stage:S.stage,message:S.message,progress:S.progress}})),S.stage==="ready"){const T=S.environmentId;setTimeout(()=>{l(j=>{const N={...j};return delete N[T],N})},$g)}return!0}default:return!1}},[c]),f=b.useCallback(x=>{var S;if(x.type==="environments"){const T=Array.isArray((S=x.payload)==null?void 0:S.environments)?x.payload.environments:[];return a(T),!0}return!1},[]),m=b.useCallback((x,S,T)=>{Ce.addEnvironment({displayName:x,adapterType:S,adapterConfig:JSON.stringify(T??{})}).catch(()=>{})},[]),p=b.useCallback((x,S)=>{Ce.updateEnvironment({id:x,displayName:S.displayName,adapterConfig:S.adapterConfig?JSON.stringify(S.adapterConfig):void 0}).catch(()=>{})},[]),v=b.useCallback(x=>{(async()=>{try{const T=Ce.provisionEnvironment({id:x});for await(const j of T)l(N=>({...N,[x]:{stage:j.stage,message:j.message,progress:j.progress}})),j.stage==="ready"&&setTimeout(()=>{l(N=>{const C={...N};return delete C[x],C})},$g)}catch{l(T=>{const j={...T};return delete j[x],j})}})().catch(()=>{})},[]),g=b.useCallback(x=>{Ce.stopEnvironment({id:x}).catch(()=>{})},[]),y=b.useCallback(x=>{Ce.removeEnvironment({id:x}).catch(()=>{})},[]);return{environments:n,provisionStatus:i,loadEnvironments:c,addEnvironment:m,updateEnvironment:p,provisionEnvironment:v,stopEnvironment:g,removeEnvironment:y,handleEvent:d,handleLegacyMessage:f}}const zd=new Set(["pending","running","idle"]),Yk=new Set(["completed","failed","interrupted","hibernating","suspended"]),qg=["pending","running","idle"];function Kk(){const[n,a]=b.useState([]),[i,l]=b.useState([]),[c,d]=b.useState(0),[f,m]=b.useState(void 0),[p,v]=b.useState({}),g=b.useCallback(()=>{Ce.listSessions({}).then(E=>{const R=E.sessions.map(Gg);a(w=>{const H=new Map(w.map(I=>[I.id,I]));return R.map(I=>{const U=H.get(I.id),q=U==null?void 0:U.status;return!q||q===I.status?I:Yk.has(q)&&zd.has(I.status)?{...I,status:q,...U.endReason!==void 0?{endReason:U.endReason}:{}}:zd.has(q)&&zd.has(I.status)&&qg.indexOf(q)>qg.indexOf(I.status)?{...I,status:q}:I})})},()=>{})},[]),y=b.useCallback(E=>{if(E.type!=="session_event")return!1;if(!G1(E.payload))return N0("session_event","payload is not a valid SessionEvent"),!0;const R=E.payload;let w=0;if(l(H=>{const I=[...H,R];return I.length>bi?(w=I.length-bi,I.slice(-bi)):I}),w>0&&d(H=>H+w),R.eventType==="usage")try{const H=JSON.parse(R.content),I=Number(H.input_tokens)||0,U=Number(H.output_tokens)||0,q=Number(H.cost_usd)||0;(I>0||U>0||q>0)&&a(ee=>ee.map(ae=>ae.id===R.sessionId?{...ae,inputTokens:(ae.inputTokens??0)+I,outputTokens:(ae.outputTokens??0)+U,costUsd:(ae.costUsd??0)+q}:ae))}catch{}if(R.eventType==="status"){const H=w0(R.content),I=E0(R.content);a(U=>U.some(ee=>ee.id===R.sessionId)?U.map(ee=>ee.id===R.sessionId?{...ee,status:H,...I!==void 0?{endReason:I}:{}}:ee):[...U,{id:R.sessionId,environmentId:"",runtime:"",status:H,prompt:"",startedAt:R.timestamp,...I!==void 0?{endReason:I}:{}}])}return!0},[]),x=b.useCallback(E=>{var R,w,H,I,U;switch(E.type){case"sessions":{const q=Array.isArray((R=E.payload)==null?void 0:R.sessions)?E.payload.sessions:[];return a(q),!0}case"spawned":{const q=(w=E.payload)==null?void 0:w.sessionId;return typeof q=="string"&&q&&m(q),g(),!0}case"session_events":{const q=Array.isArray((H=E.payload)==null?void 0:H.events)?E.payload.events:[];return q.length>0&&l(q),!0}case"task_sessions":{const q=(I=E.payload)==null?void 0:I.taskId;if(typeof q=="string"&&q){const ee=Array.isArray((U=E.payload)==null?void 0:U.sessions)?E.payload.sessions:[];v(ae=>({...ae,[q]:ee}))}return!0}default:return!1}},[g]),S=b.useCallback((E,R,w,H)=>{Ce.spawnAgent({environmentId:E,prompt:R,personaId:w||"",worktreeBasePath:H||""}).then(I=>{m(I.id),g()},()=>{})},[g]),T=b.useCallback((E,R)=>{Ce.sendInput({sessionId:E,text:R}).catch(()=>{})},[]),j=b.useCallback(E=>{Ce.killAgent({id:E}).catch(()=>{})},[]),N=b.useCallback(E=>{Ce.getSessionEvents({id:E}).then(R=>{const w=R.events.map(Ik);if(w.length>0){let H=0;l(I=>{const U=new Set;for(const ae of I)ae.sessionId===E&&U.add(`${ae.timestamp}|${ae.eventType}`);const q=w.filter(ae=>!U.has(`${ae.timestamp}|${ae.eventType}`)),ee=[...I,...q].sort((ae,ce)=>ae.sessionId!==ce.sessionId?0:ae.timestamp.localeCompare(ce.timestamp));return ee.length>bi?(H=ee.length-bi,ee.slice(-bi)):ee}),H>0&&d(I=>I+H)}},()=>{})},[]),C=b.useCallback(()=>{l([]),d(0)},[]),A=b.useCallback(E=>{Ce.getTaskSessions({id:E}).then(R=>{const w=R.sessions.map(Gg);v(H=>({...H,[E]:w}))},()=>{})},[]);return{sessions:n,events:i,eventsDropped:c,lastSpawnedId:f,taskSessions:p,loadSessions:g,spawn:S,sendInput:T,kill:j,loadSessionEvents:N,clearEvents:C,loadTaskSessions:A,handleMessage:y,handleLegacyMessage:x}}function Fk(){const[n,a]=b.useState([]),[i,l]=b.useState(!1),c=b.useCallback(()=>{Ce.listWorkspaces({}).then(g=>{a(g.workspaces.map(zk))},()=>{})},[]),d=b.useCallback(g=>{switch(g.type){case"workspace.created":return l(!1),c(),!0;case"workspace.archived":case"workspace.updated":return c(),!0;default:return!1}},[c]),f=b.useCallback(()=>{l(!1)},[]),m=b.useCallback((g,y,x,S,T,j,N,C,A)=>{l(!0),Ce.createWorkspace({name:g,description:y||"",repoUrl:x||"",environmentId:S||"",defaultPersonaId:T||void 0,useWorktrees:j??!0,worktreeBasePath:N||void 0}).then(()=>{l(!1),C==null||C()},E=>{l(!1);const R=E instanceof Of?E.message:"Failed to create workspace";A==null||A(R)})},[]),p=b.useCallback(g=>{Ce.archiveWorkspace({id:g}).catch(()=>{})},[]),v=b.useCallback((g,y)=>{Ce.updateWorkspace({id:g,...y}).catch(()=>{})},[]);return{workspaces:n,workspaceCreating:i,loadWorkspaces:c,createWorkspace:m,archiveWorkspace:p,updateWorkspace:v,handleEvent:d,onDisconnect:f}}function Zk(){const[n,a]=b.useState([]),[i,l]=b.useState(void 0),c=b.useCallback(C=>{Ce.listTasks({workspaceId:C}).then(A=>{const E=A.tasks.map(Pg);a(R=>[...R.filter(w=>w.workspaceId!==C),...E])},()=>{})},[]),d=b.useCallback(()=>{Ce.listTasks({}).then(C=>{const A=C.tasks.map(Pg);a(E=>{const R=new Set(A.map(w=>w.id));return[...E.filter(w=>!R.has(w.id)),...A]})},()=>{})},[]),f=b.useCallback((C,A)=>{C?c(C):A&&a(E=>{const R=E.find(w=>w.id===A);return R!=null&&R.workspaceId?c(R.workspaceId):d(),E})},[c,d]),m=b.useCallback(C=>{const A=C.payload;switch(C.type){case"task.created":{const E=typeof A.workspaceId=="string"?A.workspaceId:"";return E&&c(E),!0}case"task.started":{const E=typeof A.taskId=="string"?A.taskId:"",R=typeof A.sessionId=="string"?A.sessionId:"",w=typeof A.workspaceId=="string"?A.workspaceId:"";return l(H=>E&&H===E?void 0:H),R&&E&&a(H=>H.map(I=>I.id===E?{...I,latestSessionId:R}:I)),f(w,E),!0}case"task.completed":case"task.deleted":case"task.updated":{const E=typeof A.workspaceId=="string"?A.workspaceId:"",R=typeof A.taskId=="string"?A.taskId:"";return f(E,R),!0}default:return!1}},[c,f]),p=b.useCallback(()=>{l(void 0)},[]),v=b.useCallback(C=>{var A,E;if(C.type==="tasks"){const R=Array.isArray((A=C.payload)==null?void 0:A.tasks)?C.payload.tasks:[],w=typeof((E=C.payload)==null?void 0:E.workspaceId)=="string"&&C.payload.workspaceId?C.payload.workspaceId:"";return a(w?H=>[...H.filter(I=>I.workspaceId!==w),...R]:H=>{const I=new Set(R.map(U=>U.id));return[...H.filter(U=>!I.has(U.id)),...R]}),!0}return!1},[]),g=b.useCallback((C,A,E,R,w,H,I,U,q)=>{Ce.createTask({workspaceId:C,title:A,description:E||"",dependsOn:R||[],parentTaskId:w||"",defaultPersonaId:H||void 0,canDecompose:I??void 0}).then(()=>{U==null||U()},ee=>{const ae=ee instanceof Of?ee.message:"Failed to create task";q==null||q(ae)})},[]),y=b.useCallback((C,A,E,R)=>{l(C),Ce.startTask({taskId:C,personaId:A||"",environmentId:E||"",notes:R||""}).catch(()=>{l(void 0)})},[]),x=b.useCallback(C=>{Ce.stopTask({id:C}).catch(()=>{})},[]),S=b.useCallback(C=>{Ce.completeTask({id:C}).catch(()=>{})},[]),T=b.useCallback(C=>{Ce.resumeTask({id:C}).catch(()=>{})},[]),j=b.useCallback((C,A,E,R,w)=>{Ce.updateTask({id:C,title:A,description:E,dependsOn:R,...w!==void 0?{defaultPersonaId:w}:{}}).catch(()=>{})},[]),N=b.useCallback(C=>{Ce.deleteTask({id:C}).catch(()=>{})},[]);return{tasks:n,taskStartingId:i,loadTasks:c,loadAllTasks:d,createTask:g,startTask:y,stopTask:x,completeTask:S,resumeTask:T,updateTask:j,deleteTask:N,handleEvent:m,onDisconnect:p,handleLegacyMessage:v}}function Xk(){const[n,a]=b.useState([]),i=b.useCallback(d=>{Ce.queryFindings({workspaceId:d}).then(f=>{a(f.findings.map(Uk))},()=>{})},[]),l=b.useCallback(d=>{if(d.type==="finding.posted"){const f=typeof d.payload.workspaceId=="string"?d.payload.workspaceId:"";return f&&i(f),!0}return!1},[i]),c=b.useCallback((d,f,m,p,v)=>{Ce.postFinding({workspaceId:d,title:f,content:m,category:p??"general",tags:v??[]}).catch(()=>{})},[]);return{findings:n,loadFindings:i,postFinding:c,handleEvent:l}}function Qk(){const[n,a]=b.useState([]),i=b.useCallback(()=>{Ce.listTokens({}).then(f=>{a(f.tokens.map(Vk))},()=>{})},[]),l=b.useCallback(f=>f.type==="token.changed"?(i(),!0):!1,[i]),c=b.useCallback((f,m,p,v,g)=>{Ce.setToken({name:f,value:m,type:p,envVar:v,filePath:g}).catch(()=>{})},[]),d=b.useCallback(f=>{Ce.deleteToken({name:f}).catch(()=>{})},[]);return{tokens:n,loadTokens:i,setToken:c,deleteToken:d,handleEvent:l}}function Wk(){const[n,a]=b.useState({claude:"off",github:"off",copilot:"off",codex:"off",goose:"off"}),i=b.useCallback(()=>{Ce.getCredentialProviders({}).then(d=>{a(Hk(d))},()=>{})},[]),l=b.useCallback(d=>d.type==="credential.providers_changed"?($1(d.payload)&&a(d.payload),!0):!1,[]),c=b.useCallback(d=>{const f=[{provider:"claude",value:d.claude},{provider:"github",value:d.github},{provider:"copilot",value:d.copilot},{provider:"codex",value:d.codex},{provider:"goose",value:d.goose}];for(const{provider:m,value:p}of f)Ce.setCredentialProvider({provider:m,value:p}).catch(()=>{})},[]);return{credentialProviders:n,loadCredentials:i,updateCredentialProviders:c,handleEvent:l}}function Jk(){const[n,a]=b.useState([]),[i,l]=b.useState(""),[c,d]=b.useState(""),[f,m]=b.useState(!1),p=b.useCallback(()=>{Ce.listCodespaces({}).then(g=>{a(g.codespaces.map(Gk)),d(g.error)},()=>{})},[]),v=b.useCallback((g,y)=>{m(!0),l(""),Ce.createCodespace({repo:g,machine:y??""}).then(()=>{m(!1),p()},x=>{m(!1);const S=x instanceof Of?x.message:"Failed to create codespace";l(S)})},[p]);return{codespaces:n,codespaceError:i,codespaceListError:c,codespaceCreating:f,listCodespaces:p,createCodespace:v}}function eC(){const[n,a]=b.useState([]),i=b.useCallback(()=>{Ce.listPersonas({}).then(m=>{a(m.personas.map(Pk))},()=>{})},[]),l=b.useCallback(m=>{switch(m.type){case"persona.created":case"persona.updated":case"persona.deleted":return i(),!0;default:return!1}},[i]),c=b.useCallback((m,p,v,g,y,x,S,T)=>{Ce.createPersona({name:m,description:p,systemPrompt:v,runtime:g||"",model:y||"",maxTurns:x||0,type:S||"agent",script:T||""}).catch(()=>{})},[]),d=b.useCallback((m,p,v,g,y,x,S,T,j)=>{const N={id:m};p!==void 0&&(N.name=p),v!==void 0&&(N.description=v),g!==void 0&&(N.systemPrompt=g),y!==void 0&&(N.runtime=y),x!==void 0&&(N.model=x),S!==void 0&&(N.maxTurns=S),T!==void 0&&(N.type=T),j!==void 0&&(N.script=j),Ce.updatePersona(N).catch(()=>{})},[]),f=b.useCallback(m=>{Ce.deletePersona({id:m}).catch(()=>{})},[]);return{personas:n,loadPersonas:i,createPersona:c,updatePersona:d,deletePersona:f,handleEvent:l}}function Or(n,a=0){return{id:n.id,label:n.title||n.label||n.id,kind:n.kind,category:n.category,sourceType:n.sourceType,sourceId:n.sourceId,content:n.content,tags:n.tags,workspaceId:n.workspaceId,createdAt:n.createdAt,updatedAt:n.updatedAt,val:a}}function Ud(n){return{source:n.fromId,target:n.toId,type:n.type}}const tC=new Set(["knowledge.listRecent.result","knowledge.search.result","knowledge.getNode.result","knowledge.expand.result"]);function nC(n){const[a,i]=b.useState(new Map),[l,c]=b.useState([]),[d,f]=b.useState(void 0),[m,p]=b.useState(void 0),[v,g]=b.useState(!1),[y,x]=b.useState(""),S=b.useCallback(R=>{g(!0),n({type:"knowledge.listRecent",payload:{limit:30,workspaceId:R}})},[n]),T=b.useCallback(R=>{R.trim()&&(x(R),p(void 0),f(void 0),g(!0),n({type:"knowledge.search",payload:{query:R,limit:20}}))},[n]),j=b.useCallback(()=>{x(""),S()},[S]),N=b.useCallback(R=>{p(R),n({type:"knowledge.getNode",payload:{id:R}})},[n]),C=b.useCallback(()=>{p(void 0),f(void 0)},[]),A=b.useCallback(R=>{n({type:"knowledge.expand",payload:{id:R,depth:1}})},[n]),E=b.useCallback(R=>{if(!tC.has(R.type))return!1;const w=R.payload??{};switch(R.type){case"knowledge.listRecent.result":{if(w.error)return g(!1),!0;const H=w.nodes??[],I=w.edges??[],U=new Map,q=[];for(const ee of H)U.set(ee.id,Or(ee));for(const ee of I)q.push(Ud(ee));for(const ee of q){const ae=U.get(ee.source);ae&&(ae.val+=1);const ce=U.get(ee.target);ce&&(ce.val+=1)}return i(U),c(q),g(!1),!0}case"knowledge.search.result":{if(w.error)return g(!1),!0;const H=w.results??[],I=new Map,U=[];for(const q of H){const ee=q.node,ae=q.edges??[];I.set(ee.id,Or(ee,ae.length));for(const ce of ae)U.push(Ud(ce))}return i(I),c(U),g(!1),!0}case"knowledge.getNode.result":{if(w.error)return f(void 0),!0;const H=w.node,I=w.edges??[];return f({node:Or(H,I.length),edges:I.map(U=>({fromId:U.fromId,toId:U.toId,type:U.type,metadata:U.metadata}))}),!0}case"knowledge.expand.result":{const H=w.nodes??[],I=w.edges??[];return i(U=>{const q=new Map(U);for(const ee of H)q.has(ee.id)||q.set(ee.id,Or(ee));return q}),c(U=>{const q=new Set(U.map(ae=>`${ae.source}:${ae.target}:${ae.type}`)),ee=[];for(const ae of I){const ce=Ud(ae),re=`${ce.source}:${ce.target}:${ce.type}`;q.has(re)||ee.push(ce)}return[...U,...ee]}),!0}}return!1},[]);return{graphData:{nodes:[...a.values()],links:l},selectedNode:d,selectedId:m,loading:v,searchQuery:y,search:T,clearSearch:j,selectNode:N,clearSelection:C,expandNode:A,loadRecent:S,handleMessage:E}}function aC(n){const[a,i]=b.useState(""),[l,c]=b.useState(void 0),[d,f]=b.useState({}),{connected:m,send:p}=Mk(n,{onMessage:q,onConnect:ee,onDisconnect:ae}),v=qk(),g=Kk(),y=Fk(),x=Zk(),S=Xk(),T=Qk(),j=Wk(),N=Jk(),C=eC(),A=nC(p),E="default_persona_id",R="onboarding_completed",w=b.useCallback(re=>{i(re),Ce.setSetting({key:E,value:re}).catch(()=>{})},[]),H=b.useCallback(()=>{c(!0),Ce.setSetting({key:R,value:"true"}).catch(()=>{})},[]),I=b.useCallback((re,K)=>{Ce.getUsage({scope:re,id:K}).then(ne=>{const O=`${re}:${K}`;f(P=>({...P,[O]:$k(ne)}))},()=>{})},[]);function U(re){const K=re.payload.key,ne=re.payload.value;if(re.type==="setting.changed"){K===E&&i(ne??""),K===R&&c(ne==="true");return}if(v.handleEvent(re)){(re.type==="environment.removed"||re.type==="environment.changed")&&g.loadSessions();return}if(!y.handleEvent(re)){if(x.handleEvent(re)){re.type==="task.started"&&g.loadSessions();return}S.handleEvent(re)||T.handleEvent(re)||j.handleEvent(re)||C.handleEvent(re)}}function q(re){var K,ne,O,P;if(H1(re)){U(re);return}if(!g.handleMessage(re)&&!A.handleMessage(re)&&!((K=g.handleLegacyMessage)!=null&&K.call(g,re))&&!((ne=v.handleLegacyMessage)!=null&&ne.call(v,re))&&!((O=x.handleLegacyMessage)!=null&&O.call(x,re))&&re.type==="error"){console.error("[ws]",(P=re.payload)==null?void 0:P.message);return}}function ee(re){v.loadEnvironments(),g.loadSessions(),y.loadWorkspaces(),T.loadTokens(),j.loadCredentials(),C.loadPersonas(),Ce.getSetting({key:E}).then(K=>{i(K.value)},()=>{}),Ce.getSetting({key:R}).then(K=>{c(K.value==="true")},()=>{}),x.loadAllTasks(),re({type:"subscribe_all"})}function ae(){y.onDisconnect(),x.onDisconnect()}const ce=b.useCallback(()=>{v.loadEnvironments(),g.loadSessions(),y.loadWorkspaces(),T.loadTokens()},[v.loadEnvironments,g.loadSessions,y.loadWorkspaces,T.loadTokens]);return{connected:m,send:p,environments:v.environments,sessions:g.sessions,events:g.events,eventsDropped:g.eventsDropped,lastSpawnedId:g.lastSpawnedId,workspaces:y.workspaces,tasks:x.tasks,findings:S.findings,tokens:T.tokens,spawn:g.spawn,sendInput:g.sendInput,kill:g.kill,refresh:ce,loadSessionEvents:g.loadSessionEvents,clearEvents:g.clearEvents,loadWorkspaces:y.loadWorkspaces,createWorkspace:y.createWorkspace,archiveWorkspace:y.archiveWorkspace,updateWorkspace:y.updateWorkspace,loadTasks:x.loadTasks,loadAllTasks:x.loadAllTasks,createTask:x.createTask,startTask:x.startTask,stopTask:x.stopTask,completeTask:x.completeTask,resumeTask:x.resumeTask,updateTask:x.updateTask,deleteTask:x.deleteTask,loadFindings:S.loadFindings,postFinding:S.postFinding,loadEnvironments:v.loadEnvironments,addEnvironment:v.addEnvironment,updateEnvironment:v.updateEnvironment,loadTokens:T.loadTokens,setToken:T.setToken,deleteToken:T.deleteToken,credentialProviders:j.credentialProviders,updateCredentialProviders:j.updateCredentialProviders,provisionStatus:v.provisionStatus,provisionEnvironment:v.provisionEnvironment,stopEnvironment:v.stopEnvironment,removeEnvironment:v.removeEnvironment,codespaces:N.codespaces,codespaceError:N.codespaceError,codespaceListError:N.codespaceListError,codespaceCreating:N.codespaceCreating,listCodespaces:N.listCodespaces,createCodespace:N.createCodespace,workspaceCreating:y.workspaceCreating,taskStartingId:x.taskStartingId,personas:C.personas,createPersona:C.createPersona,updatePersona:C.updatePersona,deletePersona:C.deletePersona,taskSessions:g.taskSessions,loadTaskSessions:g.loadTaskSessions,appDefaultPersonaId:a,setAppDefaultPersonaId:w,onboardingCompleted:l,completeOnboarding:H,usageCache:d,loadUsage:I,knowledge:A}}const Pf=b.createContext(void 0);function sC({children:n}){const a=aC();return r.jsx(Pf.Provider,{value:a,children:n})}function rt(){const n=b.useContext(Pf);if(!n)throw new Error("useGrackle must be used within GrackleProvider");return n}const iC=[{id:"env-local-01",displayName:"Local Dev",adapterType:"local",adapterConfig:"{}",status:"connected",bootstrapped:!0},{id:"env-docker-01",displayName:"Docker Sandbox",adapterType:"docker",adapterConfig:'{"image":"node:20"}',status:"connected",bootstrapped:!0},{id:"env-cs-01",displayName:"GitHub Codespace",adapterType:"codespace",adapterConfig:'{"codespaceName":"my-codespace"}',status:"connected",bootstrapped:!0},{id:"env-remote-01",displayName:"Staging (SSH)",adapterType:"ssh",adapterConfig:'{"host":"192.168.1.10","user":"deploy","sshPort":22}',status:"disconnected",bootstrapped:!1}],oC=[{id:"sess-001-prev",environmentId:"env-local-01",runtime:"claude-code",status:"stopped",endReason:"interrupted",prompt:"Implement auth middleware",startedAt:"2026-02-26T14:00:00Z",endedAt:"2026-02-26T15:12:00Z",error:"Context window exceeded before completing implementation",inputTokens:84200,outputTokens:12750,costUsd:.41},{id:"sess-001",environmentId:"env-local-01",runtime:"claude-code",status:"running",prompt:"Refactor the authentication middleware to use JWT tokens",startedAt:"2026-02-27T08:15:00Z",inputTokens:42600,outputTokens:8100,costUsd:.22},{id:"sess-002",environmentId:"env-docker-01",runtime:"claude-code",status:"stopped",endReason:"completed",prompt:"Write unit tests for the user registration endpoint",startedAt:"2026-02-27T07:30:00Z",endedAt:"2026-02-27T07:33:00Z",inputTokens:31400,outputTokens:9800,costUsd:.18},{id:"sess-003",environmentId:"env-local-01",runtime:"claude-code",status:"stopped",endReason:"interrupted",prompt:"Migrate database schema to add audit_log table",startedAt:"2026-02-26T22:45:00Z",endedAt:"2026-02-26T23:10:00Z",inputTokens:56300,outputTokens:14200,costUsd:.31},{id:"sess-004",environmentId:"env-docker-01",runtime:"claude-code",status:"running",prompt:"Implement rate limiting for the public API",startedAt:"2026-02-27T09:00:00Z",inputTokens:18900,outputTokens:4500,costUsd:.1},{id:"sess-005",environmentId:"env-cs-01",runtime:"claude-code",status:"suspended",prompt:"Refactor database connection pooling for multi-tenant isolation",startedAt:"2026-02-27T06:00:00Z",inputTokens:67800,outputTokens:19300,costUsd:.38}],lC=[{sessionId:"sess-001-prev",eventType:"status",timestamp:"2026-02-26T14:00:01Z",content:"running"},{sessionId:"sess-001-prev",eventType:"output",timestamp:"2026-02-26T14:00:05Z",content:"Reading src/middleware/auth.ts to understand the current authentication flow..."},{sessionId:"sess-001-prev",eventType:"error",timestamp:"2026-02-26T15:12:00Z",content:"Context window exceeded before completing implementation"},{sessionId:"sess-001",eventType:"status",timestamp:"2026-02-27T08:15:01Z",content:"running"},{sessionId:"sess-001",eventType:"output",timestamp:"2026-02-27T08:15:02Z",content:"Analyzing current authentication middleware in src/middleware/auth.ts..."},{sessionId:"sess-001",eventType:"output",timestamp:"2026-02-27T08:15:04Z",content:`Found 3 files using session-based auth:
|
|
37
|
+
Please change the parent <Route path="${C}"> to <Route path="${C==="/"?"*":`${C}/*`}">.`)}let g=wt(),y;if(a){let C=typeof a=="string"?Li(a):a;ot(p==="/"||((N=C.pathname)==null?void 0:N.startsWith(p)),`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 "${p}" but pathname "${C.pathname}" was given in the \`location\` prop.`),y=C}else y=g;let x=y.pathname||"/",S=x;if(p!=="/"){let C=p.replace(/^\//,"").split("/");S="/"+x.replace(/^\//,"").split("/").slice(C.length).join("/")}let T=A0(n,{pathname:S});wn(v||T!=null,`No routes matched location "${y.pathname}${y.search}${y.hash}" `),wn(T==null||T[T.length-1].route.element!==void 0||T[T.length-1].route.Component!==void 0||T[T.length-1].route.lazy!==void 0,`Matched leaf route at location "${y.pathname}${y.search}${y.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 j=LT(T&&T.map(C=>Object.assign({},C,{params:Object.assign({},f,C.params),pathname:Pn([p,l.encodeLocation?l.encodeLocation(C.pathname.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:C.pathname]),pathnameBase:C.pathnameBase==="/"?p:Pn([p,l.encodeLocation?l.encodeLocation(C.pathnameBase.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:C.pathnameBase])})),c,i);return a&&j?b.createElement(ll.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",unstable_mask:void 0,...y},navigationType:"POP"}},j):j}function RT(){let n=HT(),a=gT(n)?`${n.status} ${n.statusText}`:n instanceof Error?n.message:JSON.stringify(n),i=n instanceof Error?n.stack:null,l="rgba(200,200,200, 0.5)",c={padding:"0.5rem",backgroundColor:l},d={padding:"2px 4px",backgroundColor:l},f=null;return console.error("Error handled by React Router default ErrorBoundary:",n),f=b.createElement(b.Fragment,null,b.createElement("p",null,"💿 Hey developer 👋"),b.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",b.createElement("code",{style:d},"ErrorBoundary")," or"," ",b.createElement("code",{style:d},"errorElement")," prop on your route.")),b.createElement(b.Fragment,null,b.createElement("h2",null,"Unexpected Application Error!"),b.createElement("h3",{style:{fontStyle:"italic"}},a),i?b.createElement("pre",{style:c},i):null,f)}var MT=b.createElement(RT,null),G0=class extends b.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,a){return a.location!==n.location||a.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:a.error,location:a.location,revalidation:n.revalidation||a.revalidation}}componentDidCatch(n,a){this.props.onError?this.props.onError(n,a):console.error("React Router caught the following error during render",n)}render(){let n=this.state.error;if(this.context&&typeof n=="object"&&n&&"digest"in n&&typeof n.digest=="string"){const i=jT(n.digest);i&&(n=i)}let a=n!==void 0?b.createElement(En.Provider,{value:this.props.routeContext},b.createElement(Lf.Provider,{value:n,children:this.props.component})):this.props.children;return this.context?b.createElement(OT,{error:n},a):a}};G0.contextType=xT;var Ld=new WeakMap;function OT({children:n,error:a}){let{basename:i}=b.useContext(dn);if(typeof a=="object"&&a&&"digest"in a&&typeof a.digest=="string"){let l=CT(a.digest);if(l){let c=Ld.get(a);if(c)throw c;let d=B0(l.location,i);if(O0&&!Ld.get(a))if(d.isExternal||l.reloadDocument)window.location.href=d.absoluteURL||d.to;else{const f=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(d.to,{replace:l.replace}));throw Ld.set(a,f),f}return b.createElement("meta",{httpEquiv:"refresh",content:`0;url=${d.absoluteURL||d.to}`})}}return n}function BT({routeContext:n,match:a,children:i}){let l=b.useContext(Ii);return l&&l.static&&l.staticContext&&(a.route.errorElement||a.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=a.route.id),b.createElement(En.Provider,{value:n},i)}function LT(n,a=[],i){let l=i==null?void 0:i.state;if(n==null){if(!l)return null;if(l.errors)n=l.matches;else if(a.length===0&&!l.initialized&&l.matches.length>0)n=l.matches;else return null}let c=n,d=l==null?void 0:l.errors;if(d!=null){let g=c.findIndex(y=>y.route.id&&(d==null?void 0:d[y.route.id])!==void 0);ot(g>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(d).join(",")}`),c=c.slice(0,Math.min(c.length,g+1))}let f=!1,m=-1;if(i&&l){f=l.renderFallback;for(let g=0;g<c.length;g++){let y=c[g];if((y.route.HydrateFallback||y.route.hydrateFallbackElement)&&(m=g),y.route.id){let{loaderData:x,errors:S}=l,T=y.route.loader&&!x.hasOwnProperty(y.route.id)&&(!S||S[y.route.id]===void 0);if(y.route.lazy||T){i.isStatic&&(f=!0),m>=0?c=c.slice(0,m+1):c=[c[0]];break}}}}let p=i==null?void 0:i.onError,v=l&&p?(g,y)=>{var x,S;p(g,{location:l.location,params:((S=(x=l.matches)==null?void 0:x[0])==null?void 0:S.params)??{},unstable_pattern:yT(l.matches),errorInfo:y})}:void 0;return c.reduceRight((g,y,x)=>{let S,T=!1,j=null,N=null;l&&(S=d&&y.route.id?d[y.route.id]:void 0,j=y.route.errorElement||MT,f&&(m<0&&x===0?(P0("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),T=!0,N=null):m===x&&(T=!0,N=y.route.hydrateFallbackElement||null)));let C=a.concat(c.slice(0,x+1)),A=()=>{let E;return S?E=j:T?E=N:y.route.Component?E=b.createElement(y.route.Component,null):y.route.element?E=y.route.element:E=g,b.createElement(BT,{match:y,routeContext:{outlet:g,matches:C,isDataRoute:l!=null},children:E})};return l&&(y.route.ErrorBoundary||y.route.errorElement||x===0)?b.createElement(G0,{location:l.location,revalidation:l.revalidation,component:j,error:S,children:A(),routeContext:{outlet:null,matches:C,isDataRoute:!0},onError:v}):A()},null)}function If(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function IT(n){let a=b.useContext(Ii);return ot(a,If(n)),a}function zT(n){let a=b.useContext(rc);return ot(a,If(n)),a}function UT(n){let a=b.useContext(En);return ot(a,If(n)),a}function zf(n){let a=UT(n),i=a.matches[a.matches.length-1];return ot(i.route.id,`${n} can only be used on routes that contain a unique "id"`),i.route.id}function VT(){return zf("useRouteId")}function HT(){var l;let n=b.useContext(Lf),a=zT("useRouteError"),i=zf("useRouteError");return n!==void 0?n:(l=a.errors)==null?void 0:l[i]}function GT(){let{router:n}=IT("useNavigate"),a=zf("useNavigate"),i=b.useRef(!1);return V0(()=>{i.current=!0}),b.useCallback(async(c,d={})=>{wn(i.current,U0),i.current&&(typeof c=="number"?await n.navigate(c):await n.navigate(c,{fromRouteId:a,...d}))},[n,a])}var Vg={};function P0(n,a,i){!a&&!Vg[n]&&(Vg[n]=!0,wn(!1,i))}b.memo(PT);function PT({routes:n,future:a,state:i,isStatic:l,onError:c}){return H0(n,void 0,{state:i,isStatic:l,onError:c})}function Gn({to:n,replace:a,state:i,relative:l}){ot(Ns(),"<Navigate> may be used only in the context of a <Router> component.");let{static:c}=b.useContext(dn);wn(!c,"<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:d}=b.useContext(En),{pathname:f}=wt(),m=cc(),p=lc(n,Bf(d),f,l==="path"),v=JSON.stringify(p);return b.useEffect(()=>{m(JSON.parse(v),{replace:a,state:i,relative:l})},[m,v,l,a,i]),null}function ws(n){return AT(n.context)}function ke(n){ot(!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 $T({basename:n="/",children:a=null,location:i,navigationType:l="POP",navigator:c,static:d=!1,unstable_useTransitions:f}){ot(!Ns(),"You cannot render a <Router> inside another <Router>. You should never have more than one in your app.");let m=n.replace(/^\/*/,"/"),p=b.useMemo(()=>({basename:m,navigator:c,static:d,unstable_useTransitions:f,future:{}}),[m,c,d,f]);typeof i=="string"&&(i=Li(i));let{pathname:v="/",search:g="",hash:y="",state:x=null,key:S="default",unstable_mask:T}=i,j=b.useMemo(()=>{let N=ga(v,m);return N==null?null:{location:{pathname:N,search:g,hash:y,state:x,key:S,unstable_mask:T},navigationType:l}},[m,v,g,y,x,S,l,T]);return wn(j!=null,`<Router basename="${m}"> is not able to match the URL "${v}${g}${y}" because it does not start with the basename, so the <Router> won't render anything.`),j==null?null:b.createElement(dn.Provider,{value:p},b.createElement(ll.Provider,{children:a,value:j}))}function qT({children:n,location:a}){return DT(rf(n),a)}function rf(n,a=[]){let i=[];return b.Children.forEach(n,(l,c)=>{if(!b.isValidElement(l))return;let d=[...a,c];if(l.type===b.Fragment){i.push.apply(i,rf(l.props.children,d));return}ot(l.type===ke,`[${typeof l.type=="string"?l.type:l.type.name}] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`),ot(!l.props.index||!l.props.children,"An index route cannot have child routes.");let f={id:l.props.id||d.join("-"),caseSensitive:l.props.caseSensitive,element:l.props.element,Component:l.props.Component,index:l.props.index,path:l.props.path,middleware:l.props.middleware,loader:l.props.loader,action:l.props.action,hydrateFallbackElement:l.props.hydrateFallbackElement,HydrateFallback:l.props.HydrateFallback,errorElement:l.props.errorElement,ErrorBoundary:l.props.ErrorBoundary,hasErrorBoundary:l.props.hasErrorBoundary===!0||l.props.ErrorBoundary!=null||l.props.errorElement!=null,shouldRevalidate:l.props.shouldRevalidate,handle:l.props.handle,lazy:l.props.lazy};l.props.children&&(f.children=rf(l.props.children,d)),i.push(f)}),i}var Pr="get",$r="application/x-www-form-urlencoded";function uc(n){return typeof HTMLElement<"u"&&n instanceof HTMLElement}function YT(n){return uc(n)&&n.tagName.toLowerCase()==="button"}function KT(n){return uc(n)&&n.tagName.toLowerCase()==="form"}function FT(n){return uc(n)&&n.tagName.toLowerCase()==="input"}function ZT(n){return!!(n.metaKey||n.altKey||n.ctrlKey||n.shiftKey)}function XT(n,a){return n.button===0&&(!a||a==="_self")&&!ZT(n)}function cf(n=""){return new URLSearchParams(typeof n=="string"||Array.isArray(n)||n instanceof URLSearchParams?n:Object.keys(n).reduce((a,i)=>{let l=n[i];return a.concat(Array.isArray(l)?l.map(c=>[i,c]):[[i,l]])},[]))}function QT(n,a){let i=cf(n);return a&&a.forEach((l,c)=>{i.has(c)||a.getAll(c).forEach(d=>{i.append(c,d)})}),i}var Mr=null;function WT(){if(Mr===null)try{new FormData(document.createElement("form"),0),Mr=!1}catch{Mr=!0}return Mr}var JT=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Id(n){return n!=null&&!JT.has(n)?(wn(!1,`"${n}" is not a valid \`encType\` for \`<Form>\`/\`<fetcher.Form>\` and will default to "${$r}"`),null):n}function ek(n,a){let i,l,c,d,f;if(KT(n)){let m=n.getAttribute("action");l=m?ga(m,a):null,i=n.getAttribute("method")||Pr,c=Id(n.getAttribute("enctype"))||$r,d=new FormData(n)}else if(YT(n)||FT(n)&&(n.type==="submit"||n.type==="image")){let m=n.form;if(m==null)throw new Error('Cannot submit a <button> or <input type="submit"> without a <form>');let p=n.getAttribute("formaction")||m.getAttribute("action");if(l=p?ga(p,a):null,i=n.getAttribute("formmethod")||m.getAttribute("method")||Pr,c=Id(n.getAttribute("formenctype"))||Id(m.getAttribute("enctype"))||$r,d=new FormData(m,n),!WT()){let{name:v,type:g,value:y}=n;if(g==="image"){let x=v?`${v}.`:"";d.append(`${x}x`,"0"),d.append(`${x}y`,"0")}else v&&d.append(v,y)}}else{if(uc(n))throw new Error('Cannot submit element that is not <form>, <button>, or <input type="submit|image">');i=Pr,l=null,c=$r,f=n}return d&&c==="text/plain"&&(f=d,d=void 0),{action:l,method:i.toLowerCase(),encType:c,formData:d,body:f}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");function Uf(n,a){if(n===!1||n===null||typeof n>"u")throw new Error(a)}function tk(n,a,i,l){let c=typeof n=="string"?new URL(n,typeof window>"u"?"server://singlefetch/":window.location.origin):n;return i?c.pathname.endsWith("/")?c.pathname=`${c.pathname}_.${l}`:c.pathname=`${c.pathname}.${l}`:c.pathname==="/"?c.pathname=`_root.${l}`:a&&ga(c.pathname,a)==="/"?c.pathname=`${a.replace(/\/$/,"")}/_root.${l}`:c.pathname=`${c.pathname.replace(/\/$/,"")}.${l}`,c}async function nk(n,a){if(n.id in a)return a[n.id];try{let i=await import(n.module);return a[n.id]=i,i}catch(i){return console.error(`Error loading route module \`${n.module}\`, reloading page...`),console.error(i),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}function ak(n){return n==null?!1:n.href==null?n.rel==="preload"&&typeof n.imageSrcSet=="string"&&typeof n.imageSizes=="string":typeof n.rel=="string"&&typeof n.href=="string"}async function sk(n,a,i){let l=await Promise.all(n.map(async c=>{let d=a.routes[c.route.id];if(d){let f=await nk(d,i);return f.links?f.links():[]}return[]}));return rk(l.flat(1).filter(ak).filter(c=>c.rel==="stylesheet"||c.rel==="preload").map(c=>c.rel==="stylesheet"?{...c,rel:"prefetch",as:"style"}:{...c,rel:"prefetch"}))}function Hg(n,a,i,l,c,d){let f=(p,v)=>i[v]?p.route.id!==i[v].route.id:!0,m=(p,v)=>{var g;return i[v].pathname!==p.pathname||((g=i[v].route.path)==null?void 0:g.endsWith("*"))&&i[v].params["*"]!==p.params["*"]};return d==="assets"?a.filter((p,v)=>f(p,v)||m(p,v)):d==="data"?a.filter((p,v)=>{var y;let g=l.routes[p.route.id];if(!g||!g.hasLoader)return!1;if(f(p,v)||m(p,v))return!0;if(p.route.shouldRevalidate){let x=p.route.shouldRevalidate({currentUrl:new URL(c.pathname+c.search+c.hash,window.origin),currentParams:((y=i[0])==null?void 0:y.params)||{},nextUrl:new URL(n,window.origin),nextParams:p.params,defaultShouldRevalidate:!0});if(typeof x=="boolean")return x}return!0}):[]}function ik(n,a,{includeHydrateFallback:i}={}){return ok(n.map(l=>{let c=a.routes[l.route.id];if(!c)return[];let d=[c.module];return c.clientActionModule&&(d=d.concat(c.clientActionModule)),c.clientLoaderModule&&(d=d.concat(c.clientLoaderModule)),i&&c.hydrateFallbackModule&&(d=d.concat(c.hydrateFallbackModule)),c.imports&&(d=d.concat(c.imports)),d}).flat(1))}function ok(n){return[...new Set(n)]}function lk(n){let a={},i=Object.keys(n).sort();for(let l of i)a[l]=n[l];return a}function rk(n,a){let i=new Set;return new Set(a),n.reduce((l,c)=>{let d=JSON.stringify(lk(c));return i.has(d)||(i.add(d),l.push({key:d,link:c})),l},[])}function $0(){let n=b.useContext(Ii);return Uf(n,"You must render this element inside a <DataRouterContext.Provider> element"),n}function ck(){let n=b.useContext(rc);return Uf(n,"You must render this element inside a <DataRouterStateContext.Provider> element"),n}var Vf=b.createContext(void 0);Vf.displayName="FrameworkContext";function q0(){let n=b.useContext(Vf);return Uf(n,"You must render this element inside a <HydratedRouter> element"),n}function uk(n,a){let i=b.useContext(Vf),[l,c]=b.useState(!1),[d,f]=b.useState(!1),{onFocus:m,onBlur:p,onMouseEnter:v,onMouseLeave:g,onTouchStart:y}=a,x=b.useRef(null);b.useEffect(()=>{if(n==="render"&&f(!0),n==="viewport"){let j=C=>{C.forEach(A=>{f(A.isIntersecting)})},N=new IntersectionObserver(j,{threshold:.5});return x.current&&N.observe(x.current),()=>{N.disconnect()}}},[n]),b.useEffect(()=>{if(l){let j=setTimeout(()=>{f(!0)},100);return()=>{clearTimeout(j)}}},[l]);let S=()=>{c(!0)},T=()=>{c(!1),f(!1)};return i?n!=="intent"?[d,x,{}]:[d,x,{onFocus:Lo(m,S),onBlur:Lo(p,T),onMouseEnter:Lo(v,S),onMouseLeave:Lo(g,T),onTouchStart:Lo(y,S)}]:[!1,x,{}]}function Lo(n,a){return i=>{n&&n(i),i.defaultPrevented||a(i)}}function dk({page:n,...a}){let{router:i}=$0(),l=b.useMemo(()=>A0(i.routes,n,i.basename),[i.routes,n,i.basename]);return l?b.createElement(hk,{page:n,matches:l,...a}):null}function fk(n){let{manifest:a,routeModules:i}=q0(),[l,c]=b.useState([]);return b.useEffect(()=>{let d=!1;return sk(n,a,i).then(f=>{d||c(f)}),()=>{d=!0}},[n,a,i]),l}function hk({page:n,matches:a,...i}){let l=wt(),{future:c,manifest:d,routeModules:f}=q0(),{basename:m}=$0(),{loaderData:p,matches:v}=ck(),g=b.useMemo(()=>Hg(n,a,v,d,l,"data"),[n,a,v,d,l]),y=b.useMemo(()=>Hg(n,a,v,d,l,"assets"),[n,a,v,d,l]),x=b.useMemo(()=>{if(n===l.pathname+l.search+l.hash)return[];let j=new Set,N=!1;if(a.forEach(A=>{var R;let E=d.routes[A.route.id];!E||!E.hasLoader||(!g.some(w=>w.route.id===A.route.id)&&A.route.id in p&&((R=f[A.route.id])!=null&&R.shouldRevalidate)||E.hasClientLoader?N=!0:j.add(A.route.id))}),j.size===0)return[];let C=tk(n,m,c.unstable_trailingSlashAwareDataRequests,"data");return N&&j.size>0&&C.searchParams.set("_routes",a.filter(A=>j.has(A.route.id)).map(A=>A.route.id).join(",")),[C.pathname+C.search]},[m,c.unstable_trailingSlashAwareDataRequests,p,l,d,g,a,n,f]),S=b.useMemo(()=>ik(y,d),[y,d]),T=fk(y);return b.createElement(b.Fragment,null,x.map(j=>b.createElement("link",{key:j,rel:"prefetch",as:"fetch",href:j,...i})),S.map(j=>b.createElement("link",{key:j,rel:"modulepreload",href:j,...i})),T.map(({key:j,link:N})=>b.createElement("link",{key:j,nonce:i.nonce,...N,crossOrigin:N.crossOrigin??i.crossOrigin})))}function mk(...n){return a=>{n.forEach(i=>{typeof i=="function"?i(a):i!=null&&(i.current=a)})}}var pk=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";try{pk&&(window.__reactRouterVersion="7.13.2")}catch{}function vk({basename:n,children:a,unstable_useTransitions:i,window:l}){let c=b.useRef();c.current==null&&(c.current=F1({window:l,v5Compat:!0}));let d=c.current,[f,m]=b.useState({action:d.action,location:d.location}),p=b.useCallback(v=>{i===!1?m(v):b.startTransition(()=>m(v))},[i]);return b.useLayoutEffect(()=>d.listen(p),[d,p]),b.createElement($T,{basename:n,children:a,location:f.location,navigationType:f.action,navigator:d,unstable_useTransitions:i})}var Y0=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Hf=b.forwardRef(function({onClick:a,discover:i="render",prefetch:l="none",relative:c,reloadDocument:d,replace:f,unstable_mask:m,state:p,target:v,to:g,preventScrollReset:y,viewTransition:x,unstable_defaultShouldRevalidate:S,...T},j){let{basename:N,navigator:C,unstable_useTransitions:A}=b.useContext(dn),E=typeof g=="string"&&Y0.test(g),R=B0(g,N);g=R.to;let w=NT(g,{relative:c}),H=wt(),I=null;if(m){let ne=lc(m,[],H.unstable_mask?H.unstable_mask.pathname:"/",!0);N!=="/"&&(ne.pathname=ne.pathname==="/"?N:Pn([N,ne.pathname])),I=C.createHref(ne)}let[U,q,ee]=uk(l,T),ae=xk(g,{replace:f,unstable_mask:m,state:p,target:v,preventScrollReset:y,relative:c,viewTransition:x,unstable_defaultShouldRevalidate:S,unstable_useTransitions:A});function ce(ne){a&&a(ne),ne.defaultPrevented||ae(ne)}let re=!(R.isExternal||d),K=b.createElement("a",{...T,...ee,href:(re?I:void 0)||R.absoluteURL||w,onClick:re?ce:a,ref:mk(j,q),target:v,"data-discover":!E&&i==="render"?"true":void 0});return U&&!E?b.createElement(b.Fragment,null,K,b.createElement(dk,{page:w})):K});Hf.displayName="Link";var gk=b.forwardRef(function({"aria-current":a="page",caseSensitive:i=!1,className:l="",end:c=!1,style:d,to:f,viewTransition:m,children:p,...v},g){let y=rl(f,{relative:v.relative}),x=wt(),S=b.useContext(rc),{navigator:T,basename:j}=b.useContext(dn),N=S!=null&&Ck(y)&&m===!0,C=T.encodeLocation?T.encodeLocation(y).pathname:y.pathname,A=x.pathname,E=S&&S.navigation&&S.navigation.location?S.navigation.location.pathname:null;i||(A=A.toLowerCase(),E=E?E.toLowerCase():null,C=C.toLowerCase()),E&&j&&(E=ga(E,j)||E);const R=C!=="/"&&C.endsWith("/")?C.length-1:C.length;let w=A===C||!c&&A.startsWith(C)&&A.charAt(R)==="/",H=E!=null&&(E===C||!c&&E.startsWith(C)&&E.charAt(C.length)==="/"),I={isActive:w,isPending:H,isTransitioning:N},U=w?a:void 0,q;typeof l=="function"?q=l(I):q=[l,w?"active":null,H?"pending":null,N?"transitioning":null].filter(Boolean).join(" ");let ee=typeof d=="function"?d(I):d;return b.createElement(Hf,{...v,"aria-current":U,className:q,ref:g,style:ee,to:f,viewTransition:m},typeof p=="function"?p(I):p)});gk.displayName="NavLink";var yk=b.forwardRef(({discover:n="render",fetcherKey:a,navigate:i,reloadDocument:l,replace:c,state:d,method:f=Pr,action:m,onSubmit:p,relative:v,preventScrollReset:g,viewTransition:y,unstable_defaultShouldRevalidate:x,...S},T)=>{let{unstable_useTransitions:j}=b.useContext(dn),N=Tk(),C=kk(m,{relative:v}),A=f.toLowerCase()==="get"?"get":"post",E=typeof m=="string"&&Y0.test(m),R=w=>{if(p&&p(w),w.defaultPrevented)return;w.preventDefault();let H=w.nativeEvent.submitter,I=(H==null?void 0:H.getAttribute("formmethod"))||f,U=()=>N(H||w.currentTarget,{fetcherKey:a,method:I,navigate:i,replace:c,state:d,relative:v,preventScrollReset:g,viewTransition:y,unstable_defaultShouldRevalidate:x});j&&i!==!1?b.startTransition(()=>U()):U()};return b.createElement("form",{ref:T,method:A,action:C,onSubmit:l?p:R,...S,"data-discover":!E&&n==="render"?"true":void 0})});yk.displayName="Form";function bk(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function K0(n){let a=b.useContext(Ii);return ot(a,bk(n)),a}function xk(n,{target:a,replace:i,unstable_mask:l,state:c,preventScrollReset:d,relative:f,viewTransition:m,unstable_defaultShouldRevalidate:p,unstable_useTransitions:v}={}){let g=cc(),y=wt(),x=rl(n,{relative:f});return b.useCallback(S=>{if(XT(S,a)){S.preventDefault();let T=i!==void 0?i:Jo(y)===Jo(x),j=()=>g(n,{replace:T,unstable_mask:l,state:c,preventScrollReset:d,relative:f,viewTransition:m,unstable_defaultShouldRevalidate:p});v?b.startTransition(()=>j()):j()}},[y,g,x,i,l,c,a,n,d,f,m,p,v])}function Gf(n){wn(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 a=b.useRef(cf(n)),i=b.useRef(!1),l=wt(),c=b.useMemo(()=>QT(l.search,i.current?null:a.current),[l.search]),d=cc(),f=b.useCallback((m,p)=>{const v=cf(typeof m=="function"?m(new URLSearchParams(c)):m);i.current=!0,d("?"+v,p)},[d,c]);return[c,f]}var _k=0,Sk=()=>`__${String(++_k)}__`;function Tk(){let{router:n}=K0("useSubmit"),{basename:a}=b.useContext(dn),i=VT(),l=n.fetch,c=n.navigate;return b.useCallback(async(d,f={})=>{let{action:m,method:p,encType:v,formData:g,body:y}=ek(d,a);if(f.navigate===!1){let x=f.fetcherKey||Sk();await l(x,i,f.action||m,{unstable_defaultShouldRevalidate:f.unstable_defaultShouldRevalidate,preventScrollReset:f.preventScrollReset,formData:g,body:y,formMethod:f.method||p,formEncType:f.encType||v,flushSync:f.flushSync})}else await c(f.action||m,{unstable_defaultShouldRevalidate:f.unstable_defaultShouldRevalidate,preventScrollReset:f.preventScrollReset,formData:g,body:y,formMethod:f.method||p,formEncType:f.encType||v,replace:f.replace,state:f.state,fromRouteId:i,flushSync:f.flushSync,viewTransition:f.viewTransition})},[l,c,a,i])}function kk(n,{relative:a}={}){let{basename:i}=b.useContext(dn),l=b.useContext(En);ot(l,"useFormAction must be used inside a RouteContext");let[c]=l.matches.slice(-1),d={...rl(n||".",{relative:a})},f=wt();if(n==null){d.search=f.search;let m=new URLSearchParams(d.search),p=m.getAll("index");if(p.some(g=>g==="")){m.delete("index"),p.filter(y=>y).forEach(y=>m.append("index",y));let g=m.toString();d.search=g?`?${g}`:""}}return(!n||n===".")&&c.route.index&&(d.search=d.search?d.search.replace(/^\?/,"?index&"):"?index"),i!=="/"&&(d.pathname=d.pathname==="/"?i:Pn([i,d.pathname])),Jo(d)}function Ck(n,{relative:a}={}){let i=b.useContext(I0);ot(i!=null,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:l}=K0("useViewTransitionState"),c=rl(n,{relative:a});if(!i.isTransitioning)return!1;let d=ga(i.currentLocation.pathname,l)||i.currentLocation.pathname,f=ga(i.nextLocation.pathname,l)||i.nextLocation.pathname;return el(c.pathname,f)!=null||el(c.pathname,d)!=null}function Rt(){const n=cc();return b.useCallback((a,i)=>{typeof a=="number"?n(a):n(a,i)},[n])}function F0(n){return`/sessions/${encodeURIComponent(n)}`}function Ei(n,a){return a?`/environments/${encodeURIComponent(a)}/workspaces/${encodeURIComponent(n)}`:`/workspaces/${encodeURIComponent(n)}`}function ya(n,a,i,l){const c=encodeURIComponent(n);let d;return i&&l?d=`/environments/${encodeURIComponent(l)}/workspaces/${encodeURIComponent(i)}/tasks/${c}`:i?d=`/workspaces/${encodeURIComponent(i)}/tasks/${c}`:d=`/tasks/${c}`,a?`${d}/${a}`:d}function jk(n,a,i){return a&&i?`/environments/${encodeURIComponent(i)}/workspaces/${encodeURIComponent(a)}/tasks/${encodeURIComponent(n)}/edit`:a?`/workspaces/${encodeURIComponent(a)}/tasks/${encodeURIComponent(n)}/edit`:`/tasks/${encodeURIComponent(n)}/edit`}function zi(n,a,i){const l=new URLSearchParams;n&&l.set("workspace",n),a&&l.set("parent",a);const c=l.toString();if(n&&i){const d=`/environments/${encodeURIComponent(i)}/workspaces/${encodeURIComponent(n)}/tasks/new`;return a?`${d}?parent=${encodeURIComponent(a)}`:d}return c?`/tasks/new?${c}`:"/tasks/new"}function Z0(n){return`/sessions/new?${new URLSearchParams({env:n}).toString()}`}const Ai="/environments",Nk="/environments/new";function Di(n){return`/environments/${encodeURIComponent(n)}`}function wk(n){return`/environments/${encodeURIComponent(n)}/edit`}const Yo="/settings",Ek="/settings/credentials",Ak="/pair",Dk="/chat",Cs="/",Rk="/tasks",X0="/workspaces/new",Q0="/knowledge";function Mk(n,a){const i=typeof window<"u"?`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}`:"ws://localhost:3000",l=b.useRef(void 0),[c,d]=b.useState(!1),f=b.useRef(a.onMessage);f.current=a.onMessage;const m=b.useRef(a.onConnect);m.current=a.onConnect;const p=b.useRef(a.onDisconnect);p.current=a.onDisconnect;const v=b.useCallback(g=>{var y;((y=l.current)==null?void 0:y.readyState)===WebSocket.OPEN&&l.current.send(JSON.stringify(g))},[]);return b.useEffect(()=>{let g,y;function x(){g=new WebSocket(i),l.current=g,g.onopen=()=>{d(!0),m.current(v)},g.onmessage=S=>{if(typeof S.data!="string"){console.warn("[ws] Received non-string WebSocket message; ignoring");return}const T=q1(S.data);T&&f.current(T)},g.onclose=S=>{var T;if(d(!1),l.current=void 0,(T=p.current)==null||T.call(p),clearTimeout(y),S.code===K1){window.location.href=Ak;return}y=setTimeout(x,Y1)},g.onerror=()=>{g.close()}}return x(),()=>{clearTimeout(y),g==null||g.close()}},[i,v]),{connected:c,send:v}}const Ok=new Proxy(globalThis.fetch,{apply(n,a,i){return Reflect.apply(globalThis.fetch,a,i)}}),Bk=k1({baseUrl:"/",fetch:Ok}),Ce=C1(j1,Bk);function Lk(n){return{id:n.id,displayName:n.displayName,adapterType:n.adapterType,adapterConfig:n.adapterConfig||"{}",status:n.status,bootstrapped:n.bootstrapped}}function Gg(n){return{id:n.id,environmentId:n.environmentId,runtime:n.runtime,status:n.status,prompt:n.prompt,startedAt:n.startedAt,endedAt:n.endedAt||void 0,error:n.error||void 0,endReason:n.endReason||void 0,personaId:n.personaId||void 0,inputTokens:n.inputTokens,outputTokens:n.outputTokens,costUsd:n.costUsd}}function Ik(n){return{sessionId:n.sessionId,eventType:N1(n.type),timestamp:n.timestamp,content:n.content,raw:n.raw||void 0}}function zk(n){return{id:n.id,name:n.name,description:n.description,repoUrl:n.repoUrl,environmentId:n.environmentId,status:w1(n.status),workingDirectory:n.workingDirectory,useWorktrees:n.useWorktrees,defaultPersonaId:n.defaultPersonaId,createdAt:n.createdAt,updatedAt:n.updatedAt}}function Pg(n){return{id:n.id,workspaceId:n.workspaceId??void 0,title:n.title,description:n.description,status:E1(n.status),branch:n.branch,latestSessionId:n.latestSessionId,dependsOn:[...n.dependsOn],sortOrder:n.sortOrder,createdAt:n.createdAt,startedAt:n.startedAt||void 0,completedAt:n.completedAt||void 0,parentTaskId:n.parentTaskId,depth:n.depth,childTaskIds:[...n.childTaskIds],canDecompose:n.canDecompose,defaultPersonaId:n.defaultPersonaId}}function Uk(n){return{id:n.id,workspaceId:n.workspaceId,taskId:n.taskId,sessionId:n.sessionId,category:n.category,title:n.title,content:n.content,tags:[...n.tags],createdAt:n.createdAt}}function Vk(n){return{name:n.name,tokenType:n.type,envVar:n.envVar,filePath:n.filePath,expiresAt:n.expiresAt}}function Hk(n){return{claude:A1(n.claude),github:Dr(n.github),copilot:Dr(n.copilot),codex:Dr(n.codex),goose:Dr(n.goose)}}function Gk(n){return{name:n.name,repository:n.repository,state:n.state,gitStatus:n.gitStatus}}function Pk(n){return{id:n.id,name:n.name,description:n.description,systemPrompt:n.systemPrompt,toolConfig:n.toolConfig?JSON.stringify({allowedTools:[...n.toolConfig.allowedTools],disallowedTools:[...n.toolConfig.disallowedTools]}):"{}",runtime:n.runtime,model:n.model,maxTurns:n.maxTurns,mcpServers:JSON.stringify(n.mcpServers.map(a=>({name:a.name,command:a.command,args:[...a.args],tools:[...a.tools]}))),createdAt:n.createdAt,updatedAt:n.updatedAt,type:n.type||"agent",script:n.script}}function $k(n){return{inputTokens:n.inputTokens,outputTokens:n.outputTokens,costUsd:n.costUsd,sessionCount:n.sessionCount}}const $g=5e3;function qk(){const[n,a]=b.useState([]),[i,l]=b.useState({}),c=b.useCallback(()=>{Ce.listEnvironments({}).then(x=>{a(x.environments.map(Lk))},()=>{})},[]),d=b.useCallback(x=>{switch(x.type){case"environment.added":return!0;case"environment.removed":{const S=x.payload.environmentId;return S&&(a(T=>T.filter(j=>j.id!==S)),l(T=>{const j={...T};return delete j[S],j})),!0}case"environment.changed":return c(),!0;case"environment.provision_progress":{const S=x.payload;if(typeof S.environmentId!="string"||typeof S.stage!="string"||typeof S.message!="string"||typeof S.progress!="number")return N0("environment.provision_progress","invalid payload"),!0;if(l(T=>({...T,[S.environmentId]:{stage:S.stage,message:S.message,progress:S.progress}})),S.stage==="ready"){const T=S.environmentId;setTimeout(()=>{l(j=>{const N={...j};return delete N[T],N})},$g)}return!0}default:return!1}},[c]),f=b.useCallback(x=>{var S;if(x.type==="environments"){const T=Array.isArray((S=x.payload)==null?void 0:S.environments)?x.payload.environments:[];return a(T),!0}return!1},[]),m=b.useCallback((x,S,T)=>{Ce.addEnvironment({displayName:x,adapterType:S,adapterConfig:JSON.stringify(T??{})}).catch(()=>{})},[]),p=b.useCallback((x,S)=>{Ce.updateEnvironment({id:x,displayName:S.displayName,adapterConfig:S.adapterConfig?JSON.stringify(S.adapterConfig):void 0}).catch(()=>{})},[]),v=b.useCallback(x=>{(async()=>{try{const T=Ce.provisionEnvironment({id:x});for await(const j of T)l(N=>({...N,[x]:{stage:j.stage,message:j.message,progress:j.progress}})),j.stage==="ready"&&setTimeout(()=>{l(N=>{const C={...N};return delete C[x],C})},$g)}catch{l(T=>{const j={...T};return delete j[x],j})}})().catch(()=>{})},[]),g=b.useCallback(x=>{Ce.stopEnvironment({id:x}).catch(()=>{})},[]),y=b.useCallback(x=>{Ce.removeEnvironment({id:x}).catch(()=>{})},[]);return{environments:n,provisionStatus:i,loadEnvironments:c,addEnvironment:m,updateEnvironment:p,provisionEnvironment:v,stopEnvironment:g,removeEnvironment:y,handleEvent:d,handleLegacyMessage:f}}const zd=new Set(["pending","running","idle"]),Yk=new Set(["completed","failed","interrupted","hibernating","suspended"]),qg=["pending","running","idle"];function Kk(){const[n,a]=b.useState([]),[i,l]=b.useState([]),[c,d]=b.useState(0),[f,m]=b.useState(void 0),[p,v]=b.useState({}),g=b.useCallback(()=>{Ce.listSessions({}).then(E=>{const R=E.sessions.map(Gg);a(w=>{const H=new Map(w.map(I=>[I.id,I]));return R.map(I=>{const U=H.get(I.id),q=U==null?void 0:U.status;return!q||q===I.status?I:Yk.has(q)&&zd.has(I.status)?{...I,status:q,...U.endReason!==void 0?{endReason:U.endReason}:{}}:zd.has(q)&&zd.has(I.status)&&qg.indexOf(q)>qg.indexOf(I.status)?{...I,status:q}:I})})},()=>{})},[]),y=b.useCallback(E=>{if(E.type!=="session_event")return!1;if(!G1(E.payload))return N0("session_event","payload is not a valid SessionEvent"),!0;const R=E.payload;let w=0;if(l(H=>{const I=[...H,R];return I.length>bi?(w=I.length-bi,I.slice(-bi)):I}),w>0&&d(H=>H+w),R.eventType==="usage")try{const H=JSON.parse(R.content),I=Number(H.input_tokens)||0,U=Number(H.output_tokens)||0,q=Number(H.cost_usd)||0;(I>0||U>0||q>0)&&a(ee=>ee.map(ae=>ae.id===R.sessionId?{...ae,inputTokens:(ae.inputTokens??0)+I,outputTokens:(ae.outputTokens??0)+U,costUsd:(ae.costUsd??0)+q}:ae))}catch{}if(R.eventType==="status"){const H=w0(R.content),I=E0(R.content);a(U=>U.some(ee=>ee.id===R.sessionId)?U.map(ee=>ee.id===R.sessionId?{...ee,status:H,...I!==void 0?{endReason:I}:{}}:ee):[...U,{id:R.sessionId,environmentId:"",runtime:"",status:H,prompt:"",startedAt:R.timestamp,...I!==void 0?{endReason:I}:{}}])}return!0},[]),x=b.useCallback(E=>{var R,w,H,I,U;switch(E.type){case"sessions":{const q=Array.isArray((R=E.payload)==null?void 0:R.sessions)?E.payload.sessions:[];return a(q),!0}case"spawned":{const q=(w=E.payload)==null?void 0:w.sessionId;return typeof q=="string"&&q&&m(q),g(),!0}case"session_events":{const q=Array.isArray((H=E.payload)==null?void 0:H.events)?E.payload.events:[];return q.length>0&&l(q),!0}case"task_sessions":{const q=(I=E.payload)==null?void 0:I.taskId;if(typeof q=="string"&&q){const ee=Array.isArray((U=E.payload)==null?void 0:U.sessions)?E.payload.sessions:[];v(ae=>({...ae,[q]:ee}))}return!0}default:return!1}},[g]),S=b.useCallback((E,R,w,H)=>{Ce.spawnAgent({environmentId:E,prompt:R,personaId:w||"",workingDirectory:H||""}).then(I=>{m(I.id),g()},()=>{})},[g]),T=b.useCallback((E,R)=>{Ce.sendInput({sessionId:E,text:R}).catch(()=>{})},[]),j=b.useCallback(E=>{Ce.killAgent({id:E}).catch(()=>{})},[]),N=b.useCallback(E=>{Ce.getSessionEvents({id:E}).then(R=>{const w=R.events.map(Ik);if(w.length>0){let H=0;l(I=>{const U=new Set;for(const ae of I)ae.sessionId===E&&U.add(`${ae.timestamp}|${ae.eventType}`);const q=w.filter(ae=>!U.has(`${ae.timestamp}|${ae.eventType}`)),ee=[...I,...q].sort((ae,ce)=>ae.sessionId!==ce.sessionId?0:ae.timestamp.localeCompare(ce.timestamp));return ee.length>bi?(H=ee.length-bi,ee.slice(-bi)):ee}),H>0&&d(I=>I+H)}},()=>{})},[]),C=b.useCallback(()=>{l([]),d(0)},[]),A=b.useCallback(E=>{Ce.getTaskSessions({id:E}).then(R=>{const w=R.sessions.map(Gg);v(H=>({...H,[E]:w}))},()=>{})},[]);return{sessions:n,events:i,eventsDropped:c,lastSpawnedId:f,taskSessions:p,loadSessions:g,spawn:S,sendInput:T,kill:j,loadSessionEvents:N,clearEvents:C,loadTaskSessions:A,handleMessage:y,handleLegacyMessage:x}}function Fk(){const[n,a]=b.useState([]),[i,l]=b.useState(!1),c=b.useCallback(()=>{Ce.listWorkspaces({}).then(g=>{a(g.workspaces.map(zk))},()=>{})},[]),d=b.useCallback(g=>{switch(g.type){case"workspace.created":return l(!1),c(),!0;case"workspace.archived":case"workspace.updated":return c(),!0;default:return!1}},[c]),f=b.useCallback(()=>{l(!1)},[]),m=b.useCallback((g,y,x,S,T,j,N,C,A)=>{l(!0),Ce.createWorkspace({name:g,description:y||"",repoUrl:x||"",environmentId:S||"",defaultPersonaId:T||void 0,useWorktrees:j??!0,workingDirectory:N||void 0}).then(()=>{l(!1),C==null||C()},E=>{l(!1);const R=E instanceof Of?E.message:"Failed to create workspace";A==null||A(R)})},[]),p=b.useCallback(g=>{Ce.archiveWorkspace({id:g}).catch(()=>{})},[]),v=b.useCallback((g,y)=>{Ce.updateWorkspace({id:g,...y}).catch(()=>{})},[]);return{workspaces:n,workspaceCreating:i,loadWorkspaces:c,createWorkspace:m,archiveWorkspace:p,updateWorkspace:v,handleEvent:d,onDisconnect:f}}function Zk(){const[n,a]=b.useState([]),[i,l]=b.useState(void 0),c=b.useCallback(C=>{Ce.listTasks({workspaceId:C}).then(A=>{const E=A.tasks.map(Pg);a(R=>[...R.filter(w=>w.workspaceId!==C),...E])},()=>{})},[]),d=b.useCallback(()=>{Ce.listTasks({}).then(C=>{const A=C.tasks.map(Pg);a(E=>{const R=new Set(A.map(w=>w.id));return[...E.filter(w=>!R.has(w.id)),...A]})},()=>{})},[]),f=b.useCallback((C,A)=>{C?c(C):A&&a(E=>{const R=E.find(w=>w.id===A);return R!=null&&R.workspaceId?c(R.workspaceId):d(),E})},[c,d]),m=b.useCallback(C=>{const A=C.payload;switch(C.type){case"task.created":{const E=typeof A.workspaceId=="string"?A.workspaceId:"";return E&&c(E),!0}case"task.started":{const E=typeof A.taskId=="string"?A.taskId:"",R=typeof A.sessionId=="string"?A.sessionId:"",w=typeof A.workspaceId=="string"?A.workspaceId:"";return l(H=>E&&H===E?void 0:H),R&&E&&a(H=>H.map(I=>I.id===E?{...I,latestSessionId:R}:I)),f(w,E),!0}case"task.completed":case"task.deleted":case"task.updated":{const E=typeof A.workspaceId=="string"?A.workspaceId:"",R=typeof A.taskId=="string"?A.taskId:"";return f(E,R),!0}default:return!1}},[c,f]),p=b.useCallback(()=>{l(void 0)},[]),v=b.useCallback(C=>{var A,E;if(C.type==="tasks"){const R=Array.isArray((A=C.payload)==null?void 0:A.tasks)?C.payload.tasks:[],w=typeof((E=C.payload)==null?void 0:E.workspaceId)=="string"&&C.payload.workspaceId?C.payload.workspaceId:"";return a(w?H=>[...H.filter(I=>I.workspaceId!==w),...R]:H=>{const I=new Set(R.map(U=>U.id));return[...H.filter(U=>!I.has(U.id)),...R]}),!0}return!1},[]),g=b.useCallback((C,A,E,R,w,H,I,U,q)=>{Ce.createTask({workspaceId:C,title:A,description:E||"",dependsOn:R||[],parentTaskId:w||"",defaultPersonaId:H||void 0,canDecompose:I??void 0}).then(()=>{U==null||U()},ee=>{const ae=ee instanceof Of?ee.message:"Failed to create task";q==null||q(ae)})},[]),y=b.useCallback((C,A,E,R)=>{l(C),Ce.startTask({taskId:C,personaId:A||"",environmentId:E||"",notes:R||""}).catch(()=>{l(void 0)})},[]),x=b.useCallback(C=>{Ce.stopTask({id:C}).catch(()=>{})},[]),S=b.useCallback(C=>{Ce.completeTask({id:C}).catch(()=>{})},[]),T=b.useCallback(C=>{Ce.resumeTask({id:C}).catch(()=>{})},[]),j=b.useCallback((C,A,E,R,w)=>{Ce.updateTask({id:C,title:A,description:E,dependsOn:R,...w!==void 0?{defaultPersonaId:w}:{}}).catch(()=>{})},[]),N=b.useCallback(C=>{Ce.deleteTask({id:C}).catch(()=>{})},[]);return{tasks:n,taskStartingId:i,loadTasks:c,loadAllTasks:d,createTask:g,startTask:y,stopTask:x,completeTask:S,resumeTask:T,updateTask:j,deleteTask:N,handleEvent:m,onDisconnect:p,handleLegacyMessage:v}}function Xk(){const[n,a]=b.useState([]),i=b.useCallback(d=>{Ce.queryFindings({workspaceId:d}).then(f=>{a(f.findings.map(Uk))},()=>{})},[]),l=b.useCallback(d=>{if(d.type==="finding.posted"){const f=typeof d.payload.workspaceId=="string"?d.payload.workspaceId:"";return f&&i(f),!0}return!1},[i]),c=b.useCallback((d,f,m,p,v)=>{Ce.postFinding({workspaceId:d,title:f,content:m,category:p??"general",tags:v??[]}).catch(()=>{})},[]);return{findings:n,loadFindings:i,postFinding:c,handleEvent:l}}function Qk(){const[n,a]=b.useState([]),i=b.useCallback(()=>{Ce.listTokens({}).then(f=>{a(f.tokens.map(Vk))},()=>{})},[]),l=b.useCallback(f=>f.type==="token.changed"?(i(),!0):!1,[i]),c=b.useCallback((f,m,p,v,g)=>{Ce.setToken({name:f,value:m,type:p,envVar:v,filePath:g}).catch(()=>{})},[]),d=b.useCallback(f=>{Ce.deleteToken({name:f}).catch(()=>{})},[]);return{tokens:n,loadTokens:i,setToken:c,deleteToken:d,handleEvent:l}}function Wk(){const[n,a]=b.useState({claude:"off",github:"off",copilot:"off",codex:"off",goose:"off"}),i=b.useCallback(()=>{Ce.getCredentialProviders({}).then(d=>{a(Hk(d))},()=>{})},[]),l=b.useCallback(d=>d.type==="credential.providers_changed"?($1(d.payload)&&a(d.payload),!0):!1,[]),c=b.useCallback(d=>{const f=[{provider:"claude",value:d.claude},{provider:"github",value:d.github},{provider:"copilot",value:d.copilot},{provider:"codex",value:d.codex},{provider:"goose",value:d.goose}];for(const{provider:m,value:p}of f)Ce.setCredentialProvider({provider:m,value:p}).catch(()=>{})},[]);return{credentialProviders:n,loadCredentials:i,updateCredentialProviders:c,handleEvent:l}}function Jk(){const[n,a]=b.useState([]),[i,l]=b.useState(""),[c,d]=b.useState(""),[f,m]=b.useState(!1),p=b.useCallback(()=>{Ce.listCodespaces({}).then(g=>{a(g.codespaces.map(Gk)),d(g.error)},()=>{})},[]),v=b.useCallback((g,y)=>{m(!0),l(""),Ce.createCodespace({repo:g,machine:y??""}).then(()=>{m(!1),p()},x=>{m(!1);const S=x instanceof Of?x.message:"Failed to create codespace";l(S)})},[p]);return{codespaces:n,codespaceError:i,codespaceListError:c,codespaceCreating:f,listCodespaces:p,createCodespace:v}}function eC(){const[n,a]=b.useState([]),i=b.useCallback(()=>{Ce.listPersonas({}).then(m=>{a(m.personas.map(Pk))},()=>{})},[]),l=b.useCallback(m=>{switch(m.type){case"persona.created":case"persona.updated":case"persona.deleted":return i(),!0;default:return!1}},[i]),c=b.useCallback((m,p,v,g,y,x,S,T)=>{Ce.createPersona({name:m,description:p,systemPrompt:v,runtime:g||"",model:y||"",maxTurns:x||0,type:S||"agent",script:T||""}).catch(()=>{})},[]),d=b.useCallback((m,p,v,g,y,x,S,T,j)=>{const N={id:m};p!==void 0&&(N.name=p),v!==void 0&&(N.description=v),g!==void 0&&(N.systemPrompt=g),y!==void 0&&(N.runtime=y),x!==void 0&&(N.model=x),S!==void 0&&(N.maxTurns=S),T!==void 0&&(N.type=T),j!==void 0&&(N.script=j),Ce.updatePersona(N).catch(()=>{})},[]),f=b.useCallback(m=>{Ce.deletePersona({id:m}).catch(()=>{})},[]);return{personas:n,loadPersonas:i,createPersona:c,updatePersona:d,deletePersona:f,handleEvent:l}}function Or(n,a=0){return{id:n.id,label:n.title||n.label||n.id,kind:n.kind,category:n.category,sourceType:n.sourceType,sourceId:n.sourceId,content:n.content,tags:n.tags,workspaceId:n.workspaceId,createdAt:n.createdAt,updatedAt:n.updatedAt,val:a}}function Ud(n){return{source:n.fromId,target:n.toId,type:n.type}}const tC=new Set(["knowledge.listRecent.result","knowledge.search.result","knowledge.getNode.result","knowledge.expand.result"]);function nC(n){const[a,i]=b.useState(new Map),[l,c]=b.useState([]),[d,f]=b.useState(void 0),[m,p]=b.useState(void 0),[v,g]=b.useState(!1),[y,x]=b.useState(""),S=b.useCallback(R=>{g(!0),n({type:"knowledge.listRecent",payload:{limit:30,workspaceId:R}})},[n]),T=b.useCallback(R=>{R.trim()&&(x(R),p(void 0),f(void 0),g(!0),n({type:"knowledge.search",payload:{query:R,limit:20}}))},[n]),j=b.useCallback(()=>{x(""),S()},[S]),N=b.useCallback(R=>{p(R),n({type:"knowledge.getNode",payload:{id:R}})},[n]),C=b.useCallback(()=>{p(void 0),f(void 0)},[]),A=b.useCallback(R=>{n({type:"knowledge.expand",payload:{id:R,depth:1}})},[n]),E=b.useCallback(R=>{if(!tC.has(R.type))return!1;const w=R.payload??{};switch(R.type){case"knowledge.listRecent.result":{if(w.error)return g(!1),!0;const H=w.nodes??[],I=w.edges??[],U=new Map,q=[];for(const ee of H)U.set(ee.id,Or(ee));for(const ee of I)q.push(Ud(ee));for(const ee of q){const ae=U.get(ee.source);ae&&(ae.val+=1);const ce=U.get(ee.target);ce&&(ce.val+=1)}return i(U),c(q),g(!1),!0}case"knowledge.search.result":{if(w.error)return g(!1),!0;const H=w.results??[],I=new Map,U=[];for(const q of H){const ee=q.node,ae=q.edges??[];I.set(ee.id,Or(ee,ae.length));for(const ce of ae)U.push(Ud(ce))}return i(I),c(U),g(!1),!0}case"knowledge.getNode.result":{if(w.error)return f(void 0),!0;const H=w.node,I=w.edges??[];return f({node:Or(H,I.length),edges:I.map(U=>({fromId:U.fromId,toId:U.toId,type:U.type,metadata:U.metadata}))}),!0}case"knowledge.expand.result":{const H=w.nodes??[],I=w.edges??[];return i(U=>{const q=new Map(U);for(const ee of H)q.has(ee.id)||q.set(ee.id,Or(ee));return q}),c(U=>{const q=new Set(U.map(ae=>`${ae.source}:${ae.target}:${ae.type}`)),ee=[];for(const ae of I){const ce=Ud(ae),re=`${ce.source}:${ce.target}:${ce.type}`;q.has(re)||ee.push(ce)}return[...U,...ee]}),!0}}return!1},[]);return{graphData:{nodes:[...a.values()],links:l},selectedNode:d,selectedId:m,loading:v,searchQuery:y,search:T,clearSearch:j,selectNode:N,clearSelection:C,expandNode:A,loadRecent:S,handleMessage:E}}function aC(n){const[a,i]=b.useState(""),[l,c]=b.useState(void 0),[d,f]=b.useState({}),{connected:m,send:p}=Mk(n,{onMessage:q,onConnect:ee,onDisconnect:ae}),v=qk(),g=Kk(),y=Fk(),x=Zk(),S=Xk(),T=Qk(),j=Wk(),N=Jk(),C=eC(),A=nC(p),E="default_persona_id",R="onboarding_completed",w=b.useCallback(re=>{i(re),Ce.setSetting({key:E,value:re}).catch(()=>{})},[]),H=b.useCallback(()=>{c(!0),Ce.setSetting({key:R,value:"true"}).catch(()=>{})},[]),I=b.useCallback((re,K)=>{Ce.getUsage({scope:re,id:K}).then(ne=>{const O=`${re}:${K}`;f(P=>({...P,[O]:$k(ne)}))},()=>{})},[]);function U(re){const K=re.payload.key,ne=re.payload.value;if(re.type==="setting.changed"){K===E&&i(ne??""),K===R&&c(ne==="true");return}if(v.handleEvent(re)){(re.type==="environment.removed"||re.type==="environment.changed")&&g.loadSessions();return}if(!y.handleEvent(re)){if(x.handleEvent(re)){re.type==="task.started"&&g.loadSessions();return}S.handleEvent(re)||T.handleEvent(re)||j.handleEvent(re)||C.handleEvent(re)}}function q(re){var K,ne,O,P;if(H1(re)){U(re);return}if(!g.handleMessage(re)&&!A.handleMessage(re)&&!((K=g.handleLegacyMessage)!=null&&K.call(g,re))&&!((ne=v.handleLegacyMessage)!=null&&ne.call(v,re))&&!((O=x.handleLegacyMessage)!=null&&O.call(x,re))&&re.type==="error"){console.error("[ws]",(P=re.payload)==null?void 0:P.message);return}}function ee(re){v.loadEnvironments(),g.loadSessions(),y.loadWorkspaces(),T.loadTokens(),j.loadCredentials(),C.loadPersonas(),Ce.getSetting({key:E}).then(K=>{i(K.value)},()=>{}),Ce.getSetting({key:R}).then(K=>{c(K.value==="true")},()=>{}),x.loadAllTasks(),re({type:"subscribe_all"})}function ae(){y.onDisconnect(),x.onDisconnect()}const ce=b.useCallback(()=>{v.loadEnvironments(),g.loadSessions(),y.loadWorkspaces(),T.loadTokens()},[v.loadEnvironments,g.loadSessions,y.loadWorkspaces,T.loadTokens]);return{connected:m,send:p,environments:v.environments,sessions:g.sessions,events:g.events,eventsDropped:g.eventsDropped,lastSpawnedId:g.lastSpawnedId,workspaces:y.workspaces,tasks:x.tasks,findings:S.findings,tokens:T.tokens,spawn:g.spawn,sendInput:g.sendInput,kill:g.kill,refresh:ce,loadSessionEvents:g.loadSessionEvents,clearEvents:g.clearEvents,loadWorkspaces:y.loadWorkspaces,createWorkspace:y.createWorkspace,archiveWorkspace:y.archiveWorkspace,updateWorkspace:y.updateWorkspace,loadTasks:x.loadTasks,loadAllTasks:x.loadAllTasks,createTask:x.createTask,startTask:x.startTask,stopTask:x.stopTask,completeTask:x.completeTask,resumeTask:x.resumeTask,updateTask:x.updateTask,deleteTask:x.deleteTask,loadFindings:S.loadFindings,postFinding:S.postFinding,loadEnvironments:v.loadEnvironments,addEnvironment:v.addEnvironment,updateEnvironment:v.updateEnvironment,loadTokens:T.loadTokens,setToken:T.setToken,deleteToken:T.deleteToken,credentialProviders:j.credentialProviders,updateCredentialProviders:j.updateCredentialProviders,provisionStatus:v.provisionStatus,provisionEnvironment:v.provisionEnvironment,stopEnvironment:v.stopEnvironment,removeEnvironment:v.removeEnvironment,codespaces:N.codespaces,codespaceError:N.codespaceError,codespaceListError:N.codespaceListError,codespaceCreating:N.codespaceCreating,listCodespaces:N.listCodespaces,createCodespace:N.createCodespace,workspaceCreating:y.workspaceCreating,taskStartingId:x.taskStartingId,personas:C.personas,createPersona:C.createPersona,updatePersona:C.updatePersona,deletePersona:C.deletePersona,taskSessions:g.taskSessions,loadTaskSessions:g.loadTaskSessions,appDefaultPersonaId:a,setAppDefaultPersonaId:w,onboardingCompleted:l,completeOnboarding:H,usageCache:d,loadUsage:I,knowledge:A}}const Pf=b.createContext(void 0);function sC({children:n}){const a=aC();return r.jsx(Pf.Provider,{value:a,children:n})}function rt(){const n=b.useContext(Pf);if(!n)throw new Error("useGrackle must be used within GrackleProvider");return n}const iC=[{id:"env-local-01",displayName:"Local Dev",adapterType:"local",adapterConfig:"{}",status:"connected",bootstrapped:!0},{id:"env-docker-01",displayName:"Docker Sandbox",adapterType:"docker",adapterConfig:'{"image":"node:20"}',status:"connected",bootstrapped:!0},{id:"env-cs-01",displayName:"GitHub Codespace",adapterType:"codespace",adapterConfig:'{"codespaceName":"my-codespace"}',status:"connected",bootstrapped:!0},{id:"env-remote-01",displayName:"Staging (SSH)",adapterType:"ssh",adapterConfig:'{"host":"192.168.1.10","user":"deploy","sshPort":22}',status:"disconnected",bootstrapped:!1}],oC=[{id:"sess-001-prev",environmentId:"env-local-01",runtime:"claude-code",status:"stopped",endReason:"interrupted",prompt:"Implement auth middleware",startedAt:"2026-02-26T14:00:00Z",endedAt:"2026-02-26T15:12:00Z",error:"Context window exceeded before completing implementation",inputTokens:84200,outputTokens:12750,costUsd:.41},{id:"sess-001",environmentId:"env-local-01",runtime:"claude-code",status:"running",prompt:"Refactor the authentication middleware to use JWT tokens",startedAt:"2026-02-27T08:15:00Z",inputTokens:42600,outputTokens:8100,costUsd:.22},{id:"sess-002",environmentId:"env-docker-01",runtime:"claude-code",status:"stopped",endReason:"completed",prompt:"Write unit tests for the user registration endpoint",startedAt:"2026-02-27T07:30:00Z",endedAt:"2026-02-27T07:33:00Z",inputTokens:31400,outputTokens:9800,costUsd:.18},{id:"sess-003",environmentId:"env-local-01",runtime:"claude-code",status:"stopped",endReason:"interrupted",prompt:"Migrate database schema to add audit_log table",startedAt:"2026-02-26T22:45:00Z",endedAt:"2026-02-26T23:10:00Z",inputTokens:56300,outputTokens:14200,costUsd:.31},{id:"sess-004",environmentId:"env-docker-01",runtime:"claude-code",status:"running",prompt:"Implement rate limiting for the public API",startedAt:"2026-02-27T09:00:00Z",inputTokens:18900,outputTokens:4500,costUsd:.1},{id:"sess-005",environmentId:"env-cs-01",runtime:"claude-code",status:"suspended",prompt:"Refactor database connection pooling for multi-tenant isolation",startedAt:"2026-02-27T06:00:00Z",inputTokens:67800,outputTokens:19300,costUsd:.38}],lC=[{sessionId:"sess-001-prev",eventType:"status",timestamp:"2026-02-26T14:00:01Z",content:"running"},{sessionId:"sess-001-prev",eventType:"output",timestamp:"2026-02-26T14:00:05Z",content:"Reading src/middleware/auth.ts to understand the current authentication flow..."},{sessionId:"sess-001-prev",eventType:"error",timestamp:"2026-02-26T15:12:00Z",content:"Context window exceeded before completing implementation"},{sessionId:"sess-001",eventType:"status",timestamp:"2026-02-27T08:15:01Z",content:"running"},{sessionId:"sess-001",eventType:"output",timestamp:"2026-02-27T08:15:02Z",content:"Analyzing current authentication middleware in src/middleware/auth.ts..."},{sessionId:"sess-001",eventType:"output",timestamp:"2026-02-27T08:15:04Z",content:`Found 3 files using session-based auth:
|
|
38
38
|
- src/middleware/auth.ts
|
|
39
39
|
- src/routes/login.ts
|
|
40
40
|
- src/routes/protected.ts`},{sessionId:"sess-001",eventType:"output",timestamp:"2026-02-27T08:15:07Z",content:"Installing jsonwebtoken and @types/jsonwebtoken..."},{sessionId:"sess-001",eventType:"output",timestamp:"2026-02-27T08:15:12Z",content:`Rewriting auth middleware:
|
|
@@ -58,7 +58,7 @@ export function verifyToken(req: Request, res: Response, next: NextFunction): vo
|
|
|
58
58
|
res.status(403).json({ error: "Invalid token" });
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
-
\`\`\``},{sessionId:"sess-001",eventType:"output",timestamp:"2026-02-27T08:15:18Z",content:"Updated login route to issue JWT tokens with 24h expiry."},{sessionId:"sess-001",eventType:"output",timestamp:"2026-02-27T08:15:22Z",content:"Running test suite... 14 tests passed, 2 updated, 0 failed."},{sessionId:"sess-002",eventType:"status",timestamp:"2026-02-27T07:30:01Z",content:"running"},{sessionId:"sess-002",eventType:"output",timestamp:"2026-02-27T07:30:05Z",content:"Generating pytest tests for POST /api/register endpoint..."},{sessionId:"sess-002",eventType:"output",timestamp:"2026-02-27T07:32:00Z",content:"Created 8 test cases covering: valid registration, duplicate email, weak password, missing fields, SQL injection, XSS payload, rate limit, and CORS headers."},{sessionId:"sess-002",eventType:"status",timestamp:"2026-02-27T07:33:00Z",content:"completed"}],rC=[{id:"proj-alpha",name:"Workspace Alpha",description:"Core platform API and authentication services",repoUrl:"https://github.com/acme/alpha",environmentId:"env-local-01",status:"active",worktreeBasePath:"",useWorktrees:!0,defaultPersonaId:"",createdAt:"2026-01-15T10:00:00Z",updatedAt:"2026-01-15T10:00:00Z"},{id:"proj-beta",name:"Data Pipeline",description:"ETL pipelines for analytics and reporting",repoUrl:"https://github.com/acme/data-pipeline",environmentId:"env-docker-01",status:"active",worktreeBasePath:"",useWorktrees:!0,defaultPersonaId:"",createdAt:"2026-02-01T14:30:00Z",updatedAt:"2026-02-01T14:30:00Z"},{id:"proj-gamma",name:"Mobile App",description:"React Native cross-platform mobile application",repoUrl:"",environmentId:"env-local-01",status:"archived",worktreeBasePath:"",useWorktrees:!0,defaultPersonaId:"",createdAt:"2025-11-20T09:00:00Z",updatedAt:"2025-11-20T09:00:00Z"}],cC=[{id:"task-001",workspaceId:"proj-alpha",title:"Implement JWT authentication",description:"Replace session-based auth with JWT tokens across all protected routes",status:"working",branch:"feat/jwt-auth",latestSessionId:"sess-001",dependsOn:[],reviewNotes:void 0,sortOrder:1,createdAt:"2026-02-25T10:00:00Z",parentTaskId:"",depth:0,childTaskIds:["task-001a","task-001b","task-001c"],canDecompose:!0,defaultPersonaId:""},{id:"task-001a",workspaceId:"proj-alpha",title:"Design token schema",description:"Define JWT payload structure, expiry, and refresh token strategy",status:"complete",branch:"feat/jwt-auth/design-token-schema",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:1,createdAt:"2026-02-25T10:10:00Z",parentTaskId:"task-001",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-001b",workspaceId:"proj-alpha",title:"Implement auth middleware",description:"Build Express middleware that verifies JWT Bearer tokens",status:"working",branch:"feat/jwt-auth/implement-auth-middleware",latestSessionId:"sess-001",dependsOn:[],reviewNotes:void 0,sortOrder:2,createdAt:"2026-02-25T10:15:00Z",parentTaskId:"task-001",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-001c",workspaceId:"proj-alpha",title:"Write auth integration tests",description:"End-to-end tests for login flow, token refresh, and protected route access",status:"not_started",branch:"",latestSessionId:"",dependsOn:["task-001b"],reviewNotes:void 0,sortOrder:3,createdAt:"2026-02-25T10:20:00Z",parentTaskId:"task-001",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-002",workspaceId:"proj-alpha",title:"Add rate limiting",description:"Implement token-bucket rate limiting for public API endpoints",status:"not_started",branch:"",latestSessionId:"",dependsOn:["task-001"],reviewNotes:void 0,sortOrder:2,createdAt:"2026-02-25T10:05:00Z",parentTaskId:"",depth:0,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-003",workspaceId:"proj-alpha",title:"Set up OpenAPI documentation",description:"Generate Swagger docs from route decorators and serve at /api/docs",status:"paused",branch:"feat/openapi-docs",latestSessionId:"sess-002",dependsOn:[],reviewNotes:void 0,sortOrder:3,createdAt:"2026-02-24T16:00:00Z",parentTaskId:"",depth:0,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-004",workspaceId:"proj-alpha",title:"Database connection pooling",description:"Switch from single connection to a connection pool with health checks",status:"complete",branch:"feat/db-pool",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:4,createdAt:"2026-02-23T11:00:00Z",parentTaskId:"",depth:0,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-005",workspaceId:"proj-alpha",title:"Fix N+1 query in user list",description:"Use a JOIN instead of per-row lookups in GET /api/users",status:"not_started",branch:"fix/user-list-n1",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:5,createdAt:"2026-02-22T09:30:00Z",parentTaskId:"",depth:0,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-006",workspaceId:"proj-beta",title:"Add Parquet export support",description:"Allow pipeline outputs to be written as Parquet files for Spark consumption",status:"working",branch:"feat/parquet-export",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:1,createdAt:"2026-02-26T08:00:00Z",parentTaskId:"",depth:0,childTaskIds:["task-006a","task-006b","task-006c","task-006d"],canDecompose:!0,defaultPersonaId:""},{id:"task-006a",workspaceId:"proj-beta",title:"Define Parquet schema mapping",description:"Map internal column types to Arrow/Parquet type system",status:"complete",branch:"feat/parquet-export/define-parquet-schema-mapping",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:1,createdAt:"2026-02-26T08:05:00Z",parentTaskId:"task-006",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-006b",workspaceId:"proj-beta",title:"Implement row-group writer",description:"Write buffered row groups with configurable batch size",status:"complete",branch:"feat/parquet-export/implement-row-group-writer",latestSessionId:"",dependsOn:["task-006a"],reviewNotes:void 0,sortOrder:2,createdAt:"2026-02-26T08:10:00Z",parentTaskId:"task-006",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-006c",workspaceId:"proj-beta",title:"Add compression options",description:"Support Snappy, ZSTD, and GZIP compression for Parquet output",status:"working",branch:"feat/parquet-export/add-compression-options",latestSessionId:"sess-004",dependsOn:["task-006b"],reviewNotes:void 0,sortOrder:3,createdAt:"2026-02-26T08:15:00Z",parentTaskId:"task-006",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-006d",workspaceId:"proj-beta",title:"Write Parquet integration tests",description:"Round-trip tests: write Parquet, read back with pyarrow, verify data integrity",status:"not_started",branch:"",latestSessionId:"",dependsOn:["task-006c"],reviewNotes:void 0,sortOrder:4,createdAt:"2026-02-26T08:20:00Z",parentTaskId:"task-006",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-007",workspaceId:"proj-beta",title:"Implement incremental loads",description:"Track watermarks so pipelines only process new/changed rows",status:"working",branch:"feat/incremental",latestSessionId:"sess-004",dependsOn:[],reviewNotes:void 0,sortOrder:2,createdAt:"2026-02-26T08:30:00Z",parentTaskId:"",depth:0,childTaskIds:["task-007a","task-007b"],canDecompose:!0,defaultPersonaId:""},{id:"task-007a",workspaceId:"proj-beta",title:"Design watermark storage",description:"Define schema for per-pipeline high-watermark tracking",status:"complete",branch:"feat/incremental/design-watermark-storage",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:1,createdAt:"2026-02-26T08:35:00Z",parentTaskId:"task-007",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-007b",workspaceId:"proj-beta",title:"Implement change detection query",description:"Generate WHERE clauses from watermarks to fetch only changed rows",status:"failed",branch:"feat/incremental/implement-change-detection-query",latestSessionId:"",dependsOn:["task-007a"],reviewNotes:void 0,sortOrder:2,createdAt:"2026-02-26T08:40:00Z",parentTaskId:"task-007",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-008",workspaceId:"proj-beta",title:"Add pipeline monitoring dashboard",description:"Real-time metrics for pipeline throughput, latency, and error rates",status:"paused",branch:"feat/monitoring",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:3,createdAt:"2026-02-26T09:00:00Z",parentTaskId:"",depth:0,childTaskIds:[],canDecompose:!1,defaultPersonaId:""}],Yg=[{id:"find-001",workspaceId:"proj-alpha",taskId:"task-001",sessionId:"sess-001",category:"architecture",title:"Auth middleware is tightly coupled to Express",content:"The current auth middleware directly references Express Request/Response types. Consider extracting a framework-agnostic token verification layer so we can reuse it in the WebSocket auth path.",tags:["auth","decoupling","middleware"],createdAt:"2026-02-27T08:16:00Z"},{id:"find-002",workspaceId:"proj-alpha",taskId:"task-003",sessionId:"sess-002",category:"api",title:"Missing pagination on GET /api/users",content:"The users endpoint returns all rows without limit/offset. For datasets over 10k rows this will cause timeouts. Recommend cursor-based pagination with a default page size of 50.",tags:["api","pagination","performance"],createdAt:"2026-02-27T07:31:00Z"},{id:"find-003",workspaceId:"proj-alpha",taskId:"task-005",sessionId:"sess-003",category:"bug",title:"Race condition in session cleanup",content:"When two requests hit /api/logout concurrently, the second call throws a 500 because the session row has already been deleted. Needs an idempotent DELETE or a conditional check.",tags:["bug","concurrency","sessions"],createdAt:"2026-02-26T22:50:00Z"},{id:"find-004",workspaceId:"proj-alpha",taskId:"task-004",sessionId:"",category:"decision",title:"Chose pg-pool over knex connection pool",content:"pg-pool gives us direct control over idle timeout, max connections, and health check queries. Knex wraps pg-pool anyway and adds overhead we don't need since we write raw SQL.",tags:["database","decision","postgres"],createdAt:"2026-02-23T11:30:00Z"},{id:"find-005",workspaceId:"proj-alpha",taskId:"",sessionId:"",category:"dependency",title:"jsonwebtoken has 3 high-severity CVEs",content:"The jsonwebtoken package (v8.x) has known vulnerabilities. Consider migrating to jose which is maintained, supports ESM, and covers the same JWS/JWE surface area with zero dependencies.",tags:["security","dependency","jwt"],createdAt:"2026-02-27T08:20:00Z"},{id:"find-006",workspaceId:"proj-alpha",taskId:"task-001",sessionId:"sess-001",category:"pattern",title:"Consistent error response shape",content:"All error responses should follow the shape `{ error: string, code: string, details?: unknown }`. Currently some routes return `{ message: string }` and others return `{ error: string }`.",tags:["api","consistency","error-handling"],createdAt:"2026-02-27T08:17:00Z"},{id:"find-007",workspaceId:"proj-beta",taskId:"task-007",sessionId:"sess-004",category:"architecture",title:"Watermark storage should be pluggable",content:"The incremental load watermarks are currently stored in a local SQLite file. For production multi-worker scenarios, this needs to be backed by a shared store (Redis or Postgres).",tags:["architecture","pipeline","scalability"],createdAt:"2026-02-27T09:05:00Z"}],uC=[{name:"anthropic",tokenType:"env_var",envVar:"ANTHROPIC_API_KEY",filePath:"",expiresAt:""},{name:"github",tokenType:"env_var",envVar:"GITHUB_TOKEN",filePath:"",expiresAt:"2026-12-31T23:59:59Z"},{name:"gcp-service-account",tokenType:"file",envVar:"",filePath:"/home/user/.config/gcloud/credentials.json",expiresAt:""}],dC=[{id:"persona-arch",name:"Software Architect",description:"Designs system architecture, defines interfaces, and decomposes large features into implementable tasks.",systemPrompt:"You are a senior software architect. Focus on clean interfaces, separation of concerns, and scalable patterns. When decomposing work, create concrete subtasks with clear acceptance criteria.",toolConfig:JSON.stringify({allowedTools:["Read","Grep","Glob","Write","Edit"]}),runtime:"claude-code",model:"claude-sonnet-4-5-20250929",maxTurns:50,mcpServers:"[]",createdAt:"2026-02-20T10:00:00Z",updatedAt:"2026-02-20T10:00:00Z",type:"agent",script:""},{id:"persona-fe",name:"Frontend Engineer",description:"React specialist — builds UI components, writes CSS, implements routing, and creates Playwright tests.",systemPrompt:"You are a frontend engineer specializing in React, TypeScript, and modern CSS. Follow component composition patterns, use semantic HTML, and write accessible markup.",toolConfig:JSON.stringify({allowedTools:["Read","Grep","Glob","Write","Edit","Bash"]}),runtime:"claude-code",model:"claude-sonnet-4-5-20250929",maxTurns:100,mcpServers:"[]",createdAt:"2026-02-20T10:05:00Z",updatedAt:"2026-02-20T10:05:00Z",type:"agent",script:""},{id:"persona-reviewer",name:"Code Reviewer",description:"Reviews diffs for correctness, security, and style. Posts findings for issues discovered.",systemPrompt:"You are a meticulous code reviewer. Check for security vulnerabilities, performance issues, and style consistency. Post findings for anything noteworthy.",toolConfig:JSON.stringify({allowedTools:["Read","Grep","Glob"]}),runtime:"claude-code",model:"claude-sonnet-4-5-20250929",maxTurns:30,mcpServers:"[]",createdAt:"2026-02-20T10:10:00Z",updatedAt:"2026-02-20T10:10:00Z",type:"agent",script:""},{id:"persona-tester",name:"QA Engineer",description:"Writes comprehensive test suites — unit tests, integration tests, and E2E Playwright specs.",systemPrompt:"You are a QA engineer focused on test coverage. Write tests that cover happy paths, edge cases, error scenarios, and accessibility. Use Playwright for E2E tests.",toolConfig:JSON.stringify({allowedTools:["Read","Grep","Glob","Write","Edit","Bash"]}),runtime:"claude-code",model:"claude-sonnet-4-5-20250929",maxTurns:80,mcpServers:"[]",createdAt:"2026-02-20T10:15:00Z",updatedAt:"2026-02-20T10:15:00Z",type:"agent",script:""},{id:"persona-lint",name:"Lint & Format",description:"Scripted persona — runs ESLint and Prettier on changed files, auto-fixes violations, and posts a findings summary.",systemPrompt:"",toolConfig:"{}",runtime:"genaiscript",model:"",maxTurns:1,mcpServers:"[]",createdAt:"2026-02-21T09:00:00Z",updatedAt:"2026-02-21T09:00:00Z",type:"script",script:`const files = env.files.filter(f => /\\.(ts|tsx|js)$/.test(f.filename));
|
|
61
|
+
\`\`\``},{sessionId:"sess-001",eventType:"output",timestamp:"2026-02-27T08:15:18Z",content:"Updated login route to issue JWT tokens with 24h expiry."},{sessionId:"sess-001",eventType:"output",timestamp:"2026-02-27T08:15:22Z",content:"Running test suite... 14 tests passed, 2 updated, 0 failed."},{sessionId:"sess-002",eventType:"status",timestamp:"2026-02-27T07:30:01Z",content:"running"},{sessionId:"sess-002",eventType:"output",timestamp:"2026-02-27T07:30:05Z",content:"Generating pytest tests for POST /api/register endpoint..."},{sessionId:"sess-002",eventType:"output",timestamp:"2026-02-27T07:32:00Z",content:"Created 8 test cases covering: valid registration, duplicate email, weak password, missing fields, SQL injection, XSS payload, rate limit, and CORS headers."},{sessionId:"sess-002",eventType:"status",timestamp:"2026-02-27T07:33:00Z",content:"completed"}],rC=[{id:"proj-alpha",name:"Workspace Alpha",description:"Core platform API and authentication services",repoUrl:"https://github.com/acme/alpha",environmentId:"env-local-01",status:"active",workingDirectory:"",useWorktrees:!0,defaultPersonaId:"",createdAt:"2026-01-15T10:00:00Z",updatedAt:"2026-01-15T10:00:00Z"},{id:"proj-beta",name:"Data Pipeline",description:"ETL pipelines for analytics and reporting",repoUrl:"https://github.com/acme/data-pipeline",environmentId:"env-docker-01",status:"active",workingDirectory:"",useWorktrees:!0,defaultPersonaId:"",createdAt:"2026-02-01T14:30:00Z",updatedAt:"2026-02-01T14:30:00Z"},{id:"proj-gamma",name:"Mobile App",description:"React Native cross-platform mobile application",repoUrl:"",environmentId:"env-local-01",status:"archived",workingDirectory:"",useWorktrees:!0,defaultPersonaId:"",createdAt:"2025-11-20T09:00:00Z",updatedAt:"2025-11-20T09:00:00Z"}],cC=[{id:"task-001",workspaceId:"proj-alpha",title:"Implement JWT authentication",description:"Replace session-based auth with JWT tokens across all protected routes",status:"working",branch:"feat/jwt-auth",latestSessionId:"sess-001",dependsOn:[],reviewNotes:void 0,sortOrder:1,createdAt:"2026-02-25T10:00:00Z",parentTaskId:"",depth:0,childTaskIds:["task-001a","task-001b","task-001c"],canDecompose:!0,defaultPersonaId:""},{id:"task-001a",workspaceId:"proj-alpha",title:"Design token schema",description:"Define JWT payload structure, expiry, and refresh token strategy",status:"complete",branch:"feat/jwt-auth/design-token-schema",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:1,createdAt:"2026-02-25T10:10:00Z",parentTaskId:"task-001",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-001b",workspaceId:"proj-alpha",title:"Implement auth middleware",description:"Build Express middleware that verifies JWT Bearer tokens",status:"working",branch:"feat/jwt-auth/implement-auth-middleware",latestSessionId:"sess-001",dependsOn:[],reviewNotes:void 0,sortOrder:2,createdAt:"2026-02-25T10:15:00Z",parentTaskId:"task-001",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-001c",workspaceId:"proj-alpha",title:"Write auth integration tests",description:"End-to-end tests for login flow, token refresh, and protected route access",status:"not_started",branch:"",latestSessionId:"",dependsOn:["task-001b"],reviewNotes:void 0,sortOrder:3,createdAt:"2026-02-25T10:20:00Z",parentTaskId:"task-001",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-002",workspaceId:"proj-alpha",title:"Add rate limiting",description:"Implement token-bucket rate limiting for public API endpoints",status:"not_started",branch:"",latestSessionId:"",dependsOn:["task-001"],reviewNotes:void 0,sortOrder:2,createdAt:"2026-02-25T10:05:00Z",parentTaskId:"",depth:0,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-003",workspaceId:"proj-alpha",title:"Set up OpenAPI documentation",description:"Generate Swagger docs from route decorators and serve at /api/docs",status:"paused",branch:"feat/openapi-docs",latestSessionId:"sess-002",dependsOn:[],reviewNotes:void 0,sortOrder:3,createdAt:"2026-02-24T16:00:00Z",parentTaskId:"",depth:0,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-004",workspaceId:"proj-alpha",title:"Database connection pooling",description:"Switch from single connection to a connection pool with health checks",status:"complete",branch:"feat/db-pool",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:4,createdAt:"2026-02-23T11:00:00Z",parentTaskId:"",depth:0,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-005",workspaceId:"proj-alpha",title:"Fix N+1 query in user list",description:"Use a JOIN instead of per-row lookups in GET /api/users",status:"not_started",branch:"fix/user-list-n1",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:5,createdAt:"2026-02-22T09:30:00Z",parentTaskId:"",depth:0,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-006",workspaceId:"proj-beta",title:"Add Parquet export support",description:"Allow pipeline outputs to be written as Parquet files for Spark consumption",status:"working",branch:"feat/parquet-export",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:1,createdAt:"2026-02-26T08:00:00Z",parentTaskId:"",depth:0,childTaskIds:["task-006a","task-006b","task-006c","task-006d"],canDecompose:!0,defaultPersonaId:""},{id:"task-006a",workspaceId:"proj-beta",title:"Define Parquet schema mapping",description:"Map internal column types to Arrow/Parquet type system",status:"complete",branch:"feat/parquet-export/define-parquet-schema-mapping",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:1,createdAt:"2026-02-26T08:05:00Z",parentTaskId:"task-006",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-006b",workspaceId:"proj-beta",title:"Implement row-group writer",description:"Write buffered row groups with configurable batch size",status:"complete",branch:"feat/parquet-export/implement-row-group-writer",latestSessionId:"",dependsOn:["task-006a"],reviewNotes:void 0,sortOrder:2,createdAt:"2026-02-26T08:10:00Z",parentTaskId:"task-006",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-006c",workspaceId:"proj-beta",title:"Add compression options",description:"Support Snappy, ZSTD, and GZIP compression for Parquet output",status:"working",branch:"feat/parquet-export/add-compression-options",latestSessionId:"sess-004",dependsOn:["task-006b"],reviewNotes:void 0,sortOrder:3,createdAt:"2026-02-26T08:15:00Z",parentTaskId:"task-006",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-006d",workspaceId:"proj-beta",title:"Write Parquet integration tests",description:"Round-trip tests: write Parquet, read back with pyarrow, verify data integrity",status:"not_started",branch:"",latestSessionId:"",dependsOn:["task-006c"],reviewNotes:void 0,sortOrder:4,createdAt:"2026-02-26T08:20:00Z",parentTaskId:"task-006",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-007",workspaceId:"proj-beta",title:"Implement incremental loads",description:"Track watermarks so pipelines only process new/changed rows",status:"working",branch:"feat/incremental",latestSessionId:"sess-004",dependsOn:[],reviewNotes:void 0,sortOrder:2,createdAt:"2026-02-26T08:30:00Z",parentTaskId:"",depth:0,childTaskIds:["task-007a","task-007b"],canDecompose:!0,defaultPersonaId:""},{id:"task-007a",workspaceId:"proj-beta",title:"Design watermark storage",description:"Define schema for per-pipeline high-watermark tracking",status:"complete",branch:"feat/incremental/design-watermark-storage",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:1,createdAt:"2026-02-26T08:35:00Z",parentTaskId:"task-007",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-007b",workspaceId:"proj-beta",title:"Implement change detection query",description:"Generate WHERE clauses from watermarks to fetch only changed rows",status:"failed",branch:"feat/incremental/implement-change-detection-query",latestSessionId:"",dependsOn:["task-007a"],reviewNotes:void 0,sortOrder:2,createdAt:"2026-02-26T08:40:00Z",parentTaskId:"task-007",depth:1,childTaskIds:[],canDecompose:!1,defaultPersonaId:""},{id:"task-008",workspaceId:"proj-beta",title:"Add pipeline monitoring dashboard",description:"Real-time metrics for pipeline throughput, latency, and error rates",status:"paused",branch:"feat/monitoring",latestSessionId:"",dependsOn:[],reviewNotes:void 0,sortOrder:3,createdAt:"2026-02-26T09:00:00Z",parentTaskId:"",depth:0,childTaskIds:[],canDecompose:!1,defaultPersonaId:""}],Yg=[{id:"find-001",workspaceId:"proj-alpha",taskId:"task-001",sessionId:"sess-001",category:"architecture",title:"Auth middleware is tightly coupled to Express",content:"The current auth middleware directly references Express Request/Response types. Consider extracting a framework-agnostic token verification layer so we can reuse it in the WebSocket auth path.",tags:["auth","decoupling","middleware"],createdAt:"2026-02-27T08:16:00Z"},{id:"find-002",workspaceId:"proj-alpha",taskId:"task-003",sessionId:"sess-002",category:"api",title:"Missing pagination on GET /api/users",content:"The users endpoint returns all rows without limit/offset. For datasets over 10k rows this will cause timeouts. Recommend cursor-based pagination with a default page size of 50.",tags:["api","pagination","performance"],createdAt:"2026-02-27T07:31:00Z"},{id:"find-003",workspaceId:"proj-alpha",taskId:"task-005",sessionId:"sess-003",category:"bug",title:"Race condition in session cleanup",content:"When two requests hit /api/logout concurrently, the second call throws a 500 because the session row has already been deleted. Needs an idempotent DELETE or a conditional check.",tags:["bug","concurrency","sessions"],createdAt:"2026-02-26T22:50:00Z"},{id:"find-004",workspaceId:"proj-alpha",taskId:"task-004",sessionId:"",category:"decision",title:"Chose pg-pool over knex connection pool",content:"pg-pool gives us direct control over idle timeout, max connections, and health check queries. Knex wraps pg-pool anyway and adds overhead we don't need since we write raw SQL.",tags:["database","decision","postgres"],createdAt:"2026-02-23T11:30:00Z"},{id:"find-005",workspaceId:"proj-alpha",taskId:"",sessionId:"",category:"dependency",title:"jsonwebtoken has 3 high-severity CVEs",content:"The jsonwebtoken package (v8.x) has known vulnerabilities. Consider migrating to jose which is maintained, supports ESM, and covers the same JWS/JWE surface area with zero dependencies.",tags:["security","dependency","jwt"],createdAt:"2026-02-27T08:20:00Z"},{id:"find-006",workspaceId:"proj-alpha",taskId:"task-001",sessionId:"sess-001",category:"pattern",title:"Consistent error response shape",content:"All error responses should follow the shape `{ error: string, code: string, details?: unknown }`. Currently some routes return `{ message: string }` and others return `{ error: string }`.",tags:["api","consistency","error-handling"],createdAt:"2026-02-27T08:17:00Z"},{id:"find-007",workspaceId:"proj-beta",taskId:"task-007",sessionId:"sess-004",category:"architecture",title:"Watermark storage should be pluggable",content:"The incremental load watermarks are currently stored in a local SQLite file. For production multi-worker scenarios, this needs to be backed by a shared store (Redis or Postgres).",tags:["architecture","pipeline","scalability"],createdAt:"2026-02-27T09:05:00Z"}],uC=[{name:"anthropic",tokenType:"env_var",envVar:"ANTHROPIC_API_KEY",filePath:"",expiresAt:""},{name:"github",tokenType:"env_var",envVar:"GITHUB_TOKEN",filePath:"",expiresAt:"2026-12-31T23:59:59Z"},{name:"gcp-service-account",tokenType:"file",envVar:"",filePath:"/home/user/.config/gcloud/credentials.json",expiresAt:""}],dC=[{id:"persona-arch",name:"Software Architect",description:"Designs system architecture, defines interfaces, and decomposes large features into implementable tasks.",systemPrompt:"You are a senior software architect. Focus on clean interfaces, separation of concerns, and scalable patterns. When decomposing work, create concrete subtasks with clear acceptance criteria.",toolConfig:JSON.stringify({allowedTools:["Read","Grep","Glob","Write","Edit"]}),runtime:"claude-code",model:"claude-sonnet-4-5-20250929",maxTurns:50,mcpServers:"[]",createdAt:"2026-02-20T10:00:00Z",updatedAt:"2026-02-20T10:00:00Z",type:"agent",script:""},{id:"persona-fe",name:"Frontend Engineer",description:"React specialist — builds UI components, writes CSS, implements routing, and creates Playwright tests.",systemPrompt:"You are a frontend engineer specializing in React, TypeScript, and modern CSS. Follow component composition patterns, use semantic HTML, and write accessible markup.",toolConfig:JSON.stringify({allowedTools:["Read","Grep","Glob","Write","Edit","Bash"]}),runtime:"claude-code",model:"claude-sonnet-4-5-20250929",maxTurns:100,mcpServers:"[]",createdAt:"2026-02-20T10:05:00Z",updatedAt:"2026-02-20T10:05:00Z",type:"agent",script:""},{id:"persona-reviewer",name:"Code Reviewer",description:"Reviews diffs for correctness, security, and style. Posts findings for issues discovered.",systemPrompt:"You are a meticulous code reviewer. Check for security vulnerabilities, performance issues, and style consistency. Post findings for anything noteworthy.",toolConfig:JSON.stringify({allowedTools:["Read","Grep","Glob"]}),runtime:"claude-code",model:"claude-sonnet-4-5-20250929",maxTurns:30,mcpServers:"[]",createdAt:"2026-02-20T10:10:00Z",updatedAt:"2026-02-20T10:10:00Z",type:"agent",script:""},{id:"persona-tester",name:"QA Engineer",description:"Writes comprehensive test suites — unit tests, integration tests, and E2E Playwright specs.",systemPrompt:"You are a QA engineer focused on test coverage. Write tests that cover happy paths, edge cases, error scenarios, and accessibility. Use Playwright for E2E tests.",toolConfig:JSON.stringify({allowedTools:["Read","Grep","Glob","Write","Edit","Bash"]}),runtime:"claude-code",model:"claude-sonnet-4-5-20250929",maxTurns:80,mcpServers:"[]",createdAt:"2026-02-20T10:15:00Z",updatedAt:"2026-02-20T10:15:00Z",type:"agent",script:""},{id:"persona-lint",name:"Lint & Format",description:"Scripted persona — runs ESLint and Prettier on changed files, auto-fixes violations, and posts a findings summary.",systemPrompt:"",toolConfig:"{}",runtime:"genaiscript",model:"",maxTurns:1,mcpServers:"[]",createdAt:"2026-02-21T09:00:00Z",updatedAt:"2026-02-21T09:00:00Z",type:"script",script:`const files = env.files.filter(f => /\\.(ts|tsx|js)$/.test(f.filename));
|
|
62
62
|
for (const f of files) {
|
|
63
63
|
const eslintResult = await host.exec("npx", ["eslint", "--fix", f.filename]);
|
|
64
64
|
if (eslintResult.exitCode !== 0) {
|
|
@@ -87,7 +87,7 @@ Migration 003_audit_log.sql applied successfully.`}},{delayMs:2500,event:{eventT
|
|
|
87
87
|
- should apply discount codes
|
|
88
88
|
- should handle currency conversion
|
|
89
89
|
- should reject expired cards`}},{delayMs:2800,event:{eventType:"output",timestamp:Nt(2800),content:`Error: Cannot resolve import 'src/services/stripe-client.ts' — module not found.
|
|
90
|
-
The billing service depends on a Stripe client that doesn't exist in this environment.`}},{delayMs:3500,event:{eventType:"status",timestamp:Nt(3500),content:"failed"}}]}],Fg=400;function hC({children:n}){const[a,i]=b.useState(iC),[l,c]=b.useState(oC),[d,f]=b.useState(lC),[m,p]=b.useState(void 0),[v,g]=b.useState(rC),[y,x]=b.useState(cC),[S,T]=b.useState(Yg),[j,N]=b.useState(uC),[C,A]=b.useState({claude:"off",github:"off",copilot:"off",codex:"off",goose:"off"}),[E,R]=b.useState(dC),[w]=b.useState(fC),[H,I]=b.useState(""),U=b.useRef(0),q=b.useRef(0),ee=b.useRef(new Set),ae=b.useRef(new Map),ce=b.useRef(y);ce.current=y;const re=b.useRef(new Map),K=b.useRef(new Map),ne=b.useCallback(X=>(U.current+=1,`mock-${X}-${String(U.current).padStart(3,"0")}`),[]),O=b.useCallback(()=>{const X=Kg[q.current%Kg.length];return q.current+=1,X},[]),P=b.useCallback((X,ie,fe)=>{const _e=setTimeout(()=>{var ge;ee.current.delete(_e),fe&&((ge=ae.current.get(fe))==null||ge.delete(_e)),X()},ie);ee.current.add(_e),fe&&(ae.current.has(fe)||ae.current.set(fe,new Set),ae.current.get(fe).add(_e))},[]),se=b.useCallback(X=>{const ie=ae.current.get(X);ie&&(ie.forEach(fe=>{clearTimeout(fe),ee.current.delete(fe)}),ae.current.delete(X))},[]),oe=b.useCallback((X,ie,fe)=>{c(_e=>_e.map(ge=>ge.id===X?{...ge,status:ie,...fe!==void 0?{endReason:fe}:{}}:ge))},[]),Y=b.useCallback(X=>{f(ie=>[...ie,X])},[]),be=b.useCallback((X,ie,fe)=>{ie.forEach((_e,ge)=>{P(()=>{const Je={sessionId:X,..._e.event,timestamp:new Date().toISOString()};if(Y(Je),_e.event.eventType==="status"){const Se=w0(_e.event.content),Ie=E0(_e.event.content);oe(X,Se,Ie)}ge===ie.length-1&&fe&&fe()},_e.delayMs,X)})},[P,Y,oe]),Ne=b.useCallback((X,ie,fe,_e)=>{console.log("[MockGrackle] spawn",{environmentId:X,prompt:ie,runtime:_e});const ge=ne("sess"),Je={id:ge,environmentId:X,runtime:_e||"claude-code",status:"running",prompt:ie,startedAt:new Date().toISOString()};c(Ie=>[...Ie,Je]),p(ge);const Se=O();if(console.log(`[MockGrackle] Playing scenario: ${Se.label}`),Se.pauseForInput){const Ie=Se.pauseAfterStep??Se.steps.length-1,ze=Se.steps.slice(0,Ie+1),Ye=ze.length>0?ze[ze.length-1].delayMs:0;be(ge,ze),P(()=>{oe(ge,"idle"),Y({sessionId:ge,eventType:"status",timestamp:new Date().toISOString(),content:"idle"})},Ye+Fg,ge),Se.resumeSteps&&re.current.set(ge,Se.resumeSteps)}else be(ge,Se.steps)},[ne,O,be,P,oe,Y]),xe=b.useCallback(X=>{console.log("[MockGrackle] kill",X),se(X),re.current.delete(X),oe(X,"stopped","killed"),Y({sessionId:X,eventType:"status",timestamp:new Date().toISOString(),content:"killed"}),x(ie=>ie.map(fe=>fe.latestSessionId===X&&fe.status==="working"?{...fe,status:"not_started"}:fe))},[se,oe,Y]),J=b.useCallback(()=>{console.log("[MockGrackle] refresh")},[]),le=b.useCallback(X=>{console.log("[MockGrackle] loadSessionEvents",X)},[]),W=b.useCallback(()=>{console.log("[MockGrackle] clearEvents"),f([])},[]),tt=b.useCallback((X,ie,fe,_e,ge,Je,Se,Ie,ze)=>{console.log("[MockGrackle] createWorkspace",{name:X,description:ie});const Ye={id:ne("proj"),name:X,description:ie||"",repoUrl:fe||"",environmentId:_e||"",status:"active",worktreeBasePath:Se||"",useWorktrees:Je??!0,defaultPersonaId:ge||"",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};g(Et=>[...Et,Ye]),Ie&&Ie()},[ne]),Re=b.useCallback(X=>{console.log("[MockGrackle] archiveWorkspace",X),g(ie=>ie.map(fe=>fe.id===X?{...fe,status:"archived"}:fe))},[]),An=b.useCallback(X=>{console.log("[MockGrackle] loadTasks",X)},[]),xa=b.useCallback((X,ie,fe,_e,ge,Je,Se,Ie,ze)=>{console.log("[MockGrackle] createTask",{workspaceId:X,title:ie,parentTaskId:ge}),x(Ye=>{const Gt=Ye.filter(mn=>mn.workspaceId===X).reduce((mn,Dn)=>Math.max(mn,Dn.sortOrder),0),Jt=ge?Ye.find(mn=>mn.id===ge):void 0;if(ge&&!Jt)return console.warn("[MockGrackle] Parent task not found:",ge),Ye;if(Jt&&!Jt.canDecompose)return console.warn("[MockGrackle] Parent task does not have decomposition rights:",ge),Ye;const Ct=Jt?Jt.depth+1:0,_a={id:ne("task"),workspaceId:X,title:ie,description:fe||"",status:"not_started",branch:"",latestSessionId:"",dependsOn:_e||[],reviewNotes:void 0,sortOrder:Gt+1,createdAt:new Date().toISOString(),parentTaskId:ge||"",depth:Ct,childTaskIds:[],canDecompose:Se??!ge,defaultPersonaId:Je||""};return[...Ye,_a]}),Ie&&Ie()},[ne]),fn=b.useCallback((X,ie,fe,_e)=>{var Ye;console.log("[MockGrackle] startTask",{taskId:X});const ge=ce.current.find(Et=>Et.id===X),Je=(ge==null?void 0:ge.title)??"",Se=ne("sess"),Ie={id:Se,environmentId:"env-local-01",runtime:"claude-code",status:"running",prompt:Je||X,startedAt:new Date().toISOString()};c(Et=>[...Et,Ie]),x(Et=>Et.map(Gt=>Gt.id===X?{...Gt,status:"working",latestSessionId:Se,branch:`mock/${X.slice(0,8)}`}:Gt));const ze=O();if(console.log(`[MockGrackle] Playing task scenario: ${ze.label}`),ze.pauseForInput){const Et=ze.pauseAfterStep??ze.steps.length-1,Gt=ze.steps.slice(0,Et+1),Jt=Gt.length>0?Gt[Gt.length-1].delayMs:0;if(be(Se,Gt),P(()=>{oe(Se,"idle"),Y({sessionId:Se,eventType:"status",timestamp:new Date().toISOString(),content:"idle"})},Jt+Fg,Se),ze.resumeSteps){const Ct=[...ze.resumeSteps];re.current.set(Se,Ct);const _a=Ct.reduce((mn,Dn)=>Math.max(mn,Dn.delayMs),0);K.current.set(Se,{taskId:X,delayAfterResume:_a+200})}}else{const Et=ze.steps.length>0?ze.steps[ze.steps.length-1].delayMs:0;be(Se,ze.steps);const Gt=(Ye=ze.steps[ze.steps.length-1])==null?void 0:Ye.event.content;P(()=>{Gt==="completed"?x(Jt=>Jt.map(Ct=>Ct.id===X&&Ct.status==="working"?{...Ct,status:"paused"}:Ct)):Gt==="failed"&&x(Jt=>Jt.map(Ct=>Ct.id===X&&Ct.status==="working"?{...Ct,status:"failed"}:Ct))},Et+100,Se)}},[ne,O,be,P,oe,Y]),Kn=b.useCallback((X,ie)=>{console.log("[MockGrackle] sendInput",{sessionId:X,text:ie}),Y({sessionId:X,eventType:"output",timestamp:new Date().toISOString(),content:`User input: ${ie}`}),oe(X,"running"),Y({sessionId:X,eventType:"status",timestamp:new Date().toISOString(),content:"running"});const fe=re.current.get(X);if(fe)re.current.delete(X),be(X,fe);else{const ge=[{delayMs:500,event:{eventType:"output",timestamp:new Date().toISOString(),content:"I received your input, continuing..."}},{delayMs:1500,event:{eventType:"status",timestamp:new Date().toISOString(),content:"completed"}}];be(X,ge)}const _e=K.current.get(X);_e&&(K.current.delete(X),P(()=>{x(ge=>ge.map(Je=>Je.id===_e.taskId&&Je.status==="working"?{...Je,status:"paused"}:Je))},_e.delayAfterResume,X))},[Y,oe,be,P]),Fn=b.useCallback(X=>{console.log("[MockGrackle] completeTask",X),x(ie=>ie.map(fe=>fe.id===X?{...fe,status:"complete"}:fe))},[]),hn=b.useCallback(X=>{console.log("[MockGrackle] resumeTask",X)},[]),Ln=b.useCallback((X,ie,fe,_e,ge)=>{console.log("[MockGrackle] updateTask",{taskId:X,title:ie}),x(Je=>Je.map(Se=>Se.id===X?{...Se,title:ie.trim()||Se.title,description:fe,dependsOn:_e,...ge!==void 0?{defaultPersonaId:ge}:{}}:Se))},[]),Te=b.useCallback(X=>{console.log("[MockGrackle] deleteTask",X),x(ie=>ie.filter(fe=>fe.id!==X))},[]),kt=b.useCallback(X=>{console.log("[MockGrackle] loadFindings",X),T(Yg.filter(ie=>ie.workspaceId===X))},[]),Hi=b.useCallback((X,ie,fe,_e,ge)=>{console.log("[MockGrackle] postFinding",{workspaceId:X,title:ie});const Je={id:ne("find"),workspaceId:X,taskId:"",sessionId:"",category:_e||"general",title:ie,content:fe,tags:ge||[],createdAt:new Date().toISOString()};T(Se=>[...Se,Je])},[ne]),Rs=b.useCallback(()=>{console.log("[MockGrackle] loadEnvironments")},[]),Ms=b.useCallback((X,ie,fe)=>{console.log("[MockGrackle] addEnvironment",{displayName:X,adapterType:ie,adapterConfig:fe})},[]),Os=b.useCallback((X,ie)=>{console.log("[MockGrackle] updateEnvironment",{environmentId:X,...ie}),i(fe=>fe.map(_e=>_e.id!==X?_e:{..._e,...ie.displayName!==void 0?{displayName:ie.displayName}:{},...ie.adapterConfig!==void 0?{adapterConfig:JSON.stringify(ie.adapterConfig)}:{}}))},[]),hl=b.useCallback(()=>{console.log("[MockGrackle] loadTokens")},[]),ml=b.useCallback((X,ie,fe,_e,ge)=>{console.log("[MockGrackle] setToken",{name:X,tokenType:fe}),N(Je=>[...Je.filter(Ie=>Ie.name!==X),{name:X,tokenType:fe,envVar:_e,filePath:ge,expiresAt:""}])},[]),Ut=b.useCallback(X=>{console.log("[MockGrackle] deleteToken",X),N(ie=>ie.filter(fe=>fe.name!==X))},[]),pl=b.useCallback(X=>{console.log("[MockGrackle] updateCredentialProviders",X),A(X)},[]);b.useEffect(()=>()=>{ee.current.forEach(clearTimeout),ee.current.clear()},[]);const vl=b.useMemo(()=>({connected:!0,send:()=>{},environments:a,sessions:l,events:d,eventsDropped:0,lastSpawnedId:m,workspaces:v,tasks:y,findings:S,tokens:j,credentialProviders:C,spawn:Ne,sendInput:Kn,kill:xe,refresh:J,loadSessionEvents:le,clearEvents:W,loadWorkspaces:()=>{console.log("[MockGrackle] loadWorkspaces")},createWorkspace:tt,archiveWorkspace:Re,updateWorkspace:(X,ie)=>{console.log("[MockGrackle] updateWorkspace",{workspaceId:X,...ie}),g(fe=>fe.map(_e=>_e.id!==X?_e:{..._e,...ie.name!==void 0?{name:ie.name}:{},...ie.description!==void 0?{description:ie.description}:{},...ie.repoUrl!==void 0?{repoUrl:ie.repoUrl}:{},...ie.environmentId!==void 0?{environmentId:ie.environmentId}:{},...ie.worktreeBasePath!==void 0?{worktreeBasePath:ie.worktreeBasePath}:{},...ie.useWorktrees!==void 0?{useWorktrees:ie.useWorktrees}:{},...ie.defaultPersonaId!==void 0?{defaultPersonaId:ie.defaultPersonaId}:{},updatedAt:new Date().toISOString()}))},loadTasks:An,loadAllTasks:()=>{console.log("[MockGrackle] loadAllTasks")},createTask:xa,startTask:fn,stopTask:X=>{console.log("[MockGrackle] stopTask",{taskId:X}),Fn(X)},completeTask:Fn,resumeTask:hn,updateTask:Ln,deleteTask:Te,loadFindings:kt,postFinding:Hi,loadEnvironments:Rs,addEnvironment:Ms,updateEnvironment:Os,loadTokens:hl,setToken:ml,deleteToken:Ut,updateCredentialProviders:pl,provisionStatus:{},provisionEnvironment:()=>{},stopEnvironment:()=>{},removeEnvironment:()=>{},codespaces:[],codespaceError:"",codespaceListError:"",codespaceCreating:!1,listCodespaces:()=>{},createCodespace:()=>{},workspaceCreating:!1,taskStartingId:void 0,personas:E,createPersona:(X,ie,fe,_e,ge,Je,Se,Ie)=>{console.log("[MockGrackle] createPersona",{name:X});const ze={id:`mock-persona-${Date.now()}`,name:X,description:ie,systemPrompt:fe,toolConfig:"{}",runtime:_e??"claude-code",model:ge||"",maxTurns:Je||0,mcpServers:"[]",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),type:Se||"agent",script:Ie||""};R(Ye=>[...Ye,ze])},updatePersona:(X,ie,fe,_e,ge,Je,Se,Ie,ze)=>{console.log("[MockGrackle] updatePersona",{personaId:X,name:ie}),R(Ye=>Ye.map(Et=>Et.id!==X?Et:{...Et,...ie!==void 0?{name:ie}:{},...fe!==void 0?{description:fe}:{},..._e!==void 0?{systemPrompt:_e}:{},...ge!==void 0?{runtime:ge}:{},...Je!==void 0?{model:Je}:{},...Se!==void 0?{maxTurns:Se}:{},...Ie!==void 0?{type:Ie}:{},...ze!==void 0?{script:ze}:{},updatedAt:new Date().toISOString()}))},deletePersona:X=>{console.log("[MockGrackle] deletePersona",X),R(ie=>ie.filter(fe=>fe.id!==X))},taskSessions:w,loadTaskSessions:X=>{console.log("[MockGrackle] loadTaskSessions",X)},appDefaultPersonaId:H,setAppDefaultPersonaId:X=>{console.log("[MockGrackle] setAppDefaultPersonaId",X),I(X)},onboardingCompleted:!0,completeOnboarding:()=>{console.log("[MockGrackle] completeOnboarding")},usageCache:{"workspace:proj-alpha":{inputTokens:214500,outputTokens:44850,costUsd:1.12,sessionCount:4},"workspace:proj-beta":{inputTokens:86700,outputTokens:23800,costUsd:.48,sessionCount:3},"task:task-001":{inputTokens:126800,outputTokens:20850,costUsd:.63,sessionCount:2},"task:task-006":{inputTokens:18900,outputTokens:4500,costUsd:.1,sessionCount:1},"task_tree:task-001":{inputTokens:126800,outputTokens:20850,costUsd:.63,sessionCount:2},"task_tree:task-006":{inputTokens:18900,outputTokens:4500,costUsd:.1,sessionCount:1}},loadUsage:(X,ie)=>{console.log(`[MockGrackle] loadUsage(${X}, ${ie})`)},knowledge:{graphData:{nodes:[],links:[]},selectedNode:void 0,loading:!1,selectedId:void 0,searchQuery:"",search:()=>{},clearSearch:()=>{},selectNode:()=>{},clearSelection:()=>{},expandNode:()=>{},loadRecent:()=>{},handleMessage:()=>!1}}),[a,l,d,m,v,y,S,j,C,E,w,H,Ne,Kn,xe,J,le,W,tt,Re,An,xa,fn,Fn,hn,Ln,Te,kt,Hi,Rs,Ms,Os,hl,ml,Ut,pl]);return r.jsx(Pf.Provider,{value:vl,children:n})}const W0=b.createContext(void 0),mC=4e3;function pC({children:n}){const[a,i]=b.useState([]),l=b.useRef(0),c=b.useCallback(f=>{i(m=>m.filter(p=>p.id!==f))},[]),d=b.useCallback((f,m="info",p=mC)=>{const v=`toast-${++l.current}`;i(g=>[...g,{id:v,message:f,variant:m,duration:p}])},[]);return r.jsx(W0.Provider,{value:{toasts:a,showToast:d,dismissToast:c},children:n})}function Es(){const n=b.useContext(W0);if(!n)throw new Error("useToast must be used within ToastProvider");return n}const dc=[{id:"grackle",label:"Grackle",description:"The default Grackle theme — iridescent purple on clean dark.",swatches:["#0e1218","#8b5cf6","#60a5fa","#e5e7eb","#34d399"],variantLightId:"grackle-light",variantDarkId:"grackle-dark"},{id:"grackle-light",label:"Grackle Light",description:"Light Grackle variant.",hidden:!0},{id:"grackle-dark",label:"Grackle Dark",description:"Dark Grackle variant.",hidden:!0},{id:"glass",label:"Glassmorphism",description:"Dark frosted-glass aesthetic with backdrop blur effects.",swatches:["#0a0c14","#4ecca3","#70a1ff","#e2e8f0","#a855f7"]},{id:"matrix",label:"Matrix",description:"Phosphor-green CRT terminal with scanlines and glow.",swatches:["#050505","#00ff41","#00bfff","#33ff77","#ffb000"]},{id:"brutalist",label:"Neubrutalism",description:"Thick borders, raw colors, bold type — ugly on purpose.",swatches:["#f5f0e8","#ff5757","#5ce1e6","#1a1a1a","#ffde59"],variantLightId:"brutalist-light",variantDarkId:"brutalist-dark"},{id:"brutalist-light",label:"Neubrutalism Light",description:"Light neubrutalism variant.",hidden:!0},{id:"brutalist-dark",label:"Neubrutalism Dark",description:"Dark neubrutalism variant.",hidden:!0},{id:"monokai",label:"Monokai",description:"Classic warm editor palette — pink, green, and purple.",swatches:["#272822","#f92672","#a6e22e","#f8f8f2","#ae81ff"],variantLightId:"monokai-light",variantDarkId:"monokai-dark"},{id:"monokai-dark",label:"Monokai Dark",description:"Dark Monokai variant.",hidden:!0},{id:"monokai-light",label:"Monokai Light",description:"Light Monokai variant.",hidden:!0},{id:"ubuntu",label:"Ubuntu",description:"Aubergine terminal with the GNOME Tango palette.",swatches:["#300a24","#8ae234","#ef2929","#eeeeec","#fce94f"]},{id:"sandstone",label:"Sandstone",description:"Warm terracotta accent on dark brown, in the style of Claude Code.",swatches:["#1a1815","#C15F3C","#6b8afd","#e8e6e3","#a78bfa"]},{id:"verdigris",label:"Verdigris",description:"Teal accent on charcoal, in the style of ChatGPT.",swatches:["#141414","#00a67e","#3b82f6","#ececec","#ab68ff"]},{id:"primer",label:"Primer",description:"Blue accent on ink-dark grey, in the style of GitHub.",swatches:["#0d1117","#58a6ff","#3fb950","#c9d1d9","#bc8cff"]}],J0=new Set(dc.map(n=>n.id)),Zg="grackle";function uf(n){return dc.find(a=>a.id===n)}const df="grackle-theme",eb="grackle-prefer-system",tb="(prefers-color-scheme: dark)";let Vo=[],qr;function Vd(){qr=void 0;for(const n of Vo)n()}function ff(){return typeof window>"u"?!1:window.matchMedia(tb).matches}function Ko(){if(typeof localStorage>"u")return Zg;try{const n=localStorage.getItem(df);if(n!==null&&J0.has(n))return n}catch{}return Zg}function Qr(){if(typeof localStorage>"u")return!1;try{return localStorage.getItem(eb)==="true"}catch{return!1}}function hf(n){return dc.find(a=>a.variantLightId===n||a.variantDarkId===n)}function nb(n,a){const i=uf(n);if(i!=null&&i.variantDarkId)return a&&i.variantLightId?ff()?i.variantDarkId:i.variantLightId:i.variantDarkId;if(i!=null&&i.hidden&&a){const l=hf(n);if(l!=null&&l.variantLightId&&l.variantDarkId)return ff()?l.variantDarkId:l.variantLightId}return n}function Si(n,a,i=!1){i&&document.documentElement.classList.add("no-transitions"),document.documentElement.dataset.theme=nb(n,a),i&&(document.documentElement.offsetHeight,requestAnimationFrame(()=>{document.documentElement.classList.remove("no-transitions")}))}typeof document<"u"&&Si(Ko(),Qr());function vC(){return qr===void 0&&(qr={themeId:Ko(),systemDark:ff(),preferSystem:Qr()}),qr}function gC(n){return Vo=[...Vo,n],()=>{Vo=Vo.filter(a=>a!==n)}}function yC(){const n=b.useSyncExternalStore(gC,vC),{themeId:a,preferSystem:i}=n,l=nb(a,i),c=b.useCallback(f=>{if(J0.has(f)){try{localStorage.setItem(df,f)}catch{}Si(f,Qr(),!0),Vd()}},[]),d=b.useCallback(f=>{try{localStorage.setItem(eb,f?"true":"false")}catch{}if(f){const m=Ko(),p=uf(m);if(p!=null&&p.hidden){const v=hf(m);if(v)try{localStorage.setItem(df,v.id)}catch{}}}Si(Ko(),f,!0),Vd()},[]);return b.useEffect(()=>{Si(a,i)},[a,i]),b.useEffect(()=>{if(typeof window>"u")return;const f=window.matchMedia(tb),m=()=>{const p=Ko(),v=Qr();if(v){const g=uf(p);if(g!=null&&g.variantDarkId&&g.variantLightId&&Si(p,v),g!=null&&g.hidden){const y=hf(p);y!=null&&y.variantDarkId&&y.variantLightId&&Si(p,v)}}Vd()};return f.addEventListener("change",m),()=>{f.removeEventListener("change",m)}},[]),{themeId:a,setTheme:c,resolvedThemeId:l,preferSystem:i,setPreferSystem:d}}const ab=b.createContext(void 0);function bC({children:n}){const a=yC();return r.jsx(ab.Provider,{value:a,children:n})}function sb(){const n=b.useContext(ab);if(!n)throw new Error("useThemeContext must be used within ThemeProvider");return n}const xC="_container_1mq5u_1",_C="_hamburger_1mq5u_33",SC="_brand_1mq5u_49",TC="_brandLogo_1mq5u_68",kC="_info_1mq5u_75",CC="_connectionLabel_1mq5u_90",jC="_connectionDot_1mq5u_103",NC="_connected_1mq5u_106",wC="_disconnected_1mq5u_110",ha={container:xC,hamburger:_C,brand:SC,brandLogo:TC,info:kC,connectionLabel:CC,connectionDot:jC,connected:NC,disconnected:wC};function EC({connected:n,environments:a,sessions:i,onToggleSidebar:l,sidebarOpen:c}){const d=Rt(),f=a.length,m=a.filter(v=>v.status==="connected").length,p=i.filter(v=>["running","idle"].includes(v.status)).length;return r.jsxs("div",{className:ha.container,children:[l&&r.jsx("button",{type:"button",className:ha.hamburger,onClick:l,"aria-label":"Toggle sidebar","aria-expanded":c,children:"☰"}),r.jsxs("button",{type:"button",className:ha.brand,onClick:()=>d(Cs),title:"Home",children:[r.jsx("img",{src:"/icon-192x192.png",alt:"",className:ha.brandLogo,"aria-hidden":"true","data-testid":"statusbar-logo"}),"Grackle"]}),r.jsxs("div",{className:ha.info,children:[r.jsxs("span",{"aria-label":n?"Connected":"Disconnected",children:[r.jsx("span",{className:`${ha.connectionDot} ${n?ha.connected:ha.disconnected}`,"aria-hidden":"true",children:"●"})," ",r.jsx("span",{className:ha.connectionLabel,"aria-hidden":"true",children:n?"Connected":"Disconnected"})]}),r.jsxs("span",{children:[m,"/",f," env",f!==1?"s":""]}),r.jsxs("span",{children:[p," active"]})]})]})}const AC="_nav_13gkc_1",DC="_tab_13gkc_35",RC="_tabIcon_13gkc_68",MC="_tabLabel_13gkc_79",OC="_tabActive_13gkc_84",Io={nav:AC,tab:DC,tabIcon:RC,tabLabel:MC,tabActive:OC},vs=[{view:"dashboard",label:"Dashboard",icon:"🏠",route:Cs,testId:"sidebar-tab-dashboard"},{view:"chat",label:"Chat",icon:"💬",route:Dk,testId:"sidebar-tab-chat"},{view:"tasks",label:"Tasks",icon:"📋",route:Rk,testId:"sidebar-tab-tasks"},{view:"environments",label:"Environments",icon:"🖥️",route:Ai,testId:"sidebar-tab-environments"},{view:"knowledge",label:"Knowledge",icon:"🧠",route:Q0,testId:"sidebar-tab-knowledge"},{view:"settings",label:"Settings",icon:"⚙️",route:Ek,testId:"sidebar-tab-settings"}];function BC(n){return n===Cs||n==="/"?"dashboard":n.startsWith("/chat")||n.startsWith("/sessions")?"chat":n.startsWith("/workspaces")||n.startsWith("/environments")?"environments":n.startsWith(Q0)?"knowledge":n.startsWith(Yo)?"settings":"tasks"}function LC(){const n=wt(),a=Rt(),i=b.useRef(null),l=BC(n.pathname),c=b.useCallback(f=>{a(f.route)},[a]),d=b.useCallback(f=>{var y,x;const m=(y=i.current)==null?void 0:y.querySelectorAll('[role="tab"]');if(!m)return;const p=Array.from(m).findIndex(S=>S===document.activeElement),v=p>=0?p:vs.findIndex(S=>S.view===l);let g=v;if(f.key==="ArrowRight")f.preventDefault(),g=(v+1)%vs.length;else if(f.key==="ArrowLeft")f.preventDefault(),g=(v-1+vs.length)%vs.length;else if(f.key==="Home")f.preventDefault(),g=0;else if(f.key==="End")f.preventDefault(),g=vs.length-1;else return;a(vs[g].route),(x=m[g])==null||x.focus()},[l,a]);return r.jsx("nav",{className:Io.nav,ref:i,role:"tablist","aria-orientation":"horizontal","aria-label":"App navigation",onKeyDown:d,"data-testid":"sidebar-nav",children:vs.map(f=>{const m=f.view===l;return r.jsxs("button",{role:"tab",type:"button","aria-selected":m,tabIndex:m?0:-1,className:`${Io.tab} ${m?Io.tabActive:""}`,onClick:()=>c(f),"data-testid":f.testId,title:f.label,"aria-label":f.label,children:[r.jsx("span",{className:Io.tabIcon,"aria-hidden":"true",children:f.icon}),r.jsx("span",{className:Io.tabLabel,children:f.label})]},f.view)})})}const ib=b.createContext(void 0),ob=b.createContext(void 0);function IC({children:n}){const[a,i]=b.useState(void 0),l=b.useCallback(c=>{i(c)},[]);return r.jsx(ob.Provider,{value:l,children:r.jsx(ib.Provider,{value:a,children:n})})}function lb(){return b.useContext(ib)}function zC(){const n=b.useContext(ob);if(n===void 0)throw new Error("useSidebarSetter must be used within a SidebarProvider");return n}const UC="_container_pi6ii_1",VC="_content_pi6ii_66",Xg={container:UC,content:VC},HC=320,rb=220,cb=600,ub="grackle-sidebar-width";function GC(){try{const n=localStorage.getItem(ub);if(n!==null){const a=Number(n);if(Number.isFinite(a)&&a>=rb&&a<=cb)return a}}catch{}return HC}function PC(n){try{localStorage.setItem(ub,String(n))}catch{}}function $C(){const[n]=b.useState(GC),a=b.useRef(null),i=lb();if(b.useEffect(()=>{const l=a.current;if(!l)return;const c=new ResizeObserver(d=>{for(const f of d){const m=f.borderBoxSize[0];if(m){const p=Math.round(m.inlineSize);p>=rb&&p<=cb&&PC(p)}}});return c.observe(l),()=>{c.disconnect()}},[]),i!==void 0)return r.jsx("div",{className:Xg.container,ref:a,"data-testid":"sidebar",style:{width:n},children:r.jsx("div",{className:Xg.content,children:i})})}function fc(n){const a=zC();b.useLayoutEffect(()=>(a(n),()=>{a(void 0)}),[n,a])}const $f=b.createContext({});function qf(n){const a=b.useRef(null);return a.current===null&&(a.current=n()),a.current}const hc=b.createContext(null),Yf=b.createContext({transformPagePoint:n=>n,isStatic:!1,reducedMotion:"never"});class qC extends b.Component{getSnapshotBeforeUpdate(a){const i=this.props.childRef.current;if(i&&a.isPresent&&!this.props.isPresent){const l=this.props.sizeRef.current;l.height=i.offsetHeight||0,l.width=i.offsetWidth||0,l.top=i.offsetTop,l.left=i.offsetLeft}return null}componentDidUpdate(){}render(){return this.props.children}}function YC({children:n,isPresent:a}){const i=b.useId(),l=b.useRef(null),c=b.useRef({width:0,height:0,top:0,left:0}),{nonce:d}=b.useContext(Yf);return b.useInsertionEffect(()=>{const{width:f,height:m,top:p,left:v}=c.current;if(a||!l.current||!f||!m)return;l.current.dataset.motionPopId=i;const g=document.createElement("style");return d&&(g.nonce=d),document.head.appendChild(g),g.sheet&&g.sheet.insertRule(`
|
|
90
|
+
The billing service depends on a Stripe client that doesn't exist in this environment.`}},{delayMs:3500,event:{eventType:"status",timestamp:Nt(3500),content:"failed"}}]}],Fg=400;function hC({children:n}){const[a,i]=b.useState(iC),[l,c]=b.useState(oC),[d,f]=b.useState(lC),[m,p]=b.useState(void 0),[v,g]=b.useState(rC),[y,x]=b.useState(cC),[S,T]=b.useState(Yg),[j,N]=b.useState(uC),[C,A]=b.useState({claude:"off",github:"off",copilot:"off",codex:"off",goose:"off"}),[E,R]=b.useState(dC),[w]=b.useState(fC),[H,I]=b.useState(""),U=b.useRef(0),q=b.useRef(0),ee=b.useRef(new Set),ae=b.useRef(new Map),ce=b.useRef(y);ce.current=y;const re=b.useRef(new Map),K=b.useRef(new Map),ne=b.useCallback(X=>(U.current+=1,`mock-${X}-${String(U.current).padStart(3,"0")}`),[]),O=b.useCallback(()=>{const X=Kg[q.current%Kg.length];return q.current+=1,X},[]),P=b.useCallback((X,ie,fe)=>{const _e=setTimeout(()=>{var ge;ee.current.delete(_e),fe&&((ge=ae.current.get(fe))==null||ge.delete(_e)),X()},ie);ee.current.add(_e),fe&&(ae.current.has(fe)||ae.current.set(fe,new Set),ae.current.get(fe).add(_e))},[]),se=b.useCallback(X=>{const ie=ae.current.get(X);ie&&(ie.forEach(fe=>{clearTimeout(fe),ee.current.delete(fe)}),ae.current.delete(X))},[]),oe=b.useCallback((X,ie,fe)=>{c(_e=>_e.map(ge=>ge.id===X?{...ge,status:ie,...fe!==void 0?{endReason:fe}:{}}:ge))},[]),Y=b.useCallback(X=>{f(ie=>[...ie,X])},[]),be=b.useCallback((X,ie,fe)=>{ie.forEach((_e,ge)=>{P(()=>{const Je={sessionId:X,..._e.event,timestamp:new Date().toISOString()};if(Y(Je),_e.event.eventType==="status"){const Se=w0(_e.event.content),Ie=E0(_e.event.content);oe(X,Se,Ie)}ge===ie.length-1&&fe&&fe()},_e.delayMs,X)})},[P,Y,oe]),Ne=b.useCallback((X,ie,fe,_e)=>{console.log("[MockGrackle] spawn",{environmentId:X,prompt:ie,runtime:_e});const ge=ne("sess"),Je={id:ge,environmentId:X,runtime:_e||"claude-code",status:"running",prompt:ie,startedAt:new Date().toISOString()};c(Ie=>[...Ie,Je]),p(ge);const Se=O();if(console.log(`[MockGrackle] Playing scenario: ${Se.label}`),Se.pauseForInput){const Ie=Se.pauseAfterStep??Se.steps.length-1,ze=Se.steps.slice(0,Ie+1),Ye=ze.length>0?ze[ze.length-1].delayMs:0;be(ge,ze),P(()=>{oe(ge,"idle"),Y({sessionId:ge,eventType:"status",timestamp:new Date().toISOString(),content:"idle"})},Ye+Fg,ge),Se.resumeSteps&&re.current.set(ge,Se.resumeSteps)}else be(ge,Se.steps)},[ne,O,be,P,oe,Y]),xe=b.useCallback(X=>{console.log("[MockGrackle] kill",X),se(X),re.current.delete(X),oe(X,"stopped","killed"),Y({sessionId:X,eventType:"status",timestamp:new Date().toISOString(),content:"killed"}),x(ie=>ie.map(fe=>fe.latestSessionId===X&&fe.status==="working"?{...fe,status:"not_started"}:fe))},[se,oe,Y]),J=b.useCallback(()=>{console.log("[MockGrackle] refresh")},[]),le=b.useCallback(X=>{console.log("[MockGrackle] loadSessionEvents",X)},[]),W=b.useCallback(()=>{console.log("[MockGrackle] clearEvents"),f([])},[]),tt=b.useCallback((X,ie,fe,_e,ge,Je,Se,Ie,ze)=>{console.log("[MockGrackle] createWorkspace",{name:X,description:ie});const Ye={id:ne("proj"),name:X,description:ie||"",repoUrl:fe||"",environmentId:_e||"",status:"active",workingDirectory:Se||"",useWorktrees:Je??!0,defaultPersonaId:ge||"",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};g(Et=>[...Et,Ye]),Ie&&Ie()},[ne]),Re=b.useCallback(X=>{console.log("[MockGrackle] archiveWorkspace",X),g(ie=>ie.map(fe=>fe.id===X?{...fe,status:"archived"}:fe))},[]),An=b.useCallback(X=>{console.log("[MockGrackle] loadTasks",X)},[]),xa=b.useCallback((X,ie,fe,_e,ge,Je,Se,Ie,ze)=>{console.log("[MockGrackle] createTask",{workspaceId:X,title:ie,parentTaskId:ge}),x(Ye=>{const Gt=Ye.filter(mn=>mn.workspaceId===X).reduce((mn,Dn)=>Math.max(mn,Dn.sortOrder),0),Jt=ge?Ye.find(mn=>mn.id===ge):void 0;if(ge&&!Jt)return console.warn("[MockGrackle] Parent task not found:",ge),Ye;if(Jt&&!Jt.canDecompose)return console.warn("[MockGrackle] Parent task does not have decomposition rights:",ge),Ye;const Ct=Jt?Jt.depth+1:0,_a={id:ne("task"),workspaceId:X,title:ie,description:fe||"",status:"not_started",branch:"",latestSessionId:"",dependsOn:_e||[],reviewNotes:void 0,sortOrder:Gt+1,createdAt:new Date().toISOString(),parentTaskId:ge||"",depth:Ct,childTaskIds:[],canDecompose:Se??!ge,defaultPersonaId:Je||""};return[...Ye,_a]}),Ie&&Ie()},[ne]),fn=b.useCallback((X,ie,fe,_e)=>{var Ye;console.log("[MockGrackle] startTask",{taskId:X});const ge=ce.current.find(Et=>Et.id===X),Je=(ge==null?void 0:ge.title)??"",Se=ne("sess"),Ie={id:Se,environmentId:"env-local-01",runtime:"claude-code",status:"running",prompt:Je||X,startedAt:new Date().toISOString()};c(Et=>[...Et,Ie]),x(Et=>Et.map(Gt=>Gt.id===X?{...Gt,status:"working",latestSessionId:Se,branch:`mock/${X.slice(0,8)}`}:Gt));const ze=O();if(console.log(`[MockGrackle] Playing task scenario: ${ze.label}`),ze.pauseForInput){const Et=ze.pauseAfterStep??ze.steps.length-1,Gt=ze.steps.slice(0,Et+1),Jt=Gt.length>0?Gt[Gt.length-1].delayMs:0;if(be(Se,Gt),P(()=>{oe(Se,"idle"),Y({sessionId:Se,eventType:"status",timestamp:new Date().toISOString(),content:"idle"})},Jt+Fg,Se),ze.resumeSteps){const Ct=[...ze.resumeSteps];re.current.set(Se,Ct);const _a=Ct.reduce((mn,Dn)=>Math.max(mn,Dn.delayMs),0);K.current.set(Se,{taskId:X,delayAfterResume:_a+200})}}else{const Et=ze.steps.length>0?ze.steps[ze.steps.length-1].delayMs:0;be(Se,ze.steps);const Gt=(Ye=ze.steps[ze.steps.length-1])==null?void 0:Ye.event.content;P(()=>{Gt==="completed"?x(Jt=>Jt.map(Ct=>Ct.id===X&&Ct.status==="working"?{...Ct,status:"paused"}:Ct)):Gt==="failed"&&x(Jt=>Jt.map(Ct=>Ct.id===X&&Ct.status==="working"?{...Ct,status:"failed"}:Ct))},Et+100,Se)}},[ne,O,be,P,oe,Y]),Kn=b.useCallback((X,ie)=>{console.log("[MockGrackle] sendInput",{sessionId:X,text:ie}),Y({sessionId:X,eventType:"output",timestamp:new Date().toISOString(),content:`User input: ${ie}`}),oe(X,"running"),Y({sessionId:X,eventType:"status",timestamp:new Date().toISOString(),content:"running"});const fe=re.current.get(X);if(fe)re.current.delete(X),be(X,fe);else{const ge=[{delayMs:500,event:{eventType:"output",timestamp:new Date().toISOString(),content:"I received your input, continuing..."}},{delayMs:1500,event:{eventType:"status",timestamp:new Date().toISOString(),content:"completed"}}];be(X,ge)}const _e=K.current.get(X);_e&&(K.current.delete(X),P(()=>{x(ge=>ge.map(Je=>Je.id===_e.taskId&&Je.status==="working"?{...Je,status:"paused"}:Je))},_e.delayAfterResume,X))},[Y,oe,be,P]),Fn=b.useCallback(X=>{console.log("[MockGrackle] completeTask",X),x(ie=>ie.map(fe=>fe.id===X?{...fe,status:"complete"}:fe))},[]),hn=b.useCallback(X=>{console.log("[MockGrackle] resumeTask",X)},[]),Ln=b.useCallback((X,ie,fe,_e,ge)=>{console.log("[MockGrackle] updateTask",{taskId:X,title:ie}),x(Je=>Je.map(Se=>Se.id===X?{...Se,title:ie.trim()||Se.title,description:fe,dependsOn:_e,...ge!==void 0?{defaultPersonaId:ge}:{}}:Se))},[]),Te=b.useCallback(X=>{console.log("[MockGrackle] deleteTask",X),x(ie=>ie.filter(fe=>fe.id!==X))},[]),kt=b.useCallback(X=>{console.log("[MockGrackle] loadFindings",X),T(Yg.filter(ie=>ie.workspaceId===X))},[]),Hi=b.useCallback((X,ie,fe,_e,ge)=>{console.log("[MockGrackle] postFinding",{workspaceId:X,title:ie});const Je={id:ne("find"),workspaceId:X,taskId:"",sessionId:"",category:_e||"general",title:ie,content:fe,tags:ge||[],createdAt:new Date().toISOString()};T(Se=>[...Se,Je])},[ne]),Rs=b.useCallback(()=>{console.log("[MockGrackle] loadEnvironments")},[]),Ms=b.useCallback((X,ie,fe)=>{console.log("[MockGrackle] addEnvironment",{displayName:X,adapterType:ie,adapterConfig:fe})},[]),Os=b.useCallback((X,ie)=>{console.log("[MockGrackle] updateEnvironment",{environmentId:X,...ie}),i(fe=>fe.map(_e=>_e.id!==X?_e:{..._e,...ie.displayName!==void 0?{displayName:ie.displayName}:{},...ie.adapterConfig!==void 0?{adapterConfig:JSON.stringify(ie.adapterConfig)}:{}}))},[]),hl=b.useCallback(()=>{console.log("[MockGrackle] loadTokens")},[]),ml=b.useCallback((X,ie,fe,_e,ge)=>{console.log("[MockGrackle] setToken",{name:X,tokenType:fe}),N(Je=>[...Je.filter(Ie=>Ie.name!==X),{name:X,tokenType:fe,envVar:_e,filePath:ge,expiresAt:""}])},[]),Ut=b.useCallback(X=>{console.log("[MockGrackle] deleteToken",X),N(ie=>ie.filter(fe=>fe.name!==X))},[]),pl=b.useCallback(X=>{console.log("[MockGrackle] updateCredentialProviders",X),A(X)},[]);b.useEffect(()=>()=>{ee.current.forEach(clearTimeout),ee.current.clear()},[]);const vl=b.useMemo(()=>({connected:!0,send:()=>{},environments:a,sessions:l,events:d,eventsDropped:0,lastSpawnedId:m,workspaces:v,tasks:y,findings:S,tokens:j,credentialProviders:C,spawn:Ne,sendInput:Kn,kill:xe,refresh:J,loadSessionEvents:le,clearEvents:W,loadWorkspaces:()=>{console.log("[MockGrackle] loadWorkspaces")},createWorkspace:tt,archiveWorkspace:Re,updateWorkspace:(X,ie)=>{console.log("[MockGrackle] updateWorkspace",{workspaceId:X,...ie}),g(fe=>fe.map(_e=>_e.id!==X?_e:{..._e,...ie.name!==void 0?{name:ie.name}:{},...ie.description!==void 0?{description:ie.description}:{},...ie.repoUrl!==void 0?{repoUrl:ie.repoUrl}:{},...ie.environmentId!==void 0?{environmentId:ie.environmentId}:{},...ie.workingDirectory!==void 0?{workingDirectory:ie.workingDirectory}:{},...ie.useWorktrees!==void 0?{useWorktrees:ie.useWorktrees}:{},...ie.defaultPersonaId!==void 0?{defaultPersonaId:ie.defaultPersonaId}:{},updatedAt:new Date().toISOString()}))},loadTasks:An,loadAllTasks:()=>{console.log("[MockGrackle] loadAllTasks")},createTask:xa,startTask:fn,stopTask:X=>{console.log("[MockGrackle] stopTask",{taskId:X}),Fn(X)},completeTask:Fn,resumeTask:hn,updateTask:Ln,deleteTask:Te,loadFindings:kt,postFinding:Hi,loadEnvironments:Rs,addEnvironment:Ms,updateEnvironment:Os,loadTokens:hl,setToken:ml,deleteToken:Ut,updateCredentialProviders:pl,provisionStatus:{},provisionEnvironment:()=>{},stopEnvironment:()=>{},removeEnvironment:()=>{},codespaces:[],codespaceError:"",codespaceListError:"",codespaceCreating:!1,listCodespaces:()=>{},createCodespace:()=>{},workspaceCreating:!1,taskStartingId:void 0,personas:E,createPersona:(X,ie,fe,_e,ge,Je,Se,Ie)=>{console.log("[MockGrackle] createPersona",{name:X});const ze={id:`mock-persona-${Date.now()}`,name:X,description:ie,systemPrompt:fe,toolConfig:"{}",runtime:_e??"claude-code",model:ge||"",maxTurns:Je||0,mcpServers:"[]",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),type:Se||"agent",script:Ie||""};R(Ye=>[...Ye,ze])},updatePersona:(X,ie,fe,_e,ge,Je,Se,Ie,ze)=>{console.log("[MockGrackle] updatePersona",{personaId:X,name:ie}),R(Ye=>Ye.map(Et=>Et.id!==X?Et:{...Et,...ie!==void 0?{name:ie}:{},...fe!==void 0?{description:fe}:{},..._e!==void 0?{systemPrompt:_e}:{},...ge!==void 0?{runtime:ge}:{},...Je!==void 0?{model:Je}:{},...Se!==void 0?{maxTurns:Se}:{},...Ie!==void 0?{type:Ie}:{},...ze!==void 0?{script:ze}:{},updatedAt:new Date().toISOString()}))},deletePersona:X=>{console.log("[MockGrackle] deletePersona",X),R(ie=>ie.filter(fe=>fe.id!==X))},taskSessions:w,loadTaskSessions:X=>{console.log("[MockGrackle] loadTaskSessions",X)},appDefaultPersonaId:H,setAppDefaultPersonaId:X=>{console.log("[MockGrackle] setAppDefaultPersonaId",X),I(X)},onboardingCompleted:!0,completeOnboarding:()=>{console.log("[MockGrackle] completeOnboarding")},usageCache:{"workspace:proj-alpha":{inputTokens:214500,outputTokens:44850,costUsd:1.12,sessionCount:4},"workspace:proj-beta":{inputTokens:86700,outputTokens:23800,costUsd:.48,sessionCount:3},"task:task-001":{inputTokens:126800,outputTokens:20850,costUsd:.63,sessionCount:2},"task:task-006":{inputTokens:18900,outputTokens:4500,costUsd:.1,sessionCount:1},"task_tree:task-001":{inputTokens:126800,outputTokens:20850,costUsd:.63,sessionCount:2},"task_tree:task-006":{inputTokens:18900,outputTokens:4500,costUsd:.1,sessionCount:1}},loadUsage:(X,ie)=>{console.log(`[MockGrackle] loadUsage(${X}, ${ie})`)},knowledge:{graphData:{nodes:[],links:[]},selectedNode:void 0,loading:!1,selectedId:void 0,searchQuery:"",search:()=>{},clearSearch:()=>{},selectNode:()=>{},clearSelection:()=>{},expandNode:()=>{},loadRecent:()=>{},handleMessage:()=>!1}}),[a,l,d,m,v,y,S,j,C,E,w,H,Ne,Kn,xe,J,le,W,tt,Re,An,xa,fn,Fn,hn,Ln,Te,kt,Hi,Rs,Ms,Os,hl,ml,Ut,pl]);return r.jsx(Pf.Provider,{value:vl,children:n})}const W0=b.createContext(void 0),mC=4e3;function pC({children:n}){const[a,i]=b.useState([]),l=b.useRef(0),c=b.useCallback(f=>{i(m=>m.filter(p=>p.id!==f))},[]),d=b.useCallback((f,m="info",p=mC)=>{const v=`toast-${++l.current}`;i(g=>[...g,{id:v,message:f,variant:m,duration:p}])},[]);return r.jsx(W0.Provider,{value:{toasts:a,showToast:d,dismissToast:c},children:n})}function Es(){const n=b.useContext(W0);if(!n)throw new Error("useToast must be used within ToastProvider");return n}const dc=[{id:"grackle",label:"Grackle",description:"The default Grackle theme — iridescent purple on clean dark.",swatches:["#0e1218","#8b5cf6","#60a5fa","#e5e7eb","#34d399"],variantLightId:"grackle-light",variantDarkId:"grackle-dark"},{id:"grackle-light",label:"Grackle Light",description:"Light Grackle variant.",hidden:!0},{id:"grackle-dark",label:"Grackle Dark",description:"Dark Grackle variant.",hidden:!0},{id:"glass",label:"Glassmorphism",description:"Dark frosted-glass aesthetic with backdrop blur effects.",swatches:["#0a0c14","#4ecca3","#70a1ff","#e2e8f0","#a855f7"]},{id:"matrix",label:"Matrix",description:"Phosphor-green CRT terminal with scanlines and glow.",swatches:["#050505","#00ff41","#00bfff","#33ff77","#ffb000"]},{id:"brutalist",label:"Neubrutalism",description:"Thick borders, raw colors, bold type — ugly on purpose.",swatches:["#f5f0e8","#ff5757","#5ce1e6","#1a1a1a","#ffde59"],variantLightId:"brutalist-light",variantDarkId:"brutalist-dark"},{id:"brutalist-light",label:"Neubrutalism Light",description:"Light neubrutalism variant.",hidden:!0},{id:"brutalist-dark",label:"Neubrutalism Dark",description:"Dark neubrutalism variant.",hidden:!0},{id:"monokai",label:"Monokai",description:"Classic warm editor palette — pink, green, and purple.",swatches:["#272822","#f92672","#a6e22e","#f8f8f2","#ae81ff"],variantLightId:"monokai-light",variantDarkId:"monokai-dark"},{id:"monokai-dark",label:"Monokai Dark",description:"Dark Monokai variant.",hidden:!0},{id:"monokai-light",label:"Monokai Light",description:"Light Monokai variant.",hidden:!0},{id:"ubuntu",label:"Ubuntu",description:"Aubergine terminal with the GNOME Tango palette.",swatches:["#300a24","#8ae234","#ef2929","#eeeeec","#fce94f"]},{id:"sandstone",label:"Sandstone",description:"Warm terracotta accent on dark brown, in the style of Claude Code.",swatches:["#1a1815","#C15F3C","#6b8afd","#e8e6e3","#a78bfa"]},{id:"verdigris",label:"Verdigris",description:"Teal accent on charcoal, in the style of ChatGPT.",swatches:["#141414","#00a67e","#3b82f6","#ececec","#ab68ff"]},{id:"primer",label:"Primer",description:"Blue accent on ink-dark grey, in the style of GitHub.",swatches:["#0d1117","#58a6ff","#3fb950","#c9d1d9","#bc8cff"]}],J0=new Set(dc.map(n=>n.id)),Zg="grackle";function uf(n){return dc.find(a=>a.id===n)}const df="grackle-theme",eb="grackle-prefer-system",tb="(prefers-color-scheme: dark)";let Vo=[],qr;function Vd(){qr=void 0;for(const n of Vo)n()}function ff(){return typeof window>"u"?!1:window.matchMedia(tb).matches}function Ko(){if(typeof localStorage>"u")return Zg;try{const n=localStorage.getItem(df);if(n!==null&&J0.has(n))return n}catch{}return Zg}function Qr(){if(typeof localStorage>"u")return!1;try{return localStorage.getItem(eb)==="true"}catch{return!1}}function hf(n){return dc.find(a=>a.variantLightId===n||a.variantDarkId===n)}function nb(n,a){const i=uf(n);if(i!=null&&i.variantDarkId)return a&&i.variantLightId?ff()?i.variantDarkId:i.variantLightId:i.variantDarkId;if(i!=null&&i.hidden&&a){const l=hf(n);if(l!=null&&l.variantLightId&&l.variantDarkId)return ff()?l.variantDarkId:l.variantLightId}return n}function Si(n,a,i=!1){i&&document.documentElement.classList.add("no-transitions"),document.documentElement.dataset.theme=nb(n,a),i&&(document.documentElement.offsetHeight,requestAnimationFrame(()=>{document.documentElement.classList.remove("no-transitions")}))}typeof document<"u"&&Si(Ko(),Qr());function vC(){return qr===void 0&&(qr={themeId:Ko(),systemDark:ff(),preferSystem:Qr()}),qr}function gC(n){return Vo=[...Vo,n],()=>{Vo=Vo.filter(a=>a!==n)}}function yC(){const n=b.useSyncExternalStore(gC,vC),{themeId:a,preferSystem:i}=n,l=nb(a,i),c=b.useCallback(f=>{if(J0.has(f)){try{localStorage.setItem(df,f)}catch{}Si(f,Qr(),!0),Vd()}},[]),d=b.useCallback(f=>{try{localStorage.setItem(eb,f?"true":"false")}catch{}if(f){const m=Ko(),p=uf(m);if(p!=null&&p.hidden){const v=hf(m);if(v)try{localStorage.setItem(df,v.id)}catch{}}}Si(Ko(),f,!0),Vd()},[]);return b.useEffect(()=>{Si(a,i)},[a,i]),b.useEffect(()=>{if(typeof window>"u")return;const f=window.matchMedia(tb),m=()=>{const p=Ko(),v=Qr();if(v){const g=uf(p);if(g!=null&&g.variantDarkId&&g.variantLightId&&Si(p,v),g!=null&&g.hidden){const y=hf(p);y!=null&&y.variantDarkId&&y.variantLightId&&Si(p,v)}}Vd()};return f.addEventListener("change",m),()=>{f.removeEventListener("change",m)}},[]),{themeId:a,setTheme:c,resolvedThemeId:l,preferSystem:i,setPreferSystem:d}}const ab=b.createContext(void 0);function bC({children:n}){const a=yC();return r.jsx(ab.Provider,{value:a,children:n})}function sb(){const n=b.useContext(ab);if(!n)throw new Error("useThemeContext must be used within ThemeProvider");return n}const xC="_container_1mq5u_1",_C="_hamburger_1mq5u_33",SC="_brand_1mq5u_49",TC="_brandLogo_1mq5u_68",kC="_info_1mq5u_75",CC="_connectionLabel_1mq5u_90",jC="_connectionDot_1mq5u_103",NC="_connected_1mq5u_106",wC="_disconnected_1mq5u_110",ha={container:xC,hamburger:_C,brand:SC,brandLogo:TC,info:kC,connectionLabel:CC,connectionDot:jC,connected:NC,disconnected:wC};function EC({connected:n,environments:a,sessions:i,onToggleSidebar:l,sidebarOpen:c}){const d=Rt(),f=a.length,m=a.filter(v=>v.status==="connected").length,p=i.filter(v=>["running","idle"].includes(v.status)).length;return r.jsxs("div",{className:ha.container,children:[l&&r.jsx("button",{type:"button",className:ha.hamburger,onClick:l,"aria-label":"Toggle sidebar","aria-expanded":c,children:"☰"}),r.jsxs("button",{type:"button",className:ha.brand,onClick:()=>d(Cs),title:"Home",children:[r.jsx("img",{src:"/icon-192x192.png",alt:"",className:ha.brandLogo,"aria-hidden":"true","data-testid":"statusbar-logo"}),"Grackle"]}),r.jsxs("div",{className:ha.info,children:[r.jsxs("span",{"aria-label":n?"Connected":"Disconnected",children:[r.jsx("span",{className:`${ha.connectionDot} ${n?ha.connected:ha.disconnected}`,"aria-hidden":"true",children:"●"})," ",r.jsx("span",{className:ha.connectionLabel,"aria-hidden":"true",children:n?"Connected":"Disconnected"})]}),r.jsxs("span",{children:[m,"/",f," env",f!==1?"s":""]}),r.jsxs("span",{children:[p," active"]})]})]})}const AC="_nav_13gkc_1",DC="_tab_13gkc_35",RC="_tabIcon_13gkc_68",MC="_tabLabel_13gkc_79",OC="_tabActive_13gkc_84",Io={nav:AC,tab:DC,tabIcon:RC,tabLabel:MC,tabActive:OC},vs=[{view:"dashboard",label:"Dashboard",icon:"🏠",route:Cs,testId:"sidebar-tab-dashboard"},{view:"chat",label:"Chat",icon:"💬",route:Dk,testId:"sidebar-tab-chat"},{view:"tasks",label:"Tasks",icon:"📋",route:Rk,testId:"sidebar-tab-tasks"},{view:"environments",label:"Environments",icon:"🖥️",route:Ai,testId:"sidebar-tab-environments"},{view:"knowledge",label:"Knowledge",icon:"🧠",route:Q0,testId:"sidebar-tab-knowledge"},{view:"settings",label:"Settings",icon:"⚙️",route:Ek,testId:"sidebar-tab-settings"}];function BC(n){return n===Cs||n==="/"?"dashboard":n.startsWith("/chat")||n.startsWith("/sessions")?"chat":n.startsWith("/workspaces")||n.startsWith("/environments")?"environments":n.startsWith(Q0)?"knowledge":n.startsWith(Yo)?"settings":"tasks"}function LC(){const n=wt(),a=Rt(),i=b.useRef(null),l=BC(n.pathname),c=b.useCallback(f=>{a(f.route)},[a]),d=b.useCallback(f=>{var y,x;const m=(y=i.current)==null?void 0:y.querySelectorAll('[role="tab"]');if(!m)return;const p=Array.from(m).findIndex(S=>S===document.activeElement),v=p>=0?p:vs.findIndex(S=>S.view===l);let g=v;if(f.key==="ArrowRight")f.preventDefault(),g=(v+1)%vs.length;else if(f.key==="ArrowLeft")f.preventDefault(),g=(v-1+vs.length)%vs.length;else if(f.key==="Home")f.preventDefault(),g=0;else if(f.key==="End")f.preventDefault(),g=vs.length-1;else return;a(vs[g].route),(x=m[g])==null||x.focus()},[l,a]);return r.jsx("nav",{className:Io.nav,ref:i,role:"tablist","aria-orientation":"horizontal","aria-label":"App navigation",onKeyDown:d,"data-testid":"sidebar-nav",children:vs.map(f=>{const m=f.view===l;return r.jsxs("button",{role:"tab",type:"button","aria-selected":m,tabIndex:m?0:-1,className:`${Io.tab} ${m?Io.tabActive:""}`,onClick:()=>c(f),"data-testid":f.testId,title:f.label,"aria-label":f.label,children:[r.jsx("span",{className:Io.tabIcon,"aria-hidden":"true",children:f.icon}),r.jsx("span",{className:Io.tabLabel,children:f.label})]},f.view)})})}const ib=b.createContext(void 0),ob=b.createContext(void 0);function IC({children:n}){const[a,i]=b.useState(void 0),l=b.useCallback(c=>{i(c)},[]);return r.jsx(ob.Provider,{value:l,children:r.jsx(ib.Provider,{value:a,children:n})})}function lb(){return b.useContext(ib)}function zC(){const n=b.useContext(ob);if(n===void 0)throw new Error("useSidebarSetter must be used within a SidebarProvider");return n}const UC="_container_pi6ii_1",VC="_content_pi6ii_66",Xg={container:UC,content:VC},HC=320,rb=220,cb=600,ub="grackle-sidebar-width";function GC(){try{const n=localStorage.getItem(ub);if(n!==null){const a=Number(n);if(Number.isFinite(a)&&a>=rb&&a<=cb)return a}}catch{}return HC}function PC(n){try{localStorage.setItem(ub,String(n))}catch{}}function $C(){const[n]=b.useState(GC),a=b.useRef(null),i=lb();if(b.useEffect(()=>{const l=a.current;if(!l)return;const c=new ResizeObserver(d=>{for(const f of d){const m=f.borderBoxSize[0];if(m){const p=Math.round(m.inlineSize);p>=rb&&p<=cb&&PC(p)}}});return c.observe(l),()=>{c.disconnect()}},[]),i!==void 0)return r.jsx("div",{className:Xg.container,ref:a,"data-testid":"sidebar",style:{width:n},children:r.jsx("div",{className:Xg.content,children:i})})}function fc(n){const a=zC();b.useLayoutEffect(()=>(a(n),()=>{a(void 0)}),[n,a])}const $f=b.createContext({});function qf(n){const a=b.useRef(null);return a.current===null&&(a.current=n()),a.current}const hc=b.createContext(null),Yf=b.createContext({transformPagePoint:n=>n,isStatic:!1,reducedMotion:"never"});class qC extends b.Component{getSnapshotBeforeUpdate(a){const i=this.props.childRef.current;if(i&&a.isPresent&&!this.props.isPresent){const l=this.props.sizeRef.current;l.height=i.offsetHeight||0,l.width=i.offsetWidth||0,l.top=i.offsetTop,l.left=i.offsetLeft}return null}componentDidUpdate(){}render(){return this.props.children}}function YC({children:n,isPresent:a}){const i=b.useId(),l=b.useRef(null),c=b.useRef({width:0,height:0,top:0,left:0}),{nonce:d}=b.useContext(Yf);return b.useInsertionEffect(()=>{const{width:f,height:m,top:p,left:v}=c.current;if(a||!l.current||!f||!m)return;l.current.dataset.motionPopId=i;const g=document.createElement("style");return d&&(g.nonce=d),document.head.appendChild(g),g.sheet&&g.sheet.insertRule(`
|
|
91
91
|
[data-motion-pop-id="${i}"] {
|
|
92
92
|
position: absolute !important;
|
|
93
93
|
width: ${f}px !important;
|
|
@@ -102,11 +102,11 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
102
102
|
`),c=l.length>p0,d=a?n:l.slice(0,p0).join(`
|
|
103
103
|
`);return r.jsxs("div",{className:Ve.systemContextEvent,"data-testid":"system-context-event",children:[r.jsxs("button",{type:"button",className:Ve.systemContextHeader,onClick:()=>{i(f=>!f)},"aria-expanded":a,children:[r.jsx("span",{className:Ve.systemContextBadge,children:"SYSTEM PROMPT"}),c&&r.jsx("span",{className:Ve.systemContextToggle,"aria-hidden":"true",children:a?"▾":"▸"})]}),r.jsxs("pre",{className:Ve.systemContextPre,children:[d,!a&&c&&r.jsx("span",{className:Ve.systemContextEllipsis,children:"…"})]})]})}function GD({time:n,content:a}){return r.jsxs("div",{className:Ve.systemEvent,children:[r.jsxs("span",{className:Ve.systemTimestamp,children:["[",n,"]"]})," ",a]})}function PD({content:n}){return r.jsx("div",{className:Ve.textEvent,children:r.jsx(Rf,{remarkPlugins:[Mf],rehypePlugins:[lD],children:n})})}function $D({content:n}){let a="",i=n;try{const l=JSON.parse(n);a=l.tool||"",i=JSON.stringify(l.args,null,2)}catch{}return r.jsxs("div",{className:Ve.toolUseEvent,children:[r.jsxs("div",{className:Ve.toolUseHeader,children:[r.jsx("span",{className:Ve.toolUsePrefix,children:">"}),a?r.jsx("span",{className:Ve.toolUseName,children:a}):null]}),r.jsx("pre",{className:Ve.toolUseArgs,children:i})]})}const v0=5;function qD(n,a){if(a==null)return"";if(typeof a!="object")return String(a);const i=a;if(typeof i.command=="string")return i.command;if(typeof i.file_path=="string")return i.file_path;if(typeof i.pattern=="string"){const l=typeof i.path=="string"?` in ${i.path}`:"";return`${i.pattern}${l}`}if(typeof i.path=="string")return i.path;if(typeof i.query=="string")return i.query;try{const l=JSON.stringify(a);return l.length>150?`${l.slice(0,150)}…`:l}catch{return""}}function YD({content:n,raw:a,toolUseCtx:i}){const[l,c]=b.useState(!1);let d=!1;if(a)try{d=JSON.parse(a).is_error===!0}catch{}const f=n.split(`
|
|
104
104
|
`),m=f.length>v0,p=l?n:f.slice(0,v0).join(`
|
|
105
|
-
`),g=((i==null?void 0:i.tool)??"")||(d?"Tool error":"Tool output"),y=i?qD(i.tool,i.args):"",x=r.jsxs(r.Fragment,{children:[r.jsx("span",{className:d?Ve.toolResultIndicatorError:Ve.toolResultIndicatorOk,"aria-label":d?"error":"success","data-testid":d?"tool-result-indicator-error":"tool-result-indicator-ok",children:d?"✗":"✓"}),r.jsx("span",{className:Ve.toolResultLabel,"data-testid":"tool-result-label",children:g}),m&&r.jsx("span",{className:Ve.toolResultToggle,"aria-hidden":"true",children:l?"▾":"▸"})]});return r.jsxs("div",{className:Ve.toolResultEvent,"data-testid":"tool-result",children:[m?r.jsx("button",{className:Ve.toolResultHeader,"data-testid":"tool-result-header",onClick:()=>{c(S=>!S)},"aria-expanded":l,children:x}):r.jsx("div",{className:Ve.toolResultHeader,"data-testid":"tool-result-header",children:x}),y&&r.jsx("div",{className:Ve.toolResultCommand,children:y}),r.jsxs("pre",{className:Ve.toolResultPre,"data-testid":"tool-result-content",children:[p,!l&&m&&r.jsx("span",{className:Ve.toolResultEllipsis,children:"…"})]})]})}function KD({content:n}){return r.jsxs("div",{className:Ve.errorEvent,children:["Error: ",n]})}function FD({content:n}){return r.jsxs("div",{className:Ve.statusEvent,children:["--- ",n," ---"]})}function ZD({content:n}){return r.jsx("div",{className:Ve.userInputEvent,children:r.jsx("span",{className:Ve.userInputContent,children:n})})}function XD({content:n}){return r.jsxs("div",{className:Ve.signalEvent,"data-testid":"signal-event",children:[r.jsx("span",{className:Ve.signalBadge,children:"SIGNAL"}),r.jsx("span",{className:Ve.signalContent,children:n})]})}function QD({content:n}){let a=n;try{const i=JSON.parse(n),l=Number(i.input_tokens)||0,c=Number(i.output_tokens)||0,d=$x(l+c),f=Bi(Number(i.cost_usd)||0);a=`${d} tokens · ${f}`}catch{}return r.jsx("div",{className:Ve.usageEvent,"data-testid":"usage-event",children:r.jsx("span",{className:Ve.usageBadge,children:a})})}function WD({content:n}){return r.jsx("div",{className:Ve.defaultEvent,children:n})}function JD({event:n,toolUseCtx:a}){const i=new Date(n.timestamp).toLocaleTimeString();switch(n.eventType){case"system":{if(n.raw)try{if(JSON.parse(n.raw).systemContext===!0)return r.jsx(HD,{content:n.content})}catch{}return r.jsx(GD,{time:i,content:n.content})}case"text":case"output":return r.jsx(PD,{content:n.content});case"tool_use":return r.jsx($D,{content:n.content});case"tool_result":return r.jsx(YD,{content:n.content,raw:n.raw,toolUseCtx:a});case"error":return r.jsx(KD,{content:n.content});case"status":return r.jsx(FD,{content:n.content});case"user_input":return r.jsx(ZD,{content:n.content});case"signal":return r.jsx(XD,{content:n.content});case"usage":return r.jsx(QD,{content:n.content});default:return r.jsx(WD,{content:n.content})}}const eR="_overlay_cmicx_1",tR="_dialog_cmicx_11",nR="_title_cmicx_30",aR="_description_cmicx_38",sR="_actions_cmicx_45",iR="_cancelButton_cmicx_52",oR="_confirmButton_cmicx_79",ys={overlay:eR,dialog:tR,title:nR,description:aR,actions:sR,cancelButton:iR,confirmButton:oR};function bc({isOpen:n,title:a,description:i,confirmLabel:l="Delete",onConfirm:c,onCancel:d}){const f=b.useId(),m=b.useId();return r.jsx(Yn,{children:n&&r.jsx(Tt.div,{className:ys.overlay,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.15},onClick:d,onKeyDown:p=>{p.key==="Escape"&&d()},role:"dialog","aria-modal":"true","aria-labelledby":f,"aria-describedby":i?m:void 0,children:r.jsxs(Tt.div,{className:ys.dialog,initial:{opacity:0,scale:.93,y:-10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.93,y:-10},transition:{duration:.15,ease:[.16,1,.3,1]},onClick:p=>p.stopPropagation(),children:[r.jsx("h3",{id:f,className:ys.title,children:a}),i&&r.jsx("p",{id:m,className:ys.description,children:i}),r.jsxs("div",{className:ys.actions,children:[r.jsx("button",{type:"button",className:ys.cancelButton,onClick:d,autoFocus:!0,children:"Cancel"}),r.jsx("button",{type:"button",className:ys.confirmButton,onClick:c,children:l})]})]})})})}const lR="_spinner_1uyt1_1",rR="_spin_1uyt1_1",cR="_sm_1uyt1_14",uR="_md_1uyt1_20",dR="_lg_1uyt1_26",fR="_xl_1uyt1_32",g0={spinner:lR,spin:rR,sm:cR,md:uR,lg:dR,xl:fR};function qx({size:n="md",className:a,label:i="Loading",liveRegion:l=!1}){return r.jsx("span",{className:`${g0.spinner} ${g0[n]} ${a??""}`,role:l?"status":void 0,"aria-label":i,"aria-hidden":l?void 0:!0})}const hR="_splash_1bn1g_1",mR="_logo_1bn1g_11",y0={splash:hR,logo:mR};function Yx(){return r.jsxs("div",{className:y0.splash,"data-testid":"splash-screen",children:[r.jsx("img",{src:"/grackle-logo.png",alt:"Grackle",className:y0.logo}),r.jsx(qx,{size:"xl",label:"Loading Grackle",liveRegion:!0})]})}function pR(n,a){const i=b.useRef(null);b.useEffect(()=>{const l=i.current;if(i.current=n,l===null)return;const c=new Map;for(const f of l)c.set(f.id,f);const d=new Set;for(const f of n){d.add(f.id);const m=c.get(f.id);if(m&&m.status!==f.status&&f.status!=="sleeping"){if(f.status==="connecting"){a("Provisioning environment…","info");continue}f.status==="connected"?a("Environment connected","success"):f.status==="error"?a("Environment provision failed","error"):f.status==="disconnected"&&(m.status==="connected"?a("Environment disconnected","warning"):a("Environment stopped","info"))}}for(const f of l)d.has(f.id)||a("Environment removed","info")},[n,a])}function vR(n,a,i){const l=n.filter(p=>p.status==="running"||p.status==="idle"||p.status==="waiting").length,c=Kx(a),d=a.filter(p=>Df(p,c)).length,f=a.filter(p=>p.status==="paused"||p.status==="failed"||Df(p,c)).length,m=i.filter(p=>p.status==="disconnected"||p.status==="error").length;return{activeSessions:l,blockedTasks:d,attentionTasks:f,unhealthyEnvironments:m}}function Kx(n){const a=new Map;for(const i of n)a.set(i.id,i.status);return a}function Df(n,a){return n.dependsOn.some(i=>a.get(i)!=="complete")}function gR(n,a){var f;const i=new Map;for(const m of a)i.set(m.id,m);const l=Kx(n),c=[];for(const m of n){const p=m.workspaceId?((f=i.get(m.workspaceId))==null?void 0:f.name)??"Unknown":"Unknown";m.status==="failed"?c.push({task:m,reason:"failed",workspaceName:p}):Df(m,l)?c.push({task:m,reason:"blocked",workspaceName:p}):m.status==="paused"&&c.push({task:m,reason:"paused",workspaceName:p})}const d={failed:0,blocked:1,paused:2};return c.sort((m,p)=>(d[m.reason]??3)-(d[p.reason]??3)),c}function yR(n,a){const i=new Map;for(const l of a)i.set(l.id,l);return n.filter(l=>l.status==="running"||l.status==="idle"||l.status==="waiting").map(l=>{var c;return{session:l,environmentName:((c=i.get(l.environmentId))==null?void 0:c.displayName)??"Unknown"}})}function bR(n,a,i){const l=new Map;for(const c of a){if(!c.workspaceId)continue;let d=l.get(c.workspaceId);d||(d={totalTasks:0,completedTasks:0,workingTasks:0,failedTasks:0},l.set(c.workspaceId,d)),d.totalTasks+=1,c.status==="complete"?d.completedTasks+=1:c.status==="working"?d.workingTasks+=1:c.status==="failed"&&(d.failedTasks+=1)}return n.map(c=>{const d=l.get(c.id)??{totalTasks:0,completedTasks:0,workingTasks:0,failedTasks:0};return{workspace:c,totalTasks:d.totalTasks,completedTasks:d.completedTasks,workingTasks:d.workingTasks,failedTasks:d.failedTasks}})}const xR="_dashboard_16pzm_1",_R="_kpiStrip_16pzm_11",SR="_kpiCard_16pzm_23",TR="_kpiValue_16pzm_68",kR="_kpiLabel_16pzm_76",CR="_bodyGrid_16pzm_84",jR="_section_16pzm_96",NR="_sectionHeader_16pzm_109",wR="_sectionIcon_16pzm_118",ER="_sectionTitle_16pzm_123",AR="_sectionCount_16pzm_131",DR="_sectionBody_16pzm_138",RR="_emptyHint_16pzm_143",MR="_sessionRow_16pzm_150",OR="_sessionPrompt_16pzm_177",BR="_sessionEnv_16pzm_186",LR="_sessionRuntime_16pzm_192",IR="_sessionStatus_16pzm_198",zR="_statusDot_16pzm_207",UR="_attentionRow_16pzm_233",VR="_attentionTitle_16pzm_259",HR="_attentionMeta_16pzm_267",GR="_reasonBadge_16pzm_274",PR="_bottomGrid_16pzm_301",$R="_envRow_16pzm_312",qR="_envName_16pzm_323",YR="_envStatusBadge_16pzm_333",KR="_workspaceRow_16pzm_369",FR="_workspaceTop_16pzm_395",ZR="_workspaceName_16pzm_401",XR="_workspaceCounts_16pzm_407",QR="_progressBar_16pzm_415",WR="_progressFill_16pzm_422",pe={dashboard:xR,kpiStrip:_R,kpiCard:SR,kpiValue:TR,kpiLabel:kR,bodyGrid:CR,section:jR,sectionHeader:NR,sectionIcon:wR,sectionTitle:ER,sectionCount:AR,sectionBody:DR,emptyHint:RR,sessionRow:MR,sessionPrompt:OR,sessionEnv:BR,sessionRuntime:LR,sessionStatus:IR,statusDot:zR,attentionRow:UR,attentionTitle:VR,attentionMeta:HR,reasonBadge:GR,bottomGrid:PR,envRow:$R,envName:qR,envStatusBadge:YR,workspaceRow:KR,workspaceTop:FR,workspaceName:ZR,workspaceCounts:XR,progressBar:QR,progressFill:WR},JR={hidden:{opacity:0,y:12},visible:n=>({opacity:1,y:0,transition:{delay:n*.06,duration:.3,ease:"easeOut"}})},Vr={hidden:{opacity:0,y:16},visible:n=>({opacity:1,y:0,transition:{delay:.15+n*.08,duration:.35,ease:"easeOut"}})};function eM(n,a,i,l){const c=[`${n} of ${a} tasks completed`];return i>0&&c.push(`${i} in progress`),l>0&&c.push(`${l} failed`),c.join(", ")}function Hr({value:n,label:a,accent:i,index:l,testId:c}){return r.jsxs(Tt.div,{className:pe.kpiCard,"data-accent":i,"data-testid":c,variants:JR,initial:"hidden",animate:"visible",custom:l,children:[r.jsx("span",{className:pe.kpiValue,children:n}),r.jsx("span",{className:pe.kpiLabel,children:a})]})}function tM(){const{workspaces:n,tasks:a,sessions:i,environments:l,loadTasks:c}=rt(),d=Rt(),f=b.useRef(new Set);b.useEffect(()=>{for(const y of n)f.current.has(y.id)||(f.current.add(y.id),c(y.id))},[n,c]);const m=b.useMemo(()=>vR(i,a,l),[i,a,l]),p=b.useMemo(()=>yR(i,l),[i,l]),v=b.useMemo(()=>gR(a,n),[a,n]),g=b.useMemo(()=>bR(n,a),[n,a,l]);return r.jsxs("div",{className:pe.dashboard,"data-testid":"dashboard",children:[r.jsxs("div",{className:pe.kpiStrip,"data-testid":"dashboard-kpi-strip",children:[r.jsx(Hr,{value:m.activeSessions,label:"Active Sessions",accent:"green",index:0,testId:"kpi-active-sessions"}),r.jsx(Hr,{value:m.blockedTasks,label:"Blocked Tasks",accent:"yellow",index:1,testId:"kpi-blocked-tasks"}),r.jsx(Hr,{value:m.attentionTasks,label:"Needs Attention",accent:"red",index:2,testId:"kpi-attention-tasks"}),r.jsx(Hr,{value:m.unhealthyEnvironments,label:"Unhealthy Envs",accent:"blue",index:3,testId:"kpi-unhealthy-envs"})]}),r.jsxs("div",{className:pe.bodyGrid,children:[r.jsxs(Tt.div,{className:pe.section,variants:Vr,initial:"hidden",animate:"visible",custom:0,"data-testid":"dashboard-active-sessions",children:[r.jsxs("div",{className:pe.sectionHeader,children:[r.jsx("span",{className:pe.sectionIcon,"aria-hidden":"true",children:"●"}),r.jsx("span",{className:pe.sectionTitle,children:"Active Sessions"}),r.jsx("span",{className:pe.sectionCount,children:p.length})]}),r.jsx("div",{className:pe.sectionBody,children:p.length===0?r.jsx("div",{className:pe.emptyHint,children:"No active sessions"}):p.map(({session:y,environmentName:x})=>r.jsxs("button",{type:"button",className:pe.sessionRow,onClick:()=>d(F0(y.id)),"data-testid":"session-row",children:[r.jsx("span",{className:pe.sessionPrompt,title:y.prompt,children:y.prompt||"—"}),r.jsx("span",{className:pe.sessionEnv,children:x}),r.jsx("span",{className:pe.sessionRuntime,children:y.runtime}),r.jsxs("span",{className:pe.sessionStatus,children:[r.jsx("span",{className:pe.statusDot,"data-status":y.status}),y.status]})]},y.id))})]}),r.jsxs(Tt.div,{className:pe.section,variants:Vr,initial:"hidden",animate:"visible",custom:1,"data-testid":"dashboard-needs-attention",children:[r.jsxs("div",{className:pe.sectionHeader,children:[r.jsx("span",{className:pe.sectionIcon,"aria-hidden":"true",children:"⚑"}),r.jsx("span",{className:pe.sectionTitle,children:"Needs Attention"}),r.jsx("span",{className:pe.sectionCount,children:v.length})]}),r.jsx("div",{className:pe.sectionBody,children:v.length===0?r.jsx("div",{className:pe.emptyHint,children:"All clear"}):v.map(({task:y,reason:x,workspaceName:S})=>r.jsxs("button",{type:"button",className:pe.attentionRow,onClick:()=>d(ya(y.id)),"data-testid":"attention-row",children:[r.jsxs("div",{className:pe.attentionTitle,children:[r.jsx("span",{className:pe.reasonBadge,"data-reason":x,children:x}),y.title]}),r.jsx("div",{className:pe.attentionMeta,children:r.jsx("span",{children:S})})]},y.id))})]})]}),r.jsxs("div",{className:pe.bottomGrid,children:[r.jsxs(Tt.div,{className:pe.section,variants:Vr,initial:"hidden",animate:"visible",custom:2,"data-testid":"dashboard-env-health",children:[r.jsxs("div",{className:pe.sectionHeader,children:[r.jsx("span",{className:pe.sectionIcon,"aria-hidden":"true",children:"◈"}),r.jsx("span",{className:pe.sectionTitle,children:"Environment Health"}),r.jsx("span",{className:pe.sectionCount,children:l.length})]}),r.jsx("div",{className:pe.sectionBody,children:l.length===0?r.jsx("div",{className:pe.emptyHint,children:"No environments configured"}):l.map(y=>r.jsxs("div",{className:pe.envRow,"data-testid":"dashboard-env-row",children:[r.jsx("span",{className:pe.envName,children:y.displayName}),r.jsx("span",{className:pe.envStatusBadge,"data-status":y.status,children:y.status})]},y.id))})]}),r.jsxs(Tt.div,{className:pe.section,variants:Vr,initial:"hidden",animate:"visible",custom:3,"data-testid":"dashboard-workspace-snapshot",children:[r.jsxs("div",{className:pe.sectionHeader,children:[r.jsx("span",{className:pe.sectionIcon,"aria-hidden":"true",children:"▦"}),r.jsx("span",{className:pe.sectionTitle,children:"Workspaces"}),r.jsx("span",{className:pe.sectionCount,children:n.length})]}),r.jsx("div",{className:pe.sectionBody,children:g.length===0?r.jsx("div",{className:pe.emptyHint,children:"No workspaces yet"}):g.map(({workspace:y,totalTasks:x,completedTasks:S,workingTasks:T,failedTasks:j})=>{const N=x>0?Math.round(S/x*100):0;return r.jsxs("button",{type:"button",className:pe.workspaceRow,onClick:()=>d(Ei(y.id,y.environmentId)),"data-testid":"workspace-row",children:[r.jsxs("div",{className:pe.workspaceTop,children:[r.jsx("span",{className:pe.workspaceName,children:y.name}),r.jsxs("span",{className:pe.workspaceCounts,"aria-label":eM(S,x,T,j),children:[S,"/",x,T>0&&r.jsxs("span",{style:{color:"var(--accent-green)"},"aria-hidden":"true",children:["▸",T]}),j>0&&r.jsxs("span",{style:{color:"var(--accent-red)"},"aria-hidden":"true",children:["✗",j]})]})]}),x>0&&r.jsx("div",{className:pe.progressBar,children:r.jsx("div",{className:pe.progressFill,style:{width:`${N}%`}})})]},y.id)})})]})]})]})}const nM="_panelContainer_aei9x_1",aM="_emptyState_aei9x_8",sM="_fadeIn_aei9x_1",iM="_workspaceSummary_aei9x_17",oM="_workspaceSummaryTitle_aei9x_28",lM="_workspaceSummarySubtitle_aei9x_32",rM="_header_aei9x_36",cM="_headerInfo_aei9x_69",uM="_killButton_aei9x_75",dM="_headerTitle_aei9x_104",fM="_headerActions_aei9x_119",hM="_taskStatusBadge_aei9x_126",mM="_taskBranch_aei9x_135",pM="_taskBlockedBadge_aei9x_141",vM="_btnPrimary_aei9x_149",gM="_btnDanger_aei9x_180",yM="_btnGhost_aei9x_219",bM="_rejectInput_aei9x_245",xM="_tabBar_aei9x_275",_M="_tab_aei9x_275",SM="_active_aei9x_301",TM="_eventScroll_aei9x_306",kM="_tabContent_aei9x_312",CM="_noContext_aei9x_317",jM="_overviewContent_aei9x_323",NM="_overviewDashboard_aei9x_332",wM="_overviewHero_aei9x_338",EM="_statusBadge_aei9x_345",AM="_statusPending_aei9x_357",DM="_statusAssigned_aei9x_362",RM="_statusInProgress_aei9x_367",MM="_statusReview_aei9x_372",OM="_statusDone_aei9x_377",BM="_statusFailed_aei9x_382",LM="_statusWaitingInput_aei9x_387",IM="_overviewBranchPill_aei9x_392",zM="_branchLink_aei9x_407",UM="_overviewSection_aei9x_418",VM="_overviewLabel_aei9x_424",HM="_overviewValue_aei9x_431",GM="_overviewMuted_aei9x_436",PM="_overviewMarkdown_aei9x_442",$M="_envRow_aei9x_511",qM="_envDot_aei9x_517",YM="_envDotGreen_aei9x_524",KM="_envDotYellow_aei9x_528",FM="_envDotRed_aei9x_532",ZM="_envDotGray_aei9x_536",XM="_depList_aei9x_540",QM="_depItem_aei9x_546",WM="_depBlocked_aei9x_553",JM="_depDone_aei9x_557",e3="_timeline_aei9x_561",t3="_timelineRow_aei9x_567",n3="_timelineKey_aei9x_574",a3="_timelineValue_aei9x_580",s3="_timelineDelta_aei9x_584",i3="_reviewNotes_aei9x_595",o3="_overviewDescription_aei9x_606",l3="_waitingMessage_aei9x_612",r3="_errorMessage_aei9x_616",c3="_eventOverflowWarning_aei9x_620",u3="_attemptSelector_aei9x_634",d3="_attemptLabel_aei9x_650",f3="_attemptButton_aei9x_654",h3="_attemptActive_aei9x_671",m3="_attemptStatus_aei9x_677",p3="_emptyCta_aei9x_683",v3="_ctaTitle_aei9x_695",g3="_ctaDescription_aei9x_701",y3="_ctaButton_aei9x_708",b3="_ctaCreateForm_aei9x_743",x3="_ctaCreateInput_aei9x_749",_3="_ctaCreateOk_aei9x_780",S3="_ctaLink_aei9x_815",T3="_workspaceHeader_aei9x_829",k3="_workspaceName_aei9x_854",C3="_workspaceMeta_aei9x_867",j3="_metaRow_aei9x_875",N3="_metaLabel_aei9x_888",w3="_metaValue_aei9x_903",E3="_archiveButton_aei9x_913",A3="_repoLink_aei9x_943",D3="_metaToggle_aei9x_953",R3="_metaToggleArrow_aei9x_974",M3="_metaToggleArrowOpen_aei9x_979",O3="_progressBarContainer_aei9x_983",B3="_progressBar_aei9x_983",L3="_progressFill_aei9x_999",I3="_progressLabel_aei9x_1006",z3="_metaTimestamps_aei9x_1013",U3="_metaTimestamp_aei9x_1013",L={panelContainer:nM,emptyState:aM,fadeIn:sM,workspaceSummary:iM,workspaceSummaryTitle:oM,workspaceSummarySubtitle:lM,header:rM,headerInfo:cM,killButton:uM,headerTitle:dM,headerActions:fM,taskStatusBadge:hM,taskBranch:mM,taskBlockedBadge:pM,btnPrimary:vM,btnDanger:gM,btnGhost:yM,rejectInput:bM,tabBar:xM,tab:_M,active:SM,eventScroll:TM,tabContent:kM,noContext:CM,overviewContent:jM,overviewDashboard:NM,overviewHero:wM,statusBadge:EM,statusPending:AM,statusAssigned:DM,statusInProgress:RM,statusReview:MM,statusDone:OM,statusFailed:BM,statusWaitingInput:LM,overviewBranchPill:IM,branchLink:zM,overviewSection:UM,overviewLabel:VM,overviewValue:HM,overviewMuted:GM,overviewMarkdown:PM,envRow:$M,envDot:qM,envDotGreen:YM,envDotYellow:KM,envDotRed:FM,envDotGray:ZM,depList:XM,depItem:QM,depBlocked:WM,depDone:JM,timeline:e3,timelineRow:t3,timelineKey:n3,timelineValue:a3,timelineDelta:s3,reviewNotes:i3,overviewDescription:o3,waitingMessage:l3,errorMessage:r3,eventOverflowWarning:c3,attemptSelector:u3,attemptLabel:d3,attemptButton:f3,attemptActive:h3,attemptStatus:m3,emptyCta:p3,ctaTitle:v3,ctaDescription:g3,ctaButton:y3,ctaCreateForm:b3,ctaCreateInput:x3,ctaCreateOk:_3,ctaLink:S3,workspaceHeader:T3,workspaceName:k3,workspaceMeta:C3,metaRow:j3,metaLabel:N3,metaValue:w3,archiveButton:E3,repoLink:A3,metaToggle:D3,metaToggleArrow:R3,metaToggleArrowOpen:M3,progressBarContainer:O3,progressBar:B3,progressFill:L3,progressLabel:I3,metaTimestamps:z3,metaTimestamp:U3};function V3(){return r.jsx("div",{className:L.emptyState,children:"Select a task or click + to create one"})}function H3(){return r.jsx("div",{className:L.emptyState,children:"Select an environment to manage its workspaces, or add a new one."})}function G3(){const{workspaces:n,environments:a}=rt(),i=Rt(),l=a.length>0;return n.length>0?r.jsx(tM,{}):r.jsxs("div",{className:L.emptyCta,"data-testid":"welcome-cta",children:[r.jsx("div",{className:L.ctaTitle,children:"Welcome to Grackle"}),r.jsx("div",{className:L.ctaDescription,children:"Organize your work into workspaces and let agents tackle the tasks."}),r.jsx("button",{className:L.ctaButton,onClick:()=>i(X0),disabled:!l,"data-testid":"welcome-create-button",children:"Create Your First Workspace"}),!l&&r.jsx("div",{className:L.ctaDescription,children:"Add an environment first before creating a workspace."})]})}const Fx=50;function P3(n,a,i,l,c=Fx){return l?n<c:a-n-i<c}function $3(n,a){const i=a-n;return i>0?i:0}function q3({scrollRef:n,contentLength:a,isReversed:i}){const[l,c]=b.useState(!0),d=b.useRef(0),f=b.useRef(!1),m=b.useRef(0);b.useEffect(()=>{const v=n.current;if(!v)return;let g=!0;const y=()=>{m.current||(m.current=requestAnimationFrame(()=>{m.current=0;const x=P3(v.scrollTop,v.scrollHeight,v.clientHeight,i,Fx);x!==g&&(g=x,c(x))}))};return v.addEventListener("scroll",y,{passive:!0}),()=>{v.removeEventListener("scroll",y),m.current&&(cancelAnimationFrame(m.current),m.current=0)}},[n,i]),b.useLayoutEffect(()=>{const v=n.current;!v||f.current||(f.current=!0,i?v.scrollTop=0:v.scrollTop=v.scrollHeight,c(!0))},[n,i]),b.useLayoutEffect(()=>{const v=n.current;if(v){if(i&&!l){const g=$3(d.current,v.scrollHeight);g>0&&(v.scrollTop+=g)}l&&(i?v.scrollTo({top:0,behavior:"smooth"}):v.scrollTo({top:v.scrollHeight,behavior:"smooth"})),d.current=v.scrollHeight}},[a,l,i,n]);const p=b.useCallback(()=>{const v=n.current;if(!v)return;const g=i?0:v.scrollHeight;v.scrollTo({top:g,behavior:"smooth"}),c(!0)},[n,i]);return{isAtAnchor:l,scrollToAnchor:p}}const Y3="_wrapper_p24zt_1",K3="_scrollContainer_p24zt_9",F3="_toolbar_p24zt_15",Z3="_directionToggle_p24zt_22",X3="_scrollToAnchor_p24zt_60",Q3="_scrollToAnchorBottom_p24zt_84",W3="_scrollToAnchorTop_p24zt_88",bs={wrapper:Y3,scrollContainer:K3,toolbar:F3,directionToggle:Z3,scrollToAnchor:X3,scrollToAnchorBottom:Q3,scrollToAnchorTop:W3},Zx="grackle-stream-direction";function J3(){try{return localStorage.getItem(Zx)==="reversed"}catch{return!1}}function e6({eventsDropped:n}){return n<=0?r.jsx(r.Fragment,{}):r.jsxs("div",{className:L.eventOverflowWarning,role:"alert",children:["⚠"," ",n.toLocaleString()," older event",n===1?"":"s"," were dropped — only the most recent 5,000 are shown. Full history is available in the session log."]})}function jh({events:n,eventsDropped:a,emptyState:i}){const l=b.useRef(null),[c,d]=b.useState(J3),f=v2(),m=b.useMemo(()=>c?[...n].reverse():n,[n,c]),{isAtAnchor:p,scrollToAnchor:v}=q3({scrollRef:l,contentLength:n.length,isReversed:c}),g=()=>{const S=!c;d(S);try{localStorage.setItem(Zx,S?"reversed":"default")}catch{}},y=f?0:.2,x=c?-8:8;return r.jsxs("div",{className:bs.wrapper,children:[r.jsx("div",{className:bs.toolbar,children:r.jsx("button",{className:bs.directionToggle,onClick:g,title:c?"Showing newest first":"Showing oldest first","aria-label":c?"Switch to newest at bottom":"Switch to newest at top","data-testid":"direction-toggle",children:c?"↓":"↑"})}),r.jsxs("div",{ref:l,className:bs.scrollContainer,"data-testid":"event-stream-scroll",children:[n.length===0&&i,r.jsx(e6,{eventsDropped:a}),r.jsx(Yn,{initial:!1,children:m.map((S,T)=>{const j=c?n.length-1-T:T;return r.jsx(Tt.div,{initial:{opacity:0,y:x},animate:{opacity:1,y:0},transition:{duration:y,ease:"easeOut"},children:r.jsx(JD,{event:S,toolUseCtx:S.toolUseCtx})},`${S.sessionId}-${S.timestamp}-${j}`)})})]}),r.jsx(Yn,{children:!p&&r.jsxs(Tt.button,{className:`${bs.scrollToAnchor} ${c?bs.scrollToAnchorTop:bs.scrollToAnchorBottom}`,onClick:v,initial:{opacity:0,scale:.9},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.9},transition:{duration:.15},"aria-label":"Scroll to latest","data-testid":"scroll-to-anchor",children:[c?"↑":"↓"," New events"]})})]})}const t6="_bar_1xhb4_1",n6="_input_1xhb4_32",a6="_select_1xhb4_67",s6="_btnPrimary_1xhb4_103",i6="_btnDanger_1xhb4_134",o6="_btnGhost_1xhb4_173",l6="_badge_1xhb4_195",r6="_disconnectHint_1xhb4_205",Wt={bar:t6,input:n6,select:a6,btnPrimary:s6,btnDanger:i6,btnGhost:o6,badge:l6,disconnectHint:r6};function c6(n,a){if(!n)return!1;const i=a.find(l=>l.id===n);return i!==void 0&&(i.status==="disconnected"||i.status==="error")}function u6({environmentId:n,onReconnect:a}){return r.jsxs(r.Fragment,{children:[r.jsx("span",{className:Wt.disconnectHint,"data-testid":"env-disconnect-hint",children:"Environment unavailable"}),r.jsx("button",{type:"button",onClick:()=>a(n),className:Wt.btnGhost,"data-testid":"reconnect-btn",title:"Reconnect the environment to resume messaging",children:"Reconnect"})]})}function ol({mode:n,sessionId:a,environmentId:i,taskId:l,showStop:c,showPersonaSelect:d,onSessionKill:f,personas:m,environments:p,onSendInput:v,onSpawn:g,onStartTask:y,onProvisionEnvironment:x}){const{showToast:S}=Es(),[T,j]=b.useState(""),[N,C]=b.useState(""),A=c6(i,p),E=R=>{if(R.preventDefault(),!!T.trim())if(n==="send"){if(!a||A)return;v(a,T),j("")}else if(n==="spawn"){if(!i)return;g(i,T,N),S("Session started","success"),j(""),C("")}else{if(!l)return;y(l,void 0,i,T),j("")}};return n==="spawn"?r.jsxs("form",{onSubmit:E,className:Wt.bar,children:[r.jsx("span",{className:Wt.badge,children:"new chat"}),r.jsx("input",{type:"text",value:T,onChange:R=>j(R.target.value),placeholder:"Enter prompt...",autoFocus:!0,className:Wt.input}),d&&r.jsxs("select",{value:N,onChange:R=>C(R.target.value),className:Wt.select,children:[r.jsx("option",{value:"",children:"(Default)"}),m.map(R=>r.jsx("option",{value:R.id,children:R.name},R.id))]}),r.jsx("button",{type:"submit",disabled:!T.trim()||!i,className:Wt.btnPrimary,children:"Go"})]}):n==="start"?r.jsxs("form",{onSubmit:E,className:Wt.bar,children:[r.jsx("input",{type:"text",value:T,onChange:R=>j(R.target.value),placeholder:"Type a message...",autoFocus:!0,className:Wt.input}),r.jsx("button",{type:"submit",disabled:!T.trim(),className:Wt.btnPrimary,children:"Send"})]}):r.jsxs("form",{onSubmit:E,className:Wt.bar,children:[A&&i&&r.jsx(u6,{environmentId:i,onReconnect:x}),r.jsx("input",{type:"text",value:T,onChange:R=>j(R.target.value),placeholder:"Type a message...",autoFocus:!A,disabled:A,className:Wt.input}),r.jsx("span",{title:A?"Environment is unavailable — reconnect first":void 0,children:r.jsx("button",{type:"submit",disabled:!T.trim()||A,className:Wt.btnPrimary,children:"Send"})}),c&&f&&r.jsx("button",{type:"button",onClick:f,className:Wt.btnDanger,title:"Stop session",children:"Stop"})]})}function Nh(n){const a=[];for(const i of n){const l=a[a.length-1];i.eventType==="text"&&(l==null?void 0:l.eventType)==="text"?a[a.length-1]={...l,content:l.content+i.content}:a.push(i)}return a}function wh(n){const a=new Map;for(const d of n)if(d.raw)try{a.set(d,JSON.parse(d.raw))}catch{}const i=new Map;for(const d of n){if(d.eventType!=="tool_use")continue;const f=a.get(d);if(!(!f||typeof f.id!="string"))try{const m=JSON.parse(d.content);i.set(f.id,{tool:m.tool,args:m.args})}catch{}}const l=new Set;return n.map(d=>{if(d.eventType!=="tool_result")return d;const f=a.get(d);if(!f||typeof f.tool_use_id!="string")return d;const m=i.get(f.tool_use_id);return m?(l.add(f.tool_use_id),{...d,toolUseCtx:m}):d}).filter(d=>{if(d.eventType!=="tool_use")return!0;const f=a.get(d);return f&&typeof f.id=="string"?!l.has(f.id):!0})}const d6="_panelContainer_pz4cr_1",f6="_emptyState_pz4cr_8",h6="_emptyTitle_pz4cr_20",m6="_emptyDescription_pz4cr_26",p6="_emptyHint_pz4cr_32",$o={panelContainer:d6,emptyState:f6,emptyTitle:h6,emptyDescription:m6,emptyHint:p6};function v6({hasLocalEnvironment:n}){return r.jsxs("div",{className:$o.emptyState,"data-testid":"chat-empty-state",children:[r.jsx("div",{className:$o.emptyTitle,children:"Welcome to Grackle"}),r.jsx("div",{className:$o.emptyDescription,children:n?"Type a message below to start chatting with the System agent. It can help you plan work, create tasks, and coordinate agents.":"Add a local environment in Settings to start chatting."}),!n&&r.jsx("div",{className:$o.emptyHint,children:"Go to Settings → Environments to add one."})]})}function g6(){const{tasks:n,sessions:a,events:i,eventsDropped:l,environments:c,loadTaskSessions:d,loadSessionEvents:f,kill:m,taskSessions:p,sendInput:v,spawn:g,startTask:y,personas:x,provisionEnvironment:S}=rt(),T=b.useRef(void 0),j=n.find(R=>R.id===Oo),N=j!=null&&j.latestSessionId?a.find(R=>R.id===j.latestSessionId)??(p[Oo]??[]).find(R=>R.id===j.latestSessionId):void 0;b.useEffect(()=>{d(Oo)},[d]),b.useEffect(()=>{j!=null&&j.latestSessionId&&d(Oo)},[j==null?void 0:j.latestSessionId,d]),b.useEffect(()=>{N&&N.id!==T.current&&(T.current=N.id,f(N.id))},[N==null?void 0:N.id,f]);const C=b.useMemo(()=>{if(!N)return[];const R=i.filter(w=>w.sessionId===N.id);return wh(Nh(R))},[i,N==null?void 0:N.id]),A=c.find(R=>R.adapterType==="local"&&R.status==="connected"),E=N!==void 0&&N.status!=="stopped"&&N.status!=="suspended";return r.jsxs("div",{className:$o.panelContainer,"data-testid":"chat-page",children:[r.jsx(jh,{events:C,eventsDropped:l,emptyState:r.jsx(v6,{hasLocalEnvironment:!!A})}),A&&E&&r.jsx(ol,{mode:"send",sessionId:N.id,environmentId:N.environmentId,showStop:!0,onSessionKill:()=>m(N.id),personas:x,environments:c,onSendInput:v,onSpawn:g,onStartTask:y,onProvisionEnvironment:S}),A&&!E&&r.jsx(ol,{mode:"start",taskId:Oo,environmentId:A.id,personas:x,environments:c,onSendInput:v,onSpawn:g,onStartTask:y,onProvisionEnvironment:S})]})}function y6(n,a){const i=[];let l=n;const c=new Set;for(;l&&a.has(l)&&!c.has(l);){c.add(l);const d=a.get(l);i.unshift(d),l=d.parentTaskId||void 0}return i}const js={label:"Home",url:Cs};function b6(n){return n?[js,{label:"Settings",url:Yo},{label:n,url:void 0}]:[js,{label:"Settings",url:void 0}]}const Xx={label:"Environments",url:Ai};function x6(){return[js,{label:"Environments",url:void 0}]}function _6(){return[js,{label:"New Chat",url:void 0}]}function S6(n){return[js,{label:`Session ${n.slice(0,8)}`,url:void 0}]}function T6(n,a,i,l){const c=i.find(f=>f.id===n),d=l.find(f=>f.id===a);return[js,Xx,{label:(d==null?void 0:d.displayName)??"Environment",url:Di(a)},{label:(c==null?void 0:c.name)??"Workspace",url:void 0}]}function k6(n,a,i,l,c){const d=y6(n,c),f=c.get(n),m=f==null?void 0:f.workspaceId,p=m?i.find(S=>S.id===m):void 0,v=a??(p==null?void 0:p.environmentId),g=v?l.find(S=>S.id===v):void 0,y=[js];g&&v&&(y.push(Xx),y.push({label:g.displayName,url:Di(v)})),p&&v&&y.push({label:p.name,url:Ei(p.id,v)});for(let S=0;S<d.length-1;S++)y.push({label:d[S].title,url:ya(d[S].id,void 0,m,v)});const x=d[d.length-1];return y.push({label:(x==null?void 0:x.title)??n,url:void 0}),y}function C6(){const n=_6(),[a]=Gf(),i=a.get("env")??"",{sendInput:l,spawn:c,startTask:d,personas:f,environments:m,provisionEnvironment:p}=rt();return r.jsxs("div",{className:L.panelContainer,children:[r.jsx(Ds,{segments:n}),r.jsx("div",{className:L.emptyState,children:"Enter a prompt below to start a new session"}),r.jsx(ol,{mode:"spawn",environmentId:i,showPersonaSelect:!0,personas:f,environments:m,onSendInput:l,onSpawn:c,onStartTask:d,onProvisionEnvironment:p})]})}function j6({sessionId:n,session:a,isActive:i,onKill:l}){return r.jsxs("div",{className:L.header,children:[r.jsxs("span",{children:["Session: ",n.slice(0,8),a&&` | ${a.runtime} | ${a.endReason||a.status}`,a!=null&&a.inputTokens||a!=null&&a.outputTokens||a!=null&&a.costUsd?` | ${$x((a.inputTokens??0)+(a.outputTokens??0))} tokens · ${Bi(a.costUsd??0)}`:""]}),r.jsxs("span",{className:L.headerInfo,children:[a&&r.jsx("span",{children:a.prompt.length>60?a.prompt.slice(0,60)+"...":a.prompt}),i&&r.jsx("button",{onClick:()=>l(n),title:"Stop session",className:L.killButton,children:"×"})]})]})}function N6({session:n}){const a=n&&(n.status==="stopped"||n.status==="suspended"),i=a?`Session ${n.endReason||n.status} with no events recorded.`:"Waiting for events...";return r.jsx("div",{className:a?L.errorMessage:L.waitingMessage,children:i})}function w6(){const{sessionId:n}=Qa(),{events:a,eventsDropped:i,sessions:l,kill:c,loadSessionEvents:d,sendInput:f,spawn:m,startTask:p,personas:v,environments:g,provisionEnvironment:y}=rt(),x=b.useRef(void 0),S=S6(n),T=l.find(C=>C.id===n)??void 0,j=b.useMemo(()=>{const C=n?a.filter(A=>A.sessionId===n):[];return wh(Nh(C))},[a,n]);if(b.useEffect(()=>{n&&n!==x.current&&(x.current=n,d(n))},[n,d]),!n)return r.jsx("div",{className:L.emptyState,children:"No session selected"});const N=(T==null?void 0:T.status)==="running"||(T==null?void 0:T.status)==="idle";return r.jsxs("div",{className:L.panelContainer,children:[r.jsx(Ds,{segments:S}),r.jsx(j6,{sessionId:n,session:T,isActive:N,onKill:c}),r.jsx(jh,{events:j,eventsDropped:i,emptyState:r.jsx(N6,{session:T})}),N&&r.jsx(ol,{mode:"send",sessionId:n,environmentId:T.environmentId,showStop:!0,onSessionKill:()=>c(n),personas:v,environments:g,onSendInput:f,onSpawn:m,onStartTask:p,onProvisionEnvironment:y})]})}const b0=220,x0=70,E6=40,A6=60,D6="hierarchy",R6="dependency";function M6(n){return b.useMemo(()=>{if(n.length===0)return{nodes:[],edges:[]};const a=new jg.graphlib.Graph({multigraph:!0});a.setDefaultEdgeLabel(()=>({})),a.setGraph({rankdir:"TB",nodesep:E6,ranksep:A6});const i=new Map(n.map(f=>[f.id,f])),l=new Map;for(const f of n)if(f.parentTaskId&&i.has(f.parentTaskId)){const m=l.get(f.parentTaskId)||[];m.push(f),l.set(f.parentTaskId,m)}for(const f of n)a.setNode(f.id,{width:b0,height:x0});const c=[];for(const f of n){if(f.parentTaskId&&i.has(f.parentTaskId)){const m=`hierarchy-${f.parentTaskId}-${f.id}`;a.setEdge(f.parentTaskId,f.id,{},m),c.push({id:m,source:f.parentTaskId,target:f.id,type:"smoothstep",data:{edgeType:D6},style:{stroke:"var(--accent-green)",strokeWidth:2},animated:!1})}for(const m of f.dependsOn)if(i.has(m)){const p=`dependency-${m}-${f.id}`;a.setEdge(m,f.id,{},p),c.push({id:p,source:m,target:f.id,type:"smoothstep",data:{edgeType:R6},style:{stroke:"var(--text-tertiary)",strokeWidth:1.5,strokeDasharray:"6 3"},animated:!1})}}return jg.layout(a),{nodes:n.map(f=>{const m=a.node(f.id),p=l.get(f.id)||[];return{id:f.id,type:"task",position:{x:m.x-b0/2,y:m.y-x0/2},data:{task:f,childCount:p.length,doneChildCount:p.filter(v=>v.status==="complete").length,hasDependencies:f.dependsOn.length>0}}}),edges:c}},[n])}const O6="_dagContainer_js4w6_1",B6="_taskNode_js4w6_26",L6="_taskNodeBorder_js4w6_54",I6="_taskNodeContent_js4w6_60",z6="_taskNodeHeader_js4w6_70",U6="_taskNodeIcon_js4w6_77",V6="_taskNodeTitle_js4w6_82",H6="_taskNodeBadges_js4w6_90",G6="_childBadge_js4w6_95",P6="_depBadge_js4w6_107",$6="_handle_js4w6_119",q6="_emptyCta_js4w6_126",Y6="_ctaDescription_js4w6_137",K6="_ctaButton_js4w6_144",$t={dagContainer:O6,taskNode:B6,taskNodeBorder:L6,taskNodeContent:I6,taskNodeHeader:z6,taskNodeIcon:U6,taskNodeTitle:V6,taskNodeBadges:H6,childBadge:G6,depBadge:P6,handle:$6,emptyCta:q6,ctaDescription:Y6,ctaButton:K6};function F6({data:n}){const{task:a,childCount:i,doneChildCount:l,hasDependencies:c}=n,d=Xa(a.status);return r.jsxs("div",{className:$t.taskNode,"data-task-id":a.id,"data-task-title":a.title,children:[r.jsx(Ng,{type:"target",position:wg.Top,className:$t.handle}),r.jsx("div",{className:$t.taskNodeBorder,style:{backgroundColor:d.color}}),r.jsxs("div",{className:$t.taskNodeContent,children:[r.jsxs("div",{className:$t.taskNodeHeader,children:[r.jsx("span",{className:$t.taskNodeIcon,style:{color:d.color},children:d.icon}),r.jsx("span",{className:$t.taskNodeTitle,children:a.title})]}),r.jsxs("div",{className:$t.taskNodeBadges,children:[i>0&&r.jsxs("span",{className:$t.childBadge,children:[l,"/",i]}),c&&r.jsx("span",{className:$t.depBadge,children:"dep"})]})]}),r.jsx(Ng,{type:"source",position:wg.Bottom,className:$t.handle})]})}const Z6=_2,X6={task:F6};function Q6({workspaceId:n,environmentId:a,tasks:i}){const l=Rt(),{resolvedThemeId:c}=sb(),d=b.useMemo(()=>i.filter(y=>y.workspaceId===n),[i,n]),{nodes:f,edges:m}=M6(d),p=b.useMemo(()=>{const y=getComputedStyle(document.documentElement),x={};for(const[S,T]of Object.entries(Z6))x[S]=y.getPropertyValue(T).trim()||"#6b7a8d";return x},[c]),v=b.useCallback((y,x)=>{l(ya(x.id,void 0,n,a))},[l,n,a]),g=b.useCallback(y=>{const x=y.data;return p[x.task.status]||p.pending},[p]);return d.length===0?r.jsxs("div",{className:$t.emptyCta,children:[r.jsx("button",{className:$t.ctaButton,onClick:()=>l(zi(n,void 0,a)),children:"Create Task"}),r.jsx("div",{className:$t.ctaDescription,children:"Create tasks to see the dependency graph"})]}):r.jsx("div",{className:$t.dagContainer,children:r.jsxs(b1,{nodes:f,edges:m,nodeTypes:X6,onNodeClick:v,fitView:!0,fitViewOptions:{padding:.2},minZoom:.3,maxZoom:2,children:[r.jsx(x1,{variant:_1.Dots,gap:24,size:1,color:"var(--text-disabled)"}),r.jsx(S1,{showInteractive:!1}),r.jsx(T1,{nodeColor:g,maskColor:"var(--bg-overlay)",style:{background:"var(--bg-inset)"}})]})})}function W6({tasks:n,taskStatusById:a,sessionStatusByTaskId:i}){const l=new Map;for(const d of n)if(d.parentTaskId){const f=l.get(d.parentTaskId);f?f.push(d):l.set(d.parentTaskId,[d])}const c=new Map(f0.map(d=>[d,[]]));for(const d of n){const f=Ch(d.status),m=d.dependsOn.length>0&&d.dependsOn.some(T=>a.get(T)!=="complete"),p=l.get(d.id)??[],v=p.length,g=p.filter(T=>T.status==="complete").length;let y;if(f==="paused"&&i){const T=i.get(d.id);T==="idle"?y="Needs input":T==="completed"&&(y="Ready to complete")}const x={task:d,isBlocked:m,childCount:v,doneChildCount:g,pausedSubBadge:y},S=c.get(f);S?S.push(x):c.get("not_started").push(x)}for(const d of c.values())d.sort((f,m)=>f.task.sortOrder-m.task.sortOrder);return f0.map(d=>{const f=Xa(d);return{status:d,label:f.label,style:f,tasks:c.get(d)??[]}})}const J6="_boardContainer_1c4y1_1",eO="_column_1c4y1_17",tO="_columnHeader_1c4y1_34",nO="_columnIcon_1c4y1_47",aO="_columnLabel_1c4y1_52",sO="_columnCount_1c4y1_57",iO="_cardList_1c4y1_67",oO="_emptyPlaceholder_1c4y1_76",lO="_card_1c4y1_67",rO="_cardHeader_1c4y1_107",cO="_cardStatusIcon_1c4y1_113",uO="_cardTitle_1c4y1_119",dO="_cardBadges_1c4y1_127",fO="_badge_1c4y1_134",hO="_blockedBadge_1c4y1_146",mO="_childBadge_1c4y1_151",pO="_depBadge_1c4y1_155",vO="_parentBadge_1c4y1_159",gO="_pausedSubBadge_1c4y1_166",yO="_personaBadge_1c4y1_170",bO="_envBadge_1c4y1_174",xO="_emptyCta_1c4y1_178",_O="_ctaButton_1c4y1_188",SO="_ctaDescription_1c4y1_204",Ke={boardContainer:J6,column:eO,columnHeader:tO,columnIcon:nO,columnLabel:aO,columnCount:sO,cardList:iO,emptyPlaceholder:oO,card:lO,cardHeader:rO,cardStatusIcon:cO,cardTitle:uO,cardBadges:dO,badge:fO,blockedBadge:hO,childBadge:mO,depBadge:pO,parentBadge:vO,pausedSubBadge:gO,personaBadge:yO,envBadge:bO,emptyCta:xO,ctaButton:_O,ctaDescription:SO};function TO({workspaceId:n,environmentId:a,tasks:i,sessions:l,personas:c,environments:d}){const f=Rt(),m=b.useMemo(()=>i.filter(x=>x.workspaceId===n),[i,n]),p=b.useMemo(()=>new Map(i.map(x=>[x.id,x.status])),[i]),v=b.useMemo(()=>new Map(m.map(x=>[x.id,x])),[m]),g=b.useMemo(()=>{const x=new Map(l.map(A=>[A.id,A])),S=new Map(c.map(A=>[A.id,A])),T=new Map(d.map(A=>[A.id,A])),j=new Map,N=new Map,C=new Map;for(const A of m)if(A.latestSessionId){const E=x.get(A.latestSessionId);if(E){if(j.set(A.id,E.endReason||E.status),E.personaId){const R=S.get(E.personaId);R&&N.set(A.id,R.name)}if(E.environmentId){const R=T.get(E.environmentId);R&&C.set(A.id,R.displayName)}}}return{sessionStatusByTaskId:j,personaNameByTaskId:N,environmentNameByTaskId:C}},[m,l,c,d]),y=b.useMemo(()=>W6({tasks:m,taskStatusById:p,sessionStatusByTaskId:g.sessionStatusByTaskId}),[m,p,g]);return m.length===0?r.jsxs("div",{className:Ke.emptyCta,"data-testid":"board-empty-cta",children:[r.jsx("button",{className:Ke.ctaButton,onClick:()=>f(zi(n,void 0,a)),children:"Create Task"}),r.jsx("div",{className:Ke.ctaDescription,children:"Break your work into tasks and let agents tackle them"})]}):r.jsx("div",{className:Ke.boardContainer,"data-testid":"board-container",children:y.map(x=>r.jsxs("section",{className:Ke.column,"data-testid":`board-column-${x.status}`,"aria-label":`${x.label}, ${x.tasks.length} ${x.tasks.length===1?"task":"tasks"}`,children:[r.jsxs("div",{className:Ke.columnHeader,children:[r.jsx("span",{className:Ke.columnIcon,style:{color:x.style.color},children:x.style.icon}),r.jsx("span",{className:Ke.columnLabel,children:x.label}),r.jsx("span",{className:Ke.columnCount,"data-testid":`board-count-${x.status}`,children:x.tasks.length})]}),r.jsx("div",{className:Ke.cardList,children:x.tasks.length===0?r.jsx("div",{className:Ke.emptyPlaceholder,children:"No tasks"}):r.jsx(Yn,{mode:"popLayout",children:x.tasks.map(S=>r.jsx(Tt.div,{layout:!0,initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},children:r.jsx(kO,{boardTask:S,tasksById:v,personaName:g.personaNameByTaskId.get(S.task.id),envName:g.environmentNameByTaskId.get(S.task.id),onClick:()=>f(ya(S.task.id,void 0,n,a))})},S.task.id))})})]},x.status))})}function kO({boardTask:n,tasksById:a,personaName:i,envName:l,onClick:c}){const{task:d,isBlocked:f,childCount:m,doneChildCount:p,pausedSubBadge:v}=n,g=Xa(d.status),y=d.parentTaskId?a.get(d.parentTaskId):void 0;return r.jsxs("div",{className:Ke.card,tabIndex:0,role:"button","data-testid":`board-card-${d.id}`,onClick:c,onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(x.preventDefault(),c())},children:[r.jsxs("div",{className:Ke.cardHeader,children:[r.jsx("span",{className:Ke.cardStatusIcon,style:{color:g.color},children:g.icon}),r.jsx("span",{className:Ke.cardTitle,children:d.title})]}),r.jsxs("div",{className:Ke.cardBadges,children:[y&&r.jsx("span",{className:`${Ke.badge} ${Ke.parentBadge}`,title:y.title,children:y.title}),m>0&&r.jsxs("span",{className:`${Ke.badge} ${Ke.childBadge}`,children:[p,"/",m]}),f&&r.jsx("span",{className:`${Ke.badge} ${Ke.blockedBadge}`,children:"blocked"}),d.dependsOn.length>0&&!f&&r.jsx("span",{className:`${Ke.badge} ${Ke.depBadge}`,children:"dep"}),v&&r.jsx("span",{className:`${Ke.badge} ${Ke.pausedSubBadge}`,children:v}),i&&r.jsx("span",{className:`${Ke.badge} ${Ke.personaBadge}`,children:i}),l&&r.jsx("span",{className:`${Ke.badge} ${Ke.envBadge}`,children:l})]})]})}function Eh(n){const{value:a,onSave:i,validate:l,fieldId:c,activeFieldId:d,onActivate:f,enterToSave:m=!0,trimOnSave:p=!0}=n,[v,g]=b.useState(""),[y,x]=b.useState(""),S=b.useRef(!1),T=d===c,j=b.useCallback(I=>{g(I),x("")},[]),N=b.useCallback(()=>{x("")},[]),C=b.useCallback(()=>{S.current=!1,f==null||f(null),g(""),x("")},[f]),A=b.useCallback(()=>{const I=p?v.trim():v;if(l){const q=l(v);if(q){x(q);return}}const U=p?a.trim():a;if(I===U){C();return}i(I),C()},[v,a,p,l,i,C]),E=b.useCallback(()=>{S.current=!0,f==null||f(c),g(a),x("")},[c,a,f]),R=b.useCallback(I=>{if(S.current){S.current=!1;return}I.relatedTarget instanceof HTMLElement&&I.relatedTarget.dataset.editAction===c||A()},[c,A]),w=b.useCallback(I=>{I.key==="Escape"?C():I.key==="Enter"&&m&&A()},[C,m,A]),H=(()=>{if(!T)return!1;const I=p?a.trim():a;return(p?v.trim():v)!==I})();return b.useEffect(()=>{!T&&(v!==""||y!=="")&&(g(""),x(""))},[T,v,y]),{isEditing:T,draft:v,error:y,isDirty:H,startEdit:E,cancelEdit:C,save:A,setDraft:j,clearError:N,handleBlur:R,handleKeyDown:w,ignoreInitialBlurRef:S}}const CO="_editFieldWrapper_yuzty_1",jO="_editInput_yuzty_10",NO="_editTextarea_yuzty_42",wO="_editSelect_yuzty_78",EO="_editError_yuzty_111",AO="_editInputInvalid_yuzty_118",DO="_editHint_yuzty_123",RO="_unsavedDot_yuzty_132",MO="_metaValueClickable_yuzty_140",OO="_editButton_yuzty_159",BO="_metaPlaceholder_yuzty_175",LO="_worktreeToggle_yuzty_180",Pe={editFieldWrapper:CO,editInput:jO,editTextarea:NO,editSelect:wO,editError:EO,editInputInvalid:AO,editHint:DO,unsavedDot:RO,metaValueClickable:MO,editButton:OO,metaPlaceholder:BO,worktreeToggle:LO};function rn(n){const{value:a,onSave:i,validate:l,mode:c="edit",fieldId:d="text",activeFieldId:f,onActivate:m,onChange:p,renderDisplay:v,placeholder:g,maxLength:y,ariaLabel:x,"data-testid":S}=n,T=b.useRef(null),j=Eh({value:a,onSave:i,validate:l,fieldId:d,activeFieldId:f,onActivate:m,enterToSave:!0,trimOnSave:!0});if(b.useEffect(()=>{if(j.isEditing){const C=window.setTimeout(()=>{var A;(A=T.current)==null||A.focus()},0);return()=>window.clearTimeout(C)}},[j.isEditing]),c==="create"){const C=E=>{p==null||p(E.target.value)},A=l==null?void 0:l(a);return r.jsxs("div",{className:Pe.editFieldWrapper,children:[r.jsx("input",{className:`${Pe.editInput} ${A?Pe.editInputInvalid:""}`,value:a,onChange:C,maxLength:y,placeholder:g,"aria-label":x,"data-testid":S?`${S}-input`:void 0}),A&&r.jsx("span",{className:Pe.editError,"data-testid":"edit-error",children:A})]})}if(j.isEditing)return r.jsxs("div",{className:Pe.editFieldWrapper,children:[r.jsx("input",{ref:T,className:`${Pe.editInput} ${j.error?Pe.editInputInvalid:""}`,value:j.draft,onChange:C=>j.setDraft(C.target.value),onBlur:j.handleBlur,onKeyDown:j.handleKeyDown,maxLength:y,placeholder:g,"aria-label":x,"data-testid":S?`${S}-input`:void 0}),j.isDirty&&r.jsx("span",{className:Pe.unsavedDot,title:"Unsaved changes"}),j.error&&r.jsx("span",{className:Pe.editError,"data-testid":"edit-error",children:j.error}),r.jsx("span",{className:Pe.editHint,children:"Enter to save · Esc to cancel"})]});const N=v==null?void 0:v(a);return r.jsxs("span",{role:"button",tabIndex:0,className:Pe.metaValueClickable,onClick:()=>j.startEdit(),onKeyDown:C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),j.startEdit())},title:"Click to edit","aria-label":x,"data-testid":S?`${S}-button`:void 0,children:[N!==void 0?N:a?r.jsx("span",{children:a}):r.jsx("span",{className:Pe.metaPlaceholder,children:g||"None"}),r.jsx("span",{className:Pe.editButton,"aria-hidden":"true",children:"✏️"})]})}function IO(n){const{value:a,onSave:i,validate:l,mode:c="edit",fieldId:d="textarea",activeFieldId:f,onActivate:m,onChange:p,renderDisplay:v,placeholder:g,ariaLabel:y,"data-testid":x}=n,S=b.useRef(null),T=Eh({value:a,onSave:i,validate:l,fieldId:d,activeFieldId:f,onActivate:m,enterToSave:!1,trimOnSave:!1});if(b.useEffect(()=>{if(T.isEditing){const N=window.setTimeout(()=>{var C;(C=S.current)==null||C.focus()},0);return()=>window.clearTimeout(N)}},[T.isEditing]),c==="create"){const N=A=>{p==null||p(A.target.value)},C=l==null?void 0:l(a);return r.jsxs("div",{className:Pe.editFieldWrapper,children:[r.jsx("textarea",{className:`${Pe.editTextarea} ${C?Pe.editInputInvalid:""}`,value:a,onChange:N,placeholder:g,"aria-label":y,"data-testid":x?`${x}-input`:void 0}),C&&r.jsx("span",{className:Pe.editError,"data-testid":"edit-error",children:C})]})}if(T.isEditing)return r.jsxs("div",{className:Pe.editFieldWrapper,children:[r.jsx("textarea",{ref:S,className:`${Pe.editTextarea} ${T.error?Pe.editInputInvalid:""}`,value:T.draft,onChange:N=>T.setDraft(N.target.value),onBlur:T.handleBlur,onKeyDown:T.handleKeyDown,title:y,"aria-label":y,"data-testid":x?`${x}-input`:void 0}),T.isDirty&&r.jsx("span",{className:Pe.unsavedDot,title:"Unsaved changes"}),T.error&&r.jsx("span",{className:Pe.editError,"data-testid":"edit-error",children:T.error}),r.jsx("span",{className:Pe.editHint,children:"Tab to save · Esc to cancel"})]});const j=v==null?void 0:v(a);return r.jsxs("span",{role:"button",tabIndex:0,className:Pe.metaValueClickable,onClick:()=>T.startEdit(),onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),T.startEdit())},title:"Click to edit","aria-label":y,"data-testid":x?`${x}-button`:void 0,children:[j!==void 0?j:a?r.jsx("span",{children:a}):r.jsx("span",{className:Pe.metaPlaceholder,children:g||"None"}),r.jsx("span",{className:Pe.editButton,"aria-hidden":"true",children:"✏️"})]})}function Qx(n){var E;const{value:a,onSave:i,mode:l="edit",options:c,fieldId:d="select",activeFieldId:f,onActivate:m,onChange:p,renderDisplay:v,placeholder:g,ariaLabel:y,"data-testid":x}=n,S=b.useRef(null),T=Eh({value:a,onSave:i,fieldId:d,activeFieldId:f,onActivate:m,enterToSave:!1,trimOnSave:!1});b.useEffect(()=>{if(T.isEditing){const R=window.setTimeout(()=>{var w;(w=S.current)==null||w.focus()},0);return()=>window.clearTimeout(R)}},[T.isEditing]);const j=b.useCallback(R=>{const w=R.target.value;T.ignoreInitialBlurRef.current=!1,w!==a&&i(w),T.cancelEdit()},[a,i,T]),N=b.useCallback(R=>{if(T.ignoreInitialBlurRef.current){T.ignoreInitialBlurRef.current=!1;return}R.relatedTarget instanceof HTMLElement&&R.relatedTarget.dataset.editAction===d||T.cancelEdit()},[d,T]);if(l==="create")return r.jsx("select",{className:Pe.editSelect,value:a,onChange:R=>p==null?void 0:p(R.target.value),"aria-label":y,"data-testid":x?`${x}-select`:void 0,children:c.map(R=>r.jsx("option",{value:R.value,children:R.label},R.value))});if(T.isEditing)return r.jsx("select",{ref:S,className:Pe.editSelect,value:T.draft,onChange:j,onBlur:N,title:y,"aria-label":y,"data-testid":x?`${x}-select`:void 0,children:c.map(R=>r.jsx("option",{value:R.value,children:R.label},R.value))});const C=v==null?void 0:v(a),A=(E=c.find(R=>R.value===a))==null?void 0:E.label;return r.jsxs("button",{type:"button",className:Pe.metaValueClickable,onClick:()=>T.startEdit(),title:"Click to change","aria-label":y,"data-testid":x?`${x}-button`:void 0,children:[C!==void 0?C:A?r.jsx("span",{children:A}):r.jsx("span",{className:Pe.metaPlaceholder,children:g||"None"}),r.jsx("span",{className:Pe.editButton,"aria-hidden":"true",children:"✏️"})]})}function zO(n){const{checked:a,onChange:i,label:l,ariaLabel:c,"data-testid":d}=n;return r.jsxs("label",{className:Pe.worktreeToggle,"data-testid":d,children:[r.jsx("input",{type:"checkbox",checked:a,onChange:f=>i(f.target.checked),"aria-label":c}),r.jsx("span",{children:l})]})}const UO="_envRow_1e1r5_1",VO="_envDot_1e1r5_7",HO="_envDotGreen_1e1r5_14",GO="_envDotYellow_1e1r5_18",PO="_envDotRed_1e1r5_22",$O="_envDotGray_1e1r5_26",wi={envRow:UO,envDot:VO,envDotGreen:HO,envDotYellow:GO,envDotRed:PO,envDotGray:$O};function qO(n){const a=n.toLowerCase();return a==="ready"||a==="running"||a==="available"||a==="connected"?wi.envDotGreen:a==="provisioning"||a==="starting"||a==="pending"||a==="connecting"?wi.envDotYellow:a==="error"||a==="failed"||a==="disconnected"?wi.envDotRed:wi.envDotGray}function YO(n){const{value:a,onSave:i,environments:l,allowNone:c=!1,fieldId:d="environment",activeFieldId:f,onActivate:m,placeholder:p="No environment",ariaLabel:v="Environment","data-testid":g}=n,y=l.find(T=>T.id===a),x=[...c?[{value:"",label:"None"}]:[],...l.map(T=>({value:T.id,label:T.displayName}))],S=()=>{if(y)return r.jsxs("span",{className:wi.envRow,children:[r.jsx("span",{className:`${wi.envDot} ${qO(y.status)}`}),y.displayName]})};return r.jsx(Qx,{value:a,onSave:i,options:x,fieldId:d,activeFieldId:f,onActivate:m,renderDisplay:S,placeholder:p,ariaLabel:v,"data-testid":g})}function _0(n){if(!n)return"";const a=new Date(n);if(isNaN(a.getTime()))return"";const l=Date.now()-a.getTime();if(l<0)return"just now";const c=Math.floor(l/6e4);if(c<1)return"just now";if(c<60)return`${c}m ago`;const d=Math.floor(c/60);if(d<24)return`${d}h ago`;const f=Math.floor(d/24);return f<30?`${f}d ago`:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}const tf=100;function KO(){const{workspaceId:n,environmentId:a}=Qa(),i=Rt(),{tasks:l,environments:c,workspaces:d,personas:f,sessions:m,archiveWorkspace:p,updateWorkspace:v,usageCache:g,loadUsage:y}=rt(),[x,S]=b.useState("tasks"),[T,j]=b.useState(!1),[N,C]=b.useState(null),[A,E]=b.useState(!1),R=b.useRef(void 0),w=d.find(K=>K.id===n),H=a??(w==null?void 0:w.environmentId)??"",I=T6(n,H,d,c);b.useEffect(()=>{const K=R.current;R.current=n,!(K===void 0||K===n)&&N!==null&&C(null)},[n,N]);const U=m.reduce((K,ne)=>K+(ne.costUsd??0),0);b.useEffect(()=>{n&&y("workspace",n)},[n,y,U]);const q=n?g[`workspace:${n}`]:void 0,ee=l.filter(K=>K.workspaceId===n),ae=ee.filter(K=>K.status==="complete").length,ce=ee.length,re=ce>0?Math.round(ae/ce*100):0;return r.jsxs("div",{className:L.panelContainer,children:[r.jsx(Ds,{segments:I}),r.jsxs("div",{className:L.workspaceHeader,children:[r.jsx("span",{className:L.workspaceName,"data-testid":"workspace-name",children:r.jsx(rn,{value:(w==null?void 0:w.name)||"",onSave:K=>{w&&v(w.id,{name:K})},validate:K=>{const ne=K.trim();if(!ne)return"Name is required";if(ne.length>tf)return`Max ${tf} characters`},maxLength:tf,fieldId:"name",activeFieldId:N,onActivate:C,ariaLabel:"Workspace name",renderDisplay:K=>K||n||void 0,"data-testid":"edit-name"})}),r.jsx("button",{className:L.archiveButton,onClick:()=>j(!0),title:"Archive workspace","data-testid":"archive-workspace-button",children:"Archive"})]}),r.jsxs("button",{className:L.metaToggle,onClick:()=>E(!A),"aria-expanded":!A,"aria-controls":"workspace-meta-panel","data-testid":"meta-toggle",children:[r.jsx("span",{className:`${L.metaToggleArrow} ${A?"":L.metaToggleArrowOpen}`,children:"▶"}),"Details"]}),!A&&r.jsxs("div",{className:L.workspaceMeta,"data-testid":"workspace-meta",id:"workspace-meta-panel",children:[r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Description"}),r.jsx("div",{className:L.metaValue,children:r.jsx(IO,{value:(w==null?void 0:w.description)||"",onSave:K=>{w&&v(w.id,{description:K})},fieldId:"description",activeFieldId:N,onActivate:C,renderDisplay:K=>K?r.jsx("span",{className:L.overviewMarkdown,children:r.jsx(Rf,{remarkPlugins:[Mf],children:K})}):void 0,placeholder:"No description",ariaLabel:"Workspace description","data-testid":"edit-description"})})]}),r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Repository"}),r.jsx("div",{className:L.metaValue,children:r.jsx(rn,{value:(w==null?void 0:w.repoUrl)||"",onSave:K=>{w&&v(w.id,{repoUrl:K})},validate:K=>{const ne=K.trim();if(ne&&!/^https?:\/\/.+/.test(ne))return"Must be a valid http(s) URL"},fieldId:"repoUrl",activeFieldId:N,onActivate:C,renderDisplay:K=>K&&/^https?:\/\//i.test(K)?r.jsx("a",{className:L.repoLink,href:K,target:"_blank",rel:"noopener noreferrer",onClick:ne=>ne.stopPropagation(),children:K}):K?r.jsx("span",{children:K}):void 0,placeholder:"No repository",ariaLabel:"Workspace repository URL","data-testid":"edit-repo"})})]}),r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Environment"}),r.jsx("div",{className:L.metaValue,children:r.jsx(YO,{value:(w==null?void 0:w.environmentId)||"",onSave:K=>{w&&K&&v(w.id,{environmentId:K})},environments:c,fieldId:"environmentId",activeFieldId:N,onActivate:C,placeholder:"Select environment",ariaLabel:"Workspace environment","data-testid":"edit-env"})})]}),r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Persona"}),r.jsx("div",{className:L.metaValue,children:r.jsx(Qx,{value:(w==null?void 0:w.defaultPersonaId)||"",onSave:K=>{w&&v(w.id,{defaultPersonaId:K})},options:[{value:"",label:"(Inherit)"},...f.map(K=>({value:K.id,label:K.name}))],fieldId:"defaultPersonaId",activeFieldId:N,onActivate:C,renderDisplay:K=>{const ne=f.find(O=>O.id===K);if(ne)return r.jsx("span",{children:ne.name})},placeholder:(w==null?void 0:w.defaultPersonaId)||"(Inherit)",ariaLabel:"Workspace default persona","data-testid":"edit-persona"})})]}),r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Worktrees"}),r.jsx("div",{className:L.metaValue,children:r.jsx(zO,{checked:(w==null?void 0:w.useWorktrees)??!0,onChange:K=>{w&&v(w.id,{useWorktrees:K})},label:"Enable worktree isolation","data-testid":"worktree-toggle"})})]}),r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Working Dir"}),r.jsx("div",{className:L.metaValue,children:r.jsx(rn,{value:(w==null?void 0:w.worktreeBasePath)||"",onSave:K=>{w&&v(w.id,{worktreeBasePath:K})},fieldId:"worktreeBasePath",activeFieldId:N,onActivate:C,placeholder:"Default (server default)",ariaLabel:"Working directory","data-testid":"edit-worktree-base-path"})})]}),w&&r.jsxs("div",{className:L.metaTimestamps,children:[r.jsxs("span",{className:L.metaTimestamp,children:["Created ",_0(w.createdAt)]}),w.updatedAt&&w.updatedAt!==w.createdAt&&r.jsxs("span",{className:L.metaTimestamp,children:["· Updated ",_0(w.updatedAt)]})]})]}),ce>0&&r.jsxs("div",{className:L.progressBarContainer,"data-testid":"progress-bar",children:[r.jsx("div",{className:L.progressBar,children:r.jsx("div",{className:L.progressFill,style:{width:`${re}%`}})}),r.jsxs("span",{className:L.progressLabel,children:[ae,"/",ce]})]}),q&&q.costUsd>0&&r.jsx("div",{className:L.progressBarContainer,children:r.jsxs("span",{className:L.progressLabel,children:["Usage: ",Bi(q.costUsd)," (",q.sessionCount," session",q.sessionCount!==1?"s":"",")"]})}),r.jsxs("div",{className:L.tabBar,role:"tablist","aria-label":"Workspace view",children:[r.jsx("button",{role:"tab","aria-selected":x==="graph",className:`${L.tab} ${x==="graph"?L.active:""}`,onClick:()=>S("graph"),children:"Graph"}),r.jsx("button",{role:"tab","aria-selected":x==="board",className:`${L.tab} ${x==="board"?L.active:""}`,onClick:()=>S("board"),"data-testid":"board-tab",children:"Board"}),r.jsx("button",{role:"tab","aria-selected":x==="tasks",className:`${L.tab} ${x==="tasks"?L.active:""}`,onClick:()=>S("tasks"),children:"Tasks"})]}),x==="tasks"&&ce>0&&r.jsxs("div",{className:L.workspaceSummary,children:[r.jsx("span",{className:L.workspaceSummaryTitle,children:`${ae}/${ce} tasks complete`}),r.jsx("span",{className:L.workspaceSummarySubtitle,children:"Select a task or click + to create one"})]}),x==="tasks"&&ce===0&&r.jsxs("div",{className:L.emptyCta,children:[r.jsx("button",{className:L.ctaButton,onClick:()=>i(zi(n,void 0,H)),children:"Create Task"}),r.jsx("div",{className:L.ctaDescription,children:"Break your work into tasks and let agents tackle them"})]}),x==="board"&&r.jsx(TO,{workspaceId:n,environmentId:H,tasks:l,sessions:m,personas:f,environments:c}),x==="graph"&&r.jsx(Q6,{workspaceId:n,environmentId:H,tasks:l}),r.jsx(bc,{isOpen:T,title:"Archive Workspace?",description:"This will hide the workspace from the sidebar. Tasks will not be deleted.",confirmLabel:"Archive",onConfirm:()=>{w&&(p(w.id),i("/",{replace:!0})),j(!1)},onCancel:()=>j(!1)})]})}const FO="_formContent_ymnez_1",ZO="_section_ymnez_13",XO="_label_ymnez_19",QO="_titleInput_ymnez_26",WO="_descriptionTextarea_ymnez_58",JO="_selectField_ymnez_94",eB="_checkboxRow_ymnez_128",tB="_checkboxLabel_ymnez_141",nB="_fieldError_ymnez_146",it={formContent:FO,section:ZO,label:XO,titleInput:QO,descriptionTextarea:WO,selectField:JO,checkboxRow:eB,checkboxLabel:tB,fieldError:nB};function aB(n,a){return{name:(n==null?void 0:n.name)??"",description:(n==null?void 0:n.description)??"",repoUrl:(n==null?void 0:n.repoUrl)??"",environmentId:(n==null?void 0:n.environmentId)??a??"",defaultPersonaId:(n==null?void 0:n.defaultPersonaId)??"",useWorktrees:(n==null?void 0:n.useWorktrees)??!0,worktreeBasePath:(n==null?void 0:n.worktreeBasePath)??""}}const sB=100;function iB({values:n,onChange:a,environments:i,personas:l,errors:c,disabled:d,autoFocusName:f}){const m=(p,v)=>{a({...n,[p]:v})};return r.jsxs("div",{className:it.formContent,children:[r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-name",children:"Name"}),r.jsx("input",{id:"ws-name",className:it.titleInput,type:"text",value:n.name,onChange:p=>m("name",p.target.value),placeholder:"Workspace name",maxLength:sB,autoFocus:f,disabled:d,"data-testid":"workspace-form-name"}),(c==null?void 0:c.name)&&r.jsx("span",{className:it.fieldError,"data-testid":"workspace-form-error-name",children:c.name})]}),r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-description",children:"Description"}),r.jsx("textarea",{id:"ws-description",className:it.descriptionTextarea,value:n.description,onChange:p=>m("description",p.target.value),placeholder:"Optional description (Markdown supported)",disabled:d,"data-testid":"workspace-form-description"})]}),r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-repo",children:"Repository URL"}),r.jsx("input",{id:"ws-repo",className:it.titleInput,type:"text",value:n.repoUrl,onChange:p=>m("repoUrl",p.target.value),placeholder:"https://github.com/org/repo",disabled:d,"data-testid":"workspace-form-repo"}),(c==null?void 0:c.repoUrl)&&r.jsx("span",{className:it.fieldError,"data-testid":"workspace-form-error-repoUrl",children:c.repoUrl})]}),r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-environment",children:"Environment"}),r.jsxs("select",{id:"ws-environment",className:it.selectField,value:n.environmentId,onChange:p=>m("environmentId",p.target.value),disabled:d,"data-testid":"workspace-form-environment",children:[r.jsx("option",{value:"",children:"Select environment…"}),i.map(p=>r.jsx("option",{value:p.id,children:p.displayName||p.id},p.id))]}),(c==null?void 0:c.environmentId)&&r.jsx("span",{className:it.fieldError,"data-testid":"workspace-form-error-environmentId",children:c.environmentId})]}),r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-persona",children:"Default Persona"}),r.jsxs("select",{id:"ws-persona",className:it.selectField,value:n.defaultPersonaId,onChange:p=>m("defaultPersonaId",p.target.value),disabled:d,"data-testid":"workspace-form-persona",children:[r.jsx("option",{value:"",children:"(Inherit)"}),l.map(p=>r.jsx("option",{value:p.id,children:p.name},p.id))]})]}),r.jsx("div",{className:it.section,children:r.jsxs("label",{className:it.checkboxRow,children:[r.jsx("input",{type:"checkbox",checked:n.useWorktrees,onChange:p=>m("useWorktrees",p.target.checked),disabled:d,"data-testid":"workspace-form-worktrees"}),r.jsx("span",{className:it.checkboxLabel,children:"Enable worktree isolation"})]})}),r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-workdir",children:"Working Directory"}),r.jsx("input",{id:"ws-workdir",className:it.titleInput,type:"text",value:n.worktreeBasePath,onChange:p=>m("worktreeBasePath",p.target.value),placeholder:"Default (server default)",disabled:d,"data-testid":"workspace-form-workdir"})]})]})}const oB="_container_cddyd_1",lB="_header_cddyd_8",rB="_headerTitle_cddyd_35",cB="_badge_cddyd_44",uB="_headerActions_cddyd_54",dB="_body_cddyd_61",fB="_formContent_cddyd_73",hB="_section_cddyd_85",mB="_label_cddyd_91",pB="_titleInput_cddyd_98",vB="_descriptionTextarea_cddyd_131",gB="_parentContext_cddyd_167",yB="_parentLabel_cddyd_175",bB="_parentName_cddyd_182",xB="_personaSelect_cddyd_186",_B="_depList_cddyd_220",SB="_depItem_cddyd_226",TB="_depItemSelected_cddyd_248",kB="_noDeps_cddyd_252",CB="_btnPrimary_cddyd_258",jB="_btnGhost_cddyd_289",Ee={container:oB,header:lB,headerTitle:rB,badge:cB,headerActions:uB,body:dB,formContent:fB,section:hB,label:mB,titleInput:pB,descriptionTextarea:vB,parentContext:gB,parentLabel:yB,parentName:bB,personaSelect:xB,depList:_B,depItem:SB,depItemSelected:TB,noDeps:kB,btnPrimary:CB,btnGhost:jB};function NB(n){const a={};return n.name.trim()||(a.name="Name is required"),n.repoUrl.trim()&&!/^https?:\/\/.+/i.test(n.repoUrl.trim())&&(a.repoUrl="Must be a valid http(s) URL"),n.environmentId||(a.environmentId="Environment is required"),Object.keys(a).length>0?a:void 0}const wB=[{label:"Home",url:Cs},{label:"New Workspace",url:void 0}];function EB(){const[n]=Gf(),a=n.get("environment")??void 0,{environments:i,personas:l,createWorkspace:c,workspaceCreating:d}=rt(),{showToast:f}=Es(),m=Rt(),[p,v]=b.useState(()=>{var N;return aB(void 0,a||((N=i[0])==null?void 0:N.id))}),[g,y]=b.useState(),[x,S]=b.useState();b.useEffect(()=>{a||p.environmentId||i.length===0||v(N=>{var C;return N.environmentId?N:{...N,environmentId:((C=i[0])==null?void 0:C.id)??""}})},[i,a,p.environmentId]);const T=()=>{const N=NB(p);if(N){y(N),S(void 0);return}y(void 0),S(void 0),c(p.name.trim(),p.description,p.repoUrl.trim(),p.environmentId,p.defaultPersonaId,p.useWorktrees,p.worktreeBasePath,()=>{f("Workspace created","success"),m(Cs,{replace:!0})},C=>{S(C)})},j=()=>{m(a?Di(a):Cs,{replace:!0})};return r.jsxs("div",{className:Ee.container,children:[r.jsxs("div",{className:Ee.header,children:[r.jsx("div",{className:Ee.headerTitle,children:r.jsx(Ds,{segments:wB})}),r.jsxs("div",{className:Ee.headerActions,children:[r.jsx("button",{className:Ee.btnGhost,onClick:j,disabled:d,"data-testid":"workspace-create-cancel",children:"Cancel"}),r.jsx("button",{className:Ee.btnPrimary,onClick:T,disabled:d||!p.name.trim()||!p.environmentId,"data-testid":"workspace-create-save",children:d?r.jsx(qx,{size:"sm",label:"Creating"}):"Create Workspace"})]})]}),r.jsxs("div",{className:Ee.body,children:[r.jsx(iB,{values:p,onChange:N=>{v(N),y(void 0),S(void 0)},environments:i,personas:l,errors:g,disabled:d,autoFocusName:!0}),x&&r.jsx("div",{className:Ee.error,"data-testid":"workspace-create-submit-error",children:x})]})]})}function Wx({mode:n,taskId:a,workspaceId:i,parentTaskId:l,environmentId:c,tasks:d,workspaces:f,personas:m,onCreateTask:p,onUpdateTask:v}){const{showToast:g}=Es(),y=Rt(),x=n==="edit",S=x&&a?d.find(W=>W.id===a):void 0,T=x?(S==null?void 0:S.workspaceId)??"":i??"",[j,N]=b.useState(T),C=T||j,A=f.find(W=>W.id===C),E=c??(A==null?void 0:A.environmentId),R=!x&&!i,w=x?(S==null?void 0:S.parentTaskId)??"":l??"",H=w?d.find(W=>W.id===w):void 0,[I,U]=b.useState((S==null?void 0:S.title)??""),[q,ee]=b.useState((S==null?void 0:S.description)??""),[ae,ce]=b.useState((S==null?void 0:S.dependsOn)??[]),[re,K]=b.useState((S==null?void 0:S.defaultPersonaId)??""),[ne,O]=b.useState((S==null?void 0:S.canDecompose)??!1),[P,se]=b.useState(!1),oe=b.useRef(!1);b.useEffect(()=>{x&&S&&!oe.current&&(oe.current=!0,U(S.title),ee(S.description),ce(S.dependsOn),K(S.defaultPersonaId),O(S.canDecompose))},[x,S]);const Y=d.filter(W=>W.workspaceId===C&&(!x||W.id!==a)&&W.id!==w),be=I.trim().length>0&&(!x||S!==void 0)&&C.length>0,Ne=W=>{ce(tt=>tt.includes(W)?tt.filter(Re=>Re!==W):[...tt,W])},xe=()=>{!be||P||x&&S===void 0||(x&&a?(v(a,I.trim(),q,ae,re),g("Task updated","success"),y(ya(a,void 0,C,E),{replace:!0})):(se(!0),p(C,I.trim(),q,ae.length>0?ae:void 0,w||void 0,re,ne,()=>{g("Task created","success"),y(i?Ei(i,E):"/tasks",{replace:!0})},W=>{g(W,"error"),se(!1)})))},J=()=>{y(x&&a?ya(a,void 0,C,E):i?Ei(i,E):"/tasks")},le=x?"edit task":w?"child task":"new task";return r.jsxs("div",{className:Ee.container,children:[r.jsxs("div",{className:Ee.header,children:[r.jsxs("div",{className:Ee.headerTitle,children:[r.jsx("span",{className:Ee.badge,children:le}),H&&r.jsxs("span",{className:Ee.parentContext,children:[r.jsx("span",{className:Ee.parentLabel,children:"Child of"}),r.jsx("span",{className:Ee.parentName,children:H.title})]})]}),r.jsxs("div",{className:Ee.headerActions,children:[r.jsx("button",{onClick:xe,disabled:!be||P,className:Ee.btnPrimary,"data-testid":"task-edit-save",children:P?"Creating…":x?"Save Changes":"Create"}),r.jsx("button",{onClick:J,className:Ee.btnGhost,children:"Cancel"})]})]}),r.jsx("div",{className:Ee.body,children:r.jsxs("div",{className:Ee.formContent,children:[R&&r.jsxs("div",{className:Ee.section,children:[r.jsx("label",{className:Ee.label,htmlFor:"task-edit-workspace",children:"Workspace"}),r.jsxs("select",{id:"task-edit-workspace",value:j,onChange:W=>N(W.target.value),className:Ee.personaSelect,"data-testid":"task-edit-workspace",children:[r.jsx("option",{value:"",children:"Select a workspace..."}),f.map(W=>r.jsx("option",{value:W.id,children:W.name},W.id))]})]}),r.jsxs("div",{className:Ee.section,children:[r.jsx("label",{className:Ee.label,htmlFor:"task-edit-title",children:"Title"}),r.jsx("input",{id:"task-edit-title",type:"text",value:I,onChange:W=>U(W.target.value),placeholder:"Task title...",autoFocus:!0,className:Ee.titleInput,"data-testid":"task-edit-title",onKeyDown:W=>{W.key==="Enter"&&be&&xe()}})]}),r.jsxs("div",{className:Ee.section,children:[r.jsx("label",{className:Ee.label,htmlFor:"task-edit-description",children:"Description"}),r.jsx("textarea",{id:"task-edit-description",value:q,onChange:W=>ee(W.target.value),placeholder:"Describe the task... (markdown supported)",className:Ee.descriptionTextarea,"data-testid":"task-edit-description",rows:8})]}),r.jsxs("div",{className:Ee.section,children:[r.jsx("label",{className:Ee.label,htmlFor:"task-edit-persona",children:"Default Persona"}),r.jsxs("select",{id:"task-edit-persona",value:re,onChange:W=>K(W.target.value),className:Ee.personaSelect,"data-testid":"task-edit-persona",children:[r.jsx("option",{value:"",children:"(Inherit)"}),m.map(W=>r.jsx("option",{value:W.id,children:W.name},W.id))]})]}),!x&&r.jsx("div",{className:Ee.section,children:r.jsxs("label",{className:Ee.depItem,"data-testid":"task-edit-can-decompose",children:[r.jsx("input",{type:"checkbox",checked:ne,onChange:W=>O(W.target.checked)}),"Can spawn subtasks"]})}),r.jsxs("div",{className:Ee.section,children:[r.jsx("div",{className:Ee.label,children:"Dependencies"}),Y.length===0?r.jsx("div",{className:Ee.noDeps,children:"No other tasks in this workspace"}):r.jsx("div",{className:Ee.depList,children:Y.map(W=>{const tt=ae.includes(W.id);return r.jsxs("label",{className:`${Ee.depItem} ${tt?Ee.depItemSelected:""}`,"data-testid":`dep-option-${W.id}`,children:[r.jsx("input",{type:"checkbox",checked:tt,onChange:()=>Ne(W.id)}),W.title,r.jsxs("span",{style:{opacity:.5,fontSize:"11px",marginLeft:"4px"},children:["(",W.status,")"]})]},W.id)})})]})]})})]})}function S0(){const{workspaceId:n,environmentId:a}=Qa(),[i]=Gf(),l=n??i.get("workspace")??"",c=i.get("parent")??void 0,{tasks:d,workspaces:f,personas:m,createTask:p,updateTask:v}=rt();return r.jsx(Wx,{mode:"new",workspaceId:l,parentTaskId:c,environmentId:a,tasks:d,workspaces:f,personas:m,onCreateTask:p,onUpdateTask:v})}function T0(){const{taskId:n,workspaceId:a,environmentId:i}=Qa(),{tasks:l,workspaces:c,personas:d,createTask:f,updateTask:m}=rt();return r.jsx(Wx,{mode:"edit",taskId:n,workspaceId:a,environmentId:i,tasks:l,workspaces:c,personas:d,onCreateTask:f,onUpdateTask:m})}const AB="_container_1pqxm_1",DB="_emptyState_1pqxm_8",RB="_card_1pqxm_14",MB="_cardHeader_1pqxm_34",OB="_categoryBadge_1pqxm_46",BB="_findingTitle_1pqxm_54",LB="_findingDate_1pqxm_60",IB="_findingContent_1pqxm_72",zB="_tags_1pqxm_78",UB="_tag_1pqxm_78",Hn={container:AB,emptyState:DB,card:RB,cardHeader:MB,categoryBadge:OB,findingTitle:BB,findingDate:LB,findingContent:IB,tags:zB,tag:UB};function VB(n){const a=new Date(n),i=new Date,l=i.getTime()-a.getTime(),c=Math.floor(l/1e3),d=Math.floor(c/60),f=Math.floor(d/60),m=Math.floor(f/24);if(c<60)return"just now";if(d<60)return`${d}m ago`;if(f<24)return`${f}h ago`;if(m===1)return"yesterday";if(m<7)return`${m} days ago`;const p=a.getFullYear()===i.getFullYear(),v=a.toLocaleString("en-US",{month:"short"}),g=a.getDate();return p?`${v} ${g}`:`${v} ${g} ${a.getFullYear()}`}const k0={architecture:{text:"var(--accent-blue)",bg:"var(--accent-blue-dim)"},api:{text:"var(--accent-green)",bg:"var(--accent-green-dim)"},bug:{text:"var(--accent-red)",bg:"var(--accent-red-dim)"},decision:{text:"var(--accent-yellow)",bg:"var(--accent-yellow-dim)"},dependency:{text:"var(--accent-purple)",bg:"var(--accent-purple-dim)"},pattern:{text:"var(--accent-cyan)",bg:"var(--accent-cyan-dim)"},general:{text:"var(--text-secondary)",bg:"var(--bg-elevated)"}};function HB({findings:n}){return n.length===0?r.jsx("div",{className:Hn.emptyState,children:"No findings yet. Agents will post discoveries here."}):r.jsx("div",{className:Hn.container,children:n.map((a,i)=>{const l=k0[a.category]||k0.general;return r.jsxs(Tt.div,{className:Hn.card,initial:{opacity:0,y:8},animate:{opacity:1,y:0},transition:{delay:i*.05,duration:.2},children:[r.jsxs("div",{className:Hn.cardHeader,children:[r.jsx("span",{className:Hn.categoryBadge,style:{background:l.bg,color:l.text},children:a.category}),r.jsx("span",{className:Hn.findingTitle,children:a.title}),r.jsx("span",{className:Hn.findingDate,title:a.createdAt,children:VB(a.createdAt)})]}),r.jsx("div",{className:Hn.findingContent,children:a.content.length>300?a.content.slice(0,300)+"...":a.content}),a.tags.length>0&&r.jsx("div",{className:Hn.tags,children:a.tags.map(c=>r.jsx("span",{className:Hn.tag,style:{color:l.text,textShadow:`0 0 8px ${l.text}`},children:c},c))})]},a.id)})})}function Gr(n){if(!n)return"—";const a=new Date(n);return isNaN(a.getTime())?"—":a.toLocaleString(void 0,{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"})}function nf(n,a){if(!n||!a)return;const i=new Date(a).getTime()-new Date(n).getTime();if(isNaN(i)||i<0)return;const l=Math.floor(i/6e4),c=Math.floor(i%6e4/1e3);if(l===0)return`${c}s`;const d=Math.floor(l/60),f=l%60;return d===0?`${l}m ${c}s`:`${d}h ${f}m`}function C0(n){const a=n.toLowerCase();return a==="ready"||a==="running"||a==="available"||a==="connected"?L.envDotGreen:a==="provisioning"||a==="starting"||a==="pending"||a==="connecting"?L.envDotYellow:a==="error"||a==="failed"||a==="disconnected"?L.envDotRed:L.envDotGray}function GB({status:n}){const a=Xa(n),i=y2(n);return r.jsx("span",{className:`${L.statusBadge} ${L[i]??L.statusPending}`,children:a.label})}function PB({task:n,tasksById:a,environments:i,workspaces:l,taskSessions:c,selectedEnvId:d}){const{loadUsage:f,usageCache:m}=rt(),p=c.reduce((E,R)=>E+(R.costUsd??0),0);b.useEffect(()=>{f("task",n.id),n.childTaskIds.length>0&&f("task_tree",n.id)},[n.id,n.childTaskIds.length,f,p]);const v=`task:${n.id}`,g=v in m?m[v]:void 0,y=`task_tree:${n.id}`,x=n.childTaskIds.length>0&&y in m?m[y]:void 0,S=c.length>0?c[c.length-1]:void 0,T=(S==null?void 0:S.environmentId)??"",j=T?i.find(E=>E.id===T):void 0,N=l.find(E=>E.id===n.workspaceId),C=i.find(E=>E.id===d),A=n.branch&&(N!=null&&N.repoUrl)?`${N.repoUrl.replace(/\/$/,"")}/tree/${encodeURIComponent(n.branch)}`:void 0;return r.jsxs("div",{className:L.overviewDashboard,children:[r.jsxs("div",{className:L.overviewHero,children:[r.jsx(GB,{status:n.status}),n.branch&&r.jsx("span",{className:L.overviewBranchPill,children:A?r.jsxs("a",{href:A,target:"_blank",rel:"noreferrer noopener",className:L.branchLink,children:["🔗"," ",n.branch]}):r.jsxs("span",{children:["🔗"," ",n.branch]})})]}),typeof n.description=="string"&&n.description&&r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Description"}),r.jsx("div",{className:L.overviewMarkdown,children:r.jsx(Rf,{remarkPlugins:[Mf],children:n.description})})]}),r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Environment"}),T&&j?r.jsxs("div",{className:L.envRow,"data-testid":"task-overview-environment",children:[r.jsx("span",{className:`${L.envDot} ${C0(j.status)}`,title:j.status,"aria-label":`Status: ${j.status}`,role:"img"}),r.jsx("span",{className:L.overviewValue,children:j.displayName})]}):C?r.jsxs("div",{className:L.envRow,"data-testid":"task-overview-environment",children:[r.jsx("span",{className:`${L.envDot} ${C0(C.status)}`,title:C.status,"aria-label":`Status: ${C.status}`,role:"img"}),r.jsx("span",{className:L.overviewValue,children:C.displayName}),r.jsx("span",{className:L.overviewMuted,children:"(workspace default)"})]}):r.jsx("div",{className:L.overviewMuted,children:"Set in workspace settings"})]}),r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Dependencies"}),n.dependsOn.length===0?r.jsx("div",{className:L.overviewMuted,children:"None"}):r.jsx("div",{className:L.depList,children:n.dependsOn.map(E=>{const R=a.get(E),w=(R==null?void 0:R.status)==="complete";return r.jsxs("div",{className:`${L.depItem} ${w?L.depDone:L.depBlocked}`,children:[r.jsx("span",{children:w?"✓":"○"}),r.jsx("span",{children:(R==null?void 0:R.title)??E})]},E)})})]}),r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Timeline"}),r.jsxs("div",{className:L.timeline,children:[n.createdAt&&r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Created"}),r.jsx("span",{className:L.timelineValue,children:Gr(n.createdAt)})]}),n.assignedAt&&(()=>{const E=nf(n.createdAt,n.assignedAt);return r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Assigned"}),r.jsx("span",{className:L.timelineValue,children:Gr(n.assignedAt)}),E!==void 0&&r.jsx("span",{className:L.timelineDelta,children:E})]})})(),n.startedAt&&(()=>{const E=nf(n.assignedAt??n.createdAt,n.startedAt);return r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Started"}),r.jsx("span",{className:L.timelineValue,children:Gr(n.startedAt)}),E!==void 0&&r.jsx("span",{className:L.timelineDelta,children:E})]})})(),n.completedAt&&(()=>{const E=nf(n.startedAt,n.completedAt);return r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Completed"}),r.jsx("span",{className:L.timelineValue,children:Gr(n.completedAt)}),E!==void 0&&r.jsx("span",{className:L.timelineDelta,children:E})]})})(),!n.createdAt&&!n.assignedAt&&!n.startedAt&&!n.completedAt&&r.jsx("div",{className:L.overviewMuted,children:"No timing data"})]})]}),g&&g.costUsd>0&&r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Usage"}),r.jsxs("div",{className:L.timeline,children:[r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Cost"}),r.jsx("span",{className:L.timelineValue,children:Bi(g.costUsd)}),r.jsxs("span",{className:L.timelineDelta,children:[g.sessionCount," session",g.sessionCount!==1?"s":""]})]}),x&&x.costUsd>g.costUsd&&r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Total (incl. subtasks)"}),r.jsx("span",{className:L.timelineValue,children:Bi(x.costUsd)}),r.jsxs("span",{className:L.timelineDelta,children:[x.sessionCount," session",x.sessionCount!==1?"s":""]})]})]})]}),n.reviewNotes&&r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Review Notes"}),r.jsx("div",{className:L.reviewNotes,children:n.reviewNotes})]})]})}function $B({task:n,sessionId:a,isBlocked:i,onStart:l,onResume:c,onStop:d,onPause:f,onDelete:m,onEdit:p}){if(n.status==="not_started")return i?r.jsxs("div",{className:L.headerActions,children:[r.jsx("button",{onClick:p,className:L.btnGhost,children:"Edit"}),r.jsx("button",{onClick:m,className:L.btnDanger,children:"Delete"})]}):r.jsxs("div",{className:L.headerActions,children:[r.jsx("button",{onClick:l,className:L.btnPrimary,children:"Start"}),r.jsx("button",{onClick:p,className:L.btnGhost,children:"Edit"}),r.jsx("button",{onClick:m,className:L.btnDanger,children:"Delete"})]});if(n.status==="working")return r.jsxs("div",{className:L.headerActions,children:[r.jsx("button",{onClick:d,className:L.btnDanger,children:"Stop"}),r.jsx("button",{onClick:f,disabled:!a,className:L.btnGhost,children:"Pause"})]});if(n.status==="paused")return r.jsxs("div",{className:L.headerActions,children:[r.jsx("button",{onClick:d,className:L.btnPrimary,children:"Stop"}),r.jsx("button",{onClick:c,className:L.btnGhost,children:"Resume"}),r.jsx("button",{onClick:m,className:L.btnDanger,children:"Delete"})]});if(n.status==="complete")return r.jsx("div",{className:L.headerActions,children:r.jsx("button",{onClick:m,className:L.btnDanger,children:"Delete"})});if(n.status==="failed")return r.jsxs("div",{className:L.headerActions,children:[r.jsx("button",{onClick:l,className:L.btnPrimary,children:"Retry"}),r.jsx("button",{onClick:m,className:L.btnDanger,children:"Delete"})]})}function qB({taskSessions:n,selectedSessionId:a,onSelect:i}){if(!(n.length<2))return r.jsxs("div",{className:L.attemptSelector,"data-testid":"attempt-selector",children:[r.jsx("span",{className:L.attemptLabel,children:"Attempts:"}),n.map((l,c)=>{const d=l.id===a,f=l.status==="stopped"&&l.endReason==="completed"?"✓":l.status==="stopped"?"✗":l.status==="running"||l.status==="idle"?"●":"";return r.jsxs("button",{className:`${L.attemptButton} ${d?L.attemptActive:""}`,onClick:()=>i(l.id),title:`Attempt #${c+1} — ${l.status}`,"aria-label":`Attempt #${c+1}, ${l.status}`,"aria-pressed":d,"data-testid":`attempt-${c+1}`,children:["#",c+1,f&&r.jsx("span",{className:L.attemptStatus,children:f})]},l.id)})]})}function _i(){const{taskId:n,workspaceId:a,environmentId:i}=Qa(),l=wt(),c=Rt(),{events:d,eventsDropped:f,tasks:m,sessions:p,environments:v,findings:g,loadSessionEvents:y,loadFindings:x,kill:S,startTask:T,stopTask:j,resumeTask:N,deleteTask:C,workspaces:A,taskSessions:E,loadTaskSessions:R,sendInput:w,spawn:H,personas:I,provisionEnvironment:U}=rt(),q=b.useRef(void 0),ee=b.useRef(void 0),ae=b.useRef(void 0),ce=b.useRef(void 0),re=b.useRef(void 0),K=l.pathname.endsWith("/stream")?"stream":l.pathname.endsWith("/findings")?"findings":"overview",[ne,O]=b.useState(K),[P,se]=b.useState(!1),[oe,Y]=b.useState(void 0),[be,Ne]=b.useState(""),xe=b.useRef(K);K!==xe.current&&(xe.current=K,K!==ne&&O(K));const J=m.find(Te=>Te.id===n),le=(J==null?void 0:J.workspaceId)||void 0,W=A.find(Te=>Te.id===le);b.useEffect(()=>{if(be===""){if(W!=null&&W.environmentId)Ne(W.environmentId);else if(v.length>0){const Te=v.find(kt=>kt.status==="connected");Ne((Te==null?void 0:Te.id)??v[0].id)}}},[be,W==null?void 0:W.environmentId,v]);const tt=J?E[J.id]??[]:[];let Re;oe&&tt.some(Te=>Te.id===oe)?Re=oe:Re=(J==null?void 0:J.latestSessionId)||void 0;const An=()=>{se(!0)},xa=()=>{if(!J)return;C(J.id),se(!1);const Te=i??(W==null?void 0:W.environmentId);c(J.workspaceId&&Te?Ei(J.workspaceId,Te):"/",{replace:!0})};if((J==null?void 0:J.id)!==ee.current&&(ee.current=J==null?void 0:J.id,oe!==void 0&&Y(void 0),be!==""&&Ne("")),b.useEffect(()=>{if(!(J!=null&&J.id))return;const Te=J.id!==ce.current,kt=J.latestSessionId!==re.current;(Te||kt)&&(ce.current=J.id,re.current=J.latestSessionId,R(J.id))},[J==null?void 0:J.id,J==null?void 0:J.latestSessionId,R]),(J==null?void 0:J.status)!==ae.current){const Te=ae.current===void 0;ae.current=J==null?void 0:J.status;const kt=(J==null?void 0:J.status)==="not_started"?"overview":(J==null?void 0:J.status)==="working"||(J==null?void 0:J.status)==="paused"?"stream":(J==null?void 0:J.status)==="complete"?"findings":void 0;kt&&kt!==ne&&!(Te&&K!=="overview")&&O(kt)}const fn=b.useMemo(()=>new Map(m.map(Te=>[Te.id,Te])),[m]),Kn=b.useMemo(()=>{const Te=Re?d.filter(kt=>kt.sessionId===Re):[];return wh(Nh(Te))},[d,Re]),Fn=J?J.dependsOn.some(Te=>{const kt=fn.get(Te);return kt!==void 0&&kt.status!=="complete"}):!1,hn=b.useMemo(()=>k6(n,i,A,v,fn),[n,i,A,v,fn]);b.useEffect(()=>{Re&&Re!==q.current&&(q.current=Re,y(Re))},[Re,y]),b.useEffect(()=>{ne==="findings"&&le&&x(le)},[ne,le,x]);const Ln=Te=>{O(Te),c(ya(n,Te==="overview"?void 0:Te,a,i))};return r.jsxs("div",{className:L.panelContainer,children:[r.jsx(Ds,{segments:hn}),r.jsxs("div",{className:L.header,children:[r.jsxs("span",{className:L.headerTitle,children:[r.jsx("span",{"data-testid":"task-title",children:(J==null?void 0:J.title)||n}),J&&r.jsx("span",{className:L.taskStatusBadge,"data-testid":"task-status",children:J.status}),(J==null?void 0:J.branch)&&r.jsx("span",{className:L.taskBranch,children:J.branch}),Fn&&r.jsx("span",{className:L.taskBlockedBadge,children:"blocked"})]}),J&&r.jsx($B,{task:J,sessionId:Re,isBlocked:Fn,onStart:()=>T(J.id,void 0,be),onResume:()=>N(J.id),onStop:()=>j(J.id),onPause:()=>Re&&S(Re),onDelete:An,onEdit:()=>c(jk(J.id,a,i))})]}),r.jsxs("div",{className:L.tabBar,role:"tablist","aria-label":"Task view",children:[r.jsx("button",{role:"tab","aria-selected":ne==="overview",className:`${L.tab} ${ne==="overview"?L.active:""}`,onClick:()=>Ln("overview"),children:"Overview"}),r.jsx("button",{role:"tab","aria-selected":ne==="stream",className:`${L.tab} ${ne==="stream"?L.active:""}`,onClick:()=>Ln("stream"),children:"Stream"}),r.jsx("button",{role:"tab","aria-selected":ne==="findings",className:`${L.tab} ${ne==="findings"?L.active:""}`,onClick:()=>Ln("findings"),children:"Findings"})]}),r.jsxs(Yn,{mode:"wait",children:[ne==="overview"&&r.jsx(Tt.div,{initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},className:L.overviewContent,"data-testid":"task-overview",children:J?r.jsx(PB,{task:J,tasksById:fn,environments:v,workspaces:A,taskSessions:tt,selectedEnvId:be}):r.jsx("div",{className:L.waitingMessage,children:"No additional details"})},"overview"),ne==="stream"&&r.jsxs(Tt.div,{initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},style:{display:"flex",flexDirection:"column",flex:1,overflow:"hidden"},children:[r.jsx(qB,{taskSessions:tt,selectedSessionId:Re,onSelect:Te=>Y(Te)}),r.jsx(jh,{events:Kn,eventsDropped:f,emptyState:!Re&&J?r.jsxs("div",{className:L.emptyCta,children:[r.jsx("button",{className:L.ctaButton,onClick:()=>T(J.id,void 0,be),children:"Start Task"}),r.jsx("div",{className:L.ctaDescription,children:"Click to begin agent execution"})]}):Re&&Kn.length===0?r.jsx("div",{className:L.waitingMessage,children:"Waiting for events..."}):void 0})]},"stream"),ne==="findings"&&r.jsx(Tt.div,{initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},className:L.tabContent,children:le?r.jsx(HB,{findings:g.filter(Te=>Te.workspaceId===le)}):r.jsx("div",{className:L.noContext,children:"Navigate to a task within a workspace to view findings"})},"findings")]}),(()=>{if(!J||J.status!=="working"&&J.status!=="paused")return;const Te=Re?p.find(kt=>kt.id===Re):void 0;if(!(!Te||Te.status==="stopped"))return r.jsx(ol,{mode:"send",sessionId:Te.id,environmentId:Te.environmentId,personas:I,environments:v,onSendInput:w,onSpawn:H,onStartTask:T,onProvisionEnvironment:U})})(),J&&r.jsx(bc,{isOpen:P,title:"Delete Task?",description:`"${J.title}" will be permanently removed.`,onConfirm:xa,onCancel:()=>se(!1)})]})}const YB="_container_legrg_1",KB="_header_legrg_8",FB="_headerTitle_legrg_35",ZB="_badge_legrg_44",XB="_headerActions_legrg_54",QB="_body_legrg_61",WB="_formContent_legrg_73",JB="_section_legrg_85",e4="_label_legrg_91",t4="_nameInput_legrg_98",n4="_fieldInput_legrg_131",a4="_adapterSelect_legrg_164",s4="_readOnlyValue_legrg_198",i4="_codespaceSection_legrg_204",o4="_codespaceActions_legrg_210",l4="_creatingHint_legrg_216",r4="_errorHint_legrg_222",c4="_btnPrimary_legrg_235",u4="_btnGhost_legrg_266",te={container:YB,header:KB,headerTitle:FB,badge:ZB,headerActions:XB,body:QB,formContent:WB,section:JB,label:e4,nameInput:t4,fieldInput:n4,adapterSelect:a4,readOnlyValue:s4,codespaceSection:i4,codespaceActions:o4,creatingHint:l4,errorHint:r4,btnPrimary:c4,btnGhost:u4},Zr=1,Xr=65535;function af(n){if(!n.trim())return!0;const a=Number(n);return Number.isInteger(a)&&a>=Zr&&a<=Xr}function sf(n){try{const a=JSON.parse(n);if(typeof a=="object"&&a!==null&&!Array.isArray(a))return a}catch{}return{}}function d4({codespaceName:n,onCodespaceNameChange:a,envName:i,onEnvNameChange:l,codespaces:c,codespaceError:d,codespaceListError:f,codespaceCreating:m,onCreateCodespace:p}){const[v,g]=b.useState("pick"),[y,x]=b.useState(""),[S,T]=b.useState("");return v==="create"?r.jsxs("div",{className:te.codespaceSection,children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Repository"}),r.jsx("input",{type:"text",value:y,onChange:j=>x(j.target.value),placeholder:"owner/repo",className:te.fieldInput,"data-testid":"env-codespace-repo"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Machine Type"}),r.jsx("input",{type:"text",value:S,onChange:j=>T(j.target.value),placeholder:"Machine type (optional)...",className:te.fieldInput,"data-testid":"env-codespace-machine"})]}),r.jsxs("div",{className:te.codespaceActions,children:[r.jsx("button",{onClick:()=>{y.trim()&&(p(y.trim(),S.trim()||void 0),g("pick"),x(""),T(""))},disabled:!y.trim(),className:te.btnPrimary,children:"Create"}),r.jsx("button",{onClick:()=>{g("pick"),x(""),T("")},className:te.btnGhost,children:"Cancel"})]})]}):r.jsx("div",{className:te.codespaceSection,children:r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Codespace"}),!f&&r.jsxs("select",{value:n,onChange:j=>{j.target.value==="__create__"?(g("create"),a("")):(a(j.target.value),j.target.value&&!i.trim()&&l(j.target.value))},disabled:m,className:te.adapterSelect,"data-testid":"env-codespace-select",children:[r.jsx("option",{value:"",children:"Select a codespace..."}),c.map(j=>r.jsxs("option",{value:j.name,children:[j.name," (",j.repository,") — ",j.state]},j.name)),r.jsx("option",{value:"__create__",children:"Create new from repo..."})]}),m&&r.jsx("span",{className:te.creatingHint,children:"Creating codespace..."}),f&&r.jsxs(r.Fragment,{children:[r.jsx("span",{className:te.errorHint,children:f}),r.jsx("input",{type:"text",value:n,onChange:j=>a(j.target.value),placeholder:"Or enter codespace name manually...",className:te.fieldInput,"data-testid":"env-codespace-manual"})]}),d&&!f&&r.jsx("span",{className:te.errorHint,children:d})]})})}function Jx({mode:n,environmentId:a,environments:i,onAddEnvironment:l,onUpdateEnvironment:c,onListCodespaces:d,codespaces:f,codespaceError:m,codespaceListError:p,codespaceCreating:v,onCreateCodespace:g}){const{showToast:y}=Es(),x=Rt(),S=n==="edit",T=S&&a?i.find(le=>le.id===a):void 0,[j,N]=b.useState(""),[C,A]=b.useState("local"),[E,R]=b.useState(""),[w,H]=b.useState(""),[I,U]=b.useState(""),[q,ee]=b.useState(""),[ae,ce]=b.useState(""),[re,K]=b.useState(""),[ne,O]=b.useState(""),[P,se]=b.useState(null),oe=b.useCallback(()=>{const le={};if(C==="local"){if(E.trim()&&(le.host=E.trim()),w.trim()){const W=Number(w);Number.isInteger(W)&&(le.port=W)}}else if(C==="ssh"){if(le.host=E.trim(),I.trim()&&(le.user=I.trim()),w.trim()){const W=Number(w);Number.isInteger(W)&&(le.sshPort=W)}q.trim()&&(le.identityFile=q.trim())}else C==="docker"?(ae.trim()&&(le.image=ae.trim()),re.trim()&&(le.repo=re.trim())):C==="codespace"&&(le.codespaceName=ne.trim());return le},[C,E,w,I,q,ae,re,ne]),Y=()=>!(!j.trim()||C==="ssh"&&!E.trim()||C==="codespace"&&!ne.trim()||(C==="local"||C==="ssh")&&!af(w)),be=()=>{Y()&&(l(j.trim(),C,oe()),y("Environment added successfully","success"),x(Ai,{replace:!0}))},Ne=()=>{x(a?Di(a):Ai)},xe=b.useCallback((le,W)=>{if(!T||!a)return;const tt=sf(T.adapterConfig),Re=W.trim();Re?tt[le]=Re:delete tt[le],c(a,{adapterConfig:tt})},[T,a,c]),J=b.useCallback((le,W)=>{if(!T||!a)return;const tt=sf(T.adapterConfig);if(W.trim()){const Re=Number(W);Number.isInteger(Re)&&Re>=Zr&&Re<=Xr&&(tt[le]=Re)}else delete tt[le];c(a,{adapterConfig:tt})},[T,a,c]);if(S){if(!T)return r.jsxs("div",{className:te.container,children:[r.jsxs("div",{className:te.header,children:[r.jsx("div",{className:te.headerTitle,children:r.jsx("span",{className:te.badge,children:"edit environment"})}),r.jsx("div",{className:te.headerActions,children:r.jsx("button",{onClick:Ne,className:te.btnGhost,children:"Back"})})]}),r.jsx("div",{className:te.body,children:r.jsx("div",{className:te.formContent,children:r.jsx("span",{className:te.readOnlyValue,children:"Environment not found"})})})]});const le=sf(T.adapterConfig);return r.jsxs("div",{className:te.container,"data-testid":"env-edit-panel",children:[r.jsxs("div",{className:te.header,children:[r.jsx("div",{className:te.headerTitle,children:r.jsx("span",{className:te.badge,children:"edit environment"})}),r.jsx("div",{className:te.headerActions,children:r.jsx("button",{onClick:Ne,className:te.btnGhost,"data-testid":"env-edit-back",children:"Back"})})]}),r.jsx("div",{className:te.body,children:r.jsxs("div",{className:te.formContent,children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Name"}),r.jsx(rn,{value:T.displayName,onSave:W=>{a&&c(a,{displayName:W})},validate:W=>W.trim()===""?"Name cannot be empty":void 0,mode:"edit",fieldId:"name",activeFieldId:P,onActivate:se,placeholder:"Environment name",ariaLabel:"Environment name","data-testid":"env-edit-name"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Adapter Type"}),r.jsx("span",{className:te.readOnlyValue,"data-testid":"env-edit-adapter-type",children:T.adapterType})]}),T.adapterType==="local"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Host"}),r.jsx(rn,{value:String(le.host??""),onSave:W=>xe("host",W),mode:"edit",fieldId:"host",activeFieldId:P,onActivate:se,placeholder:"(default)",ariaLabel:"Host","data-testid":"env-edit-host"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Port"}),r.jsx(rn,{value:String(le.port??""),onSave:W=>J("port",W),validate:W=>af(W)?void 0:"Port must be 1-65535",mode:"edit",fieldId:"port",activeFieldId:P,onActivate:se,placeholder:"(default)",ariaLabel:"Port","data-testid":"env-edit-port"})]})]}),T.adapterType==="ssh"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Host"}),r.jsx(rn,{value:String(le.host??""),onSave:W=>xe("host",W),validate:W=>W.trim()===""?"Host is required":void 0,mode:"edit",fieldId:"host",activeFieldId:P,onActivate:se,placeholder:"hostname or IP",ariaLabel:"Host","data-testid":"env-edit-host"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"User"}),r.jsx(rn,{value:String(le.user??""),onSave:W=>xe("user",W),mode:"edit",fieldId:"user",activeFieldId:P,onActivate:se,placeholder:"(default)",ariaLabel:"User","data-testid":"env-edit-user"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"SSH Port"}),r.jsx(rn,{value:String(le.sshPort??""),onSave:W=>J("sshPort",W),validate:W=>af(W)?void 0:"Port must be 1-65535",mode:"edit",fieldId:"sshPort",activeFieldId:P,onActivate:se,placeholder:"22",ariaLabel:"SSH Port","data-testid":"env-edit-ssh-port"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Identity File"}),r.jsx(rn,{value:String(le.identityFile??""),onSave:W=>xe("identityFile",W),mode:"edit",fieldId:"identityFile",activeFieldId:P,onActivate:se,placeholder:"~/.ssh/id_rsa",ariaLabel:"Identity File","data-testid":"env-edit-identity-file"})]})]}),T.adapterType==="docker"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Image"}),r.jsx(rn,{value:String(le.image??""),onSave:W=>xe("image",W),mode:"edit",fieldId:"image",activeFieldId:P,onActivate:se,placeholder:"(default)",ariaLabel:"Image","data-testid":"env-edit-image"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Repo"}),r.jsx(rn,{value:String(le.repo??""),onSave:W=>xe("repo",W),mode:"edit",fieldId:"repo",activeFieldId:P,onActivate:se,placeholder:"(none)",ariaLabel:"Repo","data-testid":"env-edit-repo"})]})]}),T.adapterType==="codespace"&&r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Codespace Name"}),r.jsx(rn,{value:String(le.codespaceName??""),onSave:W=>xe("codespaceName",W),validate:W=>W.trim()===""?"Codespace name is required":void 0,mode:"edit",fieldId:"codespaceName",activeFieldId:P,onActivate:se,placeholder:"codespace-name",ariaLabel:"Codespace Name","data-testid":"env-edit-codespace-name"})]})]})})]})}return r.jsxs("div",{className:te.container,"data-testid":"env-create-panel",children:[r.jsxs("div",{className:te.header,children:[r.jsx("div",{className:te.headerTitle,children:r.jsx("span",{className:te.badge,children:"new environment"})}),r.jsxs("div",{className:te.headerActions,children:[r.jsx("button",{onClick:be,disabled:!Y(),className:te.btnPrimary,"data-testid":"env-create-submit",children:"Create"}),r.jsx("button",{onClick:Ne,className:te.btnGhost,children:"Cancel"})]})]}),r.jsx("div",{className:te.body,children:r.jsxs("div",{className:te.formContent,children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-name",children:"Name"}),r.jsx("input",{id:"env-create-name",type:"text",value:j,onChange:le=>N(le.target.value),placeholder:"Environment name...",autoFocus:!0,className:te.nameInput,"data-testid":"env-create-name",onKeyDown:le=>{le.key==="Enter"&&Y()&&be()}})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-adapter",children:"Adapter Type"}),r.jsxs("select",{id:"env-create-adapter",value:C,onChange:le=>{A(le.target.value),le.target.value==="codespace"&&d()},className:te.adapterSelect,"data-testid":"env-create-adapter",children:[r.jsx("option",{value:"local",children:"local"}),r.jsx("option",{value:"ssh",children:"ssh"}),r.jsx("option",{value:"docker",children:"docker"}),r.jsx("option",{value:"codespace",children:"codespace"})]})]}),C==="local"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-host",children:"Host"}),r.jsx("input",{id:"env-create-host",type:"text",value:E,onChange:le=>R(le.target.value),placeholder:"Host (optional)...",className:te.fieldInput,"data-testid":"env-create-host"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-port",children:"Port"}),r.jsx("input",{id:"env-create-port",type:"number",min:Zr,max:Xr,value:w,onChange:le=>H(le.target.value),placeholder:"Port (optional)...",className:te.fieldInput,"data-testid":"env-create-port"})]})]}),C==="ssh"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-host",children:"Host"}),r.jsx("input",{id:"env-create-host",type:"text",value:E,onChange:le=>R(le.target.value),placeholder:"Host (required)...",className:te.fieldInput,"data-testid":"env-create-host"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-user",children:"User"}),r.jsx("input",{id:"env-create-user",type:"text",value:I,onChange:le=>U(le.target.value),placeholder:"User (optional)...",className:te.fieldInput,"data-testid":"env-create-user"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-port",children:"SSH Port"}),r.jsx("input",{id:"env-create-port",type:"number",min:Zr,max:Xr,value:w,onChange:le=>H(le.target.value),placeholder:"SSH port (optional)...",className:te.fieldInput,"data-testid":"env-create-port"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-identity",children:"Identity File"}),r.jsx("input",{id:"env-create-identity",type:"text",value:q,onChange:le=>ee(le.target.value),placeholder:"Identity file (optional)...",className:te.fieldInput,"data-testid":"env-create-identity"})]})]}),C==="docker"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-image",children:"Image"}),r.jsx("input",{id:"env-create-image",type:"text",value:ae,onChange:le=>ce(le.target.value),placeholder:"Image (optional)...",className:te.fieldInput,"data-testid":"env-create-image"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-repo",children:"Repo"}),r.jsx("input",{id:"env-create-repo",type:"text",value:re,onChange:le=>K(le.target.value),placeholder:"Repo (optional)...",className:te.fieldInput,"data-testid":"env-create-repo"})]})]}),C==="codespace"&&r.jsx(d4,{codespaceName:ne,onCodespaceNameChange:O,envName:j,onEnvNameChange:N,codespaces:f,codespaceError:m,codespaceListError:p,codespaceCreating:v,onCreateCodespace:g})]})})]})}function f4(){const{environments:n,addEnvironment:a,updateEnvironment:i,listCodespaces:l,codespaces:c,codespaceError:d,codespaceListError:f,codespaceCreating:m,createCodespace:p}=rt();return r.jsx(Jx,{mode:"new",environments:n,onAddEnvironment:a,onUpdateEnvironment:i,onListCodespaces:l,codespaces:c,codespaceError:d,codespaceListError:f,codespaceCreating:m,onCreateCodespace:p})}function h4(){const{environmentId:n}=Qa(),{environments:a,addEnvironment:i,updateEnvironment:l,listCodespaces:c,codespaces:d,codespaceError:f,codespaceListError:m,codespaceCreating:p,createCodespace:v}=rt();return r.jsx(Jx,{mode:"edit",environmentId:n,environments:a,onAddEnvironment:i,onUpdateEnvironment:l,onListCodespaces:c,codespaces:d,codespaceError:f,codespaceListError:m,codespaceCreating:p,onCreateCodespace:v})}const m4="_layout_11u79_1",p4="_content_11u79_8",v4="_tabPanel_11u79_14",Wo={layout:m4,content:p4,tabPanel:v4};function g4(){const n=x6();return r.jsxs("div",{className:Wo.layout,children:[r.jsx(Ds,{segments:n}),r.jsx("div",{className:Wo.content,children:r.jsx(ws,{})})]})}const y4="_container_13sb6_1",b4="_envHeader_13sb6_6",x4="_envTitleRow_13sb6_10",_4="_statusDot_13sb6_16",S4="_envName_13sb6_21",T4="_statusBadge_13sb6_27",k4="_envMeta_13sb6_33",C4="_metaTag_13sb6_39",j4="_actions_13sb6_51",N4="_provisionMessage_13sb6_59",w4="_errorMessage_13sb6_64",E4="_section_13sb6_69",A4="_sectionHeader_13sb6_73",D4="_cardList_13sb6_121",R4="_card_13sb6_121",M4="_cardHeader_13sb6_138",O4="_cardName_13sb6_144",B4="_cardActions_13sb6_149",L4="_cardDescription_13sb6_154",I4="_cardMeta_13sb6_160",z4="_repoLink_13sb6_166",U4="_empty_13sb6_174",V4="_btnPrimary_13sb6_180",H4="_btnOutline_13sb6_214",G4="_btnSmall_13sb6_241",P4="_btnDanger_13sb6_267",Ue={container:y4,envHeader:b4,envTitleRow:x4,statusDot:_4,envName:S4,statusBadge:T4,envMeta:k4,metaTag:C4,actions:j4,provisionMessage:N4,errorMessage:w4,section:E4,sectionHeader:A4,cardList:D4,card:R4,cardHeader:M4,cardName:O4,cardActions:B4,cardDescription:L4,cardMeta:I4,repoLink:z4,empty:U4,btnPrimary:V4,btnOutline:H4,btnSmall:G4,btnDanger:P4},$4={connected:"var(--accent-green)",sleeping:"var(--accent-yellow)",error:"var(--accent-red)",disconnected:"var(--text-tertiary)",connecting:"var(--accent-blue)"};function q4(){const{environmentId:n}=Qa(),a=Rt(),{environments:i,workspaces:l,sessions:c,provisionStatus:d,provisionEnvironment:f,stopEnvironment:m,removeEnvironment:p,archiveWorkspace:v}=rt(),[g,y]=b.useState(!1),[x,S]=b.useState(void 0),T=i.find(q=>q.id===n);if(!n||!T)return r.jsx(Gn,{to:Ai,replace:!0});const j=l.filter(q=>q.environmentId===T.id),N=c.filter(q=>q.environmentId===T.id),C=N.reduce((q,ee)=>q+(ee.costUsd??0),0),A=$4[T.status]||"var(--text-tertiary)",E=T.status==="connected",R=T.status==="connecting",w=T.status==="disconnected"||T.status==="error",H=T.id in d?d[T.id]:void 0,I=()=>{p(T.id),y(!1),a(Ai,{replace:!0})},U=q=>{v(q),S(void 0)};return r.jsxs("div",{className:Ue.container,children:[r.jsx(bc,{isOpen:g,title:"Delete Environment?",description:`"${T.displayName||T.id}" will be permanently removed along with all its data.`,onConfirm:I,onCancel:()=>y(!1)}),r.jsxs("div",{className:Ue.envHeader,children:[r.jsxs("div",{className:Ue.envTitleRow,children:[r.jsx("span",{className:Ue.statusDot,style:{color:A},children:"●"}),r.jsx("h2",{className:Ue.envName,children:T.displayName||T.id}),r.jsx("span",{className:Ue.statusBadge,style:{color:A},children:T.status})]}),r.jsxs("div",{className:Ue.envMeta,children:[r.jsxs("span",{className:Ue.metaTag,children:["Adapter: ",T.adapterType]}),N.length>0&&r.jsxs("span",{className:Ue.metaTag,children:[N.length," session",N.length!==1?"s":""]}),C>0&&r.jsxs("span",{className:Ue.metaTag,children:["Cost: ",Bi(C)]})]})]}),r.jsxs("div",{className:Ue.actions,children:[E&&r.jsxs(r.Fragment,{children:[r.jsx("button",{className:Ue.btnPrimary,onClick:()=>a(Z0(T.id)),children:"New Chat"}),r.jsx("button",{className:Ue.btnOutline,onClick:()=>m(T.id),children:"Stop"})]}),w&&r.jsx("button",{className:Ue.btnPrimary,onClick:()=>f(T.id),children:T.status==="error"?"Retry":"Connect"}),R&&H!==void 0&&r.jsx("span",{className:Ue.provisionMessage,children:H.message}),T.status==="error"&&(H==null?void 0:H.stage)==="error"&&r.jsx("span",{className:Ue.errorMessage,children:H.message}),r.jsx("button",{className:Ue.btnOutline,onClick:()=>a(wk(T.id)),"data-testid":"env-edit-btn",children:"Edit Config"}),r.jsx("button",{className:Ue.btnDanger,onClick:()=>y(!0),children:"Delete"})]}),r.jsxs("div",{className:Ue.section,children:[r.jsxs("div",{className:Ue.sectionHeader,children:[r.jsx("h3",{children:"Workspaces"}),r.jsx("button",{className:Ue.btnPrimary,onClick:()=>a(`${X0}?environment=${encodeURIComponent(T.id)}`),"data-testid":"workspace-create-button",children:"+ New Workspace"})]}),j.length===0&&r.jsx("p",{className:Ue.empty,children:"No workspaces yet. Create one to get started."}),r.jsx("div",{className:Ue.cardList,children:j.map(q=>r.jsx(Y4,{workspace:q,confirmArchiveId:x,onOpen:()=>a(Ei(q.id,T.id)),onArchive:()=>S(q.id),onConfirmArchive:()=>U(q.id),onCancelArchive:()=>S(void 0)},q.id))})]})]})}function Y4({workspace:n,confirmArchiveId:a,onOpen:i,onArchive:l,onConfirmArchive:c,onCancelArchive:d}){const f=a===n.id,m=n.repoUrl&&/^https?:\/\//.test(n.repoUrl);return r.jsxs("div",{className:Ue.card,"data-testid":"workspace-card",children:[r.jsxs("div",{className:Ue.cardHeader,children:[r.jsx("strong",{className:Ue.cardName,children:n.name}),r.jsxs("div",{className:Ue.cardActions,children:[r.jsx("button",{className:Ue.btnSmall,onClick:i,children:"Open"}),f?r.jsxs(r.Fragment,{children:[r.jsx("button",{className:Ue.btnDanger,onClick:c,children:"Confirm"}),r.jsx("button",{className:Ue.btnSmall,onClick:d,children:"Cancel"})]}):r.jsx("button",{className:Ue.btnSmall,onClick:l,children:"Archive"})]})]}),n.description&&r.jsx("p",{className:Ue.cardDescription,children:n.description}),n.repoUrl&&r.jsx("div",{className:Ue.cardMeta,children:m?r.jsx("a",{href:n.repoUrl,target:"_blank",rel:"noopener noreferrer",className:Ue.repoLink,children:n.repoUrl}):r.jsx("span",{children:n.repoUrl})})]})}const K4={credentials:"Credentials",personas:"Personas",appearance:"Appearance",about:"About"};function F4(){const a=wt().pathname.replace(/^\/settings\/?/,"").split("/")[0],i=K4[a],l=b6(i);return r.jsxs("div",{className:Wo.layout,children:[r.jsx(Ds,{segments:l}),r.jsx("div",{className:Wo.content,children:r.jsx("div",{className:Wo.tabPanel,children:r.jsx(ws,{})},a)})]})}const Z4="_section_1ingb_14",X4="_sectionTitle_1ingb_26",Q4="_sectionDescription_1ingb_35",W4="_tokenList_1ingb_48",J4="_tokenRow_1ingb_55",e5="_tokenBadge_1ingb_68",t5="_tokenName_1ingb_83",n5="_tokenTarget_1ingb_90",a5="_deleteButton_1ingb_99",s5="_addForm_1ingb_113",i5="_formRow_1ingb_119",o5="_input_1ingb_125",l5="_select_1ingb_155",r5="_addButton_1ingb_187",c5="_emptyStateInfo_1ingb_221",u5="_themeOptions_1ingb_229",d5="_themeOption_1ingb_229",f5="_themeOptionSelected_1ingb_254",h5="_themeOptionHeader_1ingb_259",m5="_themeOptionLabel_1ingb_266",p5="_themeOptionDesc_1ingb_273",v5="_variantToggle_1ingb_279",g5="_variantButton_1ingb_286",y5="_variantActive_1ingb_305",b5="_themeSwatches_1ingb_311",x5="_themeSwatch_1ingb_311",_5="_systemToggle_1ingb_325",S5="_systemToggleHint_1ingb_341",T5="_themeActive_1ingb_348",k5="_aboutGrid_1ingb_354",C5="_aboutItem_1ingb_360",j5="_aboutLabel_1ingb_373",N5="_aboutValue_1ingb_379",w5="_aboutDot_1ingb_387",E5="_aboutDotConnected_1ingb_394",A5="_aboutDotDisconnected_1ingb_398",de={section:Z4,sectionTitle:X4,sectionDescription:Q4,tokenList:W4,tokenRow:J4,tokenBadge:e5,tokenName:t5,tokenTarget:n5,deleteButton:a5,addForm:s5,formRow:i5,input:o5,select:l5,addButton:r5,emptyStateInfo:c5,themeOptions:u5,themeOption:d5,themeOptionSelected:f5,themeOptionHeader:h5,themeOptionLabel:m5,themeOptionDesc:p5,variantToggle:v5,variantButton:g5,variantActive:y5,themeSwatches:b5,themeSwatch:x5,systemToggle:_5,systemToggleHint:S5,themeActive:T5,aboutGrid:k5,aboutItem:C5,aboutLabel:j5,aboutValue:N5,aboutDot:w5,aboutDotConnected:E5,aboutDotDisconnected:A5},D5=[{key:"claude",label:"Claude",description:"Forward Claude credentials for AI agent access.",options:[{value:"off",label:"Off"},{value:"subscription",label:"Subscription"},{value:"api_key",label:"API Key"}]},{key:"github",label:"GitHub",description:"Forward GITHUB_TOKEN and GH_TOKEN for git operations.",options:[{value:"off",label:"Off"},{value:"on",label:"On"}]},{key:"copilot",label:"Copilot",description:"Forward Copilot tokens (COPILOT_GITHUB_TOKEN, CLI config).",options:[{value:"off",label:"Off"},{value:"on",label:"On"}]},{key:"codex",label:"Codex",description:"Forward OPENAI_API_KEY for Codex/OpenAI access.",options:[{value:"off",label:"Off"},{value:"on",label:"On"}]},{key:"goose",label:"Goose",description:"Forward Goose config and API keys for Goose agent access.",options:[{value:"off",label:"Off"},{value:"on",label:"On"}]}];function R5({credentialProviders:n,onUpdateCredentialProviders:a}){const i=(l,c)=>{const d={...n};l==="claude"?d.claude=c:d[l]=c,a(d)};return r.jsxs("section",{className:de.section,children:[r.jsx("h3",{className:de.sectionTitle,children:"Credential Providers"}),r.jsx("p",{className:de.sectionDescription,children:"Enable providers to automatically forward credentials to environments at task start. Credentials are read fresh from the host each time."}),r.jsx("div",{className:de.tokenList,children:D5.map(l=>r.jsxs("div",{className:de.tokenRow,children:[r.jsx("span",{className:de.tokenName,children:l.label}),r.jsx("span",{className:de.tokenTarget,children:l.description}),r.jsx("select",{className:de.select,value:n[l.key],onChange:c=>i(l.key,c.target.value),children:l.options.map(c=>r.jsx("option",{value:c.value,children:c.label},c.value))})]},l.key))})]})}const M5=[{value:"env_var",label:"Environment Variable"},{value:"file",label:"File"}];function O5({tokens:n,onSetToken:a,onDeleteToken:i}){const{showToast:l}=Es(),[c,d]=b.useState(""),[f,m]=b.useState(""),[p,v]=b.useState("env_var"),[g,y]=b.useState(""),[x,S]=b.useState(null),T=C=>{if(C.preventDefault(),!c||!f)return;const A=p==="env_var"?g||c.toUpperCase()+"_TOKEN":"";a(c,f,p,A,p==="file"?g:""),l("Token saved successfully","success"),d(""),m(""),y("")},j=C=>{S(C)},N=()=>{x&&(i(x),l("Token deleted","info")),S(null)};return r.jsxs(r.Fragment,{children:[r.jsx(bc,{isOpen:x!==null,title:"Delete Token?",description:x?`"${x}" will be permanently removed.`:void 0,onConfirm:N,onCancel:()=>S(null)}),r.jsxs("section",{className:de.section,children:[r.jsx("h3",{className:de.sectionTitle,children:"Tokens"}),r.jsx("p",{className:de.sectionDescription,children:"API tokens are auto-pushed to environments when set or updated. Values are write-only."}),n.length===0?r.jsx("div",{className:de.emptyStateInfo,children:"Add your first API token to enable service integrations."}):r.jsx("div",{className:de.tokenList,children:n.map(C=>r.jsxs("div",{className:de.tokenRow,children:[r.jsx("span",{className:de.tokenBadge,children:C.tokenType}),r.jsx("span",{className:de.tokenName,children:C.name}),r.jsx("span",{className:de.tokenTarget,children:C.tokenType==="env_var"?C.envVar:C.filePath}),r.jsx("button",{className:de.deleteButton,onClick:()=>j(C.name),title:`Delete ${C.name}`,children:"×"})]},C.name))}),r.jsxs("form",{className:de.addForm,onSubmit:T,children:[r.jsxs("div",{className:de.formRow,children:[r.jsx("input",{className:de.input,type:"text",placeholder:"Token name",value:c,onChange:C=>d(C.target.value)}),r.jsx("input",{className:de.input,type:"password",placeholder:"Value",value:f,onChange:C=>m(C.target.value)})]}),r.jsxs("div",{className:de.formRow,children:[r.jsx("select",{className:de.select,value:p,onChange:C=>v(C.target.value),children:M5.map(C=>r.jsx("option",{value:C.value,children:C.label},C.value))}),r.jsx("input",{className:de.input,type:"text",placeholder:p==="env_var"?"Env var name (e.g. API_TOKEN)":"File path (e.g. /home/user/.token)",value:g,onChange:C=>y(C.target.value)}),r.jsx("button",{className:de.addButton,type:"submit",children:"Add Token"})]})]})]})]})}function B5(){const{tokens:n,setToken:a,deleteToken:i,credentialProviders:l,updateCredentialProviders:c}=rt();return r.jsxs(r.Fragment,{children:[r.jsx(R5,{credentialProviders:l,onUpdateCredentialProviders:c}),r.jsx(O5,{tokens:n,onSetToken:a,onDeleteToken:i})]})}const L5="_container_xb7ms_1",I5="_header_xb7ms_7",z5="_form_xb7ms_19",U5="_formActions_xb7ms_87",V5="_list_xb7ms_93",H5="_card_xb7ms_99",G5="_active_xb7ms_109",P5="_cardHeader_xb7ms_113",$5="_cardTitle_xb7ms_123",q5="_defaultBadge_xb7ms_129",Y5="_cardActions_xb7ms_143",K5="_description_xb7ms_148",F5="_meta_xb7ms_154",Z5="_promptDetails_xb7ms_171",X5="_promptText_xb7ms_183",Q5="_empty_xb7ms_200",W5="_btnPrimary_xb7ms_206",J5="_btnSecondary_xb7ms_240",eL="_btnSmall_xb7ms_267",tL="_btnDanger_xb7ms_293",nL="_typeToggle_xb7ms_336",aL="_typeBadge_xb7ms_350",sL="_scriptEditor_xb7ms_364",iL="_optional_xb7ms_371",qe={container:L5,header:I5,form:z5,formActions:U5,list:V5,card:H5,active:G5,cardHeader:P5,cardTitle:$5,defaultBadge:q5,cardActions:Y5,description:K5,meta:F5,promptDetails:Z5,promptText:X5,empty:Q5,btnPrimary:W5,btnSecondary:J5,btnSmall:eL,btnDanger:tL,typeToggle:nL,typeBadge:aL,scriptEditor:sL,optional:iL};function oL({personas:n,appDefaultPersonaId:a,onCreatePersona:i,onUpdatePersona:l,onDeletePersona:c,onSetAppDefaultPersonaId:d}){const[f,m]=b.useState(null),[p,v]=b.useState(!1),[g,y]=b.useState(null),[x,S]=b.useState(""),[T,j]=b.useState(""),[N,C]=b.useState(""),[A,E]=b.useState("claude-code"),[R,w]=b.useState("sonnet"),[H,I]=b.useState(0),[U,q]=b.useState("agent"),[ee,ae]=b.useState(""),ce=()=>{S(""),j(""),C(""),E("claude-code"),w("sonnet"),I(0),q("agent"),ae("")},re=()=>{ce(),m(null),v(!0)},K=Y=>{S(Y.name),j(Y.description),C(Y.systemPrompt);const be=Y.type==="script"?"script":"agent";E(be==="script"?Y.runtime||"genaiscript":Y.runtime),w(Y.model),I(Y.maxTurns),q(be),ae(Y.script||""),m(Y),v(!1)},ne=Y=>{q(Y),Y==="script"?E("genaiscript"):A==="genaiscript"&&E("claude-code")},O=Y=>{if(Y.preventDefault(),!!x.trim()){if(U==="script"){if(!ee.trim())return}else if(!N.trim()||!A||!R)return;f?(l(f.id,x,T,N,A,R,H,U,ee),m(null)):(i(x,T,N,A,R,H,U,ee),v(!1)),ce()}},P=Y=>{c(Y),y(null),(f==null?void 0:f.id)===Y&&(m(null),ce())},se=()=>{m(null),v(!1),ce()},oe=()=>r.jsxs("form",{onSubmit:O,className:qe.form,children:[r.jsx("h3",{children:f?"Edit Persona":"Create Persona"}),r.jsxs("div",{className:qe.typeToggle,"data-testid":"persona-type-toggle",children:[r.jsxs("label",{children:[r.jsx("input",{type:"radio",name:"personaType",value:"agent",checked:U==="agent",onChange:()=>ne("agent")}),"Agent"]}),r.jsxs("label",{children:[r.jsx("input",{type:"radio",name:"personaType",value:"script",checked:U==="script",onChange:()=>ne("script")}),"Script"]})]}),r.jsxs("label",{children:["Name",r.jsx("input",{type:"text",value:x,onChange:Y=>S(Y.target.value),placeholder:U==="script"?"e.g. Nightly Report":"e.g. Frontend Engineer",required:!0})]}),r.jsxs("label",{children:["Description",r.jsx("input",{type:"text",value:T,onChange:Y=>j(Y.target.value),placeholder:"Brief description..."})]}),r.jsxs("label",{children:["Runtime",r.jsx("select",{value:A,onChange:Y=>E(Y.target.value),"data-testid":"persona-runtime-select",children:U==="script"?r.jsx("option",{value:"genaiscript",children:"genaiscript"}):r.jsxs(r.Fragment,{children:[r.jsx("option",{value:"claude-code",children:"claude-code"}),r.jsx("option",{value:"codex",children:"codex"}),r.jsx("option",{value:"copilot",children:"copilot"}),r.jsx("option",{value:"goose",children:"goose"}),r.jsx("option",{value:"stub",children:"stub"}),r.jsx("option",{value:"claude-code-acp",children:"claude-code-acp (experimental)"}),r.jsx("option",{value:"codex-acp",children:"codex-acp (experimental)"}),r.jsx("option",{value:"copilot-acp",children:"copilot-acp (experimental)"})]})})]}),U==="agent"&&r.jsxs(r.Fragment,{children:[r.jsxs("label",{children:["Model",r.jsx("input",{type:"text",value:R,onChange:Y=>w(Y.target.value),placeholder:"e.g. sonnet"})]}),r.jsxs("label",{children:["Max Turns",r.jsx("input",{type:"number",value:H,onChange:Y=>I(parseInt(Y.target.value,10)||0),min:0})]}),r.jsxs("label",{children:["System Prompt",r.jsx("textarea",{value:N,onChange:Y=>C(Y.target.value),placeholder:"You are a senior frontend engineer...",rows:10,required:!0})]})]}),U==="script"&&r.jsxs(r.Fragment,{children:[r.jsxs("label",{children:["Model ",r.jsx("span",{className:qe.optional,children:"(optional)"}),r.jsx("input",{type:"text",value:R,onChange:Y=>w(Y.target.value),placeholder:"e.g. sonnet (leave empty for script-only)"})]}),r.jsxs("label",{children:["System Prompt ",r.jsx("span",{className:qe.optional,children:"(optional)"}),r.jsx("textarea",{value:N,onChange:Y=>C(Y.target.value),placeholder:"Optional context for the script...",rows:4})]}),r.jsxs("label",{children:["Script",r.jsx("textarea",{value:ee,onChange:Y=>ae(Y.target.value),placeholder:`script({ model: "openai:gpt-4o" });
|
|
105
|
+
`),g=((i==null?void 0:i.tool)??"")||(d?"Tool error":"Tool output"),y=i?qD(i.tool,i.args):"",x=r.jsxs(r.Fragment,{children:[r.jsx("span",{className:d?Ve.toolResultIndicatorError:Ve.toolResultIndicatorOk,"aria-label":d?"error":"success","data-testid":d?"tool-result-indicator-error":"tool-result-indicator-ok",children:d?"✗":"✓"}),r.jsx("span",{className:Ve.toolResultLabel,"data-testid":"tool-result-label",children:g}),m&&r.jsx("span",{className:Ve.toolResultToggle,"aria-hidden":"true",children:l?"▾":"▸"})]});return r.jsxs("div",{className:Ve.toolResultEvent,"data-testid":"tool-result",children:[m?r.jsx("button",{className:Ve.toolResultHeader,"data-testid":"tool-result-header",onClick:()=>{c(S=>!S)},"aria-expanded":l,children:x}):r.jsx("div",{className:Ve.toolResultHeader,"data-testid":"tool-result-header",children:x}),y&&r.jsx("div",{className:Ve.toolResultCommand,children:y}),r.jsxs("pre",{className:Ve.toolResultPre,"data-testid":"tool-result-content",children:[p,!l&&m&&r.jsx("span",{className:Ve.toolResultEllipsis,children:"…"})]})]})}function KD({content:n}){return r.jsxs("div",{className:Ve.errorEvent,children:["Error: ",n]})}function FD({content:n}){return r.jsxs("div",{className:Ve.statusEvent,children:["--- ",n," ---"]})}function ZD({content:n}){return r.jsx("div",{className:Ve.userInputEvent,children:r.jsx("span",{className:Ve.userInputContent,children:n})})}function XD({content:n}){return r.jsxs("div",{className:Ve.signalEvent,"data-testid":"signal-event",children:[r.jsx("span",{className:Ve.signalBadge,children:"SIGNAL"}),r.jsx("span",{className:Ve.signalContent,children:n})]})}function QD({content:n}){let a=n;try{const i=JSON.parse(n),l=Number(i.input_tokens)||0,c=Number(i.output_tokens)||0,d=$x(l+c),f=Bi(Number(i.cost_usd)||0);a=`${d} tokens · ${f}`}catch{}return r.jsx("div",{className:Ve.usageEvent,"data-testid":"usage-event",children:r.jsx("span",{className:Ve.usageBadge,children:a})})}function WD({content:n}){return r.jsx("div",{className:Ve.defaultEvent,children:n})}function JD({event:n,toolUseCtx:a}){const i=new Date(n.timestamp).toLocaleTimeString();switch(n.eventType){case"system":{if(n.raw)try{if(JSON.parse(n.raw).systemContext===!0)return r.jsx(HD,{content:n.content})}catch{}return r.jsx(GD,{time:i,content:n.content})}case"text":case"output":return r.jsx(PD,{content:n.content});case"tool_use":return r.jsx($D,{content:n.content});case"tool_result":return r.jsx(YD,{content:n.content,raw:n.raw,toolUseCtx:a});case"error":return r.jsx(KD,{content:n.content});case"status":return r.jsx(FD,{content:n.content});case"user_input":return r.jsx(ZD,{content:n.content});case"signal":return r.jsx(XD,{content:n.content});case"usage":return r.jsx(QD,{content:n.content});default:return r.jsx(WD,{content:n.content})}}const eR="_overlay_cmicx_1",tR="_dialog_cmicx_11",nR="_title_cmicx_30",aR="_description_cmicx_38",sR="_actions_cmicx_45",iR="_cancelButton_cmicx_52",oR="_confirmButton_cmicx_79",ys={overlay:eR,dialog:tR,title:nR,description:aR,actions:sR,cancelButton:iR,confirmButton:oR};function bc({isOpen:n,title:a,description:i,confirmLabel:l="Delete",onConfirm:c,onCancel:d}){const f=b.useId(),m=b.useId();return r.jsx(Yn,{children:n&&r.jsx(Tt.div,{className:ys.overlay,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.15},onClick:d,onKeyDown:p=>{p.key==="Escape"&&d()},role:"dialog","aria-modal":"true","aria-labelledby":f,"aria-describedby":i?m:void 0,children:r.jsxs(Tt.div,{className:ys.dialog,initial:{opacity:0,scale:.93,y:-10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.93,y:-10},transition:{duration:.15,ease:[.16,1,.3,1]},onClick:p=>p.stopPropagation(),children:[r.jsx("h3",{id:f,className:ys.title,children:a}),i&&r.jsx("p",{id:m,className:ys.description,children:i}),r.jsxs("div",{className:ys.actions,children:[r.jsx("button",{type:"button",className:ys.cancelButton,onClick:d,autoFocus:!0,children:"Cancel"}),r.jsx("button",{type:"button",className:ys.confirmButton,onClick:c,children:l})]})]})})})}const lR="_spinner_1uyt1_1",rR="_spin_1uyt1_1",cR="_sm_1uyt1_14",uR="_md_1uyt1_20",dR="_lg_1uyt1_26",fR="_xl_1uyt1_32",g0={spinner:lR,spin:rR,sm:cR,md:uR,lg:dR,xl:fR};function qx({size:n="md",className:a,label:i="Loading",liveRegion:l=!1}){return r.jsx("span",{className:`${g0.spinner} ${g0[n]} ${a??""}`,role:l?"status":void 0,"aria-label":i,"aria-hidden":l?void 0:!0})}const hR="_splash_1bn1g_1",mR="_logo_1bn1g_11",y0={splash:hR,logo:mR};function Yx(){return r.jsxs("div",{className:y0.splash,"data-testid":"splash-screen",children:[r.jsx("img",{src:"/grackle-logo.png",alt:"Grackle",className:y0.logo}),r.jsx(qx,{size:"xl",label:"Loading Grackle",liveRegion:!0})]})}function pR(n,a){const i=b.useRef(null);b.useEffect(()=>{const l=i.current;if(i.current=n,l===null)return;const c=new Map;for(const f of l)c.set(f.id,f);const d=new Set;for(const f of n){d.add(f.id);const m=c.get(f.id);if(m&&m.status!==f.status&&f.status!=="sleeping"){if(f.status==="connecting"){a("Provisioning environment…","info");continue}f.status==="connected"?a("Environment connected","success"):f.status==="error"?a("Environment provision failed","error"):f.status==="disconnected"&&(m.status==="connected"?a("Environment disconnected","warning"):a("Environment stopped","info"))}}for(const f of l)d.has(f.id)||a("Environment removed","info")},[n,a])}function vR(n,a,i){const l=n.filter(p=>p.status==="running"||p.status==="idle"||p.status==="waiting").length,c=Kx(a),d=a.filter(p=>Df(p,c)).length,f=a.filter(p=>p.status==="paused"||p.status==="failed"||Df(p,c)).length,m=i.filter(p=>p.status==="disconnected"||p.status==="error").length;return{activeSessions:l,blockedTasks:d,attentionTasks:f,unhealthyEnvironments:m}}function Kx(n){const a=new Map;for(const i of n)a.set(i.id,i.status);return a}function Df(n,a){return n.dependsOn.some(i=>a.get(i)!=="complete")}function gR(n,a){var f;const i=new Map;for(const m of a)i.set(m.id,m);const l=Kx(n),c=[];for(const m of n){const p=m.workspaceId?((f=i.get(m.workspaceId))==null?void 0:f.name)??"Unknown":"Unknown";m.status==="failed"?c.push({task:m,reason:"failed",workspaceName:p}):Df(m,l)?c.push({task:m,reason:"blocked",workspaceName:p}):m.status==="paused"&&c.push({task:m,reason:"paused",workspaceName:p})}const d={failed:0,blocked:1,paused:2};return c.sort((m,p)=>(d[m.reason]??3)-(d[p.reason]??3)),c}function yR(n,a){const i=new Map;for(const l of a)i.set(l.id,l);return n.filter(l=>l.status==="running"||l.status==="idle"||l.status==="waiting").map(l=>{var c;return{session:l,environmentName:((c=i.get(l.environmentId))==null?void 0:c.displayName)??"Unknown"}})}function bR(n,a,i){const l=new Map;for(const c of a){if(!c.workspaceId)continue;let d=l.get(c.workspaceId);d||(d={totalTasks:0,completedTasks:0,workingTasks:0,failedTasks:0},l.set(c.workspaceId,d)),d.totalTasks+=1,c.status==="complete"?d.completedTasks+=1:c.status==="working"?d.workingTasks+=1:c.status==="failed"&&(d.failedTasks+=1)}return n.map(c=>{const d=l.get(c.id)??{totalTasks:0,completedTasks:0,workingTasks:0,failedTasks:0};return{workspace:c,totalTasks:d.totalTasks,completedTasks:d.completedTasks,workingTasks:d.workingTasks,failedTasks:d.failedTasks}})}const xR="_dashboard_16pzm_1",_R="_kpiStrip_16pzm_11",SR="_kpiCard_16pzm_23",TR="_kpiValue_16pzm_68",kR="_kpiLabel_16pzm_76",CR="_bodyGrid_16pzm_84",jR="_section_16pzm_96",NR="_sectionHeader_16pzm_109",wR="_sectionIcon_16pzm_118",ER="_sectionTitle_16pzm_123",AR="_sectionCount_16pzm_131",DR="_sectionBody_16pzm_138",RR="_emptyHint_16pzm_143",MR="_sessionRow_16pzm_150",OR="_sessionPrompt_16pzm_177",BR="_sessionEnv_16pzm_186",LR="_sessionRuntime_16pzm_192",IR="_sessionStatus_16pzm_198",zR="_statusDot_16pzm_207",UR="_attentionRow_16pzm_233",VR="_attentionTitle_16pzm_259",HR="_attentionMeta_16pzm_267",GR="_reasonBadge_16pzm_274",PR="_bottomGrid_16pzm_301",$R="_envRow_16pzm_312",qR="_envName_16pzm_323",YR="_envStatusBadge_16pzm_333",KR="_workspaceRow_16pzm_369",FR="_workspaceTop_16pzm_395",ZR="_workspaceName_16pzm_401",XR="_workspaceCounts_16pzm_407",QR="_progressBar_16pzm_415",WR="_progressFill_16pzm_422",pe={dashboard:xR,kpiStrip:_R,kpiCard:SR,kpiValue:TR,kpiLabel:kR,bodyGrid:CR,section:jR,sectionHeader:NR,sectionIcon:wR,sectionTitle:ER,sectionCount:AR,sectionBody:DR,emptyHint:RR,sessionRow:MR,sessionPrompt:OR,sessionEnv:BR,sessionRuntime:LR,sessionStatus:IR,statusDot:zR,attentionRow:UR,attentionTitle:VR,attentionMeta:HR,reasonBadge:GR,bottomGrid:PR,envRow:$R,envName:qR,envStatusBadge:YR,workspaceRow:KR,workspaceTop:FR,workspaceName:ZR,workspaceCounts:XR,progressBar:QR,progressFill:WR},JR={hidden:{opacity:0,y:12},visible:n=>({opacity:1,y:0,transition:{delay:n*.06,duration:.3,ease:"easeOut"}})},Vr={hidden:{opacity:0,y:16},visible:n=>({opacity:1,y:0,transition:{delay:.15+n*.08,duration:.35,ease:"easeOut"}})};function eM(n,a,i,l){const c=[`${n} of ${a} tasks completed`];return i>0&&c.push(`${i} in progress`),l>0&&c.push(`${l} failed`),c.join(", ")}function Hr({value:n,label:a,accent:i,index:l,testId:c}){return r.jsxs(Tt.div,{className:pe.kpiCard,"data-accent":i,"data-testid":c,variants:JR,initial:"hidden",animate:"visible",custom:l,children:[r.jsx("span",{className:pe.kpiValue,children:n}),r.jsx("span",{className:pe.kpiLabel,children:a})]})}function tM(){const{workspaces:n,tasks:a,sessions:i,environments:l,loadTasks:c}=rt(),d=Rt(),f=b.useRef(new Set);b.useEffect(()=>{for(const y of n)f.current.has(y.id)||(f.current.add(y.id),c(y.id))},[n,c]);const m=b.useMemo(()=>vR(i,a,l),[i,a,l]),p=b.useMemo(()=>yR(i,l),[i,l]),v=b.useMemo(()=>gR(a,n),[a,n]),g=b.useMemo(()=>bR(n,a),[n,a,l]);return r.jsxs("div",{className:pe.dashboard,"data-testid":"dashboard",children:[r.jsxs("div",{className:pe.kpiStrip,"data-testid":"dashboard-kpi-strip",children:[r.jsx(Hr,{value:m.activeSessions,label:"Active Sessions",accent:"green",index:0,testId:"kpi-active-sessions"}),r.jsx(Hr,{value:m.blockedTasks,label:"Blocked Tasks",accent:"yellow",index:1,testId:"kpi-blocked-tasks"}),r.jsx(Hr,{value:m.attentionTasks,label:"Needs Attention",accent:"red",index:2,testId:"kpi-attention-tasks"}),r.jsx(Hr,{value:m.unhealthyEnvironments,label:"Unhealthy Envs",accent:"blue",index:3,testId:"kpi-unhealthy-envs"})]}),r.jsxs("div",{className:pe.bodyGrid,children:[r.jsxs(Tt.div,{className:pe.section,variants:Vr,initial:"hidden",animate:"visible",custom:0,"data-testid":"dashboard-active-sessions",children:[r.jsxs("div",{className:pe.sectionHeader,children:[r.jsx("span",{className:pe.sectionIcon,"aria-hidden":"true",children:"●"}),r.jsx("span",{className:pe.sectionTitle,children:"Active Sessions"}),r.jsx("span",{className:pe.sectionCount,children:p.length})]}),r.jsx("div",{className:pe.sectionBody,children:p.length===0?r.jsx("div",{className:pe.emptyHint,children:"No active sessions"}):p.map(({session:y,environmentName:x})=>r.jsxs("button",{type:"button",className:pe.sessionRow,onClick:()=>d(F0(y.id)),"data-testid":"session-row",children:[r.jsx("span",{className:pe.sessionPrompt,title:y.prompt,children:y.prompt||"—"}),r.jsx("span",{className:pe.sessionEnv,children:x}),r.jsx("span",{className:pe.sessionRuntime,children:y.runtime}),r.jsxs("span",{className:pe.sessionStatus,children:[r.jsx("span",{className:pe.statusDot,"data-status":y.status}),y.status]})]},y.id))})]}),r.jsxs(Tt.div,{className:pe.section,variants:Vr,initial:"hidden",animate:"visible",custom:1,"data-testid":"dashboard-needs-attention",children:[r.jsxs("div",{className:pe.sectionHeader,children:[r.jsx("span",{className:pe.sectionIcon,"aria-hidden":"true",children:"⚑"}),r.jsx("span",{className:pe.sectionTitle,children:"Needs Attention"}),r.jsx("span",{className:pe.sectionCount,children:v.length})]}),r.jsx("div",{className:pe.sectionBody,children:v.length===0?r.jsx("div",{className:pe.emptyHint,children:"All clear"}):v.map(({task:y,reason:x,workspaceName:S})=>r.jsxs("button",{type:"button",className:pe.attentionRow,onClick:()=>d(ya(y.id)),"data-testid":"attention-row",children:[r.jsxs("div",{className:pe.attentionTitle,children:[r.jsx("span",{className:pe.reasonBadge,"data-reason":x,children:x}),y.title]}),r.jsx("div",{className:pe.attentionMeta,children:r.jsx("span",{children:S})})]},y.id))})]})]}),r.jsxs("div",{className:pe.bottomGrid,children:[r.jsxs(Tt.div,{className:pe.section,variants:Vr,initial:"hidden",animate:"visible",custom:2,"data-testid":"dashboard-env-health",children:[r.jsxs("div",{className:pe.sectionHeader,children:[r.jsx("span",{className:pe.sectionIcon,"aria-hidden":"true",children:"◈"}),r.jsx("span",{className:pe.sectionTitle,children:"Environment Health"}),r.jsx("span",{className:pe.sectionCount,children:l.length})]}),r.jsx("div",{className:pe.sectionBody,children:l.length===0?r.jsx("div",{className:pe.emptyHint,children:"No environments configured"}):l.map(y=>r.jsxs("div",{className:pe.envRow,"data-testid":"dashboard-env-row",children:[r.jsx("span",{className:pe.envName,children:y.displayName}),r.jsx("span",{className:pe.envStatusBadge,"data-status":y.status,children:y.status})]},y.id))})]}),r.jsxs(Tt.div,{className:pe.section,variants:Vr,initial:"hidden",animate:"visible",custom:3,"data-testid":"dashboard-workspace-snapshot",children:[r.jsxs("div",{className:pe.sectionHeader,children:[r.jsx("span",{className:pe.sectionIcon,"aria-hidden":"true",children:"▦"}),r.jsx("span",{className:pe.sectionTitle,children:"Workspaces"}),r.jsx("span",{className:pe.sectionCount,children:n.length})]}),r.jsx("div",{className:pe.sectionBody,children:g.length===0?r.jsx("div",{className:pe.emptyHint,children:"No workspaces yet"}):g.map(({workspace:y,totalTasks:x,completedTasks:S,workingTasks:T,failedTasks:j})=>{const N=x>0?Math.round(S/x*100):0;return r.jsxs("button",{type:"button",className:pe.workspaceRow,onClick:()=>d(Ei(y.id,y.environmentId)),"data-testid":"workspace-row",children:[r.jsxs("div",{className:pe.workspaceTop,children:[r.jsx("span",{className:pe.workspaceName,children:y.name}),r.jsxs("span",{className:pe.workspaceCounts,"aria-label":eM(S,x,T,j),children:[S,"/",x,T>0&&r.jsxs("span",{style:{color:"var(--accent-green)"},"aria-hidden":"true",children:["▸",T]}),j>0&&r.jsxs("span",{style:{color:"var(--accent-red)"},"aria-hidden":"true",children:["✗",j]})]})]}),x>0&&r.jsx("div",{className:pe.progressBar,children:r.jsx("div",{className:pe.progressFill,style:{width:`${N}%`}})})]},y.id)})})]})]})]})}const nM="_panelContainer_aei9x_1",aM="_emptyState_aei9x_8",sM="_fadeIn_aei9x_1",iM="_workspaceSummary_aei9x_17",oM="_workspaceSummaryTitle_aei9x_28",lM="_workspaceSummarySubtitle_aei9x_32",rM="_header_aei9x_36",cM="_headerInfo_aei9x_69",uM="_killButton_aei9x_75",dM="_headerTitle_aei9x_104",fM="_headerActions_aei9x_119",hM="_taskStatusBadge_aei9x_126",mM="_taskBranch_aei9x_135",pM="_taskBlockedBadge_aei9x_141",vM="_btnPrimary_aei9x_149",gM="_btnDanger_aei9x_180",yM="_btnGhost_aei9x_219",bM="_rejectInput_aei9x_245",xM="_tabBar_aei9x_275",_M="_tab_aei9x_275",SM="_active_aei9x_301",TM="_eventScroll_aei9x_306",kM="_tabContent_aei9x_312",CM="_noContext_aei9x_317",jM="_overviewContent_aei9x_323",NM="_overviewDashboard_aei9x_332",wM="_overviewHero_aei9x_338",EM="_statusBadge_aei9x_345",AM="_statusPending_aei9x_357",DM="_statusAssigned_aei9x_362",RM="_statusInProgress_aei9x_367",MM="_statusReview_aei9x_372",OM="_statusDone_aei9x_377",BM="_statusFailed_aei9x_382",LM="_statusWaitingInput_aei9x_387",IM="_overviewBranchPill_aei9x_392",zM="_branchLink_aei9x_407",UM="_overviewSection_aei9x_418",VM="_overviewLabel_aei9x_424",HM="_overviewValue_aei9x_431",GM="_overviewMuted_aei9x_436",PM="_overviewMarkdown_aei9x_442",$M="_envRow_aei9x_511",qM="_envDot_aei9x_517",YM="_envDotGreen_aei9x_524",KM="_envDotYellow_aei9x_528",FM="_envDotRed_aei9x_532",ZM="_envDotGray_aei9x_536",XM="_depList_aei9x_540",QM="_depItem_aei9x_546",WM="_depBlocked_aei9x_553",JM="_depDone_aei9x_557",e3="_timeline_aei9x_561",t3="_timelineRow_aei9x_567",n3="_timelineKey_aei9x_574",a3="_timelineValue_aei9x_580",s3="_timelineDelta_aei9x_584",i3="_reviewNotes_aei9x_595",o3="_overviewDescription_aei9x_606",l3="_waitingMessage_aei9x_612",r3="_errorMessage_aei9x_616",c3="_eventOverflowWarning_aei9x_620",u3="_attemptSelector_aei9x_634",d3="_attemptLabel_aei9x_650",f3="_attemptButton_aei9x_654",h3="_attemptActive_aei9x_671",m3="_attemptStatus_aei9x_677",p3="_emptyCta_aei9x_683",v3="_ctaTitle_aei9x_695",g3="_ctaDescription_aei9x_701",y3="_ctaButton_aei9x_708",b3="_ctaCreateForm_aei9x_743",x3="_ctaCreateInput_aei9x_749",_3="_ctaCreateOk_aei9x_780",S3="_ctaLink_aei9x_815",T3="_workspaceHeader_aei9x_829",k3="_workspaceName_aei9x_854",C3="_workspaceMeta_aei9x_867",j3="_metaRow_aei9x_875",N3="_metaLabel_aei9x_888",w3="_metaValue_aei9x_903",E3="_archiveButton_aei9x_913",A3="_repoLink_aei9x_943",D3="_metaToggle_aei9x_953",R3="_metaToggleArrow_aei9x_974",M3="_metaToggleArrowOpen_aei9x_979",O3="_progressBarContainer_aei9x_983",B3="_progressBar_aei9x_983",L3="_progressFill_aei9x_999",I3="_progressLabel_aei9x_1006",z3="_metaTimestamps_aei9x_1013",U3="_metaTimestamp_aei9x_1013",L={panelContainer:nM,emptyState:aM,fadeIn:sM,workspaceSummary:iM,workspaceSummaryTitle:oM,workspaceSummarySubtitle:lM,header:rM,headerInfo:cM,killButton:uM,headerTitle:dM,headerActions:fM,taskStatusBadge:hM,taskBranch:mM,taskBlockedBadge:pM,btnPrimary:vM,btnDanger:gM,btnGhost:yM,rejectInput:bM,tabBar:xM,tab:_M,active:SM,eventScroll:TM,tabContent:kM,noContext:CM,overviewContent:jM,overviewDashboard:NM,overviewHero:wM,statusBadge:EM,statusPending:AM,statusAssigned:DM,statusInProgress:RM,statusReview:MM,statusDone:OM,statusFailed:BM,statusWaitingInput:LM,overviewBranchPill:IM,branchLink:zM,overviewSection:UM,overviewLabel:VM,overviewValue:HM,overviewMuted:GM,overviewMarkdown:PM,envRow:$M,envDot:qM,envDotGreen:YM,envDotYellow:KM,envDotRed:FM,envDotGray:ZM,depList:XM,depItem:QM,depBlocked:WM,depDone:JM,timeline:e3,timelineRow:t3,timelineKey:n3,timelineValue:a3,timelineDelta:s3,reviewNotes:i3,overviewDescription:o3,waitingMessage:l3,errorMessage:r3,eventOverflowWarning:c3,attemptSelector:u3,attemptLabel:d3,attemptButton:f3,attemptActive:h3,attemptStatus:m3,emptyCta:p3,ctaTitle:v3,ctaDescription:g3,ctaButton:y3,ctaCreateForm:b3,ctaCreateInput:x3,ctaCreateOk:_3,ctaLink:S3,workspaceHeader:T3,workspaceName:k3,workspaceMeta:C3,metaRow:j3,metaLabel:N3,metaValue:w3,archiveButton:E3,repoLink:A3,metaToggle:D3,metaToggleArrow:R3,metaToggleArrowOpen:M3,progressBarContainer:O3,progressBar:B3,progressFill:L3,progressLabel:I3,metaTimestamps:z3,metaTimestamp:U3};function V3(){return r.jsx("div",{className:L.emptyState,children:"Select a task or click + to create one"})}function H3(){return r.jsx("div",{className:L.emptyState,children:"Select an environment to manage its workspaces, or add a new one."})}function G3(){const{workspaces:n,environments:a}=rt(),i=Rt(),l=a.length>0;return n.length>0?r.jsx(tM,{}):r.jsxs("div",{className:L.emptyCta,"data-testid":"welcome-cta",children:[r.jsx("div",{className:L.ctaTitle,children:"Welcome to Grackle"}),r.jsx("div",{className:L.ctaDescription,children:"Organize your work into workspaces and let agents tackle the tasks."}),r.jsx("button",{className:L.ctaButton,onClick:()=>i(X0),disabled:!l,"data-testid":"welcome-create-button",children:"Create Your First Workspace"}),!l&&r.jsx("div",{className:L.ctaDescription,children:"Add an environment first before creating a workspace."})]})}const Fx=50;function P3(n,a,i,l,c=Fx){return l?n<c:a-n-i<c}function $3(n,a){const i=a-n;return i>0?i:0}function q3({scrollRef:n,contentLength:a,isReversed:i}){const[l,c]=b.useState(!0),d=b.useRef(0),f=b.useRef(!1),m=b.useRef(0);b.useEffect(()=>{const v=n.current;if(!v)return;let g=!0;const y=()=>{m.current||(m.current=requestAnimationFrame(()=>{m.current=0;const x=P3(v.scrollTop,v.scrollHeight,v.clientHeight,i,Fx);x!==g&&(g=x,c(x))}))};return v.addEventListener("scroll",y,{passive:!0}),()=>{v.removeEventListener("scroll",y),m.current&&(cancelAnimationFrame(m.current),m.current=0)}},[n,i]),b.useLayoutEffect(()=>{const v=n.current;!v||f.current||(f.current=!0,i?v.scrollTop=0:v.scrollTop=v.scrollHeight,c(!0))},[n,i]),b.useLayoutEffect(()=>{const v=n.current;if(v){if(i&&!l){const g=$3(d.current,v.scrollHeight);g>0&&(v.scrollTop+=g)}l&&(i?v.scrollTo({top:0,behavior:"smooth"}):v.scrollTo({top:v.scrollHeight,behavior:"smooth"})),d.current=v.scrollHeight}},[a,l,i,n]);const p=b.useCallback(()=>{const v=n.current;if(!v)return;const g=i?0:v.scrollHeight;v.scrollTo({top:g,behavior:"smooth"}),c(!0)},[n,i]);return{isAtAnchor:l,scrollToAnchor:p}}const Y3="_wrapper_p24zt_1",K3="_scrollContainer_p24zt_9",F3="_toolbar_p24zt_15",Z3="_directionToggle_p24zt_22",X3="_scrollToAnchor_p24zt_60",Q3="_scrollToAnchorBottom_p24zt_84",W3="_scrollToAnchorTop_p24zt_88",bs={wrapper:Y3,scrollContainer:K3,toolbar:F3,directionToggle:Z3,scrollToAnchor:X3,scrollToAnchorBottom:Q3,scrollToAnchorTop:W3},Zx="grackle-stream-direction";function J3(){try{return localStorage.getItem(Zx)==="reversed"}catch{return!1}}function e6({eventsDropped:n}){return n<=0?r.jsx(r.Fragment,{}):r.jsxs("div",{className:L.eventOverflowWarning,role:"alert",children:["⚠"," ",n.toLocaleString()," older event",n===1?"":"s"," were dropped — only the most recent 5,000 are shown. Full history is available in the session log."]})}function jh({events:n,eventsDropped:a,emptyState:i}){const l=b.useRef(null),[c,d]=b.useState(J3),f=v2(),m=b.useMemo(()=>c?[...n].reverse():n,[n,c]),{isAtAnchor:p,scrollToAnchor:v}=q3({scrollRef:l,contentLength:n.length,isReversed:c}),g=()=>{const S=!c;d(S);try{localStorage.setItem(Zx,S?"reversed":"default")}catch{}},y=f?0:.2,x=c?-8:8;return r.jsxs("div",{className:bs.wrapper,children:[r.jsx("div",{className:bs.toolbar,children:r.jsx("button",{className:bs.directionToggle,onClick:g,title:c?"Showing newest first":"Showing oldest first","aria-label":c?"Switch to newest at bottom":"Switch to newest at top","data-testid":"direction-toggle",children:c?"↓":"↑"})}),r.jsxs("div",{ref:l,className:bs.scrollContainer,"data-testid":"event-stream-scroll",children:[n.length===0&&i,r.jsx(e6,{eventsDropped:a}),r.jsx(Yn,{initial:!1,children:m.map((S,T)=>{const j=c?n.length-1-T:T;return r.jsx(Tt.div,{initial:{opacity:0,y:x},animate:{opacity:1,y:0},transition:{duration:y,ease:"easeOut"},children:r.jsx(JD,{event:S,toolUseCtx:S.toolUseCtx})},`${S.sessionId}-${S.timestamp}-${j}`)})})]}),r.jsx(Yn,{children:!p&&r.jsxs(Tt.button,{className:`${bs.scrollToAnchor} ${c?bs.scrollToAnchorTop:bs.scrollToAnchorBottom}`,onClick:v,initial:{opacity:0,scale:.9},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.9},transition:{duration:.15},"aria-label":"Scroll to latest","data-testid":"scroll-to-anchor",children:[c?"↑":"↓"," New events"]})})]})}const t6="_bar_1xhb4_1",n6="_input_1xhb4_32",a6="_select_1xhb4_67",s6="_btnPrimary_1xhb4_103",i6="_btnDanger_1xhb4_134",o6="_btnGhost_1xhb4_173",l6="_badge_1xhb4_195",r6="_disconnectHint_1xhb4_205",Wt={bar:t6,input:n6,select:a6,btnPrimary:s6,btnDanger:i6,btnGhost:o6,badge:l6,disconnectHint:r6};function c6(n,a){if(!n)return!1;const i=a.find(l=>l.id===n);return i!==void 0&&(i.status==="disconnected"||i.status==="error")}function u6({environmentId:n,onReconnect:a}){return r.jsxs(r.Fragment,{children:[r.jsx("span",{className:Wt.disconnectHint,"data-testid":"env-disconnect-hint",children:"Environment unavailable"}),r.jsx("button",{type:"button",onClick:()=>a(n),className:Wt.btnGhost,"data-testid":"reconnect-btn",title:"Reconnect the environment to resume messaging",children:"Reconnect"})]})}function ol({mode:n,sessionId:a,environmentId:i,taskId:l,showStop:c,showPersonaSelect:d,onSessionKill:f,personas:m,environments:p,onSendInput:v,onSpawn:g,onStartTask:y,onProvisionEnvironment:x}){const{showToast:S}=Es(),[T,j]=b.useState(""),[N,C]=b.useState(""),A=c6(i,p),E=R=>{if(R.preventDefault(),!!T.trim())if(n==="send"){if(!a||A)return;v(a,T),j("")}else if(n==="spawn"){if(!i)return;g(i,T,N),S("Session started","success"),j(""),C("")}else{if(!l)return;y(l,void 0,i,T),j("")}};return n==="spawn"?r.jsxs("form",{onSubmit:E,className:Wt.bar,children:[r.jsx("span",{className:Wt.badge,children:"new chat"}),r.jsx("input",{type:"text",value:T,onChange:R=>j(R.target.value),placeholder:"Enter prompt...",autoFocus:!0,className:Wt.input}),d&&r.jsxs("select",{value:N,onChange:R=>C(R.target.value),className:Wt.select,children:[r.jsx("option",{value:"",children:"(Default)"}),m.map(R=>r.jsx("option",{value:R.id,children:R.name},R.id))]}),r.jsx("button",{type:"submit",disabled:!T.trim()||!i,className:Wt.btnPrimary,children:"Go"})]}):n==="start"?r.jsxs("form",{onSubmit:E,className:Wt.bar,children:[r.jsx("input",{type:"text",value:T,onChange:R=>j(R.target.value),placeholder:"Type a message...",autoFocus:!0,className:Wt.input}),r.jsx("button",{type:"submit",disabled:!T.trim(),className:Wt.btnPrimary,children:"Send"})]}):r.jsxs("form",{onSubmit:E,className:Wt.bar,children:[A&&i&&r.jsx(u6,{environmentId:i,onReconnect:x}),r.jsx("input",{type:"text",value:T,onChange:R=>j(R.target.value),placeholder:"Type a message...",autoFocus:!A,disabled:A,className:Wt.input}),r.jsx("span",{title:A?"Environment is unavailable — reconnect first":void 0,children:r.jsx("button",{type:"submit",disabled:!T.trim()||A,className:Wt.btnPrimary,children:"Send"})}),c&&f&&r.jsx("button",{type:"button",onClick:f,className:Wt.btnDanger,title:"Stop session",children:"Stop"})]})}function Nh(n){const a=[];for(const i of n){const l=a[a.length-1];i.eventType==="text"&&(l==null?void 0:l.eventType)==="text"?a[a.length-1]={...l,content:l.content+i.content}:a.push(i)}return a}function wh(n){const a=new Map;for(const d of n)if(d.raw)try{a.set(d,JSON.parse(d.raw))}catch{}const i=new Map;for(const d of n){if(d.eventType!=="tool_use")continue;const f=a.get(d);if(!(!f||typeof f.id!="string"))try{const m=JSON.parse(d.content);i.set(f.id,{tool:m.tool,args:m.args})}catch{}}const l=new Set;return n.map(d=>{if(d.eventType!=="tool_result")return d;const f=a.get(d);if(!f||typeof f.tool_use_id!="string")return d;const m=i.get(f.tool_use_id);return m?(l.add(f.tool_use_id),{...d,toolUseCtx:m}):d}).filter(d=>{if(d.eventType!=="tool_use")return!0;const f=a.get(d);return f&&typeof f.id=="string"?!l.has(f.id):!0})}const d6="_panelContainer_pz4cr_1",f6="_emptyState_pz4cr_8",h6="_emptyTitle_pz4cr_20",m6="_emptyDescription_pz4cr_26",p6="_emptyHint_pz4cr_32",$o={panelContainer:d6,emptyState:f6,emptyTitle:h6,emptyDescription:m6,emptyHint:p6};function v6({hasLocalEnvironment:n}){return r.jsxs("div",{className:$o.emptyState,"data-testid":"chat-empty-state",children:[r.jsx("div",{className:$o.emptyTitle,children:"Welcome to Grackle"}),r.jsx("div",{className:$o.emptyDescription,children:n?"Type a message below to start chatting with the System agent. It can help you plan work, create tasks, and coordinate agents.":"Add a local environment in Settings to start chatting."}),!n&&r.jsx("div",{className:$o.emptyHint,children:"Go to Settings → Environments to add one."})]})}function g6(){const{tasks:n,sessions:a,events:i,eventsDropped:l,environments:c,loadTaskSessions:d,loadSessionEvents:f,kill:m,taskSessions:p,sendInput:v,spawn:g,startTask:y,personas:x,provisionEnvironment:S}=rt(),T=b.useRef(void 0),j=n.find(R=>R.id===Oo),N=j!=null&&j.latestSessionId?a.find(R=>R.id===j.latestSessionId)??(p[Oo]??[]).find(R=>R.id===j.latestSessionId):void 0;b.useEffect(()=>{d(Oo)},[d]),b.useEffect(()=>{j!=null&&j.latestSessionId&&d(Oo)},[j==null?void 0:j.latestSessionId,d]),b.useEffect(()=>{N&&N.id!==T.current&&(T.current=N.id,f(N.id))},[N==null?void 0:N.id,f]);const C=b.useMemo(()=>{if(!N)return[];const R=i.filter(w=>w.sessionId===N.id);return wh(Nh(R))},[i,N==null?void 0:N.id]),A=c.find(R=>R.adapterType==="local"&&R.status==="connected"),E=N!==void 0&&N.status!=="stopped"&&N.status!=="suspended";return r.jsxs("div",{className:$o.panelContainer,"data-testid":"chat-page",children:[r.jsx(jh,{events:C,eventsDropped:l,emptyState:r.jsx(v6,{hasLocalEnvironment:!!A})}),A&&E&&r.jsx(ol,{mode:"send",sessionId:N.id,environmentId:N.environmentId,showStop:!0,onSessionKill:()=>m(N.id),personas:x,environments:c,onSendInput:v,onSpawn:g,onStartTask:y,onProvisionEnvironment:S}),A&&!E&&r.jsx(ol,{mode:"start",taskId:Oo,environmentId:A.id,personas:x,environments:c,onSendInput:v,onSpawn:g,onStartTask:y,onProvisionEnvironment:S})]})}function y6(n,a){const i=[];let l=n;const c=new Set;for(;l&&a.has(l)&&!c.has(l);){c.add(l);const d=a.get(l);i.unshift(d),l=d.parentTaskId||void 0}return i}const js={label:"Home",url:Cs};function b6(n){return n?[js,{label:"Settings",url:Yo},{label:n,url:void 0}]:[js,{label:"Settings",url:void 0}]}const Xx={label:"Environments",url:Ai};function x6(){return[js,{label:"Environments",url:void 0}]}function _6(){return[js,{label:"New Chat",url:void 0}]}function S6(n){return[js,{label:`Session ${n.slice(0,8)}`,url:void 0}]}function T6(n,a,i,l){const c=i.find(f=>f.id===n),d=l.find(f=>f.id===a);return[js,Xx,{label:(d==null?void 0:d.displayName)??"Environment",url:Di(a)},{label:(c==null?void 0:c.name)??"Workspace",url:void 0}]}function k6(n,a,i,l,c){const d=y6(n,c),f=c.get(n),m=f==null?void 0:f.workspaceId,p=m?i.find(S=>S.id===m):void 0,v=a??(p==null?void 0:p.environmentId),g=v?l.find(S=>S.id===v):void 0,y=[js];g&&v&&(y.push(Xx),y.push({label:g.displayName,url:Di(v)})),p&&v&&y.push({label:p.name,url:Ei(p.id,v)});for(let S=0;S<d.length-1;S++)y.push({label:d[S].title,url:ya(d[S].id,void 0,m,v)});const x=d[d.length-1];return y.push({label:(x==null?void 0:x.title)??n,url:void 0}),y}function C6(){const n=_6(),[a]=Gf(),i=a.get("env")??"",{sendInput:l,spawn:c,startTask:d,personas:f,environments:m,provisionEnvironment:p}=rt();return r.jsxs("div",{className:L.panelContainer,children:[r.jsx(Ds,{segments:n}),r.jsx("div",{className:L.emptyState,children:"Enter a prompt below to start a new session"}),r.jsx(ol,{mode:"spawn",environmentId:i,showPersonaSelect:!0,personas:f,environments:m,onSendInput:l,onSpawn:c,onStartTask:d,onProvisionEnvironment:p})]})}function j6({sessionId:n,session:a,isActive:i,onKill:l}){return r.jsxs("div",{className:L.header,children:[r.jsxs("span",{children:["Session: ",n.slice(0,8),a&&` | ${a.runtime} | ${a.endReason||a.status}`,a!=null&&a.inputTokens||a!=null&&a.outputTokens||a!=null&&a.costUsd?` | ${$x((a.inputTokens??0)+(a.outputTokens??0))} tokens · ${Bi(a.costUsd??0)}`:""]}),r.jsxs("span",{className:L.headerInfo,children:[a&&r.jsx("span",{children:a.prompt.length>60?a.prompt.slice(0,60)+"...":a.prompt}),i&&r.jsx("button",{onClick:()=>l(n),title:"Stop session",className:L.killButton,children:"×"})]})]})}function N6({session:n}){const a=n&&(n.status==="stopped"||n.status==="suspended"),i=a?`Session ${n.endReason||n.status} with no events recorded.`:"Waiting for events...";return r.jsx("div",{className:a?L.errorMessage:L.waitingMessage,children:i})}function w6(){const{sessionId:n}=Qa(),{events:a,eventsDropped:i,sessions:l,kill:c,loadSessionEvents:d,sendInput:f,spawn:m,startTask:p,personas:v,environments:g,provisionEnvironment:y}=rt(),x=b.useRef(void 0),S=S6(n),T=l.find(C=>C.id===n)??void 0,j=b.useMemo(()=>{const C=n?a.filter(A=>A.sessionId===n):[];return wh(Nh(C))},[a,n]);if(b.useEffect(()=>{n&&n!==x.current&&(x.current=n,d(n))},[n,d]),!n)return r.jsx("div",{className:L.emptyState,children:"No session selected"});const N=(T==null?void 0:T.status)==="running"||(T==null?void 0:T.status)==="idle";return r.jsxs("div",{className:L.panelContainer,children:[r.jsx(Ds,{segments:S}),r.jsx(j6,{sessionId:n,session:T,isActive:N,onKill:c}),r.jsx(jh,{events:j,eventsDropped:i,emptyState:r.jsx(N6,{session:T})}),N&&r.jsx(ol,{mode:"send",sessionId:n,environmentId:T.environmentId,showStop:!0,onSessionKill:()=>c(n),personas:v,environments:g,onSendInput:f,onSpawn:m,onStartTask:p,onProvisionEnvironment:y})]})}const b0=220,x0=70,E6=40,A6=60,D6="hierarchy",R6="dependency";function M6(n){return b.useMemo(()=>{if(n.length===0)return{nodes:[],edges:[]};const a=new jg.graphlib.Graph({multigraph:!0});a.setDefaultEdgeLabel(()=>({})),a.setGraph({rankdir:"TB",nodesep:E6,ranksep:A6});const i=new Map(n.map(f=>[f.id,f])),l=new Map;for(const f of n)if(f.parentTaskId&&i.has(f.parentTaskId)){const m=l.get(f.parentTaskId)||[];m.push(f),l.set(f.parentTaskId,m)}for(const f of n)a.setNode(f.id,{width:b0,height:x0});const c=[];for(const f of n){if(f.parentTaskId&&i.has(f.parentTaskId)){const m=`hierarchy-${f.parentTaskId}-${f.id}`;a.setEdge(f.parentTaskId,f.id,{},m),c.push({id:m,source:f.parentTaskId,target:f.id,type:"smoothstep",data:{edgeType:D6},style:{stroke:"var(--accent-green)",strokeWidth:2},animated:!1})}for(const m of f.dependsOn)if(i.has(m)){const p=`dependency-${m}-${f.id}`;a.setEdge(m,f.id,{},p),c.push({id:p,source:m,target:f.id,type:"smoothstep",data:{edgeType:R6},style:{stroke:"var(--text-tertiary)",strokeWidth:1.5,strokeDasharray:"6 3"},animated:!1})}}return jg.layout(a),{nodes:n.map(f=>{const m=a.node(f.id),p=l.get(f.id)||[];return{id:f.id,type:"task",position:{x:m.x-b0/2,y:m.y-x0/2},data:{task:f,childCount:p.length,doneChildCount:p.filter(v=>v.status==="complete").length,hasDependencies:f.dependsOn.length>0}}}),edges:c}},[n])}const O6="_dagContainer_js4w6_1",B6="_taskNode_js4w6_26",L6="_taskNodeBorder_js4w6_54",I6="_taskNodeContent_js4w6_60",z6="_taskNodeHeader_js4w6_70",U6="_taskNodeIcon_js4w6_77",V6="_taskNodeTitle_js4w6_82",H6="_taskNodeBadges_js4w6_90",G6="_childBadge_js4w6_95",P6="_depBadge_js4w6_107",$6="_handle_js4w6_119",q6="_emptyCta_js4w6_126",Y6="_ctaDescription_js4w6_137",K6="_ctaButton_js4w6_144",$t={dagContainer:O6,taskNode:B6,taskNodeBorder:L6,taskNodeContent:I6,taskNodeHeader:z6,taskNodeIcon:U6,taskNodeTitle:V6,taskNodeBadges:H6,childBadge:G6,depBadge:P6,handle:$6,emptyCta:q6,ctaDescription:Y6,ctaButton:K6};function F6({data:n}){const{task:a,childCount:i,doneChildCount:l,hasDependencies:c}=n,d=Xa(a.status);return r.jsxs("div",{className:$t.taskNode,"data-task-id":a.id,"data-task-title":a.title,children:[r.jsx(Ng,{type:"target",position:wg.Top,className:$t.handle}),r.jsx("div",{className:$t.taskNodeBorder,style:{backgroundColor:d.color}}),r.jsxs("div",{className:$t.taskNodeContent,children:[r.jsxs("div",{className:$t.taskNodeHeader,children:[r.jsx("span",{className:$t.taskNodeIcon,style:{color:d.color},children:d.icon}),r.jsx("span",{className:$t.taskNodeTitle,children:a.title})]}),r.jsxs("div",{className:$t.taskNodeBadges,children:[i>0&&r.jsxs("span",{className:$t.childBadge,children:[l,"/",i]}),c&&r.jsx("span",{className:$t.depBadge,children:"dep"})]})]}),r.jsx(Ng,{type:"source",position:wg.Bottom,className:$t.handle})]})}const Z6=_2,X6={task:F6};function Q6({workspaceId:n,environmentId:a,tasks:i}){const l=Rt(),{resolvedThemeId:c}=sb(),d=b.useMemo(()=>i.filter(y=>y.workspaceId===n),[i,n]),{nodes:f,edges:m}=M6(d),p=b.useMemo(()=>{const y=getComputedStyle(document.documentElement),x={};for(const[S,T]of Object.entries(Z6))x[S]=y.getPropertyValue(T).trim()||"#6b7a8d";return x},[c]),v=b.useCallback((y,x)=>{l(ya(x.id,void 0,n,a))},[l,n,a]),g=b.useCallback(y=>{const x=y.data;return p[x.task.status]||p.pending},[p]);return d.length===0?r.jsxs("div",{className:$t.emptyCta,children:[r.jsx("button",{className:$t.ctaButton,onClick:()=>l(zi(n,void 0,a)),children:"Create Task"}),r.jsx("div",{className:$t.ctaDescription,children:"Create tasks to see the dependency graph"})]}):r.jsx("div",{className:$t.dagContainer,children:r.jsxs(b1,{nodes:f,edges:m,nodeTypes:X6,onNodeClick:v,fitView:!0,fitViewOptions:{padding:.2},minZoom:.3,maxZoom:2,children:[r.jsx(x1,{variant:_1.Dots,gap:24,size:1,color:"var(--text-disabled)"}),r.jsx(S1,{showInteractive:!1}),r.jsx(T1,{nodeColor:g,maskColor:"var(--bg-overlay)",style:{background:"var(--bg-inset)"}})]})})}function W6({tasks:n,taskStatusById:a,sessionStatusByTaskId:i}){const l=new Map;for(const d of n)if(d.parentTaskId){const f=l.get(d.parentTaskId);f?f.push(d):l.set(d.parentTaskId,[d])}const c=new Map(f0.map(d=>[d,[]]));for(const d of n){const f=Ch(d.status),m=d.dependsOn.length>0&&d.dependsOn.some(T=>a.get(T)!=="complete"),p=l.get(d.id)??[],v=p.length,g=p.filter(T=>T.status==="complete").length;let y;if(f==="paused"&&i){const T=i.get(d.id);T==="idle"?y="Needs input":T==="completed"&&(y="Ready to complete")}const x={task:d,isBlocked:m,childCount:v,doneChildCount:g,pausedSubBadge:y},S=c.get(f);S?S.push(x):c.get("not_started").push(x)}for(const d of c.values())d.sort((f,m)=>f.task.sortOrder-m.task.sortOrder);return f0.map(d=>{const f=Xa(d);return{status:d,label:f.label,style:f,tasks:c.get(d)??[]}})}const J6="_boardContainer_1c4y1_1",eO="_column_1c4y1_17",tO="_columnHeader_1c4y1_34",nO="_columnIcon_1c4y1_47",aO="_columnLabel_1c4y1_52",sO="_columnCount_1c4y1_57",iO="_cardList_1c4y1_67",oO="_emptyPlaceholder_1c4y1_76",lO="_card_1c4y1_67",rO="_cardHeader_1c4y1_107",cO="_cardStatusIcon_1c4y1_113",uO="_cardTitle_1c4y1_119",dO="_cardBadges_1c4y1_127",fO="_badge_1c4y1_134",hO="_blockedBadge_1c4y1_146",mO="_childBadge_1c4y1_151",pO="_depBadge_1c4y1_155",vO="_parentBadge_1c4y1_159",gO="_pausedSubBadge_1c4y1_166",yO="_personaBadge_1c4y1_170",bO="_envBadge_1c4y1_174",xO="_emptyCta_1c4y1_178",_O="_ctaButton_1c4y1_188",SO="_ctaDescription_1c4y1_204",Ke={boardContainer:J6,column:eO,columnHeader:tO,columnIcon:nO,columnLabel:aO,columnCount:sO,cardList:iO,emptyPlaceholder:oO,card:lO,cardHeader:rO,cardStatusIcon:cO,cardTitle:uO,cardBadges:dO,badge:fO,blockedBadge:hO,childBadge:mO,depBadge:pO,parentBadge:vO,pausedSubBadge:gO,personaBadge:yO,envBadge:bO,emptyCta:xO,ctaButton:_O,ctaDescription:SO};function TO({workspaceId:n,environmentId:a,tasks:i,sessions:l,personas:c,environments:d}){const f=Rt(),m=b.useMemo(()=>i.filter(x=>x.workspaceId===n),[i,n]),p=b.useMemo(()=>new Map(i.map(x=>[x.id,x.status])),[i]),v=b.useMemo(()=>new Map(m.map(x=>[x.id,x])),[m]),g=b.useMemo(()=>{const x=new Map(l.map(A=>[A.id,A])),S=new Map(c.map(A=>[A.id,A])),T=new Map(d.map(A=>[A.id,A])),j=new Map,N=new Map,C=new Map;for(const A of m)if(A.latestSessionId){const E=x.get(A.latestSessionId);if(E){if(j.set(A.id,E.endReason||E.status),E.personaId){const R=S.get(E.personaId);R&&N.set(A.id,R.name)}if(E.environmentId){const R=T.get(E.environmentId);R&&C.set(A.id,R.displayName)}}}return{sessionStatusByTaskId:j,personaNameByTaskId:N,environmentNameByTaskId:C}},[m,l,c,d]),y=b.useMemo(()=>W6({tasks:m,taskStatusById:p,sessionStatusByTaskId:g.sessionStatusByTaskId}),[m,p,g]);return m.length===0?r.jsxs("div",{className:Ke.emptyCta,"data-testid":"board-empty-cta",children:[r.jsx("button",{className:Ke.ctaButton,onClick:()=>f(zi(n,void 0,a)),children:"Create Task"}),r.jsx("div",{className:Ke.ctaDescription,children:"Break your work into tasks and let agents tackle them"})]}):r.jsx("div",{className:Ke.boardContainer,"data-testid":"board-container",children:y.map(x=>r.jsxs("section",{className:Ke.column,"data-testid":`board-column-${x.status}`,"aria-label":`${x.label}, ${x.tasks.length} ${x.tasks.length===1?"task":"tasks"}`,children:[r.jsxs("div",{className:Ke.columnHeader,children:[r.jsx("span",{className:Ke.columnIcon,style:{color:x.style.color},children:x.style.icon}),r.jsx("span",{className:Ke.columnLabel,children:x.label}),r.jsx("span",{className:Ke.columnCount,"data-testid":`board-count-${x.status}`,children:x.tasks.length})]}),r.jsx("div",{className:Ke.cardList,children:x.tasks.length===0?r.jsx("div",{className:Ke.emptyPlaceholder,children:"No tasks"}):r.jsx(Yn,{mode:"popLayout",children:x.tasks.map(S=>r.jsx(Tt.div,{layout:!0,initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},children:r.jsx(kO,{boardTask:S,tasksById:v,personaName:g.personaNameByTaskId.get(S.task.id),envName:g.environmentNameByTaskId.get(S.task.id),onClick:()=>f(ya(S.task.id,void 0,n,a))})},S.task.id))})})]},x.status))})}function kO({boardTask:n,tasksById:a,personaName:i,envName:l,onClick:c}){const{task:d,isBlocked:f,childCount:m,doneChildCount:p,pausedSubBadge:v}=n,g=Xa(d.status),y=d.parentTaskId?a.get(d.parentTaskId):void 0;return r.jsxs("div",{className:Ke.card,tabIndex:0,role:"button","data-testid":`board-card-${d.id}`,onClick:c,onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(x.preventDefault(),c())},children:[r.jsxs("div",{className:Ke.cardHeader,children:[r.jsx("span",{className:Ke.cardStatusIcon,style:{color:g.color},children:g.icon}),r.jsx("span",{className:Ke.cardTitle,children:d.title})]}),r.jsxs("div",{className:Ke.cardBadges,children:[y&&r.jsx("span",{className:`${Ke.badge} ${Ke.parentBadge}`,title:y.title,children:y.title}),m>0&&r.jsxs("span",{className:`${Ke.badge} ${Ke.childBadge}`,children:[p,"/",m]}),f&&r.jsx("span",{className:`${Ke.badge} ${Ke.blockedBadge}`,children:"blocked"}),d.dependsOn.length>0&&!f&&r.jsx("span",{className:`${Ke.badge} ${Ke.depBadge}`,children:"dep"}),v&&r.jsx("span",{className:`${Ke.badge} ${Ke.pausedSubBadge}`,children:v}),i&&r.jsx("span",{className:`${Ke.badge} ${Ke.personaBadge}`,children:i}),l&&r.jsx("span",{className:`${Ke.badge} ${Ke.envBadge}`,children:l})]})]})}function Eh(n){const{value:a,onSave:i,validate:l,fieldId:c,activeFieldId:d,onActivate:f,enterToSave:m=!0,trimOnSave:p=!0}=n,[v,g]=b.useState(""),[y,x]=b.useState(""),S=b.useRef(!1),T=d===c,j=b.useCallback(I=>{g(I),x("")},[]),N=b.useCallback(()=>{x("")},[]),C=b.useCallback(()=>{S.current=!1,f==null||f(null),g(""),x("")},[f]),A=b.useCallback(()=>{const I=p?v.trim():v;if(l){const q=l(v);if(q){x(q);return}}const U=p?a.trim():a;if(I===U){C();return}i(I),C()},[v,a,p,l,i,C]),E=b.useCallback(()=>{S.current=!0,f==null||f(c),g(a),x("")},[c,a,f]),R=b.useCallback(I=>{if(S.current){S.current=!1;return}I.relatedTarget instanceof HTMLElement&&I.relatedTarget.dataset.editAction===c||A()},[c,A]),w=b.useCallback(I=>{I.key==="Escape"?C():I.key==="Enter"&&m&&A()},[C,m,A]),H=(()=>{if(!T)return!1;const I=p?a.trim():a;return(p?v.trim():v)!==I})();return b.useEffect(()=>{!T&&(v!==""||y!=="")&&(g(""),x(""))},[T,v,y]),{isEditing:T,draft:v,error:y,isDirty:H,startEdit:E,cancelEdit:C,save:A,setDraft:j,clearError:N,handleBlur:R,handleKeyDown:w,ignoreInitialBlurRef:S}}const CO="_editFieldWrapper_yuzty_1",jO="_editInput_yuzty_10",NO="_editTextarea_yuzty_42",wO="_editSelect_yuzty_78",EO="_editError_yuzty_111",AO="_editInputInvalid_yuzty_118",DO="_editHint_yuzty_123",RO="_unsavedDot_yuzty_132",MO="_metaValueClickable_yuzty_140",OO="_editButton_yuzty_159",BO="_metaPlaceholder_yuzty_175",LO="_worktreeToggle_yuzty_180",Pe={editFieldWrapper:CO,editInput:jO,editTextarea:NO,editSelect:wO,editError:EO,editInputInvalid:AO,editHint:DO,unsavedDot:RO,metaValueClickable:MO,editButton:OO,metaPlaceholder:BO,worktreeToggle:LO};function rn(n){const{value:a,onSave:i,validate:l,mode:c="edit",fieldId:d="text",activeFieldId:f,onActivate:m,onChange:p,renderDisplay:v,placeholder:g,maxLength:y,ariaLabel:x,"data-testid":S}=n,T=b.useRef(null),j=Eh({value:a,onSave:i,validate:l,fieldId:d,activeFieldId:f,onActivate:m,enterToSave:!0,trimOnSave:!0});if(b.useEffect(()=>{if(j.isEditing){const C=window.setTimeout(()=>{var A;(A=T.current)==null||A.focus()},0);return()=>window.clearTimeout(C)}},[j.isEditing]),c==="create"){const C=E=>{p==null||p(E.target.value)},A=l==null?void 0:l(a);return r.jsxs("div",{className:Pe.editFieldWrapper,children:[r.jsx("input",{className:`${Pe.editInput} ${A?Pe.editInputInvalid:""}`,value:a,onChange:C,maxLength:y,placeholder:g,"aria-label":x,"data-testid":S?`${S}-input`:void 0}),A&&r.jsx("span",{className:Pe.editError,"data-testid":"edit-error",children:A})]})}if(j.isEditing)return r.jsxs("div",{className:Pe.editFieldWrapper,children:[r.jsx("input",{ref:T,className:`${Pe.editInput} ${j.error?Pe.editInputInvalid:""}`,value:j.draft,onChange:C=>j.setDraft(C.target.value),onBlur:j.handleBlur,onKeyDown:j.handleKeyDown,maxLength:y,placeholder:g,"aria-label":x,"data-testid":S?`${S}-input`:void 0}),j.isDirty&&r.jsx("span",{className:Pe.unsavedDot,title:"Unsaved changes"}),j.error&&r.jsx("span",{className:Pe.editError,"data-testid":"edit-error",children:j.error}),r.jsx("span",{className:Pe.editHint,children:"Enter to save · Esc to cancel"})]});const N=v==null?void 0:v(a);return r.jsxs("span",{role:"button",tabIndex:0,className:Pe.metaValueClickable,onClick:()=>j.startEdit(),onKeyDown:C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),j.startEdit())},title:"Click to edit","aria-label":x,"data-testid":S?`${S}-button`:void 0,children:[N!==void 0?N:a?r.jsx("span",{children:a}):r.jsx("span",{className:Pe.metaPlaceholder,children:g||"None"}),r.jsx("span",{className:Pe.editButton,"aria-hidden":"true",children:"✏️"})]})}function IO(n){const{value:a,onSave:i,validate:l,mode:c="edit",fieldId:d="textarea",activeFieldId:f,onActivate:m,onChange:p,renderDisplay:v,placeholder:g,ariaLabel:y,"data-testid":x}=n,S=b.useRef(null),T=Eh({value:a,onSave:i,validate:l,fieldId:d,activeFieldId:f,onActivate:m,enterToSave:!1,trimOnSave:!1});if(b.useEffect(()=>{if(T.isEditing){const N=window.setTimeout(()=>{var C;(C=S.current)==null||C.focus()},0);return()=>window.clearTimeout(N)}},[T.isEditing]),c==="create"){const N=A=>{p==null||p(A.target.value)},C=l==null?void 0:l(a);return r.jsxs("div",{className:Pe.editFieldWrapper,children:[r.jsx("textarea",{className:`${Pe.editTextarea} ${C?Pe.editInputInvalid:""}`,value:a,onChange:N,placeholder:g,"aria-label":y,"data-testid":x?`${x}-input`:void 0}),C&&r.jsx("span",{className:Pe.editError,"data-testid":"edit-error",children:C})]})}if(T.isEditing)return r.jsxs("div",{className:Pe.editFieldWrapper,children:[r.jsx("textarea",{ref:S,className:`${Pe.editTextarea} ${T.error?Pe.editInputInvalid:""}`,value:T.draft,onChange:N=>T.setDraft(N.target.value),onBlur:T.handleBlur,onKeyDown:T.handleKeyDown,title:y,"aria-label":y,"data-testid":x?`${x}-input`:void 0}),T.isDirty&&r.jsx("span",{className:Pe.unsavedDot,title:"Unsaved changes"}),T.error&&r.jsx("span",{className:Pe.editError,"data-testid":"edit-error",children:T.error}),r.jsx("span",{className:Pe.editHint,children:"Tab to save · Esc to cancel"})]});const j=v==null?void 0:v(a);return r.jsxs("span",{role:"button",tabIndex:0,className:Pe.metaValueClickable,onClick:()=>T.startEdit(),onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),T.startEdit())},title:"Click to edit","aria-label":y,"data-testid":x?`${x}-button`:void 0,children:[j!==void 0?j:a?r.jsx("span",{children:a}):r.jsx("span",{className:Pe.metaPlaceholder,children:g||"None"}),r.jsx("span",{className:Pe.editButton,"aria-hidden":"true",children:"✏️"})]})}function Qx(n){var E;const{value:a,onSave:i,mode:l="edit",options:c,fieldId:d="select",activeFieldId:f,onActivate:m,onChange:p,renderDisplay:v,placeholder:g,ariaLabel:y,"data-testid":x}=n,S=b.useRef(null),T=Eh({value:a,onSave:i,fieldId:d,activeFieldId:f,onActivate:m,enterToSave:!1,trimOnSave:!1});b.useEffect(()=>{if(T.isEditing){const R=window.setTimeout(()=>{var w;(w=S.current)==null||w.focus()},0);return()=>window.clearTimeout(R)}},[T.isEditing]);const j=b.useCallback(R=>{const w=R.target.value;T.ignoreInitialBlurRef.current=!1,w!==a&&i(w),T.cancelEdit()},[a,i,T]),N=b.useCallback(R=>{if(T.ignoreInitialBlurRef.current){T.ignoreInitialBlurRef.current=!1;return}R.relatedTarget instanceof HTMLElement&&R.relatedTarget.dataset.editAction===d||T.cancelEdit()},[d,T]);if(l==="create")return r.jsx("select",{className:Pe.editSelect,value:a,onChange:R=>p==null?void 0:p(R.target.value),"aria-label":y,"data-testid":x?`${x}-select`:void 0,children:c.map(R=>r.jsx("option",{value:R.value,children:R.label},R.value))});if(T.isEditing)return r.jsx("select",{ref:S,className:Pe.editSelect,value:T.draft,onChange:j,onBlur:N,title:y,"aria-label":y,"data-testid":x?`${x}-select`:void 0,children:c.map(R=>r.jsx("option",{value:R.value,children:R.label},R.value))});const C=v==null?void 0:v(a),A=(E=c.find(R=>R.value===a))==null?void 0:E.label;return r.jsxs("button",{type:"button",className:Pe.metaValueClickable,onClick:()=>T.startEdit(),title:"Click to change","aria-label":y,"data-testid":x?`${x}-button`:void 0,children:[C!==void 0?C:A?r.jsx("span",{children:A}):r.jsx("span",{className:Pe.metaPlaceholder,children:g||"None"}),r.jsx("span",{className:Pe.editButton,"aria-hidden":"true",children:"✏️"})]})}function zO(n){const{checked:a,onChange:i,label:l,ariaLabel:c,"data-testid":d}=n;return r.jsxs("label",{className:Pe.worktreeToggle,"data-testid":d,children:[r.jsx("input",{type:"checkbox",checked:a,onChange:f=>i(f.target.checked),"aria-label":c}),r.jsx("span",{children:l})]})}const UO="_envRow_1e1r5_1",VO="_envDot_1e1r5_7",HO="_envDotGreen_1e1r5_14",GO="_envDotYellow_1e1r5_18",PO="_envDotRed_1e1r5_22",$O="_envDotGray_1e1r5_26",wi={envRow:UO,envDot:VO,envDotGreen:HO,envDotYellow:GO,envDotRed:PO,envDotGray:$O};function qO(n){const a=n.toLowerCase();return a==="ready"||a==="running"||a==="available"||a==="connected"?wi.envDotGreen:a==="provisioning"||a==="starting"||a==="pending"||a==="connecting"?wi.envDotYellow:a==="error"||a==="failed"||a==="disconnected"?wi.envDotRed:wi.envDotGray}function YO(n){const{value:a,onSave:i,environments:l,allowNone:c=!1,fieldId:d="environment",activeFieldId:f,onActivate:m,placeholder:p="No environment",ariaLabel:v="Environment","data-testid":g}=n,y=l.find(T=>T.id===a),x=[...c?[{value:"",label:"None"}]:[],...l.map(T=>({value:T.id,label:T.displayName}))],S=()=>{if(y)return r.jsxs("span",{className:wi.envRow,children:[r.jsx("span",{className:`${wi.envDot} ${qO(y.status)}`}),y.displayName]})};return r.jsx(Qx,{value:a,onSave:i,options:x,fieldId:d,activeFieldId:f,onActivate:m,renderDisplay:S,placeholder:p,ariaLabel:v,"data-testid":g})}function _0(n){if(!n)return"";const a=new Date(n);if(isNaN(a.getTime()))return"";const l=Date.now()-a.getTime();if(l<0)return"just now";const c=Math.floor(l/6e4);if(c<1)return"just now";if(c<60)return`${c}m ago`;const d=Math.floor(c/60);if(d<24)return`${d}h ago`;const f=Math.floor(d/24);return f<30?`${f}d ago`:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}const tf=100;function KO(){const{workspaceId:n,environmentId:a}=Qa(),i=Rt(),{tasks:l,environments:c,workspaces:d,personas:f,sessions:m,archiveWorkspace:p,updateWorkspace:v,usageCache:g,loadUsage:y}=rt(),[x,S]=b.useState("tasks"),[T,j]=b.useState(!1),[N,C]=b.useState(null),[A,E]=b.useState(!1),R=b.useRef(void 0),w=d.find(K=>K.id===n),H=a??(w==null?void 0:w.environmentId)??"",I=T6(n,H,d,c);b.useEffect(()=>{const K=R.current;R.current=n,!(K===void 0||K===n)&&N!==null&&C(null)},[n,N]);const U=m.reduce((K,ne)=>K+(ne.costUsd??0),0);b.useEffect(()=>{n&&y("workspace",n)},[n,y,U]);const q=n?g[`workspace:${n}`]:void 0,ee=l.filter(K=>K.workspaceId===n),ae=ee.filter(K=>K.status==="complete").length,ce=ee.length,re=ce>0?Math.round(ae/ce*100):0;return r.jsxs("div",{className:L.panelContainer,children:[r.jsx(Ds,{segments:I}),r.jsxs("div",{className:L.workspaceHeader,children:[r.jsx("span",{className:L.workspaceName,"data-testid":"workspace-name",children:r.jsx(rn,{value:(w==null?void 0:w.name)||"",onSave:K=>{w&&v(w.id,{name:K})},validate:K=>{const ne=K.trim();if(!ne)return"Name is required";if(ne.length>tf)return`Max ${tf} characters`},maxLength:tf,fieldId:"name",activeFieldId:N,onActivate:C,ariaLabel:"Workspace name",renderDisplay:K=>K||n||void 0,"data-testid":"edit-name"})}),r.jsx("button",{className:L.archiveButton,onClick:()=>j(!0),title:"Archive workspace","data-testid":"archive-workspace-button",children:"Archive"})]}),r.jsxs("button",{className:L.metaToggle,onClick:()=>E(!A),"aria-expanded":!A,"aria-controls":"workspace-meta-panel","data-testid":"meta-toggle",children:[r.jsx("span",{className:`${L.metaToggleArrow} ${A?"":L.metaToggleArrowOpen}`,children:"▶"}),"Details"]}),!A&&r.jsxs("div",{className:L.workspaceMeta,"data-testid":"workspace-meta",id:"workspace-meta-panel",children:[r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Description"}),r.jsx("div",{className:L.metaValue,children:r.jsx(IO,{value:(w==null?void 0:w.description)||"",onSave:K=>{w&&v(w.id,{description:K})},fieldId:"description",activeFieldId:N,onActivate:C,renderDisplay:K=>K?r.jsx("span",{className:L.overviewMarkdown,children:r.jsx(Rf,{remarkPlugins:[Mf],children:K})}):void 0,placeholder:"No description",ariaLabel:"Workspace description","data-testid":"edit-description"})})]}),r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Repository"}),r.jsx("div",{className:L.metaValue,children:r.jsx(rn,{value:(w==null?void 0:w.repoUrl)||"",onSave:K=>{w&&v(w.id,{repoUrl:K})},validate:K=>{const ne=K.trim();if(ne&&!/^https?:\/\/.+/.test(ne))return"Must be a valid http(s) URL"},fieldId:"repoUrl",activeFieldId:N,onActivate:C,renderDisplay:K=>K&&/^https?:\/\//i.test(K)?r.jsx("a",{className:L.repoLink,href:K,target:"_blank",rel:"noopener noreferrer",onClick:ne=>ne.stopPropagation(),children:K}):K?r.jsx("span",{children:K}):void 0,placeholder:"No repository",ariaLabel:"Workspace repository URL","data-testid":"edit-repo"})})]}),r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Environment"}),r.jsx("div",{className:L.metaValue,children:r.jsx(YO,{value:(w==null?void 0:w.environmentId)||"",onSave:K=>{w&&K&&v(w.id,{environmentId:K})},environments:c,fieldId:"environmentId",activeFieldId:N,onActivate:C,placeholder:"Select environment",ariaLabel:"Workspace environment","data-testid":"edit-env"})})]}),r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Persona"}),r.jsx("div",{className:L.metaValue,children:r.jsx(Qx,{value:(w==null?void 0:w.defaultPersonaId)||"",onSave:K=>{w&&v(w.id,{defaultPersonaId:K})},options:[{value:"",label:"(Inherit)"},...f.map(K=>({value:K.id,label:K.name}))],fieldId:"defaultPersonaId",activeFieldId:N,onActivate:C,renderDisplay:K=>{const ne=f.find(O=>O.id===K);if(ne)return r.jsx("span",{children:ne.name})},placeholder:(w==null?void 0:w.defaultPersonaId)||"(Inherit)",ariaLabel:"Workspace default persona","data-testid":"edit-persona"})})]}),r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Worktrees"}),r.jsx("div",{className:L.metaValue,children:r.jsx(zO,{checked:(w==null?void 0:w.useWorktrees)??!0,onChange:K=>{w&&v(w.id,{useWorktrees:K})},label:"Enable worktree isolation","data-testid":"worktree-toggle"})})]}),r.jsxs("div",{className:L.metaRow,children:[r.jsx("span",{className:L.metaLabel,children:"Working Dir"}),r.jsx("div",{className:L.metaValue,children:r.jsx(rn,{value:(w==null?void 0:w.workingDirectory)||"",onSave:K=>{w&&v(w.id,{workingDirectory:K})},fieldId:"workingDirectory",activeFieldId:N,onActivate:C,placeholder:"Default (server default)",ariaLabel:"Working directory","data-testid":"edit-working-directory"})})]}),w&&r.jsxs("div",{className:L.metaTimestamps,children:[r.jsxs("span",{className:L.metaTimestamp,children:["Created ",_0(w.createdAt)]}),w.updatedAt&&w.updatedAt!==w.createdAt&&r.jsxs("span",{className:L.metaTimestamp,children:["· Updated ",_0(w.updatedAt)]})]})]}),ce>0&&r.jsxs("div",{className:L.progressBarContainer,"data-testid":"progress-bar",children:[r.jsx("div",{className:L.progressBar,children:r.jsx("div",{className:L.progressFill,style:{width:`${re}%`}})}),r.jsxs("span",{className:L.progressLabel,children:[ae,"/",ce]})]}),q&&q.costUsd>0&&r.jsx("div",{className:L.progressBarContainer,children:r.jsxs("span",{className:L.progressLabel,children:["Usage: ",Bi(q.costUsd)," (",q.sessionCount," session",q.sessionCount!==1?"s":"",")"]})}),r.jsxs("div",{className:L.tabBar,role:"tablist","aria-label":"Workspace view",children:[r.jsx("button",{role:"tab","aria-selected":x==="graph",className:`${L.tab} ${x==="graph"?L.active:""}`,onClick:()=>S("graph"),children:"Graph"}),r.jsx("button",{role:"tab","aria-selected":x==="board",className:`${L.tab} ${x==="board"?L.active:""}`,onClick:()=>S("board"),"data-testid":"board-tab",children:"Board"}),r.jsx("button",{role:"tab","aria-selected":x==="tasks",className:`${L.tab} ${x==="tasks"?L.active:""}`,onClick:()=>S("tasks"),children:"Tasks"})]}),x==="tasks"&&ce>0&&r.jsxs("div",{className:L.workspaceSummary,children:[r.jsx("span",{className:L.workspaceSummaryTitle,children:`${ae}/${ce} tasks complete`}),r.jsx("span",{className:L.workspaceSummarySubtitle,children:"Select a task or click + to create one"})]}),x==="tasks"&&ce===0&&r.jsxs("div",{className:L.emptyCta,children:[r.jsx("button",{className:L.ctaButton,onClick:()=>i(zi(n,void 0,H)),children:"Create Task"}),r.jsx("div",{className:L.ctaDescription,children:"Break your work into tasks and let agents tackle them"})]}),x==="board"&&r.jsx(TO,{workspaceId:n,environmentId:H,tasks:l,sessions:m,personas:f,environments:c}),x==="graph"&&r.jsx(Q6,{workspaceId:n,environmentId:H,tasks:l}),r.jsx(bc,{isOpen:T,title:"Archive Workspace?",description:"This will hide the workspace from the sidebar. Tasks will not be deleted.",confirmLabel:"Archive",onConfirm:()=>{w&&(p(w.id),i("/",{replace:!0})),j(!1)},onCancel:()=>j(!1)})]})}const FO="_formContent_ymnez_1",ZO="_section_ymnez_13",XO="_label_ymnez_19",QO="_titleInput_ymnez_26",WO="_descriptionTextarea_ymnez_58",JO="_selectField_ymnez_94",e4="_checkboxRow_ymnez_128",t4="_checkboxLabel_ymnez_141",n4="_fieldError_ymnez_146",it={formContent:FO,section:ZO,label:XO,titleInput:QO,descriptionTextarea:WO,selectField:JO,checkboxRow:e4,checkboxLabel:t4,fieldError:n4};function a4(n,a){return{name:(n==null?void 0:n.name)??"",description:(n==null?void 0:n.description)??"",repoUrl:(n==null?void 0:n.repoUrl)??"",environmentId:(n==null?void 0:n.environmentId)??a??"",defaultPersonaId:(n==null?void 0:n.defaultPersonaId)??"",useWorktrees:(n==null?void 0:n.useWorktrees)??!0,workingDirectory:(n==null?void 0:n.workingDirectory)??""}}const s4=100;function i4({values:n,onChange:a,environments:i,personas:l,errors:c,disabled:d,autoFocusName:f}){const m=(p,v)=>{a({...n,[p]:v})};return r.jsxs("div",{className:it.formContent,children:[r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-name",children:"Name"}),r.jsx("input",{id:"ws-name",className:it.titleInput,type:"text",value:n.name,onChange:p=>m("name",p.target.value),placeholder:"Workspace name",maxLength:s4,autoFocus:f,disabled:d,"data-testid":"workspace-form-name"}),(c==null?void 0:c.name)&&r.jsx("span",{className:it.fieldError,"data-testid":"workspace-form-error-name",children:c.name})]}),r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-description",children:"Description"}),r.jsx("textarea",{id:"ws-description",className:it.descriptionTextarea,value:n.description,onChange:p=>m("description",p.target.value),placeholder:"Optional description (Markdown supported)",disabled:d,"data-testid":"workspace-form-description"})]}),r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-repo",children:"Repository URL"}),r.jsx("input",{id:"ws-repo",className:it.titleInput,type:"text",value:n.repoUrl,onChange:p=>m("repoUrl",p.target.value),placeholder:"https://github.com/org/repo",disabled:d,"data-testid":"workspace-form-repo"}),(c==null?void 0:c.repoUrl)&&r.jsx("span",{className:it.fieldError,"data-testid":"workspace-form-error-repoUrl",children:c.repoUrl})]}),r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-environment",children:"Environment"}),r.jsxs("select",{id:"ws-environment",className:it.selectField,value:n.environmentId,onChange:p=>m("environmentId",p.target.value),disabled:d,"data-testid":"workspace-form-environment",children:[r.jsx("option",{value:"",children:"Select environment…"}),i.map(p=>r.jsx("option",{value:p.id,children:p.displayName||p.id},p.id))]}),(c==null?void 0:c.environmentId)&&r.jsx("span",{className:it.fieldError,"data-testid":"workspace-form-error-environmentId",children:c.environmentId})]}),r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-persona",children:"Default Persona"}),r.jsxs("select",{id:"ws-persona",className:it.selectField,value:n.defaultPersonaId,onChange:p=>m("defaultPersonaId",p.target.value),disabled:d,"data-testid":"workspace-form-persona",children:[r.jsx("option",{value:"",children:"(Inherit)"}),l.map(p=>r.jsx("option",{value:p.id,children:p.name},p.id))]})]}),r.jsx("div",{className:it.section,children:r.jsxs("label",{className:it.checkboxRow,children:[r.jsx("input",{type:"checkbox",checked:n.useWorktrees,onChange:p=>m("useWorktrees",p.target.checked),disabled:d,"data-testid":"workspace-form-worktrees"}),r.jsx("span",{className:it.checkboxLabel,children:"Enable worktree isolation"})]})}),r.jsxs("div",{className:it.section,children:[r.jsx("label",{className:it.label,htmlFor:"ws-workdir",children:"Working Directory"}),r.jsx("input",{id:"ws-workdir",className:it.titleInput,type:"text",value:n.workingDirectory,onChange:p=>m("workingDirectory",p.target.value),placeholder:"Default (server default)",disabled:d,"data-testid":"workspace-form-workdir"})]})]})}const o4="_container_cddyd_1",l4="_header_cddyd_8",r4="_headerTitle_cddyd_35",c4="_badge_cddyd_44",u4="_headerActions_cddyd_54",d4="_body_cddyd_61",f4="_formContent_cddyd_73",h4="_section_cddyd_85",m4="_label_cddyd_91",p4="_titleInput_cddyd_98",v4="_descriptionTextarea_cddyd_131",g4="_parentContext_cddyd_167",y4="_parentLabel_cddyd_175",b4="_parentName_cddyd_182",x4="_personaSelect_cddyd_186",_4="_depList_cddyd_220",S4="_depItem_cddyd_226",T4="_depItemSelected_cddyd_248",k4="_noDeps_cddyd_252",C4="_btnPrimary_cddyd_258",j4="_btnGhost_cddyd_289",Ee={container:o4,header:l4,headerTitle:r4,badge:c4,headerActions:u4,body:d4,formContent:f4,section:h4,label:m4,titleInput:p4,descriptionTextarea:v4,parentContext:g4,parentLabel:y4,parentName:b4,personaSelect:x4,depList:_4,depItem:S4,depItemSelected:T4,noDeps:k4,btnPrimary:C4,btnGhost:j4};function N4(n){const a={};return n.name.trim()||(a.name="Name is required"),n.repoUrl.trim()&&!/^https?:\/\/.+/i.test(n.repoUrl.trim())&&(a.repoUrl="Must be a valid http(s) URL"),n.environmentId||(a.environmentId="Environment is required"),Object.keys(a).length>0?a:void 0}const w4=[{label:"Home",url:Cs},{label:"New Workspace",url:void 0}];function E4(){const[n]=Gf(),a=n.get("environment")??void 0,{environments:i,personas:l,createWorkspace:c,workspaceCreating:d}=rt(),{showToast:f}=Es(),m=Rt(),[p,v]=b.useState(()=>{var N;return a4(void 0,a||((N=i[0])==null?void 0:N.id))}),[g,y]=b.useState(),[x,S]=b.useState();b.useEffect(()=>{a||p.environmentId||i.length===0||v(N=>{var C;return N.environmentId?N:{...N,environmentId:((C=i[0])==null?void 0:C.id)??""}})},[i,a,p.environmentId]);const T=()=>{const N=N4(p);if(N){y(N),S(void 0);return}y(void 0),S(void 0),c(p.name.trim(),p.description,p.repoUrl.trim(),p.environmentId,p.defaultPersonaId,p.useWorktrees,p.workingDirectory,()=>{f("Workspace created","success"),m(Cs,{replace:!0})},C=>{S(C)})},j=()=>{m(a?Di(a):Cs,{replace:!0})};return r.jsxs("div",{className:Ee.container,children:[r.jsxs("div",{className:Ee.header,children:[r.jsx("div",{className:Ee.headerTitle,children:r.jsx(Ds,{segments:w4})}),r.jsxs("div",{className:Ee.headerActions,children:[r.jsx("button",{className:Ee.btnGhost,onClick:j,disabled:d,"data-testid":"workspace-create-cancel",children:"Cancel"}),r.jsx("button",{className:Ee.btnPrimary,onClick:T,disabled:d||!p.name.trim()||!p.environmentId,"data-testid":"workspace-create-save",children:d?r.jsx(qx,{size:"sm",label:"Creating"}):"Create Workspace"})]})]}),r.jsxs("div",{className:Ee.body,children:[r.jsx(i4,{values:p,onChange:N=>{v(N),y(void 0),S(void 0)},environments:i,personas:l,errors:g,disabled:d,autoFocusName:!0}),x&&r.jsx("div",{className:Ee.error,"data-testid":"workspace-create-submit-error",children:x})]})]})}function Wx({mode:n,taskId:a,workspaceId:i,parentTaskId:l,environmentId:c,tasks:d,workspaces:f,personas:m,onCreateTask:p,onUpdateTask:v}){const{showToast:g}=Es(),y=Rt(),x=n==="edit",S=x&&a?d.find(W=>W.id===a):void 0,T=x?(S==null?void 0:S.workspaceId)??"":i??"",[j,N]=b.useState(T),C=T||j,A=f.find(W=>W.id===C),E=c??(A==null?void 0:A.environmentId),R=!x&&!i,w=x?(S==null?void 0:S.parentTaskId)??"":l??"",H=w?d.find(W=>W.id===w):void 0,[I,U]=b.useState((S==null?void 0:S.title)??""),[q,ee]=b.useState((S==null?void 0:S.description)??""),[ae,ce]=b.useState((S==null?void 0:S.dependsOn)??[]),[re,K]=b.useState((S==null?void 0:S.defaultPersonaId)??""),[ne,O]=b.useState((S==null?void 0:S.canDecompose)??!1),[P,se]=b.useState(!1),oe=b.useRef(!1);b.useEffect(()=>{x&&S&&!oe.current&&(oe.current=!0,U(S.title),ee(S.description),ce(S.dependsOn),K(S.defaultPersonaId),O(S.canDecompose))},[x,S]);const Y=d.filter(W=>W.workspaceId===C&&(!x||W.id!==a)&&W.id!==w),be=I.trim().length>0&&(!x||S!==void 0)&&C.length>0,Ne=W=>{ce(tt=>tt.includes(W)?tt.filter(Re=>Re!==W):[...tt,W])},xe=()=>{!be||P||x&&S===void 0||(x&&a?(v(a,I.trim(),q,ae,re),g("Task updated","success"),y(ya(a,void 0,C,E),{replace:!0})):(se(!0),p(C,I.trim(),q,ae.length>0?ae:void 0,w||void 0,re,ne,()=>{g("Task created","success"),y(i?Ei(i,E):"/tasks",{replace:!0})},W=>{g(W,"error"),se(!1)})))},J=()=>{y(x&&a?ya(a,void 0,C,E):i?Ei(i,E):"/tasks")},le=x?"edit task":w?"child task":"new task";return r.jsxs("div",{className:Ee.container,children:[r.jsxs("div",{className:Ee.header,children:[r.jsxs("div",{className:Ee.headerTitle,children:[r.jsx("span",{className:Ee.badge,children:le}),H&&r.jsxs("span",{className:Ee.parentContext,children:[r.jsx("span",{className:Ee.parentLabel,children:"Child of"}),r.jsx("span",{className:Ee.parentName,children:H.title})]})]}),r.jsxs("div",{className:Ee.headerActions,children:[r.jsx("button",{onClick:xe,disabled:!be||P,className:Ee.btnPrimary,"data-testid":"task-edit-save",children:P?"Creating…":x?"Save Changes":"Create"}),r.jsx("button",{onClick:J,className:Ee.btnGhost,children:"Cancel"})]})]}),r.jsx("div",{className:Ee.body,children:r.jsxs("div",{className:Ee.formContent,children:[R&&r.jsxs("div",{className:Ee.section,children:[r.jsx("label",{className:Ee.label,htmlFor:"task-edit-workspace",children:"Workspace"}),r.jsxs("select",{id:"task-edit-workspace",value:j,onChange:W=>N(W.target.value),className:Ee.personaSelect,"data-testid":"task-edit-workspace",children:[r.jsx("option",{value:"",children:"Select a workspace..."}),f.map(W=>r.jsx("option",{value:W.id,children:W.name},W.id))]})]}),r.jsxs("div",{className:Ee.section,children:[r.jsx("label",{className:Ee.label,htmlFor:"task-edit-title",children:"Title"}),r.jsx("input",{id:"task-edit-title",type:"text",value:I,onChange:W=>U(W.target.value),placeholder:"Task title...",autoFocus:!0,className:Ee.titleInput,"data-testid":"task-edit-title",onKeyDown:W=>{W.key==="Enter"&&be&&xe()}})]}),r.jsxs("div",{className:Ee.section,children:[r.jsx("label",{className:Ee.label,htmlFor:"task-edit-description",children:"Description"}),r.jsx("textarea",{id:"task-edit-description",value:q,onChange:W=>ee(W.target.value),placeholder:"Describe the task... (markdown supported)",className:Ee.descriptionTextarea,"data-testid":"task-edit-description",rows:8})]}),r.jsxs("div",{className:Ee.section,children:[r.jsx("label",{className:Ee.label,htmlFor:"task-edit-persona",children:"Default Persona"}),r.jsxs("select",{id:"task-edit-persona",value:re,onChange:W=>K(W.target.value),className:Ee.personaSelect,"data-testid":"task-edit-persona",children:[r.jsx("option",{value:"",children:"(Inherit)"}),m.map(W=>r.jsx("option",{value:W.id,children:W.name},W.id))]})]}),!x&&r.jsx("div",{className:Ee.section,children:r.jsxs("label",{className:Ee.depItem,"data-testid":"task-edit-can-decompose",children:[r.jsx("input",{type:"checkbox",checked:ne,onChange:W=>O(W.target.checked)}),"Can spawn subtasks"]})}),r.jsxs("div",{className:Ee.section,children:[r.jsx("div",{className:Ee.label,children:"Dependencies"}),Y.length===0?r.jsx("div",{className:Ee.noDeps,children:"No other tasks in this workspace"}):r.jsx("div",{className:Ee.depList,children:Y.map(W=>{const tt=ae.includes(W.id);return r.jsxs("label",{className:`${Ee.depItem} ${tt?Ee.depItemSelected:""}`,"data-testid":`dep-option-${W.id}`,children:[r.jsx("input",{type:"checkbox",checked:tt,onChange:()=>Ne(W.id)}),W.title,r.jsxs("span",{style:{opacity:.5,fontSize:"11px",marginLeft:"4px"},children:["(",W.status,")"]})]},W.id)})})]})]})})]})}function S0(){const{workspaceId:n,environmentId:a}=Qa(),[i]=Gf(),l=n??i.get("workspace")??"",c=i.get("parent")??void 0,{tasks:d,workspaces:f,personas:m,createTask:p,updateTask:v}=rt();return r.jsx(Wx,{mode:"new",workspaceId:l,parentTaskId:c,environmentId:a,tasks:d,workspaces:f,personas:m,onCreateTask:p,onUpdateTask:v})}function T0(){const{taskId:n,workspaceId:a,environmentId:i}=Qa(),{tasks:l,workspaces:c,personas:d,createTask:f,updateTask:m}=rt();return r.jsx(Wx,{mode:"edit",taskId:n,workspaceId:a,environmentId:i,tasks:l,workspaces:c,personas:d,onCreateTask:f,onUpdateTask:m})}const A4="_container_1pqxm_1",D4="_emptyState_1pqxm_8",R4="_card_1pqxm_14",M4="_cardHeader_1pqxm_34",O4="_categoryBadge_1pqxm_46",B4="_findingTitle_1pqxm_54",L4="_findingDate_1pqxm_60",I4="_findingContent_1pqxm_72",z4="_tags_1pqxm_78",U4="_tag_1pqxm_78",Hn={container:A4,emptyState:D4,card:R4,cardHeader:M4,categoryBadge:O4,findingTitle:B4,findingDate:L4,findingContent:I4,tags:z4,tag:U4};function V4(n){const a=new Date(n),i=new Date,l=i.getTime()-a.getTime(),c=Math.floor(l/1e3),d=Math.floor(c/60),f=Math.floor(d/60),m=Math.floor(f/24);if(c<60)return"just now";if(d<60)return`${d}m ago`;if(f<24)return`${f}h ago`;if(m===1)return"yesterday";if(m<7)return`${m} days ago`;const p=a.getFullYear()===i.getFullYear(),v=a.toLocaleString("en-US",{month:"short"}),g=a.getDate();return p?`${v} ${g}`:`${v} ${g} ${a.getFullYear()}`}const k0={architecture:{text:"var(--accent-blue)",bg:"var(--accent-blue-dim)"},api:{text:"var(--accent-green)",bg:"var(--accent-green-dim)"},bug:{text:"var(--accent-red)",bg:"var(--accent-red-dim)"},decision:{text:"var(--accent-yellow)",bg:"var(--accent-yellow-dim)"},dependency:{text:"var(--accent-purple)",bg:"var(--accent-purple-dim)"},pattern:{text:"var(--accent-cyan)",bg:"var(--accent-cyan-dim)"},general:{text:"var(--text-secondary)",bg:"var(--bg-elevated)"}};function H4({findings:n}){return n.length===0?r.jsx("div",{className:Hn.emptyState,children:"No findings yet. Agents will post discoveries here."}):r.jsx("div",{className:Hn.container,children:n.map((a,i)=>{const l=k0[a.category]||k0.general;return r.jsxs(Tt.div,{className:Hn.card,initial:{opacity:0,y:8},animate:{opacity:1,y:0},transition:{delay:i*.05,duration:.2},children:[r.jsxs("div",{className:Hn.cardHeader,children:[r.jsx("span",{className:Hn.categoryBadge,style:{background:l.bg,color:l.text},children:a.category}),r.jsx("span",{className:Hn.findingTitle,children:a.title}),r.jsx("span",{className:Hn.findingDate,title:a.createdAt,children:V4(a.createdAt)})]}),r.jsx("div",{className:Hn.findingContent,children:a.content.length>300?a.content.slice(0,300)+"...":a.content}),a.tags.length>0&&r.jsx("div",{className:Hn.tags,children:a.tags.map(c=>r.jsx("span",{className:Hn.tag,style:{color:l.text,textShadow:`0 0 8px ${l.text}`},children:c},c))})]},a.id)})})}function Gr(n){if(!n)return"—";const a=new Date(n);return isNaN(a.getTime())?"—":a.toLocaleString(void 0,{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"})}function nf(n,a){if(!n||!a)return;const i=new Date(a).getTime()-new Date(n).getTime();if(isNaN(i)||i<0)return;const l=Math.floor(i/6e4),c=Math.floor(i%6e4/1e3);if(l===0)return`${c}s`;const d=Math.floor(l/60),f=l%60;return d===0?`${l}m ${c}s`:`${d}h ${f}m`}function C0(n){const a=n.toLowerCase();return a==="ready"||a==="running"||a==="available"||a==="connected"?L.envDotGreen:a==="provisioning"||a==="starting"||a==="pending"||a==="connecting"?L.envDotYellow:a==="error"||a==="failed"||a==="disconnected"?L.envDotRed:L.envDotGray}function G4({status:n}){const a=Xa(n),i=y2(n);return r.jsx("span",{className:`${L.statusBadge} ${L[i]??L.statusPending}`,children:a.label})}function P4({task:n,tasksById:a,environments:i,workspaces:l,taskSessions:c,selectedEnvId:d}){const{loadUsage:f,usageCache:m}=rt(),p=c.reduce((E,R)=>E+(R.costUsd??0),0);b.useEffect(()=>{f("task",n.id),n.childTaskIds.length>0&&f("task_tree",n.id)},[n.id,n.childTaskIds.length,f,p]);const v=`task:${n.id}`,g=v in m?m[v]:void 0,y=`task_tree:${n.id}`,x=n.childTaskIds.length>0&&y in m?m[y]:void 0,S=c.length>0?c[c.length-1]:void 0,T=(S==null?void 0:S.environmentId)??"",j=T?i.find(E=>E.id===T):void 0,N=l.find(E=>E.id===n.workspaceId),C=i.find(E=>E.id===d),A=n.branch&&(N!=null&&N.repoUrl)?`${N.repoUrl.replace(/\/$/,"")}/tree/${encodeURIComponent(n.branch)}`:void 0;return r.jsxs("div",{className:L.overviewDashboard,children:[r.jsxs("div",{className:L.overviewHero,children:[r.jsx(G4,{status:n.status}),n.branch&&r.jsx("span",{className:L.overviewBranchPill,children:A?r.jsxs("a",{href:A,target:"_blank",rel:"noreferrer noopener",className:L.branchLink,children:["🔗"," ",n.branch]}):r.jsxs("span",{children:["🔗"," ",n.branch]})})]}),typeof n.description=="string"&&n.description&&r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Description"}),r.jsx("div",{className:L.overviewMarkdown,children:r.jsx(Rf,{remarkPlugins:[Mf],children:n.description})})]}),r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Environment"}),T&&j?r.jsxs("div",{className:L.envRow,"data-testid":"task-overview-environment",children:[r.jsx("span",{className:`${L.envDot} ${C0(j.status)}`,title:j.status,"aria-label":`Status: ${j.status}`,role:"img"}),r.jsx("span",{className:L.overviewValue,children:j.displayName})]}):C?r.jsxs("div",{className:L.envRow,"data-testid":"task-overview-environment",children:[r.jsx("span",{className:`${L.envDot} ${C0(C.status)}`,title:C.status,"aria-label":`Status: ${C.status}`,role:"img"}),r.jsx("span",{className:L.overviewValue,children:C.displayName}),r.jsx("span",{className:L.overviewMuted,children:"(workspace default)"})]}):r.jsx("div",{className:L.overviewMuted,children:"Set in workspace settings"})]}),r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Dependencies"}),n.dependsOn.length===0?r.jsx("div",{className:L.overviewMuted,children:"None"}):r.jsx("div",{className:L.depList,children:n.dependsOn.map(E=>{const R=a.get(E),w=(R==null?void 0:R.status)==="complete";return r.jsxs("div",{className:`${L.depItem} ${w?L.depDone:L.depBlocked}`,children:[r.jsx("span",{children:w?"✓":"○"}),r.jsx("span",{children:(R==null?void 0:R.title)??E})]},E)})})]}),r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Timeline"}),r.jsxs("div",{className:L.timeline,children:[n.createdAt&&r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Created"}),r.jsx("span",{className:L.timelineValue,children:Gr(n.createdAt)})]}),n.assignedAt&&(()=>{const E=nf(n.createdAt,n.assignedAt);return r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Assigned"}),r.jsx("span",{className:L.timelineValue,children:Gr(n.assignedAt)}),E!==void 0&&r.jsx("span",{className:L.timelineDelta,children:E})]})})(),n.startedAt&&(()=>{const E=nf(n.assignedAt??n.createdAt,n.startedAt);return r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Started"}),r.jsx("span",{className:L.timelineValue,children:Gr(n.startedAt)}),E!==void 0&&r.jsx("span",{className:L.timelineDelta,children:E})]})})(),n.completedAt&&(()=>{const E=nf(n.startedAt,n.completedAt);return r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Completed"}),r.jsx("span",{className:L.timelineValue,children:Gr(n.completedAt)}),E!==void 0&&r.jsx("span",{className:L.timelineDelta,children:E})]})})(),!n.createdAt&&!n.assignedAt&&!n.startedAt&&!n.completedAt&&r.jsx("div",{className:L.overviewMuted,children:"No timing data"})]})]}),g&&g.costUsd>0&&r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Usage"}),r.jsxs("div",{className:L.timeline,children:[r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Cost"}),r.jsx("span",{className:L.timelineValue,children:Bi(g.costUsd)}),r.jsxs("span",{className:L.timelineDelta,children:[g.sessionCount," session",g.sessionCount!==1?"s":""]})]}),x&&x.costUsd>g.costUsd&&r.jsxs("div",{className:L.timelineRow,children:[r.jsx("span",{className:L.timelineKey,children:"Total (incl. subtasks)"}),r.jsx("span",{className:L.timelineValue,children:Bi(x.costUsd)}),r.jsxs("span",{className:L.timelineDelta,children:[x.sessionCount," session",x.sessionCount!==1?"s":""]})]})]})]}),n.reviewNotes&&r.jsxs("div",{className:L.overviewSection,children:[r.jsx("div",{className:L.overviewLabel,children:"Review Notes"}),r.jsx("div",{className:L.reviewNotes,children:n.reviewNotes})]})]})}function $4({task:n,sessionId:a,isBlocked:i,onStart:l,onResume:c,onStop:d,onPause:f,onDelete:m,onEdit:p}){if(n.status==="not_started")return i?r.jsxs("div",{className:L.headerActions,children:[r.jsx("button",{onClick:p,className:L.btnGhost,children:"Edit"}),r.jsx("button",{onClick:m,className:L.btnDanger,children:"Delete"})]}):r.jsxs("div",{className:L.headerActions,children:[r.jsx("button",{onClick:l,className:L.btnPrimary,children:"Start"}),r.jsx("button",{onClick:p,className:L.btnGhost,children:"Edit"}),r.jsx("button",{onClick:m,className:L.btnDanger,children:"Delete"})]});if(n.status==="working")return r.jsxs("div",{className:L.headerActions,children:[r.jsx("button",{onClick:d,className:L.btnDanger,children:"Stop"}),r.jsx("button",{onClick:f,disabled:!a,className:L.btnGhost,children:"Pause"})]});if(n.status==="paused")return r.jsxs("div",{className:L.headerActions,children:[r.jsx("button",{onClick:d,className:L.btnPrimary,children:"Stop"}),r.jsx("button",{onClick:c,className:L.btnGhost,children:"Resume"}),r.jsx("button",{onClick:m,className:L.btnDanger,children:"Delete"})]});if(n.status==="complete")return r.jsx("div",{className:L.headerActions,children:r.jsx("button",{onClick:m,className:L.btnDanger,children:"Delete"})});if(n.status==="failed")return r.jsxs("div",{className:L.headerActions,children:[r.jsx("button",{onClick:l,className:L.btnPrimary,children:"Retry"}),r.jsx("button",{onClick:m,className:L.btnDanger,children:"Delete"})]})}function q4({taskSessions:n,selectedSessionId:a,onSelect:i}){if(!(n.length<2))return r.jsxs("div",{className:L.attemptSelector,"data-testid":"attempt-selector",children:[r.jsx("span",{className:L.attemptLabel,children:"Attempts:"}),n.map((l,c)=>{const d=l.id===a,f=l.status==="stopped"&&l.endReason==="completed"?"✓":l.status==="stopped"?"✗":l.status==="running"||l.status==="idle"?"●":"";return r.jsxs("button",{className:`${L.attemptButton} ${d?L.attemptActive:""}`,onClick:()=>i(l.id),title:`Attempt #${c+1} — ${l.status}`,"aria-label":`Attempt #${c+1}, ${l.status}`,"aria-pressed":d,"data-testid":`attempt-${c+1}`,children:["#",c+1,f&&r.jsx("span",{className:L.attemptStatus,children:f})]},l.id)})]})}function _i(){const{taskId:n,workspaceId:a,environmentId:i}=Qa(),l=wt(),c=Rt(),{events:d,eventsDropped:f,tasks:m,sessions:p,environments:v,findings:g,loadSessionEvents:y,loadFindings:x,kill:S,startTask:T,stopTask:j,resumeTask:N,deleteTask:C,workspaces:A,taskSessions:E,loadTaskSessions:R,sendInput:w,spawn:H,personas:I,provisionEnvironment:U}=rt(),q=b.useRef(void 0),ee=b.useRef(void 0),ae=b.useRef(void 0),ce=b.useRef(void 0),re=b.useRef(void 0),K=l.pathname.endsWith("/stream")?"stream":l.pathname.endsWith("/findings")?"findings":"overview",[ne,O]=b.useState(K),[P,se]=b.useState(!1),[oe,Y]=b.useState(void 0),[be,Ne]=b.useState(""),xe=b.useRef(K);K!==xe.current&&(xe.current=K,K!==ne&&O(K));const J=m.find(Te=>Te.id===n),le=(J==null?void 0:J.workspaceId)||void 0,W=A.find(Te=>Te.id===le);b.useEffect(()=>{if(be===""){if(W!=null&&W.environmentId)Ne(W.environmentId);else if(v.length>0){const Te=v.find(kt=>kt.status==="connected");Ne((Te==null?void 0:Te.id)??v[0].id)}}},[be,W==null?void 0:W.environmentId,v]);const tt=J?E[J.id]??[]:[];let Re;oe&&tt.some(Te=>Te.id===oe)?Re=oe:Re=(J==null?void 0:J.latestSessionId)||void 0;const An=()=>{se(!0)},xa=()=>{if(!J)return;C(J.id),se(!1);const Te=i??(W==null?void 0:W.environmentId);c(J.workspaceId&&Te?Ei(J.workspaceId,Te):"/",{replace:!0})};if((J==null?void 0:J.id)!==ee.current&&(ee.current=J==null?void 0:J.id,oe!==void 0&&Y(void 0),be!==""&&Ne("")),b.useEffect(()=>{if(!(J!=null&&J.id))return;const Te=J.id!==ce.current,kt=J.latestSessionId!==re.current;(Te||kt)&&(ce.current=J.id,re.current=J.latestSessionId,R(J.id))},[J==null?void 0:J.id,J==null?void 0:J.latestSessionId,R]),(J==null?void 0:J.status)!==ae.current){const Te=ae.current===void 0;ae.current=J==null?void 0:J.status;const kt=(J==null?void 0:J.status)==="not_started"?"overview":(J==null?void 0:J.status)==="working"||(J==null?void 0:J.status)==="paused"?"stream":(J==null?void 0:J.status)==="complete"?"findings":void 0;kt&&kt!==ne&&!(Te&&K!=="overview")&&O(kt)}const fn=b.useMemo(()=>new Map(m.map(Te=>[Te.id,Te])),[m]),Kn=b.useMemo(()=>{const Te=Re?d.filter(kt=>kt.sessionId===Re):[];return wh(Nh(Te))},[d,Re]),Fn=J?J.dependsOn.some(Te=>{const kt=fn.get(Te);return kt!==void 0&&kt.status!=="complete"}):!1,hn=b.useMemo(()=>k6(n,i,A,v,fn),[n,i,A,v,fn]);b.useEffect(()=>{Re&&Re!==q.current&&(q.current=Re,y(Re))},[Re,y]),b.useEffect(()=>{ne==="findings"&&le&&x(le)},[ne,le,x]);const Ln=Te=>{O(Te),c(ya(n,Te==="overview"?void 0:Te,a,i))};return r.jsxs("div",{className:L.panelContainer,children:[r.jsx(Ds,{segments:hn}),r.jsxs("div",{className:L.header,children:[r.jsxs("span",{className:L.headerTitle,children:[r.jsx("span",{"data-testid":"task-title",children:(J==null?void 0:J.title)||n}),J&&r.jsx("span",{className:L.taskStatusBadge,"data-testid":"task-status",children:J.status}),(J==null?void 0:J.branch)&&r.jsx("span",{className:L.taskBranch,children:J.branch}),Fn&&r.jsx("span",{className:L.taskBlockedBadge,children:"blocked"})]}),J&&r.jsx($4,{task:J,sessionId:Re,isBlocked:Fn,onStart:()=>T(J.id,void 0,be),onResume:()=>N(J.id),onStop:()=>j(J.id),onPause:()=>Re&&S(Re),onDelete:An,onEdit:()=>c(jk(J.id,a,i))})]}),r.jsxs("div",{className:L.tabBar,role:"tablist","aria-label":"Task view",children:[r.jsx("button",{role:"tab","aria-selected":ne==="overview",className:`${L.tab} ${ne==="overview"?L.active:""}`,onClick:()=>Ln("overview"),children:"Overview"}),r.jsx("button",{role:"tab","aria-selected":ne==="stream",className:`${L.tab} ${ne==="stream"?L.active:""}`,onClick:()=>Ln("stream"),children:"Stream"}),r.jsx("button",{role:"tab","aria-selected":ne==="findings",className:`${L.tab} ${ne==="findings"?L.active:""}`,onClick:()=>Ln("findings"),children:"Findings"})]}),r.jsxs(Yn,{mode:"wait",children:[ne==="overview"&&r.jsx(Tt.div,{initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},className:L.overviewContent,"data-testid":"task-overview",children:J?r.jsx(P4,{task:J,tasksById:fn,environments:v,workspaces:A,taskSessions:tt,selectedEnvId:be}):r.jsx("div",{className:L.waitingMessage,children:"No additional details"})},"overview"),ne==="stream"&&r.jsxs(Tt.div,{initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},style:{display:"flex",flexDirection:"column",flex:1,overflow:"hidden"},children:[r.jsx(q4,{taskSessions:tt,selectedSessionId:Re,onSelect:Te=>Y(Te)}),r.jsx(jh,{events:Kn,eventsDropped:f,emptyState:!Re&&J?r.jsxs("div",{className:L.emptyCta,children:[r.jsx("button",{className:L.ctaButton,onClick:()=>T(J.id,void 0,be),children:"Start Task"}),r.jsx("div",{className:L.ctaDescription,children:"Click to begin agent execution"})]}):Re&&Kn.length===0?r.jsx("div",{className:L.waitingMessage,children:"Waiting for events..."}):void 0})]},"stream"),ne==="findings"&&r.jsx(Tt.div,{initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},className:L.tabContent,children:le?r.jsx(H4,{findings:g.filter(Te=>Te.workspaceId===le)}):r.jsx("div",{className:L.noContext,children:"Navigate to a task within a workspace to view findings"})},"findings")]}),(()=>{if(!J||J.status!=="working"&&J.status!=="paused")return;const Te=Re?p.find(kt=>kt.id===Re):void 0;if(!(!Te||Te.status==="stopped"))return r.jsx(ol,{mode:"send",sessionId:Te.id,environmentId:Te.environmentId,personas:I,environments:v,onSendInput:w,onSpawn:H,onStartTask:T,onProvisionEnvironment:U})})(),J&&r.jsx(bc,{isOpen:P,title:"Delete Task?",description:`"${J.title}" will be permanently removed.`,onConfirm:xa,onCancel:()=>se(!1)})]})}const Y4="_container_legrg_1",K4="_header_legrg_8",F4="_headerTitle_legrg_35",Z4="_badge_legrg_44",X4="_headerActions_legrg_54",Q4="_body_legrg_61",W4="_formContent_legrg_73",J4="_section_legrg_85",eB="_label_legrg_91",tB="_nameInput_legrg_98",nB="_fieldInput_legrg_131",aB="_adapterSelect_legrg_164",sB="_readOnlyValue_legrg_198",iB="_codespaceSection_legrg_204",oB="_codespaceActions_legrg_210",lB="_creatingHint_legrg_216",rB="_errorHint_legrg_222",cB="_btnPrimary_legrg_235",uB="_btnGhost_legrg_266",te={container:Y4,header:K4,headerTitle:F4,badge:Z4,headerActions:X4,body:Q4,formContent:W4,section:J4,label:eB,nameInput:tB,fieldInput:nB,adapterSelect:aB,readOnlyValue:sB,codespaceSection:iB,codespaceActions:oB,creatingHint:lB,errorHint:rB,btnPrimary:cB,btnGhost:uB},Zr=1,Xr=65535;function af(n){if(!n.trim())return!0;const a=Number(n);return Number.isInteger(a)&&a>=Zr&&a<=Xr}function sf(n){try{const a=JSON.parse(n);if(typeof a=="object"&&a!==null&&!Array.isArray(a))return a}catch{}return{}}function dB({codespaceName:n,onCodespaceNameChange:a,envName:i,onEnvNameChange:l,codespaces:c,codespaceError:d,codespaceListError:f,codespaceCreating:m,onCreateCodespace:p}){const[v,g]=b.useState("pick"),[y,x]=b.useState(""),[S,T]=b.useState("");return v==="create"?r.jsxs("div",{className:te.codespaceSection,children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Repository"}),r.jsx("input",{type:"text",value:y,onChange:j=>x(j.target.value),placeholder:"owner/repo",className:te.fieldInput,"data-testid":"env-codespace-repo"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Machine Type"}),r.jsx("input",{type:"text",value:S,onChange:j=>T(j.target.value),placeholder:"Machine type (optional)...",className:te.fieldInput,"data-testid":"env-codespace-machine"})]}),r.jsxs("div",{className:te.codespaceActions,children:[r.jsx("button",{onClick:()=>{y.trim()&&(p(y.trim(),S.trim()||void 0),g("pick"),x(""),T(""))},disabled:!y.trim(),className:te.btnPrimary,children:"Create"}),r.jsx("button",{onClick:()=>{g("pick"),x(""),T("")},className:te.btnGhost,children:"Cancel"})]})]}):r.jsx("div",{className:te.codespaceSection,children:r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Codespace"}),!f&&r.jsxs("select",{value:n,onChange:j=>{j.target.value==="__create__"?(g("create"),a("")):(a(j.target.value),j.target.value&&!i.trim()&&l(j.target.value))},disabled:m,className:te.adapterSelect,"data-testid":"env-codespace-select",children:[r.jsx("option",{value:"",children:"Select a codespace..."}),c.map(j=>r.jsxs("option",{value:j.name,children:[j.name," (",j.repository,") — ",j.state]},j.name)),r.jsx("option",{value:"__create__",children:"Create new from repo..."})]}),m&&r.jsx("span",{className:te.creatingHint,children:"Creating codespace..."}),f&&r.jsxs(r.Fragment,{children:[r.jsx("span",{className:te.errorHint,children:f}),r.jsx("input",{type:"text",value:n,onChange:j=>a(j.target.value),placeholder:"Or enter codespace name manually...",className:te.fieldInput,"data-testid":"env-codespace-manual"})]}),d&&!f&&r.jsx("span",{className:te.errorHint,children:d})]})})}function Jx({mode:n,environmentId:a,environments:i,onAddEnvironment:l,onUpdateEnvironment:c,onListCodespaces:d,codespaces:f,codespaceError:m,codespaceListError:p,codespaceCreating:v,onCreateCodespace:g}){const{showToast:y}=Es(),x=Rt(),S=n==="edit",T=S&&a?i.find(le=>le.id===a):void 0,[j,N]=b.useState(""),[C,A]=b.useState("local"),[E,R]=b.useState(""),[w,H]=b.useState(""),[I,U]=b.useState(""),[q,ee]=b.useState(""),[ae,ce]=b.useState(""),[re,K]=b.useState(""),[ne,O]=b.useState(""),[P,se]=b.useState(null),oe=b.useCallback(()=>{const le={};if(C==="local"){if(E.trim()&&(le.host=E.trim()),w.trim()){const W=Number(w);Number.isInteger(W)&&(le.port=W)}}else if(C==="ssh"){if(le.host=E.trim(),I.trim()&&(le.user=I.trim()),w.trim()){const W=Number(w);Number.isInteger(W)&&(le.sshPort=W)}q.trim()&&(le.identityFile=q.trim())}else C==="docker"?(ae.trim()&&(le.image=ae.trim()),re.trim()&&(le.repo=re.trim())):C==="codespace"&&(le.codespaceName=ne.trim());return le},[C,E,w,I,q,ae,re,ne]),Y=()=>!(!j.trim()||C==="ssh"&&!E.trim()||C==="codespace"&&!ne.trim()||(C==="local"||C==="ssh")&&!af(w)),be=()=>{Y()&&(l(j.trim(),C,oe()),y("Environment added successfully","success"),x(Ai,{replace:!0}))},Ne=()=>{x(a?Di(a):Ai)},xe=b.useCallback((le,W)=>{if(!T||!a)return;const tt=sf(T.adapterConfig),Re=W.trim();Re?tt[le]=Re:delete tt[le],c(a,{adapterConfig:tt})},[T,a,c]),J=b.useCallback((le,W)=>{if(!T||!a)return;const tt=sf(T.adapterConfig);if(W.trim()){const Re=Number(W);Number.isInteger(Re)&&Re>=Zr&&Re<=Xr&&(tt[le]=Re)}else delete tt[le];c(a,{adapterConfig:tt})},[T,a,c]);if(S){if(!T)return r.jsxs("div",{className:te.container,children:[r.jsxs("div",{className:te.header,children:[r.jsx("div",{className:te.headerTitle,children:r.jsx("span",{className:te.badge,children:"edit environment"})}),r.jsx("div",{className:te.headerActions,children:r.jsx("button",{onClick:Ne,className:te.btnGhost,children:"Back"})})]}),r.jsx("div",{className:te.body,children:r.jsx("div",{className:te.formContent,children:r.jsx("span",{className:te.readOnlyValue,children:"Environment not found"})})})]});const le=sf(T.adapterConfig);return r.jsxs("div",{className:te.container,"data-testid":"env-edit-panel",children:[r.jsxs("div",{className:te.header,children:[r.jsx("div",{className:te.headerTitle,children:r.jsx("span",{className:te.badge,children:"edit environment"})}),r.jsx("div",{className:te.headerActions,children:r.jsx("button",{onClick:Ne,className:te.btnGhost,"data-testid":"env-edit-back",children:"Back"})})]}),r.jsx("div",{className:te.body,children:r.jsxs("div",{className:te.formContent,children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Name"}),r.jsx(rn,{value:T.displayName,onSave:W=>{a&&c(a,{displayName:W})},validate:W=>W.trim()===""?"Name cannot be empty":void 0,mode:"edit",fieldId:"name",activeFieldId:P,onActivate:se,placeholder:"Environment name",ariaLabel:"Environment name","data-testid":"env-edit-name"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Adapter Type"}),r.jsx("span",{className:te.readOnlyValue,"data-testid":"env-edit-adapter-type",children:T.adapterType})]}),T.adapterType==="local"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Host"}),r.jsx(rn,{value:String(le.host??""),onSave:W=>xe("host",W),mode:"edit",fieldId:"host",activeFieldId:P,onActivate:se,placeholder:"(default)",ariaLabel:"Host","data-testid":"env-edit-host"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Port"}),r.jsx(rn,{value:String(le.port??""),onSave:W=>J("port",W),validate:W=>af(W)?void 0:"Port must be 1-65535",mode:"edit",fieldId:"port",activeFieldId:P,onActivate:se,placeholder:"(default)",ariaLabel:"Port","data-testid":"env-edit-port"})]})]}),T.adapterType==="ssh"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Host"}),r.jsx(rn,{value:String(le.host??""),onSave:W=>xe("host",W),validate:W=>W.trim()===""?"Host is required":void 0,mode:"edit",fieldId:"host",activeFieldId:P,onActivate:se,placeholder:"hostname or IP",ariaLabel:"Host","data-testid":"env-edit-host"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"User"}),r.jsx(rn,{value:String(le.user??""),onSave:W=>xe("user",W),mode:"edit",fieldId:"user",activeFieldId:P,onActivate:se,placeholder:"(default)",ariaLabel:"User","data-testid":"env-edit-user"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"SSH Port"}),r.jsx(rn,{value:String(le.sshPort??""),onSave:W=>J("sshPort",W),validate:W=>af(W)?void 0:"Port must be 1-65535",mode:"edit",fieldId:"sshPort",activeFieldId:P,onActivate:se,placeholder:"22",ariaLabel:"SSH Port","data-testid":"env-edit-ssh-port"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Identity File"}),r.jsx(rn,{value:String(le.identityFile??""),onSave:W=>xe("identityFile",W),mode:"edit",fieldId:"identityFile",activeFieldId:P,onActivate:se,placeholder:"~/.ssh/id_rsa",ariaLabel:"Identity File","data-testid":"env-edit-identity-file"})]})]}),T.adapterType==="docker"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Image"}),r.jsx(rn,{value:String(le.image??""),onSave:W=>xe("image",W),mode:"edit",fieldId:"image",activeFieldId:P,onActivate:se,placeholder:"(default)",ariaLabel:"Image","data-testid":"env-edit-image"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Repo"}),r.jsx(rn,{value:String(le.repo??""),onSave:W=>xe("repo",W),mode:"edit",fieldId:"repo",activeFieldId:P,onActivate:se,placeholder:"(none)",ariaLabel:"Repo","data-testid":"env-edit-repo"})]})]}),T.adapterType==="codespace"&&r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,children:"Codespace Name"}),r.jsx(rn,{value:String(le.codespaceName??""),onSave:W=>xe("codespaceName",W),validate:W=>W.trim()===""?"Codespace name is required":void 0,mode:"edit",fieldId:"codespaceName",activeFieldId:P,onActivate:se,placeholder:"codespace-name",ariaLabel:"Codespace Name","data-testid":"env-edit-codespace-name"})]})]})})]})}return r.jsxs("div",{className:te.container,"data-testid":"env-create-panel",children:[r.jsxs("div",{className:te.header,children:[r.jsx("div",{className:te.headerTitle,children:r.jsx("span",{className:te.badge,children:"new environment"})}),r.jsxs("div",{className:te.headerActions,children:[r.jsx("button",{onClick:be,disabled:!Y(),className:te.btnPrimary,"data-testid":"env-create-submit",children:"Create"}),r.jsx("button",{onClick:Ne,className:te.btnGhost,children:"Cancel"})]})]}),r.jsx("div",{className:te.body,children:r.jsxs("div",{className:te.formContent,children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-name",children:"Name"}),r.jsx("input",{id:"env-create-name",type:"text",value:j,onChange:le=>N(le.target.value),placeholder:"Environment name...",autoFocus:!0,className:te.nameInput,"data-testid":"env-create-name",onKeyDown:le=>{le.key==="Enter"&&Y()&&be()}})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-adapter",children:"Adapter Type"}),r.jsxs("select",{id:"env-create-adapter",value:C,onChange:le=>{A(le.target.value),le.target.value==="codespace"&&d()},className:te.adapterSelect,"data-testid":"env-create-adapter",children:[r.jsx("option",{value:"local",children:"local"}),r.jsx("option",{value:"ssh",children:"ssh"}),r.jsx("option",{value:"docker",children:"docker"}),r.jsx("option",{value:"codespace",children:"codespace"})]})]}),C==="local"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-host",children:"Host"}),r.jsx("input",{id:"env-create-host",type:"text",value:E,onChange:le=>R(le.target.value),placeholder:"Host (optional)...",className:te.fieldInput,"data-testid":"env-create-host"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-port",children:"Port"}),r.jsx("input",{id:"env-create-port",type:"number",min:Zr,max:Xr,value:w,onChange:le=>H(le.target.value),placeholder:"Port (optional)...",className:te.fieldInput,"data-testid":"env-create-port"})]})]}),C==="ssh"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-host",children:"Host"}),r.jsx("input",{id:"env-create-host",type:"text",value:E,onChange:le=>R(le.target.value),placeholder:"Host (required)...",className:te.fieldInput,"data-testid":"env-create-host"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-user",children:"User"}),r.jsx("input",{id:"env-create-user",type:"text",value:I,onChange:le=>U(le.target.value),placeholder:"User (optional)...",className:te.fieldInput,"data-testid":"env-create-user"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-port",children:"SSH Port"}),r.jsx("input",{id:"env-create-port",type:"number",min:Zr,max:Xr,value:w,onChange:le=>H(le.target.value),placeholder:"SSH port (optional)...",className:te.fieldInput,"data-testid":"env-create-port"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-identity",children:"Identity File"}),r.jsx("input",{id:"env-create-identity",type:"text",value:q,onChange:le=>ee(le.target.value),placeholder:"Identity file (optional)...",className:te.fieldInput,"data-testid":"env-create-identity"})]})]}),C==="docker"&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-image",children:"Image"}),r.jsx("input",{id:"env-create-image",type:"text",value:ae,onChange:le=>ce(le.target.value),placeholder:"Image (optional)...",className:te.fieldInput,"data-testid":"env-create-image"})]}),r.jsxs("div",{className:te.section,children:[r.jsx("label",{className:te.label,htmlFor:"env-create-repo",children:"Repo"}),r.jsx("input",{id:"env-create-repo",type:"text",value:re,onChange:le=>K(le.target.value),placeholder:"Repo (optional)...",className:te.fieldInput,"data-testid":"env-create-repo"})]})]}),C==="codespace"&&r.jsx(dB,{codespaceName:ne,onCodespaceNameChange:O,envName:j,onEnvNameChange:N,codespaces:f,codespaceError:m,codespaceListError:p,codespaceCreating:v,onCreateCodespace:g})]})})]})}function fB(){const{environments:n,addEnvironment:a,updateEnvironment:i,listCodespaces:l,codespaces:c,codespaceError:d,codespaceListError:f,codespaceCreating:m,createCodespace:p}=rt();return r.jsx(Jx,{mode:"new",environments:n,onAddEnvironment:a,onUpdateEnvironment:i,onListCodespaces:l,codespaces:c,codespaceError:d,codespaceListError:f,codespaceCreating:m,onCreateCodespace:p})}function hB(){const{environmentId:n}=Qa(),{environments:a,addEnvironment:i,updateEnvironment:l,listCodespaces:c,codespaces:d,codespaceError:f,codespaceListError:m,codespaceCreating:p,createCodespace:v}=rt();return r.jsx(Jx,{mode:"edit",environmentId:n,environments:a,onAddEnvironment:i,onUpdateEnvironment:l,onListCodespaces:c,codespaces:d,codespaceError:f,codespaceListError:m,codespaceCreating:p,onCreateCodespace:v})}const mB="_layout_11u79_1",pB="_content_11u79_8",vB="_tabPanel_11u79_14",Wo={layout:mB,content:pB,tabPanel:vB};function gB(){const n=x6();return r.jsxs("div",{className:Wo.layout,children:[r.jsx(Ds,{segments:n}),r.jsx("div",{className:Wo.content,children:r.jsx(ws,{})})]})}const yB="_container_13sb6_1",bB="_envHeader_13sb6_6",xB="_envTitleRow_13sb6_10",_B="_statusDot_13sb6_16",SB="_envName_13sb6_21",TB="_statusBadge_13sb6_27",kB="_envMeta_13sb6_33",CB="_metaTag_13sb6_39",jB="_actions_13sb6_51",NB="_provisionMessage_13sb6_59",wB="_errorMessage_13sb6_64",EB="_section_13sb6_69",AB="_sectionHeader_13sb6_73",DB="_cardList_13sb6_121",RB="_card_13sb6_121",MB="_cardHeader_13sb6_138",OB="_cardName_13sb6_144",BB="_cardActions_13sb6_149",LB="_cardDescription_13sb6_154",IB="_cardMeta_13sb6_160",zB="_repoLink_13sb6_166",UB="_empty_13sb6_174",VB="_btnPrimary_13sb6_180",HB="_btnOutline_13sb6_214",GB="_btnSmall_13sb6_241",PB="_btnDanger_13sb6_267",Ue={container:yB,envHeader:bB,envTitleRow:xB,statusDot:_B,envName:SB,statusBadge:TB,envMeta:kB,metaTag:CB,actions:jB,provisionMessage:NB,errorMessage:wB,section:EB,sectionHeader:AB,cardList:DB,card:RB,cardHeader:MB,cardName:OB,cardActions:BB,cardDescription:LB,cardMeta:IB,repoLink:zB,empty:UB,btnPrimary:VB,btnOutline:HB,btnSmall:GB,btnDanger:PB},$B={connected:"var(--accent-green)",sleeping:"var(--accent-yellow)",error:"var(--accent-red)",disconnected:"var(--text-tertiary)",connecting:"var(--accent-blue)"};function qB(){const{environmentId:n}=Qa(),a=Rt(),{environments:i,workspaces:l,sessions:c,provisionStatus:d,provisionEnvironment:f,stopEnvironment:m,removeEnvironment:p,archiveWorkspace:v}=rt(),[g,y]=b.useState(!1),[x,S]=b.useState(void 0),T=i.find(q=>q.id===n);if(!n||!T)return r.jsx(Gn,{to:Ai,replace:!0});const j=l.filter(q=>q.environmentId===T.id),N=c.filter(q=>q.environmentId===T.id),C=N.reduce((q,ee)=>q+(ee.costUsd??0),0),A=$B[T.status]||"var(--text-tertiary)",E=T.status==="connected",R=T.status==="connecting",w=T.status==="disconnected"||T.status==="error",H=T.id in d?d[T.id]:void 0,I=()=>{p(T.id),y(!1),a(Ai,{replace:!0})},U=q=>{v(q),S(void 0)};return r.jsxs("div",{className:Ue.container,children:[r.jsx(bc,{isOpen:g,title:"Delete Environment?",description:`"${T.displayName||T.id}" will be permanently removed along with all its data.`,onConfirm:I,onCancel:()=>y(!1)}),r.jsxs("div",{className:Ue.envHeader,children:[r.jsxs("div",{className:Ue.envTitleRow,children:[r.jsx("span",{className:Ue.statusDot,style:{color:A},children:"●"}),r.jsx("h2",{className:Ue.envName,children:T.displayName||T.id}),r.jsx("span",{className:Ue.statusBadge,style:{color:A},children:T.status})]}),r.jsxs("div",{className:Ue.envMeta,children:[r.jsxs("span",{className:Ue.metaTag,children:["Adapter: ",T.adapterType]}),N.length>0&&r.jsxs("span",{className:Ue.metaTag,children:[N.length," session",N.length!==1?"s":""]}),C>0&&r.jsxs("span",{className:Ue.metaTag,children:["Cost: ",Bi(C)]})]})]}),r.jsxs("div",{className:Ue.actions,children:[E&&r.jsxs(r.Fragment,{children:[r.jsx("button",{className:Ue.btnPrimary,onClick:()=>a(Z0(T.id)),children:"New Chat"}),r.jsx("button",{className:Ue.btnOutline,onClick:()=>m(T.id),children:"Stop"})]}),w&&r.jsx("button",{className:Ue.btnPrimary,onClick:()=>f(T.id),children:T.status==="error"?"Retry":"Connect"}),R&&H!==void 0&&r.jsx("span",{className:Ue.provisionMessage,children:H.message}),T.status==="error"&&(H==null?void 0:H.stage)==="error"&&r.jsx("span",{className:Ue.errorMessage,children:H.message}),r.jsx("button",{className:Ue.btnOutline,onClick:()=>a(wk(T.id)),"data-testid":"env-edit-btn",children:"Edit Config"}),r.jsx("button",{className:Ue.btnDanger,onClick:()=>y(!0),children:"Delete"})]}),r.jsxs("div",{className:Ue.section,children:[r.jsxs("div",{className:Ue.sectionHeader,children:[r.jsx("h3",{children:"Workspaces"}),r.jsx("button",{className:Ue.btnPrimary,onClick:()=>a(`${X0}?environment=${encodeURIComponent(T.id)}`),"data-testid":"workspace-create-button",children:"+ New Workspace"})]}),j.length===0&&r.jsx("p",{className:Ue.empty,children:"No workspaces yet. Create one to get started."}),r.jsx("div",{className:Ue.cardList,children:j.map(q=>r.jsx(YB,{workspace:q,confirmArchiveId:x,onOpen:()=>a(Ei(q.id,T.id)),onArchive:()=>S(q.id),onConfirmArchive:()=>U(q.id),onCancelArchive:()=>S(void 0)},q.id))})]})]})}function YB({workspace:n,confirmArchiveId:a,onOpen:i,onArchive:l,onConfirmArchive:c,onCancelArchive:d}){const f=a===n.id,m=n.repoUrl&&/^https?:\/\//.test(n.repoUrl);return r.jsxs("div",{className:Ue.card,"data-testid":"workspace-card",children:[r.jsxs("div",{className:Ue.cardHeader,children:[r.jsx("strong",{className:Ue.cardName,children:n.name}),r.jsxs("div",{className:Ue.cardActions,children:[r.jsx("button",{className:Ue.btnSmall,onClick:i,children:"Open"}),f?r.jsxs(r.Fragment,{children:[r.jsx("button",{className:Ue.btnDanger,onClick:c,children:"Confirm"}),r.jsx("button",{className:Ue.btnSmall,onClick:d,children:"Cancel"})]}):r.jsx("button",{className:Ue.btnSmall,onClick:l,children:"Archive"})]})]}),n.description&&r.jsx("p",{className:Ue.cardDescription,children:n.description}),n.repoUrl&&r.jsx("div",{className:Ue.cardMeta,children:m?r.jsx("a",{href:n.repoUrl,target:"_blank",rel:"noopener noreferrer",className:Ue.repoLink,children:n.repoUrl}):r.jsx("span",{children:n.repoUrl})})]})}const KB={credentials:"Credentials",personas:"Personas",appearance:"Appearance",about:"About"};function FB(){const a=wt().pathname.replace(/^\/settings\/?/,"").split("/")[0],i=KB[a],l=b6(i);return r.jsxs("div",{className:Wo.layout,children:[r.jsx(Ds,{segments:l}),r.jsx("div",{className:Wo.content,children:r.jsx("div",{className:Wo.tabPanel,children:r.jsx(ws,{})},a)})]})}const ZB="_section_1ingb_14",XB="_sectionTitle_1ingb_26",QB="_sectionDescription_1ingb_35",WB="_tokenList_1ingb_48",JB="_tokenRow_1ingb_55",e5="_tokenBadge_1ingb_68",t5="_tokenName_1ingb_83",n5="_tokenTarget_1ingb_90",a5="_deleteButton_1ingb_99",s5="_addForm_1ingb_113",i5="_formRow_1ingb_119",o5="_input_1ingb_125",l5="_select_1ingb_155",r5="_addButton_1ingb_187",c5="_emptyStateInfo_1ingb_221",u5="_themeOptions_1ingb_229",d5="_themeOption_1ingb_229",f5="_themeOptionSelected_1ingb_254",h5="_themeOptionHeader_1ingb_259",m5="_themeOptionLabel_1ingb_266",p5="_themeOptionDesc_1ingb_273",v5="_variantToggle_1ingb_279",g5="_variantButton_1ingb_286",y5="_variantActive_1ingb_305",b5="_themeSwatches_1ingb_311",x5="_themeSwatch_1ingb_311",_5="_systemToggle_1ingb_325",S5="_systemToggleHint_1ingb_341",T5="_themeActive_1ingb_348",k5="_aboutGrid_1ingb_354",C5="_aboutItem_1ingb_360",j5="_aboutLabel_1ingb_373",N5="_aboutValue_1ingb_379",w5="_aboutDot_1ingb_387",E5="_aboutDotConnected_1ingb_394",A5="_aboutDotDisconnected_1ingb_398",de={section:ZB,sectionTitle:XB,sectionDescription:QB,tokenList:WB,tokenRow:JB,tokenBadge:e5,tokenName:t5,tokenTarget:n5,deleteButton:a5,addForm:s5,formRow:i5,input:o5,select:l5,addButton:r5,emptyStateInfo:c5,themeOptions:u5,themeOption:d5,themeOptionSelected:f5,themeOptionHeader:h5,themeOptionLabel:m5,themeOptionDesc:p5,variantToggle:v5,variantButton:g5,variantActive:y5,themeSwatches:b5,themeSwatch:x5,systemToggle:_5,systemToggleHint:S5,themeActive:T5,aboutGrid:k5,aboutItem:C5,aboutLabel:j5,aboutValue:N5,aboutDot:w5,aboutDotConnected:E5,aboutDotDisconnected:A5},D5=[{key:"claude",label:"Claude",description:"Forward Claude credentials for AI agent access.",options:[{value:"off",label:"Off"},{value:"subscription",label:"Subscription"},{value:"api_key",label:"API Key"}]},{key:"github",label:"GitHub",description:"Forward GITHUB_TOKEN and GH_TOKEN for git operations.",options:[{value:"off",label:"Off"},{value:"on",label:"On"}]},{key:"copilot",label:"Copilot",description:"Forward Copilot tokens (COPILOT_GITHUB_TOKEN, CLI config).",options:[{value:"off",label:"Off"},{value:"on",label:"On"}]},{key:"codex",label:"Codex",description:"Forward OPENAI_API_KEY for Codex/OpenAI access.",options:[{value:"off",label:"Off"},{value:"on",label:"On"}]},{key:"goose",label:"Goose",description:"Forward Goose config and API keys for Goose agent access.",options:[{value:"off",label:"Off"},{value:"on",label:"On"}]}];function R5({credentialProviders:n,onUpdateCredentialProviders:a}){const i=(l,c)=>{const d={...n};l==="claude"?d.claude=c:d[l]=c,a(d)};return r.jsxs("section",{className:de.section,children:[r.jsx("h3",{className:de.sectionTitle,children:"Credential Providers"}),r.jsx("p",{className:de.sectionDescription,children:"Enable providers to automatically forward credentials to environments at task start. Credentials are read fresh from the host each time."}),r.jsx("div",{className:de.tokenList,children:D5.map(l=>r.jsxs("div",{className:de.tokenRow,children:[r.jsx("span",{className:de.tokenName,children:l.label}),r.jsx("span",{className:de.tokenTarget,children:l.description}),r.jsx("select",{className:de.select,value:n[l.key],onChange:c=>i(l.key,c.target.value),children:l.options.map(c=>r.jsx("option",{value:c.value,children:c.label},c.value))})]},l.key))})]})}const M5=[{value:"env_var",label:"Environment Variable"},{value:"file",label:"File"}];function O5({tokens:n,onSetToken:a,onDeleteToken:i}){const{showToast:l}=Es(),[c,d]=b.useState(""),[f,m]=b.useState(""),[p,v]=b.useState("env_var"),[g,y]=b.useState(""),[x,S]=b.useState(null),T=C=>{if(C.preventDefault(),!c||!f)return;const A=p==="env_var"?g||c.toUpperCase()+"_TOKEN":"";a(c,f,p,A,p==="file"?g:""),l("Token saved successfully","success"),d(""),m(""),y("")},j=C=>{S(C)},N=()=>{x&&(i(x),l("Token deleted","info")),S(null)};return r.jsxs(r.Fragment,{children:[r.jsx(bc,{isOpen:x!==null,title:"Delete Token?",description:x?`"${x}" will be permanently removed.`:void 0,onConfirm:N,onCancel:()=>S(null)}),r.jsxs("section",{className:de.section,children:[r.jsx("h3",{className:de.sectionTitle,children:"Tokens"}),r.jsx("p",{className:de.sectionDescription,children:"API tokens are auto-pushed to environments when set or updated. Values are write-only."}),n.length===0?r.jsx("div",{className:de.emptyStateInfo,children:"Add your first API token to enable service integrations."}):r.jsx("div",{className:de.tokenList,children:n.map(C=>r.jsxs("div",{className:de.tokenRow,children:[r.jsx("span",{className:de.tokenBadge,children:C.tokenType}),r.jsx("span",{className:de.tokenName,children:C.name}),r.jsx("span",{className:de.tokenTarget,children:C.tokenType==="env_var"?C.envVar:C.filePath}),r.jsx("button",{className:de.deleteButton,onClick:()=>j(C.name),title:`Delete ${C.name}`,children:"×"})]},C.name))}),r.jsxs("form",{className:de.addForm,onSubmit:T,children:[r.jsxs("div",{className:de.formRow,children:[r.jsx("input",{className:de.input,type:"text",placeholder:"Token name",value:c,onChange:C=>d(C.target.value)}),r.jsx("input",{className:de.input,type:"password",placeholder:"Value",value:f,onChange:C=>m(C.target.value)})]}),r.jsxs("div",{className:de.formRow,children:[r.jsx("select",{className:de.select,value:p,onChange:C=>v(C.target.value),children:M5.map(C=>r.jsx("option",{value:C.value,children:C.label},C.value))}),r.jsx("input",{className:de.input,type:"text",placeholder:p==="env_var"?"Env var name (e.g. API_TOKEN)":"File path (e.g. /home/user/.token)",value:g,onChange:C=>y(C.target.value)}),r.jsx("button",{className:de.addButton,type:"submit",children:"Add Token"})]})]})]})]})}function B5(){const{tokens:n,setToken:a,deleteToken:i,credentialProviders:l,updateCredentialProviders:c}=rt();return r.jsxs(r.Fragment,{children:[r.jsx(R5,{credentialProviders:l,onUpdateCredentialProviders:c}),r.jsx(O5,{tokens:n,onSetToken:a,onDeleteToken:i})]})}const L5="_container_xb7ms_1",I5="_header_xb7ms_7",z5="_form_xb7ms_19",U5="_formActions_xb7ms_87",V5="_list_xb7ms_93",H5="_card_xb7ms_99",G5="_active_xb7ms_109",P5="_cardHeader_xb7ms_113",$5="_cardTitle_xb7ms_123",q5="_defaultBadge_xb7ms_129",Y5="_cardActions_xb7ms_143",K5="_description_xb7ms_148",F5="_meta_xb7ms_154",Z5="_promptDetails_xb7ms_171",X5="_promptText_xb7ms_183",Q5="_empty_xb7ms_200",W5="_btnPrimary_xb7ms_206",J5="_btnSecondary_xb7ms_240",eL="_btnSmall_xb7ms_267",tL="_btnDanger_xb7ms_293",nL="_typeToggle_xb7ms_336",aL="_typeBadge_xb7ms_350",sL="_scriptEditor_xb7ms_364",iL="_optional_xb7ms_371",qe={container:L5,header:I5,form:z5,formActions:U5,list:V5,card:H5,active:G5,cardHeader:P5,cardTitle:$5,defaultBadge:q5,cardActions:Y5,description:K5,meta:F5,promptDetails:Z5,promptText:X5,empty:Q5,btnPrimary:W5,btnSecondary:J5,btnSmall:eL,btnDanger:tL,typeToggle:nL,typeBadge:aL,scriptEditor:sL,optional:iL};function oL({personas:n,appDefaultPersonaId:a,onCreatePersona:i,onUpdatePersona:l,onDeletePersona:c,onSetAppDefaultPersonaId:d}){const[f,m]=b.useState(null),[p,v]=b.useState(!1),[g,y]=b.useState(null),[x,S]=b.useState(""),[T,j]=b.useState(""),[N,C]=b.useState(""),[A,E]=b.useState("claude-code"),[R,w]=b.useState("sonnet"),[H,I]=b.useState(0),[U,q]=b.useState("agent"),[ee,ae]=b.useState(""),ce=()=>{S(""),j(""),C(""),E("claude-code"),w("sonnet"),I(0),q("agent"),ae("")},re=()=>{ce(),m(null),v(!0)},K=Y=>{S(Y.name),j(Y.description),C(Y.systemPrompt);const be=Y.type==="script"?"script":"agent";E(be==="script"?Y.runtime||"genaiscript":Y.runtime),w(Y.model),I(Y.maxTurns),q(be),ae(Y.script||""),m(Y),v(!1)},ne=Y=>{q(Y),Y==="script"?E("genaiscript"):A==="genaiscript"&&E("claude-code")},O=Y=>{if(Y.preventDefault(),!!x.trim()){if(U==="script"){if(!ee.trim())return}else if(!N.trim()||!A||!R)return;f?(l(f.id,x,T,N,A,R,H,U,ee),m(null)):(i(x,T,N,A,R,H,U,ee),v(!1)),ce()}},P=Y=>{c(Y),y(null),(f==null?void 0:f.id)===Y&&(m(null),ce())},se=()=>{m(null),v(!1),ce()},oe=()=>r.jsxs("form",{onSubmit:O,className:qe.form,children:[r.jsx("h3",{children:f?"Edit Persona":"Create Persona"}),r.jsxs("div",{className:qe.typeToggle,"data-testid":"persona-type-toggle",children:[r.jsxs("label",{children:[r.jsx("input",{type:"radio",name:"personaType",value:"agent",checked:U==="agent",onChange:()=>ne("agent")}),"Agent"]}),r.jsxs("label",{children:[r.jsx("input",{type:"radio",name:"personaType",value:"script",checked:U==="script",onChange:()=>ne("script")}),"Script"]})]}),r.jsxs("label",{children:["Name",r.jsx("input",{type:"text",value:x,onChange:Y=>S(Y.target.value),placeholder:U==="script"?"e.g. Nightly Report":"e.g. Frontend Engineer",required:!0})]}),r.jsxs("label",{children:["Description",r.jsx("input",{type:"text",value:T,onChange:Y=>j(Y.target.value),placeholder:"Brief description..."})]}),r.jsxs("label",{children:["Runtime",r.jsx("select",{value:A,onChange:Y=>E(Y.target.value),"data-testid":"persona-runtime-select",children:U==="script"?r.jsx("option",{value:"genaiscript",children:"genaiscript"}):r.jsxs(r.Fragment,{children:[r.jsx("option",{value:"claude-code",children:"claude-code"}),r.jsx("option",{value:"codex",children:"codex"}),r.jsx("option",{value:"copilot",children:"copilot"}),r.jsx("option",{value:"goose",children:"goose"}),r.jsx("option",{value:"stub",children:"stub"}),r.jsx("option",{value:"claude-code-acp",children:"claude-code-acp (experimental)"}),r.jsx("option",{value:"codex-acp",children:"codex-acp (experimental)"}),r.jsx("option",{value:"copilot-acp",children:"copilot-acp (experimental)"})]})})]}),U==="agent"&&r.jsxs(r.Fragment,{children:[r.jsxs("label",{children:["Model",r.jsx("input",{type:"text",value:R,onChange:Y=>w(Y.target.value),placeholder:"e.g. sonnet"})]}),r.jsxs("label",{children:["Max Turns",r.jsx("input",{type:"number",value:H,onChange:Y=>I(parseInt(Y.target.value,10)||0),min:0})]}),r.jsxs("label",{children:["System Prompt",r.jsx("textarea",{value:N,onChange:Y=>C(Y.target.value),placeholder:"You are a senior frontend engineer...",rows:10,required:!0})]})]}),U==="script"&&r.jsxs(r.Fragment,{children:[r.jsxs("label",{children:["Model ",r.jsx("span",{className:qe.optional,children:"(optional)"}),r.jsx("input",{type:"text",value:R,onChange:Y=>w(Y.target.value),placeholder:"e.g. sonnet (leave empty for script-only)"})]}),r.jsxs("label",{children:["System Prompt ",r.jsx("span",{className:qe.optional,children:"(optional)"}),r.jsx("textarea",{value:N,onChange:Y=>C(Y.target.value),placeholder:"Optional context for the script...",rows:4})]}),r.jsxs("label",{children:["Script",r.jsx("textarea",{value:ee,onChange:Y=>ae(Y.target.value),placeholder:`script({ model: "openai:gpt-4o" });
|
|
106
106
|
|
|
107
107
|
const grackle = await host.mcpServer({
|
|
108
108
|
id: "grackle",
|
|
109
109
|
url: env.vars.GRACKLE_MCP_URL,
|
|
110
110
|
});
|
|
111
111
|
|
|
112
|
-
$\`Summarize the current tasks.\`;`,rows:20,className:qe.scriptEditor,required:!0,"data-testid":"persona-script-editor"})]})]}),r.jsxs("div",{className:qe.formActions,children:[r.jsx("button",{type:"submit",className:qe.btnPrimary,children:f?"Save":"Create"}),r.jsx("button",{type:"button",onClick:se,className:qe.btnSecondary,children:"Cancel"})]})]});return r.jsxs("div",{className:qe.container,children:[r.jsxs("div",{className:qe.header,children:[r.jsx("h2",{children:"Personas"}),r.jsx("button",{onClick:re,className:qe.btnPrimary,children:"+ New Persona"})]}),(p||f)&&oe(),n.length===0&&!p?r.jsx("p",{className:qe.empty,children:"No personas yet. Create one to get started."}):r.jsx("div",{className:qe.list,children:n.map(Y=>{const be=a===Y.id,Ne=Y.type==="script";return r.jsxs("div",{className:`${qe.card} ${(f==null?void 0:f.id)===Y.id?qe.active:""}`,"data-testid":`persona-card-${Y.id}`,children:[r.jsxs("div",{className:qe.cardHeader,children:[r.jsxs("span",{className:qe.cardTitle,children:[r.jsx("strong",{children:Y.name}),r.jsx("span",{className:qe.typeBadge,"data-testid":`persona-type-badge-${Y.id}`,children:Ne?"Script":"Agent"}),be&&r.jsx("span",{className:qe.defaultBadge,"data-testid":`persona-default-badge-${Y.id}`,children:"App Default"})]}),r.jsxs("div",{className:qe.cardActions,children:[!be&&r.jsx("button",{onClick:()=>d(Y.id),className:qe.btnSmall,"data-testid":`persona-set-default-${Y.id}`,title:"Set as app default persona",children:"Set Default"}),r.jsx("button",{onClick:()=>K(Y),className:qe.btnSmall,children:"Edit"}),g===Y.id?r.jsxs(r.Fragment,{children:[r.jsx("button",{onClick:()=>P(Y.id),className:qe.btnDanger,children:"Confirm"}),r.jsx("button",{onClick:()=>y(null),className:qe.btnSmall,children:"Cancel"})]}):r.jsx("button",{onClick:()=>y(Y.id),className:qe.btnSmall,children:"Delete"})]})]}),Y.description&&r.jsx("p",{className:qe.description,children:Y.description}),r.jsxs("div",{className:qe.meta,children:[Y.runtime&&r.jsxs("span",{children:["Runtime: ",Y.runtime]}),Y.model&&r.jsxs("span",{children:["Model: ",Y.model]}),Y.maxTurns>0&&r.jsxs("span",{children:["Max turns: ",Y.maxTurns]})]}),Ne?r.jsxs("details",{className:qe.promptDetails,children:[r.jsx("summary",{children:"Script"}),r.jsx("pre",{className:qe.promptText,children:Y.script})]}):r.jsxs("details",{className:qe.promptDetails,children:[r.jsx("summary",{children:"System Prompt"}),r.jsx("pre",{className:qe.promptText,children:Y.systemPrompt})]})]},Y.id)})})]})}function lL(){const{personas:n,createPersona:a,updatePersona:i,deletePersona:l,appDefaultPersonaId:c,setAppDefaultPersonaId:d}=rt();return r.jsx(oL,{personas:n,appDefaultPersonaId:c,onCreatePersona:a,onUpdatePersona:i,onDeletePersona:l,onSetAppDefaultPersonaId:d})}function rL(){const{themeId:n,resolvedThemeId:a,setTheme:i,preferSystem:l,setPreferSystem:c}=sb();return r.jsxs("section",{className:de.section,children:[r.jsx("h3",{className:de.sectionTitle,children:"Appearance"}),r.jsx("p",{className:de.sectionDescription,children:"Choose how Grackle looks across the app."}),r.jsx("div",{className:de.themeOptions,children:dc.filter(d=>!d.hidden).map(d=>{const f=!!(d.variantLightId&&d.variantDarkId),m=f?n===d.id||n===d.variantLightId||n===d.variantDarkId:n===d.id,p=f&&a===d.variantLightId;return r.jsxs("button",{type:"button",className:`${de.themeOption} ${m?de.themeOptionSelected:""}`,"aria-pressed":m,onClick:()=>i(d.id),children:[r.jsxs("span",{className:de.themeOptionHeader,children:[r.jsxs("span",{children:[r.jsx("span",{className:de.themeOptionLabel,children:d.label}),r.jsx("span",{className:de.themeOptionDesc,children:d.description})]}),f&&r.jsxs("span",{className:de.variantToggle,children:[r.jsx("span",{role:"button",tabIndex:0,className:`${de.variantButton} ${m&&p?de.variantActive:""}`,onClick:v=>{v.stopPropagation(),c(!1),i(d.variantLightId)},onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),v.stopPropagation(),c(!1),i(d.variantLightId))},"aria-label":"Light variant","aria-pressed":m&&p,children:"☼"}),r.jsx("span",{role:"button",tabIndex:0,className:`${de.variantButton} ${m&&!p?de.variantActive:""}`,onClick:v=>{v.stopPropagation(),c(!1),i(d.variantDarkId)},onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),v.stopPropagation(),c(!1),i(d.variantDarkId))},"aria-label":"Dark variant","aria-pressed":m&&!p,children:"☾"})]})]}),d.swatches&&r.jsx("span",{className:de.themeSwatches,children:d.swatches.map((v,g)=>r.jsx("span",{className:de.themeSwatch,style:{background:v}},g))})]},d.id)})}),r.jsxs("label",{className:de.systemToggle,children:[r.jsx("input",{type:"checkbox",checked:l,onChange:d=>c(d.target.checked)}),r.jsx("span",{children:"Match system light/dark preference"})]}),r.jsx("p",{className:de.systemToggleHint,children:"Automatically switches between light and dark variants when available."}),r.jsxs("p",{className:de.themeActive,children:["Active theme: ",r.jsx("strong",{children:a})]})]})}function cL(){return r.jsx(rL,{})}function uL({connected:n,environments:a,sessions:i}){const l=a.filter(f=>f.status==="connected").length,c=a.length,d=i.filter(f=>["running","idle"].includes(f.status)).length;return r.jsxs("section",{className:de.section,"data-testid":"about-panel",children:[r.jsx("h3",{className:de.sectionTitle,children:"About"}),r.jsx("p",{className:de.sectionDescription,children:"Connection status and application information."}),r.jsxs("div",{className:de.aboutGrid,children:[r.jsxs("div",{className:de.aboutItem,children:[r.jsx("span",{className:de.aboutLabel,children:"Connection"}),r.jsxs("span",{className:de.aboutValue,children:[r.jsx("span",{className:`${de.aboutDot} ${n?de.aboutDotConnected:de.aboutDotDisconnected}`}),n?"Connected":"Disconnected"]})]}),r.jsxs("div",{className:de.aboutItem,children:[r.jsx("span",{className:de.aboutLabel,children:"Environments"}),r.jsxs("span",{className:de.aboutValue,children:[l,"/",c," connected"]})]}),r.jsxs("div",{className:de.aboutItem,children:[r.jsx("span",{className:de.aboutLabel,children:"Active Sessions"}),r.jsx("span",{className:de.aboutValue,children:d})]}),r.jsxs("div",{className:de.aboutItem,children:[r.jsx("span",{className:de.aboutLabel,children:"Version"}),r.jsx("span",{className:de.aboutValue,children:"0.75.2"})]})]})]})}function dL(){const{connected:n,environments:a,sessions:i}=rt();return r.jsx(uL,{connected:n,environments:a,sessions:i})}const fL="_wizard_1260s_1",hL="_container_1260s_10",mL="_stepContent_1260s_19",pL="_logoArea_1260s_28",vL="_logoImage_1260s_32",gL="_heading_1260s_41",yL="_tagline_1260s_49",bL="_subtitle_1260s_56",xL="_featureList_1260s_64",_L="_runtimeGrid_1260s_89",SL="_runtimeCard_1260s_101",TL="_runtimeName_1260s_133",kL="_runtimeDescription_1260s_139",CL="_buttonRow_1260s_144",jL="_primaryButton_1260s_151",NL="_ghostButton_1260s_185",wL="_dots_1260s_213",EL="_dot_1260s_213",nt={wizard:fL,container:hL,stepContent:mL,logoArea:pL,logoImage:vL,heading:gL,tagline:yL,subtitle:bL,featureList:xL,runtimeGrid:_L,runtimeCard:SL,runtimeName:TL,runtimeDescription:kL,buttonRow:CL,primaryButton:jL,ghostButton:NL,dots:wL,dot:EL};function AL({onNext:n}){return r.jsxs("div",{className:nt.stepContent,"data-testid":"setup-welcome",children:[r.jsx("div",{className:nt.logoArea,children:r.jsx("img",{src:"/grackle-logo.png",alt:"Grackle",className:nt.logoImage})}),r.jsx("h1",{className:nt.heading,children:"Welcome to Grackle"}),r.jsx("p",{className:nt.tagline,children:"Multi-agent orchestration for software teams"}),r.jsx("button",{type:"button",className:nt.primaryButton,onClick:n,"data-testid":"setup-get-started",children:"Get Started"})]})}function DL({onNext:n,onBack:a}){return r.jsxs("div",{className:nt.stepContent,"data-testid":"setup-about",children:[r.jsx("h2",{className:nt.heading,children:"What is Grackle?"}),r.jsxs("ul",{className:nt.featureList,children:[r.jsx("li",{children:"Run Claude, Copilot, and Codex agents side by side"}),r.jsx("li",{children:"Provision and control dev environments — SSH, Codespaces, or local"}),r.jsx("li",{children:"Organize work into workspaces with agent-executable tasks"}),r.jsx("li",{children:"Customize agent behavior with personas, tools, and MCP servers"}),r.jsx("li",{children:"Live-stream agent sessions with full terminal replay"})]}),r.jsxs("div",{className:nt.buttonRow,children:[r.jsx("button",{type:"button",className:nt.ghostButton,onClick:a,children:"Back"}),r.jsx("button",{type:"button",className:nt.primaryButton,onClick:n,"data-testid":"setup-about-next",children:"Next"})]})]})}const RL=[{id:"claude-code",name:"Claude Code",description:"Anthropic's agentic coding tool"},{id:"copilot",name:"Copilot Coding Agent",description:"GitHub's AI pair programmer"},{id:"codex",name:"Codex CLI",description:"OpenAI's coding agent"},{id:"goose",name:"Goose",description:"Block's open-source AI coding agent"}];function ML({currentRuntime:n,onFinish:a,onBack:i,finishDisabled:l}){const[c,d]=b.useState(n||"claude-code");return b.useEffect(()=>{n&&d(n)},[n]),r.jsxs("div",{className:nt.stepContent,"data-testid":"setup-runtime",children:[r.jsx("h2",{className:nt.heading,children:"Choose Your Runtime"}),r.jsx("p",{className:nt.subtitle,children:"Select the primary agent runtime for your workspace. You can change this later."}),r.jsx("div",{className:nt.runtimeGrid,children:RL.map(f=>r.jsxs("button",{type:"button",className:nt.runtimeCard,"data-selected":c===f.id,"aria-pressed":c===f.id,"data-testid":`runtime-card-${f.id}`,onClick:()=>d(f.id),children:[r.jsx("span",{className:nt.runtimeName,children:f.name}),r.jsx("span",{className:nt.runtimeDescription,children:f.description})]},f.id))}),r.jsxs("div",{className:nt.buttonRow,children:[r.jsx("button",{type:"button",className:nt.ghostButton,onClick:i,children:"Back"}),r.jsx("button",{type:"button",className:nt.primaryButton,onClick:()=>a(c),disabled:l,"data-testid":"setup-finish",children:"Finish"})]})]})}const OL=3,j0={"claude-code":"sonnet",copilot:"gpt-4o",codex:"o3",goose:""};function BL(){const{personas:n,updatePersona:a,completeOnboarding:i,onboardingCompleted:l}=rt(),c=Rt(),[d,f]=b.useState(0),m=n.find(v=>v.id==="claude-code"),p=b.useCallback(v=>{if(m&&v!==m.runtime){const y=j0[v]??"sonnet";a(m.id,void 0,void 0,void 0,v,y)}const g=n.find(y=>y.id===Eg);if(g&&v!==g.runtime){const y=j0[v]??"sonnet";a(Eg,void 0,void 0,void 0,v,y)}i(),c("/",{replace:!0})},[m,n,a,i,c]);return l===!0?r.jsx(Gn,{to:"/",replace:!0}):r.jsx("div",{className:nt.wizard,"data-testid":"setup-wizard",children:r.jsxs("div",{className:nt.container,children:[r.jsx(Yn,{mode:"wait",children:r.jsxs(Tt.div,{initial:{opacity:0,x:40},animate:{opacity:1,x:0},exit:{opacity:0,x:-40},transition:{duration:.2,ease:"easeInOut"},children:[d===0&&r.jsx(AL,{onNext:()=>f(1)}),d===1&&r.jsx(DL,{onNext:()=>f(2),onBack:()=>f(0)}),d===2&&r.jsx(ML,{currentRuntime:(m==null?void 0:m.runtime)??"claude-code",onFinish:p,onBack:()=>f(1),finishDisabled:!m})]},d)}),r.jsx("div",{className:nt.dots,children:Array.from({length:OL},(v,g)=>r.jsx("span",{className:nt.dot,"data-active":g===d},g))})]})})}const LL="_root_zndgp_1",IL="_body_zndgp_7",zL="_main_zndgp_19",UL="_sidebarWrapper_zndgp_26",VL="_overlay_zndgp_51",qo={root:LL,body:IL,main:zL,sidebarWrapper:UL,overlay:VL},HL=b.lazy(()=>V1(()=>import("./KnowledgePage-bYZXNgGK.js"),__vite__mapDeps([0,1,2,3,4])).then(n=>({default:n.KnowledgePage}))),GL=typeof window<"u"&&new URLSearchParams(window.location.search).has("mock");function PL(){const{connected:n,environments:a,sessions:i,tasks:l}=rt(),c=wt(),f=lb()!==void 0,[m,p]=b.useState(!1),v=b.useCallback(()=>p(g=>!g),[]);return b.useEffect(()=>{p(!1)},[c.pathname]),b.useEffect(()=>{if(!m)return;const g=y=>{y.key==="Escape"&&p(!1)};return document.addEventListener("keydown",g),()=>{document.removeEventListener("keydown",g)}},[m]),r.jsxs(r.Fragment,{children:[r.jsx(EC,{connected:n,environments:a,sessions:i,onToggleSidebar:f?v:void 0,sidebarOpen:m}),r.jsx(LC,{}),r.jsxs("div",{className:qo.body,children:[f&&r.jsx("div",{className:qo.sidebarWrapper,"data-sidebar-open":m,children:r.jsx($C,{})}),f&&m&&r.jsx("div",{className:qo.overlay,"data-testid":"drawer-overlay",onClick:()=>p(!1)}),r.jsxs("div",{className:qo.main,children:[r.jsx(ws,{}),r.jsx(VA,{sessions:i,tasks:l,environments:a})]})]}),r.jsx(JA,{})]})}function $L(){const{lastSpawnedId:n,environments:a,connected:i,onboardingCompleted:l}=rt(),{showToast:c}=Es();pR(a,c);const d=Rt(),f=wt();return b.useEffect(()=>{n&&!f.pathname.includes("/tasks/")&&d(F0(n),{replace:!0})},[n,d,f.pathname]),i&&l===!1?r.jsx(Gn,{to:"/setup",replace:!0}):r.jsx(IC,{children:r.jsx("div",{className:qo.root,children:r.jsx(PL,{})})})}function of(){const{workspaceId:n}=Qa(),{workspaces:a}=rt(),i=wt(),l=a.find(p=>p.id===n);if(!(l!=null&&l.environmentId))return a.length===0?void 0:r.jsx(Gn,{to:"/environments",replace:!0});const c=encodeURIComponent(n),d=`/workspaces/${c}`,f=i.pathname.startsWith(d)?i.pathname.slice(d.length):"",m=`/environments/${encodeURIComponent(l.environmentId)}/workspaces/${c}${f}${i.search}${i.hash}`;return r.jsx(Gn,{to:m,replace:!0})}function qL(){return r.jsxs(qT,{children:[r.jsx(ke,{path:"setup",element:r.jsx(BL,{})}),r.jsxs(ke,{element:r.jsx($L,{}),children:[r.jsx(ke,{index:!0,element:r.jsx(G3,{})}),r.jsx(ke,{path:"chat",element:r.jsx(g6,{})}),r.jsx(ke,{path:"sessions/new",element:r.jsx(C6,{})}),r.jsx(ke,{path:"sessions/:sessionId",element:r.jsx(w6,{})}),r.jsx(ke,{element:r.jsx(RA,{}),children:r.jsx(ke,{path:"knowledge",element:r.jsx(b.Suspense,{fallback:r.jsx(Yx,{}),children:r.jsx(HL,{})})})}),r.jsxs(ke,{element:r.jsx(EA,{}),children:[r.jsx(ke,{path:"tasks",element:r.jsx(V3,{})}),r.jsx(ke,{path:"tasks/new",element:r.jsx(S0,{})}),r.jsx(ke,{path:"tasks/:taskId",element:r.jsx(_i,{})}),r.jsx(ke,{path:"tasks/:taskId/stream",element:r.jsx(_i,{})}),r.jsx(ke,{path:"tasks/:taskId/findings",element:r.jsx(_i,{})}),r.jsx(ke,{path:"tasks/:taskId/edit",element:r.jsx(T0,{})})]}),r.jsxs(ke,{element:r.jsx(AA,{}),children:[r.jsx(ke,{path:"workspaces",element:r.jsx(Gn,{to:"/environments",replace:!0})}),r.jsx(ke,{path:"workspaces/new",element:r.jsx(EB,{})}),r.jsx(ke,{path:"workspaces/:workspaceId",element:r.jsx(of,{})}),r.jsx(ke,{path:"workspaces/:workspaceId/tasks/:taskId",element:r.jsx(of,{})}),r.jsx(ke,{path:"workspaces/:workspaceId/tasks/:taskId/*",element:r.jsx(of,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId",element:r.jsx(KO,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/new",element:r.jsx(S0,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId",element:r.jsx(_i,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/stream",element:r.jsx(_i,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/findings",element:r.jsx(_i,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/edit",element:r.jsx(T0,{})}),r.jsxs(ke,{path:"environments",element:r.jsx(g4,{}),children:[r.jsx(ke,{index:!0,element:r.jsx(H3,{})}),r.jsx(ke,{path:"new",element:r.jsx(f4,{})}),r.jsx(ke,{path:":environmentId",element:r.jsx(q4,{})}),r.jsx(ke,{path:":environmentId/edit",element:r.jsx(h4,{})})]})]}),r.jsx(ke,{element:r.jsx(DA,{}),children:r.jsxs(ke,{path:"settings",element:r.jsx(F4,{}),children:[r.jsx(ke,{index:!0,element:r.jsx(Gn,{to:"credentials",replace:!0})}),r.jsx(ke,{path:"environments",element:r.jsx(Gn,{to:"/environments",replace:!0})}),r.jsx(ke,{path:"credentials",element:r.jsx(B5,{})}),r.jsx(ke,{path:"tokens",element:r.jsx(Gn,{to:"../credentials",replace:!0})}),r.jsx(ke,{path:"personas",element:r.jsx(lL,{})}),r.jsx(ke,{path:"appearance",element:r.jsx(cL,{})}),r.jsx(ke,{path:"about",element:r.jsx(dL,{})})]})}),r.jsx(ke,{path:"*",element:r.jsx(Gn,{to:"/",replace:!0})})]})]})}const YL=1e4;function KL(){const{onboardingCompleted:n}=rt(),[a,i]=b.useState(!1);b.useEffect(()=>{if(n!==void 0)return;const c=setTimeout(()=>i(!0),YL);return()=>clearTimeout(c)},[n]);const l=n===void 0&&!a;return r.jsx(Yn,{mode:"wait",children:l?r.jsx(Tt.div,{initial:{opacity:1},exit:{opacity:0},transition:{duration:.25},children:r.jsx(Yx,{})},"splash"):r.jsx(Tt.div,{initial:{opacity:0},animate:{opacity:1},transition:{duration:.25},style:{minHeight:"100vh"},children:r.jsx(vk,{children:r.jsx(qL,{})})},"app")})}function FL(){const n=GL?hC:sC;return r.jsx(bC,{children:r.jsx(pC,{children:r.jsx(n,{children:r.jsx(KL,{})})})})}I1.createRoot(document.getElementById("root")).render(r.jsx(b.StrictMode,{children:r.jsx(FL,{})}));export{Ds as B,Q0 as K,rt as a,F0 as s,ya as t,Rt as u};
|
|
112
|
+
$\`Summarize the current tasks.\`;`,rows:20,className:qe.scriptEditor,required:!0,"data-testid":"persona-script-editor"})]})]}),r.jsxs("div",{className:qe.formActions,children:[r.jsx("button",{type:"submit",className:qe.btnPrimary,children:f?"Save":"Create"}),r.jsx("button",{type:"button",onClick:se,className:qe.btnSecondary,children:"Cancel"})]})]});return r.jsxs("div",{className:qe.container,children:[r.jsxs("div",{className:qe.header,children:[r.jsx("h2",{children:"Personas"}),r.jsx("button",{onClick:re,className:qe.btnPrimary,children:"+ New Persona"})]}),(p||f)&&oe(),n.length===0&&!p?r.jsx("p",{className:qe.empty,children:"No personas yet. Create one to get started."}):r.jsx("div",{className:qe.list,children:n.map(Y=>{const be=a===Y.id,Ne=Y.type==="script";return r.jsxs("div",{className:`${qe.card} ${(f==null?void 0:f.id)===Y.id?qe.active:""}`,"data-testid":`persona-card-${Y.id}`,children:[r.jsxs("div",{className:qe.cardHeader,children:[r.jsxs("span",{className:qe.cardTitle,children:[r.jsx("strong",{children:Y.name}),r.jsx("span",{className:qe.typeBadge,"data-testid":`persona-type-badge-${Y.id}`,children:Ne?"Script":"Agent"}),be&&r.jsx("span",{className:qe.defaultBadge,"data-testid":`persona-default-badge-${Y.id}`,children:"App Default"})]}),r.jsxs("div",{className:qe.cardActions,children:[!be&&r.jsx("button",{onClick:()=>d(Y.id),className:qe.btnSmall,"data-testid":`persona-set-default-${Y.id}`,title:"Set as app default persona",children:"Set Default"}),r.jsx("button",{onClick:()=>K(Y),className:qe.btnSmall,children:"Edit"}),g===Y.id?r.jsxs(r.Fragment,{children:[r.jsx("button",{onClick:()=>P(Y.id),className:qe.btnDanger,children:"Confirm"}),r.jsx("button",{onClick:()=>y(null),className:qe.btnSmall,children:"Cancel"})]}):r.jsx("button",{onClick:()=>y(Y.id),className:qe.btnSmall,children:"Delete"})]})]}),Y.description&&r.jsx("p",{className:qe.description,children:Y.description}),r.jsxs("div",{className:qe.meta,children:[Y.runtime&&r.jsxs("span",{children:["Runtime: ",Y.runtime]}),Y.model&&r.jsxs("span",{children:["Model: ",Y.model]}),Y.maxTurns>0&&r.jsxs("span",{children:["Max turns: ",Y.maxTurns]})]}),Ne?r.jsxs("details",{className:qe.promptDetails,children:[r.jsx("summary",{children:"Script"}),r.jsx("pre",{className:qe.promptText,children:Y.script})]}):r.jsxs("details",{className:qe.promptDetails,children:[r.jsx("summary",{children:"System Prompt"}),r.jsx("pre",{className:qe.promptText,children:Y.systemPrompt})]})]},Y.id)})})]})}function lL(){const{personas:n,createPersona:a,updatePersona:i,deletePersona:l,appDefaultPersonaId:c,setAppDefaultPersonaId:d}=rt();return r.jsx(oL,{personas:n,appDefaultPersonaId:c,onCreatePersona:a,onUpdatePersona:i,onDeletePersona:l,onSetAppDefaultPersonaId:d})}function rL(){const{themeId:n,resolvedThemeId:a,setTheme:i,preferSystem:l,setPreferSystem:c}=sb();return r.jsxs("section",{className:de.section,children:[r.jsx("h3",{className:de.sectionTitle,children:"Appearance"}),r.jsx("p",{className:de.sectionDescription,children:"Choose how Grackle looks across the app."}),r.jsx("div",{className:de.themeOptions,children:dc.filter(d=>!d.hidden).map(d=>{const f=!!(d.variantLightId&&d.variantDarkId),m=f?n===d.id||n===d.variantLightId||n===d.variantDarkId:n===d.id,p=f&&a===d.variantLightId;return r.jsxs("button",{type:"button",className:`${de.themeOption} ${m?de.themeOptionSelected:""}`,"aria-pressed":m,onClick:()=>i(d.id),children:[r.jsxs("span",{className:de.themeOptionHeader,children:[r.jsxs("span",{children:[r.jsx("span",{className:de.themeOptionLabel,children:d.label}),r.jsx("span",{className:de.themeOptionDesc,children:d.description})]}),f&&r.jsxs("span",{className:de.variantToggle,children:[r.jsx("span",{role:"button",tabIndex:0,className:`${de.variantButton} ${m&&p?de.variantActive:""}`,onClick:v=>{v.stopPropagation(),c(!1),i(d.variantLightId)},onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),v.stopPropagation(),c(!1),i(d.variantLightId))},"aria-label":"Light variant","aria-pressed":m&&p,children:"☼"}),r.jsx("span",{role:"button",tabIndex:0,className:`${de.variantButton} ${m&&!p?de.variantActive:""}`,onClick:v=>{v.stopPropagation(),c(!1),i(d.variantDarkId)},onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),v.stopPropagation(),c(!1),i(d.variantDarkId))},"aria-label":"Dark variant","aria-pressed":m&&!p,children:"☾"})]})]}),d.swatches&&r.jsx("span",{className:de.themeSwatches,children:d.swatches.map((v,g)=>r.jsx("span",{className:de.themeSwatch,style:{background:v}},g))})]},d.id)})}),r.jsxs("label",{className:de.systemToggle,children:[r.jsx("input",{type:"checkbox",checked:l,onChange:d=>c(d.target.checked)}),r.jsx("span",{children:"Match system light/dark preference"})]}),r.jsx("p",{className:de.systemToggleHint,children:"Automatically switches between light and dark variants when available."}),r.jsxs("p",{className:de.themeActive,children:["Active theme: ",r.jsx("strong",{children:a})]})]})}function cL(){return r.jsx(rL,{})}function uL({connected:n,environments:a,sessions:i}){const l=a.filter(f=>f.status==="connected").length,c=a.length,d=i.filter(f=>["running","idle"].includes(f.status)).length;return r.jsxs("section",{className:de.section,"data-testid":"about-panel",children:[r.jsx("h3",{className:de.sectionTitle,children:"About"}),r.jsx("p",{className:de.sectionDescription,children:"Connection status and application information."}),r.jsxs("div",{className:de.aboutGrid,children:[r.jsxs("div",{className:de.aboutItem,children:[r.jsx("span",{className:de.aboutLabel,children:"Connection"}),r.jsxs("span",{className:de.aboutValue,children:[r.jsx("span",{className:`${de.aboutDot} ${n?de.aboutDotConnected:de.aboutDotDisconnected}`}),n?"Connected":"Disconnected"]})]}),r.jsxs("div",{className:de.aboutItem,children:[r.jsx("span",{className:de.aboutLabel,children:"Environments"}),r.jsxs("span",{className:de.aboutValue,children:[l,"/",c," connected"]})]}),r.jsxs("div",{className:de.aboutItem,children:[r.jsx("span",{className:de.aboutLabel,children:"Active Sessions"}),r.jsx("span",{className:de.aboutValue,children:d})]}),r.jsxs("div",{className:de.aboutItem,children:[r.jsx("span",{className:de.aboutLabel,children:"Version"}),r.jsx("span",{className:de.aboutValue,children:"0.75.4"})]})]})]})}function dL(){const{connected:n,environments:a,sessions:i}=rt();return r.jsx(uL,{connected:n,environments:a,sessions:i})}const fL="_wizard_1260s_1",hL="_container_1260s_10",mL="_stepContent_1260s_19",pL="_logoArea_1260s_28",vL="_logoImage_1260s_32",gL="_heading_1260s_41",yL="_tagline_1260s_49",bL="_subtitle_1260s_56",xL="_featureList_1260s_64",_L="_runtimeGrid_1260s_89",SL="_runtimeCard_1260s_101",TL="_runtimeName_1260s_133",kL="_runtimeDescription_1260s_139",CL="_buttonRow_1260s_144",jL="_primaryButton_1260s_151",NL="_ghostButton_1260s_185",wL="_dots_1260s_213",EL="_dot_1260s_213",nt={wizard:fL,container:hL,stepContent:mL,logoArea:pL,logoImage:vL,heading:gL,tagline:yL,subtitle:bL,featureList:xL,runtimeGrid:_L,runtimeCard:SL,runtimeName:TL,runtimeDescription:kL,buttonRow:CL,primaryButton:jL,ghostButton:NL,dots:wL,dot:EL};function AL({onNext:n}){return r.jsxs("div",{className:nt.stepContent,"data-testid":"setup-welcome",children:[r.jsx("div",{className:nt.logoArea,children:r.jsx("img",{src:"/grackle-logo.png",alt:"Grackle",className:nt.logoImage})}),r.jsx("h1",{className:nt.heading,children:"Welcome to Grackle"}),r.jsx("p",{className:nt.tagline,children:"Multi-agent orchestration for software teams"}),r.jsx("button",{type:"button",className:nt.primaryButton,onClick:n,"data-testid":"setup-get-started",children:"Get Started"})]})}function DL({onNext:n,onBack:a}){return r.jsxs("div",{className:nt.stepContent,"data-testid":"setup-about",children:[r.jsx("h2",{className:nt.heading,children:"What is Grackle?"}),r.jsxs("ul",{className:nt.featureList,children:[r.jsx("li",{children:"Run Claude, Copilot, and Codex agents side by side"}),r.jsx("li",{children:"Provision and control dev environments — SSH, Codespaces, or local"}),r.jsx("li",{children:"Organize work into workspaces with agent-executable tasks"}),r.jsx("li",{children:"Customize agent behavior with personas, tools, and MCP servers"}),r.jsx("li",{children:"Live-stream agent sessions with full terminal replay"})]}),r.jsxs("div",{className:nt.buttonRow,children:[r.jsx("button",{type:"button",className:nt.ghostButton,onClick:a,children:"Back"}),r.jsx("button",{type:"button",className:nt.primaryButton,onClick:n,"data-testid":"setup-about-next",children:"Next"})]})]})}const RL=[{id:"claude-code",name:"Claude Code",description:"Anthropic's agentic coding tool"},{id:"copilot",name:"Copilot Coding Agent",description:"GitHub's AI pair programmer"},{id:"codex",name:"Codex CLI",description:"OpenAI's coding agent"},{id:"goose",name:"Goose",description:"Block's open-source AI coding agent"}];function ML({currentRuntime:n,onFinish:a,onBack:i,finishDisabled:l}){const[c,d]=b.useState(n||"claude-code");return b.useEffect(()=>{n&&d(n)},[n]),r.jsxs("div",{className:nt.stepContent,"data-testid":"setup-runtime",children:[r.jsx("h2",{className:nt.heading,children:"Choose Your Runtime"}),r.jsx("p",{className:nt.subtitle,children:"Select the primary agent runtime for your workspace. You can change this later."}),r.jsx("div",{className:nt.runtimeGrid,children:RL.map(f=>r.jsxs("button",{type:"button",className:nt.runtimeCard,"data-selected":c===f.id,"aria-pressed":c===f.id,"data-testid":`runtime-card-${f.id}`,onClick:()=>d(f.id),children:[r.jsx("span",{className:nt.runtimeName,children:f.name}),r.jsx("span",{className:nt.runtimeDescription,children:f.description})]},f.id))}),r.jsxs("div",{className:nt.buttonRow,children:[r.jsx("button",{type:"button",className:nt.ghostButton,onClick:i,children:"Back"}),r.jsx("button",{type:"button",className:nt.primaryButton,onClick:()=>a(c),disabled:l,"data-testid":"setup-finish",children:"Finish"})]})]})}const OL=3,j0={"claude-code":"sonnet",copilot:"gpt-4o",codex:"o3",goose:""};function BL(){const{personas:n,updatePersona:a,completeOnboarding:i,onboardingCompleted:l}=rt(),c=Rt(),[d,f]=b.useState(0),m=n.find(v=>v.id==="claude-code"),p=b.useCallback(v=>{if(m&&v!==m.runtime){const y=j0[v]??"sonnet";a(m.id,void 0,void 0,void 0,v,y)}const g=n.find(y=>y.id===Eg);if(g&&v!==g.runtime){const y=j0[v]??"sonnet";a(Eg,void 0,void 0,void 0,v,y)}i(),c("/",{replace:!0})},[m,n,a,i,c]);return l===!0?r.jsx(Gn,{to:"/",replace:!0}):r.jsx("div",{className:nt.wizard,"data-testid":"setup-wizard",children:r.jsxs("div",{className:nt.container,children:[r.jsx(Yn,{mode:"wait",children:r.jsxs(Tt.div,{initial:{opacity:0,x:40},animate:{opacity:1,x:0},exit:{opacity:0,x:-40},transition:{duration:.2,ease:"easeInOut"},children:[d===0&&r.jsx(AL,{onNext:()=>f(1)}),d===1&&r.jsx(DL,{onNext:()=>f(2),onBack:()=>f(0)}),d===2&&r.jsx(ML,{currentRuntime:(m==null?void 0:m.runtime)??"claude-code",onFinish:p,onBack:()=>f(1),finishDisabled:!m})]},d)}),r.jsx("div",{className:nt.dots,children:Array.from({length:OL},(v,g)=>r.jsx("span",{className:nt.dot,"data-active":g===d},g))})]})})}const LL="_root_zndgp_1",IL="_body_zndgp_7",zL="_main_zndgp_19",UL="_sidebarWrapper_zndgp_26",VL="_overlay_zndgp_51",qo={root:LL,body:IL,main:zL,sidebarWrapper:UL,overlay:VL},HL=b.lazy(()=>V1(()=>import("./KnowledgePage-CjoZR4_t.js"),__vite__mapDeps([0,1,2,3,4])).then(n=>({default:n.KnowledgePage}))),GL=typeof window<"u"&&new URLSearchParams(window.location.search).has("mock");function PL(){const{connected:n,environments:a,sessions:i,tasks:l}=rt(),c=wt(),f=lb()!==void 0,[m,p]=b.useState(!1),v=b.useCallback(()=>p(g=>!g),[]);return b.useEffect(()=>{p(!1)},[c.pathname]),b.useEffect(()=>{if(!m)return;const g=y=>{y.key==="Escape"&&p(!1)};return document.addEventListener("keydown",g),()=>{document.removeEventListener("keydown",g)}},[m]),r.jsxs(r.Fragment,{children:[r.jsx(EC,{connected:n,environments:a,sessions:i,onToggleSidebar:f?v:void 0,sidebarOpen:m}),r.jsx(LC,{}),r.jsxs("div",{className:qo.body,children:[f&&r.jsx("div",{className:qo.sidebarWrapper,"data-sidebar-open":m,children:r.jsx($C,{})}),f&&m&&r.jsx("div",{className:qo.overlay,"data-testid":"drawer-overlay",onClick:()=>p(!1)}),r.jsxs("div",{className:qo.main,children:[r.jsx(ws,{}),r.jsx(VA,{sessions:i,tasks:l,environments:a})]})]}),r.jsx(JA,{})]})}function $L(){const{lastSpawnedId:n,environments:a,connected:i,onboardingCompleted:l}=rt(),{showToast:c}=Es();pR(a,c);const d=Rt(),f=wt();return b.useEffect(()=>{n&&!f.pathname.includes("/tasks/")&&d(F0(n),{replace:!0})},[n,d,f.pathname]),i&&l===!1?r.jsx(Gn,{to:"/setup",replace:!0}):r.jsx(IC,{children:r.jsx("div",{className:qo.root,children:r.jsx(PL,{})})})}function of(){const{workspaceId:n}=Qa(),{workspaces:a}=rt(),i=wt(),l=a.find(p=>p.id===n);if(!(l!=null&&l.environmentId))return a.length===0?void 0:r.jsx(Gn,{to:"/environments",replace:!0});const c=encodeURIComponent(n),d=`/workspaces/${c}`,f=i.pathname.startsWith(d)?i.pathname.slice(d.length):"",m=`/environments/${encodeURIComponent(l.environmentId)}/workspaces/${c}${f}${i.search}${i.hash}`;return r.jsx(Gn,{to:m,replace:!0})}function qL(){return r.jsxs(qT,{children:[r.jsx(ke,{path:"setup",element:r.jsx(BL,{})}),r.jsxs(ke,{element:r.jsx($L,{}),children:[r.jsx(ke,{index:!0,element:r.jsx(G3,{})}),r.jsx(ke,{path:"chat",element:r.jsx(g6,{})}),r.jsx(ke,{path:"sessions/new",element:r.jsx(C6,{})}),r.jsx(ke,{path:"sessions/:sessionId",element:r.jsx(w6,{})}),r.jsx(ke,{element:r.jsx(RA,{}),children:r.jsx(ke,{path:"knowledge",element:r.jsx(b.Suspense,{fallback:r.jsx(Yx,{}),children:r.jsx(HL,{})})})}),r.jsxs(ke,{element:r.jsx(EA,{}),children:[r.jsx(ke,{path:"tasks",element:r.jsx(V3,{})}),r.jsx(ke,{path:"tasks/new",element:r.jsx(S0,{})}),r.jsx(ke,{path:"tasks/:taskId",element:r.jsx(_i,{})}),r.jsx(ke,{path:"tasks/:taskId/stream",element:r.jsx(_i,{})}),r.jsx(ke,{path:"tasks/:taskId/findings",element:r.jsx(_i,{})}),r.jsx(ke,{path:"tasks/:taskId/edit",element:r.jsx(T0,{})})]}),r.jsxs(ke,{element:r.jsx(AA,{}),children:[r.jsx(ke,{path:"workspaces",element:r.jsx(Gn,{to:"/environments",replace:!0})}),r.jsx(ke,{path:"workspaces/new",element:r.jsx(E4,{})}),r.jsx(ke,{path:"workspaces/:workspaceId",element:r.jsx(of,{})}),r.jsx(ke,{path:"workspaces/:workspaceId/tasks/:taskId",element:r.jsx(of,{})}),r.jsx(ke,{path:"workspaces/:workspaceId/tasks/:taskId/*",element:r.jsx(of,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId",element:r.jsx(KO,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/new",element:r.jsx(S0,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId",element:r.jsx(_i,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/stream",element:r.jsx(_i,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/findings",element:r.jsx(_i,{})}),r.jsx(ke,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/edit",element:r.jsx(T0,{})}),r.jsxs(ke,{path:"environments",element:r.jsx(gB,{}),children:[r.jsx(ke,{index:!0,element:r.jsx(H3,{})}),r.jsx(ke,{path:"new",element:r.jsx(fB,{})}),r.jsx(ke,{path:":environmentId",element:r.jsx(qB,{})}),r.jsx(ke,{path:":environmentId/edit",element:r.jsx(hB,{})})]})]}),r.jsx(ke,{element:r.jsx(DA,{}),children:r.jsxs(ke,{path:"settings",element:r.jsx(FB,{}),children:[r.jsx(ke,{index:!0,element:r.jsx(Gn,{to:"credentials",replace:!0})}),r.jsx(ke,{path:"environments",element:r.jsx(Gn,{to:"/environments",replace:!0})}),r.jsx(ke,{path:"credentials",element:r.jsx(B5,{})}),r.jsx(ke,{path:"tokens",element:r.jsx(Gn,{to:"../credentials",replace:!0})}),r.jsx(ke,{path:"personas",element:r.jsx(lL,{})}),r.jsx(ke,{path:"appearance",element:r.jsx(cL,{})}),r.jsx(ke,{path:"about",element:r.jsx(dL,{})})]})}),r.jsx(ke,{path:"*",element:r.jsx(Gn,{to:"/",replace:!0})})]})]})}const YL=1e4;function KL(){const{onboardingCompleted:n}=rt(),[a,i]=b.useState(!1);b.useEffect(()=>{if(n!==void 0)return;const c=setTimeout(()=>i(!0),YL);return()=>clearTimeout(c)},[n]);const l=n===void 0&&!a;return r.jsx(Yn,{mode:"wait",children:l?r.jsx(Tt.div,{initial:{opacity:1},exit:{opacity:0},transition:{duration:.25},children:r.jsx(Yx,{})},"splash"):r.jsx(Tt.div,{initial:{opacity:0},animate:{opacity:1},transition:{duration:.25},style:{minHeight:"100vh"},children:r.jsx(vk,{children:r.jsx(qL,{})})},"app")})}function FL(){const n=GL?hC:sC;return r.jsx(bC,{children:r.jsx(pC,{children:r.jsx(n,{children:r.jsx(KL,{})})})})}I1.createRoot(document.getElementById("root")).render(r.jsx(b.StrictMode,{children:r.jsx(FL,{})}));export{Ds as B,Q0 as K,rt as a,F0 as s,ya as t,Rt as u};
|