@grackle-ai/web 0.127.0 → 0.129.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/McpAppWidget-Bltki2U6.js","assets/dagview-B70jDsRo.js","assets/grpc-pBcDZw1z.js","assets/KnowledgePage-C1NEElgV.js","assets/markdown-CPoGw-1N.js","assets/KnowledgePage-BmY14aDt.css"])))=>i.map(i=>d[i]);
2
- import{r as H2,a as P2,b as y,j as a,d as ld,H as Bo,P as Lo,i as M_,B as R_,c as I_,C as O_,M as B_,e as U2,f as Mc,h as V2,k as q2}from"./dagview-B70jDsRo.js";import{c as G2,a as xd,G as F2,b as K2,d as Z2,e as Y2,f as J2,M as W2,D as L_,A as z_,W as X2,O as Q2,g as ej,C as da,h as $_,i as H_,w as tj,t as nj,p as Rc,j as sj,R as Ic,S as py}from"./grpc-pBcDZw1z.js";import{v as aj,r as ij,t as Oc,i as oj,f as rj,M as _m,a as xm}from"./markdown-CPoGw-1N.js";(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))r(c);new MutationObserver(c=>{for(const d of c)if(d.type==="childList")for(const u of d.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&r(u)}).observe(document,{childList:!0,subtree:!0});function o(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 r(c){if(c.ep)return;c.ep=!0;const d=o(c);fetch(c.href,d)}})();var Zf={exports:{}},zr={},Yf={exports:{}},Jf={};/**
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/McpAppWidget-BkeYEdnS.js","assets/dagview-B70jDsRo.js","assets/grpc-CSEitK46.js","assets/KnowledgePage-DHgL33sT.js","assets/markdown-CPoGw-1N.js","assets/KnowledgePage-BmY14aDt.css"])))=>i.map(i=>d[i]);
2
+ import{r as H2,a as P2,b as y,j as a,d as ld,H as Bo,P as Lo,i as M_,B as R_,c as I_,C as O_,M as B_,e as U2,f as Mc,h as V2,k as q2}from"./dagview-B70jDsRo.js";import{c as G2,a as xd,G as F2,b as K2,d as Z2,e as Y2,f as J2,M as W2,D as L_,A as z_,W as X2,O as Q2,g as ej,C as da,h as $_,i as H_,w as tj,t as nj,p as Rc,j as sj,R as Ic,S as py}from"./grpc-CSEitK46.js";import{v as aj,r as ij,t as Oc,i as oj,f as rj,M as _m,a as xm}from"./markdown-CPoGw-1N.js";(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))r(c);new MutationObserver(c=>{for(const d of c)if(d.type==="childList")for(const u of d.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&r(u)}).observe(document,{childList:!0,subtree:!0});function o(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 r(c){if(c.ep)return;c.ep=!0;const d=o(c);fetch(c.href,d)}})();var Zf={exports:{}},zr={},Yf={exports:{}},Jf={};/**
3
3
  * @license React
4
4
  * scheduler.production.js
5
5
  *
@@ -297,7 +297,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
297
297
  `))??[],v=g.length>fp,b=c?o:g.slice(0,fp).join(`
298
298
  `);let _="";if(s!=null)try{_=JSON.stringify(s,null,2)}catch{_=String(s)}return a.jsxs("div",{className:`${L.card} ${r?L.cardRed:L.cardBlue} ${m?L.inProgress:""}`,"data-testid":"tool-card-generic",children:[a.jsxs("div",{className:L.header,children:[a.jsx("span",{className:L.icon,children:a.jsx(Jj,{size:Ht,"aria-hidden":"true"})}),a.jsx("span",{className:L.toolName,style:{color:"var(--accent-blue)"},children:u}),p&&a.jsx("span",{className:L.fileName,children:p})]}),m&&_&&a.jsx("pre",{className:L.pre,"data-testid":"tool-card-args",children:_}),r&&o&&a.jsx("pre",{className:L.pre,"data-testid":"tool-card-error",children:o}),!r&&!m&&o&&a.jsxs(a.Fragment,{children:[a.jsx("pre",{className:L.pre,"data-testid":"tool-card-result",children:b}),v&&a.jsxs("button",{type:"button",className:L.bodyToggle,onClick:()=>{d(k=>!k)},"aria-expanded":c,"data-testid":"tool-card-toggle",children:[a.jsx("span",{className:`${L.chevron} ${c?L.chevronExpanded:""}`,"aria-hidden":"true",children:a.jsx(pa,{size:Ye})}),c?"collapse":`${g.length-fp} more lines`]})]})]})}const AA="_badgePill_o7eqc_1",DA="_modelBadge_o7eqc_14",MA="_backgroundBadge_o7eqc_26",RA="_backgroundDot_o7eqc_36",IA="_backgroundDotPulsing_o7eqc_41",OA="_description_o7eqc_55",BA="_statusLine_o7eqc_62",LA="_statusCompleted_o7eqc_72",zA="_statusRunning_o7eqc_77",$A="_statusError_o7eqc_83",HA="_promptToggle_o7eqc_88",hs={badgePill:AA,modelBadge:DA,backgroundBadge:MA,backgroundDot:RA,backgroundDotPulsing:IA,description:OA,statusLine:BA,statusCompleted:LA,statusRunning:zA,statusError:$A,promptToggle:HA};function PA(t,s){if(s==null||typeof s!="object")return{};const o=s;return t.toLowerCase()==="read_agent"?{agentId:typeof o.agent_id=="string"?o.agent_id:void 0,isPoll:!0}:typeof o.agent_type=="string"||typeof o.name=="string"?{agentType:typeof o.agent_type=="string"?o.agent_type:void 0,description:typeof o.description=="string"?o.description:void 0,prompt:typeof o.prompt=="string"?o.prompt:void 0,isBackground:o.mode==="background",agentName:typeof o.name=="string"?o.name:void 0}:{agentType:typeof o.subagent_type=="string"?o.subagent_type:void 0,description:typeof o.description=="string"?o.description:void 0,prompt:typeof o.prompt=="string"?o.prompt:void 0,isBackground:o.run_in_background===!0,model:typeof o.model=="string"?o.model:void 0,isResume:typeof o.resume=="string"&&o.resume.length>0}}const UA=/^Agent\s+(completed|running|failed|error)\.\s*agent_id:\s*(\S+),?\s*([^\n]*)(?:\n\n([\s\S]*))?$/i;function VA(t){const s=UA.exec(t);if(!s)return;const o=s[4];return{status:s[1].toLowerCase(),agentId:s[2].replace(/,$/,""),metadata:s[3].trim(),content:o?o.trim():void 0}}const pp=5;function qA({tool:t,args:s,result:o,isError:r}){const[c,d]=y.useState(!1),[u,p]=y.useState(!1),m=PA(t,s),g=o===void 0,v=m.isPoll&&o?VA(o):void 0,b=(v==null?void 0:v.content)??o,_=(b==null?void 0:b.split(`
299
299
  `))??[],k=_.length>pp,S=c?b:_.slice(0,pp).join(`
300
- `),j=m.isPoll?"Subagent":"Agent";return a.jsxs("div",{className:`${L.card} ${r?L.cardRed:L.cardTeal} ${g?L.inProgress:""}`,"data-testid":"tool-card-agent",children:[a.jsxs("div",{className:L.header,children:[a.jsx("span",{className:L.icon,style:{color:"var(--accent-teal, #2dd4bf)"},children:"▶"}),a.jsx("span",{className:L.toolName,style:{color:"var(--accent-teal, #2dd4bf)"},children:j}),m.agentType&&a.jsx("span",{className:hs.badgePill,"data-testid":"tool-card-agent-type",children:m.agentType}),m.model&&a.jsx("span",{className:hs.modelBadge,"data-testid":"tool-card-agent-model",children:m.model}),m.isBackground&&a.jsxs("span",{className:hs.backgroundBadge,"data-testid":"tool-card-agent-background",children:[a.jsx("span",{className:g?hs.backgroundDotPulsing:hs.backgroundDot,children:"●"}),"BG"]}),m.agentName&&a.jsx("span",{className:L.fileName,"data-testid":"tool-card-agent-name",children:m.agentName}),m.agentId&&a.jsx("span",{className:L.fileName,"data-testid":"tool-card-agent-id",children:m.agentId}),a.jsx("span",{className:L.spacer}),g&&!m.isBackground&&a.jsx("span",{className:L.exitPending,"data-testid":"tool-card-pending",children:"●"})]}),m.description&&a.jsx("div",{className:hs.description,"data-testid":"tool-card-agent-description",children:m.isResume?`Resuming: ${m.description}`:m.description}),v&&a.jsxs("div",{className:hs.statusLine,"data-testid":"tool-card-agent-status",children:[a.jsx("span",{className:v.status==="completed"?hs.statusCompleted:v.status==="running"?hs.statusRunning:hs.statusError,children:v.status}),v.metadata&&a.jsx("span",{children:v.metadata})]}),m.prompt&&a.jsxs(a.Fragment,{children:[a.jsxs("button",{type:"button",className:hs.promptToggle,onClick:()=>{p(T=>!T)},"aria-expanded":u,"data-testid":"tool-card-prompt-toggle",children:[a.jsx("span",{className:`${L.chevron} ${u?L.chevronExpanded:""}`,children:"▸"}),"prompt"]}),u&&a.jsx("pre",{className:L.pre,"data-testid":"tool-card-prompt",children:m.prompt})]}),r&&o&&a.jsx("pre",{className:L.pre,"data-testid":"tool-card-error",children:o}),!r&&!g&&b&&a.jsxs(a.Fragment,{children:[a.jsx("pre",{className:L.pre,"data-testid":"tool-card-result",children:S}),k&&a.jsxs("button",{type:"button",className:L.bodyToggle,onClick:()=>{d(T=>!T)},"aria-expanded":c,"data-testid":"tool-card-toggle",children:[a.jsx("span",{className:`${L.chevron} ${c?L.chevronExpanded:""}`,children:"▸"}),c?"collapse":`${_.length-pp} more lines`]})]})]})}function mp(t){switch(XC(t.tool)){case"file-read":return a.jsx(Ry,{...t});case"file-edit":return a.jsx(LE,{...t});case"file-write":return a.jsx(Ry,{...t,writeVariant:!0});case"shell":return a.jsx(UE,{...t});case"search":return a.jsx(qE,{...t});case"todo":return a.jsx(cA,{...t});case"metadata":return a.jsx(uA,{...t});case"task":return a.jsx(hA,{...t});case"workpad":return a.jsx(yA,{...t});case"knowledge":return a.jsx(xA,{...t});case"ipc":return a.jsx(jA,{...t});case"tool-search":return a.jsx(NA,{...t});case"agent":return a.jsx(qA,{...t});default:return a.jsx(EA,{...t})}}const GA="_systemContextEvent_1kdcc_1",FA="_systemContextHeader_1kdcc_7",KA="_systemContextBadge_1kdcc_28",ZA="_systemContextToggle_1kdcc_37",YA="_systemContextPre_1kdcc_43",JA="_systemContextEllipsis_1kdcc_54",WA="_systemEvent_1kdcc_58",XA="_systemTimestamp_1kdcc_65",QA="_textEvent_1kdcc_69",eD="_codeBlockWrapper_1kdcc_156",tD="_codeBlockCopyButton_1kdcc_159",nD="_errorEvent_1kdcc_163",sD="_statusEvent_1kdcc_171",aD="_userInputEvent_1kdcc_180",iD="_userInputContent_1kdcc_186",oD="_signalEvent_1kdcc_293",rD="_signalBadge_1kdcc_304",lD="_signalContent_1kdcc_313",cD="_usageEvent_1kdcc_318",dD="_usageBadge_1kdcc_325",uD="_defaultEvent_1kdcc_334",$t={systemContextEvent:GA,systemContextHeader:FA,systemContextBadge:KA,systemContextToggle:ZA,systemContextPre:YA,systemContextEllipsis:JA,systemEvent:WA,systemTimestamp:XA,textEvent:QA,codeBlockWrapper:eD,codeBlockCopyButton:tD,errorEvent:nD,statusEvent:sD,userInputEvent:aD,userInputContent:iD,signalEvent:oD,signalBadge:rD,signalContent:lD,usageEvent:cD,usageBadge:dD,defaultEvent:uD},By=y.lazy(()=>P_(()=>import("./McpAppWidget-Bltki2U6.js"),__vite__mapDeps([0,1,2])).then(t=>({default:t.McpAppWidget}))),Ly=3;function fD({content:t}){const[s,o]=y.useState(!1),r=t.split(`
300
+ `),j=m.isPoll?"Subagent":"Agent";return a.jsxs("div",{className:`${L.card} ${r?L.cardRed:L.cardTeal} ${g?L.inProgress:""}`,"data-testid":"tool-card-agent",children:[a.jsxs("div",{className:L.header,children:[a.jsx("span",{className:L.icon,style:{color:"var(--accent-teal, #2dd4bf)"},children:"▶"}),a.jsx("span",{className:L.toolName,style:{color:"var(--accent-teal, #2dd4bf)"},children:j}),m.agentType&&a.jsx("span",{className:hs.badgePill,"data-testid":"tool-card-agent-type",children:m.agentType}),m.model&&a.jsx("span",{className:hs.modelBadge,"data-testid":"tool-card-agent-model",children:m.model}),m.isBackground&&a.jsxs("span",{className:hs.backgroundBadge,"data-testid":"tool-card-agent-background",children:[a.jsx("span",{className:g?hs.backgroundDotPulsing:hs.backgroundDot,children:"●"}),"BG"]}),m.agentName&&a.jsx("span",{className:L.fileName,"data-testid":"tool-card-agent-name",children:m.agentName}),m.agentId&&a.jsx("span",{className:L.fileName,"data-testid":"tool-card-agent-id",children:m.agentId}),a.jsx("span",{className:L.spacer}),g&&!m.isBackground&&a.jsx("span",{className:L.exitPending,"data-testid":"tool-card-pending",children:"●"})]}),m.description&&a.jsx("div",{className:hs.description,"data-testid":"tool-card-agent-description",children:m.isResume?`Resuming: ${m.description}`:m.description}),v&&a.jsxs("div",{className:hs.statusLine,"data-testid":"tool-card-agent-status",children:[a.jsx("span",{className:v.status==="completed"?hs.statusCompleted:v.status==="running"?hs.statusRunning:hs.statusError,children:v.status}),v.metadata&&a.jsx("span",{children:v.metadata})]}),m.prompt&&a.jsxs(a.Fragment,{children:[a.jsxs("button",{type:"button",className:hs.promptToggle,onClick:()=>{p(T=>!T)},"aria-expanded":u,"data-testid":"tool-card-prompt-toggle",children:[a.jsx("span",{className:`${L.chevron} ${u?L.chevronExpanded:""}`,children:"▸"}),"prompt"]}),u&&a.jsx("pre",{className:L.pre,"data-testid":"tool-card-prompt",children:m.prompt})]}),r&&o&&a.jsx("pre",{className:L.pre,"data-testid":"tool-card-error",children:o}),!r&&!g&&b&&a.jsxs(a.Fragment,{children:[a.jsx("pre",{className:L.pre,"data-testid":"tool-card-result",children:S}),k&&a.jsxs("button",{type:"button",className:L.bodyToggle,onClick:()=>{d(T=>!T)},"aria-expanded":c,"data-testid":"tool-card-toggle",children:[a.jsx("span",{className:`${L.chevron} ${c?L.chevronExpanded:""}`,children:"▸"}),c?"collapse":`${_.length-pp} more lines`]})]})]})}function mp(t){switch(XC(t.tool)){case"file-read":return a.jsx(Ry,{...t});case"file-edit":return a.jsx(LE,{...t});case"file-write":return a.jsx(Ry,{...t,writeVariant:!0});case"shell":return a.jsx(UE,{...t});case"search":return a.jsx(qE,{...t});case"todo":return a.jsx(cA,{...t});case"metadata":return a.jsx(uA,{...t});case"task":return a.jsx(hA,{...t});case"workpad":return a.jsx(yA,{...t});case"knowledge":return a.jsx(xA,{...t});case"ipc":return a.jsx(jA,{...t});case"tool-search":return a.jsx(NA,{...t});case"agent":return a.jsx(qA,{...t});default:return a.jsx(EA,{...t})}}const GA="_systemContextEvent_1kdcc_1",FA="_systemContextHeader_1kdcc_7",KA="_systemContextBadge_1kdcc_28",ZA="_systemContextToggle_1kdcc_37",YA="_systemContextPre_1kdcc_43",JA="_systemContextEllipsis_1kdcc_54",WA="_systemEvent_1kdcc_58",XA="_systemTimestamp_1kdcc_65",QA="_textEvent_1kdcc_69",eD="_codeBlockWrapper_1kdcc_156",tD="_codeBlockCopyButton_1kdcc_159",nD="_errorEvent_1kdcc_163",sD="_statusEvent_1kdcc_171",aD="_userInputEvent_1kdcc_180",iD="_userInputContent_1kdcc_186",oD="_signalEvent_1kdcc_293",rD="_signalBadge_1kdcc_304",lD="_signalContent_1kdcc_313",cD="_usageEvent_1kdcc_318",dD="_usageBadge_1kdcc_325",uD="_defaultEvent_1kdcc_334",$t={systemContextEvent:GA,systemContextHeader:FA,systemContextBadge:KA,systemContextToggle:ZA,systemContextPre:YA,systemContextEllipsis:JA,systemEvent:WA,systemTimestamp:XA,textEvent:QA,codeBlockWrapper:eD,codeBlockCopyButton:tD,errorEvent:nD,statusEvent:sD,userInputEvent:aD,userInputContent:iD,signalEvent:oD,signalBadge:rD,signalContent:lD,usageEvent:cD,usageBadge:dD,defaultEvent:uD},By=y.lazy(()=>P_(()=>import("./McpAppWidget-BkeYEdnS.js"),__vite__mapDeps([0,1,2])).then(t=>({default:t.McpAppWidget}))),Ly=3;function fD({content:t}){const[s,o]=y.useState(!1),r=t.split(`
301
301
  `),c=r.length>Ly,d=s?t:r.slice(0,Ly).join(`
302
302
  `);return a.jsxs("div",{className:$t.systemContextEvent,"data-testid":"system-context-event",children:[a.jsxs("button",{type:"button",className:$t.systemContextHeader,onClick:()=>{o(u=>!u)},"aria-expanded":s,children:[a.jsx("span",{className:$t.systemContextBadge,children:"SYSTEM PROMPT"}),c&&a.jsx("span",{className:$t.systemContextToggle,"aria-hidden":"true",children:s?a.jsx(V_,{size:Ye}):a.jsx(pa,{size:Ye})})]}),a.jsxs("pre",{className:$t.systemContextPre,children:[d,!s&&c&&a.jsx("span",{className:$t.systemContextEllipsis,children:"…"})]})]})}function pD({time:t,content:s}){return a.jsxs("div",{className:$t.systemEvent,children:[a.jsxs("span",{className:$t.systemTimestamp,children:["[",t,"]"]})," ",s]})}function Zp(t){return typeof t=="string"?t:typeof t=="number"?String(t):Array.isArray(t)?t.map(Zp).join(""):t!=null&&typeof t=="object"&&"props"in t?Zp(t.props.children):""}function mD({children:t,node:s,...o}){const r=Zp(t);return a.jsxs("div",{className:$t.codeBlockWrapper,children:[a.jsx("pre",{...o,children:t}),a.jsx(AC,{text:r,"data-testid":"copy-code-block",className:$t.codeBlockCopyButton})]})}const hD={pre:mD};function vx({content:t}){return a.jsx(_m,{remarkPlugins:[xm],rehypePlugins:[JC],components:hD,children:t})}function gD({content:t}){return a.jsx("div",{className:$t.textEvent,children:a.jsx(vx,{content:t})})}function vD({content:t}){return a.jsxs("div",{className:$t.errorEvent,children:["Error: ",t]})}function yD({content:t}){return a.jsxs("div",{className:$t.statusEvent,children:["--- ",t," ---"]})}function bD({content:t}){return a.jsx("div",{className:$t.userInputEvent,children:a.jsx("div",{className:$t.userInputContent,"data-testid":"user-input-content",children:a.jsx(vx,{content:t})})})}function _D({content:t}){return a.jsxs("div",{className:$t.signalEvent,"data-testid":"signal-event",children:[a.jsx("span",{className:$t.signalBadge,children:"SIGNAL"}),a.jsx("span",{className:$t.signalContent,children:t})]})}function xD({content:t}){let s=t;try{const o=JSON.parse(t),r=Number(o.input_tokens)||0,c=Number(o.output_tokens)||0,d=Ho(r+c),u=Rs(Number(o.cost_millicents)||0);s=`${d} tokens · ${u}`}catch{}return a.jsx("div",{className:$t.usageEvent,"data-testid":"usage-event",children:a.jsx("span",{className:$t.usageBadge,children:s})})}function Hr({content:t}){return a.jsx("div",{className:$t.defaultEvent,children:t})}function kD({event:t,toolUseCtx:s,settled:o,sandboxProxyUrl:r}){const c=new Date(t.timestamp).toLocaleTimeString();switch(t.eventType){case"widget":{if(!r)return a.jsx(Hr,{content:t.content});let d={};try{d=JSON.parse(t.content)}catch{}const u=d.rendererKind??"mcp-app-html";if(u==="grackle-react"&&d.html){const m=`<!doctype html><html><head><meta charset="utf-8"></head><body><div id="grackle-root"></div><script type="module" src="${new URL(r,window.location.href).origin}/runtime.js"><\/script></body></html>`;return a.jsx(y.Suspense,{fallback:a.jsx(Hr,{content:"Loading widget..."}),children:a.jsx(By,{widgetHtml:m,sandboxProxyUrl:r,csp:d.csp,toolInput:{source:d.html,props:d.toolInput??{},components:d.components??[]}})})}return u!=="mcp-app-html"||!d.html?a.jsx(Hr,{content:t.content}):a.jsx(y.Suspense,{fallback:a.jsx(Hr,{content:"Loading widget..."}),children:a.jsx(By,{widgetHtml:d.html,sandboxProxyUrl:r,csp:d.csp,toolInput:d.toolInput,toolResult:d.toolResult})})}case"system":{if(t.raw)try{if(JSON.parse(t.raw).systemContext===!0)return a.jsx(fD,{content:t.content})}catch{}return a.jsx(pD,{time:c,content:t.content})}case"text":case"output":return a.jsx(gD,{content:t.content});case"tool_use":{let d="",u={};try{const p=JSON.parse(t.content);d=p.tool||"",u=p.args}catch{}return a.jsx(mp,{tool:d,args:u,result:o?"":void 0})}case"tool_result":{let d=!1;if(t.raw)try{d=JSON.parse(t.raw).is_error===!0}catch{}let u=t.content;if(t.content.trimStart().startsWith("{"))try{const p=JSON.parse(t.content);typeof p.content=="string"&&(u=p.content)}catch{}return s?a.jsx(mp,{tool:s.tool,args:s.args,result:u,isError:d,detailedResult:s.detailedResult}):a.jsx(mp,{tool:"Tool output",args:void 0,result:u,isError:d})}case"error":return a.jsx(vD,{content:t.content});case"status":return a.jsx(yD,{content:t.content});case"user_input":return a.jsx(bD,{content:t.content});case"signal":return a.jsx(_D,{content:t.content});case"usage":return a.jsx(xD,{content:t.content});default:return a.jsx(Hr,{content:t.content})}}const Rm=y.createContext({});function Im(t){const s=y.useRef(null);return s.current===null&&(s.current=t()),s.current}const Cd=y.createContext(null),Om=y.createContext({transformPagePoint:t=>t,isStatic:!1,reducedMotion:"never"});class SD extends y.Component{getSnapshotBeforeUpdate(s){const o=this.props.childRef.current;if(o&&s.isPresent&&!this.props.isPresent){const r=this.props.sizeRef.current;r.height=o.offsetHeight||0,r.width=o.offsetWidth||0,r.top=o.offsetTop,r.left=o.offsetLeft}return null}componentDidUpdate(){}render(){return this.props.children}}function jD({children:t,isPresent:s}){const o=y.useId(),r=y.useRef(null),c=y.useRef({width:0,height:0,top:0,left:0}),{nonce:d}=y.useContext(Om);return y.useInsertionEffect(()=>{const{width:u,height:p,top:m,left:g}=c.current;if(s||!r.current||!u||!p)return;r.current.dataset.motionPopId=o;const v=document.createElement("style");return d&&(v.nonce=d),document.head.appendChild(v),v.sheet&&v.sheet.insertRule(`
303
303
  [data-motion-pop-id="${o}"] {
@@ -322,7 +322,7 @@ ${r.content}`);break}}}return s.join(`
322
322
 
323
323
  ${r}
324
324
 
325
- --- End forwarded ---`}function xI(t){return t.replace(/[\r\n]+/g," ").trim().replace(/---/g,"—")}function kI({events:t,formatForClipboard:s}){const[o,r]=y.useState(!1),[c,d]=y.useState(new Set),u=y.useRef(void 0),p=y.useMemo(()=>c.size,[c]),m=y.useCallback(S=>{r(!0),S!==void 0?(d(new Set([S])),u.current=S):(d(new Set),u.current=void 0)},[]),g=y.useCallback(()=>{r(!1),d(new Set),u.current=void 0},[]),v=y.useCallback((S,j)=>{if(j&&u.current!==void 0){const T=Math.min(u.current,S),N=Math.max(u.current,S);d(C=>{const D=new Set(C);for(let A=T;A<=N;A++)A<t.length&&ul(t[A])&&D.add(A);return D})}else d(T=>{const N=new Set(T);return N.has(S)?N.delete(S):N.add(S),N.size===0?(r(!1),u.current=void 0):u.current=S,N})},[t]),b=y.useCallback(()=>{const S=new Set;for(let j=0;j<t.length;j++)ul(t[j])&&S.add(j);d(S)},[t]),_=y.useCallback(()=>{d(new Set)},[]),k=y.useCallback(async()=>{const j=[...c].sort((N,C)=>N-C).filter(N=>N<t.length).map(N=>t[N]);if(j.length===0)return!1;const T=s(j);try{return await navigator.clipboard.writeText(T),!0}catch{return!1}},[c,t,s]);return{isSelecting:o,selectedIndices:c,selectedCount:p,enterSelectionMode:m,cancelSelection:g,toggleEvent:v,selectAll:b,deselectAll:_,copySelected:k}}const SI="_wrapper_1cdza_1",jI="_scrollContainer_1cdza_9",TI="_selectingPadding_1cdza_16",NI="_toolbar_1cdza_20",wI="_directionToggle_1cdza_27",CI="_scrollToAnchor_1cdza_65",EI="_scrollToAnchorBottom_1cdza_89",AI="_scrollToAnchorTop_1cdza_93",DI="_eventOverflowWarning_1cdza_97",oa={wrapper:SI,scrollContainer:jI,selectingPadding:TI,toolbar:NI,directionToggle:wI,scrollToAnchor:CI,scrollToAnchorBottom:EI,scrollToAnchorTop:AI,eventOverflowWarning:DI},MI=10*1024,RI=new Set(["running","idle"]);function II(t){const s=new Date(t.timestamp).toLocaleTimeString();switch(t.eventType){case"text":case"output":return`Select message from assistant at ${s}`;case"user_input":return`Select message from user at ${s}`;case"tool_result":case"tool_use":return`Select tool event at ${s}`;case"error":return`Select error at ${s}`;default:return`Select event at ${s}`}}const W1="grackle-stream-direction";function OI(){try{return localStorage.getItem(W1)==="reversed"}catch{return!1}}function BI({eventsDropped:t}){return t<=0?a.jsx(a.Fragment,{}):a.jsxs("div",{className:oa.eventOverflowWarning,role:"alert",children:[a.jsx(Sm,{size:Ht,"aria-hidden":"true"})," ",t.toLocaleString()," older event",t===1?"":"s"," were dropped — only the most recent 5,000 are shown. Full history is available in the session log."]})}function mh({events:t,eventsDropped:s,emptyState:o,onShowToast:r,sessions:c,currentSessionId:d,environments:u,personas:p,onForward:m,sandboxProxyUrl:g}){const v=y.useRef(null),[b,_]=y.useState(OI),k=Z4(),[S,j]=y.useState(!1),[T,N]=y.useState(!1),[C,D]=y.useState(void 0),A=kI({events:t,formatForClipboard:J1}),E=y.useMemo(()=>t.filter(ul).length,[t]),R=y.useMemo(()=>c?c.filter(ce=>RI.has(ce.status)&&ce.id!==d):[],[c,d]),O=y.useMemo(()=>b?[...t].reverse():t,[t,b]),{isAtAnchor:M,scrollToAnchor:$}=vI({scrollRef:v,contentLength:t.length,isReversed:b,paused:A.isSelecting}),Y=()=>{const ce=!b;_(ce);try{localStorage.setItem(W1,ce?"reversed":"default")}catch{}};y.useEffect(()=>{if(!A.isSelecting)return;const ce=me=>{me.key==="Escape"&&!S&&!T&&A.cancelSelection()};return window.addEventListener("keydown",ce),()=>{window.removeEventListener("keydown",ce)}},[A.isSelecting,A.cancelSelection,S,T]);const V=y.useCallback(async()=>{await A.copySelected()&&(r==null||r(`Copied ${A.selectedCount} message${A.selectedCount===1?"":"s"} to clipboard`,"success"))},[A,r]),ne=y.useCallback(()=>[...A.selectedIndices].sort((me,xe)=>me-xe).filter(me=>me<t.length).map(me=>t[me]),[A.selectedIndices,t]),le=y.useCallback(ce=>{if(!ce)return"this session";const me=c==null?void 0:c.find(De=>De.id===ce);if(!me)return ce.slice(0,8);const xe=u==null?void 0:u.find(De=>De.id===me.environmentId);return(xe==null?void 0:xe.displayName)??me.environmentId.slice(0,8)},[c,u]),Z=y.useCallback(async(ce,me)=>{if(!m)return;const xe=le(ce);try{await m(ce,me);const De=A.selectedCount;r==null||r(`Forwarded ${De} message${De===1?"":"s"} to ${xe}`,"success"),A.cancelSelection()}catch{r==null||r("Failed to forward messages","error")}},[m,le,r,A]),se=y.useCallback(ce=>{j(!1);const me=ne(),xe=le(d),De=_I(xe,me);if(new TextEncoder().encode(De).length>MI){D({sessionId:ce,text:De}),N(!0);return}Z(ce,De).catch(()=>{})},[ne,le,d,Z]),H=y.useCallback(()=>{N(!1),C&&(Z(C.sessionId,C.text).catch(()=>{}),D(void 0))},[C,Z]),B=y.useCallback(()=>{N(!1),D(void 0)},[]),F=k?0:.2,ge=b?-8:8,ee=C?Math.round(new TextEncoder().encode(C.text).length/1024):0;return a.jsxs("div",{className:oa.wrapper,children:[a.jsx("div",{className:oa.toolbar,children:a.jsx(Ci,{text:b?"Showing newest first":"Showing oldest first",children:a.jsx("button",{className:oa.directionToggle,onClick:Y,"aria-label":b?"Switch to newest at bottom":"Switch to newest at top","data-testid":"direction-toggle",children:b?a.jsx(xy,{size:Ht,"aria-hidden":"true"}):a.jsx(ky,{size:Ht,"aria-hidden":"true"})})})}),a.jsxs("div",{ref:v,className:`${oa.scrollContainer} ${A.isSelecting?oa.selectingPadding:""}`,"data-testid":"event-stream-scroll",children:[t.length===0&&o,a.jsx(BI,{eventsDropped:s}),a.jsx(os,{initial:!1,children:O.map((ce,me)=>{const xe=b?t.length-1-me:me;return a.jsx(Pt.div,{initial:{opacity:0,y:ge},animate:{opacity:1,y:0},transition:{duration:F,ease:"easeOut"},children:a.jsx(L6,{copyText:bI(ce),isContentBearing:ul(ce),isSelecting:A.isSelecting,isSelected:A.selectedIndices.has(xe),checkboxLabel:II(ce),onSelect:()=>{A.enterSelectionMode(xe)},onToggle:De=>{A.toggleEvent(xe,De)},onCopied:()=>{r==null||r("Copied to clipboard","success")},children:a.jsx(kD,{event:ce,toolUseCtx:ce.toolUseCtx,settled:ce.settled,sandboxProxyUrl:g})})},`${ce.sessionId}-${ce.timestamp}-${xe}`)})})]}),a.jsx(os,{children:A.isSelecting&&a.jsx(F6,{selectedCount:A.selectedCount,totalSelectable:E,onSelectAll:A.selectAll,onDeselectAll:A.deselectAll,onCopy:()=>{V().catch(()=>{})},onForward:m!==void 0?()=>{j(!0)}:void 0,forwardDisabled:R.length===0,onCancel:A.cancelSelection})}),a.jsx(mI,{isOpen:S,sessions:R,environments:u??[],personas:p,onSelect:se,onCancel:()=>{j(!1)}}),a.jsx(_s,{isOpen:T,title:"Send large message?",description:`This will forward a large message (${ee} KB). Continue?`,confirmLabel:"Send",onConfirm:H,onCancel:B}),a.jsx(os,{children:!M&&a.jsxs(Pt.button,{className:`${oa.scrollToAnchor} ${b?oa.scrollToAnchorTop:oa.scrollToAnchorBottom}`,onClick:$,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:[b?a.jsx(ky,{size:Ht,"aria-hidden":"true"}):a.jsx(xy,{size:Ht,"aria-hidden":"true"})," New events"]})})]})}function hh(t){const{value:s,onSave:o,validate:r,fieldId:c,activeFieldId:d,onActivate:u,enterToSave:p=!0,trimOnSave:m=!0}=t,[g,v]=y.useState(""),[b,_]=y.useState(""),k=y.useRef(!1),S=d===c,j=y.useCallback(O=>{v(O),_("")},[]),T=y.useCallback(()=>{_("")},[]),N=y.useCallback(()=>{k.current=!1,u==null||u(null),v(""),_("")},[u]),C=y.useCallback(()=>{const O=m?g.trim():g;if(r){const $=r(g);if($){_($);return}}const M=m?s.trim():s;if(O===M){N();return}o(O),N()},[g,s,m,r,o,N]),D=y.useCallback(()=>{k.current=!0,u==null||u(c),v(s),_("")},[c,s,u]),A=y.useCallback(O=>{if(k.current){k.current=!1;return}O.relatedTarget instanceof HTMLElement&&O.relatedTarget.dataset.editAction===c||C()},[c,C]),E=y.useCallback(O=>{O.key==="Escape"?N():O.key==="Enter"&&p&&C()},[N,p,C]),R=(()=>{if(!S)return!1;const O=m?s.trim():s;return(m?g.trim():g)!==O})();return y.useEffect(()=>{!S&&(g!==""||b!=="")&&(v(""),_(""))},[S,g,b]),{isEditing:S,draft:g,error:b,isDirty:R,startEdit:D,cancelEdit:N,save:C,setDraft:j,clearError:T,handleBlur:A,handleKeyDown:E,ignoreInitialBlurRef:k}}const LI="_editFieldWrapper_yuzty_1",zI="_editInput_yuzty_10",$I="_editTextarea_yuzty_42",HI="_editSelect_yuzty_78",PI="_editError_yuzty_111",UI="_editInputInvalid_yuzty_118",VI="_editHint_yuzty_123",qI="_unsavedDot_yuzty_132",GI="_metaValueClickable_yuzty_140",FI="_editButton_yuzty_159",KI="_metaPlaceholder_yuzty_175",ZI="_worktreeToggle_yuzty_180",it={editFieldWrapper:LI,editInput:zI,editTextarea:$I,editSelect:HI,editError:PI,editInputInvalid:UI,editHint:VI,unsavedDot:qI,metaValueClickable:GI,editButton:FI,metaPlaceholder:KI,worktreeToggle:ZI};function zt(t){const{value:s,onSave:o,validate:r,mode:c="edit",fieldId:d="text",activeFieldId:u,onActivate:p,onChange:m,renderDisplay:g,placeholder:v,maxLength:b,ariaLabel:_,"data-testid":k}=t,S=y.useRef(null),j=hh({value:s,onSave:o,validate:r,fieldId:d,activeFieldId:u,onActivate:p,enterToSave:!0,trimOnSave:!0});if(y.useEffect(()=>{if(j.isEditing){const N=window.setTimeout(()=>{var C;(C=S.current)==null||C.focus()},0);return()=>window.clearTimeout(N)}},[j.isEditing]),c==="create"){const N=D=>{m==null||m(D.target.value)},C=r==null?void 0:r(s);return a.jsxs("div",{className:it.editFieldWrapper,children:[a.jsx("input",{className:`${it.editInput} ${C?it.editInputInvalid:""}`,value:s,onChange:N,maxLength:b,placeholder:v,"aria-label":_,"data-testid":k?`${k}-input`:void 0}),C&&a.jsx("span",{className:it.editError,"data-testid":"edit-error",children:C})]})}if(j.isEditing)return a.jsxs("div",{className:it.editFieldWrapper,children:[a.jsx("input",{ref:S,className:`${it.editInput} ${j.error?it.editInputInvalid:""}`,value:j.draft,onChange:N=>j.setDraft(N.target.value),onBlur:j.handleBlur,onKeyDown:j.handleKeyDown,maxLength:b,placeholder:v,"aria-label":_,"data-testid":k?`${k}-input`:void 0}),j.isDirty&&a.jsx("span",{className:it.unsavedDot,title:"Unsaved changes"}),j.error&&a.jsx("span",{className:it.editError,"data-testid":"edit-error",children:j.error}),a.jsx("span",{className:it.editHint,children:"Enter to save · Esc to cancel"})]});const T=g==null?void 0:g(s);return a.jsxs("span",{role:"button",tabIndex:0,className:it.metaValueClickable,onClick:()=>j.startEdit(),onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),j.startEdit())},title:"Click to edit","aria-label":_,"data-testid":k?`${k}-button`:void 0,children:[T!==void 0?T:s?a.jsx("span",{children:s}):a.jsx("span",{className:it.metaPlaceholder,children:v||"None"}),a.jsx("span",{className:it.editButton,"aria-hidden":"true",children:"✏️"})]})}function fm(t){const{value:s,onSave:o,validate:r,mode:c="edit",fieldId:d="textarea",activeFieldId:u,onActivate:p,onChange:m,renderDisplay:g,placeholder:v,ariaLabel:b,"data-testid":_}=t,k=y.useRef(null),S=hh({value:s,onSave:o,validate:r,fieldId:d,activeFieldId:u,onActivate:p,enterToSave:!1,trimOnSave:!1});if(y.useEffect(()=>{if(S.isEditing){const T=window.setTimeout(()=>{var N;(N=k.current)==null||N.focus()},0);return()=>window.clearTimeout(T)}},[S.isEditing]),c==="create"){const T=C=>{m==null||m(C.target.value)},N=r==null?void 0:r(s);return a.jsxs("div",{className:it.editFieldWrapper,children:[a.jsx("textarea",{className:`${it.editTextarea} ${N?it.editInputInvalid:""}`,value:s,onChange:T,placeholder:v,"aria-label":b,"data-testid":_?`${_}-input`:void 0}),N&&a.jsx("span",{className:it.editError,"data-testid":"edit-error",children:N})]})}if(S.isEditing)return a.jsxs("div",{className:it.editFieldWrapper,children:[a.jsx("textarea",{ref:k,className:`${it.editTextarea} ${S.error?it.editInputInvalid:""}`,value:S.draft,onChange:T=>S.setDraft(T.target.value),onBlur:S.handleBlur,onKeyDown:S.handleKeyDown,title:b,"aria-label":b,"data-testid":_?`${_}-input`:void 0}),S.isDirty&&a.jsx("span",{className:it.unsavedDot,title:"Unsaved changes"}),S.error&&a.jsx("span",{className:it.editError,"data-testid":"edit-error",children:S.error}),a.jsx("span",{className:it.editHint,children:"Tab to save · Esc to cancel"})]});const j=g==null?void 0:g(s);return a.jsxs("span",{role:"button",tabIndex:0,className:it.metaValueClickable,onClick:()=>S.startEdit(),onKeyDown:T=>{(T.key==="Enter"||T.key===" ")&&(T.preventDefault(),S.startEdit())},title:"Click to edit","aria-label":b,"data-testid":_?`${_}-button`:void 0,children:[j!==void 0?j:s?a.jsx("span",{children:s}):a.jsx("span",{className:it.metaPlaceholder,children:v||"None"}),a.jsx("span",{className:it.editButton,"aria-hidden":"true",children:"✏️"})]})}function bd(t){var D;const{value:s,onSave:o,mode:r="edit",options:c,fieldId:d="select",activeFieldId:u,onActivate:p,onChange:m,renderDisplay:g,placeholder:v,ariaLabel:b,"data-testid":_}=t,k=y.useRef(null),S=hh({value:s,onSave:o,fieldId:d,activeFieldId:u,onActivate:p,enterToSave:!1,trimOnSave:!1});y.useEffect(()=>{if(S.isEditing){const A=window.setTimeout(()=>{var E;(E=k.current)==null||E.focus()},0);return()=>window.clearTimeout(A)}},[S.isEditing]);const j=y.useCallback(A=>{const E=A.target.value;S.ignoreInitialBlurRef.current=!1,E!==s&&o(E),S.cancelEdit()},[s,o,S]),T=y.useCallback(A=>{if(S.ignoreInitialBlurRef.current){S.ignoreInitialBlurRef.current=!1;return}A.relatedTarget instanceof HTMLElement&&A.relatedTarget.dataset.editAction===d||S.cancelEdit()},[d,S]);if(r==="create")return a.jsx("select",{className:it.editSelect,value:s,onChange:A=>m==null?void 0:m(A.target.value),"aria-label":b,"data-testid":_?`${_}-select`:void 0,children:c.map(A=>a.jsx("option",{value:A.value,children:A.label},A.value))});if(S.isEditing)return a.jsx("select",{ref:k,className:it.editSelect,value:S.draft,onChange:j,onBlur:T,title:b,"aria-label":b,"data-testid":_?`${_}-select`:void 0,children:c.map(A=>a.jsx("option",{value:A.value,children:A.label},A.value))});const N=g==null?void 0:g(s),C=(D=c.find(A=>A.value===s))==null?void 0:D.label;return a.jsxs("button",{type:"button",className:it.metaValueClickable,onClick:()=>S.startEdit(),title:"Click to change","aria-label":b,"data-testid":_?`${_}-button`:void 0,children:[N!==void 0?N:C?a.jsx("span",{children:C}):a.jsx("span",{className:it.metaPlaceholder,children:v||"None"}),a.jsx("span",{className:it.editButton,"aria-hidden":"true",children:"✏️"})]})}function YI(t){const{checked:s,onChange:o,label:r,ariaLabel:c,"data-testid":d}=t;return a.jsxs("label",{className:it.worktreeToggle,"data-testid":d,children:[a.jsx("input",{type:"checkbox",checked:s,onChange:u=>o(u.target.checked),"aria-label":c}),a.jsx("span",{children:r})]})}const JI="_nav_1snmp_1",WI="_searchForm_1snmp_8",XI="_searchInput_1snmp_15",QI="_searchButton_1snmp_33",e5="_clearButton_1snmp_68",t5="_workspaceSelect_1snmp_85",n5="_listHeader_1snmp_99",s5="_nodeList_1snmp_108",a5="_nodeItem_1snmp_116",i5="_indicator_1snmp_129",o5="_label_1snmp_136",r5="_badge_1snmp_145",es={nav:JI,searchForm:WI,searchInput:XI,searchButton:QI,clearButton:e5,workspaceSelect:t5,listHeader:n5,nodeList:s5,nodeItem:a5,indicator:i5,label:o5,badge:r5};function l5({nodes:t,workspaces:s,loading:o,searchQuery:r,onSearch:c,onClearSearch:d,onSelectNode:u,onWorkspaceChange:p}){const[m,g]=y.useState(""),v=y.useCallback(S=>{S.preventDefault(),m.trim()&&c(m.trim())},[m,c]),b=y.useCallback(()=>{g(""),d()},[d]),_=y.useCallback(S=>{u(S)},[u]),k=y.useCallback(S=>{g(""),p(S)},[p]);return a.jsxs("div",{className:es.nav,"data-testid":"knowledge-nav",children:[a.jsxs("form",{className:es.searchForm,onSubmit:v,children:[a.jsx("input",{className:es.searchInput,type:"text",placeholder:"Search...",value:m,onChange:S=>{g(S.target.value)},"data-testid":"knowledge-search-input","aria-label":"Search knowledge nodes"}),a.jsx("button",{type:"submit",className:es.searchButton,disabled:o,children:"Go"})]}),r&&a.jsx("button",{type:"button",className:es.clearButton,onClick:b,children:"Clear search"}),a.jsxs("select",{className:es.workspaceSelect,onChange:S=>{k(S.target.value)},"data-testid":"knowledge-workspace-filter","aria-label":"Filter by workspace",children:[a.jsx("option",{value:"",children:"All workspaces"}),s.map(S=>a.jsx("option",{value:S.id,children:S.name},S.id))]}),a.jsxs("div",{className:es.listHeader,children:["Nodes (",t.length,")"]}),a.jsx("ul",{className:es.nodeList,children:t.map(S=>a.jsxs("li",{className:es.nodeItem,onClick:()=>{_(S.id)},onKeyDown:j=>{(j.key==="Enter"||j.key===" ")&&(j.preventDefault(),_(S.id))},role:"button",tabIndex:0,children:[a.jsx("span",{className:es.indicator,style:{backgroundColor:S.kind==="reference"?"#4A9EFF":S.category==="decision"?"#22C55E":S.category==="concept"?"#A855F7":S.category==="snippet"?"#6B7280":"#EAB308"}}),a.jsx("span",{className:es.label,children:S.label}),a.jsx("span",{className:es.badge,children:S.kind==="reference"?S.sourceType:S.category})]},S.id))})]})}const c5="_container_bwu10_1",d5="_hamburger_bwu10_33",u5="_brand_bwu10_49",f5="_brandLogo_bwu10_68",p5="_info_bwu10_75",m5="_connectionLabel_bwu10_90",h5="_connectionDot_bwu10_103",g5="_connected_bwu10_106",v5="_disconnected_bwu10_110",y5="_connecting_bwu10_113",Ms={container:c5,hamburger:d5,brand:u5,brandLogo:f5,info:p5,connectionLabel:m5,connectionDot:h5,connected:g5,disconnected:v5,connecting:y5},b5={connected:"Connected",connecting:"Connecting...",disconnected:"Disconnected"},_5={connected:Ms.connected,connecting:Ms.connecting,disconnected:Ms.disconnected};function x5({connectionStatus:t,environments:s,sessions:o,onToggleSidebar:r,sidebarOpen:c}){const d=xt(),u=s.length,p=s.filter(v=>v.status==="connected").length,m=o.filter(v=>["running","idle"].includes(v.status)).length,g=b5[t];return a.jsxs("div",{className:Ms.container,children:[r&&a.jsx("button",{type:"button",className:Ms.hamburger,onClick:r,"aria-label":"Toggle sidebar","aria-expanded":c,children:a.jsx(wT,{size:Et,"aria-hidden":"true"})}),a.jsx(Ci,{text:"Home",placement:"bottom",children:a.jsxs("button",{type:"button",className:Ms.brand,onClick:()=>d(Fo),"data-testid":"statusbar-brand",children:[a.jsx("img",{src:Id("icon-192x192.png"),alt:"",className:Ms.brandLogo,"aria-hidden":"true","data-testid":"statusbar-logo"}),"Grackle"]})}),a.jsxs("div",{className:Ms.info,children:[a.jsxs("span",{"aria-label":g,children:[a.jsx("span",{className:`${Ms.connectionDot} ${_5[t]}`,"aria-hidden":"true",children:a.jsx(Ni,{size:G_,fill:"currentColor"})})," ",a.jsx("span",{className:Ms.connectionLabel,"aria-hidden":"true",children:g})]}),a.jsxs("span",{children:[p,"/",u," env",u!==1?"s":""]}),a.jsxs("span",{children:[m," active"]})]})]})}const k5="_nav_gx5h3_1",S5="_tab_gx5h3_35",j5="_tabIcon_gx5h3_68",T5="_tabLabel_gx5h3_79",N5="_tabActive_gx5h3_84",w5="_tabEnd_gx5h3_90",wo={nav:k5,tab:S5,tabIcon:j5,tabLabel:T5,tabActive:N5,tabEnd:w5},ad=[{view:"dashboard",label:"Dashboard",icon:a.jsx(mT,{size:Et}),route:Fo,testId:"sidebar-tab-dashboard",order:0},{view:"tasks",label:"Tasks",icon:a.jsx(Kj,{size:Et}),route:cC,testId:"sidebar-tab-tasks",order:1},{view:"environments",label:"Environments",icon:a.jsx(RT,{size:Et}),route:zo,testId:"sidebar-tab-environments",order:2},{view:"chat",label:"Root",icon:a.jsx(ET,{size:Et}),route:lC,testId:"sidebar-tab-chat",order:3},{view:"knowledge",label:"Knowledge",icon:a.jsx($j,{size:Et}),route:hx,testId:"sidebar-tab-knowledge",order:5},{view:"coordination",label:"Coordination",icon:a.jsx(OT,{size:Et}),route:px,testId:"sidebar-tab-coordination",order:6},{view:"settings",label:"Settings",icon:a.jsx(ZT,{size:Et}),route:sC,testId:"sidebar-tab-settings",align:"end"}];function C5(t){return t===Fo||t==="/"?"dashboard":t.startsWith(px)?"coordination":t.startsWith("/chat")||t.startsWith("/sessions")?"chat":t.startsWith("/workspaces")||t.startsWith("/environments")?"environments":t.startsWith(hx)?"knowledge":t.startsWith(ji)?"settings":"tasks"}function E5({tabs:t=ad}){var g;const s=Wt(),o=xt(),r=y.useRef(null),c=C5(s.pathname),d=y.useMemo(()=>{const v=(b,_)=>(b.order??Number.MAX_SAFE_INTEGER)-(_.order??Number.MAX_SAFE_INTEGER);return[...t.filter(b=>b.align!=="end").sort(v),...t.filter(b=>b.align==="end")]},[t]),u=(g=d.find(v=>v.align==="end"))==null?void 0:g.view,p=y.useCallback(v=>{o(v.route)},[o]),m=y.useCallback(v=>{var j,T;const b=(j=r.current)==null?void 0:j.querySelectorAll('[role="tab"]');if(!b)return;const _=Array.from(b).findIndex(N=>N===document.activeElement),k=_>=0?_:d.findIndex(N=>N.view===c);let S=k;if(v.key==="ArrowRight"||v.key==="j"||v.key==="J")v.preventDefault(),S=(k+1)%d.length;else if(v.key==="ArrowLeft"||v.key==="k"||v.key==="K")v.preventDefault(),S=(k-1+d.length)%d.length;else if(v.key==="Home")v.preventDefault(),S=0;else if(v.key==="End")v.preventDefault(),S=d.length-1;else return;o(d[S].route),(T=b[S])==null||T.focus()},[c,o,d]);return a.jsx("nav",{className:wo.nav,ref:r,role:"tablist","aria-orientation":"horizontal","aria-label":"App navigation",onKeyDown:m,"data-testid":"sidebar-nav",children:d.map(v=>{const b=v.view===c,_=v.view===u;return a.jsx(Ci,{text:v.label,placement:"bottom",className:_?wo.tabEnd:void 0,children:a.jsxs("button",{role:"tab",type:"button","aria-selected":b,tabIndex:b?0:-1,className:`${wo.tab} ${b?wo.tabActive:""}`,onClick:()=>p(v),"data-testid":v.testId,"aria-label":v.label,children:[a.jsx("span",{className:wo.tabIcon,"aria-hidden":"true",children:v.icon}),a.jsx("span",{className:wo.tabLabel,children:v.label})]})},v.view)})})}const A5="_container_pi6ii_1",D5="_content_pi6ii_66",n_={container:A5,content:D5},M5=320,X1=220,Q1=600,ek="grackle-sidebar-width";function R5(){try{const t=localStorage.getItem(ek);if(t!==null){const s=Number(t);if(Number.isFinite(s)&&s>=X1&&s<=Q1)return s}}catch{}return M5}function I5(t){try{localStorage.setItem(ek,String(t))}catch{}}function O5({content:t}){const[s]=y.useState(R5),o=y.useRef(null);if(y.useEffect(()=>{const r=o.current;if(!r)return;const c=new ResizeObserver(d=>{for(const u of d){const p=u.borderBoxSize[0];if(p){const m=Math.round(p.inlineSize);m>=X1&&m<=Q1&&I5(m)}}});return c.observe(r),()=>{c.disconnect()}},[]),t!==void 0)return a.jsx("div",{className:n_.container,ref:o,"data-testid":"sidebar",style:{width:s},children:a.jsx("div",{className:n_.content,children:t})})}const B5="_bar_tnfsh_1",L5="_btnPrimary_tnfsh_32",z5="_statusText_tnfsh_85",$5="_statusCompleted_tnfsh_90",H5="_statusFailed_tnfsh_94",P5="_statusBlocked_tnfsh_98",U5="_hintText_tnfsh_103",Ct={bar:B5,btnPrimary:L5,statusText:z5,statusCompleted:$5,statusFailed:H5,statusBlocked:P5,hintText:U5};function V5({sessions:t,tasks:s,environments:o}){const r=xt(),c=Wt(),d=nn("/sessions/:sessionId"),u=nn("/tasks/:taskId"),p=nn("/tasks/:taskId/stream"),m=nn("/tasks/:taskId/edit"),g=nn("/environments/:environmentId/workspaces/:workspaceId/tasks/:taskId"),v=nn("/environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/stream"),b=nn("/environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/edit"),_=nn("/sessions/new"),k=nn("/environments/:environmentId/workspaces/:workspaceId"),S=nn("/tasks/new"),j=nn("/chat"),T=nn("/"),N=nn("/settings/*"),C=d==null?void 0:d.params.sessionId,D=(u==null?void 0:u.params.taskId)??(p==null?void 0:p.params.taskId)??(g==null?void 0:g.params.taskId)??(v==null?void 0:v.params.taskId)??(b==null?void 0:b.params.taskId),A=g??v??b,E=(A==null?void 0:A.params.environmentId)??(k==null?void 0:k.params.environmentId),R=c.pathname.startsWith("/environments")&&!k&&!A,O=!!j,M=!!_,$=!!k&&!g&&!v&&!b,Y=!!S;if(!!T&&!M&&!$&&!Y||!!N||(!!m||!!b)||Y||R||M)return a.jsx(a.Fragment,{});if(O)return o.find(se=>se.adapterType==="local"&&se.status==="connected")?a.jsx(a.Fragment,{}):a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:Ct.hintText,children:"Add a local environment to start chatting"})});if($)return a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:Ct.hintText,children:"Select a task or click + to create one"})});if(D){const Z=s.find(B=>B.id===D);if(!Z)return a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:Ct.hintText,children:"Loading..."})});const se=new Map(s.map(B=>[B.id,B])),H=Z.dependsOn.some(B=>{const F=se.get(B);return F!==void 0&&F.status!=="complete"});if(Z.status==="not_started"){const B=H?Z.dependsOn.map(F=>se.get(F)).filter(F=>F&&F.status!=="complete").map(F=>F.title):[];return a.jsx("div",{className:Ct.bar,children:H?a.jsxs("span",{className:Ct.statusBlocked,children:["Blocked by: ",B.join(", ")]}):a.jsx("span",{className:Ct.hintText,children:"Use the buttons above to start or manage this task"})})}if(Z.status==="working"||Z.status==="paused"){const B=Z.latestSessionId||void 0,F=B?t.find(ee=>ee.id===B):void 0;return F&&F.status!=="stopped"?a.jsx(a.Fragment,{}):a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:Ct.hintText,children:"Waiting for agent..."})})}if(Z.status==="complete")return a.jsxs("div",{className:Ct.bar,children:[a.jsx("span",{className:`${Ct.statusText} ${Ct.statusCompleted}`,children:"Task completed"}),a.jsx("button",{onClick:()=>r(Ri(Z.workspaceId,void 0,E)),className:Ct.btnPrimary,children:"+ New Task"})]});if(Z.status==="failed")return a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:`${Ct.statusText} ${Ct.statusFailed}`,children:"Task failed"})})}if(C){const Z=t.find(B=>B.id===C),se=(Z==null?void 0:Z.status)==="stopped";if(Z!==void 0&&!se)return a.jsx(a.Fragment,{});if(se)return a.jsxs("div",{className:Ct.bar,children:[a.jsxs("span",{className:`${Ct.statusText} ${Ct.hintText}`,children:["Session ",Z.endReason||Z.status]}),a.jsx("button",{onClick:()=>r(dx(Z.environmentId)),className:Ct.btnPrimary,children:"+ New Chat"})]})}return a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:Ct.hintText,children:"Loading..."})})}const q5="_nav_14i94_1",G5="_tab_14i94_24",F5="_tabActive_14i94_62",K5="_tabLabel_14i94_75",Z5="_statusDot_14i94_81",Y5="_pulse_14i94_87",J5="_addButton_14i94_99",W5="_empty_14i94_132",Ua={nav:q5,tab:G5,tabActive:F5,tabLabel:K5,statusDot:Z5,pulse:Y5,addButton:J5,empty:W5},X5={connected:"var(--accent-green)",sleeping:"var(--accent-yellow)",error:"var(--accent-red)",disconnected:"var(--text-tertiary)",connecting:"var(--accent-blue)"};function Q5({environments:t}){const s=xt(),o=y.useRef(null),r=nn("/environments/:environmentId"),c=nn("/environments/:environmentId/edit"),d=nn("/environments/:environmentId/workspaces/:workspaceId"),u=nn("/environments/:environmentId/workspaces/:workspaceId/*"),p=(r==null?void 0:r.params.environmentId)??(c==null?void 0:c.params.environmentId)??(d==null?void 0:d.params.environmentId)??(u==null?void 0:u.params.environmentId),m=p==="new"?void 0:p,g=y.useCallback(_=>{s($o(_))},[s]),v=y.useCallback(_=>{var N;const k=(N=o.current)==null?void 0:N.querySelectorAll('[role="tab"]');if(!k||k.length===0)return;const S=Array.from(k).findIndex(C=>C===document.activeElement),j=S>=0?S:t.findIndex(C=>C.id===m);let T=j;if(_.key==="ArrowDown"||_.key==="j"||_.key==="J")_.preventDefault(),T=(j+1)%k.length;else if(_.key==="ArrowUp"||_.key==="k"||_.key==="K")_.preventDefault(),T=(j-1+k.length)%k.length;else if(_.key==="Home")_.preventDefault(),T=0;else if(_.key==="End")_.preventDefault(),T=k.length-1;else return;T<t.length&&s($o(t[T].id)),k[T].focus()},[m,t,s]),b=m??(t.length>0?t[0].id:void 0);return a.jsxs("div",{className:Ua.nav,"data-testid":"environment-nav",children:[a.jsx("nav",{ref:o,role:"tablist","aria-orientation":"vertical","aria-label":"Environments",onKeyDown:v,children:t.map(_=>{const k=_.id===m,S=_.id===b,j=X5[_.status]||"var(--text-tertiary)",T=_.status==="connected";return a.jsxs("button",{role:"tab",type:"button","aria-selected":k,tabIndex:S?0:-1,className:`${Ua.tab} ${k?Ua.tabActive:""}`,onClick:()=>g(_.id),"data-testid":"env-nav-item",children:[a.jsx("span",{className:`${Ua.statusDot} ${T?Ua.pulse:""}`,style:{color:j},"aria-hidden":"true",children:a.jsx(Ni,{size:G_,fill:"currentColor"})}),a.jsx("span",{className:Ua.tabLabel,title:_.displayName||_.id,children:_.displayName||_.id})]},_.id)})}),a.jsx("button",{type:"button",className:Ua.addButton,onClick:()=>s(tC),title:"Add environment","data-testid":"env-nav-add",children:"+ Add Environment"}),t.length===0&&a.jsx("div",{className:Ua.empty,children:"No environments yet."})]})}function eO(t){if(t.length===0)return[];const s=[...t].sort((r,c)=>r[0]-c[0]),o=[[s[0][0],s[0][1]]];for(let r=1;r<s.length;r++){const c=o[o.length-1],[d,u]=s[r];d<=c[1]+1?c[1]=Math.max(c[1],u):o.push([d,u])}return o}function tk({text:t,indices:s,highlightClass:o}){if(!s||s.length===0)return a.jsx(a.Fragment,{children:t});const r=eO(s),c=[];let d=0;for(const[u,p]of r)u>d&&c.push(a.jsx("span",{children:t.slice(d,u)},`p${d}`)),c.push(a.jsx("mark",{className:o,children:t.slice(u,p+1)},`m${u}`)),d=p+1;return d<t.length&&c.push(a.jsx("span",{children:t.slice(d)},`p${d}`)),a.jsx(a.Fragment,{children:c})}function tO(t){const s=new Map(t.map(r=>[r.id,{...r,children:[]}])),o=[];for(const r of s.values())r.parentTaskId&&s.has(r.parentTaskId)?s.get(r.parentTaskId).children.push(r):o.push(r);for(const r of s.values())r.children.sort((c,d)=>c.sortOrder-d.sortOrder);return o.sort((r,c)=>r.sortOrder-c.sortOrder)}function nO(t,s){const o=new Map;for(const d of t){const p=d.dependsOn.length>0&&d.dependsOn.some(g=>s.get(g)!=="complete")?"blocked":d.status,m=o.get(p);m?m.push(d):o.set(p,[d])}const r=[],c=new Set;for(const d of iN){c.add(d);const u=o.get(d);if(u&&u.length>0){u.sort((m,g)=>m.sortOrder-g.sortOrder);const p=Ya(d);r.push({status:d,label:p.label,style:p,tasks:u})}}for(const[d,u]of o)if(!c.has(d)&&u.length>0){u.sort((m,g)=>m.sortOrder-g.sortOrder);const p=Ya(d);r.push({status:d,label:p.label,style:p,tasks:u})}return r}const sO="_container_z4i38_1",aO="_header_z4i38_5",iO="_headerActions_z4i38_17",oO="_searchInput_z4i38_23",rO="_searchHighlight_z4i38_56",lO="_groupToggle_z4i38_62",cO="_groupToggleActive_z4i38_89",dO="_addButton_z4i38_93",uO="_taskRow_z4i38_120",fO="_selected_z4i38_140",pO="_expandArrow_z4i38_150",mO="_expanded_z4i38_157",hO="_leafSpacer_z4i38_161",gO="_taskStatusIcon_z4i38_166",vO="_taskTitle_z4i38_170",yO="_workspaceBadge_z4i38_177",bO="_childCountBadge_z4i38_195",_O="_dependencyBadge_z4i38_208",xO="_blockedBadge_z4i38_220",kO="_addChildButton_z4i38_225",SO="_emptyState_z4i38_268",jO="_statusGroupHeader_z4i38_275",TO="_statusGroupIcon_z4i38_294",NO="_statusGroupLabel_z4i38_298",wO="_statusGroupCount_z4i38_303",We={container:sO,header:aO,headerActions:iO,searchInput:oO,searchHighlight:rO,groupToggle:lO,groupToggleActive:cO,addButton:dO,taskRow:uO,selected:fO,expandArrow:pO,expanded:mO,leafSpacer:hO,taskStatusIcon:gO,taskTitle:vO,workspaceBadge:yO,childCountBadge:bO,dependencyBadge:_O,blockedBadge:xO,addChildButton:kO,emptyState:SO,statusGroupHeader:jO,statusGroupIcon:TO,statusGroupLabel:NO,statusGroupCount:wO},CO=[{name:"title",weight:2},{name:"description",weight:1}],nk=16,EO=16,sk="grackle-task-group-by-status";function s_(){try{return localStorage.getItem(sk)==="true"}catch{return!1}}function AO(t){try{localStorage.setItem(sk,String(t))}catch{}}function DO({group:t,isExpanded:s,onToggle:o,selectedTaskId:r,navigate:c,titleHighlights:d,workspaceNames:u}){return a.jsxs("div",{"data-testid":`status-group-${t.status}`,children:[a.jsxs("div",{className:We.statusGroupHeader,role:"button",tabIndex:0,"aria-expanded":s,onClick:o,onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),o())},children:[a.jsx("span",{className:`${We.expandArrow} ${s?We.expanded:""}`,"aria-hidden":"true",children:a.jsx(pa,{size:Ye})}),a.jsx("span",{className:We.statusGroupIcon,style:{color:t.style.color},"aria-hidden":"true",children:t.style.icon}),a.jsx("span",{className:We.statusGroupLabel,children:t.label}),a.jsx("span",{className:We.statusGroupCount,children:t.tasks.length})]}),a.jsx(os,{children:s&&a.jsx(Pt.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{duration:.2},style:{overflow:"hidden"},children:t.tasks.map(p=>{const m=Ya(p.status),g=r===p.id,v=p.parentTaskId||!p.workspaceId?void 0:u.get(p.workspaceId);return a.jsxs("div",{onClick:()=>c(ls(p.id)),role:"button",tabIndex:0,"aria-label":p.title,onKeyDown:b=>{b.currentTarget===b.target&&(b.key==="Enter"||b.key===" ")&&(b.preventDefault(),c(ls(p.id)))},className:`${We.taskRow} ${g?We.selected:""}`,style:{"--task-indent":`${nk}px`},"data-task-id":p.id,children:[a.jsx("span",{className:We.leafSpacer}),a.jsx("span",{className:We.taskStatusIcon,style:{color:m.color},"aria-hidden":"true","data-testid":`task-status-${fl(p.status)}`,children:m.icon}),a.jsx("span",{className:We.taskTitle,title:p.title,children:a.jsx(tk,{text:p.title,indices:d.get(p.id),highlightClass:We.searchHighlight})}),v&&a.jsx("span",{className:We.workspaceBadge,title:v,children:v})]},p.id)})})})]})}function ak({node:t,depth:s,expandedTasks:o,toggleTask:r,selectedTaskId:c,navigate:d,taskStatusById:u,titleHighlights:p,workspaceNames:m}){const g=Ya(t.status),v=t.dependsOn.length>0&&t.dependsOn.some(N=>u.get(N)!=="complete"),b=o.has(t.id),_=t.children.length>0,k=c===t.id,S=nk+s*EO,T=s===0&&!t.parentTaskId&&t.workspaceId?m.get(t.workspaceId):void 0;return a.jsxs(a.Fragment,{children:[a.jsxs("div",{onClick:()=>d(ls(t.id)),role:"button",tabIndex:0,"aria-label":t.title,onKeyDown:N=>{N.currentTarget===N.target&&(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),d(ls(t.id)))},className:`${We.taskRow} ${k?We.selected:""}`,style:{"--task-indent":`${S}px`},"data-task-id":t.id,children:[_&&a.jsx("span",{className:`${We.expandArrow} ${b?We.expanded:""}`,role:"button",tabIndex:0,"aria-label":b?"Collapse task":"Expand task",onClick:N=>{N.stopPropagation(),r(t.id)},onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),N.stopPropagation(),r(t.id))},children:a.jsx(pa,{size:Ye,"aria-hidden":"true"})}),!_&&a.jsx("span",{className:We.leafSpacer}),a.jsx("span",{className:We.taskStatusIcon,style:{color:g.color},"aria-hidden":"true","data-testid":`task-status-${fl(t.status)}`,children:g.icon}),a.jsx("span",{className:We.taskTitle,title:t.title,children:a.jsx(tk,{text:t.title,indices:p.get(t.id),highlightClass:We.searchHighlight})}),T&&a.jsx("span",{className:We.workspaceBadge,title:T,children:T}),_&&a.jsxs("span",{className:We.childCountBadge,children:[t.children.filter(N=>N.status==="complete").length,"/",t.children.length]}),t.dependsOn.length>0&&a.jsx("span",{className:`${We.dependencyBadge} ${v?We.blockedBadge:""}`,title:`Depends on: ${t.dependsOn.join(", ")}`,children:v?"blocked":"dep"}),s<W2&&a.jsx(Ci,{text:"Add child task",children:a.jsx("button",{onClick:N=>{N.stopPropagation(),d(Ri(t.workspaceId,t.id))},"aria-label":"Add child task",className:We.addChildButton,children:"+"})})]}),a.jsx(os,{children:_&&b&&a.jsx(Pt.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{duration:.15},style:{overflow:"hidden"},children:t.children.map(N=>a.jsx(ak,{node:N,depth:s+1,expandedTasks:o,toggleTask:r,selectedTaskId:c,navigate:d,taskStatusById:u,titleHighlights:p,workspaceNames:m},N.id))})})]})}function MO({workspaces:t,tasks:s}){const o=xt(),[r,c]=y.useState(new Set),[d,u]=y.useState(new Set),[p,m]=y.useState(s_),[g,v]=y.useState(s_),[b,_]=y.useState(new Map),k=nn("/tasks/:taskId/*"),S=(k==null?void 0:k.params.taskId)!=="new"?k==null?void 0:k.params.taskId:void 0,j=y.useMemo(()=>new Map(s.map(Z=>[Z.id,Z.status])),[s]),T=y.useMemo(()=>new Map(t.map(Z=>[Z.id,Z.name])),[t]),N=()=>{const Z=!p;AO(Z),m(Z),Z&&(v(!0),_(new Map))},C=Z=>{_(se=>{const H=new Map(se),B=H.has(Z)?H.get(Z):g;return H.set(Z,!B),H})},D=Z=>b.has(Z)?b.get(Z):g,A=Z=>{c(se=>{const H=new Set(se);return H.has(Z)?(H.delete(Z),u(B=>new Set(B).add(Z))):(H.add(Z),u(B=>{const F=new Set(B);return F.delete(Z),F})),H})};y.useEffect(()=>{const Z=new Set(s.filter(se=>se.parentTaskId).map(se=>se.parentTaskId));Z.size>0&&c(se=>{const H=new Set(se);for(const B of Z)d.has(B)||H.add(B);return H})},[s,d]);const[E,R]=y.useState(""),{directMatchTaskIds:O,treeMatchTaskIds:M,titleHighlights:$}=y.useMemo(()=>{if(!E.trim())return{directMatchTaskIds:null,treeMatchTaskIds:null,titleHighlights:new Map};const Z=J2(s,E,CO),se=new Set(Z.map(ge=>ge.item.id)),H=new Map;for(const ge of Z){const ee=ge.matches.find(ce=>ce.key==="title");ee&&H.set(ge.item.id,ee.indices)}const B=new Set(se),F=new Map(s.map(ge=>[ge.id,ge]));for(const ge of[...se]){let ee=F.get(ge);for(;ee!=null&&ee.parentTaskId;)B.add(ee.parentTaskId),ee=F.get(ee.parentTaskId)}return{directMatchTaskIds:se,treeMatchTaskIds:B,titleHighlights:H}},[E,s]),Y=O!==null,V=Y?p?O:M:null,ne=V?s.filter(Z=>V.has(Z.id)):s,le=p?[]:tO(ne);return a.jsxs("div",{className:We.container,children:[a.jsxs("div",{className:We.header,children:[a.jsx("span",{children:"Tasks"}),a.jsxs("div",{className:We.headerActions,children:[a.jsx(Ci,{text:p?"Switch to tree view":"Group tasks by status",children:a.jsx("button",{className:`${We.groupToggle} ${p?We.groupToggleActive:""}`,onClick:N,"aria-label":p?"Switch to tree view":"Group tasks by status","aria-pressed":p,"data-testid":"task-group-by-status-toggle",children:a.jsx(ST,{size:Ht})})}),a.jsx(Ci,{text:"New task",children:a.jsx("button",{className:We.addButton,onClick:()=>o(Ri()),"aria-label":"New task","data-testid":"new-task-button",children:"+"})})]})]}),s.length>0&&a.jsx("input",{type:"text",value:E,onChange:Z=>R(Z.target.value),placeholder:"Filter...","aria-label":"Filter tasks",className:We.searchInput,"data-testid":"sidebar-search"}),p?nO(ne,j).map(Z=>a.jsx(DO,{group:Z,isExpanded:D(Z.status),onToggle:()=>C(Z.status),selectedTaskId:S,navigate:o,titleHighlights:$,workspaceNames:T},Z.status)):le.map(Z=>a.jsx(ak,{node:Z,depth:0,expandedTasks:r,toggleTask:A,selectedTaskId:S,navigate:o,taskStatusById:j,titleHighlights:$,workspaceNames:T},Z.id)),ne.length===0&&!Y&&a.jsx("div",{className:We.emptyState,children:"No tasks yet. Click + to create one."}),ne.length===0&&Y&&a.jsx("div",{className:We.emptyState,children:"No matching tasks"})]})}const RO="_toast_ed2dk_1",IO="_success_ed2dk_18",OO="_icon_ed2dk_22",BO="_error_ed2dk_25",LO="_warning_ed2dk_32",zO="_info_ed2dk_38",$O="_message_ed2dk_53",HO="_close_ed2dk_60",qr={toast:RO,success:IO,icon:OO,error:BO,warning:LO,info:zO,message:$O,close:HO},PO={success:a.jsx(Ai,{size:Et}),error:a.jsx(Ls,{size:Et}),warning:a.jsx(Sm,{size:Et}),info:a.jsx(km,{size:Et})};function UO({toast:t,onDismiss:s}){return y.useEffect(()=>{const o=setTimeout(()=>s(t.id),t.duration);return()=>clearTimeout(o)},[t.id,t.duration,s]),a.jsxs(Pt.div,{className:`${qr.toast} ${qr[t.variant]}`,role:"status",initial:{opacity:0,y:-16,scale:.94},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:-8,scale:.94},transition:{duration:.2,ease:"easeOut"},layout:!0,children:[a.jsx("span",{className:qr.icon,"aria-hidden":"true",children:PO[t.variant]}),a.jsx("span",{className:qr.message,children:t.message}),a.jsx("button",{type:"button",className:qr.close,onClick:()=>s(t.id),"aria-label":"Dismiss notification",children:a.jsx(Ls,{size:Ht,"aria-hidden":"true"})})]})}const VO="_container_qqse2_1",qO={container:VO};function GO({toasts:t,onDismiss:s}){return a.jsx("div",{className:qO.container,"data-testid":"toast-container",children:a.jsx(os,{children:t.map(o=>a.jsx(UO,{toast:o,onDismiss:s},o.id))})})}const FO="_callout_e5awm_1",KO="_success_e5awm_11",ZO="_icon_e5awm_15",YO="_error_e5awm_18",JO="_warning_e5awm_25",WO="_info_e5awm_32",XO="_content_e5awm_48",QO="_close_e5awm_53",Gr={callout:FO,success:KO,icon:ZO,error:YO,warning:JO,info:WO,content:XO,close:QO},eB={success:a.jsx(Ai,{size:Et}),error:a.jsx(Ls,{size:Et}),warning:a.jsx(Sm,{size:Et}),info:a.jsx(km,{size:Et})};function tB({variant:t="info",children:s,dismissible:o=!1,className:r}){const[c,d]=y.useState(!1);return a.jsx(a.Fragment,{children:!c&&a.jsxs("div",{className:[Gr.callout,Gr[t],r].filter(Boolean).join(" "),role:t==="error"||t==="warning"?"alert":"status",children:[a.jsx("span",{className:Gr.icon,"aria-hidden":"true",children:eB[t]}),a.jsx("span",{className:Gr.content,children:s}),o&&a.jsx("button",{type:"button",className:Gr.close,onClick:()=>d(!0),"aria-label":"Dismiss",children:a.jsx(Ls,{size:Ht,"aria-hidden":"true"})})]})})}function nB({currentVersion:t,latestVersion:s,updateAvailable:o,isDocker:r}){if(!o)return a.jsx(a.Fragment,{});const c=r?"docker pull ghcr.io/nick-pape/grackle:latest && docker restart grackle":`npm install -g @grackle-ai/cli@${s}`;return a.jsx("div",{"data-testid":"update-banner",children:a.jsxs(tB,{variant:"info",dismissible:!0,children:[a.jsxs("strong",{children:["Grackle v",s]})," is available (you have v",t,")."," ","Run: ",a.jsx("code",{children:c})]})})}const sB="_container_m1fsr_1",aB="_heading_m1fsr_7",iB="_section_m1fsr_14",oB="_sectionTitle_m1fsr_26",rB="_sectionDescription_m1fsr_35",lB="_emptyState_m1fsr_41",cB="_tokenList_m1fsr_48",dB="_tokenRow_m1fsr_55",uB="_tokenBadge_m1fsr_68",fB="_tokenName_m1fsr_83",pB="_tokenTarget_m1fsr_90",mB="_deleteButton_m1fsr_99",hB="_addForm_m1fsr_113",gB="_formRow_m1fsr_119",vB="_input_m1fsr_125",yB="_select_m1fsr_155",bB="_addButton_m1fsr_187",_B="_emptyStateInfo_m1fsr_221",xB="_themeOptions_m1fsr_229",kB="_themeOption_m1fsr_229",SB="_themeOptionSelected_m1fsr_254",jB="_themeOptionHeader_m1fsr_259",TB="_themeOptionLabel_m1fsr_266",NB="_themeOptionDesc_m1fsr_273",wB="_variantToggle_m1fsr_279",CB="_variantButton_m1fsr_286",EB="_variantActive_m1fsr_305",AB="_themeSwatches_m1fsr_311",DB="_themeSwatch_m1fsr_311",MB="_systemToggle_m1fsr_325",RB="_systemToggleHint_m1fsr_341",IB="_themeActive_m1fsr_348",OB="_aboutGrid_m1fsr_354",BB="_aboutItem_m1fsr_360",LB="_aboutLabel_m1fsr_373",zB="_aboutValue_m1fsr_379",$B="_aboutDot_m1fsr_387",HB="_aboutDotConnected_m1fsr_394",PB="_aboutDotDisconnected_m1fsr_398",UB="_aboutDotConnecting_m1fsr_402",fe={container:sB,heading:aB,section:iB,sectionTitle:oB,sectionDescription:rB,emptyState:lB,tokenList:cB,tokenRow:dB,tokenBadge:uB,tokenName:fB,tokenTarget:pB,deleteButton:mB,addForm:hB,formRow:gB,input:vB,select:yB,addButton:bB,emptyStateInfo:_B,themeOptions:xB,themeOption:kB,themeOptionSelected:SB,themeOptionHeader:jB,themeOptionLabel:TB,themeOptionDesc:NB,variantToggle:wB,variantButton:CB,variantActive:EB,themeSwatches:AB,themeSwatch:DB,systemToggle:MB,systemToggleHint:RB,themeActive:IB,aboutGrid:OB,aboutItem:BB,aboutLabel:LB,aboutValue:zB,aboutDot:$B,aboutDotConnected:HB,aboutDotDisconnected:PB,aboutDotConnecting:UB},VB=[{value:"env_var",label:"Environment Variable"},{value:"file",label:"File"}];function qB({tokens:t,onSetToken:s,onDeleteToken:o,onShowToast:r}){const[c,d]=y.useState(""),[u,p]=y.useState(""),[m,g]=y.useState("env_var"),[v,b]=y.useState(""),[_,k]=y.useState(null),S=N=>{if(N.preventDefault(),!c||!u)return;const C=m==="env_var"?v||c.toUpperCase()+"_TOKEN":"";s(c,u,m,C,m==="file"?v:""),r==null||r("Token saved successfully","success"),d(""),p(""),b("")},j=N=>{k(N)},T=()=>{_&&(o(_),r==null||r("Token deleted","info")),k(null)};return a.jsxs(a.Fragment,{children:[a.jsx(_s,{isOpen:_!==null,title:"Delete Token?",description:_?`"${_}" will be permanently removed.`:void 0,onConfirm:T,onCancel:()=>k(null)}),a.jsxs("section",{className:fe.section,children:[a.jsx("h3",{className:fe.sectionTitle,children:"Tokens"}),a.jsx("p",{className:fe.sectionDescription,children:"API tokens are auto-pushed to environments when set or updated. Values are write-only."}),t.length===0?a.jsx("div",{className:fe.emptyStateInfo,children:"Add your first API token to enable service integrations."}):a.jsx("div",{className:fe.tokenList,children:t.map(N=>a.jsxs("div",{className:fe.tokenRow,children:[a.jsx("span",{className:fe.tokenBadge,children:N.tokenType}),a.jsx("span",{className:fe.tokenName,children:N.name}),a.jsx("span",{className:fe.tokenTarget,children:N.tokenType==="env_var"?N.envVar:N.filePath}),a.jsx("button",{className:fe.deleteButton,onClick:()=>j(N.name),title:`Delete ${N.name}`,"aria-label":`Delete ${N.name}`,children:a.jsx(Ls,{size:Ht,"aria-hidden":"true"})})]},N.name))}),a.jsxs("form",{className:fe.addForm,onSubmit:S,children:[a.jsxs("div",{className:fe.formRow,children:[a.jsx("input",{className:fe.input,type:"text",placeholder:"Token name",value:c,onChange:N=>d(N.target.value)}),a.jsx("input",{className:fe.input,type:"password",placeholder:"Value",value:u,onChange:N=>p(N.target.value)})]}),a.jsxs("div",{className:fe.formRow,children:[a.jsx("select",{className:fe.select,value:m,onChange:N=>g(N.target.value),children:VB.map(N=>a.jsx("option",{value:N.value,children:N.label},N.value))}),a.jsx("input",{className:fe.input,type:"text",placeholder:m==="env_var"?"Env var name (e.g. API_TOKEN)":"File path (e.g. /home/user/.token)",value:v,onChange:N=>b(N.target.value)}),a.jsx("button",{className:fe.addButton,type:"submit",children:"Add Token"})]})]})]})]})}const Od=[{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"]}],ik=new Set(Od.map(t=>t.id)),a_="grackle";function pm(t){return Od.find(s=>s.id===t)}function GB({themeId:t,resolvedThemeId:s,onSetTheme:o,preferSystem:r,onSetPreferSystem:c}){return a.jsxs("section",{className:fe.section,children:[a.jsx("h3",{className:fe.sectionTitle,children:"Appearance"}),a.jsx("p",{className:fe.sectionDescription,children:"Choose how Grackle looks across the app."}),a.jsx("div",{className:fe.themeOptions,children:Od.filter(d=>!d.hidden).map(d=>{const u=!!(d.variantLightId&&d.variantDarkId),p=u?t===d.id||t===d.variantLightId||t===d.variantDarkId:t===d.id,m=u&&s===d.variantLightId;return a.jsxs("button",{type:"button",className:`${fe.themeOption} ${p?fe.themeOptionSelected:""}`,"aria-pressed":p,onClick:()=>o(d.id),children:[a.jsxs("span",{className:fe.themeOptionHeader,children:[a.jsxs("span",{children:[a.jsx("span",{className:fe.themeOptionLabel,children:d.label}),a.jsx("span",{className:fe.themeOptionDesc,children:d.description})]}),u&&a.jsxs("span",{className:fe.variantToggle,children:[a.jsx("span",{role:"button",tabIndex:0,className:`${fe.variantButton} ${p&&m?fe.variantActive:""}`,onClick:g=>{g.stopPropagation(),c(!1),o(d.variantLightId)},onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),g.stopPropagation(),c(!1),o(d.variantLightId))},"aria-label":"Light variant","aria-pressed":p&&m,children:"☼"}),a.jsx("span",{role:"button",tabIndex:0,className:`${fe.variantButton} ${p&&!m?fe.variantActive:""}`,onClick:g=>{g.stopPropagation(),c(!1),o(d.variantDarkId)},onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),g.stopPropagation(),c(!1),o(d.variantDarkId))},"aria-label":"Dark variant","aria-pressed":p&&!m,children:"☾"})]})]}),d.swatches&&a.jsx("span",{className:fe.themeSwatches,children:d.swatches.map((g,v)=>a.jsx("span",{className:fe.themeSwatch,style:{background:g}},v))})]},d.id)})}),a.jsxs("label",{className:fe.systemToggle,children:[a.jsx("input",{type:"checkbox",checked:r,onChange:d=>c(d.target.checked)}),a.jsx("span",{children:"Match system light/dark preference"})]}),a.jsx("p",{className:fe.systemToggleHint,children:"Automatically switches between light and dark variants when available."}),a.jsxs("p",{className:fe.themeActive,children:["Active theme: ",a.jsx("strong",{children:s})]})]})}const FB={connected:"Connected",connecting:"Connecting...",disconnected:"Disconnected"},KB={connected:fe.aboutDotConnected,connecting:fe.aboutDotConnecting,disconnected:fe.aboutDotDisconnected};function ZB({connectionStatus:t,environments:s,sessions:o}){const r=s.filter(u=>u.status==="connected").length,c=s.length,d=o.filter(u=>["running","idle"].includes(u.status)).length;return a.jsxs("section",{className:fe.section,"data-testid":"about-panel",children:[a.jsx("h3",{className:fe.sectionTitle,children:"About"}),a.jsx("p",{className:fe.sectionDescription,children:"Connection status and application information."}),a.jsxs("div",{className:fe.aboutGrid,children:[a.jsxs("div",{className:fe.aboutItem,children:[a.jsx("span",{className:fe.aboutLabel,children:"Connection"}),a.jsxs("span",{className:fe.aboutValue,children:[a.jsx("span",{className:`${fe.aboutDot} ${KB[t]}`}),FB[t]]})]}),a.jsxs("div",{className:fe.aboutItem,children:[a.jsx("span",{className:fe.aboutLabel,children:"Environments"}),a.jsxs("span",{className:fe.aboutValue,children:[r,"/",c," connected"]})]}),a.jsxs("div",{className:fe.aboutItem,children:[a.jsx("span",{className:fe.aboutLabel,children:"Active Sessions"}),a.jsx("span",{className:fe.aboutValue,children:d})]}),a.jsxs("div",{className:fe.aboutItem,children:[a.jsx("span",{className:fe.aboutLabel,children:"Version"}),a.jsx("span",{className:fe.aboutValue,children:"0.126.1"})]})]})]})}const YB="_container_cddyd_1",JB="_header_cddyd_8",WB="_headerTitle_cddyd_35",XB="_badge_cddyd_44",QB="_headerActions_cddyd_54",eL="_body_cddyd_61",tL="_formContent_cddyd_73",nL="_section_cddyd_85",sL="_label_cddyd_91",aL="_titleInput_cddyd_98",iL="_descriptionTextarea_cddyd_131",oL="_parentContext_cddyd_167",rL="_parentLabel_cddyd_175",lL="_parentName_cddyd_182",cL="_personaSelect_cddyd_186",dL="_depList_cddyd_220",uL="_depItem_cddyd_226",fL="_depItemSelected_cddyd_248",pL="_noDeps_cddyd_252",mL="_btnPrimary_cddyd_258",hL="_btnGhost_cddyd_289",Qe={container:YB,header:JB,headerTitle:WB,badge:XB,headerActions:QB,body:eL,formContent:tL,section:nL,label:sL,titleInput:aL,descriptionTextarea:iL,parentContext:oL,parentLabel:rL,parentName:lL,personaSelect:cL,depList:dL,depItem:uL,depItemSelected:fL,noDeps:pL,btnPrimary:mL,btnGhost:hL};function ok({mode:t,taskId:s,workspaceId:o,parentTaskId:r,environmentId:c,tasks:d,workspaces:u,personas:p,onCreateTask:m,onUpdateTask:g,onEditDone:v,onShowToast:b}){const _=xt(),k=t==="edit",S=k&&s?d.find(ke=>ke.id===s):void 0,j=k?(S==null?void 0:S.workspaceId)??"":o??"",[T,N]=y.useState(j),C=j||T,D=u.find(ke=>ke.id===C),A=c??(D==null?void 0:D.linkedEnvironmentIds[0]),E=!k&&!o,R=k?(S==null?void 0:S.parentTaskId)??"":r??"",O=R?d.find(ke=>ke.id===R):void 0,[M,$]=y.useState((S==null?void 0:S.title)??""),[Y,V]=y.useState((S==null?void 0:S.description)??""),[ne,le]=y.useState((S==null?void 0:S.dependsOn)??[]),[Z,se]=y.useState((S==null?void 0:S.defaultPersonaId)??""),[H,B]=y.useState((S==null?void 0:S.canDecompose)??!1),[F,ge]=y.useState((S==null?void 0:S.injectKnowledge)??!0),[ee,ce]=y.useState(!1),me=y.useRef(!1);y.useEffect(()=>{k&&S&&!me.current&&(me.current=!0,$(S.title),V(S.description),le(S.dependsOn),se(S.defaultPersonaId),B(S.canDecompose),ge(S.injectKnowledge))},[k,S]);const xe=d.filter(ke=>ke.workspaceId===C&&(!k||ke.id!==s)&&ke.id!==R),De=M.trim().length>0&&(!k||S!==void 0)&&C.length>0,ot=ke=>{le(ct=>ct.includes(ke)?ct.filter(ue=>ue!==ke):[...ct,ke])},bt=()=>{!De||ee||k&&S===void 0||(k&&s?(g(s,M.trim(),Y,ne,Z),b==null||b("Task updated","success"),v?v():_(ls(s,void 0,C,A),{replace:!0})):(ce(!0),m(C,M.trim(),Y,ne.length>0?ne:void 0,R||void 0,Z,H,F,()=>{b==null||b("Task created","success"),_(o?wi(o,A):"/tasks",{replace:!0})},ke=>{b==null||b(ke,"error"),ce(!1)})))},lt=()=>{if(v){v();return}_(k&&s?ls(s,void 0,C,A):o?wi(o,A):"/tasks")},Pe=k?"edit task":R?"child task":"new task";return a.jsxs("div",{className:Qe.container,children:[a.jsxs("div",{className:Qe.header,children:[a.jsxs("div",{className:Qe.headerTitle,children:[a.jsx("span",{className:Qe.badge,children:Pe}),O&&a.jsxs("span",{className:Qe.parentContext,children:[a.jsx("span",{className:Qe.parentLabel,children:"Child of"}),a.jsx("span",{className:Qe.parentName,children:O.title})]})]}),a.jsxs("div",{className:Qe.headerActions,children:[a.jsx("button",{onClick:bt,disabled:!De||ee,className:Qe.btnPrimary,"data-testid":"task-edit-save",children:ee?"Creating…":k?"Save Changes":"Create"}),a.jsx("button",{onClick:lt,className:Qe.btnGhost,children:"Cancel"})]})]}),a.jsx("div",{className:Qe.body,children:a.jsxs("div",{className:Qe.formContent,children:[E&&a.jsxs("div",{className:Qe.section,children:[a.jsx("label",{className:Qe.label,htmlFor:"task-edit-workspace",children:"Workspace"}),a.jsxs("select",{id:"task-edit-workspace",value:T,onChange:ke=>N(ke.target.value),className:Qe.personaSelect,"data-testid":"task-edit-workspace",children:[a.jsx("option",{value:"",children:"Select a workspace..."}),u.map(ke=>a.jsx("option",{value:ke.id,children:ke.name},ke.id))]})]}),a.jsxs("div",{className:Qe.section,children:[a.jsx("label",{className:Qe.label,htmlFor:"task-edit-title",children:"Title"}),a.jsx("input",{id:"task-edit-title",type:"text",value:M,onChange:ke=>$(ke.target.value),placeholder:"Task title...",autoFocus:!0,className:Qe.titleInput,"data-testid":"task-edit-title",onKeyDown:ke=>{ke.key==="Enter"&&De&&bt()}})]}),a.jsxs("div",{className:Qe.section,children:[a.jsx("label",{className:Qe.label,htmlFor:"task-edit-description",children:"Description"}),a.jsx("textarea",{id:"task-edit-description",value:Y,onChange:ke=>V(ke.target.value),placeholder:"Describe the task... (markdown supported)",className:Qe.descriptionTextarea,"data-testid":"task-edit-description",rows:8})]}),a.jsxs("div",{className:Qe.section,children:[a.jsx("label",{className:Qe.label,htmlFor:"task-edit-persona",children:"Default Persona"}),a.jsxs("select",{id:"task-edit-persona",value:Z,onChange:ke=>se(ke.target.value),className:Qe.personaSelect,"data-testid":"task-edit-persona",children:[a.jsx("option",{value:"",children:"(Inherit)"}),p.map(ke=>a.jsx("option",{value:ke.id,children:ke.name},ke.id))]})]}),!k&&a.jsx("div",{className:Qe.section,children:a.jsxs("label",{className:Qe.depItem,"data-testid":"task-edit-can-decompose",children:[a.jsx("input",{type:"checkbox",checked:H,onChange:ke=>B(ke.target.checked)}),"Can spawn subtasks"]})}),!k&&a.jsx("div",{className:Qe.section,children:a.jsxs("label",{className:Qe.depItem,"data-testid":"task-edit-inject-knowledge",children:[a.jsx("input",{type:"checkbox",checked:F,onChange:ke=>ge(ke.target.checked)}),"Inject related prior work from the knowledge graph"]})}),a.jsxs("div",{className:Qe.section,children:[a.jsx("div",{className:Qe.label,children:"Dependencies"}),xe.length===0?a.jsx("div",{className:Qe.noDeps,children:"No other tasks in this workspace"}):a.jsx("div",{className:Qe.depList,children:xe.map(ke=>{const ct=ne.includes(ke.id);return a.jsxs("label",{className:`${Qe.depItem} ${ct?Qe.depItemSelected:""}`,"data-testid":`dep-option-${ke.id}`,children:[a.jsx("input",{type:"checkbox",checked:ct,onChange:()=>ot(ke.id)}),ke.title,a.jsxs("span",{style:{opacity:.5,fontSize:"11px",marginLeft:"4px"},children:["(",ke.status,")"]})]},ke.id)})})]})]})})]})}const gL="_actionButtons_1rjka_1",vL="_btnPrimary_1rjka_8",yL="_btnDanger_1rjka_39",bL="_btnGhost_1rjka_78",Yt={actionButtons:gL,btnPrimary:vL,btnDanger:yL,btnGhost:bL};function _L({task:t,sessionId:s,isBlocked:o,onStart:r,onResume:c,onStop:d,onPause:u,onDelete:p,onEdit:m}){if(t.status==="not_started")return o?a.jsxs("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:[a.jsx("button",{onClick:m,className:Yt.btnGhost,"data-testid":"task-action-edit",children:"Edit"}),a.jsx("button",{onClick:p,className:Yt.btnDanger,"data-testid":"task-action-delete",children:"Delete"})]}):a.jsxs("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:[a.jsx("button",{"data-testid":"task-header-start",onClick:r,className:Yt.btnPrimary,children:"Start"}),a.jsx("button",{onClick:m,className:Yt.btnGhost,"data-testid":"task-action-edit",children:"Edit"}),a.jsx("button",{onClick:p,className:Yt.btnDanger,"data-testid":"task-action-delete",children:"Delete"})]});if(t.status==="working")return a.jsxs("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:[a.jsx("button",{onClick:d,className:Yt.btnDanger,"data-testid":"task-action-stop",children:"Stop"}),a.jsx("button",{onClick:u,disabled:!s,className:Yt.btnGhost,"data-testid":"task-action-pause",children:"Pause"})]});if(t.status==="paused")return a.jsxs("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:[a.jsx("button",{onClick:d,className:Yt.btnPrimary,"data-testid":"task-action-stop",children:"Stop"}),a.jsx("button",{onClick:c,className:Yt.btnGhost,"data-testid":"task-action-resume",children:"Resume"}),a.jsx("button",{onClick:p,className:Yt.btnDanger,"data-testid":"task-action-delete",children:"Delete"})]});if(t.status==="complete")return a.jsx("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:a.jsx("button",{onClick:p,className:Yt.btnDanger,"data-testid":"task-action-delete",children:"Delete"})});if(t.status==="failed")return a.jsxs("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:[a.jsx("button",{onClick:r,className:Yt.btnPrimary,"data-testid":"task-header-start",children:"Retry"}),a.jsx("button",{onClick:p,className:Yt.btnDanger,"data-testid":"task-action-delete",children:"Delete"})]})}const xL="_workpadSection_y8nj9_1",kL="_workpadLabel_y8nj9_9",SL="_workpadStatus_y8nj9_17",jL="_workpadSummary_y8nj9_23",TL="_workpadExtra_y8nj9_29",Va={workpadSection:xL,workpadLabel:kL,workpadStatus:SL,workpadSummary:jL,workpadExtra:TL};function NL({workpad:t}){if(!t)return;let s;try{const o=JSON.parse(t);if(o==null||typeof o!="object"||Array.isArray(o))return;s=o}catch{return a.jsxs("div",{className:Va.workpadSection,"data-testid":"workpad-panel",children:[a.jsx("div",{className:Va.workpadLabel,children:"Workpad"}),a.jsx("div",{className:Va.workpadExtra,children:t})]})}if(!(!s.status&&!s.summary&&!s.extra))return a.jsxs("div",{className:Va.workpadSection,"data-testid":"workpad-panel",children:[a.jsx("div",{className:Va.workpadLabel,children:"Workpad"}),s.status&&a.jsx("div",{className:Va.workpadStatus,"data-testid":"workpad-status",children:s.status}),s.summary&&a.jsx("div",{className:Va.workpadSummary,"data-testid":"workpad-summary",children:s.summary}),s.extra&&Object.keys(s.extra).length>0&&a.jsx("div",{className:Va.workpadExtra,"data-testid":"workpad-extra",children:JSON.stringify(s.extra,null,2)})]})}const wL="_overviewDashboard_r05qm_1",CL="_overviewHero_r05qm_7",EL="_statusBadge_r05qm_14",AL="_statusPending_r05qm_26",DL="_statusAssigned_r05qm_31",ML="_statusInProgress_r05qm_36",RL="_statusReview_r05qm_41",IL="_statusDone_r05qm_46",OL="_statusFailed_r05qm_51",BL="_statusWaitingInput_r05qm_56",LL="_overviewBranchPill_r05qm_61",zL="_branchLink_r05qm_76",$L="_overviewSection_r05qm_87",HL="_overviewLabel_r05qm_93",PL="_overviewValue_r05qm_100",UL="_overviewMuted_r05qm_105",VL="_overviewMarkdown_r05qm_111",qL="_envRow_r05qm_180",GL="_envDot_r05qm_186",FL="_envDotGreen_r05qm_193",KL="_envDotYellow_r05qm_197",ZL="_envDotRed_r05qm_201",YL="_envDotGray_r05qm_205",JL="_depList_r05qm_209",WL="_depItem_r05qm_215",XL="_depBlocked_r05qm_222",QL="_depDone_r05qm_226",e8="_timeline_r05qm_230",t8="_timelineRow_r05qm_236",n8="_timelineKey_r05qm_243",s8="_timelineValue_r05qm_249",a8="_timelineDelta_r05qm_253",i8="_reviewNotes_r05qm_264",be={overviewDashboard:wL,overviewHero:CL,statusBadge:EL,statusPending:AL,statusAssigned:DL,statusInProgress:ML,statusReview:RL,statusDone:IL,statusFailed:OL,statusWaitingInput:BL,overviewBranchPill:LL,branchLink:zL,overviewSection:$L,overviewLabel:HL,overviewValue:PL,overviewMuted:UL,overviewMarkdown:VL,envRow:qL,envDot:GL,envDotGreen:FL,envDotYellow:KL,envDotRed:ZL,envDotGray:YL,depList:JL,depItem:WL,depBlocked:XL,depDone:QL,timeline:e8,timelineRow:t8,timelineKey:n8,timelineValue:s8,timelineDelta:a8,reviewNotes:i8};function Gc(t){if(!t)return"—";const s=new Date(t);return isNaN(s.getTime())?"—":s.toLocaleString(void 0,{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"})}function Cp(t,s){if(!t||!s)return;const o=new Date(s).getTime()-new Date(t).getTime();if(isNaN(o)||o<0)return;const r=Math.floor(o/6e4),c=Math.floor(o%6e4/1e3);if(r===0)return`${c}s`;const d=Math.floor(r/60),u=r%60;return d===0?`${r}m ${c}s`:`${d}h ${u}m`}function i_(t){const s=t.toLowerCase();return s==="ready"||s==="running"||s==="available"||s==="connected"?be.envDotGreen:s==="provisioning"||s==="starting"||s==="pending"||s==="connecting"?be.envDotYellow:s==="error"||s==="failed"||s==="disconnected"?be.envDotRed:be.envDotGray}function o8({status:t}){const s=Ya(t),o=aN(t);return a.jsx("span",{className:`${be.statusBadge} ${be[o]??be.statusPending}`,"data-testid":"task-overview-status-badge",children:s.label})}function r8({task:t,tasksById:s,environments:o,workspaces:r,taskSessions:c,selectedEnvId:d,taskUsage:u,treeUsage:p}){const m=c.length>0?c[c.length-1]:void 0,g=(m==null?void 0:m.environmentId)??"",v=g?o.find(S=>S.id===g):void 0,b=r.find(S=>S.id===t.workspaceId),_=o.find(S=>S.id===d),k=t.branch&&(b!=null&&b.repoUrl)?`${b.repoUrl.replace(/\/$/,"")}/tree/${encodeURIComponent(t.branch)}`:void 0;return a.jsxs("div",{className:be.overviewDashboard,"data-testid":"task-overview-panel",children:[a.jsxs("div",{className:be.overviewHero,children:[a.jsx(o8,{status:t.status}),t.branch&&a.jsx("span",{className:be.overviewBranchPill,"data-testid":"task-overview-branch",children:k?a.jsxs("a",{href:k,target:"_blank",rel:"noreferrer noopener",className:be.branchLink,children:["🔗"," ",t.branch]}):a.jsxs("span",{children:["🔗"," ",t.branch]})})]}),typeof t.description=="string"&&t.description&&a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-description",children:[a.jsx("div",{className:be.overviewLabel,children:"Description"}),a.jsx("div",{className:be.overviewMarkdown,children:a.jsx(_m,{remarkPlugins:[xm],children:t.description})})]}),t.workpad&&a.jsx(NL,{workpad:t.workpad}),a.jsxs("div",{className:be.overviewSection,children:[a.jsx("div",{className:be.overviewLabel,children:"Environment"}),g&&v?a.jsxs("div",{className:be.envRow,"data-testid":"task-overview-environment",children:[a.jsx("span",{className:`${be.envDot} ${i_(v.status)}`,title:v.status,"aria-label":`Status: ${v.status}`,role:"img"}),a.jsx("span",{className:be.overviewValue,children:v.displayName})]}):_?a.jsxs("div",{className:be.envRow,"data-testid":"task-overview-environment",children:[a.jsx("span",{className:`${be.envDot} ${i_(_.status)}`,title:_.status,"aria-label":`Status: ${_.status}`,role:"img"}),a.jsx("span",{className:be.overviewValue,children:_.displayName}),a.jsx("span",{className:be.overviewMuted,children:"(workspace default)"})]}):a.jsx("div",{className:be.overviewMuted,children:"Set in workspace settings"})]}),a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-dependencies",children:[a.jsx("div",{className:be.overviewLabel,children:"Dependencies"}),t.dependsOn.length===0?a.jsx("div",{className:be.overviewMuted,children:"None"}):a.jsx("div",{className:be.depList,children:t.dependsOn.map(S=>{const j=s.get(S),T=(j==null?void 0:j.status)==="complete";return a.jsxs("div",{className:`${be.depItem} ${T?be.depDone:be.depBlocked}`,children:[a.jsx("span",{children:T?"✓":"○"}),a.jsx("span",{children:(j==null?void 0:j.title)??S})]},S)})})]}),a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-timeline",children:[a.jsx("div",{className:be.overviewLabel,children:"Timeline"}),a.jsxs("div",{className:be.timeline,children:[t.createdAt&&a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Created"}),a.jsx("span",{className:be.timelineValue,children:Gc(t.createdAt)})]}),t.assignedAt&&(()=>{const S=Cp(t.createdAt,t.assignedAt);return a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Assigned"}),a.jsx("span",{className:be.timelineValue,children:Gc(t.assignedAt)}),S!==void 0&&a.jsx("span",{className:be.timelineDelta,children:S})]})})(),t.startedAt&&(()=>{const S=Cp(t.assignedAt??t.createdAt,t.startedAt);return a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Started"}),a.jsx("span",{className:be.timelineValue,children:Gc(t.startedAt)}),S!==void 0&&a.jsx("span",{className:be.timelineDelta,children:S})]})})(),t.completedAt&&(()=>{const S=Cp(t.startedAt,t.completedAt);return a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Completed"}),a.jsx("span",{className:be.timelineValue,children:Gc(t.completedAt)}),S!==void 0&&a.jsx("span",{className:be.timelineDelta,children:S})]})})(),!t.createdAt&&!t.assignedAt&&!t.startedAt&&!t.completedAt&&a.jsx("div",{className:be.overviewMuted,children:"No timing data"})]})]}),u&&u.costMillicents>0&&a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-usage",children:[a.jsx("div",{className:be.overviewLabel,children:"Usage"}),a.jsxs("div",{className:be.timeline,children:[a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Cost"}),a.jsx("span",{className:be.timelineValue,children:Rs(u.costMillicents)}),a.jsxs("span",{className:be.timelineDelta,children:[u.sessionCount," session",u.sessionCount!==1?"s":""]})]}),p&&p.costMillicents>u.costMillicents&&a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Total (incl. subtasks)"}),a.jsx("span",{className:be.timelineValue,children:Rs(p.costMillicents)}),a.jsxs("span",{className:be.timelineDelta,children:[p.sessionCount," session",p.sessionCount!==1?"s":""]})]})]})]}),(t.tokenBudget>0||t.costBudgetMillicents>0)&&a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-budget",children:[a.jsx("div",{className:be.overviewLabel,children:"Budget"}),a.jsxs("div",{className:be.timeline,children:[t.tokenBudget>0&&a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Tokens"}),a.jsxs("span",{className:be.timelineValue,children:[Ho(((u==null?void 0:u.inputTokens)??0)+((u==null?void 0:u.outputTokens)??0))," / ",Ho(t.tokenBudget)]})]}),t.costBudgetMillicents>0&&a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Cost"}),a.jsxs("span",{className:be.timelineValue,children:[Rs((u==null?void 0:u.costMillicents)??0)," / ",Rs(t.costBudgetMillicents)]})]})]})]}),t.reviewNotes&&a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-review-notes",children:[a.jsx("div",{className:be.overviewLabel,children:"Review Notes"}),a.jsx("div",{className:be.reviewNotes,children:t.reviewNotes})]})]})}function l8({plugins:t,loading:s,onSetPluginEnabled:o}){return a.jsxs("div",{className:fe.container,"data-testid":"plugins-panel",children:[a.jsx("h2",{className:fe.heading,children:"Plugins"}),a.jsxs("div",{className:fe.section,children:[a.jsx("p",{className:fe.sectionDescription,children:"Enable or disable optional Grackle plugins. A server restart is required for changes to take effect."}),s&&a.jsx("p",{className:fe.emptyState,children:"Loading plugins..."}),!s&&t.length===0&&a.jsx("p",{className:fe.emptyState,children:"No plugins found."}),!s&&t.map(r=>{const c=r.enabled!==r.loaded;return a.jsxs("div",{className:fe.tokenRow,"data-testid":`plugin-row-${r.name}`,children:[a.jsxs("div",{style:{flex:1},children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[a.jsx("span",{className:fe.tokenName,children:r.name}),r.required&&a.jsx("span",{className:fe.tokenBadge,title:"Required — cannot be disabled",children:"required"})]}),a.jsx("div",{className:fe.tokenTarget,children:r.description}),c&&a.jsx("div",{style:{fontSize:"var(--font-size-xs)",color:"var(--accent-yellow)",marginTop:"2px"},"data-testid":`plugin-restart-notice-${r.name}`,children:"Restart Grackle to apply changes"})]}),a.jsx("label",{style:{display:"flex",alignItems:"center",gap:"6px",cursor:r.required?"not-allowed":"pointer"},title:r.required?"Core is required and cannot be disabled":void 0,children:a.jsx("input",{type:"checkbox",checked:r.enabled,disabled:r.required,onChange:d=>o(r.name,d.target.checked),"data-testid":`plugin-toggle-${r.name}`,"aria-label":`Enable or disable ${r.name} plugin`,style:{accentColor:"var(--accent-green)",width:"16px",height:"16px"}})})]},r.name)})]})]})}function c8({githubAccounts:t,githubAccountsLoading:s,onAddGitHubAccount:o,onUpdateGitHubAccount:r,onRemoveGitHubAccount:c,onImportGitHubAccounts:d,onShowToast:u}){const[p,m]=y.useState(""),[g,v]=y.useState(""),[b,_]=y.useState(!1),[k,S]=y.useState(!1),[j,T]=y.useState(!1),[N,C]=y.useState(null),D=t.find(M=>M.id===N),A=async M=>{if(M.preventDefault(),!(!p.trim()||!g.trim())){S(!0);try{await o(p.trim(),g.trim(),"",b),u==null||u("GitHub account added","success"),m(""),v(""),_(!1)}catch($){const Y=$ instanceof Error?$.message:"Failed to add account";u==null||u(Y,"error")}finally{S(!1)}}},E=async M=>{try{await r(M,{isDefault:!0}),u==null||u("Default account updated","success")}catch($){const Y=$ instanceof Error?$.message:"Failed to update account";u==null||u(Y,"error")}},R=async()=>{if(N)try{await c(N),u==null||u("GitHub account removed","info")}catch(M){const $=M instanceof Error?M.message:"Failed to remove account";u==null||u($,"error")}finally{C(null)}},O=async()=>{T(!0);try{const M=await d();M.imported>0?u==null||u(`Imported ${M.imported} account(s): ${M.usernames.join(", ")}`,"success"):u==null||u("No new accounts to import","info")}catch(M){const $=M instanceof Error?M.message:"Import failed";u==null||u($,"error")}finally{T(!1)}};return a.jsxs(a.Fragment,{children:[a.jsx(_s,{isOpen:N!==null,title:"Remove GitHub Account?",description:D?`"${D.label}"${D.username?` (@${D.username})`:""} will be permanently removed.`:void 0,onConfirm:()=>{R().catch(()=>{})},onCancel:()=>C(null)}),a.jsxs("section",{className:fe.section,"data-testid":"github-accounts-panel",children:[a.jsx("h3",{className:fe.sectionTitle,children:"GitHub Accounts"}),a.jsx("p",{className:fe.sectionDescription,children:"Register multiple GitHub accounts to use different identities per environment. The default account is used when no specific account is assigned."}),s&&t.length===0?a.jsx("div",{className:fe.emptyState,children:"Loading..."}):t.length===0?a.jsx("div",{className:fe.emptyStateInfo,children:"No GitHub accounts registered. Add one below or import from the gh CLI."}):a.jsx("div",{className:fe.tokenList,children:t.map(M=>a.jsxs("div",{className:fe.tokenRow,"data-testid":`github-account-row-${M.id}`,children:[M.isDefault&&a.jsx("span",{className:fe.tokenBadge,title:"Default account",children:"default"}),a.jsx("span",{className:fe.tokenName,children:M.label}),M.username&&a.jsxs("span",{className:fe.tokenTarget,children:["@",M.username]}),!M.isDefault&&a.jsx("button",{className:fe.deleteButton,onClick:()=>{E(M.id).catch(()=>{})},title:"Set as default","aria-label":`Set ${M.label} as default`,"data-testid":`github-account-set-default-${M.id}`,children:a.jsx(XT,{size:Ht,"aria-hidden":"true"})}),a.jsx("button",{className:fe.deleteButton,onClick:()=>C(M.id),title:`Remove ${M.label}`,"aria-label":`Remove ${M.label}`,"data-testid":`github-account-remove-${M.id}`,children:a.jsx(Ls,{size:Ht,"aria-hidden":"true"})})]},M.id))}),a.jsxs("form",{className:fe.addForm,onSubmit:M=>{A(M).catch(()=>{})},children:[a.jsxs("div",{className:fe.formRow,children:[a.jsx("input",{className:fe.input,type:"text",placeholder:"Label (e.g. personal, work)",value:p,onChange:M=>m(M.target.value),"data-testid":"github-account-label-input"}),a.jsx("input",{className:fe.input,type:"password",placeholder:"Personal access token",value:g,onChange:M=>v(M.target.value),"data-testid":"github-account-token-input"})]}),a.jsxs("div",{className:fe.formRow,children:[a.jsxs("label",{className:fe.tokenTarget,style:{display:"flex",alignItems:"center",gap:"6px",cursor:"pointer"},children:[a.jsx("input",{type:"checkbox",checked:b,onChange:M=>_(M.target.checked),"data-testid":"github-account-default-checkbox"}),"Set as default"]}),a.jsx("button",{className:fe.addButton,type:"submit",disabled:!p.trim()||!g.trim()||k,"data-testid":"github-account-add-button",children:k?"Adding...":"Add Account"}),a.jsx("button",{className:fe.addButton,type:"button",onClick:()=>{O().catch(()=>{})},disabled:j,"data-testid":"github-account-import-button",children:j?"Importing...":"Import from gh CLI"})]})]})]})]})}const d8="_container_legrg_1",u8="_header_legrg_8",f8="_headerTitle_legrg_35",p8="_badge_legrg_44",m8="_headerActions_legrg_54",h8="_body_legrg_61",g8="_formContent_legrg_73",v8="_section_legrg_85",y8="_label_legrg_91",b8="_nameInput_legrg_98",_8="_fieldInput_legrg_131",x8="_adapterSelect_legrg_164",k8="_readOnlyValue_legrg_198",S8="_codespaceSection_legrg_204",j8="_codespaceActions_legrg_210",T8="_creatingHint_legrg_216",N8="_errorHint_legrg_222",w8="_btnPrimary_legrg_235",C8="_btnGhost_legrg_266",oe={container:d8,header:u8,headerTitle:f8,badge:p8,headerActions:m8,body:h8,formContent:g8,section:v8,label:y8,nameInput:b8,fieldInput:_8,adapterSelect:x8,readOnlyValue:k8,codespaceSection:S8,codespaceActions:j8,creatingHint:T8,errorHint:N8,btnPrimary:w8,btnGhost:C8},id=1,od=65535;function Ep(t){if(!t.trim())return!0;const s=Number(t);return Number.isInteger(s)&&s>=id&&s<=od}function Ap(t){try{const s=JSON.parse(t);if(typeof s=="object"&&s!==null&&!Array.isArray(s))return s}catch{}return{}}function E8({codespaceName:t,onCodespaceNameChange:s,envName:o,onEnvNameChange:r,codespaces:c,codespaceError:d,codespaceListError:u,codespaceCreating:p,onCreateCodespace:m}){const[g,v]=y.useState("pick"),[b,_]=y.useState(""),[k,S]=y.useState("");return g==="create"?a.jsxs("div",{className:oe.codespaceSection,children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Repository"}),a.jsx("input",{type:"text",value:b,onChange:j=>_(j.target.value),placeholder:"owner/repo",className:oe.fieldInput,"data-testid":"env-codespace-repo"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Machine Type"}),a.jsx("input",{type:"text",value:k,onChange:j=>S(j.target.value),placeholder:"Machine type (optional)...",className:oe.fieldInput,"data-testid":"env-codespace-machine"})]}),a.jsxs("div",{className:oe.codespaceActions,children:[a.jsx("button",{onClick:()=>{b.trim()&&(m(b.trim(),k.trim()||void 0),v("pick"),_(""),S(""))},disabled:!b.trim(),className:oe.btnPrimary,children:"Create"}),a.jsx("button",{onClick:()=>{v("pick"),_(""),S("")},className:oe.btnGhost,children:"Cancel"})]})]}):a.jsx("div",{className:oe.codespaceSection,children:a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Codespace"}),!u&&a.jsxs("select",{value:t,onChange:j=>{j.target.value==="__create__"?(v("create"),s("")):(s(j.target.value),j.target.value&&!o.trim()&&r(j.target.value))},disabled:p,className:oe.adapterSelect,"data-testid":"env-codespace-select",children:[a.jsx("option",{value:"",children:"Select a codespace..."}),c.map(j=>a.jsxs("option",{value:j.name,children:[j.name," (",j.repository,") — ",j.state]},j.name)),a.jsx("option",{value:"__create__",children:"Create new from repo..."})]}),p&&a.jsx("span",{className:oe.creatingHint,children:"Creating codespace..."}),u&&a.jsxs(a.Fragment,{children:[a.jsx("span",{className:oe.errorHint,children:u}),a.jsx("input",{type:"text",value:t,onChange:j=>s(j.target.value),placeholder:"Or enter codespace name manually...",className:oe.fieldInput,"data-testid":"env-codespace-manual"})]}),d&&!u&&a.jsx("span",{className:oe.errorHint,children:d})]})})}function rk({mode:t,environmentId:s,environments:o,githubAccounts:r,onAddEnvironment:c,onUpdateEnvironment:d,onListCodespaces:u,codespaces:p,codespaceError:m,codespaceListError:g,codespaceCreating:v,onCreateCodespace:b,onListDockerContainers:_,dockerContainers:k,dockerContainersError:S,onShowToast:j}){const T=xt(),N=t==="edit",C=N&&s?o.find(re=>re.id===s):void 0,[D,A]=y.useState(""),[E,R]=y.useState("local"),[O,M]=y.useState(""),[$,Y]=y.useState(""),[V,ne]=y.useState(""),[le,Z]=y.useState(""),[se,H]=y.useState(""),[B,F]=y.useState(""),[ge,ee]=y.useState(""),[ce,me]=y.useState(""),[xe,De]=y.useState("create"),[ot,bt]=y.useState(""),[lt,Pe]=y.useState(null),ke=y.useCallback(()=>{const re={};if(E==="local"){if(O.trim()&&(re.host=O.trim()),$.trim()){const ve=Number($);Number.isInteger(ve)&&(re.port=ve)}}else if(E==="ssh"){if(re.host=O.trim(),V.trim()&&(re.user=V.trim()),$.trim()){const ve=Number($);Number.isInteger(ve)&&(re.sshPort=ve)}le.trim()&&(re.identityFile=le.trim())}else E==="docker"?xe==="attach"?ot.trim()&&(re.attach=ot.trim()):(se.trim()&&(re.image=se.trim()),B.trim()&&(re.repo=B.trim())):E==="codespace"&&(re.codespaceName=ge.trim());return re},[E,O,$,V,le,se,B,ge,xe,ot]),ct=()=>!(!D.trim()||E==="ssh"&&!O.trim()||E==="codespace"&&!ge.trim()||E==="docker"&&xe==="attach"&&!ot.trim()||(E==="local"||E==="ssh")&&!Ep($)),ue=()=>{ct()&&(c(D.trim(),E,ke(),ce||void 0),j==null||j("Environment added successfully","success"),T(zo,{replace:!0}))},Re=()=>{T(s?$o(s):zo)},Q=y.useCallback((re,ve)=>{if(!C||!s)return;const et=Ap(C.adapterConfig),an=ve.trim();an?et[re]=an:delete et[re],d(s,{adapterConfig:et})},[C,s,d]),nt=y.useCallback((re,ve)=>{if(!C||!s)return;const et=Ap(C.adapterConfig);if(ve.trim()){const an=Number(ve);Number.isInteger(an)&&an>=id&&an<=od&&(et[re]=an)}else delete et[re];d(s,{adapterConfig:et})},[C,s,d]);if(N){if(!C)return a.jsxs("div",{className:oe.container,children:[a.jsxs("div",{className:oe.header,children:[a.jsx("div",{className:oe.headerTitle,children:a.jsx("span",{className:oe.badge,children:"edit environment"})}),a.jsx("div",{className:oe.headerActions,children:a.jsx("button",{onClick:Re,className:oe.btnGhost,children:"Back"})})]}),a.jsx("div",{className:oe.body,children:a.jsx("div",{className:oe.formContent,children:a.jsx("span",{className:oe.readOnlyValue,children:"Environment not found"})})})]});const re=Ap(C.adapterConfig);return a.jsxs("div",{className:oe.container,"data-testid":"env-edit-panel",children:[a.jsxs("div",{className:oe.header,children:[a.jsx("div",{className:oe.headerTitle,children:a.jsx("span",{className:oe.badge,children:"edit environment"})}),a.jsx("div",{className:oe.headerActions,children:a.jsx("button",{onClick:Re,className:oe.btnGhost,"data-testid":"env-edit-back",children:"Back"})})]}),a.jsx("div",{className:oe.body,children:a.jsxs("div",{className:oe.formContent,children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Name"}),a.jsx(zt,{value:C.displayName,onSave:ve=>{s&&d(s,{displayName:ve})},validate:ve=>ve.trim()===""?"Name cannot be empty":void 0,mode:"edit",fieldId:"name",activeFieldId:lt,onActivate:Pe,placeholder:"Environment name",ariaLabel:"Environment name","data-testid":"env-edit-name"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Adapter Type"}),a.jsx("span",{className:oe.readOnlyValue,"data-testid":"env-edit-adapter-type",children:C.adapterType})]}),(C.adapterType==="codespace"||C.adapterType==="docker")&&(r.length>0||!!C.githubAccountId)&&a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"GitHub Account"}),a.jsxs("select",{value:C.githubAccountId||"",onChange:ve=>{s&&d(s,{githubAccountId:ve.target.value})},className:oe.adapterSelect,"data-testid":"env-edit-github-account",children:[a.jsx("option",{value:"",children:"(Default)"}),r.map(ve=>a.jsxs("option",{value:ve.id,children:[ve.label,ve.username?` (@${ve.username})`:"",ve.isDefault?" — default":""]},ve.id))]})]}),C.adapterType==="local"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Host"}),a.jsx(zt,{value:String(re.host??""),onSave:ve=>Q("host",ve),mode:"edit",fieldId:"host",activeFieldId:lt,onActivate:Pe,placeholder:"(default)",ariaLabel:"Host","data-testid":"env-edit-host"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Port"}),a.jsx(zt,{value:String(re.port??""),onSave:ve=>nt("port",ve),validate:ve=>Ep(ve)?void 0:"Port must be 1-65535",mode:"edit",fieldId:"port",activeFieldId:lt,onActivate:Pe,placeholder:"(default)",ariaLabel:"Port","data-testid":"env-edit-port"})]})]}),C.adapterType==="ssh"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Host"}),a.jsx(zt,{value:String(re.host??""),onSave:ve=>Q("host",ve),validate:ve=>ve.trim()===""?"Host is required":void 0,mode:"edit",fieldId:"host",activeFieldId:lt,onActivate:Pe,placeholder:"hostname or IP",ariaLabel:"Host","data-testid":"env-edit-host"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"User"}),a.jsx(zt,{value:String(re.user??""),onSave:ve=>Q("user",ve),mode:"edit",fieldId:"user",activeFieldId:lt,onActivate:Pe,placeholder:"(default)",ariaLabel:"User","data-testid":"env-edit-user"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"SSH Port"}),a.jsx(zt,{value:String(re.sshPort??""),onSave:ve=>nt("sshPort",ve),validate:ve=>Ep(ve)?void 0:"Port must be 1-65535",mode:"edit",fieldId:"sshPort",activeFieldId:lt,onActivate:Pe,placeholder:"22",ariaLabel:"SSH Port","data-testid":"env-edit-ssh-port"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Identity File"}),a.jsx(zt,{value:String(re.identityFile??""),onSave:ve=>Q("identityFile",ve),mode:"edit",fieldId:"identityFile",activeFieldId:lt,onActivate:Pe,placeholder:"~/.ssh/id_rsa",ariaLabel:"Identity File","data-testid":"env-edit-identity-file"})]})]}),C.adapterType==="docker"&&re.attach!==void 0&&a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Attach (container)"}),a.jsx(zt,{value:String(re.attach??""),onSave:ve=>Q("attach",ve),validate:ve=>ve.trim()===""?"Container name is required":void 0,mode:"edit",fieldId:"attach",activeFieldId:lt,onActivate:Pe,placeholder:"container name or ID",ariaLabel:"Attach container","data-testid":"env-edit-attach"})]}),C.adapterType==="docker"&&re.attach===void 0&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Image"}),a.jsx(zt,{value:String(re.image??""),onSave:ve=>Q("image",ve),mode:"edit",fieldId:"image",activeFieldId:lt,onActivate:Pe,placeholder:"(default)",ariaLabel:"Image","data-testid":"env-edit-image"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Repo"}),a.jsx(zt,{value:String(re.repo??""),onSave:ve=>Q("repo",ve),mode:"edit",fieldId:"repo",activeFieldId:lt,onActivate:Pe,placeholder:"(none)",ariaLabel:"Repo","data-testid":"env-edit-repo"})]})]}),C.adapterType==="codespace"&&a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Codespace Name"}),a.jsx(zt,{value:String(re.codespaceName??""),onSave:ve=>Q("codespaceName",ve),validate:ve=>ve.trim()===""?"Codespace name is required":void 0,mode:"edit",fieldId:"codespaceName",activeFieldId:lt,onActivate:Pe,placeholder:"codespace-name",ariaLabel:"Codespace Name","data-testid":"env-edit-codespace-name"})]})]})})]})}return a.jsxs("div",{className:oe.container,"data-testid":"env-create-panel",children:[a.jsxs("div",{className:oe.header,children:[a.jsx("div",{className:oe.headerTitle,children:a.jsx("span",{className:oe.badge,children:"new environment"})}),a.jsxs("div",{className:oe.headerActions,children:[a.jsx("button",{onClick:ue,disabled:!ct(),className:oe.btnPrimary,"data-testid":"env-create-submit",children:"Create"}),a.jsx("button",{onClick:Re,className:oe.btnGhost,children:"Cancel"})]})]}),a.jsx("div",{className:oe.body,children:a.jsxs("div",{className:oe.formContent,children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-name",children:"Name"}),a.jsx("input",{id:"env-create-name",type:"text",value:D,onChange:re=>A(re.target.value),placeholder:"Environment name...",autoFocus:!0,className:oe.nameInput,"data-testid":"env-create-name",onKeyDown:re=>{re.key==="Enter"&&ct()&&ue()}})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-adapter",children:"Adapter Type"}),a.jsxs("select",{id:"env-create-adapter",value:E,onChange:re=>{R(re.target.value),re.target.value==="codespace"&&u(ce||void 0)},className:oe.adapterSelect,"data-testid":"env-create-adapter",children:[a.jsx("option",{value:"local",children:"local"}),a.jsx("option",{value:"ssh",children:"ssh"}),a.jsx("option",{value:"docker",children:"docker"}),a.jsx("option",{value:"codespace",children:"codespace"})]})]}),(E==="codespace"||E==="docker")&&r.length>0&&a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-github-account",children:"GitHub Account"}),a.jsxs("select",{id:"env-create-github-account",value:ce,onChange:re=>{me(re.target.value),E==="codespace"&&u(re.target.value||void 0)},className:oe.adapterSelect,"data-testid":"env-create-github-account",children:[a.jsx("option",{value:"",children:"(Default)"}),r.map(re=>a.jsxs("option",{value:re.id,children:[re.label," (@",re.username,")",re.isDefault?" — default":""]},re.id))]})]}),E==="local"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-host",children:"Host"}),a.jsx("input",{id:"env-create-host",type:"text",value:O,onChange:re=>M(re.target.value),placeholder:"Host (optional)...",className:oe.fieldInput,"data-testid":"env-create-host"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-port",children:"Port"}),a.jsx("input",{id:"env-create-port",type:"number",min:id,max:od,value:$,onChange:re=>Y(re.target.value),placeholder:"Port (optional)...",className:oe.fieldInput,"data-testid":"env-create-port"})]})]}),E==="ssh"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-host",children:"Host"}),a.jsx("input",{id:"env-create-host",type:"text",value:O,onChange:re=>M(re.target.value),placeholder:"Host (required)...",className:oe.fieldInput,"data-testid":"env-create-host"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-user",children:"User"}),a.jsx("input",{id:"env-create-user",type:"text",value:V,onChange:re=>ne(re.target.value),placeholder:"User (optional)...",className:oe.fieldInput,"data-testid":"env-create-user"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-port",children:"SSH Port"}),a.jsx("input",{id:"env-create-port",type:"number",min:id,max:od,value:$,onChange:re=>Y(re.target.value),placeholder:"SSH port (optional)...",className:oe.fieldInput,"data-testid":"env-create-port"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-identity",children:"Identity File"}),a.jsx("input",{id:"env-create-identity",type:"text",value:le,onChange:re=>Z(re.target.value),placeholder:"Identity file (optional)...",className:oe.fieldInput,"data-testid":"env-create-identity"})]})]}),E==="docker"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-docker-mode",children:"Source"}),a.jsxs("select",{id:"env-docker-mode",value:xe,onChange:re=>{const ve=re.target.value;De(ve),ve==="attach"&&_()},className:oe.adapterSelect,"data-testid":"env-docker-mode",children:[a.jsx("option",{value:"create",children:"Create new container"}),a.jsx("option",{value:"attach",children:"Attach to existing container"})]})]}),xe==="create"?a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-image",children:"Image"}),a.jsx("input",{id:"env-create-image",type:"text",value:se,onChange:re=>H(re.target.value),placeholder:"Image (optional)...",className:oe.fieldInput,"data-testid":"env-create-image"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-repo",children:"Repo"}),a.jsx("input",{id:"env-create-repo",type:"text",value:B,onChange:re=>F(re.target.value),placeholder:"Repo (optional)...",className:oe.fieldInput,"data-testid":"env-create-repo"})]})]}):a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Container"}),!S&&k.length>0&&a.jsxs("select",{value:ot,onChange:re=>{bt(re.target.value),re.target.value&&!D.trim()&&A(re.target.value)},className:oe.adapterSelect,"data-testid":"env-docker-container-select",children:[a.jsx("option",{value:"",children:"Select a container..."}),k.map(re=>a.jsxs("option",{value:re.name,children:[re.name," (",re.image,") ",re.status]},re.id))]}),(S||k.length===0)&&a.jsxs(a.Fragment,{children:[S?a.jsx("span",{className:oe.errorHint,children:S}):a.jsx("span",{className:oe.creatingHint,children:"No running containers found."}),a.jsx("input",{type:"text",value:ot,onChange:re=>{bt(re.target.value),re.target.value&&!D.trim()&&A(re.target.value)},placeholder:"Enter container name/ID...",className:oe.fieldInput,"data-testid":"env-docker-container-manual"})]})]})]}),E==="codespace"&&a.jsx(E8,{codespaceName:ge,onCodespaceNameChange:ee,envName:D,onEnvNameChange:A,codespaces:p,codespaceError:m,codespaceListError:g,codespaceCreating:v,onCreateCodespace:b})]})})]})}const A8="_group_1iprv_1",D8="_groupTitle_1iprv_8",M8="_shortcutList_1iprv_17",R8="_shortcutRow_1iprv_23",I8="_keys_1iprv_36",O8="_kbd_1iprv_43",B8="_description_1iprv_60",_i={group:A8,groupTitle:D8,shortcutList:M8,shortcutRow:R8,keys:I8,kbd:O8,description:B8},L8=[{title:"Global",shortcuts:[{keys:["?"],description:"Open keyboard shortcuts reference"},{keys:["N"],description:"Create a new task"},{keys:["Escape"],description:"Close dialog or cancel editing"}]},{title:"Task Page",shortcuts:[{keys:["1"],description:"Switch to Overview tab"},{keys:["2"],description:"Switch to Stream tab"}]},{title:"Workspace Page",shortcuts:[{keys:["1"],description:"Switch to Graph view"},{keys:["2"],description:"Switch to Board view"},{keys:["3"],description:"Switch to Tasks view"}]},{title:"Navigation Lists",shortcuts:[{keys:["←"],description:"Previous tab (horizontal nav)"},{keys:["→"],description:"Next tab (horizontal nav)"},{keys:["↑"],description:"Previous item (vertical nav)"},{keys:["↓"],description:"Next item (vertical nav)"},{keys:["J"],description:"Next item (alias for arrow down/right)"},{keys:["K"],description:"Previous item (alias for arrow up/left)"},{keys:["Home"],description:"Jump to first item"},{keys:["End"],description:"Jump to last item"}]},{title:"Editing",shortcuts:[{keys:["Enter"],description:"Activate / save inline edit"},{keys:["Space"],description:"Activate button or start editing"},{keys:["Escape"],description:"Cancel edit and discard changes"}]},{title:"Root",shortcuts:[{keys:["Ctrl/Cmd","Enter"],description:"Send message (when the composer is focused)"},{keys:["Enter"],description:"Insert a new line in the message composer"}]}];function z8(){return a.jsxs("section",{className:fe.section,"data-testid":"keyboard-shortcuts-panel",children:[a.jsx("h3",{className:fe.sectionTitle,children:"Keyboard Shortcuts"}),a.jsx("p",{className:fe.sectionDescription,children:"Keyboard shortcuts for navigating and interacting with Grackle. Global shortcuts are suppressed while typing in text fields."}),L8.map(t=>a.jsxs("div",{className:_i.group,children:[a.jsx("h4",{className:_i.groupTitle,children:t.title}),a.jsx("div",{className:_i.shortcutList,children:t.shortcuts.map(s=>a.jsxs("div",{className:_i.shortcutRow,children:[a.jsx("span",{className:_i.keys,children:s.keys.map(o=>a.jsx("kbd",{className:_i.kbd,children:o},o))}),a.jsx("span",{className:_i.description,children:s.description})]},s.description))})]},t.title))]})}const $8=[{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 H8({credentialProviders:t,onUpdateCredentialProviders:s}){const o=(r,c)=>{const d={...t};r==="claude"?d.claude=c:d[r]=c,s(d)};return a.jsxs("section",{className:fe.section,children:[a.jsx("h3",{className:fe.sectionTitle,children:"Credential Providers"}),a.jsx("p",{className:fe.sectionDescription,children:"Enable providers to automatically forward credentials to environments at task start. Credentials are read fresh from the host each time."}),a.jsx("div",{className:fe.tokenList,children:$8.map(r=>a.jsxs("div",{className:fe.tokenRow,children:[a.jsx("span",{className:fe.tokenName,children:r.label}),a.jsx("span",{className:fe.tokenTarget,children:r.description}),a.jsx("select",{className:fe.select,value:t[r.key],onChange:c=>o(r.key,c.target.value),children:r.options.map(c=>a.jsx("option",{value:c.value,children:c.label},c.value))})]},r.key))})]})}const P8="_container_10efq_1",U8="_header_10efq_7",V8="_list_10efq_105",q8="_card_10efq_111",G8="_cardHeader_10efq_125",F8="_cardTitle_10efq_135",K8="_defaultBadge_10efq_141",Z8="_cardActions_10efq_155",Y8="_description_10efq_160",J8="_meta_10efq_166",W8="_empty_10efq_212",X8="_typeBadge_10efq_362",ts={container:P8,header:U8,list:V8,card:q8,cardHeader:G8,cardTitle:F8,defaultBadge:K8,cardActions:Z8,description:Y8,meta:J8,empty:W8,typeBadge:X8};function Q8({personas:t,appDefaultPersonaId:s,onDeletePersona:o,onSetAppDefaultPersonaId:r,onNavigateToNew:c,onNavigateToPersona:d}){const[u,p]=y.useState(null),m=u?t.find(v=>v.id===u):void 0,g=async v=>{await o(v),p(null)};return a.jsxs("div",{className:ts.container,children:[a.jsxs("div",{className:ts.header,children:[a.jsx("h2",{children:"Personas"}),a.jsx(sn,{variant:"primary",size:"md",onClick:c,"data-testid":"persona-new-button",children:"+ New Persona"})]}),t.length===0?a.jsx("p",{className:ts.empty,children:"No personas yet. Create one to get started."}):a.jsx("div",{className:ts.list,children:t.map(v=>{const b=s===v.id,_=v.type==="script";return a.jsxs("div",{className:ts.card,"data-testid":`persona-card-${v.id}`,onClick:()=>d(v.id),role:"button",tabIndex:0,onKeyDown:k=>{k.currentTarget===k.target&&(k.key==="Enter"||k.key===" ")&&(k.preventDefault(),d(v.id))},children:[a.jsxs("div",{className:ts.cardHeader,children:[a.jsxs("span",{className:ts.cardTitle,children:[a.jsx("strong",{children:v.name}),a.jsx("span",{className:ts.typeBadge,"data-testid":`persona-type-badge-${v.id}`,children:_?"Script":"Agent"}),b&&a.jsx("span",{className:ts.defaultBadge,"data-testid":`persona-default-badge-${v.id}`,children:"App Default"})]}),a.jsxs("div",{className:ts.cardActions,onClick:k=>k.stopPropagation(),children:[!b&&a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>{r(v.id).catch(()=>{})},"data-testid":`persona-set-default-${v.id}`,title:"Set as app default persona",children:"Set Default"}),a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>d(v.id),children:"Edit"}),a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>p(v.id),"data-testid":`persona-delete-${v.id}`,children:"Delete"})]})]}),v.description&&a.jsx("p",{className:ts.description,children:v.description}),a.jsxs("div",{className:ts.meta,children:[v.runtime&&a.jsxs("span",{children:["Runtime: ",v.runtime]}),v.model&&a.jsxs("span",{children:["Model: ",v.model]}),v.maxTurns>0&&a.jsxs("span",{children:["Max turns: ",v.maxTurns]})]})]},v.id)})}),a.jsx(_s,{isOpen:u!==null,title:"Delete Persona?",description:`"${(m==null?void 0:m.name)??""}" will be permanently removed.`,confirmLabel:"Delete",onConfirm:()=>{u&&g(u).catch(()=>{})},onCancel:()=>p(null)})]})}const e7="_container_uy08i_1",t7="_header_uy08i_7",n7="_count_uy08i_13",s7="_presets_uy08i_18",a7="_presetButton_uy08i_24",i7="_filterInput_uy08i_41",o7="_groups_uy08i_53",r7="_group_uy08i_53",l7="_groupHeader_uy08i_68",c7="_groupName_uy08i_77",d7="_groupCount_uy08i_81",u7="_toolList_uy08i_87",f7="_toolItem_uy08i_95",p7="_toolName_uy08i_103",yn={container:e7,header:t7,count:n7,presets:s7,presetButton:a7,filterInput:i7,groups:o7,group:r7,groupHeader:l7,groupName:c7,groupCount:d7,toolList:u7,toolItem:f7,toolName:p7},m7=(()=>{const t=new Map;for(const s of z_){const o=s==="get_version_status"?"version":s.split("_")[0];t.has(o)||t.set(o,[]),t.get(o).push(s)}return[...t.entries()].sort(([s],[o])=>s.localeCompare(o)).map(([s,o])=>({group:s,tools:o.sort()}))})(),h7=[{name:"default",label:"Default",tools:L_},{name:"worker",label:"Worker",tools:X2},{name:"orchestrator",label:"Orchestrator",tools:Q2},{name:"admin",label:"Admin",tools:ej}];function o_({selectedTools:t,onChange:s,disabled:o}){const[r,c]=y.useState(""),d=y.useMemo(()=>new Set(t),[t]),u=y.useCallback(v=>{if(o)return;const b=new Set(d);b.has(v)?b.delete(v):b.add(v),s([...b].sort())},[d,s,o]),p=y.useCallback((v,b)=>{if(o)return;const _=new Set(d);for(const k of v)b?_.delete(k):_.add(k);s([..._].sort())},[d,s,o]),m=y.useCallback(v=>{o||s([...v].sort())},[s,o]),g=r.toLowerCase();return a.jsxs("div",{className:yn.container,"data-testid":"mcp-tool-selector",children:[a.jsx("div",{className:yn.header,children:a.jsx("span",{className:yn.count,children:t.length===0?`Using default (${L_.length} tools)`:`${t.length} of ${z_.size} tools selected`})}),a.jsxs("div",{className:yn.presets,"data-testid":"mcp-tool-presets",children:[h7.map(v=>a.jsx("button",{type:"button",className:yn.presetButton,disabled:o,onClick:()=>m(v.tools),"data-testid":`preset-${v.name}`,children:v.label},v.name)),a.jsx("button",{type:"button",className:yn.presetButton,disabled:o,onClick:()=>s([]),"data-testid":"preset-clear",children:"Clear"})]}),a.jsx("input",{type:"text",className:yn.filterInput,placeholder:"Filter tools...",value:r,onChange:v=>c(v.target.value),disabled:o,"data-testid":"mcp-tool-filter"}),a.jsx("div",{className:yn.groups,children:m7.map(({group:v,tools:b})=>{const _=g?b.filter(S=>S.toLowerCase().includes(g)):b;if(_.length===0)return null;const k=_.every(S=>d.has(S));return a.jsxs("div",{className:yn.group,"data-testid":`tool-group-${v}`,children:[a.jsxs("label",{className:yn.groupHeader,children:[a.jsx("input",{type:"checkbox",checked:k,onChange:()=>p(_,k),disabled:o,"data-testid":`group-toggle-${v}`}),a.jsx("span",{className:yn.groupName,children:v}),a.jsxs("span",{className:yn.groupCount,children:["(",_.filter(S=>d.has(S)).length,"/",_.length,")"]})]}),a.jsx("div",{className:yn.toolList,children:_.map(S=>a.jsxs("label",{className:yn.toolItem,children:[a.jsx("input",{type:"checkbox",checked:d.has(S),onChange:()=>u(S),disabled:o,"data-testid":`tool-${S}`}),a.jsx("span",{className:yn.toolName,children:S})]},S))})]},v)})})]})}function mm(t){const s=new Date(t),o=new Date,r=o.getTime()-s.getTime(),c=Math.floor(r/1e3),d=Math.floor(c/60),u=Math.floor(d/60),p=Math.floor(u/24);if(c<60)return"just now";if(d<60)return`${d}m ago`;if(u<24)return`${u}h ago`;if(p===1)return"yesterday";if(p<7)return`${p} days ago`;const m=s.getFullYear()===o.getFullYear(),g=s.toLocaleString("en-US",{month:"short"}),v=s.getDate();return m?`${g} ${v}`:`${g} ${v} ${s.getFullYear()}`}function lk(t){const s=new Date(t);if(Number.isNaN(s.getTime()))return"—";const o=new Date,r=s.getTime()-o.getTime();if(r<=0)return"overdue";const c=Math.floor(r/1e3),d=Math.floor(c/60),u=Math.floor(d/60),p=Math.floor(u/24);if(c<60)return`in ${c}s`;if(d<60)return`in ${d}m`;if(u<24)return`in ${u}h`;if(p<7)return`in ${p} day${p===1?"":"s"}`;const m=s.getFullYear()===o.getFullYear(),g=s.toLocaleString("en-US",{month:"short"}),v=s.getDate();return m?`${g} ${v}`:`${g} ${v} ${s.getFullYear()}`}const g7="_container_1gfuq_1",v7="_header_1gfuq_7",y7="_list_1gfuq_19",b7="_card_1gfuq_25",_7="_cardHeader_1gfuq_40",x7="_cardTitle_1gfuq_46",k7="_statusBadge_1gfuq_56",S7="_enabled_1gfuq_68",j7="_disabled_1gfuq_71",T7="_cardActions_1gfuq_75",N7="_cardMeta_1gfuq_80",w7="_empty_1gfuq_98",ns={container:g7,header:v7,list:y7,card:b7,cardHeader:_7,cardTitle:x7,statusBadge:k7,enabled:S7,disabled:j7,cardActions:T7,cardMeta:N7,empty:w7};function C7({schedules:t,personas:s,onDeleteSchedule:o,onToggleEnabled:r,onNavigateToNew:c,onNavigateToSchedule:d}){const[u,p]=y.useState(null),m=u?t.find(_=>_.id===u):void 0,g=async _=>{await o(_),p(null)},v=y.useMemo(()=>{const _=new Map;for(const k of s)_.set(k.id,k.name);return _},[s]),b=_=>v.get(_)??_;return a.jsxs("div",{className:ns.container,children:[a.jsxs("div",{className:ns.header,children:[a.jsx("h2",{children:"Schedules"}),a.jsx(sn,{variant:"primary",size:"md",onClick:c,"data-testid":"schedule-new-button",children:"+ New Schedule"})]}),t.length===0?a.jsx("p",{className:ns.empty,"data-testid":"schedule-empty-state",children:"No schedules yet. Create one to run tasks on a recurring cadence."}):a.jsx("div",{className:ns.list,children:t.map(_=>a.jsxs("div",{className:ns.card,"data-testid":`schedule-card-${_.id}`,onClick:()=>d(_.id),role:"button",tabIndex:0,onKeyDown:k=>{k.currentTarget===k.target&&(k.key==="Enter"||k.key===" ")&&(k.preventDefault(),d(_.id))},children:[a.jsxs("div",{className:ns.cardHeader,children:[a.jsxs("span",{className:ns.cardTitle,children:[a.jsx("strong",{children:_.title}),a.jsx("span",{className:`${ns.statusBadge} ${_.enabled?ns.enabled:ns.disabled}`,"data-testid":`schedule-status-badge-${_.id}`,children:_.enabled?"Enabled":"Disabled"})]}),a.jsxs("div",{className:ns.cardActions,onClick:k=>k.stopPropagation(),children:[a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>{(async()=>{await r(_.id,{enabled:!_.enabled})})().catch(()=>{})},"data-testid":`schedule-toggle-${_.id}`,title:_.enabled?"Disable schedule":"Enable schedule",children:_.enabled?"Disable":"Enable"}),a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>d(_.id),"data-testid":`schedule-edit-${_.id}`,children:"Edit"}),a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>p(_.id),"data-testid":`schedule-delete-${_.id}`,children:"Delete"})]})]}),a.jsxs("div",{className:ns.cardMeta,children:[a.jsx("span",{"data-testid":`schedule-expression-${_.id}`,children:_.scheduleExpression}),_.personaId&&a.jsxs("span",{"data-testid":`schedule-persona-${_.id}`,children:["Persona: ",b(_.personaId)]}),a.jsxs("span",{"data-testid":`schedule-last-run-${_.id}`,children:["Last run: ",_.lastRunAt?mm(_.lastRunAt):"Never"]}),_.enabled&&_.nextRunAt?a.jsxs("span",{"data-testid":`schedule-next-run-${_.id}`,children:["Next run: ",lk(_.nextRunAt)]}):null,_.runCount>0&&a.jsxs("span",{"data-testid":`schedule-run-count-${_.id}`,children:["Runs: ",_.runCount]})]})]},_.id))}),a.jsx(_s,{isOpen:u!==null,title:"Delete Schedule?",description:`"${(m==null?void 0:m.title)??""}" will be permanently removed. Tasks already created by this schedule will not be affected.`,confirmLabel:"Delete",onConfirm:()=>{u&&g(u).catch(()=>{})},onCancel:()=>p(null)})]})}const E7="_nav_1bhou_1",A7="_tab_1bhou_24",D7="_tabIcon_1bhou_62",M7="_tabActive_1bhou_68",Fc={nav:E7,tab:A7,tabIcon:D7,tabActive:M7},ia=[{path:"credentials",label:"Credentials",icon:a.jsx(vT,{size:Et})},{path:"github-accounts",label:"GitHub Accounts",icon:a.jsx(dT,{size:Et})},{path:"personas",label:"Personas",icon:a.jsx(tN,{size:Et})},{path:"schedules",label:"Schedules",icon:a.jsx(Pj,{size:Et})},{path:"appearance",label:"Appearance",icon:a.jsx(LT,{size:Et})},{path:"shortcuts",label:"Shortcuts",icon:a.jsx(bT,{size:Et})},{path:"plugins",label:"Plugins",icon:a.jsx(VT,{size:Et})},{path:"about",label:"About",icon:a.jsx(km,{size:Et})}];function R7(){var u;const t=Wt(),s=xt(),o=y.useRef(null),r=((u=ia.find(p=>{const m=`${ji}/${p.path}`;return t.pathname===m||t.pathname.startsWith(`${m}/`)}))==null?void 0:u.path)??ia[0].path,c=y.useCallback(p=>{s(`${ji}/${p}`)},[s]),d=y.useCallback(p=>{var k,S;const m=(k=o.current)==null?void 0:k.querySelectorAll('[role="tab"]');if(!m)return;const g=Array.from(m).findIndex(j=>j===document.activeElement),v=g>=0?g:ia.findIndex(j=>j.path===r);let b=v;if(p.key==="ArrowDown"||p.key==="j"||p.key==="J")p.preventDefault(),b=(v+1)%ia.length;else if(p.key==="ArrowUp"||p.key==="k"||p.key==="K")p.preventDefault(),b=(v-1+ia.length)%ia.length;else if(p.key==="Home")p.preventDefault(),b=0;else if(p.key==="End")p.preventDefault(),b=ia.length-1;else return;const _=ia[b].path;s(`${ji}/${_}`),(S=m[b])==null||S.focus()},[r,s]);return a.jsx("nav",{className:Fc.nav,ref:o,role:"tablist","aria-orientation":"vertical","aria-label":"Settings",onKeyDown:d,children:ia.map(p=>{const m=p.path===r;return a.jsxs("button",{role:"tab",type:"button","aria-selected":m,tabIndex:m?0:-1,className:`${Fc.tab} ${m?Fc.tabActive:""}`,onClick:()=>c(p.path),children:[a.jsx("span",{className:Fc.tabIcon,"aria-hidden":"true",children:p.icon}),p.label]},p.path)})})}const I7=["lifecycle:","pipe:","stdin:"];function gh(t){return t.selfEcho?"chatroom":t.name.startsWith("pipe:")?"pipe":"channel"}function ck(t,s){let o=!1;for(const r of t.subscribers){const c=s.get(r.sessionId);if(c&&(o=!0,c.taskId))return{kind:"task",taskId:c.taskId}}return o?{kind:"unattached"}:{kind:"external"}}function O7(t,s){const o=new Map(s.map(u=>[u.id,u])),r=new Map,c=[];for(const u of t){const p=ck(u,o);if(p.kind==="task"){const m=r.get(p.taskId);m?m.push(u):r.set(p.taskId,[u])}else c.push(u)}const d=Array.from(r,([u,p])=>({taskId:u,streams:p}));return c.length>0&&d.push({taskId:void 0,streams:c}),d}const B7="_container_16qkd_1",L7="_header_16qkd_7",z7="_title_16qkd_15",$7="_headerActions_16qkd_21",H7="_internalsToggle_16qkd_27",P7="_refreshButton_16qkd_37",U7="_state_16qkd_52",V7="_group_16qkd_59",q7="_groupHeader_16qkd_63",G7="_row_16qkd_72",F7="_selected_16qkd_92",K7="_kindBadge_16qkd_96",Z7="_kindChatroom_16qkd_108",Y7="_kindPipe_16qkd_114",J7="_kindChannel_16qkd_120",W7="_streamName_16qkd_126",X7="_meta_16qkd_135",Jt={container:B7,header:L7,title:z7,headerActions:$7,internalsToggle:H7,refreshButton:P7,state:U7,group:V7,groupHeader:q7,row:G7,selected:F7,kindBadge:K7,kindChatroom:Z7,kindPipe:Y7,kindChannel:J7,streamName:W7,meta:X7},Q7={chatroom:"Chatroom",pipe:"Pipe",channel:"Channel"};function ez({kind:t}){return t==="chatroom"?a.jsx(DT,{size:Ye,"aria-hidden":"true"}):t==="pipe"?a.jsx(lT,{size:Ye,"aria-hidden":"true"}):a.jsx(fT,{size:Ye,"aria-hidden":"true"})}function tz({streams:t,sessions:s,tasks:o,loading:r,loadError:c=!1,loadedOnce:d=!0,showInternals:u,onToggleInternals:p,selectedStreamId:m,onSelectStream:g,onRefresh:v,hideHeaderControls:b=!1}){const _=O7(t,s),k={chatroom:Jt.kindChatroom,pipe:Jt.kindPipe,channel:Jt.kindChannel},S=j=>{var T;return((T=o.find(N=>N.id===j))==null?void 0:T.title)??j};return a.jsxs("div",{className:Jt.container,"data-testid":"coordination-list",children:[a.jsxs("div",{className:Jt.header,children:[a.jsx("span",{className:Jt.title,children:"Coordination"}),!b&&a.jsxs("div",{className:Jt.headerActions,children:[a.jsxs("label",{className:Jt.internalsToggle,children:[a.jsx("input",{type:"checkbox",checked:u,onChange:j=>p(j.target.checked),"data-testid":"coordination-show-internals"}),"Show internals"]}),v&&a.jsx("button",{type:"button",className:Jt.refreshButton,onClick:v,"aria-label":"Refresh streams","data-testid":"coordination-refresh",children:a.jsx(GT,{size:Ye,"aria-hidden":"true"})})]})]}),r&&t.length===0&&a.jsxs("div",{className:Jt.state,children:["Loading","…"]}),!r&&c&&a.jsx("div",{className:Jt.state,"data-testid":"coordination-error",children:"Unable to load streams"}),!r&&!c&&d&&t.length===0&&a.jsx("div",{className:Jt.state,"data-testid":"coordination-empty",children:"No active streams"}),_.map(j=>a.jsxs("div",{className:Jt.group,children:[a.jsx("div",{className:Jt.groupHeader,children:j.taskId?S(j.taskId):"Unattached / external (CLI · MCP)"}),j.streams.map(T=>{const N=gh(T),C=T.id===m;return a.jsxs("button",{type:"button",className:`${Jt.row}${C?` ${Jt.selected}`:""}`,onClick:()=>g(T.id),"data-testid":`coordination-row-${T.id}`,"aria-current":C?"page":void 0,children:[a.jsxs("span",{className:`${Jt.kindBadge} ${k[N]}`,children:[a.jsx(ez,{kind:N})," ",Q7[N]]}),a.jsx("span",{className:Jt.streamName,children:T.name}),a.jsxs("span",{className:Jt.meta,children:[T.subscriberCount," ",T.subscriberCount===1?"sub":"subs"," ","·"," ",T.messageBufferDepth," buffered"]})]},T.id)})]},j.taskId??"__orphans__"))]})}const nz="_transcript_1p4cm_1",sz="_message_1p4cm_10",az="_meta_1p4cm_16",iz="_sender_1p4cm_24",oz="_time_1p4cm_29",rz="_content_1p4cm_34",lz="_state_1p4cm_42",qa={transcript:nz,message:sz,meta:az,sender:iz,time:oz,content:rz,state:lz};function cz(t){const s=new Date(t);return Number.isNaN(s.getTime())?t:s.toLocaleTimeString()}function dz({messages:t,loading:s=!1}){return s?a.jsx("div",{className:qa.state,"data-testid":"stream-transcript-loading",children:"Loading transcript…"}):t.length===0?a.jsx("div",{className:qa.state,"data-testid":"stream-transcript-empty",children:"No messages yet."}):a.jsx("div",{className:qa.transcript,"data-testid":"stream-transcript",children:t.map(o=>a.jsxs("div",{className:qa.message,"data-testid":"stream-transcript-message",children:[a.jsxs("div",{className:qa.meta,children:[a.jsx("span",{className:qa.sender,title:o.senderId,children:o.senderId.slice(0,12)}),a.jsx("span",{className:qa.time,children:cz(o.timestamp)})]}),a.jsx("div",{className:qa.content,children:o.content})]},o.seq))})}const uz="_panel_iibrt_1",fz="_header_iibrt_24",pz="_title_iibrt_33",mz="_closeButton_iibrt_43",hz="_body_iibrt_57",gz="_section_iibrt_63",vz="_sectionLabel_iibrt_67",yz="_metaRow_iibrt_76",bz="_metaKey_iibrt_84",_z="_metaValue_iibrt_90",xz="_subscriberCard_iibrt_99",kz="_subscriberHeader_iibrt_107",Sz="_sessionLink_iibrt_114",jz="_badges_iibrt_132",Tz="_badgeRw_iibrt_150 _badge_iibrt_132",Nz="_badgeR_iibrt_150 _badge_iibrt_132",wz="_badgeW_iibrt_162 _badge_iibrt_132",Cz="_badgeAsync_iibrt_168 _badge_iibrt_132",Ez="_badgeSync_iibrt_174 _badge_iibrt_132",Az="_badgeDetach_iibrt_178 _badge_iibrt_132",Dz="_spawnTag_iibrt_184 _badge_iibrt_132",Mz="_fdNumber_iibrt_189",Rz="_emptySubscribers_iibrt_195",Iz="_metaValueMono_iibrt_201 _metaValue_iibrt_90",Oz="_advanced_iibrt_216",Bz="_advancedSummary_iibrt_220",He={panel:uz,header:fz,title:pz,closeButton:mz,body:hz,section:gz,sectionLabel:vz,metaRow:yz,metaKey:bz,metaValue:_z,subscriberCard:xz,subscriberHeader:kz,sessionLink:Sz,badges:jz,badgeRw:Tz,badgeR:Nz,badgeW:wz,badgeAsync:Cz,badgeSync:Ez,badgeDetach:Az,spawnTag:Dz,fdNumber:Mz,emptySubscribers:Rz,metaValueMono:Iz,advanced:Oz,advancedSummary:Bz},Lz={chatroom:"Chatroom",pipe:"Pipe",channel:"Channel"};function zz({permission:t}){const s=t==="rw"?He.badgeRw:t==="r"?He.badgeR:He.badgeW;return a.jsx("span",{className:s,children:t})}function $z({mode:t}){const s=t==="async"?He.badgeAsync:t==="detach"?He.badgeDetach:He.badgeSync;return a.jsx("span",{className:s,children:t})}function Hz({stream:t,messages:s,transcriptLoading:o,onClose:r}){const c=xt();return y.useEffect(()=>{const d=u=>{u.key==="Escape"&&r()};return document.addEventListener("keydown",d),()=>{document.removeEventListener("keydown",d)}},[r]),a.jsxs("div",{className:He.panel,"data-testid":"stream-detail-panel",children:[a.jsxs("div",{className:He.header,children:[a.jsx("h3",{className:He.title,children:t.name}),a.jsx("button",{type:"button",className:He.closeButton,onClick:r,"aria-label":"Close stream details",children:"×"})]}),a.jsxs("div",{className:He.body,children:[a.jsxs("div",{className:He.section,children:[a.jsx("div",{className:He.sectionLabel,children:"Overview"}),a.jsxs("div",{className:He.metaRow,children:[a.jsx("span",{className:He.metaKey,children:"Kind"}),a.jsx("span",{className:He.metaValue,children:Lz[gh(t)]})]}),a.jsxs("div",{className:He.metaRow,children:[a.jsx("span",{className:He.metaKey,children:"Participants"}),a.jsx("span",{className:He.metaValue,children:t.subscriberCount})]}),a.jsxs("div",{className:He.metaRow,children:[a.jsx("span",{className:He.metaKey,children:"Buffered"}),a.jsxs("span",{className:He.metaValue,children:[t.messageBufferDepth," msgs"]})]})]}),a.jsxs("div",{className:He.section,children:[a.jsx("div",{className:He.sectionLabel,children:"Participants"}),t.subscribers.length===0?a.jsx("div",{className:He.emptySubscribers,children:"No active subscribers"}):t.subscribers.map(d=>a.jsxs("div",{className:He.subscriberCard,"data-testid":`subscriber-card-${d.subscriptionId}`,children:[a.jsxs("button",{type:"button",className:He.sessionLink,onClick:()=>{c(Mm(d.sessionId))},title:d.sessionId,children:[d.sessionId.slice(0,12),"…"]}),d.createdBySpawn&&a.jsx("span",{className:He.spawnTag,children:"spawn"})]},d.subscriptionId))]}),a.jsxs("div",{className:He.section,children:[a.jsx("div",{className:He.sectionLabel,children:"Conversation"}),a.jsx(dz,{messages:s??[],loading:o??!1})]}),a.jsxs("details",{className:He.advanced,"data-testid":"stream-advanced",children:[a.jsx("summary",{className:He.advancedSummary,children:"Advanced"}),a.jsxs("div",{className:He.metaRow,children:[a.jsx("span",{className:He.metaKey,children:"Stream ID"}),a.jsx("span",{className:He.metaValueMono,children:t.id})]}),t.subscribers.map(d=>a.jsxs("div",{className:He.subscriberCard,children:[a.jsxs("div",{className:He.subscriberHeader,children:[a.jsxs("span",{className:He.fdNumber,children:["fd ",d.fd]}),a.jsxs("span",{className:He.metaValueMono,title:d.subscriptionId,children:[d.subscriptionId.slice(0,12),"…"]})]}),a.jsxs("div",{className:He.badges,children:[a.jsx(zz,{permission:d.permission}),a.jsx($z,{mode:d.deliveryMode})]})]},d.subscriptionId))]})]})]})}function Dp(t){return t.length>0?t.charAt(0).toUpperCase()+t.slice(1):t}const Pz=["--accent-green","--accent-yellow","--accent-red","--text-tertiary"];function dk(t,s){if(s)return{varName:"--text-tertiary",label:"External"};switch(t){case"running":return{varName:"--accent-green",label:"Running"};case"idle":case"suspended":case"hibernating":return{varName:"--accent-yellow",label:Dp(t)};case"failed":case"interrupted":return{varName:"--accent-red",label:Dp(t)};default:return{varName:"--text-tertiary",label:t.length>0?Dp(t):"Unknown"}}}const uk="session",vh="stream",r_="messageDot";function Kc(t){return`session:${t}`}function l_(t){return`stream:${t}`}function Uz(t){return{id:t,environmentId:"",runtime:"external",status:"external",prompt:"",startedAt:""}}function Vz(t,s){return t==="detach"?{stroke:s,strokeWidth:1.5,strokeDasharray:"4 4",opacity:.6}:{stroke:s,strokeWidth:1.5}}function qz(t,s){const o=t.permission.includes("w"),r=s.permission.includes("w"),c=t.permission.includes("r"),d=s.permission.includes("r");if(o&&!r&&d)return{source:t,target:s,bidirectional:!1};if(r&&!o&&c)return{source:s,target:t,bidirectional:!1};const u=[t,s].sort((p,m)=>p.sessionId.localeCompare(m.sessionId));return{source:u[0],target:u[1],bidirectional:!0}}function Gz(t,s){if(t.length===0)return{nodes:[],edges:[]};const o=new Map(s.map(m=>[m.id,m])),r=new Map,c=new Map,d=[],u=m=>{let g=r.get(m);if(!g){const v=o.get(m);g={kind:"session",session:v??Uz(m),streamCount:0,external:v===void 0},r.set(m,g)}return g};for(const m of t){const g=gh(m);if(g==="pipe"&&m.subscribers.length===2&&m.subscribers[0].sessionId!==m.subscribers[1].sessionId){const[v,b]=m.subscribers;u(v.sessionId).streamCount+=1,u(b.sessionId).streamCount+=1;const{source:_,target:k,bidirectional:S}=qz(v,b);d.push({id:`edge-pipe-${m.id}`,source:Kc(_.sessionId),target:Kc(k.sessionId),type:r_,data:{edgeKind:"pipe",streamId:m.id,permission:S?"rw":_.permission,deliveryMode:_.deliveryMode},style:{stroke:"var(--accent-yellow)",strokeWidth:1.5,strokeDasharray:"6 3"},markerEnd:{type:Mc.ArrowClosed},markerStart:S?{type:Mc.ArrowClosed}:void 0,animated:!1});continue}c.set(m.id,{kind:"stream",stream:m,streamKind:g,ownership:ck(m,o)});for(const v of m.subscribers){u(v.sessionId).streamCount+=1;const b=l_(m.id),_=Kc(v.sessionId),k=v.permission.includes("w"),S=v.permission.includes("r");let j,T,N=!1;k&&S?(j=_,T=b,N=!0):S?(j=b,T=_):(j=_,T=b),d.push({id:`edge-part-${m.id}-${v.subscriptionId}`,source:j,target:T,type:r_,data:{edgeKind:"participation",streamId:m.id,permission:v.permission,deliveryMode:v.deliveryMode},style:Vz(v.deliveryMode,"var(--text-tertiary)"),markerEnd:{type:Mc.ArrowClosed},markerStart:N?{type:Mc.ArrowClosed}:void 0,animated:!1})}}const p=[];for(const[m,g]of r)p.push({id:Kc(m),type:uk,position:{x:0,y:0},data:g});for(const[m,g]of c)p.push({id:l_(m),type:vh,position:{x:0,y:0},data:g});return{nodes:p,edges:d}}const Fz=200,Kz=64,Zz=180,Yz=56,Jz=40,Wz=70;function c_(t){return t===vh?{width:Zz,height:Yz}:{width:Fz,height:Kz}}function Xz(t){if(t.nodes.length===0)return t;const s=new ld.graphlib.Graph({multigraph:!0});s.setDefaultEdgeLabel(()=>({})),s.setGraph({rankdir:"LR",nodesep:Jz,ranksep:Wz});for(const r of t.nodes){const{width:c,height:d}=c_(r.type);s.setNode(r.id,{width:c,height:d})}for(const r of t.edges)s.setEdge(r.source,r.target,{},r.id);return ld.layout(s),{nodes:t.nodes.map(r=>{const c=s.node(r.id),{width:d,height:u}=c_(r.type);return{...r,position:{x:c.x-d/2,y:c.y-u/2}}}),edges:t.edges}}function Qz(t,s){return y.useMemo(()=>Xz(Gz(t,s)),[t,s])}const e$="_graphContainer_1uzcp_1",t$="_empty_1uzcp_18",n$="_nodeContent_1uzcp_28",s$="_nodeHeader_1uzcp_38",a$="_nodeTitle_1uzcp_50",i$="_nodeMeta_1uzcp_58",o$="_nodeSubtle_1uzcp_64",r$="_countBadge_1uzcp_69",l$="_sessionNode_1uzcp_81",c$="_sessionAccent_1uzcp_103",d$="_external_1uzcp_109",u$="_streamNode_1uzcp_114",f$="_chatroom_1uzcp_134",p$="_channel_1uzcp_139",m$="_pipe_1uzcp_143",h$="_haloless_1uzcp_147",g$="_selected_1uzcp_153",v$="_kindBadge_1uzcp_158",y$="_handle_1uzcp_172",b$="_messageDot_1uzcp_179",vt={graphContainer:e$,empty:t$,nodeContent:n$,nodeHeader:s$,nodeTitle:a$,nodeMeta:i$,nodeSubtle:o$,countBadge:r$,sessionNode:l$,sessionAccent:c$,external:d$,streamNode:u$,chatroom:f$,channel:p$,pipe:m$,haloless:h$,selected:g$,kindBadge:v$,handle:y$,messageDot:b$};function _$({data:t}){const{session:s,streamCount:o,external:r}=t,c=dk(s.status,r),d=`var(${c.varName})`,u=r?`${vt.sessionNode} ${vt.external}`:vt.sessionNode;return a.jsxs("div",{className:u,"data-testid":`coordination-node-session-${s.id}`,children:[a.jsx(Bo,{type:"target",position:Lo.Left,isConnectable:!1,className:vt.handle}),a.jsx("div",{className:vt.sessionAccent,style:{backgroundColor:d}}),a.jsxs("div",{className:vt.nodeContent,children:[a.jsx("div",{className:vt.nodeHeader,children:a.jsx("span",{className:vt.nodeTitle,children:r?s.id:s.runtime})}),a.jsxs("div",{className:vt.nodeMeta,children:[a.jsx("span",{className:vt.nodeSubtle,style:{color:d},children:c.label}),o>0&&a.jsx("span",{className:vt.countBadge,children:o})]})]}),a.jsx(Bo,{type:"source",position:Lo.Right,isConnectable:!1,className:vt.handle})]})}function x$({data:t,selected:s}){const{stream:o,streamKind:r,ownership:c}=t,d=r==="chatroom"?vt.chatroom:r==="pipe"?vt.pipe:vt.channel,u=[vt.streamNode,d];return c.kind!=="task"&&u.push(vt.haloless),s&&u.push(vt.selected),a.jsxs("div",{className:u.join(" "),"data-testid":`coordination-node-stream-${o.id}`,children:[a.jsx(Bo,{type:"target",position:Lo.Left,isConnectable:!1,className:vt.handle}),a.jsxs("div",{className:vt.nodeContent,children:[a.jsx("div",{className:vt.nodeHeader,children:a.jsx("span",{className:vt.kindBadge,children:r})}),a.jsx("span",{className:vt.nodeTitle,children:o.name}),a.jsxs("span",{className:vt.nodeSubtle,children:[o.subscriberCount," ",o.subscriberCount===1?"subscriber":"subscribers"]})]}),a.jsx(Bo,{type:"source",position:Lo.Right,isConnectable:!1,className:vt.handle})]})}const d_="0.7s",k$=3;function S$(t){const{sourceX:s,sourceY:o,targetX:r,targetY:c,sourcePosition:d,targetPosition:u,markerStart:p,markerEnd:m,style:g,data:v}=t,[b]=V2({sourceX:s,sourceY:o,targetX:r,targetY:c,sourcePosition:d,targetPosition:u}),_=v==null?void 0:v.pulseSeq;return a.jsxs(a.Fragment,{children:[a.jsx(q2,{path:b,markerStart:p,markerEnd:m,style:g}),_!==void 0&&a.jsxs("circle",{r:k$,opacity:0,className:vt.messageDot,"data-testid":"coordination-message-dot",children:[a.jsx("animateMotion",{dur:d_,repeatCount:"1",path:b}),a.jsx("animate",{attributeName:"opacity",dur:d_,repeatCount:"1",values:"0;1;1;0",keyTimes:"0;0.1;0.85;1"})]},_)]})}const Mp="#6b7a8d",j$={[uk]:_$,[vh]:x$},T$={messageDot:S$};function N$({streams:t,sessions:s,selectedStreamId:o,onSelectStream:r,recentMessages:c,resolvedThemeId:d}){const u=Qz(t,s),p=y.useMemo(()=>u.edges.map(_=>{var S,j;if(!_.data)return _;const k=(j=(S=c==null?void 0:c[_.data.streamId])==null?void 0:S.at(-1))==null?void 0:j.seq;return k===void 0?_:{..._,data:{..._.data,pulseSeq:k}}}),[u.edges,c]),m=y.useMemo(()=>u.nodes.map(_=>{const k=_.data;return k.kind==="stream"&&k.stream.id===o?{..._,selected:!0}:_}),[u.nodes,o]),g=y.useMemo(()=>{const _=getComputedStyle(document.documentElement),k={};for(const S of Pz)k[S]=_.getPropertyValue(S).trim()||Mp;return k},[d]),v=y.useCallback((_,k)=>{const S=k.data;S.kind==="stream"&&r(S.stream.id)},[r]),b=y.useCallback(_=>{const k=_.data;return k.kind==="session"?g[dk(k.session.status,k.external).varName]??Mp:Mp},[g]);return u.nodes.length===0?a.jsx("div",{className:vt.empty,"data-testid":"coordination-graph-empty",children:"No active streams to visualize"}):a.jsx("div",{className:vt.graphContainer,"data-testid":"coordination-graph",children:a.jsxs(M_,{nodes:m,edges:p,nodeTypes:j$,edgeTypes:T$,onNodeClick:v,nodesConnectable:!1,fitView:!0,fitViewOptions:{padding:.2},minZoom:.3,maxZoom:2,children:[a.jsx(R_,{variant:I_.Dots,gap:24,size:1,color:"var(--text-disabled)"}),a.jsx(O_,{showInteractive:!1}),a.jsx(B_,{nodeColor:b,maskColor:"var(--bg-overlay)",style:{background:"var(--bg-inset)"}})]})})}function w$({tasks:t,taskStatusById:s,sessionStatusByTaskId:o}){const r=new Map;for(const d of t)if(d.parentTaskId){const u=r.get(d.parentTaskId);u?u.push(d):r.set(d.parentTaskId,[d])}const c=new Map(Sy.map(d=>[d,[]]));for(const d of t){const u=fl(d.status),p=d.dependsOn.length>0&&d.dependsOn.some(S=>s.get(S)!=="complete"),m=r.get(d.id)??[],g=m.length,v=m.filter(S=>S.status==="complete").length;let b;if(u==="paused"&&o){const S=o.get(d.id);S==="idle"?b="Needs input":S==="completed"&&(b="Ready to complete")}const _={task:d,isBlocked:p,childCount:g,doneChildCount:v,pausedSubBadge:b},k=c.get(u);k?k.push(_):c.get("not_started").push(_)}for(const d of c.values())d.sort((u,p)=>u.task.sortOrder-p.task.sortOrder);return Sy.map(d=>{const u=Ya(d);return{status:d,label:u.label,style:u,tasks:c.get(d)??[]}})}const C$="_boardContainer_1c4y1_1",E$="_column_1c4y1_17",A$="_columnHeader_1c4y1_34",D$="_columnIcon_1c4y1_47",M$="_columnLabel_1c4y1_52",R$="_columnCount_1c4y1_57",I$="_cardList_1c4y1_67",O$="_emptyPlaceholder_1c4y1_76",B$="_card_1c4y1_67",L$="_cardHeader_1c4y1_107",z$="_cardStatusIcon_1c4y1_113",$$="_cardTitle_1c4y1_119",H$="_cardBadges_1c4y1_127",P$="_badge_1c4y1_134",U$="_blockedBadge_1c4y1_146",V$="_childBadge_1c4y1_151",q$="_depBadge_1c4y1_155",G$="_parentBadge_1c4y1_159",F$="_pausedSubBadge_1c4y1_166",K$="_personaBadge_1c4y1_170",Z$="_envBadge_1c4y1_174",Y$="_emptyCta_1c4y1_178",J$="_ctaButton_1c4y1_188",W$="_ctaDescription_1c4y1_204",dt={boardContainer:C$,column:E$,columnHeader:A$,columnIcon:D$,columnLabel:M$,columnCount:R$,cardList:I$,emptyPlaceholder:O$,card:B$,cardHeader:L$,cardStatusIcon:z$,cardTitle:$$,cardBadges:H$,badge:P$,blockedBadge:U$,childBadge:V$,depBadge:q$,parentBadge:G$,pausedSubBadge:F$,personaBadge:K$,envBadge:Z$,emptyCta:Y$,ctaButton:J$,ctaDescription:W$};function X$({workspaceId:t,environmentId:s,tasks:o,sessions:r,personas:c,environments:d}){const u=xt(),p=y.useMemo(()=>o.filter(_=>_.workspaceId===t),[o,t]),m=y.useMemo(()=>new Map(o.map(_=>[_.id,_.status])),[o]),g=y.useMemo(()=>new Map(p.map(_=>[_.id,_])),[p]),v=y.useMemo(()=>{const _=new Map(r.map(C=>[C.id,C])),k=new Map(c.map(C=>[C.id,C])),S=new Map(d.map(C=>[C.id,C])),j=new Map,T=new Map,N=new Map;for(const C of p)if(C.latestSessionId){const D=_.get(C.latestSessionId);if(D){if(j.set(C.id,D.endReason||D.status),D.personaId){const A=k.get(D.personaId);A&&T.set(C.id,A.name)}if(D.environmentId){const A=S.get(D.environmentId);A&&N.set(C.id,A.displayName)}}}return{sessionStatusByTaskId:j,personaNameByTaskId:T,environmentNameByTaskId:N}},[p,r,c,d]),b=y.useMemo(()=>w$({tasks:p,taskStatusById:m,sessionStatusByTaskId:v.sessionStatusByTaskId}),[p,m,v]);return p.length===0?a.jsxs("div",{className:dt.emptyCta,"data-testid":"board-empty-cta",children:[a.jsx("button",{className:dt.ctaButton,onClick:()=>u(Ri(t,void 0,s)),children:"Create Task"}),a.jsx("div",{className:dt.ctaDescription,children:"Break your work into tasks and let agents tackle them"})]}):a.jsx("div",{className:dt.boardContainer,"data-testid":"board-container",children:b.map(_=>a.jsxs("section",{className:dt.column,"data-testid":`board-column-${_.status}`,"aria-label":`${_.label}, ${_.tasks.length} ${_.tasks.length===1?"task":"tasks"}`,children:[a.jsxs("div",{className:dt.columnHeader,children:[a.jsx("span",{className:dt.columnIcon,style:{color:_.style.color},children:_.style.icon}),a.jsx("span",{className:dt.columnLabel,children:_.label}),a.jsx("span",{className:dt.columnCount,"data-testid":`board-count-${_.status}`,children:_.tasks.length})]}),a.jsx("div",{className:dt.cardList,children:_.tasks.length===0?a.jsx("div",{className:dt.emptyPlaceholder,children:"No tasks"}):a.jsx(os,{mode:"popLayout",children:_.tasks.map(k=>a.jsx(Pt.div,{layout:!0,initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},children:a.jsx(Q$,{boardTask:k,tasksById:g,personaName:v.personaNameByTaskId.get(k.task.id),envName:v.environmentNameByTaskId.get(k.task.id),onClick:()=>u(ls(k.task.id,void 0,t,s))})},k.task.id))})})]},_.status))})}function Q$({boardTask:t,tasksById:s,personaName:o,envName:r,onClick:c}){const{task:d,isBlocked:u,childCount:p,doneChildCount:m,pausedSubBadge:g}=t,v=Ya(d.status),b=d.parentTaskId?s.get(d.parentTaskId):void 0;return a.jsxs("div",{className:dt.card,tabIndex:0,role:"button","data-testid":`board-card-${d.id}`,onClick:c,onKeyDown:_=>{(_.key==="Enter"||_.key===" ")&&(_.preventDefault(),c())},children:[a.jsxs("div",{className:dt.cardHeader,children:[a.jsx("span",{className:dt.cardStatusIcon,style:{color:v.color},children:v.icon}),a.jsx("span",{className:dt.cardTitle,children:d.title})]}),a.jsxs("div",{className:dt.cardBadges,children:[b&&a.jsx("span",{className:`${dt.badge} ${dt.parentBadge}`,title:b.title,children:b.title}),p>0&&a.jsxs("span",{className:`${dt.badge} ${dt.childBadge}`,children:[m,"/",p]}),u&&a.jsx("span",{className:`${dt.badge} ${dt.blockedBadge}`,children:"blocked"}),d.dependsOn.length>0&&!u&&a.jsx("span",{className:`${dt.badge} ${dt.depBadge}`,children:"dep"}),g&&a.jsx("span",{className:`${dt.badge} ${dt.pausedSubBadge}`,children:g}),o&&a.jsx("span",{className:`${dt.badge} ${dt.personaBadge}`,children:o}),r&&a.jsx("span",{className:`${dt.badge} ${dt.envBadge}`,children:r})]})]})}const e9="_formContent_ymnez_1",t9="_section_ymnez_13",n9="_label_ymnez_19",s9="_titleInput_ymnez_26",a9="_descriptionTextarea_ymnez_58",i9="_selectField_ymnez_94",o9="_checkboxRow_ymnez_128",r9="_checkboxLabel_ymnez_141",l9="_fieldError_ymnez_146",jt={formContent:e9,section:t9,label:n9,titleInput:s9,descriptionTextarea:a9,selectField:i9,checkboxRow:o9,checkboxLabel:r9,fieldError:l9};function c9(t,s){return{name:(t==null?void 0:t.name)??"",description:(t==null?void 0:t.description)??"",repoUrl:(t==null?void 0:t.repoUrl)??"",environmentId:(t==null?void 0:t.linkedEnvironmentIds[0])??s??"",defaultPersonaId:(t==null?void 0:t.defaultPersonaId)??"",useWorktrees:(t==null?void 0:t.useWorktrees)??!0,workingDirectory:(t==null?void 0:t.workingDirectory)??""}}const d9=100;function u9({values:t,onChange:s,environments:o,personas:r,errors:c,disabled:d,autoFocusName:u}){const p=(m,g)=>{s({...t,[m]:g})};return a.jsxs("div",{className:jt.formContent,children:[a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-name",children:"Name"}),a.jsx("input",{id:"ws-name",className:jt.titleInput,type:"text",value:t.name,onChange:m=>p("name",m.target.value),placeholder:"Workspace name",maxLength:d9,autoFocus:u,disabled:d,"data-testid":"workspace-form-name"}),(c==null?void 0:c.name)&&a.jsx("span",{className:jt.fieldError,"data-testid":"workspace-form-error-name",children:c.name})]}),a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-description",children:"Description"}),a.jsx("textarea",{id:"ws-description",className:jt.descriptionTextarea,value:t.description,onChange:m=>p("description",m.target.value),placeholder:"Optional description (Markdown supported)",disabled:d,"data-testid":"workspace-form-description"})]}),a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-repo",children:"Repository URL"}),a.jsx("input",{id:"ws-repo",className:jt.titleInput,type:"text",value:t.repoUrl,onChange:m=>p("repoUrl",m.target.value),placeholder:"https://github.com/org/repo",disabled:d,"data-testid":"workspace-form-repo"}),(c==null?void 0:c.repoUrl)&&a.jsx("span",{className:jt.fieldError,"data-testid":"workspace-form-error-repoUrl",children:c.repoUrl})]}),a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-environment",children:"Environment"}),a.jsxs("select",{id:"ws-environment",className:jt.selectField,value:t.environmentId,onChange:m=>p("environmentId",m.target.value),disabled:d,"data-testid":"workspace-form-environment",children:[a.jsx("option",{value:"",children:"Select environment…"}),o.map(m=>a.jsx("option",{value:m.id,children:m.displayName||m.id},m.id))]}),(c==null?void 0:c.environmentId)&&a.jsx("span",{className:jt.fieldError,"data-testid":"workspace-form-error-environmentId",children:c.environmentId})]}),a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-persona",children:"Default Persona"}),a.jsxs("select",{id:"ws-persona",className:jt.selectField,value:t.defaultPersonaId,onChange:m=>p("defaultPersonaId",m.target.value),disabled:d,"data-testid":"workspace-form-persona",children:[a.jsx("option",{value:"",children:"(Inherit)"}),r.map(m=>a.jsx("option",{value:m.id,children:m.name},m.id))]})]}),a.jsx("div",{className:jt.section,children:a.jsxs("label",{className:jt.checkboxRow,children:[a.jsx("input",{type:"checkbox",checked:t.useWorktrees,onChange:m=>p("useWorktrees",m.target.checked),disabled:d,"data-testid":"workspace-form-worktrees"}),a.jsx("span",{className:jt.checkboxLabel,children:"Enable worktree isolation"})]})}),a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-workdir",children:"Working Directory"}),a.jsx("input",{id:"ws-workdir",className:jt.titleInput,type:"text",value:t.workingDirectory,onChange:m=>p("workingDirectory",m.target.value),placeholder:"Default (server default)",disabled:d,"data-testid":"workspace-form-workdir"})]})]})}const fk=y.createContext(void 0),f9=4e3;function p9({children:t}){const[s,o]=y.useState([]),r=y.useRef(0),c=y.useCallback(u=>{o(p=>p.filter(m=>m.id!==u))},[]),d=y.useCallback((u,p="info",m=f9)=>{const g=`toast-${++r.current}`;o(v=>[...v,{id:g,message:u,variant:p,duration:m}])},[]);return a.jsx(fk.Provider,{value:{toasts:s,showToast:d,dismissToast:c},children:t})}function pn(){const t=y.useContext(fk);if(!t)throw new Error("useToast must be used within ToastProvider");return t}const hm="grackle-theme",pk="grackle-prefer-system",mk="(prefers-color-scheme: dark)";let Jr=[],rd;function Rp(){rd=void 0;for(const t of Jr)t()}function gm(){return typeof window>"u"?!1:window.matchMedia(mk).matches}function nl(){if(typeof localStorage>"u")return a_;try{const t=localStorage.getItem(hm);if(t!==null&&ik.has(t))return t}catch{}return a_}function _d(){if(typeof localStorage>"u")return!1;try{return localStorage.getItem(pk)==="true"}catch{return!1}}function vm(t){return Od.find(s=>s.variantLightId===t||s.variantDarkId===t)}function hk(t,s){const o=pm(t);if(o!=null&&o.variantDarkId)return s&&o.variantLightId?gm()?o.variantDarkId:o.variantLightId:o.variantDarkId;if(o!=null&&o.hidden&&s){const r=vm(t);if(r!=null&&r.variantLightId&&r.variantDarkId)return gm()?r.variantDarkId:r.variantLightId}return t}function Ao(t,s,o=!1){o&&document.documentElement.classList.add("no-transitions"),document.documentElement.dataset.theme=hk(t,s),o&&(document.documentElement.offsetHeight,requestAnimationFrame(()=>{document.documentElement.classList.remove("no-transitions")}))}typeof document<"u"&&Ao(nl(),_d());function m9(){return rd===void 0&&(rd={themeId:nl(),systemDark:gm(),preferSystem:_d()}),rd}function h9(t){return Jr=[...Jr,t],()=>{Jr=Jr.filter(s=>s!==t)}}function g9(){const t=y.useSyncExternalStore(h9,m9),{themeId:s,preferSystem:o}=t,r=hk(s,o),c=y.useCallback(u=>{if(ik.has(u)){try{localStorage.setItem(hm,u)}catch{}Ao(u,_d(),!0),Rp()}},[]),d=y.useCallback(u=>{try{localStorage.setItem(pk,u?"true":"false")}catch{}if(u){const p=nl(),m=pm(p);if(m!=null&&m.hidden){const g=vm(p);if(g)try{localStorage.setItem(hm,g.id)}catch{}}}Ao(nl(),u,!0),Rp()},[]);return y.useEffect(()=>{Ao(s,o)},[s,o]),y.useEffect(()=>{if(typeof window>"u")return;const u=window.matchMedia(mk),p=()=>{const m=nl(),g=_d();if(g){const v=pm(m);if(v!=null&&v.variantDarkId&&v.variantLightId&&Ao(m,g),v!=null&&v.hidden){const b=vm(m);b!=null&&b.variantDarkId&&b.variantLightId&&Ao(m,g)}}Rp()};return u.addEventListener("change",p),()=>{u.removeEventListener("change",p)}},[]),{themeId:s,setTheme:c,resolvedThemeId:r,preferSystem:o,setPreferSystem:d}}const gk=y.createContext(void 0);function v9({children:t}){const s=g9();return a.jsx(gk.Provider,{value:s,children:t})}function yh(){const t=y.useContext(gk);if(!t)throw new Error("useThemeContext must be used within ThemeProvider");return t}const vk=y.createContext(void 0),yk=y.createContext(void 0);function y9({children:t}){const[s,o]=y.useState(void 0),r=y.useCallback(c=>{o(c)},[]);return a.jsx(yk.Provider,{value:r,children:a.jsx(vk.Provider,{value:s,children:t})})}function b9(){return y.useContext(vk)}function _9(){const t=y.useContext(yk);if(t===void 0)throw new Error("useSidebarSetter must be used within a SidebarProvider");return t}const bh=y.createContext(void 0);function pt(){const t=y.useContext(bh);if(!t)throw new Error("useGrackle must be used within GrackleProvider");return t}function bk(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function _k(t,s){return console.warn(`[ws] Malformed "${t}" message: ${s}`),!1}function x9(t){return bk(t)&&typeof t.sessionId=="string"&&typeof t.eventType=="string"&&typeof t.timestamp=="string"&&typeof t.content=="string"&&(t.raw===void 0||typeof t.raw=="string")&&(t.toolCallId===void 0||typeof t.toolCallId=="string")}const k9=new Set(["off","subscription","api_key"]),Zc=new Set(["off","on"]);function S9(t){return bk(t)&&k9.has(t.claude)&&Zc.has(t.github)&&Zc.has(t.copilot)&&Zc.has(t.codex)&&Zc.has(t.goose)}function xk(t){switch(t){case"waiting_input":return"idle";case"completed":return"stopped";case"killed":return"stopped";case"failed":return"stopped";case"interrupted":return"stopped";case"terminated":return"stopped";default:return t}}function kk(t){switch(t){case"completed":return"completed";case"killed":return"killed";case"failed":return"interrupted";case"interrupted":return"interrupted";case"terminated":return"terminated";default:return}}const Co=5e3;function j9(t,s){const o=[];let r=t;const c=new Set;for(;r&&s.has(r)&&!c.has(r);){c.add(r);const d=s.get(r);o.unshift(d),r=d.parentTaskId||void 0}return o}const Ei={label:"Home",url:Fo};function T9(t){return t?[Ei,{label:"Settings",url:ji},{label:t,url:void 0}]:[Ei,{label:"Settings",url:void 0}]}const Sk={label:"Environments",url:zo};function N9(){return[Ei,{label:"Environments",url:void 0}]}function w9(){return[Ei,{label:"New Chat",url:void 0}]}function C9(t){return[Ei,{label:`Session ${t.slice(0,8)}`,url:void 0}]}function E9(t,s,o,r){const c=o.find(u=>u.id===t),d=r.find(u=>u.id===s);return[Ei,Sk,{label:(d==null?void 0:d.displayName)??"Environment",url:$o(s)},{label:(c==null?void 0:c.name)??"Workspace",url:void 0}]}function A9(t,s,o,r,c){const d=j9(t,c),u=c.get(t),p=u==null?void 0:u.workspaceId,m=p?o.find(k=>k.id===p):void 0,g=s??(m==null?void 0:m.linkedEnvironmentIds[0]),v=g?r.find(k=>k.id===g):void 0,b=[Ei];v&&g&&(b.push(Sk),b.push({label:v.displayName,url:$o(g)})),m&&g&&b.push({label:m.name,url:wi(m.id,g)});for(let k=0;k<d.length-1;k++)b.push({label:d[k].title,url:ls(d[k].id,void 0,p,g)});const _=d[d.length-1];return b.push({label:(_==null?void 0:_.title)??t,url:void 0}),b}function _h(t){const s=[];for(const o of t){const r=s[s.length-1];o.eventType==="text"&&(r==null?void 0:r.eventType)==="text"?s[s.length-1]={...r,content:r.content+o.content}:s.push(o)}return s}function u_(t){if(typeof t.id=="string")return t.id;const s=t.data;if(s&&typeof s.toolCallId=="string")return s.toolCallId;const o=t.item;if(o&&typeof o.id=="string")return o.id}function D9(t){if(typeof t.tool_use_id=="string")return t.tool_use_id;const s=t.data;if(s&&typeof s.toolCallId=="string")return s.toolCallId;const o=t.item;if(o&&typeof o.id=="string")return o.id}function Ip(t,s,o){return t.toolCallId?t.toolCallId:s?o(s):void 0}function xh(t){const s=new Map;for(const u of t)if(u.raw)try{s.set(u,JSON.parse(u.raw))}catch{}const o=new Map;for(const u of t){if(u.eventType!=="tool_use")continue;const p=Ip(u,s.get(u),u_);if(p)try{const m=JSON.parse(u.content);o.set(p,{tool:m.tool,args:m.args})}catch{}}const r=new Set,d=t.map(u=>{if(u.eventType!=="tool_result")return u;const p=Ip(u,s.get(u),D9);if(!p)return u;const m=o.get(p);if(!m)return u;r.add(p);let g;const v=u.content.trim();if(v.startsWith("{"))try{const b=JSON.parse(v);typeof b.detailedContent=="string"&&(g=b.detailedContent)}catch{}return{...u,toolUseCtx:{...m,detailedResult:g}}}).filter(u=>{if(u.eventType!=="tool_use")return!0;const p=Ip(u,s.get(u),u_);return!(p&&r.has(p))});for(let u=0;u<d.length;u++){if(d[u].eventType!=="tool_use")continue;let p=!1;for(let m=u+1;m<d.length;m++)if(d[m].eventType!=="tool_use"){p=!0;break}p&&(d[u]={...d[u],settled:!0})}return d}function M9(t,s,o){const r=t.filter(m=>m.status==="running"||m.status==="idle"||m.status==="waiting").length,c=jk(s),d=s.filter(m=>ym(m,c)).length,u=s.filter(m=>m.status==="paused"||m.status==="failed"||ym(m,c)).length,p=o.filter(m=>m.status==="disconnected"||m.status==="error").length;return{activeSessions:r,blockedTasks:d,attentionTasks:u,unhealthyEnvironments:p}}function jk(t){const s=new Map;for(const o of t)s.set(o.id,o.status);return s}function ym(t,s){return t.dependsOn.some(o=>s.get(o)!=="complete")}function R9(t,s){var u;const o=new Map;for(const p of s)o.set(p.id,p);const r=jk(t),c=[];for(const p of t){const m=p.workspaceId?((u=o.get(p.workspaceId))==null?void 0:u.name)??"Unknown":"Unknown";p.status==="failed"?c.push({task:p,reason:"failed",workspaceName:m}):ym(p,r)?c.push({task:p,reason:"blocked",workspaceName:m}):p.status==="paused"&&c.push({task:p,reason:"paused",workspaceName:m})}const d={failed:0,blocked:1,paused:2};return c.sort((p,m)=>(d[p.reason]??3)-(d[m.reason]??3)),c}function I9(t,s){const o=new Map;for(const r of s)o.set(r.id,r);return t.filter(r=>r.status==="running"||r.status==="idle"||r.status==="waiting").map(r=>{var c;return{session:r,environmentName:((c=o.get(r.environmentId))==null?void 0:c.displayName)??"Unknown"}})}function O9(t,s,o){const r=new Map;for(const c of s){if(!c.workspaceId)continue;let d=r.get(c.workspaceId);d||(d={totalTasks:0,completedTasks:0,workingTasks:0,failedTasks:0},r.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 t.map(c=>{const d=r.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 Ds=[{id:"kn-auth-flow",label:"Authentication Flow",kind:"knowledge",category:"concept",content:"The application uses JWT Bearer tokens for stateless authentication. Access tokens expire after 24h. Refresh tokens are stored in the database and rotated on use. The auth middleware verifies tokens and attaches the decoded payload to req.user.",tags:["auth","jwt","security"],workspaceId:"proj-alpha",createdAt:"2026-02-25T10:30:00Z",updatedAt:"2026-02-27T08:15:00Z",val:5},{id:"kn-db-schema",label:"Database Schema",kind:"knowledge",category:"concept",content:"PostgreSQL database with tables: users, sessions, refresh_tokens, audit_log. Uses UUID primary keys, TIMESTAMPTZ for all timestamps, and JSONB for flexible metadata columns. Connection pooling via pg-pool with per-tenant isolation.",tags:["database","postgres","schema"],workspaceId:"proj-alpha",createdAt:"2026-02-23T11:00:00Z",updatedAt:"2026-02-26T22:45:00Z",val:4},{id:"kn-error-handling",label:"Error Response Pattern",kind:"knowledge",category:"concept",content:"All API errors follow the shape { error: string, code: string, details?: unknown }. HTTP status codes map to: 400 (validation), 401 (unauthenticated), 403 (forbidden), 404 (not found), 409 (conflict), 429 (rate limited), 500 (internal).",tags:["api","errors","patterns"],workspaceId:"proj-alpha",createdAt:"2026-02-27T08:17:00Z",updatedAt:"2026-02-27T08:17:00Z",val:3},{id:"kn-rate-limiting",label:"Rate Limiting Strategy",kind:"knowledge",category:"concept",content:"Token-bucket algorithm with in-memory state per client IP. Default rate: 100 requests/minute, burst: 20. Returns 429 with Retry-After header. Redis adapter available for multi-instance deployments.",tags:["api","rate-limiting","infrastructure"],workspaceId:"proj-alpha",createdAt:"2026-02-27T09:00:00Z",updatedAt:"2026-02-27T09:00:00Z",val:2},{id:"kn-etl-pipeline",label:"ETL Pipeline Architecture",kind:"knowledge",category:"concept",content:"Data pipelines follow an Extract-Transform-Load pattern with pluggable stages. Each stage reads from a source (Postgres, S3, API), transforms via configurable mappers, and loads into a target (Parquet, BigQuery, S3). Incremental loads use high-watermark tracking.",tags:["etl","pipeline","architecture"],workspaceId:"proj-beta",createdAt:"2026-02-26T08:00:00Z",updatedAt:"2026-02-27T09:05:00Z",val:4},{id:"kn-parquet-format",label:"Parquet Output Format",kind:"knowledge",category:"concept",content:"Parquet files are written with row-group buffering (configurable batch size, default 10000 rows). Supports Snappy, ZSTD, and GZIP compression. Schema is derived from the internal column type system using Arrow type mapping.",tags:["parquet","data-format","compression"],workspaceId:"proj-beta",createdAt:"2026-02-26T08:05:00Z",updatedAt:"2026-02-26T08:15:00Z",val:3},{id:"kn-jwt-over-session",label:"JWT over Session Auth",kind:"knowledge",category:"decision",content:"Chose JWT tokens over server-side sessions for stateless auth. Rationale: (1) no session store needed, (2) works across microservices without shared state, (3) supports mobile clients natively. Trade-off: tokens can't be revoked instantly (mitigated by short expiry + refresh rotation).",tags:["auth","decision","jwt"],workspaceId:"proj-alpha",createdAt:"2026-02-25T10:00:00Z",updatedAt:"2026-02-25T10:00:00Z",val:3},{id:"kn-pg-pool-decision",label:"pg-pool over Knex",kind:"knowledge",category:"decision",content:"Chose pg-pool over Knex for connection pooling. pg-pool gives direct control over idle timeout, max connections, and health check queries. Knex wraps pg-pool and adds query-building overhead we don't need since we write raw SQL with parameterized queries.",tags:["database","decision","postgres"],workspaceId:"proj-alpha",createdAt:"2026-02-23T11:30:00Z",updatedAt:"2026-02-23T11:30:00Z",val:2},{id:"kn-watermark-decision",label:"Local Watermark Storage",kind:"knowledge",category:"decision",content:"Currently using local SQLite for watermark storage. This works for single-worker pipelines but needs to move to a shared store (Redis or Postgres) for production multi-worker scenarios. Tracked as a follow-up task.",tags:["pipeline","decision","watermarks"],workspaceId:"proj-beta",createdAt:"2026-02-27T09:05:00Z",updatedAt:"2026-02-27T09:05:00Z",val:2},{id:"kn-jwt-middleware",label:"JWT Verify Middleware",kind:"knowledge",category:"snippet",content:`\`\`\`typescript
325
+ --- End forwarded ---`}function xI(t){return t.replace(/[\r\n]+/g," ").trim().replace(/---/g,"—")}function kI({events:t,formatForClipboard:s}){const[o,r]=y.useState(!1),[c,d]=y.useState(new Set),u=y.useRef(void 0),p=y.useMemo(()=>c.size,[c]),m=y.useCallback(S=>{r(!0),S!==void 0?(d(new Set([S])),u.current=S):(d(new Set),u.current=void 0)},[]),g=y.useCallback(()=>{r(!1),d(new Set),u.current=void 0},[]),v=y.useCallback((S,j)=>{if(j&&u.current!==void 0){const T=Math.min(u.current,S),N=Math.max(u.current,S);d(C=>{const D=new Set(C);for(let A=T;A<=N;A++)A<t.length&&ul(t[A])&&D.add(A);return D})}else d(T=>{const N=new Set(T);return N.has(S)?N.delete(S):N.add(S),N.size===0?(r(!1),u.current=void 0):u.current=S,N})},[t]),b=y.useCallback(()=>{const S=new Set;for(let j=0;j<t.length;j++)ul(t[j])&&S.add(j);d(S)},[t]),_=y.useCallback(()=>{d(new Set)},[]),k=y.useCallback(async()=>{const j=[...c].sort((N,C)=>N-C).filter(N=>N<t.length).map(N=>t[N]);if(j.length===0)return!1;const T=s(j);try{return await navigator.clipboard.writeText(T),!0}catch{return!1}},[c,t,s]);return{isSelecting:o,selectedIndices:c,selectedCount:p,enterSelectionMode:m,cancelSelection:g,toggleEvent:v,selectAll:b,deselectAll:_,copySelected:k}}const SI="_wrapper_1cdza_1",jI="_scrollContainer_1cdza_9",TI="_selectingPadding_1cdza_16",NI="_toolbar_1cdza_20",wI="_directionToggle_1cdza_27",CI="_scrollToAnchor_1cdza_65",EI="_scrollToAnchorBottom_1cdza_89",AI="_scrollToAnchorTop_1cdza_93",DI="_eventOverflowWarning_1cdza_97",oa={wrapper:SI,scrollContainer:jI,selectingPadding:TI,toolbar:NI,directionToggle:wI,scrollToAnchor:CI,scrollToAnchorBottom:EI,scrollToAnchorTop:AI,eventOverflowWarning:DI},MI=10*1024,RI=new Set(["running","idle"]);function II(t){const s=new Date(t.timestamp).toLocaleTimeString();switch(t.eventType){case"text":case"output":return`Select message from assistant at ${s}`;case"user_input":return`Select message from user at ${s}`;case"tool_result":case"tool_use":return`Select tool event at ${s}`;case"error":return`Select error at ${s}`;default:return`Select event at ${s}`}}const W1="grackle-stream-direction";function OI(){try{return localStorage.getItem(W1)==="reversed"}catch{return!1}}function BI({eventsDropped:t}){return t<=0?a.jsx(a.Fragment,{}):a.jsxs("div",{className:oa.eventOverflowWarning,role:"alert",children:[a.jsx(Sm,{size:Ht,"aria-hidden":"true"})," ",t.toLocaleString()," older event",t===1?"":"s"," were dropped — only the most recent 5,000 are shown. Full history is available in the session log."]})}function mh({events:t,eventsDropped:s,emptyState:o,onShowToast:r,sessions:c,currentSessionId:d,environments:u,personas:p,onForward:m,sandboxProxyUrl:g}){const v=y.useRef(null),[b,_]=y.useState(OI),k=Z4(),[S,j]=y.useState(!1),[T,N]=y.useState(!1),[C,D]=y.useState(void 0),A=kI({events:t,formatForClipboard:J1}),E=y.useMemo(()=>t.filter(ul).length,[t]),R=y.useMemo(()=>c?c.filter(ce=>RI.has(ce.status)&&ce.id!==d):[],[c,d]),O=y.useMemo(()=>b?[...t].reverse():t,[t,b]),{isAtAnchor:M,scrollToAnchor:$}=vI({scrollRef:v,contentLength:t.length,isReversed:b,paused:A.isSelecting}),Y=()=>{const ce=!b;_(ce);try{localStorage.setItem(W1,ce?"reversed":"default")}catch{}};y.useEffect(()=>{if(!A.isSelecting)return;const ce=me=>{me.key==="Escape"&&!S&&!T&&A.cancelSelection()};return window.addEventListener("keydown",ce),()=>{window.removeEventListener("keydown",ce)}},[A.isSelecting,A.cancelSelection,S,T]);const V=y.useCallback(async()=>{await A.copySelected()&&(r==null||r(`Copied ${A.selectedCount} message${A.selectedCount===1?"":"s"} to clipboard`,"success"))},[A,r]),ne=y.useCallback(()=>[...A.selectedIndices].sort((me,xe)=>me-xe).filter(me=>me<t.length).map(me=>t[me]),[A.selectedIndices,t]),le=y.useCallback(ce=>{if(!ce)return"this session";const me=c==null?void 0:c.find(De=>De.id===ce);if(!me)return ce.slice(0,8);const xe=u==null?void 0:u.find(De=>De.id===me.environmentId);return(xe==null?void 0:xe.displayName)??me.environmentId.slice(0,8)},[c,u]),Z=y.useCallback(async(ce,me)=>{if(!m)return;const xe=le(ce);try{await m(ce,me);const De=A.selectedCount;r==null||r(`Forwarded ${De} message${De===1?"":"s"} to ${xe}`,"success"),A.cancelSelection()}catch{r==null||r("Failed to forward messages","error")}},[m,le,r,A]),se=y.useCallback(ce=>{j(!1);const me=ne(),xe=le(d),De=_I(xe,me);if(new TextEncoder().encode(De).length>MI){D({sessionId:ce,text:De}),N(!0);return}Z(ce,De).catch(()=>{})},[ne,le,d,Z]),H=y.useCallback(()=>{N(!1),C&&(Z(C.sessionId,C.text).catch(()=>{}),D(void 0))},[C,Z]),B=y.useCallback(()=>{N(!1),D(void 0)},[]),F=k?0:.2,ge=b?-8:8,ee=C?Math.round(new TextEncoder().encode(C.text).length/1024):0;return a.jsxs("div",{className:oa.wrapper,children:[a.jsx("div",{className:oa.toolbar,children:a.jsx(Ci,{text:b?"Showing newest first":"Showing oldest first",children:a.jsx("button",{className:oa.directionToggle,onClick:Y,"aria-label":b?"Switch to newest at bottom":"Switch to newest at top","data-testid":"direction-toggle",children:b?a.jsx(xy,{size:Ht,"aria-hidden":"true"}):a.jsx(ky,{size:Ht,"aria-hidden":"true"})})})}),a.jsxs("div",{ref:v,className:`${oa.scrollContainer} ${A.isSelecting?oa.selectingPadding:""}`,"data-testid":"event-stream-scroll",children:[t.length===0&&o,a.jsx(BI,{eventsDropped:s}),a.jsx(os,{initial:!1,children:O.map((ce,me)=>{const xe=b?t.length-1-me:me;return a.jsx(Pt.div,{initial:{opacity:0,y:ge},animate:{opacity:1,y:0},transition:{duration:F,ease:"easeOut"},children:a.jsx(L6,{copyText:bI(ce),isContentBearing:ul(ce),isSelecting:A.isSelecting,isSelected:A.selectedIndices.has(xe),checkboxLabel:II(ce),onSelect:()=>{A.enterSelectionMode(xe)},onToggle:De=>{A.toggleEvent(xe,De)},onCopied:()=>{r==null||r("Copied to clipboard","success")},children:a.jsx(kD,{event:ce,toolUseCtx:ce.toolUseCtx,settled:ce.settled,sandboxProxyUrl:g})})},`${ce.sessionId}-${ce.timestamp}-${xe}`)})})]}),a.jsx(os,{children:A.isSelecting&&a.jsx(F6,{selectedCount:A.selectedCount,totalSelectable:E,onSelectAll:A.selectAll,onDeselectAll:A.deselectAll,onCopy:()=>{V().catch(()=>{})},onForward:m!==void 0?()=>{j(!0)}:void 0,forwardDisabled:R.length===0,onCancel:A.cancelSelection})}),a.jsx(mI,{isOpen:S,sessions:R,environments:u??[],personas:p,onSelect:se,onCancel:()=>{j(!1)}}),a.jsx(_s,{isOpen:T,title:"Send large message?",description:`This will forward a large message (${ee} KB). Continue?`,confirmLabel:"Send",onConfirm:H,onCancel:B}),a.jsx(os,{children:!M&&a.jsxs(Pt.button,{className:`${oa.scrollToAnchor} ${b?oa.scrollToAnchorTop:oa.scrollToAnchorBottom}`,onClick:$,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:[b?a.jsx(ky,{size:Ht,"aria-hidden":"true"}):a.jsx(xy,{size:Ht,"aria-hidden":"true"})," New events"]})})]})}function hh(t){const{value:s,onSave:o,validate:r,fieldId:c,activeFieldId:d,onActivate:u,enterToSave:p=!0,trimOnSave:m=!0}=t,[g,v]=y.useState(""),[b,_]=y.useState(""),k=y.useRef(!1),S=d===c,j=y.useCallback(O=>{v(O),_("")},[]),T=y.useCallback(()=>{_("")},[]),N=y.useCallback(()=>{k.current=!1,u==null||u(null),v(""),_("")},[u]),C=y.useCallback(()=>{const O=m?g.trim():g;if(r){const $=r(g);if($){_($);return}}const M=m?s.trim():s;if(O===M){N();return}o(O),N()},[g,s,m,r,o,N]),D=y.useCallback(()=>{k.current=!0,u==null||u(c),v(s),_("")},[c,s,u]),A=y.useCallback(O=>{if(k.current){k.current=!1;return}O.relatedTarget instanceof HTMLElement&&O.relatedTarget.dataset.editAction===c||C()},[c,C]),E=y.useCallback(O=>{O.key==="Escape"?N():O.key==="Enter"&&p&&C()},[N,p,C]),R=(()=>{if(!S)return!1;const O=m?s.trim():s;return(m?g.trim():g)!==O})();return y.useEffect(()=>{!S&&(g!==""||b!=="")&&(v(""),_(""))},[S,g,b]),{isEditing:S,draft:g,error:b,isDirty:R,startEdit:D,cancelEdit:N,save:C,setDraft:j,clearError:T,handleBlur:A,handleKeyDown:E,ignoreInitialBlurRef:k}}const LI="_editFieldWrapper_yuzty_1",zI="_editInput_yuzty_10",$I="_editTextarea_yuzty_42",HI="_editSelect_yuzty_78",PI="_editError_yuzty_111",UI="_editInputInvalid_yuzty_118",VI="_editHint_yuzty_123",qI="_unsavedDot_yuzty_132",GI="_metaValueClickable_yuzty_140",FI="_editButton_yuzty_159",KI="_metaPlaceholder_yuzty_175",ZI="_worktreeToggle_yuzty_180",it={editFieldWrapper:LI,editInput:zI,editTextarea:$I,editSelect:HI,editError:PI,editInputInvalid:UI,editHint:VI,unsavedDot:qI,metaValueClickable:GI,editButton:FI,metaPlaceholder:KI,worktreeToggle:ZI};function zt(t){const{value:s,onSave:o,validate:r,mode:c="edit",fieldId:d="text",activeFieldId:u,onActivate:p,onChange:m,renderDisplay:g,placeholder:v,maxLength:b,ariaLabel:_,"data-testid":k}=t,S=y.useRef(null),j=hh({value:s,onSave:o,validate:r,fieldId:d,activeFieldId:u,onActivate:p,enterToSave:!0,trimOnSave:!0});if(y.useEffect(()=>{if(j.isEditing){const N=window.setTimeout(()=>{var C;(C=S.current)==null||C.focus()},0);return()=>window.clearTimeout(N)}},[j.isEditing]),c==="create"){const N=D=>{m==null||m(D.target.value)},C=r==null?void 0:r(s);return a.jsxs("div",{className:it.editFieldWrapper,children:[a.jsx("input",{className:`${it.editInput} ${C?it.editInputInvalid:""}`,value:s,onChange:N,maxLength:b,placeholder:v,"aria-label":_,"data-testid":k?`${k}-input`:void 0}),C&&a.jsx("span",{className:it.editError,"data-testid":"edit-error",children:C})]})}if(j.isEditing)return a.jsxs("div",{className:it.editFieldWrapper,children:[a.jsx("input",{ref:S,className:`${it.editInput} ${j.error?it.editInputInvalid:""}`,value:j.draft,onChange:N=>j.setDraft(N.target.value),onBlur:j.handleBlur,onKeyDown:j.handleKeyDown,maxLength:b,placeholder:v,"aria-label":_,"data-testid":k?`${k}-input`:void 0}),j.isDirty&&a.jsx("span",{className:it.unsavedDot,title:"Unsaved changes"}),j.error&&a.jsx("span",{className:it.editError,"data-testid":"edit-error",children:j.error}),a.jsx("span",{className:it.editHint,children:"Enter to save · Esc to cancel"})]});const T=g==null?void 0:g(s);return a.jsxs("span",{role:"button",tabIndex:0,className:it.metaValueClickable,onClick:()=>j.startEdit(),onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),j.startEdit())},title:"Click to edit","aria-label":_,"data-testid":k?`${k}-button`:void 0,children:[T!==void 0?T:s?a.jsx("span",{children:s}):a.jsx("span",{className:it.metaPlaceholder,children:v||"None"}),a.jsx("span",{className:it.editButton,"aria-hidden":"true",children:"✏️"})]})}function fm(t){const{value:s,onSave:o,validate:r,mode:c="edit",fieldId:d="textarea",activeFieldId:u,onActivate:p,onChange:m,renderDisplay:g,placeholder:v,ariaLabel:b,"data-testid":_}=t,k=y.useRef(null),S=hh({value:s,onSave:o,validate:r,fieldId:d,activeFieldId:u,onActivate:p,enterToSave:!1,trimOnSave:!1});if(y.useEffect(()=>{if(S.isEditing){const T=window.setTimeout(()=>{var N;(N=k.current)==null||N.focus()},0);return()=>window.clearTimeout(T)}},[S.isEditing]),c==="create"){const T=C=>{m==null||m(C.target.value)},N=r==null?void 0:r(s);return a.jsxs("div",{className:it.editFieldWrapper,children:[a.jsx("textarea",{className:`${it.editTextarea} ${N?it.editInputInvalid:""}`,value:s,onChange:T,placeholder:v,"aria-label":b,"data-testid":_?`${_}-input`:void 0}),N&&a.jsx("span",{className:it.editError,"data-testid":"edit-error",children:N})]})}if(S.isEditing)return a.jsxs("div",{className:it.editFieldWrapper,children:[a.jsx("textarea",{ref:k,className:`${it.editTextarea} ${S.error?it.editInputInvalid:""}`,value:S.draft,onChange:T=>S.setDraft(T.target.value),onBlur:S.handleBlur,onKeyDown:S.handleKeyDown,title:b,"aria-label":b,"data-testid":_?`${_}-input`:void 0}),S.isDirty&&a.jsx("span",{className:it.unsavedDot,title:"Unsaved changes"}),S.error&&a.jsx("span",{className:it.editError,"data-testid":"edit-error",children:S.error}),a.jsx("span",{className:it.editHint,children:"Tab to save · Esc to cancel"})]});const j=g==null?void 0:g(s);return a.jsxs("span",{role:"button",tabIndex:0,className:it.metaValueClickable,onClick:()=>S.startEdit(),onKeyDown:T=>{(T.key==="Enter"||T.key===" ")&&(T.preventDefault(),S.startEdit())},title:"Click to edit","aria-label":b,"data-testid":_?`${_}-button`:void 0,children:[j!==void 0?j:s?a.jsx("span",{children:s}):a.jsx("span",{className:it.metaPlaceholder,children:v||"None"}),a.jsx("span",{className:it.editButton,"aria-hidden":"true",children:"✏️"})]})}function bd(t){var D;const{value:s,onSave:o,mode:r="edit",options:c,fieldId:d="select",activeFieldId:u,onActivate:p,onChange:m,renderDisplay:g,placeholder:v,ariaLabel:b,"data-testid":_}=t,k=y.useRef(null),S=hh({value:s,onSave:o,fieldId:d,activeFieldId:u,onActivate:p,enterToSave:!1,trimOnSave:!1});y.useEffect(()=>{if(S.isEditing){const A=window.setTimeout(()=>{var E;(E=k.current)==null||E.focus()},0);return()=>window.clearTimeout(A)}},[S.isEditing]);const j=y.useCallback(A=>{const E=A.target.value;S.ignoreInitialBlurRef.current=!1,E!==s&&o(E),S.cancelEdit()},[s,o,S]),T=y.useCallback(A=>{if(S.ignoreInitialBlurRef.current){S.ignoreInitialBlurRef.current=!1;return}A.relatedTarget instanceof HTMLElement&&A.relatedTarget.dataset.editAction===d||S.cancelEdit()},[d,S]);if(r==="create")return a.jsx("select",{className:it.editSelect,value:s,onChange:A=>m==null?void 0:m(A.target.value),"aria-label":b,"data-testid":_?`${_}-select`:void 0,children:c.map(A=>a.jsx("option",{value:A.value,children:A.label},A.value))});if(S.isEditing)return a.jsx("select",{ref:k,className:it.editSelect,value:S.draft,onChange:j,onBlur:T,title:b,"aria-label":b,"data-testid":_?`${_}-select`:void 0,children:c.map(A=>a.jsx("option",{value:A.value,children:A.label},A.value))});const N=g==null?void 0:g(s),C=(D=c.find(A=>A.value===s))==null?void 0:D.label;return a.jsxs("button",{type:"button",className:it.metaValueClickable,onClick:()=>S.startEdit(),title:"Click to change","aria-label":b,"data-testid":_?`${_}-button`:void 0,children:[N!==void 0?N:C?a.jsx("span",{children:C}):a.jsx("span",{className:it.metaPlaceholder,children:v||"None"}),a.jsx("span",{className:it.editButton,"aria-hidden":"true",children:"✏️"})]})}function YI(t){const{checked:s,onChange:o,label:r,ariaLabel:c,"data-testid":d}=t;return a.jsxs("label",{className:it.worktreeToggle,"data-testid":d,children:[a.jsx("input",{type:"checkbox",checked:s,onChange:u=>o(u.target.checked),"aria-label":c}),a.jsx("span",{children:r})]})}const JI="_nav_1snmp_1",WI="_searchForm_1snmp_8",XI="_searchInput_1snmp_15",QI="_searchButton_1snmp_33",e5="_clearButton_1snmp_68",t5="_workspaceSelect_1snmp_85",n5="_listHeader_1snmp_99",s5="_nodeList_1snmp_108",a5="_nodeItem_1snmp_116",i5="_indicator_1snmp_129",o5="_label_1snmp_136",r5="_badge_1snmp_145",es={nav:JI,searchForm:WI,searchInput:XI,searchButton:QI,clearButton:e5,workspaceSelect:t5,listHeader:n5,nodeList:s5,nodeItem:a5,indicator:i5,label:o5,badge:r5};function l5({nodes:t,workspaces:s,loading:o,searchQuery:r,onSearch:c,onClearSearch:d,onSelectNode:u,onWorkspaceChange:p}){const[m,g]=y.useState(""),v=y.useCallback(S=>{S.preventDefault(),m.trim()&&c(m.trim())},[m,c]),b=y.useCallback(()=>{g(""),d()},[d]),_=y.useCallback(S=>{u(S)},[u]),k=y.useCallback(S=>{g(""),p(S)},[p]);return a.jsxs("div",{className:es.nav,"data-testid":"knowledge-nav",children:[a.jsxs("form",{className:es.searchForm,onSubmit:v,children:[a.jsx("input",{className:es.searchInput,type:"text",placeholder:"Search...",value:m,onChange:S=>{g(S.target.value)},"data-testid":"knowledge-search-input","aria-label":"Search knowledge nodes"}),a.jsx("button",{type:"submit",className:es.searchButton,disabled:o,children:"Go"})]}),r&&a.jsx("button",{type:"button",className:es.clearButton,onClick:b,children:"Clear search"}),a.jsxs("select",{className:es.workspaceSelect,onChange:S=>{k(S.target.value)},"data-testid":"knowledge-workspace-filter","aria-label":"Filter by workspace",children:[a.jsx("option",{value:"",children:"All workspaces"}),s.map(S=>a.jsx("option",{value:S.id,children:S.name},S.id))]}),a.jsxs("div",{className:es.listHeader,children:["Nodes (",t.length,")"]}),a.jsx("ul",{className:es.nodeList,children:t.map(S=>a.jsxs("li",{className:es.nodeItem,onClick:()=>{_(S.id)},onKeyDown:j=>{(j.key==="Enter"||j.key===" ")&&(j.preventDefault(),_(S.id))},role:"button",tabIndex:0,children:[a.jsx("span",{className:es.indicator,style:{backgroundColor:S.kind==="reference"?"#4A9EFF":S.category==="decision"?"#22C55E":S.category==="concept"?"#A855F7":S.category==="snippet"?"#6B7280":"#EAB308"}}),a.jsx("span",{className:es.label,children:S.label}),a.jsx("span",{className:es.badge,children:S.kind==="reference"?S.sourceType:S.category})]},S.id))})]})}const c5="_container_bwu10_1",d5="_hamburger_bwu10_33",u5="_brand_bwu10_49",f5="_brandLogo_bwu10_68",p5="_info_bwu10_75",m5="_connectionLabel_bwu10_90",h5="_connectionDot_bwu10_103",g5="_connected_bwu10_106",v5="_disconnected_bwu10_110",y5="_connecting_bwu10_113",Ms={container:c5,hamburger:d5,brand:u5,brandLogo:f5,info:p5,connectionLabel:m5,connectionDot:h5,connected:g5,disconnected:v5,connecting:y5},b5={connected:"Connected",connecting:"Connecting...",disconnected:"Disconnected"},_5={connected:Ms.connected,connecting:Ms.connecting,disconnected:Ms.disconnected};function x5({connectionStatus:t,environments:s,sessions:o,onToggleSidebar:r,sidebarOpen:c}){const d=xt(),u=s.length,p=s.filter(v=>v.status==="connected").length,m=o.filter(v=>["running","idle"].includes(v.status)).length,g=b5[t];return a.jsxs("div",{className:Ms.container,children:[r&&a.jsx("button",{type:"button",className:Ms.hamburger,onClick:r,"aria-label":"Toggle sidebar","aria-expanded":c,children:a.jsx(wT,{size:Et,"aria-hidden":"true"})}),a.jsx(Ci,{text:"Home",placement:"bottom",children:a.jsxs("button",{type:"button",className:Ms.brand,onClick:()=>d(Fo),"data-testid":"statusbar-brand",children:[a.jsx("img",{src:Id("icon-192x192.png"),alt:"",className:Ms.brandLogo,"aria-hidden":"true","data-testid":"statusbar-logo"}),"Grackle"]})}),a.jsxs("div",{className:Ms.info,children:[a.jsxs("span",{"aria-label":g,children:[a.jsx("span",{className:`${Ms.connectionDot} ${_5[t]}`,"aria-hidden":"true",children:a.jsx(Ni,{size:G_,fill:"currentColor"})})," ",a.jsx("span",{className:Ms.connectionLabel,"aria-hidden":"true",children:g})]}),a.jsxs("span",{children:[p,"/",u," env",u!==1?"s":""]}),a.jsxs("span",{children:[m," active"]})]})]})}const k5="_nav_gx5h3_1",S5="_tab_gx5h3_35",j5="_tabIcon_gx5h3_68",T5="_tabLabel_gx5h3_79",N5="_tabActive_gx5h3_84",w5="_tabEnd_gx5h3_90",wo={nav:k5,tab:S5,tabIcon:j5,tabLabel:T5,tabActive:N5,tabEnd:w5},ad=[{view:"dashboard",label:"Dashboard",icon:a.jsx(mT,{size:Et}),route:Fo,testId:"sidebar-tab-dashboard",order:0},{view:"tasks",label:"Tasks",icon:a.jsx(Kj,{size:Et}),route:cC,testId:"sidebar-tab-tasks",order:1},{view:"environments",label:"Environments",icon:a.jsx(RT,{size:Et}),route:zo,testId:"sidebar-tab-environments",order:2},{view:"chat",label:"Root",icon:a.jsx(ET,{size:Et}),route:lC,testId:"sidebar-tab-chat",order:3},{view:"knowledge",label:"Knowledge",icon:a.jsx($j,{size:Et}),route:hx,testId:"sidebar-tab-knowledge",order:5},{view:"coordination",label:"Coordination",icon:a.jsx(OT,{size:Et}),route:px,testId:"sidebar-tab-coordination",order:6},{view:"settings",label:"Settings",icon:a.jsx(ZT,{size:Et}),route:sC,testId:"sidebar-tab-settings",align:"end"}];function C5(t){return t===Fo||t==="/"?"dashboard":t.startsWith(px)?"coordination":t.startsWith("/chat")||t.startsWith("/sessions")?"chat":t.startsWith("/workspaces")||t.startsWith("/environments")?"environments":t.startsWith(hx)?"knowledge":t.startsWith(ji)?"settings":"tasks"}function E5({tabs:t=ad}){var g;const s=Wt(),o=xt(),r=y.useRef(null),c=C5(s.pathname),d=y.useMemo(()=>{const v=(b,_)=>(b.order??Number.MAX_SAFE_INTEGER)-(_.order??Number.MAX_SAFE_INTEGER);return[...t.filter(b=>b.align!=="end").sort(v),...t.filter(b=>b.align==="end")]},[t]),u=(g=d.find(v=>v.align==="end"))==null?void 0:g.view,p=y.useCallback(v=>{o(v.route)},[o]),m=y.useCallback(v=>{var j,T;const b=(j=r.current)==null?void 0:j.querySelectorAll('[role="tab"]');if(!b)return;const _=Array.from(b).findIndex(N=>N===document.activeElement),k=_>=0?_:d.findIndex(N=>N.view===c);let S=k;if(v.key==="ArrowRight"||v.key==="j"||v.key==="J")v.preventDefault(),S=(k+1)%d.length;else if(v.key==="ArrowLeft"||v.key==="k"||v.key==="K")v.preventDefault(),S=(k-1+d.length)%d.length;else if(v.key==="Home")v.preventDefault(),S=0;else if(v.key==="End")v.preventDefault(),S=d.length-1;else return;o(d[S].route),(T=b[S])==null||T.focus()},[c,o,d]);return a.jsx("nav",{className:wo.nav,ref:r,role:"tablist","aria-orientation":"horizontal","aria-label":"App navigation",onKeyDown:m,"data-testid":"sidebar-nav",children:d.map(v=>{const b=v.view===c,_=v.view===u;return a.jsx(Ci,{text:v.label,placement:"bottom",className:_?wo.tabEnd:void 0,children:a.jsxs("button",{role:"tab",type:"button","aria-selected":b,tabIndex:b?0:-1,className:`${wo.tab} ${b?wo.tabActive:""}`,onClick:()=>p(v),"data-testid":v.testId,"aria-label":v.label,children:[a.jsx("span",{className:wo.tabIcon,"aria-hidden":"true",children:v.icon}),a.jsx("span",{className:wo.tabLabel,children:v.label})]})},v.view)})})}const A5="_container_pi6ii_1",D5="_content_pi6ii_66",n_={container:A5,content:D5},M5=320,X1=220,Q1=600,ek="grackle-sidebar-width";function R5(){try{const t=localStorage.getItem(ek);if(t!==null){const s=Number(t);if(Number.isFinite(s)&&s>=X1&&s<=Q1)return s}}catch{}return M5}function I5(t){try{localStorage.setItem(ek,String(t))}catch{}}function O5({content:t}){const[s]=y.useState(R5),o=y.useRef(null);if(y.useEffect(()=>{const r=o.current;if(!r)return;const c=new ResizeObserver(d=>{for(const u of d){const p=u.borderBoxSize[0];if(p){const m=Math.round(p.inlineSize);m>=X1&&m<=Q1&&I5(m)}}});return c.observe(r),()=>{c.disconnect()}},[]),t!==void 0)return a.jsx("div",{className:n_.container,ref:o,"data-testid":"sidebar",style:{width:s},children:a.jsx("div",{className:n_.content,children:t})})}const B5="_bar_tnfsh_1",L5="_btnPrimary_tnfsh_32",z5="_statusText_tnfsh_85",$5="_statusCompleted_tnfsh_90",H5="_statusFailed_tnfsh_94",P5="_statusBlocked_tnfsh_98",U5="_hintText_tnfsh_103",Ct={bar:B5,btnPrimary:L5,statusText:z5,statusCompleted:$5,statusFailed:H5,statusBlocked:P5,hintText:U5};function V5({sessions:t,tasks:s,environments:o}){const r=xt(),c=Wt(),d=nn("/sessions/:sessionId"),u=nn("/tasks/:taskId"),p=nn("/tasks/:taskId/stream"),m=nn("/tasks/:taskId/edit"),g=nn("/environments/:environmentId/workspaces/:workspaceId/tasks/:taskId"),v=nn("/environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/stream"),b=nn("/environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/edit"),_=nn("/sessions/new"),k=nn("/environments/:environmentId/workspaces/:workspaceId"),S=nn("/tasks/new"),j=nn("/chat"),T=nn("/"),N=nn("/settings/*"),C=d==null?void 0:d.params.sessionId,D=(u==null?void 0:u.params.taskId)??(p==null?void 0:p.params.taskId)??(g==null?void 0:g.params.taskId)??(v==null?void 0:v.params.taskId)??(b==null?void 0:b.params.taskId),A=g??v??b,E=(A==null?void 0:A.params.environmentId)??(k==null?void 0:k.params.environmentId),R=c.pathname.startsWith("/environments")&&!k&&!A,O=!!j,M=!!_,$=!!k&&!g&&!v&&!b,Y=!!S;if(!!T&&!M&&!$&&!Y||!!N||(!!m||!!b)||Y||R||M)return a.jsx(a.Fragment,{});if(O)return o.find(se=>se.adapterType==="local"&&se.status==="connected")?a.jsx(a.Fragment,{}):a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:Ct.hintText,children:"Add a local environment to start chatting"})});if($)return a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:Ct.hintText,children:"Select a task or click + to create one"})});if(D){const Z=s.find(B=>B.id===D);if(!Z)return a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:Ct.hintText,children:"Loading..."})});const se=new Map(s.map(B=>[B.id,B])),H=Z.dependsOn.some(B=>{const F=se.get(B);return F!==void 0&&F.status!=="complete"});if(Z.status==="not_started"){const B=H?Z.dependsOn.map(F=>se.get(F)).filter(F=>F&&F.status!=="complete").map(F=>F.title):[];return a.jsx("div",{className:Ct.bar,children:H?a.jsxs("span",{className:Ct.statusBlocked,children:["Blocked by: ",B.join(", ")]}):a.jsx("span",{className:Ct.hintText,children:"Use the buttons above to start or manage this task"})})}if(Z.status==="working"||Z.status==="paused"){const B=Z.latestSessionId||void 0,F=B?t.find(ee=>ee.id===B):void 0;return F&&F.status!=="stopped"?a.jsx(a.Fragment,{}):a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:Ct.hintText,children:"Waiting for agent..."})})}if(Z.status==="complete")return a.jsxs("div",{className:Ct.bar,children:[a.jsx("span",{className:`${Ct.statusText} ${Ct.statusCompleted}`,children:"Task completed"}),a.jsx("button",{onClick:()=>r(Ri(Z.workspaceId,void 0,E)),className:Ct.btnPrimary,children:"+ New Task"})]});if(Z.status==="failed")return a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:`${Ct.statusText} ${Ct.statusFailed}`,children:"Task failed"})})}if(C){const Z=t.find(B=>B.id===C),se=(Z==null?void 0:Z.status)==="stopped";if(Z!==void 0&&!se)return a.jsx(a.Fragment,{});if(se)return a.jsxs("div",{className:Ct.bar,children:[a.jsxs("span",{className:`${Ct.statusText} ${Ct.hintText}`,children:["Session ",Z.endReason||Z.status]}),a.jsx("button",{onClick:()=>r(dx(Z.environmentId)),className:Ct.btnPrimary,children:"+ New Chat"})]})}return a.jsx("div",{className:Ct.bar,children:a.jsx("span",{className:Ct.hintText,children:"Loading..."})})}const q5="_nav_14i94_1",G5="_tab_14i94_24",F5="_tabActive_14i94_62",K5="_tabLabel_14i94_75",Z5="_statusDot_14i94_81",Y5="_pulse_14i94_87",J5="_addButton_14i94_99",W5="_empty_14i94_132",Ua={nav:q5,tab:G5,tabActive:F5,tabLabel:K5,statusDot:Z5,pulse:Y5,addButton:J5,empty:W5},X5={connected:"var(--accent-green)",sleeping:"var(--accent-yellow)",error:"var(--accent-red)",disconnected:"var(--text-tertiary)",connecting:"var(--accent-blue)"};function Q5({environments:t}){const s=xt(),o=y.useRef(null),r=nn("/environments/:environmentId"),c=nn("/environments/:environmentId/edit"),d=nn("/environments/:environmentId/workspaces/:workspaceId"),u=nn("/environments/:environmentId/workspaces/:workspaceId/*"),p=(r==null?void 0:r.params.environmentId)??(c==null?void 0:c.params.environmentId)??(d==null?void 0:d.params.environmentId)??(u==null?void 0:u.params.environmentId),m=p==="new"?void 0:p,g=y.useCallback(_=>{s($o(_))},[s]),v=y.useCallback(_=>{var N;const k=(N=o.current)==null?void 0:N.querySelectorAll('[role="tab"]');if(!k||k.length===0)return;const S=Array.from(k).findIndex(C=>C===document.activeElement),j=S>=0?S:t.findIndex(C=>C.id===m);let T=j;if(_.key==="ArrowDown"||_.key==="j"||_.key==="J")_.preventDefault(),T=(j+1)%k.length;else if(_.key==="ArrowUp"||_.key==="k"||_.key==="K")_.preventDefault(),T=(j-1+k.length)%k.length;else if(_.key==="Home")_.preventDefault(),T=0;else if(_.key==="End")_.preventDefault(),T=k.length-1;else return;T<t.length&&s($o(t[T].id)),k[T].focus()},[m,t,s]),b=m??(t.length>0?t[0].id:void 0);return a.jsxs("div",{className:Ua.nav,"data-testid":"environment-nav",children:[a.jsx("nav",{ref:o,role:"tablist","aria-orientation":"vertical","aria-label":"Environments",onKeyDown:v,children:t.map(_=>{const k=_.id===m,S=_.id===b,j=X5[_.status]||"var(--text-tertiary)",T=_.status==="connected";return a.jsxs("button",{role:"tab",type:"button","aria-selected":k,tabIndex:S?0:-1,className:`${Ua.tab} ${k?Ua.tabActive:""}`,onClick:()=>g(_.id),"data-testid":"env-nav-item",children:[a.jsx("span",{className:`${Ua.statusDot} ${T?Ua.pulse:""}`,style:{color:j},"aria-hidden":"true",children:a.jsx(Ni,{size:G_,fill:"currentColor"})}),a.jsx("span",{className:Ua.tabLabel,title:_.displayName||_.id,children:_.displayName||_.id})]},_.id)})}),a.jsx("button",{type:"button",className:Ua.addButton,onClick:()=>s(tC),title:"Add environment","data-testid":"env-nav-add",children:"+ Add Environment"}),t.length===0&&a.jsx("div",{className:Ua.empty,children:"No environments yet."})]})}function eO(t){if(t.length===0)return[];const s=[...t].sort((r,c)=>r[0]-c[0]),o=[[s[0][0],s[0][1]]];for(let r=1;r<s.length;r++){const c=o[o.length-1],[d,u]=s[r];d<=c[1]+1?c[1]=Math.max(c[1],u):o.push([d,u])}return o}function tk({text:t,indices:s,highlightClass:o}){if(!s||s.length===0)return a.jsx(a.Fragment,{children:t});const r=eO(s),c=[];let d=0;for(const[u,p]of r)u>d&&c.push(a.jsx("span",{children:t.slice(d,u)},`p${d}`)),c.push(a.jsx("mark",{className:o,children:t.slice(u,p+1)},`m${u}`)),d=p+1;return d<t.length&&c.push(a.jsx("span",{children:t.slice(d)},`p${d}`)),a.jsx(a.Fragment,{children:c})}function tO(t){const s=new Map(t.map(r=>[r.id,{...r,children:[]}])),o=[];for(const r of s.values())r.parentTaskId&&s.has(r.parentTaskId)?s.get(r.parentTaskId).children.push(r):o.push(r);for(const r of s.values())r.children.sort((c,d)=>c.sortOrder-d.sortOrder);return o.sort((r,c)=>r.sortOrder-c.sortOrder)}function nO(t,s){const o=new Map;for(const d of t){const p=d.dependsOn.length>0&&d.dependsOn.some(g=>s.get(g)!=="complete")?"blocked":d.status,m=o.get(p);m?m.push(d):o.set(p,[d])}const r=[],c=new Set;for(const d of iN){c.add(d);const u=o.get(d);if(u&&u.length>0){u.sort((m,g)=>m.sortOrder-g.sortOrder);const p=Ya(d);r.push({status:d,label:p.label,style:p,tasks:u})}}for(const[d,u]of o)if(!c.has(d)&&u.length>0){u.sort((m,g)=>m.sortOrder-g.sortOrder);const p=Ya(d);r.push({status:d,label:p.label,style:p,tasks:u})}return r}const sO="_container_z4i38_1",aO="_header_z4i38_5",iO="_headerActions_z4i38_17",oO="_searchInput_z4i38_23",rO="_searchHighlight_z4i38_56",lO="_groupToggle_z4i38_62",cO="_groupToggleActive_z4i38_89",dO="_addButton_z4i38_93",uO="_taskRow_z4i38_120",fO="_selected_z4i38_140",pO="_expandArrow_z4i38_150",mO="_expanded_z4i38_157",hO="_leafSpacer_z4i38_161",gO="_taskStatusIcon_z4i38_166",vO="_taskTitle_z4i38_170",yO="_workspaceBadge_z4i38_177",bO="_childCountBadge_z4i38_195",_O="_dependencyBadge_z4i38_208",xO="_blockedBadge_z4i38_220",kO="_addChildButton_z4i38_225",SO="_emptyState_z4i38_268",jO="_statusGroupHeader_z4i38_275",TO="_statusGroupIcon_z4i38_294",NO="_statusGroupLabel_z4i38_298",wO="_statusGroupCount_z4i38_303",We={container:sO,header:aO,headerActions:iO,searchInput:oO,searchHighlight:rO,groupToggle:lO,groupToggleActive:cO,addButton:dO,taskRow:uO,selected:fO,expandArrow:pO,expanded:mO,leafSpacer:hO,taskStatusIcon:gO,taskTitle:vO,workspaceBadge:yO,childCountBadge:bO,dependencyBadge:_O,blockedBadge:xO,addChildButton:kO,emptyState:SO,statusGroupHeader:jO,statusGroupIcon:TO,statusGroupLabel:NO,statusGroupCount:wO},CO=[{name:"title",weight:2},{name:"description",weight:1}],nk=16,EO=16,sk="grackle-task-group-by-status";function s_(){try{return localStorage.getItem(sk)==="true"}catch{return!1}}function AO(t){try{localStorage.setItem(sk,String(t))}catch{}}function DO({group:t,isExpanded:s,onToggle:o,selectedTaskId:r,navigate:c,titleHighlights:d,workspaceNames:u}){return a.jsxs("div",{"data-testid":`status-group-${t.status}`,children:[a.jsxs("div",{className:We.statusGroupHeader,role:"button",tabIndex:0,"aria-expanded":s,onClick:o,onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),o())},children:[a.jsx("span",{className:`${We.expandArrow} ${s?We.expanded:""}`,"aria-hidden":"true",children:a.jsx(pa,{size:Ye})}),a.jsx("span",{className:We.statusGroupIcon,style:{color:t.style.color},"aria-hidden":"true",children:t.style.icon}),a.jsx("span",{className:We.statusGroupLabel,children:t.label}),a.jsx("span",{className:We.statusGroupCount,children:t.tasks.length})]}),a.jsx(os,{children:s&&a.jsx(Pt.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{duration:.2},style:{overflow:"hidden"},children:t.tasks.map(p=>{const m=Ya(p.status),g=r===p.id,v=p.parentTaskId||!p.workspaceId?void 0:u.get(p.workspaceId);return a.jsxs("div",{onClick:()=>c(ls(p.id)),role:"button",tabIndex:0,"aria-label":p.title,onKeyDown:b=>{b.currentTarget===b.target&&(b.key==="Enter"||b.key===" ")&&(b.preventDefault(),c(ls(p.id)))},className:`${We.taskRow} ${g?We.selected:""}`,style:{"--task-indent":`${nk}px`},"data-task-id":p.id,children:[a.jsx("span",{className:We.leafSpacer}),a.jsx("span",{className:We.taskStatusIcon,style:{color:m.color},"aria-hidden":"true","data-testid":`task-status-${fl(p.status)}`,children:m.icon}),a.jsx("span",{className:We.taskTitle,title:p.title,children:a.jsx(tk,{text:p.title,indices:d.get(p.id),highlightClass:We.searchHighlight})}),v&&a.jsx("span",{className:We.workspaceBadge,title:v,children:v})]},p.id)})})})]})}function ak({node:t,depth:s,expandedTasks:o,toggleTask:r,selectedTaskId:c,navigate:d,taskStatusById:u,titleHighlights:p,workspaceNames:m}){const g=Ya(t.status),v=t.dependsOn.length>0&&t.dependsOn.some(N=>u.get(N)!=="complete"),b=o.has(t.id),_=t.children.length>0,k=c===t.id,S=nk+s*EO,T=s===0&&!t.parentTaskId&&t.workspaceId?m.get(t.workspaceId):void 0;return a.jsxs(a.Fragment,{children:[a.jsxs("div",{onClick:()=>d(ls(t.id)),role:"button",tabIndex:0,"aria-label":t.title,onKeyDown:N=>{N.currentTarget===N.target&&(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),d(ls(t.id)))},className:`${We.taskRow} ${k?We.selected:""}`,style:{"--task-indent":`${S}px`},"data-task-id":t.id,children:[_&&a.jsx("span",{className:`${We.expandArrow} ${b?We.expanded:""}`,role:"button",tabIndex:0,"aria-label":b?"Collapse task":"Expand task",onClick:N=>{N.stopPropagation(),r(t.id)},onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&(N.preventDefault(),N.stopPropagation(),r(t.id))},children:a.jsx(pa,{size:Ye,"aria-hidden":"true"})}),!_&&a.jsx("span",{className:We.leafSpacer}),a.jsx("span",{className:We.taskStatusIcon,style:{color:g.color},"aria-hidden":"true","data-testid":`task-status-${fl(t.status)}`,children:g.icon}),a.jsx("span",{className:We.taskTitle,title:t.title,children:a.jsx(tk,{text:t.title,indices:p.get(t.id),highlightClass:We.searchHighlight})}),T&&a.jsx("span",{className:We.workspaceBadge,title:T,children:T}),_&&a.jsxs("span",{className:We.childCountBadge,children:[t.children.filter(N=>N.status==="complete").length,"/",t.children.length]}),t.dependsOn.length>0&&a.jsx("span",{className:`${We.dependencyBadge} ${v?We.blockedBadge:""}`,title:`Depends on: ${t.dependsOn.join(", ")}`,children:v?"blocked":"dep"}),s<W2&&a.jsx(Ci,{text:"Add child task",children:a.jsx("button",{onClick:N=>{N.stopPropagation(),d(Ri(t.workspaceId,t.id))},"aria-label":"Add child task",className:We.addChildButton,children:"+"})})]}),a.jsx(os,{children:_&&b&&a.jsx(Pt.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{duration:.15},style:{overflow:"hidden"},children:t.children.map(N=>a.jsx(ak,{node:N,depth:s+1,expandedTasks:o,toggleTask:r,selectedTaskId:c,navigate:d,taskStatusById:u,titleHighlights:p,workspaceNames:m},N.id))})})]})}function MO({workspaces:t,tasks:s}){const o=xt(),[r,c]=y.useState(new Set),[d,u]=y.useState(new Set),[p,m]=y.useState(s_),[g,v]=y.useState(s_),[b,_]=y.useState(new Map),k=nn("/tasks/:taskId/*"),S=(k==null?void 0:k.params.taskId)!=="new"?k==null?void 0:k.params.taskId:void 0,j=y.useMemo(()=>new Map(s.map(Z=>[Z.id,Z.status])),[s]),T=y.useMemo(()=>new Map(t.map(Z=>[Z.id,Z.name])),[t]),N=()=>{const Z=!p;AO(Z),m(Z),Z&&(v(!0),_(new Map))},C=Z=>{_(se=>{const H=new Map(se),B=H.has(Z)?H.get(Z):g;return H.set(Z,!B),H})},D=Z=>b.has(Z)?b.get(Z):g,A=Z=>{c(se=>{const H=new Set(se);return H.has(Z)?(H.delete(Z),u(B=>new Set(B).add(Z))):(H.add(Z),u(B=>{const F=new Set(B);return F.delete(Z),F})),H})};y.useEffect(()=>{const Z=new Set(s.filter(se=>se.parentTaskId).map(se=>se.parentTaskId));Z.size>0&&c(se=>{const H=new Set(se);for(const B of Z)d.has(B)||H.add(B);return H})},[s,d]);const[E,R]=y.useState(""),{directMatchTaskIds:O,treeMatchTaskIds:M,titleHighlights:$}=y.useMemo(()=>{if(!E.trim())return{directMatchTaskIds:null,treeMatchTaskIds:null,titleHighlights:new Map};const Z=J2(s,E,CO),se=new Set(Z.map(ge=>ge.item.id)),H=new Map;for(const ge of Z){const ee=ge.matches.find(ce=>ce.key==="title");ee&&H.set(ge.item.id,ee.indices)}const B=new Set(se),F=new Map(s.map(ge=>[ge.id,ge]));for(const ge of[...se]){let ee=F.get(ge);for(;ee!=null&&ee.parentTaskId;)B.add(ee.parentTaskId),ee=F.get(ee.parentTaskId)}return{directMatchTaskIds:se,treeMatchTaskIds:B,titleHighlights:H}},[E,s]),Y=O!==null,V=Y?p?O:M:null,ne=V?s.filter(Z=>V.has(Z.id)):s,le=p?[]:tO(ne);return a.jsxs("div",{className:We.container,children:[a.jsxs("div",{className:We.header,children:[a.jsx("span",{children:"Tasks"}),a.jsxs("div",{className:We.headerActions,children:[a.jsx(Ci,{text:p?"Switch to tree view":"Group tasks by status",children:a.jsx("button",{className:`${We.groupToggle} ${p?We.groupToggleActive:""}`,onClick:N,"aria-label":p?"Switch to tree view":"Group tasks by status","aria-pressed":p,"data-testid":"task-group-by-status-toggle",children:a.jsx(ST,{size:Ht})})}),a.jsx(Ci,{text:"New task",children:a.jsx("button",{className:We.addButton,onClick:()=>o(Ri()),"aria-label":"New task","data-testid":"new-task-button",children:"+"})})]})]}),s.length>0&&a.jsx("input",{type:"text",value:E,onChange:Z=>R(Z.target.value),placeholder:"Filter...","aria-label":"Filter tasks",className:We.searchInput,"data-testid":"sidebar-search"}),p?nO(ne,j).map(Z=>a.jsx(DO,{group:Z,isExpanded:D(Z.status),onToggle:()=>C(Z.status),selectedTaskId:S,navigate:o,titleHighlights:$,workspaceNames:T},Z.status)):le.map(Z=>a.jsx(ak,{node:Z,depth:0,expandedTasks:r,toggleTask:A,selectedTaskId:S,navigate:o,taskStatusById:j,titleHighlights:$,workspaceNames:T},Z.id)),ne.length===0&&!Y&&a.jsx("div",{className:We.emptyState,children:"No tasks yet. Click + to create one."}),ne.length===0&&Y&&a.jsx("div",{className:We.emptyState,children:"No matching tasks"})]})}const RO="_toast_ed2dk_1",IO="_success_ed2dk_18",OO="_icon_ed2dk_22",BO="_error_ed2dk_25",LO="_warning_ed2dk_32",zO="_info_ed2dk_38",$O="_message_ed2dk_53",HO="_close_ed2dk_60",qr={toast:RO,success:IO,icon:OO,error:BO,warning:LO,info:zO,message:$O,close:HO},PO={success:a.jsx(Ai,{size:Et}),error:a.jsx(Ls,{size:Et}),warning:a.jsx(Sm,{size:Et}),info:a.jsx(km,{size:Et})};function UO({toast:t,onDismiss:s}){return y.useEffect(()=>{const o=setTimeout(()=>s(t.id),t.duration);return()=>clearTimeout(o)},[t.id,t.duration,s]),a.jsxs(Pt.div,{className:`${qr.toast} ${qr[t.variant]}`,role:"status",initial:{opacity:0,y:-16,scale:.94},animate:{opacity:1,y:0,scale:1},exit:{opacity:0,y:-8,scale:.94},transition:{duration:.2,ease:"easeOut"},layout:!0,children:[a.jsx("span",{className:qr.icon,"aria-hidden":"true",children:PO[t.variant]}),a.jsx("span",{className:qr.message,children:t.message}),a.jsx("button",{type:"button",className:qr.close,onClick:()=>s(t.id),"aria-label":"Dismiss notification",children:a.jsx(Ls,{size:Ht,"aria-hidden":"true"})})]})}const VO="_container_qqse2_1",qO={container:VO};function GO({toasts:t,onDismiss:s}){return a.jsx("div",{className:qO.container,"data-testid":"toast-container",children:a.jsx(os,{children:t.map(o=>a.jsx(UO,{toast:o,onDismiss:s},o.id))})})}const FO="_callout_e5awm_1",KO="_success_e5awm_11",ZO="_icon_e5awm_15",YO="_error_e5awm_18",JO="_warning_e5awm_25",WO="_info_e5awm_32",XO="_content_e5awm_48",QO="_close_e5awm_53",Gr={callout:FO,success:KO,icon:ZO,error:YO,warning:JO,info:WO,content:XO,close:QO},eB={success:a.jsx(Ai,{size:Et}),error:a.jsx(Ls,{size:Et}),warning:a.jsx(Sm,{size:Et}),info:a.jsx(km,{size:Et})};function tB({variant:t="info",children:s,dismissible:o=!1,className:r}){const[c,d]=y.useState(!1);return a.jsx(a.Fragment,{children:!c&&a.jsxs("div",{className:[Gr.callout,Gr[t],r].filter(Boolean).join(" "),role:t==="error"||t==="warning"?"alert":"status",children:[a.jsx("span",{className:Gr.icon,"aria-hidden":"true",children:eB[t]}),a.jsx("span",{className:Gr.content,children:s}),o&&a.jsx("button",{type:"button",className:Gr.close,onClick:()=>d(!0),"aria-label":"Dismiss",children:a.jsx(Ls,{size:Ht,"aria-hidden":"true"})})]})})}function nB({currentVersion:t,latestVersion:s,updateAvailable:o,isDocker:r}){if(!o)return a.jsx(a.Fragment,{});const c=r?"docker pull ghcr.io/nick-pape/grackle:latest && docker restart grackle":`npm install -g @grackle-ai/cli@${s}`;return a.jsx("div",{"data-testid":"update-banner",children:a.jsxs(tB,{variant:"info",dismissible:!0,children:[a.jsxs("strong",{children:["Grackle v",s]})," is available (you have v",t,")."," ","Run: ",a.jsx("code",{children:c})]})})}const sB="_container_m1fsr_1",aB="_heading_m1fsr_7",iB="_section_m1fsr_14",oB="_sectionTitle_m1fsr_26",rB="_sectionDescription_m1fsr_35",lB="_emptyState_m1fsr_41",cB="_tokenList_m1fsr_48",dB="_tokenRow_m1fsr_55",uB="_tokenBadge_m1fsr_68",fB="_tokenName_m1fsr_83",pB="_tokenTarget_m1fsr_90",mB="_deleteButton_m1fsr_99",hB="_addForm_m1fsr_113",gB="_formRow_m1fsr_119",vB="_input_m1fsr_125",yB="_select_m1fsr_155",bB="_addButton_m1fsr_187",_B="_emptyStateInfo_m1fsr_221",xB="_themeOptions_m1fsr_229",kB="_themeOption_m1fsr_229",SB="_themeOptionSelected_m1fsr_254",jB="_themeOptionHeader_m1fsr_259",TB="_themeOptionLabel_m1fsr_266",NB="_themeOptionDesc_m1fsr_273",wB="_variantToggle_m1fsr_279",CB="_variantButton_m1fsr_286",EB="_variantActive_m1fsr_305",AB="_themeSwatches_m1fsr_311",DB="_themeSwatch_m1fsr_311",MB="_systemToggle_m1fsr_325",RB="_systemToggleHint_m1fsr_341",IB="_themeActive_m1fsr_348",OB="_aboutGrid_m1fsr_354",BB="_aboutItem_m1fsr_360",LB="_aboutLabel_m1fsr_373",zB="_aboutValue_m1fsr_379",$B="_aboutDot_m1fsr_387",HB="_aboutDotConnected_m1fsr_394",PB="_aboutDotDisconnected_m1fsr_398",UB="_aboutDotConnecting_m1fsr_402",fe={container:sB,heading:aB,section:iB,sectionTitle:oB,sectionDescription:rB,emptyState:lB,tokenList:cB,tokenRow:dB,tokenBadge:uB,tokenName:fB,tokenTarget:pB,deleteButton:mB,addForm:hB,formRow:gB,input:vB,select:yB,addButton:bB,emptyStateInfo:_B,themeOptions:xB,themeOption:kB,themeOptionSelected:SB,themeOptionHeader:jB,themeOptionLabel:TB,themeOptionDesc:NB,variantToggle:wB,variantButton:CB,variantActive:EB,themeSwatches:AB,themeSwatch:DB,systemToggle:MB,systemToggleHint:RB,themeActive:IB,aboutGrid:OB,aboutItem:BB,aboutLabel:LB,aboutValue:zB,aboutDot:$B,aboutDotConnected:HB,aboutDotDisconnected:PB,aboutDotConnecting:UB},VB=[{value:"env_var",label:"Environment Variable"},{value:"file",label:"File"}];function qB({tokens:t,onSetToken:s,onDeleteToken:o,onShowToast:r}){const[c,d]=y.useState(""),[u,p]=y.useState(""),[m,g]=y.useState("env_var"),[v,b]=y.useState(""),[_,k]=y.useState(null),S=N=>{if(N.preventDefault(),!c||!u)return;const C=m==="env_var"?v||c.toUpperCase()+"_TOKEN":"";s(c,u,m,C,m==="file"?v:""),r==null||r("Token saved successfully","success"),d(""),p(""),b("")},j=N=>{k(N)},T=()=>{_&&(o(_),r==null||r("Token deleted","info")),k(null)};return a.jsxs(a.Fragment,{children:[a.jsx(_s,{isOpen:_!==null,title:"Delete Token?",description:_?`"${_}" will be permanently removed.`:void 0,onConfirm:T,onCancel:()=>k(null)}),a.jsxs("section",{className:fe.section,children:[a.jsx("h3",{className:fe.sectionTitle,children:"Tokens"}),a.jsx("p",{className:fe.sectionDescription,children:"API tokens are auto-pushed to environments when set or updated. Values are write-only."}),t.length===0?a.jsx("div",{className:fe.emptyStateInfo,children:"Add your first API token to enable service integrations."}):a.jsx("div",{className:fe.tokenList,children:t.map(N=>a.jsxs("div",{className:fe.tokenRow,children:[a.jsx("span",{className:fe.tokenBadge,children:N.tokenType}),a.jsx("span",{className:fe.tokenName,children:N.name}),a.jsx("span",{className:fe.tokenTarget,children:N.tokenType==="env_var"?N.envVar:N.filePath}),a.jsx("button",{className:fe.deleteButton,onClick:()=>j(N.name),title:`Delete ${N.name}`,"aria-label":`Delete ${N.name}`,children:a.jsx(Ls,{size:Ht,"aria-hidden":"true"})})]},N.name))}),a.jsxs("form",{className:fe.addForm,onSubmit:S,children:[a.jsxs("div",{className:fe.formRow,children:[a.jsx("input",{className:fe.input,type:"text",placeholder:"Token name",value:c,onChange:N=>d(N.target.value)}),a.jsx("input",{className:fe.input,type:"password",placeholder:"Value",value:u,onChange:N=>p(N.target.value)})]}),a.jsxs("div",{className:fe.formRow,children:[a.jsx("select",{className:fe.select,value:m,onChange:N=>g(N.target.value),children:VB.map(N=>a.jsx("option",{value:N.value,children:N.label},N.value))}),a.jsx("input",{className:fe.input,type:"text",placeholder:m==="env_var"?"Env var name (e.g. API_TOKEN)":"File path (e.g. /home/user/.token)",value:v,onChange:N=>b(N.target.value)}),a.jsx("button",{className:fe.addButton,type:"submit",children:"Add Token"})]})]})]})]})}const Od=[{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"]}],ik=new Set(Od.map(t=>t.id)),a_="grackle";function pm(t){return Od.find(s=>s.id===t)}function GB({themeId:t,resolvedThemeId:s,onSetTheme:o,preferSystem:r,onSetPreferSystem:c}){return a.jsxs("section",{className:fe.section,children:[a.jsx("h3",{className:fe.sectionTitle,children:"Appearance"}),a.jsx("p",{className:fe.sectionDescription,children:"Choose how Grackle looks across the app."}),a.jsx("div",{className:fe.themeOptions,children:Od.filter(d=>!d.hidden).map(d=>{const u=!!(d.variantLightId&&d.variantDarkId),p=u?t===d.id||t===d.variantLightId||t===d.variantDarkId:t===d.id,m=u&&s===d.variantLightId;return a.jsxs("button",{type:"button",className:`${fe.themeOption} ${p?fe.themeOptionSelected:""}`,"aria-pressed":p,onClick:()=>o(d.id),children:[a.jsxs("span",{className:fe.themeOptionHeader,children:[a.jsxs("span",{children:[a.jsx("span",{className:fe.themeOptionLabel,children:d.label}),a.jsx("span",{className:fe.themeOptionDesc,children:d.description})]}),u&&a.jsxs("span",{className:fe.variantToggle,children:[a.jsx("span",{role:"button",tabIndex:0,className:`${fe.variantButton} ${p&&m?fe.variantActive:""}`,onClick:g=>{g.stopPropagation(),c(!1),o(d.variantLightId)},onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),g.stopPropagation(),c(!1),o(d.variantLightId))},"aria-label":"Light variant","aria-pressed":p&&m,children:"☼"}),a.jsx("span",{role:"button",tabIndex:0,className:`${fe.variantButton} ${p&&!m?fe.variantActive:""}`,onClick:g=>{g.stopPropagation(),c(!1),o(d.variantDarkId)},onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),g.stopPropagation(),c(!1),o(d.variantDarkId))},"aria-label":"Dark variant","aria-pressed":p&&!m,children:"☾"})]})]}),d.swatches&&a.jsx("span",{className:fe.themeSwatches,children:d.swatches.map((g,v)=>a.jsx("span",{className:fe.themeSwatch,style:{background:g}},v))})]},d.id)})}),a.jsxs("label",{className:fe.systemToggle,children:[a.jsx("input",{type:"checkbox",checked:r,onChange:d=>c(d.target.checked)}),a.jsx("span",{children:"Match system light/dark preference"})]}),a.jsx("p",{className:fe.systemToggleHint,children:"Automatically switches between light and dark variants when available."}),a.jsxs("p",{className:fe.themeActive,children:["Active theme: ",a.jsx("strong",{children:s})]})]})}const FB={connected:"Connected",connecting:"Connecting...",disconnected:"Disconnected"},KB={connected:fe.aboutDotConnected,connecting:fe.aboutDotConnecting,disconnected:fe.aboutDotDisconnected};function ZB({connectionStatus:t,environments:s,sessions:o}){const r=s.filter(u=>u.status==="connected").length,c=s.length,d=o.filter(u=>["running","idle"].includes(u.status)).length;return a.jsxs("section",{className:fe.section,"data-testid":"about-panel",children:[a.jsx("h3",{className:fe.sectionTitle,children:"About"}),a.jsx("p",{className:fe.sectionDescription,children:"Connection status and application information."}),a.jsxs("div",{className:fe.aboutGrid,children:[a.jsxs("div",{className:fe.aboutItem,children:[a.jsx("span",{className:fe.aboutLabel,children:"Connection"}),a.jsxs("span",{className:fe.aboutValue,children:[a.jsx("span",{className:`${fe.aboutDot} ${KB[t]}`}),FB[t]]})]}),a.jsxs("div",{className:fe.aboutItem,children:[a.jsx("span",{className:fe.aboutLabel,children:"Environments"}),a.jsxs("span",{className:fe.aboutValue,children:[r,"/",c," connected"]})]}),a.jsxs("div",{className:fe.aboutItem,children:[a.jsx("span",{className:fe.aboutLabel,children:"Active Sessions"}),a.jsx("span",{className:fe.aboutValue,children:d})]}),a.jsxs("div",{className:fe.aboutItem,children:[a.jsx("span",{className:fe.aboutLabel,children:"Version"}),a.jsx("span",{className:fe.aboutValue,children:"0.128.0"})]})]})]})}const YB="_container_cddyd_1",JB="_header_cddyd_8",WB="_headerTitle_cddyd_35",XB="_badge_cddyd_44",QB="_headerActions_cddyd_54",eL="_body_cddyd_61",tL="_formContent_cddyd_73",nL="_section_cddyd_85",sL="_label_cddyd_91",aL="_titleInput_cddyd_98",iL="_descriptionTextarea_cddyd_131",oL="_parentContext_cddyd_167",rL="_parentLabel_cddyd_175",lL="_parentName_cddyd_182",cL="_personaSelect_cddyd_186",dL="_depList_cddyd_220",uL="_depItem_cddyd_226",fL="_depItemSelected_cddyd_248",pL="_noDeps_cddyd_252",mL="_btnPrimary_cddyd_258",hL="_btnGhost_cddyd_289",Qe={container:YB,header:JB,headerTitle:WB,badge:XB,headerActions:QB,body:eL,formContent:tL,section:nL,label:sL,titleInput:aL,descriptionTextarea:iL,parentContext:oL,parentLabel:rL,parentName:lL,personaSelect:cL,depList:dL,depItem:uL,depItemSelected:fL,noDeps:pL,btnPrimary:mL,btnGhost:hL};function ok({mode:t,taskId:s,workspaceId:o,parentTaskId:r,environmentId:c,tasks:d,workspaces:u,personas:p,onCreateTask:m,onUpdateTask:g,onEditDone:v,onShowToast:b}){const _=xt(),k=t==="edit",S=k&&s?d.find(ke=>ke.id===s):void 0,j=k?(S==null?void 0:S.workspaceId)??"":o??"",[T,N]=y.useState(j),C=j||T,D=u.find(ke=>ke.id===C),A=c??(D==null?void 0:D.linkedEnvironmentIds[0]),E=!k&&!o,R=k?(S==null?void 0:S.parentTaskId)??"":r??"",O=R?d.find(ke=>ke.id===R):void 0,[M,$]=y.useState((S==null?void 0:S.title)??""),[Y,V]=y.useState((S==null?void 0:S.description)??""),[ne,le]=y.useState((S==null?void 0:S.dependsOn)??[]),[Z,se]=y.useState((S==null?void 0:S.defaultPersonaId)??""),[H,B]=y.useState((S==null?void 0:S.canDecompose)??!1),[F,ge]=y.useState((S==null?void 0:S.injectKnowledge)??!0),[ee,ce]=y.useState(!1),me=y.useRef(!1);y.useEffect(()=>{k&&S&&!me.current&&(me.current=!0,$(S.title),V(S.description),le(S.dependsOn),se(S.defaultPersonaId),B(S.canDecompose),ge(S.injectKnowledge))},[k,S]);const xe=d.filter(ke=>ke.workspaceId===C&&(!k||ke.id!==s)&&ke.id!==R),De=M.trim().length>0&&(!k||S!==void 0)&&C.length>0,ot=ke=>{le(ct=>ct.includes(ke)?ct.filter(ue=>ue!==ke):[...ct,ke])},bt=()=>{!De||ee||k&&S===void 0||(k&&s?(g(s,M.trim(),Y,ne,Z),b==null||b("Task updated","success"),v?v():_(ls(s,void 0,C,A),{replace:!0})):(ce(!0),m(C,M.trim(),Y,ne.length>0?ne:void 0,R||void 0,Z,H,F,()=>{b==null||b("Task created","success"),_(o?wi(o,A):"/tasks",{replace:!0})},ke=>{b==null||b(ke,"error"),ce(!1)})))},lt=()=>{if(v){v();return}_(k&&s?ls(s,void 0,C,A):o?wi(o,A):"/tasks")},Pe=k?"edit task":R?"child task":"new task";return a.jsxs("div",{className:Qe.container,children:[a.jsxs("div",{className:Qe.header,children:[a.jsxs("div",{className:Qe.headerTitle,children:[a.jsx("span",{className:Qe.badge,children:Pe}),O&&a.jsxs("span",{className:Qe.parentContext,children:[a.jsx("span",{className:Qe.parentLabel,children:"Child of"}),a.jsx("span",{className:Qe.parentName,children:O.title})]})]}),a.jsxs("div",{className:Qe.headerActions,children:[a.jsx("button",{onClick:bt,disabled:!De||ee,className:Qe.btnPrimary,"data-testid":"task-edit-save",children:ee?"Creating…":k?"Save Changes":"Create"}),a.jsx("button",{onClick:lt,className:Qe.btnGhost,children:"Cancel"})]})]}),a.jsx("div",{className:Qe.body,children:a.jsxs("div",{className:Qe.formContent,children:[E&&a.jsxs("div",{className:Qe.section,children:[a.jsx("label",{className:Qe.label,htmlFor:"task-edit-workspace",children:"Workspace"}),a.jsxs("select",{id:"task-edit-workspace",value:T,onChange:ke=>N(ke.target.value),className:Qe.personaSelect,"data-testid":"task-edit-workspace",children:[a.jsx("option",{value:"",children:"Select a workspace..."}),u.map(ke=>a.jsx("option",{value:ke.id,children:ke.name},ke.id))]})]}),a.jsxs("div",{className:Qe.section,children:[a.jsx("label",{className:Qe.label,htmlFor:"task-edit-title",children:"Title"}),a.jsx("input",{id:"task-edit-title",type:"text",value:M,onChange:ke=>$(ke.target.value),placeholder:"Task title...",autoFocus:!0,className:Qe.titleInput,"data-testid":"task-edit-title",onKeyDown:ke=>{ke.key==="Enter"&&De&&bt()}})]}),a.jsxs("div",{className:Qe.section,children:[a.jsx("label",{className:Qe.label,htmlFor:"task-edit-description",children:"Description"}),a.jsx("textarea",{id:"task-edit-description",value:Y,onChange:ke=>V(ke.target.value),placeholder:"Describe the task... (markdown supported)",className:Qe.descriptionTextarea,"data-testid":"task-edit-description",rows:8})]}),a.jsxs("div",{className:Qe.section,children:[a.jsx("label",{className:Qe.label,htmlFor:"task-edit-persona",children:"Default Persona"}),a.jsxs("select",{id:"task-edit-persona",value:Z,onChange:ke=>se(ke.target.value),className:Qe.personaSelect,"data-testid":"task-edit-persona",children:[a.jsx("option",{value:"",children:"(Inherit)"}),p.map(ke=>a.jsx("option",{value:ke.id,children:ke.name},ke.id))]})]}),!k&&a.jsx("div",{className:Qe.section,children:a.jsxs("label",{className:Qe.depItem,"data-testid":"task-edit-can-decompose",children:[a.jsx("input",{type:"checkbox",checked:H,onChange:ke=>B(ke.target.checked)}),"Can spawn subtasks"]})}),!k&&a.jsx("div",{className:Qe.section,children:a.jsxs("label",{className:Qe.depItem,"data-testid":"task-edit-inject-knowledge",children:[a.jsx("input",{type:"checkbox",checked:F,onChange:ke=>ge(ke.target.checked)}),"Inject related prior work from the knowledge graph"]})}),a.jsxs("div",{className:Qe.section,children:[a.jsx("div",{className:Qe.label,children:"Dependencies"}),xe.length===0?a.jsx("div",{className:Qe.noDeps,children:"No other tasks in this workspace"}):a.jsx("div",{className:Qe.depList,children:xe.map(ke=>{const ct=ne.includes(ke.id);return a.jsxs("label",{className:`${Qe.depItem} ${ct?Qe.depItemSelected:""}`,"data-testid":`dep-option-${ke.id}`,children:[a.jsx("input",{type:"checkbox",checked:ct,onChange:()=>ot(ke.id)}),ke.title,a.jsxs("span",{style:{opacity:.5,fontSize:"11px",marginLeft:"4px"},children:["(",ke.status,")"]})]},ke.id)})})]})]})})]})}const gL="_actionButtons_1rjka_1",vL="_btnPrimary_1rjka_8",yL="_btnDanger_1rjka_39",bL="_btnGhost_1rjka_78",Yt={actionButtons:gL,btnPrimary:vL,btnDanger:yL,btnGhost:bL};function _L({task:t,sessionId:s,isBlocked:o,onStart:r,onResume:c,onStop:d,onPause:u,onDelete:p,onEdit:m}){if(t.status==="not_started")return o?a.jsxs("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:[a.jsx("button",{onClick:m,className:Yt.btnGhost,"data-testid":"task-action-edit",children:"Edit"}),a.jsx("button",{onClick:p,className:Yt.btnDanger,"data-testid":"task-action-delete",children:"Delete"})]}):a.jsxs("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:[a.jsx("button",{"data-testid":"task-header-start",onClick:r,className:Yt.btnPrimary,children:"Start"}),a.jsx("button",{onClick:m,className:Yt.btnGhost,"data-testid":"task-action-edit",children:"Edit"}),a.jsx("button",{onClick:p,className:Yt.btnDanger,"data-testid":"task-action-delete",children:"Delete"})]});if(t.status==="working")return a.jsxs("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:[a.jsx("button",{onClick:d,className:Yt.btnDanger,"data-testid":"task-action-stop",children:"Stop"}),a.jsx("button",{onClick:u,disabled:!s,className:Yt.btnGhost,"data-testid":"task-action-pause",children:"Pause"})]});if(t.status==="paused")return a.jsxs("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:[a.jsx("button",{onClick:d,className:Yt.btnPrimary,"data-testid":"task-action-stop",children:"Stop"}),a.jsx("button",{onClick:c,className:Yt.btnGhost,"data-testid":"task-action-resume",children:"Resume"}),a.jsx("button",{onClick:p,className:Yt.btnDanger,"data-testid":"task-action-delete",children:"Delete"})]});if(t.status==="complete")return a.jsx("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:a.jsx("button",{onClick:p,className:Yt.btnDanger,"data-testid":"task-action-delete",children:"Delete"})});if(t.status==="failed")return a.jsxs("div",{className:Yt.actionButtons,"data-testid":"task-action-buttons",children:[a.jsx("button",{onClick:r,className:Yt.btnPrimary,"data-testid":"task-header-start",children:"Retry"}),a.jsx("button",{onClick:p,className:Yt.btnDanger,"data-testid":"task-action-delete",children:"Delete"})]})}const xL="_workpadSection_y8nj9_1",kL="_workpadLabel_y8nj9_9",SL="_workpadStatus_y8nj9_17",jL="_workpadSummary_y8nj9_23",TL="_workpadExtra_y8nj9_29",Va={workpadSection:xL,workpadLabel:kL,workpadStatus:SL,workpadSummary:jL,workpadExtra:TL};function NL({workpad:t}){if(!t)return;let s;try{const o=JSON.parse(t);if(o==null||typeof o!="object"||Array.isArray(o))return;s=o}catch{return a.jsxs("div",{className:Va.workpadSection,"data-testid":"workpad-panel",children:[a.jsx("div",{className:Va.workpadLabel,children:"Workpad"}),a.jsx("div",{className:Va.workpadExtra,children:t})]})}if(!(!s.status&&!s.summary&&!s.extra))return a.jsxs("div",{className:Va.workpadSection,"data-testid":"workpad-panel",children:[a.jsx("div",{className:Va.workpadLabel,children:"Workpad"}),s.status&&a.jsx("div",{className:Va.workpadStatus,"data-testid":"workpad-status",children:s.status}),s.summary&&a.jsx("div",{className:Va.workpadSummary,"data-testid":"workpad-summary",children:s.summary}),s.extra&&Object.keys(s.extra).length>0&&a.jsx("div",{className:Va.workpadExtra,"data-testid":"workpad-extra",children:JSON.stringify(s.extra,null,2)})]})}const wL="_overviewDashboard_r05qm_1",CL="_overviewHero_r05qm_7",EL="_statusBadge_r05qm_14",AL="_statusPending_r05qm_26",DL="_statusAssigned_r05qm_31",ML="_statusInProgress_r05qm_36",RL="_statusReview_r05qm_41",IL="_statusDone_r05qm_46",OL="_statusFailed_r05qm_51",BL="_statusWaitingInput_r05qm_56",LL="_overviewBranchPill_r05qm_61",zL="_branchLink_r05qm_76",$L="_overviewSection_r05qm_87",HL="_overviewLabel_r05qm_93",PL="_overviewValue_r05qm_100",UL="_overviewMuted_r05qm_105",VL="_overviewMarkdown_r05qm_111",qL="_envRow_r05qm_180",GL="_envDot_r05qm_186",FL="_envDotGreen_r05qm_193",KL="_envDotYellow_r05qm_197",ZL="_envDotRed_r05qm_201",YL="_envDotGray_r05qm_205",JL="_depList_r05qm_209",WL="_depItem_r05qm_215",XL="_depBlocked_r05qm_222",QL="_depDone_r05qm_226",e8="_timeline_r05qm_230",t8="_timelineRow_r05qm_236",n8="_timelineKey_r05qm_243",s8="_timelineValue_r05qm_249",a8="_timelineDelta_r05qm_253",i8="_reviewNotes_r05qm_264",be={overviewDashboard:wL,overviewHero:CL,statusBadge:EL,statusPending:AL,statusAssigned:DL,statusInProgress:ML,statusReview:RL,statusDone:IL,statusFailed:OL,statusWaitingInput:BL,overviewBranchPill:LL,branchLink:zL,overviewSection:$L,overviewLabel:HL,overviewValue:PL,overviewMuted:UL,overviewMarkdown:VL,envRow:qL,envDot:GL,envDotGreen:FL,envDotYellow:KL,envDotRed:ZL,envDotGray:YL,depList:JL,depItem:WL,depBlocked:XL,depDone:QL,timeline:e8,timelineRow:t8,timelineKey:n8,timelineValue:s8,timelineDelta:a8,reviewNotes:i8};function Gc(t){if(!t)return"—";const s=new Date(t);return isNaN(s.getTime())?"—":s.toLocaleString(void 0,{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"})}function Cp(t,s){if(!t||!s)return;const o=new Date(s).getTime()-new Date(t).getTime();if(isNaN(o)||o<0)return;const r=Math.floor(o/6e4),c=Math.floor(o%6e4/1e3);if(r===0)return`${c}s`;const d=Math.floor(r/60),u=r%60;return d===0?`${r}m ${c}s`:`${d}h ${u}m`}function i_(t){const s=t.toLowerCase();return s==="ready"||s==="running"||s==="available"||s==="connected"?be.envDotGreen:s==="provisioning"||s==="starting"||s==="pending"||s==="connecting"?be.envDotYellow:s==="error"||s==="failed"||s==="disconnected"?be.envDotRed:be.envDotGray}function o8({status:t}){const s=Ya(t),o=aN(t);return a.jsx("span",{className:`${be.statusBadge} ${be[o]??be.statusPending}`,"data-testid":"task-overview-status-badge",children:s.label})}function r8({task:t,tasksById:s,environments:o,workspaces:r,taskSessions:c,selectedEnvId:d,taskUsage:u,treeUsage:p}){const m=c.length>0?c[c.length-1]:void 0,g=(m==null?void 0:m.environmentId)??"",v=g?o.find(S=>S.id===g):void 0,b=r.find(S=>S.id===t.workspaceId),_=o.find(S=>S.id===d),k=t.branch&&(b!=null&&b.repoUrl)?`${b.repoUrl.replace(/\/$/,"")}/tree/${encodeURIComponent(t.branch)}`:void 0;return a.jsxs("div",{className:be.overviewDashboard,"data-testid":"task-overview-panel",children:[a.jsxs("div",{className:be.overviewHero,children:[a.jsx(o8,{status:t.status}),t.branch&&a.jsx("span",{className:be.overviewBranchPill,"data-testid":"task-overview-branch",children:k?a.jsxs("a",{href:k,target:"_blank",rel:"noreferrer noopener",className:be.branchLink,children:["🔗"," ",t.branch]}):a.jsxs("span",{children:["🔗"," ",t.branch]})})]}),typeof t.description=="string"&&t.description&&a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-description",children:[a.jsx("div",{className:be.overviewLabel,children:"Description"}),a.jsx("div",{className:be.overviewMarkdown,children:a.jsx(_m,{remarkPlugins:[xm],children:t.description})})]}),t.workpad&&a.jsx(NL,{workpad:t.workpad}),a.jsxs("div",{className:be.overviewSection,children:[a.jsx("div",{className:be.overviewLabel,children:"Environment"}),g&&v?a.jsxs("div",{className:be.envRow,"data-testid":"task-overview-environment",children:[a.jsx("span",{className:`${be.envDot} ${i_(v.status)}`,title:v.status,"aria-label":`Status: ${v.status}`,role:"img"}),a.jsx("span",{className:be.overviewValue,children:v.displayName})]}):_?a.jsxs("div",{className:be.envRow,"data-testid":"task-overview-environment",children:[a.jsx("span",{className:`${be.envDot} ${i_(_.status)}`,title:_.status,"aria-label":`Status: ${_.status}`,role:"img"}),a.jsx("span",{className:be.overviewValue,children:_.displayName}),a.jsx("span",{className:be.overviewMuted,children:"(workspace default)"})]}):a.jsx("div",{className:be.overviewMuted,children:"Set in workspace settings"})]}),a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-dependencies",children:[a.jsx("div",{className:be.overviewLabel,children:"Dependencies"}),t.dependsOn.length===0?a.jsx("div",{className:be.overviewMuted,children:"None"}):a.jsx("div",{className:be.depList,children:t.dependsOn.map(S=>{const j=s.get(S),T=(j==null?void 0:j.status)==="complete";return a.jsxs("div",{className:`${be.depItem} ${T?be.depDone:be.depBlocked}`,children:[a.jsx("span",{children:T?"✓":"○"}),a.jsx("span",{children:(j==null?void 0:j.title)??S})]},S)})})]}),a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-timeline",children:[a.jsx("div",{className:be.overviewLabel,children:"Timeline"}),a.jsxs("div",{className:be.timeline,children:[t.createdAt&&a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Created"}),a.jsx("span",{className:be.timelineValue,children:Gc(t.createdAt)})]}),t.assignedAt&&(()=>{const S=Cp(t.createdAt,t.assignedAt);return a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Assigned"}),a.jsx("span",{className:be.timelineValue,children:Gc(t.assignedAt)}),S!==void 0&&a.jsx("span",{className:be.timelineDelta,children:S})]})})(),t.startedAt&&(()=>{const S=Cp(t.assignedAt??t.createdAt,t.startedAt);return a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Started"}),a.jsx("span",{className:be.timelineValue,children:Gc(t.startedAt)}),S!==void 0&&a.jsx("span",{className:be.timelineDelta,children:S})]})})(),t.completedAt&&(()=>{const S=Cp(t.startedAt,t.completedAt);return a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Completed"}),a.jsx("span",{className:be.timelineValue,children:Gc(t.completedAt)}),S!==void 0&&a.jsx("span",{className:be.timelineDelta,children:S})]})})(),!t.createdAt&&!t.assignedAt&&!t.startedAt&&!t.completedAt&&a.jsx("div",{className:be.overviewMuted,children:"No timing data"})]})]}),u&&u.costMillicents>0&&a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-usage",children:[a.jsx("div",{className:be.overviewLabel,children:"Usage"}),a.jsxs("div",{className:be.timeline,children:[a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Cost"}),a.jsx("span",{className:be.timelineValue,children:Rs(u.costMillicents)}),a.jsxs("span",{className:be.timelineDelta,children:[u.sessionCount," session",u.sessionCount!==1?"s":""]})]}),p&&p.costMillicents>u.costMillicents&&a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Total (incl. subtasks)"}),a.jsx("span",{className:be.timelineValue,children:Rs(p.costMillicents)}),a.jsxs("span",{className:be.timelineDelta,children:[p.sessionCount," session",p.sessionCount!==1?"s":""]})]})]})]}),(t.tokenBudget>0||t.costBudgetMillicents>0)&&a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-budget",children:[a.jsx("div",{className:be.overviewLabel,children:"Budget"}),a.jsxs("div",{className:be.timeline,children:[t.tokenBudget>0&&a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Tokens"}),a.jsxs("span",{className:be.timelineValue,children:[Ho(((u==null?void 0:u.inputTokens)??0)+((u==null?void 0:u.outputTokens)??0))," / ",Ho(t.tokenBudget)]})]}),t.costBudgetMillicents>0&&a.jsxs("div",{className:be.timelineRow,children:[a.jsx("span",{className:be.timelineKey,children:"Cost"}),a.jsxs("span",{className:be.timelineValue,children:[Rs((u==null?void 0:u.costMillicents)??0)," / ",Rs(t.costBudgetMillicents)]})]})]})]}),t.reviewNotes&&a.jsxs("div",{className:be.overviewSection,"data-testid":"task-overview-review-notes",children:[a.jsx("div",{className:be.overviewLabel,children:"Review Notes"}),a.jsx("div",{className:be.reviewNotes,children:t.reviewNotes})]})]})}function l8({plugins:t,loading:s,onSetPluginEnabled:o}){return a.jsxs("div",{className:fe.container,"data-testid":"plugins-panel",children:[a.jsx("h2",{className:fe.heading,children:"Plugins"}),a.jsxs("div",{className:fe.section,children:[a.jsx("p",{className:fe.sectionDescription,children:"Enable or disable optional Grackle plugins. A server restart is required for changes to take effect."}),s&&a.jsx("p",{className:fe.emptyState,children:"Loading plugins..."}),!s&&t.length===0&&a.jsx("p",{className:fe.emptyState,children:"No plugins found."}),!s&&t.map(r=>{const c=r.enabled!==r.loaded;return a.jsxs("div",{className:fe.tokenRow,"data-testid":`plugin-row-${r.name}`,children:[a.jsxs("div",{style:{flex:1},children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[a.jsx("span",{className:fe.tokenName,children:r.name}),r.required&&a.jsx("span",{className:fe.tokenBadge,title:"Required — cannot be disabled",children:"required"})]}),a.jsx("div",{className:fe.tokenTarget,children:r.description}),c&&a.jsx("div",{style:{fontSize:"var(--font-size-xs)",color:"var(--accent-yellow)",marginTop:"2px"},"data-testid":`plugin-restart-notice-${r.name}`,children:"Restart Grackle to apply changes"})]}),a.jsx("label",{style:{display:"flex",alignItems:"center",gap:"6px",cursor:r.required?"not-allowed":"pointer"},title:r.required?"Core is required and cannot be disabled":void 0,children:a.jsx("input",{type:"checkbox",checked:r.enabled,disabled:r.required,onChange:d=>o(r.name,d.target.checked),"data-testid":`plugin-toggle-${r.name}`,"aria-label":`Enable or disable ${r.name} plugin`,style:{accentColor:"var(--accent-green)",width:"16px",height:"16px"}})})]},r.name)})]})]})}function c8({githubAccounts:t,githubAccountsLoading:s,onAddGitHubAccount:o,onUpdateGitHubAccount:r,onRemoveGitHubAccount:c,onImportGitHubAccounts:d,onShowToast:u}){const[p,m]=y.useState(""),[g,v]=y.useState(""),[b,_]=y.useState(!1),[k,S]=y.useState(!1),[j,T]=y.useState(!1),[N,C]=y.useState(null),D=t.find(M=>M.id===N),A=async M=>{if(M.preventDefault(),!(!p.trim()||!g.trim())){S(!0);try{await o(p.trim(),g.trim(),"",b),u==null||u("GitHub account added","success"),m(""),v(""),_(!1)}catch($){const Y=$ instanceof Error?$.message:"Failed to add account";u==null||u(Y,"error")}finally{S(!1)}}},E=async M=>{try{await r(M,{isDefault:!0}),u==null||u("Default account updated","success")}catch($){const Y=$ instanceof Error?$.message:"Failed to update account";u==null||u(Y,"error")}},R=async()=>{if(N)try{await c(N),u==null||u("GitHub account removed","info")}catch(M){const $=M instanceof Error?M.message:"Failed to remove account";u==null||u($,"error")}finally{C(null)}},O=async()=>{T(!0);try{const M=await d();M.imported>0?u==null||u(`Imported ${M.imported} account(s): ${M.usernames.join(", ")}`,"success"):u==null||u("No new accounts to import","info")}catch(M){const $=M instanceof Error?M.message:"Import failed";u==null||u($,"error")}finally{T(!1)}};return a.jsxs(a.Fragment,{children:[a.jsx(_s,{isOpen:N!==null,title:"Remove GitHub Account?",description:D?`"${D.label}"${D.username?` (@${D.username})`:""} will be permanently removed.`:void 0,onConfirm:()=>{R().catch(()=>{})},onCancel:()=>C(null)}),a.jsxs("section",{className:fe.section,"data-testid":"github-accounts-panel",children:[a.jsx("h3",{className:fe.sectionTitle,children:"GitHub Accounts"}),a.jsx("p",{className:fe.sectionDescription,children:"Register multiple GitHub accounts to use different identities per environment. The default account is used when no specific account is assigned."}),s&&t.length===0?a.jsx("div",{className:fe.emptyState,children:"Loading..."}):t.length===0?a.jsx("div",{className:fe.emptyStateInfo,children:"No GitHub accounts registered. Add one below or import from the gh CLI."}):a.jsx("div",{className:fe.tokenList,children:t.map(M=>a.jsxs("div",{className:fe.tokenRow,"data-testid":`github-account-row-${M.id}`,children:[M.isDefault&&a.jsx("span",{className:fe.tokenBadge,title:"Default account",children:"default"}),a.jsx("span",{className:fe.tokenName,children:M.label}),M.username&&a.jsxs("span",{className:fe.tokenTarget,children:["@",M.username]}),!M.isDefault&&a.jsx("button",{className:fe.deleteButton,onClick:()=>{E(M.id).catch(()=>{})},title:"Set as default","aria-label":`Set ${M.label} as default`,"data-testid":`github-account-set-default-${M.id}`,children:a.jsx(XT,{size:Ht,"aria-hidden":"true"})}),a.jsx("button",{className:fe.deleteButton,onClick:()=>C(M.id),title:`Remove ${M.label}`,"aria-label":`Remove ${M.label}`,"data-testid":`github-account-remove-${M.id}`,children:a.jsx(Ls,{size:Ht,"aria-hidden":"true"})})]},M.id))}),a.jsxs("form",{className:fe.addForm,onSubmit:M=>{A(M).catch(()=>{})},children:[a.jsxs("div",{className:fe.formRow,children:[a.jsx("input",{className:fe.input,type:"text",placeholder:"Label (e.g. personal, work)",value:p,onChange:M=>m(M.target.value),"data-testid":"github-account-label-input"}),a.jsx("input",{className:fe.input,type:"password",placeholder:"Personal access token",value:g,onChange:M=>v(M.target.value),"data-testid":"github-account-token-input"})]}),a.jsxs("div",{className:fe.formRow,children:[a.jsxs("label",{className:fe.tokenTarget,style:{display:"flex",alignItems:"center",gap:"6px",cursor:"pointer"},children:[a.jsx("input",{type:"checkbox",checked:b,onChange:M=>_(M.target.checked),"data-testid":"github-account-default-checkbox"}),"Set as default"]}),a.jsx("button",{className:fe.addButton,type:"submit",disabled:!p.trim()||!g.trim()||k,"data-testid":"github-account-add-button",children:k?"Adding...":"Add Account"}),a.jsx("button",{className:fe.addButton,type:"button",onClick:()=>{O().catch(()=>{})},disabled:j,"data-testid":"github-account-import-button",children:j?"Importing...":"Import from gh CLI"})]})]})]})]})}const d8="_container_legrg_1",u8="_header_legrg_8",f8="_headerTitle_legrg_35",p8="_badge_legrg_44",m8="_headerActions_legrg_54",h8="_body_legrg_61",g8="_formContent_legrg_73",v8="_section_legrg_85",y8="_label_legrg_91",b8="_nameInput_legrg_98",_8="_fieldInput_legrg_131",x8="_adapterSelect_legrg_164",k8="_readOnlyValue_legrg_198",S8="_codespaceSection_legrg_204",j8="_codespaceActions_legrg_210",T8="_creatingHint_legrg_216",N8="_errorHint_legrg_222",w8="_btnPrimary_legrg_235",C8="_btnGhost_legrg_266",oe={container:d8,header:u8,headerTitle:f8,badge:p8,headerActions:m8,body:h8,formContent:g8,section:v8,label:y8,nameInput:b8,fieldInput:_8,adapterSelect:x8,readOnlyValue:k8,codespaceSection:S8,codespaceActions:j8,creatingHint:T8,errorHint:N8,btnPrimary:w8,btnGhost:C8},id=1,od=65535;function Ep(t){if(!t.trim())return!0;const s=Number(t);return Number.isInteger(s)&&s>=id&&s<=od}function Ap(t){try{const s=JSON.parse(t);if(typeof s=="object"&&s!==null&&!Array.isArray(s))return s}catch{}return{}}function E8({codespaceName:t,onCodespaceNameChange:s,envName:o,onEnvNameChange:r,codespaces:c,codespaceError:d,codespaceListError:u,codespaceCreating:p,onCreateCodespace:m}){const[g,v]=y.useState("pick"),[b,_]=y.useState(""),[k,S]=y.useState("");return g==="create"?a.jsxs("div",{className:oe.codespaceSection,children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Repository"}),a.jsx("input",{type:"text",value:b,onChange:j=>_(j.target.value),placeholder:"owner/repo",className:oe.fieldInput,"data-testid":"env-codespace-repo"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Machine Type"}),a.jsx("input",{type:"text",value:k,onChange:j=>S(j.target.value),placeholder:"Machine type (optional)...",className:oe.fieldInput,"data-testid":"env-codespace-machine"})]}),a.jsxs("div",{className:oe.codespaceActions,children:[a.jsx("button",{onClick:()=>{b.trim()&&(m(b.trim(),k.trim()||void 0),v("pick"),_(""),S(""))},disabled:!b.trim(),className:oe.btnPrimary,children:"Create"}),a.jsx("button",{onClick:()=>{v("pick"),_(""),S("")},className:oe.btnGhost,children:"Cancel"})]})]}):a.jsx("div",{className:oe.codespaceSection,children:a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Codespace"}),!u&&a.jsxs("select",{value:t,onChange:j=>{j.target.value==="__create__"?(v("create"),s("")):(s(j.target.value),j.target.value&&!o.trim()&&r(j.target.value))},disabled:p,className:oe.adapterSelect,"data-testid":"env-codespace-select",children:[a.jsx("option",{value:"",children:"Select a codespace..."}),c.map(j=>a.jsxs("option",{value:j.name,children:[j.name," (",j.repository,") — ",j.state]},j.name)),a.jsx("option",{value:"__create__",children:"Create new from repo..."})]}),p&&a.jsx("span",{className:oe.creatingHint,children:"Creating codespace..."}),u&&a.jsxs(a.Fragment,{children:[a.jsx("span",{className:oe.errorHint,children:u}),a.jsx("input",{type:"text",value:t,onChange:j=>s(j.target.value),placeholder:"Or enter codespace name manually...",className:oe.fieldInput,"data-testid":"env-codespace-manual"})]}),d&&!u&&a.jsx("span",{className:oe.errorHint,children:d})]})})}function rk({mode:t,environmentId:s,environments:o,githubAccounts:r,onAddEnvironment:c,onUpdateEnvironment:d,onListCodespaces:u,codespaces:p,codespaceError:m,codespaceListError:g,codespaceCreating:v,onCreateCodespace:b,onListDockerContainers:_,dockerContainers:k,dockerContainersError:S,onShowToast:j}){const T=xt(),N=t==="edit",C=N&&s?o.find(re=>re.id===s):void 0,[D,A]=y.useState(""),[E,R]=y.useState("local"),[O,M]=y.useState(""),[$,Y]=y.useState(""),[V,ne]=y.useState(""),[le,Z]=y.useState(""),[se,H]=y.useState(""),[B,F]=y.useState(""),[ge,ee]=y.useState(""),[ce,me]=y.useState(""),[xe,De]=y.useState("create"),[ot,bt]=y.useState(""),[lt,Pe]=y.useState(null),ke=y.useCallback(()=>{const re={};if(E==="local"){if(O.trim()&&(re.host=O.trim()),$.trim()){const ve=Number($);Number.isInteger(ve)&&(re.port=ve)}}else if(E==="ssh"){if(re.host=O.trim(),V.trim()&&(re.user=V.trim()),$.trim()){const ve=Number($);Number.isInteger(ve)&&(re.sshPort=ve)}le.trim()&&(re.identityFile=le.trim())}else E==="docker"?xe==="attach"?ot.trim()&&(re.attach=ot.trim()):(se.trim()&&(re.image=se.trim()),B.trim()&&(re.repo=B.trim())):E==="codespace"&&(re.codespaceName=ge.trim());return re},[E,O,$,V,le,se,B,ge,xe,ot]),ct=()=>!(!D.trim()||E==="ssh"&&!O.trim()||E==="codespace"&&!ge.trim()||E==="docker"&&xe==="attach"&&!ot.trim()||(E==="local"||E==="ssh")&&!Ep($)),ue=()=>{ct()&&(c(D.trim(),E,ke(),ce||void 0),j==null||j("Environment added successfully","success"),T(zo,{replace:!0}))},Re=()=>{T(s?$o(s):zo)},Q=y.useCallback((re,ve)=>{if(!C||!s)return;const et=Ap(C.adapterConfig),an=ve.trim();an?et[re]=an:delete et[re],d(s,{adapterConfig:et})},[C,s,d]),nt=y.useCallback((re,ve)=>{if(!C||!s)return;const et=Ap(C.adapterConfig);if(ve.trim()){const an=Number(ve);Number.isInteger(an)&&an>=id&&an<=od&&(et[re]=an)}else delete et[re];d(s,{adapterConfig:et})},[C,s,d]);if(N){if(!C)return a.jsxs("div",{className:oe.container,children:[a.jsxs("div",{className:oe.header,children:[a.jsx("div",{className:oe.headerTitle,children:a.jsx("span",{className:oe.badge,children:"edit environment"})}),a.jsx("div",{className:oe.headerActions,children:a.jsx("button",{onClick:Re,className:oe.btnGhost,children:"Back"})})]}),a.jsx("div",{className:oe.body,children:a.jsx("div",{className:oe.formContent,children:a.jsx("span",{className:oe.readOnlyValue,children:"Environment not found"})})})]});const re=Ap(C.adapterConfig);return a.jsxs("div",{className:oe.container,"data-testid":"env-edit-panel",children:[a.jsxs("div",{className:oe.header,children:[a.jsx("div",{className:oe.headerTitle,children:a.jsx("span",{className:oe.badge,children:"edit environment"})}),a.jsx("div",{className:oe.headerActions,children:a.jsx("button",{onClick:Re,className:oe.btnGhost,"data-testid":"env-edit-back",children:"Back"})})]}),a.jsx("div",{className:oe.body,children:a.jsxs("div",{className:oe.formContent,children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Name"}),a.jsx(zt,{value:C.displayName,onSave:ve=>{s&&d(s,{displayName:ve})},validate:ve=>ve.trim()===""?"Name cannot be empty":void 0,mode:"edit",fieldId:"name",activeFieldId:lt,onActivate:Pe,placeholder:"Environment name",ariaLabel:"Environment name","data-testid":"env-edit-name"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Adapter Type"}),a.jsx("span",{className:oe.readOnlyValue,"data-testid":"env-edit-adapter-type",children:C.adapterType})]}),(C.adapterType==="codespace"||C.adapterType==="docker")&&(r.length>0||!!C.githubAccountId)&&a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"GitHub Account"}),a.jsxs("select",{value:C.githubAccountId||"",onChange:ve=>{s&&d(s,{githubAccountId:ve.target.value})},className:oe.adapterSelect,"data-testid":"env-edit-github-account",children:[a.jsx("option",{value:"",children:"(Default)"}),r.map(ve=>a.jsxs("option",{value:ve.id,children:[ve.label,ve.username?` (@${ve.username})`:"",ve.isDefault?" — default":""]},ve.id))]})]}),C.adapterType==="local"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Host"}),a.jsx(zt,{value:String(re.host??""),onSave:ve=>Q("host",ve),mode:"edit",fieldId:"host",activeFieldId:lt,onActivate:Pe,placeholder:"(default)",ariaLabel:"Host","data-testid":"env-edit-host"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Port"}),a.jsx(zt,{value:String(re.port??""),onSave:ve=>nt("port",ve),validate:ve=>Ep(ve)?void 0:"Port must be 1-65535",mode:"edit",fieldId:"port",activeFieldId:lt,onActivate:Pe,placeholder:"(default)",ariaLabel:"Port","data-testid":"env-edit-port"})]})]}),C.adapterType==="ssh"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Host"}),a.jsx(zt,{value:String(re.host??""),onSave:ve=>Q("host",ve),validate:ve=>ve.trim()===""?"Host is required":void 0,mode:"edit",fieldId:"host",activeFieldId:lt,onActivate:Pe,placeholder:"hostname or IP",ariaLabel:"Host","data-testid":"env-edit-host"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"User"}),a.jsx(zt,{value:String(re.user??""),onSave:ve=>Q("user",ve),mode:"edit",fieldId:"user",activeFieldId:lt,onActivate:Pe,placeholder:"(default)",ariaLabel:"User","data-testid":"env-edit-user"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"SSH Port"}),a.jsx(zt,{value:String(re.sshPort??""),onSave:ve=>nt("sshPort",ve),validate:ve=>Ep(ve)?void 0:"Port must be 1-65535",mode:"edit",fieldId:"sshPort",activeFieldId:lt,onActivate:Pe,placeholder:"22",ariaLabel:"SSH Port","data-testid":"env-edit-ssh-port"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Identity File"}),a.jsx(zt,{value:String(re.identityFile??""),onSave:ve=>Q("identityFile",ve),mode:"edit",fieldId:"identityFile",activeFieldId:lt,onActivate:Pe,placeholder:"~/.ssh/id_rsa",ariaLabel:"Identity File","data-testid":"env-edit-identity-file"})]})]}),C.adapterType==="docker"&&re.attach!==void 0&&a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Attach (container)"}),a.jsx(zt,{value:String(re.attach??""),onSave:ve=>Q("attach",ve),validate:ve=>ve.trim()===""?"Container name is required":void 0,mode:"edit",fieldId:"attach",activeFieldId:lt,onActivate:Pe,placeholder:"container name or ID",ariaLabel:"Attach container","data-testid":"env-edit-attach"})]}),C.adapterType==="docker"&&re.attach===void 0&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Image"}),a.jsx(zt,{value:String(re.image??""),onSave:ve=>Q("image",ve),mode:"edit",fieldId:"image",activeFieldId:lt,onActivate:Pe,placeholder:"(default)",ariaLabel:"Image","data-testid":"env-edit-image"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Repo"}),a.jsx(zt,{value:String(re.repo??""),onSave:ve=>Q("repo",ve),mode:"edit",fieldId:"repo",activeFieldId:lt,onActivate:Pe,placeholder:"(none)",ariaLabel:"Repo","data-testid":"env-edit-repo"})]})]}),C.adapterType==="codespace"&&a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Codespace Name"}),a.jsx(zt,{value:String(re.codespaceName??""),onSave:ve=>Q("codespaceName",ve),validate:ve=>ve.trim()===""?"Codespace name is required":void 0,mode:"edit",fieldId:"codespaceName",activeFieldId:lt,onActivate:Pe,placeholder:"codespace-name",ariaLabel:"Codespace Name","data-testid":"env-edit-codespace-name"})]})]})})]})}return a.jsxs("div",{className:oe.container,"data-testid":"env-create-panel",children:[a.jsxs("div",{className:oe.header,children:[a.jsx("div",{className:oe.headerTitle,children:a.jsx("span",{className:oe.badge,children:"new environment"})}),a.jsxs("div",{className:oe.headerActions,children:[a.jsx("button",{onClick:ue,disabled:!ct(),className:oe.btnPrimary,"data-testid":"env-create-submit",children:"Create"}),a.jsx("button",{onClick:Re,className:oe.btnGhost,children:"Cancel"})]})]}),a.jsx("div",{className:oe.body,children:a.jsxs("div",{className:oe.formContent,children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-name",children:"Name"}),a.jsx("input",{id:"env-create-name",type:"text",value:D,onChange:re=>A(re.target.value),placeholder:"Environment name...",autoFocus:!0,className:oe.nameInput,"data-testid":"env-create-name",onKeyDown:re=>{re.key==="Enter"&&ct()&&ue()}})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-adapter",children:"Adapter Type"}),a.jsxs("select",{id:"env-create-adapter",value:E,onChange:re=>{R(re.target.value),re.target.value==="codespace"&&u(ce||void 0)},className:oe.adapterSelect,"data-testid":"env-create-adapter",children:[a.jsx("option",{value:"local",children:"local"}),a.jsx("option",{value:"ssh",children:"ssh"}),a.jsx("option",{value:"docker",children:"docker"}),a.jsx("option",{value:"codespace",children:"codespace"})]})]}),(E==="codespace"||E==="docker")&&r.length>0&&a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-github-account",children:"GitHub Account"}),a.jsxs("select",{id:"env-create-github-account",value:ce,onChange:re=>{me(re.target.value),E==="codespace"&&u(re.target.value||void 0)},className:oe.adapterSelect,"data-testid":"env-create-github-account",children:[a.jsx("option",{value:"",children:"(Default)"}),r.map(re=>a.jsxs("option",{value:re.id,children:[re.label," (@",re.username,")",re.isDefault?" — default":""]},re.id))]})]}),E==="local"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-host",children:"Host"}),a.jsx("input",{id:"env-create-host",type:"text",value:O,onChange:re=>M(re.target.value),placeholder:"Host (optional)...",className:oe.fieldInput,"data-testid":"env-create-host"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-port",children:"Port"}),a.jsx("input",{id:"env-create-port",type:"number",min:id,max:od,value:$,onChange:re=>Y(re.target.value),placeholder:"Port (optional)...",className:oe.fieldInput,"data-testid":"env-create-port"})]})]}),E==="ssh"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-host",children:"Host"}),a.jsx("input",{id:"env-create-host",type:"text",value:O,onChange:re=>M(re.target.value),placeholder:"Host (required)...",className:oe.fieldInput,"data-testid":"env-create-host"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-user",children:"User"}),a.jsx("input",{id:"env-create-user",type:"text",value:V,onChange:re=>ne(re.target.value),placeholder:"User (optional)...",className:oe.fieldInput,"data-testid":"env-create-user"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-port",children:"SSH Port"}),a.jsx("input",{id:"env-create-port",type:"number",min:id,max:od,value:$,onChange:re=>Y(re.target.value),placeholder:"SSH port (optional)...",className:oe.fieldInput,"data-testid":"env-create-port"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-identity",children:"Identity File"}),a.jsx("input",{id:"env-create-identity",type:"text",value:le,onChange:re=>Z(re.target.value),placeholder:"Identity file (optional)...",className:oe.fieldInput,"data-testid":"env-create-identity"})]})]}),E==="docker"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-docker-mode",children:"Source"}),a.jsxs("select",{id:"env-docker-mode",value:xe,onChange:re=>{const ve=re.target.value;De(ve),ve==="attach"&&_()},className:oe.adapterSelect,"data-testid":"env-docker-mode",children:[a.jsx("option",{value:"create",children:"Create new container"}),a.jsx("option",{value:"attach",children:"Attach to existing container"})]})]}),xe==="create"?a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-image",children:"Image"}),a.jsx("input",{id:"env-create-image",type:"text",value:se,onChange:re=>H(re.target.value),placeholder:"Image (optional)...",className:oe.fieldInput,"data-testid":"env-create-image"})]}),a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,htmlFor:"env-create-repo",children:"Repo"}),a.jsx("input",{id:"env-create-repo",type:"text",value:B,onChange:re=>F(re.target.value),placeholder:"Repo (optional)...",className:oe.fieldInput,"data-testid":"env-create-repo"})]})]}):a.jsxs("div",{className:oe.section,children:[a.jsx("label",{className:oe.label,children:"Container"}),!S&&k.length>0&&a.jsxs("select",{value:ot,onChange:re=>{bt(re.target.value),re.target.value&&!D.trim()&&A(re.target.value)},className:oe.adapterSelect,"data-testid":"env-docker-container-select",children:[a.jsx("option",{value:"",children:"Select a container..."}),k.map(re=>a.jsxs("option",{value:re.name,children:[re.name," (",re.image,") ",re.status]},re.id))]}),(S||k.length===0)&&a.jsxs(a.Fragment,{children:[S?a.jsx("span",{className:oe.errorHint,children:S}):a.jsx("span",{className:oe.creatingHint,children:"No running containers found."}),a.jsx("input",{type:"text",value:ot,onChange:re=>{bt(re.target.value),re.target.value&&!D.trim()&&A(re.target.value)},placeholder:"Enter container name/ID...",className:oe.fieldInput,"data-testid":"env-docker-container-manual"})]})]})]}),E==="codespace"&&a.jsx(E8,{codespaceName:ge,onCodespaceNameChange:ee,envName:D,onEnvNameChange:A,codespaces:p,codespaceError:m,codespaceListError:g,codespaceCreating:v,onCreateCodespace:b})]})})]})}const A8="_group_1iprv_1",D8="_groupTitle_1iprv_8",M8="_shortcutList_1iprv_17",R8="_shortcutRow_1iprv_23",I8="_keys_1iprv_36",O8="_kbd_1iprv_43",B8="_description_1iprv_60",_i={group:A8,groupTitle:D8,shortcutList:M8,shortcutRow:R8,keys:I8,kbd:O8,description:B8},L8=[{title:"Global",shortcuts:[{keys:["?"],description:"Open keyboard shortcuts reference"},{keys:["N"],description:"Create a new task"},{keys:["Escape"],description:"Close dialog or cancel editing"}]},{title:"Task Page",shortcuts:[{keys:["1"],description:"Switch to Overview tab"},{keys:["2"],description:"Switch to Stream tab"}]},{title:"Workspace Page",shortcuts:[{keys:["1"],description:"Switch to Graph view"},{keys:["2"],description:"Switch to Board view"},{keys:["3"],description:"Switch to Tasks view"}]},{title:"Navigation Lists",shortcuts:[{keys:["←"],description:"Previous tab (horizontal nav)"},{keys:["→"],description:"Next tab (horizontal nav)"},{keys:["↑"],description:"Previous item (vertical nav)"},{keys:["↓"],description:"Next item (vertical nav)"},{keys:["J"],description:"Next item (alias for arrow down/right)"},{keys:["K"],description:"Previous item (alias for arrow up/left)"},{keys:["Home"],description:"Jump to first item"},{keys:["End"],description:"Jump to last item"}]},{title:"Editing",shortcuts:[{keys:["Enter"],description:"Activate / save inline edit"},{keys:["Space"],description:"Activate button or start editing"},{keys:["Escape"],description:"Cancel edit and discard changes"}]},{title:"Root",shortcuts:[{keys:["Ctrl/Cmd","Enter"],description:"Send message (when the composer is focused)"},{keys:["Enter"],description:"Insert a new line in the message composer"}]}];function z8(){return a.jsxs("section",{className:fe.section,"data-testid":"keyboard-shortcuts-panel",children:[a.jsx("h3",{className:fe.sectionTitle,children:"Keyboard Shortcuts"}),a.jsx("p",{className:fe.sectionDescription,children:"Keyboard shortcuts for navigating and interacting with Grackle. Global shortcuts are suppressed while typing in text fields."}),L8.map(t=>a.jsxs("div",{className:_i.group,children:[a.jsx("h4",{className:_i.groupTitle,children:t.title}),a.jsx("div",{className:_i.shortcutList,children:t.shortcuts.map(s=>a.jsxs("div",{className:_i.shortcutRow,children:[a.jsx("span",{className:_i.keys,children:s.keys.map(o=>a.jsx("kbd",{className:_i.kbd,children:o},o))}),a.jsx("span",{className:_i.description,children:s.description})]},s.description))})]},t.title))]})}const $8=[{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 H8({credentialProviders:t,onUpdateCredentialProviders:s}){const o=(r,c)=>{const d={...t};r==="claude"?d.claude=c:d[r]=c,s(d)};return a.jsxs("section",{className:fe.section,children:[a.jsx("h3",{className:fe.sectionTitle,children:"Credential Providers"}),a.jsx("p",{className:fe.sectionDescription,children:"Enable providers to automatically forward credentials to environments at task start. Credentials are read fresh from the host each time."}),a.jsx("div",{className:fe.tokenList,children:$8.map(r=>a.jsxs("div",{className:fe.tokenRow,children:[a.jsx("span",{className:fe.tokenName,children:r.label}),a.jsx("span",{className:fe.tokenTarget,children:r.description}),a.jsx("select",{className:fe.select,value:t[r.key],onChange:c=>o(r.key,c.target.value),children:r.options.map(c=>a.jsx("option",{value:c.value,children:c.label},c.value))})]},r.key))})]})}const P8="_container_10efq_1",U8="_header_10efq_7",V8="_list_10efq_105",q8="_card_10efq_111",G8="_cardHeader_10efq_125",F8="_cardTitle_10efq_135",K8="_defaultBadge_10efq_141",Z8="_cardActions_10efq_155",Y8="_description_10efq_160",J8="_meta_10efq_166",W8="_empty_10efq_212",X8="_typeBadge_10efq_362",ts={container:P8,header:U8,list:V8,card:q8,cardHeader:G8,cardTitle:F8,defaultBadge:K8,cardActions:Z8,description:Y8,meta:J8,empty:W8,typeBadge:X8};function Q8({personas:t,appDefaultPersonaId:s,onDeletePersona:o,onSetAppDefaultPersonaId:r,onNavigateToNew:c,onNavigateToPersona:d}){const[u,p]=y.useState(null),m=u?t.find(v=>v.id===u):void 0,g=async v=>{await o(v),p(null)};return a.jsxs("div",{className:ts.container,children:[a.jsxs("div",{className:ts.header,children:[a.jsx("h2",{children:"Personas"}),a.jsx(sn,{variant:"primary",size:"md",onClick:c,"data-testid":"persona-new-button",children:"+ New Persona"})]}),t.length===0?a.jsx("p",{className:ts.empty,children:"No personas yet. Create one to get started."}):a.jsx("div",{className:ts.list,children:t.map(v=>{const b=s===v.id,_=v.type==="script";return a.jsxs("div",{className:ts.card,"data-testid":`persona-card-${v.id}`,onClick:()=>d(v.id),role:"button",tabIndex:0,onKeyDown:k=>{k.currentTarget===k.target&&(k.key==="Enter"||k.key===" ")&&(k.preventDefault(),d(v.id))},children:[a.jsxs("div",{className:ts.cardHeader,children:[a.jsxs("span",{className:ts.cardTitle,children:[a.jsx("strong",{children:v.name}),a.jsx("span",{className:ts.typeBadge,"data-testid":`persona-type-badge-${v.id}`,children:_?"Script":"Agent"}),b&&a.jsx("span",{className:ts.defaultBadge,"data-testid":`persona-default-badge-${v.id}`,children:"App Default"})]}),a.jsxs("div",{className:ts.cardActions,onClick:k=>k.stopPropagation(),children:[!b&&a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>{r(v.id).catch(()=>{})},"data-testid":`persona-set-default-${v.id}`,title:"Set as app default persona",children:"Set Default"}),a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>d(v.id),children:"Edit"}),a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>p(v.id),"data-testid":`persona-delete-${v.id}`,children:"Delete"})]})]}),v.description&&a.jsx("p",{className:ts.description,children:v.description}),a.jsxs("div",{className:ts.meta,children:[v.runtime&&a.jsxs("span",{children:["Runtime: ",v.runtime]}),v.model&&a.jsxs("span",{children:["Model: ",v.model]}),v.maxTurns>0&&a.jsxs("span",{children:["Max turns: ",v.maxTurns]})]})]},v.id)})}),a.jsx(_s,{isOpen:u!==null,title:"Delete Persona?",description:`"${(m==null?void 0:m.name)??""}" will be permanently removed.`,confirmLabel:"Delete",onConfirm:()=>{u&&g(u).catch(()=>{})},onCancel:()=>p(null)})]})}const e7="_container_uy08i_1",t7="_header_uy08i_7",n7="_count_uy08i_13",s7="_presets_uy08i_18",a7="_presetButton_uy08i_24",i7="_filterInput_uy08i_41",o7="_groups_uy08i_53",r7="_group_uy08i_53",l7="_groupHeader_uy08i_68",c7="_groupName_uy08i_77",d7="_groupCount_uy08i_81",u7="_toolList_uy08i_87",f7="_toolItem_uy08i_95",p7="_toolName_uy08i_103",yn={container:e7,header:t7,count:n7,presets:s7,presetButton:a7,filterInput:i7,groups:o7,group:r7,groupHeader:l7,groupName:c7,groupCount:d7,toolList:u7,toolItem:f7,toolName:p7},m7=(()=>{const t=new Map;for(const s of z_){const o=s==="get_version_status"?"version":s.split("_")[0];t.has(o)||t.set(o,[]),t.get(o).push(s)}return[...t.entries()].sort(([s],[o])=>s.localeCompare(o)).map(([s,o])=>({group:s,tools:o.sort()}))})(),h7=[{name:"default",label:"Default",tools:L_},{name:"worker",label:"Worker",tools:X2},{name:"orchestrator",label:"Orchestrator",tools:Q2},{name:"admin",label:"Admin",tools:ej}];function o_({selectedTools:t,onChange:s,disabled:o}){const[r,c]=y.useState(""),d=y.useMemo(()=>new Set(t),[t]),u=y.useCallback(v=>{if(o)return;const b=new Set(d);b.has(v)?b.delete(v):b.add(v),s([...b].sort())},[d,s,o]),p=y.useCallback((v,b)=>{if(o)return;const _=new Set(d);for(const k of v)b?_.delete(k):_.add(k);s([..._].sort())},[d,s,o]),m=y.useCallback(v=>{o||s([...v].sort())},[s,o]),g=r.toLowerCase();return a.jsxs("div",{className:yn.container,"data-testid":"mcp-tool-selector",children:[a.jsx("div",{className:yn.header,children:a.jsx("span",{className:yn.count,children:t.length===0?`Using default (${L_.length} tools)`:`${t.length} of ${z_.size} tools selected`})}),a.jsxs("div",{className:yn.presets,"data-testid":"mcp-tool-presets",children:[h7.map(v=>a.jsx("button",{type:"button",className:yn.presetButton,disabled:o,onClick:()=>m(v.tools),"data-testid":`preset-${v.name}`,children:v.label},v.name)),a.jsx("button",{type:"button",className:yn.presetButton,disabled:o,onClick:()=>s([]),"data-testid":"preset-clear",children:"Clear"})]}),a.jsx("input",{type:"text",className:yn.filterInput,placeholder:"Filter tools...",value:r,onChange:v=>c(v.target.value),disabled:o,"data-testid":"mcp-tool-filter"}),a.jsx("div",{className:yn.groups,children:m7.map(({group:v,tools:b})=>{const _=g?b.filter(S=>S.toLowerCase().includes(g)):b;if(_.length===0)return null;const k=_.every(S=>d.has(S));return a.jsxs("div",{className:yn.group,"data-testid":`tool-group-${v}`,children:[a.jsxs("label",{className:yn.groupHeader,children:[a.jsx("input",{type:"checkbox",checked:k,onChange:()=>p(_,k),disabled:o,"data-testid":`group-toggle-${v}`}),a.jsx("span",{className:yn.groupName,children:v}),a.jsxs("span",{className:yn.groupCount,children:["(",_.filter(S=>d.has(S)).length,"/",_.length,")"]})]}),a.jsx("div",{className:yn.toolList,children:_.map(S=>a.jsxs("label",{className:yn.toolItem,children:[a.jsx("input",{type:"checkbox",checked:d.has(S),onChange:()=>u(S),disabled:o,"data-testid":`tool-${S}`}),a.jsx("span",{className:yn.toolName,children:S})]},S))})]},v)})})]})}function mm(t){const s=new Date(t),o=new Date,r=o.getTime()-s.getTime(),c=Math.floor(r/1e3),d=Math.floor(c/60),u=Math.floor(d/60),p=Math.floor(u/24);if(c<60)return"just now";if(d<60)return`${d}m ago`;if(u<24)return`${u}h ago`;if(p===1)return"yesterday";if(p<7)return`${p} days ago`;const m=s.getFullYear()===o.getFullYear(),g=s.toLocaleString("en-US",{month:"short"}),v=s.getDate();return m?`${g} ${v}`:`${g} ${v} ${s.getFullYear()}`}function lk(t){const s=new Date(t);if(Number.isNaN(s.getTime()))return"—";const o=new Date,r=s.getTime()-o.getTime();if(r<=0)return"overdue";const c=Math.floor(r/1e3),d=Math.floor(c/60),u=Math.floor(d/60),p=Math.floor(u/24);if(c<60)return`in ${c}s`;if(d<60)return`in ${d}m`;if(u<24)return`in ${u}h`;if(p<7)return`in ${p} day${p===1?"":"s"}`;const m=s.getFullYear()===o.getFullYear(),g=s.toLocaleString("en-US",{month:"short"}),v=s.getDate();return m?`${g} ${v}`:`${g} ${v} ${s.getFullYear()}`}const g7="_container_1gfuq_1",v7="_header_1gfuq_7",y7="_list_1gfuq_19",b7="_card_1gfuq_25",_7="_cardHeader_1gfuq_40",x7="_cardTitle_1gfuq_46",k7="_statusBadge_1gfuq_56",S7="_enabled_1gfuq_68",j7="_disabled_1gfuq_71",T7="_cardActions_1gfuq_75",N7="_cardMeta_1gfuq_80",w7="_empty_1gfuq_98",ns={container:g7,header:v7,list:y7,card:b7,cardHeader:_7,cardTitle:x7,statusBadge:k7,enabled:S7,disabled:j7,cardActions:T7,cardMeta:N7,empty:w7};function C7({schedules:t,personas:s,onDeleteSchedule:o,onToggleEnabled:r,onNavigateToNew:c,onNavigateToSchedule:d}){const[u,p]=y.useState(null),m=u?t.find(_=>_.id===u):void 0,g=async _=>{await o(_),p(null)},v=y.useMemo(()=>{const _=new Map;for(const k of s)_.set(k.id,k.name);return _},[s]),b=_=>v.get(_)??_;return a.jsxs("div",{className:ns.container,children:[a.jsxs("div",{className:ns.header,children:[a.jsx("h2",{children:"Schedules"}),a.jsx(sn,{variant:"primary",size:"md",onClick:c,"data-testid":"schedule-new-button",children:"+ New Schedule"})]}),t.length===0?a.jsx("p",{className:ns.empty,"data-testid":"schedule-empty-state",children:"No schedules yet. Create one to run tasks on a recurring cadence."}):a.jsx("div",{className:ns.list,children:t.map(_=>a.jsxs("div",{className:ns.card,"data-testid":`schedule-card-${_.id}`,onClick:()=>d(_.id),role:"button",tabIndex:0,onKeyDown:k=>{k.currentTarget===k.target&&(k.key==="Enter"||k.key===" ")&&(k.preventDefault(),d(_.id))},children:[a.jsxs("div",{className:ns.cardHeader,children:[a.jsxs("span",{className:ns.cardTitle,children:[a.jsx("strong",{children:_.title}),a.jsx("span",{className:`${ns.statusBadge} ${_.enabled?ns.enabled:ns.disabled}`,"data-testid":`schedule-status-badge-${_.id}`,children:_.enabled?"Enabled":"Disabled"})]}),a.jsxs("div",{className:ns.cardActions,onClick:k=>k.stopPropagation(),children:[a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>{(async()=>{await r(_.id,{enabled:!_.enabled})})().catch(()=>{})},"data-testid":`schedule-toggle-${_.id}`,title:_.enabled?"Disable schedule":"Enable schedule",children:_.enabled?"Disable":"Enable"}),a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>d(_.id),"data-testid":`schedule-edit-${_.id}`,children:"Edit"}),a.jsx(sn,{variant:"ghost",size:"sm",onClick:()=>p(_.id),"data-testid":`schedule-delete-${_.id}`,children:"Delete"})]})]}),a.jsxs("div",{className:ns.cardMeta,children:[a.jsx("span",{"data-testid":`schedule-expression-${_.id}`,children:_.scheduleExpression}),_.personaId&&a.jsxs("span",{"data-testid":`schedule-persona-${_.id}`,children:["Persona: ",b(_.personaId)]}),a.jsxs("span",{"data-testid":`schedule-last-run-${_.id}`,children:["Last run: ",_.lastRunAt?mm(_.lastRunAt):"Never"]}),_.enabled&&_.nextRunAt?a.jsxs("span",{"data-testid":`schedule-next-run-${_.id}`,children:["Next run: ",lk(_.nextRunAt)]}):null,_.runCount>0&&a.jsxs("span",{"data-testid":`schedule-run-count-${_.id}`,children:["Runs: ",_.runCount]})]})]},_.id))}),a.jsx(_s,{isOpen:u!==null,title:"Delete Schedule?",description:`"${(m==null?void 0:m.title)??""}" will be permanently removed. Tasks already created by this schedule will not be affected.`,confirmLabel:"Delete",onConfirm:()=>{u&&g(u).catch(()=>{})},onCancel:()=>p(null)})]})}const E7="_nav_1bhou_1",A7="_tab_1bhou_24",D7="_tabIcon_1bhou_62",M7="_tabActive_1bhou_68",Fc={nav:E7,tab:A7,tabIcon:D7,tabActive:M7},ia=[{path:"credentials",label:"Credentials",icon:a.jsx(vT,{size:Et})},{path:"github-accounts",label:"GitHub Accounts",icon:a.jsx(dT,{size:Et})},{path:"personas",label:"Personas",icon:a.jsx(tN,{size:Et})},{path:"schedules",label:"Schedules",icon:a.jsx(Pj,{size:Et})},{path:"appearance",label:"Appearance",icon:a.jsx(LT,{size:Et})},{path:"shortcuts",label:"Shortcuts",icon:a.jsx(bT,{size:Et})},{path:"plugins",label:"Plugins",icon:a.jsx(VT,{size:Et})},{path:"about",label:"About",icon:a.jsx(km,{size:Et})}];function R7(){var u;const t=Wt(),s=xt(),o=y.useRef(null),r=((u=ia.find(p=>{const m=`${ji}/${p.path}`;return t.pathname===m||t.pathname.startsWith(`${m}/`)}))==null?void 0:u.path)??ia[0].path,c=y.useCallback(p=>{s(`${ji}/${p}`)},[s]),d=y.useCallback(p=>{var k,S;const m=(k=o.current)==null?void 0:k.querySelectorAll('[role="tab"]');if(!m)return;const g=Array.from(m).findIndex(j=>j===document.activeElement),v=g>=0?g:ia.findIndex(j=>j.path===r);let b=v;if(p.key==="ArrowDown"||p.key==="j"||p.key==="J")p.preventDefault(),b=(v+1)%ia.length;else if(p.key==="ArrowUp"||p.key==="k"||p.key==="K")p.preventDefault(),b=(v-1+ia.length)%ia.length;else if(p.key==="Home")p.preventDefault(),b=0;else if(p.key==="End")p.preventDefault(),b=ia.length-1;else return;const _=ia[b].path;s(`${ji}/${_}`),(S=m[b])==null||S.focus()},[r,s]);return a.jsx("nav",{className:Fc.nav,ref:o,role:"tablist","aria-orientation":"vertical","aria-label":"Settings",onKeyDown:d,children:ia.map(p=>{const m=p.path===r;return a.jsxs("button",{role:"tab",type:"button","aria-selected":m,tabIndex:m?0:-1,className:`${Fc.tab} ${m?Fc.tabActive:""}`,onClick:()=>c(p.path),children:[a.jsx("span",{className:Fc.tabIcon,"aria-hidden":"true",children:p.icon}),p.label]},p.path)})})}const I7=["lifecycle:","pipe:","stdin:"];function gh(t){return t.selfEcho?"chatroom":t.name.startsWith("pipe:")?"pipe":"channel"}function ck(t,s){let o=!1;for(const r of t.subscribers){const c=s.get(r.sessionId);if(c&&(o=!0,c.taskId))return{kind:"task",taskId:c.taskId}}return o?{kind:"unattached"}:{kind:"external"}}function O7(t,s){const o=new Map(s.map(u=>[u.id,u])),r=new Map,c=[];for(const u of t){const p=ck(u,o);if(p.kind==="task"){const m=r.get(p.taskId);m?m.push(u):r.set(p.taskId,[u])}else c.push(u)}const d=Array.from(r,([u,p])=>({taskId:u,streams:p}));return c.length>0&&d.push({taskId:void 0,streams:c}),d}const B7="_container_16qkd_1",L7="_header_16qkd_7",z7="_title_16qkd_15",$7="_headerActions_16qkd_21",H7="_internalsToggle_16qkd_27",P7="_refreshButton_16qkd_37",U7="_state_16qkd_52",V7="_group_16qkd_59",q7="_groupHeader_16qkd_63",G7="_row_16qkd_72",F7="_selected_16qkd_92",K7="_kindBadge_16qkd_96",Z7="_kindChatroom_16qkd_108",Y7="_kindPipe_16qkd_114",J7="_kindChannel_16qkd_120",W7="_streamName_16qkd_126",X7="_meta_16qkd_135",Jt={container:B7,header:L7,title:z7,headerActions:$7,internalsToggle:H7,refreshButton:P7,state:U7,group:V7,groupHeader:q7,row:G7,selected:F7,kindBadge:K7,kindChatroom:Z7,kindPipe:Y7,kindChannel:J7,streamName:W7,meta:X7},Q7={chatroom:"Chatroom",pipe:"Pipe",channel:"Channel"};function ez({kind:t}){return t==="chatroom"?a.jsx(DT,{size:Ye,"aria-hidden":"true"}):t==="pipe"?a.jsx(lT,{size:Ye,"aria-hidden":"true"}):a.jsx(fT,{size:Ye,"aria-hidden":"true"})}function tz({streams:t,sessions:s,tasks:o,loading:r,loadError:c=!1,loadedOnce:d=!0,showInternals:u,onToggleInternals:p,selectedStreamId:m,onSelectStream:g,onRefresh:v,hideHeaderControls:b=!1}){const _=O7(t,s),k={chatroom:Jt.kindChatroom,pipe:Jt.kindPipe,channel:Jt.kindChannel},S=j=>{var T;return((T=o.find(N=>N.id===j))==null?void 0:T.title)??j};return a.jsxs("div",{className:Jt.container,"data-testid":"coordination-list",children:[a.jsxs("div",{className:Jt.header,children:[a.jsx("span",{className:Jt.title,children:"Coordination"}),!b&&a.jsxs("div",{className:Jt.headerActions,children:[a.jsxs("label",{className:Jt.internalsToggle,children:[a.jsx("input",{type:"checkbox",checked:u,onChange:j=>p(j.target.checked),"data-testid":"coordination-show-internals"}),"Show internals"]}),v&&a.jsx("button",{type:"button",className:Jt.refreshButton,onClick:v,"aria-label":"Refresh streams","data-testid":"coordination-refresh",children:a.jsx(GT,{size:Ye,"aria-hidden":"true"})})]})]}),r&&t.length===0&&a.jsxs("div",{className:Jt.state,children:["Loading","…"]}),!r&&c&&a.jsx("div",{className:Jt.state,"data-testid":"coordination-error",children:"Unable to load streams"}),!r&&!c&&d&&t.length===0&&a.jsx("div",{className:Jt.state,"data-testid":"coordination-empty",children:"No active streams"}),_.map(j=>a.jsxs("div",{className:Jt.group,children:[a.jsx("div",{className:Jt.groupHeader,children:j.taskId?S(j.taskId):"Unattached / external (CLI · MCP)"}),j.streams.map(T=>{const N=gh(T),C=T.id===m;return a.jsxs("button",{type:"button",className:`${Jt.row}${C?` ${Jt.selected}`:""}`,onClick:()=>g(T.id),"data-testid":`coordination-row-${T.id}`,"aria-current":C?"page":void 0,children:[a.jsxs("span",{className:`${Jt.kindBadge} ${k[N]}`,children:[a.jsx(ez,{kind:N})," ",Q7[N]]}),a.jsx("span",{className:Jt.streamName,children:T.name}),a.jsxs("span",{className:Jt.meta,children:[T.subscriberCount," ",T.subscriberCount===1?"sub":"subs"," ","·"," ",T.messageBufferDepth," buffered"]})]},T.id)})]},j.taskId??"__orphans__"))]})}const nz="_transcript_1p4cm_1",sz="_message_1p4cm_10",az="_meta_1p4cm_16",iz="_sender_1p4cm_24",oz="_time_1p4cm_29",rz="_content_1p4cm_34",lz="_state_1p4cm_42",qa={transcript:nz,message:sz,meta:az,sender:iz,time:oz,content:rz,state:lz};function cz(t){const s=new Date(t);return Number.isNaN(s.getTime())?t:s.toLocaleTimeString()}function dz({messages:t,loading:s=!1}){return s?a.jsx("div",{className:qa.state,"data-testid":"stream-transcript-loading",children:"Loading transcript…"}):t.length===0?a.jsx("div",{className:qa.state,"data-testid":"stream-transcript-empty",children:"No messages yet."}):a.jsx("div",{className:qa.transcript,"data-testid":"stream-transcript",children:t.map(o=>a.jsxs("div",{className:qa.message,"data-testid":"stream-transcript-message",children:[a.jsxs("div",{className:qa.meta,children:[a.jsx("span",{className:qa.sender,title:o.senderId,children:o.senderId.slice(0,12)}),a.jsx("span",{className:qa.time,children:cz(o.timestamp)})]}),a.jsx("div",{className:qa.content,children:o.content})]},o.seq))})}const uz="_panel_iibrt_1",fz="_header_iibrt_24",pz="_title_iibrt_33",mz="_closeButton_iibrt_43",hz="_body_iibrt_57",gz="_section_iibrt_63",vz="_sectionLabel_iibrt_67",yz="_metaRow_iibrt_76",bz="_metaKey_iibrt_84",_z="_metaValue_iibrt_90",xz="_subscriberCard_iibrt_99",kz="_subscriberHeader_iibrt_107",Sz="_sessionLink_iibrt_114",jz="_badges_iibrt_132",Tz="_badgeRw_iibrt_150 _badge_iibrt_132",Nz="_badgeR_iibrt_150 _badge_iibrt_132",wz="_badgeW_iibrt_162 _badge_iibrt_132",Cz="_badgeAsync_iibrt_168 _badge_iibrt_132",Ez="_badgeSync_iibrt_174 _badge_iibrt_132",Az="_badgeDetach_iibrt_178 _badge_iibrt_132",Dz="_spawnTag_iibrt_184 _badge_iibrt_132",Mz="_fdNumber_iibrt_189",Rz="_emptySubscribers_iibrt_195",Iz="_metaValueMono_iibrt_201 _metaValue_iibrt_90",Oz="_advanced_iibrt_216",Bz="_advancedSummary_iibrt_220",He={panel:uz,header:fz,title:pz,closeButton:mz,body:hz,section:gz,sectionLabel:vz,metaRow:yz,metaKey:bz,metaValue:_z,subscriberCard:xz,subscriberHeader:kz,sessionLink:Sz,badges:jz,badgeRw:Tz,badgeR:Nz,badgeW:wz,badgeAsync:Cz,badgeSync:Ez,badgeDetach:Az,spawnTag:Dz,fdNumber:Mz,emptySubscribers:Rz,metaValueMono:Iz,advanced:Oz,advancedSummary:Bz},Lz={chatroom:"Chatroom",pipe:"Pipe",channel:"Channel"};function zz({permission:t}){const s=t==="rw"?He.badgeRw:t==="r"?He.badgeR:He.badgeW;return a.jsx("span",{className:s,children:t})}function $z({mode:t}){const s=t==="async"?He.badgeAsync:t==="detach"?He.badgeDetach:He.badgeSync;return a.jsx("span",{className:s,children:t})}function Hz({stream:t,messages:s,transcriptLoading:o,onClose:r}){const c=xt();return y.useEffect(()=>{const d=u=>{u.key==="Escape"&&r()};return document.addEventListener("keydown",d),()=>{document.removeEventListener("keydown",d)}},[r]),a.jsxs("div",{className:He.panel,"data-testid":"stream-detail-panel",children:[a.jsxs("div",{className:He.header,children:[a.jsx("h3",{className:He.title,children:t.name}),a.jsx("button",{type:"button",className:He.closeButton,onClick:r,"aria-label":"Close stream details",children:"×"})]}),a.jsxs("div",{className:He.body,children:[a.jsxs("div",{className:He.section,children:[a.jsx("div",{className:He.sectionLabel,children:"Overview"}),a.jsxs("div",{className:He.metaRow,children:[a.jsx("span",{className:He.metaKey,children:"Kind"}),a.jsx("span",{className:He.metaValue,children:Lz[gh(t)]})]}),a.jsxs("div",{className:He.metaRow,children:[a.jsx("span",{className:He.metaKey,children:"Participants"}),a.jsx("span",{className:He.metaValue,children:t.subscriberCount})]}),a.jsxs("div",{className:He.metaRow,children:[a.jsx("span",{className:He.metaKey,children:"Buffered"}),a.jsxs("span",{className:He.metaValue,children:[t.messageBufferDepth," msgs"]})]})]}),a.jsxs("div",{className:He.section,children:[a.jsx("div",{className:He.sectionLabel,children:"Participants"}),t.subscribers.length===0?a.jsx("div",{className:He.emptySubscribers,children:"No active subscribers"}):t.subscribers.map(d=>a.jsxs("div",{className:He.subscriberCard,"data-testid":`subscriber-card-${d.subscriptionId}`,children:[a.jsxs("button",{type:"button",className:He.sessionLink,onClick:()=>{c(Mm(d.sessionId))},title:d.sessionId,children:[d.sessionId.slice(0,12),"…"]}),d.createdBySpawn&&a.jsx("span",{className:He.spawnTag,children:"spawn"})]},d.subscriptionId))]}),a.jsxs("div",{className:He.section,children:[a.jsx("div",{className:He.sectionLabel,children:"Conversation"}),a.jsx(dz,{messages:s??[],loading:o??!1})]}),a.jsxs("details",{className:He.advanced,"data-testid":"stream-advanced",children:[a.jsx("summary",{className:He.advancedSummary,children:"Advanced"}),a.jsxs("div",{className:He.metaRow,children:[a.jsx("span",{className:He.metaKey,children:"Stream ID"}),a.jsx("span",{className:He.metaValueMono,children:t.id})]}),t.subscribers.map(d=>a.jsxs("div",{className:He.subscriberCard,children:[a.jsxs("div",{className:He.subscriberHeader,children:[a.jsxs("span",{className:He.fdNumber,children:["fd ",d.fd]}),a.jsxs("span",{className:He.metaValueMono,title:d.subscriptionId,children:[d.subscriptionId.slice(0,12),"…"]})]}),a.jsxs("div",{className:He.badges,children:[a.jsx(zz,{permission:d.permission}),a.jsx($z,{mode:d.deliveryMode})]})]},d.subscriptionId))]})]})]})}function Dp(t){return t.length>0?t.charAt(0).toUpperCase()+t.slice(1):t}const Pz=["--accent-green","--accent-yellow","--accent-red","--text-tertiary"];function dk(t,s){if(s)return{varName:"--text-tertiary",label:"External"};switch(t){case"running":return{varName:"--accent-green",label:"Running"};case"idle":case"suspended":case"hibernating":return{varName:"--accent-yellow",label:Dp(t)};case"failed":case"interrupted":return{varName:"--accent-red",label:Dp(t)};default:return{varName:"--text-tertiary",label:t.length>0?Dp(t):"Unknown"}}}const uk="session",vh="stream",r_="messageDot";function Kc(t){return`session:${t}`}function l_(t){return`stream:${t}`}function Uz(t){return{id:t,environmentId:"",runtime:"external",status:"external",prompt:"",startedAt:""}}function Vz(t,s){return t==="detach"?{stroke:s,strokeWidth:1.5,strokeDasharray:"4 4",opacity:.6}:{stroke:s,strokeWidth:1.5}}function qz(t,s){const o=t.permission.includes("w"),r=s.permission.includes("w"),c=t.permission.includes("r"),d=s.permission.includes("r");if(o&&!r&&d)return{source:t,target:s,bidirectional:!1};if(r&&!o&&c)return{source:s,target:t,bidirectional:!1};const u=[t,s].sort((p,m)=>p.sessionId.localeCompare(m.sessionId));return{source:u[0],target:u[1],bidirectional:!0}}function Gz(t,s){if(t.length===0)return{nodes:[],edges:[]};const o=new Map(s.map(m=>[m.id,m])),r=new Map,c=new Map,d=[],u=m=>{let g=r.get(m);if(!g){const v=o.get(m);g={kind:"session",session:v??Uz(m),streamCount:0,external:v===void 0},r.set(m,g)}return g};for(const m of t){const g=gh(m);if(g==="pipe"&&m.subscribers.length===2&&m.subscribers[0].sessionId!==m.subscribers[1].sessionId){const[v,b]=m.subscribers;u(v.sessionId).streamCount+=1,u(b.sessionId).streamCount+=1;const{source:_,target:k,bidirectional:S}=qz(v,b);d.push({id:`edge-pipe-${m.id}`,source:Kc(_.sessionId),target:Kc(k.sessionId),type:r_,data:{edgeKind:"pipe",streamId:m.id,permission:S?"rw":_.permission,deliveryMode:_.deliveryMode},style:{stroke:"var(--accent-yellow)",strokeWidth:1.5,strokeDasharray:"6 3"},markerEnd:{type:Mc.ArrowClosed},markerStart:S?{type:Mc.ArrowClosed}:void 0,animated:!1});continue}c.set(m.id,{kind:"stream",stream:m,streamKind:g,ownership:ck(m,o)});for(const v of m.subscribers){u(v.sessionId).streamCount+=1;const b=l_(m.id),_=Kc(v.sessionId),k=v.permission.includes("w"),S=v.permission.includes("r");let j,T,N=!1;k&&S?(j=_,T=b,N=!0):S?(j=b,T=_):(j=_,T=b),d.push({id:`edge-part-${m.id}-${v.subscriptionId}`,source:j,target:T,type:r_,data:{edgeKind:"participation",streamId:m.id,permission:v.permission,deliveryMode:v.deliveryMode},style:Vz(v.deliveryMode,"var(--text-tertiary)"),markerEnd:{type:Mc.ArrowClosed},markerStart:N?{type:Mc.ArrowClosed}:void 0,animated:!1})}}const p=[];for(const[m,g]of r)p.push({id:Kc(m),type:uk,position:{x:0,y:0},data:g});for(const[m,g]of c)p.push({id:l_(m),type:vh,position:{x:0,y:0},data:g});return{nodes:p,edges:d}}const Fz=200,Kz=64,Zz=180,Yz=56,Jz=40,Wz=70;function c_(t){return t===vh?{width:Zz,height:Yz}:{width:Fz,height:Kz}}function Xz(t){if(t.nodes.length===0)return t;const s=new ld.graphlib.Graph({multigraph:!0});s.setDefaultEdgeLabel(()=>({})),s.setGraph({rankdir:"LR",nodesep:Jz,ranksep:Wz});for(const r of t.nodes){const{width:c,height:d}=c_(r.type);s.setNode(r.id,{width:c,height:d})}for(const r of t.edges)s.setEdge(r.source,r.target,{},r.id);return ld.layout(s),{nodes:t.nodes.map(r=>{const c=s.node(r.id),{width:d,height:u}=c_(r.type);return{...r,position:{x:c.x-d/2,y:c.y-u/2}}}),edges:t.edges}}function Qz(t,s){return y.useMemo(()=>Xz(Gz(t,s)),[t,s])}const e$="_graphContainer_1uzcp_1",t$="_empty_1uzcp_18",n$="_nodeContent_1uzcp_28",s$="_nodeHeader_1uzcp_38",a$="_nodeTitle_1uzcp_50",i$="_nodeMeta_1uzcp_58",o$="_nodeSubtle_1uzcp_64",r$="_countBadge_1uzcp_69",l$="_sessionNode_1uzcp_81",c$="_sessionAccent_1uzcp_103",d$="_external_1uzcp_109",u$="_streamNode_1uzcp_114",f$="_chatroom_1uzcp_134",p$="_channel_1uzcp_139",m$="_pipe_1uzcp_143",h$="_haloless_1uzcp_147",g$="_selected_1uzcp_153",v$="_kindBadge_1uzcp_158",y$="_handle_1uzcp_172",b$="_messageDot_1uzcp_179",vt={graphContainer:e$,empty:t$,nodeContent:n$,nodeHeader:s$,nodeTitle:a$,nodeMeta:i$,nodeSubtle:o$,countBadge:r$,sessionNode:l$,sessionAccent:c$,external:d$,streamNode:u$,chatroom:f$,channel:p$,pipe:m$,haloless:h$,selected:g$,kindBadge:v$,handle:y$,messageDot:b$};function _$({data:t}){const{session:s,streamCount:o,external:r}=t,c=dk(s.status,r),d=`var(${c.varName})`,u=r?`${vt.sessionNode} ${vt.external}`:vt.sessionNode;return a.jsxs("div",{className:u,"data-testid":`coordination-node-session-${s.id}`,children:[a.jsx(Bo,{type:"target",position:Lo.Left,isConnectable:!1,className:vt.handle}),a.jsx("div",{className:vt.sessionAccent,style:{backgroundColor:d}}),a.jsxs("div",{className:vt.nodeContent,children:[a.jsx("div",{className:vt.nodeHeader,children:a.jsx("span",{className:vt.nodeTitle,children:r?s.id:s.runtime})}),a.jsxs("div",{className:vt.nodeMeta,children:[a.jsx("span",{className:vt.nodeSubtle,style:{color:d},children:c.label}),o>0&&a.jsx("span",{className:vt.countBadge,children:o})]})]}),a.jsx(Bo,{type:"source",position:Lo.Right,isConnectable:!1,className:vt.handle})]})}function x$({data:t,selected:s}){const{stream:o,streamKind:r,ownership:c}=t,d=r==="chatroom"?vt.chatroom:r==="pipe"?vt.pipe:vt.channel,u=[vt.streamNode,d];return c.kind!=="task"&&u.push(vt.haloless),s&&u.push(vt.selected),a.jsxs("div",{className:u.join(" "),"data-testid":`coordination-node-stream-${o.id}`,children:[a.jsx(Bo,{type:"target",position:Lo.Left,isConnectable:!1,className:vt.handle}),a.jsxs("div",{className:vt.nodeContent,children:[a.jsx("div",{className:vt.nodeHeader,children:a.jsx("span",{className:vt.kindBadge,children:r})}),a.jsx("span",{className:vt.nodeTitle,children:o.name}),a.jsxs("span",{className:vt.nodeSubtle,children:[o.subscriberCount," ",o.subscriberCount===1?"subscriber":"subscribers"]})]}),a.jsx(Bo,{type:"source",position:Lo.Right,isConnectable:!1,className:vt.handle})]})}const d_="0.7s",k$=3;function S$(t){const{sourceX:s,sourceY:o,targetX:r,targetY:c,sourcePosition:d,targetPosition:u,markerStart:p,markerEnd:m,style:g,data:v}=t,[b]=V2({sourceX:s,sourceY:o,targetX:r,targetY:c,sourcePosition:d,targetPosition:u}),_=v==null?void 0:v.pulseSeq;return a.jsxs(a.Fragment,{children:[a.jsx(q2,{path:b,markerStart:p,markerEnd:m,style:g}),_!==void 0&&a.jsxs("circle",{r:k$,opacity:0,className:vt.messageDot,"data-testid":"coordination-message-dot",children:[a.jsx("animateMotion",{dur:d_,repeatCount:"1",path:b}),a.jsx("animate",{attributeName:"opacity",dur:d_,repeatCount:"1",values:"0;1;1;0",keyTimes:"0;0.1;0.85;1"})]},_)]})}const Mp="#6b7a8d",j$={[uk]:_$,[vh]:x$},T$={messageDot:S$};function N$({streams:t,sessions:s,selectedStreamId:o,onSelectStream:r,recentMessages:c,resolvedThemeId:d}){const u=Qz(t,s),p=y.useMemo(()=>u.edges.map(_=>{var S,j;if(!_.data)return _;const k=(j=(S=c==null?void 0:c[_.data.streamId])==null?void 0:S.at(-1))==null?void 0:j.seq;return k===void 0?_:{..._,data:{..._.data,pulseSeq:k}}}),[u.edges,c]),m=y.useMemo(()=>u.nodes.map(_=>{const k=_.data;return k.kind==="stream"&&k.stream.id===o?{..._,selected:!0}:_}),[u.nodes,o]),g=y.useMemo(()=>{const _=getComputedStyle(document.documentElement),k={};for(const S of Pz)k[S]=_.getPropertyValue(S).trim()||Mp;return k},[d]),v=y.useCallback((_,k)=>{const S=k.data;S.kind==="stream"&&r(S.stream.id)},[r]),b=y.useCallback(_=>{const k=_.data;return k.kind==="session"?g[dk(k.session.status,k.external).varName]??Mp:Mp},[g]);return u.nodes.length===0?a.jsx("div",{className:vt.empty,"data-testid":"coordination-graph-empty",children:"No active streams to visualize"}):a.jsx("div",{className:vt.graphContainer,"data-testid":"coordination-graph",children:a.jsxs(M_,{nodes:m,edges:p,nodeTypes:j$,edgeTypes:T$,onNodeClick:v,nodesConnectable:!1,fitView:!0,fitViewOptions:{padding:.2},minZoom:.3,maxZoom:2,children:[a.jsx(R_,{variant:I_.Dots,gap:24,size:1,color:"var(--text-disabled)"}),a.jsx(O_,{showInteractive:!1}),a.jsx(B_,{nodeColor:b,maskColor:"var(--bg-overlay)",style:{background:"var(--bg-inset)"}})]})})}function w$({tasks:t,taskStatusById:s,sessionStatusByTaskId:o}){const r=new Map;for(const d of t)if(d.parentTaskId){const u=r.get(d.parentTaskId);u?u.push(d):r.set(d.parentTaskId,[d])}const c=new Map(Sy.map(d=>[d,[]]));for(const d of t){const u=fl(d.status),p=d.dependsOn.length>0&&d.dependsOn.some(S=>s.get(S)!=="complete"),m=r.get(d.id)??[],g=m.length,v=m.filter(S=>S.status==="complete").length;let b;if(u==="paused"&&o){const S=o.get(d.id);S==="idle"?b="Needs input":S==="completed"&&(b="Ready to complete")}const _={task:d,isBlocked:p,childCount:g,doneChildCount:v,pausedSubBadge:b},k=c.get(u);k?k.push(_):c.get("not_started").push(_)}for(const d of c.values())d.sort((u,p)=>u.task.sortOrder-p.task.sortOrder);return Sy.map(d=>{const u=Ya(d);return{status:d,label:u.label,style:u,tasks:c.get(d)??[]}})}const C$="_boardContainer_1c4y1_1",E$="_column_1c4y1_17",A$="_columnHeader_1c4y1_34",D$="_columnIcon_1c4y1_47",M$="_columnLabel_1c4y1_52",R$="_columnCount_1c4y1_57",I$="_cardList_1c4y1_67",O$="_emptyPlaceholder_1c4y1_76",B$="_card_1c4y1_67",L$="_cardHeader_1c4y1_107",z$="_cardStatusIcon_1c4y1_113",$$="_cardTitle_1c4y1_119",H$="_cardBadges_1c4y1_127",P$="_badge_1c4y1_134",U$="_blockedBadge_1c4y1_146",V$="_childBadge_1c4y1_151",q$="_depBadge_1c4y1_155",G$="_parentBadge_1c4y1_159",F$="_pausedSubBadge_1c4y1_166",K$="_personaBadge_1c4y1_170",Z$="_envBadge_1c4y1_174",Y$="_emptyCta_1c4y1_178",J$="_ctaButton_1c4y1_188",W$="_ctaDescription_1c4y1_204",dt={boardContainer:C$,column:E$,columnHeader:A$,columnIcon:D$,columnLabel:M$,columnCount:R$,cardList:I$,emptyPlaceholder:O$,card:B$,cardHeader:L$,cardStatusIcon:z$,cardTitle:$$,cardBadges:H$,badge:P$,blockedBadge:U$,childBadge:V$,depBadge:q$,parentBadge:G$,pausedSubBadge:F$,personaBadge:K$,envBadge:Z$,emptyCta:Y$,ctaButton:J$,ctaDescription:W$};function X$({workspaceId:t,environmentId:s,tasks:o,sessions:r,personas:c,environments:d}){const u=xt(),p=y.useMemo(()=>o.filter(_=>_.workspaceId===t),[o,t]),m=y.useMemo(()=>new Map(o.map(_=>[_.id,_.status])),[o]),g=y.useMemo(()=>new Map(p.map(_=>[_.id,_])),[p]),v=y.useMemo(()=>{const _=new Map(r.map(C=>[C.id,C])),k=new Map(c.map(C=>[C.id,C])),S=new Map(d.map(C=>[C.id,C])),j=new Map,T=new Map,N=new Map;for(const C of p)if(C.latestSessionId){const D=_.get(C.latestSessionId);if(D){if(j.set(C.id,D.endReason||D.status),D.personaId){const A=k.get(D.personaId);A&&T.set(C.id,A.name)}if(D.environmentId){const A=S.get(D.environmentId);A&&N.set(C.id,A.displayName)}}}return{sessionStatusByTaskId:j,personaNameByTaskId:T,environmentNameByTaskId:N}},[p,r,c,d]),b=y.useMemo(()=>w$({tasks:p,taskStatusById:m,sessionStatusByTaskId:v.sessionStatusByTaskId}),[p,m,v]);return p.length===0?a.jsxs("div",{className:dt.emptyCta,"data-testid":"board-empty-cta",children:[a.jsx("button",{className:dt.ctaButton,onClick:()=>u(Ri(t,void 0,s)),children:"Create Task"}),a.jsx("div",{className:dt.ctaDescription,children:"Break your work into tasks and let agents tackle them"})]}):a.jsx("div",{className:dt.boardContainer,"data-testid":"board-container",children:b.map(_=>a.jsxs("section",{className:dt.column,"data-testid":`board-column-${_.status}`,"aria-label":`${_.label}, ${_.tasks.length} ${_.tasks.length===1?"task":"tasks"}`,children:[a.jsxs("div",{className:dt.columnHeader,children:[a.jsx("span",{className:dt.columnIcon,style:{color:_.style.color},children:_.style.icon}),a.jsx("span",{className:dt.columnLabel,children:_.label}),a.jsx("span",{className:dt.columnCount,"data-testid":`board-count-${_.status}`,children:_.tasks.length})]}),a.jsx("div",{className:dt.cardList,children:_.tasks.length===0?a.jsx("div",{className:dt.emptyPlaceholder,children:"No tasks"}):a.jsx(os,{mode:"popLayout",children:_.tasks.map(k=>a.jsx(Pt.div,{layout:!0,initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},children:a.jsx(Q$,{boardTask:k,tasksById:g,personaName:v.personaNameByTaskId.get(k.task.id),envName:v.environmentNameByTaskId.get(k.task.id),onClick:()=>u(ls(k.task.id,void 0,t,s))})},k.task.id))})})]},_.status))})}function Q$({boardTask:t,tasksById:s,personaName:o,envName:r,onClick:c}){const{task:d,isBlocked:u,childCount:p,doneChildCount:m,pausedSubBadge:g}=t,v=Ya(d.status),b=d.parentTaskId?s.get(d.parentTaskId):void 0;return a.jsxs("div",{className:dt.card,tabIndex:0,role:"button","data-testid":`board-card-${d.id}`,onClick:c,onKeyDown:_=>{(_.key==="Enter"||_.key===" ")&&(_.preventDefault(),c())},children:[a.jsxs("div",{className:dt.cardHeader,children:[a.jsx("span",{className:dt.cardStatusIcon,style:{color:v.color},children:v.icon}),a.jsx("span",{className:dt.cardTitle,children:d.title})]}),a.jsxs("div",{className:dt.cardBadges,children:[b&&a.jsx("span",{className:`${dt.badge} ${dt.parentBadge}`,title:b.title,children:b.title}),p>0&&a.jsxs("span",{className:`${dt.badge} ${dt.childBadge}`,children:[m,"/",p]}),u&&a.jsx("span",{className:`${dt.badge} ${dt.blockedBadge}`,children:"blocked"}),d.dependsOn.length>0&&!u&&a.jsx("span",{className:`${dt.badge} ${dt.depBadge}`,children:"dep"}),g&&a.jsx("span",{className:`${dt.badge} ${dt.pausedSubBadge}`,children:g}),o&&a.jsx("span",{className:`${dt.badge} ${dt.personaBadge}`,children:o}),r&&a.jsx("span",{className:`${dt.badge} ${dt.envBadge}`,children:r})]})]})}const e9="_formContent_ymnez_1",t9="_section_ymnez_13",n9="_label_ymnez_19",s9="_titleInput_ymnez_26",a9="_descriptionTextarea_ymnez_58",i9="_selectField_ymnez_94",o9="_checkboxRow_ymnez_128",r9="_checkboxLabel_ymnez_141",l9="_fieldError_ymnez_146",jt={formContent:e9,section:t9,label:n9,titleInput:s9,descriptionTextarea:a9,selectField:i9,checkboxRow:o9,checkboxLabel:r9,fieldError:l9};function c9(t,s){return{name:(t==null?void 0:t.name)??"",description:(t==null?void 0:t.description)??"",repoUrl:(t==null?void 0:t.repoUrl)??"",environmentId:(t==null?void 0:t.linkedEnvironmentIds[0])??s??"",defaultPersonaId:(t==null?void 0:t.defaultPersonaId)??"",useWorktrees:(t==null?void 0:t.useWorktrees)??!0,workingDirectory:(t==null?void 0:t.workingDirectory)??""}}const d9=100;function u9({values:t,onChange:s,environments:o,personas:r,errors:c,disabled:d,autoFocusName:u}){const p=(m,g)=>{s({...t,[m]:g})};return a.jsxs("div",{className:jt.formContent,children:[a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-name",children:"Name"}),a.jsx("input",{id:"ws-name",className:jt.titleInput,type:"text",value:t.name,onChange:m=>p("name",m.target.value),placeholder:"Workspace name",maxLength:d9,autoFocus:u,disabled:d,"data-testid":"workspace-form-name"}),(c==null?void 0:c.name)&&a.jsx("span",{className:jt.fieldError,"data-testid":"workspace-form-error-name",children:c.name})]}),a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-description",children:"Description"}),a.jsx("textarea",{id:"ws-description",className:jt.descriptionTextarea,value:t.description,onChange:m=>p("description",m.target.value),placeholder:"Optional description (Markdown supported)",disabled:d,"data-testid":"workspace-form-description"})]}),a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-repo",children:"Repository URL"}),a.jsx("input",{id:"ws-repo",className:jt.titleInput,type:"text",value:t.repoUrl,onChange:m=>p("repoUrl",m.target.value),placeholder:"https://github.com/org/repo",disabled:d,"data-testid":"workspace-form-repo"}),(c==null?void 0:c.repoUrl)&&a.jsx("span",{className:jt.fieldError,"data-testid":"workspace-form-error-repoUrl",children:c.repoUrl})]}),a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-environment",children:"Environment"}),a.jsxs("select",{id:"ws-environment",className:jt.selectField,value:t.environmentId,onChange:m=>p("environmentId",m.target.value),disabled:d,"data-testid":"workspace-form-environment",children:[a.jsx("option",{value:"",children:"Select environment…"}),o.map(m=>a.jsx("option",{value:m.id,children:m.displayName||m.id},m.id))]}),(c==null?void 0:c.environmentId)&&a.jsx("span",{className:jt.fieldError,"data-testid":"workspace-form-error-environmentId",children:c.environmentId})]}),a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-persona",children:"Default Persona"}),a.jsxs("select",{id:"ws-persona",className:jt.selectField,value:t.defaultPersonaId,onChange:m=>p("defaultPersonaId",m.target.value),disabled:d,"data-testid":"workspace-form-persona",children:[a.jsx("option",{value:"",children:"(Inherit)"}),r.map(m=>a.jsx("option",{value:m.id,children:m.name},m.id))]})]}),a.jsx("div",{className:jt.section,children:a.jsxs("label",{className:jt.checkboxRow,children:[a.jsx("input",{type:"checkbox",checked:t.useWorktrees,onChange:m=>p("useWorktrees",m.target.checked),disabled:d,"data-testid":"workspace-form-worktrees"}),a.jsx("span",{className:jt.checkboxLabel,children:"Enable worktree isolation"})]})}),a.jsxs("div",{className:jt.section,children:[a.jsx("label",{className:jt.label,htmlFor:"ws-workdir",children:"Working Directory"}),a.jsx("input",{id:"ws-workdir",className:jt.titleInput,type:"text",value:t.workingDirectory,onChange:m=>p("workingDirectory",m.target.value),placeholder:"Default (server default)",disabled:d,"data-testid":"workspace-form-workdir"})]})]})}const fk=y.createContext(void 0),f9=4e3;function p9({children:t}){const[s,o]=y.useState([]),r=y.useRef(0),c=y.useCallback(u=>{o(p=>p.filter(m=>m.id!==u))},[]),d=y.useCallback((u,p="info",m=f9)=>{const g=`toast-${++r.current}`;o(v=>[...v,{id:g,message:u,variant:p,duration:m}])},[]);return a.jsx(fk.Provider,{value:{toasts:s,showToast:d,dismissToast:c},children:t})}function pn(){const t=y.useContext(fk);if(!t)throw new Error("useToast must be used within ToastProvider");return t}const hm="grackle-theme",pk="grackle-prefer-system",mk="(prefers-color-scheme: dark)";let Jr=[],rd;function Rp(){rd=void 0;for(const t of Jr)t()}function gm(){return typeof window>"u"?!1:window.matchMedia(mk).matches}function nl(){if(typeof localStorage>"u")return a_;try{const t=localStorage.getItem(hm);if(t!==null&&ik.has(t))return t}catch{}return a_}function _d(){if(typeof localStorage>"u")return!1;try{return localStorage.getItem(pk)==="true"}catch{return!1}}function vm(t){return Od.find(s=>s.variantLightId===t||s.variantDarkId===t)}function hk(t,s){const o=pm(t);if(o!=null&&o.variantDarkId)return s&&o.variantLightId?gm()?o.variantDarkId:o.variantLightId:o.variantDarkId;if(o!=null&&o.hidden&&s){const r=vm(t);if(r!=null&&r.variantLightId&&r.variantDarkId)return gm()?r.variantDarkId:r.variantLightId}return t}function Ao(t,s,o=!1){o&&document.documentElement.classList.add("no-transitions"),document.documentElement.dataset.theme=hk(t,s),o&&(document.documentElement.offsetHeight,requestAnimationFrame(()=>{document.documentElement.classList.remove("no-transitions")}))}typeof document<"u"&&Ao(nl(),_d());function m9(){return rd===void 0&&(rd={themeId:nl(),systemDark:gm(),preferSystem:_d()}),rd}function h9(t){return Jr=[...Jr,t],()=>{Jr=Jr.filter(s=>s!==t)}}function g9(){const t=y.useSyncExternalStore(h9,m9),{themeId:s,preferSystem:o}=t,r=hk(s,o),c=y.useCallback(u=>{if(ik.has(u)){try{localStorage.setItem(hm,u)}catch{}Ao(u,_d(),!0),Rp()}},[]),d=y.useCallback(u=>{try{localStorage.setItem(pk,u?"true":"false")}catch{}if(u){const p=nl(),m=pm(p);if(m!=null&&m.hidden){const g=vm(p);if(g)try{localStorage.setItem(hm,g.id)}catch{}}}Ao(nl(),u,!0),Rp()},[]);return y.useEffect(()=>{Ao(s,o)},[s,o]),y.useEffect(()=>{if(typeof window>"u")return;const u=window.matchMedia(mk),p=()=>{const m=nl(),g=_d();if(g){const v=pm(m);if(v!=null&&v.variantDarkId&&v.variantLightId&&Ao(m,g),v!=null&&v.hidden){const b=vm(m);b!=null&&b.variantDarkId&&b.variantLightId&&Ao(m,g)}}Rp()};return u.addEventListener("change",p),()=>{u.removeEventListener("change",p)}},[]),{themeId:s,setTheme:c,resolvedThemeId:r,preferSystem:o,setPreferSystem:d}}const gk=y.createContext(void 0);function v9({children:t}){const s=g9();return a.jsx(gk.Provider,{value:s,children:t})}function yh(){const t=y.useContext(gk);if(!t)throw new Error("useThemeContext must be used within ThemeProvider");return t}const vk=y.createContext(void 0),yk=y.createContext(void 0);function y9({children:t}){const[s,o]=y.useState(void 0),r=y.useCallback(c=>{o(c)},[]);return a.jsx(yk.Provider,{value:r,children:a.jsx(vk.Provider,{value:s,children:t})})}function b9(){return y.useContext(vk)}function _9(){const t=y.useContext(yk);if(t===void 0)throw new Error("useSidebarSetter must be used within a SidebarProvider");return t}const bh=y.createContext(void 0);function pt(){const t=y.useContext(bh);if(!t)throw new Error("useGrackle must be used within GrackleProvider");return t}function bk(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function _k(t,s){return console.warn(`[ws] Malformed "${t}" message: ${s}`),!1}function x9(t){return bk(t)&&typeof t.sessionId=="string"&&typeof t.eventType=="string"&&typeof t.timestamp=="string"&&typeof t.content=="string"&&(t.raw===void 0||typeof t.raw=="string")&&(t.toolCallId===void 0||typeof t.toolCallId=="string")}const k9=new Set(["off","subscription","api_key"]),Zc=new Set(["off","on"]);function S9(t){return bk(t)&&k9.has(t.claude)&&Zc.has(t.github)&&Zc.has(t.copilot)&&Zc.has(t.codex)&&Zc.has(t.goose)}function xk(t){switch(t){case"waiting_input":return"idle";case"completed":return"stopped";case"killed":return"stopped";case"failed":return"stopped";case"interrupted":return"stopped";case"terminated":return"stopped";default:return t}}function kk(t){switch(t){case"completed":return"completed";case"killed":return"killed";case"failed":return"interrupted";case"interrupted":return"interrupted";case"terminated":return"terminated";default:return}}const Co=5e3;function j9(t,s){const o=[];let r=t;const c=new Set;for(;r&&s.has(r)&&!c.has(r);){c.add(r);const d=s.get(r);o.unshift(d),r=d.parentTaskId||void 0}return o}const Ei={label:"Home",url:Fo};function T9(t){return t?[Ei,{label:"Settings",url:ji},{label:t,url:void 0}]:[Ei,{label:"Settings",url:void 0}]}const Sk={label:"Environments",url:zo};function N9(){return[Ei,{label:"Environments",url:void 0}]}function w9(){return[Ei,{label:"New Chat",url:void 0}]}function C9(t){return[Ei,{label:`Session ${t.slice(0,8)}`,url:void 0}]}function E9(t,s,o,r){const c=o.find(u=>u.id===t),d=r.find(u=>u.id===s);return[Ei,Sk,{label:(d==null?void 0:d.displayName)??"Environment",url:$o(s)},{label:(c==null?void 0:c.name)??"Workspace",url:void 0}]}function A9(t,s,o,r,c){const d=j9(t,c),u=c.get(t),p=u==null?void 0:u.workspaceId,m=p?o.find(k=>k.id===p):void 0,g=s??(m==null?void 0:m.linkedEnvironmentIds[0]),v=g?r.find(k=>k.id===g):void 0,b=[Ei];v&&g&&(b.push(Sk),b.push({label:v.displayName,url:$o(g)})),m&&g&&b.push({label:m.name,url:wi(m.id,g)});for(let k=0;k<d.length-1;k++)b.push({label:d[k].title,url:ls(d[k].id,void 0,p,g)});const _=d[d.length-1];return b.push({label:(_==null?void 0:_.title)??t,url:void 0}),b}function _h(t){const s=[];for(const o of t){const r=s[s.length-1];o.eventType==="text"&&(r==null?void 0:r.eventType)==="text"?s[s.length-1]={...r,content:r.content+o.content}:s.push(o)}return s}function u_(t){if(typeof t.id=="string")return t.id;const s=t.data;if(s&&typeof s.toolCallId=="string")return s.toolCallId;const o=t.item;if(o&&typeof o.id=="string")return o.id}function D9(t){if(typeof t.tool_use_id=="string")return t.tool_use_id;const s=t.data;if(s&&typeof s.toolCallId=="string")return s.toolCallId;const o=t.item;if(o&&typeof o.id=="string")return o.id}function Ip(t,s,o){return t.toolCallId?t.toolCallId:s?o(s):void 0}function xh(t){const s=new Map;for(const u of t)if(u.raw)try{s.set(u,JSON.parse(u.raw))}catch{}const o=new Map;for(const u of t){if(u.eventType!=="tool_use")continue;const p=Ip(u,s.get(u),u_);if(p)try{const m=JSON.parse(u.content);o.set(p,{tool:m.tool,args:m.args})}catch{}}const r=new Set,d=t.map(u=>{if(u.eventType!=="tool_result")return u;const p=Ip(u,s.get(u),D9);if(!p)return u;const m=o.get(p);if(!m)return u;r.add(p);let g;const v=u.content.trim();if(v.startsWith("{"))try{const b=JSON.parse(v);typeof b.detailedContent=="string"&&(g=b.detailedContent)}catch{}return{...u,toolUseCtx:{...m,detailedResult:g}}}).filter(u=>{if(u.eventType!=="tool_use")return!0;const p=Ip(u,s.get(u),u_);return!(p&&r.has(p))});for(let u=0;u<d.length;u++){if(d[u].eventType!=="tool_use")continue;let p=!1;for(let m=u+1;m<d.length;m++)if(d[m].eventType!=="tool_use"){p=!0;break}p&&(d[u]={...d[u],settled:!0})}return d}function M9(t,s,o){const r=t.filter(m=>m.status==="running"||m.status==="idle"||m.status==="waiting").length,c=jk(s),d=s.filter(m=>ym(m,c)).length,u=s.filter(m=>m.status==="paused"||m.status==="failed"||ym(m,c)).length,p=o.filter(m=>m.status==="disconnected"||m.status==="error").length;return{activeSessions:r,blockedTasks:d,attentionTasks:u,unhealthyEnvironments:p}}function jk(t){const s=new Map;for(const o of t)s.set(o.id,o.status);return s}function ym(t,s){return t.dependsOn.some(o=>s.get(o)!=="complete")}function R9(t,s){var u;const o=new Map;for(const p of s)o.set(p.id,p);const r=jk(t),c=[];for(const p of t){const m=p.workspaceId?((u=o.get(p.workspaceId))==null?void 0:u.name)??"Unknown":"Unknown";p.status==="failed"?c.push({task:p,reason:"failed",workspaceName:m}):ym(p,r)?c.push({task:p,reason:"blocked",workspaceName:m}):p.status==="paused"&&c.push({task:p,reason:"paused",workspaceName:m})}const d={failed:0,blocked:1,paused:2};return c.sort((p,m)=>(d[p.reason]??3)-(d[m.reason]??3)),c}function I9(t,s){const o=new Map;for(const r of s)o.set(r.id,r);return t.filter(r=>r.status==="running"||r.status==="idle"||r.status==="waiting").map(r=>{var c;return{session:r,environmentName:((c=o.get(r.environmentId))==null?void 0:c.displayName)??"Unknown"}})}function O9(t,s,o){const r=new Map;for(const c of s){if(!c.workspaceId)continue;let d=r.get(c.workspaceId);d||(d={totalTasks:0,completedTasks:0,workingTasks:0,failedTasks:0},r.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 t.map(c=>{const d=r.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 Ds=[{id:"kn-auth-flow",label:"Authentication Flow",kind:"knowledge",category:"concept",content:"The application uses JWT Bearer tokens for stateless authentication. Access tokens expire after 24h. Refresh tokens are stored in the database and rotated on use. The auth middleware verifies tokens and attaches the decoded payload to req.user.",tags:["auth","jwt","security"],workspaceId:"proj-alpha",createdAt:"2026-02-25T10:30:00Z",updatedAt:"2026-02-27T08:15:00Z",val:5},{id:"kn-db-schema",label:"Database Schema",kind:"knowledge",category:"concept",content:"PostgreSQL database with tables: users, sessions, refresh_tokens, audit_log. Uses UUID primary keys, TIMESTAMPTZ for all timestamps, and JSONB for flexible metadata columns. Connection pooling via pg-pool with per-tenant isolation.",tags:["database","postgres","schema"],workspaceId:"proj-alpha",createdAt:"2026-02-23T11:00:00Z",updatedAt:"2026-02-26T22:45:00Z",val:4},{id:"kn-error-handling",label:"Error Response Pattern",kind:"knowledge",category:"concept",content:"All API errors follow the shape { error: string, code: string, details?: unknown }. HTTP status codes map to: 400 (validation), 401 (unauthenticated), 403 (forbidden), 404 (not found), 409 (conflict), 429 (rate limited), 500 (internal).",tags:["api","errors","patterns"],workspaceId:"proj-alpha",createdAt:"2026-02-27T08:17:00Z",updatedAt:"2026-02-27T08:17:00Z",val:3},{id:"kn-rate-limiting",label:"Rate Limiting Strategy",kind:"knowledge",category:"concept",content:"Token-bucket algorithm with in-memory state per client IP. Default rate: 100 requests/minute, burst: 20. Returns 429 with Retry-After header. Redis adapter available for multi-instance deployments.",tags:["api","rate-limiting","infrastructure"],workspaceId:"proj-alpha",createdAt:"2026-02-27T09:00:00Z",updatedAt:"2026-02-27T09:00:00Z",val:2},{id:"kn-etl-pipeline",label:"ETL Pipeline Architecture",kind:"knowledge",category:"concept",content:"Data pipelines follow an Extract-Transform-Load pattern with pluggable stages. Each stage reads from a source (Postgres, S3, API), transforms via configurable mappers, and loads into a target (Parquet, BigQuery, S3). Incremental loads use high-watermark tracking.",tags:["etl","pipeline","architecture"],workspaceId:"proj-beta",createdAt:"2026-02-26T08:00:00Z",updatedAt:"2026-02-27T09:05:00Z",val:4},{id:"kn-parquet-format",label:"Parquet Output Format",kind:"knowledge",category:"concept",content:"Parquet files are written with row-group buffering (configurable batch size, default 10000 rows). Supports Snappy, ZSTD, and GZIP compression. Schema is derived from the internal column type system using Arrow type mapping.",tags:["parquet","data-format","compression"],workspaceId:"proj-beta",createdAt:"2026-02-26T08:05:00Z",updatedAt:"2026-02-26T08:15:00Z",val:3},{id:"kn-jwt-over-session",label:"JWT over Session Auth",kind:"knowledge",category:"decision",content:"Chose JWT tokens over server-side sessions for stateless auth. Rationale: (1) no session store needed, (2) works across microservices without shared state, (3) supports mobile clients natively. Trade-off: tokens can't be revoked instantly (mitigated by short expiry + refresh rotation).",tags:["auth","decision","jwt"],workspaceId:"proj-alpha",createdAt:"2026-02-25T10:00:00Z",updatedAt:"2026-02-25T10:00:00Z",val:3},{id:"kn-pg-pool-decision",label:"pg-pool over Knex",kind:"knowledge",category:"decision",content:"Chose pg-pool over Knex for connection pooling. pg-pool gives direct control over idle timeout, max connections, and health check queries. Knex wraps pg-pool and adds query-building overhead we don't need since we write raw SQL with parameterized queries.",tags:["database","decision","postgres"],workspaceId:"proj-alpha",createdAt:"2026-02-23T11:30:00Z",updatedAt:"2026-02-23T11:30:00Z",val:2},{id:"kn-watermark-decision",label:"Local Watermark Storage",kind:"knowledge",category:"decision",content:"Currently using local SQLite for watermark storage. This works for single-worker pipelines but needs to move to a shared store (Redis or Postgres) for production multi-worker scenarios. Tracked as a follow-up task.",tags:["pipeline","decision","watermarks"],workspaceId:"proj-beta",createdAt:"2026-02-27T09:05:00Z",updatedAt:"2026-02-27T09:05:00Z",val:2},{id:"kn-jwt-middleware",label:"JWT Verify Middleware",kind:"knowledge",category:"snippet",content:`\`\`\`typescript
326
326
  export function verifyToken(req: Request, res: Response, next: NextFunction): void {
327
327
  const header = req.headers.authorization;
328
328
  if (!header?.startsWith("Bearer ")) {
@@ -738,7 +738,7 @@ export function verifyToken(req: Request, res: Response, next: NextFunction): vo
738
738
 
739
739
  Tests: 3 passed, 3 total
740
740
  Time: 1.234s`,raw:JSON.stringify({tool_use_id:"tool-mock-003",is_error:!1})}},{delayMs:6400,event:{eventType:"tool_use",timestamp:Oe(6400),content:JSON.stringify({tool:"Grep",args:{pattern:"decoded\\.exp",path:"src/"}}),raw:JSON.stringify({id:"tool-mock-004"})}},{delayMs:7e3,event:{eventType:"tool_result",timestamp:Oe(7e3),content:`src/middleware/auth.ts:14: if (decoded.exp < Date.now() / 1000) {
741
- src/utils/token-refresh.ts:28: const remaining = decoded.exp - Date.now() / 1000;`,raw:JSON.stringify({tool_use_id:"tool-mock-004",is_error:!1})}},{delayMs:7800,event:{eventType:"text",timestamp:Oe(7800),content:"Fixed. The token expiry comparison was inverted — `decoded.exp > Date.now()` should have been `<` (a token is expired when its `exp` is in the past). The other occurrence in `token-refresh.ts` uses subtraction (not comparison), so it was already correct. All 3 auth tests pass."}},{delayMs:8400,event:{eventType:"usage",timestamp:Oe(8400),content:JSON.stringify({input_tokens:42600,output_tokens:1850,cost_millicents:12e3})}},{delayMs:8800,event:{eventType:"status",timestamp:Oe(8800),content:"completed"}}]}],ss={onConnect:async()=>{},onDisconnect:()=>{},handleEvent:()=>!1};function h_(t){return t?p_:p_.filter(s=>!I7.some(o=>s.name.startsWith(o)))}const g_=400;function F9({children:t}){const[s,o]=y.useState(z9),[r,c]=y.useState($9),[d,u]=y.useState(()=>h_(!1)),[p,m]=y.useState(H9),[g,v]=y.useState(void 0),[b,_]=y.useState(P9),[k,S]=y.useState(""),[j,T]=y.useState(U9),[N,C]=y.useState(V9),[D,A]=y.useState({claude:"off",github:"off",copilot:"off",codex:"off",goose:"off"}),[E,R]=y.useState(q9),[O,M]=y.useState([]),[$]=y.useState(G9),[Y,V]=y.useState(""),[ne,le]=y.useState(Ds),[Z,se]=y.useState(Ga),[H,B]=y.useState(void 0),[F,ge]=y.useState(void 0),[ee,ce]=y.useState(""),me=y.useRef(void 0),xe=y.useRef(0),De=y.useRef(0),ot=y.useRef(new Set),bt=y.useRef(new Map),lt=y.useRef(j);lt.current=j;const Pe=y.useRef(new Map),ke=y.useRef(new Map),ct=y.useCallback(U=>(xe.current+=1,`mock-${U}-${String(xe.current).padStart(3,"0")}`),[]),ue=y.useCallback(()=>{const U=m_[De.current%m_.length];return De.current+=1,U},[]),Re=y.useCallback((U,ae,de)=>{const pe=setTimeout(()=>{var ye;ot.current.delete(pe),de&&((ye=bt.current.get(de))==null||ye.delete(pe)),U()},ae);ot.current.add(pe),de&&(bt.current.has(de)||bt.current.set(de,new Set),bt.current.get(de).add(pe))},[]),Q=y.useCallback(U=>{const ae=bt.current.get(U);ae&&(ae.forEach(de=>{clearTimeout(de),ot.current.delete(de)}),bt.current.delete(U))},[]),nt=y.useCallback((U,ae,de)=>{c(pe=>pe.map(ye=>ye.id===U?{...ye,status:ae,...de!==void 0?{endReason:de}:{}}:ye))},[]),re=y.useCallback(U=>{m(ae=>[...ae,U])},[]),ve=y.useCallback((U,ae,de)=>{ae.forEach((pe,ye)=>{Re(()=>{const tt={sessionId:U,...pe.event,timestamp:new Date().toISOString()};if(re(tt),pe.event.eventType==="status"){const je=xk(pe.event.content),Le=kk(pe.event.content);nt(U,je,Le)}ye===ae.length-1&&de&&de()},pe.delayMs,U)})},[Re,re,nt]),et=y.useCallback(async(U,ae,de,pe)=>{console.log("[MockGrackle] spawn",{environmentId:U,prompt:ae,runtime:pe});const ye=ct("sess"),tt={id:ye,environmentId:U,runtime:pe||"claude-code",status:"running",prompt:ae,startedAt:new Date().toISOString()};c(Le=>[...Le,tt]),v(ye);const je=ue();if(console.log(`[MockGrackle] Playing scenario: ${je.label}`),je.pauseForInput){const Le=je.pauseAfterStep??je.steps.length-1,Ue=je.steps.slice(0,Le+1),Dt=Ue.length>0?Ue[Ue.length-1].delayMs:0;ve(ye,Ue),Re(()=>{nt(ye,"idle"),re({sessionId:ye,eventType:"status",timestamp:new Date().toISOString(),content:"idle"})},Dt+g_,ye),je.resumeSteps&&Pe.current.set(ye,je.resumeSteps)}else ve(ye,je.steps)},[ct,ue,ve,Re,nt,re]),an=y.useCallback(async U=>{console.log("[MockGrackle] kill",U),Q(U),Pe.current.delete(U),nt(U,"stopped","killed"),re({sessionId:U,eventType:"status",timestamp:new Date().toISOString(),content:"killed"}),T(ae=>ae.map(de=>de.latestSessionId===U&&de.status==="working"?{...de,status:"not_started"}:de))},[Q,nt,re]),ks=y.useCallback(async U=>{console.log("[MockGrackle] stopGraceful",U),Q(U),Pe.current.delete(U),nt(U,"stopped","terminated"),re({sessionId:U,eventType:"status",timestamp:new Date().toISOString(),content:"terminated"}),T(ae=>ae.map(de=>de.latestSessionId===U&&de.status==="working"?{...de,status:"not_started"}:de))},[Q,nt,re]),ds=y.useCallback(()=>{console.log("[MockGrackle] refresh")},[]),zs=y.useCallback(async U=>{console.log("[MockGrackle] loadSessionEvents",U)},[]),ga=y.useCallback(()=>{console.log("[MockGrackle] clearEvents"),m([])},[]),Oi=y.useCallback(async(U,ae,de,pe,ye,tt,je,Le,Ue)=>{console.log("[MockGrackle] createWorkspace",{name:U,description:ae});const Dt={id:ct("proj"),name:U,description:ae||"",repoUrl:de||"",linkedEnvironmentIds:pe?[pe]:[],status:"active",workingDirectory:je||"",useWorktrees:tt??!0,defaultPersonaId:ye||"",tokenBudget:0,costBudgetMillicents:0,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};_(qe=>[...qe,Dt]),Le&&Le(Dt)},[ct]),Xt=y.useCallback(async U=>{console.log("[MockGrackle] archiveWorkspace",U),_(ae=>ae.map(de=>de.id===U?{...de,status:"archived"}:de))},[]),Qa=y.useCallback(async U=>{console.log("[MockGrackle] loadTasks",U)},[]),ei=y.useCallback(async(U,ae,de,pe,ye,tt,je,Le,Ue,Dt)=>{console.log("[MockGrackle] createTask",{workspaceId:U,title:ae,parentTaskId:ye}),T(qe=>{const En=qe.filter(Ts=>Ts.workspaceId===U).reduce((Ts,Ns)=>Math.max(Ts,Ns.sortOrder),0),_t=ye?qe.find(Ts=>Ts.id===ye):void 0;if(ye&&!_t)return console.warn("[MockGrackle] Parent task not found:",ye),qe;if(_t&&!_t.canDecompose)return console.warn("[MockGrackle] Parent task does not have decomposition rights:",ye),qe;const js=_t?_t.depth+1:0,Hi={id:ct("task"),workspaceId:U,title:ae,description:de||"",status:"not_started",branch:"",latestSessionId:"",dependsOn:pe||[],reviewNotes:void 0,sortOrder:En+1,createdAt:new Date().toISOString(),parentTaskId:ye||"",depth:js,childTaskIds:[],canDecompose:je??!ye,injectKnowledge:Le??!0,defaultPersonaId:tt||"",workpad:"",tokenBudget:0,costBudgetMillicents:0};return[...qe,Hi]}),Ue&&Ue()},[ct]),va=y.useCallback(async(U,ae,de,pe)=>{var Dt;console.log("[MockGrackle] startTask",{taskId:U});const ye=lt.current.find(qe=>qe.id===U),tt=(ye==null?void 0:ye.title)??"",je=ct("sess"),Le={id:je,environmentId:"env-local-01",runtime:"claude-code",status:"running",prompt:tt||U,startedAt:new Date().toISOString()};c(qe=>[...qe,Le]),T(qe=>qe.map(on=>on.id===U?{...on,status:"working",latestSessionId:je,branch:`mock/${U.slice(0,8)}`}:on));const Ue=ue();if(console.log(`[MockGrackle] Playing task scenario: ${Ue.label}`),Ue.pauseForInput){const qe=Ue.pauseAfterStep??Ue.steps.length-1,on=Ue.steps.slice(0,qe+1),En=on.length>0?on[on.length-1].delayMs:0;if(ve(je,on),Re(()=>{nt(je,"idle"),re({sessionId:je,eventType:"status",timestamp:new Date().toISOString(),content:"idle"})},En+g_,je),Ue.resumeSteps){const _t=[...Ue.resumeSteps];Pe.current.set(je,_t);const js=_t.reduce((Hi,Ts)=>Math.max(Hi,Ts.delayMs),0);ke.current.set(je,{taskId:U,delayAfterResume:js+200})}}else{const qe=Ue.steps.length>0?Ue.steps[Ue.steps.length-1].delayMs:0;ve(je,Ue.steps);const on=(Dt=Ue.steps[Ue.steps.length-1])==null?void 0:Dt.event.content;Re(()=>{on==="completed"?T(En=>En.map(_t=>_t.id===U&&_t.status==="working"?{..._t,status:"paused"}:_t)):on==="failed"&&T(En=>En.map(_t=>_t.id===U&&_t.status==="working"?{..._t,status:"failed"}:_t))},qe+100,je)}},[ct,ue,ve,Re,nt,re]),$s=y.useCallback(async(U,ae)=>{console.log("[MockGrackle] sendInput",{sessionId:U,text:ae}),re({sessionId:U,eventType:"output",timestamp:new Date().toISOString(),content:`User input: ${ae}`}),nt(U,"running"),re({sessionId:U,eventType:"status",timestamp:new Date().toISOString(),content:"running"});const de=Pe.current.get(U);if(de)Pe.current.delete(U),ve(U,de);else{const ye=[{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"}}];ve(U,ye)}const pe=ke.current.get(U);pe&&(ke.current.delete(U),Re(()=>{T(ye=>ye.map(tt=>tt.id===pe.taskId&&tt.status==="working"?{...tt,status:"paused"}:tt))},pe.delayAfterResume,U))},[re,nt,ve,Re]),Ss=y.useCallback(async U=>{console.log("[MockGrackle] completeTask",U),T(ae=>ae.map(de=>de.id===U?{...de,status:"complete"}:de))},[]),we=y.useCallback(async U=>{console.log("[MockGrackle] resumeTask",U)},[]),Ve=y.useCallback(async(U,ae,de,pe,ye)=>{console.log("[MockGrackle] updateTask",{taskId:U,title:ae}),T(tt=>tt.map(je=>je.id===U?{...je,title:ae.trim()||je.title,description:de,dependsOn:pe,...ye!==void 0?{defaultPersonaId:ye}:{}}:je))},[]),_n=y.useCallback(async U=>{console.log("[MockGrackle] deleteTask",U),T(ae=>ae.filter(de=>de.id!==U))},[]),mn=y.useCallback(async()=>{console.log("[MockGrackle] loadEnvironments")},[]),Ut=y.useCallback(async(U,ae,de)=>{console.log("[MockGrackle] addEnvironment",{displayName:U,adapterType:ae,adapterConfig:de})},[]),Cn=y.useCallback(async(U,ae)=>{console.log("[MockGrackle] updateEnvironment",{environmentId:U,...ae}),o(de=>de.map(pe=>pe.id!==U?pe:{...pe,...ae.displayName!==void 0?{displayName:ae.displayName}:{},...ae.adapterConfig!==void 0?{adapterConfig:JSON.stringify(ae.adapterConfig)}:{}}))},[]),Qt=y.useCallback(async()=>{console.log("[MockGrackle] loadTokens")},[]),Bi=y.useCallback(async(U,ae,de,pe,ye)=>{console.log("[MockGrackle] setToken",{name:U,tokenType:de}),C(tt=>[...tt.filter(Le=>Le.name!==U),{name:U,tokenType:de,envVar:pe,filePath:ye,expiresAt:""}])},[]),Li=y.useCallback(async U=>{console.log("[MockGrackle] deleteToken",U),C(ae=>ae.filter(de=>de.name!==U))},[]),zi=y.useCallback(async U=>{console.log("[MockGrackle] updateCredentialProviders",U),A(U)},[]);y.useEffect(()=>()=>{ot.current.forEach(clearTimeout),ot.current.clear()},[]);const $i=y.useMemo(()=>({connectionStatus:"connected",environments:{environments:s,environmentsLoading:!1,provisionStatus:{},operationError:"",clearOperationError:()=>{},loadEnvironments:mn,addEnvironment:Ut,updateEnvironment:Cn,provisionEnvironment:async(U,ae)=>{},stopEnvironment:async()=>{},removeEnvironment:async()=>{},domainHook:ss},sessions:{sessions:r,sessionsLoading:!1,events:p,eventsDropped:0,lastSpawnedId:g,taskSessions:$,spawn:et,sendInput:$s,kill:an,stopGraceful:ks,loadSessionEvents:zs,clearEvents:ga,loadTaskSessions:async U=>{console.log("[MockGrackle] loadTaskSessions",U)},domainHook:ss},workspaces:{workspaces:b,workspacesLoading:!1,workspaceCreating:!1,loadWorkspaces:async()=>{console.log("[MockGrackle] loadWorkspaces")},createWorkspace:Oi,archiveWorkspace:Xt,updateWorkspace:async(U,ae)=>{console.log("[MockGrackle] updateWorkspace",{workspaceId:U,...ae}),_(de=>de.map(pe=>pe.id!==U?pe:{...pe,...ae.name!==void 0?{name:ae.name}:{},...ae.description!==void 0?{description:ae.description}:{},...ae.repoUrl!==void 0?{repoUrl:ae.repoUrl}:{},...ae.environmentId!==void 0?{environmentId:ae.environmentId}:{},...ae.workingDirectory!==void 0?{workingDirectory:ae.workingDirectory}:{},...ae.useWorktrees!==void 0?{useWorktrees:ae.useWorktrees}:{},...ae.defaultPersonaId!==void 0?{defaultPersonaId:ae.defaultPersonaId}:{},updatedAt:new Date().toISOString()}))},linkEnvironment:async(U,ae)=>{if(console.log("[MockGrackle] linkEnvironment",{workspaceId:U,environmentId:ae}),ae==="error-env"){S("Failed to link environment");return}S(""),_(de=>de.map(pe=>pe.id!==U||pe.linkedEnvironmentIds.includes(ae)?pe:{...pe,linkedEnvironmentIds:[...pe.linkedEnvironmentIds,ae]}))},unlinkEnvironment:async(U,ae)=>{if(console.log("[MockGrackle] unlinkEnvironment",{workspaceId:U,environmentId:ae}),ae==="error-env"){S("Failed to unlink environment");return}S(""),_(de=>de.map(pe=>pe.id!==U?pe:{...pe,linkedEnvironmentIds:pe.linkedEnvironmentIds.filter(ye=>ye!==ae)}))},linkOperationError:k,clearLinkOperationError:()=>{S("")},domainHook:ss},tasks:{tasks:j,tasksLoading:!1,taskStartingId:void 0,loadTasks:Qa,loadAllTasks:async()=>{console.log("[MockGrackle] loadAllTasks")},createTask:ei,startTask:va,stopTask:async U=>{console.log("[MockGrackle] stopTask",{taskId:U}),await Ss(U)},completeTask:Ss,resumeTask:we,updateTask:Ve,deleteTask:_n,domainHook:ss},tokens:{tokens:N,tokensLoading:!1,loadTokens:Qt,setToken:Bi,deleteToken:Li,domainHook:ss},credentials:{credentialProviders:D,credentialsLoading:!1,updateCredentialProviders:zi,domainHook:ss},codespaces:{codespaces:[],codespaceError:"",codespaceListError:"",codespaceCreating:!1,listCodespaces:async()=>{},createCodespace:async()=>{},domainHook:ss},dockerContainers:{dockerContainers:[],dockerContainersError:"",listDockerContainers:async()=>{},domainHook:ss},personas:{personas:E,personasLoading:!1,createPersona:async(U,ae,de,pe,ye,tt,je,Le,Ue)=>{console.log("[MockGrackle] createPersona",{name:U});const Dt={id:`mock-persona-${Date.now()}`,name:U,description:ae,systemPrompt:de,toolConfig:"{}",runtime:pe??"claude-code",model:ye||"",maxTurns:tt||0,mcpServers:"[]",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),type:je||"agent",script:Le||"",allowedMcpTools:Ue||[]};return R(qe=>[...qe,Dt]),Dt},updatePersona:async(U,ae,de,pe,ye,tt,je,Le,Ue,Dt)=>{console.log("[MockGrackle] updatePersona",{personaId:U,name:ae});const qe=E.find(_t=>_t.id===U);if(!qe)throw new Error(`Persona not found: ${U}`);const on=new Date().toISOString(),En={...qe,...ae!==void 0?{name:ae}:{},...de!==void 0?{description:de}:{},...pe!==void 0?{systemPrompt:pe}:{},...ye!==void 0?{runtime:ye}:{},...tt!==void 0?{model:tt}:{},...je!==void 0?{maxTurns:je}:{},...Le!==void 0?{type:Le}:{},...Ue!==void 0?{script:Ue}:{},...Dt!==void 0?{allowedMcpTools:Dt}:{},updatedAt:on};return R(_t=>_t.map(js=>js.id===U?En:js)),En},deletePersona:async U=>{console.log("[MockGrackle] deletePersona",U),R(ae=>ae.filter(de=>de.id!==U))},domainHook:ss},schedules:{schedules:O,schedulesLoading:!1,createSchedule:async(U,ae,de,pe,ye)=>{console.log("[MockGrackle] createSchedule",{title:U});const tt={id:`mock-schedule-${Date.now()}`,title:U,description:ae,scheduleExpression:de,personaId:pe,workspaceId:ye??"",parentTaskId:"",enabled:!0,lastRunAt:"",nextRunAt:new Date(Date.now()+6e4).toISOString(),runCount:0,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return M(je=>[...je,tt]),tt},updateSchedule:async(U,ae)=>{console.log("[MockGrackle] updateSchedule",{scheduleId:U,fields:ae});let de;if(M(pe=>pe.map(ye=>ye.id!==U?ye:(de={...ye,...ae,updatedAt:new Date().toISOString()},de))),!de)throw new Error(`Schedule not found: ${U}`);return de},deleteSchedule:async U=>{console.log("[MockGrackle] deleteSchedule",U),M(ae=>ae.filter(de=>de.id!==U))},domainHook:ss},streams:{streams:d,streamsLoading:!1,streamsLoadedOnce:!0,streamsLoadError:!1,loadStreams:async(U=!1)=>{u(h_(U))},liveMessages:L9,loadTranscript:async()=>{},handleStreamMessage:()=>{},domainHook:ss},knowledge:{graphData:{nodes:ne,links:Z},selectedNode:H,loading:!1,selectedId:F,searchQuery:ee,search:async U=>{if(console.log("[MockGrackle] knowledge.search",U),!U.trim()){ce(U);return}ce(U);const ae=me.current,de=ae?Ds.filter(je=>!je.workspaceId||je.workspaceId===ae):Ds,pe=U.toLowerCase(),ye=de.filter(je=>{var Le,Ue,Dt;return je.label.toLowerCase().includes(pe)||((Le=je.content)==null?void 0:Le.toLowerCase().includes(pe))||((Ue=je.tags)==null?void 0:Ue.some(qe=>qe.toLowerCase().includes(pe)))||((Dt=je.category)==null?void 0:Dt.toLowerCase().includes(pe))});le(ye);const tt=new Set(ye.map(je=>je.id));se(Ga.filter(je=>tt.has(je.source)&&tt.has(je.target))),ge(void 0),B(void 0)},clearSearch:()=>{console.log("[MockGrackle] knowledge.clearSearch"),ce("");const U=me.current,ae=U?Ds.filter(pe=>!pe.workspaceId||pe.workspaceId===U):Ds;le(ae);const de=new Set(ae.map(pe=>pe.id));se(Ga.filter(pe=>de.has(pe.source)&&de.has(pe.target)))},selectNode:async U=>{console.log("[MockGrackle] knowledge.selectNode",U),ge(U);const ae=U in f_?f_[U]:void 0;if(ae)B(ae);else{const de=Ds.find(pe=>pe.id===U);if(de){const pe=Ga.filter(ye=>ye.source===U||ye.target===U).map(ye=>({fromId:ye.source,toId:ye.target,type:ye.type}));B({node:de,edges:pe})}}},clearSelection:()=>{console.log("[MockGrackle] knowledge.clearSelection"),ge(void 0),B(void 0)},expandNode:async U=>{console.log("[MockGrackle] knowledge.expandNode",U),le(ae=>{const de=new Set(ae.map(Le=>Le.id)),pe=Ga.filter(Le=>Le.source===U||Le.target===U),ye=new Set;for(const Le of pe)de.has(Le.source)||ye.add(Le.source),de.has(Le.target)||ye.add(Le.target);if(ye.size===0)return ae;const tt=Ds.filter(Le=>ye.has(Le.id)),je=new Set([...de,...ye]);return se(Le=>{const Ue=new Set(Le.map(qe=>`${qe.source}|${qe.target}|${qe.type}`)),Dt=Ga.filter(qe=>je.has(qe.source)&&je.has(qe.target)&&!Ue.has(`${qe.source}|${qe.target}|${qe.type}`));return Dt.length>0?[...Le,...Dt]:Le}),[...ae,...tt]})},loadRecent:async U=>{if(console.log("[MockGrackle] knowledge.loadRecent",U),me.current=U,U){const ae=Ds.filter(pe=>!pe.workspaceId||pe.workspaceId===U);le(ae);const de=new Set(ae.map(pe=>pe.id));se(Ga.filter(pe=>de.has(pe.source)&&de.has(pe.target)))}else le(Ds),se(Ga);ce("")},handleEvent:()=>!1,domainHook:ss},githubAccounts:{githubAccounts:[],githubAccountsLoading:!1,loadGitHubAccounts:async()=>{console.log("[MockGrackle] loadGitHubAccounts")},addGitHubAccount:async(U,ae,de,pe)=>{console.log("[MockGrackle] addGitHubAccount",U)},updateGitHubAccount:async(U,ae)=>{console.log("[MockGrackle] updateGitHubAccount",U,ae)},removeGitHubAccount:async U=>{console.log("[MockGrackle] removeGitHubAccount",U)},importGitHubAccounts:async()=>(console.log("[MockGrackle] importGitHubAccounts"),{imported:0,usernames:[]})},plugins:{plugins:[{name:"core",description:"Core infrastructure",enabled:!0,required:!0,loaded:!0},{name:"orchestration",description:"Task orchestration",enabled:!0,required:!1,loaded:!0},{name:"scheduling",description:"Scheduled triggers",enabled:!0,required:!1,loaded:!0},{name:"knowledge",description:"Knowledge graph",enabled:!1,required:!1,loaded:!1}],pluginsLoading:!1,loadPlugins:async()=>{console.log("[MockGrackle] loadPlugins")},setPluginEnabled:async(U,ae)=>{console.log("[MockGrackle] setPluginEnabled",U,ae)}},appDefaultPersonaId:Y,setAppDefaultPersonaId:async U=>{console.log("[MockGrackle] setAppDefaultPersonaId",U),V(U)},onboardingCompleted:!0,completeOnboarding:async()=>{console.log("[MockGrackle] completeOnboarding")},usageCache:{"workspace:proj-alpha":{inputTokens:214500,outputTokens:44850,costMillicents:112e3,sessionCount:4},"workspace:proj-beta":{inputTokens:86700,outputTokens:23800,costMillicents:48e3,sessionCount:3},"task:task-001":{inputTokens:126800,outputTokens:20850,costMillicents:63e3,sessionCount:2},"task:task-006":{inputTokens:18900,outputTokens:4500,costMillicents:1e4,sessionCount:1},"task_tree:task-001":{inputTokens:126800,outputTokens:20850,costMillicents:63e3,sessionCount:2},"task_tree:task-006":{inputTokens:18900,outputTokens:4500,costMillicents:1e4,sessionCount:1}},loadUsage:async(U,ae)=>{console.log(`[MockGrackle] loadUsage(${U}, ${ae})`)},refresh:ds}),[s,r,d,p,g,$,b,k,j,N,D,E,O,Y,ne,Z,H,F,ee,et,$s,an,ks,zs,ga,Oi,Xt,Qa,ei,va,Ss,we,Ve,_n,mn,Ut,Cn,Qt,Bi,Li,zi,ds]);return a.jsx(bh.Provider,{value:$i,children:t})}const Tk=3e3,K9=Tk;function Z9(t){const[s,o]=y.useState("connecting"),r=y.useRef(t.onSessionEvent);r.current=t.onSessionEvent;const c=y.useRef(t.onDomainEvent);c.current=t.onDomainEvent;const d=y.useRef(t.onStreamMessage);d.current=t.onStreamMessage;const u=y.useRef(t.onConnect);u.current=t.onConnect;const p=y.useRef(t.onDisconnect);return p.current=t.onDisconnect,y.useEffect(()=>{let m=!1,g,v;async function b(){var S,j,T;if(m)return;Promise.resolve((S=u.current)==null?void 0:S.call(u)).catch(()=>{});let _=!1;const k=()=>{!_&&!m&&(_=!0,o("connected"))};v=setTimeout(k,K9);try{const N=Be.streamEvents({});for await(const C of N){if(k(),m)break;const D=C.event;if(D.case==="sessionEvent"){const A=D.value;r.current({sessionId:A.sessionId,type:A.type,timestamp:A.timestamp,content:A.content,raw:A.raw,toolCallId:A.toolCallId})}else if(D.case==="domainEvent"){const A=D.value;c.current({id:A.id,type:A.type,timestamp:A.timestamp,payloadJson:A.payloadJson})}else if(D.case==="streamMessageEvent"){const A=D.value;(j=d.current)==null||j.call(d,{streamId:A.streamId,seq:A.seq,senderId:A.senderId,content:A.content,timestamp:A.timestamp})}}}catch(N){if(clearTimeout(v),N instanceof da&&N.code===$_.Unauthenticated){window.location.href=rC;return}}clearTimeout(v),m||(o("connecting"),(T=p.current)==null||T.call(p),g=setTimeout(()=>{b().catch(()=>{})},Tk))}return b().catch(()=>{}),()=>{m=!0,clearTimeout(g),clearTimeout(v)}},[]),{connectionStatus:s}}const bm=["core","orchestration","scheduling"],Nk=y.createContext({pluginNames:[...bm],sandboxPort:void 0,sandboxOrigin:void 0,loading:!1,error:void 0});function Y9({children:t}){const[s,o]=y.useState([...bm]),[r,c]=y.useState(void 0),[d,u]=y.useState(void 0),[p,m]=y.useState(!0),[g,v]=y.useState(void 0);return y.useEffect(()=>{let b=!1;return fetch("/api/manifest").then(async _=>{if(!_.ok)throw new Error(`Manifest fetch returned ${_.status}`);return _.json()}).then(_=>{b||(o(_.plugins.map(k=>k.name)),c(_.sandboxPort),u(_.sandboxOrigin),m(!1))}).catch(_=>{b||(o([...bm]),v(_ instanceof Error?_:new Error(String(_))),m(!1))}),()=>{b=!0}},[]),a.jsx(Nk.Provider,{value:{pluginNames:s,sandboxPort:r,sandboxOrigin:d,loading:p,error:g},children:t})}function Bd(){return y.useContext(Nk)}function kh(){const{sandboxPort:t,sandboxOrigin:s}=Bd();if(typeof window>"u")return;if(s!==void 0&&s!=="")try{return new URL("/sandbox.html",s).toString()}catch{}if(t===void 0)return;const o=new URL(window.location.origin);return o.port=String(t),o.pathname="/sandbox.html",o.toString()}const J9=new Set(["dashboard","chat","environments","coordination","settings"]),W9=new Set(["tasks"]),X9=new Set(["knowledge"]),wk={core:{navItems:ad.filter(t=>J9.has(t.view)),domainHookKeys:["environments","sessions","workspaces","tokens","credentials","codespaces","dockerContainers","streams","plugins"]},orchestration:{navItems:ad.filter(t=>W9.has(t.view)),domainHookKeys:["tasks","personas","notifications"]},scheduling:{navItems:[],domainHookKeys:["schedules"]},knowledge:{navItems:ad.filter(t=>X9.has(t.view)),domainHookKeys:["knowledge"]}};function Q9(t){return t.flatMap(s=>{var o;return((o=wk[s])==null?void 0:o.navItems)??[]})}function eH(t){return new Set(t.flatMap(s=>{var o;return((o=wk[s])==null?void 0:o.domainHookKeys)??[]}))}function tH(t){return{id:t.id,displayName:t.displayName,adapterType:t.adapterType,adapterConfig:t.adapterConfig||"{}",status:t.status,bootstrapped:t.bootstrapped,githubAccountId:t.githubAccountId||""}}function v_(t){return{id:t.id,environmentId:t.environmentId,runtime:t.runtime,status:t.status,prompt:t.prompt,startedAt:t.startedAt,endedAt:t.endedAt||void 0,error:t.error||void 0,endReason:t.endReason||void 0,personaId:t.personaId||void 0,taskId:t.taskId||void 0,inputTokens:t.inputTokens,outputTokens:t.outputTokens,costMillicents:t.costMillicents}}function nH(t){return{sessionId:t.sessionId,eventType:H_(t.type),timestamp:t.timestamp,content:t.content,raw:t.raw||void 0,toolCallId:t.toolCallId||void 0}}function y_(t){return{id:t.id,name:t.name,description:t.description,repoUrl:t.repoUrl,linkedEnvironmentIds:[...t.linkedEnvironmentIds],status:tj(t.status),workingDirectory:t.workingDirectory,useWorktrees:t.useWorktrees,defaultPersonaId:t.defaultPersonaId,tokenBudget:t.tokenBudget,costBudgetMillicents:t.costBudgetMillicents,createdAt:t.createdAt,updatedAt:t.updatedAt}}function b_(t){return{id:t.id,workspaceId:t.workspaceId??void 0,title:t.title,description:t.description,status:nj(t.status),branch:t.branch,latestSessionId:t.latestSessionId,dependsOn:[...t.dependsOn],sortOrder:t.sortOrder,createdAt:t.createdAt,startedAt:t.startedAt||void 0,completedAt:t.completedAt||void 0,parentTaskId:t.parentTaskId,depth:t.depth,childTaskIds:[...t.childTaskIds],canDecompose:t.canDecompose,injectKnowledge:t.injectKnowledge,defaultPersonaId:t.defaultPersonaId,workpad:t.workpad,tokenBudget:t.tokenBudget,costBudgetMillicents:t.costBudgetMillicents}}function sH(t){return{name:t.name,tokenType:t.type,envVar:t.envVar,filePath:t.filePath,expiresAt:t.expiresAt}}function aH(t){return{claude:sj(t.claude),github:Rc(t.github),copilot:Rc(t.copilot),codex:Rc(t.codex),goose:Rc(t.goose)}}function iH(t){return{name:t.name,repository:t.repository,state:t.state,gitStatus:t.gitStatus}}function oH(t){return{id:t.id,name:t.name,image:t.image,state:t.state,status:t.status}}function Bp(t){return{id:t.id,name:t.name,description:t.description,systemPrompt:t.systemPrompt,toolConfig:t.toolConfig?JSON.stringify({allowedTools:[...t.toolConfig.allowedTools],disallowedTools:[...t.toolConfig.disallowedTools]}):"{}",runtime:t.runtime,model:t.model,maxTurns:t.maxTurns,mcpServers:JSON.stringify(t.mcpServers.map(s=>({name:s.name,command:s.command,args:[...s.args],tools:[...s.tools]}))),createdAt:t.createdAt,updatedAt:t.updatedAt,type:t.type||"agent",script:t.script,allowedMcpTools:[...t.allowedMcpTools]}}function rH(t){return{inputTokens:t.inputTokens,outputTokens:t.outputTokens,costMillicents:t.costMillicents,sessionCount:t.sessionCount}}function Lp(t){return{id:t.id,title:t.title,description:t.description,scheduleExpression:t.scheduleExpression,personaId:t.personaId,workspaceId:t.workspaceId,parentTaskId:t.parentTaskId,enabled:t.enabled,lastRunAt:t.lastRunAt,nextRunAt:t.nextRunAt,runCount:t.runCount,createdAt:t.createdAt,updatedAt:t.updatedAt}}function Yc(t,s=0){return{id:t.id,label:t.title||t.label||t.id,kind:t.kind,category:t.category||void 0,sourceType:t.sourceType||void 0,sourceId:t.sourceId||void 0,content:t.content||void 0,tags:t.tags.length>0?[...t.tags]:void 0,workspaceId:t.workspaceId||void 0,createdAt:t.createdAt||void 0,updatedAt:t.updatedAt||void 0,val:s}}function zp(t){return{source:t.fromId,target:t.toId,type:t.type}}function lH(t){return{subscriptionId:t.subscriptionId,sessionId:t.sessionId,fd:t.fd,permission:t.permission,deliveryMode:t.deliveryMode,createdBySpawn:t.createdBySpawn}}function cH(t){return{id:t.id,name:t.name,subscriberCount:t.subscriberCount,messageBufferDepth:t.messageBufferDepth,subscribers:t.subscribers.map(lH),selfEcho:t.selfEcho}}function xs(){const[t,s]=y.useState(!1),o=y.useRef(0),r=y.useCallback(c=>(o.current++,o.current===1&&s(!0),c.finally(()=>{o.current--,o.current===0&&s(!1)})),[]);return{loading:t,track:r}}const __=5e3;function Fr(t){return t instanceof da?t.message:"Operation failed"}function dH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),[c,d]=y.useState({}),[u,p]=y.useState(""),m=y.useCallback(()=>{p("")},[]),g=y.useCallback(async()=>{try{const C=await r(Be.listEnvironments({}));s(C.environments.map(tH))}catch{}},[r]),v=y.useCallback(C=>{switch(C.type){case"environment.added":return!0;case"environment.removed":{const D=C.payload.environmentId;return D&&(s(A=>A.filter(E=>E.id!==D)),d(A=>{const E={...A};return delete E[D],E})),!0}case"environment.changed":return g().catch(()=>{}),!0;case"environment.provision_progress":{const D=C.payload;if(typeof D.environmentId!="string"||typeof D.stage!="string"||typeof D.message!="string"||typeof D.progress!="number")return _k("environment.provision_progress","invalid payload"),!0;if(d(A=>({...A,[D.environmentId]:{stage:D.stage,message:D.message,progress:D.progress}})),D.stage==="ready"){const A=D.environmentId;setTimeout(()=>{d(E=>{const R={...E};return delete R[A],R})},__)}return!0}default:return!1}},[g]),b=y.useCallback(C=>{var D;if(C.type==="environments"){const A=Array.isArray((D=C.payload)==null?void 0:D.environments)?C.payload.environments:[];return s(A),!0}return!1},[]),_=y.useCallback(async(C,D,A,E)=>{p("");try{await Be.addEnvironment({displayName:C,adapterType:D,adapterConfig:JSON.stringify(A??{}),githubAccountId:E??""})}catch(R){p(Fr(R))}},[]),k=y.useCallback(async(C,D)=>{p("");try{await Be.updateEnvironment({id:C,displayName:D.displayName,adapterConfig:D.adapterConfig?JSON.stringify(D.adapterConfig):void 0,githubAccountId:D.githubAccountId})}catch(A){p(Fr(A))}},[]),S=y.useCallback(async(C,D)=>{p("");try{const A=Be.provisionEnvironment({id:C,force:D??!1});for await(const E of A)d(R=>({...R,[C]:{stage:E.stage,message:E.message,progress:E.progress}})),E.stage==="ready"&&setTimeout(()=>{d(R=>{const O={...R};return delete O[C],O})},__)}catch(A){d(E=>{const R={...E};return delete R[C],R}),p(Fr(A))}},[]),j=y.useCallback(async C=>{p("");try{await Be.stopEnvironment({id:C})}catch(D){p(Fr(D))}},[]),T=y.useCallback(async C=>{p("");try{await Be.removeEnvironment({id:C})}catch(D){p(Fr(D))}},[]);return{environments:t,environmentsLoading:o,provisionStatus:c,operationError:u,clearOperationError:m,loadEnvironments:g,addEnvironment:_,updateEnvironment:k,provisionEnvironment:S,stopEnvironment:j,removeEnvironment:T,handleEvent:v,handleLegacyMessage:b,domainHook:{onConnect:()=>g(),onDisconnect:()=>{},handleEvent:v}}}const $p=new Set(["pending","running","idle"]),uH=new Set(["completed","failed","interrupted","hibernating","suspended"]),x_=["pending","running","idle"];function fH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),[c,d]=y.useState([]),[u,p]=y.useState(0),[m,g]=y.useState(void 0),[v,b]=y.useState({}),_=y.useCallback(async()=>{try{const $=(await r(Be.listSessions({}))).sessions.map(v_);s(Y=>{const V=new Map(Y.map(ne=>[ne.id,ne]));return $.map(ne=>{const le=V.get(ne.id),Z=le==null?void 0:le.status;return!Z||Z===ne.status?ne:uH.has(Z)&&$p.has(ne.status)?{...ne,status:Z,...le.endReason!==void 0?{endReason:le.endReason}:{}}:$p.has(Z)&&$p.has(ne.status)&&x_.indexOf(Z)>x_.indexOf(ne.status)?{...ne,status:Z}:ne})})}catch{}},[r]),k=y.useCallback(M=>{if(M.type!=="session_event")return!1;if(!x9(M.payload))return _k("session_event","payload is not a valid SessionEvent"),!0;const $=M.payload;let Y=0;if(d(V=>{const ne=[...V,$];return ne.length>Co?(Y=ne.length-Co,ne.slice(-Co)):ne}),Y>0&&p(V=>V+Y),$.eventType==="usage")try{const V=JSON.parse($.content),ne=Number(V.input_tokens)||0,le=Number(V.output_tokens)||0,Z=Number(V.cost_millicents)||0;(ne>0||le>0||Z>0)&&s(se=>se.map(H=>H.id===$.sessionId?{...H,inputTokens:(H.inputTokens??0)+ne,outputTokens:(H.outputTokens??0)+le,costMillicents:(H.costMillicents??0)+Z}:H))}catch{}if($.eventType==="status"){const V=xk($.content),ne=kk($.content);s(le=>le.some(se=>se.id===$.sessionId)?le.map(se=>se.id===$.sessionId?{...se,status:V,...ne!==void 0?{endReason:ne}:{}}:se):[...le,{id:$.sessionId,environmentId:"",runtime:"",status:V,prompt:"",startedAt:$.timestamp,...ne!==void 0?{endReason:ne}:{}}])}return!0},[]),S=y.useCallback(M=>{k({type:"session_event",payload:M})},[k]),j=y.useCallback(M=>{var $,Y,V,ne,le;switch(M.type){case"sessions":{const Z=Array.isArray(($=M.payload)==null?void 0:$.sessions)?M.payload.sessions:[];return s(Z),!0}case"spawned":{const Z=(Y=M.payload)==null?void 0:Y.sessionId;return typeof Z=="string"&&Z&&g(Z),_().catch(()=>{}),!0}case"session_events":{const Z=Array.isArray((V=M.payload)==null?void 0:V.events)?M.payload.events:[];return Z.length>0&&d(Z),!0}case"task_sessions":{const Z=(ne=M.payload)==null?void 0:ne.taskId;if(typeof Z=="string"&&Z){const se=Array.isArray((le=M.payload)==null?void 0:le.sessions)?M.payload.sessions:[];b(H=>({...H,[Z]:se}))}return!0}default:return!1}},[_]),T=y.useCallback(async(M,$,Y,V,ne)=>{try{const le=await Be.spawnAgent({environmentId:M,prompt:$,personaId:Y||"",workingDirectory:V||"",workspaceId:ne||""});g(le.id),await _()}catch{}},[_]),N=y.useCallback(async(M,$)=>{await Be.sendInput({sessionId:M,text:$})},[]),C=y.useCallback(async M=>{try{await Be.killAgent({id:M,graceful:!1})}catch{}},[]),D=y.useCallback(async M=>{try{await Be.killAgent({id:M,graceful:!0})}catch{}},[]),A=y.useCallback(async M=>{try{const Y=(await Be.getSessionEvents({id:M})).events.map(nH);if(Y.length>0){let V=0;d(ne=>{const le=new Set;for(const H of ne)H.sessionId===M&&le.add(`${H.timestamp}|${H.eventType}`);const Z=Y.filter(H=>!le.has(`${H.timestamp}|${H.eventType}`)),se=[...ne,...Z].sort((H,B)=>H.sessionId!==B.sessionId?0:H.timestamp.localeCompare(B.timestamp));return se.length>Co?(V=se.length-Co,se.slice(-Co)):se}),V>0&&p(ne=>ne+V)}}catch{}},[]),E=y.useCallback(()=>{d([]),p(0)},[]),R=y.useCallback(async M=>{try{const Y=(await Be.getTaskSessions({id:M})).sessions.map(v_);b(V=>({...V,[M]:Y}))}catch{}},[]);return{sessions:t,sessionsLoading:o,events:c,eventsDropped:u,lastSpawnedId:m,taskSessions:v,loadSessions:_,spawn:T,sendInput:N,kill:C,stopGraceful:D,loadSessionEvents:A,clearEvents:E,loadTaskSessions:R,handleMessage:k,handleSessionEvent:S,handleLegacyMessage:j,domainHook:{onConnect:()=>_(),onDisconnect:()=>{E()},handleEvent:()=>!1}}}function k_(t){return t instanceof da?t.message:"Operation failed"}function pH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),[c,d]=y.useState(!1),[u,p]=y.useState(""),m=y.useCallback(async()=>{try{const C=await r(Be.listWorkspaces({}));s(C.workspaces.map(y_))}catch{}},[r]),g=y.useCallback(C=>{switch(C.type){case"workspace.created":return d(!1),m().catch(()=>{}),!0;case"workspace.archived":case"workspace.updated":return m().catch(()=>{}),!0;default:return!1}},[m]),v=y.useCallback(()=>{d(!1)},[]),b=y.useCallback(async(C,D,A,E,R,O,M,$,Y)=>{d(!0);try{const V=await Be.createWorkspace({name:C,description:D||"",repoUrl:A||"",environmentId:E||"",defaultPersonaId:R||void 0,useWorktrees:O??!0,workingDirectory:M||void 0}),ne=y_(V);s(le=>le.some(Z=>Z.id===ne.id)?le:[...le,ne]),d(!1),$==null||$(ne)}catch(V){d(!1);const ne=V instanceof da?V.message:"Failed to create workspace";Y==null||Y(ne)}},[]),_=y.useCallback(async C=>{try{await Be.archiveWorkspace({id:C})}catch{}},[]),k=y.useCallback(async(C,D)=>{try{await Be.updateWorkspace({id:C,...D})}catch{}},[]),S=y.useCallback(()=>{p("")},[]),j=y.useCallback(async(C,D)=>{try{p(""),await Be.linkEnvironment({workspaceId:C,environmentId:D}),await m().catch(()=>{})}catch(A){p(k_(A))}},[m]),T=y.useCallback(async(C,D)=>{try{p(""),await Be.unlinkEnvironment({workspaceId:C,environmentId:D}),await m().catch(()=>{})}catch(A){p(k_(A))}},[m]);return{workspaces:t,workspacesLoading:o,workspaceCreating:c,loadWorkspaces:m,createWorkspace:b,archiveWorkspace:_,updateWorkspace:k,linkEnvironment:j,unlinkEnvironment:T,linkOperationError:u,clearLinkOperationError:S,handleEvent:g,onDisconnect:v,domainHook:{onConnect:()=>m(),onDisconnect:v,handleEvent:g}}}function mH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),[c,d]=y.useState(void 0),u=y.useRef({}),p=y.useCallback(async E=>{try{const O=(await zn.listTasks({workspaceId:E})).tasks.map(b_);s(M=>[...M.filter($=>$.workspaceId!==E),...O])}catch{}},[]),m=y.useCallback(async()=>{try{const R=(await r(zn.listTasks({}))).tasks.map(b_);s(O=>{const M=new Set(R.map($=>$.id));return[...O.filter($=>!M.has($.id)),...R]})}catch{}},[r]),g=y.useCallback((E,R)=>{const O=M=>{clearTimeout(u.current[M]),u.current[M]=setTimeout(()=>{delete u.current[M],p(M).catch(()=>{})},200)};E?O(E):R&&s(M=>{const $=M.find(Y=>Y.id===R);return $!=null&&$.workspaceId?O($.workspaceId):m().catch(()=>{}),M})},[p,m]),v=y.useCallback(E=>{const R=E.payload;switch(E.type){case"task.created":{const O=typeof R.workspaceId=="string"?R.workspaceId:"";return O&&p(O).catch(()=>{}),!0}case"task.started":{const O=typeof R.taskId=="string"?R.taskId:"",M=typeof R.sessionId=="string"?R.sessionId:"",$=typeof R.workspaceId=="string"?R.workspaceId:"";return d(Y=>O&&Y===O?void 0:Y),M&&O&&s(Y=>Y.map(V=>V.id===O?{...V,latestSessionId:M}:V)),g($,O),!0}case"task.completed":case"task.deleted":case"task.reparented":case"task.updated":{const O=typeof R.workspaceId=="string"?R.workspaceId:"",M=typeof R.taskId=="string"?R.taskId:"";return d($=>M&&$===M?void 0:$),g(O,M),!0}default:return!1}},[p,g]),b=y.useCallback(()=>{d(void 0)},[]),_=y.useCallback(E=>{var R,O;if(E.type==="tasks"){const M=Array.isArray((R=E.payload)==null?void 0:R.tasks)?E.payload.tasks:[],$=typeof((O=E.payload)==null?void 0:O.workspaceId)=="string"&&E.payload.workspaceId?E.payload.workspaceId:"";return s($?Y=>[...Y.filter(V=>V.workspaceId!==$),...M]:Y=>{const V=new Set(M.map(ne=>ne.id));return[...Y.filter(ne=>!V.has(ne.id)),...M]}),!0}return!1},[]),k=y.useCallback(async(E,R,O,M,$,Y,V,ne,le,Z)=>{try{await zn.createTask({workspaceId:E,title:R,description:O||"",dependsOn:M||[],parentTaskId:$||"",defaultPersonaId:Y||void 0,canDecompose:V??void 0,injectKnowledge:ne??void 0}),le==null||le()}catch(se){const H=se instanceof da?se.message:"Failed to create task";Z==null||Z(H)}},[]),S=y.useCallback(async(E,R,O,M)=>{d(E);try{await zn.startTask({taskId:E,personaId:R||"",environmentId:O||"",notes:M||""})}catch($){if($ instanceof da&&$.code===$_.ResourceExhausted)return;throw d(void 0),$}},[]),j=y.useCallback(async E=>{try{await zn.stopTask({id:E})}catch{}},[]),T=y.useCallback(async E=>{try{await zn.completeTask({id:E})}catch{}},[]),N=y.useCallback(async E=>{try{await zn.resumeTask({id:E})}catch{}},[]),C=y.useCallback(async(E,R,O,M,$)=>{try{await zn.updateTask({id:E,title:R,description:O,dependsOn:M,...$!==void 0?{defaultPersonaId:$}:{}})}catch{}},[]),D=y.useCallback(async E=>{try{await zn.deleteTask({id:E})}catch{}},[]);return{tasks:t,tasksLoading:o,taskStartingId:c,loadTasks:p,loadAllTasks:m,createTask:k,startTask:S,stopTask:j,completeTask:T,resumeTask:N,updateTask:C,deleteTask:D,handleEvent:v,onDisconnect:b,handleLegacyMessage:_,domainHook:{onConnect:()=>m(),onDisconnect:b,handleEvent:v}}}function hH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),c=y.useCallback(async()=>{try{const g=await r(Be.listTokens({}));s(g.tokens.map(sH))}catch{}},[r]),d=y.useCallback(g=>g.type==="token.changed"?(c().catch(()=>{}),!0):!1,[c]),u=y.useCallback(async(g,v,b,_,k)=>{try{await Be.setToken({name:g,value:v,type:b,envVar:_,filePath:k})}catch{}},[]),p=y.useCallback(async g=>{try{await Be.deleteToken({name:g})}catch{}},[]);return{tokens:t,tokensLoading:o,loadTokens:c,setToken:u,deleteToken:p,handleEvent:d,domainHook:{onConnect:()=>c(),onDisconnect:()=>{},handleEvent:d}}}function gH(){const[t,s]=y.useState({claude:"off",github:"off",copilot:"off",codex:"off",goose:"off"}),{loading:o,track:r}=xs(),c=y.useCallback(async()=>{try{const m=await r(Be.getCredentialProviders({}));s(aH(m))}catch{}},[r]),d=y.useCallback(m=>m.type==="credential.providers_changed"?(S9(m.payload)&&s(m.payload),!0):!1,[]),u=y.useCallback(async m=>{const g=[{provider:"claude",value:m.claude},{provider:"github",value:m.github},{provider:"copilot",value:m.copilot},{provider:"codex",value:m.codex},{provider:"goose",value:m.goose}];await Promise.allSettled(g.map(({provider:v,value:b})=>Be.setCredentialProvider({provider:v,value:b})))},[]);return{credentialProviders:t,credentialsLoading:o,loadCredentials:c,updateCredentialProviders:u,handleEvent:d,domainHook:{onConnect:()=>c(),onDisconnect:()=>{},handleEvent:d}}}function vH(){const[t,s]=y.useState([]),[o,r]=y.useState(""),[c,d]=y.useState(""),[u,p]=y.useState(!1),m=y.useCallback(async b=>{try{const _=await Be.listCodespaces({githubAccountId:b??""});s(_.codespaces.map(iH)),d(_.error)}catch{}},[]),g=y.useCallback(async(b,_)=>{p(!0),r("");try{await Be.createCodespace({repo:b,machine:_??""}),p(!1),await m()}catch(k){p(!1);const S=k instanceof da?k.message:"Failed to create codespace";r(S)}},[m]);return{codespaces:t,codespaceError:o,codespaceListError:c,codespaceCreating:u,listCodespaces:m,createCodespace:g,domainHook:{onConnect:()=>m(),onDisconnect:()=>{},handleEvent:()=>!1}}}function yH(){const[t,s]=y.useState([]),[o,r]=y.useState(""),c=y.useCallback(async()=>{try{const u=await Be.listDockerContainers({});s(u.containers.map(oH)),r(u.error)}catch(u){s([]),r(u instanceof Error?u.message:"Failed to list Docker containers")}},[]);return{dockerContainers:t,dockerContainersError:o,listDockerContainers:c,domainHook:{onConnect:async()=>{},onDisconnect:()=>{},handleEvent:()=>!1}}}function bH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),c=y.useCallback(async()=>{try{const v=await r(zn.listPersonas({}));s(v.personas.map(Bp))}catch{}},[r]),d=y.useCallback(v=>{switch(v.type){case"persona.created":case"persona.updated":case"persona.deleted":return c().catch(()=>{}),!0;default:return!1}},[c]),u=y.useCallback(async(v,b,_,k,S,j,T,N,C)=>{const D=await zn.createPersona({name:v,description:b,systemPrompt:_,runtime:k||"",model:S||"",maxTurns:j||0,type:T||"agent",script:N||"",allowedMcpTools:C||[]}),A=Bp(D);return s(E=>[...E.filter(R=>R.id!==A.id),A]),A},[]),p=y.useCallback(async(v,b,_,k,S,j,T,N,C,D)=>{const A={id:v};b!==void 0&&(A.name=b),_!==void 0&&(A.description=_),k!==void 0&&(A.systemPrompt=k),S!==void 0&&(A.runtime=S),j!==void 0&&(A.model=j),T!==void 0&&(A.maxTurns=T),N!==void 0&&(A.type=N),C!==void 0&&(A.script=C),D!==void 0&&(A.allowedMcpTools={tools:D});const E=await zn.updatePersona(A),R=Bp(E);return s(O=>O.map(M=>M.id===R.id?R:M)),R},[]),m=y.useCallback(async v=>{await zn.deletePersona({id:v}),s(b=>b.filter(_=>_.id!==v))},[]);return{personas:t,personasLoading:o,loadPersonas:c,createPersona:u,updatePersona:p,deletePersona:m,handleEvent:d,domainHook:{onConnect:()=>c(),onDisconnect:()=>{},handleEvent:d}}}function _H(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),c=y.useRef(void 0),d=y.useCallback(async()=>{try{const b=await r(Bc.listSchedules({}));s(b.schedules.map(Lp))}catch{}},[r]),u=y.useCallback(b=>{switch(b.type){case"schedule.created":case"schedule.updated":case"schedule.deleted":return d().catch(()=>{}),!0;case"schedule.fired":return clearTimeout(c.current),c.current=setTimeout(()=>{d().catch(()=>{})},500),!0;default:return!1}},[d]),p=y.useCallback(async(b,_,k,S,j,T)=>{const N=await Bc.createSchedule({title:b,description:_,scheduleExpression:k,personaId:S,workspaceId:j||"",parentTaskId:T||""}),C=Lp(N);return s(D=>[...D.filter(A=>A.id!==C.id),C]),C},[]),m=y.useCallback(async(b,_)=>{const k={id:b};_.title!==void 0&&(k.title=_.title),_.description!==void 0&&(k.description=_.description),_.scheduleExpression!==void 0&&(k.scheduleExpression=_.scheduleExpression),_.personaId!==void 0&&(k.personaId=_.personaId),_.enabled!==void 0&&(k.enabled=_.enabled);const S=await Bc.updateSchedule(k),j=Lp(S);return s(T=>T.map(N=>N.id===j.id?j:N)),j},[]),g=y.useCallback(async b=>{await Bc.deleteSchedule({id:b}),s(_=>_.filter(k=>k.id!==b))},[]);return{schedules:t,schedulesLoading:o,loadSchedules:d,createSchedule:p,updateSchedule:m,deleteSchedule:g,handleEvent:u,domainHook:{onConnect:()=>d(),onDisconnect:()=>{clearTimeout(c.current)},handleEvent:u}}}function xH(t){if(t)try{return JSON.parse(t)}catch{return}}function kH(){const[t,s]=y.useState(new Map),[o,r]=y.useState([]),[c,d]=y.useState(void 0),[u,p]=y.useState(void 0),[m,g]=y.useState(!1),[v,b]=y.useState(""),_=y.useRef(""),k=y.useCallback(async E=>{const R=E??"";_.current=R,b(""),g(!0);try{const O=await Lc.listRecentKnowledgeNodes({limit:30,workspaceId:R}),M=new Map,$=[];for(const Y of O.nodes)M.set(Y.id,Yc(Y));for(const Y of O.edges)$.push(zp(Y));for(const Y of $){const V=M.get(Y.source);V&&(V.val+=1);const ne=M.get(Y.target);ne&&(ne.val+=1)}s(M),r($)}catch{}finally{g(!1)}},[]),S=y.useCallback(async E=>{if(E.trim()){b(E),p(void 0),d(void 0),g(!0);try{const R=await Lc.searchKnowledge({query:E,limit:20,workspaceId:_.current}),O=new Map,M=[];for(const $ of R.results){$.node&&O.set($.node.id,Yc($.node,$.edges.length));for(const Y of $.edges)M.push(zp(Y))}s(O),r(M)}catch{}finally{g(!1)}}},[]),j=y.useCallback(()=>{k(_.current).catch(()=>{})},[k]),T=y.useCallback(async E=>{p(E);try{const R=await Lc.getKnowledgeNode({id:E});if(!R.node){d(void 0);return}d({node:Yc(R.node,R.edges.length),edges:R.edges.map(O=>({fromId:O.fromId,toId:O.toId,type:O.type,metadata:xH(O.metadataJson)}))})}catch{d(void 0)}},[]),N=y.useCallback(()=>{p(void 0),d(void 0)},[]),C=y.useCallback(async E=>{try{const R=await Lc.expandKnowledgeNode({id:E,depth:1});s(O=>{const M=new Map(O);for(const $ of R.nodes)M.has($.id)||M.set($.id,Yc($));return M}),r(O=>{const M=new Set(O.map(Y=>`${Y.source}:${Y.target}:${Y.type}`)),$=[];for(const Y of R.edges){const V=zp(Y),ne=`${V.source}:${V.target}:${V.type}`;M.has(ne)||$.push(V)}return[...O,...$]})}catch{}},[]),D=y.useCallback(E=>!1,[]),A={onConnect:async()=>{},onDisconnect:()=>{},handleEvent:D};return{graphData:{nodes:[...t.values()],links:o},selectedNode:c,selectedId:u,loading:m,searchQuery:v,search:S,clearSearch:j,selectNode:T,clearSelection:N,expandNode:C,loadRecent:k,handleEvent:D,domainHook:A}}function SH(){const t=y.useRef("default");y.useEffect(()=>{typeof Notification>"u"||(t.current=Notification.permission)},[]);function s(r){if(r.type!=="notification.escalated")return!1;if(typeof Notification>"u")return!0;if(t.current==="default")return Notification.requestPermission().then(u=>{t.current=u}).catch(()=>{}),!0;if(t.current!=="granted")return!0;const c=r.payload,d=new Notification(c.title||"Agent needs input",{body:c.message||"An agent is waiting for your input.",tag:c.escalationId,icon:Id("icon-192x192.png")});return d.onclick=()=>{window.focus(),c.taskUrl&&(window.location.href=c.taskUrl),d.close()},!0}return{handleEvent:s,domainHook:{onConnect:async()=>{},onDisconnect:()=>{},handleEvent:s}}}const Jc=500;function jH(){const[t,s]=y.useState([]),[o,r]=y.useState({}),[c,d]=y.useState(!1),[u,p]=y.useState(!1),{loading:m,track:g}=xs(),v=y.useRef(0),b=y.useCallback(async(T=!1)=>{const N=v.current;try{const C=await g(Be.listStreams({includeInternal:T}));v.current===N&&(s(C.streams.map(cH)),p(!1))}catch{v.current===N&&p(!0)}finally{v.current===N&&d(!0)}},[g]),_=y.useCallback(async(T,N)=>{let C;try{C=(await Be.getStreamTranscript({streamId:T,beforeSeq:N??"",limit:0})).messages.map(A=>({streamId:A.streamId,seq:A.seq,senderId:A.senderId,content:A.content,timestamp:A.timestamp}))}catch{return}r(D=>{const A=new Map;for(const O of D[T]??[])A.set(O.seq,O);for(const O of C)A.set(O.seq,O);const E=Array.from(A.values()).sort((O,M)=>O.seq.localeCompare(M.seq)),R=E.length>Jc?E.slice(E.length-Jc):E;return{...D,[T]:R}})},[]),k=y.useCallback(T=>{r(N=>{const C=N[T.streamId]??[];if(C.some(E=>E.seq===T.seq))return N;const D=[...C,T],A=D.length>Jc?D.slice(D.length-Jc):D;return{...N,[T.streamId]:A}})},[]),S=y.useCallback(T=>!1,[]);return{streams:t,streamsLoading:m,streamsLoadedOnce:c,streamsLoadError:u,loadStreams:b,liveMessages:o,loadTranscript:_,handleStreamMessage:k,handleEvent:S,domainHook:{onConnect:b,onDisconnect:()=>{v.current+=1,s([]),r({}),d(!1),p(!1)},handleEvent:S}}}function TH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),c=y.useCallback(async()=>{try{const m=await r(Be.listPlugins({}));s(m.plugins.map(g=>({name:g.name,description:g.description,enabled:g.enabled,required:g.required,loaded:g.loaded})))}catch{}},[r]),d=y.useCallback(m=>m.type==="plugin.changed"?(c().catch(()=>{}),!0):!1,[c]),u=y.useCallback(async(m,g)=>{try{const v=await Be.setPluginEnabled({name:m,enabled:g});s(b=>b.map(_=>_.name===v.name?{..._,enabled:v.enabled}:_))}catch{}},[]);return{plugins:t,pluginsLoading:o,loadPlugins:c,setPluginEnabled:u,domainHook:{onConnect:()=>c(),onDisconnect:()=>{},handleEvent:d}}}function NH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),c=y.useCallback(async()=>{try{const b=await r(Be.listGitHubAccounts({}));s(b.accounts.map(_=>({id:_.id,label:_.label,username:_.username,isDefault:_.isDefault,createdAt:_.createdAt})))}catch{}},[r]),d=y.useCallback(b=>b.type==="github_account.changed"?(c().catch(()=>{}),!0):!1,[c]),u=y.useCallback(async(b,_,k,S)=>{const j=await Be.addGitHubAccount({label:b,token:_,username:k,isDefault:S});s(T=>[...j.isDefault?T.map(C=>({...C,isDefault:!1})):T,{id:j.id,label:j.label,username:j.username,isDefault:j.isDefault,createdAt:j.createdAt}])},[]),p=y.useCallback(async(b,_)=>{const k=await Be.updateGitHubAccount({id:b,..._});s(S=>S.map(j=>j.id===k.id?{...j,label:k.label,username:k.username,isDefault:k.isDefault}:_.isDefault?{...j,isDefault:!1}:j))},[]),m=y.useCallback(async b=>{await Be.removeGitHubAccount({id:b}),s(_=>_.filter(k=>k.id!==b))},[]),g=y.useCallback(async()=>{const b=await Be.importGitHubAccounts({});return b.imported>0&&await c(),{imported:b.imported,usernames:b.usernames}},[c]);return{githubAccounts:t,githubAccountsLoading:o,loadGitHubAccounts:c,addGitHubAccount:u,updateGitHubAccount:p,removeGitHubAccount:m,importGitHubAccounts:g,domainHook:{onConnect:()=>c(),onDisconnect:()=>{},handleEvent:d}}}function wH(){const[t,s]=y.useState(""),[o,r]=y.useState(void 0),[c,d]=y.useState({}),{pluginNames:u}=Bd(),p=eH(u),m=dH(),g=fH(),v=pH(),b=mH(),_=hH(),k=gH(),S=vH(),j=yH(),T=bH(),N=_H(),C=kH(),D=SH(),A=jH(),E=TH(),R=NH(),O=[...p.has("environments")?[m.domainHook]:[],...p.has("sessions")?[g.domainHook]:[],...p.has("workspaces")?[v.domainHook]:[],...p.has("tasks")?[b.domainHook]:[],...p.has("tokens")?[_.domainHook]:[],...p.has("credentials")?[k.domainHook]:[],...p.has("codespaces")?[S.domainHook]:[],...p.has("dockerContainers")?[j.domainHook]:[],...p.has("personas")?[T.domainHook]:[],...p.has("schedules")?[N.domainHook]:[],...p.has("knowledge")?[C.domainHook]:[],...p.has("notifications")?[D.domainHook]:[],...p.has("streams")?[A.domainHook]:[],...p.has("plugins")?[E.domainHook]:[],R.domainHook],{connectionStatus:M}=Z9({onSessionEvent:F=>{g.handleSessionEvent({sessionId:F.sessionId,eventType:H_(F.type),timestamp:F.timestamp,content:F.content,raw:F.raw||void 0,toolCallId:F.toolCallId||void 0})},onDomainEvent:F=>{try{const ge=JSON.parse(F.payloadJson);Z({id:F.id,type:F.type,timestamp:F.timestamp,payload:ge})}catch{console.warn("[grackle] Failed to parse domain event payloadJson:",F.payloadJson)}},onStreamMessage:F=>{A.handleStreamMessage(F)},onConnect:se,onDisconnect:H}),$="default_persona_id",Y="onboarding_completed",V=y.useCallback(async F=>{const ge=await Be.setSetting({key:$,value:F});s(ge.value)},[]),ne=y.useCallback(async()=>{r(!0);try{await Be.setSetting({key:Y,value:"true"})}catch{}},[]),le=y.useCallback(async(F,ge)=>{try{const ee=await Be.getUsage({scope:F,id:ge}),ce=`${F}:${ge}`;d(me=>({...me,[ce]:rH(ee)}))}catch{}},[]);function Z(F){const ge=F.payload.key,ee=F.payload.value;if(F.type==="setting.changed"){ge===$&&s(ee??""),ge===Y&&r(ee==="true");return}for(const ce of O)if(ce.handleEvent(F))break;(F.type==="environment.removed"||F.type==="task.started")&&g.loadSessions().catch(()=>{}),(F.type==="session.started"||F.type==="session.stopped")&&A.loadStreams().catch(()=>{})}async function se(){for(const F of O)F.onConnect().catch(()=>{});try{const F=await Be.getSetting({key:$});s(F.value)}catch{}try{const F=await Be.getSetting({key:Y});r(F.value==="true")}catch{}}function H(){O.forEach(F=>F.onDisconnect())}const B=y.useCallback(()=>{m.loadEnvironments().catch(()=>{}),g.loadSessions().catch(()=>{}),v.loadWorkspaces().catch(()=>{}),_.loadTokens().catch(()=>{})},[m.loadEnvironments,g.loadSessions,v.loadWorkspaces,_.loadTokens]);return{connectionStatus:M,environments:{environments:m.environments,environmentsLoading:m.environmentsLoading,provisionStatus:m.provisionStatus,operationError:m.operationError,clearOperationError:m.clearOperationError,loadEnvironments:m.loadEnvironments,addEnvironment:m.addEnvironment,updateEnvironment:m.updateEnvironment,provisionEnvironment:m.provisionEnvironment,stopEnvironment:m.stopEnvironment,removeEnvironment:m.removeEnvironment,domainHook:m.domainHook},sessions:{sessions:g.sessions,sessionsLoading:g.sessionsLoading,events:g.events,eventsDropped:g.eventsDropped,lastSpawnedId:g.lastSpawnedId,taskSessions:g.taskSessions,spawn:g.spawn,sendInput:g.sendInput,kill:g.kill,stopGraceful:g.stopGraceful,loadSessionEvents:g.loadSessionEvents,clearEvents:g.clearEvents,loadTaskSessions:g.loadTaskSessions,domainHook:g.domainHook},workspaces:{workspaces:v.workspaces,workspacesLoading:v.workspacesLoading,workspaceCreating:v.workspaceCreating,loadWorkspaces:v.loadWorkspaces,createWorkspace:v.createWorkspace,archiveWorkspace:v.archiveWorkspace,updateWorkspace:v.updateWorkspace,linkEnvironment:v.linkEnvironment,unlinkEnvironment:v.unlinkEnvironment,linkOperationError:v.linkOperationError,clearLinkOperationError:v.clearLinkOperationError,domainHook:v.domainHook},tasks:{tasks:b.tasks,tasksLoading:b.tasksLoading,taskStartingId:b.taskStartingId,loadTasks:b.loadTasks,loadAllTasks:b.loadAllTasks,createTask:b.createTask,startTask:b.startTask,stopTask:b.stopTask,completeTask:b.completeTask,resumeTask:b.resumeTask,updateTask:b.updateTask,deleteTask:b.deleteTask,domainHook:b.domainHook},tokens:{tokens:_.tokens,tokensLoading:_.tokensLoading,loadTokens:_.loadTokens,setToken:_.setToken,deleteToken:_.deleteToken,domainHook:_.domainHook},credentials:{credentialProviders:k.credentialProviders,credentialsLoading:k.credentialsLoading,updateCredentialProviders:k.updateCredentialProviders,domainHook:k.domainHook},codespaces:{codespaces:S.codespaces,codespaceError:S.codespaceError,codespaceListError:S.codespaceListError,codespaceCreating:S.codespaceCreating,listCodespaces:S.listCodespaces,createCodespace:S.createCodespace,domainHook:S.domainHook},dockerContainers:{dockerContainers:j.dockerContainers,dockerContainersError:j.dockerContainersError,listDockerContainers:j.listDockerContainers,domainHook:j.domainHook},personas:{personas:T.personas,personasLoading:T.personasLoading,createPersona:T.createPersona,updatePersona:T.updatePersona,deletePersona:T.deletePersona,domainHook:T.domainHook},schedules:{schedules:N.schedules,schedulesLoading:N.schedulesLoading,createSchedule:N.createSchedule,updateSchedule:N.updateSchedule,deleteSchedule:N.deleteSchedule,domainHook:N.domainHook},streams:{streams:A.streams,streamsLoading:A.streamsLoading,streamsLoadedOnce:A.streamsLoadedOnce,streamsLoadError:A.streamsLoadError,loadStreams:A.loadStreams,liveMessages:A.liveMessages,loadTranscript:A.loadTranscript,handleStreamMessage:A.handleStreamMessage,domainHook:A.domainHook},knowledge:C,plugins:{plugins:E.plugins,pluginsLoading:E.pluginsLoading,loadPlugins:E.loadPlugins,setPluginEnabled:E.setPluginEnabled},githubAccounts:{githubAccounts:R.githubAccounts,githubAccountsLoading:R.githubAccountsLoading,loadGitHubAccounts:R.loadGitHubAccounts,addGitHubAccount:R.addGitHubAccount,updateGitHubAccount:R.updateGitHubAccount,removeGitHubAccount:R.removeGitHubAccount,importGitHubAccounts:R.importGitHubAccounts},appDefaultPersonaId:t,setAppDefaultPersonaId:V,onboardingCompleted:o,completeOnboarding:ne,usageCache:c,loadUsage:le,refresh:B}}function CH({children:t}){const s=wH();return a.jsx(bh.Provider,{value:s,children:t})}function EH(t,s){const o=y.useRef(null);y.useEffect(()=>{const r=o.current;if(o.current=t,r===null)return;const c=new Map;for(const u of r)c.set(u.id,u);const d=new Set;for(const u of t){d.add(u.id);const p=c.get(u.id);p&&p.status!==u.status&&(u.status==="sleeping"||u.status==="connecting"||(u.status==="connected"?s("Environment connected","success"):u.status==="error"?s("Environment provision failed","error"):u.status==="disconnected"&&p.status==="connected"&&s("Environment disconnected","warning")))}for(const u of r)d.has(u.id)||s("Environment removed","info")},[t,s])}function AH(t,s,o){const r=y.useRef(t);y.useEffect(()=>{t&&t!==r.current&&(o(t,"error"),s()),r.current=t},[t,s,o])}const DH={working:{message:"Task is now running",variant:"info"},paused:{message:"Task paused",variant:"warning"},complete:{message:"Task complete",variant:"success"},failed:{message:"Task failed to complete",variant:"error"}};function MH(t){return DH[t]}function RH(t,s){if(t===void 0)return[];const o=[],r=new Map;for(const d of t)r.set(d.id,d);const c=new Set;for(const d of s){c.add(d.id);const u=r.get(d.id);if(!u||u.status===d.status)continue;const p=MH(d.status);p&&o.push(p)}for(const d of t)c.has(d.id)||o.push({message:"Task deleted",variant:"info"});return o}function IH(t,s){const o=y.useRef(void 0);y.useEffect(()=>{const r=o.current;o.current=t;const c=RH(r,t);for(const d of c)s(d.message,d.variant)},[t,s])}const OH="_dashboard_16pzm_1",BH="_kpiStrip_16pzm_11",LH="_kpiCard_16pzm_23",zH="_kpiValue_16pzm_68",$H="_kpiLabel_16pzm_76",HH="_bodyGrid_16pzm_84",PH="_section_16pzm_96",UH="_sectionHeader_16pzm_109",VH="_sectionIcon_16pzm_118",qH="_sectionTitle_16pzm_123",GH="_sectionCount_16pzm_131",FH="_sectionBody_16pzm_138",KH="_emptyHint_16pzm_143",ZH="_sessionRow_16pzm_150",YH="_sessionPrompt_16pzm_177",JH="_sessionEnv_16pzm_186",WH="_sessionRuntime_16pzm_192",XH="_sessionStatus_16pzm_198",QH="_statusDot_16pzm_207",eP="_attentionRow_16pzm_233",tP="_attentionTitle_16pzm_259",nP="_attentionMeta_16pzm_267",sP="_reasonBadge_16pzm_274",aP="_bottomGrid_16pzm_301",iP="_envRow_16pzm_312",oP="_envName_16pzm_323",rP="_envStatusBadge_16pzm_333",lP="_workspaceRow_16pzm_369",cP="_workspaceTop_16pzm_395",dP="_workspaceName_16pzm_401",uP="_workspaceCounts_16pzm_407",fP="_progressBar_16pzm_415",pP="_progressFill_16pzm_422",he={dashboard:OH,kpiStrip:BH,kpiCard:LH,kpiValue:zH,kpiLabel:$H,bodyGrid:HH,section:PH,sectionHeader:UH,sectionIcon:VH,sectionTitle:qH,sectionCount:GH,sectionBody:FH,emptyHint:KH,sessionRow:ZH,sessionPrompt:YH,sessionEnv:JH,sessionRuntime:WH,sessionStatus:XH,statusDot:QH,attentionRow:eP,attentionTitle:tP,attentionMeta:nP,reasonBadge:sP,bottomGrid:aP,envRow:iP,envName:oP,envStatusBadge:rP,workspaceRow:lP,workspaceTop:cP,workspaceName:dP,workspaceCounts:uP,progressBar:fP,progressFill:pP};function mP(){return a.jsxs("div",{className:he.dashboard,"aria-hidden":"true",children:[a.jsx("div",{className:he.kpiStrip,children:Array.from({length:4},(t,s)=>a.jsxs("div",{className:he.kpiCard,children:[a.jsx(Te,{width:"3rem",height:"2rem"}),a.jsx(Te,{width:"80%",height:"0.75rem"})]},s))}),a.jsxs("div",{className:he.bodyGrid,children:[a.jsxs("div",{className:he.section,children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx(Te,{width:"1rem",height:"1rem",variant:"circular"}),a.jsx(Te,{width:"8rem",height:"0.75rem"}),a.jsx("span",{className:he.sectionCount,children:a.jsx(Te,{width:"1rem",height:"0.75rem"})})]}),a.jsx("div",{className:he.sectionBody,children:Array.from({length:3},(t,s)=>a.jsxs("div",{className:he.sessionRow,style:{cursor:"default"},children:[a.jsx(Te,{width:"60%",height:"0.875rem"}),a.jsx(Te,{width:"4rem",height:"0.75rem"}),a.jsx(Te,{width:"3rem",height:"0.75rem"}),a.jsx(Te,{width:"3rem",height:"0.75rem"})]},s))})]}),a.jsxs("div",{className:he.section,children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx(Te,{width:"1rem",height:"1rem",variant:"circular"}),a.jsx(Te,{width:"8rem",height:"0.75rem"}),a.jsx("span",{className:he.sectionCount,children:a.jsx(Te,{width:"1rem",height:"0.75rem"})})]}),a.jsx("div",{className:he.sectionBody,children:Array.from({length:2},(t,s)=>a.jsxs("div",{className:he.attentionRow,style:{cursor:"default"},children:[a.jsxs("div",{className:he.attentionTitle,children:[a.jsx(Te,{width:"3rem",height:"0.875rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"70%",height:"0.875rem"})]}),a.jsx("div",{className:he.attentionMeta,children:a.jsx(Te,{width:"5rem",height:"0.625rem"})})]},s))})]})]}),a.jsxs("div",{className:he.bottomGrid,children:[a.jsxs("div",{className:he.section,children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx(Te,{width:"1rem",height:"1rem",variant:"circular"}),a.jsx(Te,{width:"9rem",height:"0.75rem"}),a.jsx("span",{className:he.sectionCount,children:a.jsx(Te,{width:"1rem",height:"0.75rem"})})]}),a.jsx("div",{className:he.sectionBody,children:Array.from({length:2},(t,s)=>a.jsxs("div",{className:he.envRow,children:[a.jsx(Te,{width:"60%",height:"0.875rem"}),a.jsx(Te,{width:"4rem",height:"0.875rem",borderRadius:"var(--radius-sm)"})]},s))})]}),a.jsxs("div",{className:he.section,children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx(Te,{width:"1rem",height:"1rem",variant:"circular"}),a.jsx(Te,{width:"6rem",height:"0.75rem"}),a.jsx("span",{className:he.sectionCount,children:a.jsx(Te,{width:"1rem",height:"0.75rem"})})]}),a.jsx("div",{className:he.sectionBody,children:Array.from({length:2},(t,s)=>a.jsxs("div",{className:he.workspaceRow,style:{cursor:"default"},children:[a.jsxs("div",{className:he.workspaceTop,children:[a.jsx(Te,{width:"50%",height:"0.875rem"}),a.jsx(Te,{width:"2rem",height:"0.75rem"})]}),a.jsx("div",{className:he.progressBar,children:a.jsx("div",{className:he.progressFill,style:{width:"0%"}})})]},s))})]})]})]})}const hP={hidden:{opacity:0,y:12},visible:t=>({opacity:1,y:0,transition:{delay:t*.06,duration:.3,ease:"easeOut"}})},Wc={hidden:{opacity:0,y:16},visible:t=>({opacity:1,y:0,transition:{delay:.15+t*.08,duration:.35,ease:"easeOut"}})};function gP(t,s,o,r){const c=[`${t} of ${s} tasks completed`];return o>0&&c.push(`${o} in progress`),r>0&&c.push(`${r} failed`),c.join(", ")}function Xc({value:t,label:s,accent:o,index:r,testId:c}){return a.jsxs(Pt.div,{className:he.kpiCard,"data-accent":o,"data-testid":c,variants:hP,initial:"hidden",animate:"visible",custom:r,children:[a.jsx("span",{className:he.kpiValue,children:t}),a.jsx("span",{className:he.kpiLabel,children:s})]})}function vP(){const{workspaces:{workspaces:t,workspacesLoading:s},tasks:{tasks:o,tasksLoading:r,loadTasks:c},sessions:{sessions:d,sessionsLoading:u},environments:{environments:p,environmentsLoading:m}}=pt(),g=xt(),v=y.useRef(new Set);y.useEffect(()=>{for(const T of t)v.current.has(T.id)||(v.current.add(T.id),c(T.id).catch(()=>{}))},[t,c]);const b=y.useMemo(()=>M9(d,o,p),[d,o,p]),_=y.useMemo(()=>I9(d,p),[d,p]),k=y.useMemo(()=>R9(o,t),[o,t]),S=y.useMemo(()=>O9(t,o),[t,o,p]);return d.length===0&&o.length===0&&p.length===0&&t.length===0&&(u||r||m||s)?a.jsx(mP,{}):a.jsxs("div",{className:he.dashboard,"data-testid":"dashboard",children:[a.jsxs("div",{className:he.kpiStrip,"data-testid":"dashboard-kpi-strip",children:[a.jsx(Xc,{value:b.activeSessions,label:"Active Sessions",accent:"green",index:0,testId:"kpi-active-sessions"}),a.jsx(Xc,{value:b.blockedTasks,label:"Blocked Tasks",accent:"yellow",index:1,testId:"kpi-blocked-tasks"}),a.jsx(Xc,{value:b.attentionTasks,label:"Needs Attention",accent:"red",index:2,testId:"kpi-attention-tasks"}),a.jsx(Xc,{value:b.unhealthyEnvironments,label:"Unhealthy Envs",accent:"blue",index:3,testId:"kpi-unhealthy-envs"})]}),a.jsxs("div",{className:he.bodyGrid,children:[a.jsxs(Pt.div,{className:he.section,variants:Wc,initial:"hidden",animate:"visible",custom:0,"data-testid":"dashboard-active-sessions",children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx("span",{className:he.sectionIcon,"aria-hidden":"true",children:"●"}),a.jsx("span",{className:he.sectionTitle,children:"Active Sessions"}),a.jsx("span",{className:he.sectionCount,children:_.length})]}),a.jsx("div",{className:he.sectionBody,children:_.length===0?a.jsx("div",{className:he.emptyHint,children:"No active sessions"}):_.map(({session:T,environmentName:N})=>a.jsxs("button",{type:"button",className:he.sessionRow,onClick:()=>g(Mm(T.id)),"data-testid":"session-row",children:[a.jsx("span",{className:he.sessionPrompt,title:T.prompt,children:T.prompt||"—"}),a.jsx("span",{className:he.sessionEnv,children:N}),a.jsx("span",{className:he.sessionRuntime,children:T.runtime}),a.jsxs("span",{className:he.sessionStatus,children:[a.jsx("span",{className:he.statusDot,"data-status":T.status}),T.status]})]},T.id))})]}),a.jsxs(Pt.div,{className:he.section,variants:Wc,initial:"hidden",animate:"visible",custom:1,"data-testid":"dashboard-needs-attention",children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx("span",{className:he.sectionIcon,"aria-hidden":"true",children:"⚑"}),a.jsx("span",{className:he.sectionTitle,children:"Needs Attention"}),a.jsx("span",{className:he.sectionCount,children:k.length})]}),a.jsx("div",{className:he.sectionBody,children:k.length===0?a.jsx("div",{className:he.emptyHint,children:"All clear"}):k.map(({task:T,reason:N,workspaceName:C})=>a.jsxs("button",{type:"button",className:he.attentionRow,onClick:()=>g(ls(T.id)),"data-testid":"attention-row",children:[a.jsxs("div",{className:he.attentionTitle,children:[a.jsx("span",{className:he.reasonBadge,"data-reason":N,children:N}),T.title]}),a.jsx("div",{className:he.attentionMeta,children:a.jsx("span",{children:C})})]},T.id))})]})]}),a.jsxs("div",{className:he.bottomGrid,children:[a.jsxs(Pt.div,{className:he.section,variants:Wc,initial:"hidden",animate:"visible",custom:2,"data-testid":"dashboard-env-health",children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx("span",{className:he.sectionIcon,"aria-hidden":"true",children:"◈"}),a.jsx("span",{className:he.sectionTitle,children:"Environment Health"}),a.jsx("span",{className:he.sectionCount,children:p.length})]}),a.jsx("div",{className:he.sectionBody,children:p.length===0?a.jsx("div",{className:he.emptyHint,children:"No environments configured"}):p.map(T=>a.jsxs("div",{className:he.envRow,"data-testid":"dashboard-env-row",children:[a.jsx("span",{className:he.envName,children:T.displayName}),a.jsx("span",{className:he.envStatusBadge,"data-status":T.status,children:T.status})]},T.id))})]}),a.jsxs(Pt.div,{className:he.section,variants:Wc,initial:"hidden",animate:"visible",custom:3,"data-testid":"dashboard-workspace-snapshot",children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx("span",{className:he.sectionIcon,"aria-hidden":"true",children:"▦"}),a.jsx("span",{className:he.sectionTitle,children:"Workspaces"}),a.jsx("span",{className:he.sectionCount,children:t.length})]}),a.jsx("div",{className:he.sectionBody,children:S.length===0?a.jsx("div",{className:he.emptyHint,children:"No workspaces yet"}):S.map(({workspace:T,totalTasks:N,completedTasks:C,workingTasks:D,failedTasks:A})=>{const E=N>0?Math.round(C/N*100):0;return a.jsxs("button",{type:"button",className:he.workspaceRow,onClick:()=>g(wi(T.id,T.linkedEnvironmentIds[0])),"data-testid":"workspace-row",children:[a.jsxs("div",{className:he.workspaceTop,children:[a.jsx("span",{className:he.workspaceName,children:T.name}),a.jsxs("span",{className:he.workspaceCounts,"aria-label":gP(C,N,D,A),children:[C,"/",N,D>0&&a.jsxs("span",{style:{color:"var(--accent-green)"},"aria-hidden":"true",children:["▸",D]}),A>0&&a.jsxs("span",{style:{color:"var(--accent-red)"},"aria-hidden":"true",children:["✗",A]})]})]}),N>0&&a.jsx("div",{className:he.progressBar,children:a.jsx("div",{className:he.progressFill,style:{width:`${E}%`}})})]},T.id)})})]})]})]})}const yP="_panelContainer_1udy7_1",bP="_emptyState_1udy7_8",_P="_workspaceSummary_1udy7_17",xP="_workspaceSummaryTitle_1udy7_28",kP="_workspaceSummarySubtitle_1udy7_32",SP="_header_1udy7_36",jP="_headerInfo_1udy7_71",TP="_headerTitle_1udy7_106",NP="_taskStatusBadge_1udy7_128",wP="_taskBranch_1udy7_137",CP="_taskBlockedBadge_1udy7_143",EP="_tabBar_1udy7_277",AP="_tab_1udy7_277",DP="_active_1udy7_303",MP="_eventScroll_1udy7_308",RP="_overviewContent_1udy7_325",IP="_overviewDashboard_1udy7_334",OP="_overviewHero_1udy7_340",BP="_overviewSection_1udy7_347",LP="_overviewLabel_1udy7_353",zP="_envRow_1udy7_360",$P="_timeline_1udy7_366",HP="_timelineRow_1udy7_372",PP="_waitingMessage_1udy7_379",UP="_errorMessage_1udy7_383",VP="_emptyCta_1udy7_387",qP="_ctaTitle_1udy7_399",GP="_ctaDescription_1udy7_405",FP="_ctaButton_1udy7_412",KP="_workspaceHeader_1udy7_533",ZP="_workspaceName_1udy7_558",YP="_workspaceMeta_1udy7_571",JP="_metaRow_1udy7_579",WP="_metaLabel_1udy7_592",XP="_metaValue_1udy7_607",QP="_archiveButton_1udy7_617",eU="_repoLink_1udy7_647",tU="_metaToggle_1udy7_657",nU="_metaToggleArrow_1udy7_678",sU="_metaToggleArrowOpen_1udy7_683",aU="_progressBarContainer_1udy7_687",iU="_progressBar_1udy7_687",oU="_progressFill_1udy7_703",rU="_progressLabel_1udy7_710",lU="_metaTimestamps_1udy7_717",cU="_metaTimestamp_1udy7_717",dU="_metaPlaceholder_1udy7_739",uU="_linkedEnvList_1udy7_744",fU="_linkedEnvChip_1udy7_750",pU="_chipDismiss_1udy7_762",mU="_linkError_1udy7_777",hU="_linkEnvSelect_1udy7_782",W={panelContainer:yP,emptyState:bP,workspaceSummary:_P,workspaceSummaryTitle:xP,workspaceSummarySubtitle:kP,header:SP,headerInfo:jP,headerTitle:TP,taskStatusBadge:NP,taskBranch:wP,taskBlockedBadge:CP,tabBar:EP,tab:AP,active:DP,eventScroll:MP,overviewContent:RP,overviewDashboard:IP,overviewHero:OP,overviewSection:BP,overviewLabel:LP,envRow:zP,timeline:$P,timelineRow:HP,waitingMessage:PP,errorMessage:UP,emptyCta:VP,ctaTitle:qP,ctaDescription:GP,ctaButton:FP,workspaceHeader:KP,workspaceName:ZP,workspaceMeta:YP,metaRow:JP,metaLabel:WP,metaValue:XP,archiveButton:QP,repoLink:eU,metaToggle:tU,metaToggleArrow:nU,metaToggleArrowOpen:sU,progressBarContainer:aU,progressBar:iU,progressFill:oU,progressLabel:rU,metaTimestamps:lU,metaTimestamp:cU,metaPlaceholder:dU,linkedEnvList:uU,linkedEnvChip:fU,chipDismiss:pU,linkError:mU,linkEnvSelect:hU};function gU(){return a.jsx("div",{className:W.emptyState,children:"Select a task or click + to create one"})}function vU(){return a.jsx("div",{className:W.emptyState,children:"Select an environment to manage its workspaces, or add a new one."})}function yU(){const{workspaces:{workspaces:t},environments:{environments:s}}=pt(),o=xt(),r=s.length>0;return t.length>0?a.jsx(vP,{}):a.jsxs("div",{className:W.emptyCta,"data-testid":"welcome-cta",children:[a.jsx("div",{className:W.ctaTitle,children:"Welcome to Grackle"}),a.jsx("div",{className:W.ctaDescription,children:"Organize your work into workspaces and let agents tackle the tasks."}),a.jsx("button",{className:W.ctaButton,onClick:()=>o(mx),disabled:!r,"data-testid":"welcome-create-button",children:"Create Your First Workspace"}),!r&&a.jsx("div",{className:W.ctaDescription,children:"Add an environment first before creating a workspace."})]})}const bU="_panelContainer_1rih4_1",_U="_chatHeader_1rih4_9",xU="_chatHeaderInfo_1rih4_38",kU="_chatHeaderActions_1rih4_44",SU="_emptyState_1rih4_64",jU="_emptyTitle_1rih4_76",TU="_emptyDescription_1rih4_82",NU="_emptyHint_1rih4_88",ra={panelContainer:bU,chatHeader:_U,chatHeaderInfo:xU,chatHeaderActions:kU,emptyState:SU,emptyTitle:jU,emptyDescription:TU,emptyHint:NU};function S_(){return a.jsx("div",{className:ra.panelContainer,"aria-hidden":"true",children:a.jsxs("div",{style:{flex:1,overflow:"hidden",padding:"var(--space-md)",display:"flex",flexDirection:"column",gap:"var(--space-md)"},children:[a.jsx(Te,{width:"65%",height:"2.5rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"85%",height:"4rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"45%",height:"2rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"75%",height:"3rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"55%",height:"2.5rem",borderRadius:"var(--radius-sm)"})]})})}function wU({hasLocalEnvironment:t}){return a.jsxs("div",{className:ra.emptyState,"data-testid":"chat-empty-state",children:[a.jsx("div",{className:ra.emptyTitle,children:"Welcome to Grackle"}),a.jsx("div",{className:ra.emptyDescription,children:t?"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."}),!t&&a.jsx("div",{className:ra.emptyHint,children:"Go to Settings → Environments to add one."})]})}function CU(){const t=kh(),{tasks:{tasks:s,tasksLoading:o,startTask:r},sessions:{sessions:c,sessionsLoading:d,events:u,eventsDropped:p,taskSessions:m,loadTaskSessions:g,loadSessionEvents:v,kill:b,stopGraceful:_,sendInput:k,spawn:S},environments:{environments:j,provisionEnvironment:T},personas:{personas:N}}=pt(),{showToast:C}=pn(),D=y.useRef(void 0),[A,E]=y.useState(),R=s.find(le=>le.id===Ic),O=R!=null&&R.latestSessionId?c.find(le=>le.id===R.latestSessionId)??(m[Ic]??[]).find(le=>le.id===R.latestSessionId):void 0;y.useEffect(()=>{g(Ic).catch(()=>{})},[R==null?void 0:R.latestSessionId,g]),y.useEffect(()=>{O&&O.id!==D.current&&(D.current=O.id,v(O.id).catch(()=>{}))},[O==null?void 0:O.id,v]);const M=y.useMemo(()=>{if(!O)return[];const le=u.filter(Z=>Z.sessionId===O.id);return xh(_h(le))},[u,O==null?void 0:O.id]),$=j.find(le=>le.adapterType==="local"&&le.status==="connected"),Y=O!==void 0&&O.status!=="stopped"&&O.status!=="suspended",V=(O==null?void 0:O.status)==="idle";y.useEffect(()=>{A&&O&&V&&(k(O.id,A).catch(()=>{C("Failed to send message","error")}),E(void 0))},[A,V,O==null?void 0:O.id,k,C]);const ne=y.useCallback((le,Z,se,H)=>{H&&E(H),r(le,Z,se).catch(()=>{})},[r]);return!R&&(d||o)?a.jsx(S_,{}):R!=null&&R.latestSessionId&&!O?a.jsx(S_,{}):a.jsxs("div",{className:ra.panelContainer,"data-testid":"chat-page",children:[Y&&a.jsxs("div",{className:ra.chatHeader,children:[a.jsxs("span",{className:ra.chatHeaderInfo,children:["Session: ",O.id.slice(0,8)," | ",O.runtime," | ",O.status]}),a.jsx("div",{className:ra.chatHeaderActions,children:a.jsx(gx,{label:"Stop",onClick:()=>{_(O.id).catch(()=>{})},variant:"danger",size:"sm","data-testid":"stop-split-button",options:[{label:"Stop",description:"Graceful shutdown",onClick:()=>{_(O.id).catch(()=>{})}},{label:"Kill",description:"Force kill",onClick:()=>{b(O.id).catch(()=>{})}}]})})]}),a.jsx(mh,{events:M,eventsDropped:p,sandboxProxyUrl:t,emptyState:a.jsx(wU,{hasLocalEnvironment:!!$}),onShowToast:C}),$&&a.jsx(Sd,{mode:Y?"send":"start",sessionId:Y?O.id:void 0,taskId:Ic,environmentId:Y?O.environmentId:$.id,personas:N,environments:j,onSendInput:(le,Z)=>{k(le,Z).catch(()=>{C("Failed to send message","error")})},onSpawn:(le,Z,se)=>{S(le,Z,se).catch(()=>{})},onStartTask:ne,onProvisionEnvironment:le=>{T(le).catch(()=>{})},onShowToast:C})]})}const EU="_container_h5uod_1",AU="_toolbar_h5uod_9",DU="_viewToggle_h5uod_18",MU="_toolbarControls_h5uod_23",RU="_internalsToggle_h5uod_30",IU="_refreshButton_h5uod_39",OU="_toggleButton_h5uod_53",BU="_toggleActive_h5uod_67",as={container:EU,toolbar:AU,viewToggle:DU,toolbarControls:MU,internalsToggle:RU,refreshButton:IU,toggleButton:OU,toggleActive:BU};function LU(){const{streams:{streams:t,streamsLoading:s,streamsLoadedOnce:o,streamsLoadError:r,loadStreams:c,liveMessages:d,loadTranscript:u},sessions:{sessions:p},tasks:{tasks:m}}=pt(),{resolvedThemeId:g}=yh(),[v,b]=y.useState("list"),[_,k]=y.useState(!1),[S,j]=y.useState(void 0),[T,N]=y.useState(!1);y.useEffect(()=>{if(S===void 0){N(!1);return}let E=!0;return N(!0),u(S).then(()=>{E&&N(!1)}).catch(()=>{E&&N(!1)}),()=>{E=!1}},[S,u]);const C=y.useRef(!1);y.useEffect(()=>{if(!C.current){C.current=!0;return}c(_).catch(()=>{})},[_,c]);const D=y.useCallback(()=>{c(_).catch(()=>{})},[c,_]),A=S!==void 0?t.find(E=>E.id===S):void 0;return a.jsxs("div",{className:as.container,"data-testid":"coordination-page",children:[a.jsxs("div",{className:as.toolbar,children:[a.jsxs("div",{className:as.viewToggle,role:"group","aria-label":"Coordination view","data-testid":"coordination-view-toggle",children:[a.jsx("button",{type:"button",className:v==="list"?`${as.toggleButton} ${as.toggleActive}`:as.toggleButton,"aria-pressed":v==="list","data-testid":"coordination-view-list",onClick:()=>b("list"),children:"List"}),a.jsx("button",{type:"button",className:v==="graph"?`${as.toggleButton} ${as.toggleActive}`:as.toggleButton,"aria-pressed":v==="graph","data-testid":"coordination-view-graph",onClick:()=>b("graph"),children:"Graph"})]}),a.jsxs("div",{className:as.toolbarControls,children:[a.jsxs("label",{className:as.internalsToggle,children:[a.jsx("input",{type:"checkbox",checked:_,onChange:E=>k(E.target.checked),"data-testid":"coordination-show-internals"}),"Show internals"]}),a.jsx("button",{type:"button",className:as.refreshButton,onClick:D,"aria-label":"Refresh streams","data-testid":"coordination-refresh",children:"Refresh"})]})]}),v==="list"?a.jsx(tz,{streams:t,sessions:p,tasks:m,loading:s,loadError:r,loadedOnce:o,showInternals:_,onToggleInternals:k,selectedStreamId:S,onSelectStream:j,onRefresh:D,hideHeaderControls:!0}):a.jsx(N$,{streams:t,sessions:p,selectedStreamId:S,onSelectStream:j,recentMessages:d,resolvedThemeId:g}),A&&a.jsx(Hz,{stream:A,messages:d[A.id]??[],transcriptLoading:T,onClose:()=>j(void 0)})]})}function zU(){const t=w9(),[s]=Dm(),o=s.get("env")??"",{sessions:{sendInput:r,spawn:c},tasks:{startTask:d},personas:{personas:u},environments:{environments:p,provisionEnvironment:m}}=pt(),{showToast:g}=pn();return a.jsxs("div",{className:W.panelContainer,children:[a.jsx(ha,{segments:t}),a.jsx("div",{className:W.emptyState,children:"Enter a prompt below to start a new session"}),a.jsx(Sd,{mode:"spawn",environmentId:o,showPersonaSelect:!0,personas:u,environments:p,onSendInput:(v,b)=>{r(v,b).catch(()=>{g("Failed to send message","error")})},onSpawn:(v,b,_)=>{c(v,b,_).catch(()=>{})},onStartTask:(v,b,_)=>{d(v,b,_).catch(()=>{})},onProvisionEnvironment:v=>{m(v).catch(()=>{})},onShowToast:g})]})}function $U(){return a.jsxs("div",{className:W.panelContainer,"aria-hidden":"true",children:[a.jsxs("div",{className:W.header,children:[a.jsx("span",{children:a.jsx(Te,{width:"10rem",height:"0.875rem"})}),a.jsx("span",{className:W.headerInfo,children:a.jsx(Te,{width:"16rem",height:"0.875rem"})})]}),a.jsx("div",{className:W.eventScroll,children:a.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"var(--space-md)"},children:[a.jsx(Te,{width:"70%",height:"2.5rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"90%",height:"4rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"50%",height:"2rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"80%",height:"3.5rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"60%",height:"2.5rem",borderRadius:"var(--radius-sm)"})]})})]})}function HU({sessionId:t,session:s,isActive:o,onStop:r,onKill:c}){return a.jsxs("div",{className:W.header,children:[a.jsxs("span",{children:["Session: ",t.slice(0,8),s&&` | ${s.runtime} | ${s.endReason||s.status}`,s!=null&&s.inputTokens||s!=null&&s.outputTokens||s!=null&&s.costMillicents?` | ${Ho((s.inputTokens??0)+(s.outputTokens??0))} tokens · ${Rs(s.costMillicents??0)}`:""]}),a.jsxs("span",{className:W.headerInfo,children:[s&&a.jsx("span",{children:s.prompt.length>60?s.prompt.slice(0,60)+"...":s.prompt}),o&&a.jsx(gx,{label:"Stop",onClick:r,variant:"danger",size:"sm","data-testid":"stop-split-button",options:[{label:"Stop",description:"Graceful shutdown",onClick:r},{label:"Kill",description:"Force kill",onClick:c}]})]})]})}function PU({session:t}){const s=t&&(t.status==="stopped"||t.status==="suspended"),o=s?`Session ${t.endReason||t.status} with no events recorded.`:"Waiting for events...";return a.jsx("div",{className:s?W.errorMessage:W.waitingMessage,children:o})}function UU(){const{sessionId:t}=ma(),s=kh(),{sessions:{events:o,eventsDropped:r,sessions:c,sessionsLoading:d,kill:u,stopGraceful:p,loadSessionEvents:m,sendInput:g,spawn:v},tasks:{startTask:b},personas:{personas:_},environments:{environments:k,provisionEnvironment:S}}=pt(),{showToast:j}=pn(),T=y.useRef(void 0),N=C9(t),C=c.find(E=>E.id===t)??void 0,D=y.useMemo(()=>{const E=t?o.filter(R=>R.sessionId===t):[];return xh(_h(E))},[o,t]);if(y.useEffect(()=>{t&&t!==T.current&&(T.current=t,m(t).catch(()=>{}))},[t,m]),!C&&d)return a.jsx($U,{});if(!t)return a.jsx("div",{className:W.emptyState,children:"No session selected"});const A=(C==null?void 0:C.status)==="running"||(C==null?void 0:C.status)==="idle";return a.jsxs("div",{className:W.panelContainer,children:[a.jsx(ha,{segments:N}),a.jsx(HU,{sessionId:t,session:C,isActive:A,onStop:()=>{p(t).catch(()=>{})},onKill:()=>{u(t).catch(()=>{})}}),a.jsx(mh,{events:D,eventsDropped:r,emptyState:a.jsx(PU,{session:C}),onShowToast:j,sandboxProxyUrl:s,sessions:c,currentSessionId:t,environments:k,personas:_,onForward:(E,R)=>g(E,R)}),A&&a.jsx(Sd,{mode:"send",sessionId:t,environmentId:C.environmentId,personas:_,environments:k,onSendInput:(E,R)=>{g(E,R).catch(()=>{j("Failed to send message","error")})},onSpawn:(E,R,O)=>{v(E,R,O).catch(()=>{})},onStartTask:(E,R,O)=>{b(E,R,O).catch(()=>{})},onProvisionEnvironment:E=>{S(E).catch(()=>{})},onShowToast:j})]})}function VU(t){if(!t)return!1;const s=t.tagName;return!!(s==="INPUT"||s==="TEXTAREA"||s==="SELECT"||t.isContentEditable)}function Za(t,s){const o=y.useRef(s);o.current=s;const{key:r,ctrl:c=!1,shift:d=!1,suppressInInputs:u=!0,enabled:p=!0}=t;y.useEffect(()=>{if(!p)return;const m=g=>{if(u&&VU(document.activeElement??void 0))return;const v=g.ctrlKey||g.metaKey;c===v&&(d&&!g.shiftKey||g.key===r&&o.current())};return document.addEventListener("keydown",m),()=>{document.removeEventListener("keydown",m)}},[r,c,d,u,p])}function qU(){return a.jsxs("div",{className:W.panelContainer,"aria-hidden":"true",children:[a.jsx("div",{className:W.workspaceHeader,children:a.jsx("span",{className:W.workspaceName,children:a.jsx(Te,{width:"12rem",height:"1.25rem"})})}),a.jsx("div",{className:W.metaToggle,style:{cursor:"default"},children:a.jsx(Te,{width:"4rem",height:"0.625rem"})}),a.jsxs("div",{className:W.progressBarContainer,children:[a.jsx("div",{className:W.progressBar,children:a.jsx("div",{className:W.progressFill,style:{width:"0%"}})}),a.jsx(Te,{width:"2rem",height:"0.625rem"})]}),a.jsxs("div",{className:W.tabBar,role:"tablist","aria-label":"Workspace view",children:[a.jsx("span",{className:`${W.tab} ${W.active}`,children:"Graph"}),a.jsx("span",{className:W.tab,children:"Board"}),a.jsx("span",{className:W.tab,children:"Tasks"})]}),a.jsx("div",{className:W.overviewContent,children:Array.from({length:3},(t,s)=>a.jsx(um,{lines:2},s))})]})}function j_(t){if(!t)return"";const s=new Date(t);if(isNaN(s.getTime()))return"";const r=Date.now()-s.getTime();if(r<0)return"just now";const c=Math.floor(r/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 u=Math.floor(d/24);return u<30?`${u}d ago`:s.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}const Hp=100;function GU(t){try{const s=new URL(t);return s.protocol!=="http:"&&s.protocol!=="https:"?void 0:s.toString()}catch{return}}function FU(){const{workspaceId:t,environmentId:s}=ma(),o=xt(),{tasks:{tasks:r},environments:{environments:c},workspaces:{workspaces:d,workspacesLoading:u,archiveWorkspace:p,updateWorkspace:m,linkEnvironment:g,unlinkEnvironment:v,linkOperationError:b,clearLinkOperationError:_},personas:{personas:k},sessions:{sessions:S},usageCache:j,loadUsage:T}=pt(),{resolvedThemeId:N}=yh(),[C,D]=y.useState("tasks"),[A,E]=y.useState(!1),[R,O]=y.useState(null),[M,$]=y.useState(!1),Y=y.useRef(void 0),V=d.find(ee=>ee.id===t),ne=s??(V==null?void 0:V.linkedEnvironmentIds[0])??"",le=E9(t,ne,d,c);Za({key:"1"},()=>D("graph")),Za({key:"2"},()=>D("board")),Za({key:"3"},()=>D("tasks")),y.useEffect(()=>{const ee=Y.current;Y.current=t,!(ee===void 0||ee===t)&&R!==null&&O(null)},[t,R]);const Z=S.reduce((ee,ce)=>ee+(ce.costMillicents??0),0);y.useEffect(()=>{t&&T("workspace",t).catch(()=>{})},[t,T,Z]);const se=t?j[`workspace:${t}`]:void 0,H=r.filter(ee=>ee.workspaceId===t),B=H.filter(ee=>ee.status==="complete").length,F=H.length,ge=F>0?Math.round(B/F*100):0;return!V&&u?a.jsx(qU,{}):a.jsxs("div",{className:W.panelContainer,children:[a.jsx(ha,{segments:le}),a.jsxs("div",{className:W.workspaceHeader,children:[a.jsx("span",{className:W.workspaceName,"data-testid":"workspace-name",children:a.jsx(zt,{value:(V==null?void 0:V.name)||"",onSave:ee=>{V&&m(V.id,{name:ee}).catch(()=>{})},validate:ee=>{const ce=ee.trim();if(!ce)return"Name is required";if(ce.length>Hp)return`Max ${Hp} characters`},maxLength:Hp,fieldId:"name",activeFieldId:R,onActivate:O,ariaLabel:"Workspace name",renderDisplay:ee=>ee||t||void 0,"data-testid":"edit-name"})}),a.jsx("button",{className:W.archiveButton,onClick:()=>E(!0),title:"Archive workspace","data-testid":"archive-workspace-button",children:"Archive"})]}),a.jsxs("button",{className:W.metaToggle,onClick:()=>$(!M),"aria-expanded":!M,"aria-controls":"workspace-meta-panel","data-testid":"meta-toggle",children:[a.jsx("span",{className:`${W.metaToggleArrow} ${M?"":W.metaToggleArrowOpen}`,children:"▶"}),"Details"]}),!M&&a.jsxs("div",{className:W.workspaceMeta,"data-testid":"workspace-meta",id:"workspace-meta-panel",children:[a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Description"}),a.jsx("div",{className:W.metaValue,children:a.jsx(fm,{value:(V==null?void 0:V.description)||"",onSave:ee=>{V&&m(V.id,{description:ee}).catch(()=>{})},fieldId:"description",activeFieldId:R,onActivate:O,renderDisplay:ee=>ee?a.jsx("span",{className:W.overviewMarkdown,children:a.jsx(_m,{remarkPlugins:[xm],children:ee})}):void 0,placeholder:"No description",ariaLabel:"Workspace description","data-testid":"edit-description"})})]}),a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Repository"}),a.jsx("div",{className:W.metaValue,children:a.jsx(zt,{value:(V==null?void 0:V.repoUrl)||"",onSave:ee=>{V&&m(V.id,{repoUrl:ee}).catch(()=>{})},validate:ee=>{const ce=ee.trim();if(ce&&!/^https?:\/\/.+/.test(ce))return"Must be a valid http(s) URL"},fieldId:"repoUrl",activeFieldId:R,onActivate:O,renderDisplay:ee=>{const ce=GU(ee);return ce?a.jsx("a",{className:W.repoLink,href:ce,target:"_blank",rel:"noopener noreferrer",onClick:me=>me.stopPropagation(),children:ee}):ee?a.jsx("span",{children:ee}):void 0},placeholder:"No repository",ariaLabel:"Workspace repository URL","data-testid":"edit-repo"})})]}),a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Environments"}),a.jsx("div",{className:W.metaValue,"data-testid":"linked-environments",children:V?a.jsxs("span",{className:W.linkedEnvList,children:[(()=>{const ee=[...new Set(V.linkedEnvironmentIds)];return ee.length===0?a.jsx("span",{className:W.metaPlaceholder,children:"None"}):ee.map(ce=>{const me=c.find(xe=>xe.id===ce);return a.jsxs("span",{className:W.linkedEnvChip,"data-testid":`linked-env-${ce}`,children:[(me==null?void 0:me.displayName)||ce,a.jsx("button",{className:W.chipDismiss,onClick:()=>{v(V.id,ce).catch(()=>{})},title:`Unlink ${(me==null?void 0:me.displayName)||ce}`,"aria-label":`Unlink ${(me==null?void 0:me.displayName)||ce}`,"data-testid":`unlink-env-${ce}`,disabled:ee.length<=1,children:"x"})]},ce)})})(),(()=>{const ee=new Set(V.linkedEnvironmentIds),ce=c.filter(me=>!ee.has(me.id));return ce.length===0?null:a.jsxs("select",{className:W.linkEnvSelect,value:"",onChange:me=>{me.target.value&&g(V.id,me.target.value).catch(()=>{})},"aria-label":"Link environment","data-testid":"link-env-select",children:[a.jsx("option",{value:"",children:"+ Link"}),ce.map(me=>a.jsx("option",{value:me.id,children:me.displayName||me.id},me.id))]})})(),b&&a.jsxs("span",{className:W.linkError,"data-testid":"link-operation-error",role:"alert",children:[b,a.jsx("button",{className:W.chipDismiss,onClick:_,"aria-label":"Dismiss error","data-testid":"dismiss-link-error",children:"x"})]})]}):a.jsx("span",{className:W.metaPlaceholder,children:"None"})})]}),a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Persona"}),a.jsx("div",{className:W.metaValue,children:a.jsx(bd,{value:(V==null?void 0:V.defaultPersonaId)||"",onSave:ee=>{V&&m(V.id,{defaultPersonaId:ee}).catch(()=>{})},options:[{value:"",label:"(Inherit)"},...k.map(ee=>({value:ee.id,label:ee.name}))],fieldId:"defaultPersonaId",activeFieldId:R,onActivate:O,renderDisplay:ee=>{const ce=k.find(me=>me.id===ee);if(ce)return a.jsx("span",{children:ce.name})},placeholder:(V==null?void 0:V.defaultPersonaId)||"(Inherit)",ariaLabel:"Workspace default persona","data-testid":"edit-persona"})})]}),a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Worktrees"}),a.jsx("div",{className:W.metaValue,children:a.jsx(YI,{checked:(V==null?void 0:V.useWorktrees)??!0,onChange:ee=>{V&&m(V.id,{useWorktrees:ee}).catch(()=>{})},label:"Enable worktree isolation","data-testid":"worktree-toggle"})})]}),a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Working Dir"}),a.jsx("div",{className:W.metaValue,children:a.jsx(zt,{value:(V==null?void 0:V.workingDirectory)||"",onSave:ee=>{V&&m(V.id,{workingDirectory:ee}).catch(()=>{})},fieldId:"workingDirectory",activeFieldId:R,onActivate:O,placeholder:"Default (server default)",ariaLabel:"Working directory","data-testid":"edit-working-directory"})})]}),V&&a.jsxs("div",{className:W.metaTimestamps,children:[a.jsxs("span",{className:W.metaTimestamp,children:["Created ",j_(V.createdAt)]}),V.updatedAt&&V.updatedAt!==V.createdAt&&a.jsxs("span",{className:W.metaTimestamp,children:["· Updated ",j_(V.updatedAt)]})]})]}),F>0&&a.jsxs("div",{className:W.progressBarContainer,"data-testid":"progress-bar",children:[a.jsx("div",{className:W.progressBar,children:a.jsx("div",{className:W.progressFill,style:{width:`${ge}%`}})}),a.jsxs("span",{className:W.progressLabel,children:[B,"/",F]})]}),se&&se.costMillicents>0&&a.jsx("div",{className:W.progressBarContainer,children:a.jsxs("span",{className:W.progressLabel,children:["Usage: ",Rs(se.costMillicents)," (",se.sessionCount," session",se.sessionCount!==1?"s":"",")"]})}),V&&(V.tokenBudget>0||V.costBudgetMillicents>0)&&a.jsx("div",{className:W.progressBarContainer,children:a.jsxs("span",{className:W.progressLabel,children:["Budget:"," ",V.tokenBudget>0&&a.jsxs(a.Fragment,{children:["Tokens: ",Ho(((se==null?void 0:se.inputTokens)??0)+((se==null?void 0:se.outputTokens)??0))," / ",Ho(V.tokenBudget)]}),V.tokenBudget>0&&V.costBudgetMillicents>0&&" | ",V.costBudgetMillicents>0&&a.jsxs(a.Fragment,{children:["Cost: ",Rs((se==null?void 0:se.costMillicents)??0)," / ",Rs(V.costBudgetMillicents)]})]})}),a.jsxs("div",{className:W.tabBar,role:"tablist","aria-label":"Workspace view",children:[a.jsx("button",{role:"tab","aria-selected":C==="graph",className:`${W.tab} ${C==="graph"?W.active:""}`,onClick:()=>D("graph"),children:"Graph"}),a.jsx("button",{role:"tab","aria-selected":C==="board",className:`${W.tab} ${C==="board"?W.active:""}`,onClick:()=>D("board"),"data-testid":"board-tab",children:"Board"}),a.jsx("button",{role:"tab","aria-selected":C==="tasks",className:`${W.tab} ${C==="tasks"?W.active:""}`,onClick:()=>D("tasks"),children:"Tasks"})]}),C==="tasks"&&F>0&&a.jsxs("div",{className:W.workspaceSummary,children:[a.jsx("span",{className:W.workspaceSummaryTitle,children:`${B}/${F} tasks complete`}),a.jsx("span",{className:W.workspaceSummarySubtitle,children:"Select a task or click + to create one"})]}),C==="tasks"&&F===0&&a.jsxs("div",{className:W.emptyCta,children:[a.jsx("button",{className:W.ctaButton,onClick:()=>o(Ri(t,void 0,ne)),children:"Create Task"}),a.jsx("div",{className:W.ctaDescription,children:"Break your work into tasks and let agents tackle them"})]}),C==="board"&&a.jsx(X$,{workspaceId:t,environmentId:ne,tasks:r,sessions:S,personas:k,environments:c}),C==="graph"&&a.jsx(fC,{workspaceId:t,environmentId:ne,tasks:r,resolvedThemeId:N}),a.jsx(_s,{isOpen:A,title:"Archive Workspace?",description:"This will hide the workspace from the sidebar. Tasks will not be deleted.",confirmLabel:"Archive",onConfirm:()=>{V&&(p(V.id).catch(()=>{}),o("/",{replace:!0})),E(!1)},onCancel:()=>E(!1)})]})}const KU="_container_3pgew_1",ZU="_header_3pgew_8",YU="_headerTitle_3pgew_35",JU="_headerActions_3pgew_44",WU="_body_3pgew_51",XU="_btnPrimary_3pgew_63",QU="_btnGhost_3pgew_94",eV="_error_3pgew_116",Fa={container:KU,header:ZU,headerTitle:YU,headerActions:JU,body:WU,btnPrimary:XU,btnGhost:QU,error:eV};function tV(t){const s={};return t.name.trim()||(s.name="Name is required"),t.repoUrl.trim()&&!/^https?:\/\/.+/i.test(t.repoUrl.trim())&&(s.repoUrl="Must be a valid http(s) URL"),t.environmentId||(s.environmentId="Environment is required"),Object.keys(s).length>0?s:void 0}const nV=[{label:"Home",url:Fo},{label:"New Workspace",url:void 0}];function sV(){const[t]=Dm(),s=t.get("environment")??void 0,{environments:{environments:o},personas:{personas:r},workspaces:{createWorkspace:c,workspaceCreating:d}}=pt(),{showToast:u}=pn(),p=xt(),[m,g]=y.useState(()=>{var T;return c9(void 0,s||((T=o[0])==null?void 0:T.id))}),[v,b]=y.useState(),[_,k]=y.useState();y.useEffect(()=>{s||m.environmentId||o.length===0||g(T=>{var N;return T.environmentId?T:{...T,environmentId:((N=o[0])==null?void 0:N.id)??""}})},[o,s,m.environmentId]);const S=()=>{const T=tV(m);if(T){b(T),k(void 0);return}b(void 0),k(void 0),c(m.name.trim(),m.description,m.repoUrl.trim(),m.environmentId,m.defaultPersonaId,m.useWorktrees,m.workingDirectory,N=>{u("Workspace created","success"),p(wi(N.id,N.linkedEnvironmentIds[0]??m.environmentId),{replace:!0})},N=>{k(N)}).catch(()=>{})},j=()=>{p(s?$o(s):Fo,{replace:!0})};return a.jsxs("div",{className:Fa.container,children:[a.jsxs("div",{className:Fa.header,children:[a.jsx("div",{className:Fa.headerTitle,children:a.jsx(ha,{segments:nV})}),a.jsxs("div",{className:Fa.headerActions,children:[a.jsx("button",{className:Fa.btnGhost,onClick:j,disabled:d,"data-testid":"workspace-create-cancel",children:"Cancel"}),a.jsx("button",{className:Fa.btnPrimary,onClick:S,disabled:d||!m.name.trim()||!m.environmentId,"data-testid":"workspace-create-save",children:d?a.jsx(K1,{size:"sm",label:"Creating"}):"Create Workspace"})]})]}),a.jsxs("div",{className:Fa.body,children:[a.jsx(u9,{values:m,onChange:T=>{g(T),b(void 0),k(void 0)},environments:o,personas:r,errors:v,disabled:d,autoFocusName:!0}),_&&a.jsx("div",{className:Fa.error,"data-testid":"workspace-create-submit-error",children:_})]})]})}function T_(){const{workspaceId:t,environmentId:s}=ma(),[o]=Dm(),r=t??o.get("workspace")??"",c=o.get("parent")??void 0,{tasks:{tasks:d,createTask:u,updateTask:p},workspaces:{workspaces:m},personas:{personas:g}}=pt(),{showToast:v}=pn();return a.jsx(ok,{mode:"new",workspaceId:r,parentTaskId:c,environmentId:s,tasks:d,workspaces:m,personas:g,onCreateTask:(b,_,k,S,j,T,N,C,D,A)=>{u(b,_,k,S,j,T,N,C,D,A).catch(()=>{})},onUpdateTask:(b,_,k,S,j)=>{p(b,_,k,S,j).catch(()=>{})},onShowToast:v})}function aV(){return a.jsxs("div",{className:W.panelContainer,"aria-hidden":"true",children:[a.jsx("div",{className:W.header,children:a.jsxs("span",{className:W.headerTitle,children:[a.jsx(Te,{width:"12rem",height:"1rem"}),a.jsx(Te,{width:"4rem",height:"1rem",borderRadius:"var(--radius-full)"})]})}),a.jsxs("div",{className:W.tabBar,role:"tablist","aria-label":"Task view",children:[a.jsx("span",{className:`${W.tab} ${W.active}`,children:"Overview"}),a.jsx("span",{className:W.tab,children:"Stream"})]}),a.jsx("div",{className:W.overviewContent,children:a.jsxs("div",{className:W.overviewDashboard,children:[a.jsx("div",{className:W.overviewHero,children:a.jsx(Te,{width:"5rem",height:"1.5rem",borderRadius:"var(--radius-full)"})}),a.jsxs("div",{className:W.overviewSection,children:[a.jsx("div",{className:W.overviewLabel,children:"Description"}),a.jsx(dm,{lines:2})]}),a.jsxs("div",{className:W.overviewSection,children:[a.jsx("div",{className:W.overviewLabel,children:"Environment"}),a.jsxs("div",{className:W.envRow,children:[a.jsx(Te,{width:"0.5rem",height:"0.5rem",variant:"circular"}),a.jsx(Te,{width:"8rem",height:"0.875rem"})]})]}),a.jsxs("div",{className:W.overviewSection,children:[a.jsx("div",{className:W.overviewLabel,children:"Dependencies"}),a.jsx(dm,{lines:2})]}),a.jsxs("div",{className:W.overviewSection,children:[a.jsx("div",{className:W.overviewLabel,children:"Timeline"}),a.jsx("div",{className:W.timeline,children:Array.from({length:4},(t,s)=>a.jsxs("div",{className:W.timelineRow,children:[a.jsx(Te,{width:"4rem",height:"0.75rem"}),a.jsx(Te,{width:"10rem",height:"0.75rem"})]},s))})]})]})})]})}function Eo(){const{taskId:t,workspaceId:s,environmentId:o}=ma(),r=kh(),c=Wt(),d=xt(),{showToast:u}=pn(),{sessions:{events:p,eventsDropped:m,sessions:g,loadSessionEvents:v,taskSessions:b,loadTaskSessions:_,sendInput:k,spawn:S,kill:j},tasks:{tasks:T,tasksLoading:N,startTask:C,stopTask:D,resumeTask:A,deleteTask:E,createTask:R,updateTask:O},environments:{environments:M,provisionEnvironment:$},workspaces:{workspaces:Y},personas:{personas:V},usageCache:ne,loadUsage:le}=pt(),Z=y.useRef(void 0),se=y.useRef(void 0),H=y.useRef(void 0),B=y.useRef(void 0),F=y.useRef(void 0),ge=c.pathname.endsWith("/stream")?"stream":"overview",ee=c.pathname.endsWith("/edit"),[ce,me]=y.useState(ge),[xe,De]=y.useState(!1),[ot,bt]=y.useState(void 0),[lt,Pe]=y.useState(""),[ke,ct]=y.useState(ee),ue=y.useRef(ge),Re=y.useRef(ee),Q=T.find(we=>we.id===t),nt=(Q==null?void 0:Q.workspaceId)||void 0,re=Y.find(we=>we.id===nt);y.useEffect(()=>{ge!==ue.current&&(ue.current=ge,ge!==ce&&me(ge))},[ge,ce]),y.useEffect(()=>{ee!==Re.current&&(Re.current=ee,ee!==ke&&ct(ee))},[ee,ke]),y.useEffect(()=>{if(lt===""){if(re!=null&&re.linkedEnvironmentIds[0])Pe(re.linkedEnvironmentIds[0]);else if(M.length>0){const we=M.find(Ve=>Ve.status==="connected");Pe((we==null?void 0:we.id)??M[0].id)}}},[lt,re==null?void 0:re.linkedEnvironmentIds[0],M]);const ve=Q?b[Q.id]??[]:[];let et;ot&&ve.some(we=>we.id===ot)?et=ot:et=(Q==null?void 0:Q.latestSessionId)||void 0;const an=()=>{De(!0)},ks=()=>{if(!Q)return;E(Q.id).catch(()=>{}),De(!1);const we=o??(re==null?void 0:re.linkedEnvironmentIds[0]);d(Q.workspaceId&&we?wi(Q.workspaceId,we):"/",{replace:!0})};y.useEffect(()=>{(Q==null?void 0:Q.id)!==se.current&&(se.current=Q==null?void 0:Q.id,bt(void 0),Pe(""),ct(ee))},[Q==null?void 0:Q.id,ee]),y.useEffect(()=>{if(!(Q!=null&&Q.id))return;const we=Q.id!==B.current,Ve=Q.latestSessionId!==F.current;(we||Ve)&&(B.current=Q.id,F.current=Q.latestSessionId,_(Q.id).catch(()=>{}))},[Q==null?void 0:Q.id,Q==null?void 0:Q.latestSessionId,_]),y.useEffect(()=>{if((Q==null?void 0:Q.status)!==H.current){const we=H.current===void 0;H.current=Q==null?void 0:Q.status;const Ve=(Q==null?void 0:Q.status)==="not_started"?"overview":(Q==null?void 0:Q.status)==="working"||(Q==null?void 0:Q.status)==="paused"?"stream":(Q==null?void 0:Q.status)==="complete"?"overview":void 0;Ve&&Ve!==ce&&!(we&&ge!=="overview")&&me(Ve)}},[Q==null?void 0:Q.status,ce,ge]);const ds=y.useMemo(()=>new Map(T.map(we=>[we.id,we])),[T]),zs=y.useMemo(()=>{const we=et?p.filter(Ve=>Ve.sessionId===et):[];return xh(_h(we))},[p,et]),ga=Q?Q.dependsOn.some(we=>{const Ve=ds.get(we);return Ve!==void 0&&Ve.status!=="complete"}):!1,Oi=y.useMemo(()=>A9(t,o,Y,M,ds),[t,o,Y,M,ds]);y.useEffect(()=>{et&&et!==Z.current&&(Z.current=et,v(et).catch(()=>{}))},[et,v]);const Xt=ve.reduce((we,Ve)=>we+(Ve.costMillicents??0),0);y.useEffect(()=>{Q&&(le("task",Q.id).catch(()=>{}),Q.childTaskIds.length>0&&le("task_tree",Q.id).catch(()=>{}))},[Q==null?void 0:Q.id,Q==null?void 0:Q.childTaskIds.length,le,Xt]);const Qa=Q?`task:${Q.id}`:"",ei=Qa in ne?ne[Qa]:void 0,va=Q?`task_tree:${Q.id}`:"",$s=Q&&Q.childTaskIds.length>0&&va in ne?ne[va]:void 0,Ss=we=>{me(we),d(ls(t,we==="overview"?void 0:we,s,o))};return Za({key:"1"},()=>Ss("overview")),Za({key:"2"},()=>Ss("stream")),!Q&&N?a.jsx(aV,{}):a.jsxs("div",{className:W.panelContainer,children:[a.jsx(ha,{segments:Oi}),a.jsxs("div",{className:W.header,children:[a.jsxs("span",{className:W.headerTitle,children:[a.jsx("span",{"data-testid":"task-title",children:(Q==null?void 0:Q.title)||t}),Q&&a.jsx("span",{className:W.taskStatusBadge,"data-testid":"task-status",children:Q.status}),(Q==null?void 0:Q.branch)&&a.jsx("span",{className:W.taskBranch,children:Q.branch}),ga&&a.jsx("span",{className:W.taskBlockedBadge,children:"blocked"})]}),Q&&a.jsx(_L,{task:Q,sessionId:et,isBlocked:ga,onStart:()=>{C(Q.id,void 0,lt).catch(we=>{const Ve=we instanceof da?we.message:"Failed to start task";u(Ve,"error")})},onResume:()=>{A(Q.id).catch(()=>{})},onStop:()=>{D(Q.id).catch(()=>{})},onPause:()=>{et&&j(et).catch(()=>{})},onDelete:an,onEdit:()=>ct(!0)})]}),a.jsxs("div",{className:W.tabBar,role:"tablist","aria-label":"Task view",children:[a.jsx("button",{role:"tab","aria-selected":ce==="overview",className:`${W.tab} ${ce==="overview"?W.active:""}`,onClick:()=>Ss("overview"),children:"Overview"}),a.jsx("button",{role:"tab","aria-selected":ce==="stream",className:`${W.tab} ${ce==="stream"?W.active:""}`,onClick:()=>Ss("stream"),children:"Stream"})]}),a.jsxs(os,{mode:"wait",children:[ce==="overview"&&a.jsx(Pt.div,{initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},className:W.overviewContent,"data-testid":"task-overview",children:ke&&Q?a.jsx(ok,{mode:"edit",taskId:Q.id,workspaceId:nt,environmentId:o,tasks:T,workspaces:Y,personas:V,onCreateTask:(we,Ve,_n,mn,Ut,Cn,Qt,Bi,Li,zi)=>{R(we,Ve,_n,mn,Ut,Cn,Qt,Bi,Li,zi).catch(()=>{})},onUpdateTask:(we,Ve,_n,mn,Ut)=>{O(we,Ve,_n,mn,Ut).catch(()=>{})},onEditDone:()=>{ee?d(ls(Q.id,void 0,s,o),{replace:!0}):ct(!1)},onShowToast:u}):Q?a.jsx(r8,{task:Q,tasksById:ds,environments:M,workspaces:Y,taskSessions:ve,selectedEnvId:lt,taskUsage:ei,treeUsage:$s}):a.jsx("div",{className:W.waitingMessage,children:"No additional details"})},"overview"),ce==="stream"&&a.jsxs(Pt.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:[a.jsx(C6,{taskSessions:ve,selectedSessionId:et,onSelect:we=>bt(we)}),a.jsx(mh,{events:zs,eventsDropped:m,sandboxProxyUrl:r,emptyState:!et&&Q?ga?a.jsx("div",{className:W.emptyCta,"data-testid":"stream-blocked-message",children:a.jsx("div",{className:W.ctaDescription,children:"This task is blocked by incomplete dependencies"})}):a.jsxs("div",{className:W.emptyCta,children:[a.jsx("button",{"data-testid":"stream-start-cta",className:W.ctaButton,onClick:()=>{C(Q.id,void 0,lt).catch(we=>{const Ve=we instanceof da?we.message:"Failed to start task";u(Ve,"error")})},children:"Start Task"}),a.jsx("div",{className:W.ctaDescription,children:"Click to begin agent execution"})]}):et&&zs.length===0?a.jsx("div",{className:W.waitingMessage,children:"Waiting for events..."}):void 0,onShowToast:u})]},"stream")]}),(()=>{if(!Q||Q.status!=="working"&&Q.status!=="paused")return;const we=et?g.find(Ve=>Ve.id===et):void 0;if(!(!we||we.status==="stopped"))return a.jsx(Sd,{mode:"send",sessionId:we.id,environmentId:we.environmentId,personas:V,environments:M,onSendInput:(Ve,_n)=>{k(Ve,_n).catch(()=>{u("Failed to send message","error")})},onSpawn:(Ve,_n,mn)=>{S(Ve,_n,mn,void 0,nt).catch(()=>{})},onStartTask:(Ve,_n,mn)=>{C(Ve,_n,mn).catch(()=>{})},onProvisionEnvironment:Ve=>{$(Ve).catch(()=>{})},onShowToast:u})})(),Q&&a.jsx(_s,{isOpen:xe,title:"Delete Task?",description:`"${Q.title}" will be permanently removed.`,onConfirm:ks,onCancel:()=>De(!1)})]})}function iV(){const{environments:{environments:t,addEnvironment:s,updateEnvironment:o},codespaces:{codespaces:r,codespaceError:c,codespaceListError:d,codespaceCreating:u,listCodespaces:p,createCodespace:m},dockerContainers:{dockerContainers:g,dockerContainersError:v,listDockerContainers:b},githubAccounts:{githubAccounts:_}}=pt(),{showToast:k}=pn();return a.jsx(rk,{mode:"new",environments:t,githubAccounts:_,onAddEnvironment:(S,j,T,N)=>{s(S,j,T,N).catch(()=>{})},onUpdateEnvironment:(S,j)=>{o(S,j).catch(()=>{})},onListCodespaces:S=>{p(S).catch(()=>{})},codespaces:r,codespaceError:c,codespaceListError:d,codespaceCreating:u,onCreateCodespace:(S,j)=>{m(S,j).catch(()=>{})},onListDockerContainers:()=>{b().catch(()=>{})},dockerContainers:g,dockerContainersError:v,onShowToast:k})}function oV(){const{environmentId:t}=ma(),{environments:{environments:s,addEnvironment:o,updateEnvironment:r},codespaces:{codespaces:c,codespaceError:d,codespaceListError:u,codespaceCreating:p,listCodespaces:m,createCodespace:g},dockerContainers:{dockerContainers:v,dockerContainersError:b,listDockerContainers:_},githubAccounts:{githubAccounts:k}}=pt(),{showToast:S}=pn();return a.jsx(rk,{mode:"edit",environmentId:t,environments:s,githubAccounts:k,onAddEnvironment:(j,T,N,C)=>{o(j,T,N,C).catch(()=>{})},onUpdateEnvironment:(j,T)=>{r(j,T).catch(()=>{})},onListCodespaces:j=>{m(j).catch(()=>{})},codespaces:c,codespaceError:d,codespaceListError:u,codespaceCreating:p,onCreateCodespace:(j,T)=>{g(j,T).catch(()=>{})},onListDockerContainers:()=>{_().catch(()=>{})},dockerContainers:v,dockerContainersError:b,onShowToast:S})}const rV="_layout_11u79_1",lV="_content_11u79_8",cV="_tabPanel_11u79_14",sl={layout:rV,content:lV,tabPanel:cV};function dV(){const t=N9();return a.jsxs("div",{className:sl.layout,children:[a.jsx(ha,{segments:t}),a.jsx("div",{className:sl.content,children:a.jsx(Mi,{})})]})}const uV="_container_144a4_1",fV="_envHeader_144a4_6",pV="_envTitleRow_144a4_10",mV="_statusDot_144a4_16",hV="_envName_144a4_21",gV="_statusBadge_144a4_27",vV="_envMeta_144a4_33",yV="_metaTag_144a4_39",bV="_actions_144a4_51",_V="_provisionMessage_144a4_59",xV="_errorMessage_144a4_64",kV="_section_144a4_69",SV="_sectionHeader_144a4_73",jV="_cardList_144a4_121",TV="_card_144a4_121",NV="_cardHeader_144a4_138",wV="_cardName_144a4_144",CV="_cardActions_144a4_149",EV="_cardDescription_144a4_154",AV="_cardMeta_144a4_160",DV="_repoLink_144a4_166",MV="_empty_144a4_174",RV="_errorHint_144a4_180",IV="_btnPrimary_144a4_186",OV="_btnOutline_144a4_220",BV="_btnSmall_144a4_247",LV="_btnDanger_144a4_273",Me={container:uV,envHeader:fV,envTitleRow:pV,statusDot:mV,envName:hV,statusBadge:gV,envMeta:vV,metaTag:yV,actions:bV,provisionMessage:_V,errorMessage:xV,section:kV,sectionHeader:SV,cardList:jV,card:TV,cardHeader:NV,cardName:wV,cardActions:CV,cardDescription:EV,cardMeta:AV,repoLink:DV,empty:MV,errorHint:RV,btnPrimary:IV,btnOutline:OV,btnSmall:BV,btnDanger:LV};function zV(){return a.jsxs("div",{className:Me.container,"aria-hidden":"true",children:[a.jsxs("div",{className:Me.envHeader,children:[a.jsxs("div",{className:Me.envTitleRow,children:[a.jsx(Te,{width:"0.875rem",height:"0.875rem",variant:"circular"}),a.jsx(Te,{width:"12rem",height:"1.5rem"}),a.jsx(Te,{width:"4rem",height:"0.875rem"})]}),a.jsxs("div",{className:Me.envMeta,children:[a.jsx(Te,{width:"6rem",height:"1.25rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"5rem",height:"1.25rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"4.5rem",height:"1.25rem",borderRadius:"var(--radius-sm)"})]})]}),a.jsxs("div",{className:Me.actions,children:[a.jsx(Te,{width:"5rem",height:"2rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"4rem",height:"2rem",borderRadius:"var(--radius-sm)"})]}),a.jsxs("div",{className:Me.section,children:[a.jsx("div",{className:Me.sectionHeader,children:a.jsx("h3",{style:{margin:0},children:"Workspaces"})}),a.jsxs("div",{className:Me.cardList,children:[a.jsx(um,{lines:2}),a.jsx(um,{lines:2})]})]})]})}const $V={connected:"var(--accent-green)",sleeping:"var(--accent-yellow)",error:"var(--accent-red)",disconnected:"var(--text-tertiary)",connecting:"var(--accent-blue)"};function HV(){const{environmentId:t}=ma(),s=xt(),{environments:{environments:o,environmentsLoading:r,provisionStatus:c,provisionEnvironment:d,stopEnvironment:u,removeEnvironment:p},workspaces:{workspaces:m,archiveWorkspace:g,linkEnvironment:v,unlinkEnvironment:b,linkOperationError:_,clearLinkOperationError:k},sessions:{sessions:S}}=pt(),[j,T]=y.useState(!1),[N,C]=y.useState(!1),[D,A]=y.useState(void 0),E=o.find(B=>B.id===t);if(!E&&r)return a.jsx(zV,{});if(!t||!E)return a.jsx($n,{to:zo,replace:!0});const R=m.filter(B=>B.linkedEnvironmentIds.includes(E.id)),O=S.filter(B=>B.environmentId===E.id),M=O.reduce((B,F)=>B+(F.costMillicents??0),0),$=$V[E.status]||"var(--text-tertiary)",Y=E.status==="connected",V=E.status==="connecting",ne=E.status==="disconnected"||E.status==="error"||E.status==="sleeping",le=E.id in c?c[E.id]:void 0,Z=()=>{p(E.id).catch(()=>{}),T(!1),s(zo,{replace:!0})},se=()=>{C(!1),d(E.id,!0).catch(()=>{})},H=B=>{g(B).catch(()=>{}),A(void 0)};return a.jsxs("div",{className:Me.container,children:[a.jsx(_s,{isOpen:j,title:"Delete Environment?",description:`"${E.displayName||E.id}" will be permanently removed along with all its data.`,onConfirm:Z,onCancel:()=>T(!1)}),a.jsx(_s,{isOpen:N,title:"Reprovision Environment?",description:"This will kill any active session and force a fresh provision cycle. The environment will be temporarily disconnected.",confirmLabel:"Reprovision",onConfirm:se,onCancel:()=>C(!1)}),a.jsxs("div",{className:Me.envHeader,children:[a.jsxs("div",{className:Me.envTitleRow,children:[a.jsx("span",{className:Me.statusDot,style:{color:$},children:"●"}),a.jsx("h2",{className:Me.envName,children:E.displayName||E.id}),a.jsx("span",{className:Me.statusBadge,style:{color:$},children:E.status})]}),a.jsxs("div",{className:Me.envMeta,children:[a.jsxs("span",{className:Me.metaTag,children:["Adapter: ",E.adapterType]}),O.length>0&&a.jsxs("span",{className:Me.metaTag,children:[O.length," session",O.length!==1?"s":""]}),M>0&&a.jsxs("span",{className:Me.metaTag,children:["Cost: ",Rs(M)]})]})]}),a.jsxs("div",{className:Me.actions,children:[Y&&a.jsxs(a.Fragment,{children:[a.jsx("button",{className:Me.btnPrimary,onClick:()=>s(dx(E.id)),children:"New Chat"}),a.jsx("button",{className:Me.btnOutline,onClick:()=>{u(E.id).catch(()=>{})},children:"Stop"}),a.jsx("button",{className:Me.btnOutline,onClick:()=>C(!0),disabled:le!==void 0,"data-testid":"env-reprovision-btn",children:"Reprovision"})]}),ne&&a.jsx("button",{className:Me.btnPrimary,onClick:()=>{d(E.id).catch(()=>{})},children:E.status==="error"?"Retry":E.status==="sleeping"?"Wake":"Connect"}),V&&le!==void 0&&a.jsx("span",{className:Me.provisionMessage,children:le.message}),E.status==="error"&&(le==null?void 0:le.stage)==="error"&&a.jsx("span",{className:Me.errorMessage,children:le.message}),a.jsx("button",{className:Me.btnOutline,onClick:()=>s(nC(E.id)),"data-testid":"env-edit-btn",children:"Edit Config"}),a.jsx("button",{className:Me.btnDanger,onClick:()=>T(!0),children:"Delete"})]}),a.jsxs("div",{className:Me.section,children:[a.jsxs("div",{className:Me.sectionHeader,children:[a.jsx("h3",{children:"Workspaces"}),a.jsx("button",{className:Me.btnPrimary,onClick:()=>s(`${mx}?environment=${encodeURIComponent(E.id)}`),"data-testid":"workspace-create-button",children:"+ New Workspace"}),(()=>{const B=m.filter(F=>!F.linkedEnvironmentIds.includes(E.id)&&F.status==="active");return B.length===0?null:a.jsxs("select",{className:Me.btnPrimary,value:"",onChange:F=>{F.target.value&&v(F.target.value,E.id).catch(()=>{})},"aria-label":"Link a workspace","data-testid":"link-workspace-select",children:[a.jsx("option",{value:"",children:"+ Link Workspace"}),B.map(F=>a.jsx("option",{value:F.id,children:F.name},F.id))]})})()]}),_&&a.jsxs("p",{className:Me.errorHint,"data-testid":"link-operation-error",role:"alert",children:[_,a.jsx("button",{className:Me.btnSmall,onClick:k,"aria-label":"Dismiss error","data-testid":"dismiss-link-error",children:"Dismiss"})]}),R.length===0&&a.jsx("p",{className:Me.empty,"data-testid":"linked-workspaces-empty",children:"No workspaces yet. Create one to get started."}),a.jsx("div",{className:Me.cardList,"data-testid":"linked-workspaces-list",children:R.map(B=>a.jsx(PV,{workspace:B,confirmArchiveId:D,onOpen:()=>s(wi(B.id,E.id)),onArchive:()=>A(B.id),onConfirmArchive:()=>H(B.id),onCancelArchive:()=>A(void 0),onUnlink:()=>{b(B.id,E.id).catch(()=>{})}},B.id))})]})]})}function PV({workspace:t,confirmArchiveId:s,onOpen:o,onArchive:r,onConfirmArchive:c,onCancelArchive:d,onUnlink:u}){const p=s===t.id,m=t.repoUrl&&/^https?:\/\//.test(t.repoUrl);return a.jsxs("div",{className:Me.card,"data-testid":"workspace-card","data-workspace-id":t.id,children:[a.jsxs("div",{className:Me.cardHeader,children:[a.jsx("strong",{className:Me.cardName,children:t.name}),a.jsxs("div",{className:Me.cardActions,children:[a.jsx("button",{className:Me.btnSmall,onClick:o,children:"Open"}),a.jsx("button",{className:Me.btnSmall,onClick:u,disabled:t.linkedEnvironmentIds.length<=1,"data-testid":`unlink-workspace-${t.id}`,children:"Unlink"}),p?a.jsxs(a.Fragment,{children:[a.jsx("button",{className:Me.btnDanger,onClick:c,children:"Confirm"}),a.jsx("button",{className:Me.btnSmall,onClick:d,children:"Cancel"})]}):a.jsx("button",{className:Me.btnSmall,onClick:r,children:"Archive"})]})]}),t.description&&a.jsx("p",{className:Me.cardDescription,children:t.description}),t.repoUrl&&a.jsx("div",{className:Me.cardMeta,children:m?a.jsx("a",{href:t.repoUrl,target:"_blank",rel:"noopener noreferrer",className:Me.repoLink,children:t.repoUrl}):a.jsx("span",{children:t.repoUrl})})]})}const UV={credentials:"Credentials","github-accounts":"GitHub Accounts",personas:"Personas",schedules:"Schedules",appearance:"Appearance",about:"About",shortcuts:"Shortcuts",plugins:"Plugins"};function VV(){const s=Wt().pathname.replace(/^\/settings\/?/,"").split("/")[0],o=UV[s],r=T9(o);return a.jsxs("div",{className:sl.layout,children:[a.jsx(ha,{segments:r}),a.jsx("div",{className:sl.content,children:a.jsx("div",{className:sl.tabPanel,children:a.jsx(Mi,{})},s)})]})}function qV(){const{tokens:{tokens:t,setToken:s,deleteToken:o},credentials:{credentialProviders:r,updateCredentialProviders:c}}=pt(),{showToast:d}=pn();return a.jsxs(a.Fragment,{children:[a.jsx(H8,{credentialProviders:r,onUpdateCredentialProviders:u=>{c(u).catch(()=>{})}}),a.jsx(qB,{tokens:t,onSetToken:(u,p,m,g,v)=>{s(u,p,m,g,v).catch(()=>{})},onDeleteToken:u=>{o(u).catch(()=>{})},onShowToast:d})]})}function GV(){const{githubAccounts:{githubAccounts:t,githubAccountsLoading:s,addGitHubAccount:o,updateGitHubAccount:r,removeGitHubAccount:c,importGitHubAccounts:d}}=pt(),{showToast:u}=pn();return a.jsx(c8,{githubAccounts:t,githubAccountsLoading:s,onAddGitHubAccount:o,onUpdateGitHubAccount:r,onRemoveGitHubAccount:c,onImportGitHubAccounts:d,onShowToast:u})}function FV(){const{personas:{personas:t,deletePersona:s},appDefaultPersonaId:o,setAppDefaultPersonaId:r}=pt(),{showToast:c}=pn(),d=xt();return a.jsx(Q8,{personas:t,appDefaultPersonaId:o,onDeletePersona:async u=>{try{await s(u)}catch(p){throw console.error("Failed to delete persona",{personaId:u,error:p}),c("Failed to delete persona","error"),p}},onSetAppDefaultPersonaId:async u=>{try{await r(u)}catch(p){console.error("Failed to set app default persona ID",{personaId:u,error:p}),c("Failed to set app default persona","error")}},onNavigateToNew:()=>d(aC),onNavigateToPersona:u=>d(ux(u))})}const KV="_container_1ooin_1",ZV="_form_1ooin_7",YV="_formActions_1ooin_75",JV="_editableSection_1ooin_82",WV="_defaultBadge_1ooin_93",XV="_typeToggle_1ooin_107",QV="_scriptEditor_1ooin_121",eq="_optional_1ooin_128",vs={container:KV,form:ZV,formActions:YV,editableSection:JV,defaultBadge:WV,typeToggle:XV,scriptEditor:QV,optional:eq},N_=[{value:"claude-code",label:"claude-code"},{value:"codex",label:"codex"},{value:"copilot",label:"copilot"},{value:"goose",label:"goose"},{value:"stub",label:"stub"},{value:"claude-code-acp",label:"claude-code-acp (experimental)"},{value:"codex-acp",label:"codex-acp (experimental)"},{value:"copilot-acp",label:"copilot-acp (experimental)"}],w_=[{value:"genaiscript",label:"genaiscript"}],tq="0";function C_(){const{personaId:t}=ma(),s=xt(),{showToast:o}=pn(),{personas:{personas:r,createPersona:c,updatePersona:d,deletePersona:u},appDefaultPersonaId:p,setAppDefaultPersonaId:m}=pt(),g=t===void 0,v=g?void 0:r.find(_=>_.id===t);if(!g&&r.length>0&&!v)return a.jsx($n,{to:tp,replace:!0});const b=[{label:"Settings",url:ji},{label:"Personas",url:tp},{label:g?"New Persona":(v==null?void 0:v.name)??"Persona",url:void 0}];return a.jsxs("div",{className:vs.container,children:[a.jsx(ha,{segments:b}),a.jsx(nq,{existing:v,isNew:g,appDefaultPersonaId:p,onCreatePersona:c,onUpdatePersona:d,onDeletePersona:u,onSetAppDefaultPersonaId:m,onDone:()=>{s(tp)},showToast:o})]})}function nq({existing:t,isNew:s,appDefaultPersonaId:o,onCreatePersona:r,onUpdatePersona:c,onDeletePersona:d,onSetAppDefaultPersonaId:u,onDone:p,showToast:m}){const g=xt(),[v,b]=y.useState((t==null?void 0:t.name)??""),[_,k]=y.useState((t==null?void 0:t.description)??""),[S,j]=y.useState((t==null?void 0:t.systemPrompt)??""),[T,N]=y.useState((t==null?void 0:t.runtime)??"claude-code"),[C,D]=y.useState((t==null?void 0:t.model)??"sonnet"),[A,E]=y.useState((t==null?void 0:t.maxTurns)??0),[R,O]=y.useState((t==null?void 0:t.type)==="script"?"script":"agent"),[M,$]=y.useState((t==null?void 0:t.script)??""),[Y,V]=y.useState((t==null?void 0:t.allowedMcpTools)??[]),[ne,le]=y.useState(!1),[Z,se]=y.useState(null),[H,B]=y.useState(!!s);y.useEffect(()=>{if(!s&&t&&!H){B(!0),b(t.name),k(t.description),j(t.systemPrompt);const ue=t.type==="script"?"script":"agent";N(ue==="script"?t.runtime||"genaiscript":t.runtime),D(t.model),E(t.maxTurns),O(ue),$(t.script||""),V(t.allowedMcpTools)}},[s,t,H]);const F=ue=>{O(ue),ue==="script"?N("genaiscript"):T==="genaiscript"&&N("claude-code")},ge=!s&&t===void 0,ee=v.trim().length>0&&!ge&&S.trim().length>0&&(R==="script"?M.trim().length>0:!!T&&!!C),ce=s&&ee,me=!s&&o===(t==null?void 0:t.id),xe=!s&&t&&!me&&R==="agent"&&!!T&&!!C,De=(ue,Re)=>{if(!ue.trim())return`${Re} is required`},ot=ue=>{if(ue.preventDefault(),!(ge||!ee)){if(t){c(t.id,v,_,S,T,C,A,R,M).then(()=>{m("Persona updated","success"),p()},()=>{m("Failed to save persona","error")});return}r(v,_,S,T,C,A,R,M,Y).then(Re=>{m("Persona created","success"),g(ux(Re.id),{replace:!0})},()=>{m("Failed to save persona","error")})}},bt=()=>{t&&d(t.id).then(()=>{m("Persona deleted","success"),p()},()=>{m("Failed to delete persona","error")})},lt=async(ue,Re,Q,nt)=>ue().then(()=>{Re(),m(Q,"success")},()=>{m(nt,"error")}),Pe=(ue,Re)=>{if(!t)return;const Q=ue==="type"?String(Re):R,nt=ue==="runtime"?String(Re):ue==="type"?String(Re)==="script"?"genaiscript":T==="genaiscript"?"claude-code":T:T,re=ue==="model"?String(Re):C,ve=ue==="maxTurns"?Number(Re):A,et=ue==="systemPrompt"?String(Re):S,an=ue==="script"?String(Re):M;lt(()=>c(t.id,ue==="name"?String(Re):v,ue==="description"?String(Re):_,et,nt,re,ve,Q,an),()=>{if(ue==="type"){const ks=String(Re)==="script"?"script":"agent";O(ks),N(nt)}ue==="runtime"&&N(String(Re)),ue==="name"&&b(String(Re)),ue==="description"&&k(String(Re)),ue==="systemPrompt"&&j(String(Re)),ue==="model"&&D(String(Re)),ue==="maxTurns"&&E(Number(Re)),ue==="script"&&$(String(Re))},"Persona updated","Failed to update persona").catch(()=>{})},ke=ue=>{ot(ue)},ct=()=>{t&&u(t.id).then(()=>{m("Set as app default","success")},()=>{m("Failed to set app default","error")})};return a.jsxs(a.Fragment,{children:[ge?a.jsxs("div",{className:vs.form,children:[a.jsx("h3",{children:"Edit Persona"}),a.jsx("p",{children:"Loading persona..."})]}):s?a.jsxs("form",{onSubmit:ke,className:vs.form,children:[a.jsx("h3",{children:"Create Persona"}),a.jsxs("div",{className:vs.typeToggle,"data-testid":"persona-type-toggle",children:[a.jsxs("label",{children:[a.jsx("input",{type:"radio",name:"personaType",value:"agent",checked:R==="agent",onChange:()=>F("agent")}),"Agent"]}),a.jsxs("label",{children:[a.jsx("input",{type:"radio",name:"personaType",value:"script",checked:R==="script",onChange:()=>F("script")}),"Script"]})]}),a.jsxs("label",{children:["Name",a.jsx("input",{type:"text",value:v,onChange:ue=>b(ue.target.value),placeholder:R==="script"?"e.g. Nightly Report":"e.g. Frontend Engineer",required:!0,"data-testid":"persona-detail-name"})]}),a.jsxs("label",{children:["Description",a.jsx("input",{type:"text",value:_,onChange:ue=>k(ue.target.value),placeholder:"Brief description...","data-testid":"persona-detail-description"})]}),a.jsxs("label",{children:["Runtime",a.jsx("select",{value:T,onChange:ue=>N(ue.target.value),"data-testid":"persona-runtime-select",children:(R==="script"?w_:N_).map(ue=>a.jsx("option",{value:ue.value,children:ue.label},ue.value))})]}),R==="agent"&&a.jsxs(a.Fragment,{children:[a.jsxs("label",{children:["Model",a.jsx("input",{type:"text",value:C,onChange:ue=>D(ue.target.value),placeholder:"e.g. sonnet","data-testid":"persona-detail-model"})]}),a.jsxs("label",{children:["Max Turns",a.jsx("input",{type:"number",value:A,onChange:ue=>E(parseInt(ue.target.value,10)||0),min:0,"data-testid":"persona-detail-max-turns"})]}),a.jsxs("label",{children:["System Prompt",a.jsx("textarea",{value:S,onChange:ue=>j(ue.target.value),placeholder:"You are a senior frontend engineer...",rows:10,required:!0,"data-testid":"persona-detail-prompt"})]})]}),R==="script"&&a.jsxs(a.Fragment,{children:[a.jsxs("label",{children:["Model ",a.jsx("span",{className:vs.optional,children:"(optional)"}),a.jsx("input",{type:"text",value:C,onChange:ue=>D(ue.target.value),placeholder:"e.g. sonnet (leave empty for script-only)","data-testid":"persona-detail-model"})]}),a.jsxs("label",{children:["System Prompt",a.jsx("textarea",{value:S,onChange:ue=>j(ue.target.value),placeholder:"Context for the script...",rows:4,required:!0,"data-testid":"persona-detail-prompt"})]}),a.jsxs("label",{children:["Script",a.jsx("textarea",{value:M,onChange:ue=>$(ue.target.value),placeholder:`script({ model: "openai:gpt-4o" });
741
+ src/utils/token-refresh.ts:28: const remaining = decoded.exp - Date.now() / 1000;`,raw:JSON.stringify({tool_use_id:"tool-mock-004",is_error:!1})}},{delayMs:7800,event:{eventType:"text",timestamp:Oe(7800),content:"Fixed. The token expiry comparison was inverted — `decoded.exp > Date.now()` should have been `<` (a token is expired when its `exp` is in the past). The other occurrence in `token-refresh.ts` uses subtraction (not comparison), so it was already correct. All 3 auth tests pass."}},{delayMs:8400,event:{eventType:"usage",timestamp:Oe(8400),content:JSON.stringify({input_tokens:42600,output_tokens:1850,cost_millicents:12e3})}},{delayMs:8800,event:{eventType:"status",timestamp:Oe(8800),content:"completed"}}]}],ss={onConnect:async()=>{},onDisconnect:()=>{},handleEvent:()=>!1};function h_(t){return t?p_:p_.filter(s=>!I7.some(o=>s.name.startsWith(o)))}const g_=400;function F9({children:t}){const[s,o]=y.useState(z9),[r,c]=y.useState($9),[d,u]=y.useState(()=>h_(!1)),[p,m]=y.useState(H9),[g,v]=y.useState(void 0),[b,_]=y.useState(P9),[k,S]=y.useState(""),[j,T]=y.useState(U9),[N,C]=y.useState(V9),[D,A]=y.useState({claude:"off",github:"off",copilot:"off",codex:"off",goose:"off"}),[E,R]=y.useState(q9),[O,M]=y.useState([]),[$]=y.useState(G9),[Y,V]=y.useState(""),[ne,le]=y.useState(Ds),[Z,se]=y.useState(Ga),[H,B]=y.useState(void 0),[F,ge]=y.useState(void 0),[ee,ce]=y.useState(""),me=y.useRef(void 0),xe=y.useRef(0),De=y.useRef(0),ot=y.useRef(new Set),bt=y.useRef(new Map),lt=y.useRef(j);lt.current=j;const Pe=y.useRef(new Map),ke=y.useRef(new Map),ct=y.useCallback(U=>(xe.current+=1,`mock-${U}-${String(xe.current).padStart(3,"0")}`),[]),ue=y.useCallback(()=>{const U=m_[De.current%m_.length];return De.current+=1,U},[]),Re=y.useCallback((U,ae,de)=>{const pe=setTimeout(()=>{var ye;ot.current.delete(pe),de&&((ye=bt.current.get(de))==null||ye.delete(pe)),U()},ae);ot.current.add(pe),de&&(bt.current.has(de)||bt.current.set(de,new Set),bt.current.get(de).add(pe))},[]),Q=y.useCallback(U=>{const ae=bt.current.get(U);ae&&(ae.forEach(de=>{clearTimeout(de),ot.current.delete(de)}),bt.current.delete(U))},[]),nt=y.useCallback((U,ae,de)=>{c(pe=>pe.map(ye=>ye.id===U?{...ye,status:ae,...de!==void 0?{endReason:de}:{}}:ye))},[]),re=y.useCallback(U=>{m(ae=>[...ae,U])},[]),ve=y.useCallback((U,ae,de)=>{ae.forEach((pe,ye)=>{Re(()=>{const tt={sessionId:U,...pe.event,timestamp:new Date().toISOString()};if(re(tt),pe.event.eventType==="status"){const je=xk(pe.event.content),Le=kk(pe.event.content);nt(U,je,Le)}ye===ae.length-1&&de&&de()},pe.delayMs,U)})},[Re,re,nt]),et=y.useCallback(async(U,ae,de,pe)=>{console.log("[MockGrackle] spawn",{environmentId:U,prompt:ae,runtime:pe});const ye=ct("sess"),tt={id:ye,environmentId:U,runtime:pe||"claude-code",status:"running",prompt:ae,startedAt:new Date().toISOString()};c(Le=>[...Le,tt]),v(ye);const je=ue();if(console.log(`[MockGrackle] Playing scenario: ${je.label}`),je.pauseForInput){const Le=je.pauseAfterStep??je.steps.length-1,Ue=je.steps.slice(0,Le+1),Dt=Ue.length>0?Ue[Ue.length-1].delayMs:0;ve(ye,Ue),Re(()=>{nt(ye,"idle"),re({sessionId:ye,eventType:"status",timestamp:new Date().toISOString(),content:"idle"})},Dt+g_,ye),je.resumeSteps&&Pe.current.set(ye,je.resumeSteps)}else ve(ye,je.steps)},[ct,ue,ve,Re,nt,re]),an=y.useCallback(async U=>{console.log("[MockGrackle] kill",U),Q(U),Pe.current.delete(U),nt(U,"stopped","killed"),re({sessionId:U,eventType:"status",timestamp:new Date().toISOString(),content:"killed"}),T(ae=>ae.map(de=>de.latestSessionId===U&&de.status==="working"?{...de,status:"not_started"}:de))},[Q,nt,re]),ks=y.useCallback(async U=>{console.log("[MockGrackle] stopGraceful",U),Q(U),Pe.current.delete(U),nt(U,"stopped","terminated"),re({sessionId:U,eventType:"status",timestamp:new Date().toISOString(),content:"terminated"}),T(ae=>ae.map(de=>de.latestSessionId===U&&de.status==="working"?{...de,status:"not_started"}:de))},[Q,nt,re]),ds=y.useCallback(()=>{console.log("[MockGrackle] refresh")},[]),zs=y.useCallback(async U=>{console.log("[MockGrackle] loadSessionEvents",U)},[]),ga=y.useCallback(()=>{console.log("[MockGrackle] clearEvents"),m([])},[]),Oi=y.useCallback(async(U,ae,de,pe,ye,tt,je,Le,Ue)=>{console.log("[MockGrackle] createWorkspace",{name:U,description:ae});const Dt={id:ct("proj"),name:U,description:ae||"",repoUrl:de||"",linkedEnvironmentIds:pe?[pe]:[],status:"active",workingDirectory:je||"",useWorktrees:tt??!0,defaultPersonaId:ye||"",tokenBudget:0,costBudgetMillicents:0,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};_(qe=>[...qe,Dt]),Le&&Le(Dt)},[ct]),Xt=y.useCallback(async U=>{console.log("[MockGrackle] archiveWorkspace",U),_(ae=>ae.map(de=>de.id===U?{...de,status:"archived"}:de))},[]),Qa=y.useCallback(async U=>{console.log("[MockGrackle] loadTasks",U)},[]),ei=y.useCallback(async(U,ae,de,pe,ye,tt,je,Le,Ue,Dt)=>{console.log("[MockGrackle] createTask",{workspaceId:U,title:ae,parentTaskId:ye}),T(qe=>{const En=qe.filter(Ts=>Ts.workspaceId===U).reduce((Ts,Ns)=>Math.max(Ts,Ns.sortOrder),0),_t=ye?qe.find(Ts=>Ts.id===ye):void 0;if(ye&&!_t)return console.warn("[MockGrackle] Parent task not found:",ye),qe;if(_t&&!_t.canDecompose)return console.warn("[MockGrackle] Parent task does not have decomposition rights:",ye),qe;const js=_t?_t.depth+1:0,Hi={id:ct("task"),workspaceId:U,title:ae,description:de||"",status:"not_started",branch:"",latestSessionId:"",dependsOn:pe||[],reviewNotes:void 0,sortOrder:En+1,createdAt:new Date().toISOString(),parentTaskId:ye||"",depth:js,childTaskIds:[],canDecompose:je??!ye,injectKnowledge:Le??!0,defaultPersonaId:tt||"",workpad:"",tokenBudget:0,costBudgetMillicents:0};return[...qe,Hi]}),Ue&&Ue()},[ct]),va=y.useCallback(async(U,ae,de,pe)=>{var Dt;console.log("[MockGrackle] startTask",{taskId:U});const ye=lt.current.find(qe=>qe.id===U),tt=(ye==null?void 0:ye.title)??"",je=ct("sess"),Le={id:je,environmentId:"env-local-01",runtime:"claude-code",status:"running",prompt:tt||U,startedAt:new Date().toISOString()};c(qe=>[...qe,Le]),T(qe=>qe.map(on=>on.id===U?{...on,status:"working",latestSessionId:je,branch:`mock/${U.slice(0,8)}`}:on));const Ue=ue();if(console.log(`[MockGrackle] Playing task scenario: ${Ue.label}`),Ue.pauseForInput){const qe=Ue.pauseAfterStep??Ue.steps.length-1,on=Ue.steps.slice(0,qe+1),En=on.length>0?on[on.length-1].delayMs:0;if(ve(je,on),Re(()=>{nt(je,"idle"),re({sessionId:je,eventType:"status",timestamp:new Date().toISOString(),content:"idle"})},En+g_,je),Ue.resumeSteps){const _t=[...Ue.resumeSteps];Pe.current.set(je,_t);const js=_t.reduce((Hi,Ts)=>Math.max(Hi,Ts.delayMs),0);ke.current.set(je,{taskId:U,delayAfterResume:js+200})}}else{const qe=Ue.steps.length>0?Ue.steps[Ue.steps.length-1].delayMs:0;ve(je,Ue.steps);const on=(Dt=Ue.steps[Ue.steps.length-1])==null?void 0:Dt.event.content;Re(()=>{on==="completed"?T(En=>En.map(_t=>_t.id===U&&_t.status==="working"?{..._t,status:"paused"}:_t)):on==="failed"&&T(En=>En.map(_t=>_t.id===U&&_t.status==="working"?{..._t,status:"failed"}:_t))},qe+100,je)}},[ct,ue,ve,Re,nt,re]),$s=y.useCallback(async(U,ae)=>{console.log("[MockGrackle] sendInput",{sessionId:U,text:ae}),re({sessionId:U,eventType:"output",timestamp:new Date().toISOString(),content:`User input: ${ae}`}),nt(U,"running"),re({sessionId:U,eventType:"status",timestamp:new Date().toISOString(),content:"running"});const de=Pe.current.get(U);if(de)Pe.current.delete(U),ve(U,de);else{const ye=[{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"}}];ve(U,ye)}const pe=ke.current.get(U);pe&&(ke.current.delete(U),Re(()=>{T(ye=>ye.map(tt=>tt.id===pe.taskId&&tt.status==="working"?{...tt,status:"paused"}:tt))},pe.delayAfterResume,U))},[re,nt,ve,Re]),Ss=y.useCallback(async U=>{console.log("[MockGrackle] completeTask",U),T(ae=>ae.map(de=>de.id===U?{...de,status:"complete"}:de))},[]),we=y.useCallback(async U=>{console.log("[MockGrackle] resumeTask",U)},[]),Ve=y.useCallback(async(U,ae,de,pe,ye)=>{console.log("[MockGrackle] updateTask",{taskId:U,title:ae}),T(tt=>tt.map(je=>je.id===U?{...je,title:ae.trim()||je.title,description:de,dependsOn:pe,...ye!==void 0?{defaultPersonaId:ye}:{}}:je))},[]),_n=y.useCallback(async U=>{console.log("[MockGrackle] deleteTask",U),T(ae=>ae.filter(de=>de.id!==U))},[]),mn=y.useCallback(async()=>{console.log("[MockGrackle] loadEnvironments")},[]),Ut=y.useCallback(async(U,ae,de)=>{console.log("[MockGrackle] addEnvironment",{displayName:U,adapterType:ae,adapterConfig:de})},[]),Cn=y.useCallback(async(U,ae)=>{console.log("[MockGrackle] updateEnvironment",{environmentId:U,...ae}),o(de=>de.map(pe=>pe.id!==U?pe:{...pe,...ae.displayName!==void 0?{displayName:ae.displayName}:{},...ae.adapterConfig!==void 0?{adapterConfig:JSON.stringify(ae.adapterConfig)}:{}}))},[]),Qt=y.useCallback(async()=>{console.log("[MockGrackle] loadTokens")},[]),Bi=y.useCallback(async(U,ae,de,pe,ye)=>{console.log("[MockGrackle] setToken",{name:U,tokenType:de}),C(tt=>[...tt.filter(Le=>Le.name!==U),{name:U,tokenType:de,envVar:pe,filePath:ye,expiresAt:""}])},[]),Li=y.useCallback(async U=>{console.log("[MockGrackle] deleteToken",U),C(ae=>ae.filter(de=>de.name!==U))},[]),zi=y.useCallback(async U=>{console.log("[MockGrackle] updateCredentialProviders",U),A(U)},[]);y.useEffect(()=>()=>{ot.current.forEach(clearTimeout),ot.current.clear()},[]);const $i=y.useMemo(()=>({connectionStatus:"connected",environments:{environments:s,environmentsLoading:!1,provisionStatus:{},operationError:"",clearOperationError:()=>{},loadEnvironments:mn,addEnvironment:Ut,updateEnvironment:Cn,provisionEnvironment:async(U,ae)=>{},stopEnvironment:async()=>{},removeEnvironment:async()=>{},domainHook:ss},sessions:{sessions:r,sessionsLoading:!1,events:p,eventsDropped:0,lastSpawnedId:g,taskSessions:$,spawn:et,sendInput:$s,kill:an,stopGraceful:ks,loadSessionEvents:zs,clearEvents:ga,loadTaskSessions:async U=>{console.log("[MockGrackle] loadTaskSessions",U)},domainHook:ss},workspaces:{workspaces:b,workspacesLoading:!1,workspaceCreating:!1,loadWorkspaces:async()=>{console.log("[MockGrackle] loadWorkspaces")},createWorkspace:Oi,archiveWorkspace:Xt,updateWorkspace:async(U,ae)=>{console.log("[MockGrackle] updateWorkspace",{workspaceId:U,...ae}),_(de=>de.map(pe=>pe.id!==U?pe:{...pe,...ae.name!==void 0?{name:ae.name}:{},...ae.description!==void 0?{description:ae.description}:{},...ae.repoUrl!==void 0?{repoUrl:ae.repoUrl}:{},...ae.environmentId!==void 0?{environmentId:ae.environmentId}:{},...ae.workingDirectory!==void 0?{workingDirectory:ae.workingDirectory}:{},...ae.useWorktrees!==void 0?{useWorktrees:ae.useWorktrees}:{},...ae.defaultPersonaId!==void 0?{defaultPersonaId:ae.defaultPersonaId}:{},updatedAt:new Date().toISOString()}))},linkEnvironment:async(U,ae)=>{if(console.log("[MockGrackle] linkEnvironment",{workspaceId:U,environmentId:ae}),ae==="error-env"){S("Failed to link environment");return}S(""),_(de=>de.map(pe=>pe.id!==U||pe.linkedEnvironmentIds.includes(ae)?pe:{...pe,linkedEnvironmentIds:[...pe.linkedEnvironmentIds,ae]}))},unlinkEnvironment:async(U,ae)=>{if(console.log("[MockGrackle] unlinkEnvironment",{workspaceId:U,environmentId:ae}),ae==="error-env"){S("Failed to unlink environment");return}S(""),_(de=>de.map(pe=>pe.id!==U?pe:{...pe,linkedEnvironmentIds:pe.linkedEnvironmentIds.filter(ye=>ye!==ae)}))},linkOperationError:k,clearLinkOperationError:()=>{S("")},domainHook:ss},tasks:{tasks:j,tasksLoading:!1,taskStartingId:void 0,loadTasks:Qa,loadAllTasks:async()=>{console.log("[MockGrackle] loadAllTasks")},createTask:ei,startTask:va,stopTask:async U=>{console.log("[MockGrackle] stopTask",{taskId:U}),await Ss(U)},completeTask:Ss,resumeTask:we,updateTask:Ve,deleteTask:_n,domainHook:ss},tokens:{tokens:N,tokensLoading:!1,loadTokens:Qt,setToken:Bi,deleteToken:Li,domainHook:ss},credentials:{credentialProviders:D,credentialsLoading:!1,updateCredentialProviders:zi,domainHook:ss},codespaces:{codespaces:[],codespaceError:"",codespaceListError:"",codespaceCreating:!1,listCodespaces:async()=>{},createCodespace:async()=>{},domainHook:ss},dockerContainers:{dockerContainers:[],dockerContainersError:"",listDockerContainers:async()=>{},domainHook:ss},personas:{personas:E,personasLoading:!1,createPersona:async(U,ae,de,pe,ye,tt,je,Le,Ue)=>{console.log("[MockGrackle] createPersona",{name:U});const Dt={id:`mock-persona-${Date.now()}`,name:U,description:ae,systemPrompt:de,toolConfig:"{}",runtime:pe??"claude-code",model:ye||"",maxTurns:tt||0,mcpServers:"[]",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),type:je||"agent",script:Le||"",allowedMcpTools:Ue||[]};return R(qe=>[...qe,Dt]),Dt},updatePersona:async(U,ae,de,pe,ye,tt,je,Le,Ue,Dt)=>{console.log("[MockGrackle] updatePersona",{personaId:U,name:ae});const qe=E.find(_t=>_t.id===U);if(!qe)throw new Error(`Persona not found: ${U}`);const on=new Date().toISOString(),En={...qe,...ae!==void 0?{name:ae}:{},...de!==void 0?{description:de}:{},...pe!==void 0?{systemPrompt:pe}:{},...ye!==void 0?{runtime:ye}:{},...tt!==void 0?{model:tt}:{},...je!==void 0?{maxTurns:je}:{},...Le!==void 0?{type:Le}:{},...Ue!==void 0?{script:Ue}:{},...Dt!==void 0?{allowedMcpTools:Dt}:{},updatedAt:on};return R(_t=>_t.map(js=>js.id===U?En:js)),En},deletePersona:async U=>{console.log("[MockGrackle] deletePersona",U),R(ae=>ae.filter(de=>de.id!==U))},domainHook:ss},schedules:{schedules:O,schedulesLoading:!1,createSchedule:async(U,ae,de,pe,ye)=>{console.log("[MockGrackle] createSchedule",{title:U});const tt={id:`mock-schedule-${Date.now()}`,title:U,description:ae,scheduleExpression:de,personaId:pe,workspaceId:ye??"",parentTaskId:"",enabled:!0,lastRunAt:"",nextRunAt:new Date(Date.now()+6e4).toISOString(),runCount:0,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return M(je=>[...je,tt]),tt},updateSchedule:async(U,ae)=>{console.log("[MockGrackle] updateSchedule",{scheduleId:U,fields:ae});let de;if(M(pe=>pe.map(ye=>ye.id!==U?ye:(de={...ye,...ae,updatedAt:new Date().toISOString()},de))),!de)throw new Error(`Schedule not found: ${U}`);return de},deleteSchedule:async U=>{console.log("[MockGrackle] deleteSchedule",U),M(ae=>ae.filter(de=>de.id!==U))},domainHook:ss},streams:{streams:d,streamsLoading:!1,streamsLoadedOnce:!0,streamsLoadError:!1,loadStreams:async(U=!1)=>{u(h_(U))},liveMessages:L9,loadTranscript:async()=>{},handleStreamMessage:()=>{},domainHook:ss},knowledge:{graphData:{nodes:ne,links:Z},selectedNode:H,loading:!1,selectedId:F,searchQuery:ee,search:async U=>{if(console.log("[MockGrackle] knowledge.search",U),!U.trim()){ce(U);return}ce(U);const ae=me.current,de=ae?Ds.filter(je=>!je.workspaceId||je.workspaceId===ae):Ds,pe=U.toLowerCase(),ye=de.filter(je=>{var Le,Ue,Dt;return je.label.toLowerCase().includes(pe)||((Le=je.content)==null?void 0:Le.toLowerCase().includes(pe))||((Ue=je.tags)==null?void 0:Ue.some(qe=>qe.toLowerCase().includes(pe)))||((Dt=je.category)==null?void 0:Dt.toLowerCase().includes(pe))});le(ye);const tt=new Set(ye.map(je=>je.id));se(Ga.filter(je=>tt.has(je.source)&&tt.has(je.target))),ge(void 0),B(void 0)},clearSearch:()=>{console.log("[MockGrackle] knowledge.clearSearch"),ce("");const U=me.current,ae=U?Ds.filter(pe=>!pe.workspaceId||pe.workspaceId===U):Ds;le(ae);const de=new Set(ae.map(pe=>pe.id));se(Ga.filter(pe=>de.has(pe.source)&&de.has(pe.target)))},selectNode:async U=>{console.log("[MockGrackle] knowledge.selectNode",U),ge(U);const ae=U in f_?f_[U]:void 0;if(ae)B(ae);else{const de=Ds.find(pe=>pe.id===U);if(de){const pe=Ga.filter(ye=>ye.source===U||ye.target===U).map(ye=>({fromId:ye.source,toId:ye.target,type:ye.type}));B({node:de,edges:pe})}}},clearSelection:()=>{console.log("[MockGrackle] knowledge.clearSelection"),ge(void 0),B(void 0)},expandNode:async U=>{console.log("[MockGrackle] knowledge.expandNode",U),le(ae=>{const de=new Set(ae.map(Le=>Le.id)),pe=Ga.filter(Le=>Le.source===U||Le.target===U),ye=new Set;for(const Le of pe)de.has(Le.source)||ye.add(Le.source),de.has(Le.target)||ye.add(Le.target);if(ye.size===0)return ae;const tt=Ds.filter(Le=>ye.has(Le.id)),je=new Set([...de,...ye]);return se(Le=>{const Ue=new Set(Le.map(qe=>`${qe.source}|${qe.target}|${qe.type}`)),Dt=Ga.filter(qe=>je.has(qe.source)&&je.has(qe.target)&&!Ue.has(`${qe.source}|${qe.target}|${qe.type}`));return Dt.length>0?[...Le,...Dt]:Le}),[...ae,...tt]})},loadRecent:async U=>{if(console.log("[MockGrackle] knowledge.loadRecent",U),me.current=U,U){const ae=Ds.filter(pe=>!pe.workspaceId||pe.workspaceId===U);le(ae);const de=new Set(ae.map(pe=>pe.id));se(Ga.filter(pe=>de.has(pe.source)&&de.has(pe.target)))}else le(Ds),se(Ga);ce("")},handleEvent:()=>!1,domainHook:ss},githubAccounts:{githubAccounts:[],githubAccountsLoading:!1,loadGitHubAccounts:async()=>{console.log("[MockGrackle] loadGitHubAccounts")},addGitHubAccount:async(U,ae,de,pe)=>{console.log("[MockGrackle] addGitHubAccount",U)},updateGitHubAccount:async(U,ae)=>{console.log("[MockGrackle] updateGitHubAccount",U,ae)},removeGitHubAccount:async U=>{console.log("[MockGrackle] removeGitHubAccount",U)},importGitHubAccounts:async()=>(console.log("[MockGrackle] importGitHubAccounts"),{imported:0,usernames:[]})},plugins:{plugins:[{name:"core",description:"Core infrastructure",enabled:!0,required:!0,loaded:!0},{name:"orchestration",description:"Task orchestration",enabled:!0,required:!1,loaded:!0},{name:"scheduling",description:"Scheduled triggers",enabled:!0,required:!1,loaded:!0},{name:"knowledge",description:"Knowledge graph",enabled:!1,required:!1,loaded:!1}],pluginsLoading:!1,loadPlugins:async()=>{console.log("[MockGrackle] loadPlugins")},setPluginEnabled:async(U,ae)=>{console.log("[MockGrackle] setPluginEnabled",U,ae)}},appDefaultPersonaId:Y,setAppDefaultPersonaId:async U=>{console.log("[MockGrackle] setAppDefaultPersonaId",U),V(U)},onboardingCompleted:!0,completeOnboarding:async()=>{console.log("[MockGrackle] completeOnboarding")},usageCache:{"workspace:proj-alpha":{inputTokens:214500,outputTokens:44850,costMillicents:112e3,sessionCount:4},"workspace:proj-beta":{inputTokens:86700,outputTokens:23800,costMillicents:48e3,sessionCount:3},"task:task-001":{inputTokens:126800,outputTokens:20850,costMillicents:63e3,sessionCount:2},"task:task-006":{inputTokens:18900,outputTokens:4500,costMillicents:1e4,sessionCount:1},"task_tree:task-001":{inputTokens:126800,outputTokens:20850,costMillicents:63e3,sessionCount:2},"task_tree:task-006":{inputTokens:18900,outputTokens:4500,costMillicents:1e4,sessionCount:1}},loadUsage:async(U,ae)=>{console.log(`[MockGrackle] loadUsage(${U}, ${ae})`)},refresh:ds}),[s,r,d,p,g,$,b,k,j,N,D,E,O,Y,ne,Z,H,F,ee,et,$s,an,ks,zs,ga,Oi,Xt,Qa,ei,va,Ss,we,Ve,_n,mn,Ut,Cn,Qt,Bi,Li,zi,ds]);return a.jsx(bh.Provider,{value:$i,children:t})}const Tk=3e3,K9=Tk;function Z9(t){const[s,o]=y.useState("connecting"),r=y.useRef(t.onSessionEvent);r.current=t.onSessionEvent;const c=y.useRef(t.onDomainEvent);c.current=t.onDomainEvent;const d=y.useRef(t.onStreamMessage);d.current=t.onStreamMessage;const u=y.useRef(t.onConnect);u.current=t.onConnect;const p=y.useRef(t.onDisconnect);return p.current=t.onDisconnect,y.useEffect(()=>{let m=!1,g,v;async function b(){var S,j,T;if(m)return;Promise.resolve((S=u.current)==null?void 0:S.call(u)).catch(()=>{});let _=!1;const k=()=>{!_&&!m&&(_=!0,o("connected"))};v=setTimeout(k,K9);try{const N=Be.streamEvents({});for await(const C of N){if(k(),m)break;const D=C.event;if(D.case==="sessionEvent"){const A=D.value;r.current({sessionId:A.sessionId,type:A.type,timestamp:A.timestamp,content:A.content,raw:A.raw,toolCallId:A.toolCallId})}else if(D.case==="domainEvent"){const A=D.value;c.current({id:A.id,type:A.type,timestamp:A.timestamp,payloadJson:A.payloadJson})}else if(D.case==="streamMessageEvent"){const A=D.value;(j=d.current)==null||j.call(d,{streamId:A.streamId,seq:A.seq,senderId:A.senderId,content:A.content,timestamp:A.timestamp})}}}catch(N){if(clearTimeout(v),N instanceof da&&N.code===$_.Unauthenticated){window.location.href=rC;return}}clearTimeout(v),m||(o("connecting"),(T=p.current)==null||T.call(p),g=setTimeout(()=>{b().catch(()=>{})},Tk))}return b().catch(()=>{}),()=>{m=!0,clearTimeout(g),clearTimeout(v)}},[]),{connectionStatus:s}}const bm=["core","orchestration","scheduling"],Nk=y.createContext({pluginNames:[...bm],sandboxPort:void 0,sandboxOrigin:void 0,loading:!1,error:void 0});function Y9({children:t}){const[s,o]=y.useState([...bm]),[r,c]=y.useState(void 0),[d,u]=y.useState(void 0),[p,m]=y.useState(!0),[g,v]=y.useState(void 0);return y.useEffect(()=>{let b=!1;return fetch("/api/manifest").then(async _=>{if(!_.ok)throw new Error(`Manifest fetch returned ${_.status}`);return _.json()}).then(_=>{b||(o(_.plugins.map(k=>k.name)),c(_.sandboxPort),u(_.sandboxOrigin),m(!1))}).catch(_=>{b||(o([...bm]),v(_ instanceof Error?_:new Error(String(_))),m(!1))}),()=>{b=!0}},[]),a.jsx(Nk.Provider,{value:{pluginNames:s,sandboxPort:r,sandboxOrigin:d,loading:p,error:g},children:t})}function Bd(){return y.useContext(Nk)}function kh(){const{sandboxPort:t,sandboxOrigin:s}=Bd();if(typeof window>"u")return;if(s!==void 0&&s!=="")try{return new URL("/sandbox.html",s).toString()}catch{}if(t===void 0)return;const o=new URL(window.location.origin);return o.port=String(t),o.pathname="/sandbox.html",o.toString()}const J9=new Set(["dashboard","chat","environments","coordination","settings"]),W9=new Set(["tasks"]),X9=new Set(["knowledge"]),wk={core:{navItems:ad.filter(t=>J9.has(t.view)),domainHookKeys:["environments","sessions","workspaces","tokens","credentials","codespaces","dockerContainers","streams","plugins"]},orchestration:{navItems:ad.filter(t=>W9.has(t.view)),domainHookKeys:["tasks","personas","notifications"]},scheduling:{navItems:[],domainHookKeys:["schedules"]},knowledge:{navItems:ad.filter(t=>X9.has(t.view)),domainHookKeys:["knowledge"]}};function Q9(t){return t.flatMap(s=>{var o;return((o=wk[s])==null?void 0:o.navItems)??[]})}function eH(t){return new Set(t.flatMap(s=>{var o;return((o=wk[s])==null?void 0:o.domainHookKeys)??[]}))}function tH(t){return{id:t.id,displayName:t.displayName,adapterType:t.adapterType,adapterConfig:t.adapterConfig||"{}",status:t.status,bootstrapped:t.bootstrapped,githubAccountId:t.githubAccountId||""}}function v_(t){return{id:t.id,environmentId:t.environmentId,runtime:t.runtime,status:t.status,prompt:t.prompt,startedAt:t.startedAt,endedAt:t.endedAt||void 0,error:t.error||void 0,endReason:t.endReason||void 0,personaId:t.personaId||void 0,taskId:t.taskId||void 0,inputTokens:t.inputTokens,outputTokens:t.outputTokens,costMillicents:t.costMillicents}}function nH(t){return{sessionId:t.sessionId,eventType:H_(t.type),timestamp:t.timestamp,content:t.content,raw:t.raw||void 0,toolCallId:t.toolCallId||void 0}}function y_(t){return{id:t.id,name:t.name,description:t.description,repoUrl:t.repoUrl,linkedEnvironmentIds:[...t.linkedEnvironmentIds],status:tj(t.status),workingDirectory:t.workingDirectory,useWorktrees:t.useWorktrees,defaultPersonaId:t.defaultPersonaId,tokenBudget:t.tokenBudget,costBudgetMillicents:t.costBudgetMillicents,createdAt:t.createdAt,updatedAt:t.updatedAt}}function b_(t){return{id:t.id,workspaceId:t.workspaceId??void 0,title:t.title,description:t.description,status:nj(t.status),branch:t.branch,latestSessionId:t.latestSessionId,dependsOn:[...t.dependsOn],sortOrder:t.sortOrder,createdAt:t.createdAt,startedAt:t.startedAt||void 0,completedAt:t.completedAt||void 0,parentTaskId:t.parentTaskId,depth:t.depth,childTaskIds:[...t.childTaskIds],canDecompose:t.canDecompose,injectKnowledge:t.injectKnowledge,defaultPersonaId:t.defaultPersonaId,workpad:t.workpad,tokenBudget:t.tokenBudget,costBudgetMillicents:t.costBudgetMillicents}}function sH(t){return{name:t.name,tokenType:t.type,envVar:t.envVar,filePath:t.filePath,expiresAt:t.expiresAt}}function aH(t){return{claude:sj(t.claude),github:Rc(t.github),copilot:Rc(t.copilot),codex:Rc(t.codex),goose:Rc(t.goose)}}function iH(t){return{name:t.name,repository:t.repository,state:t.state,gitStatus:t.gitStatus}}function oH(t){return{id:t.id,name:t.name,image:t.image,state:t.state,status:t.status}}function Bp(t){return{id:t.id,name:t.name,description:t.description,systemPrompt:t.systemPrompt,toolConfig:t.toolConfig?JSON.stringify({allowedTools:[...t.toolConfig.allowedTools],disallowedTools:[...t.toolConfig.disallowedTools]}):"{}",runtime:t.runtime,model:t.model,maxTurns:t.maxTurns,mcpServers:JSON.stringify(t.mcpServers.map(s=>({name:s.name,command:s.command,args:[...s.args],tools:[...s.tools]}))),createdAt:t.createdAt,updatedAt:t.updatedAt,type:t.type||"agent",script:t.script,allowedMcpTools:[...t.allowedMcpTools]}}function rH(t){return{inputTokens:t.inputTokens,outputTokens:t.outputTokens,costMillicents:t.costMillicents,sessionCount:t.sessionCount}}function Lp(t){return{id:t.id,title:t.title,description:t.description,scheduleExpression:t.scheduleExpression,personaId:t.personaId,workspaceId:t.workspaceId,parentTaskId:t.parentTaskId,enabled:t.enabled,lastRunAt:t.lastRunAt,nextRunAt:t.nextRunAt,runCount:t.runCount,createdAt:t.createdAt,updatedAt:t.updatedAt}}function Yc(t,s=0){return{id:t.id,label:t.title||t.label||t.id,kind:t.kind,category:t.category||void 0,sourceType:t.sourceType||void 0,sourceId:t.sourceId||void 0,content:t.content||void 0,tags:t.tags.length>0?[...t.tags]:void 0,workspaceId:t.workspaceId||void 0,createdAt:t.createdAt||void 0,updatedAt:t.updatedAt||void 0,val:s}}function zp(t){return{source:t.fromId,target:t.toId,type:t.type}}function lH(t){return{subscriptionId:t.subscriptionId,sessionId:t.sessionId,fd:t.fd,permission:t.permission,deliveryMode:t.deliveryMode,createdBySpawn:t.createdBySpawn}}function cH(t){return{id:t.id,name:t.name,subscriberCount:t.subscriberCount,messageBufferDepth:t.messageBufferDepth,subscribers:t.subscribers.map(lH),selfEcho:t.selfEcho}}function xs(){const[t,s]=y.useState(!1),o=y.useRef(0),r=y.useCallback(c=>(o.current++,o.current===1&&s(!0),c.finally(()=>{o.current--,o.current===0&&s(!1)})),[]);return{loading:t,track:r}}const __=5e3;function Fr(t){return t instanceof da?t.message:"Operation failed"}function dH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),[c,d]=y.useState({}),[u,p]=y.useState(""),m=y.useCallback(()=>{p("")},[]),g=y.useCallback(async()=>{try{const C=await r(Be.listEnvironments({}));s(C.environments.map(tH))}catch{}},[r]),v=y.useCallback(C=>{switch(C.type){case"environment.added":return!0;case"environment.removed":{const D=C.payload.environmentId;return D&&(s(A=>A.filter(E=>E.id!==D)),d(A=>{const E={...A};return delete E[D],E})),!0}case"environment.changed":return g().catch(()=>{}),!0;case"environment.provision_progress":{const D=C.payload;if(typeof D.environmentId!="string"||typeof D.stage!="string"||typeof D.message!="string"||typeof D.progress!="number")return _k("environment.provision_progress","invalid payload"),!0;if(d(A=>({...A,[D.environmentId]:{stage:D.stage,message:D.message,progress:D.progress}})),D.stage==="ready"){const A=D.environmentId;setTimeout(()=>{d(E=>{const R={...E};return delete R[A],R})},__)}return!0}default:return!1}},[g]),b=y.useCallback(C=>{var D;if(C.type==="environments"){const A=Array.isArray((D=C.payload)==null?void 0:D.environments)?C.payload.environments:[];return s(A),!0}return!1},[]),_=y.useCallback(async(C,D,A,E)=>{p("");try{await Be.addEnvironment({displayName:C,adapterType:D,adapterConfig:JSON.stringify(A??{}),githubAccountId:E??""})}catch(R){p(Fr(R))}},[]),k=y.useCallback(async(C,D)=>{p("");try{await Be.updateEnvironment({id:C,displayName:D.displayName,adapterConfig:D.adapterConfig?JSON.stringify(D.adapterConfig):void 0,githubAccountId:D.githubAccountId})}catch(A){p(Fr(A))}},[]),S=y.useCallback(async(C,D)=>{p("");try{const A=Be.provisionEnvironment({id:C,force:D??!1});for await(const E of A)d(R=>({...R,[C]:{stage:E.stage,message:E.message,progress:E.progress}})),E.stage==="ready"&&setTimeout(()=>{d(R=>{const O={...R};return delete O[C],O})},__)}catch(A){d(E=>{const R={...E};return delete R[C],R}),p(Fr(A))}},[]),j=y.useCallback(async C=>{p("");try{await Be.stopEnvironment({id:C})}catch(D){p(Fr(D))}},[]),T=y.useCallback(async C=>{p("");try{await Be.removeEnvironment({id:C})}catch(D){p(Fr(D))}},[]);return{environments:t,environmentsLoading:o,provisionStatus:c,operationError:u,clearOperationError:m,loadEnvironments:g,addEnvironment:_,updateEnvironment:k,provisionEnvironment:S,stopEnvironment:j,removeEnvironment:T,handleEvent:v,handleLegacyMessage:b,domainHook:{onConnect:()=>g(),onDisconnect:()=>{},handleEvent:v}}}const $p=new Set(["pending","running","idle"]),uH=new Set(["completed","failed","interrupted","hibernating","suspended"]),x_=["pending","running","idle"];function fH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),[c,d]=y.useState([]),[u,p]=y.useState(0),[m,g]=y.useState(void 0),[v,b]=y.useState({}),_=y.useCallback(async()=>{try{const $=(await r(Be.listSessions({}))).sessions.map(v_);s(Y=>{const V=new Map(Y.map(ne=>[ne.id,ne]));return $.map(ne=>{const le=V.get(ne.id),Z=le==null?void 0:le.status;return!Z||Z===ne.status?ne:uH.has(Z)&&$p.has(ne.status)?{...ne,status:Z,...le.endReason!==void 0?{endReason:le.endReason}:{}}:$p.has(Z)&&$p.has(ne.status)&&x_.indexOf(Z)>x_.indexOf(ne.status)?{...ne,status:Z}:ne})})}catch{}},[r]),k=y.useCallback(M=>{if(M.type!=="session_event")return!1;if(!x9(M.payload))return _k("session_event","payload is not a valid SessionEvent"),!0;const $=M.payload;let Y=0;if(d(V=>{const ne=[...V,$];return ne.length>Co?(Y=ne.length-Co,ne.slice(-Co)):ne}),Y>0&&p(V=>V+Y),$.eventType==="usage")try{const V=JSON.parse($.content),ne=Number(V.input_tokens)||0,le=Number(V.output_tokens)||0,Z=Number(V.cost_millicents)||0;(ne>0||le>0||Z>0)&&s(se=>se.map(H=>H.id===$.sessionId?{...H,inputTokens:(H.inputTokens??0)+ne,outputTokens:(H.outputTokens??0)+le,costMillicents:(H.costMillicents??0)+Z}:H))}catch{}if($.eventType==="status"){const V=xk($.content),ne=kk($.content);s(le=>le.some(se=>se.id===$.sessionId)?le.map(se=>se.id===$.sessionId?{...se,status:V,...ne!==void 0?{endReason:ne}:{}}:se):[...le,{id:$.sessionId,environmentId:"",runtime:"",status:V,prompt:"",startedAt:$.timestamp,...ne!==void 0?{endReason:ne}:{}}])}return!0},[]),S=y.useCallback(M=>{k({type:"session_event",payload:M})},[k]),j=y.useCallback(M=>{var $,Y,V,ne,le;switch(M.type){case"sessions":{const Z=Array.isArray(($=M.payload)==null?void 0:$.sessions)?M.payload.sessions:[];return s(Z),!0}case"spawned":{const Z=(Y=M.payload)==null?void 0:Y.sessionId;return typeof Z=="string"&&Z&&g(Z),_().catch(()=>{}),!0}case"session_events":{const Z=Array.isArray((V=M.payload)==null?void 0:V.events)?M.payload.events:[];return Z.length>0&&d(Z),!0}case"task_sessions":{const Z=(ne=M.payload)==null?void 0:ne.taskId;if(typeof Z=="string"&&Z){const se=Array.isArray((le=M.payload)==null?void 0:le.sessions)?M.payload.sessions:[];b(H=>({...H,[Z]:se}))}return!0}default:return!1}},[_]),T=y.useCallback(async(M,$,Y,V,ne)=>{try{const le=await Be.spawnAgent({environmentId:M,prompt:$,config:{personaId:Y||"",workingDirectory:V||"",workspaceId:ne||""}});g(le.id),await _()}catch{}},[_]),N=y.useCallback(async(M,$)=>{await Be.sendInput({sessionId:M,text:$})},[]),C=y.useCallback(async M=>{try{await Be.killAgent({id:M,graceful:!1})}catch{}},[]),D=y.useCallback(async M=>{try{await Be.killAgent({id:M,graceful:!0})}catch{}},[]),A=y.useCallback(async M=>{try{const Y=(await Be.getSessionEvents({id:M})).events.map(nH);if(Y.length>0){let V=0;d(ne=>{const le=new Set;for(const H of ne)H.sessionId===M&&le.add(`${H.timestamp}|${H.eventType}`);const Z=Y.filter(H=>!le.has(`${H.timestamp}|${H.eventType}`)),se=[...ne,...Z].sort((H,B)=>H.sessionId!==B.sessionId?0:H.timestamp.localeCompare(B.timestamp));return se.length>Co?(V=se.length-Co,se.slice(-Co)):se}),V>0&&p(ne=>ne+V)}}catch{}},[]),E=y.useCallback(()=>{d([]),p(0)},[]),R=y.useCallback(async M=>{try{const Y=(await Be.getTaskSessions({id:M})).sessions.map(v_);b(V=>({...V,[M]:Y}))}catch{}},[]);return{sessions:t,sessionsLoading:o,events:c,eventsDropped:u,lastSpawnedId:m,taskSessions:v,loadSessions:_,spawn:T,sendInput:N,kill:C,stopGraceful:D,loadSessionEvents:A,clearEvents:E,loadTaskSessions:R,handleMessage:k,handleSessionEvent:S,handleLegacyMessage:j,domainHook:{onConnect:()=>_(),onDisconnect:()=>{E()},handleEvent:()=>!1}}}function k_(t){return t instanceof da?t.message:"Operation failed"}function pH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),[c,d]=y.useState(!1),[u,p]=y.useState(""),m=y.useCallback(async()=>{try{const C=await r(Be.listWorkspaces({}));s(C.workspaces.map(y_))}catch{}},[r]),g=y.useCallback(C=>{switch(C.type){case"workspace.created":return d(!1),m().catch(()=>{}),!0;case"workspace.archived":case"workspace.updated":return m().catch(()=>{}),!0;default:return!1}},[m]),v=y.useCallback(()=>{d(!1)},[]),b=y.useCallback(async(C,D,A,E,R,O,M,$,Y)=>{d(!0);try{const V=await Be.createWorkspace({name:C,description:D||"",repoUrl:A||"",environmentId:E||"",defaultPersonaId:R||void 0,useWorktrees:O??!0,workingDirectory:M||void 0}),ne=y_(V);s(le=>le.some(Z=>Z.id===ne.id)?le:[...le,ne]),d(!1),$==null||$(ne)}catch(V){d(!1);const ne=V instanceof da?V.message:"Failed to create workspace";Y==null||Y(ne)}},[]),_=y.useCallback(async C=>{try{await Be.archiveWorkspace({id:C})}catch{}},[]),k=y.useCallback(async(C,D)=>{try{await Be.updateWorkspace({id:C,...D})}catch{}},[]),S=y.useCallback(()=>{p("")},[]),j=y.useCallback(async(C,D)=>{try{p(""),await Be.linkEnvironment({workspaceId:C,environmentId:D}),await m().catch(()=>{})}catch(A){p(k_(A))}},[m]),T=y.useCallback(async(C,D)=>{try{p(""),await Be.unlinkEnvironment({workspaceId:C,environmentId:D}),await m().catch(()=>{})}catch(A){p(k_(A))}},[m]);return{workspaces:t,workspacesLoading:o,workspaceCreating:c,loadWorkspaces:m,createWorkspace:b,archiveWorkspace:_,updateWorkspace:k,linkEnvironment:j,unlinkEnvironment:T,linkOperationError:u,clearLinkOperationError:S,handleEvent:g,onDisconnect:v,domainHook:{onConnect:()=>m(),onDisconnect:v,handleEvent:g}}}function mH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),[c,d]=y.useState(void 0),u=y.useRef({}),p=y.useCallback(async E=>{try{const O=(await zn.listTasks({workspaceId:E})).tasks.map(b_);s(M=>[...M.filter($=>$.workspaceId!==E),...O])}catch{}},[]),m=y.useCallback(async()=>{try{const R=(await r(zn.listTasks({}))).tasks.map(b_);s(O=>{const M=new Set(R.map($=>$.id));return[...O.filter($=>!M.has($.id)),...R]})}catch{}},[r]),g=y.useCallback((E,R)=>{const O=M=>{clearTimeout(u.current[M]),u.current[M]=setTimeout(()=>{delete u.current[M],p(M).catch(()=>{})},200)};E?O(E):R&&s(M=>{const $=M.find(Y=>Y.id===R);return $!=null&&$.workspaceId?O($.workspaceId):m().catch(()=>{}),M})},[p,m]),v=y.useCallback(E=>{const R=E.payload;switch(E.type){case"task.created":{const O=typeof R.workspaceId=="string"?R.workspaceId:"";return O&&p(O).catch(()=>{}),!0}case"task.started":{const O=typeof R.taskId=="string"?R.taskId:"",M=typeof R.sessionId=="string"?R.sessionId:"",$=typeof R.workspaceId=="string"?R.workspaceId:"";return d(Y=>O&&Y===O?void 0:Y),M&&O&&s(Y=>Y.map(V=>V.id===O?{...V,latestSessionId:M}:V)),g($,O),!0}case"task.completed":case"task.deleted":case"task.reparented":case"task.updated":{const O=typeof R.workspaceId=="string"?R.workspaceId:"",M=typeof R.taskId=="string"?R.taskId:"";return d($=>M&&$===M?void 0:$),g(O,M),!0}default:return!1}},[p,g]),b=y.useCallback(()=>{d(void 0)},[]),_=y.useCallback(E=>{var R,O;if(E.type==="tasks"){const M=Array.isArray((R=E.payload)==null?void 0:R.tasks)?E.payload.tasks:[],$=typeof((O=E.payload)==null?void 0:O.workspaceId)=="string"&&E.payload.workspaceId?E.payload.workspaceId:"";return s($?Y=>[...Y.filter(V=>V.workspaceId!==$),...M]:Y=>{const V=new Set(M.map(ne=>ne.id));return[...Y.filter(ne=>!V.has(ne.id)),...M]}),!0}return!1},[]),k=y.useCallback(async(E,R,O,M,$,Y,V,ne,le,Z)=>{try{await zn.createTask({workspaceId:E,title:R,description:O||"",dependsOn:M||[],parentTaskId:$||"",defaultPersonaId:Y||void 0,canDecompose:V??void 0,injectKnowledge:ne??void 0}),le==null||le()}catch(se){const H=se instanceof da?se.message:"Failed to create task";Z==null||Z(H)}},[]),S=y.useCallback(async(E,R,O,M)=>{d(E);try{await zn.startTask({taskId:E,personaId:R||"",environmentId:O||"",notes:M||""})}catch($){if($ instanceof da&&$.code===$_.ResourceExhausted)return;throw d(void 0),$}},[]),j=y.useCallback(async E=>{try{await zn.stopTask({id:E})}catch{}},[]),T=y.useCallback(async E=>{try{await zn.completeTask({id:E})}catch{}},[]),N=y.useCallback(async E=>{try{await zn.resumeTask({id:E})}catch{}},[]),C=y.useCallback(async(E,R,O,M,$)=>{try{await zn.updateTask({id:E,title:R,description:O,dependsOn:M,...$!==void 0?{defaultPersonaId:$}:{}})}catch{}},[]),D=y.useCallback(async E=>{try{await zn.deleteTask({id:E})}catch{}},[]);return{tasks:t,tasksLoading:o,taskStartingId:c,loadTasks:p,loadAllTasks:m,createTask:k,startTask:S,stopTask:j,completeTask:T,resumeTask:N,updateTask:C,deleteTask:D,handleEvent:v,onDisconnect:b,handleLegacyMessage:_,domainHook:{onConnect:()=>m(),onDisconnect:b,handleEvent:v}}}function hH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),c=y.useCallback(async()=>{try{const g=await r(Be.listTokens({}));s(g.tokens.map(sH))}catch{}},[r]),d=y.useCallback(g=>g.type==="token.changed"?(c().catch(()=>{}),!0):!1,[c]),u=y.useCallback(async(g,v,b,_,k)=>{try{await Be.setToken({name:g,value:v,type:b,envVar:_,filePath:k})}catch{}},[]),p=y.useCallback(async g=>{try{await Be.deleteToken({name:g})}catch{}},[]);return{tokens:t,tokensLoading:o,loadTokens:c,setToken:u,deleteToken:p,handleEvent:d,domainHook:{onConnect:()=>c(),onDisconnect:()=>{},handleEvent:d}}}function gH(){const[t,s]=y.useState({claude:"off",github:"off",copilot:"off",codex:"off",goose:"off"}),{loading:o,track:r}=xs(),c=y.useCallback(async()=>{try{const m=await r(Be.getCredentialProviders({}));s(aH(m))}catch{}},[r]),d=y.useCallback(m=>m.type==="credential.providers_changed"?(S9(m.payload)&&s(m.payload),!0):!1,[]),u=y.useCallback(async m=>{const g=[{provider:"claude",value:m.claude},{provider:"github",value:m.github},{provider:"copilot",value:m.copilot},{provider:"codex",value:m.codex},{provider:"goose",value:m.goose}];await Promise.allSettled(g.map(({provider:v,value:b})=>Be.setCredentialProvider({provider:v,value:b})))},[]);return{credentialProviders:t,credentialsLoading:o,loadCredentials:c,updateCredentialProviders:u,handleEvent:d,domainHook:{onConnect:()=>c(),onDisconnect:()=>{},handleEvent:d}}}function vH(){const[t,s]=y.useState([]),[o,r]=y.useState(""),[c,d]=y.useState(""),[u,p]=y.useState(!1),m=y.useCallback(async b=>{try{const _=await Be.listCodespaces({githubAccountId:b??""});s(_.codespaces.map(iH)),d(_.error)}catch{}},[]),g=y.useCallback(async(b,_)=>{p(!0),r("");try{await Be.createCodespace({repo:b,machine:_??""}),p(!1),await m()}catch(k){p(!1);const S=k instanceof da?k.message:"Failed to create codespace";r(S)}},[m]);return{codespaces:t,codespaceError:o,codespaceListError:c,codespaceCreating:u,listCodespaces:m,createCodespace:g,domainHook:{onConnect:()=>m(),onDisconnect:()=>{},handleEvent:()=>!1}}}function yH(){const[t,s]=y.useState([]),[o,r]=y.useState(""),c=y.useCallback(async()=>{try{const u=await Be.listDockerContainers({});s(u.containers.map(oH)),r(u.error)}catch(u){s([]),r(u instanceof Error?u.message:"Failed to list Docker containers")}},[]);return{dockerContainers:t,dockerContainersError:o,listDockerContainers:c,domainHook:{onConnect:async()=>{},onDisconnect:()=>{},handleEvent:()=>!1}}}function bH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),c=y.useCallback(async()=>{try{const v=await r(zn.listPersonas({}));s(v.personas.map(Bp))}catch{}},[r]),d=y.useCallback(v=>{switch(v.type){case"persona.created":case"persona.updated":case"persona.deleted":return c().catch(()=>{}),!0;default:return!1}},[c]),u=y.useCallback(async(v,b,_,k,S,j,T,N,C)=>{const D=await zn.createPersona({name:v,description:b,systemPrompt:_,runtime:k||"",model:S||"",maxTurns:j||0,type:T||"agent",script:N||"",allowedMcpTools:C||[]}),A=Bp(D);return s(E=>[...E.filter(R=>R.id!==A.id),A]),A},[]),p=y.useCallback(async(v,b,_,k,S,j,T,N,C,D)=>{const A={id:v};b!==void 0&&(A.name=b),_!==void 0&&(A.description=_),k!==void 0&&(A.systemPrompt=k),S!==void 0&&(A.runtime=S),j!==void 0&&(A.model=j),T!==void 0&&(A.maxTurns=T),N!==void 0&&(A.type=N),C!==void 0&&(A.script=C),D!==void 0&&(A.allowedMcpTools={tools:D});const E=await zn.updatePersona(A),R=Bp(E);return s(O=>O.map(M=>M.id===R.id?R:M)),R},[]),m=y.useCallback(async v=>{await zn.deletePersona({id:v}),s(b=>b.filter(_=>_.id!==v))},[]);return{personas:t,personasLoading:o,loadPersonas:c,createPersona:u,updatePersona:p,deletePersona:m,handleEvent:d,domainHook:{onConnect:()=>c(),onDisconnect:()=>{},handleEvent:d}}}function _H(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),c=y.useRef(void 0),d=y.useCallback(async()=>{try{const b=await r(Bc.listSchedules({}));s(b.schedules.map(Lp))}catch{}},[r]),u=y.useCallback(b=>{switch(b.type){case"schedule.created":case"schedule.updated":case"schedule.deleted":return d().catch(()=>{}),!0;case"schedule.fired":return clearTimeout(c.current),c.current=setTimeout(()=>{d().catch(()=>{})},500),!0;default:return!1}},[d]),p=y.useCallback(async(b,_,k,S,j,T)=>{const N=await Bc.createSchedule({title:b,description:_,scheduleExpression:k,personaId:S,workspaceId:j||"",parentTaskId:T||""}),C=Lp(N);return s(D=>[...D.filter(A=>A.id!==C.id),C]),C},[]),m=y.useCallback(async(b,_)=>{const k={id:b};_.title!==void 0&&(k.title=_.title),_.description!==void 0&&(k.description=_.description),_.scheduleExpression!==void 0&&(k.scheduleExpression=_.scheduleExpression),_.personaId!==void 0&&(k.personaId=_.personaId),_.enabled!==void 0&&(k.enabled=_.enabled);const S=await Bc.updateSchedule(k),j=Lp(S);return s(T=>T.map(N=>N.id===j.id?j:N)),j},[]),g=y.useCallback(async b=>{await Bc.deleteSchedule({id:b}),s(_=>_.filter(k=>k.id!==b))},[]);return{schedules:t,schedulesLoading:o,loadSchedules:d,createSchedule:p,updateSchedule:m,deleteSchedule:g,handleEvent:u,domainHook:{onConnect:()=>d(),onDisconnect:()=>{clearTimeout(c.current)},handleEvent:u}}}function xH(t){if(t)try{return JSON.parse(t)}catch{return}}function kH(){const[t,s]=y.useState(new Map),[o,r]=y.useState([]),[c,d]=y.useState(void 0),[u,p]=y.useState(void 0),[m,g]=y.useState(!1),[v,b]=y.useState(""),_=y.useRef(""),k=y.useCallback(async E=>{const R=E??"";_.current=R,b(""),g(!0);try{const O=await Lc.listRecentKnowledgeNodes({limit:30,workspaceId:R}),M=new Map,$=[];for(const Y of O.nodes)M.set(Y.id,Yc(Y));for(const Y of O.edges)$.push(zp(Y));for(const Y of $){const V=M.get(Y.source);V&&(V.val+=1);const ne=M.get(Y.target);ne&&(ne.val+=1)}s(M),r($)}catch{}finally{g(!1)}},[]),S=y.useCallback(async E=>{if(E.trim()){b(E),p(void 0),d(void 0),g(!0);try{const R=await Lc.searchKnowledge({query:E,limit:20,workspaceId:_.current}),O=new Map,M=[];for(const $ of R.results){$.node&&O.set($.node.id,Yc($.node,$.edges.length));for(const Y of $.edges)M.push(zp(Y))}s(O),r(M)}catch{}finally{g(!1)}}},[]),j=y.useCallback(()=>{k(_.current).catch(()=>{})},[k]),T=y.useCallback(async E=>{p(E);try{const R=await Lc.getKnowledgeNode({id:E});if(!R.node){d(void 0);return}d({node:Yc(R.node,R.edges.length),edges:R.edges.map(O=>({fromId:O.fromId,toId:O.toId,type:O.type,metadata:xH(O.metadataJson)}))})}catch{d(void 0)}},[]),N=y.useCallback(()=>{p(void 0),d(void 0)},[]),C=y.useCallback(async E=>{try{const R=await Lc.expandKnowledgeNode({id:E,depth:1});s(O=>{const M=new Map(O);for(const $ of R.nodes)M.has($.id)||M.set($.id,Yc($));return M}),r(O=>{const M=new Set(O.map(Y=>`${Y.source}:${Y.target}:${Y.type}`)),$=[];for(const Y of R.edges){const V=zp(Y),ne=`${V.source}:${V.target}:${V.type}`;M.has(ne)||$.push(V)}return[...O,...$]})}catch{}},[]),D=y.useCallback(E=>!1,[]),A={onConnect:async()=>{},onDisconnect:()=>{},handleEvent:D};return{graphData:{nodes:[...t.values()],links:o},selectedNode:c,selectedId:u,loading:m,searchQuery:v,search:S,clearSearch:j,selectNode:T,clearSelection:N,expandNode:C,loadRecent:k,handleEvent:D,domainHook:A}}function SH(){const t=y.useRef("default");y.useEffect(()=>{typeof Notification>"u"||(t.current=Notification.permission)},[]);function s(r){if(r.type!=="notification.escalated")return!1;if(typeof Notification>"u")return!0;if(t.current==="default")return Notification.requestPermission().then(u=>{t.current=u}).catch(()=>{}),!0;if(t.current!=="granted")return!0;const c=r.payload,d=new Notification(c.title||"Agent needs input",{body:c.message||"An agent is waiting for your input.",tag:c.escalationId,icon:Id("icon-192x192.png")});return d.onclick=()=>{window.focus(),c.taskUrl&&(window.location.href=c.taskUrl),d.close()},!0}return{handleEvent:s,domainHook:{onConnect:async()=>{},onDisconnect:()=>{},handleEvent:s}}}const Jc=500;function jH(){const[t,s]=y.useState([]),[o,r]=y.useState({}),[c,d]=y.useState(!1),[u,p]=y.useState(!1),{loading:m,track:g}=xs(),v=y.useRef(0),b=y.useCallback(async(T=!1)=>{const N=v.current;try{const C=await g(Be.listStreams({includeInternal:T}));v.current===N&&(s(C.streams.map(cH)),p(!1))}catch{v.current===N&&p(!0)}finally{v.current===N&&d(!0)}},[g]),_=y.useCallback(async(T,N)=>{let C;try{C=(await Be.getStreamTranscript({streamId:T,beforeSeq:N??"",limit:0})).messages.map(A=>({streamId:A.streamId,seq:A.seq,senderId:A.senderId,content:A.content,timestamp:A.timestamp}))}catch{return}r(D=>{const A=new Map;for(const O of D[T]??[])A.set(O.seq,O);for(const O of C)A.set(O.seq,O);const E=Array.from(A.values()).sort((O,M)=>O.seq.localeCompare(M.seq)),R=E.length>Jc?E.slice(E.length-Jc):E;return{...D,[T]:R}})},[]),k=y.useCallback(T=>{r(N=>{const C=N[T.streamId]??[];if(C.some(E=>E.seq===T.seq))return N;const D=[...C,T],A=D.length>Jc?D.slice(D.length-Jc):D;return{...N,[T.streamId]:A}})},[]),S=y.useCallback(T=>!1,[]);return{streams:t,streamsLoading:m,streamsLoadedOnce:c,streamsLoadError:u,loadStreams:b,liveMessages:o,loadTranscript:_,handleStreamMessage:k,handleEvent:S,domainHook:{onConnect:b,onDisconnect:()=>{v.current+=1,s([]),r({}),d(!1),p(!1)},handleEvent:S}}}function TH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),c=y.useCallback(async()=>{try{const m=await r(Be.listPlugins({}));s(m.plugins.map(g=>({name:g.name,description:g.description,enabled:g.enabled,required:g.required,loaded:g.loaded})))}catch{}},[r]),d=y.useCallback(m=>m.type==="plugin.changed"?(c().catch(()=>{}),!0):!1,[c]),u=y.useCallback(async(m,g)=>{try{const v=await Be.setPluginEnabled({name:m,enabled:g});s(b=>b.map(_=>_.name===v.name?{..._,enabled:v.enabled}:_))}catch{}},[]);return{plugins:t,pluginsLoading:o,loadPlugins:c,setPluginEnabled:u,domainHook:{onConnect:()=>c(),onDisconnect:()=>{},handleEvent:d}}}function NH(){const[t,s]=y.useState([]),{loading:o,track:r}=xs(),c=y.useCallback(async()=>{try{const b=await r(Be.listGitHubAccounts({}));s(b.accounts.map(_=>({id:_.id,label:_.label,username:_.username,isDefault:_.isDefault,createdAt:_.createdAt})))}catch{}},[r]),d=y.useCallback(b=>b.type==="github_account.changed"?(c().catch(()=>{}),!0):!1,[c]),u=y.useCallback(async(b,_,k,S)=>{const j=await Be.addGitHubAccount({label:b,token:_,username:k,isDefault:S});s(T=>[...j.isDefault?T.map(C=>({...C,isDefault:!1})):T,{id:j.id,label:j.label,username:j.username,isDefault:j.isDefault,createdAt:j.createdAt}])},[]),p=y.useCallback(async(b,_)=>{const k=await Be.updateGitHubAccount({id:b,..._});s(S=>S.map(j=>j.id===k.id?{...j,label:k.label,username:k.username,isDefault:k.isDefault}:_.isDefault?{...j,isDefault:!1}:j))},[]),m=y.useCallback(async b=>{await Be.removeGitHubAccount({id:b}),s(_=>_.filter(k=>k.id!==b))},[]),g=y.useCallback(async()=>{const b=await Be.importGitHubAccounts({});return b.imported>0&&await c(),{imported:b.imported,usernames:b.usernames}},[c]);return{githubAccounts:t,githubAccountsLoading:o,loadGitHubAccounts:c,addGitHubAccount:u,updateGitHubAccount:p,removeGitHubAccount:m,importGitHubAccounts:g,domainHook:{onConnect:()=>c(),onDisconnect:()=>{},handleEvent:d}}}function wH(){const[t,s]=y.useState(""),[o,r]=y.useState(void 0),[c,d]=y.useState({}),{pluginNames:u}=Bd(),p=eH(u),m=dH(),g=fH(),v=pH(),b=mH(),_=hH(),k=gH(),S=vH(),j=yH(),T=bH(),N=_H(),C=kH(),D=SH(),A=jH(),E=TH(),R=NH(),O=[...p.has("environments")?[m.domainHook]:[],...p.has("sessions")?[g.domainHook]:[],...p.has("workspaces")?[v.domainHook]:[],...p.has("tasks")?[b.domainHook]:[],...p.has("tokens")?[_.domainHook]:[],...p.has("credentials")?[k.domainHook]:[],...p.has("codespaces")?[S.domainHook]:[],...p.has("dockerContainers")?[j.domainHook]:[],...p.has("personas")?[T.domainHook]:[],...p.has("schedules")?[N.domainHook]:[],...p.has("knowledge")?[C.domainHook]:[],...p.has("notifications")?[D.domainHook]:[],...p.has("streams")?[A.domainHook]:[],...p.has("plugins")?[E.domainHook]:[],R.domainHook],{connectionStatus:M}=Z9({onSessionEvent:F=>{g.handleSessionEvent({sessionId:F.sessionId,eventType:H_(F.type),timestamp:F.timestamp,content:F.content,raw:F.raw||void 0,toolCallId:F.toolCallId||void 0})},onDomainEvent:F=>{try{const ge=JSON.parse(F.payloadJson);Z({id:F.id,type:F.type,timestamp:F.timestamp,payload:ge})}catch{console.warn("[grackle] Failed to parse domain event payloadJson:",F.payloadJson)}},onStreamMessage:F=>{A.handleStreamMessage(F)},onConnect:se,onDisconnect:H}),$="default_persona_id",Y="onboarding_completed",V=y.useCallback(async F=>{const ge=await Be.setSetting({key:$,value:F});s(ge.value)},[]),ne=y.useCallback(async()=>{r(!0);try{await Be.setSetting({key:Y,value:"true"})}catch{}},[]),le=y.useCallback(async(F,ge)=>{try{const ee=await Be.getUsage({scope:F,id:ge}),ce=`${F}:${ge}`;d(me=>({...me,[ce]:rH(ee)}))}catch{}},[]);function Z(F){const ge=F.payload.key,ee=F.payload.value;if(F.type==="setting.changed"){ge===$&&s(ee??""),ge===Y&&r(ee==="true");return}for(const ce of O)if(ce.handleEvent(F))break;(F.type==="environment.removed"||F.type==="task.started")&&g.loadSessions().catch(()=>{}),(F.type==="session.started"||F.type==="session.stopped")&&A.loadStreams().catch(()=>{})}async function se(){for(const F of O)F.onConnect().catch(()=>{});try{const F=await Be.getSetting({key:$});s(F.value)}catch{}try{const F=await Be.getSetting({key:Y});r(F.value==="true")}catch{}}function H(){O.forEach(F=>F.onDisconnect())}const B=y.useCallback(()=>{m.loadEnvironments().catch(()=>{}),g.loadSessions().catch(()=>{}),v.loadWorkspaces().catch(()=>{}),_.loadTokens().catch(()=>{})},[m.loadEnvironments,g.loadSessions,v.loadWorkspaces,_.loadTokens]);return{connectionStatus:M,environments:{environments:m.environments,environmentsLoading:m.environmentsLoading,provisionStatus:m.provisionStatus,operationError:m.operationError,clearOperationError:m.clearOperationError,loadEnvironments:m.loadEnvironments,addEnvironment:m.addEnvironment,updateEnvironment:m.updateEnvironment,provisionEnvironment:m.provisionEnvironment,stopEnvironment:m.stopEnvironment,removeEnvironment:m.removeEnvironment,domainHook:m.domainHook},sessions:{sessions:g.sessions,sessionsLoading:g.sessionsLoading,events:g.events,eventsDropped:g.eventsDropped,lastSpawnedId:g.lastSpawnedId,taskSessions:g.taskSessions,spawn:g.spawn,sendInput:g.sendInput,kill:g.kill,stopGraceful:g.stopGraceful,loadSessionEvents:g.loadSessionEvents,clearEvents:g.clearEvents,loadTaskSessions:g.loadTaskSessions,domainHook:g.domainHook},workspaces:{workspaces:v.workspaces,workspacesLoading:v.workspacesLoading,workspaceCreating:v.workspaceCreating,loadWorkspaces:v.loadWorkspaces,createWorkspace:v.createWorkspace,archiveWorkspace:v.archiveWorkspace,updateWorkspace:v.updateWorkspace,linkEnvironment:v.linkEnvironment,unlinkEnvironment:v.unlinkEnvironment,linkOperationError:v.linkOperationError,clearLinkOperationError:v.clearLinkOperationError,domainHook:v.domainHook},tasks:{tasks:b.tasks,tasksLoading:b.tasksLoading,taskStartingId:b.taskStartingId,loadTasks:b.loadTasks,loadAllTasks:b.loadAllTasks,createTask:b.createTask,startTask:b.startTask,stopTask:b.stopTask,completeTask:b.completeTask,resumeTask:b.resumeTask,updateTask:b.updateTask,deleteTask:b.deleteTask,domainHook:b.domainHook},tokens:{tokens:_.tokens,tokensLoading:_.tokensLoading,loadTokens:_.loadTokens,setToken:_.setToken,deleteToken:_.deleteToken,domainHook:_.domainHook},credentials:{credentialProviders:k.credentialProviders,credentialsLoading:k.credentialsLoading,updateCredentialProviders:k.updateCredentialProviders,domainHook:k.domainHook},codespaces:{codespaces:S.codespaces,codespaceError:S.codespaceError,codespaceListError:S.codespaceListError,codespaceCreating:S.codespaceCreating,listCodespaces:S.listCodespaces,createCodespace:S.createCodespace,domainHook:S.domainHook},dockerContainers:{dockerContainers:j.dockerContainers,dockerContainersError:j.dockerContainersError,listDockerContainers:j.listDockerContainers,domainHook:j.domainHook},personas:{personas:T.personas,personasLoading:T.personasLoading,createPersona:T.createPersona,updatePersona:T.updatePersona,deletePersona:T.deletePersona,domainHook:T.domainHook},schedules:{schedules:N.schedules,schedulesLoading:N.schedulesLoading,createSchedule:N.createSchedule,updateSchedule:N.updateSchedule,deleteSchedule:N.deleteSchedule,domainHook:N.domainHook},streams:{streams:A.streams,streamsLoading:A.streamsLoading,streamsLoadedOnce:A.streamsLoadedOnce,streamsLoadError:A.streamsLoadError,loadStreams:A.loadStreams,liveMessages:A.liveMessages,loadTranscript:A.loadTranscript,handleStreamMessage:A.handleStreamMessage,domainHook:A.domainHook},knowledge:C,plugins:{plugins:E.plugins,pluginsLoading:E.pluginsLoading,loadPlugins:E.loadPlugins,setPluginEnabled:E.setPluginEnabled},githubAccounts:{githubAccounts:R.githubAccounts,githubAccountsLoading:R.githubAccountsLoading,loadGitHubAccounts:R.loadGitHubAccounts,addGitHubAccount:R.addGitHubAccount,updateGitHubAccount:R.updateGitHubAccount,removeGitHubAccount:R.removeGitHubAccount,importGitHubAccounts:R.importGitHubAccounts},appDefaultPersonaId:t,setAppDefaultPersonaId:V,onboardingCompleted:o,completeOnboarding:ne,usageCache:c,loadUsage:le,refresh:B}}function CH({children:t}){const s=wH();return a.jsx(bh.Provider,{value:s,children:t})}function EH(t,s){const o=y.useRef(null);y.useEffect(()=>{const r=o.current;if(o.current=t,r===null)return;const c=new Map;for(const u of r)c.set(u.id,u);const d=new Set;for(const u of t){d.add(u.id);const p=c.get(u.id);p&&p.status!==u.status&&(u.status==="sleeping"||u.status==="connecting"||(u.status==="connected"?s("Environment connected","success"):u.status==="error"?s("Environment provision failed","error"):u.status==="disconnected"&&p.status==="connected"&&s("Environment disconnected","warning")))}for(const u of r)d.has(u.id)||s("Environment removed","info")},[t,s])}function AH(t,s,o){const r=y.useRef(t);y.useEffect(()=>{t&&t!==r.current&&(o(t,"error"),s()),r.current=t},[t,s,o])}const DH={working:{message:"Task is now running",variant:"info"},paused:{message:"Task paused",variant:"warning"},complete:{message:"Task complete",variant:"success"},failed:{message:"Task failed to complete",variant:"error"}};function MH(t){return DH[t]}function RH(t,s){if(t===void 0)return[];const o=[],r=new Map;for(const d of t)r.set(d.id,d);const c=new Set;for(const d of s){c.add(d.id);const u=r.get(d.id);if(!u||u.status===d.status)continue;const p=MH(d.status);p&&o.push(p)}for(const d of t)c.has(d.id)||o.push({message:"Task deleted",variant:"info"});return o}function IH(t,s){const o=y.useRef(void 0);y.useEffect(()=>{const r=o.current;o.current=t;const c=RH(r,t);for(const d of c)s(d.message,d.variant)},[t,s])}const OH="_dashboard_16pzm_1",BH="_kpiStrip_16pzm_11",LH="_kpiCard_16pzm_23",zH="_kpiValue_16pzm_68",$H="_kpiLabel_16pzm_76",HH="_bodyGrid_16pzm_84",PH="_section_16pzm_96",UH="_sectionHeader_16pzm_109",VH="_sectionIcon_16pzm_118",qH="_sectionTitle_16pzm_123",GH="_sectionCount_16pzm_131",FH="_sectionBody_16pzm_138",KH="_emptyHint_16pzm_143",ZH="_sessionRow_16pzm_150",YH="_sessionPrompt_16pzm_177",JH="_sessionEnv_16pzm_186",WH="_sessionRuntime_16pzm_192",XH="_sessionStatus_16pzm_198",QH="_statusDot_16pzm_207",eP="_attentionRow_16pzm_233",tP="_attentionTitle_16pzm_259",nP="_attentionMeta_16pzm_267",sP="_reasonBadge_16pzm_274",aP="_bottomGrid_16pzm_301",iP="_envRow_16pzm_312",oP="_envName_16pzm_323",rP="_envStatusBadge_16pzm_333",lP="_workspaceRow_16pzm_369",cP="_workspaceTop_16pzm_395",dP="_workspaceName_16pzm_401",uP="_workspaceCounts_16pzm_407",fP="_progressBar_16pzm_415",pP="_progressFill_16pzm_422",he={dashboard:OH,kpiStrip:BH,kpiCard:LH,kpiValue:zH,kpiLabel:$H,bodyGrid:HH,section:PH,sectionHeader:UH,sectionIcon:VH,sectionTitle:qH,sectionCount:GH,sectionBody:FH,emptyHint:KH,sessionRow:ZH,sessionPrompt:YH,sessionEnv:JH,sessionRuntime:WH,sessionStatus:XH,statusDot:QH,attentionRow:eP,attentionTitle:tP,attentionMeta:nP,reasonBadge:sP,bottomGrid:aP,envRow:iP,envName:oP,envStatusBadge:rP,workspaceRow:lP,workspaceTop:cP,workspaceName:dP,workspaceCounts:uP,progressBar:fP,progressFill:pP};function mP(){return a.jsxs("div",{className:he.dashboard,"aria-hidden":"true",children:[a.jsx("div",{className:he.kpiStrip,children:Array.from({length:4},(t,s)=>a.jsxs("div",{className:he.kpiCard,children:[a.jsx(Te,{width:"3rem",height:"2rem"}),a.jsx(Te,{width:"80%",height:"0.75rem"})]},s))}),a.jsxs("div",{className:he.bodyGrid,children:[a.jsxs("div",{className:he.section,children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx(Te,{width:"1rem",height:"1rem",variant:"circular"}),a.jsx(Te,{width:"8rem",height:"0.75rem"}),a.jsx("span",{className:he.sectionCount,children:a.jsx(Te,{width:"1rem",height:"0.75rem"})})]}),a.jsx("div",{className:he.sectionBody,children:Array.from({length:3},(t,s)=>a.jsxs("div",{className:he.sessionRow,style:{cursor:"default"},children:[a.jsx(Te,{width:"60%",height:"0.875rem"}),a.jsx(Te,{width:"4rem",height:"0.75rem"}),a.jsx(Te,{width:"3rem",height:"0.75rem"}),a.jsx(Te,{width:"3rem",height:"0.75rem"})]},s))})]}),a.jsxs("div",{className:he.section,children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx(Te,{width:"1rem",height:"1rem",variant:"circular"}),a.jsx(Te,{width:"8rem",height:"0.75rem"}),a.jsx("span",{className:he.sectionCount,children:a.jsx(Te,{width:"1rem",height:"0.75rem"})})]}),a.jsx("div",{className:he.sectionBody,children:Array.from({length:2},(t,s)=>a.jsxs("div",{className:he.attentionRow,style:{cursor:"default"},children:[a.jsxs("div",{className:he.attentionTitle,children:[a.jsx(Te,{width:"3rem",height:"0.875rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"70%",height:"0.875rem"})]}),a.jsx("div",{className:he.attentionMeta,children:a.jsx(Te,{width:"5rem",height:"0.625rem"})})]},s))})]})]}),a.jsxs("div",{className:he.bottomGrid,children:[a.jsxs("div",{className:he.section,children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx(Te,{width:"1rem",height:"1rem",variant:"circular"}),a.jsx(Te,{width:"9rem",height:"0.75rem"}),a.jsx("span",{className:he.sectionCount,children:a.jsx(Te,{width:"1rem",height:"0.75rem"})})]}),a.jsx("div",{className:he.sectionBody,children:Array.from({length:2},(t,s)=>a.jsxs("div",{className:he.envRow,children:[a.jsx(Te,{width:"60%",height:"0.875rem"}),a.jsx(Te,{width:"4rem",height:"0.875rem",borderRadius:"var(--radius-sm)"})]},s))})]}),a.jsxs("div",{className:he.section,children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx(Te,{width:"1rem",height:"1rem",variant:"circular"}),a.jsx(Te,{width:"6rem",height:"0.75rem"}),a.jsx("span",{className:he.sectionCount,children:a.jsx(Te,{width:"1rem",height:"0.75rem"})})]}),a.jsx("div",{className:he.sectionBody,children:Array.from({length:2},(t,s)=>a.jsxs("div",{className:he.workspaceRow,style:{cursor:"default"},children:[a.jsxs("div",{className:he.workspaceTop,children:[a.jsx(Te,{width:"50%",height:"0.875rem"}),a.jsx(Te,{width:"2rem",height:"0.75rem"})]}),a.jsx("div",{className:he.progressBar,children:a.jsx("div",{className:he.progressFill,style:{width:"0%"}})})]},s))})]})]})]})}const hP={hidden:{opacity:0,y:12},visible:t=>({opacity:1,y:0,transition:{delay:t*.06,duration:.3,ease:"easeOut"}})},Wc={hidden:{opacity:0,y:16},visible:t=>({opacity:1,y:0,transition:{delay:.15+t*.08,duration:.35,ease:"easeOut"}})};function gP(t,s,o,r){const c=[`${t} of ${s} tasks completed`];return o>0&&c.push(`${o} in progress`),r>0&&c.push(`${r} failed`),c.join(", ")}function Xc({value:t,label:s,accent:o,index:r,testId:c}){return a.jsxs(Pt.div,{className:he.kpiCard,"data-accent":o,"data-testid":c,variants:hP,initial:"hidden",animate:"visible",custom:r,children:[a.jsx("span",{className:he.kpiValue,children:t}),a.jsx("span",{className:he.kpiLabel,children:s})]})}function vP(){const{workspaces:{workspaces:t,workspacesLoading:s},tasks:{tasks:o,tasksLoading:r,loadTasks:c},sessions:{sessions:d,sessionsLoading:u},environments:{environments:p,environmentsLoading:m}}=pt(),g=xt(),v=y.useRef(new Set);y.useEffect(()=>{for(const T of t)v.current.has(T.id)||(v.current.add(T.id),c(T.id).catch(()=>{}))},[t,c]);const b=y.useMemo(()=>M9(d,o,p),[d,o,p]),_=y.useMemo(()=>I9(d,p),[d,p]),k=y.useMemo(()=>R9(o,t),[o,t]),S=y.useMemo(()=>O9(t,o),[t,o,p]);return d.length===0&&o.length===0&&p.length===0&&t.length===0&&(u||r||m||s)?a.jsx(mP,{}):a.jsxs("div",{className:he.dashboard,"data-testid":"dashboard",children:[a.jsxs("div",{className:he.kpiStrip,"data-testid":"dashboard-kpi-strip",children:[a.jsx(Xc,{value:b.activeSessions,label:"Active Sessions",accent:"green",index:0,testId:"kpi-active-sessions"}),a.jsx(Xc,{value:b.blockedTasks,label:"Blocked Tasks",accent:"yellow",index:1,testId:"kpi-blocked-tasks"}),a.jsx(Xc,{value:b.attentionTasks,label:"Needs Attention",accent:"red",index:2,testId:"kpi-attention-tasks"}),a.jsx(Xc,{value:b.unhealthyEnvironments,label:"Unhealthy Envs",accent:"blue",index:3,testId:"kpi-unhealthy-envs"})]}),a.jsxs("div",{className:he.bodyGrid,children:[a.jsxs(Pt.div,{className:he.section,variants:Wc,initial:"hidden",animate:"visible",custom:0,"data-testid":"dashboard-active-sessions",children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx("span",{className:he.sectionIcon,"aria-hidden":"true",children:"●"}),a.jsx("span",{className:he.sectionTitle,children:"Active Sessions"}),a.jsx("span",{className:he.sectionCount,children:_.length})]}),a.jsx("div",{className:he.sectionBody,children:_.length===0?a.jsx("div",{className:he.emptyHint,children:"No active sessions"}):_.map(({session:T,environmentName:N})=>a.jsxs("button",{type:"button",className:he.sessionRow,onClick:()=>g(Mm(T.id)),"data-testid":"session-row",children:[a.jsx("span",{className:he.sessionPrompt,title:T.prompt,children:T.prompt||"—"}),a.jsx("span",{className:he.sessionEnv,children:N}),a.jsx("span",{className:he.sessionRuntime,children:T.runtime}),a.jsxs("span",{className:he.sessionStatus,children:[a.jsx("span",{className:he.statusDot,"data-status":T.status}),T.status]})]},T.id))})]}),a.jsxs(Pt.div,{className:he.section,variants:Wc,initial:"hidden",animate:"visible",custom:1,"data-testid":"dashboard-needs-attention",children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx("span",{className:he.sectionIcon,"aria-hidden":"true",children:"⚑"}),a.jsx("span",{className:he.sectionTitle,children:"Needs Attention"}),a.jsx("span",{className:he.sectionCount,children:k.length})]}),a.jsx("div",{className:he.sectionBody,children:k.length===0?a.jsx("div",{className:he.emptyHint,children:"All clear"}):k.map(({task:T,reason:N,workspaceName:C})=>a.jsxs("button",{type:"button",className:he.attentionRow,onClick:()=>g(ls(T.id)),"data-testid":"attention-row",children:[a.jsxs("div",{className:he.attentionTitle,children:[a.jsx("span",{className:he.reasonBadge,"data-reason":N,children:N}),T.title]}),a.jsx("div",{className:he.attentionMeta,children:a.jsx("span",{children:C})})]},T.id))})]})]}),a.jsxs("div",{className:he.bottomGrid,children:[a.jsxs(Pt.div,{className:he.section,variants:Wc,initial:"hidden",animate:"visible",custom:2,"data-testid":"dashboard-env-health",children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx("span",{className:he.sectionIcon,"aria-hidden":"true",children:"◈"}),a.jsx("span",{className:he.sectionTitle,children:"Environment Health"}),a.jsx("span",{className:he.sectionCount,children:p.length})]}),a.jsx("div",{className:he.sectionBody,children:p.length===0?a.jsx("div",{className:he.emptyHint,children:"No environments configured"}):p.map(T=>a.jsxs("div",{className:he.envRow,"data-testid":"dashboard-env-row",children:[a.jsx("span",{className:he.envName,children:T.displayName}),a.jsx("span",{className:he.envStatusBadge,"data-status":T.status,children:T.status})]},T.id))})]}),a.jsxs(Pt.div,{className:he.section,variants:Wc,initial:"hidden",animate:"visible",custom:3,"data-testid":"dashboard-workspace-snapshot",children:[a.jsxs("div",{className:he.sectionHeader,children:[a.jsx("span",{className:he.sectionIcon,"aria-hidden":"true",children:"▦"}),a.jsx("span",{className:he.sectionTitle,children:"Workspaces"}),a.jsx("span",{className:he.sectionCount,children:t.length})]}),a.jsx("div",{className:he.sectionBody,children:S.length===0?a.jsx("div",{className:he.emptyHint,children:"No workspaces yet"}):S.map(({workspace:T,totalTasks:N,completedTasks:C,workingTasks:D,failedTasks:A})=>{const E=N>0?Math.round(C/N*100):0;return a.jsxs("button",{type:"button",className:he.workspaceRow,onClick:()=>g(wi(T.id,T.linkedEnvironmentIds[0])),"data-testid":"workspace-row",children:[a.jsxs("div",{className:he.workspaceTop,children:[a.jsx("span",{className:he.workspaceName,children:T.name}),a.jsxs("span",{className:he.workspaceCounts,"aria-label":gP(C,N,D,A),children:[C,"/",N,D>0&&a.jsxs("span",{style:{color:"var(--accent-green)"},"aria-hidden":"true",children:["▸",D]}),A>0&&a.jsxs("span",{style:{color:"var(--accent-red)"},"aria-hidden":"true",children:["✗",A]})]})]}),N>0&&a.jsx("div",{className:he.progressBar,children:a.jsx("div",{className:he.progressFill,style:{width:`${E}%`}})})]},T.id)})})]})]})]})}const yP="_panelContainer_1udy7_1",bP="_emptyState_1udy7_8",_P="_workspaceSummary_1udy7_17",xP="_workspaceSummaryTitle_1udy7_28",kP="_workspaceSummarySubtitle_1udy7_32",SP="_header_1udy7_36",jP="_headerInfo_1udy7_71",TP="_headerTitle_1udy7_106",NP="_taskStatusBadge_1udy7_128",wP="_taskBranch_1udy7_137",CP="_taskBlockedBadge_1udy7_143",EP="_tabBar_1udy7_277",AP="_tab_1udy7_277",DP="_active_1udy7_303",MP="_eventScroll_1udy7_308",RP="_overviewContent_1udy7_325",IP="_overviewDashboard_1udy7_334",OP="_overviewHero_1udy7_340",BP="_overviewSection_1udy7_347",LP="_overviewLabel_1udy7_353",zP="_envRow_1udy7_360",$P="_timeline_1udy7_366",HP="_timelineRow_1udy7_372",PP="_waitingMessage_1udy7_379",UP="_errorMessage_1udy7_383",VP="_emptyCta_1udy7_387",qP="_ctaTitle_1udy7_399",GP="_ctaDescription_1udy7_405",FP="_ctaButton_1udy7_412",KP="_workspaceHeader_1udy7_533",ZP="_workspaceName_1udy7_558",YP="_workspaceMeta_1udy7_571",JP="_metaRow_1udy7_579",WP="_metaLabel_1udy7_592",XP="_metaValue_1udy7_607",QP="_archiveButton_1udy7_617",eU="_repoLink_1udy7_647",tU="_metaToggle_1udy7_657",nU="_metaToggleArrow_1udy7_678",sU="_metaToggleArrowOpen_1udy7_683",aU="_progressBarContainer_1udy7_687",iU="_progressBar_1udy7_687",oU="_progressFill_1udy7_703",rU="_progressLabel_1udy7_710",lU="_metaTimestamps_1udy7_717",cU="_metaTimestamp_1udy7_717",dU="_metaPlaceholder_1udy7_739",uU="_linkedEnvList_1udy7_744",fU="_linkedEnvChip_1udy7_750",pU="_chipDismiss_1udy7_762",mU="_linkError_1udy7_777",hU="_linkEnvSelect_1udy7_782",W={panelContainer:yP,emptyState:bP,workspaceSummary:_P,workspaceSummaryTitle:xP,workspaceSummarySubtitle:kP,header:SP,headerInfo:jP,headerTitle:TP,taskStatusBadge:NP,taskBranch:wP,taskBlockedBadge:CP,tabBar:EP,tab:AP,active:DP,eventScroll:MP,overviewContent:RP,overviewDashboard:IP,overviewHero:OP,overviewSection:BP,overviewLabel:LP,envRow:zP,timeline:$P,timelineRow:HP,waitingMessage:PP,errorMessage:UP,emptyCta:VP,ctaTitle:qP,ctaDescription:GP,ctaButton:FP,workspaceHeader:KP,workspaceName:ZP,workspaceMeta:YP,metaRow:JP,metaLabel:WP,metaValue:XP,archiveButton:QP,repoLink:eU,metaToggle:tU,metaToggleArrow:nU,metaToggleArrowOpen:sU,progressBarContainer:aU,progressBar:iU,progressFill:oU,progressLabel:rU,metaTimestamps:lU,metaTimestamp:cU,metaPlaceholder:dU,linkedEnvList:uU,linkedEnvChip:fU,chipDismiss:pU,linkError:mU,linkEnvSelect:hU};function gU(){return a.jsx("div",{className:W.emptyState,children:"Select a task or click + to create one"})}function vU(){return a.jsx("div",{className:W.emptyState,children:"Select an environment to manage its workspaces, or add a new one."})}function yU(){const{workspaces:{workspaces:t},environments:{environments:s}}=pt(),o=xt(),r=s.length>0;return t.length>0?a.jsx(vP,{}):a.jsxs("div",{className:W.emptyCta,"data-testid":"welcome-cta",children:[a.jsx("div",{className:W.ctaTitle,children:"Welcome to Grackle"}),a.jsx("div",{className:W.ctaDescription,children:"Organize your work into workspaces and let agents tackle the tasks."}),a.jsx("button",{className:W.ctaButton,onClick:()=>o(mx),disabled:!r,"data-testid":"welcome-create-button",children:"Create Your First Workspace"}),!r&&a.jsx("div",{className:W.ctaDescription,children:"Add an environment first before creating a workspace."})]})}const bU="_panelContainer_1rih4_1",_U="_chatHeader_1rih4_9",xU="_chatHeaderInfo_1rih4_38",kU="_chatHeaderActions_1rih4_44",SU="_emptyState_1rih4_64",jU="_emptyTitle_1rih4_76",TU="_emptyDescription_1rih4_82",NU="_emptyHint_1rih4_88",ra={panelContainer:bU,chatHeader:_U,chatHeaderInfo:xU,chatHeaderActions:kU,emptyState:SU,emptyTitle:jU,emptyDescription:TU,emptyHint:NU};function S_(){return a.jsx("div",{className:ra.panelContainer,"aria-hidden":"true",children:a.jsxs("div",{style:{flex:1,overflow:"hidden",padding:"var(--space-md)",display:"flex",flexDirection:"column",gap:"var(--space-md)"},children:[a.jsx(Te,{width:"65%",height:"2.5rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"85%",height:"4rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"45%",height:"2rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"75%",height:"3rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"55%",height:"2.5rem",borderRadius:"var(--radius-sm)"})]})})}function wU({hasLocalEnvironment:t}){return a.jsxs("div",{className:ra.emptyState,"data-testid":"chat-empty-state",children:[a.jsx("div",{className:ra.emptyTitle,children:"Welcome to Grackle"}),a.jsx("div",{className:ra.emptyDescription,children:t?"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."}),!t&&a.jsx("div",{className:ra.emptyHint,children:"Go to Settings → Environments to add one."})]})}function CU(){const t=kh(),{tasks:{tasks:s,tasksLoading:o,startTask:r},sessions:{sessions:c,sessionsLoading:d,events:u,eventsDropped:p,taskSessions:m,loadTaskSessions:g,loadSessionEvents:v,kill:b,stopGraceful:_,sendInput:k,spawn:S},environments:{environments:j,provisionEnvironment:T},personas:{personas:N}}=pt(),{showToast:C}=pn(),D=y.useRef(void 0),[A,E]=y.useState(),R=s.find(le=>le.id===Ic),O=R!=null&&R.latestSessionId?c.find(le=>le.id===R.latestSessionId)??(m[Ic]??[]).find(le=>le.id===R.latestSessionId):void 0;y.useEffect(()=>{g(Ic).catch(()=>{})},[R==null?void 0:R.latestSessionId,g]),y.useEffect(()=>{O&&O.id!==D.current&&(D.current=O.id,v(O.id).catch(()=>{}))},[O==null?void 0:O.id,v]);const M=y.useMemo(()=>{if(!O)return[];const le=u.filter(Z=>Z.sessionId===O.id);return xh(_h(le))},[u,O==null?void 0:O.id]),$=j.find(le=>le.adapterType==="local"&&le.status==="connected"),Y=O!==void 0&&O.status!=="stopped"&&O.status!=="suspended",V=(O==null?void 0:O.status)==="idle";y.useEffect(()=>{A&&O&&V&&(k(O.id,A).catch(()=>{C("Failed to send message","error")}),E(void 0))},[A,V,O==null?void 0:O.id,k,C]);const ne=y.useCallback((le,Z,se,H)=>{H&&E(H),r(le,Z,se).catch(()=>{})},[r]);return!R&&(d||o)?a.jsx(S_,{}):R!=null&&R.latestSessionId&&!O?a.jsx(S_,{}):a.jsxs("div",{className:ra.panelContainer,"data-testid":"chat-page",children:[Y&&a.jsxs("div",{className:ra.chatHeader,children:[a.jsxs("span",{className:ra.chatHeaderInfo,children:["Session: ",O.id.slice(0,8)," | ",O.runtime," | ",O.status]}),a.jsx("div",{className:ra.chatHeaderActions,children:a.jsx(gx,{label:"Stop",onClick:()=>{_(O.id).catch(()=>{})},variant:"danger",size:"sm","data-testid":"stop-split-button",options:[{label:"Stop",description:"Graceful shutdown",onClick:()=>{_(O.id).catch(()=>{})}},{label:"Kill",description:"Force kill",onClick:()=>{b(O.id).catch(()=>{})}}]})})]}),a.jsx(mh,{events:M,eventsDropped:p,sandboxProxyUrl:t,emptyState:a.jsx(wU,{hasLocalEnvironment:!!$}),onShowToast:C}),$&&a.jsx(Sd,{mode:Y?"send":"start",sessionId:Y?O.id:void 0,taskId:Ic,environmentId:Y?O.environmentId:$.id,personas:N,environments:j,onSendInput:(le,Z)=>{k(le,Z).catch(()=>{C("Failed to send message","error")})},onSpawn:(le,Z,se)=>{S(le,Z,se).catch(()=>{})},onStartTask:ne,onProvisionEnvironment:le=>{T(le).catch(()=>{})},onShowToast:C})]})}const EU="_container_h5uod_1",AU="_toolbar_h5uod_9",DU="_viewToggle_h5uod_18",MU="_toolbarControls_h5uod_23",RU="_internalsToggle_h5uod_30",IU="_refreshButton_h5uod_39",OU="_toggleButton_h5uod_53",BU="_toggleActive_h5uod_67",as={container:EU,toolbar:AU,viewToggle:DU,toolbarControls:MU,internalsToggle:RU,refreshButton:IU,toggleButton:OU,toggleActive:BU};function LU(){const{streams:{streams:t,streamsLoading:s,streamsLoadedOnce:o,streamsLoadError:r,loadStreams:c,liveMessages:d,loadTranscript:u},sessions:{sessions:p},tasks:{tasks:m}}=pt(),{resolvedThemeId:g}=yh(),[v,b]=y.useState("list"),[_,k]=y.useState(!1),[S,j]=y.useState(void 0),[T,N]=y.useState(!1);y.useEffect(()=>{if(S===void 0){N(!1);return}let E=!0;return N(!0),u(S).then(()=>{E&&N(!1)}).catch(()=>{E&&N(!1)}),()=>{E=!1}},[S,u]);const C=y.useRef(!1);y.useEffect(()=>{if(!C.current){C.current=!0;return}c(_).catch(()=>{})},[_,c]);const D=y.useCallback(()=>{c(_).catch(()=>{})},[c,_]),A=S!==void 0?t.find(E=>E.id===S):void 0;return a.jsxs("div",{className:as.container,"data-testid":"coordination-page",children:[a.jsxs("div",{className:as.toolbar,children:[a.jsxs("div",{className:as.viewToggle,role:"group","aria-label":"Coordination view","data-testid":"coordination-view-toggle",children:[a.jsx("button",{type:"button",className:v==="list"?`${as.toggleButton} ${as.toggleActive}`:as.toggleButton,"aria-pressed":v==="list","data-testid":"coordination-view-list",onClick:()=>b("list"),children:"List"}),a.jsx("button",{type:"button",className:v==="graph"?`${as.toggleButton} ${as.toggleActive}`:as.toggleButton,"aria-pressed":v==="graph","data-testid":"coordination-view-graph",onClick:()=>b("graph"),children:"Graph"})]}),a.jsxs("div",{className:as.toolbarControls,children:[a.jsxs("label",{className:as.internalsToggle,children:[a.jsx("input",{type:"checkbox",checked:_,onChange:E=>k(E.target.checked),"data-testid":"coordination-show-internals"}),"Show internals"]}),a.jsx("button",{type:"button",className:as.refreshButton,onClick:D,"aria-label":"Refresh streams","data-testid":"coordination-refresh",children:"Refresh"})]})]}),v==="list"?a.jsx(tz,{streams:t,sessions:p,tasks:m,loading:s,loadError:r,loadedOnce:o,showInternals:_,onToggleInternals:k,selectedStreamId:S,onSelectStream:j,onRefresh:D,hideHeaderControls:!0}):a.jsx(N$,{streams:t,sessions:p,selectedStreamId:S,onSelectStream:j,recentMessages:d,resolvedThemeId:g}),A&&a.jsx(Hz,{stream:A,messages:d[A.id]??[],transcriptLoading:T,onClose:()=>j(void 0)})]})}function zU(){const t=w9(),[s]=Dm(),o=s.get("env")??"",{sessions:{sendInput:r,spawn:c},tasks:{startTask:d},personas:{personas:u},environments:{environments:p,provisionEnvironment:m}}=pt(),{showToast:g}=pn();return a.jsxs("div",{className:W.panelContainer,children:[a.jsx(ha,{segments:t}),a.jsx("div",{className:W.emptyState,children:"Enter a prompt below to start a new session"}),a.jsx(Sd,{mode:"spawn",environmentId:o,showPersonaSelect:!0,personas:u,environments:p,onSendInput:(v,b)=>{r(v,b).catch(()=>{g("Failed to send message","error")})},onSpawn:(v,b,_)=>{c(v,b,_).catch(()=>{})},onStartTask:(v,b,_)=>{d(v,b,_).catch(()=>{})},onProvisionEnvironment:v=>{m(v).catch(()=>{})},onShowToast:g})]})}function $U(){return a.jsxs("div",{className:W.panelContainer,"aria-hidden":"true",children:[a.jsxs("div",{className:W.header,children:[a.jsx("span",{children:a.jsx(Te,{width:"10rem",height:"0.875rem"})}),a.jsx("span",{className:W.headerInfo,children:a.jsx(Te,{width:"16rem",height:"0.875rem"})})]}),a.jsx("div",{className:W.eventScroll,children:a.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"var(--space-md)"},children:[a.jsx(Te,{width:"70%",height:"2.5rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"90%",height:"4rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"50%",height:"2rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"80%",height:"3.5rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"60%",height:"2.5rem",borderRadius:"var(--radius-sm)"})]})})]})}function HU({sessionId:t,session:s,isActive:o,onStop:r,onKill:c}){return a.jsxs("div",{className:W.header,children:[a.jsxs("span",{children:["Session: ",t.slice(0,8),s&&` | ${s.runtime} | ${s.endReason||s.status}`,s!=null&&s.inputTokens||s!=null&&s.outputTokens||s!=null&&s.costMillicents?` | ${Ho((s.inputTokens??0)+(s.outputTokens??0))} tokens · ${Rs(s.costMillicents??0)}`:""]}),a.jsxs("span",{className:W.headerInfo,children:[s&&a.jsx("span",{children:s.prompt.length>60?s.prompt.slice(0,60)+"...":s.prompt}),o&&a.jsx(gx,{label:"Stop",onClick:r,variant:"danger",size:"sm","data-testid":"stop-split-button",options:[{label:"Stop",description:"Graceful shutdown",onClick:r},{label:"Kill",description:"Force kill",onClick:c}]})]})]})}function PU({session:t}){const s=t&&(t.status==="stopped"||t.status==="suspended"),o=s?`Session ${t.endReason||t.status} with no events recorded.`:"Waiting for events...";return a.jsx("div",{className:s?W.errorMessage:W.waitingMessage,children:o})}function UU(){const{sessionId:t}=ma(),s=kh(),{sessions:{events:o,eventsDropped:r,sessions:c,sessionsLoading:d,kill:u,stopGraceful:p,loadSessionEvents:m,sendInput:g,spawn:v},tasks:{startTask:b},personas:{personas:_},environments:{environments:k,provisionEnvironment:S}}=pt(),{showToast:j}=pn(),T=y.useRef(void 0),N=C9(t),C=c.find(E=>E.id===t)??void 0,D=y.useMemo(()=>{const E=t?o.filter(R=>R.sessionId===t):[];return xh(_h(E))},[o,t]);if(y.useEffect(()=>{t&&t!==T.current&&(T.current=t,m(t).catch(()=>{}))},[t,m]),!C&&d)return a.jsx($U,{});if(!t)return a.jsx("div",{className:W.emptyState,children:"No session selected"});const A=(C==null?void 0:C.status)==="running"||(C==null?void 0:C.status)==="idle";return a.jsxs("div",{className:W.panelContainer,children:[a.jsx(ha,{segments:N}),a.jsx(HU,{sessionId:t,session:C,isActive:A,onStop:()=>{p(t).catch(()=>{})},onKill:()=>{u(t).catch(()=>{})}}),a.jsx(mh,{events:D,eventsDropped:r,emptyState:a.jsx(PU,{session:C}),onShowToast:j,sandboxProxyUrl:s,sessions:c,currentSessionId:t,environments:k,personas:_,onForward:(E,R)=>g(E,R)}),A&&a.jsx(Sd,{mode:"send",sessionId:t,environmentId:C.environmentId,personas:_,environments:k,onSendInput:(E,R)=>{g(E,R).catch(()=>{j("Failed to send message","error")})},onSpawn:(E,R,O)=>{v(E,R,O).catch(()=>{})},onStartTask:(E,R,O)=>{b(E,R,O).catch(()=>{})},onProvisionEnvironment:E=>{S(E).catch(()=>{})},onShowToast:j})]})}function VU(t){if(!t)return!1;const s=t.tagName;return!!(s==="INPUT"||s==="TEXTAREA"||s==="SELECT"||t.isContentEditable)}function Za(t,s){const o=y.useRef(s);o.current=s;const{key:r,ctrl:c=!1,shift:d=!1,suppressInInputs:u=!0,enabled:p=!0}=t;y.useEffect(()=>{if(!p)return;const m=g=>{if(u&&VU(document.activeElement??void 0))return;const v=g.ctrlKey||g.metaKey;c===v&&(d&&!g.shiftKey||g.key===r&&o.current())};return document.addEventListener("keydown",m),()=>{document.removeEventListener("keydown",m)}},[r,c,d,u,p])}function qU(){return a.jsxs("div",{className:W.panelContainer,"aria-hidden":"true",children:[a.jsx("div",{className:W.workspaceHeader,children:a.jsx("span",{className:W.workspaceName,children:a.jsx(Te,{width:"12rem",height:"1.25rem"})})}),a.jsx("div",{className:W.metaToggle,style:{cursor:"default"},children:a.jsx(Te,{width:"4rem",height:"0.625rem"})}),a.jsxs("div",{className:W.progressBarContainer,children:[a.jsx("div",{className:W.progressBar,children:a.jsx("div",{className:W.progressFill,style:{width:"0%"}})}),a.jsx(Te,{width:"2rem",height:"0.625rem"})]}),a.jsxs("div",{className:W.tabBar,role:"tablist","aria-label":"Workspace view",children:[a.jsx("span",{className:`${W.tab} ${W.active}`,children:"Graph"}),a.jsx("span",{className:W.tab,children:"Board"}),a.jsx("span",{className:W.tab,children:"Tasks"})]}),a.jsx("div",{className:W.overviewContent,children:Array.from({length:3},(t,s)=>a.jsx(um,{lines:2},s))})]})}function j_(t){if(!t)return"";const s=new Date(t);if(isNaN(s.getTime()))return"";const r=Date.now()-s.getTime();if(r<0)return"just now";const c=Math.floor(r/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 u=Math.floor(d/24);return u<30?`${u}d ago`:s.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}const Hp=100;function GU(t){try{const s=new URL(t);return s.protocol!=="http:"&&s.protocol!=="https:"?void 0:s.toString()}catch{return}}function FU(){const{workspaceId:t,environmentId:s}=ma(),o=xt(),{tasks:{tasks:r},environments:{environments:c},workspaces:{workspaces:d,workspacesLoading:u,archiveWorkspace:p,updateWorkspace:m,linkEnvironment:g,unlinkEnvironment:v,linkOperationError:b,clearLinkOperationError:_},personas:{personas:k},sessions:{sessions:S},usageCache:j,loadUsage:T}=pt(),{resolvedThemeId:N}=yh(),[C,D]=y.useState("tasks"),[A,E]=y.useState(!1),[R,O]=y.useState(null),[M,$]=y.useState(!1),Y=y.useRef(void 0),V=d.find(ee=>ee.id===t),ne=s??(V==null?void 0:V.linkedEnvironmentIds[0])??"",le=E9(t,ne,d,c);Za({key:"1"},()=>D("graph")),Za({key:"2"},()=>D("board")),Za({key:"3"},()=>D("tasks")),y.useEffect(()=>{const ee=Y.current;Y.current=t,!(ee===void 0||ee===t)&&R!==null&&O(null)},[t,R]);const Z=S.reduce((ee,ce)=>ee+(ce.costMillicents??0),0);y.useEffect(()=>{t&&T("workspace",t).catch(()=>{})},[t,T,Z]);const se=t?j[`workspace:${t}`]:void 0,H=r.filter(ee=>ee.workspaceId===t),B=H.filter(ee=>ee.status==="complete").length,F=H.length,ge=F>0?Math.round(B/F*100):0;return!V&&u?a.jsx(qU,{}):a.jsxs("div",{className:W.panelContainer,children:[a.jsx(ha,{segments:le}),a.jsxs("div",{className:W.workspaceHeader,children:[a.jsx("span",{className:W.workspaceName,"data-testid":"workspace-name",children:a.jsx(zt,{value:(V==null?void 0:V.name)||"",onSave:ee=>{V&&m(V.id,{name:ee}).catch(()=>{})},validate:ee=>{const ce=ee.trim();if(!ce)return"Name is required";if(ce.length>Hp)return`Max ${Hp} characters`},maxLength:Hp,fieldId:"name",activeFieldId:R,onActivate:O,ariaLabel:"Workspace name",renderDisplay:ee=>ee||t||void 0,"data-testid":"edit-name"})}),a.jsx("button",{className:W.archiveButton,onClick:()=>E(!0),title:"Archive workspace","data-testid":"archive-workspace-button",children:"Archive"})]}),a.jsxs("button",{className:W.metaToggle,onClick:()=>$(!M),"aria-expanded":!M,"aria-controls":"workspace-meta-panel","data-testid":"meta-toggle",children:[a.jsx("span",{className:`${W.metaToggleArrow} ${M?"":W.metaToggleArrowOpen}`,children:"▶"}),"Details"]}),!M&&a.jsxs("div",{className:W.workspaceMeta,"data-testid":"workspace-meta",id:"workspace-meta-panel",children:[a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Description"}),a.jsx("div",{className:W.metaValue,children:a.jsx(fm,{value:(V==null?void 0:V.description)||"",onSave:ee=>{V&&m(V.id,{description:ee}).catch(()=>{})},fieldId:"description",activeFieldId:R,onActivate:O,renderDisplay:ee=>ee?a.jsx("span",{className:W.overviewMarkdown,children:a.jsx(_m,{remarkPlugins:[xm],children:ee})}):void 0,placeholder:"No description",ariaLabel:"Workspace description","data-testid":"edit-description"})})]}),a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Repository"}),a.jsx("div",{className:W.metaValue,children:a.jsx(zt,{value:(V==null?void 0:V.repoUrl)||"",onSave:ee=>{V&&m(V.id,{repoUrl:ee}).catch(()=>{})},validate:ee=>{const ce=ee.trim();if(ce&&!/^https?:\/\/.+/.test(ce))return"Must be a valid http(s) URL"},fieldId:"repoUrl",activeFieldId:R,onActivate:O,renderDisplay:ee=>{const ce=GU(ee);return ce?a.jsx("a",{className:W.repoLink,href:ce,target:"_blank",rel:"noopener noreferrer",onClick:me=>me.stopPropagation(),children:ee}):ee?a.jsx("span",{children:ee}):void 0},placeholder:"No repository",ariaLabel:"Workspace repository URL","data-testid":"edit-repo"})})]}),a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Environments"}),a.jsx("div",{className:W.metaValue,"data-testid":"linked-environments",children:V?a.jsxs("span",{className:W.linkedEnvList,children:[(()=>{const ee=[...new Set(V.linkedEnvironmentIds)];return ee.length===0?a.jsx("span",{className:W.metaPlaceholder,children:"None"}):ee.map(ce=>{const me=c.find(xe=>xe.id===ce);return a.jsxs("span",{className:W.linkedEnvChip,"data-testid":`linked-env-${ce}`,children:[(me==null?void 0:me.displayName)||ce,a.jsx("button",{className:W.chipDismiss,onClick:()=>{v(V.id,ce).catch(()=>{})},title:`Unlink ${(me==null?void 0:me.displayName)||ce}`,"aria-label":`Unlink ${(me==null?void 0:me.displayName)||ce}`,"data-testid":`unlink-env-${ce}`,disabled:ee.length<=1,children:"x"})]},ce)})})(),(()=>{const ee=new Set(V.linkedEnvironmentIds),ce=c.filter(me=>!ee.has(me.id));return ce.length===0?null:a.jsxs("select",{className:W.linkEnvSelect,value:"",onChange:me=>{me.target.value&&g(V.id,me.target.value).catch(()=>{})},"aria-label":"Link environment","data-testid":"link-env-select",children:[a.jsx("option",{value:"",children:"+ Link"}),ce.map(me=>a.jsx("option",{value:me.id,children:me.displayName||me.id},me.id))]})})(),b&&a.jsxs("span",{className:W.linkError,"data-testid":"link-operation-error",role:"alert",children:[b,a.jsx("button",{className:W.chipDismiss,onClick:_,"aria-label":"Dismiss error","data-testid":"dismiss-link-error",children:"x"})]})]}):a.jsx("span",{className:W.metaPlaceholder,children:"None"})})]}),a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Persona"}),a.jsx("div",{className:W.metaValue,children:a.jsx(bd,{value:(V==null?void 0:V.defaultPersonaId)||"",onSave:ee=>{V&&m(V.id,{defaultPersonaId:ee}).catch(()=>{})},options:[{value:"",label:"(Inherit)"},...k.map(ee=>({value:ee.id,label:ee.name}))],fieldId:"defaultPersonaId",activeFieldId:R,onActivate:O,renderDisplay:ee=>{const ce=k.find(me=>me.id===ee);if(ce)return a.jsx("span",{children:ce.name})},placeholder:(V==null?void 0:V.defaultPersonaId)||"(Inherit)",ariaLabel:"Workspace default persona","data-testid":"edit-persona"})})]}),a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Worktrees"}),a.jsx("div",{className:W.metaValue,children:a.jsx(YI,{checked:(V==null?void 0:V.useWorktrees)??!0,onChange:ee=>{V&&m(V.id,{useWorktrees:ee}).catch(()=>{})},label:"Enable worktree isolation","data-testid":"worktree-toggle"})})]}),a.jsxs("div",{className:W.metaRow,children:[a.jsx("span",{className:W.metaLabel,children:"Working Dir"}),a.jsx("div",{className:W.metaValue,children:a.jsx(zt,{value:(V==null?void 0:V.workingDirectory)||"",onSave:ee=>{V&&m(V.id,{workingDirectory:ee}).catch(()=>{})},fieldId:"workingDirectory",activeFieldId:R,onActivate:O,placeholder:"Default (server default)",ariaLabel:"Working directory","data-testid":"edit-working-directory"})})]}),V&&a.jsxs("div",{className:W.metaTimestamps,children:[a.jsxs("span",{className:W.metaTimestamp,children:["Created ",j_(V.createdAt)]}),V.updatedAt&&V.updatedAt!==V.createdAt&&a.jsxs("span",{className:W.metaTimestamp,children:["· Updated ",j_(V.updatedAt)]})]})]}),F>0&&a.jsxs("div",{className:W.progressBarContainer,"data-testid":"progress-bar",children:[a.jsx("div",{className:W.progressBar,children:a.jsx("div",{className:W.progressFill,style:{width:`${ge}%`}})}),a.jsxs("span",{className:W.progressLabel,children:[B,"/",F]})]}),se&&se.costMillicents>0&&a.jsx("div",{className:W.progressBarContainer,children:a.jsxs("span",{className:W.progressLabel,children:["Usage: ",Rs(se.costMillicents)," (",se.sessionCount," session",se.sessionCount!==1?"s":"",")"]})}),V&&(V.tokenBudget>0||V.costBudgetMillicents>0)&&a.jsx("div",{className:W.progressBarContainer,children:a.jsxs("span",{className:W.progressLabel,children:["Budget:"," ",V.tokenBudget>0&&a.jsxs(a.Fragment,{children:["Tokens: ",Ho(((se==null?void 0:se.inputTokens)??0)+((se==null?void 0:se.outputTokens)??0))," / ",Ho(V.tokenBudget)]}),V.tokenBudget>0&&V.costBudgetMillicents>0&&" | ",V.costBudgetMillicents>0&&a.jsxs(a.Fragment,{children:["Cost: ",Rs((se==null?void 0:se.costMillicents)??0)," / ",Rs(V.costBudgetMillicents)]})]})}),a.jsxs("div",{className:W.tabBar,role:"tablist","aria-label":"Workspace view",children:[a.jsx("button",{role:"tab","aria-selected":C==="graph",className:`${W.tab} ${C==="graph"?W.active:""}`,onClick:()=>D("graph"),children:"Graph"}),a.jsx("button",{role:"tab","aria-selected":C==="board",className:`${W.tab} ${C==="board"?W.active:""}`,onClick:()=>D("board"),"data-testid":"board-tab",children:"Board"}),a.jsx("button",{role:"tab","aria-selected":C==="tasks",className:`${W.tab} ${C==="tasks"?W.active:""}`,onClick:()=>D("tasks"),children:"Tasks"})]}),C==="tasks"&&F>0&&a.jsxs("div",{className:W.workspaceSummary,children:[a.jsx("span",{className:W.workspaceSummaryTitle,children:`${B}/${F} tasks complete`}),a.jsx("span",{className:W.workspaceSummarySubtitle,children:"Select a task or click + to create one"})]}),C==="tasks"&&F===0&&a.jsxs("div",{className:W.emptyCta,children:[a.jsx("button",{className:W.ctaButton,onClick:()=>o(Ri(t,void 0,ne)),children:"Create Task"}),a.jsx("div",{className:W.ctaDescription,children:"Break your work into tasks and let agents tackle them"})]}),C==="board"&&a.jsx(X$,{workspaceId:t,environmentId:ne,tasks:r,sessions:S,personas:k,environments:c}),C==="graph"&&a.jsx(fC,{workspaceId:t,environmentId:ne,tasks:r,resolvedThemeId:N}),a.jsx(_s,{isOpen:A,title:"Archive Workspace?",description:"This will hide the workspace from the sidebar. Tasks will not be deleted.",confirmLabel:"Archive",onConfirm:()=>{V&&(p(V.id).catch(()=>{}),o("/",{replace:!0})),E(!1)},onCancel:()=>E(!1)})]})}const KU="_container_3pgew_1",ZU="_header_3pgew_8",YU="_headerTitle_3pgew_35",JU="_headerActions_3pgew_44",WU="_body_3pgew_51",XU="_btnPrimary_3pgew_63",QU="_btnGhost_3pgew_94",eV="_error_3pgew_116",Fa={container:KU,header:ZU,headerTitle:YU,headerActions:JU,body:WU,btnPrimary:XU,btnGhost:QU,error:eV};function tV(t){const s={};return t.name.trim()||(s.name="Name is required"),t.repoUrl.trim()&&!/^https?:\/\/.+/i.test(t.repoUrl.trim())&&(s.repoUrl="Must be a valid http(s) URL"),t.environmentId||(s.environmentId="Environment is required"),Object.keys(s).length>0?s:void 0}const nV=[{label:"Home",url:Fo},{label:"New Workspace",url:void 0}];function sV(){const[t]=Dm(),s=t.get("environment")??void 0,{environments:{environments:o},personas:{personas:r},workspaces:{createWorkspace:c,workspaceCreating:d}}=pt(),{showToast:u}=pn(),p=xt(),[m,g]=y.useState(()=>{var T;return c9(void 0,s||((T=o[0])==null?void 0:T.id))}),[v,b]=y.useState(),[_,k]=y.useState();y.useEffect(()=>{s||m.environmentId||o.length===0||g(T=>{var N;return T.environmentId?T:{...T,environmentId:((N=o[0])==null?void 0:N.id)??""}})},[o,s,m.environmentId]);const S=()=>{const T=tV(m);if(T){b(T),k(void 0);return}b(void 0),k(void 0),c(m.name.trim(),m.description,m.repoUrl.trim(),m.environmentId,m.defaultPersonaId,m.useWorktrees,m.workingDirectory,N=>{u("Workspace created","success"),p(wi(N.id,N.linkedEnvironmentIds[0]??m.environmentId),{replace:!0})},N=>{k(N)}).catch(()=>{})},j=()=>{p(s?$o(s):Fo,{replace:!0})};return a.jsxs("div",{className:Fa.container,children:[a.jsxs("div",{className:Fa.header,children:[a.jsx("div",{className:Fa.headerTitle,children:a.jsx(ha,{segments:nV})}),a.jsxs("div",{className:Fa.headerActions,children:[a.jsx("button",{className:Fa.btnGhost,onClick:j,disabled:d,"data-testid":"workspace-create-cancel",children:"Cancel"}),a.jsx("button",{className:Fa.btnPrimary,onClick:S,disabled:d||!m.name.trim()||!m.environmentId,"data-testid":"workspace-create-save",children:d?a.jsx(K1,{size:"sm",label:"Creating"}):"Create Workspace"})]})]}),a.jsxs("div",{className:Fa.body,children:[a.jsx(u9,{values:m,onChange:T=>{g(T),b(void 0),k(void 0)},environments:o,personas:r,errors:v,disabled:d,autoFocusName:!0}),_&&a.jsx("div",{className:Fa.error,"data-testid":"workspace-create-submit-error",children:_})]})]})}function T_(){const{workspaceId:t,environmentId:s}=ma(),[o]=Dm(),r=t??o.get("workspace")??"",c=o.get("parent")??void 0,{tasks:{tasks:d,createTask:u,updateTask:p},workspaces:{workspaces:m},personas:{personas:g}}=pt(),{showToast:v}=pn();return a.jsx(ok,{mode:"new",workspaceId:r,parentTaskId:c,environmentId:s,tasks:d,workspaces:m,personas:g,onCreateTask:(b,_,k,S,j,T,N,C,D,A)=>{u(b,_,k,S,j,T,N,C,D,A).catch(()=>{})},onUpdateTask:(b,_,k,S,j)=>{p(b,_,k,S,j).catch(()=>{})},onShowToast:v})}function aV(){return a.jsxs("div",{className:W.panelContainer,"aria-hidden":"true",children:[a.jsx("div",{className:W.header,children:a.jsxs("span",{className:W.headerTitle,children:[a.jsx(Te,{width:"12rem",height:"1rem"}),a.jsx(Te,{width:"4rem",height:"1rem",borderRadius:"var(--radius-full)"})]})}),a.jsxs("div",{className:W.tabBar,role:"tablist","aria-label":"Task view",children:[a.jsx("span",{className:`${W.tab} ${W.active}`,children:"Overview"}),a.jsx("span",{className:W.tab,children:"Stream"})]}),a.jsx("div",{className:W.overviewContent,children:a.jsxs("div",{className:W.overviewDashboard,children:[a.jsx("div",{className:W.overviewHero,children:a.jsx(Te,{width:"5rem",height:"1.5rem",borderRadius:"var(--radius-full)"})}),a.jsxs("div",{className:W.overviewSection,children:[a.jsx("div",{className:W.overviewLabel,children:"Description"}),a.jsx(dm,{lines:2})]}),a.jsxs("div",{className:W.overviewSection,children:[a.jsx("div",{className:W.overviewLabel,children:"Environment"}),a.jsxs("div",{className:W.envRow,children:[a.jsx(Te,{width:"0.5rem",height:"0.5rem",variant:"circular"}),a.jsx(Te,{width:"8rem",height:"0.875rem"})]})]}),a.jsxs("div",{className:W.overviewSection,children:[a.jsx("div",{className:W.overviewLabel,children:"Dependencies"}),a.jsx(dm,{lines:2})]}),a.jsxs("div",{className:W.overviewSection,children:[a.jsx("div",{className:W.overviewLabel,children:"Timeline"}),a.jsx("div",{className:W.timeline,children:Array.from({length:4},(t,s)=>a.jsxs("div",{className:W.timelineRow,children:[a.jsx(Te,{width:"4rem",height:"0.75rem"}),a.jsx(Te,{width:"10rem",height:"0.75rem"})]},s))})]})]})})]})}function Eo(){const{taskId:t,workspaceId:s,environmentId:o}=ma(),r=kh(),c=Wt(),d=xt(),{showToast:u}=pn(),{sessions:{events:p,eventsDropped:m,sessions:g,loadSessionEvents:v,taskSessions:b,loadTaskSessions:_,sendInput:k,spawn:S,kill:j},tasks:{tasks:T,tasksLoading:N,startTask:C,stopTask:D,resumeTask:A,deleteTask:E,createTask:R,updateTask:O},environments:{environments:M,provisionEnvironment:$},workspaces:{workspaces:Y},personas:{personas:V},usageCache:ne,loadUsage:le}=pt(),Z=y.useRef(void 0),se=y.useRef(void 0),H=y.useRef(void 0),B=y.useRef(void 0),F=y.useRef(void 0),ge=c.pathname.endsWith("/stream")?"stream":"overview",ee=c.pathname.endsWith("/edit"),[ce,me]=y.useState(ge),[xe,De]=y.useState(!1),[ot,bt]=y.useState(void 0),[lt,Pe]=y.useState(""),[ke,ct]=y.useState(ee),ue=y.useRef(ge),Re=y.useRef(ee),Q=T.find(we=>we.id===t),nt=(Q==null?void 0:Q.workspaceId)||void 0,re=Y.find(we=>we.id===nt);y.useEffect(()=>{ge!==ue.current&&(ue.current=ge,ge!==ce&&me(ge))},[ge,ce]),y.useEffect(()=>{ee!==Re.current&&(Re.current=ee,ee!==ke&&ct(ee))},[ee,ke]),y.useEffect(()=>{if(lt===""){if(re!=null&&re.linkedEnvironmentIds[0])Pe(re.linkedEnvironmentIds[0]);else if(M.length>0){const we=M.find(Ve=>Ve.status==="connected");Pe((we==null?void 0:we.id)??M[0].id)}}},[lt,re==null?void 0:re.linkedEnvironmentIds[0],M]);const ve=Q?b[Q.id]??[]:[];let et;ot&&ve.some(we=>we.id===ot)?et=ot:et=(Q==null?void 0:Q.latestSessionId)||void 0;const an=()=>{De(!0)},ks=()=>{if(!Q)return;E(Q.id).catch(()=>{}),De(!1);const we=o??(re==null?void 0:re.linkedEnvironmentIds[0]);d(Q.workspaceId&&we?wi(Q.workspaceId,we):"/",{replace:!0})};y.useEffect(()=>{(Q==null?void 0:Q.id)!==se.current&&(se.current=Q==null?void 0:Q.id,bt(void 0),Pe(""),ct(ee))},[Q==null?void 0:Q.id,ee]),y.useEffect(()=>{if(!(Q!=null&&Q.id))return;const we=Q.id!==B.current,Ve=Q.latestSessionId!==F.current;(we||Ve)&&(B.current=Q.id,F.current=Q.latestSessionId,_(Q.id).catch(()=>{}))},[Q==null?void 0:Q.id,Q==null?void 0:Q.latestSessionId,_]),y.useEffect(()=>{if((Q==null?void 0:Q.status)!==H.current){const we=H.current===void 0;H.current=Q==null?void 0:Q.status;const Ve=(Q==null?void 0:Q.status)==="not_started"?"overview":(Q==null?void 0:Q.status)==="working"||(Q==null?void 0:Q.status)==="paused"?"stream":(Q==null?void 0:Q.status)==="complete"?"overview":void 0;Ve&&Ve!==ce&&!(we&&ge!=="overview")&&me(Ve)}},[Q==null?void 0:Q.status,ce,ge]);const ds=y.useMemo(()=>new Map(T.map(we=>[we.id,we])),[T]),zs=y.useMemo(()=>{const we=et?p.filter(Ve=>Ve.sessionId===et):[];return xh(_h(we))},[p,et]),ga=Q?Q.dependsOn.some(we=>{const Ve=ds.get(we);return Ve!==void 0&&Ve.status!=="complete"}):!1,Oi=y.useMemo(()=>A9(t,o,Y,M,ds),[t,o,Y,M,ds]);y.useEffect(()=>{et&&et!==Z.current&&(Z.current=et,v(et).catch(()=>{}))},[et,v]);const Xt=ve.reduce((we,Ve)=>we+(Ve.costMillicents??0),0);y.useEffect(()=>{Q&&(le("task",Q.id).catch(()=>{}),Q.childTaskIds.length>0&&le("task_tree",Q.id).catch(()=>{}))},[Q==null?void 0:Q.id,Q==null?void 0:Q.childTaskIds.length,le,Xt]);const Qa=Q?`task:${Q.id}`:"",ei=Qa in ne?ne[Qa]:void 0,va=Q?`task_tree:${Q.id}`:"",$s=Q&&Q.childTaskIds.length>0&&va in ne?ne[va]:void 0,Ss=we=>{me(we),d(ls(t,we==="overview"?void 0:we,s,o))};return Za({key:"1"},()=>Ss("overview")),Za({key:"2"},()=>Ss("stream")),!Q&&N?a.jsx(aV,{}):a.jsxs("div",{className:W.panelContainer,children:[a.jsx(ha,{segments:Oi}),a.jsxs("div",{className:W.header,children:[a.jsxs("span",{className:W.headerTitle,children:[a.jsx("span",{"data-testid":"task-title",children:(Q==null?void 0:Q.title)||t}),Q&&a.jsx("span",{className:W.taskStatusBadge,"data-testid":"task-status",children:Q.status}),(Q==null?void 0:Q.branch)&&a.jsx("span",{className:W.taskBranch,children:Q.branch}),ga&&a.jsx("span",{className:W.taskBlockedBadge,children:"blocked"})]}),Q&&a.jsx(_L,{task:Q,sessionId:et,isBlocked:ga,onStart:()=>{C(Q.id,void 0,lt).catch(we=>{const Ve=we instanceof da?we.message:"Failed to start task";u(Ve,"error")})},onResume:()=>{A(Q.id).catch(()=>{})},onStop:()=>{D(Q.id).catch(()=>{})},onPause:()=>{et&&j(et).catch(()=>{})},onDelete:an,onEdit:()=>ct(!0)})]}),a.jsxs("div",{className:W.tabBar,role:"tablist","aria-label":"Task view",children:[a.jsx("button",{role:"tab","aria-selected":ce==="overview",className:`${W.tab} ${ce==="overview"?W.active:""}`,onClick:()=>Ss("overview"),children:"Overview"}),a.jsx("button",{role:"tab","aria-selected":ce==="stream",className:`${W.tab} ${ce==="stream"?W.active:""}`,onClick:()=>Ss("stream"),children:"Stream"})]}),a.jsxs(os,{mode:"wait",children:[ce==="overview"&&a.jsx(Pt.div,{initial:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,y:-4},transition:{duration:.15},className:W.overviewContent,"data-testid":"task-overview",children:ke&&Q?a.jsx(ok,{mode:"edit",taskId:Q.id,workspaceId:nt,environmentId:o,tasks:T,workspaces:Y,personas:V,onCreateTask:(we,Ve,_n,mn,Ut,Cn,Qt,Bi,Li,zi)=>{R(we,Ve,_n,mn,Ut,Cn,Qt,Bi,Li,zi).catch(()=>{})},onUpdateTask:(we,Ve,_n,mn,Ut)=>{O(we,Ve,_n,mn,Ut).catch(()=>{})},onEditDone:()=>{ee?d(ls(Q.id,void 0,s,o),{replace:!0}):ct(!1)},onShowToast:u}):Q?a.jsx(r8,{task:Q,tasksById:ds,environments:M,workspaces:Y,taskSessions:ve,selectedEnvId:lt,taskUsage:ei,treeUsage:$s}):a.jsx("div",{className:W.waitingMessage,children:"No additional details"})},"overview"),ce==="stream"&&a.jsxs(Pt.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:[a.jsx(C6,{taskSessions:ve,selectedSessionId:et,onSelect:we=>bt(we)}),a.jsx(mh,{events:zs,eventsDropped:m,sandboxProxyUrl:r,emptyState:!et&&Q?ga?a.jsx("div",{className:W.emptyCta,"data-testid":"stream-blocked-message",children:a.jsx("div",{className:W.ctaDescription,children:"This task is blocked by incomplete dependencies"})}):a.jsxs("div",{className:W.emptyCta,children:[a.jsx("button",{"data-testid":"stream-start-cta",className:W.ctaButton,onClick:()=>{C(Q.id,void 0,lt).catch(we=>{const Ve=we instanceof da?we.message:"Failed to start task";u(Ve,"error")})},children:"Start Task"}),a.jsx("div",{className:W.ctaDescription,children:"Click to begin agent execution"})]}):et&&zs.length===0?a.jsx("div",{className:W.waitingMessage,children:"Waiting for events..."}):void 0,onShowToast:u})]},"stream")]}),(()=>{if(!Q||Q.status!=="working"&&Q.status!=="paused")return;const we=et?g.find(Ve=>Ve.id===et):void 0;if(!(!we||we.status==="stopped"))return a.jsx(Sd,{mode:"send",sessionId:we.id,environmentId:we.environmentId,personas:V,environments:M,onSendInput:(Ve,_n)=>{k(Ve,_n).catch(()=>{u("Failed to send message","error")})},onSpawn:(Ve,_n,mn)=>{S(Ve,_n,mn,void 0,nt).catch(()=>{})},onStartTask:(Ve,_n,mn)=>{C(Ve,_n,mn).catch(()=>{})},onProvisionEnvironment:Ve=>{$(Ve).catch(()=>{})},onShowToast:u})})(),Q&&a.jsx(_s,{isOpen:xe,title:"Delete Task?",description:`"${Q.title}" will be permanently removed.`,onConfirm:ks,onCancel:()=>De(!1)})]})}function iV(){const{environments:{environments:t,addEnvironment:s,updateEnvironment:o},codespaces:{codespaces:r,codespaceError:c,codespaceListError:d,codespaceCreating:u,listCodespaces:p,createCodespace:m},dockerContainers:{dockerContainers:g,dockerContainersError:v,listDockerContainers:b},githubAccounts:{githubAccounts:_}}=pt(),{showToast:k}=pn();return a.jsx(rk,{mode:"new",environments:t,githubAccounts:_,onAddEnvironment:(S,j,T,N)=>{s(S,j,T,N).catch(()=>{})},onUpdateEnvironment:(S,j)=>{o(S,j).catch(()=>{})},onListCodespaces:S=>{p(S).catch(()=>{})},codespaces:r,codespaceError:c,codespaceListError:d,codespaceCreating:u,onCreateCodespace:(S,j)=>{m(S,j).catch(()=>{})},onListDockerContainers:()=>{b().catch(()=>{})},dockerContainers:g,dockerContainersError:v,onShowToast:k})}function oV(){const{environmentId:t}=ma(),{environments:{environments:s,addEnvironment:o,updateEnvironment:r},codespaces:{codespaces:c,codespaceError:d,codespaceListError:u,codespaceCreating:p,listCodespaces:m,createCodespace:g},dockerContainers:{dockerContainers:v,dockerContainersError:b,listDockerContainers:_},githubAccounts:{githubAccounts:k}}=pt(),{showToast:S}=pn();return a.jsx(rk,{mode:"edit",environmentId:t,environments:s,githubAccounts:k,onAddEnvironment:(j,T,N,C)=>{o(j,T,N,C).catch(()=>{})},onUpdateEnvironment:(j,T)=>{r(j,T).catch(()=>{})},onListCodespaces:j=>{m(j).catch(()=>{})},codespaces:c,codespaceError:d,codespaceListError:u,codespaceCreating:p,onCreateCodespace:(j,T)=>{g(j,T).catch(()=>{})},onListDockerContainers:()=>{_().catch(()=>{})},dockerContainers:v,dockerContainersError:b,onShowToast:S})}const rV="_layout_11u79_1",lV="_content_11u79_8",cV="_tabPanel_11u79_14",sl={layout:rV,content:lV,tabPanel:cV};function dV(){const t=N9();return a.jsxs("div",{className:sl.layout,children:[a.jsx(ha,{segments:t}),a.jsx("div",{className:sl.content,children:a.jsx(Mi,{})})]})}const uV="_container_144a4_1",fV="_envHeader_144a4_6",pV="_envTitleRow_144a4_10",mV="_statusDot_144a4_16",hV="_envName_144a4_21",gV="_statusBadge_144a4_27",vV="_envMeta_144a4_33",yV="_metaTag_144a4_39",bV="_actions_144a4_51",_V="_provisionMessage_144a4_59",xV="_errorMessage_144a4_64",kV="_section_144a4_69",SV="_sectionHeader_144a4_73",jV="_cardList_144a4_121",TV="_card_144a4_121",NV="_cardHeader_144a4_138",wV="_cardName_144a4_144",CV="_cardActions_144a4_149",EV="_cardDescription_144a4_154",AV="_cardMeta_144a4_160",DV="_repoLink_144a4_166",MV="_empty_144a4_174",RV="_errorHint_144a4_180",IV="_btnPrimary_144a4_186",OV="_btnOutline_144a4_220",BV="_btnSmall_144a4_247",LV="_btnDanger_144a4_273",Me={container:uV,envHeader:fV,envTitleRow:pV,statusDot:mV,envName:hV,statusBadge:gV,envMeta:vV,metaTag:yV,actions:bV,provisionMessage:_V,errorMessage:xV,section:kV,sectionHeader:SV,cardList:jV,card:TV,cardHeader:NV,cardName:wV,cardActions:CV,cardDescription:EV,cardMeta:AV,repoLink:DV,empty:MV,errorHint:RV,btnPrimary:IV,btnOutline:OV,btnSmall:BV,btnDanger:LV};function zV(){return a.jsxs("div",{className:Me.container,"aria-hidden":"true",children:[a.jsxs("div",{className:Me.envHeader,children:[a.jsxs("div",{className:Me.envTitleRow,children:[a.jsx(Te,{width:"0.875rem",height:"0.875rem",variant:"circular"}),a.jsx(Te,{width:"12rem",height:"1.5rem"}),a.jsx(Te,{width:"4rem",height:"0.875rem"})]}),a.jsxs("div",{className:Me.envMeta,children:[a.jsx(Te,{width:"6rem",height:"1.25rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"5rem",height:"1.25rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"4.5rem",height:"1.25rem",borderRadius:"var(--radius-sm)"})]})]}),a.jsxs("div",{className:Me.actions,children:[a.jsx(Te,{width:"5rem",height:"2rem",borderRadius:"var(--radius-sm)"}),a.jsx(Te,{width:"4rem",height:"2rem",borderRadius:"var(--radius-sm)"})]}),a.jsxs("div",{className:Me.section,children:[a.jsx("div",{className:Me.sectionHeader,children:a.jsx("h3",{style:{margin:0},children:"Workspaces"})}),a.jsxs("div",{className:Me.cardList,children:[a.jsx(um,{lines:2}),a.jsx(um,{lines:2})]})]})]})}const $V={connected:"var(--accent-green)",sleeping:"var(--accent-yellow)",error:"var(--accent-red)",disconnected:"var(--text-tertiary)",connecting:"var(--accent-blue)"};function HV(){const{environmentId:t}=ma(),s=xt(),{environments:{environments:o,environmentsLoading:r,provisionStatus:c,provisionEnvironment:d,stopEnvironment:u,removeEnvironment:p},workspaces:{workspaces:m,archiveWorkspace:g,linkEnvironment:v,unlinkEnvironment:b,linkOperationError:_,clearLinkOperationError:k},sessions:{sessions:S}}=pt(),[j,T]=y.useState(!1),[N,C]=y.useState(!1),[D,A]=y.useState(void 0),E=o.find(B=>B.id===t);if(!E&&r)return a.jsx(zV,{});if(!t||!E)return a.jsx($n,{to:zo,replace:!0});const R=m.filter(B=>B.linkedEnvironmentIds.includes(E.id)),O=S.filter(B=>B.environmentId===E.id),M=O.reduce((B,F)=>B+(F.costMillicents??0),0),$=$V[E.status]||"var(--text-tertiary)",Y=E.status==="connected",V=E.status==="connecting",ne=E.status==="disconnected"||E.status==="error"||E.status==="sleeping",le=E.id in c?c[E.id]:void 0,Z=()=>{p(E.id).catch(()=>{}),T(!1),s(zo,{replace:!0})},se=()=>{C(!1),d(E.id,!0).catch(()=>{})},H=B=>{g(B).catch(()=>{}),A(void 0)};return a.jsxs("div",{className:Me.container,children:[a.jsx(_s,{isOpen:j,title:"Delete Environment?",description:`"${E.displayName||E.id}" will be permanently removed along with all its data.`,onConfirm:Z,onCancel:()=>T(!1)}),a.jsx(_s,{isOpen:N,title:"Reprovision Environment?",description:"This will kill any active session and force a fresh provision cycle. The environment will be temporarily disconnected.",confirmLabel:"Reprovision",onConfirm:se,onCancel:()=>C(!1)}),a.jsxs("div",{className:Me.envHeader,children:[a.jsxs("div",{className:Me.envTitleRow,children:[a.jsx("span",{className:Me.statusDot,style:{color:$},children:"●"}),a.jsx("h2",{className:Me.envName,children:E.displayName||E.id}),a.jsx("span",{className:Me.statusBadge,style:{color:$},children:E.status})]}),a.jsxs("div",{className:Me.envMeta,children:[a.jsxs("span",{className:Me.metaTag,children:["Adapter: ",E.adapterType]}),O.length>0&&a.jsxs("span",{className:Me.metaTag,children:[O.length," session",O.length!==1?"s":""]}),M>0&&a.jsxs("span",{className:Me.metaTag,children:["Cost: ",Rs(M)]})]})]}),a.jsxs("div",{className:Me.actions,children:[Y&&a.jsxs(a.Fragment,{children:[a.jsx("button",{className:Me.btnPrimary,onClick:()=>s(dx(E.id)),children:"New Chat"}),a.jsx("button",{className:Me.btnOutline,onClick:()=>{u(E.id).catch(()=>{})},children:"Stop"}),a.jsx("button",{className:Me.btnOutline,onClick:()=>C(!0),disabled:le!==void 0,"data-testid":"env-reprovision-btn",children:"Reprovision"})]}),ne&&a.jsx("button",{className:Me.btnPrimary,onClick:()=>{d(E.id).catch(()=>{})},children:E.status==="error"?"Retry":E.status==="sleeping"?"Wake":"Connect"}),V&&le!==void 0&&a.jsx("span",{className:Me.provisionMessage,children:le.message}),E.status==="error"&&(le==null?void 0:le.stage)==="error"&&a.jsx("span",{className:Me.errorMessage,children:le.message}),a.jsx("button",{className:Me.btnOutline,onClick:()=>s(nC(E.id)),"data-testid":"env-edit-btn",children:"Edit Config"}),a.jsx("button",{className:Me.btnDanger,onClick:()=>T(!0),children:"Delete"})]}),a.jsxs("div",{className:Me.section,children:[a.jsxs("div",{className:Me.sectionHeader,children:[a.jsx("h3",{children:"Workspaces"}),a.jsx("button",{className:Me.btnPrimary,onClick:()=>s(`${mx}?environment=${encodeURIComponent(E.id)}`),"data-testid":"workspace-create-button",children:"+ New Workspace"}),(()=>{const B=m.filter(F=>!F.linkedEnvironmentIds.includes(E.id)&&F.status==="active");return B.length===0?null:a.jsxs("select",{className:Me.btnPrimary,value:"",onChange:F=>{F.target.value&&v(F.target.value,E.id).catch(()=>{})},"aria-label":"Link a workspace","data-testid":"link-workspace-select",children:[a.jsx("option",{value:"",children:"+ Link Workspace"}),B.map(F=>a.jsx("option",{value:F.id,children:F.name},F.id))]})})()]}),_&&a.jsxs("p",{className:Me.errorHint,"data-testid":"link-operation-error",role:"alert",children:[_,a.jsx("button",{className:Me.btnSmall,onClick:k,"aria-label":"Dismiss error","data-testid":"dismiss-link-error",children:"Dismiss"})]}),R.length===0&&a.jsx("p",{className:Me.empty,"data-testid":"linked-workspaces-empty",children:"No workspaces yet. Create one to get started."}),a.jsx("div",{className:Me.cardList,"data-testid":"linked-workspaces-list",children:R.map(B=>a.jsx(PV,{workspace:B,confirmArchiveId:D,onOpen:()=>s(wi(B.id,E.id)),onArchive:()=>A(B.id),onConfirmArchive:()=>H(B.id),onCancelArchive:()=>A(void 0),onUnlink:()=>{b(B.id,E.id).catch(()=>{})}},B.id))})]})]})}function PV({workspace:t,confirmArchiveId:s,onOpen:o,onArchive:r,onConfirmArchive:c,onCancelArchive:d,onUnlink:u}){const p=s===t.id,m=t.repoUrl&&/^https?:\/\//.test(t.repoUrl);return a.jsxs("div",{className:Me.card,"data-testid":"workspace-card","data-workspace-id":t.id,children:[a.jsxs("div",{className:Me.cardHeader,children:[a.jsx("strong",{className:Me.cardName,children:t.name}),a.jsxs("div",{className:Me.cardActions,children:[a.jsx("button",{className:Me.btnSmall,onClick:o,children:"Open"}),a.jsx("button",{className:Me.btnSmall,onClick:u,disabled:t.linkedEnvironmentIds.length<=1,"data-testid":`unlink-workspace-${t.id}`,children:"Unlink"}),p?a.jsxs(a.Fragment,{children:[a.jsx("button",{className:Me.btnDanger,onClick:c,children:"Confirm"}),a.jsx("button",{className:Me.btnSmall,onClick:d,children:"Cancel"})]}):a.jsx("button",{className:Me.btnSmall,onClick:r,children:"Archive"})]})]}),t.description&&a.jsx("p",{className:Me.cardDescription,children:t.description}),t.repoUrl&&a.jsx("div",{className:Me.cardMeta,children:m?a.jsx("a",{href:t.repoUrl,target:"_blank",rel:"noopener noreferrer",className:Me.repoLink,children:t.repoUrl}):a.jsx("span",{children:t.repoUrl})})]})}const UV={credentials:"Credentials","github-accounts":"GitHub Accounts",personas:"Personas",schedules:"Schedules",appearance:"Appearance",about:"About",shortcuts:"Shortcuts",plugins:"Plugins"};function VV(){const s=Wt().pathname.replace(/^\/settings\/?/,"").split("/")[0],o=UV[s],r=T9(o);return a.jsxs("div",{className:sl.layout,children:[a.jsx(ha,{segments:r}),a.jsx("div",{className:sl.content,children:a.jsx("div",{className:sl.tabPanel,children:a.jsx(Mi,{})},s)})]})}function qV(){const{tokens:{tokens:t,setToken:s,deleteToken:o},credentials:{credentialProviders:r,updateCredentialProviders:c}}=pt(),{showToast:d}=pn();return a.jsxs(a.Fragment,{children:[a.jsx(H8,{credentialProviders:r,onUpdateCredentialProviders:u=>{c(u).catch(()=>{})}}),a.jsx(qB,{tokens:t,onSetToken:(u,p,m,g,v)=>{s(u,p,m,g,v).catch(()=>{})},onDeleteToken:u=>{o(u).catch(()=>{})},onShowToast:d})]})}function GV(){const{githubAccounts:{githubAccounts:t,githubAccountsLoading:s,addGitHubAccount:o,updateGitHubAccount:r,removeGitHubAccount:c,importGitHubAccounts:d}}=pt(),{showToast:u}=pn();return a.jsx(c8,{githubAccounts:t,githubAccountsLoading:s,onAddGitHubAccount:o,onUpdateGitHubAccount:r,onRemoveGitHubAccount:c,onImportGitHubAccounts:d,onShowToast:u})}function FV(){const{personas:{personas:t,deletePersona:s},appDefaultPersonaId:o,setAppDefaultPersonaId:r}=pt(),{showToast:c}=pn(),d=xt();return a.jsx(Q8,{personas:t,appDefaultPersonaId:o,onDeletePersona:async u=>{try{await s(u)}catch(p){throw console.error("Failed to delete persona",{personaId:u,error:p}),c("Failed to delete persona","error"),p}},onSetAppDefaultPersonaId:async u=>{try{await r(u)}catch(p){console.error("Failed to set app default persona ID",{personaId:u,error:p}),c("Failed to set app default persona","error")}},onNavigateToNew:()=>d(aC),onNavigateToPersona:u=>d(ux(u))})}const KV="_container_1ooin_1",ZV="_form_1ooin_7",YV="_formActions_1ooin_75",JV="_editableSection_1ooin_82",WV="_defaultBadge_1ooin_93",XV="_typeToggle_1ooin_107",QV="_scriptEditor_1ooin_121",eq="_optional_1ooin_128",vs={container:KV,form:ZV,formActions:YV,editableSection:JV,defaultBadge:WV,typeToggle:XV,scriptEditor:QV,optional:eq},N_=[{value:"claude-code",label:"claude-code"},{value:"codex",label:"codex"},{value:"copilot",label:"copilot"},{value:"goose",label:"goose"},{value:"stub",label:"stub"},{value:"claude-code-acp",label:"claude-code-acp (experimental)"},{value:"codex-acp",label:"codex-acp (experimental)"},{value:"copilot-acp",label:"copilot-acp (experimental)"}],w_=[{value:"genaiscript",label:"genaiscript"}],tq="0";function C_(){const{personaId:t}=ma(),s=xt(),{showToast:o}=pn(),{personas:{personas:r,createPersona:c,updatePersona:d,deletePersona:u},appDefaultPersonaId:p,setAppDefaultPersonaId:m}=pt(),g=t===void 0,v=g?void 0:r.find(_=>_.id===t);if(!g&&r.length>0&&!v)return a.jsx($n,{to:tp,replace:!0});const b=[{label:"Settings",url:ji},{label:"Personas",url:tp},{label:g?"New Persona":(v==null?void 0:v.name)??"Persona",url:void 0}];return a.jsxs("div",{className:vs.container,children:[a.jsx(ha,{segments:b}),a.jsx(nq,{existing:v,isNew:g,appDefaultPersonaId:p,onCreatePersona:c,onUpdatePersona:d,onDeletePersona:u,onSetAppDefaultPersonaId:m,onDone:()=>{s(tp)},showToast:o})]})}function nq({existing:t,isNew:s,appDefaultPersonaId:o,onCreatePersona:r,onUpdatePersona:c,onDeletePersona:d,onSetAppDefaultPersonaId:u,onDone:p,showToast:m}){const g=xt(),[v,b]=y.useState((t==null?void 0:t.name)??""),[_,k]=y.useState((t==null?void 0:t.description)??""),[S,j]=y.useState((t==null?void 0:t.systemPrompt)??""),[T,N]=y.useState((t==null?void 0:t.runtime)??"claude-code"),[C,D]=y.useState((t==null?void 0:t.model)??"sonnet"),[A,E]=y.useState((t==null?void 0:t.maxTurns)??0),[R,O]=y.useState((t==null?void 0:t.type)==="script"?"script":"agent"),[M,$]=y.useState((t==null?void 0:t.script)??""),[Y,V]=y.useState((t==null?void 0:t.allowedMcpTools)??[]),[ne,le]=y.useState(!1),[Z,se]=y.useState(null),[H,B]=y.useState(!!s);y.useEffect(()=>{if(!s&&t&&!H){B(!0),b(t.name),k(t.description),j(t.systemPrompt);const ue=t.type==="script"?"script":"agent";N(ue==="script"?t.runtime||"genaiscript":t.runtime),D(t.model),E(t.maxTurns),O(ue),$(t.script||""),V(t.allowedMcpTools)}},[s,t,H]);const F=ue=>{O(ue),ue==="script"?N("genaiscript"):T==="genaiscript"&&N("claude-code")},ge=!s&&t===void 0,ee=v.trim().length>0&&!ge&&S.trim().length>0&&(R==="script"?M.trim().length>0:!!T&&!!C),ce=s&&ee,me=!s&&o===(t==null?void 0:t.id),xe=!s&&t&&!me&&R==="agent"&&!!T&&!!C,De=(ue,Re)=>{if(!ue.trim())return`${Re} is required`},ot=ue=>{if(ue.preventDefault(),!(ge||!ee)){if(t){c(t.id,v,_,S,T,C,A,R,M).then(()=>{m("Persona updated","success"),p()},()=>{m("Failed to save persona","error")});return}r(v,_,S,T,C,A,R,M,Y).then(Re=>{m("Persona created","success"),g(ux(Re.id),{replace:!0})},()=>{m("Failed to save persona","error")})}},bt=()=>{t&&d(t.id).then(()=>{m("Persona deleted","success"),p()},()=>{m("Failed to delete persona","error")})},lt=async(ue,Re,Q,nt)=>ue().then(()=>{Re(),m(Q,"success")},()=>{m(nt,"error")}),Pe=(ue,Re)=>{if(!t)return;const Q=ue==="type"?String(Re):R,nt=ue==="runtime"?String(Re):ue==="type"?String(Re)==="script"?"genaiscript":T==="genaiscript"?"claude-code":T:T,re=ue==="model"?String(Re):C,ve=ue==="maxTurns"?Number(Re):A,et=ue==="systemPrompt"?String(Re):S,an=ue==="script"?String(Re):M;lt(()=>c(t.id,ue==="name"?String(Re):v,ue==="description"?String(Re):_,et,nt,re,ve,Q,an),()=>{if(ue==="type"){const ks=String(Re)==="script"?"script":"agent";O(ks),N(nt)}ue==="runtime"&&N(String(Re)),ue==="name"&&b(String(Re)),ue==="description"&&k(String(Re)),ue==="systemPrompt"&&j(String(Re)),ue==="model"&&D(String(Re)),ue==="maxTurns"&&E(Number(Re)),ue==="script"&&$(String(Re))},"Persona updated","Failed to update persona").catch(()=>{})},ke=ue=>{ot(ue)},ct=()=>{t&&u(t.id).then(()=>{m("Set as app default","success")},()=>{m("Failed to set app default","error")})};return a.jsxs(a.Fragment,{children:[ge?a.jsxs("div",{className:vs.form,children:[a.jsx("h3",{children:"Edit Persona"}),a.jsx("p",{children:"Loading persona..."})]}):s?a.jsxs("form",{onSubmit:ke,className:vs.form,children:[a.jsx("h3",{children:"Create Persona"}),a.jsxs("div",{className:vs.typeToggle,"data-testid":"persona-type-toggle",children:[a.jsxs("label",{children:[a.jsx("input",{type:"radio",name:"personaType",value:"agent",checked:R==="agent",onChange:()=>F("agent")}),"Agent"]}),a.jsxs("label",{children:[a.jsx("input",{type:"radio",name:"personaType",value:"script",checked:R==="script",onChange:()=>F("script")}),"Script"]})]}),a.jsxs("label",{children:["Name",a.jsx("input",{type:"text",value:v,onChange:ue=>b(ue.target.value),placeholder:R==="script"?"e.g. Nightly Report":"e.g. Frontend Engineer",required:!0,"data-testid":"persona-detail-name"})]}),a.jsxs("label",{children:["Description",a.jsx("input",{type:"text",value:_,onChange:ue=>k(ue.target.value),placeholder:"Brief description...","data-testid":"persona-detail-description"})]}),a.jsxs("label",{children:["Runtime",a.jsx("select",{value:T,onChange:ue=>N(ue.target.value),"data-testid":"persona-runtime-select",children:(R==="script"?w_:N_).map(ue=>a.jsx("option",{value:ue.value,children:ue.label},ue.value))})]}),R==="agent"&&a.jsxs(a.Fragment,{children:[a.jsxs("label",{children:["Model",a.jsx("input",{type:"text",value:C,onChange:ue=>D(ue.target.value),placeholder:"e.g. sonnet","data-testid":"persona-detail-model"})]}),a.jsxs("label",{children:["Max Turns",a.jsx("input",{type:"number",value:A,onChange:ue=>E(parseInt(ue.target.value,10)||0),min:0,"data-testid":"persona-detail-max-turns"})]}),a.jsxs("label",{children:["System Prompt",a.jsx("textarea",{value:S,onChange:ue=>j(ue.target.value),placeholder:"You are a senior frontend engineer...",rows:10,required:!0,"data-testid":"persona-detail-prompt"})]})]}),R==="script"&&a.jsxs(a.Fragment,{children:[a.jsxs("label",{children:["Model ",a.jsx("span",{className:vs.optional,children:"(optional)"}),a.jsx("input",{type:"text",value:C,onChange:ue=>D(ue.target.value),placeholder:"e.g. sonnet (leave empty for script-only)","data-testid":"persona-detail-model"})]}),a.jsxs("label",{children:["System Prompt",a.jsx("textarea",{value:S,onChange:ue=>j(ue.target.value),placeholder:"Context for the script...",rows:4,required:!0,"data-testid":"persona-detail-prompt"})]}),a.jsxs("label",{children:["Script",a.jsx("textarea",{value:M,onChange:ue=>$(ue.target.value),placeholder:`script({ model: "openai:gpt-4o" });
742
742
 
743
743
  const grackle = await host.mcpServer({
744
744
  id: "grackle",
@@ -752,4 +752,4 @@ const grackle = await host.mcpServer({
752
752
  url: env.vars.GRACKLE_MCP_URL,
753
753
  });
754
754
 
755
- $\`Summarize the current tasks.\`;`,ariaLabel:"Persona script","data-testid":"persona-script-editor"})]}),R==="agent"&&a.jsxs("div",{children:[a.jsx("label",{children:"Allowed MCP Tools"}),a.jsx(o_,{selectedTools:Y,onChange:ue=>{V(ue),lt(()=>c(t.id,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,ue),()=>{},"MCP tools updated","Failed to update MCP tools").catch(()=>{})}})]})]}),!xe&&!me&&a.jsx("p",{style:{fontSize:"var(--font-size-xs)",color:"var(--text-tertiary)",marginTop:"var(--space-xs)"},children:"Only agent personas with a runtime and model can be set as app default."})]}):null,a.jsx(_s,{isOpen:ne,title:"Delete Persona?",description:`"${t==null?void 0:t.name}" will be permanently removed.`,confirmLabel:"Delete",onConfirm:bt,onCancel:()=>le(!1)})]})}function sq(){const{schedules:{schedules:t,deleteSchedule:s,updateSchedule:o},personas:{personas:r}}=pt(),{showToast:c}=pn(),d=xt();return a.jsx(C7,{schedules:t,personas:r,onDeleteSchedule:async u=>{try{await s(u)}catch(p){throw console.error("Failed to delete schedule",{scheduleId:u,error:p}),c("Failed to delete schedule","error"),p}},onToggleEnabled:async(u,p)=>{try{return await o(u,p)}catch(m){throw console.error("Failed to update schedule",{scheduleId:u,error:m}),c("Failed to update schedule","error"),m}},onNavigateToNew:()=>d(iC),onNavigateToSchedule:u=>d(fx(u))})}const aq="_container_1g4qh_1",iq="_form_1g4qh_7",oq="_formActions_1g4qh_66",rq="_editableSection_1g4qh_73",lq="_helperText_1g4qh_84",cq="_metaSection_1g4qh_90",dq="_optional_1g4qh_108",uq="_readonlyValue_1g4qh_113",Ln={container:aq,form:iq,formActions:oq,editableSection:rq,helperText:lq,metaSection:cq,optional:dq,readonlyValue:uq};function E_(){const{scheduleId:t}=ma(),s=xt(),{showToast:o}=pn(),{schedules:{schedules:r,schedulesLoading:c,createSchedule:d,updateSchedule:u,deleteSchedule:p},personas:{personas:m},workspaces:{workspaces:g}}=pt(),v=t===void 0,b=v?void 0:r.find(k=>k.id===t);if(!v&&!c&&r.length>0&&!b)return a.jsx($n,{to:np,replace:!0});const _=[{label:"Settings",url:ji},{label:"Schedules",url:np},{label:v?"New Schedule":(b==null?void 0:b.title)??"Schedule",url:void 0}];return a.jsxs("div",{className:Ln.container,children:[a.jsx(ha,{segments:_}),a.jsx(fq,{existing:b,isNew:v,personas:m,workspaces:g,onCreateSchedule:d,onUpdateSchedule:u,onDeleteSchedule:p,onDone:()=>{s(np)},showToast:o})]})}function fq({existing:t,isNew:s,personas:o,workspaces:r,onCreateSchedule:c,onUpdateSchedule:d,onDeleteSchedule:u,onDone:p,showToast:m}){var H;const g=xt(),[v,b]=y.useState((t==null?void 0:t.title)??""),[_,k]=y.useState((t==null?void 0:t.description)??""),[S,j]=y.useState((t==null?void 0:t.scheduleExpression)??""),[T,N]=y.useState((t==null?void 0:t.personaId)??""),[C,D]=y.useState((t==null?void 0:t.workspaceId)??""),[A,E]=y.useState(!1),[R,O]=y.useState(null);y.useEffect(()=>{s||t&&R===null&&(b(t.title),k(t.description),j(t.scheduleExpression),N(t.personaId),D(t.workspaceId))},[s,t,R]);const M=!s&&t===void 0,$=s&&v.trim().length>0&&S.trim().length>0&&T.length>0,Y=o.map(B=>({value:B.id,label:B.name})),V=[{value:"",label:"System-level (no workspace)"},...r.map(B=>({value:B.id,label:B.name}))],ne=B=>{B.preventDefault(),$&&c(v,_,S,T,C||void 0).then(F=>{m("Schedule created","success"),g(fx(F.id),{replace:!0})},()=>{m("Failed to create schedule","error")})},le=(B,F)=>{t&&d(t.id,{[B]:F}).then(()=>{m("Schedule updated","success"),B==="title"&&b(String(F)),B==="description"&&k(String(F)),B==="scheduleExpression"&&j(String(F)),B==="personaId"&&N(String(F))},()=>{m("Failed to update schedule","error")})},Z=()=>{if(!t)return;const B=!t.enabled;d(t.id,{enabled:B}).then(()=>{m(B?"Schedule enabled":"Schedule disabled","success")},()=>{m("Failed to update schedule","error")})},se=()=>{t&&u(t.id).then(()=>{m("Schedule deleted","success"),p()},()=>{m("Failed to delete schedule","error")})};return a.jsxs(a.Fragment,{children:[M?a.jsxs("div",{className:Ln.form,children:[a.jsx("h3",{children:"Edit Schedule"}),a.jsx("p",{children:"Loading schedule..."})]}):s?a.jsxs("form",{onSubmit:ne,className:Ln.form,children:[a.jsx("h3",{children:"Create Schedule"}),a.jsxs("label",{children:["Title",a.jsx("input",{type:"text",value:v,onChange:B=>b(B.target.value),placeholder:"e.g. Nightly Review",required:!0,"data-testid":"schedule-detail-title"})]}),a.jsxs("label",{children:["Description ",a.jsx("span",{className:Ln.optional,children:"(optional)"}),a.jsx("input",{type:"text",value:_,onChange:B=>k(B.target.value),placeholder:"Brief description...","data-testid":"schedule-detail-description"})]}),a.jsxs("label",{children:["Schedule Expression",a.jsx("input",{type:"text",value:S,onChange:B=>j(B.target.value),placeholder:"e.g. 30s, 5m, 1h, or 0 9 * * MON",required:!0,"data-testid":"schedule-detail-expression"}),a.jsxs("p",{className:Ln.helperText,children:["Interval: ",a.jsx("code",{children:"30s"}),", ",a.jsx("code",{children:"5m"}),", ",a.jsx("code",{children:"1h"}),", ",a.jsx("code",{children:"1d"})," (min 10s)  |  Cron: ",a.jsx("code",{children:"0 9 * * MON"})," (standard 5-field cron syntax)"]})]}),a.jsxs("label",{children:["Persona",a.jsxs("select",{value:T,onChange:B=>N(B.target.value),required:!0,"data-testid":"schedule-detail-persona",children:[a.jsx("option",{value:"",children:"Select a persona..."}),Y.map(B=>a.jsx("option",{value:B.value,children:B.label},B.value))]})]}),a.jsxs("label",{children:["Workspace ",a.jsx("span",{className:Ln.optional,children:"(optional)"}),a.jsx("select",{value:C,onChange:B=>D(B.target.value),"data-testid":"schedule-detail-workspace",children:V.map(B=>a.jsx("option",{value:B.value,children:B.label},B.value))})]}),a.jsxs("div",{className:Ln.formActions,children:[a.jsx(sn,{type:"submit",variant:"primary",size:"md",disabled:!$,"data-testid":"schedule-detail-save",children:"Create"}),a.jsx(sn,{type:"button",variant:"outline",size:"md",onClick:p,"data-testid":"schedule-detail-cancel",children:"Cancel"})]})]}):t?a.jsxs("div",{className:Ln.form,children:[a.jsx("h3",{children:"Edit Schedule"}),a.jsxs("div",{className:Ln.formActions,children:[a.jsx(sn,{type:"button",variant:"outline",size:"md",onClick:p,"data-testid":"schedule-detail-cancel",children:"Back to Schedules"}),a.jsx(sn,{type:"button",variant:t.enabled?"ghost":"primary",size:"md",onClick:Z,"data-testid":"schedule-detail-toggle",children:t.enabled?"Disable":"Enable"}),a.jsx(sn,{type:"button",variant:"danger",size:"md",onClick:()=>E(!0),"data-testid":"schedule-detail-delete",children:"Delete"})]}),a.jsxs("div",{className:Ln.editableSection,children:[a.jsxs("label",{children:["Title",a.jsx(zt,{value:v,onSave:B=>{le("title",B)},validate:B=>B.trim()?void 0:"Title is required",fieldId:"schedule-title",activeFieldId:R,onActivate:O,ariaLabel:"Schedule title","data-testid":"schedule-detail-title"})]}),a.jsxs("label",{children:["Description",a.jsx(zt,{value:_,onSave:B=>{le("description",B)},fieldId:"schedule-description",activeFieldId:R,onActivate:O,placeholder:"Brief description...",ariaLabel:"Schedule description","data-testid":"schedule-detail-description"})]}),a.jsxs("label",{children:["Schedule Expression",a.jsx(zt,{value:S,onSave:B=>{le("scheduleExpression",B)},validate:B=>B.trim()?void 0:"Schedule expression is required",fieldId:"schedule-expression",activeFieldId:R,onActivate:O,placeholder:"e.g. 30s, 5m, 1h, or 0 9 * * MON",ariaLabel:"Schedule expression","data-testid":"schedule-detail-expression"})]}),a.jsxs("label",{children:["Persona",a.jsx(bd,{value:T,onSave:B=>{le("personaId",B)},options:Y,fieldId:"schedule-persona",activeFieldId:R,onActivate:O,ariaLabel:"Schedule persona","data-testid":"schedule-detail-persona"})]}),a.jsxs("label",{children:["Workspace ",a.jsx("span",{className:Ln.optional,children:"(optional — set at creation)"}),a.jsx("span",{className:Ln.readonlyValue,"data-testid":"schedule-detail-workspace",children:((H=r.find(B=>B.id===t.workspaceId))==null?void 0:H.name)??"System-level (no workspace)"})]})]}),a.jsxs("div",{className:Ln.metaSection,children:[t.lastRunAt?a.jsxs("span",{children:["Last run: ",mm(t.lastRunAt)]}):a.jsx("span",{children:"Last run: Never"}),t.enabled&&t.nextRunAt?a.jsxs("span",{children:["Next run: ",lk(t.nextRunAt)]}):null,t.runCount>0&&a.jsxs("span",{children:["Total runs: ",t.runCount]}),a.jsxs("span",{children:["Created: ",mm(t.createdAt)]})]})]}):null,a.jsx(_s,{isOpen:A,title:"Delete Schedule?",description:`"${t==null?void 0:t.title}" will be permanently removed. Tasks already created by this schedule will not be affected.`,confirmLabel:"Delete",onConfirm:se,onCancel:()=>E(!1)})]})}function pq(){const{themeId:t,resolvedThemeId:s,setTheme:o,preferSystem:r,setPreferSystem:c}=yh();return a.jsx(GB,{themeId:t,resolvedThemeId:s,onSetTheme:o,preferSystem:r,onSetPreferSystem:c})}function mq(){const[t,s]=y.useState(void 0);return y.useEffect(()=>{let o=!1;return(async()=>{try{const c=await Be.getVersionStatus({});o||s({currentVersion:c.currentVersion,latestVersion:c.latestVersion,updateAvailable:c.updateAvailable,isDocker:c.isDocker})}catch{}})().catch(()=>{}),()=>{o=!0}},[]),t}function hq(){const{connectionStatus:t,environments:{environments:s},sessions:{sessions:o}}=pt(),r=mq();return a.jsxs(a.Fragment,{children:[r&&a.jsx(nB,{currentVersion:r.currentVersion,latestVersion:r.latestVersion,updateAvailable:r.updateAvailable,isDocker:r.isDocker}),a.jsx(ZB,{connectionStatus:t,environments:s,sessions:o})]})}function gq(){return a.jsx(z8,{})}function vq(){const{plugins:{plugins:t,pluginsLoading:s,setPluginEnabled:o}}=pt();return a.jsx(l8,{plugins:t,loading:s,onSetPluginEnabled:(r,c)=>{o(r,c).catch(()=>{})}})}const A_=Ri();function yq(){const t=xt();return Za({key:"?"},()=>{t(oC)}),Za({key:"n"},()=>{t(A_)}),Za({key:"N"},()=>{t(A_)}),a.jsx(a.Fragment,{})}function Ld(t){const s=_9();y.useLayoutEffect(()=>(s(t),()=>{s(void 0)}),[t,s])}function bq(){const{workspaces:{workspaces:t},tasks:{tasks:s}}=pt(),o=y.useMemo(()=>a.jsx(MO,{workspaces:t,tasks:s}),[t,s]);return Ld(o),a.jsx(Mi,{})}function _q(){const{environments:{environments:t}}=pt(),s=y.useMemo(()=>a.jsx(Q5,{environments:t}),[t]);return Ld(s),a.jsx(Mi,{})}function xq(){const t=y.useMemo(()=>a.jsx(R7,{}),[]);return Ld(t),a.jsx(Mi,{})}function kq(){const{knowledge:t,workspaces:{workspaces:s}}=pt(),o=y.useCallback(p=>{t.search(p).catch(()=>{})},[t]),r=y.useCallback(()=>{t.clearSearch()},[t]),c=y.useCallback(p=>{t.selectNode(p).catch(()=>{})},[t]),d=y.useCallback(p=>{t.loadRecent(p||void 0).catch(()=>{})},[t]),u=y.useMemo(()=>a.jsx(l5,{nodes:t.graphData.nodes,workspaces:s,loading:t.loading,searchQuery:t.searchQuery,onSearch:o,onClearSearch:r,onSelectNode:c,onWorkspaceChange:d}),[t,s,o,r,c,d]);return Ld(u),a.jsx(Mi,{})}const Sq="_wizard_1260s_1",jq="_container_1260s_10",Tq="_stepContent_1260s_19",Nq="_logoArea_1260s_28",wq="_logoImage_1260s_32",Cq="_heading_1260s_41",Eq="_tagline_1260s_49",Aq="_subtitle_1260s_56",Dq="_featureList_1260s_64",Mq="_runtimeGrid_1260s_89",Rq="_runtimeCard_1260s_101",Iq="_runtimeName_1260s_133",Oq="_runtimeDescription_1260s_139",Bq="_buttonRow_1260s_144",Lq="_primaryButton_1260s_151",zq="_ghostButton_1260s_185",$q="_dots_1260s_213",Hq="_dot_1260s_213",Xe={wizard:Sq,container:jq,stepContent:Tq,logoArea:Nq,logoImage:wq,heading:Cq,tagline:Eq,subtitle:Aq,featureList:Dq,runtimeGrid:Mq,runtimeCard:Rq,runtimeName:Iq,runtimeDescription:Oq,buttonRow:Bq,primaryButton:Lq,ghostButton:zq,dots:$q,dot:Hq};function Pq({onNext:t}){return a.jsxs("div",{className:Xe.stepContent,"data-testid":"setup-welcome",children:[a.jsx("div",{className:Xe.logoArea,children:a.jsx("img",{src:Id("grackle-logo.png"),alt:"Grackle",className:Xe.logoImage})}),a.jsx("h1",{className:Xe.heading,children:"Welcome to Grackle"}),a.jsx("p",{className:Xe.tagline,children:"Multi-agent orchestration for software teams"}),a.jsx("button",{type:"button",className:Xe.primaryButton,onClick:t,"data-testid":"setup-get-started",children:"Get Started"})]})}function Uq({onNext:t,onBack:s}){return a.jsxs("div",{className:Xe.stepContent,"data-testid":"setup-about",children:[a.jsx("h2",{className:Xe.heading,children:"What is Grackle?"}),a.jsxs("ul",{className:Xe.featureList,children:[a.jsx("li",{children:"Run Claude, Copilot, and Codex agents side by side"}),a.jsx("li",{children:"Provision and control dev environments — SSH, Codespaces, or local"}),a.jsx("li",{children:"Organize work into workspaces with agent-executable tasks"}),a.jsx("li",{children:"Customize agent behavior with personas, tools, and MCP servers"}),a.jsx("li",{children:"Live-stream agent sessions with full terminal replay"})]}),a.jsxs("div",{className:Xe.buttonRow,children:[a.jsx("button",{type:"button",className:Xe.ghostButton,onClick:s,children:"Back"}),a.jsx("button",{type:"button",className:Xe.primaryButton,onClick:t,"data-testid":"setup-about-next",children:"Next"})]})]})}const Vq=[{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 qq({currentRuntime:t,onFinish:s,onBack:o,finishDisabled:r}){const[c,d]=y.useState(t||"claude-code");return y.useEffect(()=>{t&&d(t)},[t]),a.jsxs("div",{className:Xe.stepContent,"data-testid":"setup-runtime",children:[a.jsx("h2",{className:Xe.heading,children:"Choose Your Runtime"}),a.jsx("p",{className:Xe.subtitle,children:"Select the primary agent runtime for your workspace. You can change this later."}),a.jsx("div",{className:Xe.runtimeGrid,children:Vq.map(u=>a.jsxs("button",{type:"button",className:Xe.runtimeCard,"data-selected":c===u.id,"aria-pressed":c===u.id,"data-testid":`runtime-card-${u.id}`,onClick:()=>d(u.id),children:[a.jsx("span",{className:Xe.runtimeName,children:u.name}),a.jsx("span",{className:Xe.runtimeDescription,children:u.description})]},u.id))}),a.jsxs("div",{className:Xe.buttonRow,children:[a.jsx("button",{type:"button",className:Xe.ghostButton,onClick:o,children:"Back"}),a.jsx("button",{type:"button",className:Xe.primaryButton,onClick:()=>{s(c)},disabled:r,"data-testid":"setup-runtime-next",children:"Next"})]})]})}function Gq(){return typeof Notification<"u"}function Fq({onFinish:t,onBack:s,finishDisabled:o}){const r=Gq(),c=r&&Notification.permission!=="default";function d(){r&&Notification.requestPermission().catch(()=>{}),t()}return a.jsxs("div",{className:Xe.stepContent,"data-testid":"setup-notifications",children:[a.jsx("h2",{className:Xe.heading,children:"Stay in the Loop"}),a.jsx("p",{className:Xe.subtitle,children:"Grackle can send you a browser notification when an agent needs your input, so you never miss an important moment."}),c?a.jsx("p",{className:Xe.subtitle,children:Notification.permission==="granted"?"Notifications are already enabled.":"Notifications have been blocked. You can change this in your browser settings."}):null,a.jsxs("div",{className:Xe.buttonRow,children:[a.jsx("button",{type:"button",className:Xe.ghostButton,onClick:s,disabled:o,children:"Back"}),!c&&r?a.jsxs(a.Fragment,{children:[a.jsx("button",{type:"button",className:Xe.ghostButton,onClick:t,disabled:o,"data-testid":"setup-notifications-skip",children:"Skip"}),a.jsx("button",{type:"button",className:Xe.primaryButton,onClick:d,disabled:o,"data-testid":"setup-notifications-enable",children:"Enable Notifications"})]}):a.jsx("button",{type:"button",className:Xe.primaryButton,onClick:t,disabled:o,"data-testid":"setup-finish",children:"Finish"})]})]})}const Kq=4,D_={"claude-code":"sonnet",copilot:"gpt-4o",codex:"o3",goose:""};function Zq(){const{personas:{personas:t,updatePersona:s},completeOnboarding:o,onboardingCompleted:r}=pt(),{showToast:c}=pn(),d=xt(),[u,p]=y.useState(0),[m,g]=y.useState("claude-code"),[v,b]=y.useState(!1),_=t.find(j=>j.id==="claude-code"),k=y.useCallback(j=>{g(j),p(3)},[]),S=y.useCallback(()=>{const j=m;b(!0);const T=[];if(_&&j!==_.runtime){const C=D_[j]??"sonnet";T.push(s(_.id,void 0,void 0,void 0,j,C))}const N=t.find(C=>C.id===py);if(N&&j!==N.runtime){const C=D_[j]??"sonnet";T.push(s(py,void 0,void 0,void 0,j,C))}Promise.all(T).then(()=>o()).then(()=>{d("/",{replace:!0})},()=>{c("Failed to update runtime -- please try again","error"),b(!1)})},[m,_,t,s,o,d,c]);return r===!0?a.jsx($n,{to:"/",replace:!0}):a.jsx("div",{className:Xe.wizard,"data-testid":"setup-wizard",children:a.jsxs("div",{className:Xe.container,children:[a.jsx(os,{mode:"wait",children:a.jsxs(Pt.div,{initial:{opacity:0,x:40},animate:{opacity:1,x:0},exit:{opacity:0,x:-40},transition:{duration:.2,ease:"easeInOut"},children:[u===0&&a.jsx(Pq,{onNext:()=>p(1)}),u===1&&a.jsx(Uq,{onNext:()=>p(2),onBack:()=>p(0)}),u===2&&a.jsx(qq,{currentRuntime:m,onFinish:k,onBack:()=>p(1),finishDisabled:!_}),u===3&&a.jsx(Fq,{onFinish:S,onBack:()=>p(2),finishDisabled:v})]},u)}),a.jsx("div",{className:Xe.dots,children:Array.from({length:Kq},(j,T)=>a.jsx("span",{className:Xe.dot,"data-active":T===u},T))})]})})}const Yq="_root_zndgp_1",Jq="_body_zndgp_7",Wq="_main_zndgp_19",Xq="_sidebarWrapper_zndgp_26",Qq="_overlay_zndgp_51",Wr={root:Yq,body:Jq,main:Wq,sidebarWrapper:Xq,overlay:Qq},eG=y.lazy(()=>P_(()=>import("./KnowledgePage-C1NEElgV.js"),__vite__mapDeps([3,1,2,4,5])).then(t=>({default:t.KnowledgePage}))),Ck=typeof window<"u"&&new URLSearchParams(window.location.search).has("mock");function tG({tabs:t}){const{connectionStatus:s,environments:{environments:o},sessions:{sessions:r},tasks:{tasks:c}}=pt(),{toasts:d,dismissToast:u}=pn(),p=Wt(),m=b9(),g=m!==void 0,[v,b]=y.useState(!1),_=y.useCallback(()=>b(k=>!k),[]);return y.useEffect(()=>{b(!1)},[p.pathname]),y.useEffect(()=>{if(!v)return;const k=S=>{S.key==="Escape"&&b(!1)};return document.addEventListener("keydown",k),()=>{document.removeEventListener("keydown",k)}},[v]),a.jsxs(a.Fragment,{children:[a.jsx(x5,{connectionStatus:s,environments:o,sessions:r,onToggleSidebar:g?_:void 0,sidebarOpen:v}),a.jsx(E5,{tabs:t}),a.jsxs("div",{className:Wr.body,children:[g&&a.jsx("div",{className:Wr.sidebarWrapper,"data-sidebar-open":v,children:a.jsx(O5,{content:m})}),g&&v&&a.jsx("div",{className:Wr.overlay,"data-testid":"drawer-overlay",onClick:()=>b(!1)}),a.jsxs("div",{className:Wr.main,children:[a.jsx(Mi,{}),a.jsx(V5,{sessions:r,tasks:c,environments:o})]})]}),a.jsx(GO,{toasts:d,onDismiss:u}),a.jsx(yq,{})]})}function nG(){const{sessions:{lastSpawnedId:t},environments:{environments:s,operationError:o,clearOperationError:r},tasks:{tasks:c},connectionStatus:d,onboardingCompleted:u}=pt(),{pluginNames:p}=Bd(),{showToast:m}=pn();EH(s,m),IH(c,m),AH(o,r,m);const g=xt(),v=Wt();if(y.useEffect(()=>{t&&!v.pathname.includes("/tasks/")&&g(Mm(t),{replace:!0})},[t,g,v.pathname]),d==="connected"&&u===!1)return a.jsx($n,{to:"/setup",replace:!0});const b=Q9(p);return a.jsx(y9,{children:a.jsxs("div",{className:Wr.root,children:[Ck&&a.jsx(OC,{}),a.jsx(tG,{tabs:b})]})})}function Pp(){const{workspaceId:t}=ma(),{workspaces:{workspaces:s}}=pt(),o=Wt(),r=s.find(g=>g.id===t),c=r!=null&&r.linkedEnvironmentIds?[...r.linkedEnvironmentIds].sort()[0]:void 0;if(!c)return s.length===0?void 0:a.jsx($n,{to:"/environments",replace:!0});const d=encodeURIComponent(t),u=`/workspaces/${d}`,p=o.pathname.startsWith(u)?o.pathname.slice(u.length):"",m=`/environments/${encodeURIComponent(c)}/workspaces/${d}${p}${o.search}${o.hash}`;return a.jsx($n,{to:m,replace:!0})}function sG(){const{pluginNames:t}=Bd(),s=t.includes("orchestration"),o=t.includes("knowledge");return a.jsxs(_w,{children:[a.jsx(Ee,{path:"setup",element:a.jsx(Zq,{})}),a.jsxs(Ee,{element:a.jsx(nG,{}),children:[a.jsx(Ee,{index:!0,element:a.jsx(yU,{})}),a.jsx(Ee,{path:"sessions/new",element:a.jsx(zU,{})}),a.jsx(Ee,{path:"chat",element:a.jsx(CU,{})}),a.jsx(Ee,{path:"chat/:streamId",element:a.jsx($n,{to:"/coordination",replace:!0})}),a.jsx(Ee,{path:"coordination",element:a.jsx(LU,{})}),a.jsx(Ee,{path:"sessions/:sessionId",element:a.jsx(UU,{})}),o&&a.jsx(Ee,{element:a.jsx(kq,{}),children:a.jsx(Ee,{path:"knowledge",element:a.jsx(y.Suspense,{fallback:a.jsx(Z1,{}),children:a.jsx(eG,{})})})}),s&&a.jsxs(Ee,{element:a.jsx(bq,{}),children:[a.jsx(Ee,{path:"tasks",element:a.jsx(gU,{})}),a.jsx(Ee,{path:"tasks/new",element:a.jsx(T_,{})}),a.jsx(Ee,{path:"tasks/:taskId",element:a.jsx(Eo,{})}),a.jsx(Ee,{path:"tasks/:taskId/edit",element:a.jsx(Eo,{})}),a.jsx(Ee,{path:"tasks/:taskId/stream",element:a.jsx(Eo,{})})]}),a.jsxs(Ee,{element:a.jsx(_q,{}),children:[a.jsx(Ee,{path:"workspaces",element:a.jsx($n,{to:"/environments",replace:!0})}),a.jsx(Ee,{path:"workspaces/new",element:a.jsx(sV,{})}),a.jsx(Ee,{path:"workspaces/:workspaceId",element:a.jsx(Pp,{})}),a.jsx(Ee,{path:"workspaces/:workspaceId/tasks/:taskId",element:a.jsx(Pp,{})}),a.jsx(Ee,{path:"workspaces/:workspaceId/tasks/:taskId/*",element:a.jsx(Pp,{})}),a.jsx(Ee,{path:"environments/:environmentId/workspaces/:workspaceId",element:a.jsx(FU,{})}),a.jsx(Ee,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/new",element:a.jsx(T_,{})}),a.jsx(Ee,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId",element:a.jsx(Eo,{})}),a.jsx(Ee,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/edit",element:a.jsx(Eo,{})}),a.jsx(Ee,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/stream",element:a.jsx(Eo,{})}),a.jsxs(Ee,{path:"environments",element:a.jsx(dV,{}),children:[a.jsx(Ee,{index:!0,element:a.jsx(vU,{})}),a.jsx(Ee,{path:"new",element:a.jsx(iV,{})}),a.jsx(Ee,{path:":environmentId",element:a.jsx(HV,{})}),a.jsx(Ee,{path:":environmentId/edit",element:a.jsx(oV,{})})]})]}),a.jsx(Ee,{element:a.jsx(xq,{}),children:a.jsxs(Ee,{path:"settings",element:a.jsx(VV,{}),children:[a.jsx(Ee,{index:!0,element:a.jsx($n,{to:"credentials",replace:!0})}),a.jsx(Ee,{path:"environments",element:a.jsx($n,{to:"/environments",replace:!0})}),a.jsx(Ee,{path:"credentials",element:a.jsx(qV,{})}),a.jsx(Ee,{path:"github-accounts",element:a.jsx(GV,{})}),a.jsx(Ee,{path:"tokens",element:a.jsx($n,{to:"../credentials",replace:!0})}),a.jsx(Ee,{path:"personas",element:a.jsx(FV,{})}),a.jsx(Ee,{path:"personas/new",element:a.jsx(C_,{})}),a.jsx(Ee,{path:"personas/:personaId",element:a.jsx(C_,{})}),a.jsx(Ee,{path:"schedules",element:a.jsx(sq,{})}),a.jsx(Ee,{path:"schedules/new",element:a.jsx(E_,{})}),a.jsx(Ee,{path:"schedules/:scheduleId",element:a.jsx(E_,{})}),a.jsx(Ee,{path:"appearance",element:a.jsx(pq,{})}),a.jsx(Ee,{path:"shortcuts",element:a.jsx(gq,{})}),a.jsx(Ee,{path:"plugins",element:a.jsx(vq,{})}),a.jsx(Ee,{path:"about",element:a.jsx(hq,{})})]})}),a.jsx(Ee,{path:"*",element:a.jsx($n,{to:"/",replace:!0})})]})]})}const aG=1e4;function iG(){const{onboardingCompleted:t}=pt(),[s,o]=y.useState(!1);y.useEffect(()=>{if(t!==void 0)return;const c=setTimeout(()=>o(!0),aG);return()=>clearTimeout(c)},[t]);const r=t===void 0&&!s;return a.jsx(os,{mode:"wait",children:r?a.jsx(Pt.div,{initial:{opacity:1},exit:{opacity:0},transition:{duration:.25},children:a.jsx(Z1,{})},"splash"):a.jsx(Pt.div,{initial:{opacity:0},animate:{opacity:1},transition:{duration:.25},style:{minHeight:"100vh"},children:a.jsx(Gw,{basename:"/".replace(/\/$/,""),children:a.jsx(sG,{})})},"app")})}function oG(){const t=Ck?F9:CH;return a.jsx(Y9,{children:a.jsx(v9,{children:a.jsx(p9,{children:a.jsx(t,{children:a.jsx(iG,{})})})})})}fj.createRoot(document.getElementById("root")).render(a.jsx(y.StrictMode,{children:a.jsx(oG,{})}));export{ha as B,hx as K,pt as a,Mm as s,ls as t,xt as u};
755
+ $\`Summarize the current tasks.\`;`,ariaLabel:"Persona script","data-testid":"persona-script-editor"})]}),R==="agent"&&a.jsxs("div",{children:[a.jsx("label",{children:"Allowed MCP Tools"}),a.jsx(o_,{selectedTools:Y,onChange:ue=>{V(ue),lt(()=>c(t.id,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,ue),()=>{},"MCP tools updated","Failed to update MCP tools").catch(()=>{})}})]})]}),!xe&&!me&&a.jsx("p",{style:{fontSize:"var(--font-size-xs)",color:"var(--text-tertiary)",marginTop:"var(--space-xs)"},children:"Only agent personas with a runtime and model can be set as app default."})]}):null,a.jsx(_s,{isOpen:ne,title:"Delete Persona?",description:`"${t==null?void 0:t.name}" will be permanently removed.`,confirmLabel:"Delete",onConfirm:bt,onCancel:()=>le(!1)})]})}function sq(){const{schedules:{schedules:t,deleteSchedule:s,updateSchedule:o},personas:{personas:r}}=pt(),{showToast:c}=pn(),d=xt();return a.jsx(C7,{schedules:t,personas:r,onDeleteSchedule:async u=>{try{await s(u)}catch(p){throw console.error("Failed to delete schedule",{scheduleId:u,error:p}),c("Failed to delete schedule","error"),p}},onToggleEnabled:async(u,p)=>{try{return await o(u,p)}catch(m){throw console.error("Failed to update schedule",{scheduleId:u,error:m}),c("Failed to update schedule","error"),m}},onNavigateToNew:()=>d(iC),onNavigateToSchedule:u=>d(fx(u))})}const aq="_container_1g4qh_1",iq="_form_1g4qh_7",oq="_formActions_1g4qh_66",rq="_editableSection_1g4qh_73",lq="_helperText_1g4qh_84",cq="_metaSection_1g4qh_90",dq="_optional_1g4qh_108",uq="_readonlyValue_1g4qh_113",Ln={container:aq,form:iq,formActions:oq,editableSection:rq,helperText:lq,metaSection:cq,optional:dq,readonlyValue:uq};function E_(){const{scheduleId:t}=ma(),s=xt(),{showToast:o}=pn(),{schedules:{schedules:r,schedulesLoading:c,createSchedule:d,updateSchedule:u,deleteSchedule:p},personas:{personas:m},workspaces:{workspaces:g}}=pt(),v=t===void 0,b=v?void 0:r.find(k=>k.id===t);if(!v&&!c&&r.length>0&&!b)return a.jsx($n,{to:np,replace:!0});const _=[{label:"Settings",url:ji},{label:"Schedules",url:np},{label:v?"New Schedule":(b==null?void 0:b.title)??"Schedule",url:void 0}];return a.jsxs("div",{className:Ln.container,children:[a.jsx(ha,{segments:_}),a.jsx(fq,{existing:b,isNew:v,personas:m,workspaces:g,onCreateSchedule:d,onUpdateSchedule:u,onDeleteSchedule:p,onDone:()=>{s(np)},showToast:o})]})}function fq({existing:t,isNew:s,personas:o,workspaces:r,onCreateSchedule:c,onUpdateSchedule:d,onDeleteSchedule:u,onDone:p,showToast:m}){var H;const g=xt(),[v,b]=y.useState((t==null?void 0:t.title)??""),[_,k]=y.useState((t==null?void 0:t.description)??""),[S,j]=y.useState((t==null?void 0:t.scheduleExpression)??""),[T,N]=y.useState((t==null?void 0:t.personaId)??""),[C,D]=y.useState((t==null?void 0:t.workspaceId)??""),[A,E]=y.useState(!1),[R,O]=y.useState(null);y.useEffect(()=>{s||t&&R===null&&(b(t.title),k(t.description),j(t.scheduleExpression),N(t.personaId),D(t.workspaceId))},[s,t,R]);const M=!s&&t===void 0,$=s&&v.trim().length>0&&S.trim().length>0&&T.length>0,Y=o.map(B=>({value:B.id,label:B.name})),V=[{value:"",label:"System-level (no workspace)"},...r.map(B=>({value:B.id,label:B.name}))],ne=B=>{B.preventDefault(),$&&c(v,_,S,T,C||void 0).then(F=>{m("Schedule created","success"),g(fx(F.id),{replace:!0})},()=>{m("Failed to create schedule","error")})},le=(B,F)=>{t&&d(t.id,{[B]:F}).then(()=>{m("Schedule updated","success"),B==="title"&&b(String(F)),B==="description"&&k(String(F)),B==="scheduleExpression"&&j(String(F)),B==="personaId"&&N(String(F))},()=>{m("Failed to update schedule","error")})},Z=()=>{if(!t)return;const B=!t.enabled;d(t.id,{enabled:B}).then(()=>{m(B?"Schedule enabled":"Schedule disabled","success")},()=>{m("Failed to update schedule","error")})},se=()=>{t&&u(t.id).then(()=>{m("Schedule deleted","success"),p()},()=>{m("Failed to delete schedule","error")})};return a.jsxs(a.Fragment,{children:[M?a.jsxs("div",{className:Ln.form,children:[a.jsx("h3",{children:"Edit Schedule"}),a.jsx("p",{children:"Loading schedule..."})]}):s?a.jsxs("form",{onSubmit:ne,className:Ln.form,children:[a.jsx("h3",{children:"Create Schedule"}),a.jsxs("label",{children:["Title",a.jsx("input",{type:"text",value:v,onChange:B=>b(B.target.value),placeholder:"e.g. Nightly Review",required:!0,"data-testid":"schedule-detail-title"})]}),a.jsxs("label",{children:["Description ",a.jsx("span",{className:Ln.optional,children:"(optional)"}),a.jsx("input",{type:"text",value:_,onChange:B=>k(B.target.value),placeholder:"Brief description...","data-testid":"schedule-detail-description"})]}),a.jsxs("label",{children:["Schedule Expression",a.jsx("input",{type:"text",value:S,onChange:B=>j(B.target.value),placeholder:"e.g. 30s, 5m, 1h, or 0 9 * * MON",required:!0,"data-testid":"schedule-detail-expression"}),a.jsxs("p",{className:Ln.helperText,children:["Interval: ",a.jsx("code",{children:"30s"}),", ",a.jsx("code",{children:"5m"}),", ",a.jsx("code",{children:"1h"}),", ",a.jsx("code",{children:"1d"})," (min 10s)  |  Cron: ",a.jsx("code",{children:"0 9 * * MON"})," (standard 5-field cron syntax)"]})]}),a.jsxs("label",{children:["Persona",a.jsxs("select",{value:T,onChange:B=>N(B.target.value),required:!0,"data-testid":"schedule-detail-persona",children:[a.jsx("option",{value:"",children:"Select a persona..."}),Y.map(B=>a.jsx("option",{value:B.value,children:B.label},B.value))]})]}),a.jsxs("label",{children:["Workspace ",a.jsx("span",{className:Ln.optional,children:"(optional)"}),a.jsx("select",{value:C,onChange:B=>D(B.target.value),"data-testid":"schedule-detail-workspace",children:V.map(B=>a.jsx("option",{value:B.value,children:B.label},B.value))})]}),a.jsxs("div",{className:Ln.formActions,children:[a.jsx(sn,{type:"submit",variant:"primary",size:"md",disabled:!$,"data-testid":"schedule-detail-save",children:"Create"}),a.jsx(sn,{type:"button",variant:"outline",size:"md",onClick:p,"data-testid":"schedule-detail-cancel",children:"Cancel"})]})]}):t?a.jsxs("div",{className:Ln.form,children:[a.jsx("h3",{children:"Edit Schedule"}),a.jsxs("div",{className:Ln.formActions,children:[a.jsx(sn,{type:"button",variant:"outline",size:"md",onClick:p,"data-testid":"schedule-detail-cancel",children:"Back to Schedules"}),a.jsx(sn,{type:"button",variant:t.enabled?"ghost":"primary",size:"md",onClick:Z,"data-testid":"schedule-detail-toggle",children:t.enabled?"Disable":"Enable"}),a.jsx(sn,{type:"button",variant:"danger",size:"md",onClick:()=>E(!0),"data-testid":"schedule-detail-delete",children:"Delete"})]}),a.jsxs("div",{className:Ln.editableSection,children:[a.jsxs("label",{children:["Title",a.jsx(zt,{value:v,onSave:B=>{le("title",B)},validate:B=>B.trim()?void 0:"Title is required",fieldId:"schedule-title",activeFieldId:R,onActivate:O,ariaLabel:"Schedule title","data-testid":"schedule-detail-title"})]}),a.jsxs("label",{children:["Description",a.jsx(zt,{value:_,onSave:B=>{le("description",B)},fieldId:"schedule-description",activeFieldId:R,onActivate:O,placeholder:"Brief description...",ariaLabel:"Schedule description","data-testid":"schedule-detail-description"})]}),a.jsxs("label",{children:["Schedule Expression",a.jsx(zt,{value:S,onSave:B=>{le("scheduleExpression",B)},validate:B=>B.trim()?void 0:"Schedule expression is required",fieldId:"schedule-expression",activeFieldId:R,onActivate:O,placeholder:"e.g. 30s, 5m, 1h, or 0 9 * * MON",ariaLabel:"Schedule expression","data-testid":"schedule-detail-expression"})]}),a.jsxs("label",{children:["Persona",a.jsx(bd,{value:T,onSave:B=>{le("personaId",B)},options:Y,fieldId:"schedule-persona",activeFieldId:R,onActivate:O,ariaLabel:"Schedule persona","data-testid":"schedule-detail-persona"})]}),a.jsxs("label",{children:["Workspace ",a.jsx("span",{className:Ln.optional,children:"(optional — set at creation)"}),a.jsx("span",{className:Ln.readonlyValue,"data-testid":"schedule-detail-workspace",children:((H=r.find(B=>B.id===t.workspaceId))==null?void 0:H.name)??"System-level (no workspace)"})]})]}),a.jsxs("div",{className:Ln.metaSection,children:[t.lastRunAt?a.jsxs("span",{children:["Last run: ",mm(t.lastRunAt)]}):a.jsx("span",{children:"Last run: Never"}),t.enabled&&t.nextRunAt?a.jsxs("span",{children:["Next run: ",lk(t.nextRunAt)]}):null,t.runCount>0&&a.jsxs("span",{children:["Total runs: ",t.runCount]}),a.jsxs("span",{children:["Created: ",mm(t.createdAt)]})]})]}):null,a.jsx(_s,{isOpen:A,title:"Delete Schedule?",description:`"${t==null?void 0:t.title}" will be permanently removed. Tasks already created by this schedule will not be affected.`,confirmLabel:"Delete",onConfirm:se,onCancel:()=>E(!1)})]})}function pq(){const{themeId:t,resolvedThemeId:s,setTheme:o,preferSystem:r,setPreferSystem:c}=yh();return a.jsx(GB,{themeId:t,resolvedThemeId:s,onSetTheme:o,preferSystem:r,onSetPreferSystem:c})}function mq(){const[t,s]=y.useState(void 0);return y.useEffect(()=>{let o=!1;return(async()=>{try{const c=await Be.getVersionStatus({});o||s({currentVersion:c.currentVersion,latestVersion:c.latestVersion,updateAvailable:c.updateAvailable,isDocker:c.isDocker})}catch{}})().catch(()=>{}),()=>{o=!0}},[]),t}function hq(){const{connectionStatus:t,environments:{environments:s},sessions:{sessions:o}}=pt(),r=mq();return a.jsxs(a.Fragment,{children:[r&&a.jsx(nB,{currentVersion:r.currentVersion,latestVersion:r.latestVersion,updateAvailable:r.updateAvailable,isDocker:r.isDocker}),a.jsx(ZB,{connectionStatus:t,environments:s,sessions:o})]})}function gq(){return a.jsx(z8,{})}function vq(){const{plugins:{plugins:t,pluginsLoading:s,setPluginEnabled:o}}=pt();return a.jsx(l8,{plugins:t,loading:s,onSetPluginEnabled:(r,c)=>{o(r,c).catch(()=>{})}})}const A_=Ri();function yq(){const t=xt();return Za({key:"?"},()=>{t(oC)}),Za({key:"n"},()=>{t(A_)}),Za({key:"N"},()=>{t(A_)}),a.jsx(a.Fragment,{})}function Ld(t){const s=_9();y.useLayoutEffect(()=>(s(t),()=>{s(void 0)}),[t,s])}function bq(){const{workspaces:{workspaces:t},tasks:{tasks:s}}=pt(),o=y.useMemo(()=>a.jsx(MO,{workspaces:t,tasks:s}),[t,s]);return Ld(o),a.jsx(Mi,{})}function _q(){const{environments:{environments:t}}=pt(),s=y.useMemo(()=>a.jsx(Q5,{environments:t}),[t]);return Ld(s),a.jsx(Mi,{})}function xq(){const t=y.useMemo(()=>a.jsx(R7,{}),[]);return Ld(t),a.jsx(Mi,{})}function kq(){const{knowledge:t,workspaces:{workspaces:s}}=pt(),o=y.useCallback(p=>{t.search(p).catch(()=>{})},[t]),r=y.useCallback(()=>{t.clearSearch()},[t]),c=y.useCallback(p=>{t.selectNode(p).catch(()=>{})},[t]),d=y.useCallback(p=>{t.loadRecent(p||void 0).catch(()=>{})},[t]),u=y.useMemo(()=>a.jsx(l5,{nodes:t.graphData.nodes,workspaces:s,loading:t.loading,searchQuery:t.searchQuery,onSearch:o,onClearSearch:r,onSelectNode:c,onWorkspaceChange:d}),[t,s,o,r,c,d]);return Ld(u),a.jsx(Mi,{})}const Sq="_wizard_1260s_1",jq="_container_1260s_10",Tq="_stepContent_1260s_19",Nq="_logoArea_1260s_28",wq="_logoImage_1260s_32",Cq="_heading_1260s_41",Eq="_tagline_1260s_49",Aq="_subtitle_1260s_56",Dq="_featureList_1260s_64",Mq="_runtimeGrid_1260s_89",Rq="_runtimeCard_1260s_101",Iq="_runtimeName_1260s_133",Oq="_runtimeDescription_1260s_139",Bq="_buttonRow_1260s_144",Lq="_primaryButton_1260s_151",zq="_ghostButton_1260s_185",$q="_dots_1260s_213",Hq="_dot_1260s_213",Xe={wizard:Sq,container:jq,stepContent:Tq,logoArea:Nq,logoImage:wq,heading:Cq,tagline:Eq,subtitle:Aq,featureList:Dq,runtimeGrid:Mq,runtimeCard:Rq,runtimeName:Iq,runtimeDescription:Oq,buttonRow:Bq,primaryButton:Lq,ghostButton:zq,dots:$q,dot:Hq};function Pq({onNext:t}){return a.jsxs("div",{className:Xe.stepContent,"data-testid":"setup-welcome",children:[a.jsx("div",{className:Xe.logoArea,children:a.jsx("img",{src:Id("grackle-logo.png"),alt:"Grackle",className:Xe.logoImage})}),a.jsx("h1",{className:Xe.heading,children:"Welcome to Grackle"}),a.jsx("p",{className:Xe.tagline,children:"Multi-agent orchestration for software teams"}),a.jsx("button",{type:"button",className:Xe.primaryButton,onClick:t,"data-testid":"setup-get-started",children:"Get Started"})]})}function Uq({onNext:t,onBack:s}){return a.jsxs("div",{className:Xe.stepContent,"data-testid":"setup-about",children:[a.jsx("h2",{className:Xe.heading,children:"What is Grackle?"}),a.jsxs("ul",{className:Xe.featureList,children:[a.jsx("li",{children:"Run Claude, Copilot, and Codex agents side by side"}),a.jsx("li",{children:"Provision and control dev environments — SSH, Codespaces, or local"}),a.jsx("li",{children:"Organize work into workspaces with agent-executable tasks"}),a.jsx("li",{children:"Customize agent behavior with personas, tools, and MCP servers"}),a.jsx("li",{children:"Live-stream agent sessions with full terminal replay"})]}),a.jsxs("div",{className:Xe.buttonRow,children:[a.jsx("button",{type:"button",className:Xe.ghostButton,onClick:s,children:"Back"}),a.jsx("button",{type:"button",className:Xe.primaryButton,onClick:t,"data-testid":"setup-about-next",children:"Next"})]})]})}const Vq=[{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 qq({currentRuntime:t,onFinish:s,onBack:o,finishDisabled:r}){const[c,d]=y.useState(t||"claude-code");return y.useEffect(()=>{t&&d(t)},[t]),a.jsxs("div",{className:Xe.stepContent,"data-testid":"setup-runtime",children:[a.jsx("h2",{className:Xe.heading,children:"Choose Your Runtime"}),a.jsx("p",{className:Xe.subtitle,children:"Select the primary agent runtime for your workspace. You can change this later."}),a.jsx("div",{className:Xe.runtimeGrid,children:Vq.map(u=>a.jsxs("button",{type:"button",className:Xe.runtimeCard,"data-selected":c===u.id,"aria-pressed":c===u.id,"data-testid":`runtime-card-${u.id}`,onClick:()=>d(u.id),children:[a.jsx("span",{className:Xe.runtimeName,children:u.name}),a.jsx("span",{className:Xe.runtimeDescription,children:u.description})]},u.id))}),a.jsxs("div",{className:Xe.buttonRow,children:[a.jsx("button",{type:"button",className:Xe.ghostButton,onClick:o,children:"Back"}),a.jsx("button",{type:"button",className:Xe.primaryButton,onClick:()=>{s(c)},disabled:r,"data-testid":"setup-runtime-next",children:"Next"})]})]})}function Gq(){return typeof Notification<"u"}function Fq({onFinish:t,onBack:s,finishDisabled:o}){const r=Gq(),c=r&&Notification.permission!=="default";function d(){r&&Notification.requestPermission().catch(()=>{}),t()}return a.jsxs("div",{className:Xe.stepContent,"data-testid":"setup-notifications",children:[a.jsx("h2",{className:Xe.heading,children:"Stay in the Loop"}),a.jsx("p",{className:Xe.subtitle,children:"Grackle can send you a browser notification when an agent needs your input, so you never miss an important moment."}),c?a.jsx("p",{className:Xe.subtitle,children:Notification.permission==="granted"?"Notifications are already enabled.":"Notifications have been blocked. You can change this in your browser settings."}):null,a.jsxs("div",{className:Xe.buttonRow,children:[a.jsx("button",{type:"button",className:Xe.ghostButton,onClick:s,disabled:o,children:"Back"}),!c&&r?a.jsxs(a.Fragment,{children:[a.jsx("button",{type:"button",className:Xe.ghostButton,onClick:t,disabled:o,"data-testid":"setup-notifications-skip",children:"Skip"}),a.jsx("button",{type:"button",className:Xe.primaryButton,onClick:d,disabled:o,"data-testid":"setup-notifications-enable",children:"Enable Notifications"})]}):a.jsx("button",{type:"button",className:Xe.primaryButton,onClick:t,disabled:o,"data-testid":"setup-finish",children:"Finish"})]})]})}const Kq=4,D_={"claude-code":"sonnet",copilot:"gpt-4o",codex:"o3",goose:""};function Zq(){const{personas:{personas:t,updatePersona:s},completeOnboarding:o,onboardingCompleted:r}=pt(),{showToast:c}=pn(),d=xt(),[u,p]=y.useState(0),[m,g]=y.useState("claude-code"),[v,b]=y.useState(!1),_=t.find(j=>j.id==="claude-code"),k=y.useCallback(j=>{g(j),p(3)},[]),S=y.useCallback(()=>{const j=m;b(!0);const T=[];if(_&&j!==_.runtime){const C=D_[j]??"sonnet";T.push(s(_.id,void 0,void 0,void 0,j,C))}const N=t.find(C=>C.id===py);if(N&&j!==N.runtime){const C=D_[j]??"sonnet";T.push(s(py,void 0,void 0,void 0,j,C))}Promise.all(T).then(()=>o()).then(()=>{d("/",{replace:!0})},()=>{c("Failed to update runtime -- please try again","error"),b(!1)})},[m,_,t,s,o,d,c]);return r===!0?a.jsx($n,{to:"/",replace:!0}):a.jsx("div",{className:Xe.wizard,"data-testid":"setup-wizard",children:a.jsxs("div",{className:Xe.container,children:[a.jsx(os,{mode:"wait",children:a.jsxs(Pt.div,{initial:{opacity:0,x:40},animate:{opacity:1,x:0},exit:{opacity:0,x:-40},transition:{duration:.2,ease:"easeInOut"},children:[u===0&&a.jsx(Pq,{onNext:()=>p(1)}),u===1&&a.jsx(Uq,{onNext:()=>p(2),onBack:()=>p(0)}),u===2&&a.jsx(qq,{currentRuntime:m,onFinish:k,onBack:()=>p(1),finishDisabled:!_}),u===3&&a.jsx(Fq,{onFinish:S,onBack:()=>p(2),finishDisabled:v})]},u)}),a.jsx("div",{className:Xe.dots,children:Array.from({length:Kq},(j,T)=>a.jsx("span",{className:Xe.dot,"data-active":T===u},T))})]})})}const Yq="_root_zndgp_1",Jq="_body_zndgp_7",Wq="_main_zndgp_19",Xq="_sidebarWrapper_zndgp_26",Qq="_overlay_zndgp_51",Wr={root:Yq,body:Jq,main:Wq,sidebarWrapper:Xq,overlay:Qq},eG=y.lazy(()=>P_(()=>import("./KnowledgePage-DHgL33sT.js"),__vite__mapDeps([3,1,2,4,5])).then(t=>({default:t.KnowledgePage}))),Ck=typeof window<"u"&&new URLSearchParams(window.location.search).has("mock");function tG({tabs:t}){const{connectionStatus:s,environments:{environments:o},sessions:{sessions:r},tasks:{tasks:c}}=pt(),{toasts:d,dismissToast:u}=pn(),p=Wt(),m=b9(),g=m!==void 0,[v,b]=y.useState(!1),_=y.useCallback(()=>b(k=>!k),[]);return y.useEffect(()=>{b(!1)},[p.pathname]),y.useEffect(()=>{if(!v)return;const k=S=>{S.key==="Escape"&&b(!1)};return document.addEventListener("keydown",k),()=>{document.removeEventListener("keydown",k)}},[v]),a.jsxs(a.Fragment,{children:[a.jsx(x5,{connectionStatus:s,environments:o,sessions:r,onToggleSidebar:g?_:void 0,sidebarOpen:v}),a.jsx(E5,{tabs:t}),a.jsxs("div",{className:Wr.body,children:[g&&a.jsx("div",{className:Wr.sidebarWrapper,"data-sidebar-open":v,children:a.jsx(O5,{content:m})}),g&&v&&a.jsx("div",{className:Wr.overlay,"data-testid":"drawer-overlay",onClick:()=>b(!1)}),a.jsxs("div",{className:Wr.main,children:[a.jsx(Mi,{}),a.jsx(V5,{sessions:r,tasks:c,environments:o})]})]}),a.jsx(GO,{toasts:d,onDismiss:u}),a.jsx(yq,{})]})}function nG(){const{sessions:{lastSpawnedId:t},environments:{environments:s,operationError:o,clearOperationError:r},tasks:{tasks:c},connectionStatus:d,onboardingCompleted:u}=pt(),{pluginNames:p}=Bd(),{showToast:m}=pn();EH(s,m),IH(c,m),AH(o,r,m);const g=xt(),v=Wt();if(y.useEffect(()=>{t&&!v.pathname.includes("/tasks/")&&g(Mm(t),{replace:!0})},[t,g,v.pathname]),d==="connected"&&u===!1)return a.jsx($n,{to:"/setup",replace:!0});const b=Q9(p);return a.jsx(y9,{children:a.jsxs("div",{className:Wr.root,children:[Ck&&a.jsx(OC,{}),a.jsx(tG,{tabs:b})]})})}function Pp(){const{workspaceId:t}=ma(),{workspaces:{workspaces:s}}=pt(),o=Wt(),r=s.find(g=>g.id===t),c=r!=null&&r.linkedEnvironmentIds?[...r.linkedEnvironmentIds].sort()[0]:void 0;if(!c)return s.length===0?void 0:a.jsx($n,{to:"/environments",replace:!0});const d=encodeURIComponent(t),u=`/workspaces/${d}`,p=o.pathname.startsWith(u)?o.pathname.slice(u.length):"",m=`/environments/${encodeURIComponent(c)}/workspaces/${d}${p}${o.search}${o.hash}`;return a.jsx($n,{to:m,replace:!0})}function sG(){const{pluginNames:t}=Bd(),s=t.includes("orchestration"),o=t.includes("knowledge");return a.jsxs(_w,{children:[a.jsx(Ee,{path:"setup",element:a.jsx(Zq,{})}),a.jsxs(Ee,{element:a.jsx(nG,{}),children:[a.jsx(Ee,{index:!0,element:a.jsx(yU,{})}),a.jsx(Ee,{path:"sessions/new",element:a.jsx(zU,{})}),a.jsx(Ee,{path:"chat",element:a.jsx(CU,{})}),a.jsx(Ee,{path:"chat/:streamId",element:a.jsx($n,{to:"/coordination",replace:!0})}),a.jsx(Ee,{path:"coordination",element:a.jsx(LU,{})}),a.jsx(Ee,{path:"sessions/:sessionId",element:a.jsx(UU,{})}),o&&a.jsx(Ee,{element:a.jsx(kq,{}),children:a.jsx(Ee,{path:"knowledge",element:a.jsx(y.Suspense,{fallback:a.jsx(Z1,{}),children:a.jsx(eG,{})})})}),s&&a.jsxs(Ee,{element:a.jsx(bq,{}),children:[a.jsx(Ee,{path:"tasks",element:a.jsx(gU,{})}),a.jsx(Ee,{path:"tasks/new",element:a.jsx(T_,{})}),a.jsx(Ee,{path:"tasks/:taskId",element:a.jsx(Eo,{})}),a.jsx(Ee,{path:"tasks/:taskId/edit",element:a.jsx(Eo,{})}),a.jsx(Ee,{path:"tasks/:taskId/stream",element:a.jsx(Eo,{})})]}),a.jsxs(Ee,{element:a.jsx(_q,{}),children:[a.jsx(Ee,{path:"workspaces",element:a.jsx($n,{to:"/environments",replace:!0})}),a.jsx(Ee,{path:"workspaces/new",element:a.jsx(sV,{})}),a.jsx(Ee,{path:"workspaces/:workspaceId",element:a.jsx(Pp,{})}),a.jsx(Ee,{path:"workspaces/:workspaceId/tasks/:taskId",element:a.jsx(Pp,{})}),a.jsx(Ee,{path:"workspaces/:workspaceId/tasks/:taskId/*",element:a.jsx(Pp,{})}),a.jsx(Ee,{path:"environments/:environmentId/workspaces/:workspaceId",element:a.jsx(FU,{})}),a.jsx(Ee,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/new",element:a.jsx(T_,{})}),a.jsx(Ee,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId",element:a.jsx(Eo,{})}),a.jsx(Ee,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/edit",element:a.jsx(Eo,{})}),a.jsx(Ee,{path:"environments/:environmentId/workspaces/:workspaceId/tasks/:taskId/stream",element:a.jsx(Eo,{})}),a.jsxs(Ee,{path:"environments",element:a.jsx(dV,{}),children:[a.jsx(Ee,{index:!0,element:a.jsx(vU,{})}),a.jsx(Ee,{path:"new",element:a.jsx(iV,{})}),a.jsx(Ee,{path:":environmentId",element:a.jsx(HV,{})}),a.jsx(Ee,{path:":environmentId/edit",element:a.jsx(oV,{})})]})]}),a.jsx(Ee,{element:a.jsx(xq,{}),children:a.jsxs(Ee,{path:"settings",element:a.jsx(VV,{}),children:[a.jsx(Ee,{index:!0,element:a.jsx($n,{to:"credentials",replace:!0})}),a.jsx(Ee,{path:"environments",element:a.jsx($n,{to:"/environments",replace:!0})}),a.jsx(Ee,{path:"credentials",element:a.jsx(qV,{})}),a.jsx(Ee,{path:"github-accounts",element:a.jsx(GV,{})}),a.jsx(Ee,{path:"tokens",element:a.jsx($n,{to:"../credentials",replace:!0})}),a.jsx(Ee,{path:"personas",element:a.jsx(FV,{})}),a.jsx(Ee,{path:"personas/new",element:a.jsx(C_,{})}),a.jsx(Ee,{path:"personas/:personaId",element:a.jsx(C_,{})}),a.jsx(Ee,{path:"schedules",element:a.jsx(sq,{})}),a.jsx(Ee,{path:"schedules/new",element:a.jsx(E_,{})}),a.jsx(Ee,{path:"schedules/:scheduleId",element:a.jsx(E_,{})}),a.jsx(Ee,{path:"appearance",element:a.jsx(pq,{})}),a.jsx(Ee,{path:"shortcuts",element:a.jsx(gq,{})}),a.jsx(Ee,{path:"plugins",element:a.jsx(vq,{})}),a.jsx(Ee,{path:"about",element:a.jsx(hq,{})})]})}),a.jsx(Ee,{path:"*",element:a.jsx($n,{to:"/",replace:!0})})]})]})}const aG=1e4;function iG(){const{onboardingCompleted:t}=pt(),[s,o]=y.useState(!1);y.useEffect(()=>{if(t!==void 0)return;const c=setTimeout(()=>o(!0),aG);return()=>clearTimeout(c)},[t]);const r=t===void 0&&!s;return a.jsx(os,{mode:"wait",children:r?a.jsx(Pt.div,{initial:{opacity:1},exit:{opacity:0},transition:{duration:.25},children:a.jsx(Z1,{})},"splash"):a.jsx(Pt.div,{initial:{opacity:0},animate:{opacity:1},transition:{duration:.25},style:{minHeight:"100vh"},children:a.jsx(Gw,{basename:"/".replace(/\/$/,""),children:a.jsx(sG,{})})},"app")})}function oG(){const t=Ck?F9:CH;return a.jsx(Y9,{children:a.jsx(v9,{children:a.jsx(p9,{children:a.jsx(t,{children:a.jsx(iG,{})})})})})}fj.createRoot(document.getElementById("root")).render(a.jsx(y.StrictMode,{children:a.jsx(oG,{})}));export{ha as B,hx as K,pt as a,Mm as s,ls as t,xt as u};