next-workflow-builder 0.7.0 → 0.7.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.
- package/CHANGELOG.md +30 -0
- package/dist/chunk-3YVRTDK2.js +1 -0
- package/dist/chunk-4BSNRZZU.js +42 -0
- package/dist/{chunk-CYVALTSI.js → chunk-5M2LRKT5.js} +9 -9
- package/dist/chunk-HJKTLN6E.js +1 -0
- package/dist/chunk-VUDOAZ3W.js +14 -0
- package/dist/client/index.js +36 -17
- package/dist/{condition-CFAA7UDI.js → condition-CEH7OSFJ.js} +1 -1
- package/dist/handler-PF3O3IEZ.js +1 -0
- package/dist/{loop-5LPVY452.js → loop-E2EVYWUK.js} +1 -1
- package/dist/{merge-HYBHX22D.js → merge-XFCABPCI.js} +1 -1
- package/dist/next/index.js +1 -1
- package/dist/run-workflow-KBAEB2FV.js +1 -0
- package/dist/run-workflows-in-sequence-S44K3HKF.js +1 -0
- package/dist/server/api/index.js +10 -10
- package/dist/server/index.js +1 -1
- package/dist/styles.css +32 -0
- package/dist/{switch-ZPVREROE.js → switch-FN4UA62F.js} +1 -1
- package/package.json +1 -1
- package/dist/chunk-DMHGXYVW.js +0 -14
- package/dist/chunk-HB2H2PVI.js +0 -42
- package/dist/handler-NWAMWKXW.js +0 -1
package/dist/client/index.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
"use client";import{a as
|
|
2
|
-
`);n.buffer=r.pop()||"";for(let s of r)Pc(s,o,n)}var Dc={generate:(e,t)=>ye("/api/ai/generate",{method:"POST",body:JSON.stringify({prompt:e,existingWorkflow:t})}),generateStream:async(e,t,o)=>{let n=await fetch("/api/ai/generate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:e,existingWorkflow:o})});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);if(!n.body)throw new Error("No response body");let r=n.body.getReader(),s=new TextDecoder,a={buffer:"",currentData:o?{nodes:o.nodes||[],edges:o.edges||[],name:o.name}:{nodes:[],edges:[]}};try{for(;;){let{done:l,value:i}=await r.read();if(l)break;Ec(i,s,t,a)}return a.currentData}finally{r.releaseLock()}}},Rc={getAll:e=>ye(`/api/integrations${e?`?type=${e}`:""}`),get:e=>ye(`/api/integrations/${e}`),create:e=>ye("/api/integrations",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>ye(`/api/integrations/${e}`,{method:"PUT",body:JSON.stringify(t)}),delete:e=>ye(`/api/integrations/${e}`,{method:"DELETE"}),testConnection:e=>ye(`/api/integrations/${e}/test`,{method:"POST"}),testCredentials:e=>ye("/api/integrations/test",{method:"POST",body:JSON.stringify(e)})},Oc={get:()=>ye("/api/user"),update:e=>ye("/api/user",{method:"PATCH",body:JSON.stringify(e)})},nr={getAll:()=>ye("/api/workflows"),getById:e=>ye(`/api/workflows/${e}`),create:e=>ye("/api/workflows/create",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>ye(`/api/workflows/${e}`,{method:"PATCH",body:JSON.stringify(t)}),delete:e=>ye(`/api/workflows/${e}`,{method:"DELETE"}),duplicate:e=>ye(`/api/workflows/${e}/duplicate`,{method:"POST"}),getCurrent:()=>ye("/api/workflows/current"),saveCurrent:(e,t)=>ye("/api/workflows/current",{method:"POST",body:JSON.stringify({nodes:e,edges:t})}),execute:(e,t={})=>ye(`/api/workflow/${e}/execute`,{method:"POST",body:JSON.stringify({input:t})}),triggerWebhook:(e,t={})=>ye(`/api/workflows/${e}/webhook`,{method:"POST",body:JSON.stringify(t)}),getCode:e=>ye(`/api/workflows/${e}/code`),getExecutions:e=>ye(`/api/workflows/${e}/executions`),deleteExecutions:e=>ye(`/api/workflows/${e}/executions`,{method:"DELETE"}),getExecutionLogs:e=>ye(`/api/workflows/executions/${e}/logs`),getExecutionStatus:e=>ye(`/api/workflows/executions/${e}/status`),download:e=>ye(`/api/workflows/${e}/download`),autoSaveCurrent:(()=>{let e=null,t=2e3;return(o,n)=>{e&&clearTimeout(e),e=setTimeout(()=>{nr.saveCurrent(o,n).catch(r=>{console.error("Auto-save failed:",r)})},t)}})(),autoSaveWorkflow:(()=>{let e=null,t=2e3;return(o,n,r=!0)=>{if(!r)return nr.update(o,n);e&&clearTimeout(e),e=setTimeout(()=>{nr.update(o,n).catch(s=>{console.error("Auto-save failed:",s)})},t)}})()},Lc={getStatus:()=>ye("/api/ai-gateway/status"),getTeams:()=>ye("/api/ai-gateway/teams"),consent:(e,t)=>ye("/api/ai-gateway/consent",{method:"POST",body:JSON.stringify({teamId:e,teamName:t})}),revokeConsent:()=>ye("/api/ai-gateway/consent",{method:"DELETE"})},q={ai:Dc,aiGateway:Lc,integration:Rc,user:Oc,workflow:nr};import{atom as An}from"jotai";var mt=An([]),rr=An(!1),hv=An(null),Pt=An(0),_s=An(e=>{let t=e(mt);return new Set(t.map(o=>o.id))});import{applyEdgeChanges as Mc,applyNodeChanges as Fc}from"@xyflow/react";import{atom as ae}from"jotai";var oe=ae([]),ue=ae([]),be=ae(null),_e=ae(null),Ks=ae(!1),$s=ae(!1),wt=ae(!1),$e=ae(null),pt=ae(""),ar=ae("private"),Xt=ae(!0),Ft=ae("properties"),sr=ae(!1),Qt=ae(null),ir=ae(null),lr=ae(!1),dr=ae(!1),js=ae(!1),cr=ae(!1),ur=ae(new Set),Jt=ae(null),mr=ae(!1),pr=ae({}),ya=null,zc=1e3,Lt=ae(null,async(e,t,o)=>{let n=e($e),r=e(oe),s=e(ue);if(!n)return;let a=async()=>{try{await q.workflow.update(n,{nodes:r,edges:s}),t(tt,!1)}catch(l){console.error("Autosave failed:",l)}};o?.immediate?await a():(ya&&clearTimeout(ya),ya=setTimeout(a,zc))}),qs=ae(null,(e,t,o)=>{let n=e(oe),r=o.filter(d=>d.type==="remove"?n.find(u=>u.id===d.id)?.data.type!=="trigger":!0),s=Fc(r,n);t(oe,s);let a=s.find(d=>d.selected);if(a){t(be,a.id),t(_e,null);let d=e(Jt);d&&d!==a.id&&t(Jt,null)}else if(e(be)){let d=e(be);s.find(u=>u.id===d)||t(be,null),t(Jt,null)}if(r.some(d=>d.type==="remove")){t(Lt,{immediate:!0});return}r.some(d=>d.type==="position"&&d.dragging===!1)&&t(Lt)}),Ys=ae(null,(e,t,o)=>{let n=e(ue),r=Mc(o,n);t(ue,r);let s=r.find(l=>l.selected);if(s)t(_e,s.id),t(be,null);else if(e(_e)){let l=e(_e);r.find(d=>d.id===l)||t(_e,null)}o.some(l=>l.type==="remove")&&t(Lt,{immediate:!0})}),Vo=ae(null,(e,t,o)=>{let n=e(oe),r=e(ue),s=e(et);t(et,[...s,{nodes:n,edges:r}]),t(Mt,[]);let a=n.map(d=>({...d,selected:!1})),l={...o,selected:!0},i=[...a,l];t(oe,i),t(be,o.id),o.data.type==="action"&&!o.data.config?.actionType&&t(Jt,o.id),t(tt,!0),t(Lt,{immediate:!0})}),Zt=ae(null,(e,t,{id:o,data:n})=>{let r=e(oe),a=r.find(c=>c.id===o)?.data.label,l=n.label,i=l!==void 0&&a!==l,d=r.map(c=>{if(c.id===o)return{...c,data:{...c.data,...n}};if(i&&a){let u=Js(c.data.config||{},o,a,l);if(u!==c.data.config)return{...c,data:{...c.data,config:u}}}return c});t(oe,d),n.status||(t(tt,!0),t(Lt))});function Js(e,t,o,n){let r=!1,s={};for(let[a,l]of Object.entries(e))if(typeof l=="string"){let i=new RegExp(`\\{\\{@${Us(t)}:${Us(o)}(\\.[^}]+)?\\}\\}`,"g"),d=l.replace(i,(c,u)=>(r=!0,`{{@${t}:${n}${u||""}}}`));s[a]=d}else if(typeof l=="object"&&l!==null&&!Array.isArray(l)){let i=Js(l,t,o,n);i!==l&&(r=!0),s[a]=i}else s[a]=l;return r?s:e}function Us(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var eo=ae(null,(e,t,o)=>{let n=e(oe);if(n.find(d=>d.id===o)?.data.type==="trigger")return;let s=e(ue),a=e(et);t(et,[...a,{nodes:n,edges:s}]),t(Mt,[]);let l=n.filter(d=>d.id!==o),i=s.filter(d=>d.source!==o&&d.target!==o);t(oe,l),t(ue,i),e(be)===o&&t(be,null),t(tt,!0),t(Lt,{immediate:!0})}),to=ae(null,(e,t,o)=>{let n=e(oe),r=e(ue),s=e(et);t(et,[...s,{nodes:n,edges:r}]),t(Mt,[]);let a=r.filter(l=>l.id!==o);t(ue,a),e(_e)===o&&t(_e,null),t(tt,!0),t(Lt,{immediate:!0})}),Xs=ae(null,(e,t)=>{let o=e(oe),n=e(ue),r=e(et);t(et,[...r,{nodes:o,edges:n}]),t(Mt,[]);let s=o.filter(i=>i.selected&&i.data.type!=="trigger").map(i=>i.id),a=o.filter(i=>i.data.type==="trigger"?!0:!i.selected),l=n.filter(i=>!(i.selected||s.includes(i.source)||s.includes(i.target)));t(oe,a),t(ue,l),t(be,null),t(_e,null),t(tt,!0),t(Lt,{immediate:!0})}),fr=ae(null,(e,t)=>{let o=e(oe),n=e(ue),r=e(et);t(et,[...r,{nodes:o,edges:n}]),t(Mt,[]),t(oe,[]),t(ue,[]),t(be,null),t(_e,null),t(tt,!0)}),kv=ae(null,async(e,t)=>{try{t($s,!0);let o=await q.workflow.getCurrent();t(oe,o.nodes),t(ue,o.edges),o.id&&t($e,o.id)}catch(o){console.error("Failed to load workflow:",o)}finally{t($s,!1)}}),Cv=ae(null,async(e,t,{name:o,description:n})=>{let r=e(oe),s=e(ue);try{return await q.workflow.create({name:o,description:n,nodes:r,edges:s})}catch(a){throw console.error("Failed to save workflow:",a),a}}),Qs=ae(!1),Zs=ae(!1),gr=ae(!1),tt=ae(!1),ei=ae(!1),et=ae([]),Mt=ae([]),ti=ae(null,(e,t)=>{let o=e(et);if(o.length===0)return;let n=e(oe),r=e(ue),s=e(Mt);t(Mt,[...s,{nodes:n,edges:r}]);let a=[...o],l=a.pop();l&&(t(et,a),t(oe,l.nodes),t(ue,l.edges),t(tt,!0))}),oi=ae(null,(e,t)=>{let o=e(Mt);if(o.length===0)return;let n=e(oe),r=e(ue),s=e(et);t(et,[...s,{nodes:n,edges:r}]);let a=[...o],l=a.pop();l&&(t(Mt,a),t(oe,l.nodes),t(ue,l.edges),t(tt,!0))}),ni=ae(e=>e(et).length>0),ri=ae(e=>e(Mt).length>0),yr=ae(null,(e,t)=>{let n=e(oe).map(r=>({...r,data:{...r.data,status:"idle"}}));t(oe,n)});import*as vr from"react";var va=768;function zt(){let[e,t]=vr.useState(void 0);return vr.useEffect(()=>{let o=window.matchMedia(`(max-width: ${va-1}px)`),n=()=>{t(window.innerWidth<va)};return o.addEventListener("change",n),t(window.innerWidth<va),()=>o.removeEventListener("change",n)},[]),!!e}import{Slot as Wc}from"radix-ui";import{cva as Bc}from"class-variance-authority";import{jsx as Vc}from"react/jsx-runtime";var hr=Bc("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-sm":"size-8","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function O({className:e,variant:t,size:o,asChild:n=!1,...r}){let s=n?Wc.Slot:"button";return Vc(s,{"data-slot":"button",className:x(hr({variant:t,size:o,className:e})),...r})}var Gc={"Database Query":"database"};function Hc(e){return pe(e)?.integration||Gc[e]}function ai(e,t,o){let n=e.data.config?.actionType;if(!n)return null;let r=Hc(n);if(!r)return null;let s=e.data.config?.integrationId;if(s&&o.has(s))return null;let l=t.filter(i=>i.type===r);return l.length===1?{nodeId:e.id,newIntegrationId:l[0].id}:l.length===0&&s?{nodeId:e.id,newIntegrationId:void 0}:null}import{useAtom as io,useAtomValue as Ya,useSetAtom as lo}from"jotai";import{Copy as xl,Eraser as Ja,Eye as Tp,EyeOff as Ap,FileCode as Nl,RefreshCw as kl,Trash2 as jr}from"lucide-react";import{useCallback as Sp,useEffect as Cl,useMemo as Ip,useRef as Tl,useState as Bn}from"react";import{toast as Kr}from"sonner";import{AlertDialog as oo}from"radix-ui";import{jsx as Et,jsxs as Uc}from"react/jsx-runtime";function Go({...e}){return Et(oo.Root,{"data-slot":"alert-dialog",...e})}function _c({...e}){return Et(oo.Portal,{"data-slot":"alert-dialog-portal",...e})}function $c({className:e,...t}){return Et(oo.Overlay,{"data-slot":"alert-dialog-overlay",className:x("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",e),...t})}function Ho({className:e,...t}){return Uc(_c,{children:[Et($c,{}),Et(oo.Content,{"data-slot":"alert-dialog-content",className:x("bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",e),...t})]})}function _o({className:e,...t}){return Et("div",{"data-slot":"alert-dialog-header",className:x("flex flex-col gap-2 text-center sm:text-left",e),...t})}function $o({className:e,...t}){return Et("div",{"data-slot":"alert-dialog-footer",className:x("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",e),...t})}function Uo({className:e,...t}){return Et(oo.Title,{"data-slot":"alert-dialog-title",className:x("text-lg font-semibold",e),...t})}function Ko({className:e,...t}){return Et(oo.Description,{"data-slot":"alert-dialog-description",className:x("text-muted-foreground text-sm",e),...t})}function jo({className:e,...t}){return Et(oo.Action,{className:x(hr(),e),...t})}function qo({className:e,...t}){return Et(oo.Cancel,{className:x(hr({variant:"outline"}),e),...t})}import Kc from"@monaco-editor/react";import{useTheme as jc}from"next-themes";var si={base:"vs-dark",inherit:!0,rules:[{token:"",foreground:"ededed"},{token:"comment",foreground:"a1a1a1",fontStyle:"italic"},{token:"keyword",foreground:"ff4d8d"},{token:"keyword.operator",foreground:"ff4d8d"},{token:"string",foreground:"00ca50"},{token:"string.escape",foreground:"00ca50"},{token:"number",foreground:"ffffff"},{token:"type",foreground:"47a8ff"},{token:"type.identifier",foreground:"47a8ff"},{token:"identifier",foreground:"ededed"},{token:"parameter",foreground:"ededed"},{token:"variable",foreground:"ededed"},{token:"variable.parameter",foreground:"ededed"},{token:"function",foreground:"c472fb"},{token:"identifier.function",foreground:"c472fb"},{token:"member.function",foreground:"c472fb"},{token:"constant.language",foreground:"47a8ff"},{token:"keyword.json",foreground:"47a8ff"},{token:"variable.predefined",foreground:"ededed"},{token:"support.variable",foreground:"ededed"},{token:"support.constant",foreground:"ededed"},{token:"delimiter",foreground:"ededed"},{token:"delimiter.bracket",foreground:"ededed"},{token:"delimiter.parenthesis",foreground:"ededed"},{token:"delimiter.curly",foreground:"ededed"},{token:"delimiter.array",foreground:"ededed"},{token:"punctuation",foreground:"ededed"},{token:"operator",foreground:"ededed"},{token:"string.key.json",foreground:"47a8ff"},{token:"string.value.json",foreground:"00ca50"},{token:"number.json",foreground:"ffffff"},{token:"keyword.json",foreground:"47a8ff"}],colors:{"editor.background":"#000000","editor.foreground":"#ededed","editorLineNumber.foreground":"#444444","editorLineNumber.activeForeground":"#888888","editor.lineHighlightBackground":"#0A0A0A","editor.selectionBackground":"#264F78","editor.inactiveSelectionBackground":"#1A1A1A","editorCursor.foreground":"#FFFFFF","editorWhitespace.foreground":"#333333","editorIndentGuide.background":"#1A1A1A","editorIndentGuide.activeBackground":"#333333","editorBracketMatch.background":"#0A0A0A","editorBracketMatch.border":"#444444"}};import{jsx as qc}from"react/jsx-runtime";function ft(e){let{resolvedTheme:t}=jc();return qc(Kc,{...e,onMount:(n,r)=>{r.editor.defineTheme("vercel-dark",si),r.editor.setTheme(t==="dark"?"vercel-dark":"light"),e.onMount&&e.onMount(n,r)},theme:t==="dark"?"vercel-dark":"light"})}import{jsx as Yc}from"react/jsx-runtime";function se({className:e,type:t,...o}){return Yc("input",{type:t,"data-slot":"input",className:x("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground bg-transparent border-input h-9 w-full min-w-0 rounded-md border px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",e),...o})}import{Label as Jc}from"radix-ui";import{jsx as Xc}from"react/jsx-runtime";function F({className:e,...t}){return Xc(Jc.Root,{"data-slot":"label",className:x("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",e),...t})}import{Tabs as br}from"radix-ui";import{jsx as wr}from"react/jsx-runtime";function ha({className:e,...t}){return wr(br.Root,{"data-slot":"tabs",className:x("flex flex-col gap-2",e),...t})}function ba({className:e,...t}){return wr(br.List,{"data-slot":"tabs-list",className:x("bg-muted text-muted-foreground inline-flex h-10 w-fit items-center justify-center rounded-lg p-[3px]",e),...t})}function vo({className:e,...t}){return wr(br.Trigger,{"data-slot":"tabs-trigger",className:x("data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-sm border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...t})}function ho({className:e,...t}){return wr(br.Content,{"data-slot":"tabs-content",className:x("flex-1 outline-none",e),...t})}import{useAtomValue as Ji,useSetAtom as xm}from"jotai";import{HelpCircle as Nm,Plus as km,Settings as Cm}from"lucide-react";import{useEffect as Tm,useMemo as Lr,useState as Am}from"react";import{Select as ot}from"radix-ui";import{CheckIcon as Qc,ChevronDownIcon as ii,ChevronUpIcon as Zc}from"lucide-react";import{jsx as ze,jsxs as wa}from"react/jsx-runtime";function ke({...e}){return ze(ot.Root,{"data-slot":"select",...e})}function li({...e}){return ze(ot.Group,{"data-slot":"select-group",...e})}function Ce({...e}){return ze(ot.Value,{"data-slot":"select-value",...e})}function Te({className:e,size:t="default",children:o,...n}){return wa(ot.Trigger,{"data-slot":"select-trigger","data-size":t,className:x("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-transparent hover:bg-accent/50 flex w-fit items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...n,children:[o,ze(ot.Icon,{asChild:!0,children:ze(ii,{className:"size-4 opacity-50"})})]})}function Ae({className:e,children:t,position:o="popper",align:n="center",...r}){return ze(ot.Portal,{children:wa(ot.Content,{"data-slot":"select-content",className:x("bg-popover text-popover-foreground 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=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",o==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:o,align:n,...r,children:[ze(eu,{}),ze(ot.Viewport,{className:x("p-1",o==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),children:t}),ze(tu,{})]})})}function di({className:e,...t}){return ze(ot.Label,{"data-slot":"select-label",className:x("text-muted-foreground px-2 py-1.5 text-xs",e),...t})}function ie({className:e,children:t,...o}){return wa(ot.Item,{"data-slot":"select-item",className:x("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",e),...o,children:[ze("span",{className:"absolute right-2 flex size-3.5 items-center justify-center",children:ze(ot.ItemIndicator,{children:ze(Qc,{className:"size-4"})})}),ze(ot.ItemText,{children:t})]})}function xr({className:e,...t}){return ze(ot.Separator,{"data-slot":"select-separator",className:x("bg-border pointer-events-none -mx-1 my-1 h-px",e),...t})}function eu({className:e,...t}){return ze(ot.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:x("flex cursor-default items-center justify-center py-1",e),...t,children:ze(Zc,{className:"size-4"})})}function tu({className:e,...t}){return ze(ot.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:x("flex cursor-default items-center justify-center py-1",e),...t,children:ze(ii,{className:"size-4"})})}import{useAtom as mi}from"jotai";import{useEffect as xa,useRef as Na,useState as Yo}from"react";import{useAtom as ci}from"jotai";import{Check as ou}from"lucide-react";import{useEffect as Nr,useRef as nu,useState as ui}from"react";import{createPortal as ru}from"react-dom";import{Fragment as lu,jsx as Sn,jsxs as kr}from"react/jsx-runtime";var au=e=>{if(e.data.label)return e.data.label;if(e.data.type==="action"){let t=e.data.config?.actionType;if(t){let o=pe(t);if(o?.label)return o.label}return t||"HTTP Request"}return e.data.type==="trigger"?e.data.config?.triggerType||"Manual":"Node"},In=(e,t="")=>{let o=[];for(let n of e){let r=t?`${t}.${n.name}`:n.name,s=n.type==="array"?`${n.itemType}[]`:n.type,a=n.description||`${s}`;if(o.push({field:r,description:a}),n.type==="object"&&n.fields&&n.fields.length>0&&o.push(...In(n.fields,r)),n.type==="array"&&n.itemType==="object"&&n.fields&&n.fields.length>0){let l=`${r}[0]`;o.push(...In(n.fields,l))}}return o},su=(e,...t)=>e?t.some(o=>e===o||e.endsWith(`/${o.toLowerCase().replace(/\s+/g,"-")}`)):!1,iu=e=>{let t=e.data.config?.actionType;if(t==="HTTP Request")return[{field:"data",description:"Response data"},{field:"status",description:"HTTP status code"}];if(t==="Database Query"){let o=e.data.config?.dbSchema;if(o)try{let n=JSON.parse(o);if(n.length>0)return In(n)}catch{}return[{field:"rows",description:"Query result rows"},{field:"count",description:"Number of rows"}]}if(su(t,"Generate Text","ai-gateway/generate-text")){let o=e.data.config?.aiFormat,n=e.data.config?.aiSchema;if(o==="object"&&n)try{let r=JSON.parse(n);if(r.length>0)return In(r,"object")}catch{}return[{field:"text",description:"Generated text"}]}if(t){let o=pe(t);if(o?.outputFields&&o.outputFields.length>0)return o.outputFields}if(e.data.type==="trigger"){let o=e.data.config?.triggerType,n=e.data.config?.webhookSchema;if(o==="Webhook"&&n)try{let r=JSON.parse(n);if(r.length>0)return In(r)}catch{}return[{field:"triggered",description:"Trigger status"},{field:"timestamp",description:"Trigger timestamp"},{field:"input",description:"Input data"}]}return[{field:"data",description:"Output data"}]};function Cr({isOpen:e,position:t,onSelect:o,onClose:n,currentNodeId:r,filter:s=""}){let[a]=ci(oe),[l]=ci(ue),[i,d]=ui(0),c=nu(null),[u,p]=ui(!1);Nr(()=>(p(!0),()=>p(!1)),[]);let T=(()=>{if(!r)return[];let f=new Set,A=[],I=C=>{if(f.has(C))return;f.add(C);let h=l.filter(m=>m.target===C);for(let m of h)A.push(m.source),I(m.source)};return I(r),a.filter(C=>A.includes(C.id))})(),v=[];for(let f of T){let A=au(f),I=iu(f);v.push({type:"node",nodeId:f.id,nodeName:A,template:`{{@${f.id}:${A}}}`});for(let C of I)v.push({type:"field",nodeId:f.id,nodeName:A,field:C.field,description:C.description,template:`{{@${f.id}:${A}.${C.field}}}`})}let y=s?v.filter(f=>f.nodeName.toLowerCase().includes(s.toLowerCase())||f.field&&f.field.toLowerCase().includes(s.toLowerCase())):v;if(Nr(()=>{d(0)},[s]),Nr(()=>{let f=A=>{if(e)switch(A.key){case"ArrowDown":A.preventDefault(),d(I=>I<y.length-1?I+1:I);break;case"ArrowUp":A.preventDefault(),d(I=>I>0?I-1:I);break;case"Enter":A.preventDefault(),y[i]&&o(y[i].template);break;case"Escape":A.preventDefault(),n();break}};return window.addEventListener("keydown",f),()=>window.removeEventListener("keydown",f)},[e,y,i,o,n]),Nr(()=>{if(c.current){let f=c.current.children[i];f&&f.scrollIntoView({block:"nearest"})}},[i]),!e||y.length===0||!u)return null;let w={top:Math.min(t.top,window.innerHeight-300),left:Math.min(t.left,window.innerWidth-320)},k=Sn("div",{className:"fixed z-[9999] w-80 rounded-lg border bg-popover p-1 text-popover-foreground shadow-md",ref:c,style:{top:`${w.top}px`,left:`${w.left}px`},children:Sn("div",{className:"max-h-60 overflow-y-auto",children:y.map((f,A)=>kr("div",{className:x("flex cursor-pointer items-center justify-between rounded px-2 py-1.5 text-sm transition-colors",A===i?"bg-accent text-accent-foreground":"hover:bg-accent/50"),onClick:()=>o(f.template),onMouseEnter:()=>d(A),children:[kr("div",{className:"flex-1",children:[Sn("div",{className:"font-medium",children:f.type==="node"?f.nodeName:kr(lu,{children:[kr("span",{className:"text-muted-foreground",children:[f.nodeName,"."]}),f.field]})}),f.description&&Sn("div",{className:"text-muted-foreground text-xs",children:f.description})]}),A===i&&Sn(ou,{className:"h-4 w-4"})]},`${f.nodeId}-${f.field||"root"}`))})});return ru(k,document.body)}import{Fragment as uu,jsx as ka,jsxs as mu}from"react/jsx-runtime";function du(e,t){let o=e.match(/\{\{@([^:]+):([^}]+)\}\}/);if(!o)return!1;let n=o[1];return t.some(r=>r.id===n)}function cu(e,t){let o=e.match(/\{\{@([^:]+):([^}]+)\}\}/);if(!o)return e;let n=o[1],r=o[2],s=t.find(d=>d.id===n);if(!s)return r;let a=s.data.label;if(!a&&s.data.type==="action"){let d=s.data.config?.actionType;d&&(a=pe(d)?.label)}let l=r.indexOf(".");if(l===-1)return a??r;let i=r.substring(l+1);return a?`${a}.${i}`:r}function We({value:e="",onChange:t,placeholder:o,disabled:n,className:r,id:s}){let[a,l]=Yo(!1),i=Na(null),[d,c]=Yo(e),u=Na(!0),[p]=mi(be),[g]=mi(oe),[T,v]=Yo(!1),[y,w]=Yo({top:0,left:0}),[k,f]=Yo(""),[A,I]=Yo(null),C=Na(null);xa(()=>{e!==d&&!a&&(c(e),u.current=!0)},[e,a,d]),xa(()=>{!a&&d&&(u.current=!0)},[g,a,d]);let h=()=>{if(!i.current)return null;let V=window.getSelection();if(!V||V.rangeCount===0)return null;let X=V.getRangeAt(0),W=X.cloneRange();W.selectNodeContents(i.current),W.setEnd(X.endContainer,X.endOffset);let U=0,N=document.createTreeWalker(i.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null),M,b=!1;for(;(M=N.nextNode())&&!b;)if(M.nodeType===Node.TEXT_NODE)if(M===X.endContainer)U+=X.endOffset,b=!0;else{let R=(M.textContent||"").length;U+=R}else if(M.nodeType===Node.ELEMENT_NODE){let R=M,G=R.getAttribute("data-template");G&&(R.contains(X.endContainer)||R===X.endContainer?(U+=G.length,b=!0):U+=G.length)}return{offset:U}},m=V=>{if(!i.current||!V)return;let X=0,W=document.createTreeWalker(i.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null),U,N=null,M=0;for(;U=W.nextNode();)if(U.nodeType===Node.TEXT_NODE){let b=(U.textContent||"").length;if(X+b>=V.offset){N=U,M=V.offset-X;break}X+=b}else if(U.nodeType===Node.ELEMENT_NODE){let b=U,R=b.getAttribute("data-template");if(R){if(X+R.length>=V.offset){N=b.nextSibling,M=0,!N&&b.parentNode&&(N=document.createTextNode(""),b.parentNode.appendChild(N));break}X+=R.length}}if(N){let b=document.createRange(),R=window.getSelection();try{let G=Math.min(M,N.textContent?.length||0);b.setStart(N,G),b.collapse(!0),R?.removeAllRanges(),R?.addRange(b),i.current.focus()}catch{i.current.focus()}}},S=()=>{if(!i.current||!u.current)return;let V=i.current,X=d||"",W=a?h():null;if(C.current!==null&&(W={offset:C.current},C.current=null),V.innerHTML="",!X&&!a){V.innerHTML=`<span class="text-muted-foreground pointer-events-none">${o||""}</span>`;return}let U=/\{\{@([^:]+):([^}]+)\}\}/g,N=0,M;for(;(M=U.exec(X))!==null;){let[b]=M,R=M.index;if(R>N){let de=X.slice(N,R),B=document.createTextNode(de);V.appendChild(B)}let G=document.createElement("span"),te=du(b,g);G.className=te?"inline-flex items-center gap-1 rounded bg-blue-500/10 px-1.5 py-0.5 text-blue-600 dark:text-blue-400 font-mono text-xs border border-blue-500/20 mx-0.5":"inline-flex items-center gap-1 rounded bg-red-500/10 px-1.5 py-0.5 text-red-600 dark:text-red-400 font-mono text-xs border border-red-500/20 mx-0.5",G.contentEditable="false",G.setAttribute("data-template",b),G.textContent=cu(b,g),V.appendChild(G),N=U.lastIndex}if(N<X.length){let b=X.slice(N),R=document.createTextNode(b);V.appendChild(R)}V.innerHTML===""&&a&&(V.innerHTML="<br>"),u.current=!1,W&&requestAnimationFrame(()=>m(W))},J=()=>{if(!i.current)return"";let V="",X=document.createTreeWalker(i.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null),W;for(;W=X.nextNode();)if(W.nodeType===Node.TEXT_NODE){let U=W.parentElement,N=!1;for(;U&&U!==i.current;){if(U.getAttribute("data-template")){N=!0;break}U=U.parentElement}N||(V+=W.textContent)}else if(W.nodeType===Node.ELEMENT_NODE){let N=W.getAttribute("data-template");N&&(V+=N)}return V},D=()=>{let V=J();if(V===d)return;let X=(d.match(/\{\{@([^:]+):([^}]+)\}\}/g)||[]).length,W=(V.match(/\{\{@([^:]+):([^}]+)\}\}/g)||[]).length;if(W>X){c(V),t?.(V),u.current=!0,v(!1),requestAnimationFrame(()=>S());return}if(W===X&&W>0){c(V),t?.(V);let N=V.lastIndexOf("@");if(N!==-1){let M=V.slice(N+1);if(M.includes(" "))v(!1);else{if(f(M),I(N),i.current){let b=i.current.getBoundingClientRect(),R={top:b.bottom+window.scrollY+4,left:b.left+window.scrollX};w(R)}v(!0)}}else v(!1);return}if(W<X){c(V),t?.(V),u.current=!0,requestAnimationFrame(()=>S());return}c(V),t?.(V);let U=V.lastIndexOf("@");if(U!==-1){let N=V.slice(U+1);if(N.includes(" "))v(!1);else{if(f(N),I(U),i.current){let M=i.current.getBoundingClientRect(),b={top:M.bottom+window.scrollY+4,left:M.left+window.scrollX};w(b)}v(!0)}}else v(!1)},j=V=>{if(!i.current||A===null)return;let X=J(),W=X.slice(0,A),U=X.slice(A+1+k.length),N=W+V+U,M=W.length+V.length;c(N),t?.(N),u.current=!0,v(!1),I(null),C.current=M,i.current.focus()},z=()=>{l(!0),u.current=!0},re=()=>{setTimeout(()=>{document.activeElement!==i.current&&(l(!1),u.current=!0,v(!1))},200)},P=V=>{V.preventDefault();let X=V.clipboardData.getData("text/plain");document.execCommand("insertText",!1,X)};return xa(()=>{u.current&&S()},[d,a]),mu(uu,{children:[ka("div",{className:x("flex min-h-9 w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm transition-colors focus-within:outline-none focus-within:ring-1 focus-within:ring-ring",n&&"cursor-not-allowed opacity-50",r),children:ka("div",{className:"w-full outline-none",contentEditable:!n,id:s,onBlur:re,onFocus:z,onInput:D,onPaste:P,ref:i,role:"textbox",suppressContentEditableWarning:!0})}),ka(Cr,{currentNodeId:p||void 0,filter:k,isOpen:T,onClose:()=>v(!1),onSelect:j,position:y})]})}import{jsx as nt,jsxs as bo}from"react/jsx-runtime";function pi({config:e,onUpdateConfig:t,disabled:o}){let n=e?.dataType||"string",r=e?.operator||or[n][0].value,s=or[n],l=s.find(d=>d.value===r)?.unary??!1;function i(d){t("dataType",d);let c=or[d];c?.[0]&&t("operator",c[0].value)}return bo("div",{className:"space-y-4",children:[bo("div",{className:"space-y-2",children:[nt(F,{htmlFor:"leftValue",children:"Value to Test"}),nt(We,{disabled:o,id:"leftValue",onChange:d=>t("leftValue",d),placeholder:"e.g., {{PreviousNode.status}}",value:e?.leftValue||""}),nt("p",{className:"text-muted-foreground text-xs",children:"Use @ to reference previous node outputs."})]}),bo("div",{className:"space-y-2",children:[nt(F,{htmlFor:"dataType",children:"Data Type"}),bo(ke,{disabled:o,onValueChange:i,value:n,children:[nt(Te,{id:"dataType",children:nt(Ce,{placeholder:"Select data type"})}),nt(Ae,{children:Hs.map(d=>nt(ie,{value:d.value,children:d.label},d.value))})]})]}),bo("div",{className:"space-y-2",children:[nt(F,{htmlFor:"operator",children:"Operator"}),bo(ke,{disabled:o,onValueChange:d=>t("operator",d),value:r,children:[nt(Te,{id:"operator",children:nt(Ce,{placeholder:"Select operator"})}),nt(Ae,{children:s.map(d=>nt(ie,{value:d.value,children:d.label},d.value))})]})]}),!l&&bo("div",{className:"space-y-2",children:[nt(F,{htmlFor:"rightValue",children:"Compare Value"}),nt(We,{disabled:o,id:"rightValue",onChange:d=>t("rightValue",d),placeholder:"e.g., 200 or {{OtherNode.field}}",value:e?.rightValue||""})]})]})}import{Plus as pu,Trash2 as fu}from"lucide-react";import{nanoid as gu}from"nanoid";import{jsx as we,jsxs as lt}from"react/jsx-runtime";function no({schema:e,onChange:t,disabled:o,level:n=0}){let r=()=>{t([...e,{id:gu(),name:"",type:"string"}])},s=(c,u)=>{let p={...c};return u!=="array"&&(p.itemType=void 0),u!=="object"&&(p.fields=void 0),u==="array"&&!p.itemType&&(p.itemType="string"),u==="object"&&!p.fields&&(p.fields=[]),p},a=(c,u)=>{let p=[...e];p[c]={...p[c],...u},u.type&&(p[c]=s(p[c],u.type)),t(p)},l=c=>{t(e.filter((u,p)=>p!==c))},i=(c,u)=>{let p=[...e];p[c].fields=u,t(p)},d=n>0?"ml-4 border-l-2 border-muted pl-4":"";return lt("div",{className:`space-y-3 ${d}`,children:[e.map((c,u)=>{let p=c.id||`field-${n}-${u}`;return lt("div",{className:"space-y-2 rounded-md border p-3",children:[lt("div",{className:"flex gap-2",children:[lt("div",{className:"flex-1 space-y-2",children:[we(F,{className:"ml-1",htmlFor:`field-name-${n}-${u}`,children:"Property Name"}),we(se,{disabled:o,id:`field-name-${n}-${u}`,onChange:g=>a(u,{name:g.target.value}),placeholder:"propertyName",value:c.name})]}),lt("div",{className:"flex-1 space-y-2",children:[we(F,{className:"ml-1",htmlFor:`field-type-${n}-${u}`,children:"Type"}),lt(ke,{disabled:o,onValueChange:g=>a(u,{type:g}),value:c.type,children:[we(Te,{className:"w-full",id:`field-type-${n}-${u}`,children:we(Ce,{})}),lt(Ae,{children:[we(ie,{value:"string",children:"String"}),we(ie,{value:"number",children:"Number"}),we(ie,{value:"boolean",children:"Boolean"}),we(ie,{value:"array",children:"Array"}),we(ie,{value:"object",children:"Object"})]})]})]}),we("div",{className:"flex items-end",children:we(O,{disabled:o,onClick:()=>l(u),size:"icon",variant:"ghost",children:we(fu,{className:"h-4 w-4"})})})]}),c.type==="array"&<("div",{className:"space-y-2",children:[we(F,{className:"ml-1",htmlFor:`field-item-type-${n}-${u}`,children:"Array Item Type"}),lt(ke,{disabled:o,onValueChange:g=>a(u,{itemType:g}),value:c.itemType||"string",children:[we(Te,{className:"w-full",id:`field-item-type-${n}-${u}`,children:we(Ce,{})}),lt(Ae,{children:[we(ie,{value:"string",children:"String"}),we(ie,{value:"number",children:"Number"}),we(ie,{value:"boolean",children:"Boolean"}),we(ie,{value:"object",children:"Object"})]})]})]}),c.type==="object"&<("div",{className:"mt-2",children:[we(F,{className:"mb-2 block",children:"Object Properties"}),we(no,{disabled:o,level:n+1,onChange:g=>i(u,g),schema:c.fields||[]})]}),c.type==="array"&&c.itemType==="object"&<("div",{className:"mt-2",children:[we(F,{className:"mb-2 block",children:"Array Item Properties"}),we(no,{disabled:o,level:n+1,onChange:g=>i(u,g),schema:c.fields||[]})]}),lt("div",{className:"space-y-2",children:[we(F,{className:"ml-1",htmlFor:`field-desc-${n}-${u}`,children:"Description (optional)"}),we(se,{disabled:o,id:`field-desc-${n}-${u}`,onChange:g=>a(u,{description:g.target.value}),placeholder:"Description for the AI",value:c.description||""})]})]},p)}),lt(O,{className:"w-full",disabled:o,onClick:r,type:"button",variant:"outline",children:[we(pu,{className:"size-4"}),"Add Property"]})]})}import{Fragment as yu,jsx as Jo,jsxs as Ca}from"react/jsx-runtime";function fi({config:e,onUpdateConfig:t,disabled:o}){return Ca(yu,{children:[Ca("div",{className:"space-y-2",children:[Jo(F,{htmlFor:"dbQuery",children:"SQL Query"}),Jo("div",{className:"overflow-hidden rounded-md border",children:Jo(ft,{defaultLanguage:"sql",height:"150px",onChange:n=>t("dbQuery",n||""),options:{minimap:{enabled:!1},lineNumbers:"on",scrollBeyondLastLine:!1,fontSize:12,readOnly:o,wordWrap:"off"},value:e?.dbQuery||""})}),Jo("p",{className:"text-muted-foreground text-xs",children:"The DATABASE_URL from your project integrations will be used to execute this query."})]}),Ca("div",{className:"space-y-2",children:[Jo(F,{children:"Schema (Optional)"}),Jo(no,{disabled:o,onChange:n=>t("dbSchema",JSON.stringify(n)),schema:e?.dbSchema?JSON.parse(e.dbSchema):[]})]})]})}import{Fragment as vu,jsx as Ue,jsxs as wo}from"react/jsx-runtime";function gi({config:e,onUpdateConfig:t,disabled:o}){return wo(vu,{children:[wo("div",{className:"space-y-2",children:[Ue(F,{htmlFor:"httpMethod",children:"HTTP Method"}),wo(ke,{disabled:o,onValueChange:n=>t("httpMethod",n),value:e?.httpMethod||"POST",children:[Ue(Te,{className:"w-full",id:"httpMethod",children:Ue(Ce,{placeholder:"Select method"})}),wo(Ae,{children:[Ue(ie,{value:"GET",children:"GET"}),Ue(ie,{value:"POST",children:"POST"}),Ue(ie,{value:"PUT",children:"PUT"}),Ue(ie,{value:"PATCH",children:"PATCH"}),Ue(ie,{value:"DELETE",children:"DELETE"})]})]})]}),wo("div",{className:"space-y-2",children:[Ue(F,{htmlFor:"endpoint",children:"URL"}),Ue(We,{disabled:o,id:"endpoint",onChange:n=>t("endpoint",n),placeholder:"https://api.example.com/endpoint or {{NodeName.url}}",value:e?.endpoint||""})]}),wo("div",{className:"space-y-2",children:[Ue(F,{htmlFor:"httpHeaders",children:"Headers (JSON)"}),Ue("div",{className:"overflow-hidden rounded-md border",children:Ue(ft,{defaultLanguage:"json",height:"100px",onChange:n=>t("httpHeaders",n||"{}"),options:{minimap:{enabled:!1},lineNumbers:"off",scrollBeyondLastLine:!1,fontSize:12,readOnly:o,wordWrap:"off"},value:e?.httpHeaders||"{}"})})]}),wo("div",{className:"space-y-2",children:[Ue(F,{htmlFor:"httpBody",children:"Body (JSON)"}),Ue("div",{className:`overflow-hidden rounded-md border ${e?.httpMethod==="GET"?"opacity-50":""}`,children:Ue(ft,{defaultLanguage:"json",height:"120px",onChange:n=>t("httpBody",n||"{}"),options:{minimap:{enabled:!1},lineNumbers:"off",scrollBeyondLastLine:!1,fontSize:12,readOnly:e?.httpMethod==="GET"||o,domReadOnly:e?.httpMethod==="GET"||o,wordWrap:"off"},value:e?.httpBody||"{}"})}),e?.httpMethod==="GET"&&Ue("p",{className:"text-muted-foreground text-xs",children:"Body is disabled for GET requests"})]})]})}import{jsx as Xo,jsxs as Ta}from"react/jsx-runtime";function yi({config:e,onUpdateConfig:t,disabled:o}){return Ta("div",{className:"space-y-4",children:[Ta("div",{className:"space-y-2",children:[Xo(F,{htmlFor:"items",children:"Items to Iterate"}),Xo(We,{disabled:o,id:"items",onChange:n=>t("items",n),placeholder:"e.g., {{PreviousNode.rows}}, {{DatabaseQuery.results}}",value:e?.items||""}),Xo("p",{className:"text-muted-foreground text-xs",children:"Reference an array from a previous node. Use @ to reference outputs."})]}),Ta("div",{className:"space-y-2",children:[Xo(F,{htmlFor:"batchSize",children:"Batch Size (optional)"}),Xo(We,{disabled:o,id:"batchSize",onChange:n=>t("batchSize",n),placeholder:"1",value:e?.batchSize||""}),Xo("p",{className:"text-muted-foreground text-xs",children:"Number of items per batch. Default is 1 (process one item at a time)."})]})]})}import{Fragment as hu,jsx as ge,jsxs as Je}from"react/jsx-runtime";function vi({config:e,onUpdateConfig:t,disabled:o}){let n=e?.mode||"append";return Je("div",{className:"space-y-4",children:[Je("div",{className:"space-y-2",children:[ge(F,{htmlFor:"mode",children:"Mode"}),Je(ke,{disabled:o,onValueChange:r=>t("mode",r),value:n,children:[ge(Te,{id:"mode",children:ge(Ce,{placeholder:"Select mode"})}),Je(Ae,{children:[ge(ie,{value:"append",children:"Append"}),ge(ie,{value:"combineByPosition",children:"Combine by Position"}),ge(ie,{value:"combineByFields",children:"Combine by Fields"})]})]}),Je("p",{className:"text-muted-foreground text-xs",children:[n==="append"&&"Concatenate both lists into one.",n==="combineByPosition"&&"Merge items at the same index from both inputs.",n==="combineByFields"&&"Match and merge items based on a common field."]})]}),Je("div",{className:"space-y-2",children:[ge(F,{htmlFor:"input1",children:"Input 1"}),ge(We,{disabled:o,id:"input1",onChange:r=>t("input1",r),placeholder:"e.g., {{PreviousNode.rows}}",value:e?.input1||""}),ge("p",{className:"text-muted-foreground text-xs",children:"First array to merge. Use @ to reference outputs from previous nodes."})]}),Je("div",{className:"space-y-2",children:[ge(F,{htmlFor:"input2",children:"Input 2"}),ge(We,{disabled:o,id:"input2",onChange:r=>t("input2",r),placeholder:"e.g., {{AnotherNode.results}}",value:e?.input2||""}),ge("p",{className:"text-muted-foreground text-xs",children:"Second array to merge. Use @ to reference outputs from previous nodes."})]}),n==="combineByPosition"&&Je("div",{className:"space-y-2",children:[ge(F,{htmlFor:"unmatchedHandling",children:"When arrays have different lengths"}),Je(ke,{disabled:o,onValueChange:r=>t("unmatchedHandling",r),value:e?.unmatchedHandling||"useNull",children:[ge(Te,{id:"unmatchedHandling",children:ge(Ce,{})}),Je(Ae,{children:[ge(ie,{value:"useNull",children:"Fill with null"}),ge(ie,{value:"discard",children:"Discard extra items"})]})]})]}),n==="combineByFields"&&Je(hu,{children:[Je("div",{className:"space-y-2",children:[ge(F,{htmlFor:"matchField1",children:"Match Field (Input 1)"}),ge(We,{disabled:o,id:"matchField1",onChange:r=>t("matchField1",r),placeholder:"e.g., id",value:e?.matchField1||""}),ge("p",{className:"text-muted-foreground text-xs",children:"Field name in Input 1 to match on."})]}),Je("div",{className:"space-y-2",children:[ge(F,{htmlFor:"matchField2",children:"Match Field (Input 2)"}),ge(We,{disabled:o,id:"matchField2",onChange:r=>t("matchField2",r),placeholder:"e.g., id",value:e?.matchField2||""}),ge("p",{className:"text-muted-foreground text-xs",children:"Field name in Input 2 to match on."})]}),Je("div",{className:"space-y-2",children:[ge(F,{htmlFor:"joinType",children:"Join Type"}),Je(ke,{disabled:o,onValueChange:r=>t("joinType",r),value:e?.joinType||"inner",children:[ge(Te,{id:"joinType",children:ge(Ce,{})}),Je(Ae,{children:[ge(ie,{value:"inner",children:"Inner Join"}),ge(ie,{value:"leftOuter",children:"Left Outer Join"}),ge(ie,{value:"rightOuter",children:"Right Outer Join"}),ge(ie,{value:"fullOuter",children:"Full Outer Join"})]})]}),ge("p",{className:"text-muted-foreground text-xs",children:"Inner keeps only matches. Left/Right keeps all items from that input. Full keeps everything."})]})]})]})}import{jsx as rt,jsxs as Dt}from"react/jsx-runtime";function hi({config:e,onUpdateConfig:t,disabled:o}){let n=e?.mode||"rules";return Dt("div",{className:"space-y-4",children:[Dt("div",{className:"space-y-2",children:[rt(F,{htmlFor:"mode",children:"Mode"}),Dt(ke,{disabled:o,onValueChange:r=>t("mode",r),value:n,children:[rt(Te,{id:"mode",children:rt(Ce,{placeholder:"Select mode"})}),Dt(Ae,{children:[rt(ie,{value:"rules",children:"Rules"}),rt(ie,{value:"expression",children:"Expression"})]})]}),Dt("p",{className:"text-muted-foreground text-xs",children:[n==="rules"&&"Each route has a condition. The first route whose condition is true wins.",n==="expression"&&"Compare a value against each route's case value. First match wins."]})]}),n==="expression"&&Dt("div",{className:"space-y-2",children:[rt(F,{htmlFor:"switchValue",children:"Value to Switch On"}),rt(We,{disabled:o,id:"switchValue",onChange:r=>t("switchValue",r),placeholder:"e.g., {{PreviousNode.statusCode}}",value:e?.switchValue||""}),rt("p",{className:"text-muted-foreground text-xs",children:"The value to compare against each route's case value. Use @ to reference previous node outputs."})]}),[0,1,2,3].map(r=>Dt("div",{className:"space-y-3 rounded-md border p-3",children:[Dt("p",{className:"font-medium text-sm",children:["Route ",r+1]}),Dt("div",{className:"space-y-2",children:[rt(F,{htmlFor:`routeName${r}`,children:"Name (optional)"}),rt(se,{disabled:o,id:`routeName${r}`,onChange:s=>t(`routeName${r}`,s.target.value),placeholder:`Route ${r+1}`,value:e?.[`routeName${r}`]||""})]}),n==="rules"&&Dt("div",{className:"space-y-2",children:[rt(F,{htmlFor:`routeCondition${r}`,children:"Condition"}),rt(We,{disabled:o,id:`routeCondition${r}`,onChange:s=>t(`routeCondition${r}`,s),placeholder:"e.g., {{PreviousNode.status}} === 200",value:e?.[`routeCondition${r}`]||""})]}),n==="expression"&&Dt("div",{className:"space-y-2",children:[rt(F,{htmlFor:`routeCaseValue${r}`,children:"Case Value"}),rt(We,{disabled:o,id:`routeCaseValue${r}`,onChange:s=>t(`routeCaseValue${r}`,s),placeholder:`e.g., ${r===0?"200":r===1?"404":r===2?"500":"default"}`,value:e?.[`routeCaseValue${r}`]||""})]})]},r)),rt("p",{className:"text-muted-foreground text-xs",children:'Routes are evaluated in order. The first matching route wins. If no route matches, the result falls back to "Default".'})]})}import{atom as Tr}from"jotai";var Ar=Tr(null),bi=Tr([]),wi=Tr(!1),mb=Tr(!1);import{useAtomValue as Li,useSetAtom as Ea}from"jotai";import{Search as Lu}from"lucide-react";import{useCallback as Mu,useMemo as Fu,useState as tn}from"react";import{toast as ko}from"sonner";import{atom as Pn,useSetAtom as bu}from"jotai";import*as Ni from"react";var xi=null;var xo=Pn(null),Sr=Pn([]),Ir=Pn(!1),ki=Pn(!1),Ht=Pn(null);function Ci(){let e=bu(Ht);Ni.useEffect(()=>{xi&&e(xi)},[e])}import{Database as wu,HelpCircle as xu}from"lucide-react";import{jsx as En}from"react/jsx-runtime";function Nu({className:e}){return En("svg",{className:e,fill:"currentColor",height:"12",viewBox:"0 0 1155 1000",width:"12",xmlns:"http://www.w3.org/2000/svg",children:En("path",{d:"m577.3 0 577.4 1000H0z"})})}var ku={database:wu,vercel:Nu};function Rt({integration:e,className:t="h-3 w-3"}){let o=ku[e];if(o)return En(o,{className:x("text-foreground",t)});let n=It(e);if(n?.icon){let r=n.icon;return En(r,{className:x("text-foreground",t)})}return En(xu,{className:x("text-foreground",t)})}import{AlertTriangleIcon as Ru}from"lucide-react";import{Loader2 as Cu}from"lucide-react";import{jsx as Qo,jsxs as Sa}from"react/jsx-runtime";function Aa({action:e}){return Sa(O,{disabled:e.disabled||e.loading,onClick:e.onClick,variant:e.variant??"default",children:[e.loading&&Qo(Cu,{className:"mr-2 size-4 animate-spin"}),e.label]})}function Ti({actions:e,className:t,children:o}){if(o)return Qo("div",{className:x("flex flex-col-reverse gap-2 p-6 pt-4 sm:flex-row sm:justify-end",t),children:o});if(!e||e.length===0)return null;let n=e.filter(i=>i.variant==="ghost"),r=e.filter(i=>i.variant==="outline"||i.variant==="secondary"),s=e.filter(i=>!i.variant||i.variant==="default"||i.variant==="destructive"),a=n.length>0,l=r.length>0||s.length>0;return Sa("div",{className:x("flex flex-col-reverse gap-2 p-6 pt-4 sm:flex-row",a&&l?"sm:justify-between":"sm:justify-end",t),children:[a&&Qo("div",{className:"flex flex-col-reverse gap-2 sm:flex-row",children:n.map(i=>Qo(Aa,{action:i},i.label))}),l&&Sa("div",{className:"flex flex-col-reverse gap-2 sm:flex-row",children:[r.map(i=>Qo(Aa,{action:i},i.label)),s.map(i=>Qo(Aa,{action:i},i.label))]})]})}import{ChevronLeftIcon as Iu,XIcon as Pu}from"lucide-react";import{createContext as Si,useCallback as Zo,useContext as Ii,useMemo as Tu,useRef as Au,useState as Su}from"react";import{jsx as Ai}from"react/jsx-runtime";var Pi=Si(null),Ei=Si([]);function Ia(){return`overlay-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function Di({children:e}){let[t,o]=Su([]),n=Au([]);t.length>0&&(n.current=t);let r=Zo((u,p,g)=>{let T=Ia();return o([{id:T,component:u,props:p??{},options:g??{}}]),T},[]),s=Zo((u,p,g)=>{let T=Ia(),v={id:T,component:u,props:p??{},options:g??{}};return o(y=>[...y,v]),T},[]),a=Zo(()=>{o(u=>u.length<=1?(u[0]?.options.onClose?.(),[]):(u[u.length-1]?.options.onClose?.(),u.slice(0,-1)))},[]),l=Zo((u,p,g)=>{let T=Ia(),v={id:T,component:u,props:p??{},options:g??{}};return o(y=>y.length===0?[v]:(y[y.length-1]?.options.onClose?.(),[...y.slice(0,-1),v])),T},[]),i=Zo(()=>{o(u=>{for(let p of u)p.options.onClose?.();return[]})},[]),d=Zo(u=>{o(p=>{let g=p.findIndex(T=>T.id===u);if(g===-1)return p;for(let T=g;T<p.length;T++)p[T].options.onClose?.();return p.slice(0,g)})},[]),c=Tu(()=>({stack:t,open:r,push:s,pop:a,replace:l,closeAll:i,close:d,hasOverlays:t.length>0,depth:t.length}),[t,r,s,a,l,i,d]);return Ai(Pi.Provider,{value:c,children:Ai(Ei.Provider,{value:n.current,children:e})})}function ne(){let e=Ii(Pi);if(!e)throw new Error("useOverlay must be used within an OverlayProvider");return e}function Ri(e){let{stack:t}=ne(),o=Ii(Ei),n=t.length>0?t:o,r=n.findIndex(s=>s.id===e);return{index:r,isFirst:r===0,isLast:r===n.length-1,depth:n.length,showBackButton:r>0}}import{jsx as No,jsxs as Oi}from"react/jsx-runtime";function Eu({title:e,description:t,showBackButton:o,showCloseButton:n=!0,onBack:r,onClose:s,className:a}){let{pop:l,closeAll:i}=ne(),d=o??!1,c=()=>{r?r():l()},u=()=>{s?s():i()};return Oi("div",{className:x("relative flex flex-col gap-1.5 p-6 pb-0",a),children:[Oi("div",{className:"flex min-h-8 items-center gap-2",children:[d&&No(O,{"aria-label":"Go back",className:"ml-[-8px] size-8 shrink-0",onClick:c,size:"icon",variant:"ghost",children:No(Iu,{className:"size-5"})}),e&&No("h2",{className:"flex-1 font-semibold text-lg leading-none tracking-tight",children:e}),n&&No(O,{"aria-label":"Close",className:"absolute top-4 right-4 size-8 shrink-0 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",onClick:u,size:"icon",variant:"ghost",children:No(Pu,{className:"size-4"})})]}),t&&No("p",{className:"text-muted-foreground text-sm",children:t})]})}function en({overlayId:e,showBackButton:t,...o}){let{showBackButton:n}=Ri(e);return No(Eu,{...o,showBackButton:t??n})}import{jsx as Pa,jsxs as Du}from"react/jsx-runtime";function De({overlayId:e,title:t,description:o,actions:n,children:r,className:s}){return Du("div",{className:x("flex flex-col",s),children:[(t||o)&&Pa(en,{description:o,overlayId:e,title:t}),r&&Pa("div",{className:"flex-1 overflow-y-auto p-6",children:r}),Pa(Ti,{actions:n})]})}import{jsx as Pr,jsxs as Ou}from"react/jsx-runtime";function Oe({overlayId:e,title:t="Confirm",message:o,confirmLabel:n="Confirm",cancelLabel:r="Cancel",confirmVariant:s="default",destructive:a=!1,onConfirm:l,onCancel:i}){let{pop:d}=ne();return Pr(De,{actions:[{label:r,variant:"outline",onClick:()=>{i?.(),d()}},{label:n,variant:a?"destructive":s,onClick:async()=>{await l(),d()}}],overlayId:e,title:t,children:Ou("div",{className:"flex gap-4",children:[a&&Pr("div",{className:"flex size-10 shrink-0 items-center justify-center rounded-full bg-destructive/10",children:Pr(Ru,{className:"size-5 text-destructive"})}),Pr("p",{className:x("text-muted-foreground text-sm",a&&"pt-2"),children:o})]})})}import{jsx as Ve,jsxs as gt}from"react/jsx-runtime";var zu=["database"],Wu={database:"Database"},Bu={database:"Connect to PostgreSQL databases"},Vu=()=>[...Vs(),...zu],Da=e=>Yt()[e]||Wu[e]||e,Gu=e=>Bs()[e]||Bu[e]||"";function Fi({overlayId:e,onSuccess:t}){let{push:o,closeAll:n}=ne(),[r,s]=tn(""),a=zt(),l=Li(Ht),i=Li(xo),d=Ea(xo),c=Ea(Sr),u=Ea(Ir),p=Vu(),g=Fu(()=>{if(!r.trim())return p;let y=r.toLowerCase();return p.filter(w=>Da(w).toLowerCase().includes(y))},[p,r]),T=Mu(()=>{l&&o(l.ConsentOverlay,{onConsent:y=>{t?.(y),n()}})},[l,o,n,t]),v=y=>{let w=l?.integrationType===y;if(w&&i?.enabled&&i?.isVercelUser){T();return}if(w&&i===null){l.api.getStatus().then(f=>{d(f),f?.enabled&&f?.isVercelUser?(u(!0),l.api.getTeams().then(A=>{c(A.teams)}).finally(()=>{u(!1),T()})):o(ro,{type:y,onSuccess:t})});return}o(ro,{type:y,onSuccess:t})};return gt(De,{overlayId:e,title:"Add Connection",children:[Ve("p",{className:"-mt-2 mb-4 text-muted-foreground text-sm",children:"Select a service to connect"}),gt("div",{className:"space-y-3",children:[gt("div",{className:"relative",children:[Ve(Lu,{className:"absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted-foreground"}),Ve(se,{autoFocus:!a,className:"pl-9",onChange:y=>s(y.target.value),placeholder:"Search services...",value:r})]}),Ve("div",{className:"max-h-[300px] space-y-1 overflow-y-auto",children:g.length===0?Ve("p",{className:"py-4 text-center text-muted-foreground text-sm",children:"No services found"}):g.map(y=>{let w=Gu(y);return gt("button",{className:"flex w-full items-center gap-3 rounded-md px-3 py-2 text-left text-sm transition-colors hover:bg-muted/50",onClick:()=>v(y),type:"button",children:[Ve(Rt,{className:"size-5 shrink-0",integration:y==="ai-gateway"?"vercel":y}),gt("span",{className:"min-w-0 flex-1 truncate",children:[Ve("span",{className:"font-medium",children:Da(y)}),w&>("span",{className:"text-muted-foreground text-xs",children:[" ","- ",w]})]})]},y)})})]})]})}function Mi({fieldId:e,label:t,configKey:o,placeholder:n,helpText:r,helpLink:s,value:a,onChange:l}){return gt("div",{className:"space-y-2",children:[Ve(F,{htmlFor:e,children:t}),Ve(se,{className:"flex-1",id:e,onChange:i=>l(o,i.target.value),placeholder:n,type:"password",value:a}),(r||s)&>("p",{className:"text-muted-foreground text-xs",children:[r,s&&Ve("a",{className:"underline hover:text-foreground",href:s.url,rel:"noopener noreferrer",target:"_blank",children:s.text})]})]})}function ro({overlayId:e,type:t,onSuccess:o}){let{push:n,closeAll:r}=ne(),[s,a]=tn(!1),[l,i]=tn(!1),[d,c]=tn(null),[u,p]=tn(""),[g,T]=tn({}),v=(C,h)=>{T(m=>({...m,[C]:h}))},y=async()=>{try{a(!0);let C=await q.integration.create({name:u.trim(),type:t,config:g});ko.success("Connection created"),o?.(C.id),r()}catch(C){console.error("Failed to save integration:",C),ko.error("Failed to save connection")}finally{a(!1)}},w=async()=>{if(!Object.values(g).some(h=>h&&h.length>0)){ko.error("Please enter credentials");return}try{a(!0),c(null);let h=await q.integration.testCredentials({type:t,config:g});if(h.status==="error"){n(Oe,{title:"Connection Test Failed",message:`The test failed: ${h.message}
|
|
1
|
+
"use client";import{a as Uo,b as Ko,c as qo}from"../chunk-NI6U7PHC.js";import{i as dr}from"../chunk-VUDOAZ3W.js";import{a as Xs,b as cr}from"../chunk-3YVRTDK2.js";import{a as x}from"../chunk-6UXAINJQ.js";import{d as _s,h as Dt,i as Us,k as Ks,l as qs,m as fe,n as eo,o as js,p as Js,v as Ys,w as Na,y as _o}from"../chunk-QRG4O4PE.js";import{AuthView as Nf}from"@daveyplate/better-auth-ui";import{useParams as kf}from"next/navigation";import{useAtom as $t,useAtomValue as lf,useSetAtom as At}from"jotai";import{ChevronLeft as df,ChevronRight as cf}from"lucide-react";import uf from"next/link";import{useSearchParams as mf}from"next/navigation";import{useCallback as yo,useEffect as St,useRef as Lo,useState as ss}from"react";import{toast as is}from"sonner";var ka=class extends Error{status;constructor(t,o){super(o),this.status=t,this.name="ApiError"}};async function ge(e,t){let o=await fetch(e,{...t,headers:{"Content-Type":"application/json",...t?.headers}});if(!o.ok){let n=await o.json().catch(()=>({error:"Unknown error"}));throw new ka(o.status,n.error||"Request failed")}return o.json()}function Fc(e,t){e?.name&&(t.currentData.name=e.name)}function Wc(e,t){e?.description&&(t.currentData.description=e.description)}function zc(e,t){e?.node&&(t.currentData.nodes=[...t.currentData.nodes,e.node])}function Bc(e,t){e?.edge&&(t.currentData.edges=[...t.currentData.edges,e.edge])}function Vc(e,t){e?.nodeId&&(t.currentData.nodes=t.currentData.nodes.filter(o=>o.id!==e.nodeId),t.currentData.edges=t.currentData.edges.filter(o=>o.source!==e.nodeId&&o.target!==e.nodeId))}function Gc(e,t){e?.edgeId&&(t.currentData.edges=t.currentData.edges.filter(o=>o.id!==e.edgeId))}function Hc(e,t){e?.nodeId&&e.updates&&(t.currentData.nodes=t.currentData.nodes.map(o=>o.id===e.nodeId?{...o,...e.updates?.position?{position:e.updates.position}:{},...e.updates?.data?{data:{...o.data,...e.updates.data}}:{}}:o))}var $c={setName:Fc,setDescription:Wc,addNode:zc,addEdge:Bc,removeNode:Vc,removeEdge:Gc,updateNode:Hc};function _c(e,t){if(!e?.op)return;let o=$c[e.op];o&&o(e,t)}function Uc(e,t,o){if(e.trim())try{let n=JSON.parse(e);if(n.type==="operation"&&n.operation)_c(n.operation,o),t({...o.currentData});else if(n.type==="error")throw console.error("[API Client] Error:",n.error),new Error(n.error)}catch(n){console.error("[API Client] Failed to parse JSONL line:",n)}}function Kc(e,t,o,n){n.buffer+=t.decode(e,{stream:!0});let r=n.buffer.split(`
|
|
2
|
+
`);n.buffer=r.pop()||"";for(let s of r)Uc(s,o,n)}var qc={generate:(e,t)=>ge("/api/ai/generate",{method:"POST",body:JSON.stringify({prompt:e,existingWorkflow:t})}),generateStream:async(e,t,o)=>{let n=await fetch("/api/ai/generate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:e,existingWorkflow:o})});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);if(!n.body)throw new Error("No response body");let r=n.body.getReader(),s=new TextDecoder,a={buffer:"",currentData:o?{nodes:o.nodes||[],edges:o.edges||[],name:o.name}:{nodes:[],edges:[]}};try{for(;;){let{done:d,value:i}=await r.read();if(d)break;Kc(i,s,t,a)}return a.currentData}finally{r.releaseLock()}}},jc={getAll:e=>ge(`/api/integrations${e?`?type=${e}`:""}`),get:e=>ge(`/api/integrations/${e}`),create:e=>ge("/api/integrations",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>ge(`/api/integrations/${e}`,{method:"PUT",body:JSON.stringify(t)}),delete:e=>ge(`/api/integrations/${e}`,{method:"DELETE"}),testConnection:e=>ge(`/api/integrations/${e}/test`,{method:"POST"}),testCredentials:e=>ge("/api/integrations/test",{method:"POST",body:JSON.stringify(e)})},Jc={get:()=>ge("/api/user"),update:e=>ge("/api/user",{method:"PATCH",body:JSON.stringify(e)})},ur={getAll:()=>ge("/api/workflows"),getById:e=>ge(`/api/workflows/${e}`),create:e=>ge("/api/workflows/create",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>ge(`/api/workflows/${e}`,{method:"PATCH",body:JSON.stringify(t)}),delete:e=>ge(`/api/workflows/${e}`,{method:"DELETE"}),duplicate:e=>ge(`/api/workflows/${e}/duplicate`,{method:"POST"}),getCurrent:()=>ge("/api/workflows/current"),saveCurrent:(e,t)=>ge("/api/workflows/current",{method:"POST",body:JSON.stringify({nodes:e,edges:t})}),execute:(e,t={})=>ge(`/api/workflow/${e}/execute`,{method:"POST",body:JSON.stringify({input:t})}),triggerWebhook:(e,t={})=>ge(`/api/workflows/${e}/webhook`,{method:"POST",body:JSON.stringify(t)}),getCode:e=>ge(`/api/workflows/${e}/code`),getExecutions:e=>ge(`/api/workflows/${e}/executions`),deleteExecutions:e=>ge(`/api/workflows/${e}/executions`,{method:"DELETE"}),getExecutionLogs:e=>ge(`/api/workflows/executions/${e}/logs`),getExecutionStatus:e=>ge(`/api/workflows/executions/${e}/status`),cancelExecution:e=>ge(`/api/workflows/executions/${e}/cancel`,{method:"POST"}),download:e=>ge(`/api/workflows/${e}/download`),autoSaveCurrent:(()=>{let e=null,t=2e3;return(o,n)=>{e&&clearTimeout(e),e=setTimeout(()=>{ur.saveCurrent(o,n).catch(r=>{console.error("Auto-save failed:",r)})},t)}})(),autoSaveWorkflow:(()=>{let e=null,t=2e3;return(o,n,r=!0)=>{if(!r)return ur.update(o,n);e&&clearTimeout(e),e=setTimeout(()=>{ur.update(o,n).catch(s=>{console.error("Auto-save failed:",s)})},t)}})()},Yc={getStatus:()=>ge("/api/ai-gateway/status"),getTeams:()=>ge("/api/ai-gateway/teams"),consent:(e,t)=>ge("/api/ai-gateway/consent",{method:"POST",body:JSON.stringify({teamId:e,teamName:t})}),revokeConsent:()=>ge("/api/ai-gateway/consent",{method:"DELETE"})},q={ai:qc,aiGateway:Yc,integration:jc,user:Jc,workflow:ur};import{atom as Mn}from"jotai";var ft=Mn([]),mr=Mn(!1),nh=Mn(null),Rt=Mn(0),Qs=Mn(e=>{let t=e(ft);return new Set(t.map(o=>o.id))});import{applyEdgeChanges as Xc,applyNodeChanges as Qc}from"@xyflow/react";import{atom as ae}from"jotai";var ne=ae([]),ue=ae([]),ke=ae(null),_e=ae(null),ti=ae(!1),Zs=ae(!1),Nt=ae(!1),Ue=ae(null),gt=ae(""),pr=ae("private"),oo=ae(!0),Bt=ae("properties"),fr=ae(!1),no=ae(null),gr=ae(null),yr=ae(!1),vr=ae(!1),oi=ae(!1),hr=ae(!1),br=ae(new Set),to=ae(null),wr=ae(!1),jo=ae({}),Ca=null,Zc=1e3,Wt=ae(null,async(e,t,o)=>{let n=e(Ue),r=e(ne),s=e(ue);if(!n)return;let a=async()=>{try{await q.workflow.update(n,{nodes:r,edges:s}),t(nt,!1)}catch(d){console.error("Autosave failed:",d)}};o?.immediate?await a():(Ca&&clearTimeout(Ca),Ca=setTimeout(a,Zc))}),ni=ae(null,(e,t,o)=>{let n=e(ne),r=o.filter(l=>l.type==="remove"?n.find(u=>u.id===l.id)?.data.type!=="trigger":!0),s=Qc(r,n);t(ne,s);let a=s.find(l=>l.selected);if(a){t(ke,a.id),t(_e,null);let l=e(to);l&&l!==a.id&&t(to,null)}else if(e(ke)){let l=e(ke);s.find(u=>u.id===l)||t(ke,null),t(to,null)}if(r.some(l=>l.type==="remove")){t(Wt,{immediate:!0});return}r.some(l=>l.type==="position"&&l.dragging===!1)&&t(Wt)}),ri=ae(null,(e,t,o)=>{let n=e(ue),r=Xc(o,n);t(ue,r);let s=r.find(d=>d.selected);if(s)t(_e,s.id),t(ke,null);else if(e(_e)){let d=e(_e);r.find(l=>l.id===d)||t(_e,null)}o.some(d=>d.type==="remove")&&t(Wt,{immediate:!0})}),Jo=ae(null,(e,t,o)=>{let n=e(ne),r=e(ue),s=e(ot);t(ot,[...s,{nodes:n,edges:r}]),t(zt,[]);let a=n.map(l=>({...l,selected:!1})),d={...o,selected:!0},i=[...a,d];t(ne,i),t(ke,o.id),o.data.type==="action"&&!o.data.config?.actionType&&t(to,o.id),t(nt,!0),t(Wt,{immediate:!0})}),ro=ae(null,(e,t,{id:o,data:n})=>{let r=e(ne),a=r.find(c=>c.id===o)?.data.label,d=n.label,i=d!==void 0&&a!==d,l=r.map(c=>{if(c.id===o)return{...c,data:{...c.data,...n}};if(i&&a){let u=ai(c.data.config||{},o,a,d);if(u!==c.data.config)return{...c,data:{...c.data,config:u}}}return c});t(ne,l),n.status||(t(nt,!0),t(Wt))});function ai(e,t,o,n){let r=!1,s={};for(let[a,d]of Object.entries(e))if(typeof d=="string"){let i=new RegExp(`\\{\\{@${ei(t)}:${ei(o)}(\\.[^}]+)?\\}\\}`,"g"),l=d.replace(i,(c,u)=>(r=!0,`{{@${t}:${n}${u||""}}}`));s[a]=l}else if(typeof d=="object"&&d!==null&&!Array.isArray(d)){let i=ai(d,t,o,n);i!==d&&(r=!0),s[a]=i}else s[a]=d;return r?s:e}function ei(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var ao=ae(null,(e,t,o)=>{let n=e(ne);if(n.find(l=>l.id===o)?.data.type==="trigger")return;let s=e(ue),a=e(ot);t(ot,[...a,{nodes:n,edges:s}]),t(zt,[]);let d=n.filter(l=>l.id!==o),i=s.filter(l=>l.source!==o&&l.target!==o);t(ne,d),t(ue,i),e(ke)===o&&t(ke,null),t(nt,!0),t(Wt,{immediate:!0})}),so=ae(null,(e,t,o)=>{let n=e(ne),r=e(ue),s=e(ot);t(ot,[...s,{nodes:n,edges:r}]),t(zt,[]);let a=r.filter(d=>d.id!==o);t(ue,a),e(_e)===o&&t(_e,null),t(nt,!0),t(Wt,{immediate:!0})}),si=ae(null,(e,t)=>{let o=e(ne),n=e(ue),r=e(ot);t(ot,[...r,{nodes:o,edges:n}]),t(zt,[]);let s=o.filter(i=>i.selected&&i.data.type!=="trigger").map(i=>i.id),a=o.filter(i=>i.data.type==="trigger"?!0:!i.selected),d=n.filter(i=>!(i.selected||s.includes(i.source)||s.includes(i.target)));t(ne,a),t(ue,d),t(ke,null),t(_e,null),t(nt,!0),t(Wt,{immediate:!0})}),xr=ae(null,(e,t)=>{let o=e(ne),n=e(ue),r=e(ot);t(ot,[...r,{nodes:o,edges:n}]),t(zt,[]),t(ne,[]),t(ue,[]),t(ke,null),t(_e,null),t(nt,!0)}),lh=ae(null,async(e,t)=>{try{t(Zs,!0);let o=await q.workflow.getCurrent();t(ne,o.nodes),t(ue,o.edges),o.id&&t(Ue,o.id)}catch(o){console.error("Failed to load workflow:",o)}finally{t(Zs,!1)}}),dh=ae(null,async(e,t,{name:o,description:n})=>{let r=e(ne),s=e(ue);try{return await q.workflow.create({name:o,description:n,nodes:r,edges:s})}catch(a){throw console.error("Failed to save workflow:",a),a}}),ii=ae(!1),li=ae(!1),Nr=ae(!1),nt=ae(!1),di=ae(!1),ot=ae([]),zt=ae([]),ci=ae(null,(e,t)=>{let o=e(ot);if(o.length===0)return;let n=e(ne),r=e(ue),s=e(zt);t(zt,[...s,{nodes:n,edges:r}]);let a=[...o],d=a.pop();d&&(t(ot,a),t(ne,d.nodes),t(ue,d.edges),t(nt,!0))}),ui=ae(null,(e,t)=>{let o=e(zt);if(o.length===0)return;let n=e(ne),r=e(ue),s=e(ot);t(ot,[...s,{nodes:n,edges:r}]);let a=[...o],d=a.pop();d&&(t(zt,a),t(ne,d.nodes),t(ue,d.edges),t(nt,!0))}),mi=ae(e=>e(ot).length>0),pi=ae(e=>e(zt).length>0),kr=ae(null,(e,t)=>{let n=e(ne).map(r=>({...r,data:{...r.data,status:"idle"}}));t(ne,n)});import*as Cr from"react";var Ta=768;function Vt(){let[e,t]=Cr.useState(void 0);return Cr.useEffect(()=>{let o=window.matchMedia(`(max-width: ${Ta-1}px)`),n=()=>{t(window.innerWidth<Ta)};return o.addEventListener("change",n),t(window.innerWidth<Ta),()=>o.removeEventListener("change",n)},[]),!!e}import{Slot as eu}from"radix-ui";import{cva as tu}from"class-variance-authority";import{jsx as ou}from"react/jsx-runtime";var Tr=tu("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-sm":"size-8","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function D({className:e,variant:t,size:o,asChild:n=!1,...r}){let s=n?eu.Slot:"button";return ou(s,{"data-slot":"button",className:x(Tr({variant:t,size:o,className:e})),...r})}var nu={"Database Query":"database"};function ru(e){return fe(e)?.integration||nu[e]}function fi(e,t,o){let n=e.data.config?.actionType;if(!n)return null;let r=ru(n);if(!r)return null;let s=e.data.config?.integrationId;if(s&&o.has(s))return null;let d=t.filter(i=>i.type===r);return d.length===1?{nodeId:e.id,newIntegrationId:d[0].id}:d.length===0&&s?{nodeId:e.id,newIntegrationId:void 0}:null}import{useAtom as po,useAtomValue as ns,useSetAtom as fo}from"jotai";import{Copy as Ml,Eraser as rs,Eye as Zp,EyeOff as ef,FileCode as Fl,RefreshCw as Wl,Trash2 as ta}from"lucide-react";import{useCallback as tf,useEffect as zl,useMemo as of,useRef as Bl,useState as Yn}from"react";import{toast as ea}from"sonner";import{AlertDialog as io}from"radix-ui";import{jsx as Ot,jsxs as iu}from"react/jsx-runtime";function Yo({...e}){return Ot(io.Root,{"data-slot":"alert-dialog",...e})}function au({...e}){return Ot(io.Portal,{"data-slot":"alert-dialog-portal",...e})}function su({className:e,...t}){return Ot(io.Overlay,{"data-slot":"alert-dialog-overlay",className:x("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",e),...t})}function Xo({className:e,...t}){return iu(au,{children:[Ot(su,{}),Ot(io.Content,{"data-slot":"alert-dialog-content",className:x("bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",e),...t})]})}function Qo({className:e,...t}){return Ot("div",{"data-slot":"alert-dialog-header",className:x("flex flex-col gap-2 text-center sm:text-left",e),...t})}function Zo({className:e,...t}){return Ot("div",{"data-slot":"alert-dialog-footer",className:x("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",e),...t})}function en({className:e,...t}){return Ot(io.Title,{"data-slot":"alert-dialog-title",className:x("text-lg font-semibold",e),...t})}function tn({className:e,...t}){return Ot(io.Description,{"data-slot":"alert-dialog-description",className:x("text-muted-foreground text-sm",e),...t})}function on({className:e,...t}){return Ot(io.Action,{className:x(Tr(),e),...t})}function nn({className:e,...t}){return Ot(io.Cancel,{className:x(Tr({variant:"outline"}),e),...t})}import lu from"@monaco-editor/react";import{useTheme as du}from"next-themes";var gi={base:"vs-dark",inherit:!0,rules:[{token:"",foreground:"ededed"},{token:"comment",foreground:"a1a1a1",fontStyle:"italic"},{token:"keyword",foreground:"ff4d8d"},{token:"keyword.operator",foreground:"ff4d8d"},{token:"string",foreground:"00ca50"},{token:"string.escape",foreground:"00ca50"},{token:"number",foreground:"ffffff"},{token:"type",foreground:"47a8ff"},{token:"type.identifier",foreground:"47a8ff"},{token:"identifier",foreground:"ededed"},{token:"parameter",foreground:"ededed"},{token:"variable",foreground:"ededed"},{token:"variable.parameter",foreground:"ededed"},{token:"function",foreground:"c472fb"},{token:"identifier.function",foreground:"c472fb"},{token:"member.function",foreground:"c472fb"},{token:"constant.language",foreground:"47a8ff"},{token:"keyword.json",foreground:"47a8ff"},{token:"variable.predefined",foreground:"ededed"},{token:"support.variable",foreground:"ededed"},{token:"support.constant",foreground:"ededed"},{token:"delimiter",foreground:"ededed"},{token:"delimiter.bracket",foreground:"ededed"},{token:"delimiter.parenthesis",foreground:"ededed"},{token:"delimiter.curly",foreground:"ededed"},{token:"delimiter.array",foreground:"ededed"},{token:"punctuation",foreground:"ededed"},{token:"operator",foreground:"ededed"},{token:"string.key.json",foreground:"47a8ff"},{token:"string.value.json",foreground:"00ca50"},{token:"number.json",foreground:"ffffff"},{token:"keyword.json",foreground:"47a8ff"}],colors:{"editor.background":"#000000","editor.foreground":"#ededed","editorLineNumber.foreground":"#444444","editorLineNumber.activeForeground":"#888888","editor.lineHighlightBackground":"#0A0A0A","editor.selectionBackground":"#264F78","editor.inactiveSelectionBackground":"#1A1A1A","editorCursor.foreground":"#FFFFFF","editorWhitespace.foreground":"#333333","editorIndentGuide.background":"#1A1A1A","editorIndentGuide.activeBackground":"#333333","editorBracketMatch.background":"#0A0A0A","editorBracketMatch.border":"#444444"}};import{jsx as cu}from"react/jsx-runtime";function yt(e){let{resolvedTheme:t}=du();return cu(lu,{...e,onMount:(n,r)=>{r.editor.defineTheme("vercel-dark",gi),r.editor.setTheme(t==="dark"?"vercel-dark":"light"),e.onMount&&e.onMount(n,r)},theme:t==="dark"?"vercel-dark":"light"})}import{jsx as uu}from"react/jsx-runtime";function se({className:e,type:t,...o}){return uu("input",{type:t,"data-slot":"input",className:x("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground bg-transparent border-input h-9 w-full min-w-0 rounded-md border px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",e),...o})}import{Label as mu}from"radix-ui";import{jsx as pu}from"react/jsx-runtime";function M({className:e,...t}){return pu(mu.Root,{"data-slot":"label",className:x("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",e),...t})}import{Tabs as Ar}from"radix-ui";import{jsx as Sr}from"react/jsx-runtime";function Aa({className:e,...t}){return Sr(Ar.Root,{"data-slot":"tabs",className:x("flex flex-col gap-2",e),...t})}function Sa({className:e,...t}){return Sr(Ar.List,{"data-slot":"tabs-list",className:x("bg-muted text-muted-foreground inline-flex h-10 w-fit items-center justify-center rounded-lg p-[3px]",e),...t})}function No({className:e,...t}){return Sr(Ar.Trigger,{"data-slot":"tabs-trigger",className:x("data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-sm border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...t})}function ko({className:e,...t}){return Sr(Ar.Content,{"data-slot":"tabs-content",className:x("flex-1 outline-none",e),...t})}import{useAtomValue as dl,useSetAtom as Um}from"jotai";import{HelpCircle as Km,Plus as qm,Settings as jm}from"lucide-react";import{useEffect as Jm,useMemo as Gr,useState as Ym}from"react";import{Select as rt}from"radix-ui";import{CheckIcon as fu,ChevronDownIcon as yi,ChevronUpIcon as gu}from"lucide-react";import{jsx as Be,jsxs as Ia}from"react/jsx-runtime";function ve({...e}){return Be(rt.Root,{"data-slot":"select",...e})}function vi({...e}){return Be(rt.Group,{"data-slot":"select-group",...e})}function we({...e}){return Be(rt.Value,{"data-slot":"select-value",...e})}function he({className:e,size:t="default",children:o,...n}){return Ia(rt.Trigger,{"data-slot":"select-trigger","data-size":t,className:x("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-transparent hover:bg-accent/50 flex w-fit items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...n,children:[o,Be(rt.Icon,{asChild:!0,children:Be(yi,{className:"size-4 opacity-50"})})]})}function be({className:e,children:t,position:o="popper",align:n="center",...r}){return Be(rt.Portal,{children:Ia(rt.Content,{"data-slot":"select-content",className:x("bg-popover text-popover-foreground 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=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",o==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:o,align:n,...r,children:[Be(yu,{}),Be(rt.Viewport,{className:x("p-1",o==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),children:t}),Be(vu,{})]})})}function hi({className:e,...t}){return Be(rt.Label,{"data-slot":"select-label",className:x("text-muted-foreground px-2 py-1.5 text-xs",e),...t})}function te({className:e,children:t,...o}){return Ia(rt.Item,{"data-slot":"select-item",className:x("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",e),...o,children:[Be("span",{className:"absolute right-2 flex size-3.5 items-center justify-center",children:Be(rt.ItemIndicator,{children:Be(fu,{className:"size-4"})})}),Be(rt.ItemText,{children:t})]})}function Ir({className:e,...t}){return Be(rt.Separator,{"data-slot":"select-separator",className:x("bg-border pointer-events-none -mx-1 my-1 h-px",e),...t})}function yu({className:e,...t}){return Be(rt.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:x("flex cursor-default items-center justify-center py-1",e),...t,children:Be(gu,{className:"size-4"})})}function vu({className:e,...t}){return Be(rt.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:x("flex cursor-default items-center justify-center py-1",e),...t,children:Be(yi,{className:"size-4"})})}import{useAtom as xi}from"jotai";import{useEffect as Pa,useRef as Ea,useState as rn}from"react";import{useAtom as bi}from"jotai";import{Check as hu}from"lucide-react";import{useEffect as Pr,useRef as bu,useState as wi}from"react";import{createPortal as wu}from"react-dom";import{Fragment as Cu,jsx as Fn,jsxs as Er}from"react/jsx-runtime";var xu=e=>{if(e.data.label)return e.data.label;if(e.data.type==="action"){let t=e.data.config?.actionType;if(t){let o=fe(t);if(o?.label)return o.label}return t||"HTTP Request"}return e.data.type==="trigger"?e.data.config?.triggerType||"Manual":"Node"},Wn=(e,t="")=>{let o=[];for(let n of e){let r=t?`${t}.${n.name}`:n.name,s=n.type==="array"?`${n.itemType}[]`:n.type,a=n.description||`${s}`;if(o.push({field:r,description:a}),n.type==="object"&&n.fields&&n.fields.length>0&&o.push(...Wn(n.fields,r)),n.type==="array"&&n.itemType==="object"&&n.fields&&n.fields.length>0){let d=`${r}[0]`;o.push(...Wn(n.fields,d))}}return o},Nu=(e,...t)=>e?t.some(o=>e===o||e.endsWith(`/${o.toLowerCase().replace(/\s+/g,"-")}`)):!1,ku=e=>{let t=e.data.config?.actionType;if(t==="HTTP Request")return[{field:"data",description:"Response data"},{field:"status",description:"HTTP status code"}];if(t==="Database Query"){let o=e.data.config?.dbSchema;if(o)try{let n=JSON.parse(o);if(n.length>0)return Wn(n)}catch{}return[{field:"rows",description:"Query result rows"},{field:"count",description:"Number of rows"}]}if(Nu(t,"Generate Text","ai-gateway/generate-text")){let o=e.data.config?.aiFormat,n=e.data.config?.aiSchema;if(o==="object"&&n)try{let r=JSON.parse(n);if(r.length>0)return Wn(r,"object")}catch{}return[{field:"text",description:"Generated text"}]}if(t){let o=fe(t);if(o?.outputFields&&o.outputFields.length>0)return o.outputFields}if(e.data.type==="trigger"){let o=e.data.config?.triggerType,n=e.data.config?.webhookSchema;if(o==="Webhook"&&n)try{let r=JSON.parse(n);if(r.length>0)return Wn(r)}catch{}return[{field:"triggered",description:"Trigger status"},{field:"timestamp",description:"Trigger timestamp"},{field:"input",description:"Input data"}]}return[{field:"data",description:"Output data"}]};function Dr({isOpen:e,position:t,onSelect:o,onClose:n,currentNodeId:r,filter:s=""}){let[a]=bi(ne),[d]=bi(ue),[i,l]=wi(0),c=bu(null),[u,f]=wi(!1);Pr(()=>(f(!0),()=>f(!1)),[]);let T=(()=>{if(!r)return[];let g=new Set,k=[],I=A=>{if(g.has(A))return;g.add(A);let w=d.filter(m=>m.target===A);for(let m of w)k.push(m.source),I(m.source)};return I(r),a.filter(A=>k.includes(A.id))})(),b=[];for(let g of T){let k=xu(g),I=ku(g);b.push({type:"node",nodeId:g.id,nodeName:k,template:`{{@${g.id}:${k}}}`});for(let A of I)b.push({type:"field",nodeId:g.id,nodeName:k,field:A.field,description:A.description,template:`{{@${g.id}:${k}.${A.field}}}`})}let y=s?b.filter(g=>g.nodeName.toLowerCase().includes(s.toLowerCase())||g.field&&g.field.toLowerCase().includes(s.toLowerCase())):b;if(Pr(()=>{l(0)},[s]),Pr(()=>{let g=k=>{if(e)switch(k.key){case"ArrowDown":k.preventDefault(),l(I=>I<y.length-1?I+1:I);break;case"ArrowUp":k.preventDefault(),l(I=>I>0?I-1:I);break;case"Enter":k.preventDefault(),y[i]&&o(y[i].template);break;case"Escape":k.preventDefault(),n();break}};return window.addEventListener("keydown",g),()=>window.removeEventListener("keydown",g)},[e,y,i,o,n]),Pr(()=>{if(c.current){let g=c.current.children[i];g&&g.scrollIntoView({block:"nearest"})}},[i]),!e||y.length===0||!u)return null;let p={top:Math.min(t.top,window.innerHeight-300),left:Math.min(t.left,window.innerWidth-320)},v=Fn("div",{className:"fixed z-[9999] w-80 rounded-lg border bg-popover p-1 text-popover-foreground shadow-md",ref:c,style:{top:`${p.top}px`,left:`${p.left}px`},children:Fn("div",{className:"max-h-60 overflow-y-auto",children:y.map((g,k)=>Er("div",{className:x("flex cursor-pointer items-center justify-between rounded px-2 py-1.5 text-sm transition-colors",k===i?"bg-accent text-accent-foreground":"hover:bg-accent/50"),onClick:()=>o(g.template),onMouseEnter:()=>l(k),children:[Er("div",{className:"flex-1",children:[Fn("div",{className:"font-medium",children:g.type==="node"?g.nodeName:Er(Cu,{children:[Er("span",{className:"text-muted-foreground",children:[g.nodeName,"."]}),g.field]})}),g.description&&Fn("div",{className:"text-muted-foreground text-xs",children:g.description})]}),k===i&&Fn(hu,{className:"h-4 w-4"})]},`${g.nodeId}-${g.field||"root"}`))})});return wu(v,document.body)}import{Fragment as Su,jsx as Da,jsxs as Iu}from"react/jsx-runtime";function Tu(e,t){let o=e.match(/\{\{@([^:]+):([^}]+)\}\}/);if(!o)return!1;let n=o[1];return t.some(r=>r.id===n)}function Au(e,t){let o=e.match(/\{\{@([^:]+):([^}]+)\}\}/);if(!o)return e;let n=o[1],r=o[2],s=t.find(l=>l.id===n);if(!s)return r;let a=s.data.label;if(!a&&s.data.type==="action"){let l=s.data.config?.actionType;l&&(a=fe(l)?.label)}let d=r.indexOf(".");if(d===-1)return a??r;let i=r.substring(d+1);return a?`${a}.${i}`:r}function De({value:e="",onChange:t,placeholder:o,disabled:n,className:r,id:s}){let[a,d]=rn(!1),i=Ea(null),[l,c]=rn(e),u=Ea(!0),[f]=xi(ke),[h]=xi(ne),[T,b]=rn(!1),[y,p]=rn({top:0,left:0}),[v,g]=rn(""),[k,I]=rn(null),A=Ea(null);Pa(()=>{e!==l&&!a&&(c(e),u.current=!0)},[e,a,l]),Pa(()=>{!a&&l&&(u.current=!0)},[h,a,l]);let w=()=>{if(!i.current)return null;let V=window.getSelection();if(!V||V.rangeCount===0)return null;let J=V.getRangeAt(0),F=J.cloneRange();F.selectNodeContents(i.current),F.setEnd(J.endContainer,J.endOffset);let K=0,C=document.createTreeWalker(i.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null),z,N=!1;for(;(z=C.nextNode())&&!N;)if(z.nodeType===Node.TEXT_NODE)if(z===J.endContainer)K+=J.endOffset,N=!0;else{let R=(z.textContent||"").length;K+=R}else if(z.nodeType===Node.ELEMENT_NODE){let R=z,G=R.getAttribute("data-template");G&&(R.contains(J.endContainer)||R===J.endContainer?(K+=G.length,N=!0):K+=G.length)}return{offset:K}},m=V=>{if(!i.current||!V)return;let J=0,F=document.createTreeWalker(i.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null),K,C=null,z=0;for(;K=F.nextNode();)if(K.nodeType===Node.TEXT_NODE){let N=(K.textContent||"").length;if(J+N>=V.offset){C=K,z=V.offset-J;break}J+=N}else if(K.nodeType===Node.ELEMENT_NODE){let N=K,R=N.getAttribute("data-template");if(R){if(J+R.length>=V.offset){C=N.nextSibling,z=0,!C&&N.parentNode&&(C=document.createTextNode(""),N.parentNode.appendChild(C));break}J+=R.length}}if(C){let N=document.createRange(),R=window.getSelection();try{let G=Math.min(z,C.textContent?.length||0);N.setStart(C,G),N.collapse(!0),R?.removeAllRanges(),R?.addRange(N),i.current.focus()}catch{i.current.focus()}}},S=()=>{if(!i.current||!u.current)return;let V=i.current,J=l||"",F=a?w():null;if(A.current!==null&&(F={offset:A.current},A.current=null),V.innerHTML="",!J&&!a){V.innerHTML=`<span class="text-muted-foreground pointer-events-none">${o||""}</span>`;return}let K=/\{\{@([^:]+):([^}]+)\}\}/g,C=0,z;for(;(z=K.exec(J))!==null;){let[N]=z,R=z.index;if(R>C){let de=J.slice(C,R),B=document.createTextNode(de);V.appendChild(B)}let G=document.createElement("span"),oe=Tu(N,h);G.className=oe?"inline-flex items-center gap-1 rounded bg-blue-500/10 px-1.5 py-0.5 text-blue-600 dark:text-blue-400 font-mono text-xs border border-blue-500/20 mx-0.5":"inline-flex items-center gap-1 rounded bg-red-500/10 px-1.5 py-0.5 text-red-600 dark:text-red-400 font-mono text-xs border border-red-500/20 mx-0.5",G.contentEditable="false",G.setAttribute("data-template",N),G.textContent=Au(N,h),V.appendChild(G),C=K.lastIndex}if(C<J.length){let N=J.slice(C),R=document.createTextNode(N);V.appendChild(R)}V.innerHTML===""&&a&&(V.innerHTML="<br>"),u.current=!1,F&&requestAnimationFrame(()=>m(F))},X=()=>{if(!i.current)return"";let V="",J=document.createTreeWalker(i.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null),F;for(;F=J.nextNode();)if(F.nodeType===Node.TEXT_NODE){let K=F.parentElement,C=!1;for(;K&&K!==i.current;){if(K.getAttribute("data-template")){C=!0;break}K=K.parentElement}C||(V+=F.textContent)}else if(F.nodeType===Node.ELEMENT_NODE){let C=F.getAttribute("data-template");C&&(V+=C)}return V},le=()=>{let V=X();if(V===l)return;let J=(l.match(/\{\{@([^:]+):([^}]+)\}\}/g)||[]).length,F=(V.match(/\{\{@([^:]+):([^}]+)\}\}/g)||[]).length;if(F>J){c(V),t?.(V),u.current=!0,b(!1),requestAnimationFrame(()=>S());return}if(F===J&&F>0){c(V),t?.(V);let C=V.lastIndexOf("@");if(C!==-1){let z=V.slice(C+1);if(z.includes(" "))b(!1);else{if(g(z),I(C),i.current){let N=i.current.getBoundingClientRect(),R={top:N.bottom+window.scrollY+4,left:N.left+window.scrollX};p(R)}b(!0)}}else b(!1);return}if(F<J){c(V),t?.(V),u.current=!0,requestAnimationFrame(()=>S());return}c(V),t?.(V);let K=V.lastIndexOf("@");if(K!==-1){let C=V.slice(K+1);if(C.includes(" "))b(!1);else{if(g(C),I(K),i.current){let z=i.current.getBoundingClientRect(),N={top:z.bottom+window.scrollY+4,left:z.left+window.scrollX};p(N)}b(!0)}}else b(!1)},L=V=>{if(!i.current||k===null)return;let J=X(),F=J.slice(0,k),K=J.slice(k+1+v.length),C=F+V+K,z=F.length+V.length;c(C),t?.(C),u.current=!0,b(!1),I(null),A.current=z,i.current.focus()},W=()=>{d(!0),u.current=!0},$=()=>{setTimeout(()=>{document.activeElement!==i.current&&(d(!1),u.current=!0,b(!1))},200)},P=V=>{V.preventDefault();let J=V.clipboardData.getData("text/plain");document.execCommand("insertText",!1,J)};return Pa(()=>{u.current&&S()},[l,a]),Iu(Su,{children:[Da("div",{className:x("flex min-h-9 w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm transition-colors focus-within:outline-none focus-within:ring-1 focus-within:ring-ring",n&&"cursor-not-allowed opacity-50",r),children:Da("div",{className:"w-full outline-none",contentEditable:!n,id:s,onBlur:$,onFocus:W,onInput:le,onPaste:P,ref:i,role:"textbox",suppressContentEditableWarning:!0})}),Da(Dr,{currentNodeId:f||void 0,filter:v,isOpen:T,onClose:()=>b(!1),onSelect:L,position:y})]})}import{jsx as at,jsxs as Co}from"react/jsx-runtime";function Ni({config:e,onUpdateConfig:t,disabled:o}){let n=e?.dataType||"string",r=e?.operator||cr[n][0].value,s=cr[n],d=s.find(l=>l.value===r)?.unary??!1;function i(l){t("dataType",l);let c=cr[l];c?.[0]&&t("operator",c[0].value)}return Co("div",{className:"space-y-4",children:[Co("div",{className:"space-y-2",children:[at(M,{htmlFor:"leftValue",children:"Value to Test"}),at(De,{disabled:o,id:"leftValue",onChange:l=>t("leftValue",l),placeholder:"e.g., {{PreviousNode.status}}",value:e?.leftValue||""}),at("p",{className:"text-muted-foreground text-xs",children:"Use @ to reference previous node outputs."})]}),Co("div",{className:"space-y-2",children:[at(M,{htmlFor:"dataType",children:"Data Type"}),Co(ve,{disabled:o,onValueChange:i,value:n,children:[at(he,{id:"dataType",children:at(we,{placeholder:"Select data type"})}),at(be,{children:Xs.map(l=>at(te,{value:l.value,children:l.label},l.value))})]})]}),Co("div",{className:"space-y-2",children:[at(M,{htmlFor:"operator",children:"Operator"}),Co(ve,{disabled:o,onValueChange:l=>t("operator",l),value:r,children:[at(he,{id:"operator",children:at(we,{placeholder:"Select operator"})}),at(be,{children:s.map(l=>at(te,{value:l.value,children:l.label},l.value))})]})]}),!d&&Co("div",{className:"space-y-2",children:[at(M,{htmlFor:"rightValue",children:"Compare Value"}),at(De,{disabled:o,id:"rightValue",onChange:l=>t("rightValue",l),placeholder:"e.g., 200 or {{OtherNode.field}}",value:e?.rightValue||""})]})]})}import{Plus as Pu,Trash2 as Eu}from"lucide-react";import{nanoid as Du}from"nanoid";import{jsx as Ce,jsxs as ct}from"react/jsx-runtime";function lo({schema:e,onChange:t,disabled:o,level:n=0}){let r=()=>{t([...e,{id:Du(),name:"",type:"string"}])},s=(c,u)=>{let f={...c};return u!=="array"&&(f.itemType=void 0),u!=="object"&&(f.fields=void 0),u==="array"&&!f.itemType&&(f.itemType="string"),u==="object"&&!f.fields&&(f.fields=[]),f},a=(c,u)=>{let f=[...e];f[c]={...f[c],...u},u.type&&(f[c]=s(f[c],u.type)),t(f)},d=c=>{t(e.filter((u,f)=>f!==c))},i=(c,u)=>{let f=[...e];f[c].fields=u,t(f)},l=n>0?"ml-4 border-l-2 border-muted pl-4":"";return ct("div",{className:`space-y-3 ${l}`,children:[e.map((c,u)=>{let f=c.id||`field-${n}-${u}`;return ct("div",{className:"space-y-2 rounded-md border p-3",children:[ct("div",{className:"flex gap-2",children:[ct("div",{className:"flex-1 space-y-2",children:[Ce(M,{className:"ml-1",htmlFor:`field-name-${n}-${u}`,children:"Property Name"}),Ce(se,{disabled:o,id:`field-name-${n}-${u}`,onChange:h=>a(u,{name:h.target.value}),placeholder:"propertyName",value:c.name})]}),ct("div",{className:"flex-1 space-y-2",children:[Ce(M,{className:"ml-1",htmlFor:`field-type-${n}-${u}`,children:"Type"}),ct(ve,{disabled:o,onValueChange:h=>a(u,{type:h}),value:c.type,children:[Ce(he,{className:"w-full",id:`field-type-${n}-${u}`,children:Ce(we,{})}),ct(be,{children:[Ce(te,{value:"string",children:"String"}),Ce(te,{value:"number",children:"Number"}),Ce(te,{value:"boolean",children:"Boolean"}),Ce(te,{value:"array",children:"Array"}),Ce(te,{value:"object",children:"Object"})]})]})]}),Ce("div",{className:"flex items-end",children:Ce(D,{disabled:o,onClick:()=>d(u),size:"icon",variant:"ghost",children:Ce(Eu,{className:"h-4 w-4"})})})]}),c.type==="array"&&ct("div",{className:"space-y-2",children:[Ce(M,{className:"ml-1",htmlFor:`field-item-type-${n}-${u}`,children:"Array Item Type"}),ct(ve,{disabled:o,onValueChange:h=>a(u,{itemType:h}),value:c.itemType||"string",children:[Ce(he,{className:"w-full",id:`field-item-type-${n}-${u}`,children:Ce(we,{})}),ct(be,{children:[Ce(te,{value:"string",children:"String"}),Ce(te,{value:"number",children:"Number"}),Ce(te,{value:"boolean",children:"Boolean"}),Ce(te,{value:"object",children:"Object"})]})]})]}),c.type==="object"&&ct("div",{className:"mt-2",children:[Ce(M,{className:"mb-2 block",children:"Object Properties"}),Ce(lo,{disabled:o,level:n+1,onChange:h=>i(u,h),schema:c.fields||[]})]}),c.type==="array"&&c.itemType==="object"&&ct("div",{className:"mt-2",children:[Ce(M,{className:"mb-2 block",children:"Array Item Properties"}),Ce(lo,{disabled:o,level:n+1,onChange:h=>i(u,h),schema:c.fields||[]})]}),ct("div",{className:"space-y-2",children:[Ce(M,{className:"ml-1",htmlFor:`field-desc-${n}-${u}`,children:"Description (optional)"}),Ce(se,{disabled:o,id:`field-desc-${n}-${u}`,onChange:h=>a(u,{description:h.target.value}),placeholder:"Description for the AI",value:c.description||""})]})]},f)}),ct(D,{className:"w-full",disabled:o,onClick:r,type:"button",variant:"outline",children:[Ce(Pu,{className:"size-4"}),"Add Property"]})]})}import{Fragment as Ru,jsx as an,jsxs as Ra}from"react/jsx-runtime";function ki({config:e,onUpdateConfig:t,disabled:o}){return Ra(Ru,{children:[Ra("div",{className:"space-y-2",children:[an(M,{htmlFor:"dbQuery",children:"SQL Query"}),an("div",{className:"overflow-hidden rounded-md border",children:an(yt,{defaultLanguage:"sql",height:"150px",onChange:n=>t("dbQuery",n||""),options:{minimap:{enabled:!1},lineNumbers:"on",scrollBeyondLastLine:!1,fontSize:12,readOnly:o,wordWrap:"off"},value:e?.dbQuery||""})}),an("p",{className:"text-muted-foreground text-xs",children:"The DATABASE_URL from your project integrations will be used to execute this query."})]}),Ra("div",{className:"space-y-2",children:[an(M,{children:"Schema (Optional)"}),an(lo,{disabled:o,onChange:n=>t("dbSchema",JSON.stringify(n)),schema:e?.dbSchema?JSON.parse(e.dbSchema):[]})]})]})}import{Fragment as Ou,jsx as Ke,jsxs as To}from"react/jsx-runtime";function Ci({config:e,onUpdateConfig:t,disabled:o}){return To(Ou,{children:[To("div",{className:"space-y-2",children:[Ke(M,{htmlFor:"httpMethod",children:"HTTP Method"}),To(ve,{disabled:o,onValueChange:n=>t("httpMethod",n),value:e?.httpMethod||"POST",children:[Ke(he,{className:"w-full",id:"httpMethod",children:Ke(we,{placeholder:"Select method"})}),To(be,{children:[Ke(te,{value:"GET",children:"GET"}),Ke(te,{value:"POST",children:"POST"}),Ke(te,{value:"PUT",children:"PUT"}),Ke(te,{value:"PATCH",children:"PATCH"}),Ke(te,{value:"DELETE",children:"DELETE"})]})]})]}),To("div",{className:"space-y-2",children:[Ke(M,{htmlFor:"endpoint",children:"URL"}),Ke(De,{disabled:o,id:"endpoint",onChange:n=>t("endpoint",n),placeholder:"https://api.example.com/endpoint or {{NodeName.url}}",value:e?.endpoint||""})]}),To("div",{className:"space-y-2",children:[Ke(M,{htmlFor:"httpHeaders",children:"Headers (JSON)"}),Ke("div",{className:"overflow-hidden rounded-md border",children:Ke(yt,{defaultLanguage:"json",height:"100px",onChange:n=>t("httpHeaders",n||"{}"),options:{minimap:{enabled:!1},lineNumbers:"off",scrollBeyondLastLine:!1,fontSize:12,readOnly:o,wordWrap:"off"},value:e?.httpHeaders||"{}"})})]}),To("div",{className:"space-y-2",children:[Ke(M,{htmlFor:"httpBody",children:"Body (JSON)"}),Ke("div",{className:`overflow-hidden rounded-md border ${e?.httpMethod==="GET"?"opacity-50":""}`,children:Ke(yt,{defaultLanguage:"json",height:"120px",onChange:n=>t("httpBody",n||"{}"),options:{minimap:{enabled:!1},lineNumbers:"off",scrollBeyondLastLine:!1,fontSize:12,readOnly:e?.httpMethod==="GET"||o,domReadOnly:e?.httpMethod==="GET"||o,wordWrap:"off"},value:e?.httpBody||"{}"})}),e?.httpMethod==="GET"&&Ke("p",{className:"text-muted-foreground text-xs",children:"Body is disabled for GET requests"})]})]})}import{jsx as sn,jsxs as Oa}from"react/jsx-runtime";function Ti({config:e,onUpdateConfig:t,disabled:o}){return Oa("div",{className:"space-y-4",children:[Oa("div",{className:"space-y-2",children:[sn(M,{htmlFor:"items",children:"Items to Iterate"}),sn(De,{disabled:o,id:"items",onChange:n=>t("items",n),placeholder:"e.g., {{PreviousNode.rows}}, {{DatabaseQuery.results}}",value:e?.items||""}),sn("p",{className:"text-muted-foreground text-xs",children:"Reference an array from a previous node. Use @ to reference outputs."})]}),Oa("div",{className:"space-y-2",children:[sn(M,{htmlFor:"batchSize",children:"Batch Size (optional)"}),sn(De,{disabled:o,id:"batchSize",onChange:n=>t("batchSize",n),placeholder:"1",value:e?.batchSize||""}),sn("p",{className:"text-muted-foreground text-xs",children:"Number of items per batch. Default is 1 (process one item at a time)."})]})]})}import{Fragment as Lu,jsx as ye,jsxs as Xe}from"react/jsx-runtime";function Ai({config:e,onUpdateConfig:t,disabled:o}){let n=e?.mode||"append";return Xe("div",{className:"space-y-4",children:[Xe("div",{className:"space-y-2",children:[ye(M,{htmlFor:"mode",children:"Mode"}),Xe(ve,{disabled:o,onValueChange:r=>t("mode",r),value:n,children:[ye(he,{id:"mode",children:ye(we,{placeholder:"Select mode"})}),Xe(be,{children:[ye(te,{value:"append",children:"Append"}),ye(te,{value:"combineByPosition",children:"Combine by Position"}),ye(te,{value:"combineByFields",children:"Combine by Fields"})]})]}),Xe("p",{className:"text-muted-foreground text-xs",children:[n==="append"&&"Concatenate both lists into one.",n==="combineByPosition"&&"Merge items at the same index from both inputs.",n==="combineByFields"&&"Match and merge items based on a common field."]})]}),Xe("div",{className:"space-y-2",children:[ye(M,{htmlFor:"input1",children:"Input 1"}),ye(De,{disabled:o,id:"input1",onChange:r=>t("input1",r),placeholder:"e.g., {{PreviousNode.rows}}",value:e?.input1||""}),ye("p",{className:"text-muted-foreground text-xs",children:"First array to merge. Use @ to reference outputs from previous nodes."})]}),Xe("div",{className:"space-y-2",children:[ye(M,{htmlFor:"input2",children:"Input 2"}),ye(De,{disabled:o,id:"input2",onChange:r=>t("input2",r),placeholder:"e.g., {{AnotherNode.results}}",value:e?.input2||""}),ye("p",{className:"text-muted-foreground text-xs",children:"Second array to merge. Use @ to reference outputs from previous nodes."})]}),n==="combineByPosition"&&Xe("div",{className:"space-y-2",children:[ye(M,{htmlFor:"unmatchedHandling",children:"When arrays have different lengths"}),Xe(ve,{disabled:o,onValueChange:r=>t("unmatchedHandling",r),value:e?.unmatchedHandling||"useNull",children:[ye(he,{id:"unmatchedHandling",children:ye(we,{})}),Xe(be,{children:[ye(te,{value:"useNull",children:"Fill with null"}),ye(te,{value:"discard",children:"Discard extra items"})]})]})]}),n==="combineByFields"&&Xe(Lu,{children:[Xe("div",{className:"space-y-2",children:[ye(M,{htmlFor:"matchField1",children:"Match Field (Input 1)"}),ye(De,{disabled:o,id:"matchField1",onChange:r=>t("matchField1",r),placeholder:"e.g., id",value:e?.matchField1||""}),ye("p",{className:"text-muted-foreground text-xs",children:"Field name in Input 1 to match on."})]}),Xe("div",{className:"space-y-2",children:[ye(M,{htmlFor:"matchField2",children:"Match Field (Input 2)"}),ye(De,{disabled:o,id:"matchField2",onChange:r=>t("matchField2",r),placeholder:"e.g., id",value:e?.matchField2||""}),ye("p",{className:"text-muted-foreground text-xs",children:"Field name in Input 2 to match on."})]}),Xe("div",{className:"space-y-2",children:[ye(M,{htmlFor:"joinType",children:"Join Type"}),Xe(ve,{disabled:o,onValueChange:r=>t("joinType",r),value:e?.joinType||"inner",children:[ye(he,{id:"joinType",children:ye(we,{})}),Xe(be,{children:[ye(te,{value:"inner",children:"Inner Join"}),ye(te,{value:"leftOuter",children:"Left Outer Join"}),ye(te,{value:"rightOuter",children:"Right Outer Join"}),ye(te,{value:"fullOuter",children:"Full Outer Join"})]})]}),ye("p",{className:"text-muted-foreground text-xs",children:"Inner keeps only matches. Left/Right keeps all items from that input. Full keeps everything."})]})]})]})}import{Loader2 as Mu}from"lucide-react";import{useEffect as Fu,useState as Si}from"react";import{jsx as Gt,jsxs as zn}from"react/jsx-runtime";function Ii({config:e,onUpdateConfig:t,disabled:o}){let[n,r]=Si([]),[s,a]=Si(!0);Fu(()=>{async function i(){try{let l=await fetch("/api/workflow-builder/workflows");if(l.ok){let c=await l.json();r((c.workflows||c||[]).map(u=>({id:u.id,name:u.name})))}}catch{}finally{a(!1)}}i()},[]);let d=e?.workflowId||"";return zn("div",{className:"space-y-4",children:[zn("div",{className:"space-y-2",children:[Gt(M,{htmlFor:"workflowId",children:"Workflow"}),s?zn("div",{className:"flex items-center gap-2 rounded-md border px-3 py-2 text-muted-foreground text-sm",children:[Gt(Mu,{className:"size-4 animate-spin"}),"Loading workflows..."]}):zn(ve,{disabled:o||n.length===0,onValueChange:i=>t("workflowId",i),value:d||void 0,children:[Gt(he,{className:"w-full",id:"workflowId",children:Gt(we,{placeholder:n.length===0?"No workflows found":"Select a workflow"})}),Gt(be,{children:n.map(i=>Gt(te,{value:i.id,children:i.name},i.id))})]}),Gt("p",{className:"text-muted-foreground text-xs",children:"The workflow to execute. It will run inline and wait for completion."})]}),zn("div",{className:"space-y-2",children:[Gt(M,{htmlFor:"input",children:"Input (optional JSON)"}),Gt(De,{disabled:o,id:"input",onChange:i=>t("input",i),placeholder:'{"key": "value"} or {{PreviousNode.field}}',value:e?.input||""}),Gt("p",{className:"text-muted-foreground text-xs",children:"Optional JSON passed as trigger input to the sub-workflow."})]})]})}import{ArrowDown as Wu,ArrowUp as zu,Loader2 as Bu,Plus as Vu,Trash2 as Gu}from"lucide-react";import{useEffect as Hu,useState as Pi}from"react";import{jsx as Re,jsxs as kt}from"react/jsx-runtime";function Ei({config:e,onUpdateConfig:t,disabled:o}){let[n,r]=Pi([]),[s,a]=Pi(!0);Hu(()=>{async function p(){try{let v=await fetch("/api/workflow-builder/workflows");if(v.ok){let g=await v.json();r((g.workflows||g||[]).map(k=>({id:k.id,name:k.name})))}}catch{}finally{a(!1)}}p()},[]);let d=e?.workflowIds||"[]",i=[];try{let p=JSON.parse(d);Array.isArray(p)&&(i=p)}catch{i=d.split(",").map(p=>p.trim()).filter(Boolean)}let l=p=>{t("workflowIds",JSON.stringify(p))},c=p=>{p&&!i.includes(p)&&l([...i,p])},u=p=>{let v=[...i];v.splice(p,1),l(v)},f=p=>{if(p===0)return;let v=[...i];[v[p-1],v[p]]=[v[p],v[p-1]],l(v)},h=p=>{if(p===i.length-1)return;let v=[...i];[v[p],v[p+1]]=[v[p+1],v[p]],l(v)},T=p=>n.find(v=>v.id===p)?.name||p,b=n.filter(p=>!i.includes(p.id)),y=e?.continueOnFailure||"false";return kt("div",{className:"space-y-4",children:[kt("div",{className:"space-y-2",children:[Re(M,{children:"Workflows (executed in order)"}),s?kt("div",{className:"flex items-center gap-2 rounded-md border px-3 py-2 text-muted-foreground text-sm",children:[Re(Bu,{className:"size-4 animate-spin"}),"Loading workflows..."]}):kt("div",{className:"space-y-1",children:[i.map((p,v)=>kt("div",{className:"flex items-center gap-1 rounded-md border bg-muted/30 px-2 py-1.5 text-sm",children:[kt("span",{className:"w-5 shrink-0 text-center text-muted-foreground text-xs",children:[v+1,"."]}),Re("span",{className:"min-w-0 flex-1 truncate",children:T(p)}),Re(D,{className:"size-6",disabled:o||v===0,onClick:()=>f(v),size:"icon",variant:"ghost",children:Re(zu,{className:"size-3"})}),Re(D,{className:"size-6",disabled:o||v===i.length-1,onClick:()=>h(v),size:"icon",variant:"ghost",children:Re(Wu,{className:"size-3"})}),Re(D,{className:"size-6 text-destructive hover:text-destructive",disabled:o,onClick:()=>u(v),size:"icon",variant:"ghost",children:Re(Gu,{className:"size-3"})})]},`${p}-${v}`)),b.length>0&&kt(ve,{disabled:o,onValueChange:c,value:"",children:[Re(he,{className:x("w-full",i.length>0&&"border-dashed"),children:kt("div",{className:"flex items-center gap-1.5 text-muted-foreground",children:[Re(Vu,{className:"size-3.5"}),Re("span",{children:"Add workflow..."})]})}),Re(be,{children:b.map(p=>Re(te,{value:p.id,children:p.name},p.id))})]}),!s&&n.length===0&&Re("p",{className:"text-muted-foreground text-xs",children:"No workflows found."})]})]}),kt("div",{className:"space-y-2",children:[Re(M,{htmlFor:"continueOnFailure",children:"On failure"}),kt(ve,{disabled:o,onValueChange:p=>t("continueOnFailure",p),value:y,children:[Re(he,{className:"w-full",id:"continueOnFailure",children:Re(we,{})}),kt(be,{children:[Re(te,{value:"false",children:"Stop sequence"}),Re(te,{value:"true",children:"Continue with next workflow"})]})]})]}),kt("div",{className:"space-y-2",children:[Re(M,{htmlFor:"sequenceInput",children:"Input (optional JSON, passed to all workflows)"}),Re(De,{disabled:o,id:"sequenceInput",onChange:p=>t("input",p),placeholder:'{"key": "value"} or {{PreviousNode.field}}',value:e?.input||""}),Re("p",{className:"text-muted-foreground text-xs",children:"Optional JSON passed as trigger input to every workflow in the sequence."})]})]})}import{jsx as st,jsxs as Lt}from"react/jsx-runtime";function Di({config:e,onUpdateConfig:t,disabled:o}){let n=e?.mode||"rules";return Lt("div",{className:"space-y-4",children:[Lt("div",{className:"space-y-2",children:[st(M,{htmlFor:"mode",children:"Mode"}),Lt(ve,{disabled:o,onValueChange:r=>t("mode",r),value:n,children:[st(he,{id:"mode",children:st(we,{placeholder:"Select mode"})}),Lt(be,{children:[st(te,{value:"rules",children:"Rules"}),st(te,{value:"expression",children:"Expression"})]})]}),Lt("p",{className:"text-muted-foreground text-xs",children:[n==="rules"&&"Each route has a condition. The first route whose condition is true wins.",n==="expression"&&"Compare a value against each route's case value. First match wins."]})]}),n==="expression"&&Lt("div",{className:"space-y-2",children:[st(M,{htmlFor:"switchValue",children:"Value to Switch On"}),st(De,{disabled:o,id:"switchValue",onChange:r=>t("switchValue",r),placeholder:"e.g., {{PreviousNode.statusCode}}",value:e?.switchValue||""}),st("p",{className:"text-muted-foreground text-xs",children:"The value to compare against each route's case value. Use @ to reference previous node outputs."})]}),[0,1,2,3].map(r=>Lt("div",{className:"space-y-3 rounded-md border p-3",children:[Lt("p",{className:"font-medium text-sm",children:["Route ",r+1]}),Lt("div",{className:"space-y-2",children:[st(M,{htmlFor:`routeName${r}`,children:"Name (optional)"}),st(se,{disabled:o,id:`routeName${r}`,onChange:s=>t(`routeName${r}`,s.target.value),placeholder:`Route ${r+1}`,value:e?.[`routeName${r}`]||""})]}),n==="rules"&&Lt("div",{className:"space-y-2",children:[st(M,{htmlFor:`routeCondition${r}`,children:"Condition"}),st(De,{disabled:o,id:`routeCondition${r}`,onChange:s=>t(`routeCondition${r}`,s),placeholder:"e.g., {{PreviousNode.status}} === 200",value:e?.[`routeCondition${r}`]||""})]}),n==="expression"&&Lt("div",{className:"space-y-2",children:[st(M,{htmlFor:`routeCaseValue${r}`,children:"Case Value"}),st(De,{disabled:o,id:`routeCaseValue${r}`,onChange:s=>t(`routeCaseValue${r}`,s),placeholder:`e.g., ${r===0?"200":r===1?"404":r===2?"500":"default"}`,value:e?.[`routeCaseValue${r}`]||""})]})]},r)),st("p",{className:"text-muted-foreground text-xs",children:'Routes are evaluated in order. The first matching route wins. If no route matches, the result falls back to "Default".'})]})}import{atom as Rr}from"jotai";var Or=Rr(null),Ri=Rr([]),Oi=Rr(!1),pw=Rr(!1);import{useAtomValue as qi,useSetAtom as za}from"jotai";import{Search as rm}from"lucide-react";import{useCallback as am,useMemo as sm,useState as un}from"react";import{toast as Io}from"sonner";import{atom as Bn,useSetAtom as $u}from"jotai";import*as Mi from"react";var Li=null;var Ao=Bn(null),Lr=Bn([]),Mr=Bn(!1),Fi=Bn(!1),Kt=Bn(null);function Wi(){let e=$u(Kt);Mi.useEffect(()=>{Li&&e(Li)},[e])}import{Database as _u,HelpCircle as Uu}from"lucide-react";import{jsx as Vn}from"react/jsx-runtime";function Ku({className:e}){return Vn("svg",{className:e,fill:"currentColor",height:"12",viewBox:"0 0 1155 1000",width:"12",xmlns:"http://www.w3.org/2000/svg",children:Vn("path",{d:"m577.3 0 577.4 1000H0z"})})}var qu={database:_u,vercel:Ku};function Mt({integration:e,className:t="h-3 w-3"}){let o=qu[e];if(o)return Vn(o,{className:x("text-foreground",t)});let n=Dt(e);if(n?.icon){let r=n.icon;return Vn(r,{className:x("text-foreground",t)})}return Vn(Uu,{className:x("text-foreground",t)})}import{AlertTriangleIcon as om}from"lucide-react";import{Loader2 as ju}from"lucide-react";import{jsx as ln,jsxs as Ma}from"react/jsx-runtime";function La({action:e}){return Ma(D,{disabled:e.disabled||e.loading,onClick:e.onClick,variant:e.variant??"default",children:[e.loading&&ln(ju,{className:"mr-2 size-4 animate-spin"}),e.label]})}function zi({actions:e,className:t,children:o}){if(o)return ln("div",{className:x("flex flex-col-reverse gap-2 p-6 pt-4 sm:flex-row sm:justify-end",t),children:o});if(!e||e.length===0)return null;let n=e.filter(i=>i.variant==="ghost"),r=e.filter(i=>i.variant==="outline"||i.variant==="secondary"),s=e.filter(i=>!i.variant||i.variant==="default"||i.variant==="destructive"),a=n.length>0,d=r.length>0||s.length>0;return Ma("div",{className:x("flex flex-col-reverse gap-2 p-6 pt-4 sm:flex-row",a&&d?"sm:justify-between":"sm:justify-end",t),children:[a&&ln("div",{className:"flex flex-col-reverse gap-2 sm:flex-row",children:n.map(i=>ln(La,{action:i},i.label))}),d&&Ma("div",{className:"flex flex-col-reverse gap-2 sm:flex-row",children:[r.map(i=>ln(La,{action:i},i.label)),s.map(i=>ln(La,{action:i},i.label))]})]})}import{ChevronLeftIcon as Qu,XIcon as Zu}from"lucide-react";import{createContext as Vi,useCallback as dn,useContext as Gi,useMemo as Ju,useRef as Yu,useState as Xu}from"react";import{jsx as Bi}from"react/jsx-runtime";var Hi=Vi(null),$i=Vi([]);function Fa(){return`overlay-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function _i({children:e}){let[t,o]=Xu([]),n=Yu([]);t.length>0&&(n.current=t);let r=dn((u,f,h)=>{let T=Fa();return o([{id:T,component:u,props:f??{},options:h??{}}]),T},[]),s=dn((u,f,h)=>{let T=Fa(),b={id:T,component:u,props:f??{},options:h??{}};return o(y=>[...y,b]),T},[]),a=dn(()=>{o(u=>u.length<=1?(u[0]?.options.onClose?.(),[]):(u[u.length-1]?.options.onClose?.(),u.slice(0,-1)))},[]),d=dn((u,f,h)=>{let T=Fa(),b={id:T,component:u,props:f??{},options:h??{}};return o(y=>y.length===0?[b]:(y[y.length-1]?.options.onClose?.(),[...y.slice(0,-1),b])),T},[]),i=dn(()=>{o(u=>{for(let f of u)f.options.onClose?.();return[]})},[]),l=dn(u=>{o(f=>{let h=f.findIndex(T=>T.id===u);if(h===-1)return f;for(let T=h;T<f.length;T++)f[T].options.onClose?.();return f.slice(0,h)})},[]),c=Ju(()=>({stack:t,open:r,push:s,pop:a,replace:d,closeAll:i,close:l,hasOverlays:t.length>0,depth:t.length}),[t,r,s,a,d,i,l]);return Bi(Hi.Provider,{value:c,children:Bi($i.Provider,{value:n.current,children:e})})}function re(){let e=Gi(Hi);if(!e)throw new Error("useOverlay must be used within an OverlayProvider");return e}function Ui(e){let{stack:t}=re(),o=Gi($i),n=t.length>0?t:o,r=n.findIndex(s=>s.id===e);return{index:r,isFirst:r===0,isLast:r===n.length-1,depth:n.length,showBackButton:r>0}}import{jsx as So,jsxs as Ki}from"react/jsx-runtime";function em({title:e,description:t,showBackButton:o,showCloseButton:n=!0,onBack:r,onClose:s,className:a}){let{pop:d,closeAll:i}=re(),l=o??!1,c=()=>{r?r():d()},u=()=>{s?s():i()};return Ki("div",{className:x("relative flex flex-col gap-1.5 p-6 pb-0",a),children:[Ki("div",{className:"flex min-h-8 items-center gap-2",children:[l&&So(D,{"aria-label":"Go back",className:"ml-[-8px] size-8 shrink-0",onClick:c,size:"icon",variant:"ghost",children:So(Qu,{className:"size-5"})}),e&&So("h2",{className:"flex-1 font-semibold text-lg leading-none tracking-tight",children:e}),n&&So(D,{"aria-label":"Close",className:"absolute top-4 right-4 size-8 shrink-0 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",onClick:u,size:"icon",variant:"ghost",children:So(Zu,{className:"size-4"})})]}),t&&So("p",{className:"text-muted-foreground text-sm",children:t})]})}function cn({overlayId:e,showBackButton:t,...o}){let{showBackButton:n}=Ui(e);return So(em,{...o,showBackButton:t??n})}import{jsx as Wa,jsxs as tm}from"react/jsx-runtime";function Oe({overlayId:e,title:t,description:o,actions:n,children:r,className:s}){return tm("div",{className:x("flex flex-col",s),children:[(t||o)&&Wa(cn,{description:o,overlayId:e,title:t}),r&&Wa("div",{className:"flex-1 overflow-y-auto p-6",children:r}),Wa(zi,{actions:n})]})}import{jsx as Fr,jsxs as nm}from"react/jsx-runtime";function Me({overlayId:e,title:t="Confirm",message:o,confirmLabel:n="Confirm",cancelLabel:r="Cancel",confirmVariant:s="default",destructive:a=!1,onConfirm:d,onCancel:i}){let{pop:l}=re();return Fr(Oe,{actions:[{label:r,variant:"outline",onClick:()=>{i?.(),l()}},{label:n,variant:a?"destructive":s,onClick:async()=>{await d(),l()}}],overlayId:e,title:t,children:nm("div",{className:"flex gap-4",children:[a&&Fr("div",{className:"flex size-10 shrink-0 items-center justify-center rounded-full bg-destructive/10",children:Fr(om,{className:"size-5 text-destructive"})}),Fr("p",{className:x("text-muted-foreground text-sm",a&&"pt-2"),children:o})]})})}import{jsx as Ge,jsxs as vt}from"react/jsx-runtime";var im=["database"],lm={database:"Database"},dm={database:"Connect to PostgreSQL databases"},cm=()=>[...Js(),...im],Ba=e=>eo()[e]||lm[e]||e,um=e=>js()[e]||dm[e]||"";function Ji({overlayId:e,onSuccess:t}){let{push:o,closeAll:n}=re(),[r,s]=un(""),a=Vt(),d=qi(Kt),i=qi(Ao),l=za(Ao),c=za(Lr),u=za(Mr),f=cm(),h=sm(()=>{if(!r.trim())return f;let y=r.toLowerCase();return f.filter(p=>Ba(p).toLowerCase().includes(y))},[f,r]),T=am(()=>{d&&o(d.ConsentOverlay,{onConsent:y=>{t?.(y),n()}})},[d,o,n,t]),b=y=>{let p=d?.integrationType===y;if(p&&i?.enabled&&i?.isVercelUser){T();return}if(p&&i===null){d.api.getStatus().then(g=>{l(g),g?.enabled&&g?.isVercelUser?(u(!0),d.api.getTeams().then(k=>{c(k.teams)}).finally(()=>{u(!1),T()})):o(co,{type:y,onSuccess:t})});return}o(co,{type:y,onSuccess:t})};return vt(Oe,{overlayId:e,title:"Add Connection",children:[Ge("p",{className:"-mt-2 mb-4 text-muted-foreground text-sm",children:"Select a service to connect"}),vt("div",{className:"space-y-3",children:[vt("div",{className:"relative",children:[Ge(rm,{className:"absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted-foreground"}),Ge(se,{autoFocus:!a,className:"pl-9",onChange:y=>s(y.target.value),placeholder:"Search services...",value:r})]}),Ge("div",{className:"max-h-[300px] space-y-1 overflow-y-auto",children:h.length===0?Ge("p",{className:"py-4 text-center text-muted-foreground text-sm",children:"No services found"}):h.map(y=>{let p=um(y);return vt("button",{className:"flex w-full items-center gap-3 rounded-md px-3 py-2 text-left text-sm transition-colors hover:bg-muted/50",onClick:()=>b(y),type:"button",children:[Ge(Mt,{className:"size-5 shrink-0",integration:y==="ai-gateway"?"vercel":y}),vt("span",{className:"min-w-0 flex-1 truncate",children:[Ge("span",{className:"font-medium",children:Ba(y)}),p&&vt("span",{className:"text-muted-foreground text-xs",children:[" ","- ",p]})]})]},y)})})]})]})}function ji({fieldId:e,label:t,configKey:o,placeholder:n,helpText:r,helpLink:s,value:a,onChange:d}){return vt("div",{className:"space-y-2",children:[Ge(M,{htmlFor:e,children:t}),Ge(se,{className:"flex-1",id:e,onChange:i=>d(o,i.target.value),placeholder:n,type:"password",value:a}),(r||s)&&vt("p",{className:"text-muted-foreground text-xs",children:[r,s&&Ge("a",{className:"underline hover:text-foreground",href:s.url,rel:"noopener noreferrer",target:"_blank",children:s.text})]})]})}function co({overlayId:e,type:t,onSuccess:o}){let{push:n,closeAll:r}=re(),[s,a]=un(!1),[d,i]=un(!1),[l,c]=un(null),[u,f]=un(""),[h,T]=un({}),b=(A,w)=>{T(m=>({...m,[A]:w}))},y=async()=>{try{a(!0);let A=await q.integration.create({name:u.trim(),type:t,config:h});Io.success("Connection created"),o?.(A.id),r()}catch(A){console.error("Failed to save integration:",A),Io.error("Failed to save connection")}finally{a(!1)}},p=async()=>{if(!Object.values(h).some(w=>w&&w.length>0)){Io.error("Please enter credentials");return}try{a(!0),c(null);let w=await q.integration.testCredentials({type:t,config:h});if(w.status==="error"){n(Me,{title:"Connection Test Failed",message:`The test failed: ${w.message}
|
|
3
3
|
|
|
4
|
-
Do you want to save anyway?`,confirmLabel:"Save Anyway",onConfirm:async()=>{await y()}}),a(!1);return}await y()}catch(
|
|
4
|
+
Do you want to save anyway?`,confirmLabel:"Save Anyway",onConfirm:async()=>{await y()}}),a(!1);return}await y()}catch(w){let m=w instanceof Error?w.message:"Failed to test connection";n(Me,{title:"Connection Test Failed",message:`${m}
|
|
5
5
|
|
|
6
|
-
Do you want to save anyway?`,confirmLabel:"Save Anyway",onConfirm:async()=>{await y()}}),a(!1)}},
|
|
6
|
+
Do you want to save anyway?`,confirmLabel:"Save Anyway",onConfirm:async()=>{await y()}}),a(!1)}},v=async()=>{if(!Object.values(h).some(w=>w&&w.length>0)){Io.error("Please enter credentials first");return}try{i(!0),c(null);let w=await q.integration.testCredentials({type:t,config:h});c(w),w.status==="success"?Io.success(w.message||"Connection successful"):Io.error(w.message||"Connection failed")}catch(w){let m=w instanceof Error?w.message:"Connection test failed";c({status:"error",message:m}),Io.error(m)}finally{i(!1)}},k=Dt(t)?.formFields,I=()=>t==="database"?Ge(ji,{configKey:"url",fieldId:"url",helpText:"Connection string in the format: postgresql://user:password@host:port/database",label:"Database URL",onChange:b,placeholder:"postgresql://user:password@host:port/database",value:h.url||""}):k?k.map(A=>A.type==="password"?Ge(ji,{configKey:A.configKey,fieldId:A.id,helpLink:A.helpLink,helpText:A.helpText,label:A.label,onChange:b,placeholder:A.placeholder,value:h[A.configKey]||""},A.id):vt("div",{className:"space-y-2",children:[Ge(M,{htmlFor:A.id,children:A.label}),Ge(se,{id:A.id,onChange:w=>b(A.configKey,w.target.value),placeholder:A.placeholder,type:A.type,value:h[A.configKey]||""}),(A.helpText||A.helpLink)&&vt("p",{className:"text-muted-foreground text-xs",children:[A.helpText,A.helpLink&&Ge("a",{className:"underline hover:text-foreground",href:A.helpLink.url,rel:"noopener noreferrer",target:"_blank",children:A.helpLink.text})]})]},A.id)):null;return vt(Oe,{actions:[{label:"Test",variant:"outline",onClick:v,loading:d,disabled:s},{label:"Create",onClick:p,loading:s}],overlayId:e,title:`Add ${Ba(t)}`,children:[Ge("p",{className:"-mt-2 mb-4 text-muted-foreground text-sm",children:"Enter your credentials"}),vt("div",{className:"space-y-4",children:[I(),vt("div",{className:"space-y-2",children:[Ge(M,{htmlFor:"name",children:"Label (Optional)"}),Ge(se,{id:"name",onChange:A=>f(A.target.value),placeholder:"e.g. Production, Personal, Work",value:u})]})]})]})}import{useAtomValue as Yi,useSetAtom as mm}from"jotai";import{Loader2 as pm,Sparkles as fm,X as gm}from"lucide-react";import{useCallback as Wr,useEffect as ym,useState as Va}from"react";import{jsx as qe,jsxs as uo}from"react/jsx-runtime";function Xi({overlayId:e,onConsent:t,onManualEntry:o,onDecline:n}){let{pop:r}=re(),s=mm(Or),[a,d]=Va(!1),[i,l]=Va(null),[c,u]=Va(""),f=Yi(Ri),h=Yi(Oi);ym(()=>{f.length>0&&!c&&u(f[0].id)},[f,c]);let T=Wr(g=>{d(!1),t?.(g),r()},[t,r]),b=Wr(async()=>{if(!c){l("Please select a team");return}let k=f.find(I=>I.id===c)?.name||"AI Gateway";d(!0),l(null);try{let I=await q.aiGateway.consent(c,k);if(!I.success)throw new Error(I.error||"Failed to set up AI Gateway");let A=I.managedIntegrationId||"";s(w=>w?{...w,hasManagedKey:I.hasManagedKey,managedIntegrationId:A}:null),T(A)}catch(I){l(I instanceof Error?I.message:"An error occurred"),d(!1)}},[c,f,s,T]),y=Wr(()=>{n?.(),r()},[n,r]),p=Wr(()=>{o?.()},[o]),v=[...o?[{label:"Enter manually",variant:"ghost",onClick:p,disabled:a}]:[],{label:"Cancel",variant:"outline",onClick:y,disabled:a},{label:a?"Setting up...":"Agree & Connect",variant:"default",onClick:b,disabled:a||h&&f.length===0||!c,loading:a}];return qe(Oe,{actions:v,description:"Connect your Vercel account to use your own AI Gateway balance",overlayId:e,title:"Use Your AI Gateway Credits",children:uo("div",{className:"space-y-4",children:[uo("div",{className:"flex items-start gap-3",children:[qe("div",{className:"flex size-10 shrink-0 items-center justify-center rounded-full bg-primary/10",children:qe(fm,{className:"size-5 text-primary"})}),qe("p",{className:"pt-2 text-muted-foreground text-sm",children:"This will create an API key on your Vercel account that uses your AI Gateway credits for AI operations in workflows."})]}),uo("div",{className:"space-y-2",children:[qe(M,{htmlFor:"team-select",children:"Vercel Team"}),h&&f.length===0?uo("div",{className:"flex h-10 items-center gap-2 rounded-md border px-3 text-muted-foreground text-sm",children:[qe(pm,{className:"size-4 animate-spin"}),"Loading teams..."]}):uo(ve,{disabled:a,onValueChange:u,value:c,children:[qe(he,{id:"team-select",children:qe(we,{placeholder:"Select a team"})}),qe(be,{children:f.map((g,k)=>uo("div",{children:[qe(te,{value:g.id,children:uo("div",{className:"flex items-center gap-2",children:[g.avatar?qe("img",{alt:"",className:"size-4 rounded-full bg-white",src:g.avatar}):qe("div",{className:"size-4 rounded-full bg-white"}),qe("span",{children:g.name}),g.isPersonal&&qe("span",{className:"text-muted-foreground text-xs",children:"(Personal)"})]})}),g.isPersonal&&k<f.length-1&&qe(Ir,{})]},g.id))})]})]}),i&&uo("div",{className:"flex items-start gap-3 rounded-md border border-red-500/30 bg-red-500/10 p-3",children:[qe(gm,{className:"mt-0.5 size-4 shrink-0 text-red-500"}),qe("p",{className:"text-red-700 text-sm dark:text-red-400",children:i})]})]})})}import{useAtom as Vr,useAtomValue as el,useSetAtom as tl}from"jotai";import{AlertTriangle as Cm,Check as $a,Circle as ol,Pencil as _a,Plus as Tm,Settings as Am}from"lucide-react";import{useCallback as Gn,useEffect as mn,useMemo as Sm,useRef as Im,useState as nl}from"react";import{useAtomValue as hm}from"jotai";import{Check as bm,Pencil as wm,X as xm}from"lucide-react";import{useState as mo}from"react";import{toast as Po}from"sonner";import*as zr from"@radix-ui/react-checkbox";import{CheckIcon as vm}from"lucide-react";import{jsx as Ga}from"react/jsx-runtime";function Qi({className:e,...t}){return Ga(zr.Root,{"data-slot":"checkbox",className:x("peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",e),...t,children:Ga(zr.Indicator,{"data-slot":"checkbox-indicator",className:"grid place-content-center text-current transition-none",children:Ga(vm,{className:"size-3.5"})})})}import{jsx as We,jsxs as ut}from"react/jsx-runtime";var Nm={database:"Database"},km=e=>eo()[e]||Nm[e]||e;function Zi({fieldId:e,label:t,configKey:o,placeholder:n,helpText:r,helpLink:s,value:a,onChange:d}){let[i,l]=mo(!1),c=Vt(),u=a.length>0;return i||u?ut("div",{className:"space-y-2",children:[We(M,{htmlFor:e,children:t}),ut("div",{className:"flex items-center gap-2",children:[We(se,{autoFocus:i&&!c,className:"flex-1",id:e,onChange:f=>d(o,f.target.value),placeholder:n,type:"password",value:a}),(i||u)&&We(D,{onClick:()=>{d(o,""),l(!1)},size:"icon",type:"button",variant:"ghost",children:We(xm,{className:"size-4"})})]}),(r||s)&&ut("p",{className:"text-muted-foreground text-xs",children:[r,s&&We("a",{className:"underline hover:text-foreground",href:s.url,rel:"noopener noreferrer",target:"_blank",children:s.text})]})]}):ut("div",{className:"space-y-2",children:[We(M,{htmlFor:e,children:t}),ut("div",{className:"flex items-center gap-2",children:[ut("div",{className:"flex h-9 flex-1 items-center gap-2 rounded-md border bg-muted/30 px-3",children:[We(bm,{className:"size-4 text-green-600"}),We("span",{className:"text-muted-foreground text-sm",children:"Configured"})]}),ut(D,{onClick:()=>l(!0),type:"button",variant:"outline",children:[We(wm,{className:"mr-1.5 size-3"}),"Change"]})]})]})}function Br({overlayId:e,integration:t,onSuccess:o,onDelete:n}){let{push:r,closeAll:s}=re(),[a,d]=mo(!1),[i,l]=mo(!1),[c,u]=mo(null),[f,h]=mo(t.name),[T,b]=mo({}),y=(m,S)=>{b(X=>({...X,[m]:S}))},p=async()=>{try{d(!0);let m=Object.values(T).some(S=>S&&S.length>0);await q.integration.update(t.id,{name:f.trim(),...m?{config:T}:{}}),Po.success("Connection updated"),o?.(),s()}catch(m){console.error("Failed to update integration:",m),Po.error("Failed to update connection")}finally{d(!1)}},v=async()=>{if(!Object.values(T).some(S=>S&&S.length>0)){await p();return}try{d(!0),u(null);let S=await q.integration.testCredentials({type:t.type,config:T});if(S.status==="error"){r(Me,{title:"Connection Test Failed",message:`The test failed: ${S.message}
|
|
7
7
|
|
|
8
|
-
Do you want to save anyway?`,confirmLabel:"Save Anyway",onConfirm:async()=>{await
|
|
8
|
+
Do you want to save anyway?`,confirmLabel:"Save Anyway",onConfirm:async()=>{await p()}}),d(!1);return}await p()}catch(S){let X=S instanceof Error?S.message:"Failed to test connection";r(Me,{title:"Connection Test Failed",message:`${X}
|
|
9
9
|
|
|
10
|
-
Do you want to save anyway?`,confirmLabel:"Save Anyway",onConfirm:async()=>{await w()}}),l(!1)}},f=async()=>{let m=Object.values(T).some(S=>S&&S.length>0);try{d(!0),u(null);let S;m?S=await q.integration.testCredentials({type:t.type,config:T}):S=await q.integration.testConnection(t.id),u(S),S.status==="success"?Co.success(S.message||"Connection successful"):Co.error(S.message||"Connection failed")}catch(S){let J=S instanceof Error?S.message:"Connection test failed";u({status:"error",message:J}),Co.error(J)}finally{d(!1)}},A=()=>{r(La,{integration:t,onSuccess:()=>{n?.(),s()}})},C=It(t.type)?.formFields,h=()=>t.type==="database"?Me(Vi,{configKey:"url",fieldId:"url",helpText:"Connection string in the format: postgresql://user:password@host:port/database",label:"Database URL",onChange:y,placeholder:"postgresql://user:password@host:port/database",value:T.url||""}):C?C.map(m=>m.type==="password"?Me(Vi,{configKey:m.configKey,fieldId:m.id,helpLink:m.helpLink,helpText:m.helpText,label:m.label,onChange:y,placeholder:m.placeholder,value:T[m.configKey]||""},m.id):dt("div",{className:"space-y-2",children:[Me(F,{htmlFor:m.id,children:m.label}),Me(se,{id:m.id,onChange:S=>y(m.configKey,S.target.value),placeholder:m.placeholder,type:m.type,value:T[m.configKey]||""}),(m.helpText||m.helpLink)&&dt("p",{className:"text-muted-foreground text-xs",children:[m.helpText,m.helpLink&&Me("a",{className:"underline hover:text-foreground",href:m.helpLink.url,rel:"noopener noreferrer",target:"_blank",children:m.helpLink.text})]})]},m.id)):null;return dt(De,{actions:[{label:"Delete",variant:"ghost",onClick:A,disabled:a||i},{label:"Test",variant:"outline",onClick:f,loading:i,disabled:a},{label:"Update",onClick:k,loading:a}],overlayId:e,title:`Edit ${Zu(t.type)}`,children:[Me("p",{className:"-mt-2 mb-4 text-muted-foreground text-sm",children:"Update your connection credentials"}),dt("div",{className:"space-y-4",children:[h(),dt("div",{className:"space-y-2",children:[Me(F,{htmlFor:"name",children:"Label (Optional)"}),Me(se,{id:"name",onChange:m=>g(m.target.value),placeholder:"e.g. Production, Personal, Work",value:p})]})]})]})}function La({overlayId:e,integration:t,onSuccess:o}){let{pop:n}=ne(),r=qu(Ht),[s,a]=so(!1),[l,i]=so(!0);return dt(De,{actions:[{label:"Cancel",variant:"outline",onClick:n},{label:"Delete",variant:"destructive",onClick:async()=>{try{a(!0),t.isManaged&&l&&r?await r.api.revokeConsent():await q.integration.delete(t.id),Co.success("Connection deleted"),o?.()}catch(c){console.error("Failed to delete integration:",c),Co.error("Failed to delete connection"),a(!1)}},loading:s}],overlayId:e,title:"Delete Connection",children:[Me("p",{className:"text-muted-foreground text-sm",children:"Are you sure you want to delete this connection? Workflows using it will fail until a new one is configured."}),t.isManaged&&dt("div",{className:"mt-4 flex items-center gap-2",children:[Me(Bi,{checked:l,id:"revoke-key",onCheckedChange:c=>i(c)}),Me(F,{className:"cursor-pointer font-normal",htmlFor:"revoke-key",children:"Revoke API key from Vercel"})]})]})}import{Fragment as za,jsx as Se,jsxs as Wt}from"react/jsx-runtime";function Ui({integrationType:e,value:t,onChange:o,onOpenSettings:n,disabled:r,onAddConnection:s}){let{push:a}=ne(),[l,i]=Or(mt),d=Gi(Pt),c=Hi(Pt),u=rm(d),[p,g]=$i(!1),T=Gi(Ht),[v,y]=Or(xo),[w,k]=$i(!1),[f,A]=Or(Sr),[I,C]=Or(ki),h=Hi(Ir),m=nm(()=>l.filter(b=>b.type===e),[l,e]),S=l.length>0,J=Dn(async()=>{try{let b=await q.integration.getAll();i(b),g(!0)}catch(b){console.error("Failed to load integrations:",b)}},[i]);on(()=>{T?.integrationType===e&&!w&&T.api.getStatus().then(b=>{y(b),k(!0)}).catch(()=>{k(!0)})},[e,w,T,y]),on(()=>{T?.integrationType===e&&v?.enabled&&v?.isVercelUser&&!I&&(h(!0),T.api.getTeams().then(b=>{A(b.teams),b.teams.length>0&&C(!0)}).catch(()=>{}).finally(()=>{h(!1)}))},[e,T,v,I,A,C,h]),on(()=>{T?.integrationType===e&&v?.enabled&&v?.isVercelUser&&T.api.getTeams().then(b=>{b.teams.length>0&&(A(b.teams),C(!0))}).catch(()=>{})},[e,T,v?.enabled,v?.isVercelUser]),on(()=>{J()},[J,e]),on(()=>{d!==u.current&&(u.current=d,J())},[d,J]),on(()=>{if(m.length>0&&!r&&!(t&&m.some(R=>R.id===t))){let R=m.find(G=>G.isManaged);o(R?.id||m[0].id)}},[m,t,r,o]);let D=async b=>{await J(),o(b),c(R=>R+1)},j=async()=>{if(await J(),c(b=>b+1),T?.integrationType===e){let b=await T.api.getStatus();y(b)}},z=Dn(()=>{a(ro,{type:e,onSuccess:D})},[e,a,D]),re=Dn(b=>{a(Rr,{integration:b,onSuccess:j,onDelete:j})},[a,j]),P=T?.integrationType===e&&v?.enabled&&v?.isVercelUser&&!v?.hasManagedKey,V=Dn(async b=>{if(await J(),o(b),c(R=>R+1),T){let R=await T.api.getStatus();y(R)}},[J,o,c,T,y]),X=Dn(()=>{s?s():P&&T?a(T.ConsentOverlay,{onConsent:V,onManualEntry:z}):z()},[s,P,T,a,V,z]);if(!S&&!p)return Se("div",{className:"flex flex-col gap-1",children:Wt("div",{className:"flex items-center gap-2 rounded-md px-2 py-1.5",children:[Se("div",{className:"size-4 shrink-0 animate-pulse rounded-full bg-muted"}),Se("div",{className:"h-4 flex-1 animate-pulse rounded bg-muted"}),Se("div",{className:"size-6 shrink-0 animate-pulse rounded bg-muted"})]})});let U=It(e)?.label||e,N=m.filter(b=>b.isManaged),M=m.filter(b=>!b.isManaged);if(m.length===0)return Se(za,{children:Wt(O,{className:"w-full justify-start gap-2 border-orange-500/50 bg-orange-500/10 text-orange-600 hover:bg-orange-500/20 dark:text-orange-400",disabled:r,onClick:X,variant:"outline",children:[Se(em,{className:"size-4"}),Wt("span",{className:"flex-1 text-left",children:["Add ",U," connection"]}),Se(tm,{className:"size-4"})]})});if(m.length===1){let b=m[0],R=b.name||`${U} API Key`;return Se(za,{children:Wt("div",{className:x("flex h-9 w-full items-center gap-2 rounded-md border px-3 text-sm",r&&"cursor-not-allowed opacity-50"),children:[Se(Ma,{className:"size-4 shrink-0 text-green-600"}),Se("span",{className:"flex-1 truncate",children:R}),Se(O,{className:"size-6 shrink-0",disabled:r,onClick:()=>re(b),size:"icon",variant:"ghost",children:Se(Fa,{className:"size-3"})})]})})}return Se(za,{children:Wt("div",{className:"flex flex-col gap-1",children:[N.map(b=>{let R=t===b.id,G=b.name||`${U} API Key`;return Wt("div",{className:x("flex w-full items-center gap-2 rounded-md px-[13px] py-1.5 text-sm transition-colors",R?"bg-primary/10 text-primary":"hover:bg-muted/50",r&&"cursor-not-allowed opacity-50"),children:[Wt("button",{className:"flex flex-1 items-center gap-2 text-left",disabled:r,onClick:()=>o(b.id),type:"button",children:[R?Se(Ma,{className:"size-4 shrink-0"}):Se(_i,{className:"size-4 shrink-0 text-muted-foreground"}),Se("span",{className:"truncate",children:G})]}),Se(O,{className:"size-6 shrink-0",disabled:r,onClick:te=>{te.stopPropagation(),re(b)},size:"icon",variant:"ghost",children:Se(Fa,{className:"size-3"})})]},b.id)}),M.map(b=>{let R=t===b.id,G=b.name||`${U} API Key`;return Wt("div",{className:x("flex w-full items-center gap-2 rounded-md px-[13px] py-1.5 text-sm transition-colors",R?"bg-primary/10 text-primary":"hover:bg-muted/50",r&&"cursor-not-allowed opacity-50"),children:[Wt("button",{className:"flex flex-1 items-center gap-2 text-left",disabled:r,onClick:()=>o(b.id),type:"button",children:[R?Se(Ma,{className:"size-4 shrink-0"}):Se(_i,{className:"size-4 shrink-0 text-muted-foreground"}),Se("span",{className:"truncate",children:G})]}),Se(O,{className:"size-6 shrink-0",disabled:r,onClick:te=>{te.stopPropagation(),re(b)},size:"icon",variant:"ghost",children:Se(Fa,{className:"size-3"})})]},b.id)}),n&&Wt("button",{className:"flex w-full items-center gap-2 rounded-md px-[13px] py-1.5 text-muted-foreground text-sm transition-colors hover:bg-muted/50 hover:text-foreground",disabled:r,onClick:n,type:"button",children:[Se(om,{className:"size-4 shrink-0"}),Se("span",{children:"Manage all connections"})]})]})})}import*as xt from"@radix-ui/react-tooltip";import{jsx as nn,jsxs as am}from"react/jsx-runtime";function rn({delayDuration:e=0,...t}){return nn(xt.Provider,{"data-slot":"tooltip-provider",delayDuration:e,...t})}function Rn({...e}){return nn(rn,{children:nn(xt.Root,{"data-slot":"tooltip",...e})})}function On({...e}){return nn(xt.Trigger,{"data-slot":"tooltip-trigger",...e})}function Ln({className:e,sideOffset:t=0,children:o,...n}){return nn(xt.Portal,{children:am(xt.Content,{"data-slot":"tooltip-content",sideOffset:t,className:x("bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",e),...n,children:[o,nn(xt.Arrow,{className:"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]"})]})})}import{ChevronDown as cm}from"lucide-react";import{useState as um}from"react";import{useAtom as Ki}from"jotai";import{useEffect as Wa,useRef as Ba,useState as an}from"react";import{Fragment as lm,jsx as Va,jsxs as dm}from"react/jsx-runtime";function sm(e,t){let o=e.match(/\{\{@([^:]+):([^}]+)\}\}/);if(!o)return!1;let n=o[1];return t.some(r=>r.id===n)}function im(e,t){let o=e.match(/\{\{@([^:]+):([^}]+)\}\}/);if(!o)return e;let n=o[1],r=o[2],s=t.find(d=>d.id===n);if(!s)return r;let a=s.data.label;if(!a&&s.data.type==="action"){let d=s.data.config?.actionType;d&&(a=pe(d)?.label)}let l=r.indexOf(".");if(l===-1)return a??r;let i=r.substring(l+1);return a?`${a}.${i}`:r}function ji({value:e="",onChange:t,placeholder:o,disabled:n,className:r,id:s,rows:a=3}){let[l,i]=an(!1),d=Ba(null),[c,u]=an(e),p=Ba(!0),[g]=Ki(be),[T]=Ki(oe),[v,y]=an(!1),[w,k]=an({top:0,left:0}),[f,A]=an(""),[I,C]=an(null),h=Ba(null);Wa(()=>{e!==c&&!l&&(u(e),p.current=!0)},[e,l,c]),Wa(()=>{!l&&c&&(p.current=!0)},[T,l,c]);let m=()=>{if(!d.current)return null;let N=window.getSelection();if(!N||N.rangeCount===0)return console.log("[Textarea] saveCursorPosition: No selection"),null;let M=N.getRangeAt(0),b=M.cloneRange();b.selectNodeContents(d.current),b.setEnd(M.endContainer,M.endOffset),console.log("[Textarea] saveCursorPosition: range.endContainer",M.endContainer,"endOffset",M.endOffset);let R=0,G=document.createTreeWalker(d.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null),te,de=!1;for(;(te=G.nextNode())&&!de;)if(te.nodeType===Node.TEXT_NODE)if(te===M.endContainer)R+=M.endOffset,de=!0,console.log("[Textarea] saveCursorPosition: Found cursor in text node, offset:",R);else{let B=(te.textContent||"").length;R+=B,console.log("[Textarea] saveCursorPosition: Text node before cursor, length:",B)}else if(te.nodeType===Node.ELEMENT_NODE){let B=te,xe=B.getAttribute("data-template");xe?B.contains(M.endContainer)||B===M.endContainer?(R+=xe.length,de=!0,console.log("[Textarea] saveCursorPosition: Found cursor in badge, offset:",R)):(R+=xe.length,console.log("[Textarea] saveCursorPosition: Badge before cursor, length:",xe.length)):B.tagName==="BR"&&(B===M.endContainer||B.contains(M.endContainer)?de=!0:(R+=1,console.log("[Textarea] saveCursorPosition: BR before cursor")))}return console.log("[Textarea] saveCursorPosition: Final offset:",R),{offset:R}},S=N=>{if(!d.current||!N)return;let M=0,b=document.createTreeWalker(d.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null),R,G=null,te=0;for(;R=b.nextNode();)if(R.nodeType===Node.TEXT_NODE){let de=(R.textContent||"").length;if(M+de>=N.offset){G=R,te=N.offset-M;break}M+=de}else if(R.nodeType===Node.ELEMENT_NODE){let de=R,B=de.getAttribute("data-template");if(B){if(M+B.length>=N.offset){G=de.nextSibling,te=0,!G&&de.parentNode&&(G=document.createTextNode(""),de.parentNode.appendChild(G));break}M+=B.length}else if(de.tagName==="BR"){if(M+1>=N.offset){G=de.nextSibling,te=0,!G&&de.parentNode&&(G=document.createTextNode(""),de.parentNode.appendChild(G));break}M+=1}}if(G){let de=document.createRange(),B=window.getSelection();try{de.setStart(G,Math.min(te,G.textContent?.length||0)),de.collapse(!0),B?.removeAllRanges(),B?.addRange(de),d.current.focus()}catch{d.current.focus()}}},J=()=>{if(!d.current||!p.current)return;let N=d.current,M=c||"",b=l?m():null;if(h.current!==null&&(b={offset:h.current},h.current=null),N.innerHTML="",!M&&!l){N.innerHTML=`<span class="text-muted-foreground pointer-events-none">${o||""}</span>`;return}let R=/\{\{@([^:]+):([^}]+)\}\}/g,G=0,te;for(;(te=R.exec(M))!==null;){let[de,,B]=te,xe=te.index;if(xe>G){let He=M.slice(G,xe);D(N,He)}let qe=document.createElement("span"),Ye=sm(de,T);qe.className=Ye?"inline-flex items-center gap-1 rounded bg-blue-500/10 px-1.5 py-0.5 text-blue-600 dark:text-blue-400 font-mono text-xs border border-blue-500/20 mx-0.5":"inline-flex items-center gap-1 rounded bg-red-500/10 px-1.5 py-0.5 text-red-600 dark:text-red-400 font-mono text-xs border border-red-500/20 mx-0.5",qe.contentEditable="false",qe.setAttribute("data-template",de),qe.textContent=im(de,T),N.appendChild(qe),G=R.lastIndex}if(G<M.length){let de=M.slice(G);D(N,de)}N.innerHTML===""&&l&&(N.innerHTML="<br>"),p.current=!1,b&&requestAnimationFrame(()=>S(b))},D=(N,M)=>{let b=M.split(`
|
|
11
|
-
`);
|
|
12
|
-
`,console.log("[Textarea] extractValue: Adding line break"))}return console.log("[Textarea] extractValue: Final result:",
|
|
13
|
-
`)){if(
|
|
14
|
-
`)){if(
|
|
10
|
+
Do you want to save anyway?`,confirmLabel:"Save Anyway",onConfirm:async()=>{await p()}}),d(!1)}},g=async()=>{let m=Object.values(T).some(S=>S&&S.length>0);try{l(!0),u(null);let S;m?S=await q.integration.testCredentials({type:t.type,config:T}):S=await q.integration.testConnection(t.id),u(S),S.status==="success"?Po.success(S.message||"Connection successful"):Po.error(S.message||"Connection failed")}catch(S){let X=S instanceof Error?S.message:"Connection test failed";u({status:"error",message:X}),Po.error(X)}finally{l(!1)}},k=()=>{r(Ha,{integration:t,onSuccess:()=>{n?.(),s()}})},A=Dt(t.type)?.formFields,w=()=>t.type==="database"?We(Zi,{configKey:"url",fieldId:"url",helpText:"Connection string in the format: postgresql://user:password@host:port/database",label:"Database URL",onChange:y,placeholder:"postgresql://user:password@host:port/database",value:T.url||""}):A?A.map(m=>m.type==="password"?We(Zi,{configKey:m.configKey,fieldId:m.id,helpLink:m.helpLink,helpText:m.helpText,label:m.label,onChange:y,placeholder:m.placeholder,value:T[m.configKey]||""},m.id):ut("div",{className:"space-y-2",children:[We(M,{htmlFor:m.id,children:m.label}),We(se,{id:m.id,onChange:S=>y(m.configKey,S.target.value),placeholder:m.placeholder,type:m.type,value:T[m.configKey]||""}),(m.helpText||m.helpLink)&&ut("p",{className:"text-muted-foreground text-xs",children:[m.helpText,m.helpLink&&We("a",{className:"underline hover:text-foreground",href:m.helpLink.url,rel:"noopener noreferrer",target:"_blank",children:m.helpLink.text})]})]},m.id)):null;return ut(Oe,{actions:[{label:"Delete",variant:"ghost",onClick:k,disabled:a||i},{label:"Test",variant:"outline",onClick:g,loading:i,disabled:a},{label:"Update",onClick:v,loading:a}],overlayId:e,title:`Edit ${km(t.type)}`,children:[We("p",{className:"-mt-2 mb-4 text-muted-foreground text-sm",children:"Update your connection credentials"}),ut("div",{className:"space-y-4",children:[w(),ut("div",{className:"space-y-2",children:[We(M,{htmlFor:"name",children:"Label (Optional)"}),We(se,{id:"name",onChange:m=>h(m.target.value),placeholder:"e.g. Production, Personal, Work",value:f})]})]})]})}function Ha({overlayId:e,integration:t,onSuccess:o}){let{pop:n}=re(),r=hm(Kt),[s,a]=mo(!1),[d,i]=mo(!0);return ut(Oe,{actions:[{label:"Cancel",variant:"outline",onClick:n},{label:"Delete",variant:"destructive",onClick:async()=>{try{a(!0),t.isManaged&&d&&r?await r.api.revokeConsent():await q.integration.delete(t.id),Po.success("Connection deleted"),o?.()}catch(c){console.error("Failed to delete integration:",c),Po.error("Failed to delete connection"),a(!1)}},loading:s}],overlayId:e,title:"Delete Connection",children:[We("p",{className:"text-muted-foreground text-sm",children:"Are you sure you want to delete this connection? Workflows using it will fail until a new one is configured."}),t.isManaged&&ut("div",{className:"mt-4 flex items-center gap-2",children:[We(Qi,{checked:d,id:"revoke-key",onCheckedChange:c=>i(c)}),We(M,{className:"cursor-pointer font-normal",htmlFor:"revoke-key",children:"Revoke API key from Vercel"})]})]})}import{Fragment as Ua,jsx as Se,jsxs as Ht}from"react/jsx-runtime";function rl({integrationType:e,value:t,onChange:o,onOpenSettings:n,disabled:r,onAddConnection:s}){let{push:a}=re(),[d,i]=Vr(ft),l=el(Rt),c=tl(Rt),u=Im(l),[f,h]=nl(!1),T=el(Kt),[b,y]=Vr(Ao),[p,v]=nl(!1),[g,k]=Vr(Lr),[I,A]=Vr(Fi),w=tl(Mr),m=Sm(()=>d.filter(N=>N.type===e),[d,e]),S=d.length>0,X=Gn(async()=>{try{let N=await q.integration.getAll();i(N),h(!0)}catch(N){console.error("Failed to load integrations:",N)}},[i]);mn(()=>{T?.integrationType===e&&!p&&T.api.getStatus().then(N=>{y(N),v(!0)}).catch(()=>{v(!0)})},[e,p,T,y]),mn(()=>{T?.integrationType===e&&b?.enabled&&b?.isVercelUser&&!I&&(w(!0),T.api.getTeams().then(N=>{k(N.teams),N.teams.length>0&&A(!0)}).catch(()=>{}).finally(()=>{w(!1)}))},[e,T,b,I,k,A,w]),mn(()=>{T?.integrationType===e&&b?.enabled&&b?.isVercelUser&&T.api.getTeams().then(N=>{N.teams.length>0&&(k(N.teams),A(!0))}).catch(()=>{})},[e,T,b?.enabled,b?.isVercelUser]),mn(()=>{X()},[X,e]),mn(()=>{l!==u.current&&(u.current=l,X())},[l,X]),mn(()=>{if(m.length>0&&!r&&!(t&&m.some(R=>R.id===t))){let R=m.find(G=>G.isManaged);o(R?.id||m[0].id)}},[m,t,r,o]);let le=async N=>{await X(),o(N),c(R=>R+1)},L=async()=>{if(await X(),c(N=>N+1),T?.integrationType===e){let N=await T.api.getStatus();y(N)}},W=Gn(()=>{a(co,{type:e,onSuccess:le})},[e,a,le]),$=Gn(N=>{a(Br,{integration:N,onSuccess:L,onDelete:L})},[a,L]),P=T?.integrationType===e&&b?.enabled&&b?.isVercelUser&&!b?.hasManagedKey,V=Gn(async N=>{if(await X(),o(N),c(R=>R+1),T){let R=await T.api.getStatus();y(R)}},[X,o,c,T,y]),J=Gn(()=>{s?s():P&&T?a(T.ConsentOverlay,{onConsent:V,onManualEntry:W}):W()},[s,P,T,a,V,W]);if(!S&&!f)return Se("div",{className:"flex flex-col gap-1",children:Ht("div",{className:"flex items-center gap-2 rounded-md px-2 py-1.5",children:[Se("div",{className:"size-4 shrink-0 animate-pulse rounded-full bg-muted"}),Se("div",{className:"h-4 flex-1 animate-pulse rounded bg-muted"}),Se("div",{className:"size-6 shrink-0 animate-pulse rounded bg-muted"})]})});let K=Dt(e)?.label||e,C=m.filter(N=>N.isManaged),z=m.filter(N=>!N.isManaged);if(m.length===0)return Se(Ua,{children:Ht(D,{className:"w-full justify-start gap-2 border-orange-500/50 bg-orange-500/10 text-orange-600 hover:bg-orange-500/20 dark:text-orange-400",disabled:r,onClick:J,variant:"outline",children:[Se(Cm,{className:"size-4"}),Ht("span",{className:"flex-1 text-left",children:["Add ",K," connection"]}),Se(Tm,{className:"size-4"})]})});if(m.length===1){let N=m[0],R=N.name||`${K} API Key`;return Se(Ua,{children:Ht("div",{className:x("flex h-9 w-full items-center gap-2 rounded-md border px-3 text-sm",r&&"cursor-not-allowed opacity-50"),children:[Se($a,{className:"size-4 shrink-0 text-green-600"}),Se("span",{className:"flex-1 truncate",children:R}),Se(D,{className:"size-6 shrink-0",disabled:r,onClick:()=>$(N),size:"icon",variant:"ghost",children:Se(_a,{className:"size-3"})})]})})}return Se(Ua,{children:Ht("div",{className:"flex flex-col gap-1",children:[C.map(N=>{let R=t===N.id,G=N.name||`${K} API Key`;return Ht("div",{className:x("flex w-full items-center gap-2 rounded-md px-[13px] py-1.5 text-sm transition-colors",R?"bg-primary/10 text-primary":"hover:bg-muted/50",r&&"cursor-not-allowed opacity-50"),children:[Ht("button",{className:"flex flex-1 items-center gap-2 text-left",disabled:r,onClick:()=>o(N.id),type:"button",children:[R?Se($a,{className:"size-4 shrink-0"}):Se(ol,{className:"size-4 shrink-0 text-muted-foreground"}),Se("span",{className:"truncate",children:G})]}),Se(D,{className:"size-6 shrink-0",disabled:r,onClick:oe=>{oe.stopPropagation(),$(N)},size:"icon",variant:"ghost",children:Se(_a,{className:"size-3"})})]},N.id)}),z.map(N=>{let R=t===N.id,G=N.name||`${K} API Key`;return Ht("div",{className:x("flex w-full items-center gap-2 rounded-md px-[13px] py-1.5 text-sm transition-colors",R?"bg-primary/10 text-primary":"hover:bg-muted/50",r&&"cursor-not-allowed opacity-50"),children:[Ht("button",{className:"flex flex-1 items-center gap-2 text-left",disabled:r,onClick:()=>o(N.id),type:"button",children:[R?Se($a,{className:"size-4 shrink-0"}):Se(ol,{className:"size-4 shrink-0 text-muted-foreground"}),Se("span",{className:"truncate",children:G})]}),Se(D,{className:"size-6 shrink-0",disabled:r,onClick:oe=>{oe.stopPropagation(),$(N)},size:"icon",variant:"ghost",children:Se(_a,{className:"size-3"})})]},N.id)}),n&&Ht("button",{className:"flex w-full items-center gap-2 rounded-md px-[13px] py-1.5 text-muted-foreground text-sm transition-colors hover:bg-muted/50 hover:text-foreground",disabled:r,onClick:n,type:"button",children:[Se(Am,{className:"size-4 shrink-0"}),Se("span",{children:"Manage all connections"})]})]})})}import*as Ct from"@radix-ui/react-tooltip";import{jsx as pn,jsxs as Pm}from"react/jsx-runtime";function fn({delayDuration:e=0,...t}){return pn(Ct.Provider,{"data-slot":"tooltip-provider",delayDuration:e,...t})}function Hn({...e}){return pn(fn,{children:pn(Ct.Root,{"data-slot":"tooltip",...e})})}function $n({...e}){return pn(Ct.Trigger,{"data-slot":"tooltip-trigger",...e})}function _n({className:e,sideOffset:t=0,children:o,...n}){return pn(Ct.Portal,{children:Pm(Ct.Content,{"data-slot":"tooltip-content",sideOffset:t,className:x("bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",e),...n,children:[o,pn(Ct.Arrow,{className:"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]"})]})})}import{ChevronDown as Lm}from"lucide-react";import{useState as Mm}from"react";import{useAtom as al}from"jotai";import{useEffect as Ka,useRef as qa,useState as gn}from"react";import{Fragment as Rm,jsx as ja,jsxs as Om}from"react/jsx-runtime";function Em(e,t){let o=e.match(/\{\{@([^:]+):([^}]+)\}\}/);if(!o)return!1;let n=o[1];return t.some(r=>r.id===n)}function Dm(e,t){let o=e.match(/\{\{@([^:]+):([^}]+)\}\}/);if(!o)return e;let n=o[1],r=o[2],s=t.find(l=>l.id===n);if(!s)return r;let a=s.data.label;if(!a&&s.data.type==="action"){let l=s.data.config?.actionType;l&&(a=fe(l)?.label)}let d=r.indexOf(".");if(d===-1)return a??r;let i=r.substring(d+1);return a?`${a}.${i}`:r}function sl({value:e="",onChange:t,placeholder:o,disabled:n,className:r,id:s,rows:a=3}){let[d,i]=gn(!1),l=qa(null),[c,u]=gn(e),f=qa(!0),[h]=al(ke),[T]=al(ne),[b,y]=gn(!1),[p,v]=gn({top:0,left:0}),[g,k]=gn(""),[I,A]=gn(null),w=qa(null);Ka(()=>{e!==c&&!d&&(u(e),f.current=!0)},[e,d,c]),Ka(()=>{!d&&c&&(f.current=!0)},[T,d,c]);let m=()=>{if(!l.current)return null;let C=window.getSelection();if(!C||C.rangeCount===0)return console.log("[Textarea] saveCursorPosition: No selection"),null;let z=C.getRangeAt(0),N=z.cloneRange();N.selectNodeContents(l.current),N.setEnd(z.endContainer,z.endOffset),console.log("[Textarea] saveCursorPosition: range.endContainer",z.endContainer,"endOffset",z.endOffset);let R=0,G=document.createTreeWalker(l.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null),oe,de=!1;for(;(oe=G.nextNode())&&!de;)if(oe.nodeType===Node.TEXT_NODE)if(oe===z.endContainer)R+=z.endOffset,de=!0,console.log("[Textarea] saveCursorPosition: Found cursor in text node, offset:",R);else{let B=(oe.textContent||"").length;R+=B,console.log("[Textarea] saveCursorPosition: Text node before cursor, length:",B)}else if(oe.nodeType===Node.ELEMENT_NODE){let B=oe,Ae=B.getAttribute("data-template");Ae?B.contains(z.endContainer)||B===z.endContainer?(R+=Ae.length,de=!0,console.log("[Textarea] saveCursorPosition: Found cursor in badge, offset:",R)):(R+=Ae.length,console.log("[Textarea] saveCursorPosition: Badge before cursor, length:",Ae.length)):B.tagName==="BR"&&(B===z.endContainer||B.contains(z.endContainer)?de=!0:(R+=1,console.log("[Textarea] saveCursorPosition: BR before cursor")))}return console.log("[Textarea] saveCursorPosition: Final offset:",R),{offset:R}},S=C=>{if(!l.current||!C)return;let z=0,N=document.createTreeWalker(l.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null),R,G=null,oe=0;for(;R=N.nextNode();)if(R.nodeType===Node.TEXT_NODE){let de=(R.textContent||"").length;if(z+de>=C.offset){G=R,oe=C.offset-z;break}z+=de}else if(R.nodeType===Node.ELEMENT_NODE){let de=R,B=de.getAttribute("data-template");if(B){if(z+B.length>=C.offset){G=de.nextSibling,oe=0,!G&&de.parentNode&&(G=document.createTextNode(""),de.parentNode.appendChild(G));break}z+=B.length}else if(de.tagName==="BR"){if(z+1>=C.offset){G=de.nextSibling,oe=0,!G&&de.parentNode&&(G=document.createTextNode(""),de.parentNode.appendChild(G));break}z+=1}}if(G){let de=document.createRange(),B=window.getSelection();try{de.setStart(G,Math.min(oe,G.textContent?.length||0)),de.collapse(!0),B?.removeAllRanges(),B?.addRange(de),l.current.focus()}catch{l.current.focus()}}},X=()=>{if(!l.current||!f.current)return;let C=l.current,z=c||"",N=d?m():null;if(w.current!==null&&(N={offset:w.current},w.current=null),C.innerHTML="",!z&&!d){C.innerHTML=`<span class="text-muted-foreground pointer-events-none">${o||""}</span>`;return}let R=/\{\{@([^:]+):([^}]+)\}\}/g,G=0,oe;for(;(oe=R.exec(z))!==null;){let[de,,B]=oe,Ae=oe.index;if(Ae>G){let $e=z.slice(G,Ae);le(C,$e)}let Je=document.createElement("span"),Ye=Em(de,T);Je.className=Ye?"inline-flex items-center gap-1 rounded bg-blue-500/10 px-1.5 py-0.5 text-blue-600 dark:text-blue-400 font-mono text-xs border border-blue-500/20 mx-0.5":"inline-flex items-center gap-1 rounded bg-red-500/10 px-1.5 py-0.5 text-red-600 dark:text-red-400 font-mono text-xs border border-red-500/20 mx-0.5",Je.contentEditable="false",Je.setAttribute("data-template",de),Je.textContent=Dm(de,T),C.appendChild(Je),G=R.lastIndex}if(G<z.length){let de=z.slice(G);le(C,de)}C.innerHTML===""&&d&&(C.innerHTML="<br>"),f.current=!1,N&&requestAnimationFrame(()=>S(N))},le=(C,z)=>{let N=z.split(`
|
|
11
|
+
`);N.forEach((R,G)=>{R&&C.appendChild(document.createTextNode(R)),G<N.length-1&&C.appendChild(document.createElement("br"))})},L=()=>{if(!l.current)return"";let C="",z=document.createTreeWalker(l.current,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,null),N;for(;N=z.nextNode();)if(N.nodeType===Node.TEXT_NODE){let R=N.parentElement,G=!1;for(;R&&R!==l.current;){if(R.getAttribute("data-template")){G=!0;break}R=R.parentElement}G?console.log("[Textarea] extractValue: Skipping text inside badge:",N.textContent):(C+=N.textContent,console.log("[Textarea] extractValue: Adding text node:",N.textContent))}else if(N.nodeType===Node.ELEMENT_NODE){let R=N,G=R.getAttribute("data-template");G?(C+=G,console.log("[Textarea] extractValue: Adding template:",G)):R.tagName==="BR"&&(C+=`
|
|
12
|
+
`,console.log("[Textarea] extractValue: Adding line break"))}return console.log("[Textarea] extractValue: Final result:",C),C},W=()=>{let C=L();if(console.log("[Textarea] handleInput: newValue:",C),console.log("[Textarea] handleInput: internalValue:",c),console.log("[Textarea] handleInput: DOM innerHTML:",l.current?.innerHTML),C===c){console.log("[Textarea] handleInput: No change detected, ignoring");return}let z=(c.match(/\{\{@([^:]+):([^}]+)\}\}/g)||[]).length,N=(C.match(/\{\{@([^:]+):([^}]+)\}\}/g)||[]).length;if(console.log("[Textarea] handleInput: oldTemplates:",z,"newTemplates:",N),N>z){console.log("[Textarea] handleInput: New template added, rendering badge"),u(C),t?.(C),f.current=!0,y(!1),requestAnimationFrame(()=>X());return}if(N===z&&N>0){console.log("[Textarea] handleInput: Typing around existing badges, NOT updating display"),u(C),t?.(C);let G=C.lastIndexOf("@");if(G!==-1){let oe=C.slice(G+1);if(!oe.includes(" ")&&!oe.includes(`
|
|
13
|
+
`)){if(k(oe),A(G),l.current){let de=l.current.getBoundingClientRect(),B={top:de.bottom+window.scrollY+4,left:de.left+window.scrollX};v(B)}y(!0)}else y(!1)}else y(!1);return}if(N<z){console.log("[Textarea] handleInput: Template removed, updating display"),u(C),t?.(C),f.current=!0,requestAnimationFrame(()=>X());return}console.log("[Textarea] handleInput: Normal typing, no badges"),u(C),t?.(C);let R=C.lastIndexOf("@");if(R!==-1){let G=C.slice(R+1);if(!G.includes(" ")&&!G.includes(`
|
|
14
|
+
`)){if(k(G),A(R),l.current){let oe=l.current.getBoundingClientRect(),de={top:oe.bottom+window.scrollY+4,left:oe.left+window.scrollX};v(de)}y(!0)}else y(!1)}else y(!1)},$=C=>{if(!l.current||I===null)return;let z=L(),N=z.slice(0,I),R=z.slice(I+1+g.length),G=N+C+R,oe=N.length+C.length;console.log("[Textarea] Autocomplete select:",{currentText:z,atSignPosition:I,filter:g,template:C,beforeAt:N,afterFilter:R,newText:G,targetCursorPosition:oe}),u(G),t?.(G),f.current=!0,y(!1),A(null),w.current=oe,l.current.focus()},P=()=>{i(!0),f.current=!0},V=()=>{setTimeout(()=>{document.activeElement!==l.current&&(i(!1),f.current=!0,y(!1))},200)},J=C=>{C.preventDefault();let z=C.clipboardData.getData("text/plain");document.execCommand("insertText",!1,z)},F=C=>{C.key==="Enter"&&(C.preventDefault(),document.execCommand("insertLineBreak"))};Ka(()=>{f.current&&X()},[c,d]);let K=`${a*1.5}rem`;return Om(Rm,{children:[ja("div",{className:x("flex w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm transition-colors focus-within:outline-none focus-within:ring-1 focus-within:ring-ring",n&&"cursor-not-allowed opacity-50",r),style:{minHeight:K},children:ja("div",{className:"w-full outline-none whitespace-pre-wrap break-words",contentEditable:!n,id:s,onBlur:V,onFocus:P,onInput:W,onKeyDown:F,onPaste:J,ref:l,role:"textbox",suppressContentEditableWarning:!0})}),ja(Dr,{currentNodeId:h||void 0,filter:g,isOpen:b,onClose:()=>y(!1),onSelect:$,position:p})]})}import{Fragment as _m,jsx as Qe,jsxs as Un}from"react/jsx-runtime";function Fm({field:e,value:t,onChange:o,disabled:n}){return Qe(De,{disabled:n,id:e.key,onChange:o,placeholder:e.placeholder,value:t})}function Wm({field:e,value:t,onChange:o,disabled:n}){return Qe(sl,{disabled:n,id:e.key,onChange:o,placeholder:e.placeholder,rows:e.rows||4,value:t})}function zm({field:e,value:t,onChange:o,disabled:n}){return Qe(se,{disabled:n,id:e.key,onChange:r=>o(r.target.value),placeholder:e.placeholder,value:t})}function Bm({field:e,value:t,onChange:o,disabled:n}){return Qe(se,{disabled:n,id:e.key,min:e.min,onChange:r=>o(r.target.value),placeholder:e.placeholder,type:"number",value:t})}function Vm({field:e,value:t,onChange:o,disabled:n}){return e.options?Un(ve,{disabled:n,onValueChange:o,value:t,children:[Qe(he,{className:"w-full",id:e.key,children:Qe(we,{placeholder:e.placeholder})}),Qe(be,{children:e.options.map(r=>Qe(te,{value:r.value,children:r.label},r.value))})]}):null}function Gm(e){return Qe(lo,{disabled:e.disabled,onChange:t=>e.onChange(JSON.stringify(t)),schema:e.value?JSON.parse(e.value):[]})}var Hm={"template-input":Fm,"template-textarea":Wm,text:zm,number:Bm,select:Vm,"schema-builder":Gm};function il(e,t,o,n){if(e.showWhen&&t[e.showWhen.field]!==e.showWhen.equals)return null;let r=t[e.key]||e.defaultValue||"",s=Hm[e.type];return Un("div",{className:"space-y-2",children:[Un(M,{className:"ml-1",htmlFor:e.key,children:[e.label,e.required&&Qe("span",{className:"text-red-500",children:"*"})]}),Qe(s,{disabled:n,field:e,onChange:a=>o(e.key,a),value:r})]},e.key)}function $m({label:e,fields:t,config:o,onUpdateConfig:n,disabled:r,defaultExpanded:s=!1}){let[a,d]=Mm(s);return Un("div",{className:"space-y-2",children:[Un("button",{className:"ml-1 flex items-center gap-1 text-left",onClick:()=>d(!a),type:"button",children:[Qe("span",{className:"font-medium text-sm",children:e}),Qe(Lm,{className:`h-3.5 w-3.5 text-muted-foreground transition-transform duration-200 ${a?"":"-rotate-90"}`})]}),a&&Qe("div",{className:"ml-1 space-y-4 border-primary/50 border-l-2 py-2 pl-3",children:t.map(i=>il(i,o,n,r))})]})}function ll({fields:e,config:t,onUpdateConfig:o,disabled:n}){return Qe(_m,{children:e.map(r=>Ys(r)?Qe($m,{config:t,defaultExpanded:r.defaultExpanded,disabled:n,fields:r.fields,label:r.label,onUpdateConfig:o},`group-${r.label}`):il(r,t,o,n))})}import{Fragment as ep,jsx as pe,jsxs as ht}from"react/jsx-runtime";function Xm({actionType:e,config:t,onUpdateConfig:o,disabled:n}){switch(e){case"HTTP Request":return pe(Ci,{config:t,disabled:n,onUpdateConfig:o});case"Database Query":return pe(ki,{config:t,disabled:n,onUpdateConfig:o});case"Condition":return pe(Ni,{config:t,disabled:n,onUpdateConfig:o});case"Loop":return pe(Ti,{config:t,disabled:n,onUpdateConfig:o});case"Merge":return pe(Ai,{config:t,disabled:n,onUpdateConfig:o});case"Switch":return pe(Di,{config:t,disabled:n,onUpdateConfig:o});case"Run Workflow":return pe(Ii,{config:t,disabled:n,onUpdateConfig:o});case"Run Workflows in Sequence":return pe(Ei,{config:t,disabled:n,onUpdateConfig:o});default:return null}}var ml=[{id:"HTTP Request",label:"HTTP Request"},{id:"Database Query",label:"Database Query"},{id:"Condition",label:"Condition"},{id:"Loop",label:"Loop"},{id:"Merge",label:"Merge"},{id:"Switch",label:"Switch"},{id:"Run Workflow",label:"Run Workflow"},{id:"Run Workflows in Sequence",label:"Run Workflows in Sequence"}],Ja=ml.map(e=>e.id),cl={"Database Query":"database"};function Qm(){return Gr(()=>{let e=qs(),t={System:ml};for(let[o,n]of Object.entries(e))t[o]=n.map(r=>({id:r.id,label:r.label}));return t},[])}function ul(e){if(Ja.includes(e))return"System";let t=fe(e);return t?.category?t.category:null}function Zm(e){if(Ja.includes(e))return e;let t=fe(e);return t?t.id:e}function Hr({config:e,onUpdateConfig:t,disabled:o,isOwner:n=!0}){let r=e?.actionType||"",s=Qm(),a=Gr(()=>Us(),[]),d=r?ul(r):null,[i,l]=Ym(d||""),c=Um(Rt),u=dl(ft),{push:f}=re(),h=dl(Or);Jm(()=>{let m=r?ul(r):null;l(m||"")},[r]);let T=m=>{l(m);let S=s[m]?.[0];S&&t("actionType",S.id)},b=m=>{t("actionType",m)},y=(m,S)=>{t(m,String(S))},p=r?fe(r):null,v=Gr(()=>{if(!r)return;if(cl[r])return cl[r];let S=fe(r)?.integration;if(!(S&&!_o(S)))return S},[r]),g=v==="ai-gateway"&&h?.enabled&&h?.isVercelUser,k=Gr(()=>v?u.some(m=>m.type===v):!1,[v,u]),I=m=>{t("integrationId",m),c(S=>S+1)},A=()=>{v&&f(co,{type:v,onSuccess:m=>{c(S=>S+1),t("integrationId",m)}})},w=()=>{g?f(Xi,{onConsent:I,onManualEntry:A}):A()};return ht(ep,{children:[ht("div",{className:"grid grid-cols-2 gap-2",children:[ht("div",{className:"space-y-2",children:[pe(M,{className:"ml-1",htmlFor:"actionCategory",children:"Service"}),ht(ve,{disabled:o,onValueChange:T,value:i||void 0,children:[pe(he,{className:"w-full",id:"actionCategory",children:pe(we,{placeholder:"Select category"})}),ht(be,{children:[pe(te,{value:"System",children:ht("div",{className:"flex items-center gap-2",children:[pe(jm,{className:"size-4"}),pe("span",{children:"System"})]})}),pe(Ir,{}),a.map(m=>pe(te,{value:m.label,children:ht("div",{className:"flex items-center gap-2",children:[pe(Mt,{className:"size-4",integration:m.type}),pe("span",{children:m.label})]})},m.type))]})]})]}),ht("div",{className:"space-y-2",children:[pe(M,{className:"ml-1",htmlFor:"actionType",children:"Action"}),ht(ve,{disabled:o||!i,onValueChange:b,value:Zm(r)||void 0,children:[pe(he,{className:"w-full",id:"actionType",children:pe(we,{placeholder:"Select action"})}),pe(be,{children:i&&s[i]?.map(m=>pe(te,{value:m.id,children:m.label},m.id))})]})]})]}),v&&n&&ht("div",{className:"space-y-2",children:[ht("div",{className:"ml-1 flex items-center justify-between",children:[ht("div",{className:"flex items-center gap-1",children:[pe(M,{children:"Connection"}),pe(fn,{children:ht(Hn,{children:[pe($n,{asChild:!0,children:pe(Km,{className:"size-3.5 text-muted-foreground"})}),pe(_n,{children:pe("p",{children:"API key or OAuth credentials for this service"})})]})})]}),k&&pe(D,{className:"size-6",disabled:o,onClick:w,size:"icon",variant:"ghost",children:pe(qm,{className:"size-4"})})]}),pe(rl,{disabled:o,integrationType:v,onChange:m=>t("integrationId",m),value:e?.integrationId||""})]}),pe(Xm,{actionType:e?.actionType||"",config:e,disabled:o,onUpdateConfig:t}),p&&!Ja.includes(r)&&pe(ll,{config:e,disabled:o,fields:p.configFields,onUpdateConfig:y})]})}import{ChevronRight as gp,Eye as wl,EyeOff as xl,Grid3X3 as yp,List as vp,MoreHorizontal as hp,Search as bp,Settings as kl,Zap as Cl}from"lucide-react";import{useEffect as wp,useMemo as Ya,useRef as xp,useState as qn}from"react";import{Repeat as tp}from"lucide-react";import{jsx as op}from"react/jsx-runtime";var $r={id:"Loop",label:"Loop",description:"Loop through a list of items",category:"System",icon:op(tp,{className:"size-12 text-cyan-300",strokeWidth:1.5}),codeGenerator:`export async function loopStep(input: {
|
|
15
15
|
items: unknown[];
|
|
16
16
|
batchSize?: number;
|
|
17
17
|
currentBatchIndex?: number;
|
|
@@ -39,7 +39,7 @@ Do you want to save anyway?`,confirmLabel:"Save Anyway",onConfirm:async()=>{awai
|
|
|
39
39
|
items,
|
|
40
40
|
batchSize,
|
|
41
41
|
};
|
|
42
|
-
}`};import{Merge as
|
|
42
|
+
}`};import{Merge as np}from"lucide-react";import{jsx as rp}from"react/jsx-runtime";var _r={id:"Merge",label:"Merge",description:"Combine data from two inputs",category:"System",icon:rp(np,{className:"size-12 text-orange-300",strokeWidth:1.5}),codeGenerator:`export async function mergeStep(input: {
|
|
43
43
|
input1: unknown[];
|
|
44
44
|
input2: unknown[];
|
|
45
45
|
mode: "append" | "combineByPosition" | "combineByFields";
|
|
@@ -121,7 +121,26 @@ Do you want to save anyway?`,confirmLabel:"Save Anyway",onConfirm:async()=>{awai
|
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
return { merged: [...items1, ...items2], totalItems: items1.length + items2.length };
|
|
124
|
-
}`};import{
|
|
124
|
+
}`};import{WorkflowIcon as ap}from"lucide-react";import{jsx as sp}from"react/jsx-runtime";var Ur={id:"Run Workflow",label:"Run Workflow",description:"Execute another workflow and wait for it to complete",category:"System",icon:sp(ap,{className:"size-12 text-emerald-300",strokeWidth:1.5}),codeGenerator:`export async function runWorkflowStep(input: {
|
|
125
|
+
workflowId: string;
|
|
126
|
+
input?: string;
|
|
127
|
+
}) {
|
|
128
|
+
"use step";
|
|
129
|
+
|
|
130
|
+
// Note: Run Workflow is only available in the visual builder.
|
|
131
|
+
// It executes another workflow internally and returns its output.
|
|
132
|
+
throw new Error("Run Workflow is not supported in exported code. Use HTTP Request instead.");
|
|
133
|
+
}`};import{ListOrdered as ip}from"lucide-react";import{jsx as lp}from"react/jsx-runtime";var Kr={id:"Run Workflows in Sequence",label:"Run Workflows in Sequence",description:"Execute multiple workflows one after another in order",category:"System",icon:lp(ip,{className:"size-12 text-emerald-300",strokeWidth:1.5}),codeGenerator:`export async function runWorkflowsInSequenceStep(input: {
|
|
134
|
+
workflowIds: string[];
|
|
135
|
+
continueOnFailure?: boolean;
|
|
136
|
+
input?: string;
|
|
137
|
+
}) {
|
|
138
|
+
"use step";
|
|
139
|
+
|
|
140
|
+
// Note: Run Workflows in Sequence is only available in the visual builder.
|
|
141
|
+
// It executes multiple workflows internally in order and returns their outputs.
|
|
142
|
+
throw new Error("Run Workflows in Sequence is not supported in exported code. Use HTTP Request instead.");
|
|
143
|
+
}`};import{ArrowLeftRight as dp}from"lucide-react";import{jsx as cp}from"react/jsx-runtime";var qr={id:"Switch",label:"Switch",description:"Route based on rules or values",category:"System",icon:cp(dp,{className:"size-12 text-violet-300",strokeWidth:1.5}),codeGenerator:`export async function switchStep(input: {
|
|
125
144
|
mode: "rules" | "expression";
|
|
126
145
|
switchValue?: string;
|
|
127
146
|
routeName0?: string;
|
|
@@ -164,16 +183,16 @@ Do you want to save anyway?`,confirmLabel:"Save Anyway",onConfirm:async()=>{awai
|
|
|
164
183
|
}
|
|
165
184
|
|
|
166
185
|
return { matchedRouteIndex: -1, matchedRouteName: "Default", isDefault: true };
|
|
167
|
-
}`};import{useEffect as zm,useState as Wm}from"react";function el(){let[e,t]=Wm(void 0);return zm(()=>{let o="ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0;t(o)},[]),e}import{DropdownMenu as vt}from"radix-ui";import{CheckIcon as aN,ChevronRightIcon as Bm,CircleIcon as Vm}from"lucide-react";import{jsx as ct,jsxs as sl}from"react/jsx-runtime";function To({...e}){return ct(vt.Root,{"data-slot":"dropdown-menu",...e})}function Ao({...e}){return ct(vt.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}function So({className:e,sideOffset:t=4,...o}){return ct(vt.Portal,{children:ct(vt.Content,{"data-slot":"dropdown-menu-content",sideOffset:t,className:x("bg-popover text-popover-foreground 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=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",e),...o})})}function ht({className:e,inset:t,variant:o="default",...n}){return ct(vt.Item,{"data-slot":"dropdown-menu-item","data-inset":t,"data-variant":o,className:x("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...n})}function tl({...e}){return ct(vt.RadioGroup,{"data-slot":"dropdown-menu-radio-group",...e})}function Br({className:e,children:t,...o}){return sl(vt.RadioItem,{"data-slot":"dropdown-menu-radio-item",className:x("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...o,children:[ct("span",{className:"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center",children:ct(vt.ItemIndicator,{children:ct(Vm,{className:"size-2 fill-current"})})}),t]})}function ol({className:e,inset:t,...o}){return ct(vt.Label,{"data-slot":"dropdown-menu-label","data-inset":t,className:x("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",e),...o})}function Fn({className:e,...t}){return ct(vt.Separator,{"data-slot":"dropdown-menu-separator",className:x("bg-border -mx-1 my-1 h-px",e),...t})}function nl({...e}){return ct(vt.Sub,{"data-slot":"dropdown-menu-sub",...e})}function rl({className:e,inset:t,children:o,...n}){return sl(vt.SubTrigger,{"data-slot":"dropdown-menu-sub-trigger","data-inset":t,className:x("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...n,children:[o,ct(Bm,{className:"ml-auto size-4"})]})}function al({className:e,...t}){return ct(vt.SubContent,{"data-slot":"dropdown-menu-sub-content",className:x("bg-popover text-popover-foreground 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=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",e),...t})}import{Fragment as dl,jsx as me,jsxs as at}from"react/jsx-runtime";var qm=[Bo,zo,Wo,Fr,zr,Wr];function Ym(){return Ha(()=>{let t=zs().map(o=>({id:o.id,label:o.label,description:o.description,category:o.category,integration:o.integration}));return[...qm,...t]},[])}function Jm({group:e}){let t=e.actions[0];return t?.integration?me(Rt,{className:"size-4",integration:t.integration}):e.category==="System"?me(cl,{className:"size-4"}):me(ul,{className:"size-4"})}function Xm({action:e,className:t}){return e.integration?me(Rt,{className:t,integration:e.integration}):e.category==="System"?me(cl,{className:x(t,"text-muted-foreground")}):me(ul,{className:x(t,"text-muted-foreground")})}var ml="workflow-action-grid-hidden-groups",pl="workflow-action-grid-view-mode";function Qm(){if(typeof window>"u")return new Set;try{let e=localStorage.getItem(ml);return e?new Set(JSON.parse(e)):new Set}catch{return new Set}}function Zm(){if(typeof window>"u")return"list";try{return localStorage.getItem(pl)==="grid"?"grid":"list"}catch{return"list"}}function Vr({onSelectAction:e,disabled:t,isNewlyCreated:o}){let[n,r]=zn(""),[s,a]=zn(new Set),[l,i]=zn(Qm),[d,c]=zn(!1),[u,p]=zn(Zm),g=Ym(),T=jm(null),v=el(),y=()=>{let h=u==="list"?"grid":"list";p(h),localStorage.setItem(pl,h)},w=h=>{a(m=>{let S=new Set(m);return S.has(h)?S.delete(h):S.add(h),S})},k=h=>{i(m=>{let S=new Set(m);return S.has(h)?S.delete(h):S.add(h),localStorage.setItem(ml,JSON.stringify([...S])),S})};Km(()=>{o&&v===!1&&T.current&&T.current.focus()},[o,v]);let f=g.filter(h=>{let m=n.toLowerCase();return h.label.toLowerCase().includes(m)||h.description.toLowerCase().includes(m)||h.category.toLowerCase().includes(m)}),A=Ha(()=>{let h={};for(let S of f){let J=S.category;h[J]||(h[J]=[]),h[J].push(S)}return Object.keys(h).sort((S,J)=>S==="System"?-1:J==="System"?1:S.localeCompare(J)).map(S=>({category:S,actions:h[S]}))},[f]),I=Ha(()=>d?A:A.filter(h=>!l.has(h.category)),[A,l,d]),C=l.size;return at("div",{className:"flex min-h-0 flex-1 flex-col gap-3",children:[at("div",{className:"flex shrink-0 gap-2",children:[at("div",{className:"relative flex-1",children:[me(Um,{className:"absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted-foreground"}),me(se,{className:"pl-9","data-testid":"action-search-input",disabled:t,id:"action-filter",onChange:h=>r(h.target.value),placeholder:"Search actions...",ref:T,value:n})]}),me(rn,{children:at(Rn,{children:[me(On,{asChild:!0,children:me(O,{className:"shrink-0",onClick:y,size:"icon",variant:"ghost",children:u==="list"?me(Hm,{className:"size-4"}):me(_m,{className:"size-4"})})}),me(Ln,{children:u==="list"?"Grid view":"List view"})]})}),C>0&&me(rn,{children:at(Rn,{children:[me(On,{asChild:!0,children:me(O,{className:x("shrink-0",d&&"bg-muted"),onClick:()=>c(!d),size:"icon",variant:"ghost",children:d?me(il,{className:"size-4"}):me(ll,{className:"size-4"})})}),me(Ln,{children:d?"Hide hidden groups":`Show ${C} hidden group${C>1?"s":""}`})]})})]}),at("div",{className:"min-h-0 flex-1 overflow-y-auto pb-4","data-testid":"action-grid",children:[f.length===0&&me("p",{className:"py-4 text-center text-muted-foreground text-sm",children:"No actions found"}),f.length>0&&I.length===0&&me("p",{className:"py-4 text-center text-muted-foreground text-sm",children:"All groups are hidden"}),u==="grid"&&I.length>0&&me("div",{className:"grid gap-2 p-1",style:{gridTemplateColumns:"repeat(auto-fill, minmax(72px, 1fr))"},children:f.filter(h=>d||!l.has(h.category)).map(h=>at("button",{className:x("flex aspect-square flex-col items-center justify-center gap-1.5 rounded-lg border border-transparent p-2 text-center transition-colors hover:border-border hover:bg-muted",t&&"pointer-events-none opacity-50"),"data-testid":`action-option-${h.id.toLowerCase().replace(/\s+/g,"-")}`,disabled:t,onClick:()=>e(h.id),type:"button",children:[me(Xm,{action:h,className:"size-6"}),me("span",{className:"line-clamp-2 font-medium text-xs leading-tight",children:h.label})]},h.id))}),u==="list"&&I.length>0&&I.map((h,m)=>{let S=s.has(h.category),J=l.has(h.category);return at("div",{children:[m>0&&me("div",{className:"my-2 h-px bg-border"}),at("div",{className:x("sticky top-0 z-10 mb-1 flex items-center gap-2 bg-background px-3 py-2 font-medium text-muted-foreground text-xs uppercase tracking-wider",J&&"opacity-50"),children:[at("button",{className:"flex flex-1 items-center gap-2 text-left hover:text-foreground",onClick:()=>w(h.category),type:"button",children:[me(Gm,{className:x("size-3.5 transition-transform",!S&&"rotate-90")}),me(Jm,{group:h}),h.category]}),at(To,{children:[me(Ao,{asChild:!0,children:me("button",{className:"rounded p-0.5 hover:bg-muted hover:text-foreground",type:"button",children:me($m,{className:"size-4"})})}),me(So,{align:"end",children:me(ht,{onClick:()=>k(h.category),children:J?at(dl,{children:[me(il,{className:"mr-2 size-4"}),"Show group"]}):at(dl,{children:[me(ll,{className:"mr-2 size-4"}),"Hide group"]})})})]})]}),!S&&h.actions.map(D=>me("button",{className:x("flex w-full items-center rounded-md px-3 py-2 text-left text-sm transition-colors hover:bg-muted",t&&"pointer-events-none opacity-50"),"data-testid":`action-option-${D.id.toLowerCase().replace(/\s+/g,"-")}`,disabled:t,onClick:()=>e(D.id),type:"button",children:at("span",{className:"min-w-0 flex-1 truncate",children:[me("span",{className:"font-medium",children:D.label}),D.description&&at("span",{className:"text-muted-foreground text-xs",children:[" ","- ",D.description]})]})},D.id))]},h.category)})]})]})}import{Clock as tp,Copy as op,Play as np,Webhook as rp}from"lucide-react";import{toast as ap}from"sonner";import{jsx as Wn,jsxs as fl}from"react/jsx-runtime";var ep=[{label:"North America",zones:[{value:"America/New_York",label:"Eastern Time (ET)"},{value:"America/Chicago",label:"Central Time (CT)"},{value:"America/Denver",label:"Mountain Time (MT)"},{value:"America/Phoenix",label:"Arizona Time (MST)"},{value:"America/Los_Angeles",label:"Pacific Time (PT)"},{value:"America/Anchorage",label:"Alaska Time (AKT)"},{value:"Pacific/Honolulu",label:"Hawaii Time (HST)"},{value:"America/Toronto",label:"Toronto"},{value:"America/Vancouver",label:"Vancouver"}]},{label:"Europe",zones:[{value:"Europe/London",label:"London (GMT/BST)"},{value:"Europe/Paris",label:"Paris (CET/CEST)"},{value:"Europe/Berlin",label:"Berlin (CET/CEST)"},{value:"Europe/Rome",label:"Rome (CET/CEST)"},{value:"Europe/Madrid",label:"Madrid (CET/CEST)"},{value:"Europe/Amsterdam",label:"Amsterdam (CET/CEST)"},{value:"Europe/Brussels",label:"Brussels (CET/CEST)"},{value:"Europe/Stockholm",label:"Stockholm (CET/CEST)"},{value:"Europe/Warsaw",label:"Warsaw (CET/CEST)"},{value:"Europe/Athens",label:"Athens (EET/EEST)"},{value:"Europe/Moscow",label:"Moscow (MSK)"}]},{label:"Asia",zones:[{value:"Asia/Dubai",label:"Dubai (GST)"},{value:"Asia/Kolkata",label:"India (IST)"},{value:"Asia/Shanghai",label:"China (CST)"},{value:"Asia/Hong_Kong",label:"Hong Kong (HKT)"},{value:"Asia/Tokyo",label:"Tokyo (JST)"},{value:"Asia/Seoul",label:"Seoul (KST)"},{value:"Asia/Singapore",label:"Singapore (SGT)"},{value:"Asia/Bangkok",label:"Bangkok (ICT)"},{value:"Asia/Jakarta",label:"Jakarta (WIB)"}]},{label:"Australia & Pacific",zones:[{value:"Australia/Sydney",label:"Sydney (AEDT/AEST)"},{value:"Australia/Melbourne",label:"Melbourne (AEDT/AEST)"},{value:"Australia/Brisbane",label:"Brisbane (AEST)"},{value:"Australia/Perth",label:"Perth (AWST)"},{value:"Pacific/Auckland",label:"Auckland (NZDT/NZST)"}]},{label:"South America",zones:[{value:"America/Sao_Paulo",label:"S\xE3o Paulo (BRT)"},{value:"America/Argentina/Buenos_Aires",label:"Buenos Aires (ART)"},{value:"America/Santiago",label:"Santiago (CLT)"},{value:"America/Bogota",label:"Bogot\xE1 (COT)"},{value:"America/Lima",label:"Lima (PET)"}]},{label:"Africa & Middle East",zones:[{value:"Africa/Cairo",label:"Cairo (EET)"},{value:"Africa/Johannesburg",label:"Johannesburg (SAST)"},{value:"Africa/Lagos",label:"Lagos (WAT)"},{value:"Africa/Nairobi",label:"Nairobi (EAT)"},{value:"Asia/Jerusalem",label:"Jerusalem (IST)"}]},{label:"Other",zones:[{value:"UTC",label:"UTC (Coordinated Universal Time)"}]}];function gl({value:e,onValueChange:t,disabled:o,id:n}){return fl(ke,{value:e,onValueChange:t,disabled:o,children:[Wn(Te,{id:n,children:Wn(Ce,{placeholder:"Select timezone"})}),Wn(Ae,{children:ep.map(r=>fl(li,{children:[Wn(di,{children:r.label}),r.zones.map(s=>Wn(ie,{value:s.value,children:s.label},s.value))]},r.label))})]})}import{Fragment as _a,jsx as Ie,jsxs as st}from"react/jsx-runtime";function Gr({config:e,onUpdateConfig:t,disabled:o,workflowId:n}){let r=n?`${typeof window<"u"?window.location.origin:""}/api/workflows/${n}/webhook`:"",s=()=>{r&&(navigator.clipboard.writeText(r),ap.success("Webhook URL copied to clipboard"))};return st(_a,{children:[st("div",{className:"space-y-2",children:[Ie(F,{className:"ml-1",htmlFor:"triggerType",children:"Trigger Type"}),st(ke,{disabled:o,onValueChange:a=>t("triggerType",a),value:e?.triggerType||"Manual",children:[Ie(Te,{className:"w-full",id:"triggerType",children:Ie(Ce,{placeholder:"Select trigger type"})}),st(Ae,{children:[Ie(ie,{value:"Manual",children:st("div",{className:"flex items-center gap-2",children:[Ie(np,{className:"h-4 w-4"}),"Manual"]})}),Ie(ie,{value:"Schedule",children:st("div",{className:"flex items-center gap-2",children:[Ie(tp,{className:"h-4 w-4"}),"Schedule"]})}),Ie(ie,{value:"Webhook",children:st("div",{className:"flex items-center gap-2",children:[Ie(rp,{className:"h-4 w-4"}),"Webhook"]})})]})]})]}),e?.triggerType==="Webhook"&&st(_a,{children:[st("div",{className:"space-y-2",children:[Ie(F,{className:"ml-1",children:"Webhook URL"}),st("div",{className:"flex gap-2",children:[Ie(se,{className:"font-mono text-xs",disabled:!0,value:r||"Save workflow to generate webhook URL"}),Ie(O,{disabled:!r,onClick:s,size:"icon",variant:"outline",children:Ie(op,{className:"h-4 w-4"})})]})]}),st("div",{className:"space-y-2",children:[Ie(F,{children:"Request Schema (Optional)"}),Ie(no,{disabled:o,onChange:a=>t("webhookSchema",JSON.stringify(a)),schema:e?.webhookSchema?JSON.parse(e.webhookSchema):[]}),Ie("p",{className:"text-muted-foreground text-xs",children:"Define the expected structure of the incoming webhook payload."})]}),st("div",{className:"space-y-2",children:[Ie(F,{htmlFor:"webhookMockRequest",children:"Mock Request (Optional)"}),Ie("div",{className:"overflow-hidden rounded-md border",children:Ie(ft,{defaultLanguage:"json",height:"150px",onChange:a=>t("webhookMockRequest",a||""),options:{minimap:{enabled:!1},lineNumbers:"on",scrollBeyondLastLine:!1,fontSize:12,readOnly:o,wordWrap:"on"},value:e?.webhookMockRequest||""})}),Ie("p",{className:"text-muted-foreground text-xs",children:"Enter a sample JSON payload to test the webhook trigger."})]})]}),e?.triggerType==="Schedule"&&st(_a,{children:[st("div",{className:"space-y-2",children:[Ie(F,{className:"ml-1",htmlFor:"scheduleCron",children:"Cron Expression"}),Ie(se,{disabled:o,id:"scheduleCron",onChange:a=>t("scheduleCron",a.target.value),placeholder:"0 9 * * * (every day at 9am)",value:e?.scheduleCron||""})]}),st("div",{className:"space-y-2",children:[Ie(F,{className:"ml-1",htmlFor:"scheduleTimezone",children:"Timezone"}),Ie(gl,{disabled:o,id:"scheduleTimezone",onValueChange:a=>t("scheduleTimezone",a),value:e?.scheduleTimezone||"America/New_York"})]})]})]})}var yl={"Database Query":Wo.codeGenerator,"HTTP Request":Bo.codeGenerator,Condition:zo.codeGenerator},$a=`async function actionStep(input: Record<string, unknown>) {
|
|
186
|
+
}`};import{useEffect as up,useState as mp}from"react";function pl(){let[e,t]=mp(void 0);return up(()=>{let o="ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0;t(o)},[]),e}import{DropdownMenu as bt}from"radix-ui";import{CheckIcon as fk,ChevronRightIcon as pp,CircleIcon as fp}from"lucide-react";import{jsx as mt,jsxs as bl}from"react/jsx-runtime";function Eo({...e}){return mt(bt.Root,{"data-slot":"dropdown-menu",...e})}function Do({...e}){return mt(bt.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}function Ro({className:e,sideOffset:t=4,...o}){return mt(bt.Portal,{children:mt(bt.Content,{"data-slot":"dropdown-menu-content",sideOffset:t,className:x("bg-popover text-popover-foreground 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=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",e),...o})})}function wt({className:e,inset:t,variant:o="default",...n}){return mt(bt.Item,{"data-slot":"dropdown-menu-item","data-inset":t,"data-variant":o,className:x("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...n})}function fl({...e}){return mt(bt.RadioGroup,{"data-slot":"dropdown-menu-radio-group",...e})}function jr({className:e,children:t,...o}){return bl(bt.RadioItem,{"data-slot":"dropdown-menu-radio-item",className:x("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...o,children:[mt("span",{className:"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center",children:mt(bt.ItemIndicator,{children:mt(fp,{className:"size-2 fill-current"})})}),t]})}function gl({className:e,inset:t,...o}){return mt(bt.Label,{"data-slot":"dropdown-menu-label","data-inset":t,className:x("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",e),...o})}function Kn({className:e,...t}){return mt(bt.Separator,{"data-slot":"dropdown-menu-separator",className:x("bg-border -mx-1 my-1 h-px",e),...t})}function yl({...e}){return mt(bt.Sub,{"data-slot":"dropdown-menu-sub",...e})}function vl({className:e,inset:t,children:o,...n}){return bl(bt.SubTrigger,{"data-slot":"dropdown-menu-sub-trigger","data-inset":t,className:x("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...n,children:[o,mt(pp,{className:"ml-auto size-4"})]})}function hl({className:e,...t}){return mt(bt.SubContent,{"data-slot":"dropdown-menu-sub-content",className:x("bg-popover text-popover-foreground 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=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",e),...t})}import{Fragment as Nl,jsx as me,jsxs as it}from"react/jsx-runtime";var Np=[qo,Uo,Ko,$r,_r,qr,Ur,Kr];function kp(){return Ya(()=>{let t=Ks().map(o=>({id:o.id,label:o.label,description:o.description,category:o.category,integration:o.integration}));return[...Np,...t]},[])}function Cp({group:e}){let t=e.actions[0];return t?.integration?me(Mt,{className:"size-4",integration:t.integration}):e.category==="System"?me(kl,{className:"size-4"}):me(Cl,{className:"size-4"})}function Tp({action:e,className:t}){return e.integration?me(Mt,{className:t,integration:e.integration}):e.category==="System"?me(kl,{className:x(t,"text-muted-foreground")}):me(Cl,{className:x(t,"text-muted-foreground")})}var Tl="workflow-action-grid-hidden-groups",Al="workflow-action-grid-view-mode";function Ap(){if(typeof window>"u")return new Set;try{let e=localStorage.getItem(Tl);return e?new Set(JSON.parse(e)):new Set}catch{return new Set}}function Sp(){if(typeof window>"u")return"list";try{return localStorage.getItem(Al)==="grid"?"grid":"list"}catch{return"list"}}function Jr({onSelectAction:e,disabled:t,isNewlyCreated:o}){let[n,r]=qn(""),[s,a]=qn(new Set),[d,i]=qn(Ap),[l,c]=qn(!1),[u,f]=qn(Sp),h=kp(),T=xp(null),b=pl(),y=()=>{let w=u==="list"?"grid":"list";f(w),localStorage.setItem(Al,w)},p=w=>{a(m=>{let S=new Set(m);return S.has(w)?S.delete(w):S.add(w),S})},v=w=>{i(m=>{let S=new Set(m);return S.has(w)?S.delete(w):S.add(w),localStorage.setItem(Tl,JSON.stringify([...S])),S})};wp(()=>{o&&b===!1&&T.current&&T.current.focus()},[o,b]);let g=h.filter(w=>{let m=n.toLowerCase();return w.label.toLowerCase().includes(m)||w.description.toLowerCase().includes(m)||w.category.toLowerCase().includes(m)}),k=Ya(()=>{let w={};for(let S of g){let X=S.category;w[X]||(w[X]=[]),w[X].push(S)}return Object.keys(w).sort((S,X)=>S==="System"?-1:X==="System"?1:S.localeCompare(X)).map(S=>({category:S,actions:w[S]}))},[g]),I=Ya(()=>l?k:k.filter(w=>!d.has(w.category)),[k,d,l]),A=d.size;return it("div",{className:"flex min-h-0 flex-1 flex-col gap-3",children:[it("div",{className:"flex shrink-0 gap-2",children:[it("div",{className:"relative flex-1",children:[me(bp,{className:"absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted-foreground"}),me(se,{className:"pl-9","data-testid":"action-search-input",disabled:t,id:"action-filter",onChange:w=>r(w.target.value),placeholder:"Search actions...",ref:T,value:n})]}),me(fn,{children:it(Hn,{children:[me($n,{asChild:!0,children:me(D,{className:"shrink-0",onClick:y,size:"icon",variant:"ghost",children:u==="list"?me(yp,{className:"size-4"}):me(vp,{className:"size-4"})})}),me(_n,{children:u==="list"?"Grid view":"List view"})]})}),A>0&&me(fn,{children:it(Hn,{children:[me($n,{asChild:!0,children:me(D,{className:x("shrink-0",l&&"bg-muted"),onClick:()=>c(!l),size:"icon",variant:"ghost",children:l?me(wl,{className:"size-4"}):me(xl,{className:"size-4"})})}),me(_n,{children:l?"Hide hidden groups":`Show ${A} hidden group${A>1?"s":""}`})]})})]}),it("div",{className:"min-h-0 flex-1 overflow-y-auto pb-4","data-testid":"action-grid",children:[g.length===0&&me("p",{className:"py-4 text-center text-muted-foreground text-sm",children:"No actions found"}),g.length>0&&I.length===0&&me("p",{className:"py-4 text-center text-muted-foreground text-sm",children:"All groups are hidden"}),u==="grid"&&I.length>0&&me("div",{className:"grid gap-2 p-1",style:{gridTemplateColumns:"repeat(auto-fill, minmax(72px, 1fr))"},children:g.filter(w=>l||!d.has(w.category)).map(w=>it("button",{className:x("flex aspect-square flex-col items-center justify-center gap-1.5 rounded-lg border border-transparent p-2 text-center transition-colors hover:border-border hover:bg-muted",t&&"pointer-events-none opacity-50"),"data-testid":`action-option-${w.id.toLowerCase().replace(/\s+/g,"-")}`,disabled:t,onClick:()=>e(w.id),type:"button",children:[me(Tp,{action:w,className:"size-6"}),me("span",{className:"line-clamp-2 font-medium text-xs leading-tight",children:w.label})]},w.id))}),u==="list"&&I.length>0&&I.map((w,m)=>{let S=s.has(w.category),X=d.has(w.category);return it("div",{children:[m>0&&me("div",{className:"my-2 h-px bg-border"}),it("div",{className:x("sticky top-0 z-10 mb-1 flex items-center gap-2 bg-background px-3 py-2 font-medium text-muted-foreground text-xs uppercase tracking-wider",X&&"opacity-50"),children:[it("button",{className:"flex flex-1 items-center gap-2 text-left hover:text-foreground",onClick:()=>p(w.category),type:"button",children:[me(gp,{className:x("size-3.5 transition-transform",!S&&"rotate-90")}),me(Cp,{group:w}),w.category]}),it(Eo,{children:[me(Do,{asChild:!0,children:me("button",{className:"rounded p-0.5 hover:bg-muted hover:text-foreground",type:"button",children:me(hp,{className:"size-4"})})}),me(Ro,{align:"end",children:me(wt,{onClick:()=>v(w.category),children:X?it(Nl,{children:[me(wl,{className:"mr-2 size-4"}),"Show group"]}):it(Nl,{children:[me(xl,{className:"mr-2 size-4"}),"Hide group"]})})})]})]}),!S&&w.actions.map(le=>me("button",{className:x("flex w-full items-center rounded-md px-3 py-2 text-left text-sm transition-colors hover:bg-muted",t&&"pointer-events-none opacity-50"),"data-testid":`action-option-${le.id.toLowerCase().replace(/\s+/g,"-")}`,disabled:t,onClick:()=>e(le.id),type:"button",children:it("span",{className:"min-w-0 flex-1 truncate",children:[me("span",{className:"font-medium",children:le.label}),le.description&&it("span",{className:"text-muted-foreground text-xs",children:[" ","- ",le.description]})]})},le.id))]},w.category)})]})]})}import{Clock as Pp,Copy as Ep,Play as Dp,Webhook as Rp}from"lucide-react";import{toast as Op}from"sonner";import{jsx as jn,jsxs as Sl}from"react/jsx-runtime";var Ip=[{label:"North America",zones:[{value:"America/New_York",label:"Eastern Time (ET)"},{value:"America/Chicago",label:"Central Time (CT)"},{value:"America/Denver",label:"Mountain Time (MT)"},{value:"America/Phoenix",label:"Arizona Time (MST)"},{value:"America/Los_Angeles",label:"Pacific Time (PT)"},{value:"America/Anchorage",label:"Alaska Time (AKT)"},{value:"Pacific/Honolulu",label:"Hawaii Time (HST)"},{value:"America/Toronto",label:"Toronto"},{value:"America/Vancouver",label:"Vancouver"}]},{label:"Europe",zones:[{value:"Europe/London",label:"London (GMT/BST)"},{value:"Europe/Paris",label:"Paris (CET/CEST)"},{value:"Europe/Berlin",label:"Berlin (CET/CEST)"},{value:"Europe/Rome",label:"Rome (CET/CEST)"},{value:"Europe/Madrid",label:"Madrid (CET/CEST)"},{value:"Europe/Amsterdam",label:"Amsterdam (CET/CEST)"},{value:"Europe/Brussels",label:"Brussels (CET/CEST)"},{value:"Europe/Stockholm",label:"Stockholm (CET/CEST)"},{value:"Europe/Warsaw",label:"Warsaw (CET/CEST)"},{value:"Europe/Athens",label:"Athens (EET/EEST)"},{value:"Europe/Moscow",label:"Moscow (MSK)"}]},{label:"Asia",zones:[{value:"Asia/Dubai",label:"Dubai (GST)"},{value:"Asia/Kolkata",label:"India (IST)"},{value:"Asia/Shanghai",label:"China (CST)"},{value:"Asia/Hong_Kong",label:"Hong Kong (HKT)"},{value:"Asia/Tokyo",label:"Tokyo (JST)"},{value:"Asia/Seoul",label:"Seoul (KST)"},{value:"Asia/Singapore",label:"Singapore (SGT)"},{value:"Asia/Bangkok",label:"Bangkok (ICT)"},{value:"Asia/Jakarta",label:"Jakarta (WIB)"}]},{label:"Australia & Pacific",zones:[{value:"Australia/Sydney",label:"Sydney (AEDT/AEST)"},{value:"Australia/Melbourne",label:"Melbourne (AEDT/AEST)"},{value:"Australia/Brisbane",label:"Brisbane (AEST)"},{value:"Australia/Perth",label:"Perth (AWST)"},{value:"Pacific/Auckland",label:"Auckland (NZDT/NZST)"}]},{label:"South America",zones:[{value:"America/Sao_Paulo",label:"S\xE3o Paulo (BRT)"},{value:"America/Argentina/Buenos_Aires",label:"Buenos Aires (ART)"},{value:"America/Santiago",label:"Santiago (CLT)"},{value:"America/Bogota",label:"Bogot\xE1 (COT)"},{value:"America/Lima",label:"Lima (PET)"}]},{label:"Africa & Middle East",zones:[{value:"Africa/Cairo",label:"Cairo (EET)"},{value:"Africa/Johannesburg",label:"Johannesburg (SAST)"},{value:"Africa/Lagos",label:"Lagos (WAT)"},{value:"Africa/Nairobi",label:"Nairobi (EAT)"},{value:"Asia/Jerusalem",label:"Jerusalem (IST)"}]},{label:"Other",zones:[{value:"UTC",label:"UTC (Coordinated Universal Time)"}]}];function Il({value:e,onValueChange:t,disabled:o,id:n}){return Sl(ve,{value:e,onValueChange:t,disabled:o,children:[jn(he,{id:n,children:jn(we,{placeholder:"Select timezone"})}),jn(be,{children:Ip.map(r=>Sl(vi,{children:[jn(hi,{children:r.label}),r.zones.map(s=>jn(te,{value:s.value,children:s.label},s.value))]},r.label))})]})}import{Fragment as Xa,jsx as Ie,jsxs as lt}from"react/jsx-runtime";function Yr({config:e,onUpdateConfig:t,disabled:o,workflowId:n}){let r=n?`${typeof window<"u"?window.location.origin:""}/api/workflows/${n}/webhook`:"",s=()=>{r&&(navigator.clipboard.writeText(r),Op.success("Webhook URL copied to clipboard"))};return lt(Xa,{children:[lt("div",{className:"space-y-2",children:[Ie(M,{className:"ml-1",htmlFor:"triggerType",children:"Trigger Type"}),lt(ve,{disabled:o,onValueChange:a=>t("triggerType",a),value:e?.triggerType||"Manual",children:[Ie(he,{className:"w-full",id:"triggerType",children:Ie(we,{placeholder:"Select trigger type"})}),lt(be,{children:[Ie(te,{value:"Manual",children:lt("div",{className:"flex items-center gap-2",children:[Ie(Dp,{className:"h-4 w-4"}),"Manual"]})}),Ie(te,{value:"Schedule",children:lt("div",{className:"flex items-center gap-2",children:[Ie(Pp,{className:"h-4 w-4"}),"Schedule"]})}),Ie(te,{value:"Webhook",children:lt("div",{className:"flex items-center gap-2",children:[Ie(Rp,{className:"h-4 w-4"}),"Webhook"]})})]})]})]}),e?.triggerType==="Webhook"&<(Xa,{children:[lt("div",{className:"space-y-2",children:[Ie(M,{className:"ml-1",children:"Webhook URL"}),lt("div",{className:"flex gap-2",children:[Ie(se,{className:"font-mono text-xs",disabled:!0,value:r||"Save workflow to generate webhook URL"}),Ie(D,{disabled:!r,onClick:s,size:"icon",variant:"outline",children:Ie(Ep,{className:"h-4 w-4"})})]})]}),lt("div",{className:"space-y-2",children:[Ie(M,{children:"Request Schema (Optional)"}),Ie(lo,{disabled:o,onChange:a=>t("webhookSchema",JSON.stringify(a)),schema:e?.webhookSchema?JSON.parse(e.webhookSchema):[]}),Ie("p",{className:"text-muted-foreground text-xs",children:"Define the expected structure of the incoming webhook payload."})]}),lt("div",{className:"space-y-2",children:[Ie(M,{htmlFor:"webhookMockRequest",children:"Mock Request (Optional)"}),Ie("div",{className:"overflow-hidden rounded-md border",children:Ie(yt,{defaultLanguage:"json",height:"150px",onChange:a=>t("webhookMockRequest",a||""),options:{minimap:{enabled:!1},lineNumbers:"on",scrollBeyondLastLine:!1,fontSize:12,readOnly:o,wordWrap:"on"},value:e?.webhookMockRequest||""})}),Ie("p",{className:"text-muted-foreground text-xs",children:"Enter a sample JSON payload to test the webhook trigger."})]})]}),e?.triggerType==="Schedule"&<(Xa,{children:[lt("div",{className:"space-y-2",children:[Ie(M,{className:"ml-1",htmlFor:"scheduleCron",children:"Cron Expression"}),Ie(se,{disabled:o,id:"scheduleCron",onChange:a=>t("scheduleCron",a.target.value),placeholder:"0 9 * * * (every day at 9am)",value:e?.scheduleCron||""})]}),lt("div",{className:"space-y-2",children:[Ie(M,{className:"ml-1",htmlFor:"scheduleTimezone",children:"Timezone"}),Ie(Il,{disabled:o,id:"scheduleTimezone",onValueChange:a=>t("scheduleTimezone",a),value:e?.scheduleTimezone||"America/New_York"})]})]})]})}var Pl={"Database Query":Ko.codeGenerator,"HTTP Request":qo.codeGenerator,Condition:Uo.codeGenerator},Qa=`async function actionStep(input: Record<string, unknown>) {
|
|
168
187
|
"use step";
|
|
169
188
|
|
|
170
189
|
console.log('Executing action');
|
|
171
190
|
return { success: true };
|
|
172
|
-
}`,
|
|
191
|
+
}`,Lp=`async function unknownStep(input: Record<string, unknown>) {
|
|
173
192
|
"use step";
|
|
174
193
|
|
|
175
194
|
return input;
|
|
176
|
-
}`;function
|
|
195
|
+
}`;function Mp(e,t){let o=e?.triggerType||"Manual";if(o==="Schedule"){let n=e?.scheduleCron||"0 9 * * *";return`{
|
|
177
196
|
"crons": [
|
|
178
197
|
{
|
|
179
198
|
"path": "${t?`/api/workflow-builder/workflow/${t}/cron`:"/api/workflow-builder/workflow/<workflowId>/cron"}",
|
|
@@ -189,7 +208,7 @@ export async function POST(request: NextRequest) {
|
|
|
189
208
|
await executeWorkflow(body);
|
|
190
209
|
|
|
191
210
|
return Response.json({ success: true });
|
|
192
|
-
}`:""}function lp(e){if(!e)return $a;if(yl[e])return yl[e];let t=pe(e);return t&&t.codegenTemplate||$a}var sn=(e,t)=>e.data.type==="trigger"?ip(e.data.config,t):e.data.type==="action"?lp(e.data.config?.actionType):sp;import{useAtom as Ua}from"jotai";import{Check as bl,ChevronDown as ja,ChevronRight as qa,Clock as up,Copy as mp,ExternalLink as pp,Loader2 as fp,Play as gp,X as yp}from"lucide-react";import hl from"next/image";import{useCallback as Hr,useEffect as _r,useRef as vp,useState as Io}from"react";function ln(e,t){return`${e} ${t}${e===1?"":"s"} ago`}function vl(e){let t=new Date,o=new Date(e),n=Math.floor((t.getTime()-o.getTime())/1e3);if(n<60)return"just now";let r=Math.floor(n/60);if(r<60)return ln(r,"min");let s=Math.floor(r/60);if(s<24)return ln(s,"hour");let a=Math.floor(s/24);if(a<7)return ln(a,"day");let l=Math.floor(a/7);if(l<4)return ln(l,"week");let i=Math.floor(a/30);if(i<12)return ln(i,"month");let d=Math.floor(a/365);return ln(d,"year")}import{Loader2Icon as dp}from"lucide-react";import{jsx as cp}from"react/jsx-runtime";function Nt({className:e,...t}){let{ref:o,...n}=t;return cp(dp,{role:"status","aria-label":"Loading",className:x("size-4 animate-spin",e),...n})}import{Fragment as Ur,jsx as _,jsxs as Fe}from"react/jsx-runtime";function hp(e){return Ms(e)}function bp(e,t){if(typeof e!="object"||e===null)return;let o=e[t.field];if(typeof o=="string"&&o.length>0)return o}function wp(e){return typeof e=="object"&&e!==null&&"base64"in e&&typeof e.base64=="string"&&e.base64.length>100}function Ka(e){let t={};for(let o of e)t[o.nodeId]={nodeId:o.nodeId,nodeName:o.nodeName,nodeType:o.nodeType,status:o.status,output:o.output};return t}function xp(e){try{let t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return!1}}function wl({data:e}){let o=JSON.stringify(e,null,2).split(/("https?:\/\/[^"]+"|"[^"]*")/g);return _(Ur,{children:o.map(n=>{if(n.startsWith('"')&&n.endsWith('"')){let r=n.slice(1,-1);if(xp(r))return _("a",{className:"text-blue-500 underline hover:text-blue-400",href:r,rel:"noopener noreferrer",target:"_blank",children:n},r)}return n})})}function Np({data:e,isError:t=!1}){let[o,n]=Io(!1);return _(O,{className:"h-7 px-2",onClick:async s=>{s.stopPropagation();try{let a=t?String(e):JSON.stringify(e,null,2);await navigator.clipboard.writeText(a),n(!0),setTimeout(()=>n(!1),2e3)}catch(a){console.error("Failed to copy:",a)}},size:"sm",type:"button",variant:"ghost",children:o?_(bl,{className:"h-3 w-3 text-green-600"}):_(mp,{className:"h-3 w-3"})})}function $r({title:e,children:t,defaultExpanded:o=!1,copyData:n,isError:r=!1,externalLink:s}){let[a,l]=Io(o);return Fe("div",{children:[Fe("div",{className:"mb-2 flex w-full items-center justify-between",children:[Fe("button",{className:"flex items-center gap-1.5",onClick:()=>l(!a),type:"button",children:[a?_(ja,{className:"h-3 w-3 text-muted-foreground"}):_(qa,{className:"h-3 w-3 text-muted-foreground"}),_("span",{className:"font-medium text-muted-foreground text-xs uppercase tracking-wide",children:e})]}),Fe("div",{className:"flex items-center gap-1",children:[s&&_(O,{asChild:!0,className:"h-7 px-2",size:"sm",variant:"ghost",children:_("a",{href:s,rel:"noopener noreferrer",target:"_blank",children:_(pp,{className:"h-3 w-3"})})}),n!==void 0&&_(Np,{data:n,isError:r})]})]}),a&&t]})}function kp({output:e,input:t,actionType:o}){let r=(o?pe(o):void 0)?.outputConfig,s=o?hp(o):void 0,a=r?.type!=="component"?r:s,l=a?bp(e,a):void 0,i=!(r||s)&&wp(e),c=(()=>{if(r?.type==="component"){let g=r.component;return _("div",{className:"overflow-hidden rounded-lg border bg-muted/50 p-3",children:_(g,{input:t,output:e})})}if(a&&l)switch(a.type){case"image":{let g=a.field==="base64"&&!l.startsWith("data:")?`data:image/png;base64,${l}`:l;return _("div",{className:"overflow-hidden rounded-lg border bg-muted/50 p-3",children:_(hl,{alt:"Generated image",className:"max-h-96 w-auto rounded",height:384,src:g,unoptimized:!0,width:384})})}case"video":return _("div",{className:"overflow-hidden rounded-lg border bg-muted/50 p-3",children:_("video",{className:"max-h-96 w-auto rounded",controls:!0,src:l,children:_("track",{kind:"captions"})})});case"url":return _("div",{className:"overflow-hidden rounded-lg border bg-muted/50",children:_("iframe",{className:"h-96 w-full rounded",sandbox:"allow-scripts allow-same-origin",src:l,title:"Output preview"})});default:return null}return i?_("div",{className:"overflow-hidden rounded-lg border bg-muted/50 p-3",children:_(hl,{alt:"AI generated output",className:"max-h-96 w-auto rounded",height:384,src:`data:image/png;base64,${e.base64}`,unoptimized:!0,width:384})}):null})(),u=c!==null,p=a?.type==="url"&&l?l:void 0;return Fe(Ur,{children:[_($r,{copyData:e,title:"Output",children:_("pre",{className:"overflow-auto rounded-lg border bg-muted/50 p-3 font-mono text-xs leading-relaxed",children:_(wl,{data:e})})}),u&&_($r,{defaultExpanded:!0,externalLink:p,title:"Result",children:c})]})}function Cp({log:e,isExpanded:t,onToggle:o,getStatusIcon:n,getStatusDotClass:r,isFirst:s,isLast:a}){return Fe("div",{className:"relative flex gap-3",children:[Fe("div",{className:"relative -ml-px flex flex-col items-center pt-2",children:[!s&&_("div",{className:"absolute bottom-full h-2 w-px bg-border"}),_("div",{className:x("z-10 flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-0",r(e.status)),children:n(e.status)}),!a&&_("div",{className:"absolute top-[calc(0.5rem+1.25rem)] bottom-0 w-px bg-border"})]}),Fe("div",{className:"min-w-0 flex-1",children:[_("button",{className:"group w-full rounded-lg py-2 text-left transition-colors hover:bg-muted/50",onClick:o,type:"button",children:Fe("div",{className:"flex items-center gap-3",children:[_("div",{className:"min-w-0 flex-1",children:Fe("div",{className:"flex items-center gap-2",children:[t?_(ja,{className:"h-3.5 w-3.5 shrink-0 text-muted-foreground"}):_(qa,{className:"h-3.5 w-3.5 shrink-0 text-muted-foreground"}),_("span",{className:"truncate font-medium text-sm transition-colors group-hover:text-foreground",children:e.nodeName||e.nodeType})]})}),e.duration&&_("span",{className:"shrink-0 font-mono text-muted-foreground text-xs tabular-nums",children:Number.parseInt(e.duration,10)<1e3?`${e.duration}ms`:`${(Number.parseInt(e.duration,10)/1e3).toFixed(2)}s`})]})}),t&&Fe("div",{className:"mt-2 mb-2 space-y-3 px-3",children:[e.input!==null&&e.input!==void 0&&_($r,{copyData:e.input,title:"Input",children:_("pre",{className:"overflow-auto rounded-lg border bg-muted/50 p-3 font-mono text-xs leading-relaxed",children:_(wl,{data:e.input})})}),e.output!==null&&e.output!==void 0&&_(kp,{actionType:e.nodeType,input:e.input,output:e.output}),e.error&&_($r,{copyData:e.error,defaultExpanded:!0,isError:!0,title:"Error",children:_("pre",{className:"overflow-auto rounded-lg border border-red-500/20 bg-red-500/5 p-3 font-mono text-red-600 text-xs leading-relaxed",children:e.error})}),!(e.input||e.output||e.error)&&_("div",{className:"rounded-lg border bg-muted/30 py-4 text-center text-muted-foreground text-xs",children:"No data recorded"})]})]})]},e.id)}function dn({isActive:e=!1,onRefreshRef:t,onStartRun:o}){let[n]=Ua($e),[r,s]=Ua(Qt),[,a]=Ua(pr),[l,i]=Io([]),[d,c]=Io({}),[u,p]=Io(new Set),[g,T]=Io(new Set),[v,y]=Io(!0),w=vp(null),k=Hr(async(D=!0)=>{if(!n){y(!1);return}try{D&&y(!0);let j=await q.workflow.getExecutions(n);i(j)}catch(j){console.error("Failed to load executions:",j),i([])}finally{D&&y(!1)}},[n]);_r(()=>{t&&(t.current=()=>k(!1))},[k,t]),_r(()=>{k()},[k]);let f=Hr((D,j)=>D.map(z=>({id:z.id,nodeId:z.nodeId,nodeName:z.nodeName,nodeType:z.nodeType,status:z.status,startedAt:new Date(z.startedAt),completedAt:z.completedAt?new Date(z.completedAt):null,duration:z.duration,input:z.input,output:z.output,error:z.error})),[]),A=Hr(async D=>{try{let j=await q.workflow.getExecutionLogs(D),z=f(j.logs,j.execution.workflow);c(re=>({...re,[D]:z})),D===r&&a(Ka(z))}catch(j){console.error("Failed to load execution logs:",j),c(z=>({...z,[D]:[]}))}},[f,r,a]);_r(()=>{if(l.length===0)return;let D=l[0];D.status==="running"&&D.id!==w.current&&(w.current=D.id,s(D.id),p(j=>{let z=new Set(j);return z.add(D.id),z}),A(D.id),o&&o(D.id))},[l,s,A,o]);let I=Hr(async D=>{try{let j=await q.workflow.getExecutionLogs(D),z=f(j.logs,j.execution.workflow);c(re=>({...re,[D]:z})),D===r&&a(Ka(z))}catch(j){console.error(`Failed to refresh logs for ${D}:`,j)}},[f,r,a]);_r(()=>{if(!(e&&n))return;let j=setInterval(async()=>{try{let z=await q.workflow.getExecutions(n);i(z);for(let re of u)await I(re)}catch(z){console.error("Failed to poll executions:",z)}},2e3);return()=>clearInterval(j)},[e,n,u,I]);let C=async D=>{let j=new Set(u);j.has(D)?j.delete(D):(j.add(D),await A(D)),p(j)},h=D=>{if(r===D){s(null),a({});return}s(D);let j=d[D]||[];a(Ka(j))},m=D=>{let j=new Set(g);j.has(D)?j.delete(D):j.add(D),T(j)},S=D=>{switch(D){case"success":return _(bl,{className:"h-3 w-3 text-white"});case"error":return _(yp,{className:"h-3 w-3 text-white"});case"running":return _(fp,{className:"h-3 w-3 animate-spin text-white"});default:return _(up,{className:"h-3 w-3 text-white"})}},J=D=>{switch(D){case"success":return"bg-green-600";case"error":return"bg-red-600";case"running":return"bg-blue-600";default:return"bg-muted-foreground"}};return v?_("div",{className:"flex items-center justify-center py-12",children:_(Nt,{})}):l.length===0?Fe("div",{className:"flex flex-col items-center justify-center py-16",children:[_("div",{className:"mb-3 rounded-lg border border-dashed p-4",children:_(gp,{className:"h-6 w-6 text-muted-foreground"})}),_("div",{className:"font-medium text-foreground text-sm",children:"No runs yet"}),_("div",{className:"mt-1 text-muted-foreground text-xs",children:"Execute your workflow to see runs here"})]}):_("div",{className:"space-y-3",children:l.map((D,j)=>{let z=u.has(D.id),re=r===D.id,P=(d[D.id]||[]).sort((V,X)=>new Date(V.startedAt).getTime()-new Date(X.startedAt).getTime());return Fe("div",{className:x("overflow-hidden rounded-lg border bg-card transition-all",re&&"ring-2 ring-primary ring-offset-2 ring-offset-background"),children:[Fe("div",{className:"flex w-full items-center gap-3 p-4",children:[_("button",{className:"flex size-5 shrink-0 items-center justify-center rounded-full border-0 transition-colors hover:bg-muted",onClick:()=>C(D.id),type:"button",children:_("div",{className:x("flex size-5 items-center justify-center rounded-full border-0",J(D.status)),children:S(D.status)})}),Fe("button",{className:"min-w-0 flex-1 text-left transition-colors hover:opacity-80",onClick:()=>h(D.id),type:"button",children:[_("div",{className:"mb-1 flex items-center gap-2",children:Fe("span",{className:"font-semibold text-sm",children:["Run #",l.length-j]})}),Fe("div",{className:"flex items-center gap-2 font-mono text-muted-foreground text-xs",children:[_("span",{children:vl(D.startedAt)}),D.duration&&Fe(Ur,{children:[_("span",{children:"\u2022"}),_("span",{className:"tabular-nums",children:Number.parseInt(D.duration,10)<1e3?`${D.duration}ms`:`${(Number.parseInt(D.duration,10)/1e3).toFixed(2)}s`})]}),P.length>0&&Fe(Ur,{children:[_("span",{children:"\u2022"}),Fe("span",{children:[P.length," ",P.length===1?"step":"steps"]})]})]})]}),_("button",{className:"flex shrink-0 items-center justify-center rounded p-1 transition-colors hover:bg-muted",onClick:()=>C(D.id),type:"button",children:z?_(ja,{className:"h-4 w-4 text-muted-foreground"}):_(qa,{className:"h-4 w-4 text-muted-foreground"})})]}),z&&_("div",{className:"border-t bg-muted/20",children:P.length===0?_("div",{className:"py-8 text-center text-muted-foreground text-xs",children:"No steps recorded"}):_("div",{className:"p-4",children:P.map((V,X)=>_(Cp,{getStatusDotClass:J,getStatusIcon:S,isExpanded:g.has(V.id),isFirst:X===0,isLast:X===P.length-1,log:V,onToggle:()=>m(V.id)},V.id))})})]},D.id)})})}import{Fragment as co,jsx as L,jsxs as $}from"react/jsx-runtime";var Pp=/[^a-zA-Z0-9\s]/g,Ep=/\s+/,Al={"Database Query":"database"},Dp=({selectedNodes:e,selectedEdges:t,onDelete:o})=>{let[n,r]=Bn(!1),s=e.length===1?"node":"nodes",a=t.length===1?"line":"lines",l=[];e.length>0&&l.push(`${e.length} ${s}`),t.length>0&&l.push(`${t.length} ${a}`);let i=l.join(" and ");return $(co,{children:[$("div",{className:"flex size-full flex-col",children:[L("div",{className:"flex h-14 w-full shrink-0 items-center border-b bg-transparent px-4",children:L("h2",{className:"font-semibold text-foreground",children:"Properties"})}),$("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:[$("div",{className:"space-y-2",children:[L(F,{children:"Selection"}),$("p",{className:"text-muted-foreground text-sm",children:[i," selected"]})]}),L("div",{className:"flex items-center gap-2 pt-4",children:$(O,{className:"text-muted-foreground",onClick:()=>r(!0),size:"sm",variant:"ghost",children:[L(jr,{className:"mr-2 size-4"}),"Delete"]})})]})]}),L(Go,{onOpenChange:r,open:n,children:$(Ho,{children:[$(_o,{children:[L(Uo,{children:"Delete Selected Items"}),$(Ko,{children:["Are you sure you want to delete ",i,"? This action cannot be undone."]})]}),$($o,{children:[L(qo,{children:"Cancel"}),L(jo,{onClick:()=>{o(),r(!1)},children:"Delete"})]})]})})]})},Rp=()=>{let[e]=io(be),[t]=io(_e),[o]=io(oe),n=Ya(ue),[r]=io(wt),[s]=io($e),[a,l]=io(pt),i=Ya(Xt),d=lo(Zt),c=lo(eo),u=lo(to),p=lo(Xs),g=lo(Qs),T=lo(Zs),v=lo(yr),y=lo(ur),[w,k]=io(Jt),[f,A]=Bn(!1),[I,C]=Bn(!1),[h,m]=Bn(!1),[S,J]=Bn(!1),[D,j]=io(Ft),z=Tl(null),re=Tl({}),P=o.find(ee=>ee.id===e),V=n.find(ee=>ee.id===t),X=o.filter(ee=>ee.selected),W=n.filter(ee=>ee.selected),U=X.length+W.length>1;Cl(()=>{if(!P||D!=="code")return;let ee=P.data.config?.actionType==="Condition",ve=P.data.type==="trigger"&&P.data.config?.triggerType==="Manual";(ee||ve)&&j("properties")},[P,D,j]);let N=Ya(mt);Cl(()=>{if(!(P&&i))return;let ee=P.data.config?.actionType,ve=P.data.config?.integrationId;if(!(ee&&ve))return;let E=pe(ee)?.integration||Al[ee];if(!E||N.some(ce=>ce.id===ve))return;let Y=N.filter(ce=>ce.type===E);if(Y.length===1){let ce={...P.data.config,integrationId:Y[0].id};d({id:P.id,data:{config:ce}})}else if(Y.length===0){let ce={...P.data.config,integrationId:void 0};d({id:P.id,data:{config:ce}})}},[P,N,i,d]);let M=Ip(()=>{let ve=`${a.replace(Pp,"").split(Ep).map((E,H)=>H===0?E.toLowerCase():E.charAt(0).toUpperCase()+E.slice(1).toLowerCase()).join("")||"execute"}Workflow`,{code:Q}=tr(o,n,{functionName:ve});return Q},[o,n,a]),b=()=>{P&&navigator.clipboard.writeText(sn(P))},R=()=>{navigator.clipboard.writeText(M),Kr.success("Code copied to clipboard")},G=()=>{e&&(c(e),A(!1))},te=()=>{if(P){let ee=P.data.enabled??!0;d({id:P.id,data:{enabled:!ee}})}},de=()=>{t&&(u(t),C(!1))},B=async()=>{if(s)try{await q.workflow.deleteExecutions(s),v(),m(!1)}catch(ee){console.error("Failed to delete runs:",ee);let ve=ee instanceof Error?ee.message:"Failed to delete runs";Kr.error(ve)}},xe=ee=>{P&&d({id:P.id,data:{label:ee}})},qe=ee=>{P&&d({id:P.id,data:{description:ee}})},Ye=Sp(async(ee,ve,Q,E)=>{let Y=pe(ve)?.integration||Al[ve];if(!Y){y(ce=>{let Ee=new Set(ce);return Ee.delete(ee),Ee});return}try{let ce=await q.integration.getAll();if(E.aborted)return;let Ee=ce.filter(Re=>Re.type===Y);if(Ee.length===1&&!E.aborted){let Re={...Q,actionType:ve,integrationId:Ee[0].id};d({id:ee,data:{config:Re}})}}catch(ce){console.error("Failed to auto-select integration:",ce)}finally{E.aborted||y(ce=>{let Ee=new Set(ce);return Ee.delete(ee),Ee})}},[d,y]),He=(ee,ve)=>{if(P){let Q={...P.data.config,[ee]:ve};if(ee==="actionType"&&P.data.config?.integrationId&&(Q={...Q,integrationId:void 0}),d({id:P.id,data:{config:Q}}),ee==="actionType"){let E=re.current[P.id];E&&E.abort();let H=new AbortController;re.current[P.id]=H,y(Y=>new Set(Y).add(P.id)),Ye(P.id,ve,Q,H.signal)}}},qt=async ee=>{if(l(ee),s)try{await q.workflow.update(s,{name:ee,nodes:o,edges:n})}catch(ve){console.error("Failed to update workflow name:",ve),Kr.error("Failed to update workspace name")}},St=async()=>{J(!0);try{z.current&&await z.current()}catch(ee){console.error("Failed to refresh runs:",ee),Kr.error("Failed to refresh runs")}finally{J(!1)}};return U?L(Dp,{onDelete:p,selectedEdges:W,selectedNodes:X}):V?$(co,{children:[$("div",{className:"flex size-full flex-col",children:[L("div",{className:"flex h-14 w-full shrink-0 items-center border-b bg-transparent px-4",children:L("h2",{className:"font-semibold text-foreground",children:"Properties"})}),$("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:[$("div",{className:"space-y-2",children:[L(F,{className:"ml-1",htmlFor:"edge-id",children:"Edge ID"}),L(se,{disabled:!0,id:"edge-id",value:V.id})]}),$("div",{className:"space-y-2",children:[L(F,{className:"ml-1",htmlFor:"edge-source",children:"Source"}),L(se,{disabled:!0,id:"edge-source",value:V.source})]}),$("div",{className:"space-y-2",children:[L(F,{className:"ml-1",htmlFor:"edge-target",children:"Target"}),L(se,{disabled:!0,id:"edge-target",value:V.target})]}),i&&L("div",{className:"flex items-center gap-2 pt-4",children:$(O,{className:"text-muted-foreground",onClick:()=>C(!0),size:"sm",variant:"ghost",children:[L(jr,{className:"mr-2 size-4"}),"Delete"]})})]})]}),L(Go,{onOpenChange:C,open:I,children:$(Ho,{children:[$(_o,{children:[L(Uo,{children:"Delete Edge"}),L(Ko,{children:"Are you sure you want to delete this connection? This action cannot be undone."})]}),$($o,{children:[L(qo,{children:"Cancel"}),L(jo,{onClick:de,children:"Delete"})]})]})})]}):P?$(co,{children:[$(ha,{className:"size-full","data-testid":"properties-panel",defaultValue:"properties",onValueChange:j,value:D,children:[$(ba,{className:"h-14 w-full shrink-0 rounded-none border-b bg-transparent px-4 py-2.5",children:[L(vo,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"properties",children:"Properties"}),(P.data.type!=="trigger"||P.data.config?.triggerType!=="Manual")&&P.data.config?.actionType!=="Condition"?L(vo,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"code",children:"Code"}):null,i&&L(vo,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"runs",children:"Runs"})]}),$(ho,{className:"flex flex-col overflow-hidden",value:"properties",children:[P.data.type==="action"&&!P.data.config?.actionType&&i&&L("div",{className:"flex min-h-0 flex-1 flex-col px-4 pt-4",children:L(Vr,{disabled:r,isNewlyCreated:P?.id===w,onSelectAction:ee=>{He("actionType",ee),P?.id===w&&k(null)}})}),!(P.data.type==="action"&&!P.data.config?.actionType&&i)&&$("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:[$("div",{className:"space-y-2",children:[L(F,{className:"ml-1",htmlFor:"node-id",children:"Node ID"}),L(se,{readOnly:!0,id:"node-id",value:P?.id||""})]}),P.data.type==="trigger"&&L(Gr,{config:P.data.config||{},disabled:r||!i,onUpdateConfig:He,workflowId:s??void 0}),P.data.type==="action"&&!P.data.config?.actionType&&!i&&L("div",{className:"rounded-lg border border-muted bg-muted/30 p-3",children:L("p",{className:"text-muted-foreground text-sm",children:"No action configured for this step."})}),P.data.type==="action"&&P.data.config?.actionType?L(Mr,{config:P.data.config||{},disabled:r||!i,isOwner:i,onUpdateConfig:He}):null,P.data.type!=="action"||P.data.config?.actionType?$(co,{children:[$("div",{className:"space-y-2",children:[L(F,{className:"ml-1",htmlFor:"label",children:"Label"}),L(se,{disabled:r||!i,id:"label",onChange:ee=>xe(ee.target.value),value:P.data.label})]}),$("div",{className:"space-y-2",children:[L(F,{className:"ml-1",htmlFor:"description",children:"Description"}),L(se,{disabled:r||!i,id:"description",onChange:ee=>qe(ee.target.value),placeholder:"Optional description",value:P.data.description||""})]})]}):null,!i&&L("div",{className:"rounded-lg border border-muted bg-muted/30 p-3",children:L("p",{className:"text-muted-foreground text-sm",children:"You are viewing a public workflow. Duplicate it to make changes."})}),i&&$("div",{className:"flex items-center gap-2 pt-4",children:[P.data.type==="action"&&L(O,{className:"text-muted-foreground",onClick:te,size:"sm",variant:"ghost",children:P.data.enabled===!1?$(co,{children:[L(Ap,{className:"mr-2 size-4"}),"Disabled"]}):$(co,{children:[L(Tp,{className:"mr-2 size-4"}),"Enabled"]})}),$(O,{className:"text-muted-foreground",onClick:()=>A(!0),size:"sm",variant:"ghost",children:[L(jr,{className:"mr-2 size-4"}),"Delete"]})]})]})]}),L(ho,{className:"flex flex-col overflow-hidden data-[state=inactive]:hidden",forceMount:!0,value:"code",children:(()=>{let ee=P.data.config?.triggerType,ve="",Q="typescript";return P.data.type==="trigger"?ee==="Schedule"?(ve="vercel.json",Q="json"):ee==="Webhook"&&(ve=`app/api${P.data.config?.webhookPath||"/webhook"}/route.ts`,Q="typescript"):ve=`steps/${P.data.config?.actionType?.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"")||"action"}-step.ts`,$(co,{children:[ve&&$("div",{className:"flex shrink-0 items-center justify-between border-b bg-muted/30 px-3 pb-2",children:[$("div",{className:"flex items-center gap-2",children:[L(Nl,{className:"size-3.5 text-muted-foreground"}),L("code",{className:"text-muted-foreground text-xs",children:ve})]}),$(O,{className:"text-muted-foreground",onClick:b,size:"sm",variant:"ghost",children:[L(xl,{className:"mr-2 size-4"}),"Copy"]})]}),L("div",{className:"flex-1 overflow-hidden",children:L(ft,{height:"100%",language:Q,options:{readOnly:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:13,lineNumbers:"on",folding:!1,wordWrap:"off",padding:{top:16,bottom:16}},value:sn(P)})})]})})()}),i&&$(ho,{className:"flex flex-col overflow-hidden",value:"runs",children:[$("div",{className:"flex shrink-0 items-center gap-2 border-b px-4 py-2",children:[$(O,{className:"text-muted-foreground",disabled:S,onClick:St,size:"sm",variant:"ghost",children:[L(kl,{className:`mr-2 size-4 ${S?"animate-spin":""}`}),"Refresh"]}),$(O,{className:"text-muted-foreground",onClick:()=>m(!0),size:"sm",variant:"ghost",children:[L(Ja,{className:"mr-2 size-4"}),"Clear All"]})]}),L("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:L(dn,{isActive:D==="runs",onRefreshRef:z})})]})]}),L(Go,{onOpenChange:m,open:h,children:$(Ho,{children:[$(_o,{children:[L(Uo,{children:"Delete All Runs"}),L(Ko,{children:"Are you sure you want to delete all workflow runs? This action cannot be undone."})]}),$($o,{children:[L(qo,{children:"Cancel"}),L(jo,{onClick:B,children:"Delete"})]})]})}),L(Go,{onOpenChange:A,open:f,children:$(Ho,{children:[$(_o,{children:[L(Uo,{children:"Delete Step"}),L(Ko,{children:"Are you sure you want to delete this node? This action cannot be undone."})]}),$($o,{children:[L(qo,{children:"Cancel"}),L(jo,{onClick:G,children:"Delete"})]})]})})]}):$(co,{children:[$(ha,{className:"size-full",defaultValue:"properties",onValueChange:j,value:D,children:[$(ba,{className:"h-14 w-full shrink-0 rounded-none border-b bg-transparent px-4 py-2.5",children:[L(vo,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"properties",children:"Properties"}),L(vo,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"code",children:"Code"}),i&&L(vo,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"runs",children:"Runs"})]}),L(ho,{className:"flex flex-col overflow-hidden",value:"properties",children:$("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:[$("div",{className:"space-y-2",children:[L(F,{className:"ml-1",htmlFor:"workflow-name",children:"Workflow Name"}),L(se,{disabled:!i,id:"workflow-name",onChange:ee=>qt(ee.target.value),value:a})]}),$("div",{className:"space-y-2",children:[L(F,{className:"ml-1",htmlFor:"workflow-id",children:"Workflow ID"}),L(se,{disabled:!0,id:"workflow-id",value:s||"Not saved"})]}),!i&&L("div",{className:"rounded-lg border border-muted bg-muted/30 p-3",children:L("p",{className:"text-muted-foreground text-sm",children:"You are viewing a public workflow. Duplicate it to make changes."})}),i&&$("div",{className:"flex items-center gap-2 pt-4",children:[$(O,{className:"text-muted-foreground",onClick:()=>g(!0),size:"sm",variant:"ghost",children:[L(Ja,{className:"mr-2 size-4"}),"Clear"]}),$(O,{className:"text-muted-foreground",onClick:()=>T(!0),size:"sm",variant:"ghost",children:[L(jr,{className:"mr-2 size-4"}),"Delete"]})]})]})}),i&&$(ho,{className:"flex flex-col overflow-hidden",value:"runs",children:[$("div",{className:"flex shrink-0 items-center gap-2 border-b px-4 py-2",children:[$(O,{className:"text-muted-foreground",disabled:S,onClick:St,size:"sm",variant:"ghost",children:[L(kl,{className:`mr-2 size-4 ${S?"animate-spin":""}`}),"Refresh"]}),$(O,{className:"text-muted-foreground",onClick:()=>m(!0),size:"sm",variant:"ghost",children:[L(Ja,{className:"mr-2 size-4"}),"Clear All"]})]}),L("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:L(dn,{isActive:D==="runs",onRefreshRef:z})})]}),$(ho,{className:"flex flex-col overflow-hidden data-[state=inactive]:hidden",forceMount:!0,value:"code",children:[$("div",{className:"flex shrink-0 items-center justify-between border-b bg-muted/30 px-3 pb-2",children:[$("div",{className:"flex items-center gap-2",children:[L(Nl,{className:"size-3.5 text-muted-foreground"}),$("code",{className:"text-muted-foreground text-xs",children:["workflows/",a.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"")||"workflow",".ts"]})]}),$(O,{className:"text-muted-foreground",onClick:R,size:"sm",variant:"ghost",children:[L(xl,{className:"mr-2 size-4"}),"Copy"]})]}),L("div",{className:"flex-1 overflow-hidden",children:L(ft,{height:"100%",language:"typescript",options:{readOnly:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:13,lineNumbers:"on",folding:!0,wordWrap:"off",padding:{top:16,bottom:16}},value:M})})]})]}),L(Go,{onOpenChange:m,open:h,children:$(Ho,{children:[$(_o,{children:[L(Uo,{children:"Delete All Runs"}),L(Ko,{children:"Are you sure you want to delete all workflow runs? This action cannot be undone."})]}),$($o,{children:[L(qo,{children:"Cancel"}),L(jo,{onClick:B,children:"Delete"})]})]})})]})},Xa=()=>L("div",{className:"hidden size-full flex-col bg-background md:flex",children:L(Rp,{})});import{jsx as Tt,jsxs as qr}from"react/jsx-runtime";var es=({workflowId:e})=>{let t=zp(),o=zt(),[n,r]=Bt(wt),[s,a]=Bt(gr),[l]=Bt(oe),[i]=Bt(ue),[d]=Bt($e),[c]=Bt(Qt),u=kt(oe),p=kt(ue),g=kt($e),T=kt(pt),v=kt(Zt),y=kt(tt),[w,k]=Bt(ei),f=kt(mr),A=kt(ir),I=kt(lr),[C,h]=Bt(dr),[m,S]=Bt(js),J=kt(ar),[D,j]=Bt(Xt),z=kt(mt),re=kt(rr),P=Op(Pt),[V,X]=Qa(30),[W,U]=Qa(C),[N,M]=Qa(!1),b=Po(!1),R=Po(!1);Ct(()=>{if(R.current)return;R.current=!0;let E=document.cookie.split("; ").find(Y=>Y.startsWith("sidebar-width="));if(E){let Y=Number.parseFloat(E.split("=")[1]);!Number.isNaN(Y)&&Y>=20&&Y<=50&&X(Y)}let H=document.cookie.split("; ").find(Y=>Y.startsWith("sidebar-collapsed="));H&&S(H.split("=")[1]==="true")},[S]);let G=Po(!1);Ct(()=>{if(!G.current){G.current=!0;return}document.cookie=`sidebar-width=${V}; path=/; max-age=31536000`},[V]),Ct(()=>{R.current&&(document.cookie=`sidebar-collapsed=${m}; path=/; max-age=31536000`)},[m]),Ct(()=>{let E=sessionStorage.getItem("animate-sidebar")==="true";if(sessionStorage.removeItem("animate-sidebar"),C||!E){U(!0),h(!0);return}I(!0);let H=setTimeout(()=>{U(!0),h(!0)},100),Y=setTimeout(()=>I(!1),400);return()=>{clearTimeout(H),clearTimeout(Y),I(!1)}},[C,h,I]),Ct(()=>{let E=H=>{(H.metaKey||H.ctrlKey)&&H.key==="b"&&(H.preventDefault(),I(!0),S(Y=>!Y),setTimeout(()=>I(!1),350))};return window.addEventListener("keydown",E),()=>window.removeEventListener("keydown",E)},[I,S]),Ct(()=>(A(!o&&W&&!m?`${V}%`:null),()=>{A(null)}),[o,A,V,W,m]);let te=uo(E=>{E.preventDefault(),b.current=!0,M(!0);let H=ce=>{if(!b.current)return;let Ee=(window.innerWidth-ce.clientX)/window.innerWidth*100;X(Math.min(50,Math.max(20,Ee)))},Y=()=>{b.current=!1,M(!1),document.removeEventListener("mousemove",H),document.removeEventListener("mouseup",Y),document.body.style.cursor="",document.body.style.userSelect=""};document.addEventListener("mousemove",H),document.addEventListener("mouseup",Y),document.body.style.cursor="col-resize",document.body.style.userSelect="none"},[]),de=Po(null),B=Po(null),xe=Po(l);Ct(()=>{xe.current=l},[l]);let qe=uo(async E=>{r(!0),g(e),T("AI Generated Workflow");try{let H=await q.ai.generate(E),Y=(H.nodes||[]).map(ce=>({...ce,selected:!1}));u(Y),p(H.edges||[]),T(H.name||"AI Generated Workflow"),await q.workflow.update(e,{name:H.name,description:H.description,nodes:H.nodes,edges:H.edges})}catch(H){console.error("Failed to generate workflow:",H),Za.error("Failed to generate workflow")}finally{r(!1)}},[e,r,g,T,u,p]),Ye=uo(async()=>{try{let E=await q.workflow.getById(e);if(!E){k(!0);return}let H=E.nodes.map(Y=>({...Y,selected:!1,data:{...Y.data,status:"idle"}}));u(H),p(E.edges),g(E.id),T(E.name),J(E.visibility??"private"),j(E.isOwner!==!1),y(!1),k(!1)}catch(E){console.error("Failed to load workflow:",E),Za.error("Failed to load workflow")}},[e,u,p,g,T,J,j,y,k]),He=Po(null);Ct(()=>{(async()=>{let H=t?.get("generating")==="true",Y=sessionStorage.getItem("ai-prompt"),ce=sessionStorage.getItem("generating-workflow-id");d===e&&l.length>0||(H&&Y&&ce===e?(sessionStorage.removeItem("ai-prompt"),sessionStorage.removeItem("generating-workflow-id"),await qe(Y)):await Ye())})()},[e,t,d,l.length,qe,Ye]),Ct(()=>{if(l.length===0||!d||!D)return;let E=He.current;if(E&&E.workflowId===d&&E.version===P)return;(async()=>{try{let Y=await q.integration.getAll();z(Y),re(!0);let ce=new Set(Y.map(Re=>Re.id)),Ee=l.map(Re=>ai(Re,Y,ce)).filter(Re=>Re!==null);for(let Re of Ee){let Cn=l.find(ma=>ma.id===Re.nodeId);Cn&&v({id:Re.nodeId,data:{config:{...Cn.data.config,integrationId:Re.newIntegrationId}}})}He.current={workflowId:d,version:P},Ee.length>0&&y(!0)}catch(Y){console.error("Failed to auto-fix integrations:",Y)}})()},[l,d,P,D,v,z,re,y]);let qt=uo(async()=>{if(!(!d||n)){a(!0);try{await q.workflow.update(d,{nodes:l,edges:i}),y(!1)}catch(E){console.error("Failed to save workflow:",E),Za.error("Failed to save workflow")}finally{a(!1)}}},[d,l,i,n,a,y]),St=uo(E=>E.tagName==="INPUT"||E.tagName==="TEXTAREA",[]),ee=uo(E=>E.closest(".monaco-editor")!==null,[]),ve=uo(E=>(E.metaKey||E.ctrlKey)&&E.key==="s"?(E.preventDefault(),E.stopPropagation(),qt(),!0):!1,[qt]),Q=uo((E,H)=>(E.metaKey||E.ctrlKey)&&E.key==="Enter"?(St(H)||ee(H)||(E.preventDefault(),E.stopPropagation(),f(!0)),!0):!1,[f,St,ee]);return Ct(()=>{let E=H=>{let Y=H.target;ve(H)||Q(H,Y)};return document.addEventListener("keydown",E,!0),()=>document.removeEventListener("keydown",E,!0)},[ve,Q]),Ct(()=>()=>{de.current&&clearInterval(de.current),B.current&&clearInterval(B.current)},[]),Ct(()=>{if(B.current&&(clearInterval(B.current),B.current=null),!c){for(let H of xe.current)v({id:H.id,data:{status:"idle"}});return}let E=async()=>{try{let H=await q.workflow.getExecutionStatus(c);for(let Y of H.nodeStatuses)v({id:Y.nodeId,data:{status:Y.status}});H.status!=="running"&&B.current&&(clearInterval(B.current),B.current=null)}catch(H){console.error("Failed to poll selected execution status:",H),B.current&&(clearInterval(B.current),B.current=null)}};return E(),B.current=setInterval(E,500),()=>{B.current&&(clearInterval(B.current),B.current=null)}},[c,v]),qr("div",{className:"flex h-dvh w-full flex-col overflow-hidden",children:[w&&Tt("div",{className:"pointer-events-auto absolute inset-0 z-20 flex items-center justify-center",children:qr("div",{className:"rounded-lg border bg-background p-8 text-center shadow-lg",children:[Tt("h1",{className:"mb-2 font-semibold text-2xl",children:"Workflow Not Found"}),Tt("p",{className:"mb-6 text-muted-foreground",children:"The workflow you're looking for doesn't exist or has been deleted."}),Tt(O,{asChild:!0,children:Tt(Fp,{href:"/",children:"New Workflow"})})]})}),!o&&m&&Tt("button",{className:"pointer-events-auto absolute top-1/2 right-0 z-20 flex size-6 -translate-y-1/2 items-center justify-center rounded-l-full border border-r-0 bg-background shadow-sm transition-colors hover:bg-muted",onClick:()=>{I(!0),S(!1),setTimeout(()=>I(!1),350)},type:"button",children:Tt(Lp,{className:"size-4"})}),!o&&qr("div",{className:"pointer-events-auto absolute inset-y-0 right-0 z-20 border-l bg-background transition-transform duration-300 ease-out",style:{width:`${V}%`,transform:W&&!m?"translateX(0)":"translateX(100%)"},children:[qr("div",{"aria-orientation":"vertical","aria-valuenow":V,className:"group absolute inset-y-0 left-0 z-10 w-3 cursor-col-resize",onMouseDown:te,role:"separator",tabIndex:0,children:[Tt("div",{className:"absolute inset-y-0 left-0 w-1 bg-transparent transition-colors group-hover:bg-blue-500 group-active:bg-blue-600"}),!(N||m)&&Tt("button",{className:"absolute top-1/2 left-0 flex size-6 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full border bg-background opacity-0 shadow-sm transition-opacity hover:bg-muted group-hover:opacity-100",onClick:E=>{E.stopPropagation(),I(!0),S(!0),setTimeout(()=>I(!1),350)},onMouseDown:E=>E.stopPropagation(),type:"button",children:Tt(Mp,{className:"size-4"})})]}),Tt(Xa,{})]}),o&&Tt(Xa,{})]})};import{useAtomValue as ts,useSetAtom as Vn}from"jotai";import{nanoid as Vp}from"nanoid";import{useRouter as Gp}from"next/navigation";import{useCallback as Il,useEffect as Yr,useRef as Hp}from"react";import{toast as _p}from"sonner";import{anonymousClient as Wp}from"better-auth/client/plugins";import{createAuthClient as Bp}from"better-auth/react";var Eo=Bp({baseURL:typeof window<"u"?window.location.origin:"http://localhost:3000",plugins:[Wp()]}),{signIn:Jk,signOut:Sl,signUp:Xk,useSession:cn}=Eo;function $p(){return{id:Vp(),type:"trigger",position:{x:0,y:0},data:{label:"",description:"",type:"trigger",config:{triggerType:"Manual"},status:"idle"}}}var Pl=()=>{let e=Gp(),{data:t}=cn(),o=ts(oe),n=ts(ue),r=Vn(oe),s=Vn(ue),a=Vn(pt),l=Vn(dr),i=Vn(cr),d=Hp(!1),c=ts(pt);Yr(()=>{l(!1)},[l]),Yr(()=>{document.title=`${c} - AI Workflow Builder`},[c]);let u=Il(async()=>{t||(await Eo.signIn.anonymous(),await new Promise(g=>setTimeout(g,100)))},[t]),p=Il(()=>{let g=$p();r([g])},[r]);return Yr(()=>{r([{id:"add-node-placeholder",type:"add",position:{x:0,y:0},data:{label:"",type:"add",onClick:p},draggable:!1,selectable:!1}]),s([]),a("New Workflow"),d.current=!1},[r,s,a,p]),Yr(()=>{(async()=>{let T=o.filter(v=>v.type!=="add");if(!(T.length===0||d.current)){d.current=!0;try{await u();let v=await q.workflow.create({name:"Untitled Workflow",description:"",nodes:T,edges:n});sessionStorage.setItem("animate-sidebar","true"),i(!0),console.log("[Homepage] Navigating to workflow page"),e.replace(`/workflows/${v.id}`)}catch(v){console.error("Failed to create workflow:",v),_p.error("Failed to create workflow")}}})()},[o,n,e,u,i]),null};import{useRouter as Up}from"next/navigation";import{useEffect as Kp}from"react";var El=()=>{let e=Up();return Kp(()=>{(async()=>{try{let n=(await q.workflow.getAll()).filter(r=>r.name!=="__current__");if(n.length>0){let r=n.sort((s,a)=>new Date(a.updatedAt).getTime()-new Date(s.updatedAt).getTime())[0];e.replace(`/workflows/${r.id}`)}else e.replace("/")}catch(o){console.error("Failed to load workflows:",o),e.replace("/")}})()},[e]),null};import{jsx as un}from"react/jsx-runtime";var Yp=()=>{let t=qp().slug;return!t||t.length===0?un(Pl,{}):t[0]==="auth"&&t.length===2?un("main",{className:"flex items-center justify-center min-h-screen",children:un(jp,{path:t[1]})}):t[0]==="workflows"&&t.length===1?un(El,{}):t[0]==="workflows"&&t.length===2?un("div",{className:"pointer-events-none relative z-10",children:un(es,{workflowId:t[1]})}):null};import"virtual:workflow-builder-plugins";import{ReactFlowProvider as dv}from"@xyflow/react";import{Provider as cv}from"jotai";import*as vc from"react";import{AnimatePresence as Qp,LayoutGroup as Ol,motion as pn,useReducedMotion as Ll}from"motion/react";import{useCallback as Hn,useLayoutEffect as _n,useRef as mo,useState as Ml}from"react";import{Drawer as Gn}from"vaul";import{Dialog as mn}from"radix-ui";import{XIcon as Jp}from"lucide-react";import{jsx as Do,jsxs as os}from"react/jsx-runtime";function Jr({...e}){return Do(mn.Root,{"data-slot":"dialog",...e})}function ns({...e}){return Do(mn.Portal,{"data-slot":"dialog-portal",...e})}function Xp({className:e,...t}){return Do(mn.Overlay,{"data-slot":"dialog-overlay",className:x("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",e),...t})}function Dl({className:e,children:t,showCloseButton:o=!0,...n}){return os(ns,{"data-slot":"dialog-portal",children:[Do(Xp,{}),os(mn.Content,{"data-slot":"dialog-content",className:x("bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",e),...n,children:[t,o&&os(mn.Close,{"data-slot":"dialog-close",className:"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",children:[Do(Jp,{}),Do("span",{className:"sr-only",children:"Close"})]})]})]})}function Rl({className:e,...t}){return Do(mn.Title,{"data-slot":"dialog-title",className:x("text-lg leading-none font-semibold",e),...t})}import{jsx as Le,jsxs as as}from"react/jsx-runtime";var rs={type:"spring",stiffness:400,damping:35,mass:.8},Zp={type:"spring",stiffness:350,damping:30,mass:.8},ef={hidden:{opacity:0,scale:.95},visible:{opacity:1,scale:1,transition:{type:"spring",stiffness:400,damping:30}},exit:{opacity:0,scale:.95,transition:{duration:.15,ease:[.4,0,1,1]}}};function Fl(e,t){return e?"0%":t?"-35%":"100%"}function zl(e){let t=mo(e),o=mo(1);return e>t.current?o.current=1:e<t.current&&(o.current=-1),_n(()=>{t.current=e},[e]),o.current}function tf(){let{stack:e,closeAll:t,pop:o}=ne(),n=Ll(),[r,s]=Ml(0),a=mo(null),l=mo(!1),i=mo(e),d=zl(e.length),c=e.length>0;c&&(i.current=e);let u=i.current,p=u.length-1;console.log("[DesktopOverlay]",{isOpen:c,stackLength:e.length,frozenStackLength:i.current.length,renderStackLength:u.length}),_n(()=>{let f=c&&!l.current;if(l.current=c,f&&s(0),a.current){let A=a.current.offsetHeight;A>0&&s(A)}},[e,c]);let g=e[e.length-1],T=n?{duration:.01}:rs,v=d===1,y=Hn(()=>{g?.options.closeOnBackdropClick!==!1&&t()},[g?.options.closeOnBackdropClick,t]),w=Hn(f=>{f.key==="Escape"&&g?.options.closeOnEscape!==!1&&o()},[g?.options.closeOnEscape,o]);_n(()=>{if(c)return document.addEventListener("keydown",w),()=>document.removeEventListener("keydown",w)},[c,w]);let k=Hn(()=>{console.log("[DesktopOverlay] handleExitComplete called"),i.current=[]},[]);return console.log("[DesktopOverlay] Rendering, isOpen:",c),!c&&i.current.length===0?null:Le(Qp,{onExitComplete:k,children:c&&Le(Jr,{modal:!1,open:!0,children:as(ns,{forceMount:!0,children:[Le(pn.div,{animate:{opacity:1},className:"fixed inset-0 z-50 bg-black/60",exit:{opacity:0},initial:{opacity:0},onClick:y,transition:{duration:.2}}),Le(pn.div,{animate:"visible",className:"fixed top-1/2 left-1/2 z-50 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 px-4",exit:"exit",initial:"hidden",variants:ef,children:Le(Ol,{children:Le(pn.div,{className:"relative overflow-hidden rounded-xl border bg-background shadow-2xl ring-1 ring-black/5",layout:c,style:{minHeight:r>0?r:"auto"},transition:rs,children:Le("div",{className:"relative",ref:a,children:u.map((f,A)=>{let I=A===p,C=A<p,m=I&&v&&u.length>1?{x:"100%",scale:1,opacity:1}:!1;return Le(pn.div,{animate:{x:Fl(I,C),scale:I?1:.94,opacity:I?1:0},"aria-hidden":!I,className:x("w-full",I?"relative":"pointer-events-none absolute inset-0"),initial:m,transition:T,children:Le(f.component,{overlayId:f.id,...f.props})},f.id)})})})})})]})})})}function of(){let{stack:e,closeAll:t,pop:o}=ne(),n=Ll(),[r,s]=Ml(0),a=mo(null),l=mo(!1),i=mo(e),d=zl(e.length),c=e.length>0;c&&(i.current=e);let u=i.current,p=u.length-1;_n(()=>{let f=c&&!l.current;if(l.current=c,f&&s(0),a.current){let A=a.current.offsetHeight;A>0&&s(A)}},[e,c]);let g=e[e.length-1],T=u[p],v=n?{duration:.01}:rs,y=d===1,w=Hn(f=>{f.key==="Escape"&&g?.options.closeOnEscape!==!1&&o()},[g?.options.closeOnEscape,o]);_n(()=>{if(c)return document.addEventListener("keydown",w),()=>document.removeEventListener("keydown",w)},[c,w]);let k=Hn(()=>{c||(i.current=[])},[c]);return Le(Gn.Root,{onAnimationEnd:k,onOpenChange:f=>{f||t()},open:c,children:as(Gn.Portal,{children:[Le(Gn.Overlay,{className:"fixed inset-0 z-50 bg-black/60"}),as(Gn.Content,{className:x("fixed inset-x-0 bottom-0 z-50 flex max-h-[90vh] flex-col","rounded-t-2xl border-t bg-background shadow-2xl"),children:[Le(Gn.Title,{className:"sr-only",children:T?.options.title||"Dialog"}),Le("div",{className:"mx-auto mt-3 h-1.5 w-12 shrink-0 rounded-full bg-muted-foreground/20"}),Le(Ol,{children:Le(pn.div,{className:"relative flex-1 overflow-hidden",layout:c,style:{minHeight:r>0?r:"auto"},transition:Zp,children:Le("div",{className:"relative",ref:a,children:u.map((f,A)=>{let I=A===p,C=A<p,m=I&&y&&u.length>1?{x:"100%",scale:1,opacity:1}:!1;return Le(pn.div,{animate:{x:Fl(I,C),scale:I?1:.94,opacity:I?1:0},"aria-hidden":!I,className:x("w-full",I?"relative":"pointer-events-none absolute inset-0"),initial:m,transition:v,children:Le(f.component,{overlayId:f.id,...f.props})},f.id)})})})}),Le("div",{className:"h-safe-area-inset-bottom"})]})]})})}function Wl(){return zt()?Le(of,{}):Le(tf,{})}import{useAtom as nf}from"jotai";import{useEffect as rf,useRef as Bl}from"react";import{atom as _t}from"jotai";var je=_t([]),LC=_t(e=>e(je).length>0),MC=_t(e=>e(je).length);function ss(){return`overlay-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}var FC=_t(null,(e,t,o)=>{let n=ss(),r={id:n,component:o.component,props:o.props??{},options:o.options??{}};return t(je,[r]),n}),zC=_t(null,(e,t,o)=>{let n=ss(),r={id:n,component:o.component,props:o.props??{},options:o.options??{}};return t(je,[...e(je),r]),n}),WC=_t(null,(e,t)=>{let o=e(je);if(o.length<=1){o[0]?.options.onClose?.(),t(je,[]);return}o[o.length-1]?.options.onClose?.(),t(je,o.slice(0,-1))}),BC=_t(null,(e,t,o)=>{let n=e(je),r=ss(),s={id:r,component:o.component,props:o.props??{},options:o.options??{}};return n.length===0?t(je,[s]):(n[n.length-1]?.options.onClose?.(),t(je,[...n.slice(0,-1),s])),r}),VC=_t(null,(e,t)=>{let o=e(je);for(let n of o)n.options.onClose?.();t(je,[])}),GC=_t(null,(e,t,o)=>{let n=e(je),r=n.findIndex(s=>s.id===o);if(r!==-1){for(let s=r;s<n.length;s++)n[s].options.onClose?.();t(je,n.slice(0,r))}});function Vl(){let{stack:e}=ne(),[t,o]=nf(je),n=Bl(!1),r=Bl(!1);return rf(()=>{if(n.current){n.current=!1;return}r.current=!0,o(e)},[e,o]),null}import{Fragment as af,jsx as Gl,jsxs as sf}from"react/jsx-runtime";var Hl=()=>sf(af,{children:[Gl(Wl,{}),Gl(Vl,{})]});import{CircleCheckIcon as lf,InfoIcon as df,Loader2Icon as cf,OctagonXIcon as uf,TriangleAlertIcon as mf}from"lucide-react";import{useTheme as pf}from"next-themes";import{Toaster as ff}from"sonner";import{jsx as fn}from"react/jsx-runtime";var _l=({...e})=>{let{theme:t="system"}=pf();return fn(ff,{theme:t,className:"toaster group",icons:{success:fn(lf,{className:"size-4"}),info:fn(df,{className:"size-4"}),warning:fn(mf,{className:"size-4"}),error:fn(uf,{className:"size-4"}),loading:fn(cf,{className:"size-4 animate-spin"})},style:{"--normal-bg":"var(--popover)","--normal-text":"var(--popover-foreground)","--normal-border":"var(--border)","--border-radius":"var(--radius)"},...e})};import{usePathname as ov}from"next/navigation";import{ConnectionMode as qy,MiniMap as Yy,useReactFlow as Jy}from"@xyflow/react";import{useAtom as er,useAtomValue as Ds,useSetAtom as go}from"jotai";import{useCallback as bt,useEffect as ua,useMemo as Xy,useRef as Lo,useState as dc}from"react";import{Background as gf,ReactFlow as yf}from"@xyflow/react";import"@xyflow/react/dist/style.css";import{jsx as vf,jsxs as hf}from"react/jsx-runtime";var $l=({children:e,...t})=>hf(yf,{deleteKeyCode:["Backspace","Delete"],fitView:!0,panActivationKeyCode:null,selectionOnDrag:!1,zoomOnDoubleClick:!1,zoomOnPinch:!0,...t,children:[vf(gf,{bgColor:"var(--sidebar)",color:"var(--border)",gap:24,size:2}),e]});import{jsx as Ul,jsxs as bf}from"react/jsx-runtime";var Kl=({fromX:e,fromY:t,toX:o,toY:n})=>bf("g",{children:[Ul("path",{className:"animated",d:`M${e},${t} C ${e+(o-e)*.5},${t} ${e+(o-e)*.5},${n} ${o},${n}`,fill:"none",stroke:"var(--color-ring)",strokeWidth:1}),Ul("circle",{cx:o,cy:n,fill:"#fff",r:3,stroke:"var(--color-ring)",strokeWidth:1})]});import{useReactFlow as kf}from"@xyflow/react";import{useAtom as Cf}from"jotai";import{MapPin as Tf,MapPinXInside as Af,Maximize2 as Sf,ZoomIn as If,ZoomOut as Pf}from"lucide-react";import{cva as wf}from"class-variance-authority";import{Slot as u0}from"radix-ui";import{jsx as Nf}from"react/jsx-runtime";var xf=wf("flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md has-[>[data-slot=button-group]]:gap-2",{variants:{orientation:{horizontal:"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none",vertical:"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none"}},defaultVariants:{orientation:"horizontal"}});function Vt({className:e,orientation:t,...o}){return Nf("div",{role:"group","data-slot":"button-group","data-orientation":t,className:x(xf({orientation:t}),e),...o})}import{jsx as $t,jsxs as Ef}from"react/jsx-runtime";var jl=()=>{let{zoomIn:e,zoomOut:t,fitView:o}=kf(),[n,r]=Cf(sr);return Ef(Vt,{orientation:"vertical",children:[$t(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",onClick:()=>{e()},size:"icon",title:"Zoom in",variant:"secondary",children:$t(If,{className:"size-4"})}),$t(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",onClick:()=>{t()},size:"icon",title:"Zoom out",variant:"secondary",children:$t(Pf,{className:"size-4"})}),$t(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",onClick:()=>{o({padding:.2,duration:300})},size:"icon",title:"Fit view",variant:"secondary",children:$t(Sf,{className:"size-4"})}),$t(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",onClick:()=>{r(!n)},size:"icon",title:n?"Hide minimap":"Show minimap",variant:"secondary",children:n?$t(Tf,{className:"size-4"}):$t(Af,{className:"size-4"})})]})};import{useReactFlow as Ff}from"@xyflow/react";import{useAtom as gn,useAtomValue as zf}from"jotai";import{ArrowUp as Wf}from"lucide-react";import{useCallback as Bf,useEffect as Vf,useRef as Yl,useState as is}from"react";import{toast as ls}from"sonner";import{motion as Df}from"motion/react";import{memo as Rf,useMemo as Of}from"react";import{jsx as Mf}from"react/jsx-runtime";var Lf=({children:e,as:t="p",className:o,duration:n=2,spread:r=2})=>{let s=Df.create(t),a=Of(()=>(e?.length??0)*r,[e,r]);return Mf(s,{animate:{backgroundPosition:"0% center"},className:x("relative inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent","[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-background),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]",o),initial:{backgroundPosition:"100% center"},style:{"--spread":`${a}px`,backgroundImage:"var(--bg), linear-gradient(var(--color-muted-foreground), var(--color-muted-foreground))"},transition:{repeat:Number.POSITIVE_INFINITY,duration:n,ease:"linear"},children:e})},ql=Rf(Lf);import{Fragment as Gf,jsx as Ut,jsxs as ds}from"react/jsx-runtime";function Jl({workflowId:e,onWorkflowCreated:t}){let[o,n]=gn(wt),[r,s]=is(""),[a,l]=is(!1),[i,d]=is(!1),c=Yl(null),u=Yl(null),p=zf(oe),[g,T]=gn(ue),[v,y]=gn(oe),[w,k]=gn($e),[f,A]=gn(pt),[I,C]=gn(be),{fitView:h}=Ff(),m=p.filter(z=>z.type!=="add"),S=m.length>0;Vf(()=>{let z=re=>{(re.metaKey||re.ctrlKey)&&re.key==="k"&&(re.preventDefault(),c.current?.focus())};return window.addEventListener("keydown",z),()=>{window.removeEventListener("keydown",z)}},[]);let J=()=>{l(!0),d(!0)},D=z=>{u.current?.contains(z.relatedTarget)||(d(!1),r.trim()||l(!1))},j=Bf(async z=>{if(z.preventDefault(),!(!r.trim()||o)){n(!0);try{let re=S?{nodes:m,edges:g,name:f}:void 0;console.log("[AI Prompt] Generating workflow"),console.log("[AI Prompt] Has nodes:",S),console.log("[AI Prompt] Sending existing workflow:",!!re),re&&console.log("[AI Prompt] Existing workflow:",re.nodes.length,"nodes,",re.edges.length,"edges");let P=await q.ai.generateStream(r,W=>{let U=(W.edges||[]).map(b=>({...b,type:"animated"})),N=(W.nodes||[]).filter(b=>b.data?.type==="trigger"),M=U;if(N.length>1){let b=N[0],R=(W.nodes||[]).filter(te=>te.data?.type!=="trigger");W.nodes=[b,...R];let G=N.slice(1).map(te=>te.id);M=U.filter(te=>!G.includes(te.source)&&!G.includes(te.target))}y(W.nodes||[]),T(M),W.name&&A(W.name),setTimeout(()=>{h({padding:.2,duration:200})},0)},re);console.log("[AI Prompt] Received final workflow data"),console.log("[AI Prompt] Nodes:",P.nodes?.length||0),console.log("[AI Prompt] Edges:",P.edges?.length||0);let V=(P.edges||[]).map(W=>({...W,type:"animated"}));console.log("[AI Prompt] Validating nodes:",P.nodes);let X=(P.nodes||[]).filter(W=>{let U=W.data?.type,N=W.data?.config||{};return console.log(`[AI Prompt] Checking node ${W.id}:`,{type:U,config:N,hasActionType:!!N.actionType,hasTriggerType:!!N.triggerType}),U==="trigger"?!N.triggerType:U==="action"?!N.actionType:!1});if(X.length>0)throw console.error("[AI Prompt] AI generated incomplete nodes:",X),console.error("[AI Prompt] Full workflow data:",JSON.stringify(P,null,2)),new Error(`Cannot create workflow: The AI tried to create ${X.length} incomplete node(s). The requested action type may not be supported. Please try a different description using supported actions: Send Email, Send Slack Message, Create Ticket, Database Query, HTTP Request, Generate Text, Generate Image, Scrape, or Search.`);if(e){k(e),console.log("[AI Prompt] Updating existing workflow:",e),console.log("[AI Prompt] Has existingWorkflow context:",!!re),re?(console.log("[AI Prompt] REPLACING workflow with AI response"),console.log("[AI Prompt] Replacing",m.length,"nodes with",P.nodes?.length||0,"nodes")):(console.log("[AI Prompt] Setting workflow for empty canvas"),ls.success("Generated workflow"));let W=P.nodes?.find(U=>U.selected);W&&C(W.id),await q.workflow.update(e,{name:P.name,description:P.description,nodes:P.nodes,edges:V})}else{let W=await q.workflow.create({name:P.name||"AI Generated Workflow",description:P.description||"",nodes:P.nodes||[],edges:V});k(W.id),ls.success("Created workflow"),t&&t(W.id)}s(""),l(!1),d(!1),c.current?.blur()}catch(re){console.error("Failed to generate workflow:",re),ls.error("Failed to generate workflow")}finally{n(!1)}}},[r,o,e,S,p,g,n,k,y,T,A,C,t,h]);return Ut(Gf,{children:Ut("div",{ref:u,className:"pointer-events-auto absolute bottom-4 left-1/2 z-10 -translate-x-1/2 px-4",style:{width:a?"min(100%, 42rem)":"20rem",transition:"width 150ms ease-out"},children:ds("form",{"aria-busy":o,"aria-label":"AI workflow prompt",className:"relative flex items-center gap-2 rounded-lg border bg-background pl-3 pr-2 py-2 shadow-lg cursor-text",onClick:z=>{(z.target===z.currentTarget||z.target.tagName!=="BUTTON")&&c.current?.focus()},onMouseDown:z=>{z.target===z.currentTarget&&z.preventDefault()},onSubmit:j,role:"search",children:[o&&r?Ut(ql,{className:"flex-1 text-sm whitespace-pre-wrap",duration:2,children:r}):Ut("textarea",{"aria-label":"Describe your workflow",className:"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground resize-none h-[22px] min-h-[22px] max-h-[200px] py-0 leading-[22px]",disabled:o,onBlur:D,onChange:z=>{s(z.target.value),z.target.style.height="auto",z.target.style.height=`${z.target.scrollHeight}px`},onFocus:J,onKeyDown:z=>{z.key==="Enter"&&!z.shiftKey?(z.preventDefault(),j(z)):z.key==="Escape"&&(z.preventDefault(),s(""),l(!1),d(!1),c.current?.blur())},placeholder:i?"Describe your workflow with natural language...":"Ask AI...",ref:c,rows:1,value:r}),Ut("div",{className:"sr-only",children:o?"Generating workflow, please wait...":""}),ds("div",{className:"relative size-8 shrink-0 self-end",children:[Ut(O,{"aria-label":"Focus prompt input (\u2318K)",className:"absolute inset-0 h-8 px-0 text-xs text-muted-foreground hover:bg-transparent transition-[opacity,filter] ease-out",onClick:()=>c.current?.focus(),style:!r.trim()&&!o&&!i?{opacity:1,filter:"blur(0px)",pointerEvents:"auto",visibility:"visible"}:{opacity:0,filter:"blur(2px)",pointerEvents:"none",visibility:"hidden"},type:"button",variant:"ghost",children:ds("kbd",{"aria-hidden":"true",className:"pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground opacity-100",children:[Ut("span",{className:"text-xs",children:"\u2318"}),"K"]})}),Ut(O,{"aria-label":o?"Generating workflow...":"Generate workflow",className:"size-8 transition-[opacity,filter] ease-out shrink-0",disabled:!r.trim()||o,size:"sm",style:!r.trim()&&!o&&!i?{opacity:0,filter:"blur(2px)",pointerEvents:"none",visibility:"hidden"}:{opacity:1,filter:"blur(0px)",pointerEvents:"auto",visibility:"visible"},type:"submit",children:Ut(Wf,{"aria-hidden":"true",className:"size-4"})})]})]})})})}import{useReactFlow as zg}from"@xyflow/react";import{useAtom as Ze,useAtomValue as zd,useSetAtom as Gt}from"jotai";import{Check as sa,ChevronDown as Wg,Copy as Bg,Download as Vg,Globe as Wd,Loader2 as la,Lock as Bd,Play as Gg,Plus as Vd,Redo2 as Gd,Save as Hg,Settings2 as _g,Trash2 as $g,Undo2 as Hd}from"lucide-react";import{nanoid as Ug}from"nanoid";import{useRouter as Kg}from"next/navigation";import{useEffect as Ts,useRef as jg,useState as Cs}from"react";import{toast as it}from"sonner";import{Panel as Hf}from"@xyflow/react";import{jsx as _f}from"react/jsx-runtime";var Xr=({className:e,...t})=>_f(Hf,{className:x("m-4 rounded-md border bg-card p-1",e),...t});var cs="https://vercel.new/workflow-builder",_0=`[](${cs})`;import{jsx as $n,jsxs as Xl}from"react/jsx-runtime";function Ql(){return $n(O,{asChild:!0,className:"h-9 gap-1.5 border px-2 sm:px-3",size:"sm",variant:"secondary",children:Xl("a",{href:cs,rel:"noopener noreferrer",target:"_blank",children:[Xl("svg",{"aria-label":"Vercel logomark",className:"size-3.5",fill:"currentColor",viewBox:"0 0 76 76",children:[$n("title",{children:"Vercel logomark"}),$n("path",{d:"m38 0 38 66H0z"})]}),$n("span",{className:"text-sm sm:hidden",children:"Deploy"}),$n("span",{className:"hidden text-sm sm:inline",children:"Deploy Your Own"})]})})}import{jsx as Zl}from"react/jsx-runtime";function ed({className:e}){return Zl("svg",{"aria-label":"GitHub",className:e,fill:"currentColor",role:"img",viewBox:"0 0 24 24",children:Zl("path",{d:"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"})})}function td(e){if(e>=1e6){let t=(e/1e6).toFixed(1);return t.endsWith(".0")?`${Math.floor(e/1e6)}M`:`${t}M`}if(e>=1e3){let t=(e/1e3).toFixed(1);return t.endsWith(".0")?`${Math.floor(e/1e3)}k`:`${t}k`}return e.toString()}import{createContext as $f,useContext as Uf}from"react";import{jsx as eT}from"react/jsx-runtime";var Kf=$f(null);function od(){return Uf(Kf)}import{jsx as nd,jsxs as rd}from"react/jsx-runtime";var jf="https://github.com/vercel-labs/workflow-builder-template";function ad(){let e=od();return nd(O,{asChild:!0,className:"h-9 gap-1.5 px-2 sm:px-3",size:"sm",variant:"ghost",children:rd("a",{className:"flex items-center",href:jf,rel:"noopener noreferrer",target:"_blank",children:[nd(ed,{className:"size-4.5"}),e!==null&&rd("span",{className:"hidden text-sm sm:inline",children:[td(e)," stars"]})]})})}import{useAtom as Kt,useAtomValue as sd,useSetAtom as Un}from"jotai";import{Code as id,Copy as ld,Eraser as us,Eye as qf,EyeOff as Yf,FileCode as dd,Play as cd,RefreshCw as ud,Settings2 as md,Trash2 as ms}from"lucide-react";import{useCallback as yn,useEffect as Jf,useRef as Xf,useState as Qf}from"react";import{toast as vn}from"sonner";import{Fragment as ps,jsx as Z,jsxs as le}from"react/jsx-runtime";var Zf={"Database Query":"database"},eg=/[^a-zA-Z0-9\s]/g,tg=/\s+/;function og(e){return e.data.type==="trigger"?e.data.config?.triggerType==="Schedule"?"vercel.json":`app/api${e.data.config?.webhookPath||"/webhook"}/route.ts`:`steps/${(e.data.config?.actionType||"action").toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"")}-step.ts`}function Qr({overlayId:e}){let{push:t,closeAll:o}=ne(),[n]=Kt(be),[r]=Kt(_e),[s]=Kt(oe),[a]=Kt(ue),[l]=Kt(wt),[i]=Kt($e),[d,c]=Kt(pt),u=sd(Xt),p=Un(Zt),g=Un(eo),T=Un(to),v=Un(yr),y=Un(fr),[w,k]=Kt(Jt),[f,A]=Kt(Ft),[I,C]=Qf(!1),h=Xf(null),m=s.find(B=>B.id===n),S=a.find(B=>B.id===r),J=sd(mt);Jf(()=>{if(!(m&&u))return;let B=m.data.config?.actionType,xe=m.data.config?.integrationId;if(!(B&&xe))return;let Ye=pe(B)?.integration||Zf[B];if(!Ye)return;let He=J.filter(St=>St.type===Ye);!He.some(St=>St.id===xe)&&He.length>0&&p({id:m.id,data:{config:{...m.data.config,integrationId:He[0].id}}})},[m,J,u,p]);let D=yn((B,xe)=>{m&&p({id:m.id,data:{config:{...m.data.config,[B]:xe}}})},[m,p]),j=yn(B=>{m&&p({id:m.id,data:{label:B}})},[m,p]),z=yn(B=>{m&&p({id:m.id,data:{description:B}})},[m,p]),re=yn(()=>{m&&p({id:m.id,data:{enabled:m.data.enabled===!1}})},[m,p]),P=yn(()=>{t(Oe,{title:"Delete Step",message:"Are you sure you want to delete this node? This action cannot be undone.",confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:()=>{m&&(g(m.id),o())}})},[m,g,o,t]),V=yn(()=>{m&&(navigator.clipboard.writeText(sn(m,i)),vn.success("Code copied to clipboard"))},[m]),X=async()=>{h.current&&(C(!0),await h.current(),C(!1))},W=()=>{t(Oe,{title:"Delete All Runs",message:"Are you sure you want to delete all workflow runs? This action cannot be undone.",confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:async()=>{if(i)try{await q.workflow.deleteExecutions(i),v(),h.current&&await h.current(),vn.success("All runs deleted")}catch(B){console.error("Failed to delete runs:",B),vn.error("Failed to delete runs")}}})},U=m&&(m.data.type!=="trigger"||m.data.config?.triggerType!=="Manual")&&m.data.config?.actionType!=="Condition",N=()=>{if(!m)switch(f==="properties"||f==="code"||f==="runs"&&u?f:"properties"){case"properties":return"Workflow";case"code":return"Code";case"runs":return"Runs";default:return"Workflow"}switch(f){case"properties":return"Properties";case"code":return"Code";case"runs":return"Runs";default:return"Properties"}},M=async B=>{if(c(B),i)try{await q.workflow.update(i,{name:B})}catch(xe){console.error("Failed to update workflow name:",xe)}},b=()=>{t(Oe,{title:"Clear Workflow",message:"Are you sure you want to clear all nodes and connections? This action cannot be undone.",confirmLabel:"Clear Workflow",confirmVariant:"destructive",destructive:!0,onConfirm:()=>{y()}})},R=()=>{t(Oe,{title:"Delete Workflow",message:`Are you sure you want to delete "${d}"? This will permanently delete the workflow. This cannot be undone.`,confirmLabel:"Delete Workflow",confirmVariant:"destructive",destructive:!0,onConfirm:async()=>{if(i)try{await q.workflow.delete(i),o(),vn.success("Workflow deleted successfully"),window.location.href="/"}catch(B){console.error("Failed to delete workflow:",B),vn.error("Failed to delete workflow. Please try again.")}}})},G=(()=>{let xe=`${d.replace(eg,"").split(tg).map((Ye,He)=>He===0?Ye.toLowerCase():Ye.charAt(0).toUpperCase()+Ye.slice(1).toLowerCase()).join("")}Workflow`,{code:qe}=tr(s,a,{functionName:xe});return qe})(),te=()=>{navigator.clipboard.writeText(G),vn.success("Code copied to clipboard")},de=()=>{r&&t(Oe,{title:"Delete Connection",message:"Are you sure you want to delete this connection? This action cannot be undone.",confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:()=>{T(r),o()}})};if(S&&!m)return le("div",{className:"flex h-full max-h-[80vh] flex-col",children:[Z(en,{overlayId:e,title:"Connection"}),le("div",{className:"flex-1 space-y-4 overflow-y-auto px-6 pt-4 pb-6",children:[le("div",{className:"space-y-2",children:[Z(F,{htmlFor:"edge-id",children:"Connection ID"}),Z(se,{disabled:!0,id:"edge-id",value:S.id})]}),le("div",{className:"space-y-2",children:[Z(F,{htmlFor:"edge-source",children:"Source"}),Z(se,{disabled:!0,id:"edge-source",value:S.source})]}),le("div",{className:"space-y-2",children:[Z(F,{htmlFor:"edge-target",children:"Target"}),Z(se,{disabled:!0,id:"edge-target",value:S.target})]}),u&&Z("div",{className:"pt-2",children:le(O,{onClick:de,variant:"ghost",children:[Z(ms,{className:"mr-2 size-4"}),"Delete Connection"]})})]})]});if(!m){let B=f==="properties"||f==="code"||f==="runs"&&u?f:"properties";return le("div",{className:"flex h-full max-h-[80vh] flex-col",children:[Z(en,{overlayId:e,title:N()}),le("div",{className:"flex-1 overflow-y-auto",children:[B==="properties"&&le("div",{className:"space-y-4 px-6 pt-4 pb-6",children:[le("div",{className:"space-y-2",children:[Z(F,{htmlFor:"workflow-name",children:"Workflow Name"}),Z(se,{disabled:!u,id:"workflow-name",onChange:xe=>M(xe.target.value),value:d})]}),le("div",{className:"space-y-2",children:[Z(F,{htmlFor:"workflow-id",children:"Workflow ID"}),Z(se,{disabled:!0,id:"workflow-id",value:i||"Not saved"})]}),!u&&Z("div",{className:"rounded-lg border border-muted bg-muted/30 p-3",children:Z("p",{className:"text-muted-foreground text-sm",children:"You are viewing a public workflow. Duplicate it to make changes."})}),u&&le("div",{className:"flex items-center gap-2 pt-2",children:[le(O,{onClick:b,variant:"ghost",children:[Z(us,{className:"mr-2 size-4"}),"Clear"]}),le(O,{onClick:R,variant:"ghost",children:[Z(ms,{className:"mr-2 size-4"}),"Delete"]})]})]}),B==="code"&&le("div",{className:"flex flex-col",children:[le("div",{className:"flex shrink-0 items-center justify-between border-b bg-muted/30 px-3 py-2",children:[le("div",{className:"flex items-center gap-2",children:[Z(dd,{className:"size-3.5 text-muted-foreground"}),Z("code",{className:"text-muted-foreground text-xs",children:"workflow.ts"})]}),le(O,{className:"h-7 text-xs",onClick:te,size:"sm",variant:"ghost",children:[Z(ld,{className:"mr-1 size-3"}),"Copy"]})]}),Z("div",{className:"h-[400px]",children:Z(ft,{defaultLanguage:"typescript",height:"100%",options:{readOnly:!0,minimap:{enabled:!1},lineNumbers:"on",scrollBeyondLastLine:!1,fontSize:12,wordWrap:"on"},value:G})})]}),B==="runs"&&u&&le("div",{className:"flex h-full flex-col",children:[le("div",{className:"flex shrink-0 items-center gap-2 border-b px-4 py-2",children:[Z(O,{className:"text-muted-foreground",disabled:I,onClick:X,size:"icon",variant:"ghost",children:Z(ud,{className:`size-4 ${I?"animate-spin":""}`})}),Z(O,{className:"text-muted-foreground",onClick:W,size:"icon",variant:"ghost",children:Z(us,{className:"size-4"})})]}),Z("div",{className:"flex-1 overflow-y-auto p-4",children:Z(dn,{isActive:B==="runs",onRefreshRef:h})})]})]}),le("div",{className:"flex shrink-0 items-center justify-around border-t bg-background pb-safe",children:[le("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${B==="properties"?"text-foreground":"text-muted-foreground"}`,onClick:()=>A("properties"),type:"button",children:[Z(md,{className:"size-5"}),"Workflow"]}),le("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${B==="code"?"text-foreground":"text-muted-foreground"}`,onClick:()=>A("code"),type:"button",children:[Z(id,{className:"size-5"}),"Code"]}),u&&le("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${B==="runs"?"text-foreground":"text-muted-foreground"}`,onClick:()=>A("runs"),type:"button",children:[Z(cd,{className:"size-5"}),"Runs"]})]})]})}return le("div",{className:"flex h-full max-h-[80vh] flex-col",children:[Z(en,{overlayId:e,title:N()}),le("div",{className:"flex-1 overflow-y-auto",children:[f==="properties"&&le("div",{className:"space-y-4 px-6 pt-4 pb-6",children:[m.data.type==="action"&&!m.data.config?.actionType&&u&&Z(Vr,{disabled:l,isNewlyCreated:m?.id===w,onSelectAction:B=>{D("actionType",B),m?.id===w&&k(null)}}),m.data.type==="trigger"&&Z(Gr,{config:m.data.config||{},disabled:l||!u,onUpdateConfig:D,workflowId:i??void 0}),m.data.type==="action"&&m.data.config?.actionType!==void 0&&Z(Mr,{config:m.data.config||{},disabled:l||!u,isOwner:u,onUpdateConfig:D}),(m.data.type!=="action"||m.data.config?.actionType!==void 0)&&le(ps,{children:[le("div",{className:"space-y-2",children:[Z(F,{htmlFor:"label",children:"Label"}),Z(se,{disabled:l||!u,id:"label",onChange:B=>j(B.target.value),value:m.data.label})]}),le("div",{className:"space-y-2",children:[Z(F,{htmlFor:"description",children:"Description"}),Z(se,{disabled:l||!u,id:"description",onChange:B=>z(B.target.value),placeholder:"Optional description",value:m.data.description||""})]})]}),u&&le("div",{className:"flex items-center gap-2 pt-2",children:[m.data.type==="action"&&Z(O,{className:"text-muted-foreground",onClick:re,size:"sm",variant:"ghost",children:m.data.enabled===!1?le(ps,{children:[Z(Yf,{className:"mr-2 size-4"}),"Disabled"]}):le(ps,{children:[Z(qf,{className:"mr-2 size-4"}),"Enabled"]})}),le(O,{className:"text-muted-foreground",onClick:P,size:"sm",variant:"ghost",children:[Z(ms,{className:"mr-2 size-4"}),"Delete"]})]})]}),U&&le("div",{className:`flex flex-col ${f==="code"?"":"invisible absolute -z-10"}`,children:[le("div",{className:"flex shrink-0 items-center justify-between border-b bg-muted/30 px-3 py-2",children:[le("div",{className:"flex items-center gap-2",children:[Z(dd,{className:"size-3.5 text-muted-foreground"}),Z("code",{className:"text-muted-foreground text-xs",children:og(m)})]}),le(O,{className:"text-muted-foreground",onClick:V,size:"sm",variant:"ghost",children:[Z(ld,{className:"mr-2 size-4"}),"Copy"]})]}),Z("div",{className:"h-[400px]",children:Z(ft,{height:"100%",language:m.data.type==="trigger"&&m.data.config?.triggerType==="Schedule"?"json":"typescript",options:{readOnly:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:13,lineNumbers:"on",folding:!1,wordWrap:"off",padding:{top:16,bottom:16}},value:sn(m,i)})})]}),f==="runs"&&u&&le("div",{className:"flex h-full flex-col",children:[le("div",{className:"flex shrink-0 items-center gap-2 border-b px-4 py-2",children:[le(O,{className:"text-muted-foreground",disabled:I,onClick:X,size:"sm",variant:"ghost",children:[Z(ud,{className:`mr-2 size-4 ${I?"animate-spin":""}`}),"Refresh"]}),le(O,{className:"text-muted-foreground",onClick:W,size:"sm",variant:"ghost",children:[Z(us,{className:"mr-2 size-4"}),"Clear All"]})]}),Z("div",{className:"flex-1 overflow-y-auto p-4",children:Z(dn,{isActive:f==="runs",onRefreshRef:h})})]})]}),le("div",{className:"flex shrink-0 items-center justify-around border-t bg-background pb-safe",children:[le("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${f==="properties"?"text-foreground":"text-muted-foreground"}`,onClick:()=>A("properties"),type:"button",children:[Z(md,{className:"size-5"}),"Properties"]}),U&&le("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${f==="code"?"text-foreground":"text-muted-foreground"}`,onClick:()=>A("code"),type:"button",children:[Z(id,{className:"size-5"}),"Code"]}),u&&le("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${f==="runs"?"text-foreground":"text-muted-foreground"}`,onClick:()=>A("runs"),type:"button",children:[Z(cd,{className:"size-5"}),"Runs"]})]})]})}import{Download as ag,FlaskConical as sg}from"lucide-react";import{cva as ng}from"class-variance-authority";import{jsx as fs}from"react/jsx-runtime";var rg=ng("relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",{variants:{variant:{default:"bg-card text-card-foreground",destructive:"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90"}},defaultVariants:{variant:"default"}});function pd({className:e,variant:t,...o}){return fs("div",{"data-slot":"alert",role:"alert",className:x(rg({variant:t}),e),...o})}function fd({className:e,...t}){return fs("div",{"data-slot":"alert-title",className:x("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight",e),...t})}function gd({className:e,...t}){return fs("div",{"data-slot":"alert-description",className:x("text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",e),...t})}import{jsx as hn,jsxs as Zr}from"react/jsx-runtime";function yd({overlayId:e,onExport:t,isDownloading:o}){let{closeAll:n}=ne();return Zr(De,{actions:[{label:"Cancel",variant:"outline",onClick:n},{label:o?"Exporting...":"Export Project",onClick:()=>{n(),t()},loading:o}],overlayId:e,title:"Export Workflow as Code",children:[Zr("div",{className:"flex items-center gap-2 text-muted-foreground",children:[hn(ag,{className:"size-5"}),hn("p",{className:"text-sm",children:"Export your workflow as a standalone Next.js project that you can run independently."})]}),hn("p",{className:"mt-4 text-muted-foreground text-sm",children:"This will generate a complete Next.js project containing your workflow code. Once exported, you can run your workflow outside of the Workflow Builder, deploy it to Vercel, or integrate it into your existing applications."}),Zr(pd,{className:"mt-4",children:[hn(sg,{className:"size-4"}),hn(fd,{children:"Experimental Feature"}),Zr(gd,{className:"block",children:["This feature is experimental and may have limitations. If you encounter any issues, please"," ",hn("a",{className:"font-medium text-foreground underline underline-offset-4 hover:text-primary",href:"https://github.com/vercel-labs/workflow-builder-template/issues",rel:"noopener noreferrer",target:"_blank",children:"report them on GitHub"}),"."]})]})]})}import{Globe as ig}from"lucide-react";import{jsx as po,jsxs as ea}from"react/jsx-runtime";function vd({overlayId:e,onConfirm:t}){let{closeAll:o}=ne();return ea(De,{actions:[{label:"Cancel",variant:"outline",onClick:o},{label:"Make Public",onClick:()=>{o(),t()}}],overlayId:e,title:"Make Workflow Public?",children:[ea("div",{className:"flex items-center gap-2 text-muted-foreground",children:[po(ig,{className:"size-5 shrink-0"}),po("p",{className:"text-sm",children:"Making this workflow public means anyone with the link can:"})]}),ea("ul",{className:"mt-3 list-inside list-disc space-y-1 text-muted-foreground text-sm",children:[po("li",{children:"View the workflow structure and steps"}),po("li",{children:"See action types and configurations"}),po("li",{children:"Duplicate the workflow to their own account"})]}),po("p",{className:"mt-4 font-medium text-foreground text-sm",children:"The following will remain private:"}),ea("ul",{className:"mt-2 list-inside list-disc space-y-1 text-muted-foreground text-sm",children:[po("li",{children:"Your integration credentials (API keys, tokens)"}),po("li",{children:"Execution logs and run history"})]})]})}import{useAtomValue as hd,useSetAtom as lg}from"jotai";import{AlertTriangle as dg}from"lucide-react";import{jsx as Qe,jsxs as ut}from"react/jsx-runtime";function bd({overlayId:e,issues:t,onGoToStep:o,onRunAnyway:n}){let{push:r,closeAll:s}=ne(),a=lg(Pt),l=zt(),i=hd(Ht),d=hd(xo),{brokenReferences:c,missingRequiredFields:u,missingIntegrations:p}=t,g=c.length+u.length+p.length,T=(k,f)=>{o(k,f),l?r(Qr,{}):s()},v=k=>{r(ro,{type:k,onSuccess:()=>{a(f=>f+1)}})},y=k=>{i?.integrationType===k&&d?.enabled&&d?.isVercelUser&&i?r(i.ConsentOverlay,{onConsent:()=>{a(I=>I+1)},onManualEntry:()=>v(k)}):v(k)};return ut(De,{actions:[{label:"Run Anyway",variant:"outline",onClick:()=>{s(),n()}},{label:"Cancel",onClick:s}],overlayId:e,title:`Workflow Issues (${g})`,children:[ut("div",{className:"flex items-center gap-2 text-orange-500",children:[Qe(dg,{className:"size-5"}),Qe("p",{className:"text-muted-foreground text-sm",children:"This workflow has issues that may cause it to fail."})]}),ut("div",{className:"mt-4 space-y-4",children:[p.length>0&&ut("div",{className:"space-y-1",children:[Qe("h4",{className:"font-medium text-muted-foreground text-xs uppercase tracking-wide",children:"Missing Connections"}),p.map(k=>ut("div",{className:"flex items-center gap-3 py-1",children:[Qe(Rt,{className:"size-4 shrink-0",integration:k.integrationType}),ut("p",{className:"min-w-0 flex-1 text-sm",children:[Qe("span",{className:"font-medium",children:k.integrationLabel}),ut("span",{className:"text-muted-foreground",children:[" \u2014 ",k.nodeNames.length>3?`${k.nodeNames.slice(0,3).join(", ")} +${k.nodeNames.length-3} more`:k.nodeNames.join(", ")]})]}),Qe(O,{className:"shrink-0",onClick:()=>y(k.integrationType),size:"sm",variant:"outline",children:"Add"})]},k.integrationType))]}),c.length>0&&ut("div",{className:"space-y-2",children:[Qe("h4",{className:"font-medium text-muted-foreground text-xs uppercase tracking-wide",children:"Broken References"}),c.map(k=>ut("div",{children:[Qe("p",{className:"font-medium text-sm",children:k.nodeLabel}),Qe("div",{className:"mt-1 space-y-0.5",children:k.brokenReferences.map((f,A)=>ut("div",{className:"flex items-center gap-3 py-0.5 pl-3",children:[ut("p",{className:"min-w-0 flex-1 text-muted-foreground text-sm",children:[Qe("span",{className:"font-mono",children:f.displayText})," in ",f.fieldLabel]}),Qe(O,{className:"shrink-0",onClick:()=>T(k.nodeId,f.fieldKey),size:"sm",variant:"outline",children:"Fix"})]},`${k.nodeId}-${f.fieldKey}-${A}`))})]},k.nodeId))]}),u.length>0&&ut("div",{className:"space-y-2",children:[Qe("h4",{className:"font-medium text-muted-foreground text-xs uppercase tracking-wide",children:"Missing Required Fields"}),u.map(k=>ut("div",{children:[Qe("p",{className:"font-medium text-sm",children:k.nodeLabel}),Qe("div",{className:"mt-1 space-y-0.5",children:k.missingFields.map(f=>ut("div",{className:"flex items-center gap-3 py-0.5 pl-3",children:[Qe("p",{className:"min-w-0 flex-1 text-muted-foreground text-sm",children:f.fieldLabel}),Qe(O,{className:"shrink-0",onClick:()=>T(k.nodeId,f.fieldKey),size:"sm",variant:"outline",children:"Fix"})]},`${k.nodeId}-${f.fieldKey}`))})]},k.nodeId))]})]})]})}import{jsx as gs,jsxs as cg}from"react/jsx-runtime";function wd({className:e}){return cg("svg",{className:e,fill:"none",height:"16",viewBox:"0 0 305 234",width:"16",xmlns:"http://www.w3.org/2000/svg",children:[gs("path",{className:"fill-foreground",d:"M125.776 0C120.929 1.64945e-05 117 3.9291 117 8.77539V61.4248C117 66.2711 120.929 70.2002 125.776 70.2002H160.875L161.253 70.2051C169.032 70.4023 175.301 76.6734 175.495 84.4531L175.5 84.8252V143.325C175.5 148.171 179.429 152.101 184.276 152.101H219.375L219.753 152.105C227.53 152.303 233.798 158.571 233.995 166.348L234 166.726V225.225C234 230.071 237.929 234 242.776 234H295.425C300.271 234 304.2 230.071 304.2 225.225V172.575C304.2 167.729 300.271 163.8 295.425 163.8H260.25C252.334 163.76 245.905 157.43 245.705 149.553L245.7 149.176V90.6758C245.7 85.8295 241.771 81.9004 236.925 81.9004H201.825C193.874 81.9004 187.405 75.5551 187.205 67.6523L187.2 67.2754V8.77539C187.2 3.9291 183.271 1.64951e-05 178.425 0H125.776Z"}),gs("path",{className:"fill-foreground",d:"M67.2755 81.9004C62.4293 81.9004 58.5002 85.8295 58.5002 90.6758V143.325C58.5004 148.171 62.4294 152.101 67.2755 152.101H102.375L102.753 152.105C110.53 152.303 116.798 158.571 116.995 166.348L117 166.726V225.225C117 230.071 120.929 234 125.776 234H178.425C183.271 234 187.2 230.071 187.2 225.225V172.575C187.2 167.729 183.271 163.8 178.425 163.8H143.25C135.334 163.76 128.905 157.43 128.705 149.553L128.7 149.176V90.6758C128.7 85.8295 124.771 81.9004 119.925 81.9004H67.2755Z"}),gs("path",{className:"fill-foreground",d:"M8.77454 163.8C3.92844 163.8 0.00012207 167.729 0.00012207 172.575V225.225C0.00012207 230.071 3.92844 234 8.77454 234H61.4249C66.2712 234 70.2003 230.071 70.2003 225.225V172.575C70.2003 167.729 66.2712 163.8 61.4249 163.8H8.77454Z"})]})}import{Key as Pg,LogOut as Eg,Moon as Dg,Plug as Rg,Settings as Og,Sun as Lg}from"lucide-react";import{useTheme as Mg}from"next-themes";import Fg from"next/link";import{useEffect as Ld,useState as Md}from"react";import{Copy as ug,Key as mg,Trash2 as pg}from"lucide-react";import{useCallback as fg,useEffect as gg,useState as bn}from"react";import{toast as wn}from"sonner";import{jsx as Be,jsxs as At}from"react/jsx-runtime";function yg({overlayId:e,onCreated:t}){let{pop:o}=ne(),[n,r]=bn(""),[s,a]=bn(!1);return At(De,{actions:[{label:"Create",onClick:async()=>{a(!0);try{let i=await fetch("/api/api-keys",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:n||null})});if(!i.ok){let c=await i.json();throw new Error(c.error||"Failed to create API key")}let d=await i.json();t(d),wn.success("API key created successfully"),o()}catch(i){console.error("Failed to create API key:",i),wn.error(i instanceof Error?i.message:"Failed to create API key")}finally{a(!1)}},loading:s}],overlayId:e,title:"Create API Key",children:[Be("p",{className:"mb-4 text-muted-foreground text-sm",children:"Create a new API key for webhook authentication"}),At("div",{className:"space-y-2",children:[Be(F,{htmlFor:"key-name",children:"Label (optional)"}),Be(se,{id:"key-name",onChange:i=>r(i.target.value),placeholder:"e.g., Production, Testing",value:n})]})]})}function xd({overlayId:e}){let{push:t,closeAll:o}=ne(),[n,r]=bn(!0),[s,a]=bn([]),[l,i]=bn(null),[d,c]=bn(null),u=fg(async()=>{r(!0);try{let w=await fetch("/api/api-keys");if(!w.ok)throw new Error("Failed to load API keys");let k=await w.json();a(k)}catch(w){console.error("Failed to load API keys:",w),wn.error("Failed to load API keys")}finally{r(!1)}},[]);gg(()=>{u()},[u]);let p=w=>{i(w.key??null),a(k=>[w,...k])},g=async w=>{c(w);try{if(!(await fetch(`/api/api-keys/${w}`,{method:"DELETE"})).ok)throw new Error("Failed to delete API key");a(f=>f.filter(A=>A.id!==w)),wn.success("API key deleted")}catch(k){console.error("Failed to delete API key:",k),wn.error("Failed to delete API key")}finally{c(null)}},T=w=>{t(Oe,{title:"Delete API Key",message:"Are you sure you want to delete this API key? Any webhooks using this key will stop working immediately.",confirmLabel:"Delete",confirmVariant:"destructive",destructive:!0,onConfirm:()=>g(w)})},v=w=>{navigator.clipboard.writeText(w),wn.success("Copied to clipboard")},y=w=>new Date(w).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"});return At(De,{actions:[{label:"New API Key",variant:"outline",onClick:()=>t(yg,{onCreated:p})},{label:"Done",onClick:o}],overlayId:e,title:"API Keys",children:[Be("p",{className:"-mt-2 mb-4 text-muted-foreground text-sm",children:"Manage API keys for webhook authentication"}),n?Be("div",{className:"flex items-center justify-center py-8",children:Be(Nt,{})}):At("div",{className:"space-y-4",children:[l&&At("div",{className:"rounded-md border border-yellow-500/50 bg-yellow-500/10 p-3",children:[Be("p",{className:"mb-2 font-medium text-sm text-yellow-600 dark:text-yellow-400",children:"Copy your API key now. You won't be able to see it again!"}),At("div",{className:"flex items-center gap-2",children:[Be("code",{className:"flex-1 rounded bg-muted px-2 py-1 font-mono text-xs",children:l}),Be(O,{onClick:()=>v(l),size:"sm",variant:"outline",children:Be(ug,{className:"size-4"})})]}),Be(O,{className:"mt-2",onClick:()=>i(null),size:"sm",variant:"ghost",children:"Dismiss"})]}),s.length===0?At("div",{className:"py-8 text-center text-muted-foreground text-sm",children:[Be(mg,{className:"mx-auto mb-2 size-8 opacity-50"}),Be("p",{children:"No API keys yet"}),Be("p",{className:"text-xs",children:"Create an API key to authenticate webhook requests"})]}):Be("div",{className:"space-y-2",children:s.map(w=>At("div",{className:"flex items-center justify-between rounded-md border p-3",children:[At("div",{className:"min-w-0 flex-1",children:[At("div",{className:"flex items-center gap-2",children:[At("code",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-xs",children:[w.keyPrefix,"..."]}),w.name&&Be("span",{className:"truncate text-sm",children:w.name})]}),At("p",{className:"mt-1 text-muted-foreground text-xs",children:["Created ",y(w.createdAt),w.lastUsedAt&&` \xB7 Last used ${y(w.lastUsedAt)}`]})]}),Be(O,{disabled:d===w.id,onClick:()=>T(w.id),size:"sm",variant:"ghost",children:d===w.id?Be(Nt,{className:"size-4"}):Be(pg,{className:"size-4 text-destructive"})})]},w.id))})]})]})}import{useSetAtom as kg}from"jotai";import{Search as Cg}from"lucide-react";import{useCallback as hs,useEffect as Tg,useRef as Ag,useState as kd}from"react";import{Pencil as vg,Trash2 as hg}from"lucide-react";import{useCallback as bg,useEffect as wg,useMemo as xg,useState as ys}from"react";import{toast as ta}from"sonner";import{jsx as Ge,jsxs as vs}from"react/jsx-runtime";var Ng={database:"Database"};function Nd({onIntegrationChange:e,filter:t=""}){let{push:o}=ne(),[n,r]=ys([]),[s,a]=ys(!0),[l,i]=ys(null),d=bg(async()=>{try{a(!0);let v=await q.integration.getAll();r(v)}catch(v){console.error("Failed to load integrations:",v),ta.error("Failed to load integrations")}finally{a(!1)}},[]);wg(()=>{d()},[d]);let c=xg(()=>{let v=Yt(),y=t.toLowerCase();return n.map(w=>({...w,label:v[w.type]||Ng[w.type]||w.type})).filter(w=>t?w.label.toLowerCase().includes(y)||w.name.toLowerCase().includes(y)||w.type.toLowerCase().includes(y):!0).sort((w,k)=>{let f=w.label.localeCompare(k.label);return f!==0?f:w.name.localeCompare(k.name)})},[n,t]),u=v=>{o(Rr,{integration:v,onSuccess:()=>{d(),e?.()},onDelete:()=>{d(),e?.()}})},p=v=>{o(La,{integration:v,onSuccess:()=>{d(),e?.()}})},g=async v=>{try{i(v);let y=await q.integration.testConnection(v);y.status==="success"?ta.success(y.message||"Connection successful"):ta.error(y.message||"Connection test failed")}catch(y){console.error("Connection test failed:",y),ta.error(y instanceof Error?y.message:"Connection test failed")}finally{i(null)}};return s?Ge("div",{className:"flex items-center justify-center py-8",children:Ge(Nt,{})}):Ge("div",{className:"space-y-1",children:n.length===0?Ge("div",{className:"py-8 text-center",children:Ge("p",{className:"text-muted-foreground text-sm",children:"No connections configured yet"})}):c.length===0?Ge("div",{className:"py-8 text-center",children:Ge("p",{className:"text-muted-foreground text-sm",children:"No connections match your filter"})}):Ge("div",{className:"space-y-1",children:c.map(v=>vs("div",{className:"flex items-center justify-between rounded-md px-2 py-1.5",children:[vs("div",{className:"flex items-center gap-2",children:[Ge(Rt,{className:"size-4",integration:v.type==="ai-gateway"?"vercel":v.type}),Ge("span",{className:"font-medium text-sm",children:v.label}),Ge("span",{className:"text-muted-foreground text-sm",children:v.name})]}),vs("div",{className:"flex items-center gap-1",children:[Ge(O,{className:"h-7 px-2",disabled:l===v.id,onClick:()=>g(v.id),size:"sm",variant:"outline",children:l===v.id?Ge(Nt,{className:"size-3"}):Ge("span",{className:"text-xs",children:"Test"})}),Ge(O,{className:"size-7",onClick:()=>u(v),size:"icon",variant:"outline",children:Ge(vg,{className:"size-3"})}),Ge(O,{className:"size-7",onClick:()=>p(v),size:"icon",variant:"outline",children:Ge(hg,{className:"size-3"})})]})]},v.id))})})}import{jsx as Ro,jsxs as bs}from"react/jsx-runtime";function Cd({overlayId:e}){let{push:t,closeAll:o}=ne(),[n,r]=kd(!0),[s,a]=kd(""),l=kg(Pt),i=Ag(!1),d=hs(async()=>{r(!0);try{await new Promise(g=>setTimeout(g,0))}finally{r(!1)}},[]);Tg(()=>{d(),i.current=!1,a("")},[d]);let c=hs(()=>{i.current&&l(g=>g+1),o()},[o,l]),u=hs(()=>{i.current=!0},[]);return bs(De,{actions:[{label:"Add Connection",variant:"outline",onClick:()=>{t(Fi,{onSuccess:u})}},{label:"Done",onClick:c}],overlayId:e,title:"Connections",children:[Ro("p",{className:"-mt-2 mb-4 text-muted-foreground text-sm",children:"Manage API keys and credentials used by your workflows"}),n?Ro("div",{className:"flex items-center justify-center py-8",children:Ro(Nt,{})}):bs("div",{className:"space-y-4",children:[bs("div",{className:"relative",children:[Ro(Cg,{className:"absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted-foreground"}),Ro(se,{className:"pl-9",onChange:g=>a(g.target.value),placeholder:"Filter connections...",value:s})]}),Ro("div",{className:"max-h-[300px] overflow-y-auto",children:Ro(Nd,{filter:s,onIntegrationChange:u})})]})]})}import{useCallback as Id,useEffect as Sg,useState as ra}from"react";import{toast as Pd}from"sonner";import{jsx as na}from"react/jsx-runtime";function oa({className:e,...t}){return na("div",{"data-slot":"card",className:x("text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",e),...t})}function Td({className:e,...t}){return na("div",{"data-slot":"card-title",className:x("leading-none font-semibold",e),...t})}function Ad({className:e,...t}){return na("div",{"data-slot":"card-description",className:x("text-muted-foreground text-sm",e),...t})}function ws({className:e,...t}){return na("div",{"data-slot":"card-content",className:x("px-6",e),...t})}import{jsx as Kn,jsxs as xs}from"react/jsx-runtime";function Sd({accountName:e,accountEmail:t,onNameChange:o,onEmailChange:n}){return Kn(oa,{className:"border-0 py-0 shadow-none",children:xs(ws,{className:"space-y-4 p-0",children:[xs("div",{className:"space-y-2",children:[Kn(F,{className:"ml-1",htmlFor:"accountName",children:"Name"}),Kn(se,{id:"accountName",onChange:r=>o(r.target.value),placeholder:"Your name",value:e})]}),xs("div",{className:"space-y-2",children:[Kn(F,{className:"ml-1",htmlFor:"accountEmail",children:"Email"}),Kn(se,{id:"accountEmail",onChange:r=>n(r.target.value),placeholder:"your.email@example.com",type:"email",value:t})]})]})})}import{jsx as aa,jsxs as Ig}from"react/jsx-runtime";function Ed({overlayId:e}){let{closeAll:t}=ne(),[o,n]=ra(!0),[r,s]=ra(!1),[a,l]=ra(""),[i,d]=ra(""),c=Id(async()=>{try{let g=await q.user.get();l(g.name||""),d(g.email||"")}catch(g){console.error("Failed to load account:",g)}},[]),u=Id(async()=>{n(!0);try{await c()}finally{n(!1)}},[c]);return Sg(()=>{u()},[u]),Ig(De,{actions:[{label:"Cancel",variant:"outline",onClick:t},{label:"Save",onClick:async()=>{try{s(!0),await q.user.update({name:a,email:i}),await c(),Pd.success("Settings saved"),t()}catch(g){console.error("Failed to save account:",g),Pd.error("Failed to save settings")}finally{s(!1)}},loading:r,disabled:o}],overlayId:e,title:"Settings",children:[aa("p",{className:"-mt-2 mb-4 text-muted-foreground text-sm",children:"Update your personal information"}),o?aa("div",{className:"flex items-center justify-center py-8",children:aa(Nt,{})}):aa(Sd,{accountEmail:i,accountName:a,onEmailChange:d,onNameChange:l})]})}import{Avatar as Ns}from"radix-ui";import{jsx as ks}from"react/jsx-runtime";function Dd({className:e,...t}){return ks(Ns.Root,{"data-slot":"avatar",className:x("relative flex size-8 shrink-0 overflow-hidden rounded-full",e),...t})}function Rd({className:e,...t}){return ks(Ns.Image,{"data-slot":"avatar-image",className:x("aspect-square size-full",e),...t})}function Od({className:e,...t}){return ks(Ns.Fallback,{"data-slot":"avatar-fallback",className:x("bg-muted flex size-full items-center justify-center rounded-full",e),...t})}import{jsx as he,jsxs as Ot}from"react/jsx-runtime";var Fd=()=>{let{data:e,isPending:t}=cn(),{theme:o,setTheme:n}=Mg(),{open:r}=ne(),[s,a]=Md(null),[l,i]=Md(!1);Ld(()=>{i(!0)},[]),Ld(()=>{e?.user&&!e.user.name?.startsWith("Anonymous")&&q.user.get().then(g=>a(g.providerId)).catch(()=>a(null))},[e?.user]);let d=async()=>{await Sl()},c=s==="vercel"||s==="github"||s==="google",u=()=>e?.user?.name?e.user.name.split(" ").map(g=>g[0]).join("").toUpperCase().slice(0,2):e?.user?.email?e.user.email.slice(0,2).toUpperCase():"U";return t||!l?he("div",{className:"h-9 w-9"}):!e?.user||e.user.name==="Anonymous"||e.user.email?.startsWith("temp-")?he("div",{className:"flex items-center gap-2",children:he(O,{className:"h-9 disabled:opacity-100 disabled:[&>*]:text-muted-foreground",size:"sm",variant:"default",asChild:!0,children:he(Fg,{href:"/auth/sign-in",children:"Sign In"})})}):Ot(To,{children:[he(Ao,{asChild:!0,children:he(O,{className:"relative h-9 w-9 rounded-full border p-0",variant:"ghost",children:Ot(Dd,{className:"h-9 w-9",children:[he(Rd,{alt:e?.user?.name||"",src:e?.user?.image||""}),he(Od,{children:u()})]})})}),Ot(So,{align:"end",className:"w-56",children:[he(ol,{children:Ot("div",{className:"flex flex-col space-y-1",children:[he("p",{className:"font-medium text-sm leading-none",children:e?.user?.name||"User"}),he("p",{className:"text-muted-foreground text-xs leading-none",children:e?.user?.email})]})}),he(Fn,{}),!c&&Ot(ht,{onClick:()=>r(Ed),children:[he(Og,{className:"size-4"}),he("span",{children:"Settings"})]}),Ot(ht,{onClick:()=>r(Cd),children:[he(Rg,{className:"size-4"}),he("span",{children:"Connections"})]}),Ot(ht,{onClick:()=>r(xd),children:[he(Pg,{className:"size-4"}),he("span",{children:"API Keys"})]}),Ot(nl,{children:[Ot(rl,{children:[he(Lg,{className:"size-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0"}),he(Dg,{className:"absolute size-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100"}),he("span",{children:"Theme"})]}),he(al,{children:Ot(tl,{onValueChange:n,value:o,children:[he(Br,{value:"light",children:"Light"}),he(Br,{value:"dark",children:"Dark"}),he(Br,{value:"system",children:"System"})]})})]}),he(Fn,{}),Ot(ht,{onClick:d,children:[he(Eg,{className:"size-4"}),he("span",{children:"Logout"})]})]})]})};import{Fragment as ia,jsx as K,jsxs as Pe}from"react/jsx-runtime";function _d(e,t,o){for(let n of e)t({id:n.id,data:{status:o}})}var qg={"Database Query":"database"},Yg={database:"Database"};function Jg(e){if(typeof e!="string")return[];let t=/\{\{@([^:]+):([^}]+)\}\}/g,o=e.matchAll(t);return Array.from(o).map(n=>({nodeId:n[1],displayText:n[2]}))}function Kd(e,t=""){let o=[];for(let[n,r]of Object.entries(e)){let s=t?`${t}.${n}`:n;if(typeof r=="string"){let a=Jg(r);for(let l of a)o.push({field:s,...l})}else typeof r=="object"&&r!==null&&!Array.isArray(r)&&o.push(...Kd(r,s))}return o}function Xg(e){let t=new Set(e.map(n=>n.id)),o=[];for(let n of e){if(n.data.enabled===!1)continue;let r=n.data.config;if(!r||typeof r!="object")continue;let a=Kd(r).filter(l=>!t.has(l.nodeId));if(a.length>0){let l=r.actionType,i=l?pe(l):void 0,d=i?fa(i.configFields):[];o.push({nodeId:n.id,nodeLabel:n.data.label||i?.label||"Unnamed Step",brokenReferences:a.map(c=>{let u=d.find(p=>p.key===c.field);return{fieldKey:c.field,fieldLabel:u?.label||c.field,referencedNodeId:c.nodeId,displayText:c.displayText}})})}}return o}function Qg(e){return e==null||typeof e=="string"&&e.trim()===""}function Zg(e,t){return e.showWhen?t[e.showWhen.field]===e.showWhen.equals:!0}function ey(e){if(e.data.enabled===!1)return null;let t=e.data.config,o=t?.actionType;if(!o)return null;let n=pe(o);if(!n)return null;let s=fa(n.configFields).filter(a=>a.required&&Zg(a,t||{})&&Qg(t?.[a.key])).map(a=>({fieldKey:a.key,fieldLabel:a.label}));return s.length===0?null:{nodeId:e.id,nodeLabel:e.data.label||n.label||"Unnamed Step",missingFields:s}}function ty(e){return e.map(ey).filter(t=>t!==null)}function oy(e,t){let o=new Set(t.map(a=>a.type)),n=new Set(t.map(a=>a.id)),r=new Map,s=Yt();for(let a of e){if(a.data.enabled===!1)continue;let l=a.data.config?.actionType;if(!l)continue;let d=pe(l)?.integration||qg[l];if(!d||!Fo(d))continue;let c=a.data.config?.integrationId;if(!(c&&n.has(c))&&!o.has(d)){let p=r.get(d)||[],g=pe(l);p.push(a.data.label||g?.label||l),r.set(d,p)}}return Array.from(r.entries()).map(([a,l])=>({integrationType:a,integrationLabel:s[a]||Yg[a]||a,nodeNames:l}))}async function ny({workflowId:e,nodes:t,updateNodeData:o,pollingIntervalRef:n,setIsExecuting:r,setSelectedExecutionId:s}){_d(t,o,"idle");for(let a of t)a.data.type==="trigger"&&o({id:a.id,data:{status:"running"}});try{let a=await fetch(`/api/workflow/${e}/execute`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({input:{}})});if(!a.ok)throw new Error("Failed to execute workflow");let l=await a.json();s(l.executionId);let i=setInterval(async()=>{try{let d=await q.workflow.getExecutionStatus(l.executionId);for(let c of d.nodeStatuses)o({id:c.nodeId,data:{status:c.status}});d.status!=="running"&&(n.current&&(clearInterval(n.current),n.current=null),r(!1))}catch(d){console.error("Failed to poll execution status:",d)}},500);n.current=i}catch(a){console.error("Failed to execute workflow:",a),it.error(a instanceof Error?a.message:"Failed to execute workflow"),_d(t,o,"error"),r(!1)}}function ry({currentWorkflowId:e,nodes:t,edges:o,updateNodeData:n,isExecuting:r,setIsExecuting:s,setIsSaving:a,setHasUnsavedChanges:l,setActiveTab:i,setNodes:d,setEdges:c,setSelectedNodeId:u,setSelectedExecutionId:p,userIntegrations:g}){let{open:T}=ne(),v=jg(null);Ts(()=>()=>{v.current&&clearInterval(v.current)},[]);let y=async()=>{if(e){a(!0);try{await q.workflow.update(e,{nodes:t,edges:o}),l(!1)}catch(A){console.error("Failed to save workflow:",A),it.error("Failed to save workflow. Please try again.")}finally{a(!1)}}},w=async()=>{if(!e){it.error("Please save the workflow before executing");return}i("runs"),d(t.map(A=>({...A,selected:!1}))),c(o.map(A=>({...A,selected:!1}))),u(null),s(!0),await ny({workflowId:e,nodes:t,updateNodeData:n,pollingIntervalRef:v,setIsExecuting:s,setSelectedExecutionId:p})},k=(A,I)=>{u(A),i("properties"),I&&setTimeout(()=>{let C=document.getElementById(I);C&&(C.focus(),C.scrollIntoView({behavior:"smooth",block:"center"}))},100)};return{handleSave:y,handleExecute:async()=>{if(r)return;let A=Xg(t),I=ty(t),C=oy(t,g);if(A.length>0||I.length>0||C.length>0){T(bd,{issues:{brokenReferences:A,missingRequiredFields:I,missingIntegrations:C},onGoToStep:k,onRunAnyway:w});return}await w()}}}function ay(){let[e,t]=Ze(oe),[o,n]=Ze(ue),[r,s]=Ze(Ks),[a]=Ze(wt),l=Gt(fr),i=Gt(Zt),[d]=Ze($e),[c,u]=Ze(pt),[p,g]=Ze(ar),T=zd(Xt),v=Kg(),[y,w]=Ze(gr),[k,f]=Ze(tt),A=Gt(ti),I=Gt(oi),C=Gt(Vo),[h]=Ze(ni),[m]=Ze(ri),{data:S}=cn(),J=Gt(Ft),D=Gt(be),j=Gt(Qt),z=zd(mt),[re,P]=Ze(mr),[V,X]=Cs(!1),[W,U]=Cs(!1),[N,M]=Cs([]);return Ts(()=>{(async()=>{try{let R=await q.workflow.getAll();M(R)}catch(R){console.error("Failed to load workflows:",R)}})()},[]),{nodes:e,edges:o,isExecuting:r,setIsExecuting:s,isGenerating:a,clearWorkflow:l,updateNodeData:i,currentWorkflowId:d,workflowName:c,setCurrentWorkflowName:u,workflowVisibility:p,setWorkflowVisibility:g,isOwner:T,router:v,isSaving:y,setIsSaving:w,hasUnsavedChanges:k,setHasUnsavedChanges:f,undo:A,redo:I,addNode:C,canUndo:h,canRedo:m,session:S,isDownloading:V,setIsDownloading:X,isDuplicating:W,setIsDuplicating:U,allWorkflows:N,setAllWorkflows:M,setActiveTab:J,setNodes:t,setEdges:n,setSelectedNodeId:D,setSelectedExecutionId:j,userIntegrations:z,triggerExecute:re,setTriggerExecute:P}}function sy(e){let{open:t}=ne(),{currentWorkflowId:o,workflowName:n,nodes:r,edges:s,updateNodeData:a,isExecuting:l,setIsExecuting:i,setIsSaving:d,setHasUnsavedChanges:c,clearWorkflow:u,setWorkflowVisibility:p,setAllWorkflows:g,setIsDownloading:T,setIsDuplicating:v,setActiveTab:y,setNodes:w,setEdges:k,setSelectedNodeId:f,setSelectedExecutionId:A,userIntegrations:I,triggerExecute:C,setTriggerExecute:h,router:m,session:S}=e,{handleSave:J,handleExecute:D}=ry({currentWorkflowId:o,nodes:r,edges:s,updateNodeData:a,isExecuting:l,setIsExecuting:i,setIsSaving:d,setHasUnsavedChanges:c,setActiveTab:y,setNodes:w,setEdges:k,setSelectedNodeId:f,setSelectedExecutionId:A,userIntegrations:I});return Ts(()=>{C&&(h(!1),D())},[C,h,D]),{handleSave:J,handleExecute:D,handleClearWorkflow:()=>{t(Oe,{title:"Clear Workflow",message:"Are you sure you want to clear all nodes and connections? This action cannot be undone.",confirmLabel:"Clear Workflow",confirmVariant:"destructive",destructive:!0,onConfirm:()=>{u()}})},handleDeleteWorkflow:()=>{t(Oe,{title:"Delete Workflow",message:`Are you sure you want to delete "${n}"? This will permanently delete the workflow. This cannot be undone.`,confirmLabel:"Delete Workflow",confirmVariant:"destructive",destructive:!0,onConfirm:async()=>{if(o)try{await q.workflow.delete(o),it.success("Workflow deleted successfully"),window.location.href="/"}catch(W){console.error("Failed to delete workflow:",W),it.error("Failed to delete workflow. Please try again.")}}})},handleDownload:async()=>{if(!o){it.error("Please save the workflow before downloading");return}T(!0),it.info("Preparing workflow files for download...");try{let W=await q.workflow.download(o);if(!W.success)throw new Error(W.error||"Failed to prepare download");if(!W.files)throw new Error("No files to download");let U=(await import("jszip")).default,N=new U;for(let[G,te]of Object.entries(W.files))N.file(G,te);let M=await N.generateAsync({type:"blob"}),b=URL.createObjectURL(M),R=document.createElement("a");R.href=b,R.download=`${n.toLowerCase().replace(/[^a-z0-9]/g,"-")}-workflow.zip`,document.body.appendChild(R),R.click(),document.body.removeChild(R),URL.revokeObjectURL(b),it.success("Workflow downloaded successfully!")}catch(W){it.error(W instanceof Error?W.message:"Failed to download workflow")}finally{T(!1)}},loadWorkflows:async()=>{try{let W=await q.workflow.getAll();g(W)}catch(W){console.error("Failed to load workflows:",W)}},handleToggleVisibility:async W=>{if(o){if(W==="public"){t(vd,{onConfirm:async()=>{try{await q.workflow.update(o,{visibility:"public"}),p("public"),it.success("Workflow is now public")}catch(U){console.error("Failed to update visibility:",U),it.error("Failed to update visibility. Please try again.")}}});return}try{await q.workflow.update(o,{visibility:W}),p(W),it.success("Workflow is now private")}catch(U){console.error("Failed to update visibility:",U),it.error("Failed to update visibility. Please try again.")}}},handleDuplicate:async()=>{if(o){v(!0);try{S?.user||(await Eo.signIn.anonymous(),await new Promise(U=>setTimeout(U,100)));let W=await q.workflow.duplicate(o);it.success("Workflow duplicated successfully"),m.push(`/workflows/${W.id}`)}catch(W){console.error("Failed to duplicate workflow:",W),it.error("Failed to duplicate workflow. Please try again.")}finally{v(!1)}}}}}function iy({workflowId:e,state:t,actions:o}){let{open:n,push:r}=ne(),[s]=Ze(be),[a]=Ze(_e),[l]=Ze(oe),[i]=Ze(ue),d=Gt(eo),c=Gt(to),{screenToFlowPosition:u}=zg(),p=l.find(w=>w.id===s),g=i.find(w=>w.id===a),T=p||g;if(e&&!t.isOwner||!e)return null;let v=()=>{let k=!!s?"Node":"Connection";r(Oe,{title:`Delete ${k}`,message:`Are you sure you want to delete this ${k.toLowerCase()}? This action cannot be undone.`,confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:()=>{s?d(s):a&&c(a)}})},y=()=>{let w=document.querySelector(".react-flow");if(!w)return;let k=w.getBoundingClientRect(),f=k.left+k.width/2,A=k.top+k.height/2,I=u({x:f,y:A}),C=192,h=192;I.x-=C/2,I.y-=h/2;let m=20,S=20,J={...I},D=!0,j=0,z=20;for(;D&&j<z;)D=t.nodes.some(P=>{let V=Math.abs(P.position.x-J.x),X=Math.abs(P.position.y-J.y);return V<S&&X<S}),D&&(J.x+=m,J.y+=m,j+=1);let re={id:Ug(),type:"action",position:J,data:{label:"",description:"",type:"action",config:{},status:"idle"}};t.addNode(re),t.setSelectedNodeId(re.id),t.setActiveTab("properties")};return Pe(ia,{children:[K(Vt,{className:"flex lg:hidden",orientation:"vertical",children:K(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:t.isGenerating,onClick:y,size:"icon",title:"Add Step",variant:"secondary",children:K(Vd,{className:"size-4"})})}),Pe(Vt,{className:"flex lg:hidden",orientation:"vertical",children:[K(O,{className:"border hover:bg-black/5 dark:hover:bg-white/5",onClick:()=>n(Qr,{}),size:"icon",title:"Configuration",variant:"secondary",children:K(_g,{className:"size-4"})}),T&&K(O,{className:"border hover:bg-black/5 dark:hover:bg-white/5",onClick:v,size:"icon",title:"Delete",variant:"secondary",children:K($g,{className:"size-4"})})]}),K(Vt,{className:"hidden lg:flex",orientation:"horizontal",children:K(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:t.isGenerating,onClick:y,size:"icon",title:"Add Step",variant:"secondary",children:K(Vd,{className:"size-4"})})}),Pe(Vt,{className:"flex lg:hidden",orientation:"vertical",children:[K(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:!t.canUndo||t.isGenerating,onClick:()=>t.undo(),size:"icon",title:"Undo",variant:"secondary",children:K(Hd,{className:"size-4"})}),K(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:!t.canRedo||t.isGenerating,onClick:()=>t.redo(),size:"icon",title:"Redo",variant:"secondary",children:K(Gd,{className:"size-4"})})]}),Pe(Vt,{className:"hidden lg:flex",orientation:"horizontal",children:[K(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:!t.canUndo||t.isGenerating,onClick:()=>t.undo(),size:"icon",title:"Undo",variant:"secondary",children:K(Hd,{className:"size-4"})}),K(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:!t.canRedo||t.isGenerating,onClick:()=>t.redo(),size:"icon",title:"Redo",variant:"secondary",children:K(Gd,{className:"size-4"})})]}),Pe(Vt,{className:"flex lg:hidden",orientation:"vertical",children:[K($d,{handleSave:o.handleSave,state:t}),K(Ud,{actions:o,state:t})]}),Pe(Vt,{className:"hidden lg:flex",orientation:"horizontal",children:[K($d,{handleSave:o.handleSave,state:t}),K(Ud,{actions:o,state:t})]}),K(ly,{actions:o,state:t}),K(dy,{actions:o,state:t})]})}function $d({state:e,handleSave:t}){return Pe(O,{className:"relative border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:!e.currentWorkflowId||e.isGenerating||e.isSaving,onClick:t,size:"icon",title:e.isSaving?"Saving...":"Save workflow",variant:"secondary",children:[e.isSaving?K(la,{className:"size-4 animate-spin"}):K(Hg,{className:"size-4"}),e.hasUnsavedChanges&&!e.isSaving&&K("div",{className:"absolute top-1.5 right-1.5 size-2 rounded-full bg-primary"})]})}function Ud({state:e,actions:t}){let{open:o}=ne(),n=()=>{o(yd,{onExport:t.handleDownload,isDownloading:e.isDownloading})};return K(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:e.isDownloading||e.nodes.length===0||e.isGenerating||!e.currentWorkflowId,onClick:n,size:"icon",title:e.isDownloading?"Preparing download...":"Export workflow as code",variant:"secondary",children:e.isDownloading?K(la,{className:"size-4 animate-spin"}):K(Vg,{className:"size-4"})})}function ly({state:e,actions:t}){let o=e.workflowVisibility==="public";return Pe(To,{children:[K(Ao,{asChild:!0,children:K(O,{className:"border hover:bg-black/5 dark:hover:bg-white/5",disabled:!e.currentWorkflowId||e.isGenerating,size:"icon",title:o?"Public workflow":"Private workflow",variant:"secondary",children:o?K(Wd,{className:"size-4"}):K(Bd,{className:"size-4"})})}),Pe(So,{align:"end",children:[Pe(ht,{className:"flex items-center gap-2",onClick:()=>t.handleToggleVisibility("private"),children:[K(Bd,{className:"size-4"}),"Private",!o&&K(sa,{className:"ml-auto size-4"})]}),Pe(ht,{className:"flex items-center gap-2",onClick:()=>t.handleToggleVisibility("public"),children:[K(Wd,{className:"size-4"}),"Public",o&&K(sa,{className:"ml-auto size-4"})]})]})]})}function dy({state:e,actions:t}){return K(O,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:e.isExecuting||e.nodes.length===0||e.isGenerating,onClick:()=>t.handleExecute(),size:"icon",title:"Run Workflow",variant:"secondary",children:e.isExecuting?K(la,{className:"size-4 animate-spin"}):K(Gg,{className:"size-4"})})}function cy({isDuplicating:e,onDuplicate:t}){return Pe(O,{className:"h-9 border hover:bg-black/5 dark:hover:bg-white/5",disabled:e,onClick:t,size:"sm",title:"Duplicate to your workflows",variant:"secondary",children:[e?K(la,{className:"mr-2 size-4 animate-spin"}):K(Bg,{className:"mr-2 size-4"}),"Duplicate"]})}function uy({workflowId:e,state:t,actions:o}){return Pe("div",{className:"flex flex-col gap-1",children:[K("div",{className:"flex h-9 max-w-[160px] items-center overflow-hidden rounded-md border bg-secondary text-secondary-foreground sm:max-w-none",children:Pe(To,{onOpenChange:n=>n&&o.loadWorkflows(),children:[Pe(Ao,{className:"flex h-full cursor-pointer items-center gap-2 px-3 font-medium text-sm transition-all hover:bg-black/5 dark:hover:bg-white/5",children:[K(wd,{className:"size-4 shrink-0"}),K("p",{className:"truncate font-medium text-sm",children:e?t.workflowName:Pe(ia,{children:[K("span",{className:"sm:hidden",children:"New"}),K("span",{className:"hidden sm:inline",children:"New Workflow"})]})}),K(Wg,{className:"size-3 shrink-0 opacity-50"})]}),Pe(So,{align:"start",className:"w-64",children:[K(ht,{asChild:!0,className:"flex items-center justify-between",children:Pe("a",{href:"/",children:["New Workflow"," ",!e&&K(sa,{className:"size-4 shrink-0"})]})}),K(Fn,{}),t.allWorkflows.length===0?K(ht,{disabled:!0,children:"No workflows found"}):t.allWorkflows.filter(n=>n.name!=="__current__").map(n=>Pe(ht,{className:"flex items-center justify-between",onClick:()=>t.router.push(`/workflows/${n.id}`),children:[K("span",{className:"truncate",children:n.name}),n.id===t.currentWorkflowId&&K(sa,{className:"size-4 shrink-0"})]},n.id))]})]})}),e&&!t.isOwner&&K("span",{className:"text-muted-foreground text-xs uppercase lg:hidden",children:"Read-only"})]})}var jd=({workflowId:e})=>{let t=ay(),o=sy(t);return Pe(ia,{children:[K(Xr,{className:"flex flex-col gap-2 rounded-none border-none bg-transparent p-0 lg:flex-row lg:items-center",position:"top-left",children:Pe("div",{className:"flex items-center gap-2",children:[K(uy,{actions:o,state:t,workflowId:e}),e&&!t.isOwner&&K("span",{className:"hidden text-muted-foreground text-xs uppercase lg:inline",children:"Read-only"})]})}),K("div",{className:"pointer-events-auto absolute top-4 right-4 z-10",children:Pe("div",{className:"flex flex-col-reverse items-end gap-2 lg:flex-row lg:items-center",children:[K(iy,{actions:o,state:t,workflowId:e}),Pe("div",{className:"flex items-center gap-2",children:[!e&&Pe(ia,{children:[K(ad,{}),K(Ql,{})]}),e&&!t.isOwner&&K(cy,{isDuplicating:t.isDuplicating,onDuplicate:o.handleDuplicate}),K(Fd,{})]})]})})]})};import"@xyflow/react/dist/style.css";import{PlayCircle as Qy,Zap as Zy}from"lucide-react";import{nanoid as Rs}from"nanoid";import{BaseEdge as Jd,getBezierPath as my,getSimpleBezierPath as py,Position as Oo,useInternalNode as qd}from"@xyflow/react";import{jsx as Xd}from"react/jsx-runtime";var fy=({id:e,sourceX:t,sourceY:o,targetX:n,targetY:r,sourcePosition:s,targetPosition:a,selected:l})=>{let[i]=py({sourceX:t,sourceY:o,sourcePosition:s,targetX:n,targetY:r,targetPosition:a});return Xd(Jd,{className:"stroke-1",id:e,path:i,style:{stroke:l?"var(--muted-foreground)":"var(--border)",strokeDasharray:"5, 5"}})},Yd=(e,t)=>{let o=t===Oo.Left?"target":"source",n=e.internals.handleBounds?.[o]?.find(i=>i.position===t);if(!n)return[0,0];let r=n.width/2,s=n.height/2;switch(t){case Oo.Left:r=0;break;case Oo.Right:r=n.width;break;case Oo.Top:s=0;break;case Oo.Bottom:s=n.height;break;default:throw new Error(`Invalid handle position: ${t}`)}let a=e.internals.positionAbsolute.x+n.x+r,l=e.internals.positionAbsolute.y+n.y+s;return[a,l]},gy=(e,t)=>{let o=Oo.Right,[n,r]=Yd(e,o),s=Oo.Left,[a,l]=Yd(t,s);return{sx:n,sy:r,tx:a,ty:l,sourcePos:o,targetPos:s}},yy=({id:e,source:t,target:o,style:n,selected:r})=>{let s=qd(t),a=qd(o);if(!(s&&a))return null;let{sx:l,sy:i,tx:d,ty:c,sourcePos:u,targetPos:p}=gy(s,a),[g]=my({sourceX:l,sourceY:i,sourcePosition:u,targetX:d,targetY:c,targetPosition:p});return Xd(Jd,{id:e,path:g,style:{...n,stroke:r?"var(--muted-foreground)":"var(--border)",strokeWidth:2,animation:"dashdraw 0.5s linear infinite",strokeDasharray:5}})},As={Temporary:fy,Animated:yy};import{useAtomValue as Xn}from"jotai";import{AlertTriangle as by,Check as wy,Code as xy,EyeOff as tc,XCircle as Ny,Zap as rc}from"lucide-react";import oc from"next/image";import{memo as ky,useState as Cy}from"react";import{Handle as Zd,Position as ec}from"@xyflow/react";import{Fragment as vy,jsx as fo,jsxs as Ss}from"react/jsx-runtime";var Qd=({className:e})=>Ss(vy,{children:[fo("style",{children:`
|
|
211
|
+
}`:""}function Fp(e){if(!e)return Qa;if(Pl[e])return Pl[e];let t=fe(e);return t&&t.codegenTemplate||Qa}var yn=(e,t)=>e.data.type==="trigger"?Mp(e.data.config,t):e.data.type==="action"?Fp(e.data.config?.actionType):Lp;import{useAtom as Za}from"jotai";import{Check as Ol,ChevronDown as ts,ChevronRight as os,Clock as Bp,Copy as Vp,ExternalLink as Gp,Loader2 as Hp,Play as $p,Square as Dl,X as _p}from"lucide-react";import Rl from"next/image";import{useCallback as Jn,useEffect as Xr,useRef as Up,useState as Oo}from"react";function vn(e,t){return`${e} ${t}${e===1?"":"s"} ago`}function El(e){let t=new Date,o=new Date(e),n=Math.floor((t.getTime()-o.getTime())/1e3);if(n<60)return"just now";let r=Math.floor(n/60);if(r<60)return vn(r,"min");let s=Math.floor(r/60);if(s<24)return vn(s,"hour");let a=Math.floor(s/24);if(a<7)return vn(a,"day");let d=Math.floor(a/7);if(d<4)return vn(d,"week");let i=Math.floor(a/30);if(i<12)return vn(i,"month");let l=Math.floor(a/365);return vn(l,"year")}import{Loader2Icon as Wp}from"lucide-react";import{jsx as zp}from"react/jsx-runtime";function Tt({className:e,...t}){let{ref:o,...n}=t;return zp(Wp,{role:"status","aria-label":"Loading",className:x("size-4 animate-spin",e),...n})}import{Fragment as Zr,jsx as H,jsxs as ze}from"react/jsx-runtime";function Kp(e){return _s(e)}function qp(e,t){if(typeof e!="object"||e===null)return;let o=e[t.field];if(typeof o=="string"&&o.length>0)return o}function jp(e){return typeof e=="object"&&e!==null&&"base64"in e&&typeof e.base64=="string"&&e.base64.length>100}function es(e){let t={};for(let o of e)t[o.nodeId]={nodeId:o.nodeId,nodeName:o.nodeName,nodeType:o.nodeType,status:o.status,output:o.output};return t}function Jp(e){try{let t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return!1}}function Ll({data:e}){let o=JSON.stringify(e,null,2).split(/("https?:\/\/[^"]+"|"[^"]*")/g);return H(Zr,{children:o.map(n=>{if(n.startsWith('"')&&n.endsWith('"')){let r=n.slice(1,-1);if(Jp(r))return H("a",{className:"text-blue-500 underline hover:text-blue-400",href:r,rel:"noopener noreferrer",target:"_blank",children:n},r)}return n})})}function Yp({data:e,isError:t=!1}){let[o,n]=Oo(!1);return H(D,{className:"h-7 px-2",onClick:async s=>{s.stopPropagation();try{let a=t?String(e):JSON.stringify(e,null,2);await navigator.clipboard.writeText(a),n(!0),setTimeout(()=>n(!1),2e3)}catch(a){console.error("Failed to copy:",a)}},size:"sm",type:"button",variant:"ghost",children:o?H(Ol,{className:"h-3 w-3 text-green-600"}):H(Vp,{className:"h-3 w-3"})})}function Qr({title:e,children:t,defaultExpanded:o=!1,copyData:n,isError:r=!1,externalLink:s}){let[a,d]=Oo(o);return ze("div",{children:[ze("div",{className:"mb-2 flex w-full items-center justify-between",children:[ze("button",{className:"flex items-center gap-1.5",onClick:()=>d(!a),type:"button",children:[a?H(ts,{className:"h-3 w-3 text-muted-foreground"}):H(os,{className:"h-3 w-3 text-muted-foreground"}),H("span",{className:"font-medium text-muted-foreground text-xs uppercase tracking-wide",children:e})]}),ze("div",{className:"flex items-center gap-1",children:[s&&H(D,{asChild:!0,className:"h-7 px-2",size:"sm",variant:"ghost",children:H("a",{href:s,rel:"noopener noreferrer",target:"_blank",children:H(Gp,{className:"h-3 w-3"})})}),n!==void 0&&H(Yp,{data:n,isError:r})]})]}),a&&t]})}function Xp({output:e,input:t,actionType:o}){let r=(o?fe(o):void 0)?.outputConfig,s=o?Kp(o):void 0,a=r?.type!=="component"?r:s,d=a?qp(e,a):void 0,i=!(r||s)&&jp(e),c=(()=>{if(r?.type==="component"){let h=r.component;return H("div",{className:"overflow-hidden rounded-lg border bg-muted/50 p-3",children:H(h,{input:t,output:e})})}if(a&&d)switch(a.type){case"image":{let h=a.field==="base64"&&!d.startsWith("data:")?`data:image/png;base64,${d}`:d;return H("div",{className:"overflow-hidden rounded-lg border bg-muted/50 p-3",children:H(Rl,{alt:"Generated image",className:"max-h-96 w-auto rounded",height:384,src:h,unoptimized:!0,width:384})})}case"video":return H("div",{className:"overflow-hidden rounded-lg border bg-muted/50 p-3",children:H("video",{className:"max-h-96 w-auto rounded",controls:!0,src:d,children:H("track",{kind:"captions"})})});case"url":return H("div",{className:"overflow-hidden rounded-lg border bg-muted/50",children:H("iframe",{className:"h-96 w-full rounded",sandbox:"allow-scripts allow-same-origin",src:d,title:"Output preview"})});default:return null}return i?H("div",{className:"overflow-hidden rounded-lg border bg-muted/50 p-3",children:H(Rl,{alt:"AI generated output",className:"max-h-96 w-auto rounded",height:384,src:`data:image/png;base64,${e.base64}`,unoptimized:!0,width:384})}):null})(),u=c!==null,f=a?.type==="url"&&d?d:void 0;return ze(Zr,{children:[H(Qr,{copyData:e,title:"Output",children:H("pre",{className:"overflow-auto rounded-lg border bg-muted/50 p-3 font-mono text-xs leading-relaxed",children:H(Ll,{data:e})})}),u&&H(Qr,{defaultExpanded:!0,externalLink:f,title:"Result",children:c})]})}function Qp({log:e,isExpanded:t,onToggle:o,getStatusIcon:n,getStatusDotClass:r,isFirst:s,isLast:a}){return ze("div",{className:"relative flex gap-3",children:[ze("div",{className:"relative -ml-px flex flex-col items-center pt-2",children:[!s&&H("div",{className:"absolute bottom-full h-2 w-px bg-border"}),H("div",{className:x("z-10 flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-0",r(e.status)),children:n(e.status)}),!a&&H("div",{className:"absolute top-[calc(0.5rem+1.25rem)] bottom-0 w-px bg-border"})]}),ze("div",{className:"min-w-0 flex-1",children:[H("button",{className:"group w-full rounded-lg py-2 text-left transition-colors hover:bg-muted/50",onClick:o,type:"button",children:ze("div",{className:"flex items-center gap-3",children:[H("div",{className:"min-w-0 flex-1",children:ze("div",{className:"flex items-center gap-2",children:[t?H(ts,{className:"h-3.5 w-3.5 shrink-0 text-muted-foreground"}):H(os,{className:"h-3.5 w-3.5 shrink-0 text-muted-foreground"}),H("span",{className:"truncate font-medium text-sm transition-colors group-hover:text-foreground",children:e.nodeName||e.nodeType})]})}),e.duration&&H("span",{className:"shrink-0 font-mono text-muted-foreground text-xs tabular-nums",children:Number.parseInt(e.duration,10)<1e3?`${e.duration}ms`:`${(Number.parseInt(e.duration,10)/1e3).toFixed(2)}s`})]})}),t&&ze("div",{className:"mt-2 mb-2 space-y-3 px-3",children:[e.input!==null&&e.input!==void 0&&H(Qr,{copyData:e.input,title:"Input",children:H("pre",{className:"overflow-auto rounded-lg border bg-muted/50 p-3 font-mono text-xs leading-relaxed",children:H(Ll,{data:e.input})})}),e.output!==null&&e.output!==void 0&&H(Xp,{actionType:e.nodeType,input:e.input,output:e.output}),e.error&&H(Qr,{copyData:e.error,defaultExpanded:!0,isError:!0,title:"Error",children:H("pre",{className:"overflow-auto rounded-lg border border-red-500/20 bg-red-500/5 p-3 font-mono text-red-600 text-xs leading-relaxed",children:e.error})}),!(e.input||e.output||e.error)&&H("div",{className:"rounded-lg border bg-muted/30 py-4 text-center text-muted-foreground text-xs",children:"No data recorded"})]})]})]},e.id)}function hn({isActive:e=!1,onRefreshRef:t,onStartRun:o}){let[n]=Za(Ue),[r,s]=Za(no),[,a]=Za(jo),[d,i]=Oo([]),[l,c]=Oo({}),[u,f]=Oo(new Set),[h,T]=Oo(new Set),[b,y]=Oo(!0),p=Up(null),v=Jn(async(L=!0)=>{if(!n){y(!1);return}try{L&&y(!0);let W=await q.workflow.getExecutions(n);i(W)}catch(W){console.error("Failed to load executions:",W),i([])}finally{L&&y(!1)}},[n]);Xr(()=>{t&&(t.current=()=>v(!1))},[v,t]),Xr(()=>{v()},[v]);let g=Jn((L,W)=>L.map($=>({id:$.id,nodeId:$.nodeId,nodeName:$.nodeName,nodeType:$.nodeType,status:$.status,startedAt:new Date($.startedAt),completedAt:$.completedAt?new Date($.completedAt):null,duration:$.duration,input:$.input,output:$.output,error:$.error})),[]),k=Jn(async L=>{try{let W=await q.workflow.getExecutionLogs(L),$=g(W.logs,W.execution.workflow);c(P=>({...P,[L]:$})),L===r&&a(es($))}catch(W){console.error("Failed to load execution logs:",W),c($=>({...$,[L]:[]}))}},[g,r,a]);Xr(()=>{if(d.length===0)return;let L=d[0];L.status==="running"&&L.id!==p.current&&(p.current=L.id,s(L.id),f(W=>{let $=new Set(W);return $.add(L.id),$}),k(L.id),o&&o(L.id))},[d,s,k,o]);let I=Jn(async L=>{try{let W=await q.workflow.getExecutionLogs(L),$=g(W.logs,W.execution.workflow);c(P=>({...P,[L]:$})),L===r&&a(es($))}catch(W){console.error(`Failed to refresh logs for ${L}:`,W)}},[g,r,a]);Xr(()=>{if(!(e&&n))return;let W=setInterval(async()=>{try{let $=await q.workflow.getExecutions(n);i($);for(let P of u)await I(P)}catch($){console.error("Failed to poll executions:",$)}},2e3);return()=>clearInterval(W)},[e,n,u,I]);let A=Jn(async L=>{try{await q.workflow.cancelExecution(L),await v(!1)}catch(W){console.error("Failed to cancel execution:",W)}},[v]),w=async L=>{let W=new Set(u);W.has(L)?W.delete(L):(W.add(L),await k(L)),f(W)},m=L=>{if(r===L){s(null),a({});return}s(L);let W=l[L]||[];a(es(W))},S=L=>{let W=new Set(h);W.has(L)?W.delete(L):W.add(L),T(W)},X=L=>{switch(L){case"success":return H(Ol,{className:"h-3 w-3 text-white"});case"error":return H(_p,{className:"h-3 w-3 text-white"});case"cancelled":return H(Dl,{className:"h-3 w-3 text-white"});case"running":return H(Hp,{className:"h-3 w-3 animate-spin text-white"});default:return H(Bp,{className:"h-3 w-3 text-white"})}},le=L=>{switch(L){case"success":return"bg-green-600";case"error":return"bg-red-600";case"cancelled":return"bg-yellow-600";case"running":return"bg-blue-600";default:return"bg-muted-foreground"}};return b?H("div",{className:"flex items-center justify-center py-12",children:H(Tt,{})}):d.length===0?ze("div",{className:"flex flex-col items-center justify-center py-16",children:[H("div",{className:"mb-3 rounded-lg border border-dashed p-4",children:H($p,{className:"h-6 w-6 text-muted-foreground"})}),H("div",{className:"font-medium text-foreground text-sm",children:"No runs yet"}),H("div",{className:"mt-1 text-muted-foreground text-xs",children:"Execute your workflow to see runs here"})]}):H("div",{className:"space-y-3",children:d.map((L,W)=>{let $=u.has(L.id),P=r===L.id,V=(l[L.id]||[]).sort((J,F)=>new Date(J.startedAt).getTime()-new Date(F.startedAt).getTime());return ze("div",{className:x("overflow-hidden rounded-lg border bg-card transition-all",P&&"ring-2 ring-primary ring-offset-2 ring-offset-background"),children:[ze("div",{className:"flex w-full items-center gap-3 p-4",children:[H("button",{className:"flex size-5 shrink-0 items-center justify-center rounded-full border-0 transition-colors hover:bg-muted",onClick:()=>w(L.id),type:"button",children:H("div",{className:x("flex size-5 items-center justify-center rounded-full border-0",le(L.status)),children:X(L.status)})}),ze("button",{className:"min-w-0 flex-1 text-left transition-colors hover:opacity-80",onClick:()=>m(L.id),type:"button",children:[H("div",{className:"mb-1 flex items-center gap-2",children:ze("span",{className:"font-semibold text-sm",children:["Run #",d.length-W]})}),ze("div",{className:"flex items-center gap-2 font-mono text-muted-foreground text-xs",children:[H("span",{children:El(L.startedAt)}),L.duration&&ze(Zr,{children:[H("span",{children:"\u2022"}),H("span",{className:"tabular-nums",children:Number.parseInt(L.duration,10)<1e3?`${L.duration}ms`:`${(Number.parseInt(L.duration,10)/1e3).toFixed(2)}s`})]}),V.length>0&&ze(Zr,{children:[H("span",{children:"\u2022"}),ze("span",{children:[V.length," ",V.length===1?"step":"steps"]})]})]})]}),(L.status==="running"||L.status==="pending")&&H("button",{className:"flex shrink-0 items-center justify-center rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive",onClick:J=>{J.stopPropagation(),A(L.id)},title:"Stop execution",type:"button",children:H(Dl,{className:"h-3.5 w-3.5"})}),H("button",{className:"flex shrink-0 items-center justify-center rounded p-1 transition-colors hover:bg-muted",onClick:()=>w(L.id),type:"button",children:$?H(ts,{className:"h-4 w-4 text-muted-foreground"}):H(os,{className:"h-4 w-4 text-muted-foreground"})})]}),$&&H("div",{className:"border-t bg-muted/20",children:V.length===0?H("div",{className:"py-8 text-center text-muted-foreground text-xs",children:"No steps recorded"}):H("div",{className:"p-4",children:V.map((J,F)=>H(Qp,{getStatusDotClass:le,getStatusIcon:X,isExpanded:h.has(J.id),isFirst:F===0,isLast:F===V.length-1,log:J,onToggle:()=>S(J.id)},J.id))})})]},L.id)})})}import{Fragment as go,jsx as O,jsxs as U}from"react/jsx-runtime";var nf=/[^a-zA-Z0-9\s]/g,rf=/\s+/,Vl={"Database Query":"database"},af=({selectedNodes:e,selectedEdges:t,onDelete:o})=>{let[n,r]=Yn(!1),s=e.length===1?"node":"nodes",a=t.length===1?"line":"lines",d=[];e.length>0&&d.push(`${e.length} ${s}`),t.length>0&&d.push(`${t.length} ${a}`);let i=d.join(" and ");return U(go,{children:[U("div",{className:"flex size-full flex-col",children:[O("div",{className:"flex h-14 w-full shrink-0 items-center border-b bg-transparent px-4",children:O("h2",{className:"font-semibold text-foreground",children:"Properties"})}),U("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:[U("div",{className:"space-y-2",children:[O(M,{children:"Selection"}),U("p",{className:"text-muted-foreground text-sm",children:[i," selected"]})]}),O("div",{className:"flex items-center gap-2 pt-4",children:U(D,{className:"text-muted-foreground",onClick:()=>r(!0),size:"sm",variant:"ghost",children:[O(ta,{className:"mr-2 size-4"}),"Delete"]})})]})]}),O(Yo,{onOpenChange:r,open:n,children:U(Xo,{children:[U(Qo,{children:[O(en,{children:"Delete Selected Items"}),U(tn,{children:["Are you sure you want to delete ",i,"? This action cannot be undone."]})]}),U(Zo,{children:[O(nn,{children:"Cancel"}),O(on,{onClick:()=>{o(),r(!1)},children:"Delete"})]})]})})]})},sf=()=>{let[e]=po(ke),[t]=po(_e),[o]=po(ne),n=ns(ue),[r]=po(Nt),[s]=po(Ue),[a,d]=po(gt),i=ns(oo),l=fo(ro),c=fo(ao),u=fo(so),f=fo(si),h=fo(ii),T=fo(li),b=fo(kr),y=fo(br),[p,v]=po(to),[g,k]=Yn(!1),[I,A]=Yn(!1),[w,m]=Yn(!1),[S,X]=Yn(!1),[le,L]=po(Bt),W=Bl(null),$=Bl({}),P=o.find(ee=>ee.id===e),V=n.find(ee=>ee.id===t),J=o.filter(ee=>ee.selected),F=n.filter(ee=>ee.selected),K=J.length+F.length>1;zl(()=>{if(!P||le!=="code")return;let ee=P.data.config?.actionType==="Condition",xe=P.data.type==="trigger"&&P.data.config?.triggerType==="Manual";(ee||xe)&&L("properties")},[P,le,L]);let C=ns(ft);zl(()=>{if(!(P&&i))return;let ee=P.data.config?.actionType,xe=P.data.config?.integrationId;if(!(ee&&xe))return;let E=fe(ee)?.integration||Vl[ee];if(!E||C.some(ce=>ce.id===xe))return;let Y=C.filter(ce=>ce.type===E);if(Y.length===1){let ce={...P.data.config,integrationId:Y[0].id};l({id:P.id,data:{config:ce}})}else if(Y.length===0){let ce={...P.data.config,integrationId:void 0};l({id:P.id,data:{config:ce}})}},[P,C,i,l]);let z=of(()=>{let xe=`${a.replace(nf,"").split(rf).map((E,_)=>_===0?E.toLowerCase():E.charAt(0).toUpperCase()+E.slice(1).toLowerCase()).join("")||"execute"}Workflow`,{code:Q}=dr(o,n,{functionName:xe});return Q},[o,n,a]),N=()=>{P&&navigator.clipboard.writeText(yn(P))},R=()=>{navigator.clipboard.writeText(z),ea.success("Code copied to clipboard")},G=()=>{e&&(c(e),k(!1))},oe=()=>{if(P){let ee=P.data.enabled??!0;l({id:P.id,data:{enabled:!ee}})}},de=()=>{t&&(u(t),A(!1))},B=async()=>{if(s)try{await q.workflow.deleteExecutions(s),b(),m(!1)}catch(ee){console.error("Failed to delete runs:",ee);let xe=ee instanceof Error?ee.message:"Failed to delete runs";ea.error(xe)}},Ae=ee=>{P&&l({id:P.id,data:{label:ee}})},Je=ee=>{P&&l({id:P.id,data:{description:ee}})},Ye=tf(async(ee,xe,Q,E)=>{let Y=fe(xe)?.integration||Vl[xe];if(!Y){y(ce=>{let Ee=new Set(ce);return Ee.delete(ee),Ee});return}try{let ce=await q.integration.getAll();if(E.aborted)return;let Ee=ce.filter(Le=>Le.type===Y);if(Ee.length===1&&!E.aborted){let Le={...Q,actionType:xe,integrationId:Ee[0].id};l({id:ee,data:{config:Le}})}}catch(ce){console.error("Failed to auto-select integration:",ce)}finally{E.aborted||y(ce=>{let Ee=new Set(ce);return Ee.delete(ee),Ee})}},[l,y]),$e=(ee,xe)=>{if(P){let Q={...P.data.config,[ee]:xe};if(ee==="actionType"&&P.data.config?.integrationId&&(Q={...Q,integrationId:void 0}),l({id:P.id,data:{config:Q}}),ee==="actionType"){let E=$.current[P.id];E&&E.abort();let _=new AbortController;$.current[P.id]=_,y(Y=>new Set(Y).add(P.id)),Ye(P.id,xe,Q,_.signal)}}},Zt=async ee=>{if(d(ee),s)try{await q.workflow.update(s,{name:ee,nodes:o,edges:n})}catch(xe){console.error("Failed to update workflow name:",xe),ea.error("Failed to update workspace name")}},Et=async()=>{X(!0);try{W.current&&await W.current()}catch(ee){console.error("Failed to refresh runs:",ee),ea.error("Failed to refresh runs")}finally{X(!1)}};return K?O(af,{onDelete:f,selectedEdges:F,selectedNodes:J}):V?U(go,{children:[U("div",{className:"flex size-full flex-col",children:[O("div",{className:"flex h-14 w-full shrink-0 items-center border-b bg-transparent px-4",children:O("h2",{className:"font-semibold text-foreground",children:"Properties"})}),U("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:[U("div",{className:"space-y-2",children:[O(M,{className:"ml-1",htmlFor:"edge-id",children:"Edge ID"}),O(se,{disabled:!0,id:"edge-id",value:V.id})]}),U("div",{className:"space-y-2",children:[O(M,{className:"ml-1",htmlFor:"edge-source",children:"Source"}),O(se,{disabled:!0,id:"edge-source",value:V.source})]}),U("div",{className:"space-y-2",children:[O(M,{className:"ml-1",htmlFor:"edge-target",children:"Target"}),O(se,{disabled:!0,id:"edge-target",value:V.target})]}),i&&O("div",{className:"flex items-center gap-2 pt-4",children:U(D,{className:"text-muted-foreground",onClick:()=>A(!0),size:"sm",variant:"ghost",children:[O(ta,{className:"mr-2 size-4"}),"Delete"]})})]})]}),O(Yo,{onOpenChange:A,open:I,children:U(Xo,{children:[U(Qo,{children:[O(en,{children:"Delete Edge"}),O(tn,{children:"Are you sure you want to delete this connection? This action cannot be undone."})]}),U(Zo,{children:[O(nn,{children:"Cancel"}),O(on,{onClick:de,children:"Delete"})]})]})})]}):P?U(go,{children:[U(Aa,{className:"size-full","data-testid":"properties-panel",defaultValue:"properties",onValueChange:L,value:le,children:[U(Sa,{className:"h-14 w-full shrink-0 rounded-none border-b bg-transparent px-4 py-2.5",children:[O(No,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"properties",children:"Properties"}),(P.data.type!=="trigger"||P.data.config?.triggerType!=="Manual")&&P.data.config?.actionType!=="Condition"?O(No,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"code",children:"Code"}):null,i&&O(No,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"runs",children:"Runs"})]}),U(ko,{className:"flex flex-col overflow-hidden",value:"properties",children:[P.data.type==="action"&&!P.data.config?.actionType&&i&&O("div",{className:"flex min-h-0 flex-1 flex-col px-4 pt-4",children:O(Jr,{disabled:r,isNewlyCreated:P?.id===p,onSelectAction:ee=>{$e("actionType",ee),P?.id===p&&v(null)}})}),!(P.data.type==="action"&&!P.data.config?.actionType&&i)&&U("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:[U("div",{className:"space-y-2",children:[O(M,{className:"ml-1",htmlFor:"node-id",children:"Node ID"}),O(se,{readOnly:!0,id:"node-id",value:P?.id||""})]}),P.data.type==="trigger"&&O(Yr,{config:P.data.config||{},disabled:r||!i,onUpdateConfig:$e,workflowId:s??void 0}),P.data.type==="action"&&!P.data.config?.actionType&&!i&&O("div",{className:"rounded-lg border border-muted bg-muted/30 p-3",children:O("p",{className:"text-muted-foreground text-sm",children:"No action configured for this step."})}),P.data.type==="action"&&P.data.config?.actionType?O(Hr,{config:P.data.config||{},disabled:r||!i,isOwner:i,onUpdateConfig:$e}):null,P.data.type!=="action"||P.data.config?.actionType?U(go,{children:[U("div",{className:"space-y-2",children:[O(M,{className:"ml-1",htmlFor:"label",children:"Label"}),O(se,{disabled:r||!i,id:"label",onChange:ee=>Ae(ee.target.value),value:P.data.label})]}),U("div",{className:"space-y-2",children:[O(M,{className:"ml-1",htmlFor:"description",children:"Description"}),O(se,{disabled:r||!i,id:"description",onChange:ee=>Je(ee.target.value),placeholder:"Optional description",value:P.data.description||""})]})]}):null,!i&&O("div",{className:"rounded-lg border border-muted bg-muted/30 p-3",children:O("p",{className:"text-muted-foreground text-sm",children:"You are viewing a public workflow. Duplicate it to make changes."})}),i&&U("div",{className:"flex items-center gap-2 pt-4",children:[P.data.type==="action"&&O(D,{className:"text-muted-foreground",onClick:oe,size:"sm",variant:"ghost",children:P.data.enabled===!1?U(go,{children:[O(ef,{className:"mr-2 size-4"}),"Disabled"]}):U(go,{children:[O(Zp,{className:"mr-2 size-4"}),"Enabled"]})}),U(D,{className:"text-muted-foreground",onClick:()=>k(!0),size:"sm",variant:"ghost",children:[O(ta,{className:"mr-2 size-4"}),"Delete"]})]})]})]}),O(ko,{className:"flex flex-col overflow-hidden data-[state=inactive]:hidden",forceMount:!0,value:"code",children:(()=>{let ee=P.data.config?.triggerType,xe="",Q="typescript";return P.data.type==="trigger"?ee==="Schedule"?(xe="vercel.json",Q="json"):ee==="Webhook"&&(xe=`app/api${P.data.config?.webhookPath||"/webhook"}/route.ts`,Q="typescript"):xe=`steps/${P.data.config?.actionType?.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"")||"action"}-step.ts`,U(go,{children:[xe&&U("div",{className:"flex shrink-0 items-center justify-between border-b bg-muted/30 px-3 pb-2",children:[U("div",{className:"flex items-center gap-2",children:[O(Fl,{className:"size-3.5 text-muted-foreground"}),O("code",{className:"text-muted-foreground text-xs",children:xe})]}),U(D,{className:"text-muted-foreground",onClick:N,size:"sm",variant:"ghost",children:[O(Ml,{className:"mr-2 size-4"}),"Copy"]})]}),O("div",{className:"flex-1 overflow-hidden",children:O(yt,{height:"100%",language:Q,options:{readOnly:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:13,lineNumbers:"on",folding:!1,wordWrap:"off",padding:{top:16,bottom:16}},value:yn(P)})})]})})()}),i&&U(ko,{className:"flex flex-col overflow-hidden",value:"runs",children:[U("div",{className:"flex shrink-0 items-center gap-2 border-b px-4 py-2",children:[U(D,{className:"text-muted-foreground",disabled:S,onClick:Et,size:"sm",variant:"ghost",children:[O(Wl,{className:`mr-2 size-4 ${S?"animate-spin":""}`}),"Refresh"]}),U(D,{className:"text-muted-foreground",onClick:()=>m(!0),size:"sm",variant:"ghost",children:[O(rs,{className:"mr-2 size-4"}),"Clear All"]})]}),O("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:O(hn,{isActive:le==="runs",onRefreshRef:W})})]})]}),O(Yo,{onOpenChange:m,open:w,children:U(Xo,{children:[U(Qo,{children:[O(en,{children:"Delete All Runs"}),O(tn,{children:"Are you sure you want to delete all workflow runs? This action cannot be undone."})]}),U(Zo,{children:[O(nn,{children:"Cancel"}),O(on,{onClick:B,children:"Delete"})]})]})}),O(Yo,{onOpenChange:k,open:g,children:U(Xo,{children:[U(Qo,{children:[O(en,{children:"Delete Step"}),O(tn,{children:"Are you sure you want to delete this node? This action cannot be undone."})]}),U(Zo,{children:[O(nn,{children:"Cancel"}),O(on,{onClick:G,children:"Delete"})]})]})})]}):U(go,{children:[U(Aa,{className:"size-full",defaultValue:"properties",onValueChange:L,value:le,children:[U(Sa,{className:"h-14 w-full shrink-0 rounded-none border-b bg-transparent px-4 py-2.5",children:[O(No,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"properties",children:"Properties"}),O(No,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"code",children:"Code"}),i&&O(No,{className:"bg-transparent text-muted-foreground data-[state=active]:text-foreground data-[state=active]:shadow-none",value:"runs",children:"Runs"})]}),O(ko,{className:"flex flex-col overflow-hidden",value:"properties",children:U("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:[U("div",{className:"space-y-2",children:[O(M,{className:"ml-1",htmlFor:"workflow-name",children:"Workflow Name"}),O(se,{disabled:!i,id:"workflow-name",onChange:ee=>Zt(ee.target.value),value:a})]}),U("div",{className:"space-y-2",children:[O(M,{className:"ml-1",htmlFor:"workflow-id",children:"Workflow ID"}),O(se,{disabled:!0,id:"workflow-id",value:s||"Not saved"})]}),!i&&O("div",{className:"rounded-lg border border-muted bg-muted/30 p-3",children:O("p",{className:"text-muted-foreground text-sm",children:"You are viewing a public workflow. Duplicate it to make changes."})}),i&&U("div",{className:"flex items-center gap-2 pt-4",children:[U(D,{className:"text-muted-foreground",onClick:()=>h(!0),size:"sm",variant:"ghost",children:[O(rs,{className:"mr-2 size-4"}),"Clear"]}),U(D,{className:"text-muted-foreground",onClick:()=>T(!0),size:"sm",variant:"ghost",children:[O(ta,{className:"mr-2 size-4"}),"Delete"]})]})]})}),i&&U(ko,{className:"flex flex-col overflow-hidden",value:"runs",children:[U("div",{className:"flex shrink-0 items-center gap-2 border-b px-4 py-2",children:[U(D,{className:"text-muted-foreground",disabled:S,onClick:Et,size:"sm",variant:"ghost",children:[O(Wl,{className:`mr-2 size-4 ${S?"animate-spin":""}`}),"Refresh"]}),U(D,{className:"text-muted-foreground",onClick:()=>m(!0),size:"sm",variant:"ghost",children:[O(rs,{className:"mr-2 size-4"}),"Clear All"]})]}),O("div",{className:"flex-1 space-y-4 overflow-y-auto p-4",children:O(hn,{isActive:le==="runs",onRefreshRef:W})})]}),U(ko,{className:"flex flex-col overflow-hidden data-[state=inactive]:hidden",forceMount:!0,value:"code",children:[U("div",{className:"flex shrink-0 items-center justify-between border-b bg-muted/30 px-3 pb-2",children:[U("div",{className:"flex items-center gap-2",children:[O(Fl,{className:"size-3.5 text-muted-foreground"}),U("code",{className:"text-muted-foreground text-xs",children:["workflows/",a.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"")||"workflow",".ts"]})]}),U(D,{className:"text-muted-foreground",onClick:R,size:"sm",variant:"ghost",children:[O(Ml,{className:"mr-2 size-4"}),"Copy"]})]}),O("div",{className:"flex-1 overflow-hidden",children:O(yt,{height:"100%",language:"typescript",options:{readOnly:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:13,lineNumbers:"on",folding:!0,wordWrap:"off",padding:{top:16,bottom:16}},value:z})})]})]}),O(Yo,{onOpenChange:m,open:w,children:U(Xo,{children:[U(Qo,{children:[O(en,{children:"Delete All Runs"}),O(tn,{children:"Are you sure you want to delete all workflow runs? This action cannot be undone."})]}),U(Zo,{children:[O(nn,{children:"Cancel"}),O(on,{onClick:B,children:"Delete"})]})]})})]})},as=()=>O("div",{className:"hidden size-full flex-col bg-background md:flex",children:O(sf,{})});import{jsx as It,jsxs as oa}from"react/jsx-runtime";var ls=({workflowId:e})=>{let t=mf(),o=Vt(),[n,r]=$t(Nt),[s,a]=$t(Nr),[d]=$t(ne),[i]=$t(ue),[l]=$t(Ue),[c]=$t(no),u=At(ne),f=At(ue),h=At(Ue),T=At(gt),b=At(ro),y=At(nt),[p,v]=$t(di),g=At(wr),k=At(gr),I=At(yr),[A,w]=$t(vr),[m,S]=$t(oi),X=At(pr),[le,L]=$t(oo),W=At(ft),$=At(mr),P=lf(Rt),[V,J]=ss(30),[F,K]=ss(A),[C,z]=ss(!1),N=Lo(!1),R=Lo(!1);St(()=>{if(R.current)return;R.current=!0;let E=document.cookie.split("; ").find(Y=>Y.startsWith("sidebar-width="));if(E){let Y=Number.parseFloat(E.split("=")[1]);!Number.isNaN(Y)&&Y>=20&&Y<=50&&J(Y)}let _=document.cookie.split("; ").find(Y=>Y.startsWith("sidebar-collapsed="));_&&S(_.split("=")[1]==="true")},[S]);let G=Lo(!1);St(()=>{if(!G.current){G.current=!0;return}document.cookie=`sidebar-width=${V}; path=/; max-age=31536000`},[V]),St(()=>{R.current&&(document.cookie=`sidebar-collapsed=${m}; path=/; max-age=31536000`)},[m]),St(()=>{let E=sessionStorage.getItem("animate-sidebar")==="true";if(sessionStorage.removeItem("animate-sidebar"),A||!E){K(!0),w(!0);return}I(!0);let _=setTimeout(()=>{K(!0),w(!0)},100),Y=setTimeout(()=>I(!1),400);return()=>{clearTimeout(_),clearTimeout(Y),I(!1)}},[A,w,I]),St(()=>{let E=_=>{(_.metaKey||_.ctrlKey)&&_.key==="b"&&(_.preventDefault(),I(!0),S(Y=>!Y),setTimeout(()=>I(!1),350))};return window.addEventListener("keydown",E),()=>window.removeEventListener("keydown",E)},[I,S]),St(()=>(k(!o&&F&&!m?`${V}%`:null),()=>{k(null)}),[o,k,V,F,m]);let oe=yo(E=>{E.preventDefault(),N.current=!0,z(!0);let _=ce=>{if(!N.current)return;let Ee=(window.innerWidth-ce.clientX)/window.innerWidth*100;J(Math.min(50,Math.max(20,Ee)))},Y=()=>{N.current=!1,z(!1),document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",Y),document.body.style.cursor="",document.body.style.userSelect=""};document.addEventListener("mousemove",_),document.addEventListener("mouseup",Y),document.body.style.cursor="col-resize",document.body.style.userSelect="none"},[]),de=Lo(null),B=Lo(null),Ae=Lo(d);St(()=>{Ae.current=d},[d]);let Je=yo(async E=>{r(!0),h(e),T("AI Generated Workflow");try{let _=await q.ai.generate(E),Y=(_.nodes||[]).map(ce=>({...ce,selected:!1}));u(Y),f(_.edges||[]),T(_.name||"AI Generated Workflow"),await q.workflow.update(e,{name:_.name,description:_.description,nodes:_.nodes,edges:_.edges})}catch(_){console.error("Failed to generate workflow:",_),is.error("Failed to generate workflow")}finally{r(!1)}},[e,r,h,T,u,f]),Ye=yo(async()=>{try{let E=await q.workflow.getById(e);if(!E){v(!0);return}let _=E.nodes.map(Y=>({...Y,selected:!1,data:{...Y.data,status:"idle"}}));u(_),f(E.edges),h(E.id),T(E.name),X(E.visibility??"private"),L(E.isOwner!==!1),y(!1),v(!1)}catch(E){console.error("Failed to load workflow:",E),is.error("Failed to load workflow")}},[e,u,f,h,T,X,L,y,v]),$e=Lo(null);St(()=>{(async()=>{let _=t?.get("generating")==="true",Y=sessionStorage.getItem("ai-prompt"),ce=sessionStorage.getItem("generating-workflow-id");l===e&&d.length>0||(_&&Y&&ce===e?(sessionStorage.removeItem("ai-prompt"),sessionStorage.removeItem("generating-workflow-id"),await Je(Y)):await Ye())})()},[e,t,l,d.length,Je,Ye]),St(()=>{if(d.length===0||!l||!le)return;let E=$e.current;if(E&&E.workflowId===l&&E.version===P)return;(async()=>{try{let Y=await q.integration.getAll();W(Y),$(!0);let ce=new Set(Y.map(Le=>Le.id)),Ee=d.map(Le=>fi(Le,Y,ce)).filter(Le=>Le!==null);for(let Le of Ee){let On=d.find(wa=>wa.id===Le.nodeId);On&&b({id:Le.nodeId,data:{config:{...On.data.config,integrationId:Le.newIntegrationId}}})}$e.current={workflowId:l,version:P},Ee.length>0&&y(!0)}catch(Y){console.error("Failed to auto-fix integrations:",Y)}})()},[d,l,P,le,b,W,$,y]);let Zt=yo(async()=>{if(!(!l||n)){a(!0);try{await q.workflow.update(l,{nodes:d,edges:i}),y(!1)}catch(E){console.error("Failed to save workflow:",E),is.error("Failed to save workflow")}finally{a(!1)}}},[l,d,i,n,a,y]),Et=yo(E=>E.tagName==="INPUT"||E.tagName==="TEXTAREA",[]),ee=yo(E=>E.closest(".monaco-editor")!==null,[]),xe=yo(E=>(E.metaKey||E.ctrlKey)&&E.key==="s"?(E.preventDefault(),E.stopPropagation(),Zt(),!0):!1,[Zt]),Q=yo((E,_)=>(E.metaKey||E.ctrlKey)&&E.key==="Enter"?(Et(_)||ee(_)||(E.preventDefault(),E.stopPropagation(),g(!0)),!0):!1,[g,Et,ee]);return St(()=>{let E=_=>{let Y=_.target;xe(_)||Q(_,Y)};return document.addEventListener("keydown",E,!0),()=>document.removeEventListener("keydown",E,!0)},[xe,Q]),St(()=>()=>{de.current&&clearInterval(de.current),B.current&&clearInterval(B.current)},[]),St(()=>{if(B.current&&(clearInterval(B.current),B.current=null),!c){for(let _ of Ae.current)b({id:_.id,data:{status:"idle"}});return}let E=async()=>{try{let _=await q.workflow.getExecutionStatus(c);for(let Y of _.nodeStatuses)b({id:Y.nodeId,data:{status:Y.status}});_.status!=="running"&&B.current&&(clearInterval(B.current),B.current=null)}catch(_){console.error("Failed to poll selected execution status:",_),B.current&&(clearInterval(B.current),B.current=null)}};return E(),B.current=setInterval(E,500),()=>{B.current&&(clearInterval(B.current),B.current=null)}},[c,b]),oa("div",{className:"flex h-dvh w-full flex-col overflow-hidden",children:[p&&It("div",{className:"pointer-events-auto absolute inset-0 z-20 flex items-center justify-center",children:oa("div",{className:"rounded-lg border bg-background p-8 text-center shadow-lg",children:[It("h1",{className:"mb-2 font-semibold text-2xl",children:"Workflow Not Found"}),It("p",{className:"mb-6 text-muted-foreground",children:"The workflow you're looking for doesn't exist or has been deleted."}),It(D,{asChild:!0,children:It(uf,{href:"/",children:"New Workflow"})})]})}),!o&&m&&It("button",{className:"pointer-events-auto absolute top-1/2 right-0 z-20 flex size-6 -translate-y-1/2 items-center justify-center rounded-l-full border border-r-0 bg-background shadow-sm transition-colors hover:bg-muted",onClick:()=>{I(!0),S(!1),setTimeout(()=>I(!1),350)},type:"button",children:It(df,{className:"size-4"})}),!o&&oa("div",{className:"pointer-events-auto absolute inset-y-0 right-0 z-20 border-l bg-background transition-transform duration-300 ease-out",style:{width:`${V}%`,transform:F&&!m?"translateX(0)":"translateX(100%)"},children:[oa("div",{"aria-orientation":"vertical","aria-valuenow":V,className:"group absolute inset-y-0 left-0 z-10 w-3 cursor-col-resize",onMouseDown:oe,role:"separator",tabIndex:0,children:[It("div",{className:"absolute inset-y-0 left-0 w-1 bg-transparent transition-colors group-hover:bg-blue-500 group-active:bg-blue-600"}),!(C||m)&&It("button",{className:"absolute top-1/2 left-0 flex size-6 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full border bg-background opacity-0 shadow-sm transition-opacity hover:bg-muted group-hover:opacity-100",onClick:E=>{E.stopPropagation(),I(!0),S(!0),setTimeout(()=>I(!1),350)},onMouseDown:E=>E.stopPropagation(),type:"button",children:It(cf,{className:"size-4"})})]}),It(as,{})]}),o&&It(as,{})]})};import{useAtomValue as ds,useSetAtom as Xn}from"jotai";import{nanoid as gf}from"nanoid";import{useRouter as yf}from"next/navigation";import{useCallback as Hl,useEffect as na,useRef as vf}from"react";import{toast as hf}from"sonner";import{anonymousClient as pf}from"better-auth/client/plugins";import{createAuthClient as ff}from"better-auth/react";var Mo=ff({baseURL:typeof window<"u"?window.location.origin:"http://localhost:3000",plugins:[pf()]}),{signIn:i0,signOut:Gl,signUp:l0,useSession:bn}=Mo;function bf(){return{id:gf(),type:"trigger",position:{x:0,y:0},data:{label:"",description:"",type:"trigger",config:{triggerType:"Manual"},status:"idle"}}}var $l=()=>{let e=yf(),{data:t}=bn(),o=ds(ne),n=ds(ue),r=Xn(ne),s=Xn(ue),a=Xn(gt),d=Xn(vr),i=Xn(hr),l=vf(!1),c=ds(gt);na(()=>{d(!1)},[d]),na(()=>{document.title=`${c} - AI Workflow Builder`},[c]);let u=Hl(async()=>{t||(await Mo.signIn.anonymous(),await new Promise(h=>setTimeout(h,100)))},[t]),f=Hl(()=>{let h=bf();r([h])},[r]);return na(()=>{r([{id:"add-node-placeholder",type:"add",position:{x:0,y:0},data:{label:"",type:"add",onClick:f},draggable:!1,selectable:!1}]),s([]),a("New Workflow"),l.current=!1},[r,s,a,f]),na(()=>{(async()=>{let T=o.filter(b=>b.type!=="add");if(!(T.length===0||l.current)){l.current=!0;try{await u();let b=await q.workflow.create({name:"Untitled Workflow",description:"",nodes:T,edges:n});sessionStorage.setItem("animate-sidebar","true"),i(!0),console.log("[Homepage] Navigating to workflow page"),e.replace(`/workflows/${b.id}`)}catch(b){console.error("Failed to create workflow:",b),hf.error("Failed to create workflow")}}})()},[o,n,e,u,i]),null};import{useRouter as wf}from"next/navigation";import{useEffect as xf}from"react";var _l=()=>{let e=wf();return xf(()=>{(async()=>{try{let n=(await q.workflow.getAll()).filter(r=>r.name!=="__current__");if(n.length>0){let r=n.sort((s,a)=>new Date(a.updatedAt).getTime()-new Date(s.updatedAt).getTime())[0];e.replace(`/workflows/${r.id}`)}else e.replace("/")}catch(o){console.error("Failed to load workflows:",o),e.replace("/")}})()},[e]),null};import{jsx as wn}from"react/jsx-runtime";var Cf=()=>{let t=kf().slug;return!t||t.length===0?wn($l,{}):t[0]==="auth"&&t.length===2?wn("main",{className:"flex items-center justify-center min-h-screen",children:wn(Nf,{path:t[1]})}):t[0]==="workflows"&&t.length===1?wn(_l,{}):t[0]==="workflows"&&t.length===2?wn("div",{className:"pointer-events-none relative z-10",children:wn(ls,{workflowId:t[1]})}):null};import"virtual:workflow-builder-plugins";import{ReactFlowProvider as jv}from"@xyflow/react";import{Provider as Jv}from"jotai";import*as Oc from"react";import{AnimatePresence as Sf,LayoutGroup as ql,motion as Nn,useReducedMotion as jl}from"motion/react";import{useCallback as Zn,useLayoutEffect as er,useRef as vo,useState as Jl}from"react";import{Drawer as Qn}from"vaul";import{Dialog as xn}from"radix-ui";import{XIcon as Tf}from"lucide-react";import{jsx as Fo,jsxs as cs}from"react/jsx-runtime";function ra({...e}){return Fo(xn.Root,{"data-slot":"dialog",...e})}function us({...e}){return Fo(xn.Portal,{"data-slot":"dialog-portal",...e})}function Af({className:e,...t}){return Fo(xn.Overlay,{"data-slot":"dialog-overlay",className:x("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",e),...t})}function Ul({className:e,children:t,showCloseButton:o=!0,...n}){return cs(us,{"data-slot":"dialog-portal",children:[Fo(Af,{}),cs(xn.Content,{"data-slot":"dialog-content",className:x("bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",e),...n,children:[t,o&&cs(xn.Close,{"data-slot":"dialog-close",className:"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",children:[Fo(Tf,{}),Fo("span",{className:"sr-only",children:"Close"})]})]})]})}function Kl({className:e,...t}){return Fo(xn.Title,{"data-slot":"dialog-title",className:x("text-lg leading-none font-semibold",e),...t})}import{jsx as Fe,jsxs as ps}from"react/jsx-runtime";var ms={type:"spring",stiffness:400,damping:35,mass:.8},If={type:"spring",stiffness:350,damping:30,mass:.8},Pf={hidden:{opacity:0,scale:.95},visible:{opacity:1,scale:1,transition:{type:"spring",stiffness:400,damping:30}},exit:{opacity:0,scale:.95,transition:{duration:.15,ease:[.4,0,1,1]}}};function Yl(e,t){return e?"0%":t?"-35%":"100%"}function Xl(e){let t=vo(e),o=vo(1);return e>t.current?o.current=1:e<t.current&&(o.current=-1),er(()=>{t.current=e},[e]),o.current}function Ef(){let{stack:e,closeAll:t,pop:o}=re(),n=jl(),[r,s]=Jl(0),a=vo(null),d=vo(!1),i=vo(e),l=Xl(e.length),c=e.length>0;c&&(i.current=e);let u=i.current,f=u.length-1;console.log("[DesktopOverlay]",{isOpen:c,stackLength:e.length,frozenStackLength:i.current.length,renderStackLength:u.length}),er(()=>{let g=c&&!d.current;if(d.current=c,g&&s(0),a.current){let k=a.current.offsetHeight;k>0&&s(k)}},[e,c]);let h=e[e.length-1],T=n?{duration:.01}:ms,b=l===1,y=Zn(()=>{h?.options.closeOnBackdropClick!==!1&&t()},[h?.options.closeOnBackdropClick,t]),p=Zn(g=>{g.key==="Escape"&&h?.options.closeOnEscape!==!1&&o()},[h?.options.closeOnEscape,o]);er(()=>{if(c)return document.addEventListener("keydown",p),()=>document.removeEventListener("keydown",p)},[c,p]);let v=Zn(()=>{console.log("[DesktopOverlay] handleExitComplete called"),i.current=[]},[]);return console.log("[DesktopOverlay] Rendering, isOpen:",c),!c&&i.current.length===0?null:Fe(Sf,{onExitComplete:v,children:c&&Fe(ra,{modal:!1,open:!0,children:ps(us,{forceMount:!0,children:[Fe(Nn.div,{animate:{opacity:1},className:"fixed inset-0 z-50 bg-black/60",exit:{opacity:0},initial:{opacity:0},onClick:y,transition:{duration:.2}}),Fe(Nn.div,{animate:"visible",className:"fixed top-1/2 left-1/2 z-50 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 px-4",exit:"exit",initial:"hidden",variants:Pf,children:Fe(ql,{children:Fe(Nn.div,{className:"relative overflow-hidden rounded-xl border bg-background shadow-2xl ring-1 ring-black/5",layout:c,style:{minHeight:r>0?r:"auto"},transition:ms,children:Fe("div",{className:"relative",ref:a,children:u.map((g,k)=>{let I=k===f,A=k<f,m=I&&b&&u.length>1?{x:"100%",scale:1,opacity:1}:!1;return Fe(Nn.div,{animate:{x:Yl(I,A),scale:I?1:.94,opacity:I?1:0},"aria-hidden":!I,className:x("w-full",I?"relative":"pointer-events-none absolute inset-0"),initial:m,transition:T,children:Fe(g.component,{overlayId:g.id,...g.props})},g.id)})})})})})]})})})}function Df(){let{stack:e,closeAll:t,pop:o}=re(),n=jl(),[r,s]=Jl(0),a=vo(null),d=vo(!1),i=vo(e),l=Xl(e.length),c=e.length>0;c&&(i.current=e);let u=i.current,f=u.length-1;er(()=>{let g=c&&!d.current;if(d.current=c,g&&s(0),a.current){let k=a.current.offsetHeight;k>0&&s(k)}},[e,c]);let h=e[e.length-1],T=u[f],b=n?{duration:.01}:ms,y=l===1,p=Zn(g=>{g.key==="Escape"&&h?.options.closeOnEscape!==!1&&o()},[h?.options.closeOnEscape,o]);er(()=>{if(c)return document.addEventListener("keydown",p),()=>document.removeEventListener("keydown",p)},[c,p]);let v=Zn(()=>{c||(i.current=[])},[c]);return Fe(Qn.Root,{onAnimationEnd:v,onOpenChange:g=>{g||t()},open:c,children:ps(Qn.Portal,{children:[Fe(Qn.Overlay,{className:"fixed inset-0 z-50 bg-black/60"}),ps(Qn.Content,{className:x("fixed inset-x-0 bottom-0 z-50 flex max-h-[90vh] flex-col","rounded-t-2xl border-t bg-background shadow-2xl"),children:[Fe(Qn.Title,{className:"sr-only",children:T?.options.title||"Dialog"}),Fe("div",{className:"mx-auto mt-3 h-1.5 w-12 shrink-0 rounded-full bg-muted-foreground/20"}),Fe(ql,{children:Fe(Nn.div,{className:"relative flex-1 overflow-hidden",layout:c,style:{minHeight:r>0?r:"auto"},transition:If,children:Fe("div",{className:"relative",ref:a,children:u.map((g,k)=>{let I=k===f,A=k<f,m=I&&y&&u.length>1?{x:"100%",scale:1,opacity:1}:!1;return Fe(Nn.div,{animate:{x:Yl(I,A),scale:I?1:.94,opacity:I?1:0},"aria-hidden":!I,className:x("w-full",I?"relative":"pointer-events-none absolute inset-0"),initial:m,transition:b,children:Fe(g.component,{overlayId:g.id,...g.props})},g.id)})})})}),Fe("div",{className:"h-safe-area-inset-bottom"})]})]})})}function Ql(){return Vt()?Fe(Df,{}):Fe(Ef,{})}import{useAtom as Rf}from"jotai";import{useEffect as Of,useRef as Zl}from"react";import{atom as qt}from"jotai";var je=qt([]),U0=qt(e=>e(je).length>0),K0=qt(e=>e(je).length);function fs(){return`overlay-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}var q0=qt(null,(e,t,o)=>{let n=fs(),r={id:n,component:o.component,props:o.props??{},options:o.options??{}};return t(je,[r]),n}),j0=qt(null,(e,t,o)=>{let n=fs(),r={id:n,component:o.component,props:o.props??{},options:o.options??{}};return t(je,[...e(je),r]),n}),J0=qt(null,(e,t)=>{let o=e(je);if(o.length<=1){o[0]?.options.onClose?.(),t(je,[]);return}o[o.length-1]?.options.onClose?.(),t(je,o.slice(0,-1))}),Y0=qt(null,(e,t,o)=>{let n=e(je),r=fs(),s={id:r,component:o.component,props:o.props??{},options:o.options??{}};return n.length===0?t(je,[s]):(n[n.length-1]?.options.onClose?.(),t(je,[...n.slice(0,-1),s])),r}),X0=qt(null,(e,t)=>{let o=e(je);for(let n of o)n.options.onClose?.();t(je,[])}),Q0=qt(null,(e,t,o)=>{let n=e(je),r=n.findIndex(s=>s.id===o);if(r!==-1){for(let s=r;s<n.length;s++)n[s].options.onClose?.();t(je,n.slice(0,r))}});function ed(){let{stack:e}=re(),[t,o]=Rf(je),n=Zl(!1),r=Zl(!1);return Of(()=>{if(n.current){n.current=!1;return}r.current=!0,o(e)},[e,o]),null}import{Fragment as Lf,jsx as td,jsxs as Mf}from"react/jsx-runtime";var od=()=>Mf(Lf,{children:[td(Ql,{}),td(ed,{})]});import{CircleCheckIcon as Ff,InfoIcon as Wf,Loader2Icon as zf,OctagonXIcon as Bf,TriangleAlertIcon as Vf}from"lucide-react";import{useTheme as Gf}from"next-themes";import{Toaster as Hf}from"sonner";import{jsx as kn}from"react/jsx-runtime";var nd=({...e})=>{let{theme:t="system"}=Gf();return kn(Hf,{theme:t,className:"toaster group",icons:{success:kn(Ff,{className:"size-4"}),info:kn(Wf,{className:"size-4"}),warning:kn(Vf,{className:"size-4"}),error:kn(Bf,{className:"size-4"}),loading:kn(zf,{className:"size-4 animate-spin"})},style:{"--normal-bg":"var(--popover)","--normal-text":"var(--popover-foreground)","--normal-border":"var(--border)","--border-radius":"var(--radius)"},...e})};import{usePathname as Gv}from"next/navigation";import{ConnectionMode as Ov,MiniMap as Lv,useReactFlow as Mv}from"@xyflow/react";import{useAtom as lr,useAtomValue as Vs,useSetAtom as wo}from"jotai";import{useCallback as xt,useEffect as ba,useMemo as Fv,useRef as Ho,useState as Tc}from"react";import{Background as $f,ReactFlow as _f}from"@xyflow/react";import"@xyflow/react/dist/style.css";import{jsx as Uf,jsxs as Kf}from"react/jsx-runtime";var rd=({children:e,...t})=>Kf(_f,{deleteKeyCode:["Backspace","Delete"],fitView:!0,panActivationKeyCode:null,selectionOnDrag:!1,zoomOnDoubleClick:!1,zoomOnPinch:!0,...t,children:[Uf($f,{bgColor:"var(--sidebar)",color:"var(--border)",gap:24,size:2}),e]});import{jsx as ad,jsxs as qf}from"react/jsx-runtime";var sd=({fromX:e,fromY:t,toX:o,toY:n})=>qf("g",{children:[ad("path",{className:"animated",d:`M${e},${t} C ${e+(o-e)*.5},${t} ${e+(o-e)*.5},${n} ${o},${n}`,fill:"none",stroke:"var(--color-ring)",strokeWidth:1}),ad("circle",{cx:o,cy:n,fill:"#fff",r:3,stroke:"var(--color-ring)",strokeWidth:1})]});import{useReactFlow as Xf}from"@xyflow/react";import{useAtom as Qf}from"jotai";import{MapPin as Zf,MapPinXInside as eg,Maximize2 as tg,ZoomIn as og,ZoomOut as ng}from"lucide-react";import{cva as jf}from"class-variance-authority";import{Slot as NT}from"radix-ui";import{jsx as Yf}from"react/jsx-runtime";var Jf=jf("flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md has-[>[data-slot=button-group]]:gap-2",{variants:{orientation:{horizontal:"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none",vertical:"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none"}},defaultVariants:{orientation:"horizontal"}});function _t({className:e,orientation:t,...o}){return Yf("div",{role:"group","data-slot":"button-group","data-orientation":t,className:x(Jf({orientation:t}),e),...o})}import{jsx as jt,jsxs as rg}from"react/jsx-runtime";var id=()=>{let{zoomIn:e,zoomOut:t,fitView:o}=Xf(),[n,r]=Qf(fr);return rg(_t,{orientation:"vertical",children:[jt(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",onClick:()=>{e()},size:"icon",title:"Zoom in",variant:"secondary",children:jt(og,{className:"size-4"})}),jt(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",onClick:()=>{t()},size:"icon",title:"Zoom out",variant:"secondary",children:jt(ng,{className:"size-4"})}),jt(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",onClick:()=>{o({padding:.2,duration:300})},size:"icon",title:"Fit view",variant:"secondary",children:jt(tg,{className:"size-4"})}),jt(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",onClick:()=>{r(!n)},size:"icon",title:n?"Hide minimap":"Show minimap",variant:"secondary",children:n?jt(Zf,{className:"size-4"}):jt(eg,{className:"size-4"})})]})};import{useReactFlow as cg}from"@xyflow/react";import{useAtom as Cn,useAtomValue as ug}from"jotai";import{ArrowUp as mg}from"lucide-react";import{useCallback as pg,useEffect as fg,useRef as dd,useState as gs}from"react";import{toast as ys}from"sonner";import{motion as ag}from"motion/react";import{memo as sg,useMemo as ig}from"react";import{jsx as dg}from"react/jsx-runtime";var lg=({children:e,as:t="p",className:o,duration:n=2,spread:r=2})=>{let s=ag.create(t),a=ig(()=>(e?.length??0)*r,[e,r]);return dg(s,{animate:{backgroundPosition:"0% center"},className:x("relative inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent","[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-background),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]",o),initial:{backgroundPosition:"100% center"},style:{"--spread":`${a}px`,backgroundImage:"var(--bg), linear-gradient(var(--color-muted-foreground), var(--color-muted-foreground))"},transition:{repeat:Number.POSITIVE_INFINITY,duration:n,ease:"linear"},children:e})},ld=sg(lg);import{Fragment as gg,jsx as Jt,jsxs as vs}from"react/jsx-runtime";function cd({workflowId:e,onWorkflowCreated:t}){let[o,n]=Cn(Nt),[r,s]=gs(""),[a,d]=gs(!1),[i,l]=gs(!1),c=dd(null),u=dd(null),f=ug(ne),[h,T]=Cn(ue),[b,y]=Cn(ne),[p,v]=Cn(Ue),[g,k]=Cn(gt),[I,A]=Cn(ke),{fitView:w}=cg(),m=f.filter(W=>W.type!=="add"),S=m.length>0;fg(()=>{let W=$=>{($.metaKey||$.ctrlKey)&&$.key==="k"&&($.preventDefault(),c.current?.focus())};return window.addEventListener("keydown",W),()=>{window.removeEventListener("keydown",W)}},[]);let X=()=>{d(!0),l(!0)},le=W=>{u.current?.contains(W.relatedTarget)||(l(!1),r.trim()||d(!1))},L=pg(async W=>{if(W.preventDefault(),!(!r.trim()||o)){n(!0);try{let $=S?{nodes:m,edges:h,name:g}:void 0;console.log("[AI Prompt] Generating workflow"),console.log("[AI Prompt] Has nodes:",S),console.log("[AI Prompt] Sending existing workflow:",!!$),$&&console.log("[AI Prompt] Existing workflow:",$.nodes.length,"nodes,",$.edges.length,"edges");let P=await q.ai.generateStream(r,F=>{let K=(F.edges||[]).map(N=>({...N,type:"animated"})),C=(F.nodes||[]).filter(N=>N.data?.type==="trigger"),z=K;if(C.length>1){let N=C[0],R=(F.nodes||[]).filter(oe=>oe.data?.type!=="trigger");F.nodes=[N,...R];let G=C.slice(1).map(oe=>oe.id);z=K.filter(oe=>!G.includes(oe.source)&&!G.includes(oe.target))}y(F.nodes||[]),T(z),F.name&&k(F.name),setTimeout(()=>{w({padding:.2,duration:200})},0)},$);console.log("[AI Prompt] Received final workflow data"),console.log("[AI Prompt] Nodes:",P.nodes?.length||0),console.log("[AI Prompt] Edges:",P.edges?.length||0);let V=(P.edges||[]).map(F=>({...F,type:"animated"}));console.log("[AI Prompt] Validating nodes:",P.nodes);let J=(P.nodes||[]).filter(F=>{let K=F.data?.type,C=F.data?.config||{};return console.log(`[AI Prompt] Checking node ${F.id}:`,{type:K,config:C,hasActionType:!!C.actionType,hasTriggerType:!!C.triggerType}),K==="trigger"?!C.triggerType:K==="action"?!C.actionType:!1});if(J.length>0)throw console.error("[AI Prompt] AI generated incomplete nodes:",J),console.error("[AI Prompt] Full workflow data:",JSON.stringify(P,null,2)),new Error(`Cannot create workflow: The AI tried to create ${J.length} incomplete node(s). The requested action type may not be supported. Please try a different description using supported actions: Send Email, Send Slack Message, Create Ticket, Database Query, HTTP Request, Generate Text, Generate Image, Scrape, or Search.`);if(e){v(e),console.log("[AI Prompt] Updating existing workflow:",e),console.log("[AI Prompt] Has existingWorkflow context:",!!$),$?(console.log("[AI Prompt] REPLACING workflow with AI response"),console.log("[AI Prompt] Replacing",m.length,"nodes with",P.nodes?.length||0,"nodes")):(console.log("[AI Prompt] Setting workflow for empty canvas"),ys.success("Generated workflow"));let F=P.nodes?.find(K=>K.selected);F&&A(F.id),await q.workflow.update(e,{name:P.name,description:P.description,nodes:P.nodes,edges:V})}else{let F=await q.workflow.create({name:P.name||"AI Generated Workflow",description:P.description||"",nodes:P.nodes||[],edges:V});v(F.id),ys.success("Created workflow"),t&&t(F.id)}s(""),d(!1),l(!1),c.current?.blur()}catch($){console.error("Failed to generate workflow:",$),ys.error("Failed to generate workflow")}finally{n(!1)}}},[r,o,e,S,f,h,n,v,y,T,k,A,t,w]);return Jt(gg,{children:Jt("div",{ref:u,className:"pointer-events-auto absolute bottom-4 left-1/2 z-10 -translate-x-1/2 px-4",style:{width:a?"min(100%, 42rem)":"20rem",transition:"width 150ms ease-out"},children:vs("form",{"aria-busy":o,"aria-label":"AI workflow prompt",className:"relative flex items-center gap-2 rounded-lg border bg-background pl-3 pr-2 py-2 shadow-lg cursor-text",onClick:W=>{(W.target===W.currentTarget||W.target.tagName!=="BUTTON")&&c.current?.focus()},onMouseDown:W=>{W.target===W.currentTarget&&W.preventDefault()},onSubmit:L,role:"search",children:[o&&r?Jt(ld,{className:"flex-1 text-sm whitespace-pre-wrap",duration:2,children:r}):Jt("textarea",{"aria-label":"Describe your workflow",className:"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground resize-none h-[22px] min-h-[22px] max-h-[200px] py-0 leading-[22px]",disabled:o,onBlur:le,onChange:W=>{s(W.target.value),W.target.style.height="auto",W.target.style.height=`${W.target.scrollHeight}px`},onFocus:X,onKeyDown:W=>{W.key==="Enter"&&!W.shiftKey?(W.preventDefault(),L(W)):W.key==="Escape"&&(W.preventDefault(),s(""),d(!1),l(!1),c.current?.blur())},placeholder:i?"Describe your workflow with natural language...":"Ask AI...",ref:c,rows:1,value:r}),Jt("div",{className:"sr-only",children:o?"Generating workflow, please wait...":""}),vs("div",{className:"relative size-8 shrink-0 self-end",children:[Jt(D,{"aria-label":"Focus prompt input (\u2318K)",className:"absolute inset-0 h-8 px-0 text-xs text-muted-foreground hover:bg-transparent transition-[opacity,filter] ease-out",onClick:()=>c.current?.focus(),style:!r.trim()&&!o&&!i?{opacity:1,filter:"blur(0px)",pointerEvents:"auto",visibility:"visible"}:{opacity:0,filter:"blur(2px)",pointerEvents:"none",visibility:"hidden"},type:"button",variant:"ghost",children:vs("kbd",{"aria-hidden":"true",className:"pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground opacity-100",children:[Jt("span",{className:"text-xs",children:"\u2318"}),"K"]})}),Jt(D,{"aria-label":o?"Generating workflow...":"Generate workflow",className:"size-8 transition-[opacity,filter] ease-out shrink-0",disabled:!r.trim()||o,size:"sm",style:!r.trim()&&!o&&!i?{opacity:0,filter:"blur(2px)",pointerEvents:"none",visibility:"hidden"}:{opacity:1,filter:"blur(0px)",pointerEvents:"auto",visibility:"visible"},type:"submit",children:Jt(mg,{"aria-hidden":"true",className:"size-4"})})]})]})})})}import{useReactFlow as uy}from"@xyflow/react";import{useAtom as et,useAtomValue as Xd,useSetAtom as Ut}from"jotai";import{Check as fa,ChevronDown as my,Copy as py,Download as fy,Globe as Qd,Loader2 as ya,Lock as Zd,Play as gy,Plus as ec,Redo2 as tc,Save as yy,Settings2 as vy,Trash2 as hy,Undo2 as oc}from"lucide-react";import{nanoid as by}from"nanoid";import{useRouter as wy}from"next/navigation";import{useEffect as Os,useRef as xy,useState as Rs}from"react";import{toast as dt}from"sonner";import{Panel as yg}from"@xyflow/react";import{jsx as vg}from"react/jsx-runtime";var aa=({className:e,...t})=>vg(yg,{className:x("m-4 rounded-md border bg-card p-1",e),...t});var hs="https://vercel.new/workflow-builder",eA=`[](${hs})`;import{jsx as tr,jsxs as ud}from"react/jsx-runtime";function md(){return tr(D,{asChild:!0,className:"h-9 gap-1.5 border px-2 sm:px-3",size:"sm",variant:"secondary",children:ud("a",{href:hs,rel:"noopener noreferrer",target:"_blank",children:[ud("svg",{"aria-label":"Vercel logomark",className:"size-3.5",fill:"currentColor",viewBox:"0 0 76 76",children:[tr("title",{children:"Vercel logomark"}),tr("path",{d:"m38 0 38 66H0z"})]}),tr("span",{className:"text-sm sm:hidden",children:"Deploy"}),tr("span",{className:"hidden text-sm sm:inline",children:"Deploy Your Own"})]})})}import{jsx as pd}from"react/jsx-runtime";function fd({className:e}){return pd("svg",{"aria-label":"GitHub",className:e,fill:"currentColor",role:"img",viewBox:"0 0 24 24",children:pd("path",{d:"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"})})}function gd(e){if(e>=1e6){let t=(e/1e6).toFixed(1);return t.endsWith(".0")?`${Math.floor(e/1e6)}M`:`${t}M`}if(e>=1e3){let t=(e/1e3).toFixed(1);return t.endsWith(".0")?`${Math.floor(e/1e3)}k`:`${t}k`}return e.toString()}import{createContext as hg,useContext as bg}from"react";import{jsx as uA}from"react/jsx-runtime";var wg=hg(null);function yd(){return bg(wg)}import{jsx as vd,jsxs as hd}from"react/jsx-runtime";var xg="https://github.com/vercel-labs/workflow-builder-template";function bd(){let e=yd();return vd(D,{asChild:!0,className:"h-9 gap-1.5 px-2 sm:px-3",size:"sm",variant:"ghost",children:hd("a",{className:"flex items-center",href:xg,rel:"noopener noreferrer",target:"_blank",children:[vd(fd,{className:"size-4.5"}),e!==null&&hd("span",{className:"hidden text-sm sm:inline",children:[gd(e)," stars"]})]})})}import{useAtom as Yt,useAtomValue as wd,useSetAtom as or}from"jotai";import{Code as xd,Copy as Nd,Eraser as bs,Eye as Ng,EyeOff as kg,FileCode as kd,Play as Cd,RefreshCw as Td,Settings2 as Ad,Trash2 as ws}from"lucide-react";import{useCallback as Tn,useEffect as Cg,useRef as Tg,useState as Ag}from"react";import{toast as An}from"sonner";import{Fragment as xs,jsx as Z,jsxs as ie}from"react/jsx-runtime";var Sg={"Database Query":"database"},Ig=/[^a-zA-Z0-9\s]/g,Pg=/\s+/;function Eg(e){return e.data.type==="trigger"?e.data.config?.triggerType==="Schedule"?"vercel.json":`app/api${e.data.config?.webhookPath||"/webhook"}/route.ts`:`steps/${(e.data.config?.actionType||"action").toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"")}-step.ts`}function sa({overlayId:e}){let{push:t,closeAll:o}=re(),[n]=Yt(ke),[r]=Yt(_e),[s]=Yt(ne),[a]=Yt(ue),[d]=Yt(Nt),[i]=Yt(Ue),[l,c]=Yt(gt),u=wd(oo),f=or(ro),h=or(ao),T=or(so),b=or(kr),y=or(xr),[p,v]=Yt(to),[g,k]=Yt(Bt),[I,A]=Ag(!1),w=Tg(null),m=s.find(B=>B.id===n),S=a.find(B=>B.id===r),X=wd(ft);Cg(()=>{if(!(m&&u))return;let B=m.data.config?.actionType,Ae=m.data.config?.integrationId;if(!(B&&Ae))return;let Ye=fe(B)?.integration||Sg[B];if(!Ye)return;let $e=X.filter(Et=>Et.type===Ye);!$e.some(Et=>Et.id===Ae)&&$e.length>0&&f({id:m.id,data:{config:{...m.data.config,integrationId:$e[0].id}}})},[m,X,u,f]);let le=Tn((B,Ae)=>{m&&f({id:m.id,data:{config:{...m.data.config,[B]:Ae}}})},[m,f]),L=Tn(B=>{m&&f({id:m.id,data:{label:B}})},[m,f]),W=Tn(B=>{m&&f({id:m.id,data:{description:B}})},[m,f]),$=Tn(()=>{m&&f({id:m.id,data:{enabled:m.data.enabled===!1}})},[m,f]),P=Tn(()=>{t(Me,{title:"Delete Step",message:"Are you sure you want to delete this node? This action cannot be undone.",confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:()=>{m&&(h(m.id),o())}})},[m,h,o,t]),V=Tn(()=>{m&&(navigator.clipboard.writeText(yn(m,i)),An.success("Code copied to clipboard"))},[m]),J=async()=>{w.current&&(A(!0),await w.current(),A(!1))},F=()=>{t(Me,{title:"Delete All Runs",message:"Are you sure you want to delete all workflow runs? This action cannot be undone.",confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:async()=>{if(i)try{await q.workflow.deleteExecutions(i),b(),w.current&&await w.current(),An.success("All runs deleted")}catch(B){console.error("Failed to delete runs:",B),An.error("Failed to delete runs")}}})},K=m&&(m.data.type!=="trigger"||m.data.config?.triggerType!=="Manual")&&m.data.config?.actionType!=="Condition",C=()=>{if(!m)switch(g==="properties"||g==="code"||g==="runs"&&u?g:"properties"){case"properties":return"Workflow";case"code":return"Code";case"runs":return"Runs";default:return"Workflow"}switch(g){case"properties":return"Properties";case"code":return"Code";case"runs":return"Runs";default:return"Properties"}},z=async B=>{if(c(B),i)try{await q.workflow.update(i,{name:B})}catch(Ae){console.error("Failed to update workflow name:",Ae)}},N=()=>{t(Me,{title:"Clear Workflow",message:"Are you sure you want to clear all nodes and connections? This action cannot be undone.",confirmLabel:"Clear Workflow",confirmVariant:"destructive",destructive:!0,onConfirm:()=>{y()}})},R=()=>{t(Me,{title:"Delete Workflow",message:`Are you sure you want to delete "${l}"? This will permanently delete the workflow. This cannot be undone.`,confirmLabel:"Delete Workflow",confirmVariant:"destructive",destructive:!0,onConfirm:async()=>{if(i)try{await q.workflow.delete(i),o(),An.success("Workflow deleted successfully"),window.location.href="/"}catch(B){console.error("Failed to delete workflow:",B),An.error("Failed to delete workflow. Please try again.")}}})},G=(()=>{let Ae=`${l.replace(Ig,"").split(Pg).map((Ye,$e)=>$e===0?Ye.toLowerCase():Ye.charAt(0).toUpperCase()+Ye.slice(1).toLowerCase()).join("")}Workflow`,{code:Je}=dr(s,a,{functionName:Ae});return Je})(),oe=()=>{navigator.clipboard.writeText(G),An.success("Code copied to clipboard")},de=()=>{r&&t(Me,{title:"Delete Connection",message:"Are you sure you want to delete this connection? This action cannot be undone.",confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:()=>{T(r),o()}})};if(S&&!m)return ie("div",{className:"flex h-full max-h-[80vh] flex-col",children:[Z(cn,{overlayId:e,title:"Connection"}),ie("div",{className:"flex-1 space-y-4 overflow-y-auto px-6 pt-4 pb-6",children:[ie("div",{className:"space-y-2",children:[Z(M,{htmlFor:"edge-id",children:"Connection ID"}),Z(se,{disabled:!0,id:"edge-id",value:S.id})]}),ie("div",{className:"space-y-2",children:[Z(M,{htmlFor:"edge-source",children:"Source"}),Z(se,{disabled:!0,id:"edge-source",value:S.source})]}),ie("div",{className:"space-y-2",children:[Z(M,{htmlFor:"edge-target",children:"Target"}),Z(se,{disabled:!0,id:"edge-target",value:S.target})]}),u&&Z("div",{className:"pt-2",children:ie(D,{onClick:de,variant:"ghost",children:[Z(ws,{className:"mr-2 size-4"}),"Delete Connection"]})})]})]});if(!m){let B=g==="properties"||g==="code"||g==="runs"&&u?g:"properties";return ie("div",{className:"flex h-full max-h-[80vh] flex-col",children:[Z(cn,{overlayId:e,title:C()}),ie("div",{className:"flex-1 overflow-y-auto",children:[B==="properties"&&ie("div",{className:"space-y-4 px-6 pt-4 pb-6",children:[ie("div",{className:"space-y-2",children:[Z(M,{htmlFor:"workflow-name",children:"Workflow Name"}),Z(se,{disabled:!u,id:"workflow-name",onChange:Ae=>z(Ae.target.value),value:l})]}),ie("div",{className:"space-y-2",children:[Z(M,{htmlFor:"workflow-id",children:"Workflow ID"}),Z(se,{disabled:!0,id:"workflow-id",value:i||"Not saved"})]}),!u&&Z("div",{className:"rounded-lg border border-muted bg-muted/30 p-3",children:Z("p",{className:"text-muted-foreground text-sm",children:"You are viewing a public workflow. Duplicate it to make changes."})}),u&&ie("div",{className:"flex items-center gap-2 pt-2",children:[ie(D,{onClick:N,variant:"ghost",children:[Z(bs,{className:"mr-2 size-4"}),"Clear"]}),ie(D,{onClick:R,variant:"ghost",children:[Z(ws,{className:"mr-2 size-4"}),"Delete"]})]})]}),B==="code"&&ie("div",{className:"flex flex-col",children:[ie("div",{className:"flex shrink-0 items-center justify-between border-b bg-muted/30 px-3 py-2",children:[ie("div",{className:"flex items-center gap-2",children:[Z(kd,{className:"size-3.5 text-muted-foreground"}),Z("code",{className:"text-muted-foreground text-xs",children:"workflow.ts"})]}),ie(D,{className:"h-7 text-xs",onClick:oe,size:"sm",variant:"ghost",children:[Z(Nd,{className:"mr-1 size-3"}),"Copy"]})]}),Z("div",{className:"h-[400px]",children:Z(yt,{defaultLanguage:"typescript",height:"100%",options:{readOnly:!0,minimap:{enabled:!1},lineNumbers:"on",scrollBeyondLastLine:!1,fontSize:12,wordWrap:"on"},value:G})})]}),B==="runs"&&u&&ie("div",{className:"flex h-full flex-col",children:[ie("div",{className:"flex shrink-0 items-center gap-2 border-b px-4 py-2",children:[Z(D,{className:"text-muted-foreground",disabled:I,onClick:J,size:"icon",variant:"ghost",children:Z(Td,{className:`size-4 ${I?"animate-spin":""}`})}),Z(D,{className:"text-muted-foreground",onClick:F,size:"icon",variant:"ghost",children:Z(bs,{className:"size-4"})})]}),Z("div",{className:"flex-1 overflow-y-auto p-4",children:Z(hn,{isActive:B==="runs",onRefreshRef:w})})]})]}),ie("div",{className:"flex shrink-0 items-center justify-around border-t bg-background pb-safe",children:[ie("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${B==="properties"?"text-foreground":"text-muted-foreground"}`,onClick:()=>k("properties"),type:"button",children:[Z(Ad,{className:"size-5"}),"Workflow"]}),ie("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${B==="code"?"text-foreground":"text-muted-foreground"}`,onClick:()=>k("code"),type:"button",children:[Z(xd,{className:"size-5"}),"Code"]}),u&&ie("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${B==="runs"?"text-foreground":"text-muted-foreground"}`,onClick:()=>k("runs"),type:"button",children:[Z(Cd,{className:"size-5"}),"Runs"]})]})]})}return ie("div",{className:"flex h-full max-h-[80vh] flex-col",children:[Z(cn,{overlayId:e,title:C()}),ie("div",{className:"flex-1 overflow-y-auto",children:[g==="properties"&&ie("div",{className:"space-y-4 px-6 pt-4 pb-6",children:[m.data.type==="action"&&!m.data.config?.actionType&&u&&Z(Jr,{disabled:d,isNewlyCreated:m?.id===p,onSelectAction:B=>{le("actionType",B),m?.id===p&&v(null)}}),m.data.type==="trigger"&&Z(Yr,{config:m.data.config||{},disabled:d||!u,onUpdateConfig:le,workflowId:i??void 0}),m.data.type==="action"&&m.data.config?.actionType!==void 0&&Z(Hr,{config:m.data.config||{},disabled:d||!u,isOwner:u,onUpdateConfig:le}),(m.data.type!=="action"||m.data.config?.actionType!==void 0)&&ie(xs,{children:[ie("div",{className:"space-y-2",children:[Z(M,{htmlFor:"label",children:"Label"}),Z(se,{disabled:d||!u,id:"label",onChange:B=>L(B.target.value),value:m.data.label})]}),ie("div",{className:"space-y-2",children:[Z(M,{htmlFor:"description",children:"Description"}),Z(se,{disabled:d||!u,id:"description",onChange:B=>W(B.target.value),placeholder:"Optional description",value:m.data.description||""})]})]}),u&&ie("div",{className:"flex items-center gap-2 pt-2",children:[m.data.type==="action"&&Z(D,{className:"text-muted-foreground",onClick:$,size:"sm",variant:"ghost",children:m.data.enabled===!1?ie(xs,{children:[Z(kg,{className:"mr-2 size-4"}),"Disabled"]}):ie(xs,{children:[Z(Ng,{className:"mr-2 size-4"}),"Enabled"]})}),ie(D,{className:"text-muted-foreground",onClick:P,size:"sm",variant:"ghost",children:[Z(ws,{className:"mr-2 size-4"}),"Delete"]})]})]}),K&&ie("div",{className:`flex flex-col ${g==="code"?"":"invisible absolute -z-10"}`,children:[ie("div",{className:"flex shrink-0 items-center justify-between border-b bg-muted/30 px-3 py-2",children:[ie("div",{className:"flex items-center gap-2",children:[Z(kd,{className:"size-3.5 text-muted-foreground"}),Z("code",{className:"text-muted-foreground text-xs",children:Eg(m)})]}),ie(D,{className:"text-muted-foreground",onClick:V,size:"sm",variant:"ghost",children:[Z(Nd,{className:"mr-2 size-4"}),"Copy"]})]}),Z("div",{className:"h-[400px]",children:Z(yt,{height:"100%",language:m.data.type==="trigger"&&m.data.config?.triggerType==="Schedule"?"json":"typescript",options:{readOnly:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:13,lineNumbers:"on",folding:!1,wordWrap:"off",padding:{top:16,bottom:16}},value:yn(m,i)})})]}),g==="runs"&&u&&ie("div",{className:"flex h-full flex-col",children:[ie("div",{className:"flex shrink-0 items-center gap-2 border-b px-4 py-2",children:[ie(D,{className:"text-muted-foreground",disabled:I,onClick:J,size:"sm",variant:"ghost",children:[Z(Td,{className:`mr-2 size-4 ${I?"animate-spin":""}`}),"Refresh"]}),ie(D,{className:"text-muted-foreground",onClick:F,size:"sm",variant:"ghost",children:[Z(bs,{className:"mr-2 size-4"}),"Clear All"]})]}),Z("div",{className:"flex-1 overflow-y-auto p-4",children:Z(hn,{isActive:g==="runs",onRefreshRef:w})})]})]}),ie("div",{className:"flex shrink-0 items-center justify-around border-t bg-background pb-safe",children:[ie("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${g==="properties"?"text-foreground":"text-muted-foreground"}`,onClick:()=>k("properties"),type:"button",children:[Z(Ad,{className:"size-5"}),"Properties"]}),K&&ie("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${g==="code"?"text-foreground":"text-muted-foreground"}`,onClick:()=>k("code"),type:"button",children:[Z(xd,{className:"size-5"}),"Code"]}),u&&ie("button",{className:`flex flex-1 flex-col items-center gap-1 py-3 font-medium text-xs transition-colors ${g==="runs"?"text-foreground":"text-muted-foreground"}`,onClick:()=>k("runs"),type:"button",children:[Z(Cd,{className:"size-5"}),"Runs"]})]})]})}import{Download as Og,FlaskConical as Lg}from"lucide-react";import{cva as Dg}from"class-variance-authority";import{jsx as Ns}from"react/jsx-runtime";var Rg=Dg("relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",{variants:{variant:{default:"bg-card text-card-foreground",destructive:"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90"}},defaultVariants:{variant:"default"}});function Sd({className:e,variant:t,...o}){return Ns("div",{"data-slot":"alert",role:"alert",className:x(Rg({variant:t}),e),...o})}function Id({className:e,...t}){return Ns("div",{"data-slot":"alert-title",className:x("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight",e),...t})}function Pd({className:e,...t}){return Ns("div",{"data-slot":"alert-description",className:x("text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",e),...t})}import{jsx as Sn,jsxs as ia}from"react/jsx-runtime";function Ed({overlayId:e,onExport:t,isDownloading:o}){let{closeAll:n}=re();return ia(Oe,{actions:[{label:"Cancel",variant:"outline",onClick:n},{label:o?"Exporting...":"Export Project",onClick:()=>{n(),t()},loading:o}],overlayId:e,title:"Export Workflow as Code",children:[ia("div",{className:"flex items-center gap-2 text-muted-foreground",children:[Sn(Og,{className:"size-5"}),Sn("p",{className:"text-sm",children:"Export your workflow as a standalone Next.js project that you can run independently."})]}),Sn("p",{className:"mt-4 text-muted-foreground text-sm",children:"This will generate a complete Next.js project containing your workflow code. Once exported, you can run your workflow outside of the Workflow Builder, deploy it to Vercel, or integrate it into your existing applications."}),ia(Sd,{className:"mt-4",children:[Sn(Lg,{className:"size-4"}),Sn(Id,{children:"Experimental Feature"}),ia(Pd,{className:"block",children:["This feature is experimental and may have limitations. If you encounter any issues, please"," ",Sn("a",{className:"font-medium text-foreground underline underline-offset-4 hover:text-primary",href:"https://github.com/vercel-labs/workflow-builder-template/issues",rel:"noopener noreferrer",target:"_blank",children:"report them on GitHub"}),"."]})]})]})}import{Globe as Mg}from"lucide-react";import{jsx as ho,jsxs as la}from"react/jsx-runtime";function Dd({overlayId:e,onConfirm:t}){let{closeAll:o}=re();return la(Oe,{actions:[{label:"Cancel",variant:"outline",onClick:o},{label:"Make Public",onClick:()=>{o(),t()}}],overlayId:e,title:"Make Workflow Public?",children:[la("div",{className:"flex items-center gap-2 text-muted-foreground",children:[ho(Mg,{className:"size-5 shrink-0"}),ho("p",{className:"text-sm",children:"Making this workflow public means anyone with the link can:"})]}),la("ul",{className:"mt-3 list-inside list-disc space-y-1 text-muted-foreground text-sm",children:[ho("li",{children:"View the workflow structure and steps"}),ho("li",{children:"See action types and configurations"}),ho("li",{children:"Duplicate the workflow to their own account"})]}),ho("p",{className:"mt-4 font-medium text-foreground text-sm",children:"The following will remain private:"}),la("ul",{className:"mt-2 list-inside list-disc space-y-1 text-muted-foreground text-sm",children:[ho("li",{children:"Your integration credentials (API keys, tokens)"}),ho("li",{children:"Execution logs and run history"})]})]})}import{useAtomValue as Rd,useSetAtom as Fg}from"jotai";import{AlertTriangle as Wg}from"lucide-react";import{jsx as Ze,jsxs as pt}from"react/jsx-runtime";function Od({overlayId:e,issues:t,onGoToStep:o,onRunAnyway:n}){let{push:r,closeAll:s}=re(),a=Fg(Rt),d=Vt(),i=Rd(Kt),l=Rd(Ao),{brokenReferences:c,missingRequiredFields:u,missingIntegrations:f}=t,h=c.length+u.length+f.length,T=(v,g)=>{o(v,g),d?r(sa,{}):s()},b=v=>{r(co,{type:v,onSuccess:()=>{a(g=>g+1)}})},y=v=>{i?.integrationType===v&&l?.enabled&&l?.isVercelUser&&i?r(i.ConsentOverlay,{onConsent:()=>{a(I=>I+1)},onManualEntry:()=>b(v)}):b(v)};return pt(Oe,{actions:[{label:"Run Anyway",variant:"outline",onClick:()=>{s(),n()}},{label:"Cancel",onClick:s}],overlayId:e,title:`Workflow Issues (${h})`,children:[pt("div",{className:"flex items-center gap-2 text-orange-500",children:[Ze(Wg,{className:"size-5"}),Ze("p",{className:"text-muted-foreground text-sm",children:"This workflow has issues that may cause it to fail."})]}),pt("div",{className:"mt-4 space-y-4",children:[f.length>0&&pt("div",{className:"space-y-1",children:[Ze("h4",{className:"font-medium text-muted-foreground text-xs uppercase tracking-wide",children:"Missing Connections"}),f.map(v=>pt("div",{className:"flex items-center gap-3 py-1",children:[Ze(Mt,{className:"size-4 shrink-0",integration:v.integrationType}),pt("p",{className:"min-w-0 flex-1 text-sm",children:[Ze("span",{className:"font-medium",children:v.integrationLabel}),pt("span",{className:"text-muted-foreground",children:[" \u2014 ",v.nodeNames.length>3?`${v.nodeNames.slice(0,3).join(", ")} +${v.nodeNames.length-3} more`:v.nodeNames.join(", ")]})]}),Ze(D,{className:"shrink-0",onClick:()=>y(v.integrationType),size:"sm",variant:"outline",children:"Add"})]},v.integrationType))]}),c.length>0&&pt("div",{className:"space-y-2",children:[Ze("h4",{className:"font-medium text-muted-foreground text-xs uppercase tracking-wide",children:"Broken References"}),c.map(v=>pt("div",{children:[Ze("p",{className:"font-medium text-sm",children:v.nodeLabel}),Ze("div",{className:"mt-1 space-y-0.5",children:v.brokenReferences.map((g,k)=>pt("div",{className:"flex items-center gap-3 py-0.5 pl-3",children:[pt("p",{className:"min-w-0 flex-1 text-muted-foreground text-sm",children:[Ze("span",{className:"font-mono",children:g.displayText})," in ",g.fieldLabel]}),Ze(D,{className:"shrink-0",onClick:()=>T(v.nodeId,g.fieldKey),size:"sm",variant:"outline",children:"Fix"})]},`${v.nodeId}-${g.fieldKey}-${k}`))})]},v.nodeId))]}),u.length>0&&pt("div",{className:"space-y-2",children:[Ze("h4",{className:"font-medium text-muted-foreground text-xs uppercase tracking-wide",children:"Missing Required Fields"}),u.map(v=>pt("div",{children:[Ze("p",{className:"font-medium text-sm",children:v.nodeLabel}),Ze("div",{className:"mt-1 space-y-0.5",children:v.missingFields.map(g=>pt("div",{className:"flex items-center gap-3 py-0.5 pl-3",children:[Ze("p",{className:"min-w-0 flex-1 text-muted-foreground text-sm",children:g.fieldLabel}),Ze(D,{className:"shrink-0",onClick:()=>T(v.nodeId,g.fieldKey),size:"sm",variant:"outline",children:"Fix"})]},`${v.nodeId}-${g.fieldKey}`))})]},v.nodeId))]})]})]})}import{jsx as ks,jsxs as zg}from"react/jsx-runtime";function Ld({className:e}){return zg("svg",{className:e,fill:"none",height:"16",viewBox:"0 0 305 234",width:"16",xmlns:"http://www.w3.org/2000/svg",children:[ks("path",{className:"fill-foreground",d:"M125.776 0C120.929 1.64945e-05 117 3.9291 117 8.77539V61.4248C117 66.2711 120.929 70.2002 125.776 70.2002H160.875L161.253 70.2051C169.032 70.4023 175.301 76.6734 175.495 84.4531L175.5 84.8252V143.325C175.5 148.171 179.429 152.101 184.276 152.101H219.375L219.753 152.105C227.53 152.303 233.798 158.571 233.995 166.348L234 166.726V225.225C234 230.071 237.929 234 242.776 234H295.425C300.271 234 304.2 230.071 304.2 225.225V172.575C304.2 167.729 300.271 163.8 295.425 163.8H260.25C252.334 163.76 245.905 157.43 245.705 149.553L245.7 149.176V90.6758C245.7 85.8295 241.771 81.9004 236.925 81.9004H201.825C193.874 81.9004 187.405 75.5551 187.205 67.6523L187.2 67.2754V8.77539C187.2 3.9291 183.271 1.64951e-05 178.425 0H125.776Z"}),ks("path",{className:"fill-foreground",d:"M67.2755 81.9004C62.4293 81.9004 58.5002 85.8295 58.5002 90.6758V143.325C58.5004 148.171 62.4294 152.101 67.2755 152.101H102.375L102.753 152.105C110.53 152.303 116.798 158.571 116.995 166.348L117 166.726V225.225C117 230.071 120.929 234 125.776 234H178.425C183.271 234 187.2 230.071 187.2 225.225V172.575C187.2 167.729 183.271 163.8 178.425 163.8H143.25C135.334 163.76 128.905 157.43 128.705 149.553L128.7 149.176V90.6758C128.7 85.8295 124.771 81.9004 119.925 81.9004H67.2755Z"}),ks("path",{className:"fill-foreground",d:"M8.77454 163.8C3.92844 163.8 0.00012207 167.729 0.00012207 172.575V225.225C0.00012207 230.071 3.92844 234 8.77454 234H61.4249C66.2712 234 70.2003 230.071 70.2003 225.225V172.575C70.2003 167.729 66.2712 163.8 61.4249 163.8H8.77454Z"})]})}import{Key as ny,LogOut as ry,Moon as ay,Plug as sy,Settings as iy,Sun as ly}from"lucide-react";import{useTheme as dy}from"next-themes";import cy from"next/link";import{useEffect as jd,useState as Jd}from"react";import{Copy as Bg,Key as Vg,Trash2 as Gg}from"lucide-react";import{useCallback as Hg,useEffect as $g,useState as In}from"react";import{toast as Pn}from"sonner";import{jsx as Ve,jsxs as Pt}from"react/jsx-runtime";function _g({overlayId:e,onCreated:t}){let{pop:o}=re(),[n,r]=In(""),[s,a]=In(!1);return Pt(Oe,{actions:[{label:"Create",onClick:async()=>{a(!0);try{let i=await fetch("/api/api-keys",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:n||null})});if(!i.ok){let c=await i.json();throw new Error(c.error||"Failed to create API key")}let l=await i.json();t(l),Pn.success("API key created successfully"),o()}catch(i){console.error("Failed to create API key:",i),Pn.error(i instanceof Error?i.message:"Failed to create API key")}finally{a(!1)}},loading:s}],overlayId:e,title:"Create API Key",children:[Ve("p",{className:"mb-4 text-muted-foreground text-sm",children:"Create a new API key for webhook authentication"}),Pt("div",{className:"space-y-2",children:[Ve(M,{htmlFor:"key-name",children:"Label (optional)"}),Ve(se,{id:"key-name",onChange:i=>r(i.target.value),placeholder:"e.g., Production, Testing",value:n})]})]})}function Md({overlayId:e}){let{push:t,closeAll:o}=re(),[n,r]=In(!0),[s,a]=In([]),[d,i]=In(null),[l,c]=In(null),u=Hg(async()=>{r(!0);try{let p=await fetch("/api/api-keys");if(!p.ok)throw new Error("Failed to load API keys");let v=await p.json();a(v)}catch(p){console.error("Failed to load API keys:",p),Pn.error("Failed to load API keys")}finally{r(!1)}},[]);$g(()=>{u()},[u]);let f=p=>{i(p.key??null),a(v=>[p,...v])},h=async p=>{c(p);try{if(!(await fetch(`/api/api-keys/${p}`,{method:"DELETE"})).ok)throw new Error("Failed to delete API key");a(g=>g.filter(k=>k.id!==p)),Pn.success("API key deleted")}catch(v){console.error("Failed to delete API key:",v),Pn.error("Failed to delete API key")}finally{c(null)}},T=p=>{t(Me,{title:"Delete API Key",message:"Are you sure you want to delete this API key? Any webhooks using this key will stop working immediately.",confirmLabel:"Delete",confirmVariant:"destructive",destructive:!0,onConfirm:()=>h(p)})},b=p=>{navigator.clipboard.writeText(p),Pn.success("Copied to clipboard")},y=p=>new Date(p).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"});return Pt(Oe,{actions:[{label:"New API Key",variant:"outline",onClick:()=>t(_g,{onCreated:f})},{label:"Done",onClick:o}],overlayId:e,title:"API Keys",children:[Ve("p",{className:"-mt-2 mb-4 text-muted-foreground text-sm",children:"Manage API keys for webhook authentication"}),n?Ve("div",{className:"flex items-center justify-center py-8",children:Ve(Tt,{})}):Pt("div",{className:"space-y-4",children:[d&&Pt("div",{className:"rounded-md border border-yellow-500/50 bg-yellow-500/10 p-3",children:[Ve("p",{className:"mb-2 font-medium text-sm text-yellow-600 dark:text-yellow-400",children:"Copy your API key now. You won't be able to see it again!"}),Pt("div",{className:"flex items-center gap-2",children:[Ve("code",{className:"flex-1 rounded bg-muted px-2 py-1 font-mono text-xs",children:d}),Ve(D,{onClick:()=>b(d),size:"sm",variant:"outline",children:Ve(Bg,{className:"size-4"})})]}),Ve(D,{className:"mt-2",onClick:()=>i(null),size:"sm",variant:"ghost",children:"Dismiss"})]}),s.length===0?Pt("div",{className:"py-8 text-center text-muted-foreground text-sm",children:[Ve(Vg,{className:"mx-auto mb-2 size-8 opacity-50"}),Ve("p",{children:"No API keys yet"}),Ve("p",{className:"text-xs",children:"Create an API key to authenticate webhook requests"})]}):Ve("div",{className:"space-y-2",children:s.map(p=>Pt("div",{className:"flex items-center justify-between rounded-md border p-3",children:[Pt("div",{className:"min-w-0 flex-1",children:[Pt("div",{className:"flex items-center gap-2",children:[Pt("code",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-xs",children:[p.keyPrefix,"..."]}),p.name&&Ve("span",{className:"truncate text-sm",children:p.name})]}),Pt("p",{className:"mt-1 text-muted-foreground text-xs",children:["Created ",y(p.createdAt),p.lastUsedAt&&` \xB7 Last used ${y(p.lastUsedAt)}`]})]}),Ve(D,{disabled:l===p.id,onClick:()=>T(p.id),size:"sm",variant:"ghost",children:l===p.id?Ve(Tt,{className:"size-4"}):Ve(Gg,{className:"size-4 text-destructive"})})]},p.id))})]})]})}import{useSetAtom as Xg}from"jotai";import{Search as Qg}from"lucide-react";import{useCallback as As,useEffect as Zg,useRef as ey,useState as Wd}from"react";import{Pencil as Ug,Trash2 as Kg}from"lucide-react";import{useCallback as qg,useEffect as jg,useMemo as Jg,useState as Cs}from"react";import{toast as da}from"sonner";import{jsx as He,jsxs as Ts}from"react/jsx-runtime";var Yg={database:"Database"};function Fd({onIntegrationChange:e,filter:t=""}){let{push:o}=re(),[n,r]=Cs([]),[s,a]=Cs(!0),[d,i]=Cs(null),l=qg(async()=>{try{a(!0);let b=await q.integration.getAll();r(b)}catch(b){console.error("Failed to load integrations:",b),da.error("Failed to load integrations")}finally{a(!1)}},[]);jg(()=>{l()},[l]);let c=Jg(()=>{let b=eo(),y=t.toLowerCase();return n.map(p=>({...p,label:b[p.type]||Yg[p.type]||p.type})).filter(p=>t?p.label.toLowerCase().includes(y)||p.name.toLowerCase().includes(y)||p.type.toLowerCase().includes(y):!0).sort((p,v)=>{let g=p.label.localeCompare(v.label);return g!==0?g:p.name.localeCompare(v.name)})},[n,t]),u=b=>{o(Br,{integration:b,onSuccess:()=>{l(),e?.()},onDelete:()=>{l(),e?.()}})},f=b=>{o(Ha,{integration:b,onSuccess:()=>{l(),e?.()}})},h=async b=>{try{i(b);let y=await q.integration.testConnection(b);y.status==="success"?da.success(y.message||"Connection successful"):da.error(y.message||"Connection test failed")}catch(y){console.error("Connection test failed:",y),da.error(y instanceof Error?y.message:"Connection test failed")}finally{i(null)}};return s?He("div",{className:"flex items-center justify-center py-8",children:He(Tt,{})}):He("div",{className:"space-y-1",children:n.length===0?He("div",{className:"py-8 text-center",children:He("p",{className:"text-muted-foreground text-sm",children:"No connections configured yet"})}):c.length===0?He("div",{className:"py-8 text-center",children:He("p",{className:"text-muted-foreground text-sm",children:"No connections match your filter"})}):He("div",{className:"space-y-1",children:c.map(b=>Ts("div",{className:"flex items-center justify-between rounded-md px-2 py-1.5",children:[Ts("div",{className:"flex items-center gap-2",children:[He(Mt,{className:"size-4",integration:b.type==="ai-gateway"?"vercel":b.type}),He("span",{className:"font-medium text-sm",children:b.label}),He("span",{className:"text-muted-foreground text-sm",children:b.name})]}),Ts("div",{className:"flex items-center gap-1",children:[He(D,{className:"h-7 px-2",disabled:d===b.id,onClick:()=>h(b.id),size:"sm",variant:"outline",children:d===b.id?He(Tt,{className:"size-3"}):He("span",{className:"text-xs",children:"Test"})}),He(D,{className:"size-7",onClick:()=>u(b),size:"icon",variant:"outline",children:He(Ug,{className:"size-3"})}),He(D,{className:"size-7",onClick:()=>f(b),size:"icon",variant:"outline",children:He(Kg,{className:"size-3"})})]})]},b.id))})})}import{jsx as Wo,jsxs as Ss}from"react/jsx-runtime";function zd({overlayId:e}){let{push:t,closeAll:o}=re(),[n,r]=Wd(!0),[s,a]=Wd(""),d=Xg(Rt),i=ey(!1),l=As(async()=>{r(!0);try{await new Promise(h=>setTimeout(h,0))}finally{r(!1)}},[]);Zg(()=>{l(),i.current=!1,a("")},[l]);let c=As(()=>{i.current&&d(h=>h+1),o()},[o,d]),u=As(()=>{i.current=!0},[]);return Ss(Oe,{actions:[{label:"Add Connection",variant:"outline",onClick:()=>{t(Ji,{onSuccess:u})}},{label:"Done",onClick:c}],overlayId:e,title:"Connections",children:[Wo("p",{className:"-mt-2 mb-4 text-muted-foreground text-sm",children:"Manage API keys and credentials used by your workflows"}),n?Wo("div",{className:"flex items-center justify-center py-8",children:Wo(Tt,{})}):Ss("div",{className:"space-y-4",children:[Ss("div",{className:"relative",children:[Wo(Qg,{className:"absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted-foreground"}),Wo(se,{className:"pl-9",onChange:h=>a(h.target.value),placeholder:"Filter connections...",value:s})]}),Wo("div",{className:"max-h-[300px] overflow-y-auto",children:Wo(Fd,{filter:s,onIntegrationChange:u})})]})]})}import{useCallback as Hd,useEffect as ty,useState as ma}from"react";import{toast as $d}from"sonner";import{jsx as ua}from"react/jsx-runtime";function ca({className:e,...t}){return ua("div",{"data-slot":"card",className:x("text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",e),...t})}function Bd({className:e,...t}){return ua("div",{"data-slot":"card-title",className:x("leading-none font-semibold",e),...t})}function Vd({className:e,...t}){return ua("div",{"data-slot":"card-description",className:x("text-muted-foreground text-sm",e),...t})}function Is({className:e,...t}){return ua("div",{"data-slot":"card-content",className:x("px-6",e),...t})}import{jsx as nr,jsxs as Ps}from"react/jsx-runtime";function Gd({accountName:e,accountEmail:t,onNameChange:o,onEmailChange:n}){return nr(ca,{className:"border-0 py-0 shadow-none",children:Ps(Is,{className:"space-y-4 p-0",children:[Ps("div",{className:"space-y-2",children:[nr(M,{className:"ml-1",htmlFor:"accountName",children:"Name"}),nr(se,{id:"accountName",onChange:r=>o(r.target.value),placeholder:"Your name",value:e})]}),Ps("div",{className:"space-y-2",children:[nr(M,{className:"ml-1",htmlFor:"accountEmail",children:"Email"}),nr(se,{id:"accountEmail",onChange:r=>n(r.target.value),placeholder:"your.email@example.com",type:"email",value:t})]})]})})}import{jsx as pa,jsxs as oy}from"react/jsx-runtime";function _d({overlayId:e}){let{closeAll:t}=re(),[o,n]=ma(!0),[r,s]=ma(!1),[a,d]=ma(""),[i,l]=ma(""),c=Hd(async()=>{try{let h=await q.user.get();d(h.name||""),l(h.email||"")}catch(h){console.error("Failed to load account:",h)}},[]),u=Hd(async()=>{n(!0);try{await c()}finally{n(!1)}},[c]);return ty(()=>{u()},[u]),oy(Oe,{actions:[{label:"Cancel",variant:"outline",onClick:t},{label:"Save",onClick:async()=>{try{s(!0),await q.user.update({name:a,email:i}),await c(),$d.success("Settings saved"),t()}catch(h){console.error("Failed to save account:",h),$d.error("Failed to save settings")}finally{s(!1)}},loading:r,disabled:o}],overlayId:e,title:"Settings",children:[pa("p",{className:"-mt-2 mb-4 text-muted-foreground text-sm",children:"Update your personal information"}),o?pa("div",{className:"flex items-center justify-center py-8",children:pa(Tt,{})}):pa(Gd,{accountEmail:i,accountName:a,onEmailChange:l,onNameChange:d})]})}import{Avatar as Es}from"radix-ui";import{jsx as Ds}from"react/jsx-runtime";function Ud({className:e,...t}){return Ds(Es.Root,{"data-slot":"avatar",className:x("relative flex size-8 shrink-0 overflow-hidden rounded-full",e),...t})}function Kd({className:e,...t}){return Ds(Es.Image,{"data-slot":"avatar-image",className:x("aspect-square size-full",e),...t})}function qd({className:e,...t}){return Ds(Es.Fallback,{"data-slot":"avatar-fallback",className:x("bg-muted flex size-full items-center justify-center rounded-full",e),...t})}import{jsx as Ne,jsxs as Ft}from"react/jsx-runtime";var Yd=()=>{let{data:e,isPending:t}=bn(),{theme:o,setTheme:n}=dy(),{open:r}=re(),[s,a]=Jd(null),[d,i]=Jd(!1);jd(()=>{i(!0)},[]),jd(()=>{e?.user&&!e.user.name?.startsWith("Anonymous")&&q.user.get().then(h=>a(h.providerId)).catch(()=>a(null))},[e?.user]);let l=async()=>{await Gl()},c=s==="vercel"||s==="github"||s==="google",u=()=>e?.user?.name?e.user.name.split(" ").map(h=>h[0]).join("").toUpperCase().slice(0,2):e?.user?.email?e.user.email.slice(0,2).toUpperCase():"U";return t||!d?Ne("div",{className:"h-9 w-9"}):!e?.user||e.user.name==="Anonymous"||e.user.email?.startsWith("temp-")?Ne("div",{className:"flex items-center gap-2",children:Ne(D,{className:"h-9 disabled:opacity-100 disabled:[&>*]:text-muted-foreground",size:"sm",variant:"default",asChild:!0,children:Ne(cy,{href:"/auth/sign-in",children:"Sign In"})})}):Ft(Eo,{children:[Ne(Do,{asChild:!0,children:Ne(D,{className:"relative h-9 w-9 rounded-full border p-0",variant:"ghost",children:Ft(Ud,{className:"h-9 w-9",children:[Ne(Kd,{alt:e?.user?.name||"",src:e?.user?.image||""}),Ne(qd,{children:u()})]})})}),Ft(Ro,{align:"end",className:"w-56",children:[Ne(gl,{children:Ft("div",{className:"flex flex-col space-y-1",children:[Ne("p",{className:"font-medium text-sm leading-none",children:e?.user?.name||"User"}),Ne("p",{className:"text-muted-foreground text-xs leading-none",children:e?.user?.email})]})}),Ne(Kn,{}),!c&&Ft(wt,{onClick:()=>r(_d),children:[Ne(iy,{className:"size-4"}),Ne("span",{children:"Settings"})]}),Ft(wt,{onClick:()=>r(zd),children:[Ne(sy,{className:"size-4"}),Ne("span",{children:"Connections"})]}),Ft(wt,{onClick:()=>r(Md),children:[Ne(ny,{className:"size-4"}),Ne("span",{children:"API Keys"})]}),Ft(yl,{children:[Ft(vl,{children:[Ne(ly,{className:"size-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0"}),Ne(ay,{className:"absolute size-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100"}),Ne("span",{children:"Theme"})]}),Ne(hl,{children:Ft(fl,{onValueChange:n,value:o,children:[Ne(jr,{value:"light",children:"Light"}),Ne(jr,{value:"dark",children:"Dark"}),Ne(jr,{value:"system",children:"System"})]})})]}),Ne(Kn,{}),Ft(wt,{onClick:l,children:[Ne(ry,{className:"size-4"}),Ne("span",{children:"Logout"})]})]})]})};import{Fragment as ga,jsx as j,jsxs as Pe}from"react/jsx-runtime";function nc(e,t,o){for(let n of e)t({id:n.id,data:{status:o}})}var Ny={"Database Query":"database"},ky={database:"Database"};function Cy(e){if(typeof e!="string")return[];let t=/\{\{@([^:]+):([^}]+)\}\}/g,o=e.matchAll(t);return Array.from(o).map(n=>({nodeId:n[1],displayText:n[2]}))}function sc(e,t=""){let o=[];for(let[n,r]of Object.entries(e)){let s=t?`${t}.${n}`:n;if(typeof r=="string"){let a=Cy(r);for(let d of a)o.push({field:s,...d})}else typeof r=="object"&&r!==null&&!Array.isArray(r)&&o.push(...sc(r,s))}return o}function Ty(e){let t=new Set(e.map(n=>n.id)),o=[];for(let n of e){if(n.data.enabled===!1)continue;let r=n.data.config;if(!r||typeof r!="object")continue;let a=sc(r).filter(d=>!t.has(d.nodeId));if(a.length>0){let d=r.actionType,i=d?fe(d):void 0,l=i?Na(i.configFields):[];o.push({nodeId:n.id,nodeLabel:n.data.label||i?.label||"Unnamed Step",brokenReferences:a.map(c=>{let u=l.find(f=>f.key===c.field);return{fieldKey:c.field,fieldLabel:u?.label||c.field,referencedNodeId:c.nodeId,displayText:c.displayText}})})}}return o}function Ay(e){return e==null||typeof e=="string"&&e.trim()===""}function Sy(e,t){return e.showWhen?t[e.showWhen.field]===e.showWhen.equals:!0}function Iy(e){if(e.data.enabled===!1)return null;let t=e.data.config,o=t?.actionType;if(!o)return null;let n=fe(o);if(!n)return null;let s=Na(n.configFields).filter(a=>a.required&&Sy(a,t||{})&&Ay(t?.[a.key])).map(a=>({fieldKey:a.key,fieldLabel:a.label}));return s.length===0?null:{nodeId:e.id,nodeLabel:e.data.label||n.label||"Unnamed Step",missingFields:s}}function Py(e){return e.map(Iy).filter(t=>t!==null)}function Ey(e,t){let o=new Set(t.map(a=>a.type)),n=new Set(t.map(a=>a.id)),r=new Map,s=eo();for(let a of e){if(a.data.enabled===!1)continue;let d=a.data.config?.actionType;if(!d)continue;let l=fe(d)?.integration||Ny[d];if(!l||!_o(l))continue;let c=a.data.config?.integrationId;if(!(c&&n.has(c))&&!o.has(l)){let f=r.get(l)||[],h=fe(d);f.push(a.data.label||h?.label||d),r.set(l,f)}}return Array.from(r.entries()).map(([a,d])=>({integrationType:a,integrationLabel:s[a]||ky[a]||a,nodeNames:d}))}async function Dy({workflowId:e,nodes:t,updateNodeData:o,pollingIntervalRef:n,setIsExecuting:r,setSelectedExecutionId:s}){nc(t,o,"idle");for(let a of t)a.data.type==="trigger"&&o({id:a.id,data:{status:"running"}});try{let a=await fetch(`/api/workflow/${e}/execute`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({input:{}})});if(!a.ok)throw new Error("Failed to execute workflow");let d=await a.json();s(d.executionId);let i=setInterval(async()=>{try{let l=await q.workflow.getExecutionStatus(d.executionId);for(let c of l.nodeStatuses)o({id:c.nodeId,data:{status:c.status}});l.status!=="running"&&(n.current&&(clearInterval(n.current),n.current=null),r(!1))}catch(l){console.error("Failed to poll execution status:",l)}},500);n.current=i}catch(a){console.error("Failed to execute workflow:",a),dt.error(a instanceof Error?a.message:"Failed to execute workflow"),nc(t,o,"error"),r(!1)}}function Ry({currentWorkflowId:e,nodes:t,edges:o,updateNodeData:n,isExecuting:r,setIsExecuting:s,setIsSaving:a,setHasUnsavedChanges:d,setActiveTab:i,setNodes:l,setEdges:c,setSelectedNodeId:u,setSelectedExecutionId:f,userIntegrations:h}){let{open:T}=re(),b=xy(null);Os(()=>()=>{b.current&&clearInterval(b.current)},[]);let y=async()=>{if(e){a(!0);try{await q.workflow.update(e,{nodes:t,edges:o}),d(!1)}catch(k){console.error("Failed to save workflow:",k),dt.error("Failed to save workflow. Please try again.")}finally{a(!1)}}},p=async()=>{if(!e){dt.error("Please save the workflow before executing");return}i("runs"),l(t.map(k=>({...k,selected:!1}))),c(o.map(k=>({...k,selected:!1}))),u(null),s(!0),await Dy({workflowId:e,nodes:t,updateNodeData:n,pollingIntervalRef:b,setIsExecuting:s,setSelectedExecutionId:f})},v=(k,I)=>{u(k),i("properties"),I&&setTimeout(()=>{let A=document.getElementById(I);A&&(A.focus(),A.scrollIntoView({behavior:"smooth",block:"center"}))},100)};return{handleSave:y,handleExecute:async()=>{if(r)return;let k=Ty(t),I=Py(t),A=Ey(t,h);if(k.length>0||I.length>0||A.length>0){T(Od,{issues:{brokenReferences:k,missingRequiredFields:I,missingIntegrations:A},onGoToStep:v,onRunAnyway:p});return}await p()}}}function Oy(){let[e,t]=et(ne),[o,n]=et(ue),[r,s]=et(ti),[a]=et(Nt),d=Ut(xr),i=Ut(ro),[l]=et(Ue),[c,u]=et(gt),[f,h]=et(pr),T=Xd(oo),b=wy(),[y,p]=et(Nr),[v,g]=et(nt),k=Ut(ci),I=Ut(ui),A=Ut(Jo),[w]=et(mi),[m]=et(pi),{data:S}=bn(),X=Ut(Bt),le=Ut(ke),L=Ut(no),W=Xd(ft),[$,P]=et(wr),[V,J]=Rs(!1),[F,K]=Rs(!1),[C,z]=Rs([]);return Os(()=>{(async()=>{try{let R=await q.workflow.getAll();z(R)}catch(R){console.error("Failed to load workflows:",R)}})()},[]),{nodes:e,edges:o,isExecuting:r,setIsExecuting:s,isGenerating:a,clearWorkflow:d,updateNodeData:i,currentWorkflowId:l,workflowName:c,setCurrentWorkflowName:u,workflowVisibility:f,setWorkflowVisibility:h,isOwner:T,router:b,isSaving:y,setIsSaving:p,hasUnsavedChanges:v,setHasUnsavedChanges:g,undo:k,redo:I,addNode:A,canUndo:w,canRedo:m,session:S,isDownloading:V,setIsDownloading:J,isDuplicating:F,setIsDuplicating:K,allWorkflows:C,setAllWorkflows:z,setActiveTab:X,setNodes:t,setEdges:n,setSelectedNodeId:le,setSelectedExecutionId:L,userIntegrations:W,triggerExecute:$,setTriggerExecute:P}}function Ly(e){let{open:t}=re(),{currentWorkflowId:o,workflowName:n,nodes:r,edges:s,updateNodeData:a,isExecuting:d,setIsExecuting:i,setIsSaving:l,setHasUnsavedChanges:c,clearWorkflow:u,setWorkflowVisibility:f,setAllWorkflows:h,setIsDownloading:T,setIsDuplicating:b,setActiveTab:y,setNodes:p,setEdges:v,setSelectedNodeId:g,setSelectedExecutionId:k,userIntegrations:I,triggerExecute:A,setTriggerExecute:w,router:m,session:S}=e,{handleSave:X,handleExecute:le}=Ry({currentWorkflowId:o,nodes:r,edges:s,updateNodeData:a,isExecuting:d,setIsExecuting:i,setIsSaving:l,setHasUnsavedChanges:c,setActiveTab:y,setNodes:p,setEdges:v,setSelectedNodeId:g,setSelectedExecutionId:k,userIntegrations:I});return Os(()=>{A&&(w(!1),le())},[A,w,le]),{handleSave:X,handleExecute:le,handleClearWorkflow:()=>{t(Me,{title:"Clear Workflow",message:"Are you sure you want to clear all nodes and connections? This action cannot be undone.",confirmLabel:"Clear Workflow",confirmVariant:"destructive",destructive:!0,onConfirm:()=>{u()}})},handleDeleteWorkflow:()=>{t(Me,{title:"Delete Workflow",message:`Are you sure you want to delete "${n}"? This will permanently delete the workflow. This cannot be undone.`,confirmLabel:"Delete Workflow",confirmVariant:"destructive",destructive:!0,onConfirm:async()=>{if(o)try{await q.workflow.delete(o),dt.success("Workflow deleted successfully"),window.location.href="/"}catch(F){console.error("Failed to delete workflow:",F),dt.error("Failed to delete workflow. Please try again.")}}})},handleDownload:async()=>{if(!o){dt.error("Please save the workflow before downloading");return}T(!0),dt.info("Preparing workflow files for download...");try{let F=await q.workflow.download(o);if(!F.success)throw new Error(F.error||"Failed to prepare download");if(!F.files)throw new Error("No files to download");let K=(await import("jszip")).default,C=new K;for(let[G,oe]of Object.entries(F.files))C.file(G,oe);let z=await C.generateAsync({type:"blob"}),N=URL.createObjectURL(z),R=document.createElement("a");R.href=N,R.download=`${n.toLowerCase().replace(/[^a-z0-9]/g,"-")}-workflow.zip`,document.body.appendChild(R),R.click(),document.body.removeChild(R),URL.revokeObjectURL(N),dt.success("Workflow downloaded successfully!")}catch(F){dt.error(F instanceof Error?F.message:"Failed to download workflow")}finally{T(!1)}},loadWorkflows:async()=>{try{let F=await q.workflow.getAll();h(F)}catch(F){console.error("Failed to load workflows:",F)}},handleToggleVisibility:async F=>{if(o){if(F==="public"){t(Dd,{onConfirm:async()=>{try{await q.workflow.update(o,{visibility:"public"}),f("public"),dt.success("Workflow is now public")}catch(K){console.error("Failed to update visibility:",K),dt.error("Failed to update visibility. Please try again.")}}});return}try{await q.workflow.update(o,{visibility:F}),f(F),dt.success("Workflow is now private")}catch(K){console.error("Failed to update visibility:",K),dt.error("Failed to update visibility. Please try again.")}}},handleDuplicate:async()=>{if(o){b(!0);try{S?.user||(await Mo.signIn.anonymous(),await new Promise(K=>setTimeout(K,100)));let F=await q.workflow.duplicate(o);dt.success("Workflow duplicated successfully"),m.push(`/workflows/${F.id}`)}catch(F){console.error("Failed to duplicate workflow:",F),dt.error("Failed to duplicate workflow. Please try again.")}finally{b(!1)}}}}}function My({workflowId:e,state:t,actions:o}){let{open:n,push:r}=re(),[s]=et(ke),[a]=et(_e),[d]=et(ne),[i]=et(ue),l=Ut(ao),c=Ut(so),{screenToFlowPosition:u}=uy(),f=d.find(p=>p.id===s),h=i.find(p=>p.id===a),T=f||h;if(e&&!t.isOwner||!e)return null;let b=()=>{let v=!!s?"Node":"Connection";r(Me,{title:`Delete ${v}`,message:`Are you sure you want to delete this ${v.toLowerCase()}? This action cannot be undone.`,confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:()=>{s?l(s):a&&c(a)}})},y=()=>{let p=document.querySelector(".react-flow");if(!p)return;let v=p.getBoundingClientRect(),g=v.left+v.width/2,k=v.top+v.height/2,I=u({x:g,y:k}),A=192,w=192;I.x-=A/2,I.y-=w/2;let m=20,S=20,X={...I},le=!0,L=0,W=20;for(;le&&L<W;)le=t.nodes.some(P=>{let V=Math.abs(P.position.x-X.x),J=Math.abs(P.position.y-X.y);return V<S&&J<S}),le&&(X.x+=m,X.y+=m,L+=1);let $={id:by(),type:"action",position:X,data:{label:"",description:"",type:"action",config:{},status:"idle"}};t.addNode($),t.setSelectedNodeId($.id),t.setActiveTab("properties")};return Pe(ga,{children:[j(_t,{className:"flex lg:hidden",orientation:"vertical",children:j(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:t.isGenerating,onClick:y,size:"icon",title:"Add Step",variant:"secondary",children:j(ec,{className:"size-4"})})}),Pe(_t,{className:"flex lg:hidden",orientation:"vertical",children:[j(D,{className:"border hover:bg-black/5 dark:hover:bg-white/5",onClick:()=>n(sa,{}),size:"icon",title:"Configuration",variant:"secondary",children:j(vy,{className:"size-4"})}),T&&j(D,{className:"border hover:bg-black/5 dark:hover:bg-white/5",onClick:b,size:"icon",title:"Delete",variant:"secondary",children:j(hy,{className:"size-4"})})]}),j(_t,{className:"hidden lg:flex",orientation:"horizontal",children:j(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:t.isGenerating,onClick:y,size:"icon",title:"Add Step",variant:"secondary",children:j(ec,{className:"size-4"})})}),Pe(_t,{className:"flex lg:hidden",orientation:"vertical",children:[j(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:!t.canUndo||t.isGenerating,onClick:()=>t.undo(),size:"icon",title:"Undo",variant:"secondary",children:j(oc,{className:"size-4"})}),j(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:!t.canRedo||t.isGenerating,onClick:()=>t.redo(),size:"icon",title:"Redo",variant:"secondary",children:j(tc,{className:"size-4"})})]}),Pe(_t,{className:"hidden lg:flex",orientation:"horizontal",children:[j(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:!t.canUndo||t.isGenerating,onClick:()=>t.undo(),size:"icon",title:"Undo",variant:"secondary",children:j(oc,{className:"size-4"})}),j(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:!t.canRedo||t.isGenerating,onClick:()=>t.redo(),size:"icon",title:"Redo",variant:"secondary",children:j(tc,{className:"size-4"})})]}),Pe(_t,{className:"flex lg:hidden",orientation:"vertical",children:[j(rc,{handleSave:o.handleSave,state:t}),j(ac,{actions:o,state:t})]}),Pe(_t,{className:"hidden lg:flex",orientation:"horizontal",children:[j(rc,{handleSave:o.handleSave,state:t}),j(ac,{actions:o,state:t})]}),j(Fy,{actions:o,state:t}),j(Wy,{actions:o,state:t})]})}function rc({state:e,handleSave:t}){return Pe(D,{className:"relative border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:!e.currentWorkflowId||e.isGenerating||e.isSaving,onClick:t,size:"icon",title:e.isSaving?"Saving...":"Save workflow",variant:"secondary",children:[e.isSaving?j(ya,{className:"size-4 animate-spin"}):j(yy,{className:"size-4"}),e.hasUnsavedChanges&&!e.isSaving&&j("div",{className:"absolute top-1.5 right-1.5 size-2 rounded-full bg-primary"})]})}function ac({state:e,actions:t}){let{open:o}=re(),n=()=>{o(Ed,{onExport:t.handleDownload,isDownloading:e.isDownloading})};return j(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:e.isDownloading||e.nodes.length===0||e.isGenerating||!e.currentWorkflowId,onClick:n,size:"icon",title:e.isDownloading?"Preparing download...":"Export workflow as code",variant:"secondary",children:e.isDownloading?j(ya,{className:"size-4 animate-spin"}):j(fy,{className:"size-4"})})}function Fy({state:e,actions:t}){let o=e.workflowVisibility==="public";return Pe(Eo,{children:[j(Do,{asChild:!0,children:j(D,{className:"border hover:bg-black/5 dark:hover:bg-white/5",disabled:!e.currentWorkflowId||e.isGenerating,size:"icon",title:o?"Public workflow":"Private workflow",variant:"secondary",children:o?j(Qd,{className:"size-4"}):j(Zd,{className:"size-4"})})}),Pe(Ro,{align:"end",children:[Pe(wt,{className:"flex items-center gap-2",onClick:()=>t.handleToggleVisibility("private"),children:[j(Zd,{className:"size-4"}),"Private",!o&&j(fa,{className:"ml-auto size-4"})]}),Pe(wt,{className:"flex items-center gap-2",onClick:()=>t.handleToggleVisibility("public"),children:[j(Qd,{className:"size-4"}),"Public",o&&j(fa,{className:"ml-auto size-4"})]})]})]})}function Wy({state:e,actions:t}){return j(D,{className:"border hover:bg-black/5 disabled:opacity-100 dark:hover:bg-white/5 disabled:[&>svg]:text-muted-foreground",disabled:e.isExecuting||e.nodes.length===0||e.isGenerating,onClick:()=>t.handleExecute(),size:"icon",title:"Run Workflow",variant:"secondary",children:e.isExecuting?j(ya,{className:"size-4 animate-spin"}):j(gy,{className:"size-4"})})}function zy({isDuplicating:e,onDuplicate:t}){return Pe(D,{className:"h-9 border hover:bg-black/5 dark:hover:bg-white/5",disabled:e,onClick:t,size:"sm",title:"Duplicate to your workflows",variant:"secondary",children:[e?j(ya,{className:"mr-2 size-4 animate-spin"}):j(py,{className:"mr-2 size-4"}),"Duplicate"]})}function By({workflowId:e,state:t,actions:o}){return Pe("div",{className:"flex flex-col gap-1",children:[j("div",{className:"flex h-9 max-w-[160px] items-center overflow-hidden rounded-md border bg-secondary text-secondary-foreground sm:max-w-none",children:Pe(Eo,{onOpenChange:n=>n&&o.loadWorkflows(),children:[Pe(Do,{className:"flex h-full cursor-pointer items-center gap-2 px-3 font-medium text-sm transition-all hover:bg-black/5 dark:hover:bg-white/5",children:[j(Ld,{className:"size-4 shrink-0"}),j("p",{className:"truncate font-medium text-sm",children:e?t.workflowName:Pe(ga,{children:[j("span",{className:"sm:hidden",children:"New"}),j("span",{className:"hidden sm:inline",children:"New Workflow"})]})}),j(my,{className:"size-3 shrink-0 opacity-50"})]}),Pe(Ro,{align:"start",className:"w-64",children:[j(wt,{asChild:!0,className:"flex items-center justify-between",children:Pe("a",{href:"/",children:["New Workflow"," ",!e&&j(fa,{className:"size-4 shrink-0"})]})}),j(Kn,{}),t.allWorkflows.length===0?j(wt,{disabled:!0,children:"No workflows found"}):t.allWorkflows.filter(n=>n.name!=="__current__").map(n=>Pe(wt,{className:"flex items-center justify-between",onClick:()=>t.router.push(`/workflows/${n.id}`),children:[j("span",{className:"truncate",children:n.name}),n.id===t.currentWorkflowId&&j(fa,{className:"size-4 shrink-0"})]},n.id))]})]})}),e&&!t.isOwner&&j("span",{className:"text-muted-foreground text-xs uppercase lg:hidden",children:"Read-only"})]})}var ic=({workflowId:e})=>{let t=Oy(),o=Ly(t);return Pe(ga,{children:[j(aa,{className:"flex flex-col gap-2 rounded-none border-none bg-transparent p-0 lg:flex-row lg:items-center",position:"top-left",children:Pe("div",{className:"flex items-center gap-2",children:[j(By,{actions:o,state:t,workflowId:e}),e&&!t.isOwner&&j("span",{className:"hidden text-muted-foreground text-xs uppercase lg:inline",children:"Read-only"})]})}),j("div",{className:"pointer-events-auto absolute top-4 right-4 z-10",children:Pe("div",{className:"flex flex-col-reverse items-end gap-2 lg:flex-row lg:items-center",children:[j(My,{actions:o,state:t,workflowId:e}),Pe("div",{className:"flex items-center gap-2",children:[!e&&Pe(ga,{children:[j(bd,{}),j(md,{})]}),e&&!t.isOwner&&j(zy,{isDuplicating:t.isDuplicating,onDuplicate:o.handleDuplicate}),j(Yd,{})]})]})})]})};import"@xyflow/react/dist/style.css";import{PlayCircle as Wv,Zap as zv}from"lucide-react";import{nanoid as Gs}from"nanoid";import{BaseEdge as cc,getBezierPath as Vy,getSimpleBezierPath as Gy,Position as zo,useInternalNode as lc}from"@xyflow/react";import{jsx as uc}from"react/jsx-runtime";var Hy=({id:e,sourceX:t,sourceY:o,targetX:n,targetY:r,sourcePosition:s,targetPosition:a,selected:d})=>{let[i]=Gy({sourceX:t,sourceY:o,sourcePosition:s,targetX:n,targetY:r,targetPosition:a});return uc(cc,{className:"stroke-1",id:e,path:i,style:{stroke:d?"var(--muted-foreground)":"var(--border)",strokeDasharray:"5, 5"}})},dc=(e,t)=>{let o=t===zo.Left?"target":"source",n=e.internals.handleBounds?.[o]?.find(i=>i.position===t);if(!n)return[0,0];let r=n.width/2,s=n.height/2;switch(t){case zo.Left:r=0;break;case zo.Right:r=n.width;break;case zo.Top:s=0;break;case zo.Bottom:s=n.height;break;default:throw new Error(`Invalid handle position: ${t}`)}let a=e.internals.positionAbsolute.x+n.x+r,d=e.internals.positionAbsolute.y+n.y+s;return[a,d]},$y=(e,t)=>{let o=zo.Right,[n,r]=dc(e,o),s=zo.Left,[a,d]=dc(t,s);return{sx:n,sy:r,tx:a,ty:d,sourcePos:o,targetPos:s}},_y=({id:e,source:t,target:o,style:n,selected:r})=>{let s=lc(t),a=lc(o);if(!(s&&a))return null;let{sx:d,sy:i,tx:l,ty:c,sourcePos:u,targetPos:f}=$y(s,a),[h]=Vy({sourceX:d,sourceY:i,sourcePosition:u,targetX:l,targetY:c,targetPosition:f});return uc(cc,{id:e,path:h,style:{...n,stroke:r?"var(--muted-foreground)":"var(--border)",strokeWidth:2,animation:"dashdraw 0.5s linear infinite",strokeDasharray:5}})},Ls={Temporary:Hy,Animated:_y};import{useAtomValue as ar}from"jotai";import{AlertTriangle as rv,Check as av,Code as sv,EyeOff as vc,XCircle as iv,Zap as wc}from"lucide-react";import hc from"next/image";import{memo as lv,useState as dv}from"react";import{useAtomValue as qy}from"jotai";import{Check as gc,Circle as jy,EyeOff as Jy,ListOrdered as Yy,Loader2 as Xy,XCircle as yc}from"lucide-react";import{memo as Qy,useEffect as Zy,useState as ev}from"react";import{Handle as pc,Position as fc}from"@xyflow/react";import{Fragment as Uy,jsx as bo,jsxs as Ms}from"react/jsx-runtime";var mc=({className:e})=>Ms(Uy,{children:[bo("style",{children:`
|
|
193
212
|
@property --angle {
|
|
194
213
|
syntax: "<angle>";
|
|
195
214
|
initial-value: 0deg;
|
|
@@ -214,4 +233,4 @@ export async function POST(request: NextRequest) {
|
|
|
214
233
|
transparent 100%
|
|
215
234
|
);
|
|
216
235
|
}
|
|
217
|
-
`}),fo("div",{className:x("pointer-events-none absolute inset-0 rounded-[inherit] animate-border-mask",e),children:Ss("svg",{className:"h-full w-full overflow-visible",xmlns:"http://www.w3.org/2000/svg",children:[fo("defs",{children:Ss("linearGradient",{id:"gradient-glow",x1:"0%",y1:"0%",x2:"100%",y2:"100%",children:[fo("stop",{offset:"0%",stopColor:"#60a5fa"}),fo("stop",{offset:"50%",stopColor:"#3b82f6"}),fo("stop",{offset:"100%",stopColor:"#60a5fa"})]})}),fo("rect",{x:"1",y:"1",width:"calc(100% - 2px)",height:"calc(100% - 2px)",rx:"6",fill:"none",stroke:"url(#gradient-glow)",strokeWidth:"2",style:{filter:"drop-shadow(0 0 4px #3b82f6)"}})]})}),fo("div",{className:x("pointer-events-none absolute inset-0 rounded-[inherit] border-2 border-blue-500/10",e)})]});import{jsx as jn,jsxs as hy}from"react/jsx-runtime";var qn=({handles:e,className:t,status:o,...n})=>hy(oa,{className:x("node-container relative gap-0 rounded-md bg-card p-0 transition-all duration-200",o==="success"&&"border-green-500 border-2",o==="error"&&"border-red-500 border-2",t),...n,children:[o==="running"&&jn(Qd,{}),e.target&&jn(Zd,{position:ec.Left,type:"target"}),e.source&&jn(Zd,{position:ec.Right,type:"source"}),n.children]});var Yn=e=>jn(Td,{...e}),Jn=e=>jn(Ad,{...e});import{Fragment as Oy,jsx as Ne,jsxs as jt}from"react/jsx-runtime";var Ty=e=>({"gpt-5":"GPT-5","openai/gpt-5.1-instant":"GPT-5.1 Instant","openai/gpt-5.1-codex":"GPT-5.1 Codex","openai/gpt-5.1-codex-mini":"GPT-5.1 Codex Mini","openai/gpt-5.1-thinking":"GPT-5.1 Thinking","gpt-4":"GPT-4","gpt-4o":"GPT-4o","gpt-4o-mini":"GPT-4o Mini","claude-3-5-sonnet":"Claude 3.5","claude-3-opus":"Claude 3 Opus","anthropic/claude-opus-4.5":"Claude Opus 4.5","anthropic/claude-sonnet-4.5":"Claude Sonnet 4.5","anthropic/claude-haiku-4.5":"Claude Haiku 4.5","google/gemini-3-pro-preview":"Gemini 3 Pro Preview","google/gemini-2.5-flash-lite":"Gemini 2.5 Flash Lite","google/gemini-2.5-flash":"Gemini 2.5 Flash","google/gemini-2.5-pro":"Gemini 2.5 Pro","meta/llama-4-scout":"Llama 4 Scout","meta/llama-3.3-70b":"Llama 3.3 70B","meta/llama-3.1-8b":"Llama 3.1 8B","moonshotai/kimi-k2-0905":"Kimi K2","openai/gpt-oss-120b":"GPT OSS 120B","openai/gpt-oss-safeguard-20b":"GPT OSS Safeguard 20B","openai/gpt-oss-20b":"GPT OSS 20B","o1-preview":"o1 Preview","o1-mini":"o1 Mini","bfl/flux-2-pro":"FLUX.2 Pro","bfl/flux-1-pro":"FLUX.1 Pro","openai/dall-e-3":"DALL-E 3","google/imagen-4.0-generate":"Imagen 4.0"})[e]||e,nc={"HTTP Request":"System","Database Query":"Database",Condition:"Condition","Execute Code":"System",Loop:"Loop",Switch:"Switch",Merge:"Merge"},Ay=e=>{if(nc[e])return nc[e];let t=pe(e);return t?.integration&&It(t.integration)?.label||"System"};function Sy(e){return typeof e=="object"&&e!==null&&"base64"in e&&typeof e.base64=="string"&&e.base64.length>100}var Iy=e=>{if(["Database Query"].includes(e))return!0;let o=pe(e);return o?Fo(o.integration):!1},Py=e=>{switch(e){case"HTTP Request":return Bo.icon;case"Database Query":return Wo.icon;case"Execute Code":return Ne(xy,{className:"size-12 text-green-300",strokeWidth:1.5});case"Condition":return zo.icon;case"Loop":return Fr.icon;case"Merge":return zr.icon;case"Switch":return Wr.icon;default:break}let t=pe(e);if(t){let o=It(t.integration);if(o?.icon){let n=o.icon;return Ne(n,{className:"size-12"})}}return Ne(rc,{className:"size-12 text-amber-300",strokeWidth:1.5})},Ey=({status:e})=>!e||e==="idle"||e==="running"?null:jt("div",{className:x("absolute top-2 right-2 rounded-full p-1",e==="success"&&"bg-green-500/50",e==="error"&&"bg-red-500/50"),children:[e==="success"&&Ne(wy,{className:"size-3.5 text-white",strokeWidth:2.5}),e==="error"&&Ne(Ny,{className:"size-3.5 text-white",strokeWidth:2.5})]}),Dy=({model:e})=>e?Ne("div",{className:"rounded-full border border-muted-foreground/50 px-2 py-0.5 font-medium text-[10px] text-muted-foreground",children:Ty(e)}):null;function Ry({base64:e}){let[t,o]=Cy(!1);return jt(Oy,{children:[Ne("button",{className:"relative size-12 cursor-zoom-in overflow-hidden rounded-lg transition-transform hover:scale-105",onClick:n=>{n.stopPropagation(),o(!0)},type:"button",children:Ne(oc,{alt:"Generated image",className:"object-cover",fill:!0,sizes:"48px",src:`data:image/png;base64,${e}`,unoptimized:!0})}),Ne(Jr,{onOpenChange:o,open:t,children:jt(Dl,{className:"max-w-3xl p-2",showCloseButton:!1,children:[Ne(Rl,{className:"sr-only",children:"Generated Image"}),Ne("div",{className:"relative aspect-square w-full overflow-hidden rounded-lg",children:Ne(oc,{alt:"Generated image",className:"object-contain",fill:!0,sizes:"(max-width: 768px) 100vw, 768px",src:`data:image/png;base64,${e}`,unoptimized:!0})})]})})]})}var Is=ky(({data:e,selected:t,id:o})=>{let n=Xn(Qt),r=Xn(pr),s=Xn(ur),a=Xn(_s),l=Xn(rr);if(!e)return null;let i=e.config?.actionType||"",d=e.status,c=r[o],u=n&&i==="Generate Image"&&c?.output&&Sy(c.output);if(!i){let h=e.enabled===!1;return jt(qn,{className:x("flex h-48 w-48 flex-col items-center justify-center shadow-none transition-all duration-150 ease-out",t&&"border-primary",h&&"opacity-50"),"data-testid":`action-node-${o}`,handles:{target:!0,source:!0},status:d,children:[h&&Ne("div",{className:"absolute top-2 left-2 rounded-full bg-gray-500/50 p-1",children:Ne(tc,{className:"size-3.5 text-white"})}),jt("div",{className:"flex flex-col items-center justify-center gap-3 p-6",children:[Ne(rc,{className:"size-12 text-muted-foreground",strokeWidth:1.5}),jt("div",{className:"flex flex-col items-center gap-1 text-center",children:[Ne(Yn,{className:"text-base",children:e.label||"Action"}),Ne(Jn,{className:"text-xs",children:"Select an action"})]})]})]})}let p=pe(i),g=e.label||p?.label||i,T=e.description||Ay(i),v=Iy(i),y=s.has(o),w=e.config?.integrationId,k=w&&a.has(w),f=l&&v&&!k&&!y,I=i==="Generate Text"?e.config?.aiModel||"meta/llama-4-scout":i==="Generate Image"?e.config?.imageModel||"google/imagen-4.0-generate":null,C=e.enabled===!1;return jt(qn,{className:x("relative flex h-48 w-48 flex-col items-center justify-center shadow-none transition-all duration-150 ease-out",t&&"border-primary",C&&"opacity-50"),"data-testid":`action-node-${o}`,handles:{target:!0,source:!0},status:d,children:[C&&Ne("div",{className:"absolute top-2 left-2 rounded-full bg-gray-500/50 p-1",children:Ne(tc,{className:"size-3.5 text-white"})}),!C&&f&&Ne("div",{className:"absolute top-2 left-2 rounded-full bg-orange-500/50 p-1",children:Ne(by,{className:"size-3.5 text-white"})}),Ne(Ey,{status:d}),jt("div",{className:"flex flex-col items-center justify-center gap-3 p-6",children:[u?Ne(Ry,{base64:c.output.base64}):Py(i),jt("div",{className:"flex flex-col items-center gap-1 text-center",children:[Ne(Yn,{className:"text-base",children:g}),T&&Ne(Jn,{className:"text-xs",children:T}),I&&Ne(Dy,{model:I})]})]})]})});Is.displayName="ActionNode";import{Plus as Ly}from"lucide-react";import{jsx as xn,jsxs as da}from"react/jsx-runtime";function ac({data:e}){return da("div",{className:"flex flex-col items-center justify-center gap-8 rounded-lg border border-border border-dashed bg-background/50 p-8 backdrop-blur-sm",children:[da("div",{className:"text-center",children:[xn("h1",{className:"mb-2 font-bold text-3xl",children:"AI Workflow Builder Template"}),da("p",{className:"text-muted-foreground text-sm",children:["Powered by"," ",xn("a",{className:"underline underline-offset-2 transition duration-200 ease-out hover:text-foreground",href:"https://useworkflow.dev/",rel:"noopener noreferrer",target:"_blank",children:"Workflow"}),","," ",xn("a",{className:"underline underline-offset-2 transition duration-200 ease-out hover:text-foreground",href:"https://ai-sdk.dev/",rel:"noopener noreferrer",target:"_blank",children:"AI SDK"}),","," ",xn("a",{className:"underline underline-offset-2 transition duration-200 ease-out hover:text-foreground",href:"https://vercel.com/ai-gateway",rel:"noopener noreferrer",target:"_blank",children:"AI Gateway"})," ","and"," ",xn("a",{className:"underline underline-offset-2 transition duration-200 ease-out hover:text-foreground",href:"https://ai-sdk.dev/elements",rel:"noopener noreferrer",target:"_blank",children:"AI Elements"})]})]}),da(O,{className:"gap-2 shadow-lg",onClick:e.onClick,size:"default",children:[xn(Ly,{className:"size-4"}),"Add a Step"]})]})}import{Check as My,Clock as Fy,Play as zy,Webhook as Wy,XCircle as By}from"lucide-react";import{memo as Vy}from"react";import{jsx as Qn,jsxs as ca}from"react/jsx-runtime";var Ps=Vy(({data:e,selected:t})=>{if(!e)return null;let o=e.config?.triggerType||"Manual",n=e.label||o,r=e.description||"Trigger",s=e.status,a=zy;return o==="Schedule"?a=Fy:o==="Webhook"&&(a=Wy),ca(qn,{className:x("flex h-48 w-48 flex-col items-center justify-center shadow-none transition-all duration-150 ease-out",t&&"border-primary"),handles:{target:!1,source:!0},status:s,children:[s&&s!=="idle"&&s!=="running"&&ca("div",{className:x("absolute top-2 right-2 rounded-full p-1",s==="success"&&"bg-green-500/50",s==="error"&&"bg-red-500/50"),children:[s==="success"&&Qn(My,{className:"size-3.5 text-white",strokeWidth:2.5}),s==="error"&&Qn(By,{className:"size-3.5 text-white",strokeWidth:2.5})]}),ca("div",{className:"flex flex-col items-center justify-center gap-3 p-6",children:[Qn(a,{className:"size-12 text-blue-500",strokeWidth:1.5}),ca("div",{className:"flex flex-col items-center gap-1 text-center",children:[Qn(Yn,{className:"text-base",children:n}),r&&Qn(Jn,{className:"text-xs",children:r})]})]})]})});Ps.displayName="TriggerNode";import{useAtomValue as Gy,useSetAtom as Zn}from"jotai";import{Link2Off as Hy,Plus as _y,Trash2 as $y}from"lucide-react";import{nanoid as Uy}from"nanoid";import{useCallback as kn,useEffect as Ky,useRef as jy}from"react";import{jsx as Nn,jsxs as lc}from"react/jsx-runtime";function sc({menuState:e,onClose:t}){let o=Gy(oe),n=Zn(eo),r=Zn(to),s=Zn(Vo),a=Zn(be),l=Zn(Ft),{open:i}=ne(),d=jy(null),c=kn(()=>{if(e?.nodeId){let v=e.nodeId;t(),i(Oe,{title:"Delete Step",message:"Are you sure you want to delete this node? This action cannot be undone.",confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:()=>{n(v)}})}},[e,n,t,i]),u=kn(()=>{if(e?.edgeId){let v=e.edgeId;t(),i(Oe,{title:"Delete Connection",message:"Are you sure you want to delete this connection? This action cannot be undone.",confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:()=>{r(v)}})}},[e,r,t,i]),p=kn(()=>{if(e?.flowPosition){let y={id:Uy(),type:"action",position:{x:e.flowPosition.x,y:e.flowPosition.y-96},data:{label:"",description:"",type:"action",config:{},status:"idle"},selected:!0};s(y),a(y.id),l("properties")}t()},[e,s,a,l,t]);if(Ky(()=>{if(!e)return;let v=k=>{d.current&&!d.current.contains(k.target)&&t()},y=k=>{k.key==="Escape"&&t()},w=setTimeout(()=>{document.addEventListener("mousedown",v),document.addEventListener("keydown",y)},0);return()=>{clearTimeout(w),document.removeEventListener("mousedown",v),document.removeEventListener("keydown",y)}},[e,t]),!e)return null;let g=!!(e.nodeId&&o.find(v=>v.id===e.nodeId)?.data.type==="trigger"),T=()=>e.nodeId&&o.find(y=>y.id===e.nodeId)?.data.label||"Step";return lc("div",{className:"fade-in-0 zoom-in-95 fixed z-50 min-w-[8rem] animate-in overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",ref:d,style:{left:e.position.x,top:e.position.y},children:[e.type==="node"&&Nn(Es,{disabled:g,icon:Nn($y,{className:"size-4"}),label:`Delete ${T()}`,onClick:c,variant:"destructive"}),e.type==="edge"&&Nn(Es,{icon:Nn(Hy,{className:"size-4"}),label:"Delete Connection",onClick:u,variant:"destructive"}),e.type==="pane"&&Nn(Es,{icon:Nn(_y,{className:"size-4"}),label:"Add Step",onClick:p})]})}function Es({icon:e,label:t,onClick:o,variant:n="default",disabled:r}){return lc("button",{className:x("relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none","hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground",n==="destructive"&&"text-destructive hover:bg-destructive/10 hover:text-destructive focus:bg-destructive/10 focus:text-destructive",r&&"pointer-events-none opacity-50"),disabled:r,onClick:o,type:"button",children:[e,t]})}function ic(e,t){let o=kn((s,a)=>{s.preventDefault(),t({type:"node",position:{x:s.clientX,y:s.clientY},nodeId:a.id})},[t]),n=kn((s,a)=>{s.preventDefault(),t({type:"edge",position:{x:s.clientX,y:s.clientY},edgeId:a.id})},[t]),r=kn(s=>{s.preventDefault();let a=e({x:s.clientX,y:s.clientY});t({type:"pane",position:{x:s.clientX,y:s.clientY},flowPosition:a})},[e,t]);return{onNodeContextMenu:o,onEdgeContextMenu:n,onPaneContextMenu:r}}import{jsx as Mo,jsxs as cc}from"react/jsx-runtime";var ev=[{type:"trigger",label:"",description:"",displayLabel:"Trigger",icon:Qy,defaultConfig:{triggerType:"Manual"}},{type:"action",label:"",description:"",displayLabel:"Action",icon:Zy,defaultConfig:{}}],tv={animated:As.Animated,temporary:As.Temporary};function uc(){let[e,t]=er(oe),[o,n]=er(ue),[r]=er(wt),s=Ds($e),[a]=er(sr),l=Ds(ir),i=Ds(lr),[d,c]=er(cr),u=go(qs),p=go(Ys),g=go(be),T=go(_e),v=go(Vo),y=go(tt),w=go(Lt),k=go(Ft),{screenToFlowPosition:f,fitView:A,getViewport:I,setViewport:C}=Jy(),h=Lo(null),m=Lo(null),S=Lo(!1),J=Lo(!1),[D,j]=dc(!1),[z,re]=dc(null),{onNodeContextMenu:P,onEdgeContextMenu:V,onPaneContextMenu:X}=ic(f,re),W=bt(()=>{re(null)},[]),U=Lo(void 0),N=e.some(Q=>Q.type!=="add"),M=Lo(!1),b=Lo(!1);ua(()=>{if(d&&!b.current){if(b.current=!0,document.cookie.split("; ").find(Ee=>Ee.startsWith("sidebar-collapsed="))?.split("=")[1]==="true")return;let H=I(),ce=window.innerWidth*.3/2;C({...H,x:H.x-ce},{duration:0})}},[d,I,C]),ua(()=>{if(U.current!==s){if(d&&J.current){U.current=s,j(!0),c(!1);return}setTimeout(()=>{A({maxZoom:1,minZoom:.5,padding:.2,duration:0}),U.current=s,J.current=!0,j(!0),c(!1)},0)}},[s,A,d,c]),ua(()=>{s||(N&&!M.current?(M.current=!0,setTimeout(()=>{A({maxZoom:1,minZoom:.5,padding:.2,duration:0}),J.current=!0,j(!0)},0)):N||(M.current=!1))},[s,N,A]),ua(()=>{let Q=E=>{(E.metaKey||E.ctrlKey)&&E.key==="/"&&(E.preventDefault(),A({padding:.2,duration:300}))};return window.addEventListener("keydown",Q),()=>{window.removeEventListener("keydown",Q)}},[A]);let R=Xy(()=>({trigger:Ps,action:Is,add:ac}),[]),G=bt((Q,E)=>{let H=e.find(Y=>Y.id===Q);return!H||H.type==="add"?!1:E==="target"?H.type!=="trigger":!0},[e]),te=bt(Q=>!(!(Q.source&&Q.target)||Q.source===Q.target),[]),de=bt(Q=>{let E={id:Rs(),...Q,type:"animated"};n([...o,E]),y(!0),w({immediate:!0})},[o,n,y,w]),B=bt((Q,E)=>{g(E.id)},[g]),xe=bt((Q,E)=>{h.current=E.nodeId,m.current=E.handleType},[]),qe=bt(Q=>{let E="changedTouches"in Q?Q.changedTouches[0].clientX:Q.clientX,H="changedTouches"in Q?Q.changedTouches[0].clientY:Q.clientY;return{clientX:E,clientY:H}},[]),Ye=bt((Q,E,H)=>{let Y=Q.target.closest(".react-flow")?.getBoundingClientRect(),ce=Y?E-Y.left:E,Ee=Y?H-Y.top:H;return{adjustedX:ce,adjustedY:Ee}},[]),He=bt(Q=>{let E=Q.getAttribute("data-id"),H=m.current==="source",Y=H?"target":"source",ce=h.current;E&&ce&&E!==ce&&G(E,Y)&&de({source:H?ce:E,target:H?E:ce,sourceHandle:null,targetHandle:null})},[G,de]),qt=bt((Q,E,H)=>{let Y=h.current;if(!Y)return;let{adjustedX:ce,adjustedY:Ee}=Ye(Q,E,H),Re=ev.find(pa=>pa.type==="action");if(!Re)return;let Cn=f({x:ce,y:Ee}),ma=192;Cn.y-=ma/2;let Tn={id:Rs(),type:Re.type,position:Cn,data:{label:Re.label,description:Re.description,type:Re.type,config:Re.defaultConfig,status:"idle"},selected:!0};v(Tn),g(Tn.id),k("properties"),setTimeout(()=>{t(pa=>pa.map(Ls=>({...Ls,selected:Ls.id===Tn.id})))},50);let Os=m.current==="source",bc={id:Rs(),source:Os?Y:Tn.id,target:Os?Tn.id:Y,type:"animated"};n([...o,bc]),y(!0),w({immediate:!0}),S.current=!0,setTimeout(()=>{S.current=!1},100)},[Ye,f,v,o,n,t,g,k,y,w]),St=bt(Q=>{if(!h.current)return;let{clientX:E,clientY:H}=qe(Q),Y="changedTouches"in Q?document.elementFromPoint(E,H):Q.target;if(!Y){h.current=null;return}let ce=Y.closest(".react-flow__node"),Ee=Y.closest(".react-flow__handle");if(ce&&!Ee&&m.current){He(ce),h.current=null,m.current=null;return}ce||Ee||qt(Q,E,H),h.current=null,m.current=null},[qe,He,qt]),ee=bt(()=>{S.current||(g(null),T(null),W())},[g,T,W]),ve=bt(({nodes:Q})=>{S.current&&Q.length===0||(Q.length===0?g(null):Q.length===1&&g(Q[0].id))},[g]);return cc("div",{className:"relative h-full bg-background","data-testid":"workflow-canvas",style:{opacity:D?1:0,width:l?`calc(100% - ${l})`:"100%",transition:i?"width 300ms ease-out, opacity 300ms":"opacity 300ms"},children:[Mo("div",{className:"pointer-events-auto",children:Mo(jd,{workflowId:s??void 0})}),cc($l,{className:"bg-background",connectionLineComponent:Kl,connectionMode:qy.Strict,edges:o,edgeTypes:tv,elementsSelectable:!r,isValidConnection:te,nodes:e,nodesConnectable:!r,nodesDraggable:!r,nodeTypes:R,onConnect:r?void 0:de,onConnectEnd:r?void 0:St,onConnectStart:r?void 0:xe,onEdgeContextMenu:r?void 0:V,onEdgesChange:r?void 0:p,onNodeClick:r?void 0:B,onNodeContextMenu:r?void 0:P,onNodesChange:r?void 0:u,onPaneClick:ee,onPaneContextMenu:r?void 0:X,onSelectionChange:r?void 0:ve,children:[Mo(Xr,{className:"workflow-controls-panel border-none bg-transparent p-0",position:"bottom-right",children:Mo(jl,{})}),a&&Mo(Yy,{bgColor:"var(--sidebar)",nodeStrokeColor:"var(--border)"})]}),s&&Mo(Jl,{workflowId:s}),Mo(sc,{menuState:z,onClose:W})]})}import{jsx as mc}from"react/jsx-runtime";function pc(){let e=ov();return e==="/"||e.startsWith("/workflows/")?mc("div",{className:"fixed inset-0 z-0",children:mc(uc,{})}):null}import{AuthUIProvider as nv}from"@daveyplate/better-auth-ui";import rv from"next/link";import{useRouter as av}from"next/navigation";import{jsx as sv}from"react/jsx-runtime";var fc=e=>{let t=av(),{children:o,...n}=e;return sv(nv,{...n,authClient:Eo,navigate:t.push,replace:t.replace,onSessionChange:()=>{t.refresh()},Link:rv,children:o})};import{ThemeProvider as iv}from"next-themes";import{jsx as lv}from"react/jsx-runtime";var gc=({children:e,...t})=>lv(iv,{...t,children:e});import{jsx as yo,jsxs as yc}from"react/jsx-runtime";function uv(e){return Ci(),yc(Di,{children:[yo(vc.Suspense,{children:yc(dv,{children:[yo(pc,{}),e.children]})}),yo(_l,{}),yo(Hl,{})]})}var hc=e=>{let{children:t,...o}=e;return yo(gc,{attribute:"class",defaultTheme:"system",disableTransitionOnChange:!0,enableSystem:!0,children:yo(fc,{...o,children:yo(cv,{children:yo(uv,{children:t})})})})};import{jsx as pv}from"react/jsx-runtime";var mv=e=>{let{children:t,...o}=e;return pv(hc,{...o,children:t})};function fv(){return process.env.AI_GATEWAY_MANAGED_KEYS_ENABLED==="true"}function gv(){return typeof window>"u"?process.env.AI_GATEWAY_MANAGED_KEYS_ENABLED==="true":process.env.NEXT_PUBLIC_AI_GATEWAY_MANAGED_KEYS_ENABLED==="true"}export{mv as Layout,es as WorkflowEditor,Yp as WorkflowPage,fv as isAiGatewayManagedKeysEnabled,gv as isAiGatewayManagedKeysEnabledClient};
|
|
236
|
+
`}),bo("div",{className:x("pointer-events-none absolute inset-0 rounded-[inherit] animate-border-mask",e),children:Ms("svg",{className:"h-full w-full overflow-visible",xmlns:"http://www.w3.org/2000/svg",children:[bo("defs",{children:Ms("linearGradient",{id:"gradient-glow",x1:"0%",y1:"0%",x2:"100%",y2:"100%",children:[bo("stop",{offset:"0%",stopColor:"#60a5fa"}),bo("stop",{offset:"50%",stopColor:"#3b82f6"}),bo("stop",{offset:"100%",stopColor:"#60a5fa"})]})}),bo("rect",{x:"1",y:"1",width:"calc(100% - 2px)",height:"calc(100% - 2px)",rx:"6",fill:"none",stroke:"url(#gradient-glow)",strokeWidth:"2",style:{filter:"drop-shadow(0 0 4px #3b82f6)"}})]})}),bo("div",{className:x("pointer-events-none absolute inset-0 rounded-[inherit] border-2 border-blue-500/10",e)})]});import{jsx as rr,jsxs as Ky}from"react/jsx-runtime";var Bo=({handles:e,className:t,status:o,...n})=>Ky(ca,{className:x("node-container relative gap-0 rounded-md bg-card p-0 transition-all duration-200",o==="success"&&"border-green-500 border-2",o==="error"&&"border-red-500 border-2",t),...n,children:[o==="running"&&rr(mc,{}),e.target&&rr(pc,{position:fc.Left,type:"target"}),e.source&&rr(pc,{position:fc.Right,type:"source"}),n.children]});var Vo=e=>rr(Bd,{...e}),Go=e=>rr(Vd,{...e});import{jsx as tt,jsxs as Xt}from"react/jsx-runtime";function tv({status:e}){switch(e){case"pending":return tt(jy,{className:"size-3 text-muted-foreground"});case"running":return tt(Xy,{className:"size-3 animate-spin text-blue-400"});case"success":return tt(gc,{className:"size-3 text-green-400"});case"error":return tt(yc,{className:"size-3 text-red-400"})}}function ov({index:e,name:t,status:o}){return Xt("div",{className:x("flex items-center gap-1.5 rounded px-1.5 py-0.5 text-[10px] leading-tight transition-colors",o==="running"&&"bg-blue-500/10",o==="success"&&"bg-green-500/10",o==="error"&&"bg-red-500/10"),children:[Xt("span",{className:"w-3 shrink-0 text-right text-muted-foreground",children:[e,"."]}),tt(tv,{status:o}),tt("span",{className:"min-w-0 flex-1 truncate",children:t})]})}function nv({status:e}){return!e||e==="idle"||e==="running"?null:Xt("div",{className:x("absolute top-2 right-2 rounded-full p-1",e==="success"&&"bg-green-500/50",e==="error"&&"bg-red-500/50"),children:[e==="success"&&tt(gc,{className:"size-3.5 text-white",strokeWidth:2.5}),e==="error"&&tt(yc,{className:"size-3.5 text-white",strokeWidth:2.5})]})}var Fs=Qy(({data:e,selected:t,id:o})=>{let n=qy(jo),[r,s]=ev({}),a=e.status,d=e.enabled===!1,i=e.config?.workflowIds||"[]",l=[];try{let y=JSON.parse(i);Array.isArray(y)&&(l=y)}catch{l=i.split(",").map(y=>y.trim()).filter(Boolean)}Zy(()=>{if(l.length===0)return;let y=!1;async function p(){try{let v=await fetch("/api/workflow-builder/workflows");if(!v.ok)return;let g=await v.json(),k=g.workflows||g||[],I={};for(let A of k)I[A.id]=A.name;y||s(I)}catch{}}return p(),()=>{y=!0}},[i]);let u=n[o]?.output,f=u?.results,h=new Map;if(f)for(let y of f)h.set(y.workflowId,y.success?"success":"error");function T(y,p){return f&&h.get(y)||"pending"}let b=l.length===0;return Xt(Bo,{className:x("relative flex w-56 flex-col shadow-none transition-all duration-150 ease-out",t&&"border-primary",d&&"opacity-50"),"data-testid":`action-node-${o}`,handles:{target:!0,source:!0},status:a,children:[d&&tt("div",{className:"absolute top-2 left-2 rounded-full bg-gray-500/50 p-1",children:tt(Jy,{className:"size-3.5 text-white"})}),tt(nv,{status:a}),Xt("div",{className:"flex items-center gap-2 border-b px-3 py-2.5",children:[tt(Yy,{className:"size-4 shrink-0 text-emerald-300",strokeWidth:1.5}),Xt("div",{className:"min-w-0 flex-1",children:[tt(Vo,{className:"truncate text-xs font-medium",children:e.label||"Run Workflows in Sequence"}),!b&&Xt(Go,{className:"text-[10px]",children:[l.length," workflow",l.length!==1?"s":""]})]})]}),tt("div",{className:"flex flex-col gap-0.5 px-2 py-2",children:b?tt("p",{className:"px-1 py-2 text-center text-[10px] text-muted-foreground",children:"No workflows configured"}):l.map((y,p)=>tt(ov,{index:p+1,name:r[y]||y.slice(0,12)+"...",status:T(y,p)},`${y}-${p}`))}),u&&f&&Xt("div",{className:"border-t px-3 py-1.5 text-[10px] text-muted-foreground",children:[u.succeeded||0," passed",(u.failed||0)>0&&Xt("span",{className:"text-red-400",children:[" / ",u.failed," failed"]})]})]})});Fs.displayName="SequenceNode";import{Fragment as hv,jsx as Te,jsxs as Qt}from"react/jsx-runtime";var cv=e=>({"gpt-5":"GPT-5","openai/gpt-5.1-instant":"GPT-5.1 Instant","openai/gpt-5.1-codex":"GPT-5.1 Codex","openai/gpt-5.1-codex-mini":"GPT-5.1 Codex Mini","openai/gpt-5.1-thinking":"GPT-5.1 Thinking","gpt-4":"GPT-4","gpt-4o":"GPT-4o","gpt-4o-mini":"GPT-4o Mini","claude-3-5-sonnet":"Claude 3.5","claude-3-opus":"Claude 3 Opus","anthropic/claude-opus-4.5":"Claude Opus 4.5","anthropic/claude-sonnet-4.5":"Claude Sonnet 4.5","anthropic/claude-haiku-4.5":"Claude Haiku 4.5","google/gemini-3-pro-preview":"Gemini 3 Pro Preview","google/gemini-2.5-flash-lite":"Gemini 2.5 Flash Lite","google/gemini-2.5-flash":"Gemini 2.5 Flash","google/gemini-2.5-pro":"Gemini 2.5 Pro","meta/llama-4-scout":"Llama 4 Scout","meta/llama-3.3-70b":"Llama 3.3 70B","meta/llama-3.1-8b":"Llama 3.1 8B","moonshotai/kimi-k2-0905":"Kimi K2","openai/gpt-oss-120b":"GPT OSS 120B","openai/gpt-oss-safeguard-20b":"GPT OSS Safeguard 20B","openai/gpt-oss-20b":"GPT OSS 20B","o1-preview":"o1 Preview","o1-mini":"o1 Mini","bfl/flux-2-pro":"FLUX.2 Pro","bfl/flux-1-pro":"FLUX.1 Pro","openai/dall-e-3":"DALL-E 3","google/imagen-4.0-generate":"Imagen 4.0"})[e]||e,bc={"HTTP Request":"System","Database Query":"Database",Condition:"Condition","Execute Code":"System",Loop:"Loop",Switch:"Switch",Merge:"Merge","Run Workflow":"System","Run Workflows in Sequence":"System"},uv=e=>{if(bc[e])return bc[e];let t=fe(e);return t?.integration&&Dt(t.integration)?.label||"System"};function mv(e){return typeof e=="object"&&e!==null&&"base64"in e&&typeof e.base64=="string"&&e.base64.length>100}var pv=e=>{if(["Database Query"].includes(e))return!0;let o=fe(e);return o?_o(o.integration):!1},fv=e=>{switch(e){case"HTTP Request":return qo.icon;case"Database Query":return Ko.icon;case"Execute Code":return Te(sv,{className:"size-12 text-green-300",strokeWidth:1.5});case"Condition":return Uo.icon;case"Loop":return $r.icon;case"Merge":return _r.icon;case"Switch":return qr.icon;case"Run Workflow":return Ur.icon;case"Run Workflows in Sequence":return Kr.icon;default:break}let t=fe(e);if(t){let o=Dt(t.integration);if(o?.icon){let n=o.icon;return Te(n,{className:"size-12"})}}return Te(wc,{className:"size-12 text-amber-300",strokeWidth:1.5})},gv=({status:e})=>!e||e==="idle"||e==="running"?null:Qt("div",{className:x("absolute top-2 right-2 rounded-full p-1",e==="success"&&"bg-green-500/50",e==="error"&&"bg-red-500/50"),children:[e==="success"&&Te(av,{className:"size-3.5 text-white",strokeWidth:2.5}),e==="error"&&Te(iv,{className:"size-3.5 text-white",strokeWidth:2.5})]}),yv=({model:e})=>e?Te("div",{className:"rounded-full border border-muted-foreground/50 px-2 py-0.5 font-medium text-[10px] text-muted-foreground",children:cv(e)}):null;function vv({base64:e}){let[t,o]=dv(!1);return Qt(hv,{children:[Te("button",{className:"relative size-12 cursor-zoom-in overflow-hidden rounded-lg transition-transform hover:scale-105",onClick:n=>{n.stopPropagation(),o(!0)},type:"button",children:Te(hc,{alt:"Generated image",className:"object-cover",fill:!0,sizes:"48px",src:`data:image/png;base64,${e}`,unoptimized:!0})}),Te(ra,{onOpenChange:o,open:t,children:Qt(Ul,{className:"max-w-3xl p-2",showCloseButton:!1,children:[Te(Kl,{className:"sr-only",children:"Generated Image"}),Te("div",{className:"relative aspect-square w-full overflow-hidden rounded-lg",children:Te(hc,{alt:"Generated image",className:"object-contain",fill:!0,sizes:"(max-width: 768px) 100vw, 768px",src:`data:image/png;base64,${e}`,unoptimized:!0})})]})})]})}var Ws=lv(({data:e,selected:t,id:o})=>{let n=ar(no),r=ar(jo),s=ar(br),a=ar(Qs),d=ar(mr);if(!e)return null;let i=e.config?.actionType||"",l=e.status;if(i==="Run Workflows in Sequence")return Te(Fs,{data:e,id:o,selected:t});let c=r[o],u=n&&i==="Generate Image"&&c?.output&&mv(c.output);if(!i){let w=e.enabled===!1;return Qt(Bo,{className:x("flex h-48 w-48 flex-col items-center justify-center shadow-none transition-all duration-150 ease-out",t&&"border-primary",w&&"opacity-50"),"data-testid":`action-node-${o}`,handles:{target:!0,source:!0},status:l,children:[w&&Te("div",{className:"absolute top-2 left-2 rounded-full bg-gray-500/50 p-1",children:Te(vc,{className:"size-3.5 text-white"})}),Qt("div",{className:"flex flex-col items-center justify-center gap-3 p-6",children:[Te(wc,{className:"size-12 text-muted-foreground",strokeWidth:1.5}),Qt("div",{className:"flex flex-col items-center gap-1 text-center",children:[Te(Vo,{className:"text-base",children:e.label||"Action"}),Te(Go,{className:"text-xs",children:"Select an action"})]})]})]})}let f=fe(i),h=e.label||f?.label||i,T=e.description||uv(i),b=pv(i),y=s.has(o),p=e.config?.integrationId,v=p&&a.has(p),g=d&&b&&!v&&!y,I=i==="Generate Text"?e.config?.aiModel||"meta/llama-4-scout":i==="Generate Image"?e.config?.imageModel||"google/imagen-4.0-generate":null,A=e.enabled===!1;return Qt(Bo,{className:x("relative flex h-48 w-48 flex-col items-center justify-center shadow-none transition-all duration-150 ease-out",t&&"border-primary",A&&"opacity-50"),"data-testid":`action-node-${o}`,handles:{target:!0,source:!0},status:l,children:[A&&Te("div",{className:"absolute top-2 left-2 rounded-full bg-gray-500/50 p-1",children:Te(vc,{className:"size-3.5 text-white"})}),!A&&g&&Te("div",{className:"absolute top-2 left-2 rounded-full bg-orange-500/50 p-1",children:Te(rv,{className:"size-3.5 text-white"})}),Te(gv,{status:l}),Qt("div",{className:"flex flex-col items-center justify-center gap-3 p-6",children:[u?Te(vv,{base64:c.output.base64}):fv(i),Qt("div",{className:"flex flex-col items-center gap-1 text-center",children:[Te(Vo,{className:"text-base",children:h}),T&&Te(Go,{className:"text-xs",children:T}),I&&Te(yv,{model:I})]})]})]})});Ws.displayName="ActionNode";import{Plus as bv}from"lucide-react";import{jsx as En,jsxs as va}from"react/jsx-runtime";function xc({data:e}){return va("div",{className:"flex flex-col items-center justify-center gap-8 rounded-lg border border-border border-dashed bg-background/50 p-8 backdrop-blur-sm",children:[va("div",{className:"text-center",children:[En("h1",{className:"mb-2 font-bold text-3xl",children:"AI Workflow Builder Template"}),va("p",{className:"text-muted-foreground text-sm",children:["Powered by"," ",En("a",{className:"underline underline-offset-2 transition duration-200 ease-out hover:text-foreground",href:"https://useworkflow.dev/",rel:"noopener noreferrer",target:"_blank",children:"Workflow"}),","," ",En("a",{className:"underline underline-offset-2 transition duration-200 ease-out hover:text-foreground",href:"https://ai-sdk.dev/",rel:"noopener noreferrer",target:"_blank",children:"AI SDK"}),","," ",En("a",{className:"underline underline-offset-2 transition duration-200 ease-out hover:text-foreground",href:"https://vercel.com/ai-gateway",rel:"noopener noreferrer",target:"_blank",children:"AI Gateway"})," ","and"," ",En("a",{className:"underline underline-offset-2 transition duration-200 ease-out hover:text-foreground",href:"https://ai-sdk.dev/elements",rel:"noopener noreferrer",target:"_blank",children:"AI Elements"})]})]}),va(D,{className:"gap-2 shadow-lg",onClick:e.onClick,size:"default",children:[En(bv,{className:"size-4"}),"Add a Step"]})]})}import{Check as wv,Clock as xv,Play as Nv,Webhook as kv,XCircle as Cv}from"lucide-react";import{memo as Tv}from"react";import{jsx as sr,jsxs as ha}from"react/jsx-runtime";var zs=Tv(({data:e,selected:t})=>{if(!e)return null;let o=e.config?.triggerType||"Manual",n=e.label||o,r=e.description||"Trigger",s=e.status,a=Nv;return o==="Schedule"?a=xv:o==="Webhook"&&(a=kv),ha(Bo,{className:x("flex h-48 w-48 flex-col items-center justify-center shadow-none transition-all duration-150 ease-out",t&&"border-primary"),handles:{target:!1,source:!0},status:s,children:[s&&s!=="idle"&&s!=="running"&&ha("div",{className:x("absolute top-2 right-2 rounded-full p-1",s==="success"&&"bg-green-500/50",s==="error"&&"bg-red-500/50"),children:[s==="success"&&sr(wv,{className:"size-3.5 text-white",strokeWidth:2.5}),s==="error"&&sr(Cv,{className:"size-3.5 text-white",strokeWidth:2.5})]}),ha("div",{className:"flex flex-col items-center justify-center gap-3 p-6",children:[sr(a,{className:"size-12 text-blue-500",strokeWidth:1.5}),ha("div",{className:"flex flex-col items-center gap-1 text-center",children:[sr(Vo,{className:"text-base",children:n}),r&&sr(Go,{className:"text-xs",children:r})]})]})]})});zs.displayName="TriggerNode";import{useAtomValue as Av,useSetAtom as ir}from"jotai";import{Link2Off as Sv,Plus as Iv,Trash2 as Pv}from"lucide-react";import{nanoid as Ev}from"nanoid";import{useCallback as Rn,useEffect as Dv,useRef as Rv}from"react";import{jsx as Dn,jsxs as Cc}from"react/jsx-runtime";function Nc({menuState:e,onClose:t}){let o=Av(ne),n=ir(ao),r=ir(so),s=ir(Jo),a=ir(ke),d=ir(Bt),{open:i}=re(),l=Rv(null),c=Rn(()=>{if(e?.nodeId){let b=e.nodeId;t(),i(Me,{title:"Delete Step",message:"Are you sure you want to delete this node? This action cannot be undone.",confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:()=>{n(b)}})}},[e,n,t,i]),u=Rn(()=>{if(e?.edgeId){let b=e.edgeId;t(),i(Me,{title:"Delete Connection",message:"Are you sure you want to delete this connection? This action cannot be undone.",confirmLabel:"Delete",confirmVariant:"destructive",onConfirm:()=>{r(b)}})}},[e,r,t,i]),f=Rn(()=>{if(e?.flowPosition){let y={id:Ev(),type:"action",position:{x:e.flowPosition.x,y:e.flowPosition.y-96},data:{label:"",description:"",type:"action",config:{},status:"idle"},selected:!0};s(y),a(y.id),d("properties")}t()},[e,s,a,d,t]);if(Dv(()=>{if(!e)return;let b=v=>{l.current&&!l.current.contains(v.target)&&t()},y=v=>{v.key==="Escape"&&t()},p=setTimeout(()=>{document.addEventListener("mousedown",b),document.addEventListener("keydown",y)},0);return()=>{clearTimeout(p),document.removeEventListener("mousedown",b),document.removeEventListener("keydown",y)}},[e,t]),!e)return null;let h=!!(e.nodeId&&o.find(b=>b.id===e.nodeId)?.data.type==="trigger"),T=()=>e.nodeId&&o.find(y=>y.id===e.nodeId)?.data.label||"Step";return Cc("div",{className:"fade-in-0 zoom-in-95 fixed z-50 min-w-[8rem] animate-in overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",ref:l,style:{left:e.position.x,top:e.position.y},children:[e.type==="node"&&Dn(Bs,{disabled:h,icon:Dn(Pv,{className:"size-4"}),label:`Delete ${T()}`,onClick:c,variant:"destructive"}),e.type==="edge"&&Dn(Bs,{icon:Dn(Sv,{className:"size-4"}),label:"Delete Connection",onClick:u,variant:"destructive"}),e.type==="pane"&&Dn(Bs,{icon:Dn(Iv,{className:"size-4"}),label:"Add Step",onClick:f})]})}function Bs({icon:e,label:t,onClick:o,variant:n="default",disabled:r}){return Cc("button",{className:x("relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none","hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground",n==="destructive"&&"text-destructive hover:bg-destructive/10 hover:text-destructive focus:bg-destructive/10 focus:text-destructive",r&&"pointer-events-none opacity-50"),disabled:r,onClick:o,type:"button",children:[e,t]})}function kc(e,t){let o=Rn((s,a)=>{s.preventDefault(),t({type:"node",position:{x:s.clientX,y:s.clientY},nodeId:a.id})},[t]),n=Rn((s,a)=>{s.preventDefault(),t({type:"edge",position:{x:s.clientX,y:s.clientY},edgeId:a.id})},[t]),r=Rn(s=>{s.preventDefault();let a=e({x:s.clientX,y:s.clientY});t({type:"pane",position:{x:s.clientX,y:s.clientY},flowPosition:a})},[e,t]);return{onNodeContextMenu:o,onEdgeContextMenu:n,onPaneContextMenu:r}}import{jsx as $o,jsxs as Ac}from"react/jsx-runtime";var Bv=[{type:"trigger",label:"",description:"",displayLabel:"Trigger",icon:Wv,defaultConfig:{triggerType:"Manual"}},{type:"action",label:"",description:"",displayLabel:"Action",icon:zv,defaultConfig:{}}],Vv={animated:Ls.Animated,temporary:Ls.Temporary};function Sc(){let[e,t]=lr(ne),[o,n]=lr(ue),[r]=lr(Nt),s=Vs(Ue),[a]=lr(fr),d=Vs(gr),i=Vs(yr),[l,c]=lr(hr),u=wo(ni),f=wo(ri),h=wo(ke),T=wo(_e),b=wo(Jo),y=wo(nt),p=wo(Wt),v=wo(Bt),{screenToFlowPosition:g,fitView:k,getViewport:I,setViewport:A}=Mv(),w=Ho(null),m=Ho(null),S=Ho(!1),X=Ho(!1),[le,L]=Tc(!1),[W,$]=Tc(null),{onNodeContextMenu:P,onEdgeContextMenu:V,onPaneContextMenu:J}=kc(g,$),F=xt(()=>{$(null)},[]),K=Ho(void 0),C=e.some(Q=>Q.type!=="add"),z=Ho(!1),N=Ho(!1);ba(()=>{if(l&&!N.current){if(N.current=!0,document.cookie.split("; ").find(Ee=>Ee.startsWith("sidebar-collapsed="))?.split("=")[1]==="true")return;let _=I(),ce=window.innerWidth*.3/2;A({..._,x:_.x-ce},{duration:0})}},[l,I,A]),ba(()=>{if(K.current!==s){if(l&&X.current){K.current=s,L(!0),c(!1);return}setTimeout(()=>{k({maxZoom:1,minZoom:.5,padding:.2,duration:0}),K.current=s,X.current=!0,L(!0),c(!1)},0)}},[s,k,l,c]),ba(()=>{s||(C&&!z.current?(z.current=!0,setTimeout(()=>{k({maxZoom:1,minZoom:.5,padding:.2,duration:0}),X.current=!0,L(!0)},0)):C||(z.current=!1))},[s,C,k]),ba(()=>{let Q=E=>{(E.metaKey||E.ctrlKey)&&E.key==="/"&&(E.preventDefault(),k({padding:.2,duration:300}))};return window.addEventListener("keydown",Q),()=>{window.removeEventListener("keydown",Q)}},[k]);let R=Fv(()=>({trigger:zs,action:Ws,add:xc}),[]),G=xt((Q,E)=>{let _=e.find(Y=>Y.id===Q);return!_||_.type==="add"?!1:E==="target"?_.type!=="trigger":!0},[e]),oe=xt(Q=>!(!(Q.source&&Q.target)||Q.source===Q.target),[]),de=xt(Q=>{let E={id:Gs(),...Q,type:"animated"};n([...o,E]),y(!0),p({immediate:!0})},[o,n,y,p]),B=xt((Q,E)=>{h(E.id)},[h]),Ae=xt((Q,E)=>{w.current=E.nodeId,m.current=E.handleType},[]),Je=xt(Q=>{let E="changedTouches"in Q?Q.changedTouches[0].clientX:Q.clientX,_="changedTouches"in Q?Q.changedTouches[0].clientY:Q.clientY;return{clientX:E,clientY:_}},[]),Ye=xt((Q,E,_)=>{let Y=Q.target.closest(".react-flow")?.getBoundingClientRect(),ce=Y?E-Y.left:E,Ee=Y?_-Y.top:_;return{adjustedX:ce,adjustedY:Ee}},[]),$e=xt(Q=>{let E=Q.getAttribute("data-id"),_=m.current==="source",Y=_?"target":"source",ce=w.current;E&&ce&&E!==ce&&G(E,Y)&&de({source:_?ce:E,target:_?E:ce,sourceHandle:null,targetHandle:null})},[G,de]),Zt=xt((Q,E,_)=>{let Y=w.current;if(!Y)return;let{adjustedX:ce,adjustedY:Ee}=Ye(Q,E,_),Le=Bv.find(xa=>xa.type==="action");if(!Le)return;let On=g({x:ce,y:Ee}),wa=192;On.y-=wa/2;let Ln={id:Gs(),type:Le.type,position:On,data:{label:Le.label,description:Le.description,type:Le.type,config:Le.defaultConfig,status:"idle"},selected:!0};b(Ln),h(Ln.id),v("properties"),setTimeout(()=>{t(xa=>xa.map($s=>({...$s,selected:$s.id===Ln.id})))},50);let Hs=m.current==="source",Mc={id:Gs(),source:Hs?Y:Ln.id,target:Hs?Ln.id:Y,type:"animated"};n([...o,Mc]),y(!0),p({immediate:!0}),S.current=!0,setTimeout(()=>{S.current=!1},100)},[Ye,g,b,o,n,t,h,v,y,p]),Et=xt(Q=>{if(!w.current)return;let{clientX:E,clientY:_}=Je(Q),Y="changedTouches"in Q?document.elementFromPoint(E,_):Q.target;if(!Y){w.current=null;return}let ce=Y.closest(".react-flow__node"),Ee=Y.closest(".react-flow__handle");if(ce&&!Ee&&m.current){$e(ce),w.current=null,m.current=null;return}ce||Ee||Zt(Q,E,_),w.current=null,m.current=null},[Je,$e,Zt]),ee=xt(()=>{S.current||(h(null),T(null),F())},[h,T,F]),xe=xt(({nodes:Q})=>{S.current&&Q.length===0||(Q.length===0?h(null):Q.length===1&&h(Q[0].id))},[h]);return Ac("div",{className:"relative h-full bg-background","data-testid":"workflow-canvas",style:{opacity:le?1:0,width:d?`calc(100% - ${d})`:"100%",transition:i?"width 300ms ease-out, opacity 300ms":"opacity 300ms"},children:[$o("div",{className:"pointer-events-auto",children:$o(ic,{workflowId:s??void 0})}),Ac(rd,{className:"bg-background",connectionLineComponent:sd,connectionMode:Ov.Strict,edges:o,edgeTypes:Vv,elementsSelectable:!r,isValidConnection:oe,nodes:e,nodesConnectable:!r,nodesDraggable:!r,nodeTypes:R,onConnect:r?void 0:de,onConnectEnd:r?void 0:Et,onConnectStart:r?void 0:Ae,onEdgeContextMenu:r?void 0:V,onEdgesChange:r?void 0:f,onNodeClick:r?void 0:B,onNodeContextMenu:r?void 0:P,onNodesChange:r?void 0:u,onPaneClick:ee,onPaneContextMenu:r?void 0:J,onSelectionChange:r?void 0:xe,children:[$o(aa,{className:"workflow-controls-panel border-none bg-transparent p-0",position:"bottom-right",children:$o(id,{})}),a&&$o(Lv,{bgColor:"var(--sidebar)",nodeStrokeColor:"var(--border)"})]}),s&&$o(cd,{workflowId:s}),$o(Nc,{menuState:W,onClose:F})]})}import{jsx as Ic}from"react/jsx-runtime";function Pc(){let e=Gv();return e==="/"||e.startsWith("/workflows/")?Ic("div",{className:"fixed inset-0 z-0",children:Ic(Sc,{})}):null}import{AuthUIProvider as Hv}from"@daveyplate/better-auth-ui";import $v from"next/link";import{useRouter as _v}from"next/navigation";import{jsx as Uv}from"react/jsx-runtime";var Ec=e=>{let t=_v(),{children:o,...n}=e;return Uv(Hv,{...n,authClient:Mo,navigate:t.push,replace:t.replace,onSessionChange:()=>{t.refresh()},Link:$v,children:o})};import{ThemeProvider as Kv}from"next-themes";import{jsx as qv}from"react/jsx-runtime";var Dc=({children:e,...t})=>qv(Kv,{...t,children:e});import{jsx as xo,jsxs as Rc}from"react/jsx-runtime";function Yv(e){return Wi(),Rc(_i,{children:[xo(Oc.Suspense,{children:Rc(jv,{children:[xo(Pc,{}),e.children]})}),xo(nd,{}),xo(od,{})]})}var Lc=e=>{let{children:t,...o}=e;return xo(Dc,{attribute:"class",defaultTheme:"system",disableTransitionOnChange:!0,enableSystem:!0,children:xo(Ec,{...o,children:xo(Jv,{children:xo(Yv,{children:t})})})})};import{jsx as Qv}from"react/jsx-runtime";var Xv=e=>{let{children:t,...o}=e;return Qv(Lc,{...o,children:t})};function Zv(){return process.env.AI_GATEWAY_MANAGED_KEYS_ENABLED==="true"}function eh(){return typeof window>"u"?process.env.AI_GATEWAY_MANAGED_KEYS_ENABLED==="true":process.env.NEXT_PUBLIC_AI_GATEWAY_MANAGED_KEYS_ENABLED==="true"}export{Xv as Layout,ls as WorkflowEditor,Cf as WorkflowPage,Zv as isAiGatewayManagedKeysEnabled,eh as isAiGatewayManagedKeysEnabledClient};
|