@foresthubai/workflow-cli 0.4.2 → 0.4.3

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.
@@ -72,4 +72,4 @@ You can add a description to the \`${fi}\` by passing a \`${wT}\` component as a
72
72
 
73
73
  Alternatively, you can use your own component as a description by assigning it an \`id\` and passing the same value to the \`aria-describedby\` prop in \`${fi}\`. If the description is confusing or duplicative for sighted users, you can use the \`@radix-ui/react-visually-hidden\` primitive as a wrapper around your description component.
74
74
 
75
- For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;return m.useEffect(()=>{document.getElementById(e.current?.getAttribute("aria-describedby"))||console.warn(t)},[t,e]),null},dX=hT,fX=gT,NT=mT,kT=yT,TT=ST,PT=ET,RT=xT,IT=bT;const pX=dX,hX=fX,_T=m.forwardRef(({className:e,...t},n)=>p.jsx(NT,{className:Ce("fixed inset-0 z-50 bg-[hsl(var(--overlay))] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t,ref:n}));_T.displayName=NT.displayName;const AT=m.forwardRef(({className:e,...t},n)=>p.jsxs(hX,{children:[p.jsx(_T,{}),p.jsx(kT,{ref:n,className:Ce("fh-builder-portal font-sans fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",e),...t})]}));AT.displayName=kT.displayName;const MT=({className:e,...t})=>p.jsx("div",{className:Ce("flex flex-col space-y-2 text-center sm:text-left",e),...t});MT.displayName="AlertDialogHeader";const DT=({className:e,...t})=>p.jsx("div",{className:Ce("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});DT.displayName="AlertDialogFooter";const jT=m.forwardRef(({className:e,...t},n)=>p.jsx(RT,{ref:n,className:Ce("font-heading text-lg font-semibold",e),...t}));jT.displayName=RT.displayName;const OT=m.forwardRef(({className:e,...t},n)=>p.jsx(IT,{ref:n,className:Ce("text-sm text-muted-foreground",e),...t}));OT.displayName=IT.displayName;const $T=m.forwardRef(({className:e,...t},n)=>p.jsx(TT,{ref:n,className:Ce(hm(),e),...t}));$T.displayName=TT.displayName;const LT=m.forwardRef(({className:e,...t},n)=>p.jsx(PT,{ref:n,className:Ce(hm({variant:"outline"}),"mt-2 sm:mt-0",e),...t}));LT.displayName=PT.displayName;const gX=["int","float","bool","string"];function mX({port:e,onUpdate:t,onRemove:n,errors:r,children:o}){const i=!!r?.length;return p.jsxs("div",{className:`rounded-lg bg-card shadow-sm border p-2 space-y-2 transition-all hover:shadow-md ${i?"border-destructive ring-1 ring-destructive":"border-border"}`,children:[p.jsxs("div",{className:"flex items-center gap-2",children:[p.jsx(Mt,{className:"h-7 text-xs flex-1",value:e.name,placeholder:"name",onChange:l=>t({name:l.target.value})}),p.jsxs(br,{value:e.dataType,onValueChange:l=>t({dataType:l}),children:[p.jsx(qn,{className:"h-7 text-xs w-20",children:p.jsx(Sr,{})}),p.jsx(Zn,{children:gX.map(l=>p.jsx(an,{value:l,className:"text-xs",children:l},l))})]}),p.jsx(gt,{variant:"ghost",size:"icon",className:"h-7 w-7 shrink-0 text-muted-foreground hover:text-destructive",onClick:n,children:p.jsx(El,{className:"w-3.5 h-3.5"})})]}),o,i&&p.jsx("div",{className:"space-y-0.5",children:r.map((l,c)=>p.jsx("p",{className:"text-xs text-destructive",children:l},c))})]})}function Gb({title:e,description:t,addLabel:n,emptyText:r,ports:o,onAdd:i,onUpdate:l,onRemove:c,errorsFor:d,renderExtra:f}){return p.jsxs("div",{className:"space-y-2",children:[p.jsxs("div",{children:[p.jsx(vi,{className:"text-sm font-medium",children:e}),p.jsx("p",{className:"text-xs text-muted-foreground",children:t})]}),o.length===0?p.jsx("p",{className:"text-xs text-muted-foreground italic",children:r}):p.jsx("div",{className:"space-y-2",children:o.map((g,h)=>p.jsx(mX,{port:g,onUpdate:v=>l(h,v),onRemove:()=>c(h),errors:d?.(g),children:f?.(g,h)},g.uid))}),p.jsx(ss,{onClick:i,children:n})]})}const yX=e=>({expression:"",references:[],dataType:e});function vX(e){const t=Zm(e.id);t&&GH(t,e.arguments)}function bo(e,t,n){let r;ue.getState().setFunctions(o=>{const i=o[e];if(!i)return o;const l=t(i);return r=n?{...l,version:i.version+1}:l,{...o,[e]:r}}),r&&n&&vX(r)}function xX(){const e=ln(),t=Object.values(ue.getState().functions).map(r=>r.name),n={id:e,version:1,name:yi("function",t),arguments:[],outputs:[]};return ue.getState().setFunctions(r=>({...r,[e]:n})),et(e),Zd(),n}function wX(e){ue.getState().setFunctions(n=>{const{[e]:r,...o}=n;return o}),XH(e);const t=ue.getState().selection;t.kind==="function"&&t.id===e&&ue.getState().clearSelection()}function bX(e,t){bo(e,n=>({...n,name:t}),!1)}function SX(e){bo(e,t=>({...t,arguments:[...t.arguments,g1({name:`input${t.arguments.length+1}`,dataType:"string"})]}),!0)}function CX(e,t,n){bo(e,r=>{const o=r.arguments[t];if(!o)return r;const i=[...r.arguments];return i[t]={...o,...n},{...r,arguments:i}},!0)}function EX(e,t){bo(e,n=>({...n,arguments:n.arguments.filter((r,o)=>o!==t)}),!0)}function NX(e){bo(e,t=>{const n="string";return{...t,outputs:[...t.outputs,{uid:ln(),name:`output${t.outputs.length+1}`,dataType:n,expression:yX(n)}]}},!0)}function kX(e,t,n){bo(e,r=>{const o=r.outputs[t];if(!o)return r;const i=n.dataType??o.dataType,l=[...r.outputs];return l[t]={...o,...n,dataType:i,expression:n.dataType?{...o.expression,dataType:i}:o.expression},{...r,outputs:l}},!0)}function TX(e,t){bo(e,n=>({...n,outputs:n.outputs.filter((r,o)=>o!==t)}),!0)}function PX(e,t,n){bo(e,r=>{const o=r.outputs[t];if(!o)return r;const i=[...r.outputs];return i[t]={...o,expression:n},{...r,outputs:i}},!1)}const RX=({func:e,onClose:t})=>{const{t:n}=Xe(),r=ue(S=>wn(S.builderMode)),{id:o,arguments:i,outputs:l}=e,[c,d]=m.useState(!1),[f,g]=m.useState(e.name);m.useEffect(()=>{g(e.name)},[o,e.name]);const{lookup:h}=Li(o),v=Ye(S=>S.byFunctionId[o]),x=m.useMemo(()=>{const S=new Map;for(const w of v??[]){if(!w.outputId)continue;const E=S.get(w.outputId);E?E.push(w.message):S.set(w.outputId,[w.message])}return S},[v]);return p.jsxs("div",{className:"p-4",children:[p.jsxs("div",{className:"space-y-4",children:[p.jsxs("div",{className:"flex items-center justify-between gap-2",children:[p.jsxs("div",{className:"flex-1 min-w-0",children:[p.jsx("div",{className:"group flex items-center gap-1.5 rounded-md border border-transparent px-1.5 -mx-1.5 hover:border-input focus-within:border-input transition-colors",children:p.jsx("input",{type:"text",title:n("functionName"),className:"font-semibold text-lg bg-transparent w-full outline-none cursor-text py-0.5 font-mono",value:f,readOnly:r,placeholder:n("functionNamePlaceholder"),onChange:S=>{g(S.target.value),bX(o,S.target.value)}})}),p.jsx("p",{className:"text-sm text-muted-foreground",children:n("functionDefinition")})]}),p.jsx(gt,{variant:"ghost",size:"icon",className:"shrink-0",onClick:t,children:p.jsx(Cl,{className:"h-4 w-4"})})]}),r&&p.jsx($l,{}),p.jsxs("div",{className:`space-y-4 ${r?"pointer-events-none opacity-60":""}`,children:[p.jsx($t,{}),p.jsx(Gb,{title:n("inputs"),description:n("functionInputsDesc"),addLabel:n("add"),emptyText:n("noInputs"),ports:i,onAdd:()=>SX(o),onUpdate:(S,w)=>CX(o,S,w),onRemove:S=>EX(o,S)}),p.jsx($t,{}),p.jsx(Gb,{title:n("outputs"),description:n("functionOutputsDesc"),addLabel:n("add"),emptyText:n("noOutputs"),ports:l,onAdd:()=>NX(o),onUpdate:(S,w)=>kX(o,S,w),onRemove:S=>TX(o,S),errorsFor:S=>x.get(S.uid)??[],renderExtra:(S,w)=>p.jsx(fT,{value:S.expression,onChange:E=>PX(o,w,E),expressionType:S.dataType,availableVariables:h,placeholder:`${n("expressionFor")} ${S.name}...`})})]}),!r&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx(zi,{onClick:()=>d(!0),children:n("deleteFunction")})]})]}),p.jsx(pX,{open:c,onOpenChange:d,children:p.jsxs(AT,{children:[p.jsxs(MT,{children:[p.jsx(jT,{children:n("deleteFunctionTitle")}),p.jsx(OT,{children:n("deleteFunctionDesc")})]}),p.jsxs(DT,{children:[p.jsx(LT,{children:n("cancel")}),p.jsx($T,{className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",onClick:()=>{wX(o),d(!1),t()},children:n("delete")})]})]})})]})},IX=({memory:e,onClose:t})=>{const{t:n}=Xe(),r=ue(f=>f.memory),o=Nd.getByType(e.type),i=Ye(f=>f.byMemoryId[e.id]),l=e.type==="MemoryFile"&&e.label.trim()!==""&&Object.values(r).some(f=>f.id!==e.id&&f.type==="MemoryFile"&&f.label===e.label),c=e.label.trim()==="",d=p.jsxs(p.Fragment,{children:[c&&p.jsx("p",{className:"text-xs text-destructive mt-1",children:n("memoryLabelRequired","Label is required")}),l&&p.jsx("p",{className:"text-xs text-destructive mt-1",children:n("memoryLabelDuplicate","Label must be unique per agent")})]});return p.jsx(Iy,{resetKey:e.id,label:e.label,labelTitle:n("memoryLabel","Memory label"),onLabelChange:f=>Mw(e.id,{label:f}),description:o?.description??"",belowLabel:d,parameters:o?.parameters??[],getValue:f=>e.arguments[f.id],allArguments:{...e.arguments},onParamChange:(f,g)=>Mw(e.id,{arguments:{[f]:g}}),diagnostics:i,translationPrefix:"memory",deleteLabel:n("deleteMemory","Delete memory"),onDelete:()=>xB(e.id),onClose:t})},_X=({model:e,onClose:t})=>{const{t:n}=Xe(),r=kd.getByType(e.type),o=Ye(l=>l.byModelId[e.id]),i=e.label.trim()==="";return p.jsx(Iy,{resetKey:e.id,label:e.label,labelTitle:n("modelLabel","Model label"),onLabelChange:l=>Dw(e.id,{label:l}),description:r?.description??n("modelCustomDescription","Custom model mapped to a provider at deploy"),belowLabel:i?p.jsx("p",{className:"text-xs text-destructive mt-1",children:n("modelLabelRequired","Label is required")}):void 0,parameters:r?.parameters??[],getValue:l=>e.arguments[l.id],allArguments:{...e.arguments},onParamChange:(l,c)=>Dw(e.id,{arguments:{[l]:c}}),diagnostics:o,translationPrefix:"models",deleteLabel:n("deleteModel","Delete model"),onDelete:()=>EB(e.id),onClose:t})};var Sf="Checkbox",[AX]=Ft(Sf),[MX,_y]=AX(Sf);function DX(e){const{__scopeCheckbox:t,checked:n,children:r,defaultChecked:o,disabled:i,form:l,name:c,onCheckedChange:d,required:f,value:g="on",internal_do_not_use_render:h}=e,[v,x]=cn({prop:n,defaultProp:o??!1,onChange:d,caller:Sf}),[S,w]=m.useState(null),[E,b]=m.useState(null),N=m.useRef(!1),k=S?!!l||!!S.closest("form"):!0,P={checked:v,disabled:i,setChecked:x,control:S,setControl:w,name:c,form:l,value:g,hasConsumerStoppedPropagationRef:N,required:f,defaultChecked:uo(o)?!1:o,isFormControl:k,bubbleInput:E,setBubbleInput:b};return p.jsx(MX,{scope:t,...P,children:jX(h)?h(P):r})}var FT="CheckboxTrigger",zT=m.forwardRef(({__scopeCheckbox:e,onKeyDown:t,onClick:n,...r},o)=>{const{control:i,value:l,disabled:c,checked:d,required:f,setControl:g,setChecked:h,hasConsumerStoppedPropagationRef:v,isFormControl:x,bubbleInput:S}=_y(FT,e),w=De(o,g),E=m.useRef(d);return m.useEffect(()=>{const b=i?.form;if(b){const N=()=>h(E.current);return b.addEventListener("reset",N),()=>b.removeEventListener("reset",N)}},[i,h]),p.jsx(ke.button,{type:"button",role:"checkbox","aria-checked":uo(d)?"mixed":d,"aria-required":f,"data-state":UT(d),"data-disabled":c?"":void 0,disabled:c,value:l,...r,ref:w,onKeyDown:ve(t,b=>{b.key==="Enter"&&b.preventDefault()}),onClick:ve(n,b=>{h(N=>uo(N)?!0:!N),S&&x&&(v.current=b.isPropagationStopped(),v.current||b.stopPropagation())})})});zT.displayName=FT;var Ay=m.forwardRef((e,t)=>{const{__scopeCheckbox:n,name:r,checked:o,defaultChecked:i,required:l,disabled:c,value:d,onCheckedChange:f,form:g,...h}=e;return p.jsx(DX,{__scopeCheckbox:n,checked:o,defaultChecked:i,disabled:c,required:l,onCheckedChange:f,name:r,form:g,value:d,internal_do_not_use_render:({isFormControl:v})=>p.jsxs(p.Fragment,{children:[p.jsx(zT,{...h,ref:t,__scopeCheckbox:n}),v&&p.jsx(WT,{__scopeCheckbox:n})]})})});Ay.displayName=Sf;var VT="CheckboxIndicator",HT=m.forwardRef((e,t)=>{const{__scopeCheckbox:n,forceMount:r,...o}=e,i=_y(VT,n);return p.jsx(Pt,{present:r||uo(i.checked)||i.checked===!0,children:p.jsx(ke.span,{"data-state":UT(i.checked),"data-disabled":i.disabled?"":void 0,...o,ref:t,style:{pointerEvents:"none",...e.style}})})});HT.displayName=VT;var BT="CheckboxBubbleInput",WT=m.forwardRef(({__scopeCheckbox:e,...t},n)=>{const{control:r,hasConsumerStoppedPropagationRef:o,checked:i,defaultChecked:l,required:c,disabled:d,name:f,value:g,form:h,bubbleInput:v,setBubbleInput:x}=_y(BT,e),S=De(n,x),w=sy(i),E=Vm(r);m.useEffect(()=>{const N=v;if(!N)return;const k=window.HTMLInputElement.prototype,A=Object.getOwnPropertyDescriptor(k,"checked").set,R=!o.current;if(w!==i&&A){const _=new Event("click",{bubbles:R});N.indeterminate=uo(i),A.call(N,uo(i)?!1:i),N.dispatchEvent(_)}},[v,w,i,o]);const b=m.useRef(uo(i)?!1:i);return p.jsx(ke.input,{type:"checkbox","aria-hidden":!0,defaultChecked:l??b.current,required:c,disabled:d,name:f,value:g,form:h,...t,tabIndex:-1,ref:S,style:{...t.style,...E,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})});WT.displayName=BT;function jX(e){return typeof e=="function"}function uo(e){return e==="indeterminate"}function UT(e){return uo(e)?"indeterminate":e?"checked":"unchecked"}const KT=m.forwardRef(({className:e,...t},n)=>p.jsx(Ay,{ref:n,className:Ce("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...t,children:p.jsx(HT,{className:Ce("flex items-center justify-center text-current"),children:p.jsx(M1,{className:"h-4 w-4"})})}));KT.displayName=Ay.displayName;function GT(e){const t=e.getState().variables;return new Set(Object.values(t).map(n=>n.name))}function YT(e,t){const n=e.arguments,r=i=>{const l=n[i];if(!l||!l.active||l.mode!=="emit"||!t.has(l.name))return;const c=yi(l.name,t);t.add(c),n[i]={active:!0,mode:"emit",name:c}};if(e.type==="FunctionCall"){for(const i of e.functionInfo.returns)r(Jo(i));return}const o=Lt.getByType(e.type);if(o?.outputs)for(const i of o.outputs)if(i.type==="static")r(i.id);else{const l=n[i.id]??[];for(const c of l){if(c.mode!=="emit"||!t.has(c.name))continue;const d=yi(c.name,t);t.add(d),c.name=d}}}function XT(e,t){if(t.isUnremovable)return!1;if(t.isSingleton){const{nodes:n}=e.getState();if(n.some(r=>r.data.type===t.type))return!1}return!0}function Yb(e,t,n){if(!XT(e,t))return null;const r=ln(),o={};t.parameters.forEach(x=>{x.default!==void 0&&(o[x.id]=structuredClone(x.default))});for(const x of t.outputs??[])x.type==="static"?o[x.id]={active:!0,mode:"emit",name:x.id}:o[x.id]=[];const i={id:r,type:t.type,arguments:o};if(t.type==="FunctionCall"){const x=t,S=i;S.functionInfo=x.functionInfo;for(const w of x.functionInfo.arguments)o[Jo(w)]={expression:"",references:[],dataType:w.dataType};for(const w of x.functionInfo.returns)o[Jo(w)]={active:!0,mode:"emit",name:w.name}}const l=GT(e);YT(i,l);const c=e.getState().nodes;let d=n||{x:250,y:100};const f=50;for(;c.some(x=>Math.abs(x.position.x-d.x)<f&&Math.abs(x.position.y-d.y)<f);)d={x:d.x+40,y:d.y+40};const g={id:i.id,type:QT(t.type),position:d,data:i},{setNodes:h,setVariables:v}=e.getState();return h(x=>[...x,g]),v(x=>({...x,...qd([g.data])})),r}function qT(e,t,n){const{setNodes:r,setVariables:o}=e.getState();let i={},l={},c=!1,d=!1;return r(f=>{const g=f.findIndex(b=>b.id===t);if(g===-1)return f;const h=f[g];if(!h)return f;d=!0;const v=h.data;i=Uu(v);let x;if(n.arguments){const b=n.functionInfo?n.arguments:{...v.arguments,...n.arguments};x={...v,...n,arguments:b}}else x={...v,...n};l=Uu(x);const S=f.map((b,N)=>N===g?{...b,data:x}:b),w=Object.keys(i),E=Object.keys(l);return c=w.length!==E.length||E.some(b=>{const N=i[b],k=l[b];return!N||!k||N.name!==k.name||N.dataType!==k.dataType}),S}),c&&o(f=>{const g={...f};for(const h of Object.keys(i))h in l||delete g[el(t,h)];for(const[h,v]of Object.entries(l)){const x=el(t,h),S=f[x];(!S||S.name!==v.name||S.dataType!==v.dataType)&&(g[x]={kind:"node",nodeId:t,outputId:h,name:v.name,dataType:v.dataType})}return g}),d}function Xb(e,t,n){const{nodes:r,edges:o,setNodes:i,setEdges:l,setVariables:c}=e.getState(),d=r.find(g=>g.id===t);if(!d||n&&(n(d.data)?.isUnremovable??!1))return!1;i(g=>g.filter(h=>h.id!==t)),l(g=>g.filter(h=>h.source!==t&&h.target!==t));const f=Object.keys(Uu(d.data));return f.length>0&&c(g=>{const h={...g};for(const v of f)delete h[el(t,v)];return h}),!0}function OX(e,t,n){const r=t.data.type==="Agent",o=n.data.type==="Agent";return e==="control"?r&&o?"agentDelegate":o?"agentTask":r?"agentChoice":"control":e}function qb(e,t){const{nodes:n,edges:r,setEdges:o}=e.getState(),i=nE(t.source,t.target,t.sourceHandle,t.targetHandle,n,r);if(!i)return!1;const l=n.find(f=>f.id===t.source),c=n.find(f=>f.id===t.target);if(!l||!c)return!1;const d=OX(i,l,c);return o(f=>YE({...t,type:d},f)),d}function $X(e,t,n){const{edges:r,setEdges:o}=e.getState();return r.find(l=>l.id===t)?(o(l=>l.map(c=>c.id===t?{...c,data:{...c.data,...n}}:c)),!0):!1}function Zb(e,t){const{setEdges:n}=e.getState(),r=new Set(t);n(o=>o.filter(i=>!r.has(i.id)))}function LX(e,t,n={x:50,y:50},r){const o={pasted:!1,skippedLabels:[]};if(t.nodes.length===0)return o;const{setNodes:i,setEdges:l,setVariables:c}=e.getState(),d=[],f=t.nodes.filter(S=>{if(!r)return!0;const w=r(S.data);return w?XT(e,w)?!0:(d.push(w.label),!1):!0});if(f.length===0)return{pasted:!1,skippedLabels:d};const g=new Map;f.forEach(S=>{const w=ln();g.set(S.id,w)});const h=f.map(S=>{const w=g.get(S.id),E=JSON.parse(JSON.stringify(S.data));return E.id=w,E.arguments=ZT(Sd(E),g),{...S,id:w,position:{x:S.position.x+n.x,y:S.position.y+n.y},data:E,selected:!0}}),v=GT(e);for(const S of h)YT(S.data,v);const x=t.edges.filter(S=>g.has(S.source)&&g.has(S.target)).map(S=>{const w={...S,id:ln(),source:g.get(S.source),target:g.get(S.target),data:S.data?{...S.data}:S.data};if(w.data?.prompt&&es(w.data.prompt)){const E=w.data.prompt;w.data={...w.data,prompt:{...E,references:E.references.map(b=>({srcId:g.get(b.srcId)??b.srcId,varId:b.varId}))}}}return w});return i(S=>[...S.map(w=>({...w,selected:!1})),...h]),l(S=>[...S,...x]),c(S=>({...S,...qd(h.map(w=>w.data))})),{pasted:!0,skippedLabels:d}}function ZT(e,t){const n={};for(const[r,o]of Object.entries(e))if(es(o)){const i={expression:o.expression,dataType:o.dataType,references:o.references.map(l=>({srcId:t.get(l.srcId)??l.srcId,varId:l.varId}))};n[r]=i}else Array.isArray(o)?n[r]=o.map(i=>es(i)?{expression:i.expression,dataType:i.dataType,references:i.references.map(l=>({srcId:t.get(l.srcId)??l.srcId,varId:l.varId}))}:i):o!==null&&typeof o=="object"?n[r]=ZT(o,t):n[r]=o;return n}function QT(e){if(e==="FunctionCall")return"FunctionCall";const t=Lt.getByType(e)?.category??"Uncategorized";switch(t){case xe.Trigger:case xe.Tool:case xe.AI:return t;default:return"Standard"}}function FX(e,t){const n=e.arguments,r={};for(const o of t.arguments){const i=Jo(o),l=n[i];r[i]=l?{...l,dataType:o.dataType}:{expression:"",references:[],dataType:o.dataType}}for(const o of t.returns){const i=Jo(o),l=n[i];r[i]=l??{active:!0,mode:"emit",name:o.name}}return{functionInfo:{...t},arguments:r}}function JT(){const e=Qm(),t={};for(const[r,o]of Object.entries(ue.getState().functions))t[r]=Td(o);let n=0;for(const[,r]of Object.entries(e)){const o=r.getState().nodes;for(const i of o){if(i.data.type!=="FunctionCall")continue;const l=i.data,c=t[l.functionInfo.id];c&&(l.functionInfo.version===c.version&&l.functionInfo.name===c.name||(qT(r,i.id,FX(l,c)),n++))}}n>0&&Gt({title:mr.t("functionCallNodesMigrated"),description:mr.t("functionCallNodesMigratedDesc",{count:n})})}let Qb=ue.getState().functions;ue.subscribe(e=>{e.functions!==Qb&&(Qb=e.functions,JT())});const zX=({canvasId:e,selectedNode:t,onNodeUpdate:n,onNodeDelete:r,onClose:o,onOpenTest:i,getNodeDef:l})=>{const{t:c}=Xe(),d=ue(U=>wn(U.builderMode)),[f,g]=m.useState(t.label||""),[h,v]=m.useState(!1);m.useEffect(()=>{g(t.label||"")},[t.id,t.label]);const x=t.type==="FunctionCall"?t.functionInfo.id:null,{getFunction:S}=Qd(),w=x?S(x):void 0,E=t.type!=="FunctionCall"||!w?!1:t.functionInfo.version!==w.version,b=t.type==="FunctionCall"?Jm({...t.functionInfo,name:w?.name??t.functionInfo.name}):l(t),N=b?.isUnremovable??!1,k=et(e)(U=>U.edges),P=m.useMemo(()=>tl(t.id,t,k),[t,k]),A=Ye(U=>U.byNodeId[t.id]),R=Ry(A);if(!b)return p.jsx("div",{className:"p-4",children:p.jsx("p",{className:"text-sm text-muted-foreground",children:c("unknownNodeType",{type:t.type})})});const _=Sd(t),M=b.parameters.filter(U=>Tr(U,_,P)),$=(b.outputs??[]).length>0;return p.jsx("div",{className:"p-4",children:p.jsxs("div",{className:"space-y-4",children:[p.jsxs("div",{className:"flex items-center justify-between gap-2",children:[p.jsxs("div",{className:"flex-1 min-w-0",children:[p.jsx("div",{className:"group flex items-center gap-1.5 rounded-md border border-transparent px-1.5 -mx-1.5 hover:border-input focus-within:border-input transition-colors",children:p.jsx("input",{type:"text",title:c("nodeLabel"),className:"font-semibold text-lg bg-transparent w-full outline-none cursor-text py-0.5",value:h?f:f||b.label,readOnly:d,onFocus:()=>{d||(v(!0),f||g(b.label))},onBlur:()=>{v(!1),(!f||f===b.label)&&(g(""),n(t.id,{label:void 0}))},onChange:U=>{g(U.target.value),n(t.id,{label:U.target.value})}})}),p.jsx("p",{className:"text-sm text-muted-foreground",children:WC(c,b)})]}),p.jsx(gt,{variant:"ghost",size:"icon",className:"shrink-0",onClick:o,children:p.jsx(Cl,{className:"h-4 w-4"})})]}),d&&p.jsx($l,{}),M.length>0&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx("div",{className:`space-y-3 ${d?"pointer-events-none opacity-60":""}`,children:M.map(U=>p.jsx(Py,{canvasId:e,parameter:U,value:_[U.id],allArguments:_,onChange:L=>n(t.id,{arguments:{[U.id]:L}}),errors:R.get(U.id),translationPrefix:`nodes.${t.type}`},U.id))})]}),!d&&E&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsxs(gt,{variant:"outline",className:"w-full border-warning text-warning hover:bg-warning/10",onClick:()=>JT(),children:[p.jsx(Rz,{className:"w-4 h-4 mr-2"}),c("updateToLatestDefinition")]})]}),!d&&$&&!P&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx(WX,{canvasId:e,node:t,nodeDefinition:b,onNodeUpdate:n,nodeDiags:A})]}),!d&&t.type==="Agent"&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx(gt,{variant:"outline",className:"w-full",onClick:()=>i(t.id),children:c("testAgent")})]}),!d&&!N&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx(zi,{onClick:()=>r(t.id),children:c("deleteNode")})]})]})})},VX=["int","float","bool","string"],HX={int:"int",float:"float",bool:"bool",string:"string"};function BX(e,t){return`${e}[${t}]`}function Jb(e){return e.kind==="node"?{srcId:e.nodeId,varId:e.outputId}:e.kind==="declared"?{srcId:"declared",varId:e.uid}:{srcId:"fnarg",varId:e.uid}}function WX({canvasId:e,node:t,nodeDefinition:n,onNodeUpdate:r,nodeDiags:o}){const{t:i}=Xe(),{list:l}=Li(e),c=m.useMemo(()=>C1(t),[t]),d=m.useMemo(()=>(n.outputs??[]).filter(b=>b.type==="static"),[n]),f=m.useMemo(()=>(n.outputs??[]).filter(b=>b.type==="list"),[n]),g=m.useMemo(()=>{const b=new Map;if(!o)return b;for(const N of o)if(N.outputId&&N.severity==="error"){const k=b.get(N.outputId);k?k.push(N.message):b.set(N.outputId,[N.message])}return b},[o]),h=m.useCallback((b,N)=>{r(t.id,{arguments:{[b]:N}})},[t.id,r]),v=m.useCallback((b,N)=>r(t.id,{arguments:{[b]:N}}),[t.id,r]),x=m.useCallback(b=>l.filter(N=>N.dataType===b&&!("nodeId"in N&&N.nodeId===t.id)),[l,t.id]);if(d.length===0&&f.length===0)return null;const S=(b,N,k)=>{const P=S1(t,b)??{active:!0,mode:"emit",name:N.name},A=x(N.dataType),R=g.get(b),_=!!R?.length,M=P.active,$=L=>{L!==M&&h(b,{...P,active:L})},U=L=>{L!==P.mode&&(L==="emit"?h(b,{active:P.active,mode:"emit",name:N.name}):h(b,{active:P.active,mode:"assign",target:{srcId:"",varId:""}}))};return p.jsxs("div",{className:`rounded-lg bg-card shadow-sm border p-2 space-y-2 transition-all hover:shadow-md ${_?"border-destructive ring-1 ring-destructive":"border-border"}`,children:[p.jsxs("div",{className:"flex items-center gap-2",children:[p.jsx(KT,{checked:M,onCheckedChange:L=>$(L===!0),"aria-label":i("outputBinding.enable","Enable output"),className:"shrink-0"}),p.jsx("span",{className:`text-xs font-medium flex-1 truncate ${M?"":"opacity-50"}`,children:k}),p.jsx("span",{className:`text-xs text-muted-foreground ${M?"":"opacity-50"}`,children:HX[N.dataType]})]}),p.jsxs("div",{className:M?"":"opacity-50",children:[p.jsxs("div",{className:`flex items-center gap-2 ${M?"":"pointer-events-none"}`,children:[p.jsxs(yd,{type:"single",value:P.mode,onValueChange:L=>L&&U(L),className:"gap-0",children:[p.jsx(Yo,{value:"emit",size:"sm",variant:"outline",className:"h-7 w-7 p-0 rounded-r-none","aria-label":i("outputBinding.emit","Emit"),title:i("outputBinding.emit","Emit"),children:p.jsx(ts,{className:"w-3.5 h-3.5"})}),p.jsx(Yo,{value:"assign",size:"sm",variant:"outline",className:"h-7 w-7 p-0 rounded-l-none -ml-px","aria-label":i("outputBinding.assign","Assign"),title:i("outputBinding.assign","Assign"),children:p.jsx(V0,{className:"w-3.5 h-3.5"})})]}),P.mode==="emit"?p.jsx(Mt,{className:"h-7 text-xs flex-1",value:P.name,disabled:!M,onChange:L=>h(b,{active:P.active,mode:"emit",name:L.target.value})}):A.length>0?p.jsxs(br,{value:P.target.srcId?vr(P.target):"",onValueChange:L=>{const B=l.find(G=>so(G)===L);B&&h(b,{active:P.active,mode:"assign",target:Jb(B)})},disabled:!M,children:[p.jsx(qn,{className:"h-7 text-xs flex-1",children:p.jsx(Sr,{placeholder:i("outputBinding.selectVariable","Select variable...")})}),p.jsx(Zn,{children:A.map(L=>p.jsx(an,{value:so(L),children:L.name},so(L)))})]}):p.jsx("span",{className:"text-xs text-muted-foreground italic flex-1",children:i("outputBinding.noCompatibleVariables","No compatible variables")})]}),_&&p.jsx("div",{className:"space-y-0.5",children:R.map((L,B)=>p.jsx("p",{className:"text-xs text-destructive",children:L},B))})]})]},b)},w=(b,N,k)=>{const P=N[k];if(!P)return null;const A=x(P.dataType),R=BX(b,k),_=g.get(R),M=!!_?.length,$=I=>v(b,N.map((O,D)=>D===k?I:O)),U=()=>v(b,N.filter((I,O)=>O!==k)),L=I=>{P.mode!==I&&$(I==="emit"?{mode:"emit",uid:ln(),name:P.name,dataType:P.dataType}:{mode:"assign",name:P.name,dataType:P.dataType,target:{srcId:"",varId:""}})},B=I=>$({...P,name:I}),G=I=>$({...P,dataType:I});return p.jsxs("div",{className:`rounded-lg bg-card shadow-sm border p-2 space-y-2 transition-all hover:shadow-md ${M?"border-destructive ring-1 ring-destructive":"border-border"}`,children:[p.jsxs("div",{className:"flex items-center gap-2",children:[p.jsx(gt,{variant:"ghost",size:"icon",className:"h-7 w-7 shrink-0",onClick:U,children:p.jsx(El,{className:"w-3.5 h-3.5"})}),p.jsx(Mt,{className:"h-7 text-xs flex-1",value:P.name,placeholder:i("outputBinding.name","Name"),onChange:I=>B(I.target.value)}),p.jsxs(br,{value:P.dataType,onValueChange:I=>G(I),children:[p.jsx(qn,{className:"h-7 text-xs w-20",children:p.jsx(Sr,{})}),p.jsx(Zn,{children:VX.map(I=>p.jsx(an,{value:I,children:I},I))})]})]}),p.jsxs("div",{className:"flex items-center gap-2",children:[p.jsxs(yd,{type:"single",value:P.mode,onValueChange:I=>I&&L(I),className:"gap-0",children:[p.jsx(Yo,{value:"emit",size:"sm",variant:"outline",className:"h-7 w-7 p-0 rounded-r-none","aria-label":i("outputBinding.emit","Emit"),title:i("outputBinding.emit","Emit"),children:p.jsx(ts,{className:"w-3.5 h-3.5"})}),p.jsx(Yo,{value:"assign",size:"sm",variant:"outline",className:"h-7 w-7 p-0 rounded-l-none -ml-px","aria-label":i("outputBinding.assign","Assign"),title:i("outputBinding.assign","Assign"),children:p.jsx(V0,{className:"w-3.5 h-3.5"})})]}),P.mode==="emit"?p.jsx("span",{className:"text-xs text-muted-foreground italic flex-1",children:i("outputBinding.emitHint","creates new variable in scope")}):A.length>0?p.jsxs(br,{value:P.target.srcId?vr(P.target):"",onValueChange:I=>{const O=l.find(D=>so(D)===I);O&&$({...P,target:Jb(O)})},children:[p.jsx(qn,{className:"h-7 text-xs flex-1",children:p.jsx(Sr,{placeholder:i("outputBinding.selectVariable","Select variable...")})}),p.jsx(Zn,{children:A.map(I=>p.jsx(an,{value:so(I),children:I.name},so(I)))})]}):p.jsx("span",{className:"text-xs text-muted-foreground italic flex-1",children:i("outputBinding.noCompatibleVariables","No compatible variables")})]}),M&&p.jsx("div",{className:"space-y-0.5",children:_.map((I,O)=>p.jsx("p",{className:"text-xs text-destructive",children:I},O))})]},`${b}-${P.mode==="emit"?P.uid:`assign-${k}`}`)},E=(b,N)=>{const k={mode:"emit",uid:ln(),name:`output${N.length+1}`,dataType:"string"};v(b,[...N,k])};return p.jsxs("div",{className:"space-y-2",children:[p.jsx("p",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wide",children:i("outputs","Outputs")}),p.jsxs("div",{className:"space-y-2",children:[d.map(b=>{const N=c[b.id];return N?S(b.id,N,b.label):null}),f.map(b=>{const N=t.arguments[b.id]??[];return p.jsxs(m.Fragment,{children:[p.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[p.jsx("span",{className:"text-[11px] font-medium text-muted-foreground",children:b.label}),p.jsx("div",{className:"flex-1 h-px bg-border/60"})]}),N.map((k,P)=>w(b.id,N,P)),p.jsx(ss,{onClick:()=>E(b.id,N),children:i("addOutput",{label:b.label,defaultValue:`Add ${b.label.toLowerCase()}`})})]},b.id)})]})]})}const UX=["int","float","bool","string"],KX=({canvasId:e,variable:t,onClose:n})=>{const{t:r}=Xe(),o=ue(f=>wn(f.builderMode)),[i,l]=m.useState(t.name);m.useEffect(()=>{l(t.name)},[t.uid,t.name]);const c=t.name.trim()==="",d=()=>{switch(t.dataType){case"bool":return p.jsxs(br,{value:t.initialValue!=null?String(t.initialValue):"false",onValueChange:f=>Ha(e,t.uid,{initialValue:f==="true"}),children:[p.jsx(qn,{className:"h-8 text-sm",children:p.jsx(Sr,{})}),p.jsxs(Zn,{children:[p.jsx(an,{value:"false",children:"false"}),p.jsx(an,{value:"true",children:"true"})]})]});case"string":return p.jsx(Mt,{className:"h-8 text-sm",value:t.initialValue??"",onChange:f=>Ha(e,t.uid,{initialValue:f.target.value}),placeholder:'""'});case"int":case"float":return p.jsx(Mt,{type:"number",step:t.dataType==="float"?"any":1,className:"h-8 text-sm",value:t.initialValue!=null?Number(t.initialValue):"",onChange:f=>{const g=t.dataType==="float"?parseFloat(f.target.value):parseInt(f.target.value,10);Ha(e,t.uid,{initialValue:isNaN(g)?void 0:g})},placeholder:"0"});default:return null}};return p.jsx("div",{className:"p-4",children:p.jsxs("div",{className:"space-y-4",children:[p.jsxs("div",{className:"flex items-center justify-between gap-2",children:[p.jsxs("div",{className:"flex-1 min-w-0",children:[p.jsx("div",{className:"group flex items-center gap-1.5 rounded-md border border-transparent px-1.5 -mx-1.5 hover:border-input focus-within:border-input transition-colors",children:p.jsx("input",{type:"text",title:r("variableName","Variable name"),className:"font-semibold text-lg font-mono bg-transparent w-full outline-none cursor-text py-0.5",value:i,readOnly:o,onChange:f=>{l(f.target.value),Ha(e,t.uid,{name:f.target.value})}})}),p.jsx("p",{className:"text-sm text-muted-foreground",children:r("variableDescription","A declared variable you can read and write across this canvas")}),c&&p.jsx("p",{className:"text-xs text-destructive mt-1",children:r("variableNameRequired","Name is required")})]}),p.jsx(gt,{variant:"ghost",size:"icon",className:"shrink-0",onClick:n,children:p.jsx(Cl,{className:"h-4 w-4"})})]}),o&&p.jsx($l,{}),p.jsx($t,{}),p.jsxs("div",{className:`space-y-4 ${o?"pointer-events-none opacity-60":""}`,children:[p.jsxs("div",{className:"space-y-1.5",children:[p.jsx("label",{className:"text-xs font-medium text-foreground/80",children:r("dataType","Data type")}),p.jsxs(br,{value:t.dataType,onValueChange:f=>PB(e,t.uid,f),children:[p.jsx(qn,{className:"h-8 text-sm",children:p.jsx(Sr,{})}),p.jsx(Zn,{children:UX.map(f=>p.jsx(an,{value:f,children:f},f))})]})]}),p.jsxs("div",{className:"space-y-1.5",children:[p.jsxs("label",{className:"text-xs font-medium text-foreground/80",children:[r("initialValue")," ",p.jsxs("span",{className:"font-normal text-muted-foreground",children:["(",r("optional","optional"),")"]})]}),d()]})]}),!o&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx(zi,{onClick:()=>RB(e,t.uid),children:r("deleteVariable","Delete variable")})]})]})})},GX=({canvasId:e,isDebugMode:t,selectionDrag:n,getNodeDef:r,onNodeUpdate:o,onNodeDelete:i,onEdgeUpdate:l,onEdgeDelete:c,onClearSelection:d,onTestNode:f,onDebugStep:g})=>{const h=ue(G=>G.selection),v=ue(G=>G.clearSelection),x=ue(G=>G.channels),S=ue(G=>G.memory),w=ue(G=>G.models),E=ue(G=>G.functions),b=et(e),N=b(m.useCallback(G=>h.kind!=="graph"||h.nodeIds.length!==1?null:G.nodes.find(O=>O.id===h.nodeIds[0])?.data??null,[h])),k=b(m.useCallback(G=>{if(h.kind!=="variable")return null;const I=G.variables[Pi(h.uid)];return I&&I.kind==="declared"?I:null},[h])),P=b(m.useCallback(G=>h.kind!=="graph"||h.edgeIds.length!==1||h.nodeIds.length>0?null:G.edges.find(I=>I.id===h.edgeIds[0])??null,[h])),A=P?{id:P.id,source:P.source,type:P.type??"control",data:P.data??{}}:null,R=b(m.useCallback(G=>A?G.edges.filter(I=>I.source===A.source&&cm(I.type)).length:0,[A?.source])),_=m.useMemo(()=>h.kind==="channel"?Object.values(x).find(G=>G.id===h.id)??null:null,[h,x]),M=m.useMemo(()=>h.kind==="memory"?Object.values(S).find(G=>G.id===h.id)??null:null,[h,S]),$=m.useMemo(()=>h.kind==="model"?Object.values(w).find(G=>G.id===h.id)??null:null,[h,w]),U=m.useMemo(()=>h.kind==="function"?E[h.id]??null:null,[h,E]),L=m.useCallback(G=>r(G)?.category,[r]),B=m.useCallback(G=>f?.(G),[f]);return n?null:t?N?p.jsx(ro,{bg:"bg-background",pad:!0,children:p.jsx(XY,{canvasId:e,onStep:g??(()=>{}),getNodeCategory:L})}):null:N?p.jsx(ro,{children:p.jsx(zX,{canvasId:e,selectedNode:N,onNodeUpdate:o,onNodeDelete:i,onClose:d,onOpenTest:B,getNodeDef:r})}):A?p.jsx(ro,{children:p.jsx(QY,{canvasId:e,edgeId:A.id,edgeType:A.type,edgeData:A.data,sourceControlEdgeCount:R,onEdgeUpdate:l,onEdgeDelete:c,onClose:d})}):k?p.jsx(ro,{children:p.jsx(KX,{canvasId:e,variable:k,onClose:v})}):_?p.jsx(ro,{children:p.jsx(YY,{channel:_,onClose:v})}):M?p.jsx(ro,{children:p.jsx(IX,{memory:M,onClose:v})}):$?p.jsx(ro,{children:p.jsx(_X,{model:$,onClose:v})}):U?p.jsx(ro,{children:p.jsx(RX,{func:U,onClose:v})}):null},ro=({bg:e="bg-card",pad:t=!1,children:n})=>p.jsx(Di,{className:Ce("w-80 border-l border-border",e),viewportClassName:t?"p-3":void 0,children:n}),YX=(e=Be)=>{const t=et(e);return{undo:t.undo,redo:t.redo,takeCheckpoint:t.takeCheckpoint,withCheckpoint:t.withCheckpoint,clearHistory:t.clearHistory,canUndo:t.canUndo,canRedo:t.canRedo}},e1={current:null},XX=(e=Be,t=!1)=>{const n=et(e),r=n(N=>N.nodes),o=n(N=>N.edges),{withCheckpoint:i}=n,{getNodeDefinition:l}=ey(),c=m.useCallback(N=>{if(!t)return i(N)},[t,i]),d=m.useCallback((N,k)=>c(()=>Yb(n,N,k))??null,[n,c]),f=m.useCallback((N,k)=>{c(()=>qT(n,N,k))},[n,c]),g=m.useCallback(N=>{c(()=>Xb(n,N,l))},[n,l,c]),h=m.useCallback(N=>c(()=>qb(n,N))??!1,[n,c]),v=m.useCallback((N,k)=>{c(()=>$X(n,N,k))},[n,c]),x=m.useCallback(N=>{c(()=>Zb(n,N))},[n,c]),S=m.useCallback((N,k)=>{N.length===0&&k.length===0||c(()=>{for(const P of N)Xb(n,P,l);k.length>0&&Zb(n,k)})},[n,l,c]),w=m.useCallback(N=>{if(N.length===0)return;const k=new Set(N),P=r.filter(R=>k.has(R.id)).map(R=>JSON.parse(JSON.stringify(R))),A=o.filter(R=>k.has(R.source)&&k.has(R.target)).map(R=>JSON.parse(JSON.stringify(R)));e1.current={nodes:P,edges:A}},[r,o]),E=m.useCallback(N=>{const k=e1.current;if(k)return c(()=>LX(n,k,N,l))},[n,l,c]),b=m.useCallback((N,k,P)=>c(()=>{const A=Yb(n,N,k);return A==null?null:(qb(n,{...P,target:A}),A)})??null,[n,c]);return{nodes:r,edges:o,addNode:d,updateNode:f,updateEdge:v,deleteNode:g,deleteEdges:x,deleteSelected:S,onConnect:h,addNodeAndConnect:b,copySelection:w,pasteSelection:E}},qX=()=>{const{t:e}=Xe(),t=is(o=>o.console),n=is(o=>o.clearConsole),r=m.useRef(null);return m.useEffect(()=>{r.current&&(r.current.scrollTop=r.current.scrollHeight)},[t]),p.jsxs("div",{className:"h-full flex flex-col bg-background border-t border-border",children:[p.jsxs("div",{className:"flex items-center justify-between px-3 py-1.5 border-b border-border/50 shrink-0",children:[p.jsx("span",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider",children:e("debug.console")}),p.jsx(gt,{variant:"ghost",size:"icon",className:"w-6 h-6 text-muted-foreground hover:text-foreground",onClick:n,title:e("debug.clearConsole"),children:p.jsx(El,{className:"w-3.5 h-3.5"})})]}),p.jsx(Di,{className:"flex-1",viewportRef:r,viewportClassName:"p-2",children:p.jsx("div",{className:"font-mono text-xs space-y-0.5",children:t.length===0?p.jsx("div",{className:"text-muted-foreground text-center py-4",children:e("debug.consoleEmpty")}):t.map(o=>p.jsx(ZX,{entry:o},o.id))})})]})};function ZX({entry:e}){const t=new Date(e.timestamp).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}),n=e.type==="error"?"text-destructive":e.type==="system"?"text-muted-foreground":"text-foreground";return p.jsxs("div",{className:`flex gap-2 leading-relaxed ${n}`,children:[p.jsx("span",{className:"text-muted-foreground/50 shrink-0",children:t}),p.jsx("span",{className:"whitespace-pre-wrap break-all",children:e.text})]})}const QX=({functions:e,onOpenFunction:t,onCreateFunction:n,canvasTabs:r,onCanvasTabChange:o,onCanvasTabClose:i,onCanvasTabReorder:l,onTestNode:c,onDebugStep:d})=>{const f=ue(K=>K.activeCanvasId),g=ue(K=>K.builderMode),h=wn(g),v=g.type==="debug",{nodeDefinitions:x,getNodeDefinition:S,getAllCategories:w}=ey(),E=XX(f,h),{undo:b,redo:N,takeCheckpoint:k,canUndo:P,canRedo:A}=YX(f),R=ue(K=>K.selection),_=ue(K=>K.selectGraph),M=ue(K=>K.syncSelectionFromRF),$=ue(K=>K.clearSelection),U=ue(K=>K.activeSidebarTab),L=ue(K=>K.setActiveSidebarTab);m.useEffect(()=>{const K=U==="debug-context";v&&!K?L("debug-context"):!v&&K&&L("nodes")},[v,U,L]);const[B,G]=m.useState(!1),I=m.useRef(null),O=m.useCallback(K=>_([K],[]),[_]),D=m.useCallback(K=>_([],[K]),[_]),V=m.useCallback((K,q)=>{const oe=q??I.current?.(),ce=E.addNode(K,oe);return ce==null&&Gt({title:`Only one ${K.label} node allowed per canvas`,variant:"destructive"}),ce},[E]),z=m.useCallback(K=>{const q=E.onConnect(K);if(q&&q!=="control"&&q!=="tool"){const{edges:oe}=et(f).getState(),ce=oe.find(ge=>ge.source===K.source&&ge.target===K.target&&ge.sourceHandle===K.sourceHandle&&ge.targetHandle===K.targetHandle);ce&&D(ce.id)}},[E,f,D]),W=m.useCallback((K,q,oe)=>{const ce=E.addNodeAndConnect(K,q,oe);return ce==null&&Gt({title:`Only one ${K.label} node allowed per canvas`,variant:"destructive"}),ce},[E]),Z=m.useCallback(({nodes:K,edges:q})=>{M(K.map(oe=>oe.id),q.map(oe=>oe.id))},[M]),F=m.useCallback(K=>{E.deleteEdges([K]),$()},[E,$]),H=m.useCallback(()=>{k()},[k]),X=m.useCallback(()=>{const K=ue.getState().selection,q=K.kind==="graph"?K.nodeIds:[],oe=K.kind==="graph"?K.edgeIds:[];E.deleteSelected(q,oe),$()},[E,$]),Q=m.useCallback(K=>{const q=E.pasteSelection(K);if(q?.skippedLabels.length)for(const oe of q.skippedLabels)Gt({title:`Only one ${oe} node allowed per canvas`,variant:"destructive"});return q},[E]);m.useEffect(()=>{const K=q=>{const oe=q.target;if(!(oe?.tagName==="INPUT"||oe?.tagName==="TEXTAREA"||oe?.isContentEditable)){if(h){q.key==="Escape"&&$();return}if((q.ctrlKey||q.metaKey)&&q.key==="z"&&!q.shiftKey){q.preventDefault(),P()&&($(),b());return}if((q.ctrlKey||q.metaKey)&&(q.key==="y"||q.key==="z"&&q.shiftKey)){q.preventDefault(),A()&&($(),N());return}if((q.ctrlKey||q.metaKey)&&q.key==="c"){R.kind==="graph"&&R.nodeIds.length>0&&(q.preventDefault(),E.copySelection(R.nodeIds));return}if((q.ctrlKey||q.metaKey)&&q.key==="v"){q.preventDefault(),Q();return}(q.key==="Delete"||q.key==="Backspace")&&X(),q.key==="Escape"&&$()}};return document.addEventListener("keydown",K),()=>document.removeEventListener("keydown",K)},[P,A,b,N,$,X,R,E,Q,h]);const ee=f!==Be,ne=p.jsxs("div",{className:"flex flex-col h-full min-w-0",children:[p.jsx(BB,{tabs:r,activeTabId:f,onTabChange:o,onTabClose:i,onTabReorder:l}),p.jsx("div",{className:"flex-1 relative",children:p.jsx(OG,{canvasId:f,viewportCenterRef:I,nodeDefinitions:x,onConnect:z,onAddNode:V,onAddNodeAndConnect:W,onSelectionChange:Z,onPaneClick:$,onNodeDragStart:H,setSelectionDrag:G},f)})]});return p.jsx("div",{className:"h-full bg-canvas-bg flex flex-col",children:p.jsxs("div",{className:"flex-1 flex overflow-hidden",children:[p.jsx(HB,{canvasId:f,activeTab:U,onTabChange:L,onAddNode:V,nodeDefinitions:x,getAllCategories:w,onSelectNode:O,onSelectEdge:D,isFunctionCanvas:ee,functions:e,onOpenFunction:t,onCreateFunction:n,isDebugMode:v}),p.jsx("div",{className:"flex-1 flex flex-col h-full min-w-0",children:v?p.jsxs($4,{direction:"vertical",children:[p.jsx(hw,{defaultSize:75,minSize:30,children:ne}),p.jsx(L4,{withHandle:!0}),p.jsx(hw,{defaultSize:25,minSize:10,children:p.jsx(qX,{})})]}):ne}),p.jsx(GX,{canvasId:f,isDebugMode:v,selectionDrag:B,getNodeDef:S,onNodeUpdate:E.updateNode,onNodeDelete:E.deleteNode,onEdgeUpdate:E.updateEdge,onEdgeDelete:F,onClearSelection:$,onTestNode:c,onDebugStep:d})]})})};var My="ToastProvider",[Dy,JX,eq]=yf("Toast"),[eP]=Ft("Toast",[eq]),[tq,Cf]=eP(My),tP=e=>{const{__scopeToast:t,label:n="Notification",duration:r=5e3,swipeDirection:o="right",swipeThreshold:i=50,children:l}=e,[c,d]=m.useState(null),[f,g]=m.useState(0),h=m.useRef(!1),v=m.useRef(!1);return n.trim()||console.error(`Invalid prop \`label\` supplied to \`${My}\`. Expected non-empty \`string\`.`),p.jsx(Dy.Provider,{scope:t,children:p.jsx(tq,{scope:t,label:n,duration:r,swipeDirection:o,swipeThreshold:i,toastCount:f,viewport:c,onViewportChange:d,onToastAdd:m.useCallback(()=>g(x=>x+1),[]),onToastRemove:m.useCallback(()=>g(x=>x-1),[]),isFocusedToastEscapeKeyDownRef:h,isClosePausedRef:v,children:l})})};tP.displayName=My;var nP="ToastViewport",nq=["F8"],om="toast.viewportPause",sm="toast.viewportResume",rP=m.forwardRef((e,t)=>{const{__scopeToast:n,hotkey:r=nq,label:o="Notifications ({hotkey})",...i}=e,l=Cf(nP,n),c=JX(n),d=m.useRef(null),f=m.useRef(null),g=m.useRef(null),h=m.useRef(null),v=De(t,h,l.onViewportChange),x=r.join("+").replace(/Key/g,"").replace(/Digit/g,""),S=l.toastCount>0;m.useEffect(()=>{const E=b=>{r.length!==0&&r.every(k=>b[k]||b.code===k)&&h.current?.focus()};return document.addEventListener("keydown",E),()=>document.removeEventListener("keydown",E)},[r]),m.useEffect(()=>{const E=d.current,b=h.current;if(S&&E&&b){const N=()=>{if(!l.isClosePausedRef.current){const R=new CustomEvent(om);b.dispatchEvent(R),l.isClosePausedRef.current=!0}},k=()=>{if(l.isClosePausedRef.current){const R=new CustomEvent(sm);b.dispatchEvent(R),l.isClosePausedRef.current=!1}},P=R=>{!E.contains(R.relatedTarget)&&k()},A=()=>{E.contains(document.activeElement)||k()};return E.addEventListener("focusin",N),E.addEventListener("focusout",P),E.addEventListener("pointermove",N),E.addEventListener("pointerleave",A),window.addEventListener("blur",N),window.addEventListener("focus",k),()=>{E.removeEventListener("focusin",N),E.removeEventListener("focusout",P),E.removeEventListener("pointermove",N),E.removeEventListener("pointerleave",A),window.removeEventListener("blur",N),window.removeEventListener("focus",k)}}},[S,l.isClosePausedRef]);const w=m.useCallback(({tabbingDirection:E})=>{const N=c().map(k=>{const P=k.ref.current,A=[P,...gq(P)];return E==="forwards"?A:A.reverse()});return(E==="forwards"?N.reverse():N).flat()},[c]);return m.useEffect(()=>{const E=h.current;if(E){const b=N=>{const k=N.altKey||N.ctrlKey||N.metaKey;if(N.key==="Tab"&&!k){const A=document.activeElement,R=N.shiftKey;if(N.target===E&&R){f.current?.focus();return}const $=w({tabbingDirection:R?"backwards":"forwards"}),U=$.findIndex(L=>L===A);fg($.slice(U+1))?N.preventDefault():R?f.current?.focus():g.current?.focus()}};return E.addEventListener("keydown",b),()=>E.removeEventListener("keydown",b)}},[c,w]),p.jsxs(Y3,{ref:d,role:"region","aria-label":o.replace("{hotkey}",x),tabIndex:-1,style:{pointerEvents:S?void 0:"none"},children:[S&&p.jsx(im,{ref:f,onFocusFromOutsideViewport:()=>{const E=w({tabbingDirection:"forwards"});fg(E)}}),p.jsx(Dy.Slot,{scope:n,children:p.jsx(ke.ol,{tabIndex:-1,...i,ref:v})}),S&&p.jsx(im,{ref:g,onFocusFromOutsideViewport:()=>{const E=w({tabbingDirection:"backwards"});fg(E)}})]})});rP.displayName=nP;var oP="ToastFocusProxy",im=m.forwardRef((e,t)=>{const{__scopeToast:n,onFocusFromOutsideViewport:r,...o}=e,i=Cf(oP,n);return p.jsx(Kd,{tabIndex:0,...o,ref:t,style:{position:"fixed"},onFocus:l=>{const c=l.relatedTarget;!i.viewport?.contains(c)&&r()}})});im.displayName=oP;var Ll="Toast",rq="toast.swipeStart",oq="toast.swipeMove",sq="toast.swipeCancel",iq="toast.swipeEnd",sP=m.forwardRef((e,t)=>{const{forceMount:n,open:r,defaultOpen:o,onOpenChange:i,...l}=e,[c,d]=cn({prop:r,defaultProp:o??!0,onChange:i,caller:Ll});return p.jsx(Pt,{present:n||c,children:p.jsx(cq,{open:c,...l,ref:t,onClose:()=>d(!1),onPause:pt(e.onPause),onResume:pt(e.onResume),onSwipeStart:ve(e.onSwipeStart,f=>{f.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:ve(e.onSwipeMove,f=>{const{x:g,y:h}=f.detail.delta;f.currentTarget.setAttribute("data-swipe","move"),f.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${g}px`),f.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${h}px`)}),onSwipeCancel:ve(e.onSwipeCancel,f=>{f.currentTarget.setAttribute("data-swipe","cancel"),f.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),f.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),f.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),f.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:ve(e.onSwipeEnd,f=>{const{x:g,y:h}=f.detail.delta;f.currentTarget.setAttribute("data-swipe","end"),f.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),f.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),f.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${g}px`),f.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${h}px`),d(!1)})})})});sP.displayName=Ll;var[aq,lq]=eP(Ll,{onClose(){}}),cq=m.forwardRef((e,t)=>{const{__scopeToast:n,type:r="foreground",duration:o,open:i,onClose:l,onEscapeKeyDown:c,onPause:d,onResume:f,onSwipeStart:g,onSwipeMove:h,onSwipeCancel:v,onSwipeEnd:x,...S}=e,w=Cf(Ll,n),[E,b]=m.useState(null),N=De(t,I=>b(I)),k=m.useRef(null),P=m.useRef(null),A=o||w.duration,R=m.useRef(0),_=m.useRef(A),M=m.useRef(0),{onToastAdd:$,onToastRemove:U}=w,L=pt(()=>{E?.contains(document.activeElement)&&w.viewport?.focus(),l()}),B=m.useCallback(I=>{!I||I===1/0||(window.clearTimeout(M.current),R.current=new Date().getTime(),M.current=window.setTimeout(L,I))},[L]);m.useEffect(()=>{const I=w.viewport;if(I){const O=()=>{B(_.current),f?.()},D=()=>{const V=new Date().getTime()-R.current;_.current=_.current-V,window.clearTimeout(M.current),d?.()};return I.addEventListener(om,D),I.addEventListener(sm,O),()=>{I.removeEventListener(om,D),I.removeEventListener(sm,O)}}},[w.viewport,A,d,f,B]),m.useEffect(()=>{i&&!w.isClosePausedRef.current&&B(A)},[i,A,w.isClosePausedRef,B]),m.useEffect(()=>($(),()=>U()),[$,U]);const G=m.useMemo(()=>E?fP(E):null,[E]);return w.viewport?p.jsxs(p.Fragment,{children:[G&&p.jsx(uq,{__scopeToast:n,role:"status","aria-live":r==="foreground"?"assertive":"polite",children:G}),p.jsx(aq,{scope:n,onClose:L,children:hs.createPortal(p.jsx(Dy.ItemSlot,{scope:n,children:p.jsx(G3,{asChild:!0,onEscapeKeyDown:ve(c,()=>{w.isFocusedToastEscapeKeyDownRef.current||L(),w.isFocusedToastEscapeKeyDownRef.current=!1}),children:p.jsx(ke.li,{tabIndex:0,"data-state":i?"open":"closed","data-swipe-direction":w.swipeDirection,...S,ref:N,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:ve(e.onKeyDown,I=>{I.key==="Escape"&&(c?.(I.nativeEvent),I.nativeEvent.defaultPrevented||(w.isFocusedToastEscapeKeyDownRef.current=!0,L()))}),onPointerDown:ve(e.onPointerDown,I=>{I.button===0&&(k.current={x:I.clientX,y:I.clientY})}),onPointerMove:ve(e.onPointerMove,I=>{if(!k.current)return;const O=I.clientX-k.current.x,D=I.clientY-k.current.y,V=!!P.current,z=["left","right"].includes(w.swipeDirection),W=["left","up"].includes(w.swipeDirection)?Math.min:Math.max,Z=z?W(0,O):0,F=z?0:W(0,D),H=I.pointerType==="touch"?10:2,X={x:Z,y:F},Q={originalEvent:I,delta:X};V?(P.current=X,Ru(oq,h,Q,{discrete:!1})):t1(X,w.swipeDirection,H)?(P.current=X,Ru(rq,g,Q,{discrete:!1}),I.target.setPointerCapture(I.pointerId)):(Math.abs(O)>H||Math.abs(D)>H)&&(k.current=null)}),onPointerUp:ve(e.onPointerUp,I=>{const O=P.current,D=I.target;if(D.hasPointerCapture(I.pointerId)&&D.releasePointerCapture(I.pointerId),P.current=null,k.current=null,O){const V=I.currentTarget,z={originalEvent:I,delta:O};t1(O,w.swipeDirection,w.swipeThreshold)?Ru(iq,x,z,{discrete:!0}):Ru(sq,v,z,{discrete:!0}),V.addEventListener("click",W=>W.preventDefault(),{once:!0})}})})})}),w.viewport)})]}):null}),uq=e=>{const{__scopeToast:t,children:n,...r}=e,o=Cf(Ll,t),[i,l]=m.useState(!1),[c,d]=m.useState(!1);return pq(()=>l(!0)),m.useEffect(()=>{const f=window.setTimeout(()=>d(!0),1e3);return()=>window.clearTimeout(f)},[]),c?null:p.jsx(Mi,{asChild:!0,children:p.jsx(Kd,{...r,children:i&&p.jsxs(p.Fragment,{children:[o.label," ",n]})})})},dq="ToastTitle",iP=m.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return p.jsx(ke.div,{...r,ref:t})});iP.displayName=dq;var fq="ToastDescription",aP=m.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return p.jsx(ke.div,{...r,ref:t})});aP.displayName=fq;var lP="ToastAction",cP=m.forwardRef((e,t)=>{const{altText:n,...r}=e;return n.trim()?p.jsx(dP,{altText:n,asChild:!0,children:p.jsx(jy,{...r,ref:t})}):(console.error(`Invalid prop \`altText\` supplied to \`${lP}\`. Expected non-empty \`string\`.`),null)});cP.displayName=lP;var uP="ToastClose",jy=m.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e,o=lq(uP,n);return p.jsx(dP,{asChild:!0,children:p.jsx(ke.button,{type:"button",...r,ref:t,onClick:ve(e.onClick,o.onClose)})})});jy.displayName=uP;var dP=m.forwardRef((e,t)=>{const{__scopeToast:n,altText:r,...o}=e;return p.jsx(ke.div,{"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":r||void 0,...o,ref:t})});function fP(e){const t=[];return Array.from(e.childNodes).forEach(r=>{if(r.nodeType===r.TEXT_NODE&&r.textContent&&t.push(r.textContent),hq(r)){const o=r.ariaHidden||r.hidden||r.style.display==="none",i=r.dataset.radixToastAnnounceExclude==="";if(!o)if(i){const l=r.dataset.radixToastAnnounceAlt;l&&t.push(l)}else t.push(...fP(r))}}),t}function Ru(e,t,n,{discrete:r}){const o=n.originalEvent.currentTarget,i=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),r?gm(o,i):o.dispatchEvent(i)}var t1=(e,t,n=0)=>{const r=Math.abs(e.x),o=Math.abs(e.y),i=r>o;return t==="left"||t==="right"?i&&r>n:!i&&o>n};function pq(e=()=>{}){const t=pt(e);wt(()=>{let n=0,r=0;return n=window.requestAnimationFrame(()=>r=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(n),window.cancelAnimationFrame(r)}},[t])}function hq(e){return e.nodeType===e.ELEMENT_NODE}function gq(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const o=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||o?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function fg(e){const t=document.activeElement;return e.some(n=>n===t?!0:(n.focus(),document.activeElement!==t))}var mq=tP,pP=rP,hP=sP,gP=iP,mP=aP,yP=cP,vP=jy;const yq=mq,xP=m.forwardRef(({className:e,...t},n)=>p.jsx(pP,{ref:n,className:Ce("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",e),...t}));xP.displayName=pP.displayName;const vq=yo("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),wP=m.forwardRef(({className:e,variant:t,...n},r)=>p.jsx(hP,{ref:r,className:Ce(vq({variant:t}),e),...n}));wP.displayName=hP.displayName;const xq=m.forwardRef(({className:e,...t},n)=>p.jsx(yP,{ref:n,className:Ce("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive",e),...t}));xq.displayName=yP.displayName;const bP=m.forwardRef(({className:e,...t},n)=>p.jsx(vP,{ref:n,className:Ce("absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",e),"toast-close":"",...t,children:p.jsx(Rd,{className:"h-4 w-4"})}));bP.displayName=vP.displayName;const SP=m.forwardRef(({className:e,...t},n)=>p.jsx(gP,{ref:n,className:Ce("text-sm font-semibold",e),...t}));SP.displayName=gP.displayName;const CP=m.forwardRef(({className:e,...t},n)=>p.jsx(mP,{ref:n,className:Ce("text-sm opacity-90",e),...t}));CP.displayName=mP.displayName;function wq(){const{toasts:e}=cz();return p.jsxs(yq,{children:[e.map(function({id:t,title:n,description:r,action:o,...i}){return p.jsxs(wP,{...i,children:[p.jsxs("div",{className:"grid gap-1",children:[n&&p.jsx(SP,{children:n}),r&&p.jsx(CP,{children:r})]}),o,p.jsx(bP,{})]},t)}),p.jsx(xP,{})]})}const bq=()=>{const[e,t]=m.useState([{id:Be,label:"Main"}]),n=ue(w=>w.activeCanvasId),r=ue(w=>w.setActiveCanvas),o=ue(w=>w.selectFunction),i=ue(w=>w.functions);m.useEffect(()=>{t(w=>{let E=!1;const b=w.flatMap(N=>{if(N.id===Be)return[N];const k=i[N.id];return k?k.name!==N.label?(E=!0,[{...N,label:k.name}]):[N]:(E=!0,[])});return E?b:w}),n!==Be&&!i[n]&&r(Be)},[i,n,r]);const l=m.useCallback(w=>{w!==Be&&i[w]?o(w):r(w)},[i,o,r]),c=m.useCallback((w,E)=>(t(b=>b.find(k=>k.id===w)?b:[...b,{id:w,label:E}]),r(w),w),[r]),d=m.useCallback(w=>{w!==Be&&t(E=>{const b=E.filter(N=>N.id!==w);return w===n&&r(Be),b})},[n,r]),f=m.useCallback(w=>{w!==Be&&t(E=>{const b=E.filter(N=>N.id!==w);return w===n&&r(Be),b})},[n,r]),g=m.useCallback((w,E)=>{t(b=>b.map(N=>N.id===w?{...N,label:E}:N))},[]),h=m.useCallback((w,E)=>{w===0||E===0||t(b=>{const N=[...b],[k]=N.splice(w,1);return k?(N.splice(E,0,k),N):b})},[]),v=m.useCallback(()=>{t([{id:Be,label:"Main"}]),r(Be)},[r]),x=m.useCallback((w,E)=>{t(w),r(E)},[r]),S=m.useCallback(w=>e.find(E=>E.id===w)?.label||"Unknown",[e]);return{tabs:e,activeTabId:n,setActiveTabId:l,openTab:c,closeTab:d,removeTab:f,renameTab:g,reorderTabs:h,resetToMain:v,restoreTabState:x,getTabLabel:S,isMainCanvas:n===Be}};function pg(e){const t=ue(e.selectItems);m.useEffect(()=>{const n=Ye.getState(),r=new Set;for(const o of Object.values(t))r.add(o.id),e.set(n,o.id,e.validate(o));for(const o of Object.keys(e.getStored(n)))r.has(o)||e.clear(n,o)},[t])}function Sq(){const e=ue(t=>t.functions);m.useEffect(()=>{const t=Ye.getState(),n=new Set;for(const[r,o]of Object.entries(e)){n.add(r);const i=Zm(r),l=i?dm(i.getState().variables,i.getState().edges).lookup:void 0;t.setFunctionDiagnostics(r,FA(o,l))}for(const r of Object.keys(t.byFunctionId))n.has(r)||t.clearFunctionDiagnostics(r)},[e])}function Cq(){const e=BN();m.useEffect(()=>{if(typeof document>"u")return;const t=document.documentElement;let n=t.classList.contains("light"),r=0;const o=new MutationObserver(()=>{const i=t.classList.contains("light");i!==n&&(n=i,t.classList.add("theme-changing"),t.offsetHeight,clearTimeout(r),r=window.setTimeout(()=>t.classList.remove("theme-changing"),120))});return o.observe(t,{attributes:!0,attributeFilter:["class"]}),()=>{o.disconnect(),clearTimeout(r),t.classList.remove("theme-changing")}},[]),m.useLayoutEffect(()=>{if(typeof document>"u")return;const t=document.documentElement;t.classList.contains("theme-changing")&&(t.offsetHeight,t.classList.remove("theme-changing"))},[e])}const Eq=({onOpenTab:e})=>{const{functionsList:t,getFunction:n}=Qd(),r=ue(l=>l.selectFunction),o=m.useCallback(l=>{const c=n(l);c&&(et(l),e(l,c.name),r(l))},[n,e,r]),i=m.useCallback(()=>{const l=xX();return e(l.id,l.name),r(l.id),l.id},[e,r]);return{functions:t,openFunction:o,createFunction:i}};function Nq(){const e=m.useCallback(r=>{const o=KH(BH(r));Aw();for(const[d,f]of Object.entries(o.canvases)){const g=et(d),h=f.nodes.map(x=>({id:x.id,type:QT(x.type),position:x.position,data:x})),v=f.edges.map(x=>({id:x.id,type:x.type,source:x.source,sourceHandle:x.sourceHandle,target:x.target,targetHandle:x.targetHandle,...x.data?{data:x.data}:{}}));g.getState().initialize(h,v),g.getState().setVariables(()=>f.variables)}const{channels:i,memory:l,models:c}=o;i&&Object.keys(i).length>0&&ue.getState().setChannels(()=>i),l&&Object.keys(l).length>0&&ue.getState().setMemory(()=>l),c&&Object.keys(c).length>0&&ue.getState().setModels(()=>c),ue.getState().setFunctions(()=>o.functions),Zd()},[]),t=m.useCallback(()=>UH(EP()),[]),n=m.useCallback(()=>{Aw();const r=ue.getState();r.setActiveCanvas(Be),r.setChannels(o=>Object.keys(o).length?{}:o),r.setMemory(o=>Object.keys(o).length?{}:o),r.setModels(o=>Object.keys(o).length?{}:o),r.setFunctions(o=>Object.keys(o).length?{}:o),r.clearSelection()},[]);return{exportProject:t,importProject:e,clearProject:n}}function EP(){const e={};for(const[o,i]of Object.entries(Qm())){const l=i.getState();e[o]={nodes:l.nodes.map(c=>({...c.data,position:c.position})),edges:l.edges.map(c=>({id:c.id,type:c.type,source:c.source,sourceHandle:c.sourceHandle,target:c.target,targetHandle:c.targetHandle,...c.data?{data:c.data}:{}})),variables:l.variables}}const t={};for(const o of Object.values(ue.getState().channels))t[o.id]=o;const n={};for(const o of Object.values(ue.getState().memory))n[o.id]=o;const r={};for(const o of Object.values(ue.getState().models))r[o.id]=o;return{canvases:e,functions:ue.getState().functions,channels:t,memory:n,models:r}}function wn(e){return e.type!=="edit"}const kq=m.forwardRef(function(t,n){const{initialWorkflow:r,initialMode:o,models:i,language:l,onTestNode:c,onDebugStep:d,onChange:f,onHistoryChange:g,onError:h}=t;m.useLayoutEffect(()=>{l&&mr.language!==l&&mr.changeLanguage(l)},[l]);const{importProject:v,exportProject:x,clearProject:S}=Nq();Cq(),pg({selectItems:M=>M.channels,validate:T1,getStored:M=>M.byChannelId,set:(M,$,U)=>M.setChannelDiagnostics($,U),clear:(M,$)=>M.clearChannelDiagnostics($)}),pg({selectItems:M=>M.memory,validate:P1,getStored:M=>M.byMemoryId,set:(M,$,U)=>M.setMemoryDiagnostics($,U),clear:(M,$)=>M.clearMemoryDiagnostics($)}),pg({selectItems:M=>M.models,validate:R1,getStored:M=>M.byModelId,set:(M,$,U)=>M.setModelDiagnostics($,U),clear:(M,$)=>M.clearModelDiagnostics($)}),Sq(),m.useEffect(()=>{ue.getState().setAvailableModels(i??[])},[i]);const w=bq(),E=Eq({onOpenTab:w.openTab}),[b,N]=m.useState(null),k=m.useCallback(()=>{const M=VA(EP());M.totalErrors===0&&M.totalWarnings===0?Gt({title:mr.t("validationPassed")}):N(M)},[]),P=m.useCallback(M=>{const $=ue.getState();M.channelId?($.setActiveSidebarTab("channels"),$.selectChannel(M.channelId)):M.memoryId?($.setActiveSidebarTab("memory"),$.selectMemory(M.memoryId)):M.modelId?($.setActiveSidebarTab("models"),$.selectModel(M.modelId)):M.canvasId&&(M.canvasId===Be?$.setActiveCanvas(Be):E.openFunction(M.canvasId),M.nodeId?$.selectGraph([M.nodeId],[]):M.edgeId&&$.selectGraph([],[M.edgeId])),N(null)},[E]),A=m.useRef(!1);m.useEffect(()=>{if(!A.current){A.current=!0;try{o&&ue.getState().setBuilderMode(o),r?v(r):S()}catch(M){h?.(M instanceof Error?M:new Error(String(M)))}}},[]);const R=m.useRef(f),_=m.useRef(g);return R.current=f,_.current=g,m.useEffect(()=>{const M=[],$=new WeakSet;function U(O){if($.has(O))return;$.add(O);let D=O.getState().mutationCount;const V=O.subscribe(z=>{z.mutationCount!==D&&(D=z.mutationCount,R.current?.())});M.push(V)}function L(){for(const O of Object.values(Qm()))U(O)}L();const B=_w(()=>{L()});M.push(B);let G=ue.getState().mutationCount;const I=ue.subscribe(O=>{O.mutationCount!==G&&(G=O.mutationCount,R.current?.())});return M.push(I),()=>{for(const O of M)O()}},[]),m.useEffect(()=>{let M=null,$=null,U=null;const L=()=>{const D=et(ue.getState().activeCanvasId),V=D.canUndo(),z=D.canRedo();V===M&&z===$||(M=V,$=z,_.current?.({canUndo:V,canRedo:z}))},B=()=>{U?.(),U=et(ue.getState().activeCanvasId).subscribe(L),L()};B();let G=ue.getState().activeCanvasId;const I=ue.subscribe(D=>{D.activeCanvasId!==G&&(G=D.activeCanvasId,B())}),O=_w(B);return()=>{U?.(),I(),O()}},[]),m.useImperativeHandle(n,()=>({loadWorkflow:M=>{try{v(M)}catch($){h?.($ instanceof Error?$:new Error(String($)))}},exportWorkflow:()=>x(),clear:()=>S(),setMode:M=>ue.getState().setBuilderMode(M),getMode:()=>ue.getState().builderMode,validate:k,undo:()=>et(ue.getState().activeCanvasId).undo(),redo:()=>et(ue.getState().activeCanvasId).redo(),setDebugPhase:M=>is.getState().setPhase(M)}),[v,x,S,h,k]),p.jsx(T_,{i18n:mr,children:p.jsx(FC,{delayDuration:300,children:p.jsxs("div",{className:"fh-builder h-full w-full bg-background text-foreground font-sans antialiased",children:[p.jsx(QX,{functions:E.functions,onOpenFunction:E.openFunction,onCreateFunction:E.createFunction,canvasTabs:w.tabs,onCanvasTabChange:w.setActiveTabId,onCanvasTabClose:w.closeTab,onCanvasTabReorder:w.reorderTabs,onTestNode:c,onDebugStep:d}),p.jsx(wq,{}),b&&p.jsx(c4,{open:!0,onOpenChange:M=>{M||N(null)},validation:b,onSelectDiagnostic:P})]})})})});function Tq({theme:e,onToggle:t}){const{t:n}=Xe();return p.jsx("button",{onClick:t,className:"p-2 rounded hover:bg-muted/50 text-muted-foreground hover:text-foreground transition-colors",title:n("a11y.toggleTheme"),"aria-label":n("a11y.toggleTheme"),children:e==="dark"?p.jsx(Az,{className:"w-5 h-5"}):p.jsx(kz,{className:"w-5 h-5"})})}function Pq(e){const t=Rq(e),n=m.forwardRef((r,o)=>{const{children:i,...l}=r,c=m.Children.toArray(i),d=c.find(_q);if(d){const f=d.props.children,g=c.map(h=>h===d?m.Children.count(f)>1?m.Children.only(null):m.isValidElement(f)?f.props.children:null:h);return p.jsx(t,{...l,ref:o,children:m.isValidElement(f)?m.cloneElement(f,void 0,g):null})}return p.jsx(t,{...l,ref:o,children:i})});return n.displayName=`${e}.Slot`,n}function Rq(e){const t=m.forwardRef((n,r)=>{const{children:o,...i}=n;if(m.isValidElement(o)){const l=Mq(o),c=Aq(i,o.props);return o.type!==m.Fragment&&(c.ref=r?Xt(r,l):l),m.cloneElement(o,c)}return m.Children.count(o)>1?m.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var Iq=Symbol("radix.slottable");function _q(e){return m.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===Iq}function Aq(e,t){const n={...t};for(const r in t){const o=e[r],i=t[r];/^on[A-Z]/.test(r)?o&&i?n[r]=(...c)=>{const d=i(...c);return o(...c),d}:o&&(n[r]=o):r==="style"?n[r]={...o,...i}:r==="className"&&(n[r]=[o,i].filter(Boolean).join(" "))}return{...e,...n}}function Mq(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var am=["Enter"," "],Dq=["ArrowDown","PageUp","Home"],NP=["ArrowUp","PageDown","End"],jq=[...Dq,...NP],Oq={ltr:[...am,"ArrowRight"],rtl:[...am,"ArrowLeft"]},$q={ltr:["ArrowLeft"],rtl:["ArrowRight"]},Fl="Menu",[vl,Lq,Fq]=yf(Fl),[gs,kP]=Ft(Fl,[Fq,$i,bf]),Ef=$i(),TP=bf(),[zq,ms]=gs(Fl),[Vq,zl]=gs(Fl),PP=e=>{const{__scopeMenu:t,open:n=!1,children:r,dir:o,onOpenChange:i,modal:l=!0}=e,c=Ef(t),[d,f]=m.useState(null),g=m.useRef(!1),h=pt(i),v=Nl(o);return m.useEffect(()=>{const x=()=>{g.current=!0,document.addEventListener("pointerdown",S,{capture:!0,once:!0}),document.addEventListener("pointermove",S,{capture:!0,once:!0})},S=()=>g.current=!1;return document.addEventListener("keydown",x,{capture:!0}),()=>{document.removeEventListener("keydown",x,{capture:!0}),document.removeEventListener("pointerdown",S,{capture:!0}),document.removeEventListener("pointermove",S,{capture:!0})}},[]),p.jsx(Wm,{...c,children:p.jsx(zq,{scope:t,open:n,onOpenChange:h,content:d,onContentChange:f,children:p.jsx(Vq,{scope:t,onClose:m.useCallback(()=>h(!1),[h]),isUsingKeyboardRef:g,dir:v,modal:l,children:r})})})};PP.displayName=Fl;var Hq="MenuAnchor",Oy=m.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e,o=Ef(n);return p.jsx(Um,{...o,...r,ref:t})});Oy.displayName=Hq;var $y="MenuPortal",[Bq,RP]=gs($y,{forceMount:void 0}),IP=e=>{const{__scopeMenu:t,forceMount:n,children:r,container:o}=e,i=ms($y,t);return p.jsx(Bq,{scope:t,forceMount:n,children:p.jsx(Pt,{present:n||i.open,children:p.jsx(Mi,{asChild:!0,container:o,children:r})})})};IP.displayName=$y;var vn="MenuContent",[Wq,Ly]=gs(vn),_P=m.forwardRef((e,t)=>{const n=RP(vn,e.__scopeMenu),{forceMount:r=n.forceMount,...o}=e,i=ms(vn,e.__scopeMenu),l=zl(vn,e.__scopeMenu);return p.jsx(vl.Provider,{scope:e.__scopeMenu,children:p.jsx(Pt,{present:r||i.open,children:p.jsx(vl.Slot,{scope:e.__scopeMenu,children:l.modal?p.jsx(Uq,{...o,ref:t}):p.jsx(Kq,{...o,ref:t})})})})}),Uq=m.forwardRef((e,t)=>{const n=ms(vn,e.__scopeMenu),r=m.useRef(null),o=De(t,r);return m.useEffect(()=>{const i=r.current;if(i)return ym(i)},[]),p.jsx(Fy,{...e,ref:o,trapFocus:n.open,disableOutsidePointerEvents:n.open,disableOutsideScroll:!0,onFocusOutside:ve(e.onFocusOutside,i=>i.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>n.onOpenChange(!1)})}),Kq=m.forwardRef((e,t)=>{const n=ms(vn,e.__scopeMenu);return p.jsx(Fy,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>n.onOpenChange(!1)})}),Gq=Pq("MenuContent.ScrollLock"),Fy=m.forwardRef((e,t)=>{const{__scopeMenu:n,loop:r=!1,trapFocus:o,onOpenAutoFocus:i,onCloseAutoFocus:l,disableOutsidePointerEvents:c,onEntryFocus:d,onEscapeKeyDown:f,onPointerDownOutside:g,onFocusOutside:h,onInteractOutside:v,onDismiss:x,disableOutsideScroll:S,...w}=e,E=ms(vn,n),b=zl(vn,n),N=Ef(n),k=TP(n),P=Lq(n),[A,R]=m.useState(null),_=m.useRef(null),M=De(t,_,E.onContentChange),$=m.useRef(0),U=m.useRef(""),L=m.useRef(0),B=m.useRef(null),G=m.useRef("right"),I=m.useRef(0),O=S?Ad:m.Fragment,D=S?{as:Gq,allowPinchZoom:!0}:void 0,V=W=>{const Z=U.current+W,F=P().filter(K=>!K.disabled),H=document.activeElement,X=F.find(K=>K.ref.current===H)?.textValue,Q=F.map(K=>K.textValue),ee=sZ(Q,Z,X),ne=F.find(K=>K.textValue===ee)?.ref.current;(function K(q){U.current=q,window.clearTimeout($.current),q!==""&&($.current=window.setTimeout(()=>K(""),1e3))})(Z),ne&&setTimeout(()=>ne.focus())};m.useEffect(()=>()=>window.clearTimeout($.current),[]),mm();const z=m.useCallback(W=>G.current===B.current?.side&&aZ(W,B.current?.area),[]);return p.jsx(Wq,{scope:n,searchRef:U,onItemEnter:m.useCallback(W=>{z(W)&&W.preventDefault()},[z]),onItemLeave:m.useCallback(W=>{z(W)||(_.current?.focus(),R(null))},[z]),onTriggerLeave:m.useCallback(W=>{z(W)&&W.preventDefault()},[z]),pointerGraceTimerRef:L,onPointerGraceIntentChange:m.useCallback(W=>{B.current=W},[]),children:p.jsx(O,{...D,children:p.jsx(Id,{asChild:!0,trapped:o,onMountAutoFocus:ve(i,W=>{W.preventDefault(),_.current?.focus({preventScroll:!0})}),onUnmountAutoFocus:l,children:p.jsx(Ai,{asChild:!0,disableOutsidePointerEvents:c,onEscapeKeyDown:f,onPointerDownOutside:g,onFocusOutside:h,onInteractOutside:v,onDismiss:x,children:p.jsx(Qk,{asChild:!0,...k,dir:b.dir,orientation:"vertical",loop:r,currentTabStopId:A,onCurrentTabStopIdChange:R,onEntryFocus:ve(d,W=>{b.isUsingKeyboardRef.current||W.preventDefault()}),preventScrollOnEntryFocus:!0,children:p.jsx(Km,{role:"menu","aria-orientation":"vertical","data-state":GP(E.open),"data-radix-menu-content":"",dir:b.dir,...N,...w,ref:M,style:{outline:"none",...w.style},onKeyDown:ve(w.onKeyDown,W=>{const F=W.target.closest("[data-radix-menu-content]")===W.currentTarget,H=W.ctrlKey||W.altKey||W.metaKey,X=W.key.length===1;F&&(W.key==="Tab"&&W.preventDefault(),!H&&X&&V(W.key));const Q=_.current;if(W.target!==Q||!jq.includes(W.key))return;W.preventDefault();const ne=P().filter(K=>!K.disabled).map(K=>K.ref.current);NP.includes(W.key)&&ne.reverse(),rZ(ne)}),onBlur:ve(e.onBlur,W=>{W.currentTarget.contains(W.target)||(window.clearTimeout($.current),U.current="")}),onPointerMove:ve(e.onPointerMove,xl(W=>{const Z=W.target,F=I.current!==W.clientX;if(W.currentTarget.contains(Z)&&F){const H=W.clientX>I.current?"right":"left";G.current=H,I.current=W.clientX}}))})})})})})})});_P.displayName=vn;var Yq="MenuGroup",zy=m.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.jsx(ke.div,{role:"group",...r,ref:t})});zy.displayName=Yq;var Xq="MenuLabel",AP=m.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.jsx(ke.div,{...r,ref:t})});AP.displayName=Xq;var vd="MenuItem",n1="menu.itemSelect",Nf=m.forwardRef((e,t)=>{const{disabled:n=!1,onSelect:r,...o}=e,i=m.useRef(null),l=zl(vd,e.__scopeMenu),c=Ly(vd,e.__scopeMenu),d=De(t,i),f=m.useRef(!1),g=()=>{const h=i.current;if(!n&&h){const v=new CustomEvent(n1,{bubbles:!0,cancelable:!0});h.addEventListener(n1,x=>r?.(x),{once:!0}),gm(h,v),v.defaultPrevented?f.current=!1:l.onClose()}};return p.jsx(MP,{...o,ref:d,disabled:n,onClick:ve(e.onClick,g),onPointerDown:h=>{e.onPointerDown?.(h),f.current=!0},onPointerUp:ve(e.onPointerUp,h=>{f.current||h.currentTarget?.click()}),onKeyDown:ve(e.onKeyDown,h=>{const v=c.searchRef.current!=="";n||v&&h.key===" "||am.includes(h.key)&&(h.currentTarget.click(),h.preventDefault())})})});Nf.displayName=vd;var MP=m.forwardRef((e,t)=>{const{__scopeMenu:n,disabled:r=!1,textValue:o,...i}=e,l=Ly(vd,n),c=TP(n),d=m.useRef(null),f=De(t,d),[g,h]=m.useState(!1),[v,x]=m.useState("");return m.useEffect(()=>{const S=d.current;S&&x((S.textContent??"").trim())},[i.children]),p.jsx(vl.ItemSlot,{scope:n,disabled:r,textValue:o??v,children:p.jsx(Jk,{asChild:!0,...c,focusable:!r,children:p.jsx(ke.div,{role:"menuitem","data-highlighted":g?"":void 0,"aria-disabled":r||void 0,"data-disabled":r?"":void 0,...i,ref:f,onPointerMove:ve(e.onPointerMove,xl(S=>{r?l.onItemLeave(S):(l.onItemEnter(S),S.defaultPrevented||S.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:ve(e.onPointerLeave,xl(S=>l.onItemLeave(S))),onFocus:ve(e.onFocus,()=>h(!0)),onBlur:ve(e.onBlur,()=>h(!1))})})})}),qq="MenuCheckboxItem",DP=m.forwardRef((e,t)=>{const{checked:n=!1,onCheckedChange:r,...o}=e;return p.jsx(FP,{scope:e.__scopeMenu,checked:n,children:p.jsx(Nf,{role:"menuitemcheckbox","aria-checked":xd(n)?"mixed":n,...o,ref:t,"data-state":Hy(n),onSelect:ve(o.onSelect,()=>r?.(xd(n)?!0:!n),{checkForDefaultPrevented:!1})})})});DP.displayName=qq;var jP="MenuRadioGroup",[Zq,Qq]=gs(jP,{value:void 0,onValueChange:()=>{}}),OP=m.forwardRef((e,t)=>{const{value:n,onValueChange:r,...o}=e,i=pt(r);return p.jsx(Zq,{scope:e.__scopeMenu,value:n,onValueChange:i,children:p.jsx(zy,{...o,ref:t})})});OP.displayName=jP;var $P="MenuRadioItem",LP=m.forwardRef((e,t)=>{const{value:n,...r}=e,o=Qq($P,e.__scopeMenu),i=n===o.value;return p.jsx(FP,{scope:e.__scopeMenu,checked:i,children:p.jsx(Nf,{role:"menuitemradio","aria-checked":i,...r,ref:t,"data-state":Hy(i),onSelect:ve(r.onSelect,()=>o.onValueChange?.(n),{checkForDefaultPrevented:!1})})})});LP.displayName=$P;var Vy="MenuItemIndicator",[FP,Jq]=gs(Vy,{checked:!1}),zP=m.forwardRef((e,t)=>{const{__scopeMenu:n,forceMount:r,...o}=e,i=Jq(Vy,n);return p.jsx(Pt,{present:r||xd(i.checked)||i.checked===!0,children:p.jsx(ke.span,{...o,ref:t,"data-state":Hy(i.checked)})})});zP.displayName=Vy;var eZ="MenuSeparator",VP=m.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.jsx(ke.div,{role:"separator","aria-orientation":"horizontal",...r,ref:t})});VP.displayName=eZ;var tZ="MenuArrow",HP=m.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e,o=Ef(n);return p.jsx(Gm,{...o,...r,ref:t})});HP.displayName=tZ;var nZ="MenuSub",[aQ,BP]=gs(nZ),Ka="MenuSubTrigger",WP=m.forwardRef((e,t)=>{const n=ms(Ka,e.__scopeMenu),r=zl(Ka,e.__scopeMenu),o=BP(Ka,e.__scopeMenu),i=Ly(Ka,e.__scopeMenu),l=m.useRef(null),{pointerGraceTimerRef:c,onPointerGraceIntentChange:d}=i,f={__scopeMenu:e.__scopeMenu},g=m.useCallback(()=>{l.current&&window.clearTimeout(l.current),l.current=null},[]);return m.useEffect(()=>g,[g]),m.useEffect(()=>{const h=c.current;return()=>{window.clearTimeout(h),d(null)}},[c,d]),p.jsx(Oy,{asChild:!0,...f,children:p.jsx(MP,{id:o.triggerId,"aria-haspopup":"menu","aria-expanded":n.open,"aria-controls":o.contentId,"data-state":GP(n.open),...e,ref:Xt(t,o.onTriggerChange),onClick:h=>{e.onClick?.(h),!(e.disabled||h.defaultPrevented)&&(h.currentTarget.focus(),n.open||n.onOpenChange(!0))},onPointerMove:ve(e.onPointerMove,xl(h=>{i.onItemEnter(h),!h.defaultPrevented&&!e.disabled&&!n.open&&!l.current&&(i.onPointerGraceIntentChange(null),l.current=window.setTimeout(()=>{n.onOpenChange(!0),g()},100))})),onPointerLeave:ve(e.onPointerLeave,xl(h=>{g();const v=n.content?.getBoundingClientRect();if(v){const x=n.content?.dataset.side,S=x==="right",w=S?-5:5,E=v[S?"left":"right"],b=v[S?"right":"left"];i.onPointerGraceIntentChange({area:[{x:h.clientX+w,y:h.clientY},{x:E,y:v.top},{x:b,y:v.top},{x:b,y:v.bottom},{x:E,y:v.bottom}],side:x}),window.clearTimeout(c.current),c.current=window.setTimeout(()=>i.onPointerGraceIntentChange(null),300)}else{if(i.onTriggerLeave(h),h.defaultPrevented)return;i.onPointerGraceIntentChange(null)}})),onKeyDown:ve(e.onKeyDown,h=>{const v=i.searchRef.current!=="";e.disabled||v&&h.key===" "||Oq[r.dir].includes(h.key)&&(n.onOpenChange(!0),n.content?.focus(),h.preventDefault())})})})});WP.displayName=Ka;var UP="MenuSubContent",KP=m.forwardRef((e,t)=>{const n=RP(vn,e.__scopeMenu),{forceMount:r=n.forceMount,...o}=e,i=ms(vn,e.__scopeMenu),l=zl(vn,e.__scopeMenu),c=BP(UP,e.__scopeMenu),d=m.useRef(null),f=De(t,d);return p.jsx(vl.Provider,{scope:e.__scopeMenu,children:p.jsx(Pt,{present:r||i.open,children:p.jsx(vl.Slot,{scope:e.__scopeMenu,children:p.jsx(Fy,{id:c.contentId,"aria-labelledby":c.triggerId,...o,ref:f,align:"start",side:l.dir==="rtl"?"left":"right",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:g=>{l.isUsingKeyboardRef.current&&d.current?.focus(),g.preventDefault()},onCloseAutoFocus:g=>g.preventDefault(),onFocusOutside:ve(e.onFocusOutside,g=>{g.target!==c.trigger&&i.onOpenChange(!1)}),onEscapeKeyDown:ve(e.onEscapeKeyDown,g=>{l.onClose(),g.preventDefault()}),onKeyDown:ve(e.onKeyDown,g=>{const h=g.currentTarget.contains(g.target),v=$q[l.dir].includes(g.key);h&&v&&(i.onOpenChange(!1),c.trigger?.focus(),g.preventDefault())})})})})})});KP.displayName=UP;function GP(e){return e?"open":"closed"}function xd(e){return e==="indeterminate"}function Hy(e){return xd(e)?"indeterminate":e?"checked":"unchecked"}function rZ(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function oZ(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function sZ(e,t,n){const o=t.length>1&&Array.from(t).every(f=>f===t[0])?t[0]:t,i=n?e.indexOf(n):-1;let l=oZ(e,Math.max(i,0));o.length===1&&(l=l.filter(f=>f!==n));const d=l.find(f=>f.toLowerCase().startsWith(o.toLowerCase()));return d!==n?d:void 0}function iZ(e,t){const{x:n,y:r}=e;let o=!1;for(let i=0,l=t.length-1;i<t.length;l=i++){const c=t[i],d=t[l],f=c.x,g=c.y,h=d.x,v=d.y;g>r!=v>r&&n<(h-f)*(r-g)/(v-g)+f&&(o=!o)}return o}function aZ(e,t){if(!t)return!1;const n={x:e.clientX,y:e.clientY};return iZ(n,t)}function xl(e){return t=>t.pointerType==="mouse"?e(t):void 0}var lZ=PP,cZ=Oy,uZ=IP,dZ=_P,fZ=zy,pZ=AP,hZ=Nf,gZ=DP,mZ=OP,yZ=LP,vZ=zP,xZ=VP,wZ=HP,bZ=WP,SZ=KP,kf="DropdownMenu",[CZ]=Ft(kf,[kP]),zt=kP(),[EZ,YP]=CZ(kf),XP=e=>{const{__scopeDropdownMenu:t,children:n,dir:r,open:o,defaultOpen:i,onOpenChange:l,modal:c=!0}=e,d=zt(t),f=m.useRef(null),[g,h]=cn({prop:o,defaultProp:i??!1,onChange:l,caller:kf});return p.jsx(EZ,{scope:t,triggerId:kt(),triggerRef:f,contentId:kt(),open:g,onOpenChange:h,onOpenToggle:m.useCallback(()=>h(v=>!v),[h]),modal:c,children:p.jsx(lZ,{...d,open:g,onOpenChange:h,dir:r,modal:c,children:n})})};XP.displayName=kf;var qP="DropdownMenuTrigger",ZP=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,disabled:r=!1,...o}=e,i=YP(qP,n),l=zt(n);return p.jsx(cZ,{asChild:!0,...l,children:p.jsx(ke.button,{type:"button",id:i.triggerId,"aria-haspopup":"menu","aria-expanded":i.open,"aria-controls":i.open?i.contentId:void 0,"data-state":i.open?"open":"closed","data-disabled":r?"":void 0,disabled:r,...o,ref:Xt(t,i.triggerRef),onPointerDown:ve(e.onPointerDown,c=>{!r&&c.button===0&&c.ctrlKey===!1&&(i.onOpenToggle(),i.open||c.preventDefault())}),onKeyDown:ve(e.onKeyDown,c=>{r||(["Enter"," "].includes(c.key)&&i.onOpenToggle(),c.key==="ArrowDown"&&i.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(c.key)&&c.preventDefault())})})})});ZP.displayName=qP;var NZ="DropdownMenuPortal",QP=e=>{const{__scopeDropdownMenu:t,...n}=e,r=zt(t);return p.jsx(uZ,{...r,...n})};QP.displayName=NZ;var JP="DropdownMenuContent",eR=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=YP(JP,n),i=zt(n),l=m.useRef(!1);return p.jsx(dZ,{id:o.contentId,"aria-labelledby":o.triggerId,...i,...r,ref:t,onCloseAutoFocus:ve(e.onCloseAutoFocus,c=>{l.current||o.triggerRef.current?.focus(),l.current=!1,c.preventDefault()}),onInteractOutside:ve(e.onInteractOutside,c=>{const d=c.detail.originalEvent,f=d.button===0&&d.ctrlKey===!0,g=d.button===2||f;(!o.modal||g)&&(l.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});eR.displayName=JP;var kZ="DropdownMenuGroup",TZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(fZ,{...o,...r,ref:t})});TZ.displayName=kZ;var PZ="DropdownMenuLabel",RZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(pZ,{...o,...r,ref:t})});RZ.displayName=PZ;var IZ="DropdownMenuItem",tR=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(hZ,{...o,...r,ref:t})});tR.displayName=IZ;var _Z="DropdownMenuCheckboxItem",AZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(gZ,{...o,...r,ref:t})});AZ.displayName=_Z;var MZ="DropdownMenuRadioGroup",DZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(mZ,{...o,...r,ref:t})});DZ.displayName=MZ;var jZ="DropdownMenuRadioItem",OZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(yZ,{...o,...r,ref:t})});OZ.displayName=jZ;var $Z="DropdownMenuItemIndicator",LZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(vZ,{...o,...r,ref:t})});LZ.displayName=$Z;var FZ="DropdownMenuSeparator",zZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(xZ,{...o,...r,ref:t})});zZ.displayName=FZ;var VZ="DropdownMenuArrow",HZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(wZ,{...o,...r,ref:t})});HZ.displayName=VZ;var BZ="DropdownMenuSubTrigger",WZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(bZ,{...o,...r,ref:t})});WZ.displayName=BZ;var UZ="DropdownMenuSubContent",KZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(SZ,{...o,...r,ref:t,style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});KZ.displayName=UZ;var GZ=XP,YZ=ZP,XZ=QP,qZ=eR,ZZ=tR;const hg=[{code:"de",name:"Deutsch",flag:"🇩🇪"},{code:"en",name:"English",flag:"🇺🇸"}];function QZ({language:e,onChange:t}){const{t:n}=Xe(),r=hg.find(o=>o.code===e)??hg[1];return p.jsxs(GZ,{children:[p.jsx(YZ,{asChild:!0,children:p.jsxs("button",{className:"flex items-center gap-1.5 text-muted-foreground hover:text-foreground p-1.5 rounded hover:bg-muted/50 transition-colors",title:n("a11y.changeLanguage"),"aria-label":n("a11y.changeLanguage"),children:[p.jsx(bz,{className:"h-4 w-4"}),p.jsx("span",{className:"hidden sm:inline text-sm",children:r.flag})]})}),p.jsx(XZ,{children:p.jsx(qZ,{align:"end",sideOffset:4,className:"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2",children:hg.map(o=>p.jsxs(ZZ,{onSelect:()=>t(o.code),className:"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground",children:[p.jsx("span",{children:o.flag}),p.jsx("span",{children:o.name}),e===o.code&&p.jsx("span",{className:"ml-auto text-primary",children:"✓"})]},o.code))})})]})}function Qs({icon:e,onClick:t,variant:n="secondary",disabled:r=!1,title:o,children:i}){const l=n==="primary"?"bg-primary text-primary-foreground hover:opacity-90":"bg-secondary text-secondary-foreground hover:bg-muted";return p.jsxs("button",{onClick:t,disabled:r,title:o,className:`inline-flex items-center gap-1.5 px-3 py-1 text-sm rounded border border-border transition-colors disabled:opacity-40 disabled:pointer-events-none ${l}`,children:[p.jsx(e,{className:"w-4 h-4"}),i]})}const JZ=[{id:"claude-opus-4-6",label:"Claude Opus 4.6",capabilities:["chat"]},{id:"claude-sonnet-4-6",label:"Claude Sonnet 4.6",capabilities:["chat"]},{id:"claude-haiku-4-5",label:"Claude Haiku 4.5",capabilities:["chat"]}],Ti=new URLSearchParams(window.location.search).get("file"),eQ=e=>e.split(/[\\/]/).pop()??e,tQ=typeof window<"u"&&"showOpenFilePicker"in window,nQ=typeof window<"u"&&"showSaveFilePicker"in window,rQ=Ti?{kind:"path",path:Ti}:null,oQ=Ti?eQ(Ti):null,r1=[{description:"Workflow JSON",accept:{"application/json":[".json"]}}];function sQ(){const{t:e}=Xe(),t=m.useRef(null),n=m.useRef(null),r=m.useRef(!1),o=m.useRef(!1),[i,l]=m.useState(!1),[c,d]=m.useState(!1),[f,g]=m.useState(!1),[h,v]=m.useState(()=>localStorage.getItem("fh-theme")==="light"?"light":"dark"),[x,S]=m.useState(()=>localStorage.getItem(xg)==="de"?"de":"en"),[w,E]=m.useState(rQ),[b,N]=m.useState(oQ);m.useEffect(()=>{document.documentElement.classList.toggle("light",h==="light"),localStorage.setItem("fh-theme",h)},[h]),m.useEffect(()=>{Tt.changeLanguage(x),localStorage.setItem(xg,x)},[x]),m.useEffect(()=>{const B=b??"Untitled.json";document.title=`${i?"• ":""}${B} — ForestHub Builder`},[b,i]),m.useEffect(()=>{o.current||!Ti||(o.current=!0,fetch(`/api/file?path=${encodeURIComponent(Ti)}`).then(async B=>{if(B.status===404)return null;if(!B.ok)throw new Error(`${B.status} ${await B.text()}`);return B.json()}).then(B=>{B&&(r.current=!0,t.current?.loadWorkflow(B),queueMicrotask(()=>{r.current=!1,l(!1)}))}).catch(B=>Gt({title:e("toast.loadFailed"),description:B.message,variant:"destructive"})))},[e]);const k=m.useCallback((B,G,I)=>{let O;try{O=JSON.parse(B)}catch{Gt({title:e("toast.loadFailed"),description:e("error.invalidJson"),variant:"destructive"});return}r.current=!0,t.current?.loadWorkflow(O),queueMicrotask(()=>{r.current=!1,l(!1),N(G),E(I)})},[e]),P=m.useCallback(async()=>{if(!(i&&!window.confirm(e("confirm.discard")))){if(tQ){try{const[B]=await window.showOpenFilePicker({types:r1});if(!B)return;const G=await B.getFile();k(await G.text(),B.name,{kind:"handle",handle:B})}catch(B){if(B instanceof DOMException&&B.name==="AbortError")return;Gt({title:e("toast.loadFailed"),description:B instanceof Error?B.message:String(B),variant:"destructive"})}return}n.current?.click()}},[i,e,k]),A=m.useCallback(B=>{const G=B.target.files?.[0];G&&(G.text().then(I=>k(I,G.name,null)).catch(I=>Gt({title:e("toast.loadFailed"),description:I.message,variant:"destructive"})),B.target.value="")},[k,e]),R=m.useCallback(async()=>{const B=t.current?.exportWorkflow();if(!B)return;const G=JSON.stringify(B,null,2);if(w?.kind==="path"){try{const V=await fetch(`/api/file?path=${encodeURIComponent(w.path)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:G});if(!V.ok)throw new Error(`${V.status} ${await V.text()}`);l(!1)}catch(V){Gt({title:e("toast.saveFailed"),description:V instanceof Error?V.message:String(V),variant:"destructive"})}return}if(w?.kind==="handle"){try{const V=await w.handle.createWritable();await V.write(G),await V.close(),l(!1)}catch(V){Gt({title:e("toast.saveFailed"),description:V instanceof Error?V.message:String(V),variant:"destructive"})}return}if(nQ){try{const V=await window.showSaveFilePicker({suggestedName:b??"workflow.json",types:r1}),z=await V.createWritable();await z.write(G),await z.close(),E({kind:"handle",handle:V}),N(V.name),l(!1)}catch(V){if(V instanceof DOMException&&V.name==="AbortError")return;Gt({title:e("toast.saveFailed"),description:V instanceof Error?V.message:String(V),variant:"destructive"})}return}const I=new Blob([G],{type:"application/json"}),O=URL.createObjectURL(I),D=document.createElement("a");D.href=O,D.download=b??`workflow-${new Date().toISOString().replace(/[:.]/g,"-")}.json`,D.click(),URL.revokeObjectURL(O),l(!1)},[w,b,e]),_=m.useCallback(()=>{i&&!window.confirm(e("confirm.discard"))||(r.current=!0,t.current?.clear(),queueMicrotask(()=>{r.current=!1,l(!1),w?.kind!=="path"&&(E(null),N(null))}))},[i,w,e]),M=m.useCallback(()=>{t.current?.validate()},[]),$=m.useCallback(()=>{r.current||l(!0)},[]),U=m.useCallback(B=>{d(B.canUndo),g(B.canRedo)},[]),L=m.useCallback(B=>{Gt({title:e("toast.error"),description:B.message,variant:"destructive"})},[e]);return m.useEffect(()=>{const B=G=>{(G.metaKey||G.ctrlKey)&&!G.shiftKey&&G.key.toLowerCase()==="s"&&(G.preventDefault(),R())};return document.addEventListener("keydown",B),()=>document.removeEventListener("keydown",B)},[R]),p.jsxs("div",{className:"h-full flex flex-col",children:[p.jsxs("header",{className:"flex items-center gap-2 px-3 py-2 border-b border-border bg-card",children:[p.jsx(Qs,{icon:O1,onClick:_,children:e("toolbar.new")}),p.jsx(Qs,{icon:wz,onClick:P,children:e("toolbar.open")}),p.jsx(Qs,{icon:Iz,variant:"primary",onClick:R,children:e("toolbar.save")}),p.jsx(Qs,{icon:D1,onClick:M,children:e("toolbar.validate")}),p.jsx("div",{className:"mx-1 h-5 w-px bg-border","aria-hidden":!0}),p.jsx(Qs,{icon:Dz,onClick:()=>t.current?.undo(),disabled:!c,children:e("toolbar.undo")}),p.jsx(Qs,{icon:Pz,onClick:()=>t.current?.redo(),disabled:!f,children:e("toolbar.redo")}),p.jsxs("div",{className:"flex-1 min-w-0 flex items-center justify-center gap-1.5 text-sm font-mono text-muted-foreground",title:w?.kind==="path"?w.path:b??"no file",children:[p.jsx("span",{className:"truncate",children:b??"Untitled.json"}),p.jsx("span",{className:"shrink-0 w-2 text-center text-foreground","aria-hidden":!0,children:i?"•":""})]}),p.jsx(Tq,{theme:h,onToggle:()=>v(B=>B==="dark"?"light":"dark")}),p.jsx(QZ,{language:x,onChange:S}),p.jsx("input",{ref:n,type:"file",accept:"application/json,.json",className:"hidden","aria-label":e("toolbar.open"),onChange:A})]}),p.jsx("main",{className:"flex-1 min-h-0",children:p.jsx(kq,{ref:t,models:JZ,language:x,onChange:$,onHistoryChange:U,onError:L})})]})}const nR=document.getElementById("root");if(!nR)throw new Error("#root not found");BI.createRoot(nR).render(p.jsx(m.StrictMode,{children:p.jsx(sQ,{})}));
75
+ For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;return m.useEffect(()=>{document.getElementById(e.current?.getAttribute("aria-describedby"))||console.warn(t)},[t,e]),null},dX=hT,fX=gT,NT=mT,kT=yT,TT=ST,PT=ET,RT=xT,IT=bT;const pX=dX,hX=fX,_T=m.forwardRef(({className:e,...t},n)=>p.jsx(NT,{className:Ce("fixed inset-0 z-50 bg-[hsl(var(--overlay))] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t,ref:n}));_T.displayName=NT.displayName;const AT=m.forwardRef(({className:e,...t},n)=>p.jsxs(hX,{children:[p.jsx(_T,{}),p.jsx(kT,{ref:n,className:Ce("fh-builder-portal font-sans fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",e),...t})]}));AT.displayName=kT.displayName;const MT=({className:e,...t})=>p.jsx("div",{className:Ce("flex flex-col space-y-2 text-center sm:text-left",e),...t});MT.displayName="AlertDialogHeader";const DT=({className:e,...t})=>p.jsx("div",{className:Ce("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});DT.displayName="AlertDialogFooter";const jT=m.forwardRef(({className:e,...t},n)=>p.jsx(RT,{ref:n,className:Ce("font-heading text-lg font-semibold",e),...t}));jT.displayName=RT.displayName;const OT=m.forwardRef(({className:e,...t},n)=>p.jsx(IT,{ref:n,className:Ce("text-sm text-muted-foreground",e),...t}));OT.displayName=IT.displayName;const $T=m.forwardRef(({className:e,...t},n)=>p.jsx(TT,{ref:n,className:Ce(hm(),e),...t}));$T.displayName=TT.displayName;const LT=m.forwardRef(({className:e,...t},n)=>p.jsx(PT,{ref:n,className:Ce(hm({variant:"outline"}),"mt-2 sm:mt-0",e),...t}));LT.displayName=PT.displayName;const gX=["int","float","bool","string"];function mX({port:e,onUpdate:t,onRemove:n,errors:r,children:o}){const i=!!r?.length;return p.jsxs("div",{className:`rounded-lg bg-card shadow-sm border p-2 space-y-2 transition-all hover:shadow-md ${i?"border-destructive ring-1 ring-destructive":"border-border"}`,children:[p.jsxs("div",{className:"flex items-center gap-2",children:[p.jsx(Mt,{className:"h-7 text-xs flex-1",value:e.name,placeholder:"name",onChange:l=>t({name:l.target.value})}),p.jsxs(br,{value:e.dataType,onValueChange:l=>t({dataType:l}),children:[p.jsx(qn,{className:"h-7 text-xs w-20",children:p.jsx(Sr,{})}),p.jsx(Zn,{children:gX.map(l=>p.jsx(an,{value:l,className:"text-xs",children:l},l))})]}),p.jsx(gt,{variant:"ghost",size:"icon",className:"h-7 w-7 shrink-0 text-muted-foreground hover:text-destructive",onClick:n,children:p.jsx(El,{className:"w-3.5 h-3.5"})})]}),o,i&&p.jsx("div",{className:"space-y-0.5",children:r.map((l,c)=>p.jsx("p",{className:"text-xs text-destructive",children:l},c))})]})}function Gb({title:e,description:t,addLabel:n,emptyText:r,ports:o,onAdd:i,onUpdate:l,onRemove:c,errorsFor:d,renderExtra:f}){return p.jsxs("div",{className:"space-y-2",children:[p.jsxs("div",{children:[p.jsx(vi,{className:"text-sm font-medium",children:e}),p.jsx("p",{className:"text-xs text-muted-foreground",children:t})]}),o.length===0?p.jsx("p",{className:"text-xs text-muted-foreground italic",children:r}):p.jsx("div",{className:"space-y-2",children:o.map((g,h)=>p.jsx(mX,{port:g,onUpdate:v=>l(h,v),onRemove:()=>c(h),errors:d?.(g),children:f?.(g,h)},g.uid))}),p.jsx(ss,{onClick:i,children:n})]})}const yX=e=>({expression:"",references:[],dataType:e});function vX(e){const t=Zm(e.id);t&&GH(t,e.arguments)}function bo(e,t,n){let r;ue.getState().setFunctions(o=>{const i=o[e];if(!i)return o;const l=t(i);return r=n?{...l,version:i.version+1}:l,{...o,[e]:r}}),r&&n&&vX(r)}function xX(){const e=ln(),t=Object.values(ue.getState().functions).map(r=>r.name),n={id:e,version:1,name:yi("function",t),arguments:[],outputs:[]};return ue.getState().setFunctions(r=>({...r,[e]:n})),et(e),Zd(),n}function wX(e){ue.getState().setFunctions(n=>{const{[e]:r,...o}=n;return o}),XH(e);const t=ue.getState().selection;t.kind==="function"&&t.id===e&&ue.getState().clearSelection()}function bX(e,t){bo(e,n=>({...n,name:t}),!1)}function SX(e){bo(e,t=>({...t,arguments:[...t.arguments,g1({name:`input${t.arguments.length+1}`,dataType:"string"})]}),!0)}function CX(e,t,n){bo(e,r=>{const o=r.arguments[t];if(!o)return r;const i=[...r.arguments];return i[t]={...o,...n},{...r,arguments:i}},!0)}function EX(e,t){bo(e,n=>({...n,arguments:n.arguments.filter((r,o)=>o!==t)}),!0)}function NX(e){bo(e,t=>{const n="string";return{...t,outputs:[...t.outputs,{uid:ln(),name:`output${t.outputs.length+1}`,dataType:n,expression:yX(n)}]}},!0)}function kX(e,t,n){bo(e,r=>{const o=r.outputs[t];if(!o)return r;const i=n.dataType??o.dataType,l=[...r.outputs];return l[t]={...o,...n,dataType:i,expression:n.dataType?{...o.expression,dataType:i}:o.expression},{...r,outputs:l}},!0)}function TX(e,t){bo(e,n=>({...n,outputs:n.outputs.filter((r,o)=>o!==t)}),!0)}function PX(e,t,n){bo(e,r=>{const o=r.outputs[t];if(!o)return r;const i=[...r.outputs];return i[t]={...o,expression:n},{...r,outputs:i}},!1)}const RX=({func:e,onClose:t})=>{const{t:n}=Xe(),r=ue(S=>wn(S.builderMode)),{id:o,arguments:i,outputs:l}=e,[c,d]=m.useState(!1),[f,g]=m.useState(e.name);m.useEffect(()=>{g(e.name)},[o,e.name]);const{lookup:h}=Li(o),v=Ye(S=>S.byFunctionId[o]),x=m.useMemo(()=>{const S=new Map;for(const w of v??[]){if(!w.outputId)continue;const E=S.get(w.outputId);E?E.push(w.message):S.set(w.outputId,[w.message])}return S},[v]);return p.jsxs("div",{className:"p-4",children:[p.jsxs("div",{className:"space-y-4",children:[p.jsxs("div",{className:"flex items-center justify-between gap-2",children:[p.jsxs("div",{className:"flex-1 min-w-0",children:[p.jsx("div",{className:"group flex items-center gap-1.5 rounded-md border border-transparent px-1.5 -mx-1.5 hover:border-input focus-within:border-input transition-colors",children:p.jsx("input",{type:"text",title:n("functionName"),className:"font-semibold text-lg bg-transparent w-full outline-none cursor-text py-0.5 font-mono",value:f,readOnly:r,placeholder:n("functionNamePlaceholder"),onChange:S=>{g(S.target.value),bX(o,S.target.value)}})}),p.jsx("p",{className:"text-sm text-muted-foreground",children:n("functionDefinition")})]}),p.jsx(gt,{variant:"ghost",size:"icon",className:"shrink-0",onClick:t,children:p.jsx(Cl,{className:"h-4 w-4"})})]}),r&&p.jsx($l,{}),p.jsxs("div",{className:`space-y-4 ${r?"pointer-events-none opacity-60":""}`,children:[p.jsx($t,{}),p.jsx(Gb,{title:n("inputs"),description:n("functionInputsDesc"),addLabel:n("add"),emptyText:n("noInputs"),ports:i,onAdd:()=>SX(o),onUpdate:(S,w)=>CX(o,S,w),onRemove:S=>EX(o,S)}),p.jsx($t,{}),p.jsx(Gb,{title:n("outputs"),description:n("functionOutputsDesc"),addLabel:n("add"),emptyText:n("noOutputs"),ports:l,onAdd:()=>NX(o),onUpdate:(S,w)=>kX(o,S,w),onRemove:S=>TX(o,S),errorsFor:S=>x.get(S.uid)??[],renderExtra:(S,w)=>p.jsx(fT,{value:S.expression,onChange:E=>PX(o,w,E),expressionType:S.dataType,availableVariables:h,placeholder:`${n("expressionFor")} ${S.name}...`})})]}),!r&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx(zi,{onClick:()=>d(!0),children:n("deleteFunction")})]})]}),p.jsx(pX,{open:c,onOpenChange:d,children:p.jsxs(AT,{children:[p.jsxs(MT,{children:[p.jsx(jT,{children:n("deleteFunctionTitle")}),p.jsx(OT,{children:n("deleteFunctionDesc")})]}),p.jsxs(DT,{children:[p.jsx(LT,{children:n("cancel")}),p.jsx($T,{className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",onClick:()=>{wX(o),d(!1),t()},children:n("delete")})]})]})})]})},IX=({memory:e,onClose:t})=>{const{t:n}=Xe(),r=ue(f=>f.memory),o=Nd.getByType(e.type),i=Ye(f=>f.byMemoryId[e.id]),l=e.type==="MemoryFile"&&e.label.trim()!==""&&Object.values(r).some(f=>f.id!==e.id&&f.type==="MemoryFile"&&f.label===e.label),c=e.label.trim()==="",d=p.jsxs(p.Fragment,{children:[c&&p.jsx("p",{className:"text-xs text-destructive mt-1",children:n("memoryLabelRequired","Label is required")}),l&&p.jsx("p",{className:"text-xs text-destructive mt-1",children:n("memoryLabelDuplicate","Label must be unique per agent")})]});return p.jsx(Iy,{resetKey:e.id,label:e.label,labelTitle:n("memoryLabel","Memory label"),onLabelChange:f=>Mw(e.id,{label:f}),description:o?.description??"",belowLabel:d,parameters:o?.parameters??[],getValue:f=>e.arguments[f.id],allArguments:{...e.arguments},onParamChange:(f,g)=>Mw(e.id,{arguments:{[f]:g}}),diagnostics:i,translationPrefix:"memory",deleteLabel:n("deleteMemory","Delete memory"),onDelete:()=>xB(e.id),onClose:t})},_X=({model:e,onClose:t})=>{const{t:n}=Xe(),r=kd.getByType(e.type),o=Ye(l=>l.byModelId[e.id]),i=e.label.trim()==="";return p.jsx(Iy,{resetKey:e.id,label:e.label,labelTitle:n("modelLabel","Model label"),onLabelChange:l=>Dw(e.id,{label:l}),description:r?.description??n("modelCustomDescription","Custom model mapped to a provider at deploy"),belowLabel:i?p.jsx("p",{className:"text-xs text-destructive mt-1",children:n("modelLabelRequired","Label is required")}):void 0,parameters:r?.parameters??[],getValue:l=>e.arguments[l.id],allArguments:{...e.arguments},onParamChange:(l,c)=>Dw(e.id,{arguments:{[l]:c}}),diagnostics:o,translationPrefix:"models",deleteLabel:n("deleteModel","Delete model"),onDelete:()=>EB(e.id),onClose:t})};var Sf="Checkbox",[AX]=Ft(Sf),[MX,_y]=AX(Sf);function DX(e){const{__scopeCheckbox:t,checked:n,children:r,defaultChecked:o,disabled:i,form:l,name:c,onCheckedChange:d,required:f,value:g="on",internal_do_not_use_render:h}=e,[v,x]=cn({prop:n,defaultProp:o??!1,onChange:d,caller:Sf}),[S,w]=m.useState(null),[E,b]=m.useState(null),N=m.useRef(!1),k=S?!!l||!!S.closest("form"):!0,P={checked:v,disabled:i,setChecked:x,control:S,setControl:w,name:c,form:l,value:g,hasConsumerStoppedPropagationRef:N,required:f,defaultChecked:uo(o)?!1:o,isFormControl:k,bubbleInput:E,setBubbleInput:b};return p.jsx(MX,{scope:t,...P,children:jX(h)?h(P):r})}var FT="CheckboxTrigger",zT=m.forwardRef(({__scopeCheckbox:e,onKeyDown:t,onClick:n,...r},o)=>{const{control:i,value:l,disabled:c,checked:d,required:f,setControl:g,setChecked:h,hasConsumerStoppedPropagationRef:v,isFormControl:x,bubbleInput:S}=_y(FT,e),w=De(o,g),E=m.useRef(d);return m.useEffect(()=>{const b=i?.form;if(b){const N=()=>h(E.current);return b.addEventListener("reset",N),()=>b.removeEventListener("reset",N)}},[i,h]),p.jsx(ke.button,{type:"button",role:"checkbox","aria-checked":uo(d)?"mixed":d,"aria-required":f,"data-state":UT(d),"data-disabled":c?"":void 0,disabled:c,value:l,...r,ref:w,onKeyDown:ve(t,b=>{b.key==="Enter"&&b.preventDefault()}),onClick:ve(n,b=>{h(N=>uo(N)?!0:!N),S&&x&&(v.current=b.isPropagationStopped(),v.current||b.stopPropagation())})})});zT.displayName=FT;var Ay=m.forwardRef((e,t)=>{const{__scopeCheckbox:n,name:r,checked:o,defaultChecked:i,required:l,disabled:c,value:d,onCheckedChange:f,form:g,...h}=e;return p.jsx(DX,{__scopeCheckbox:n,checked:o,defaultChecked:i,disabled:c,required:l,onCheckedChange:f,name:r,form:g,value:d,internal_do_not_use_render:({isFormControl:v})=>p.jsxs(p.Fragment,{children:[p.jsx(zT,{...h,ref:t,__scopeCheckbox:n}),v&&p.jsx(WT,{__scopeCheckbox:n})]})})});Ay.displayName=Sf;var VT="CheckboxIndicator",HT=m.forwardRef((e,t)=>{const{__scopeCheckbox:n,forceMount:r,...o}=e,i=_y(VT,n);return p.jsx(Pt,{present:r||uo(i.checked)||i.checked===!0,children:p.jsx(ke.span,{"data-state":UT(i.checked),"data-disabled":i.disabled?"":void 0,...o,ref:t,style:{pointerEvents:"none",...e.style}})})});HT.displayName=VT;var BT="CheckboxBubbleInput",WT=m.forwardRef(({__scopeCheckbox:e,...t},n)=>{const{control:r,hasConsumerStoppedPropagationRef:o,checked:i,defaultChecked:l,required:c,disabled:d,name:f,value:g,form:h,bubbleInput:v,setBubbleInput:x}=_y(BT,e),S=De(n,x),w=sy(i),E=Vm(r);m.useEffect(()=>{const N=v;if(!N)return;const k=window.HTMLInputElement.prototype,A=Object.getOwnPropertyDescriptor(k,"checked").set,R=!o.current;if(w!==i&&A){const _=new Event("click",{bubbles:R});N.indeterminate=uo(i),A.call(N,uo(i)?!1:i),N.dispatchEvent(_)}},[v,w,i,o]);const b=m.useRef(uo(i)?!1:i);return p.jsx(ke.input,{type:"checkbox","aria-hidden":!0,defaultChecked:l??b.current,required:c,disabled:d,name:f,value:g,form:h,...t,tabIndex:-1,ref:S,style:{...t.style,...E,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})});WT.displayName=BT;function jX(e){return typeof e=="function"}function uo(e){return e==="indeterminate"}function UT(e){return uo(e)?"indeterminate":e?"checked":"unchecked"}const KT=m.forwardRef(({className:e,...t},n)=>p.jsx(Ay,{ref:n,className:Ce("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...t,children:p.jsx(HT,{className:Ce("flex items-center justify-center text-current"),children:p.jsx(M1,{className:"h-4 w-4"})})}));KT.displayName=Ay.displayName;function GT(e){const t=e.getState().variables;return new Set(Object.values(t).map(n=>n.name))}function YT(e,t){const n=e.arguments,r=i=>{const l=n[i];if(!l||!l.active||l.mode!=="emit"||!t.has(l.name))return;const c=yi(l.name,t);t.add(c),n[i]={active:!0,mode:"emit",name:c}};if(e.type==="FunctionCall"){for(const i of e.functionInfo.returns)r(Jo(i));return}const o=Lt.getByType(e.type);if(o?.outputs)for(const i of o.outputs)if(i.type==="static")r(i.id);else{const l=n[i.id]??[];for(const c of l){if(c.mode!=="emit"||!t.has(c.name))continue;const d=yi(c.name,t);t.add(d),c.name=d}}}function XT(e,t){if(t.isUnremovable)return!1;if(t.isSingleton){const{nodes:n}=e.getState();if(n.some(r=>r.data.type===t.type))return!1}return!0}function Yb(e,t,n){if(!XT(e,t))return null;const r=ln(),o={};t.parameters.forEach(x=>{x.default!==void 0&&(o[x.id]=structuredClone(x.default))});for(const x of t.outputs??[])x.type==="static"?o[x.id]={active:!0,mode:"emit",name:x.id}:o[x.id]=[];const i={id:r,type:t.type,arguments:o};if(t.type==="FunctionCall"){const x=t,S=i;S.functionInfo=x.functionInfo;for(const w of x.functionInfo.arguments)o[Jo(w)]={expression:"",references:[],dataType:w.dataType};for(const w of x.functionInfo.returns)o[Jo(w)]={active:!0,mode:"emit",name:w.name}}const l=GT(e);YT(i,l);const c=e.getState().nodes;let d=n||{x:250,y:100};const f=50;for(;c.some(x=>Math.abs(x.position.x-d.x)<f&&Math.abs(x.position.y-d.y)<f);)d={x:d.x+40,y:d.y+40};const g={id:i.id,type:QT(t.type),position:d,data:i},{setNodes:h,setVariables:v}=e.getState();return h(x=>[...x,g]),v(x=>({...x,...qd([g.data])})),r}function qT(e,t,n){const{setNodes:r,setVariables:o}=e.getState();let i={},l={},c=!1,d=!1;return r(f=>{const g=f.findIndex(b=>b.id===t);if(g===-1)return f;const h=f[g];if(!h)return f;d=!0;const v=h.data;i=Uu(v);let x;if(n.arguments){const b=n.functionInfo?n.arguments:{...v.arguments,...n.arguments};x={...v,...n,arguments:b}}else x={...v,...n};l=Uu(x);const S=f.map((b,N)=>N===g?{...b,data:x}:b),w=Object.keys(i),E=Object.keys(l);return c=w.length!==E.length||E.some(b=>{const N=i[b],k=l[b];return!N||!k||N.name!==k.name||N.dataType!==k.dataType}),S}),c&&o(f=>{const g={...f};for(const h of Object.keys(i))h in l||delete g[el(t,h)];for(const[h,v]of Object.entries(l)){const x=el(t,h),S=f[x];(!S||S.name!==v.name||S.dataType!==v.dataType)&&(g[x]={kind:"node",nodeId:t,outputId:h,name:v.name,dataType:v.dataType})}return g}),d}function Xb(e,t,n){const{nodes:r,edges:o,setNodes:i,setEdges:l,setVariables:c}=e.getState(),d=r.find(g=>g.id===t);if(!d||n&&(n(d.data)?.isUnremovable??!1))return!1;i(g=>g.filter(h=>h.id!==t)),l(g=>g.filter(h=>h.source!==t&&h.target!==t));const f=Object.keys(Uu(d.data));return f.length>0&&c(g=>{const h={...g};for(const v of f)delete h[el(t,v)];return h}),!0}function OX(e,t,n){const r=t.data.type==="Agent",o=n.data.type==="Agent";return e==="control"?r&&o?"agentDelegate":o?"agentTask":r?"agentChoice":"control":e}function qb(e,t){const{nodes:n,edges:r,setEdges:o}=e.getState(),i=nE(t.source,t.target,t.sourceHandle,t.targetHandle,n,r);if(!i)return!1;const l=n.find(f=>f.id===t.source),c=n.find(f=>f.id===t.target);if(!l||!c)return!1;const d=OX(i,l,c);return o(f=>YE({...t,type:d},f)),d}function $X(e,t,n){const{edges:r,setEdges:o}=e.getState();return r.find(l=>l.id===t)?(o(l=>l.map(c=>c.id===t?{...c,data:{...c.data,...n}}:c)),!0):!1}function Zb(e,t){const{setEdges:n}=e.getState(),r=new Set(t);n(o=>o.filter(i=>!r.has(i.id)))}function LX(e,t,n={x:50,y:50},r){const o={pasted:!1,skippedLabels:[]};if(t.nodes.length===0)return o;const{setNodes:i,setEdges:l,setVariables:c}=e.getState(),d=[],f=t.nodes.filter(S=>{if(!r)return!0;const w=r(S.data);return w?XT(e,w)?!0:(d.push(w.label),!1):!0});if(f.length===0)return{pasted:!1,skippedLabels:d};const g=new Map;f.forEach(S=>{const w=ln();g.set(S.id,w)});const h=f.map(S=>{const w=g.get(S.id),E=JSON.parse(JSON.stringify(S.data));return E.id=w,E.arguments=ZT(Sd(E),g),{...S,id:w,position:{x:S.position.x+n.x,y:S.position.y+n.y},data:E,selected:!0}}),v=GT(e);for(const S of h)YT(S.data,v);const x=t.edges.filter(S=>g.has(S.source)&&g.has(S.target)).map(S=>{const w={...S,id:ln(),source:g.get(S.source),target:g.get(S.target),data:S.data?{...S.data}:S.data};if(w.data?.prompt&&es(w.data.prompt)){const E=w.data.prompt;w.data={...w.data,prompt:{...E,references:E.references.map(b=>({srcId:g.get(b.srcId)??b.srcId,varId:b.varId}))}}}return w});return i(S=>[...S.map(w=>({...w,selected:!1})),...h]),l(S=>[...S,...x]),c(S=>({...S,...qd(h.map(w=>w.data))})),{pasted:!0,skippedLabels:d}}function ZT(e,t){const n={};for(const[r,o]of Object.entries(e))if(es(o)){const i={expression:o.expression,dataType:o.dataType,references:o.references.map(l=>({srcId:t.get(l.srcId)??l.srcId,varId:l.varId}))};n[r]=i}else Array.isArray(o)?n[r]=o.map(i=>es(i)?{expression:i.expression,dataType:i.dataType,references:i.references.map(l=>({srcId:t.get(l.srcId)??l.srcId,varId:l.varId}))}:i):o!==null&&typeof o=="object"?n[r]=ZT(o,t):n[r]=o;return n}function QT(e){if(e==="FunctionCall")return"FunctionCall";const t=Lt.getByType(e)?.category??"Uncategorized";switch(t){case xe.Trigger:case xe.Tool:case xe.AI:return t;default:return"Standard"}}function FX(e,t){const n=e.arguments,r={};for(const o of t.arguments){const i=Jo(o),l=n[i];r[i]=l?{...l,dataType:o.dataType}:{expression:"",references:[],dataType:o.dataType}}for(const o of t.returns){const i=Jo(o),l=n[i];r[i]=l??{active:!0,mode:"emit",name:o.name}}return{functionInfo:{...t},arguments:r}}function JT(){const e=Qm(),t={};for(const[r,o]of Object.entries(ue.getState().functions))t[r]=Td(o);let n=0;for(const[,r]of Object.entries(e)){const o=r.getState().nodes;for(const i of o){if(i.data.type!=="FunctionCall")continue;const l=i.data,c=t[l.functionInfo.id];c&&(l.functionInfo.version===c.version&&l.functionInfo.name===c.name||(qT(r,i.id,FX(l,c)),n++))}}n>0&&Gt({title:mr.t("functionCallNodesMigrated"),description:mr.t("functionCallNodesMigratedDesc",{count:n})})}let Qb=ue.getState().functions;ue.subscribe(e=>{e.functions!==Qb&&(Qb=e.functions,JT())});const zX=({canvasId:e,selectedNode:t,onNodeUpdate:n,onNodeDelete:r,onClose:o,onOpenTest:i,getNodeDef:l})=>{const{t:c}=Xe(),d=ue(U=>wn(U.builderMode)),[f,g]=m.useState(t.label||""),[h,v]=m.useState(!1);m.useEffect(()=>{g(t.label||"")},[t.id,t.label]);const x=t.type==="FunctionCall"?t.functionInfo.id:null,{getFunction:S}=Qd(),w=x?S(x):void 0,E=t.type!=="FunctionCall"||!w?!1:t.functionInfo.version!==w.version,b=t.type==="FunctionCall"?Jm({...t.functionInfo,name:w?.name??t.functionInfo.name}):l(t),N=b?.isUnremovable??!1,k=et(e)(U=>U.edges),P=m.useMemo(()=>tl(t.id,t,k),[t,k]),A=Ye(U=>U.byNodeId[t.id]),R=Ry(A);if(!b)return p.jsx("div",{className:"p-4",children:p.jsx("p",{className:"text-sm text-muted-foreground",children:c("unknownNodeType",{type:t.type})})});const _=Sd(t),M=b.parameters.filter(U=>Tr(U,_,P)),$=(b.outputs??[]).length>0;return p.jsx("div",{className:"p-4",children:p.jsxs("div",{className:"space-y-4",children:[p.jsxs("div",{className:"flex items-center justify-between gap-2",children:[p.jsxs("div",{className:"flex-1 min-w-0",children:[p.jsx("div",{className:"group flex items-center gap-1.5 rounded-md border border-transparent px-1.5 -mx-1.5 hover:border-input focus-within:border-input transition-colors",children:p.jsx("input",{type:"text",title:c("nodeLabel"),className:"font-semibold text-lg bg-transparent w-full outline-none cursor-text py-0.5",value:h?f:f||b.label,readOnly:d,onFocus:()=>{d||(v(!0),f||g(b.label))},onBlur:()=>{v(!1),(!f||f===b.label)&&(g(""),n(t.id,{label:void 0}))},onChange:U=>{g(U.target.value),n(t.id,{label:U.target.value})}})}),p.jsx("p",{className:"text-sm text-muted-foreground",children:WC(c,b)})]}),p.jsx(gt,{variant:"ghost",size:"icon",className:"shrink-0",onClick:o,children:p.jsx(Cl,{className:"h-4 w-4"})})]}),d&&p.jsx($l,{}),M.length>0&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx("div",{className:`space-y-3 ${d?"pointer-events-none opacity-60":""}`,children:M.map(U=>p.jsx(Py,{canvasId:e,parameter:U,value:_[U.id],allArguments:_,onChange:L=>n(t.id,{arguments:{[U.id]:L}}),errors:R.get(U.id),translationPrefix:`nodes.${t.type}`},U.id))})]}),!d&&E&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsxs(gt,{variant:"outline",className:"w-full border-warning text-warning hover:bg-warning/10",onClick:()=>JT(),children:[p.jsx(Rz,{className:"w-4 h-4 mr-2"}),c("updateToLatestDefinition")]})]}),!d&&$&&!P&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx(WX,{canvasId:e,node:t,nodeDefinition:b,onNodeUpdate:n,nodeDiags:A})]}),!d&&t.type==="Agent"&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx(gt,{variant:"outline",className:"w-full",onClick:()=>i(t.id),children:c("testAgent")})]}),!d&&!N&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx(zi,{onClick:()=>r(t.id),children:c("deleteNode")})]})]})})},VX=["int","float","bool","string"],HX={int:"int",float:"float",bool:"bool",string:"string"};function BX(e,t){return`${e}[${t}]`}function Jb(e){return e.kind==="node"?{srcId:e.nodeId,varId:e.outputId}:e.kind==="declared"?{srcId:"declared",varId:e.uid}:{srcId:"fnarg",varId:e.uid}}function WX({canvasId:e,node:t,nodeDefinition:n,onNodeUpdate:r,nodeDiags:o}){const{t:i}=Xe(),{list:l}=Li(e),c=m.useMemo(()=>C1(t),[t]),d=m.useMemo(()=>(n.outputs??[]).filter(b=>b.type==="static"),[n]),f=m.useMemo(()=>(n.outputs??[]).filter(b=>b.type==="list"),[n]),g=m.useMemo(()=>{const b=new Map;if(!o)return b;for(const N of o)if(N.outputId&&N.severity==="error"){const k=b.get(N.outputId);k?k.push(N.message):b.set(N.outputId,[N.message])}return b},[o]),h=m.useCallback((b,N)=>{r(t.id,{arguments:{[b]:N}})},[t.id,r]),v=m.useCallback((b,N)=>r(t.id,{arguments:{[b]:N}}),[t.id,r]),x=m.useCallback(b=>l.filter(N=>N.dataType===b&&!("nodeId"in N&&N.nodeId===t.id)),[l,t.id]);if(d.length===0&&f.length===0)return null;const S=(b,N,k)=>{const P=S1(t,b)??{active:!0,mode:"emit",name:N.name},A=x(N.dataType),R=g.get(b),_=!!R?.length,M=P.active,$=L=>{L!==M&&h(b,{...P,active:L})},U=L=>{L!==P.mode&&(L==="emit"?h(b,{active:P.active,mode:"emit",name:N.name}):h(b,{active:P.active,mode:"assign",target:{srcId:"",varId:""}}))};return p.jsxs("div",{className:`rounded-lg bg-card shadow-sm border p-2 space-y-2 transition-all hover:shadow-md ${_?"border-destructive ring-1 ring-destructive":"border-border"}`,children:[p.jsxs("div",{className:"flex items-center gap-2",children:[p.jsx(KT,{checked:M,onCheckedChange:L=>$(L===!0),"aria-label":i("outputBinding.enable","Enable output"),className:"shrink-0"}),p.jsx("span",{className:`text-xs font-medium flex-1 truncate ${M?"":"opacity-50"}`,children:k}),p.jsx("span",{className:`text-xs text-muted-foreground ${M?"":"opacity-50"}`,children:HX[N.dataType]})]}),p.jsxs("div",{className:M?"":"opacity-50",children:[p.jsxs("div",{className:`flex items-center gap-2 ${M?"":"pointer-events-none"}`,children:[p.jsxs(yd,{type:"single",value:P.mode,onValueChange:L=>L&&U(L),className:"gap-0",children:[p.jsx(Yo,{value:"emit",size:"sm",variant:"outline",className:"h-7 w-7 p-0 rounded-r-none","aria-label":i("outputBinding.emit","Emit"),title:i("outputBinding.emit","Emit"),children:p.jsx(ts,{className:"w-3.5 h-3.5"})}),p.jsx(Yo,{value:"assign",size:"sm",variant:"outline",className:"h-7 w-7 p-0 rounded-l-none -ml-px","aria-label":i("outputBinding.assign","Assign"),title:i("outputBinding.assign","Assign"),children:p.jsx(V0,{className:"w-3.5 h-3.5"})})]}),P.mode==="emit"?p.jsx(Mt,{className:"h-7 text-xs flex-1",value:P.name,disabled:!M,onChange:L=>h(b,{active:P.active,mode:"emit",name:L.target.value})}):A.length>0?p.jsxs(br,{value:P.target.srcId?vr(P.target):"",onValueChange:L=>{const B=l.find(G=>so(G)===L);B&&h(b,{active:P.active,mode:"assign",target:Jb(B)})},disabled:!M,children:[p.jsx(qn,{className:"h-7 text-xs flex-1",children:p.jsx(Sr,{placeholder:i("outputBinding.selectVariable","Select variable...")})}),p.jsx(Zn,{children:A.map(L=>p.jsx(an,{value:so(L),children:L.name},so(L)))})]}):p.jsx("span",{className:"text-xs text-muted-foreground italic flex-1",children:i("outputBinding.noCompatibleVariables","No compatible variables")})]}),_&&p.jsx("div",{className:"space-y-0.5",children:R.map((L,B)=>p.jsx("p",{className:"text-xs text-destructive",children:L},B))})]})]},b)},w=(b,N,k)=>{const P=N[k];if(!P)return null;const A=x(P.dataType),R=BX(b,k),_=g.get(R),M=!!_?.length,$=I=>v(b,N.map((O,D)=>D===k?I:O)),U=()=>v(b,N.filter((I,O)=>O!==k)),L=I=>{P.mode!==I&&$(I==="emit"?{mode:"emit",uid:ln(),name:P.name,dataType:P.dataType}:{mode:"assign",name:P.name,dataType:P.dataType,target:{srcId:"",varId:""}})},B=I=>$({...P,name:I}),G=I=>$({...P,dataType:I});return p.jsxs("div",{className:`rounded-lg bg-card shadow-sm border p-2 space-y-2 transition-all hover:shadow-md ${M?"border-destructive ring-1 ring-destructive":"border-border"}`,children:[p.jsxs("div",{className:"flex items-center gap-2",children:[p.jsx(gt,{variant:"ghost",size:"icon",className:"h-7 w-7 shrink-0",onClick:U,children:p.jsx(El,{className:"w-3.5 h-3.5"})}),p.jsx(Mt,{className:"h-7 text-xs flex-1",value:P.name,placeholder:i("outputBinding.name","Name"),onChange:I=>B(I.target.value)}),p.jsxs(br,{value:P.dataType,onValueChange:I=>G(I),children:[p.jsx(qn,{className:"h-7 text-xs w-20",children:p.jsx(Sr,{})}),p.jsx(Zn,{children:VX.map(I=>p.jsx(an,{value:I,children:I},I))})]})]}),p.jsxs("div",{className:"flex items-center gap-2",children:[p.jsxs(yd,{type:"single",value:P.mode,onValueChange:I=>I&&L(I),className:"gap-0",children:[p.jsx(Yo,{value:"emit",size:"sm",variant:"outline",className:"h-7 w-7 p-0 rounded-r-none","aria-label":i("outputBinding.emit","Emit"),title:i("outputBinding.emit","Emit"),children:p.jsx(ts,{className:"w-3.5 h-3.5"})}),p.jsx(Yo,{value:"assign",size:"sm",variant:"outline",className:"h-7 w-7 p-0 rounded-l-none -ml-px","aria-label":i("outputBinding.assign","Assign"),title:i("outputBinding.assign","Assign"),children:p.jsx(V0,{className:"w-3.5 h-3.5"})})]}),P.mode==="emit"?p.jsx("span",{className:"text-xs text-muted-foreground italic flex-1",children:i("outputBinding.emitHint","creates new variable in scope")}):A.length>0?p.jsxs(br,{value:P.target.srcId?vr(P.target):"",onValueChange:I=>{const O=l.find(D=>so(D)===I);O&&$({...P,target:Jb(O)})},children:[p.jsx(qn,{className:"h-7 text-xs flex-1",children:p.jsx(Sr,{placeholder:i("outputBinding.selectVariable","Select variable...")})}),p.jsx(Zn,{children:A.map(I=>p.jsx(an,{value:so(I),children:I.name},so(I)))})]}):p.jsx("span",{className:"text-xs text-muted-foreground italic flex-1",children:i("outputBinding.noCompatibleVariables","No compatible variables")})]}),M&&p.jsx("div",{className:"space-y-0.5",children:_.map((I,O)=>p.jsx("p",{className:"text-xs text-destructive",children:I},O))})]},`${b}-${P.mode==="emit"?P.uid:`assign-${k}`}`)},E=(b,N)=>{const k={mode:"emit",uid:ln(),name:`output${N.length+1}`,dataType:"string"};v(b,[...N,k])};return p.jsxs("div",{className:"space-y-2",children:[p.jsx("p",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wide",children:i("outputs","Outputs")}),p.jsxs("div",{className:"space-y-2",children:[d.map(b=>{const N=c[b.id];return N?S(b.id,N,b.label):null}),f.map(b=>{const N=t.arguments[b.id]??[];return p.jsxs(m.Fragment,{children:[p.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[p.jsx("span",{className:"text-[11px] font-medium text-muted-foreground",children:b.label}),p.jsx("div",{className:"flex-1 h-px bg-border/60"})]}),N.map((k,P)=>w(b.id,N,P)),p.jsx(ss,{onClick:()=>E(b.id,N),children:i("addOutput",{label:b.label,defaultValue:`Add ${b.label.toLowerCase()}`})})]},b.id)})]})]})}const UX=["int","float","bool","string"],KX=({canvasId:e,variable:t,onClose:n})=>{const{t:r}=Xe(),o=ue(f=>wn(f.builderMode)),[i,l]=m.useState(t.name);m.useEffect(()=>{l(t.name)},[t.uid,t.name]);const c=t.name.trim()==="",d=()=>{switch(t.dataType){case"bool":return p.jsxs(br,{value:t.initialValue!=null?String(t.initialValue):"false",onValueChange:f=>Ha(e,t.uid,{initialValue:f==="true"}),children:[p.jsx(qn,{className:"h-8 text-sm",children:p.jsx(Sr,{})}),p.jsxs(Zn,{children:[p.jsx(an,{value:"false",children:"false"}),p.jsx(an,{value:"true",children:"true"})]})]});case"string":return p.jsx(Mt,{className:"h-8 text-sm",value:t.initialValue??"",onChange:f=>Ha(e,t.uid,{initialValue:f.target.value}),placeholder:'""'});case"int":case"float":return p.jsx(Mt,{type:"number",step:t.dataType==="float"?"any":1,className:"h-8 text-sm",value:t.initialValue!=null?Number(t.initialValue):"",onChange:f=>{const g=t.dataType==="float"?parseFloat(f.target.value):parseInt(f.target.value,10);Ha(e,t.uid,{initialValue:isNaN(g)?void 0:g})},placeholder:"0"});default:return null}};return p.jsx("div",{className:"p-4",children:p.jsxs("div",{className:"space-y-4",children:[p.jsxs("div",{className:"flex items-center justify-between gap-2",children:[p.jsxs("div",{className:"flex-1 min-w-0",children:[p.jsx("div",{className:"group flex items-center gap-1.5 rounded-md border border-transparent px-1.5 -mx-1.5 hover:border-input focus-within:border-input transition-colors",children:p.jsx("input",{type:"text",title:r("variableName","Variable name"),className:"font-semibold text-lg font-mono bg-transparent w-full outline-none cursor-text py-0.5",value:i,readOnly:o,onChange:f=>{l(f.target.value),Ha(e,t.uid,{name:f.target.value})}})}),p.jsx("p",{className:"text-sm text-muted-foreground",children:r("variableDescription","A declared variable you can read and write across this canvas")}),c&&p.jsx("p",{className:"text-xs text-destructive mt-1",children:r("variableNameRequired","Name is required")})]}),p.jsx(gt,{variant:"ghost",size:"icon",className:"shrink-0",onClick:n,children:p.jsx(Cl,{className:"h-4 w-4"})})]}),o&&p.jsx($l,{}),p.jsx($t,{}),p.jsxs("div",{className:`space-y-4 ${o?"pointer-events-none opacity-60":""}`,children:[p.jsxs("div",{className:"space-y-1.5",children:[p.jsx("label",{className:"text-xs font-medium text-foreground/80",children:r("dataType","Data type")}),p.jsxs(br,{value:t.dataType,onValueChange:f=>PB(e,t.uid,f),children:[p.jsx(qn,{className:"h-8 text-sm",children:p.jsx(Sr,{})}),p.jsx(Zn,{children:UX.map(f=>p.jsx(an,{value:f,children:f},f))})]})]}),p.jsxs("div",{className:"space-y-1.5",children:[p.jsxs("label",{className:"text-xs font-medium text-foreground/80",children:[r("initialValue")," ",p.jsxs("span",{className:"font-normal text-muted-foreground",children:["(",r("optional","optional"),")"]})]}),d()]})]}),!o&&p.jsxs(p.Fragment,{children:[p.jsx($t,{}),p.jsx(zi,{onClick:()=>RB(e,t.uid),children:r("deleteVariable","Delete variable")})]})]})})},GX=({canvasId:e,isDebugMode:t,selectionDrag:n,getNodeDef:r,onNodeUpdate:o,onNodeDelete:i,onEdgeUpdate:l,onEdgeDelete:c,onClearSelection:d,onTestNode:f,onDebugStep:g})=>{const h=ue(G=>G.selection),v=ue(G=>G.clearSelection),x=ue(G=>G.channels),S=ue(G=>G.memory),w=ue(G=>G.models),E=ue(G=>G.functions),b=et(e),N=b(m.useCallback(G=>h.kind!=="graph"||h.nodeIds.length!==1?null:G.nodes.find(O=>O.id===h.nodeIds[0])?.data??null,[h])),k=b(m.useCallback(G=>{if(h.kind!=="variable")return null;const I=G.variables[Pi(h.uid)];return I&&I.kind==="declared"?I:null},[h])),P=b(m.useCallback(G=>h.kind!=="graph"||h.edgeIds.length!==1||h.nodeIds.length>0?null:G.edges.find(I=>I.id===h.edgeIds[0])??null,[h])),A=P?{id:P.id,source:P.source,type:P.type??"control",data:P.data??{}}:null,R=b(m.useCallback(G=>A?G.edges.filter(I=>I.source===A.source&&cm(I.type)).length:0,[A?.source])),_=m.useMemo(()=>h.kind==="channel"?Object.values(x).find(G=>G.id===h.id)??null:null,[h,x]),M=m.useMemo(()=>h.kind==="memory"?Object.values(S).find(G=>G.id===h.id)??null:null,[h,S]),$=m.useMemo(()=>h.kind==="model"?Object.values(w).find(G=>G.id===h.id)??null:null,[h,w]),U=m.useMemo(()=>h.kind==="function"?E[h.id]??null:null,[h,E]),L=m.useCallback(G=>r(G)?.category,[r]),B=m.useCallback(G=>f?.(G),[f]);return n?null:t?N?p.jsx(ro,{bg:"bg-background",pad:!0,children:p.jsx(XY,{canvasId:e,onStep:g??(()=>{}),getNodeCategory:L})}):null:N?p.jsx(ro,{children:p.jsx(zX,{canvasId:e,selectedNode:N,onNodeUpdate:o,onNodeDelete:i,onClose:d,onOpenTest:B,getNodeDef:r})}):A?p.jsx(ro,{children:p.jsx(QY,{canvasId:e,edgeId:A.id,edgeType:A.type,edgeData:A.data,sourceControlEdgeCount:R,onEdgeUpdate:l,onEdgeDelete:c,onClose:d})}):k?p.jsx(ro,{children:p.jsx(KX,{canvasId:e,variable:k,onClose:v})}):_?p.jsx(ro,{children:p.jsx(YY,{channel:_,onClose:v})}):M?p.jsx(ro,{children:p.jsx(IX,{memory:M,onClose:v})}):$?p.jsx(ro,{children:p.jsx(_X,{model:$,onClose:v})}):U?p.jsx(ro,{children:p.jsx(RX,{func:U,onClose:v})}):null},ro=({bg:e="bg-card",pad:t=!1,children:n})=>p.jsx(Di,{className:Ce("w-80 border-l border-border",e),viewportClassName:t?"p-3":void 0,children:n}),YX=(e=Be)=>{const t=et(e);return{undo:t.undo,redo:t.redo,takeCheckpoint:t.takeCheckpoint,withCheckpoint:t.withCheckpoint,clearHistory:t.clearHistory,canUndo:t.canUndo,canRedo:t.canRedo}},e1={current:null},XX=(e=Be,t=!1)=>{const n=et(e),r=n(N=>N.nodes),o=n(N=>N.edges),{withCheckpoint:i}=n,{getNodeDefinition:l}=ey(),c=m.useCallback(N=>{if(!t)return i(N)},[t,i]),d=m.useCallback((N,k)=>c(()=>Yb(n,N,k))??null,[n,c]),f=m.useCallback((N,k)=>{c(()=>qT(n,N,k))},[n,c]),g=m.useCallback(N=>{c(()=>Xb(n,N,l))},[n,l,c]),h=m.useCallback(N=>c(()=>qb(n,N))??!1,[n,c]),v=m.useCallback((N,k)=>{c(()=>$X(n,N,k))},[n,c]),x=m.useCallback(N=>{c(()=>Zb(n,N))},[n,c]),S=m.useCallback((N,k)=>{N.length===0&&k.length===0||c(()=>{for(const P of N)Xb(n,P,l);k.length>0&&Zb(n,k)})},[n,l,c]),w=m.useCallback(N=>{if(N.length===0)return;const k=new Set(N),P=r.filter(R=>k.has(R.id)).map(R=>JSON.parse(JSON.stringify(R))),A=o.filter(R=>k.has(R.source)&&k.has(R.target)).map(R=>JSON.parse(JSON.stringify(R)));e1.current={nodes:P,edges:A}},[r,o]),E=m.useCallback(N=>{const k=e1.current;if(k)return c(()=>LX(n,k,N,l))},[n,l,c]),b=m.useCallback((N,k,P)=>c(()=>{const A=Yb(n,N,k);return A==null?null:(qb(n,{...P,target:A}),A)})??null,[n,c]);return{nodes:r,edges:o,addNode:d,updateNode:f,updateEdge:v,deleteNode:g,deleteEdges:x,deleteSelected:S,onConnect:h,addNodeAndConnect:b,copySelection:w,pasteSelection:E}},qX=()=>{const{t:e}=Xe(),t=is(o=>o.console),n=is(o=>o.clearConsole),r=m.useRef(null);return m.useEffect(()=>{r.current&&(r.current.scrollTop=r.current.scrollHeight)},[t]),p.jsxs("div",{className:"h-full flex flex-col bg-background border-t border-border",children:[p.jsxs("div",{className:"flex items-center justify-between px-3 py-1.5 border-b border-border/50 shrink-0",children:[p.jsx("span",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider",children:e("debug.console")}),p.jsx(gt,{variant:"ghost",size:"icon",className:"w-6 h-6 text-muted-foreground hover:text-foreground",onClick:n,title:e("debug.clearConsole"),children:p.jsx(El,{className:"w-3.5 h-3.5"})})]}),p.jsx(Di,{className:"flex-1",viewportRef:r,viewportClassName:"p-2",children:p.jsx("div",{className:"font-mono text-xs space-y-0.5",children:t.length===0?p.jsx("div",{className:"text-muted-foreground text-center py-4",children:e("debug.consoleEmpty")}):t.map(o=>p.jsx(ZX,{entry:o},o.id))})})]})};function ZX({entry:e}){const t=new Date(e.timestamp).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}),n=e.type==="error"?"text-destructive":e.type==="system"?"text-muted-foreground":"text-foreground";return p.jsxs("div",{className:`flex gap-2 leading-relaxed ${n}`,children:[p.jsx("span",{className:"text-muted-foreground/50 shrink-0",children:t}),p.jsx("span",{className:"whitespace-pre-wrap break-all",children:e.text})]})}const QX=({functions:e,onOpenFunction:t,onCreateFunction:n,canvasTabs:r,onCanvasTabChange:o,onCanvasTabClose:i,onCanvasTabReorder:l,onTestNode:c,onDebugStep:d})=>{const f=ue(K=>K.activeCanvasId),g=ue(K=>K.builderMode),h=wn(g),v=g.type==="debug",{nodeDefinitions:x,getNodeDefinition:S,getAllCategories:w}=ey(),E=XX(f,h),{undo:b,redo:N,takeCheckpoint:k,canUndo:P,canRedo:A}=YX(f),R=ue(K=>K.selection),_=ue(K=>K.selectGraph),M=ue(K=>K.syncSelectionFromRF),$=ue(K=>K.clearSelection),U=ue(K=>K.activeSidebarTab),L=ue(K=>K.setActiveSidebarTab);m.useEffect(()=>{const K=U==="debug-context";v&&!K?L("debug-context"):!v&&K&&L("nodes")},[v,U,L]);const[B,G]=m.useState(!1),I=m.useRef(null),O=m.useCallback(K=>_([K],[]),[_]),D=m.useCallback(K=>_([],[K]),[_]),V=m.useCallback((K,q)=>{const oe=q??I.current?.(),ce=E.addNode(K,oe);return ce==null&&Gt({title:`Only one ${K.label} node allowed per canvas`,variant:"destructive"}),ce},[E]),z=m.useCallback(K=>{const q=E.onConnect(K);if(q&&q!=="control"&&q!=="tool"){const{edges:oe}=et(f).getState(),ce=oe.find(ge=>ge.source===K.source&&ge.target===K.target&&ge.sourceHandle===K.sourceHandle&&ge.targetHandle===K.targetHandle);ce&&D(ce.id)}},[E,f,D]),W=m.useCallback((K,q,oe)=>{const ce=E.addNodeAndConnect(K,q,oe);return ce==null&&Gt({title:`Only one ${K.label} node allowed per canvas`,variant:"destructive"}),ce},[E]),Z=m.useCallback(({nodes:K,edges:q})=>{M(K.map(oe=>oe.id),q.map(oe=>oe.id))},[M]),F=m.useCallback(K=>{E.deleteEdges([K]),$()},[E,$]),H=m.useCallback(()=>{k()},[k]),X=m.useCallback(()=>{const K=ue.getState().selection,q=K.kind==="graph"?K.nodeIds:[],oe=K.kind==="graph"?K.edgeIds:[];E.deleteSelected(q,oe),$()},[E,$]),Q=m.useCallback(K=>{const q=E.pasteSelection(K);if(q?.skippedLabels.length)for(const oe of q.skippedLabels)Gt({title:`Only one ${oe} node allowed per canvas`,variant:"destructive"});return q},[E]);m.useEffect(()=>{const K=q=>{const oe=q.target;if(!(oe?.tagName==="INPUT"||oe?.tagName==="TEXTAREA"||oe?.isContentEditable)){if(h){q.key==="Escape"&&$();return}if((q.ctrlKey||q.metaKey)&&q.key==="z"&&!q.shiftKey){q.preventDefault(),P()&&($(),b());return}if((q.ctrlKey||q.metaKey)&&(q.key==="y"||q.key==="z"&&q.shiftKey)){q.preventDefault(),A()&&($(),N());return}if((q.ctrlKey||q.metaKey)&&q.key==="c"){R.kind==="graph"&&R.nodeIds.length>0&&(q.preventDefault(),E.copySelection(R.nodeIds));return}if((q.ctrlKey||q.metaKey)&&q.key==="v"){q.preventDefault(),Q();return}(q.key==="Delete"||q.key==="Backspace")&&X(),q.key==="Escape"&&$()}};return document.addEventListener("keydown",K),()=>document.removeEventListener("keydown",K)},[P,A,b,N,$,X,R,E,Q,h]);const ee=f!==Be,ne=p.jsxs("div",{className:"flex flex-col h-full min-w-0",children:[p.jsx(BB,{tabs:r,activeTabId:f,onTabChange:o,onTabClose:i,onTabReorder:l}),p.jsx("div",{className:"flex-1 relative",children:p.jsx(OG,{canvasId:f,viewportCenterRef:I,nodeDefinitions:x,onConnect:z,onAddNode:V,onAddNodeAndConnect:W,onSelectionChange:Z,onPaneClick:$,onNodeDragStart:H,setSelectionDrag:G},f)})]});return p.jsx("div",{className:"h-full bg-canvas-bg flex flex-col",children:p.jsxs("div",{className:"flex-1 flex overflow-hidden",children:[p.jsx(HB,{canvasId:f,activeTab:U,onTabChange:L,onAddNode:V,nodeDefinitions:x,getAllCategories:w,onSelectNode:O,onSelectEdge:D,isFunctionCanvas:ee,functions:e,onOpenFunction:t,onCreateFunction:n,isDebugMode:v}),p.jsx("div",{className:"flex-1 flex flex-col h-full min-w-0",children:v?p.jsxs($4,{direction:"vertical",children:[p.jsx(hw,{defaultSize:75,minSize:30,children:ne}),p.jsx(L4,{withHandle:!0}),p.jsx(hw,{defaultSize:25,minSize:10,children:p.jsx(qX,{})})]}):ne}),p.jsx(GX,{canvasId:f,isDebugMode:v,selectionDrag:B,getNodeDef:S,onNodeUpdate:E.updateNode,onNodeDelete:E.deleteNode,onEdgeUpdate:E.updateEdge,onEdgeDelete:F,onClearSelection:$,onTestNode:c,onDebugStep:d})]})})};var My="ToastProvider",[Dy,JX,eq]=yf("Toast"),[eP]=Ft("Toast",[eq]),[tq,Cf]=eP(My),tP=e=>{const{__scopeToast:t,label:n="Notification",duration:r=5e3,swipeDirection:o="right",swipeThreshold:i=50,children:l}=e,[c,d]=m.useState(null),[f,g]=m.useState(0),h=m.useRef(!1),v=m.useRef(!1);return n.trim()||console.error(`Invalid prop \`label\` supplied to \`${My}\`. Expected non-empty \`string\`.`),p.jsx(Dy.Provider,{scope:t,children:p.jsx(tq,{scope:t,label:n,duration:r,swipeDirection:o,swipeThreshold:i,toastCount:f,viewport:c,onViewportChange:d,onToastAdd:m.useCallback(()=>g(x=>x+1),[]),onToastRemove:m.useCallback(()=>g(x=>x-1),[]),isFocusedToastEscapeKeyDownRef:h,isClosePausedRef:v,children:l})})};tP.displayName=My;var nP="ToastViewport",nq=["F8"],om="toast.viewportPause",sm="toast.viewportResume",rP=m.forwardRef((e,t)=>{const{__scopeToast:n,hotkey:r=nq,label:o="Notifications ({hotkey})",...i}=e,l=Cf(nP,n),c=JX(n),d=m.useRef(null),f=m.useRef(null),g=m.useRef(null),h=m.useRef(null),v=De(t,h,l.onViewportChange),x=r.join("+").replace(/Key/g,"").replace(/Digit/g,""),S=l.toastCount>0;m.useEffect(()=>{const E=b=>{r.length!==0&&r.every(k=>b[k]||b.code===k)&&h.current?.focus()};return document.addEventListener("keydown",E),()=>document.removeEventListener("keydown",E)},[r]),m.useEffect(()=>{const E=d.current,b=h.current;if(S&&E&&b){const N=()=>{if(!l.isClosePausedRef.current){const R=new CustomEvent(om);b.dispatchEvent(R),l.isClosePausedRef.current=!0}},k=()=>{if(l.isClosePausedRef.current){const R=new CustomEvent(sm);b.dispatchEvent(R),l.isClosePausedRef.current=!1}},P=R=>{!E.contains(R.relatedTarget)&&k()},A=()=>{E.contains(document.activeElement)||k()};return E.addEventListener("focusin",N),E.addEventListener("focusout",P),E.addEventListener("pointermove",N),E.addEventListener("pointerleave",A),window.addEventListener("blur",N),window.addEventListener("focus",k),()=>{E.removeEventListener("focusin",N),E.removeEventListener("focusout",P),E.removeEventListener("pointermove",N),E.removeEventListener("pointerleave",A),window.removeEventListener("blur",N),window.removeEventListener("focus",k)}}},[S,l.isClosePausedRef]);const w=m.useCallback(({tabbingDirection:E})=>{const N=c().map(k=>{const P=k.ref.current,A=[P,...gq(P)];return E==="forwards"?A:A.reverse()});return(E==="forwards"?N.reverse():N).flat()},[c]);return m.useEffect(()=>{const E=h.current;if(E){const b=N=>{const k=N.altKey||N.ctrlKey||N.metaKey;if(N.key==="Tab"&&!k){const A=document.activeElement,R=N.shiftKey;if(N.target===E&&R){f.current?.focus();return}const $=w({tabbingDirection:R?"backwards":"forwards"}),U=$.findIndex(L=>L===A);fg($.slice(U+1))?N.preventDefault():R?f.current?.focus():g.current?.focus()}};return E.addEventListener("keydown",b),()=>E.removeEventListener("keydown",b)}},[c,w]),p.jsxs(Y3,{ref:d,role:"region","aria-label":o.replace("{hotkey}",x),tabIndex:-1,style:{pointerEvents:S?void 0:"none"},children:[S&&p.jsx(im,{ref:f,onFocusFromOutsideViewport:()=>{const E=w({tabbingDirection:"forwards"});fg(E)}}),p.jsx(Dy.Slot,{scope:n,children:p.jsx(ke.ol,{tabIndex:-1,...i,ref:v})}),S&&p.jsx(im,{ref:g,onFocusFromOutsideViewport:()=>{const E=w({tabbingDirection:"backwards"});fg(E)}})]})});rP.displayName=nP;var oP="ToastFocusProxy",im=m.forwardRef((e,t)=>{const{__scopeToast:n,onFocusFromOutsideViewport:r,...o}=e,i=Cf(oP,n);return p.jsx(Kd,{tabIndex:0,...o,ref:t,style:{position:"fixed"},onFocus:l=>{const c=l.relatedTarget;!i.viewport?.contains(c)&&r()}})});im.displayName=oP;var Ll="Toast",rq="toast.swipeStart",oq="toast.swipeMove",sq="toast.swipeCancel",iq="toast.swipeEnd",sP=m.forwardRef((e,t)=>{const{forceMount:n,open:r,defaultOpen:o,onOpenChange:i,...l}=e,[c,d]=cn({prop:r,defaultProp:o??!0,onChange:i,caller:Ll});return p.jsx(Pt,{present:n||c,children:p.jsx(cq,{open:c,...l,ref:t,onClose:()=>d(!1),onPause:pt(e.onPause),onResume:pt(e.onResume),onSwipeStart:ve(e.onSwipeStart,f=>{f.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:ve(e.onSwipeMove,f=>{const{x:g,y:h}=f.detail.delta;f.currentTarget.setAttribute("data-swipe","move"),f.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${g}px`),f.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${h}px`)}),onSwipeCancel:ve(e.onSwipeCancel,f=>{f.currentTarget.setAttribute("data-swipe","cancel"),f.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),f.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),f.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),f.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:ve(e.onSwipeEnd,f=>{const{x:g,y:h}=f.detail.delta;f.currentTarget.setAttribute("data-swipe","end"),f.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),f.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),f.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${g}px`),f.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${h}px`),d(!1)})})})});sP.displayName=Ll;var[aq,lq]=eP(Ll,{onClose(){}}),cq=m.forwardRef((e,t)=>{const{__scopeToast:n,type:r="foreground",duration:o,open:i,onClose:l,onEscapeKeyDown:c,onPause:d,onResume:f,onSwipeStart:g,onSwipeMove:h,onSwipeCancel:v,onSwipeEnd:x,...S}=e,w=Cf(Ll,n),[E,b]=m.useState(null),N=De(t,I=>b(I)),k=m.useRef(null),P=m.useRef(null),A=o||w.duration,R=m.useRef(0),_=m.useRef(A),M=m.useRef(0),{onToastAdd:$,onToastRemove:U}=w,L=pt(()=>{E?.contains(document.activeElement)&&w.viewport?.focus(),l()}),B=m.useCallback(I=>{!I||I===1/0||(window.clearTimeout(M.current),R.current=new Date().getTime(),M.current=window.setTimeout(L,I))},[L]);m.useEffect(()=>{const I=w.viewport;if(I){const O=()=>{B(_.current),f?.()},D=()=>{const V=new Date().getTime()-R.current;_.current=_.current-V,window.clearTimeout(M.current),d?.()};return I.addEventListener(om,D),I.addEventListener(sm,O),()=>{I.removeEventListener(om,D),I.removeEventListener(sm,O)}}},[w.viewport,A,d,f,B]),m.useEffect(()=>{i&&!w.isClosePausedRef.current&&B(A)},[i,A,w.isClosePausedRef,B]),m.useEffect(()=>($(),()=>U()),[$,U]);const G=m.useMemo(()=>E?fP(E):null,[E]);return w.viewport?p.jsxs(p.Fragment,{children:[G&&p.jsx(uq,{__scopeToast:n,role:"status","aria-live":r==="foreground"?"assertive":"polite",children:G}),p.jsx(aq,{scope:n,onClose:L,children:hs.createPortal(p.jsx(Dy.ItemSlot,{scope:n,children:p.jsx(G3,{asChild:!0,onEscapeKeyDown:ve(c,()=>{w.isFocusedToastEscapeKeyDownRef.current||L(),w.isFocusedToastEscapeKeyDownRef.current=!1}),children:p.jsx(ke.li,{tabIndex:0,"data-state":i?"open":"closed","data-swipe-direction":w.swipeDirection,...S,ref:N,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:ve(e.onKeyDown,I=>{I.key==="Escape"&&(c?.(I.nativeEvent),I.nativeEvent.defaultPrevented||(w.isFocusedToastEscapeKeyDownRef.current=!0,L()))}),onPointerDown:ve(e.onPointerDown,I=>{I.button===0&&(k.current={x:I.clientX,y:I.clientY})}),onPointerMove:ve(e.onPointerMove,I=>{if(!k.current)return;const O=I.clientX-k.current.x,D=I.clientY-k.current.y,V=!!P.current,z=["left","right"].includes(w.swipeDirection),W=["left","up"].includes(w.swipeDirection)?Math.min:Math.max,Z=z?W(0,O):0,F=z?0:W(0,D),H=I.pointerType==="touch"?10:2,X={x:Z,y:F},Q={originalEvent:I,delta:X};V?(P.current=X,Ru(oq,h,Q,{discrete:!1})):t1(X,w.swipeDirection,H)?(P.current=X,Ru(rq,g,Q,{discrete:!1}),I.target.setPointerCapture(I.pointerId)):(Math.abs(O)>H||Math.abs(D)>H)&&(k.current=null)}),onPointerUp:ve(e.onPointerUp,I=>{const O=P.current,D=I.target;if(D.hasPointerCapture(I.pointerId)&&D.releasePointerCapture(I.pointerId),P.current=null,k.current=null,O){const V=I.currentTarget,z={originalEvent:I,delta:O};t1(O,w.swipeDirection,w.swipeThreshold)?Ru(iq,x,z,{discrete:!0}):Ru(sq,v,z,{discrete:!0}),V.addEventListener("click",W=>W.preventDefault(),{once:!0})}})})})}),w.viewport)})]}):null}),uq=e=>{const{__scopeToast:t,children:n,...r}=e,o=Cf(Ll,t),[i,l]=m.useState(!1),[c,d]=m.useState(!1);return pq(()=>l(!0)),m.useEffect(()=>{const f=window.setTimeout(()=>d(!0),1e3);return()=>window.clearTimeout(f)},[]),c?null:p.jsx(Mi,{asChild:!0,children:p.jsx(Kd,{...r,children:i&&p.jsxs(p.Fragment,{children:[o.label," ",n]})})})},dq="ToastTitle",iP=m.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return p.jsx(ke.div,{...r,ref:t})});iP.displayName=dq;var fq="ToastDescription",aP=m.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e;return p.jsx(ke.div,{...r,ref:t})});aP.displayName=fq;var lP="ToastAction",cP=m.forwardRef((e,t)=>{const{altText:n,...r}=e;return n.trim()?p.jsx(dP,{altText:n,asChild:!0,children:p.jsx(jy,{...r,ref:t})}):(console.error(`Invalid prop \`altText\` supplied to \`${lP}\`. Expected non-empty \`string\`.`),null)});cP.displayName=lP;var uP="ToastClose",jy=m.forwardRef((e,t)=>{const{__scopeToast:n,...r}=e,o=lq(uP,n);return p.jsx(dP,{asChild:!0,children:p.jsx(ke.button,{type:"button",...r,ref:t,onClick:ve(e.onClick,o.onClose)})})});jy.displayName=uP;var dP=m.forwardRef((e,t)=>{const{__scopeToast:n,altText:r,...o}=e;return p.jsx(ke.div,{"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":r||void 0,...o,ref:t})});function fP(e){const t=[];return Array.from(e.childNodes).forEach(r=>{if(r.nodeType===r.TEXT_NODE&&r.textContent&&t.push(r.textContent),hq(r)){const o=r.ariaHidden||r.hidden||r.style.display==="none",i=r.dataset.radixToastAnnounceExclude==="";if(!o)if(i){const l=r.dataset.radixToastAnnounceAlt;l&&t.push(l)}else t.push(...fP(r))}}),t}function Ru(e,t,n,{discrete:r}){const o=n.originalEvent.currentTarget,i=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:n});t&&o.addEventListener(e,t,{once:!0}),r?gm(o,i):o.dispatchEvent(i)}var t1=(e,t,n=0)=>{const r=Math.abs(e.x),o=Math.abs(e.y),i=r>o;return t==="left"||t==="right"?i&&r>n:!i&&o>n};function pq(e=()=>{}){const t=pt(e);wt(()=>{let n=0,r=0;return n=window.requestAnimationFrame(()=>r=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(n),window.cancelAnimationFrame(r)}},[t])}function hq(e){return e.nodeType===e.ELEMENT_NODE}function gq(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const o=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||o?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t}function fg(e){const t=document.activeElement;return e.some(n=>n===t?!0:(n.focus(),document.activeElement!==t))}var mq=tP,pP=rP,hP=sP,gP=iP,mP=aP,yP=cP,vP=jy;const yq=mq,xP=m.forwardRef(({className:e,...t},n)=>p.jsx(pP,{ref:n,className:Ce("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",e),...t}));xP.displayName=pP.displayName;const vq=yo("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),wP=m.forwardRef(({className:e,variant:t,...n},r)=>p.jsx(hP,{ref:r,className:Ce(vq({variant:t}),e),...n}));wP.displayName=hP.displayName;const xq=m.forwardRef(({className:e,...t},n)=>p.jsx(yP,{ref:n,className:Ce("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive",e),...t}));xq.displayName=yP.displayName;const bP=m.forwardRef(({className:e,...t},n)=>p.jsx(vP,{ref:n,className:Ce("absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",e),"toast-close":"",...t,children:p.jsx(Rd,{className:"h-4 w-4"})}));bP.displayName=vP.displayName;const SP=m.forwardRef(({className:e,...t},n)=>p.jsx(gP,{ref:n,className:Ce("text-sm font-semibold",e),...t}));SP.displayName=gP.displayName;const CP=m.forwardRef(({className:e,...t},n)=>p.jsx(mP,{ref:n,className:Ce("text-sm opacity-90",e),...t}));CP.displayName=mP.displayName;function wq(){const{toasts:e}=cz();return p.jsxs(yq,{children:[e.map(function({id:t,title:n,description:r,action:o,...i}){return p.jsxs(wP,{...i,children:[p.jsxs("div",{className:"grid gap-1",children:[n&&p.jsx(SP,{children:n}),r&&p.jsx(CP,{children:r})]}),o,p.jsx(bP,{})]},t)}),p.jsx(xP,{})]})}const bq=()=>{const[e,t]=m.useState([{id:Be,label:"Main"}]),n=ue(w=>w.activeCanvasId),r=ue(w=>w.setActiveCanvas),o=ue(w=>w.selectFunction),i=ue(w=>w.functions);m.useEffect(()=>{t(w=>{let E=!1;const b=w.flatMap(N=>{if(N.id===Be)return[N];const k=i[N.id];return k?k.name!==N.label?(E=!0,[{...N,label:k.name}]):[N]:(E=!0,[])});return E?b:w}),n!==Be&&!i[n]&&r(Be)},[i,n,r]);const l=m.useCallback(w=>{w!==Be&&i[w]?o(w):r(w)},[i,o,r]),c=m.useCallback((w,E)=>(t(b=>b.find(k=>k.id===w)?b:[...b,{id:w,label:E}]),r(w),w),[r]),d=m.useCallback(w=>{w!==Be&&t(E=>{const b=E.filter(N=>N.id!==w);return w===n&&r(Be),b})},[n,r]),f=m.useCallback(w=>{w!==Be&&t(E=>{const b=E.filter(N=>N.id!==w);return w===n&&r(Be),b})},[n,r]),g=m.useCallback((w,E)=>{t(b=>b.map(N=>N.id===w?{...N,label:E}:N))},[]),h=m.useCallback((w,E)=>{w===0||E===0||t(b=>{const N=[...b],[k]=N.splice(w,1);return k?(N.splice(E,0,k),N):b})},[]),v=m.useCallback(()=>{t([{id:Be,label:"Main"}]),r(Be)},[r]),x=m.useCallback((w,E)=>{t(w),r(E)},[r]),S=m.useCallback(w=>e.find(E=>E.id===w)?.label||"Unknown",[e]);return{tabs:e,activeTabId:n,setActiveTabId:l,openTab:c,closeTab:d,removeTab:f,renameTab:g,reorderTabs:h,resetToMain:v,restoreTabState:x,getTabLabel:S,isMainCanvas:n===Be}};function pg(e){const t=ue(e.selectItems);m.useEffect(()=>{const n=Ye.getState(),r=new Set;for(const o of Object.values(t))r.add(o.id),e.set(n,o.id,e.validate(o));for(const o of Object.keys(e.getStored(n)))r.has(o)||e.clear(n,o)},[t])}function Sq(){const e=ue(t=>t.functions);m.useEffect(()=>{const t=Ye.getState(),n=new Set;for(const[r,o]of Object.entries(e)){n.add(r);const i=Zm(r),l=i?dm(i.getState().variables,i.getState().edges).lookup:void 0;t.setFunctionDiagnostics(r,FA(o,l))}for(const r of Object.keys(t.byFunctionId))n.has(r)||t.clearFunctionDiagnostics(r)},[e])}function Cq(){const e=BN();m.useEffect(()=>{if(typeof document>"u")return;const t=document.documentElement;let n=t.classList.contains("light"),r=0;const o=new MutationObserver(()=>{const i=t.classList.contains("light");i!==n&&(n=i,t.classList.add("theme-changing"),t.offsetHeight,clearTimeout(r),r=window.setTimeout(()=>t.classList.remove("theme-changing"),120))});return o.observe(t,{attributes:!0,attributeFilter:["class"]}),()=>{o.disconnect(),clearTimeout(r),t.classList.remove("theme-changing")}},[]),m.useLayoutEffect(()=>{if(typeof document>"u")return;const t=document.documentElement;t.classList.contains("theme-changing")&&(t.offsetHeight,t.classList.remove("theme-changing"))},[e])}const Eq=({onOpenTab:e})=>{const{functionsList:t,getFunction:n}=Qd(),r=ue(l=>l.selectFunction),o=m.useCallback(l=>{const c=n(l);c&&(et(l),e(l,c.name),r(l))},[n,e,r]),i=m.useCallback(()=>{const l=xX();return e(l.id,l.name),r(l.id),l.id},[e,r]);return{functions:t,openFunction:o,createFunction:i}};function Nq(){const e=m.useCallback(r=>{const o=KH(BH(r));Aw();for(const[d,f]of Object.entries(o.canvases)){const g=et(d),h=f.nodes.map(x=>({id:x.id,type:QT(x.type),position:x.position,data:x})),v=f.edges.map(x=>({id:x.id,type:x.type,source:x.source,sourceHandle:x.sourceHandle,target:x.target,targetHandle:x.targetHandle,...x.data?{data:x.data}:{}}));g.getState().initialize(h,v),g.getState().setVariables(()=>f.variables)}const{channels:i,memory:l,models:c}=o;ue.getState().setChannels(()=>i),ue.getState().setMemory(()=>l),ue.getState().setModels(()=>c),ue.getState().setFunctions(()=>o.functions),Zd()},[]),t=m.useCallback(()=>UH(EP()),[]),n=m.useCallback(()=>{Aw();const r=ue.getState();r.setActiveCanvas(Be),r.setChannels(o=>Object.keys(o).length?{}:o),r.setMemory(o=>Object.keys(o).length?{}:o),r.setModels(o=>Object.keys(o).length?{}:o),r.setFunctions(o=>Object.keys(o).length?{}:o),r.clearSelection()},[]);return{exportProject:t,importProject:e,clearProject:n}}function EP(){const e={};for(const[o,i]of Object.entries(Qm())){const l=i.getState();e[o]={nodes:l.nodes.map(c=>({...c.data,position:c.position})),edges:l.edges.map(c=>({id:c.id,type:c.type,source:c.source,sourceHandle:c.sourceHandle,target:c.target,targetHandle:c.targetHandle,...c.data?{data:c.data}:{}})),variables:l.variables}}const t={};for(const o of Object.values(ue.getState().channels))t[o.id]=o;const n={};for(const o of Object.values(ue.getState().memory))n[o.id]=o;const r={};for(const o of Object.values(ue.getState().models))r[o.id]=o;return{canvases:e,functions:ue.getState().functions,channels:t,memory:n,models:r}}function wn(e){return e.type!=="edit"}const kq=m.forwardRef(function(t,n){const{initialWorkflow:r,initialMode:o,models:i,language:l,onTestNode:c,onDebugStep:d,onChange:f,onHistoryChange:g,onError:h}=t;m.useLayoutEffect(()=>{l&&mr.language!==l&&mr.changeLanguage(l)},[l]);const{importProject:v,exportProject:x,clearProject:S}=Nq();Cq(),pg({selectItems:M=>M.channels,validate:T1,getStored:M=>M.byChannelId,set:(M,$,U)=>M.setChannelDiagnostics($,U),clear:(M,$)=>M.clearChannelDiagnostics($)}),pg({selectItems:M=>M.memory,validate:P1,getStored:M=>M.byMemoryId,set:(M,$,U)=>M.setMemoryDiagnostics($,U),clear:(M,$)=>M.clearMemoryDiagnostics($)}),pg({selectItems:M=>M.models,validate:R1,getStored:M=>M.byModelId,set:(M,$,U)=>M.setModelDiagnostics($,U),clear:(M,$)=>M.clearModelDiagnostics($)}),Sq(),m.useEffect(()=>{ue.getState().setAvailableModels(i??[])},[i]);const w=bq(),E=Eq({onOpenTab:w.openTab}),[b,N]=m.useState(null),k=m.useCallback(()=>{const M=VA(EP());M.totalErrors===0&&M.totalWarnings===0?Gt({title:mr.t("validationPassed")}):N(M)},[]),P=m.useCallback(M=>{const $=ue.getState();M.channelId?($.setActiveSidebarTab("channels"),$.selectChannel(M.channelId)):M.memoryId?($.setActiveSidebarTab("memory"),$.selectMemory(M.memoryId)):M.modelId?($.setActiveSidebarTab("models"),$.selectModel(M.modelId)):M.canvasId&&(M.canvasId===Be?$.setActiveCanvas(Be):E.openFunction(M.canvasId),M.nodeId?$.selectGraph([M.nodeId],[]):M.edgeId&&$.selectGraph([],[M.edgeId])),N(null)},[E]),A=m.useRef(!1);m.useEffect(()=>{if(!A.current){A.current=!0;try{o&&ue.getState().setBuilderMode(o),r?v(r):S()}catch(M){h?.(M instanceof Error?M:new Error(String(M)))}}},[]);const R=m.useRef(f),_=m.useRef(g);return R.current=f,_.current=g,m.useEffect(()=>{const M=[],$=new WeakSet;function U(O){if($.has(O))return;$.add(O);let D=O.getState().mutationCount;const V=O.subscribe(z=>{z.mutationCount!==D&&(D=z.mutationCount,R.current?.())});M.push(V)}function L(){for(const O of Object.values(Qm()))U(O)}L();const B=_w(()=>{L()});M.push(B);let G=ue.getState().mutationCount;const I=ue.subscribe(O=>{O.mutationCount!==G&&(G=O.mutationCount,R.current?.())});return M.push(I),()=>{for(const O of M)O()}},[]),m.useEffect(()=>{let M=null,$=null,U=null;const L=()=>{const D=et(ue.getState().activeCanvasId),V=D.canUndo(),z=D.canRedo();V===M&&z===$||(M=V,$=z,_.current?.({canUndo:V,canRedo:z}))},B=()=>{U?.(),U=et(ue.getState().activeCanvasId).subscribe(L),L()};B();let G=ue.getState().activeCanvasId;const I=ue.subscribe(D=>{D.activeCanvasId!==G&&(G=D.activeCanvasId,B())}),O=_w(B);return()=>{U?.(),I(),O()}},[]),m.useImperativeHandle(n,()=>({loadWorkflow:M=>{try{v(M)}catch($){h?.($ instanceof Error?$:new Error(String($)))}},exportWorkflow:()=>x(),clear:()=>S(),setMode:M=>ue.getState().setBuilderMode(M),getMode:()=>ue.getState().builderMode,validate:k,undo:()=>et(ue.getState().activeCanvasId).undo(),redo:()=>et(ue.getState().activeCanvasId).redo(),setDebugPhase:M=>is.getState().setPhase(M)}),[v,x,S,h,k]),p.jsx(T_,{i18n:mr,children:p.jsx(FC,{delayDuration:300,children:p.jsxs("div",{className:"fh-builder h-full w-full bg-background text-foreground font-sans antialiased",children:[p.jsx(QX,{functions:E.functions,onOpenFunction:E.openFunction,onCreateFunction:E.createFunction,canvasTabs:w.tabs,onCanvasTabChange:w.setActiveTabId,onCanvasTabClose:w.closeTab,onCanvasTabReorder:w.reorderTabs,onTestNode:c,onDebugStep:d}),p.jsx(wq,{}),b&&p.jsx(c4,{open:!0,onOpenChange:M=>{M||N(null)},validation:b,onSelectDiagnostic:P})]})})})});function Tq({theme:e,onToggle:t}){const{t:n}=Xe();return p.jsx("button",{onClick:t,className:"p-2 rounded hover:bg-muted/50 text-muted-foreground hover:text-foreground transition-colors",title:n("a11y.toggleTheme"),"aria-label":n("a11y.toggleTheme"),children:e==="dark"?p.jsx(Az,{className:"w-5 h-5"}):p.jsx(kz,{className:"w-5 h-5"})})}function Pq(e){const t=Rq(e),n=m.forwardRef((r,o)=>{const{children:i,...l}=r,c=m.Children.toArray(i),d=c.find(_q);if(d){const f=d.props.children,g=c.map(h=>h===d?m.Children.count(f)>1?m.Children.only(null):m.isValidElement(f)?f.props.children:null:h);return p.jsx(t,{...l,ref:o,children:m.isValidElement(f)?m.cloneElement(f,void 0,g):null})}return p.jsx(t,{...l,ref:o,children:i})});return n.displayName=`${e}.Slot`,n}function Rq(e){const t=m.forwardRef((n,r)=>{const{children:o,...i}=n;if(m.isValidElement(o)){const l=Mq(o),c=Aq(i,o.props);return o.type!==m.Fragment&&(c.ref=r?Xt(r,l):l),m.cloneElement(o,c)}return m.Children.count(o)>1?m.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var Iq=Symbol("radix.slottable");function _q(e){return m.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===Iq}function Aq(e,t){const n={...t};for(const r in t){const o=e[r],i=t[r];/^on[A-Z]/.test(r)?o&&i?n[r]=(...c)=>{const d=i(...c);return o(...c),d}:o&&(n[r]=o):r==="style"?n[r]={...o,...i}:r==="className"&&(n[r]=[o,i].filter(Boolean).join(" "))}return{...e,...n}}function Mq(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var am=["Enter"," "],Dq=["ArrowDown","PageUp","Home"],NP=["ArrowUp","PageDown","End"],jq=[...Dq,...NP],Oq={ltr:[...am,"ArrowRight"],rtl:[...am,"ArrowLeft"]},$q={ltr:["ArrowLeft"],rtl:["ArrowRight"]},Fl="Menu",[vl,Lq,Fq]=yf(Fl),[gs,kP]=Ft(Fl,[Fq,$i,bf]),Ef=$i(),TP=bf(),[zq,ms]=gs(Fl),[Vq,zl]=gs(Fl),PP=e=>{const{__scopeMenu:t,open:n=!1,children:r,dir:o,onOpenChange:i,modal:l=!0}=e,c=Ef(t),[d,f]=m.useState(null),g=m.useRef(!1),h=pt(i),v=Nl(o);return m.useEffect(()=>{const x=()=>{g.current=!0,document.addEventListener("pointerdown",S,{capture:!0,once:!0}),document.addEventListener("pointermove",S,{capture:!0,once:!0})},S=()=>g.current=!1;return document.addEventListener("keydown",x,{capture:!0}),()=>{document.removeEventListener("keydown",x,{capture:!0}),document.removeEventListener("pointerdown",S,{capture:!0}),document.removeEventListener("pointermove",S,{capture:!0})}},[]),p.jsx(Wm,{...c,children:p.jsx(zq,{scope:t,open:n,onOpenChange:h,content:d,onContentChange:f,children:p.jsx(Vq,{scope:t,onClose:m.useCallback(()=>h(!1),[h]),isUsingKeyboardRef:g,dir:v,modal:l,children:r})})})};PP.displayName=Fl;var Hq="MenuAnchor",Oy=m.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e,o=Ef(n);return p.jsx(Um,{...o,...r,ref:t})});Oy.displayName=Hq;var $y="MenuPortal",[Bq,RP]=gs($y,{forceMount:void 0}),IP=e=>{const{__scopeMenu:t,forceMount:n,children:r,container:o}=e,i=ms($y,t);return p.jsx(Bq,{scope:t,forceMount:n,children:p.jsx(Pt,{present:n||i.open,children:p.jsx(Mi,{asChild:!0,container:o,children:r})})})};IP.displayName=$y;var vn="MenuContent",[Wq,Ly]=gs(vn),_P=m.forwardRef((e,t)=>{const n=RP(vn,e.__scopeMenu),{forceMount:r=n.forceMount,...o}=e,i=ms(vn,e.__scopeMenu),l=zl(vn,e.__scopeMenu);return p.jsx(vl.Provider,{scope:e.__scopeMenu,children:p.jsx(Pt,{present:r||i.open,children:p.jsx(vl.Slot,{scope:e.__scopeMenu,children:l.modal?p.jsx(Uq,{...o,ref:t}):p.jsx(Kq,{...o,ref:t})})})})}),Uq=m.forwardRef((e,t)=>{const n=ms(vn,e.__scopeMenu),r=m.useRef(null),o=De(t,r);return m.useEffect(()=>{const i=r.current;if(i)return ym(i)},[]),p.jsx(Fy,{...e,ref:o,trapFocus:n.open,disableOutsidePointerEvents:n.open,disableOutsideScroll:!0,onFocusOutside:ve(e.onFocusOutside,i=>i.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>n.onOpenChange(!1)})}),Kq=m.forwardRef((e,t)=>{const n=ms(vn,e.__scopeMenu);return p.jsx(Fy,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>n.onOpenChange(!1)})}),Gq=Pq("MenuContent.ScrollLock"),Fy=m.forwardRef((e,t)=>{const{__scopeMenu:n,loop:r=!1,trapFocus:o,onOpenAutoFocus:i,onCloseAutoFocus:l,disableOutsidePointerEvents:c,onEntryFocus:d,onEscapeKeyDown:f,onPointerDownOutside:g,onFocusOutside:h,onInteractOutside:v,onDismiss:x,disableOutsideScroll:S,...w}=e,E=ms(vn,n),b=zl(vn,n),N=Ef(n),k=TP(n),P=Lq(n),[A,R]=m.useState(null),_=m.useRef(null),M=De(t,_,E.onContentChange),$=m.useRef(0),U=m.useRef(""),L=m.useRef(0),B=m.useRef(null),G=m.useRef("right"),I=m.useRef(0),O=S?Ad:m.Fragment,D=S?{as:Gq,allowPinchZoom:!0}:void 0,V=W=>{const Z=U.current+W,F=P().filter(K=>!K.disabled),H=document.activeElement,X=F.find(K=>K.ref.current===H)?.textValue,Q=F.map(K=>K.textValue),ee=sZ(Q,Z,X),ne=F.find(K=>K.textValue===ee)?.ref.current;(function K(q){U.current=q,window.clearTimeout($.current),q!==""&&($.current=window.setTimeout(()=>K(""),1e3))})(Z),ne&&setTimeout(()=>ne.focus())};m.useEffect(()=>()=>window.clearTimeout($.current),[]),mm();const z=m.useCallback(W=>G.current===B.current?.side&&aZ(W,B.current?.area),[]);return p.jsx(Wq,{scope:n,searchRef:U,onItemEnter:m.useCallback(W=>{z(W)&&W.preventDefault()},[z]),onItemLeave:m.useCallback(W=>{z(W)||(_.current?.focus(),R(null))},[z]),onTriggerLeave:m.useCallback(W=>{z(W)&&W.preventDefault()},[z]),pointerGraceTimerRef:L,onPointerGraceIntentChange:m.useCallback(W=>{B.current=W},[]),children:p.jsx(O,{...D,children:p.jsx(Id,{asChild:!0,trapped:o,onMountAutoFocus:ve(i,W=>{W.preventDefault(),_.current?.focus({preventScroll:!0})}),onUnmountAutoFocus:l,children:p.jsx(Ai,{asChild:!0,disableOutsidePointerEvents:c,onEscapeKeyDown:f,onPointerDownOutside:g,onFocusOutside:h,onInteractOutside:v,onDismiss:x,children:p.jsx(Qk,{asChild:!0,...k,dir:b.dir,orientation:"vertical",loop:r,currentTabStopId:A,onCurrentTabStopIdChange:R,onEntryFocus:ve(d,W=>{b.isUsingKeyboardRef.current||W.preventDefault()}),preventScrollOnEntryFocus:!0,children:p.jsx(Km,{role:"menu","aria-orientation":"vertical","data-state":GP(E.open),"data-radix-menu-content":"",dir:b.dir,...N,...w,ref:M,style:{outline:"none",...w.style},onKeyDown:ve(w.onKeyDown,W=>{const F=W.target.closest("[data-radix-menu-content]")===W.currentTarget,H=W.ctrlKey||W.altKey||W.metaKey,X=W.key.length===1;F&&(W.key==="Tab"&&W.preventDefault(),!H&&X&&V(W.key));const Q=_.current;if(W.target!==Q||!jq.includes(W.key))return;W.preventDefault();const ne=P().filter(K=>!K.disabled).map(K=>K.ref.current);NP.includes(W.key)&&ne.reverse(),rZ(ne)}),onBlur:ve(e.onBlur,W=>{W.currentTarget.contains(W.target)||(window.clearTimeout($.current),U.current="")}),onPointerMove:ve(e.onPointerMove,xl(W=>{const Z=W.target,F=I.current!==W.clientX;if(W.currentTarget.contains(Z)&&F){const H=W.clientX>I.current?"right":"left";G.current=H,I.current=W.clientX}}))})})})})})})});_P.displayName=vn;var Yq="MenuGroup",zy=m.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.jsx(ke.div,{role:"group",...r,ref:t})});zy.displayName=Yq;var Xq="MenuLabel",AP=m.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.jsx(ke.div,{...r,ref:t})});AP.displayName=Xq;var vd="MenuItem",n1="menu.itemSelect",Nf=m.forwardRef((e,t)=>{const{disabled:n=!1,onSelect:r,...o}=e,i=m.useRef(null),l=zl(vd,e.__scopeMenu),c=Ly(vd,e.__scopeMenu),d=De(t,i),f=m.useRef(!1),g=()=>{const h=i.current;if(!n&&h){const v=new CustomEvent(n1,{bubbles:!0,cancelable:!0});h.addEventListener(n1,x=>r?.(x),{once:!0}),gm(h,v),v.defaultPrevented?f.current=!1:l.onClose()}};return p.jsx(MP,{...o,ref:d,disabled:n,onClick:ve(e.onClick,g),onPointerDown:h=>{e.onPointerDown?.(h),f.current=!0},onPointerUp:ve(e.onPointerUp,h=>{f.current||h.currentTarget?.click()}),onKeyDown:ve(e.onKeyDown,h=>{const v=c.searchRef.current!=="";n||v&&h.key===" "||am.includes(h.key)&&(h.currentTarget.click(),h.preventDefault())})})});Nf.displayName=vd;var MP=m.forwardRef((e,t)=>{const{__scopeMenu:n,disabled:r=!1,textValue:o,...i}=e,l=Ly(vd,n),c=TP(n),d=m.useRef(null),f=De(t,d),[g,h]=m.useState(!1),[v,x]=m.useState("");return m.useEffect(()=>{const S=d.current;S&&x((S.textContent??"").trim())},[i.children]),p.jsx(vl.ItemSlot,{scope:n,disabled:r,textValue:o??v,children:p.jsx(Jk,{asChild:!0,...c,focusable:!r,children:p.jsx(ke.div,{role:"menuitem","data-highlighted":g?"":void 0,"aria-disabled":r||void 0,"data-disabled":r?"":void 0,...i,ref:f,onPointerMove:ve(e.onPointerMove,xl(S=>{r?l.onItemLeave(S):(l.onItemEnter(S),S.defaultPrevented||S.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:ve(e.onPointerLeave,xl(S=>l.onItemLeave(S))),onFocus:ve(e.onFocus,()=>h(!0)),onBlur:ve(e.onBlur,()=>h(!1))})})})}),qq="MenuCheckboxItem",DP=m.forwardRef((e,t)=>{const{checked:n=!1,onCheckedChange:r,...o}=e;return p.jsx(FP,{scope:e.__scopeMenu,checked:n,children:p.jsx(Nf,{role:"menuitemcheckbox","aria-checked":xd(n)?"mixed":n,...o,ref:t,"data-state":Hy(n),onSelect:ve(o.onSelect,()=>r?.(xd(n)?!0:!n),{checkForDefaultPrevented:!1})})})});DP.displayName=qq;var jP="MenuRadioGroup",[Zq,Qq]=gs(jP,{value:void 0,onValueChange:()=>{}}),OP=m.forwardRef((e,t)=>{const{value:n,onValueChange:r,...o}=e,i=pt(r);return p.jsx(Zq,{scope:e.__scopeMenu,value:n,onValueChange:i,children:p.jsx(zy,{...o,ref:t})})});OP.displayName=jP;var $P="MenuRadioItem",LP=m.forwardRef((e,t)=>{const{value:n,...r}=e,o=Qq($P,e.__scopeMenu),i=n===o.value;return p.jsx(FP,{scope:e.__scopeMenu,checked:i,children:p.jsx(Nf,{role:"menuitemradio","aria-checked":i,...r,ref:t,"data-state":Hy(i),onSelect:ve(r.onSelect,()=>o.onValueChange?.(n),{checkForDefaultPrevented:!1})})})});LP.displayName=$P;var Vy="MenuItemIndicator",[FP,Jq]=gs(Vy,{checked:!1}),zP=m.forwardRef((e,t)=>{const{__scopeMenu:n,forceMount:r,...o}=e,i=Jq(Vy,n);return p.jsx(Pt,{present:r||xd(i.checked)||i.checked===!0,children:p.jsx(ke.span,{...o,ref:t,"data-state":Hy(i.checked)})})});zP.displayName=Vy;var eZ="MenuSeparator",VP=m.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return p.jsx(ke.div,{role:"separator","aria-orientation":"horizontal",...r,ref:t})});VP.displayName=eZ;var tZ="MenuArrow",HP=m.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e,o=Ef(n);return p.jsx(Gm,{...o,...r,ref:t})});HP.displayName=tZ;var nZ="MenuSub",[aQ,BP]=gs(nZ),Ka="MenuSubTrigger",WP=m.forwardRef((e,t)=>{const n=ms(Ka,e.__scopeMenu),r=zl(Ka,e.__scopeMenu),o=BP(Ka,e.__scopeMenu),i=Ly(Ka,e.__scopeMenu),l=m.useRef(null),{pointerGraceTimerRef:c,onPointerGraceIntentChange:d}=i,f={__scopeMenu:e.__scopeMenu},g=m.useCallback(()=>{l.current&&window.clearTimeout(l.current),l.current=null},[]);return m.useEffect(()=>g,[g]),m.useEffect(()=>{const h=c.current;return()=>{window.clearTimeout(h),d(null)}},[c,d]),p.jsx(Oy,{asChild:!0,...f,children:p.jsx(MP,{id:o.triggerId,"aria-haspopup":"menu","aria-expanded":n.open,"aria-controls":o.contentId,"data-state":GP(n.open),...e,ref:Xt(t,o.onTriggerChange),onClick:h=>{e.onClick?.(h),!(e.disabled||h.defaultPrevented)&&(h.currentTarget.focus(),n.open||n.onOpenChange(!0))},onPointerMove:ve(e.onPointerMove,xl(h=>{i.onItemEnter(h),!h.defaultPrevented&&!e.disabled&&!n.open&&!l.current&&(i.onPointerGraceIntentChange(null),l.current=window.setTimeout(()=>{n.onOpenChange(!0),g()},100))})),onPointerLeave:ve(e.onPointerLeave,xl(h=>{g();const v=n.content?.getBoundingClientRect();if(v){const x=n.content?.dataset.side,S=x==="right",w=S?-5:5,E=v[S?"left":"right"],b=v[S?"right":"left"];i.onPointerGraceIntentChange({area:[{x:h.clientX+w,y:h.clientY},{x:E,y:v.top},{x:b,y:v.top},{x:b,y:v.bottom},{x:E,y:v.bottom}],side:x}),window.clearTimeout(c.current),c.current=window.setTimeout(()=>i.onPointerGraceIntentChange(null),300)}else{if(i.onTriggerLeave(h),h.defaultPrevented)return;i.onPointerGraceIntentChange(null)}})),onKeyDown:ve(e.onKeyDown,h=>{const v=i.searchRef.current!=="";e.disabled||v&&h.key===" "||Oq[r.dir].includes(h.key)&&(n.onOpenChange(!0),n.content?.focus(),h.preventDefault())})})})});WP.displayName=Ka;var UP="MenuSubContent",KP=m.forwardRef((e,t)=>{const n=RP(vn,e.__scopeMenu),{forceMount:r=n.forceMount,...o}=e,i=ms(vn,e.__scopeMenu),l=zl(vn,e.__scopeMenu),c=BP(UP,e.__scopeMenu),d=m.useRef(null),f=De(t,d);return p.jsx(vl.Provider,{scope:e.__scopeMenu,children:p.jsx(Pt,{present:r||i.open,children:p.jsx(vl.Slot,{scope:e.__scopeMenu,children:p.jsx(Fy,{id:c.contentId,"aria-labelledby":c.triggerId,...o,ref:f,align:"start",side:l.dir==="rtl"?"left":"right",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:g=>{l.isUsingKeyboardRef.current&&d.current?.focus(),g.preventDefault()},onCloseAutoFocus:g=>g.preventDefault(),onFocusOutside:ve(e.onFocusOutside,g=>{g.target!==c.trigger&&i.onOpenChange(!1)}),onEscapeKeyDown:ve(e.onEscapeKeyDown,g=>{l.onClose(),g.preventDefault()}),onKeyDown:ve(e.onKeyDown,g=>{const h=g.currentTarget.contains(g.target),v=$q[l.dir].includes(g.key);h&&v&&(i.onOpenChange(!1),c.trigger?.focus(),g.preventDefault())})})})})})});KP.displayName=UP;function GP(e){return e?"open":"closed"}function xd(e){return e==="indeterminate"}function Hy(e){return xd(e)?"indeterminate":e?"checked":"unchecked"}function rZ(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function oZ(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function sZ(e,t,n){const o=t.length>1&&Array.from(t).every(f=>f===t[0])?t[0]:t,i=n?e.indexOf(n):-1;let l=oZ(e,Math.max(i,0));o.length===1&&(l=l.filter(f=>f!==n));const d=l.find(f=>f.toLowerCase().startsWith(o.toLowerCase()));return d!==n?d:void 0}function iZ(e,t){const{x:n,y:r}=e;let o=!1;for(let i=0,l=t.length-1;i<t.length;l=i++){const c=t[i],d=t[l],f=c.x,g=c.y,h=d.x,v=d.y;g>r!=v>r&&n<(h-f)*(r-g)/(v-g)+f&&(o=!o)}return o}function aZ(e,t){if(!t)return!1;const n={x:e.clientX,y:e.clientY};return iZ(n,t)}function xl(e){return t=>t.pointerType==="mouse"?e(t):void 0}var lZ=PP,cZ=Oy,uZ=IP,dZ=_P,fZ=zy,pZ=AP,hZ=Nf,gZ=DP,mZ=OP,yZ=LP,vZ=zP,xZ=VP,wZ=HP,bZ=WP,SZ=KP,kf="DropdownMenu",[CZ]=Ft(kf,[kP]),zt=kP(),[EZ,YP]=CZ(kf),XP=e=>{const{__scopeDropdownMenu:t,children:n,dir:r,open:o,defaultOpen:i,onOpenChange:l,modal:c=!0}=e,d=zt(t),f=m.useRef(null),[g,h]=cn({prop:o,defaultProp:i??!1,onChange:l,caller:kf});return p.jsx(EZ,{scope:t,triggerId:kt(),triggerRef:f,contentId:kt(),open:g,onOpenChange:h,onOpenToggle:m.useCallback(()=>h(v=>!v),[h]),modal:c,children:p.jsx(lZ,{...d,open:g,onOpenChange:h,dir:r,modal:c,children:n})})};XP.displayName=kf;var qP="DropdownMenuTrigger",ZP=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,disabled:r=!1,...o}=e,i=YP(qP,n),l=zt(n);return p.jsx(cZ,{asChild:!0,...l,children:p.jsx(ke.button,{type:"button",id:i.triggerId,"aria-haspopup":"menu","aria-expanded":i.open,"aria-controls":i.open?i.contentId:void 0,"data-state":i.open?"open":"closed","data-disabled":r?"":void 0,disabled:r,...o,ref:Xt(t,i.triggerRef),onPointerDown:ve(e.onPointerDown,c=>{!r&&c.button===0&&c.ctrlKey===!1&&(i.onOpenToggle(),i.open||c.preventDefault())}),onKeyDown:ve(e.onKeyDown,c=>{r||(["Enter"," "].includes(c.key)&&i.onOpenToggle(),c.key==="ArrowDown"&&i.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(c.key)&&c.preventDefault())})})})});ZP.displayName=qP;var NZ="DropdownMenuPortal",QP=e=>{const{__scopeDropdownMenu:t,...n}=e,r=zt(t);return p.jsx(uZ,{...r,...n})};QP.displayName=NZ;var JP="DropdownMenuContent",eR=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=YP(JP,n),i=zt(n),l=m.useRef(!1);return p.jsx(dZ,{id:o.contentId,"aria-labelledby":o.triggerId,...i,...r,ref:t,onCloseAutoFocus:ve(e.onCloseAutoFocus,c=>{l.current||o.triggerRef.current?.focus(),l.current=!1,c.preventDefault()}),onInteractOutside:ve(e.onInteractOutside,c=>{const d=c.detail.originalEvent,f=d.button===0&&d.ctrlKey===!0,g=d.button===2||f;(!o.modal||g)&&(l.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});eR.displayName=JP;var kZ="DropdownMenuGroup",TZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(fZ,{...o,...r,ref:t})});TZ.displayName=kZ;var PZ="DropdownMenuLabel",RZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(pZ,{...o,...r,ref:t})});RZ.displayName=PZ;var IZ="DropdownMenuItem",tR=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(hZ,{...o,...r,ref:t})});tR.displayName=IZ;var _Z="DropdownMenuCheckboxItem",AZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(gZ,{...o,...r,ref:t})});AZ.displayName=_Z;var MZ="DropdownMenuRadioGroup",DZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(mZ,{...o,...r,ref:t})});DZ.displayName=MZ;var jZ="DropdownMenuRadioItem",OZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(yZ,{...o,...r,ref:t})});OZ.displayName=jZ;var $Z="DropdownMenuItemIndicator",LZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(vZ,{...o,...r,ref:t})});LZ.displayName=$Z;var FZ="DropdownMenuSeparator",zZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(xZ,{...o,...r,ref:t})});zZ.displayName=FZ;var VZ="DropdownMenuArrow",HZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(wZ,{...o,...r,ref:t})});HZ.displayName=VZ;var BZ="DropdownMenuSubTrigger",WZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(bZ,{...o,...r,ref:t})});WZ.displayName=BZ;var UZ="DropdownMenuSubContent",KZ=m.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=zt(n);return p.jsx(SZ,{...o,...r,ref:t,style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});KZ.displayName=UZ;var GZ=XP,YZ=ZP,XZ=QP,qZ=eR,ZZ=tR;const hg=[{code:"de",name:"Deutsch",flag:"🇩🇪"},{code:"en",name:"English",flag:"🇺🇸"}];function QZ({language:e,onChange:t}){const{t:n}=Xe(),r=hg.find(o=>o.code===e)??hg[1];return p.jsxs(GZ,{children:[p.jsx(YZ,{asChild:!0,children:p.jsxs("button",{className:"flex items-center gap-1.5 text-muted-foreground hover:text-foreground p-1.5 rounded hover:bg-muted/50 transition-colors",title:n("a11y.changeLanguage"),"aria-label":n("a11y.changeLanguage"),children:[p.jsx(bz,{className:"h-4 w-4"}),p.jsx("span",{className:"hidden sm:inline text-sm",children:r.flag})]})}),p.jsx(XZ,{children:p.jsx(qZ,{align:"end",sideOffset:4,className:"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2",children:hg.map(o=>p.jsxs(ZZ,{onSelect:()=>t(o.code),className:"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground",children:[p.jsx("span",{children:o.flag}),p.jsx("span",{children:o.name}),e===o.code&&p.jsx("span",{className:"ml-auto text-primary",children:"✓"})]},o.code))})})]})}function Qs({icon:e,onClick:t,variant:n="secondary",disabled:r=!1,title:o,children:i}){const l=n==="primary"?"bg-primary text-primary-foreground hover:opacity-90":"bg-secondary text-secondary-foreground hover:bg-muted";return p.jsxs("button",{onClick:t,disabled:r,title:o,className:`inline-flex items-center gap-1.5 px-3 py-1 text-sm rounded border border-border transition-colors disabled:opacity-40 disabled:pointer-events-none ${l}`,children:[p.jsx(e,{className:"w-4 h-4"}),i]})}const JZ=[{id:"claude-opus-4-6",label:"Claude Opus 4.6",capabilities:["chat"]},{id:"claude-sonnet-4-6",label:"Claude Sonnet 4.6",capabilities:["chat"]},{id:"claude-haiku-4-5",label:"Claude Haiku 4.5",capabilities:["chat"]}],Ti=new URLSearchParams(window.location.search).get("file"),eQ=e=>e.split(/[\\/]/).pop()??e,tQ=typeof window<"u"&&"showOpenFilePicker"in window,nQ=typeof window<"u"&&"showSaveFilePicker"in window,rQ=Ti?{kind:"path",path:Ti}:null,oQ=Ti?eQ(Ti):null,r1=[{description:"Workflow JSON",accept:{"application/json":[".json"]}}];function sQ(){const{t:e}=Xe(),t=m.useRef(null),n=m.useRef(null),r=m.useRef(!1),o=m.useRef(!1),[i,l]=m.useState(!1),[c,d]=m.useState(!1),[f,g]=m.useState(!1),[h,v]=m.useState(()=>localStorage.getItem("fh-theme")==="light"?"light":"dark"),[x,S]=m.useState(()=>localStorage.getItem(xg)==="de"?"de":"en"),[w,E]=m.useState(rQ),[b,N]=m.useState(oQ);m.useEffect(()=>{document.documentElement.classList.toggle("light",h==="light"),localStorage.setItem("fh-theme",h)},[h]),m.useEffect(()=>{Tt.changeLanguage(x),localStorage.setItem(xg,x)},[x]),m.useEffect(()=>{const B=b??"Untitled.json";document.title=`${i?"• ":""}${B} — ForestHub Builder`},[b,i]),m.useEffect(()=>{o.current||!Ti||(o.current=!0,fetch(`/api/file?path=${encodeURIComponent(Ti)}`).then(async B=>{if(B.status===404)return null;if(!B.ok)throw new Error(`${B.status} ${await B.text()}`);return B.json()}).then(B=>{B&&(r.current=!0,t.current?.loadWorkflow(B),queueMicrotask(()=>{r.current=!1,l(!1)}))}).catch(B=>Gt({title:e("toast.loadFailed"),description:B.message,variant:"destructive"})))},[e]);const k=m.useCallback((B,G,I)=>{let O;try{O=JSON.parse(B)}catch{Gt({title:e("toast.loadFailed"),description:e("error.invalidJson"),variant:"destructive"});return}r.current=!0,t.current?.loadWorkflow(O),queueMicrotask(()=>{r.current=!1,l(!1),N(G),E(I)})},[e]),P=m.useCallback(async()=>{if(!(i&&!window.confirm(e("confirm.discard")))){if(tQ){try{const[B]=await window.showOpenFilePicker({types:r1});if(!B)return;const G=await B.getFile();k(await G.text(),B.name,{kind:"handle",handle:B})}catch(B){if(B instanceof DOMException&&B.name==="AbortError")return;Gt({title:e("toast.loadFailed"),description:B instanceof Error?B.message:String(B),variant:"destructive"})}return}n.current?.click()}},[i,e,k]),A=m.useCallback(B=>{const G=B.target.files?.[0];G&&(G.text().then(I=>k(I,G.name,null)).catch(I=>Gt({title:e("toast.loadFailed"),description:I.message,variant:"destructive"})),B.target.value="")},[k,e]),R=m.useCallback(async()=>{const B=t.current?.exportWorkflow();if(!B)return;const G=JSON.stringify(B,null,2);if(w?.kind==="path"){try{const V=await fetch(`/api/file?path=${encodeURIComponent(w.path)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:G});if(!V.ok)throw new Error(`${V.status} ${await V.text()}`);l(!1)}catch(V){Gt({title:e("toast.saveFailed"),description:V instanceof Error?V.message:String(V),variant:"destructive"})}return}if(w?.kind==="handle"){try{const V=await w.handle.createWritable();await V.write(G),await V.close(),l(!1)}catch(V){Gt({title:e("toast.saveFailed"),description:V instanceof Error?V.message:String(V),variant:"destructive"})}return}if(nQ){try{const V=await window.showSaveFilePicker({suggestedName:b??"workflow.json",types:r1}),z=await V.createWritable();await z.write(G),await z.close(),E({kind:"handle",handle:V}),N(V.name),l(!1)}catch(V){if(V instanceof DOMException&&V.name==="AbortError")return;Gt({title:e("toast.saveFailed"),description:V instanceof Error?V.message:String(V),variant:"destructive"})}return}const I=new Blob([G],{type:"application/json"}),O=URL.createObjectURL(I),D=document.createElement("a");D.href=O,D.download=b??`workflow-${new Date().toISOString().replace(/[:.]/g,"-")}.json`,D.click(),URL.revokeObjectURL(O),l(!1)},[w,b,e]),_=m.useCallback(()=>{i&&!window.confirm(e("confirm.discard"))||(r.current=!0,t.current?.clear(),queueMicrotask(()=>{r.current=!1,l(!1),w?.kind!=="path"&&(E(null),N(null))}))},[i,w,e]),M=m.useCallback(()=>{t.current?.validate()},[]),$=m.useCallback(()=>{r.current||l(!0)},[]),U=m.useCallback(B=>{d(B.canUndo),g(B.canRedo)},[]),L=m.useCallback(B=>{Gt({title:e("toast.error"),description:B.message,variant:"destructive"})},[e]);return m.useEffect(()=>{const B=G=>{(G.metaKey||G.ctrlKey)&&!G.shiftKey&&G.key.toLowerCase()==="s"&&(G.preventDefault(),R())};return document.addEventListener("keydown",B),()=>document.removeEventListener("keydown",B)},[R]),p.jsxs("div",{className:"h-full flex flex-col",children:[p.jsxs("header",{className:"flex items-center gap-2 px-3 py-2 border-b border-border bg-card",children:[p.jsx(Qs,{icon:O1,onClick:_,children:e("toolbar.new")}),p.jsx(Qs,{icon:wz,onClick:P,children:e("toolbar.open")}),p.jsx(Qs,{icon:Iz,variant:"primary",onClick:R,children:e("toolbar.save")}),p.jsx(Qs,{icon:D1,onClick:M,children:e("toolbar.validate")}),p.jsx("div",{className:"mx-1 h-5 w-px bg-border","aria-hidden":!0}),p.jsx(Qs,{icon:Dz,onClick:()=>t.current?.undo(),disabled:!c,children:e("toolbar.undo")}),p.jsx(Qs,{icon:Pz,onClick:()=>t.current?.redo(),disabled:!f,children:e("toolbar.redo")}),p.jsxs("div",{className:"flex-1 min-w-0 flex items-center justify-center gap-1.5 text-sm font-mono text-muted-foreground",title:w?.kind==="path"?w.path:b??"no file",children:[p.jsx("span",{className:"truncate",children:b??"Untitled.json"}),p.jsx("span",{className:"shrink-0 w-2 text-center text-foreground","aria-hidden":!0,children:i?"•":""})]}),p.jsx(Tq,{theme:h,onToggle:()=>v(B=>B==="dark"?"light":"dark")}),p.jsx(QZ,{language:x,onChange:S}),p.jsx("input",{ref:n,type:"file",accept:"application/json,.json",className:"hidden","aria-label":e("toolbar.open"),onChange:A})]}),p.jsx("main",{className:"flex-1 min-h-0",children:p.jsx(kq,{ref:t,models:JZ,language:x,onChange:$,onHistoryChange:U,onError:L})})]})}const nR=document.getElementById("root");if(!nR)throw new Error("#root not found");BI.createRoot(nR).render(p.jsx(m.StrictMode,{children:p.jsx(sQ,{})}));
package/dist/index.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" href="/favicon.png" type="image/png" />
7
7
  <title>ForestHub Builder</title>
8
- <script type="module" crossorigin src="/assets/index-B7syExE5.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-LJpK2FES.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-CnM-MQ9w.css">
10
10
  </head>
11
11
  <body class="bg-background text-foreground">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foresthubai/workflow-cli",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "type": "module",
5
5
  "description": "fh-workflow CLI — author, validate, and visually edit ForestHub workflow JSON. Bundles the visual builder; no other install required.",
6
6
  "license": "AGPL-3.0-only",