@novu/framework 2.11.2-alpha.1 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -110,13 +110,13 @@ et dolore magna aliqua Ut enim ad minim veniam quis nostrud exercitation ullamco
110
110
  commodo consequat Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
111
111
  pariatur Excepteur sint occaecat cupidatat non proident sunt in culpa qui officia deserunt mollit anim id est
112
112
  laborum`.split(/\W/),oi=Qr,ai={type:Gt.ALLOWED_TYPES},Tc=Zr,ha=Go,xc=ei,si=ti,kc=Ko,vc=Xo,fa="[a-zA-Z][a-zA-Z0-9+-.]*",li=`https?://{hostname}(?:${fa})+`,Ac="(?:\\?([a-z]{1,7}(=\\w{1,5})?&){0,3})?",Ut={email:"[a-zA-Z\\d][a-zA-Z\\d-]{1,13}[a-zA-Z\\d]@{hostname}",hostname:"[a-zA-Z]{1,33}\\.[a-z]{2,4}",ipv6:"[a-f\\d]{4}(:[a-f\\d]{4}){7}",uri:li,slug:"[a-zA-Z\\d_-]+","uri-reference":`${li}${Ac}`,"uri-template":li.replace("(?:","(?:/\\{[a-z][:a-zA-Z0-9-]*\\}|"),"json-pointer":`(/(?:${fa.replace("]*","/]*")}|~[01]))+`,uuid:"^[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$",duration:"^P(?!$)((\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+S)?)?|(\\d+W)?)$"},Ut.iri=Ut["uri-reference"],Ut["iri-reference"]=Ut["uri-reference"],Ut["idn-email"]=Ut.email,Ut["idn-hostname"]=Ut.hostname,Ec=new RegExp(`\\{(${Object.keys(Ut).join("|")})\\}`),_c=Qo,Rc=ea,Oc={boolean:fc,null:yc,array:bc,integer:wc,number:da,object:Tc,string:Rc},wr=Oc,Ic=re,Cc=({refs:l,schema:c,container:f,synchronous:S,refDepthMax:T,refDepthMin:v})=>{let k={},L={},Q=0,N,ie;return k.resolveSchema=(j,he,ce)=>{if(j==null)return null;if(typeof j.generate=="function")return j;if(typeof(j.$id||j.id)=="string"&&(delete j.id,delete j.$id,delete j.$schema),typeof j.$ref=="string"){let xe=Math.max(v,T)-1;if(j.$ref==="#"||L[j.$ref]<0||N===j.$ref&&++Q>xe)return j.$ref!=="#"&&ie&&ie.length===ce.length?Ye.getLocalRef(c,j.$ref,S&&l):(delete j.$ref,j);typeof L[j.$ref]=="undefined"&&(L[j.$ref]=Ae.number(v,T)-1),ie=ce,N=j.$ref;let Re;j.$ref.indexOf("#/")===-1?Re=l[j.$ref]||null:Re=Ye.getLocalRef(c,j.$ref,S&&l)||null;let Ge;if(typeof Re!="undefined"){if(!Re&&_e("ignoreMissingRefs")!==!0)throw new Error(`Reference not found: ${j.$ref}`);L[j.$ref]-=1,Ye.merge(j,Re||{}),Ge=S&&Re&&Re.$ref}return Ge||delete j.$ref,j}if(Array.isArray(j.allOf)){let xe=j.allOf;delete j.allOf,xe.forEach(Re=>{let Ge=k.resolveSchema(Re,null,ce);Ye.merge(j,typeof Ge.thunk=="function"?Ge.thunk(j):Ge),Array.isArray(j.allOf)&&k.resolveSchema(j,he,ce)})}if(Array.isArray(j.oneOf||j.anyOf)&&ce[ce.length-2]!=="dependencies"){let xe=j.oneOf||j.anyOf;return j.enum&&j.oneOf&&(j.enum=j.enum.filter(Re=>Ye.validate(Re,xe))),{thunk(Re){let Ge=Ye.omitProps(j,["anyOf","oneOf"]),Qe=Ae.pick(xe);return Ye.merge(Ge,Qe),xe.forEach(oe=>{oe.required&&oe!==Qe&&oe.required.forEach(I=>{if(Qe.required&&Qe.required.includes(I))return;let C=Ge.required&&Ge.required.includes(I);Ge.properties&&!C&&delete Ge.properties[I],Re&&Re.properties&&delete Re.properties[I]})}),Ge}}}if(Object.keys(j).forEach(xe=>{(Array.isArray(j[xe])||typeof j[xe]=="object")&&!Ye.isKey(xe)&&(j[xe]=k.resolveSchema(j[xe],xe,ce.concat(xe)))}),ce){let xe=ce[ce.length-1];if(xe==="properties"||xe==="items")return j}return f.wrap(j)},k},Pc=Cc,ma=Nt,ga=nn,At=ra(Gl(),1),Dm=At.default.binaryOptions,Fm=At.default.boolOptions,Um=At.default.intOptions,$m=At.default.nullOptions,qm=At.default.strOptions,jm=At.default.Schema,Bm=At.default.Alias,zm=At.default.Collection,Vm=At.default.Merge,Wm=At.default.Node,Hm=At.default.Pair,Ym=At.default.Scalar,Mc=At.default.YAMLMap,Nc=At.default.YAMLSeq,Sr=Cn,an=new lc,rt=(l,c,f)=>(console.debug("[json-schema-faker] calling JSONSchemaFaker() is deprecated, call either .generate() or .resolve()"),f&&console.debug("[json-schema-faker] local references are only supported by calling .resolve()"),rt.generate(l,c)),rt.generateWithContext=(l,c)=>{let f=on(c,l);return ma(f,l,an,!0)},rt.generate=(l,c)=>ga(rt.generateWithContext(l,c)),rt.generateYAML=(l,c)=>Sr(rt.generateWithContext(l,c)),rt.resolveWithContext=(l,c,f)=>{typeof c=="string"&&(f=c,c={}),f=f||(typeof process!="undefined"&&typeof process.cwd=="function"?process.cwd():""),f=`${f.replace(/\/+$/,"")}/`;let S=on(c,l),T={order:1,canRead(k){let L=k.url.replace("/:",":");return S[L]||S[L.split("/").pop()]},read(k,L){try{L(null,this.canRead(k))}catch(Q){L(Q)}}},{$RefParser:v}=aa();return v.bundle(f,l,{resolve:{file:{order:100},http:{order:200},fixedRefs:T},dereference:{circular:"ignore"}}).then(k=>ma(S,k,an)).catch(k=>{throw new Error(`Error while resolving schema (${k.message})`)})},rt.resolve=(l,c,f)=>rt.resolveWithContext(l,c,f).then(ga),rt.resolveYAML=(l,c,f)=>rt.resolveWithContext(l,c,f).then(Sr),St(),rt.format=pa,rt.option=_e,rt.random=Ae,rt.extend=(l,c)=>(an.extend(l,c),rt),rt.define=(l,c)=>(an.define(l,c),rt),rt.reset=l=>(an.reset(l),St(),rt),rt.locate=l=>an.get(l),rt.VERSION="0.5.5",Lc={...rt},Dc=rt}}),Gm=o({"src/src/main.iife.js"(l,c){var f=(Jm(),u(p));typeof $RefParser!="undefined"&&typeof JSONPath!="undefined"&&f.setDependencies({...JSONPath,$RefParser}),typeof window!="undefined"&&(window.JSONSchemaFaker=f.default),c.exports=f.default,c.exports.JSONSchemaFaker=f.JSONSchemaFaker}});return Gm()})();((e,n)=>{e.JSONSchemaFaker=n()})(typeof self!="undefined"?self:typeof window!="undefined"?window:globalThis,()=>Li);Li.random.shuffle=function(){return["[placeholder]"]};Li.option({useDefaultValue:!0,alwaysFakeOptionals:!0});function Hc(e){return Li.generate(e)}var Yc=async(e,n)=>{let t=new TextEncoder,r=t.encode(e),i=t.encode(n),o=await crypto.subtle.importKey("raw",r,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]),a=await crypto.subtle.sign("HMAC",o,i);return Array.from(new Uint8Array(a)).map(s=>s.toString(16).padStart(2,"0")).join("")},Jc=(e,n)=>{if(typeof e!="string"||typeof n!="string"||e.length!==n.length)return!1;let t=0;for(let r=0;r<e.length;r+=1)t|=e.charCodeAt(r)^n.charCodeAt(r);return t===0};var Gc=require("cross-fetch"),Kc=()=>typeof Response!="undefined"?Response:Gc.Response,Xc=async()=>{if(process.env.NOVU_BRIDGE_ORIGIN)return`${process.env.NOVU_BRIDGE_ORIGIN}/api/novu`;if(process.env.NEXT_PUBLIC_VERCEL_ENV==="preview"&&process.env.NEXT_PUBLIC_VERCEL_URL)return`https://${process.env.NEXT_PUBLIC_VERCEL_URL}/api/novu`;try{if(process.env.NODE_ENV==="development"||process.env.NODE_ENV==="dev"){let n=await(await fetch("http://localhost:2022/.well-known/novu")).json();return`${n.tunnelOrigin}${n.route}`}}catch(e){console.error(e)}return""};function Qc(e){return!!e&&typeof e=="object"&&"error"in e&&"message"in e&&"statusCode"in e}var Di=(e,n)=>{if(!e)throw new vi;return{post:async(t,r)=>{let i=await fetch(`${n}/v1${t}`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`ApiKey ${e}`},body:JSON.stringify(r)}),o=await i.json();if(i.ok)return o;throw Qc(o)?new Ai(o.statusCode,o.error,o.message):new Gn(o)},delete:async t=>(await fetch(`${n}/v1${t}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:`ApiKey ${e}`}})).json()}};var iu=require("liquidjs");function Ta(e,n){let t={...e};for(let r of Object.keys(n)){let i=n[r];i&&typeof i=="object"&&!Array.isArray(i)?t[r]=Ta(t[r]||{},i):(Array.isArray(i),t[r]=i)}return t}function Fi(e,n){let t=n.split(".").reduce((r,i)=>{if(r&&typeof r=="object")return r[i]},e);if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(typeof t=="object"){let r=JSON.stringify(t);return r==="{}"?"":r}return""}function Zc(e,n=2,t,r=", "){if(!Array.isArray(e)||e.length===0)return"";let i=t?e.map(s=>typeof s!="object"||!s?"":Fi(s,t)):e;if(i.length===1)return i[0];if(i.length===2)return`${i[0]} and ${i[1]}`;if(i.length===3&&n>=3)return`${i[0]}, ${r}${i[1]} and ${i[2]}`;let o=i.slice(0,n),a=i.length-n;return`${o.join(r)} and ${a} ${a===1?"other":"others"}`}var eu=qt(require("pluralize"),1);function tu(e,n="",t="",r="true"){if(e==null)return"";let i=0;if(Array.isArray(e)?i=e.length:typeof e=="object"?i=Object.keys(e).length:typeof e=="string"?i=+e:typeof e=="number"?i=e:i=Number(e),Number.isNaN(i)&&(i=0),i<=0)return"";let o;return t?o=i===1?n:t:o=(0,eu.default)(n,i),r==="true"?`${i} ${o}`:o}var Sg=require("liquidjs"),nu=qt(require("pluralize"),1),Tg=require("zod");var xg="",kg=2,vg="other",Ag=", ",Eg=" and ",_g=", and ";function ru(e,n=xg,t=kg,r=vg,i=Ag,o=Eg,a=_g){if(!Array.isArray(e)||e.length===0)return"";let s=n?e.map(y=>typeof y!="object"||!y?"":Fi(y,n)):e,u=s.length;if(u===1)return s[0];if(u===2)return`${s[0]}${o}${s[1]}`;if(t>=u){let y=s.slice(0,u-1),g=s[u-1];return`${y.join(i)}${a}${g}`}let p=s.slice(0,t),d=u-t,h=t===1?o:a;return`${p.join(i)}${h}${d} ${(0,nu.default)(r,d)}`}function Rg(e){return Array.isArray(e)||typeof e=="object"&&e!==null?ou(e):typeof e=="string"?e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t"):e==null?"":String(e)}var ou=(e,n=0)=>Array.isArray(e)||typeof e=="object"&&e!==null?JSON.stringify(e,null,n).replace(/"/g,"'").replace(/\n/g,"\\n"):e==null?"":String(e);function au(e){let n=new iu.Liquid({outputEscape:Rg,...e});return n.registerFilter("json",(t,r)=>ou(t,r)),n.registerFilter("digest",Zc),n.registerFilter("toSentence",ru),n.registerFilter("pluralize",tu),n}var Ln=qt(require("chalk"),1),et={info:e=>Ln.default.blue(e),warning:e=>Ln.default.yellow(e),error:e=>Ln.default.red(e),success:e=>Ln.default.green(e),underline:e=>Ln.default.underline(e),bold:e=>Ln.default.bold(e)},ct={SUCCESS:et.success("\u2714"),ERROR:et.error("\u2717"),WARNING:et.warning("\u26A0"),INFO:et.info("\u2139"),ARROW:et.bold("\u2192"),MOCK:et.info("\u25CB"),HYDRATED:et.bold(et.info("\u2192")),STEP:et.info("\u03C3"),ACTION:et.info("\u03B1"),DURATION:et.info("\u0394"),PROVIDER:et.info("\u2699"),OUTPUT:et.info("\u21E2"),INPUT:et.info("\u21E0"),WORKFLOW:et.info("\u03C9"),STATE:et.info("\u03C3"),EXECUTE:et.info("\u03B5"),PREVIEW:et.info("\u03C1")};function Ui(e){return e||process.env.NOVU_API_URL||"https://api.novu.co"}function $i(e){return e||process.env.NOVU_SECRET_KEY||process.env.NOVU_API_KEY||""}var xa=qt(require("sanitize-html"),1),Og=["src","alt","width","height","loading","srcset","sizes","crossorigin","usemap","ismap","class","id","style","title","dir","lang"];function Ig(e){return e.toLowerCase().startsWith("on")}function Cg(e){return e.replace(/<\/([a-zA-Z][a-zA-Z0-9]*)\s*\/[^>]*>/g,"</$1>")}var Pg={allowedTags:xa.default.defaults.allowedTags.concat(["style","img","html","head","body","link","meta","title"]),allowedAttributes:!1,transformTags:{"*":(e,n)=>{let t={};for(let[r,i]of Object.entries(n))Ig(r)||(t[r]=i);return{tagName:e,attribs:t}},img:(e,n)=>{let t={};for(let[r,i]of Object.entries(n))Og.includes(r.toLowerCase())&&(t[r]=i);return{tagName:e,attribs:t}}},allowVulnerableTags:!0,parseStyleAttributes:!1,parser:{lowerCaseAttributeNames:!0}},su=e=>{if(!e)return e;let n=Cg(e),t=/^<!DOCTYPE .*?>/,r=n.match(t),i=(0,xa.default)(n,Pg);return r?r[0]+i:i},qi=e=>Object.keys(e).reduce((n,t)=>{let r=e[t];return typeof r=="string"?n[t]=su(r):Array.isArray(r)?n[t]=r.map(i=>typeof i=="string"?su(i):typeof i=="object"?qi(i):i):typeof r=="object"&&r!==null?n[t]=qi(r):n[t]=r,n},{});function lu(e,n=!0,t=console){n&&(t.info(`
113
- ${et.bold(et.underline("Discovered workflowId:"))} '${e.workflowId}'`),e.steps.forEach((r,i)=>{let o=i===e.steps.length-1,a=o?"\u2514":"\u251C";t.info(`${a} ${ct.STEP} Discovered stepId: '${r.stepId}' Type: '${r.type}'`),r.providers.forEach((s,u)=>{let p=u===r.providers.length-1,d=o?" ":"\u2502",h=p?"\u2514":"\u251C";t.info(`${d} ${h} ${ct.PROVIDER} Discovered provider: '${s.type}'`)})}))}var cu=require("jsonrepair");function uu(e){let n=e.trim();return(n.startsWith("{")&&n.endsWith("}")||n.startsWith("[")&&n.endsWith("]"))&&n.length>2}var pu="__novuJsonString";function Mg(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&e[pu]===!0}function Cr(e){if(typeof e=="string"){if(!uu(e))return e;try{let n=JSON.parse(e);return{[pu]:!0,value:Cr(n)}}catch{return e}}if(Array.isArray(e))return e.map(n=>Cr(n));if(e&&typeof e=="object"){let n={};for(let[t,r]of Object.entries(e))n[t]=Cr(r);return n}return e}function Pr(e){if(Mg(e))return JSON.stringify(Pr(e.value));if(Array.isArray(e))return e.map(n=>Pr(n));if(e&&typeof e=="object"){let n={};for(let[t,r]of Object.entries(e))n[t]=Pr(r);return n}return e}function Ng(e){try{return JSON.parse(e),e}catch{try{return(0,cu.jsonrepair)(e)}catch{return e}}}function du(e){return Object.fromEntries(Object.entries(e).map(([n,t])=>typeof t=="string"?[n,uu(t)?Ng(t):t]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[n,du(t)]:[n,t]))}function hu(e){return!(e!=null&&e.data)||typeof e.data!="object"||Array.isArray(e.data)?e:{...e,data:du(e.data)}}var mu=qt(require("ajv"),1),gu=qt(require("ajv-formats"),1);var fu=e=>typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e));var ji=class extends Tn{constructor(t,r){let i=r.length===1?"it":"them";super(`Tried to use a ${t} in @novu/framework without ${r.join(", ")} installed. Please install ${i} by running \`npm install ${r.join(" ")}\`.`);this.statusCode=500;this.code="MissingDependencyError"}};var Bi=async(e,n)=>{let t=new Set;if((await Promise.allSettled(e.map(i=>i.import))).forEach((i,o)=>{let a=e[o];i.status==="fulfilled"&&a.exports.every(u=>i.value[u]!==void 0)||t.add(a.name)}),t.size>0)throw new ji(n,Array.from(t))};var zi=class{constructor(){this.requiredImports=[];this.ajv=new mu.default({useDefaults:!0,removeAdditional:"failing",strict:!1}),(0,gu.default)(this.ajv),this.compiledSchemas=new Map}async canHandle(n){let t=n.type==="object"||!!n.anyOf||!!n.allOf||!!n.oneOf;return t&&await Bi(this.requiredImports,"JSON schema"),t}async validate(n,t){let r=this.compiledSchemas.get(t);r||(r=this.ajv.compile(t),this.compiledSchemas.set(t,r));let i=fu(n);return r(i)?{success:!0,data:i}:{success:!1,errors:r.errors.map(a=>({path:a.instancePath,message:a.message}))}}async transformToJsonSchema(n){return n}};var Vi=class{constructor(){this.requiredImports=[{name:"zod",import:import("zod"),exports:["ZodType"]},{name:"zod-to-json-schema",import:import("zod-to-json-schema"),exports:["zodToJsonSchema"]}]}async canHandle(n){let t=n.safeParseAsync!==void 0;return t&&await Bi(this.requiredImports,"Zod schema"),t}async validate(n,t){let r=await t.safeParseAsync(n);return r.success?{success:!0,data:r.data}:{success:!1,errors:r.error.issues.map(i=>({path:`/${i.path.join("/")}`,message:i.message}))}}async transformToJsonSchema(n){let{zodToJsonSchema:t}=await import("zod-to-json-schema");return t(n)}};var Wi=new Vi,Hi=new zi,Mr=async(e,n)=>{if(await Wi.canHandle(e))return Wi.validate(n,e);if(await Hi.canHandle(e))return Hi.validate(n,e);throw new Error("Invalid schema")},yt=async e=>{if(await Wi.canHandle(e))return Wi.transformToJsonSchema(e);if(await Hi.canHandle(e))return Hi.transformToJsonSchema(e);throw new Error("Invalid schema")};function yu(){return["development",void 0,"dev"].includes(process.env.NODE_ENV)}var Qn=class{constructor(n){this.discoveredWorkflows=new Map;this.discoverWorkflowPromises=new Map;this.registeredAgents=new Map;this.version="2.11.2-alpha.1";let t=this.buildOptions(n);this.apiUrl=t.apiUrl,this.secretKey=t.secretKey,this.strictAuthentication=t.strictAuthentication,this.verbose=t.verbose,this.logger=t.logger,this.templateEngine=au()}buildOptions(n){let t={apiUrl:Ui(n==null?void 0:n.apiUrl),secretKey:$i(n==null?void 0:n.secretKey),strictAuthentication:!yu(),verbose:yu(),logger:console};return(n==null?void 0:n.strictAuthentication)!==void 0?t.strictAuthentication=n.strictAuthentication:process.env.NOVU_STRICT_AUTHENTICATION_ENABLED!==void 0&&(t.strictAuthentication=process.env.NOVU_STRICT_AUTHENTICATION_ENABLED==="true"),(n==null?void 0:n.verbose)!==void 0&&(t.verbose=n.verbose),(n==null?void 0:n.logger)!==void 0&&(t.logger=n.logger),t}log(...n){this.verbose&&this.logger.info(...n)}async addWorkflows(n){for(let t of n){if(this.discoveredWorkflows.has(t.id))continue;let r=this.discoverWorkflowPromises.get(t.id);if(r){await r;continue}let i=this.addWorkflow(t);this.discoverWorkflowPromises.set(t.id,i),await i}}addAgents(n){for(let t of n)this.registeredAgents.set(t.id,t)}getAgent(n){return this.registeredAgents.get(n)}async addWorkflow(n){try{let t=await n.discover();lu(t,this.verbose,this.logger),this.discoveredWorkflows.set(n.id,t)}finally{this.discoverWorkflowPromises.delete(n.id)}}healthCheck(){let n=this.getRegisteredWorkflows(),t=n.length,r=n.reduce((i,o)=>i+o.steps.length,0);return{status:"ok",sdkVersion:"2.11.2-alpha.1",frameworkVersion:"2024-06-26",discovered:{workflows:t,steps:r}}}getWorkflow(n){let t=this.discoveredWorkflows.get(n);if(t)return t;throw new Rr(n)}getStep(n,t){let i=this.getWorkflow(n).steps.find(o=>o.stepId===t);if(i)return i;throw new Mi(t)}getRegisteredWorkflows(){return Array.from(this.discoveredWorkflows.values())}discover(){return{workflows:this.getRegisteredWorkflows(),agents:Array.from(this.registeredAgents.keys()).map(n=>({agentId:n}))}}mock(n){try{return Hc(n)}catch(t){return this.logger.warn("Failed to mock schema, returning empty object:",t),{}}}async validate(n,t,r,i,o,a,s){let u=await Mr(t,n);if(u.success)return u.data;switch(r){case"event":this.throwInvalidEvent(i,o,u.errors);case"step":this.throwInvalidStep(a,i,o,u.errors);case"provider":this.throwInvalidProvider(a,s,i,o,u.errors);default:throw new Error(`Invalid component: '${r}'`)}}throwInvalidProvider(n,t,r,i,o){throw n?t?r==="output"?new Si(i,n,t,o):new Error(`Invalid payload type: '${r}'`):new Error("providerId is required"):new Error("stepId is required")}throwInvalidStep(n,t,r,i){if(!n)throw new Error("stepId is required");switch(t){case"output":throw new yi(r,n,i);case"result":throw new bi(r,n,i);case"controls":throw new gi(r,n,i);default:throw new Error(`Invalid payload type: '${t}'`)}}throwInvalidEvent(n,t,r){switch(n){case"controls":throw new mi(t,r);case"payload":throw new Ar(t,r);default:throw new Error(`Invalid payload type: '${n}'`)}}executeStepFactory(n,t,r){return async(i,o,a)=>{if(r())return;let s=this.getStep(n.workflowId,i),u=n.action==="preview";if(!u&&i===n.stepId){let g=await this.createStepControls(s,n),P=await this.compileControls(g,n);if(await this.shouldSkip(a==null?void 0:a.skip,P))return t({options:{skip:!0},outputs:{},providers:{}}),{}}let p=this.previewStep.bind(this),d=this.executeStep.bind(this),y=await(u?p:d)(n,{...s,providers:s.providers.map(g=>{var ee;let P=(ee=a==null?void 0:a.providers)==null?void 0:ee[g.type];if(!P)throw new Ei(g.type);return{...g,resolve:P}}),resolve:o});return this.shouldSanitize({stepType:s.type,options:a})&&(y={...y,outputs:qi(y.outputs)}),i===n.stepId&&t({...y,options:{skip:!1}}),y.outputs}}shouldSanitize({stepType:n,options:t}){return(t==null?void 0:t.disableOutputSanitization)===!0?!1:["email","in_app"].includes(n)}async shouldSkip(n,t){return n?n(t):!1}async executeWorkflow(n){let i=`${{execute:"Executing",preview:"Previewing"}[n.action]||n.action} workflowId:`;this.log(`
113
+ ${et.bold(et.underline("Discovered workflowId:"))} '${e.workflowId}'`),e.steps.forEach((r,i)=>{let o=i===e.steps.length-1,a=o?"\u2514":"\u251C";t.info(`${a} ${ct.STEP} Discovered stepId: '${r.stepId}' Type: '${r.type}'`),r.providers.forEach((s,u)=>{let p=u===r.providers.length-1,d=o?" ":"\u2502",h=p?"\u2514":"\u251C";t.info(`${d} ${h} ${ct.PROVIDER} Discovered provider: '${s.type}'`)})}))}var cu=require("jsonrepair");function uu(e){let n=e.trim();return(n.startsWith("{")&&n.endsWith("}")||n.startsWith("[")&&n.endsWith("]"))&&n.length>2}var pu="__novuJsonString";function Mg(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&e[pu]===!0}function Cr(e){if(typeof e=="string"){if(!uu(e))return e;try{let n=JSON.parse(e);return{[pu]:!0,value:Cr(n)}}catch{return e}}if(Array.isArray(e))return e.map(n=>Cr(n));if(e&&typeof e=="object"){let n={};for(let[t,r]of Object.entries(e))n[t]=Cr(r);return n}return e}function Pr(e){if(Mg(e))return JSON.stringify(Pr(e.value));if(Array.isArray(e))return e.map(n=>Pr(n));if(e&&typeof e=="object"){let n={};for(let[t,r]of Object.entries(e))n[t]=Pr(r);return n}return e}function Ng(e){try{return JSON.parse(e),e}catch{try{return(0,cu.jsonrepair)(e)}catch{return e}}}function du(e){return Object.fromEntries(Object.entries(e).map(([n,t])=>typeof t=="string"?[n,uu(t)?Ng(t):t]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[n,du(t)]:[n,t]))}function hu(e){return!(e!=null&&e.data)||typeof e.data!="object"||Array.isArray(e.data)?e:{...e,data:du(e.data)}}var mu=qt(require("ajv"),1),gu=qt(require("ajv-formats"),1);var fu=e=>typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e));var ji=class extends Tn{constructor(t,r){let i=r.length===1?"it":"them";super(`Tried to use a ${t} in @novu/framework without ${r.join(", ")} installed. Please install ${i} by running \`npm install ${r.join(" ")}\`.`);this.statusCode=500;this.code="MissingDependencyError"}};var Bi=async(e,n)=>{let t=new Set;if((await Promise.allSettled(e.map(i=>i.import))).forEach((i,o)=>{let a=e[o];i.status==="fulfilled"&&a.exports.every(u=>i.value[u]!==void 0)||t.add(a.name)}),t.size>0)throw new ji(n,Array.from(t))};var zi=class{constructor(){this.requiredImports=[];this.ajv=new mu.default({useDefaults:!0,removeAdditional:"failing",strict:!1}),(0,gu.default)(this.ajv),this.compiledSchemas=new Map}async canHandle(n){let t=n.type==="object"||!!n.anyOf||!!n.allOf||!!n.oneOf;return t&&await Bi(this.requiredImports,"JSON schema"),t}async validate(n,t){let r=this.compiledSchemas.get(t);r||(r=this.ajv.compile(t),this.compiledSchemas.set(t,r));let i=fu(n);return r(i)?{success:!0,data:i}:{success:!1,errors:r.errors.map(a=>({path:a.instancePath,message:a.message}))}}async transformToJsonSchema(n){return n}};var Vi=class{constructor(){this.requiredImports=[{name:"zod",import:import("zod"),exports:["ZodType"]},{name:"zod-to-json-schema",import:import("zod-to-json-schema"),exports:["zodToJsonSchema"]}]}async canHandle(n){let t=n.safeParseAsync!==void 0;return t&&await Bi(this.requiredImports,"Zod schema"),t}async validate(n,t){let r=await t.safeParseAsync(n);return r.success?{success:!0,data:r.data}:{success:!1,errors:r.error.issues.map(i=>({path:`/${i.path.join("/")}`,message:i.message}))}}async transformToJsonSchema(n){let{zodToJsonSchema:t}=await import("zod-to-json-schema");return t(n)}};var Wi=new Vi,Hi=new zi,Mr=async(e,n)=>{if(await Wi.canHandle(e))return Wi.validate(n,e);if(await Hi.canHandle(e))return Hi.validate(n,e);throw new Error("Invalid schema")},yt=async e=>{if(await Wi.canHandle(e))return Wi.transformToJsonSchema(e);if(await Hi.canHandle(e))return Hi.transformToJsonSchema(e);throw new Error("Invalid schema")};function yu(){return["development",void 0,"dev"].includes(process.env.NODE_ENV)}var Qn=class{constructor(n){this.discoveredWorkflows=new Map;this.discoverWorkflowPromises=new Map;this.registeredAgents=new Map;this.version="2.12.0";let t=this.buildOptions(n);this.apiUrl=t.apiUrl,this.secretKey=t.secretKey,this.strictAuthentication=t.strictAuthentication,this.verbose=t.verbose,this.logger=t.logger,this.templateEngine=au()}buildOptions(n){let t={apiUrl:Ui(n==null?void 0:n.apiUrl),secretKey:$i(n==null?void 0:n.secretKey),strictAuthentication:!yu(),verbose:yu(),logger:console};return(n==null?void 0:n.strictAuthentication)!==void 0?t.strictAuthentication=n.strictAuthentication:process.env.NOVU_STRICT_AUTHENTICATION_ENABLED!==void 0&&(t.strictAuthentication=process.env.NOVU_STRICT_AUTHENTICATION_ENABLED==="true"),(n==null?void 0:n.verbose)!==void 0&&(t.verbose=n.verbose),(n==null?void 0:n.logger)!==void 0&&(t.logger=n.logger),t}log(...n){this.verbose&&this.logger.info(...n)}async addWorkflows(n){for(let t of n){if(this.discoveredWorkflows.has(t.id))continue;let r=this.discoverWorkflowPromises.get(t.id);if(r){await r;continue}let i=this.addWorkflow(t);this.discoverWorkflowPromises.set(t.id,i),await i}}addAgents(n){for(let t of n)this.registeredAgents.set(t.id,t)}getAgent(n){return this.registeredAgents.get(n)}async addWorkflow(n){try{let t=await n.discover();lu(t,this.verbose,this.logger),this.discoveredWorkflows.set(n.id,t)}finally{this.discoverWorkflowPromises.delete(n.id)}}healthCheck(){let n=this.getRegisteredWorkflows(),t=n.length,r=n.reduce((i,o)=>i+o.steps.length,0);return{status:"ok",sdkVersion:"2.12.0",frameworkVersion:"2024-06-26",discovered:{workflows:t,steps:r}}}getWorkflow(n){let t=this.discoveredWorkflows.get(n);if(t)return t;throw new Rr(n)}getStep(n,t){let i=this.getWorkflow(n).steps.find(o=>o.stepId===t);if(i)return i;throw new Mi(t)}getRegisteredWorkflows(){return Array.from(this.discoveredWorkflows.values())}discover(){return{workflows:this.getRegisteredWorkflows(),agents:Array.from(this.registeredAgents.keys()).map(n=>({agentId:n}))}}mock(n){try{return Hc(n)}catch(t){return this.logger.warn("Failed to mock schema, returning empty object:",t),{}}}async validate(n,t,r,i,o,a,s){let u=await Mr(t,n);if(u.success)return u.data;switch(r){case"event":this.throwInvalidEvent(i,o,u.errors);case"step":this.throwInvalidStep(a,i,o,u.errors);case"provider":this.throwInvalidProvider(a,s,i,o,u.errors);default:throw new Error(`Invalid component: '${r}'`)}}throwInvalidProvider(n,t,r,i,o){throw n?t?r==="output"?new Si(i,n,t,o):new Error(`Invalid payload type: '${r}'`):new Error("providerId is required"):new Error("stepId is required")}throwInvalidStep(n,t,r,i){if(!n)throw new Error("stepId is required");switch(t){case"output":throw new yi(r,n,i);case"result":throw new bi(r,n,i);case"controls":throw new gi(r,n,i);default:throw new Error(`Invalid payload type: '${t}'`)}}throwInvalidEvent(n,t,r){switch(n){case"controls":throw new mi(t,r);case"payload":throw new Ar(t,r);default:throw new Error(`Invalid payload type: '${n}'`)}}executeStepFactory(n,t,r){return async(i,o,a)=>{if(r())return;let s=this.getStep(n.workflowId,i),u=n.action==="preview";if(!u&&i===n.stepId){let g=await this.createStepControls(s,n),P=await this.compileControls(g,n);if(await this.shouldSkip(a==null?void 0:a.skip,P))return t({options:{skip:!0},outputs:{},providers:{}}),{}}let p=this.previewStep.bind(this),d=this.executeStep.bind(this),y=await(u?p:d)(n,{...s,providers:s.providers.map(g=>{var ee;let P=(ee=a==null?void 0:a.providers)==null?void 0:ee[g.type];if(!P)throw new Ei(g.type);return{...g,resolve:P}}),resolve:o});return this.shouldSanitize({stepType:s.type,options:a})&&(y={...y,outputs:qi(y.outputs)}),i===n.stepId&&t({...y,options:{skip:!1}}),y.outputs}}shouldSanitize({stepType:n,options:t}){return(t==null?void 0:t.disableOutputSanitization)===!0?!1:["email","in_app"].includes(n)}async shouldSkip(n,t){return n?n(t):!1}async executeWorkflow(n){let i=`${{execute:"Executing",preview:"Previewing"}[n.action]||n.action} workflowId:`;this.log(`
114
114
  ${et.bold(et.underline(i))} '${n.workflowId}'`);let o=this.getWorkflow(n.workflowId),a=process.hrtime(),s={outputs:{},providers:{},options:{skip:!1}},u,p=!1,d=new Promise(Oe=>{u=Oe}),h=Oe=>{if(p)throw new Error("setResult can only be called once per workflow execution");u(),p=!0,s=Oe},y=()=>p,g;try{if(n.action==="execute"&&!n.payload)throw new Ar(n.workflowId,{message:"Event `payload` is required"});let Oe=await this.createExecutionPayload(n,o),$={...n,payload:Oe};await Promise.race([d,o.execute({payload:Oe,env:n.env,controls:{},subscriber:n.subscriber,context:n.context,step:{email:this.executeStepFactory($,h,y),sms:this.executeStepFactory($,h,y),inApp:this.executeStepFactory($,h,y),digest:this.executeStepFactory($,h,y),delay:this.executeStepFactory($,h,y),push:this.executeStepFactory($,h,y),chat:this.executeStepFactory($,h,y),custom:this.executeStepFactory($,h,y),throttle:this.executeStepFactory($,h,y)}})])}catch(Oe){g=Oe}let P=process.hrtime(a),ee=P[0],Z=P[1],B=ee*1e3+Z/1e6,ue=g?ct.ERROR:ct.SUCCESS,ve={execute:"Executed",preview:"Previewed"}[n.action]||n.action;if(this.log(`${ue} ${ve} workflowId: \`${n.workflowId}\``),this.prettyPrintExecute(n,B,g),g)throw g;return{outputs:s.outputs,providers:s.providers,options:s.options,metadata:{status:"success",error:!1,duration:B}}}async createExecutionPayload(n,t){let{payload:r}=n;if(n.action==="preview"){let o=this.mock(t.payload.schema);r=Object.assign(o,r)}return await this.validate(r,t.payload.unknownSchema,"event","payload",n.workflowId)}prettyPrintExecute(n,t,r){if(!this.verbose)return;let i=r?ct.ERROR:ct.SUCCESS,a={execute:"Executed",preview:"Previewed"}[n.action]||n.action,s=r?"Failed to execute":a,u=r?et.error:et.success,p=`${i} ${s} workflowId: '${n.workflowId}`;this.logger.info(`
115
115
  ${et.bold(u(p))}'
116
116
  \u251C ${ct.STEP} stepId: '${n.stepId}'
117
117
  \u251C ${ct.ACTION} action: '${n.action}'
118
118
  \u2514 ${ct.DURATION} duration: '${t.toFixed(2)}ms'
119
- `)}async executeProviders(n,t,r){return t.providers.reduce(async(i,o)=>{let a=await i,s=this.previewProvider.bind(this),u=this.executeProvider.bind(this),d=await(n.action==="preview"?s:u)(n,t,o,r);return{...a,[o.type]:d}},Promise.resolve({}))}previewProvider(n,t,r,i){return this.log(` ${ct.MOCK} Mocked provider: \`${r.type}\``),this.mock(r.outputs.schema)}async executeProvider(n,t,r,i){try{if(n.stepId===t.stepId){let o=await this.createStepControls(t,n),a=await r.resolve({controls:o,outputs:i}),s=await this.validate(a,r.outputs.unknownSchema,"step","output",n.workflowId,t.stepId,r.type);return this.log(` ${ct.SUCCESS} Executed provider: \`${r.type}\``),{...s,_passthrough:a._passthrough}}else return this.log(` ${ct.HYDRATED} Hydrated provider: \`${r.type}\``),{}}catch(o){throw this.log(` ${ct.ERROR} Failed to execute provider: \`${r.type}\``),new _i(r.type,n.action,o)}}async executeStep(n,t){if(n.stepId===t.stepId)try{let r=await this.createStepControls(t,n),i=await this.compileControls(r,n),o=await t.resolve(i),a=await this.validate(o,t.outputs.unknownSchema,"step","output",n.workflowId,t.stepId),s=await this.executeProviders(n,t,a);return this.log(` ${ct.SUCCESS} Executed stepId: \`${t.stepId}\``),{outputs:a,providers:s}}catch(r){throw this.log(` ${ct.ERROR} Failed to execute stepId: \`${t.stepId}\``),Pn(r)?r:new _r(t.stepId,n.action,r)}else try{let r=this.getStepState(n,t.stepId);if(r){let i=await this.validate(r.outputs,t.results.unknownSchema,"step","result",n.workflowId,t.stepId);return this.log(` ${ct.HYDRATED} Hydrated stepId: \`${t.stepId}\``),{outputs:i,providers:await this.executeProviders(n,t,i)}}else throw new fi(n.workflowId,t.stepId)}catch(r){throw this.log(` ${ct.ERROR} Failed to hydrate stepId: \`${t.stepId}\``),r}}async compileControls(n,t){var r;try{let i=Cr(n),o=this.preprocessTranslationPatterns(JSON.stringify(i));o=this.preprocessFilterTranslationArgs(o);let a=this.templateEngine.parse(o),s=this.getWorkflow(t.workflowId),u={workflow:{workflowId:s.workflowId,name:s.name,description:s.description,tags:s.tags,severity:s.severity},payload:t.payload,subscriber:t.subscriber,...t.actor&&{actor:t.actor},context:t.context,steps:Lg(t.state),env:(r=t.env)!=null?r:{}},p=await this.templateEngine.render(a,u),d=this.postprocessTranslationMarkers(p),h=(0,bu.jsonrepair)(d),y=JSON.parse(h),g=Pr(y);return hu(g)}catch(i){throw new wi(t.workflowId,t.stepId,i)}}preprocessTranslationPatterns(n){return n.replace(/\{\{\s*t\.([\p{L}\p{N}_.-]+)\s*\}\}/gu,"[T:$1]")}preprocessFilterTranslationArgs(n){return n.replace(/'t\.([\p{L}\p{N}_.-]+)'/gu,"'[T:$1]'")}postprocessTranslationMarkers(n){return n.replace(/\[T:([\p{L}\p{N}_.-]+)\]/gu,"{{t.$1}}")}async createStepControls(n,t){return await this.validate(t.controls,n.controls.unknownSchema,"step","controls",t.workflowId,n.stepId)}async previewStep(n,t){try{return await this.constructStepForPreview(n,t)}catch(r){throw this.log(` ${ct.ERROR} Failed to preview stepId: \`${t.stepId}\``),Pn(r)?r:new _r(t.stepId,n.action,r)}}async constructStepForPreview(n,t){return n.stepId===t.stepId?await this.previewRequiredStep(t,n):await this.extractMockDataForPreviousSteps(n,t)}async extractMockDataForPreviousSteps(n,t){let r={},i=this.getStepState(n,t.stepId),o=this.mock(t.results.schema);return{outputs:Ta(o,(i==null?void 0:i.outputs)||{}),providers:await this.executeProviders(n,t,r)}}async previewRequiredStep(n,t){let r=await this.createStepControls(n,t),i=await this.compileControls(r,t),o=await n.resolve(i),a=await this.validate(o,n.outputs.unknownSchema,"step","output",t.workflowId,n.stepId);return this.log(` ${ct.MOCK} Mocked stepId: \`${n.stepId}\``),{outputs:a,providers:await this.executeProviders(t,n,a)}}getStepState(n,t){return n.state.find(r=>r.stepId===t)}getStepCode(n,t){return{code:this.getStep(n,t).resolve.toString()}}getWorkflowCode(n){return{code:this.getWorkflow(n).execute.toString()}}getCode(n,t){let r;if(n)t?r=this.getStepCode(n,t):r=this.getWorkflowCode(n);else throw new Rr(n);return r}};function Lg(e){let n={};for(let t of e)n[t.stepId]=t.outputs;return n}var Dg={400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",408:"Request Timeout",409:"Conflict",422:"Unprocessable Entity",429:"Too Many Requests",500:"Internal Server Error",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout"};function Yi(e){return typeof e=="string"&&e.trim()?e:!e||typeof e!="object"?null:Yi(e.message)}function Fg(e){if(!e)return null;let n;try{n=JSON.parse(e)}catch{return null}if(!n||typeof n!="object")return null;let t=n,r=Yi(t.message);if(r)return r;let i=Yi(t.error);if(i)return i;let o=t.errors;return Array.isArray(o)?Yi(o[0]):null}function Ug(e,n){var i;let t=(i=Dg[e])!=null?i:e,r=Fg(n);return r?`Delivery failed: ${t}: ${r}`:`Delivery failed: ${t}`}var pn=class extends Error{constructor(n,t){super(n),this.name="AgentError",this.cause=t==null?void 0:t.cause,this.delivery=t==null?void 0:t.delivery}},Dn=class extends pn{constructor(n,t){let r={statusCode:n,responseBody:t};super(Ug(n,t),{delivery:r}),this.name="AgentDeliveryError",this.statusCode=n,this.responseBody=t}};function Nr(e){return e instanceof pn?e:e instanceof Error?new pn(e.message,{cause:e}):new pn("Turn failed",{cause:e})}var wu=Symbol.for("novu.agent.runtimeContext");var ka=(i=>(i.ON_MESSAGE="onMessage",i.ON_ACTION="onAction",i.ON_RESOLVE="onResolve",i.ON_REACTION="onReaction",i))(ka||{}),Zn=class{constructor(){this.__novuPendingApproval=!0}};function Su(e){return typeof e=="object"&&e!==null&&"suppress"in e&&e.suppress===!0}function Ji(e){return"type"in e&&e.type==="card"}function Tu(e){return typeof e=="object"&&e!==null&&e.type==="tool-approval-card"}var xu="tool-approval";function $g(e){return e==="approve"||e==="deny"}function va(e,n){return`${xu}:${e}:${n}`}function ku(e){let[n,t,...r]=(e!=null?e:"").split(":"),i=r.join(":");return n!==xu||!$g(t)||!i?null:{approved:t==="approve",approvalId:i}}async function vu(e,n,t,r){var p,d;let i=r!=null?r:n.id,o={approve:va("approve",i),deny:va("deny",i)},a=h=>({type:"tool-approval-card",...h}),s=(d=(p=t==null?void 0:t.renderApproval)==null?void 0:p.call(t,{toolCall:n,actionIds:o,approvalCard:a}))!=null?d:a(),u={approvalId:i,toolCallId:n.id,name:n.name,input:n.input};if(e.emitToolApprovalRequest(u),Tu(s)){await e.replyApprovalCard(s);return}await e.reply(s)}var tS=5*1024*1024,nS=5*1024*1024,Af=32768,rS=/^[A-Za-z0-9+/]*={0,2}$/;function Kr(e,n){return e.filename?`"${e.filename}"`:`at index ${n}`}function _f(){return globalThis.Buffer}function iS(e){var n,t,r;return(r=(t=(n=_f())==null?void 0:n.isBuffer)==null?void 0:t.call(n,e))!=null?r:!1}function oS(e){return typeof Blob!="undefined"&&e instanceof Blob}function bl(e){let n=_f();if(n)return n.from(e).toString("base64");if(typeof btoa!="function")throw new Error("Unable to encode file data: base64 encoding is not available in this runtime.");let t="";for(let r=0;r<e.length;r+=Af){let i=e.subarray(r,r+Af);t+=String.fromCharCode(...i)}return btoa(t)}function Rf(e){let n=e.replace(/\s/g,""),t=n.length%4;if(!n||t===1||!rS.test(n))return null;let r=n.endsWith("==")?2:n.endsWith("=")?1:0;return Math.floor(n.length*3/4)-r}function Jr(e,n,t){if(e>tS)throw new Error(`Invalid file ${Kr(n,t)}: inline data must be 5 MB or smaller. Use a publicly-accessible URL for larger files.`)}async function aS(e,n,t){if(typeof e=="string"){let r=Rf(e);if(r===null)throw new Error(`Invalid file ${Kr(n,t)}: data must be a base64-encoded string.`);return Jr(r,n,t),e}if(iS(e))return Jr(e.byteLength,n,t),e.toString("base64");if(e instanceof Uint8Array)return Jr(e.byteLength,n,t),bl(e);if(e instanceof ArrayBuffer)return Jr(e.byteLength,n,t),bl(new Uint8Array(e));if(oS(e))return Jr(e.size,n,t),bl(new Uint8Array(await e.arrayBuffer()));throw new Error(`Invalid file ${Kr(n,t)}: data must be a base64 string, Buffer, Uint8Array, ArrayBuffer, or Blob.`)}async function sS(e){if(!(e!=null&&e.length))return;let n=[],t=0;for(let[r,i]of e.entries()){let o=i.data,a=i.url,s=o!=null,u=a!=null;if(s===u)throw new Error(`Invalid file ${Kr(i,r)}: provide exactly one of data or url.`);if(s){let p=await aS(o,i,r),d=Rf(p);if(t+=d!=null?d:0,t>nS)throw new Error("Invalid files: total inline data must be 5 MB or smaller. Use publicly-accessible URLs for larger files.");n.push({...i,data:p});continue}if(u&&typeof a!="string")throw new Error(`Invalid file ${Kr(i,r)}: url must be a string.`);n.push(i)}return n}async function Of(e,n){let t=await sS(n);if(typeof e=="string")return t?{markdown:e,files:t}:{markdown:e};let{isJSX:r,toCardElement:i}=await Promise.resolve().then(()=>(vf(),kf));if(r(e)){let o=i(e);if(o)return t?{card:o,files:t}:{card:o}}if(Ji(e))return t?{card:e,files:t}:{card:e};throw new Error("Invalid message content \u2014 expected string or CardElement")}var Gr=class{constructor(n,t,r,i,o){this.conversationId=r;this.integrationIdentifier=i;this.poster=o;this.editedByHandler=!1;this.messageId=n,this.platformThreadId=t}async edit(n,t){this.editedByHandler=!0;let r=await this.poster.post({conversationId:this.conversationId,integrationIdentifier:this.integrationIdentifier,edit:{messageId:this.messageId,content:await Of(n,t==null?void 0:t.files)}});if(!r)throw new Error("Agent edit did not return a message handle");return this.messageId=r.messageId,this.platformThreadId=r.platformThreadId,this}async delete(){await this.poster.post({conversationId:this.conversationId,integrationIdentifier:this.integrationIdentifier,deleteMessages:[{messageId:this.messageId}]})}},Ef;Ef=wu;var Do=class{constructor(n,t,r){this[Ef]=!0;this._signals=[];this._toolResults=[];this._pendingToolApprovalRequest=null;this._pendingReactions=[];this._pendingDeletes=[];this._resolveSignal=null;var s,u;this.event=n.event,this.action=(s=n.action)!=null?s:null,this.message=n.message,this.reaction=n.reaction,this.conversation=n.conversation,this.subscriber=n.subscriber,this.history=n.history,this.platform=n.platform,this.platformContext=n.platformContext,this._replyUrl=n.replyUrl,this._conversationId=n.conversationId,this._integrationIdentifier=n.integrationIdentifier,this._secretKey=t,this._poster={post:p=>this._post(p)},this._toolApprovalConfig=r,this._metadataState={...(u=n.conversation.metadata)!=null?u:{}};let i=this;this.metadata={get(p){return i._metadataState[p]},set(p,d){i._metadataState[p]=d,i._signals.push({type:"metadata",action:"set",key:p,value:d})},delete(p){delete i._metadataState[p],i._signals.push({type:"metadata",action:"delete",key:p})},clear(){i._metadataState={},i._signals.push({type:"metadata",action:"clear"})},get current(){return{...i._metadataState}}};let o=p=>this._post({conversationId:this._conversationId,integrationIdentifier:this._integrationIdentifier,typing:p}).then(()=>{}),a=(p=>o(p===void 0?{}:{status:p}));a.stop=()=>o("stop"),this.typing=a,this.toolApproval={request:async p=>(await vu(this,p,this._toolApprovalConfig),new Zn)}}asMessageContext(){return this}async reply(n,t){let r=await Of(n,t==null?void 0:t.files),i={conversationId:this._conversationId,integrationIdentifier:this._integrationIdentifier,reply:r};this._drainSideEffects(i);let o=await this._post(i);if(!o)throw new Error("Agent reply did not return a message handle");return new Gr(o.messageId,o.platformThreadId,this._conversationId,this._integrationIdentifier,this._poster)}async replyApprovalCard(n){let t={conversationId:this._conversationId,integrationIdentifier:this._integrationIdentifier,reply:{toolApprovalCard:n}};this._drainSideEffects(t);let r=await this._post(t);if(!r)throw new Error("Agent approval card reply did not return a message handle");return new Gr(r.messageId,r.platformThreadId,this._conversationId,this._integrationIdentifier,this._poster)}createReplyHandle(n){return new Gr(n,"",this._conversationId,this._integrationIdentifier,this._poster)}resolve(n){this._resolveSignal={summary:n}}trigger(n,t){this._signals.push({...t,type:"trigger",workflowId:n})}emitToolApprovalRequest(n){if(this._pendingToolApprovalRequest)throw new Error("Only one tool approval request can be queued before the next reply");this._pendingToolApprovalRequest=n}emitToolResult(n){this._toolResults.push(n)}addReaction(n,t){this._pendingReactions.push({messageId:n,emojiName:t})}deleteMessage(n){this._pendingDeletes.push({messageId:n})}async reportTurnError(){try{await this._post({conversationId:this._conversationId,integrationIdentifier:this._integrationIdentifier,error:!0})}catch(n){console.error("[agent] Failed to report turn error:",n)}}async flush(){if(!this._hasPendingSideEffects())return;let n={conversationId:this._conversationId,integrationIdentifier:this._integrationIdentifier};this._drainSideEffects(n),await this._post(n)}_hasPendingSideEffects(){return!!(this._pendingToolApprovalRequest||this._signals.length||this._toolResults.length||this._resolveSignal||this._pendingReactions.length||this._pendingDeletes.length)}_drainSideEffects(n){this._pendingToolApprovalRequest&&(n.toolApprovalRequest=this._pendingToolApprovalRequest,this._pendingToolApprovalRequest=null),this._signals.length&&(n.signals=this._signals,this._signals=[]),this._toolResults.length&&(n.toolResults=this._toolResults,this._toolResults=[]),this._pendingReactions.length&&(n.addReactions=this._pendingReactions,this._pendingReactions=[]),this._pendingDeletes.length&&(n.deleteMessages=this._pendingDeletes,this._pendingDeletes=[]),this._resolveSignal&&(n.resolve=this._resolveSignal,this._resolveSignal=null)}async _post(n){let t=await fetch(this._replyUrl,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`ApiKey ${this._secretKey}`},body:JSON.stringify(n)});if(!t.ok){let i=await t.text().catch(()=>"");throw new Dn(t.status,i)}let r=await t.text().catch(()=>"");if(!r)return null;try{let i=JSON.parse(r),o=i&&typeof i=="object"&&"data"in i?i.data:i;if(o&&typeof o.messageId=="string"&&typeof o.platformThreadId=="string")return{messageId:o.messageId,platformThreadId:o.platformThreadId}}catch{}return null}};function lS(e){return!!(typeof e=="string"||typeof e=="object"&&e!==null&&Ji(e)||typeof e=="object"&&e!==null&&("markdown"in e||"card"in e||"files"in e))}function cS(e,n){return e}function uS(e,n){var t;for(let r of e){let i=r.toolData;if(r.type==="tool_approval_request"&&(i==null?void 0:i.approvalId)===n&&i.toolCallId)return{approvalId:i.approvalId,toolCallId:i.toolCallId,name:(t=i.toolName)!=null?t:"tool",input:i.input}}}async function If(e){var o;let n=new Do(e.bridge,e.secretKey,e.agent.handlers.toolApproval),{agent:t,event:r,logger:i}=e;try{await pS(t,r,n),await n.flush()}catch(a){let s=Nr(a);i==null||i.error(`[agent:${t.id}] Turn failed (${r}): ${s.message}`,(o=s.cause)!=null?o:s);let u=!1;if(t.handlers.onError)try{let p=await t.handlers.onError(s,cS(n,r));Su(p)?u=!0:lS(p)&&(await n.reply(p),u=!0)}catch(p){i==null||i.error(`[agent:${t.id}] onError failed:`,p)}u||await n.reportTurnError()}finally{try{await n.typing.stop()}catch{}}}async function pS(e,n,t){var i,o;let r=async a=>{a instanceof Zn||a===void 0||await t.reply(a)};switch(n){case"onMessage":{await r(await e.handlers.onMessage(t.message,t));break}case"onAction":{let a=ku((i=t.action)==null?void 0:i.id);if(a&&e.handlers.onToolApproval){let{approved:s,approvalId:u}=a,p=uS(t.history,u),d=p?{id:p.toolCallId,name:p.name,input:p.input}:{id:u,name:""},h=t.createReplyHandle((o=t.action.sourceMessageId)!=null?o:""),y={toolCall:d,approved:s,approvalMessage:h};e.userOnToolApproval===!1&&(await t.typing(),t.action.sourceMessageId&&await h.delete());let g=await e.handlers.onToolApproval(y,t);await r(g);break}e.handlers.onAction&&await r(await e.handlers.onAction(t.action,t));break}case"onReaction":e.handlers.onReaction&&await r(await e.handlers.onReaction(t.reaction,t));break;case"onResolve":e.handlers.onResolve&&await r(await e.handlers.onResolve(t));break;default:throw new Mn(n,ka)}}function Cf(e){let n={};for(let i of e.split(",")){let o=i.trim();if(!o)continue;let a=o.indexOf("=");if(a<=0)continue;let s=o.slice(0,a),u=o.slice(a+1);s&&u&&!(s in n)&&(n[s]=u)}let t=n.t,r=t!==void 0?Number(t):Number.NaN;return{t:Number.isFinite(r)?r:void 0,v1:n.v1}}var ar=class{constructor(n){this.handler=n.handler,this.client=n.client?n.client:new Qn,this.workflows=n.workflows||[],this.agents=n.agents||[],this.http=Di(this.client.secretKey,this.client.apiUrl),this.frameworkName=n.frameworkName,this.hmacEnabled=this.client.strictAuthentication,this.client.addAgents(this.agents)}createHandler(){return async(...n)=>{await this.client.addWorkflows(this.workflows);let t=await this.handler(...n),r=await this.handleAction({actions:t});return t.transformResponse(r)}}getStaticHeaders(){let n=`novu-framework:v${this.client.version}`;return{"content-type":"application/json","access-control-allow-origin":"*","access-control-allow-private-network":"true","access-control-allow-methods":"GET, POST","access-control-allow-headers":"*","access-control-max-age":"604800","novu-framework-version":"2024-06-26","novu-framework-sdk":"2.11.2-alpha.1","novu-framework-server":this.frameworkName,"user-agent":n}}createResponse(n,t){return{status:n,body:JSON.stringify(t),headers:{...this.getStaticHeaders()}}}createError(n){return{status:n.statusCode,body:JSON.stringify({message:n.message,data:n.data,code:n.code}),headers:this.getStaticHeaders()}}async handleAction({actions:n}){let t=await n.url(),r=await n.method(),i=t.searchParams.get("action")||"health-check",o=t.searchParams.get("workflowId")||"",a=t.searchParams.get("stepId")||"",s=t.searchParams.get("agentId")||"",u=t.searchParams.get("event")||"",p=await n.headers("novu-signature")||"",d={};try{r==="POST"&&(d=await n.body())}catch{}try{i!=="health-check"&&await this.validateHmac(d,p);let h=this.getPostActionMap(d,o,a,i,s,u,n.waitUntil),y=this.getGetActionMap(o,a);if(r==="POST")return await this.handlePostAction(i,h);if(r==="GET")return await this.handleGetAction(i,y);if(r==="OPTIONS")return this.createResponse(200,{})}catch(h){return this.handleError(h)}return this.createError(new ki(r))}getPostActionMap(n,t,r,i,o,a,s){return{trigger:this.triggerAction({workflowId:t,...n}),execute:async()=>{let u=await this.client.executeWorkflow({...n,workflowId:t,stepId:r,action:i});return this.createResponse(200,u)},preview:async()=>{let u=await this.client.executeWorkflow({...n,workflowId:t,stepId:r,action:i});return this.createResponse(200,u)},"agent-event":async()=>{let u=this.client.getAgent(o);if(!u)return this.createResponse(404,{error:`Agent '${o}' not registered`});let p=If({agent:u,event:a,bridge:n,secretKey:this.client.secretKey,logger:this.client.logger});return s&&s(p),this.createResponse(200,{status:"ack"})}}}triggerAction(n){return async()=>{let t={name:n.workflowId,to:n.to,payload:(n==null?void 0:n.payload)||{},transactionId:n.transactionId,overrides:n.overrides||{},...n.actor&&{actor:n.actor},...n.bridgeUrl&&{bridgeUrl:n.bridgeUrl},...n.controls&&{controls:n.controls},...n.context&&{context:n.context}},r=await this.http.post("/events/trigger",t);return this.createResponse(200,r)}}getGetActionMap(n,t){return{discover:async()=>{let r=await this.client.discover();return this.createResponse(200,r)},"health-check":async()=>{let r=await this.client.healthCheck();return this.createResponse(200,r)},code:async()=>{let r=await this.client.getCode(n,t);return this.createResponse(200,r)}}}async handlePostAction(n,t){if(Object.values(kr).includes(n)){let r=t[n];return r()}else throw new Mn(n,kr)}async handleGetAction(n,t){if(Object.values(ui).includes(n)){let r=t[n];return r()}else throw new Mn(n,ui)}handleError(n){if(Pn(n))return n.statusCode>=500&&this.client.logger.error(n),this.createError(n);if(Uc(n))return this.createError(n);{let t=new Gn(n);return this.client.logger.error(t),this.createError(t)}}async validateHmac(n,t){if(!this.hmacEnabled)return;if(!t)throw new Oi;if(!this.client.secretKey)throw new Pi;let r=Cf(t);if(!r.v1||r.t===void 0)throw new Ii;let i=Date.now();if(r.t<i-3e5||r.t>i+3e5)throw new Ci;let o=await Yc(this.client.secretKey,`${r.t}.${JSON.stringify(n)}`);if(!Jc(o,r.v1))throw new Ri}};yl();var sr=Symbol.for("workflow-serialize"),lr=Symbol.for("workflow-deserialize");var dS=Object.defineProperty,hS=Object.defineProperties,fS=Object.getOwnPropertyDescriptors,Mf=Object.getOwnPropertySymbols,mS=Object.prototype.hasOwnProperty,gS=Object.prototype.propertyIsEnumerable,Nf=(e,n,t)=>n in e?dS(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,Uf=(e,n)=>{for(var t in n||(n={}))mS.call(n,t)&&Nf(e,t,n[t]);if(Mf)for(var t of Mf(n))gS.call(n,t)&&Nf(e,t,n[t]);return e},$f=(e,n)=>hS(e,fS(n)),It=(e,n)=>{let t=!1,r=!1;for(let i=0;i<n;i+=1){if(e[i]==="\\"&&i+1<e.length&&e[i+1]==="`"){i+=1;continue}if(e.substring(i,i+3)==="```"){r=!r,i+=2;continue}!r&&e[i]==="`"&&(t=!t)}return t||r},yS=(e,n)=>{let t=e.substring(n,n+3)==="```",r=n>0&&e.substring(n-1,n+2)==="```",i=n>1&&e.substring(n-2,n+1)==="```";return t||r||i},bS=e=>{let n=0;for(let t=0;t<e.length;t+=1){if(e[t]==="\\"&&t+1<e.length&&e[t+1]==="`"){t+=1;continue}e[t]==="`"&&!yS(e,t)&&(n+=1)}return n},Rn=(e,n)=>{let t=!1,r=!1,i=-1;for(let o=0;o<e.length;o+=1){if(e[o]==="\\"&&o+1<e.length&&e[o+1]==="`"){o+=1;continue}if(e.substring(o,o+3)==="```"){r=!r,o+=2;continue}if(!r&&e[o]==="`")if(t){if(i<n&&n<o)return!0;t=!1,i=-1}else t=!0,i=o}return!1},wS=/^(\s*(?:[-*+]|\d+[.)]) +)>(=?\s*[$]?\d)/gm,SS=e=>!e||typeof e!="string"||!e.includes(">")?e:e.replace(wS,(n,t,r,i)=>It(e,i)?n:`${t}\\>${r}`),TS=/(\*\*)([^*]*\*?)$/,xS=/(__)([^_]*?)$/,kS=/(\*\*\*)([^*]*?)$/,vS=/(\*)([^*]*?)$/,AS=/(_)([^_]*?)$/,ES=/(`)([^`]*?)$/,_S=/(~~)([^~]*?)$/,Vn=/^[\s_~*`]*$/,qf=/^[\s]*[-*+][\s]+$/,RS=/[\p{L}\p{N}_]/u,OS=/^```[^`\n]*```?$/,IS=/^\*{4,}$/,CS=/(__)([^_]+)_$/,PS=/(~~)([^~]+)~$/,Lf=/~~/g,On=e=>{if(!e)return!1;let n=e.charCodeAt(0);return n>=48&&n<=57||n>=65&&n<=90||n>=97&&n<=122||n===95?!0:RS.test(e)};var MS=(e,n)=>{let t=1;for(let r=n-1;r>=0;r-=1)if(e[r]==="]")t+=1;else if(e[r]==="["&&(t-=1,t===0))return r;return-1},jf=(e,n)=>{let t=1;for(let r=n+1;r<e.length;r+=1)if(e[r]==="[")t+=1;else if(e[r]==="]"&&(t-=1,t===0))return r;return-1},Fo=(e,n)=>{let t=!1,r=!1;for(let i=0;i<e.length&&i<n;i+=1){if(e[i]==="\\"&&e[i+1]==="$"){i+=1;continue}e[i]==="$"&&(e[i+1]==="$"?(r=!r,i+=1,t=!1):r||(t=!t))}return t||r},NS=(e,n)=>{for(let t=n;t<e.length;t+=1){if(e[t]===")")return!0;if(e[t]===`
119
+ `)}async executeProviders(n,t,r){return t.providers.reduce(async(i,o)=>{let a=await i,s=this.previewProvider.bind(this),u=this.executeProvider.bind(this),d=await(n.action==="preview"?s:u)(n,t,o,r);return{...a,[o.type]:d}},Promise.resolve({}))}previewProvider(n,t,r,i){return this.log(` ${ct.MOCK} Mocked provider: \`${r.type}\``),this.mock(r.outputs.schema)}async executeProvider(n,t,r,i){try{if(n.stepId===t.stepId){let o=await this.createStepControls(t,n),a=await r.resolve({controls:o,outputs:i}),s=await this.validate(a,r.outputs.unknownSchema,"step","output",n.workflowId,t.stepId,r.type);return this.log(` ${ct.SUCCESS} Executed provider: \`${r.type}\``),{...s,_passthrough:a._passthrough}}else return this.log(` ${ct.HYDRATED} Hydrated provider: \`${r.type}\``),{}}catch(o){throw this.log(` ${ct.ERROR} Failed to execute provider: \`${r.type}\``),new _i(r.type,n.action,o)}}async executeStep(n,t){if(n.stepId===t.stepId)try{let r=await this.createStepControls(t,n),i=await this.compileControls(r,n),o=await t.resolve(i),a=await this.validate(o,t.outputs.unknownSchema,"step","output",n.workflowId,t.stepId),s=await this.executeProviders(n,t,a);return this.log(` ${ct.SUCCESS} Executed stepId: \`${t.stepId}\``),{outputs:a,providers:s}}catch(r){throw this.log(` ${ct.ERROR} Failed to execute stepId: \`${t.stepId}\``),Pn(r)?r:new _r(t.stepId,n.action,r)}else try{let r=this.getStepState(n,t.stepId);if(r){let i=await this.validate(r.outputs,t.results.unknownSchema,"step","result",n.workflowId,t.stepId);return this.log(` ${ct.HYDRATED} Hydrated stepId: \`${t.stepId}\``),{outputs:i,providers:await this.executeProviders(n,t,i)}}else throw new fi(n.workflowId,t.stepId)}catch(r){throw this.log(` ${ct.ERROR} Failed to hydrate stepId: \`${t.stepId}\``),r}}async compileControls(n,t){var r;try{let i=Cr(n),o=this.preprocessTranslationPatterns(JSON.stringify(i));o=this.preprocessFilterTranslationArgs(o);let a=this.templateEngine.parse(o),s=this.getWorkflow(t.workflowId),u={workflow:{workflowId:s.workflowId,name:s.name,description:s.description,tags:s.tags,severity:s.severity},payload:t.payload,subscriber:t.subscriber,...t.actor&&{actor:t.actor},context:t.context,steps:Lg(t.state),env:(r=t.env)!=null?r:{}},p=await this.templateEngine.render(a,u),d=this.postprocessTranslationMarkers(p),h=(0,bu.jsonrepair)(d),y=JSON.parse(h),g=Pr(y);return hu(g)}catch(i){throw new wi(t.workflowId,t.stepId,i)}}preprocessTranslationPatterns(n){return n.replace(/\{\{\s*t\.([\p{L}\p{N}_.-]+)\s*\}\}/gu,"[T:$1]")}preprocessFilterTranslationArgs(n){return n.replace(/'t\.([\p{L}\p{N}_.-]+)'/gu,"'[T:$1]'")}postprocessTranslationMarkers(n){return n.replace(/\[T:([\p{L}\p{N}_.-]+)\]/gu,"{{t.$1}}")}async createStepControls(n,t){return await this.validate(t.controls,n.controls.unknownSchema,"step","controls",t.workflowId,n.stepId)}async previewStep(n,t){try{return await this.constructStepForPreview(n,t)}catch(r){throw this.log(` ${ct.ERROR} Failed to preview stepId: \`${t.stepId}\``),Pn(r)?r:new _r(t.stepId,n.action,r)}}async constructStepForPreview(n,t){return n.stepId===t.stepId?await this.previewRequiredStep(t,n):await this.extractMockDataForPreviousSteps(n,t)}async extractMockDataForPreviousSteps(n,t){let r={},i=this.getStepState(n,t.stepId),o=this.mock(t.results.schema);return{outputs:Ta(o,(i==null?void 0:i.outputs)||{}),providers:await this.executeProviders(n,t,r)}}async previewRequiredStep(n,t){let r=await this.createStepControls(n,t),i=await this.compileControls(r,t),o=await n.resolve(i),a=await this.validate(o,n.outputs.unknownSchema,"step","output",t.workflowId,n.stepId);return this.log(` ${ct.MOCK} Mocked stepId: \`${n.stepId}\``),{outputs:a,providers:await this.executeProviders(t,n,a)}}getStepState(n,t){return n.state.find(r=>r.stepId===t)}getStepCode(n,t){return{code:this.getStep(n,t).resolve.toString()}}getWorkflowCode(n){return{code:this.getWorkflow(n).execute.toString()}}getCode(n,t){let r;if(n)t?r=this.getStepCode(n,t):r=this.getWorkflowCode(n);else throw new Rr(n);return r}};function Lg(e){let n={};for(let t of e)n[t.stepId]=t.outputs;return n}var Dg={400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",408:"Request Timeout",409:"Conflict",422:"Unprocessable Entity",429:"Too Many Requests",500:"Internal Server Error",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout"};function Yi(e){return typeof e=="string"&&e.trim()?e:!e||typeof e!="object"?null:Yi(e.message)}function Fg(e){if(!e)return null;let n;try{n=JSON.parse(e)}catch{return null}if(!n||typeof n!="object")return null;let t=n,r=Yi(t.message);if(r)return r;let i=Yi(t.error);if(i)return i;let o=t.errors;return Array.isArray(o)?Yi(o[0]):null}function Ug(e,n){var i;let t=(i=Dg[e])!=null?i:e,r=Fg(n);return r?`Delivery failed: ${t}: ${r}`:`Delivery failed: ${t}`}var pn=class extends Error{constructor(n,t){super(n),this.name="AgentError",this.cause=t==null?void 0:t.cause,this.delivery=t==null?void 0:t.delivery}},Dn=class extends pn{constructor(n,t){let r={statusCode:n,responseBody:t};super(Ug(n,t),{delivery:r}),this.name="AgentDeliveryError",this.statusCode=n,this.responseBody=t}};function Nr(e){return e instanceof pn?e:e instanceof Error?new pn(e.message,{cause:e}):new pn("Turn failed",{cause:e})}var wu=Symbol.for("novu.agent.runtimeContext");var ka=(i=>(i.ON_MESSAGE="onMessage",i.ON_ACTION="onAction",i.ON_RESOLVE="onResolve",i.ON_REACTION="onReaction",i))(ka||{}),Zn=class{constructor(){this.__novuPendingApproval=!0}};function Su(e){return typeof e=="object"&&e!==null&&"suppress"in e&&e.suppress===!0}function Ji(e){return"type"in e&&e.type==="card"}function Tu(e){return typeof e=="object"&&e!==null&&e.type==="tool-approval-card"}var xu="tool-approval";function $g(e){return e==="approve"||e==="deny"}function va(e,n){return`${xu}:${e}:${n}`}function ku(e){let[n,t,...r]=(e!=null?e:"").split(":"),i=r.join(":");return n!==xu||!$g(t)||!i?null:{approved:t==="approve",approvalId:i}}async function vu(e,n,t,r){var p,d;let i=r!=null?r:n.id,o={approve:va("approve",i),deny:va("deny",i)},a=h=>({type:"tool-approval-card",...h}),s=(d=(p=t==null?void 0:t.renderApproval)==null?void 0:p.call(t,{toolCall:n,actionIds:o,approvalCard:a}))!=null?d:a(),u={approvalId:i,toolCallId:n.id,name:n.name,input:n.input};if(e.emitToolApprovalRequest(u),Tu(s)){await e.replyApprovalCard(s);return}await e.reply(s)}var tS=5*1024*1024,nS=5*1024*1024,Af=32768,rS=/^[A-Za-z0-9+/]*={0,2}$/;function Kr(e,n){return e.filename?`"${e.filename}"`:`at index ${n}`}function _f(){return globalThis.Buffer}function iS(e){var n,t,r;return(r=(t=(n=_f())==null?void 0:n.isBuffer)==null?void 0:t.call(n,e))!=null?r:!1}function oS(e){return typeof Blob!="undefined"&&e instanceof Blob}function bl(e){let n=_f();if(n)return n.from(e).toString("base64");if(typeof btoa!="function")throw new Error("Unable to encode file data: base64 encoding is not available in this runtime.");let t="";for(let r=0;r<e.length;r+=Af){let i=e.subarray(r,r+Af);t+=String.fromCharCode(...i)}return btoa(t)}function Rf(e){let n=e.replace(/\s/g,""),t=n.length%4;if(!n||t===1||!rS.test(n))return null;let r=n.endsWith("==")?2:n.endsWith("=")?1:0;return Math.floor(n.length*3/4)-r}function Jr(e,n,t){if(e>tS)throw new Error(`Invalid file ${Kr(n,t)}: inline data must be 5 MB or smaller. Use a publicly-accessible URL for larger files.`)}async function aS(e,n,t){if(typeof e=="string"){let r=Rf(e);if(r===null)throw new Error(`Invalid file ${Kr(n,t)}: data must be a base64-encoded string.`);return Jr(r,n,t),e}if(iS(e))return Jr(e.byteLength,n,t),e.toString("base64");if(e instanceof Uint8Array)return Jr(e.byteLength,n,t),bl(e);if(e instanceof ArrayBuffer)return Jr(e.byteLength,n,t),bl(new Uint8Array(e));if(oS(e))return Jr(e.size,n,t),bl(new Uint8Array(await e.arrayBuffer()));throw new Error(`Invalid file ${Kr(n,t)}: data must be a base64 string, Buffer, Uint8Array, ArrayBuffer, or Blob.`)}async function sS(e){if(!(e!=null&&e.length))return;let n=[],t=0;for(let[r,i]of e.entries()){let o=i.data,a=i.url,s=o!=null,u=a!=null;if(s===u)throw new Error(`Invalid file ${Kr(i,r)}: provide exactly one of data or url.`);if(s){let p=await aS(o,i,r),d=Rf(p);if(t+=d!=null?d:0,t>nS)throw new Error("Invalid files: total inline data must be 5 MB or smaller. Use publicly-accessible URLs for larger files.");n.push({...i,data:p});continue}if(u&&typeof a!="string")throw new Error(`Invalid file ${Kr(i,r)}: url must be a string.`);n.push(i)}return n}async function Of(e,n){let t=await sS(n);if(typeof e=="string")return t?{markdown:e,files:t}:{markdown:e};let{isJSX:r,toCardElement:i}=await Promise.resolve().then(()=>(vf(),kf));if(r(e)){let o=i(e);if(o)return t?{card:o,files:t}:{card:o}}if(Ji(e))return t?{card:e,files:t}:{card:e};throw new Error("Invalid message content \u2014 expected string or CardElement")}var Gr=class{constructor(n,t,r,i,o){this.conversationId=r;this.integrationIdentifier=i;this.poster=o;this.editedByHandler=!1;this.messageId=n,this.platformThreadId=t}async edit(n,t){this.editedByHandler=!0;let r=await this.poster.post({conversationId:this.conversationId,integrationIdentifier:this.integrationIdentifier,edit:{messageId:this.messageId,content:await Of(n,t==null?void 0:t.files)}});if(!r)throw new Error("Agent edit did not return a message handle");return this.messageId=r.messageId,this.platformThreadId=r.platformThreadId,this}async delete(){await this.poster.post({conversationId:this.conversationId,integrationIdentifier:this.integrationIdentifier,deleteMessages:[{messageId:this.messageId}]})}},Ef;Ef=wu;var Do=class{constructor(n,t,r){this[Ef]=!0;this._signals=[];this._toolResults=[];this._pendingToolApprovalRequest=null;this._pendingReactions=[];this._pendingDeletes=[];this._resolveSignal=null;var s,u;this.event=n.event,this.action=(s=n.action)!=null?s:null,this.message=n.message,this.reaction=n.reaction,this.conversation=n.conversation,this.subscriber=n.subscriber,this.history=n.history,this.platform=n.platform,this.platformContext=n.platformContext,this._replyUrl=n.replyUrl,this._conversationId=n.conversationId,this._integrationIdentifier=n.integrationIdentifier,this._secretKey=t,this._poster={post:p=>this._post(p)},this._toolApprovalConfig=r,this._metadataState={...(u=n.conversation.metadata)!=null?u:{}};let i=this;this.metadata={get(p){return i._metadataState[p]},set(p,d){i._metadataState[p]=d,i._signals.push({type:"metadata",action:"set",key:p,value:d})},delete(p){delete i._metadataState[p],i._signals.push({type:"metadata",action:"delete",key:p})},clear(){i._metadataState={},i._signals.push({type:"metadata",action:"clear"})},get current(){return{...i._metadataState}}};let o=p=>this._post({conversationId:this._conversationId,integrationIdentifier:this._integrationIdentifier,typing:p}).then(()=>{}),a=(p=>o(p===void 0?{}:{status:p}));a.stop=()=>o("stop"),this.typing=a,this.toolApproval={request:async p=>(await vu(this,p,this._toolApprovalConfig),new Zn)}}asMessageContext(){return this}async reply(n,t){let r=await Of(n,t==null?void 0:t.files),i={conversationId:this._conversationId,integrationIdentifier:this._integrationIdentifier,reply:r};this._drainSideEffects(i);let o=await this._post(i);if(!o)throw new Error("Agent reply did not return a message handle");return new Gr(o.messageId,o.platformThreadId,this._conversationId,this._integrationIdentifier,this._poster)}async replyApprovalCard(n){let t={conversationId:this._conversationId,integrationIdentifier:this._integrationIdentifier,reply:{toolApprovalCard:n}};this._drainSideEffects(t);let r=await this._post(t);if(!r)throw new Error("Agent approval card reply did not return a message handle");return new Gr(r.messageId,r.platformThreadId,this._conversationId,this._integrationIdentifier,this._poster)}createReplyHandle(n){return new Gr(n,"",this._conversationId,this._integrationIdentifier,this._poster)}resolve(n){this._resolveSignal={summary:n}}trigger(n,t){this._signals.push({...t,type:"trigger",workflowId:n})}emitToolApprovalRequest(n){if(this._pendingToolApprovalRequest)throw new Error("Only one tool approval request can be queued before the next reply");this._pendingToolApprovalRequest=n}emitToolResult(n){this._toolResults.push(n)}addReaction(n,t){this._pendingReactions.push({messageId:n,emojiName:t})}deleteMessage(n){this._pendingDeletes.push({messageId:n})}async reportTurnError(){try{await this._post({conversationId:this._conversationId,integrationIdentifier:this._integrationIdentifier,error:!0})}catch(n){console.error("[agent] Failed to report turn error:",n)}}async flush(){if(!this._hasPendingSideEffects())return;let n={conversationId:this._conversationId,integrationIdentifier:this._integrationIdentifier};this._drainSideEffects(n),await this._post(n)}_hasPendingSideEffects(){return!!(this._pendingToolApprovalRequest||this._signals.length||this._toolResults.length||this._resolveSignal||this._pendingReactions.length||this._pendingDeletes.length)}_drainSideEffects(n){this._pendingToolApprovalRequest&&(n.toolApprovalRequest=this._pendingToolApprovalRequest,this._pendingToolApprovalRequest=null),this._signals.length&&(n.signals=this._signals,this._signals=[]),this._toolResults.length&&(n.toolResults=this._toolResults,this._toolResults=[]),this._pendingReactions.length&&(n.addReactions=this._pendingReactions,this._pendingReactions=[]),this._pendingDeletes.length&&(n.deleteMessages=this._pendingDeletes,this._pendingDeletes=[]),this._resolveSignal&&(n.resolve=this._resolveSignal,this._resolveSignal=null)}async _post(n){let t=await fetch(this._replyUrl,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`ApiKey ${this._secretKey}`},body:JSON.stringify(n)});if(!t.ok){let i=await t.text().catch(()=>"");throw new Dn(t.status,i)}let r=await t.text().catch(()=>"");if(!r)return null;try{let i=JSON.parse(r),o=i&&typeof i=="object"&&"data"in i?i.data:i;if(o&&typeof o.messageId=="string"&&typeof o.platformThreadId=="string")return{messageId:o.messageId,platformThreadId:o.platformThreadId}}catch{}return null}};function lS(e){return!!(typeof e=="string"||typeof e=="object"&&e!==null&&Ji(e)||typeof e=="object"&&e!==null&&("markdown"in e||"card"in e||"files"in e))}function cS(e,n){return e}function uS(e,n){var t;for(let r of e){let i=r.toolData;if(r.type==="tool_approval_request"&&(i==null?void 0:i.approvalId)===n&&i.toolCallId)return{approvalId:i.approvalId,toolCallId:i.toolCallId,name:(t=i.toolName)!=null?t:"tool",input:i.input}}}async function If(e){var o;let n=new Do(e.bridge,e.secretKey,e.agent.handlers.toolApproval),{agent:t,event:r,logger:i}=e;try{await pS(t,r,n),await n.flush()}catch(a){let s=Nr(a);i==null||i.error(`[agent:${t.id}] Turn failed (${r}): ${s.message}`,(o=s.cause)!=null?o:s);let u=!1;if(t.handlers.onError)try{let p=await t.handlers.onError(s,cS(n,r));Su(p)?u=!0:lS(p)&&(await n.reply(p),u=!0)}catch(p){i==null||i.error(`[agent:${t.id}] onError failed:`,p)}u||await n.reportTurnError()}finally{try{await n.typing.stop()}catch{}}}async function pS(e,n,t){var i,o;let r=async a=>{a instanceof Zn||a===void 0||await t.reply(a)};switch(n){case"onMessage":{await r(await e.handlers.onMessage(t.message,t));break}case"onAction":{let a=ku((i=t.action)==null?void 0:i.id);if(a&&e.handlers.onToolApproval){let{approved:s,approvalId:u}=a,p=uS(t.history,u),d=p?{id:p.toolCallId,name:p.name,input:p.input}:{id:u,name:""},h=t.createReplyHandle((o=t.action.sourceMessageId)!=null?o:""),y={toolCall:d,approved:s,approvalMessage:h};e.userOnToolApproval===!1&&(await t.typing(),t.action.sourceMessageId&&await h.delete());let g=await e.handlers.onToolApproval(y,t);await r(g);break}e.handlers.onAction&&await r(await e.handlers.onAction(t.action,t));break}case"onReaction":e.handlers.onReaction&&await r(await e.handlers.onReaction(t.reaction,t));break;case"onResolve":e.handlers.onResolve&&await r(await e.handlers.onResolve(t));break;default:throw new Mn(n,ka)}}function Cf(e){let n={};for(let i of e.split(",")){let o=i.trim();if(!o)continue;let a=o.indexOf("=");if(a<=0)continue;let s=o.slice(0,a),u=o.slice(a+1);s&&u&&!(s in n)&&(n[s]=u)}let t=n.t,r=t!==void 0?Number(t):Number.NaN;return{t:Number.isFinite(r)?r:void 0,v1:n.v1}}var ar=class{constructor(n){this.handler=n.handler,this.client=n.client?n.client:new Qn,this.workflows=n.workflows||[],this.agents=n.agents||[],this.http=Di(this.client.secretKey,this.client.apiUrl),this.frameworkName=n.frameworkName,this.hmacEnabled=this.client.strictAuthentication,this.client.addAgents(this.agents)}createHandler(){return async(...n)=>{await this.client.addWorkflows(this.workflows);let t=await this.handler(...n),r=await this.handleAction({actions:t});return t.transformResponse(r)}}getStaticHeaders(){let n=`novu-framework:v${this.client.version}`;return{"content-type":"application/json","access-control-allow-origin":"*","access-control-allow-private-network":"true","access-control-allow-methods":"GET, POST","access-control-allow-headers":"*","access-control-max-age":"604800","novu-framework-version":"2024-06-26","novu-framework-sdk":"2.12.0","novu-framework-server":this.frameworkName,"user-agent":n}}createResponse(n,t){return{status:n,body:JSON.stringify(t),headers:{...this.getStaticHeaders()}}}createError(n){return{status:n.statusCode,body:JSON.stringify({message:n.message,data:n.data,code:n.code}),headers:this.getStaticHeaders()}}async handleAction({actions:n}){let t=await n.url(),r=await n.method(),i=t.searchParams.get("action")||"health-check",o=t.searchParams.get("workflowId")||"",a=t.searchParams.get("stepId")||"",s=t.searchParams.get("agentId")||"",u=t.searchParams.get("event")||"",p=await n.headers("novu-signature")||"",d={};try{r==="POST"&&(d=await n.body())}catch{}try{i!=="health-check"&&await this.validateHmac(d,p);let h=this.getPostActionMap(d,o,a,i,s,u,n.waitUntil),y=this.getGetActionMap(o,a);if(r==="POST")return await this.handlePostAction(i,h);if(r==="GET")return await this.handleGetAction(i,y);if(r==="OPTIONS")return this.createResponse(200,{})}catch(h){return this.handleError(h)}return this.createError(new ki(r))}getPostActionMap(n,t,r,i,o,a,s){return{trigger:this.triggerAction({workflowId:t,...n}),execute:async()=>{let u=await this.client.executeWorkflow({...n,workflowId:t,stepId:r,action:i});return this.createResponse(200,u)},preview:async()=>{let u=await this.client.executeWorkflow({...n,workflowId:t,stepId:r,action:i});return this.createResponse(200,u)},"agent-event":async()=>{let u=this.client.getAgent(o);if(!u)return this.createResponse(404,{error:`Agent '${o}' not registered`});let p=If({agent:u,event:a,bridge:n,secretKey:this.client.secretKey,logger:this.client.logger});return s&&s(p),this.createResponse(200,{status:"ack"})}}}triggerAction(n){return async()=>{let t={name:n.workflowId,to:n.to,payload:(n==null?void 0:n.payload)||{},transactionId:n.transactionId,overrides:n.overrides||{},...n.actor&&{actor:n.actor},...n.bridgeUrl&&{bridgeUrl:n.bridgeUrl},...n.controls&&{controls:n.controls},...n.context&&{context:n.context}},r=await this.http.post("/events/trigger",t);return this.createResponse(200,r)}}getGetActionMap(n,t){return{discover:async()=>{let r=await this.client.discover();return this.createResponse(200,r)},"health-check":async()=>{let r=await this.client.healthCheck();return this.createResponse(200,r)},code:async()=>{let r=await this.client.getCode(n,t);return this.createResponse(200,r)}}}async handlePostAction(n,t){if(Object.values(kr).includes(n)){let r=t[n];return r()}else throw new Mn(n,kr)}async handleGetAction(n,t){if(Object.values(ui).includes(n)){let r=t[n];return r()}else throw new Mn(n,ui)}handleError(n){if(Pn(n))return n.statusCode>=500&&this.client.logger.error(n),this.createError(n);if(Uc(n))return this.createError(n);{let t=new Gn(n);return this.client.logger.error(t),this.createError(t)}}async validateHmac(n,t){if(!this.hmacEnabled)return;if(!t)throw new Oi;if(!this.client.secretKey)throw new Pi;let r=Cf(t);if(!r.v1||r.t===void 0)throw new Ii;let i=Date.now();if(r.t<i-3e5||r.t>i+3e5)throw new Ci;let o=await Yc(this.client.secretKey,`${r.t}.${JSON.stringify(n)}`);if(!Jc(o,r.v1))throw new Ri}};yl();var sr=Symbol.for("workflow-serialize"),lr=Symbol.for("workflow-deserialize");var dS=Object.defineProperty,hS=Object.defineProperties,fS=Object.getOwnPropertyDescriptors,Mf=Object.getOwnPropertySymbols,mS=Object.prototype.hasOwnProperty,gS=Object.prototype.propertyIsEnumerable,Nf=(e,n,t)=>n in e?dS(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,Uf=(e,n)=>{for(var t in n||(n={}))mS.call(n,t)&&Nf(e,t,n[t]);if(Mf)for(var t of Mf(n))gS.call(n,t)&&Nf(e,t,n[t]);return e},$f=(e,n)=>hS(e,fS(n)),It=(e,n)=>{let t=!1,r=!1;for(let i=0;i<n;i+=1){if(e[i]==="\\"&&i+1<e.length&&e[i+1]==="`"){i+=1;continue}if(e.substring(i,i+3)==="```"){r=!r,i+=2;continue}!r&&e[i]==="`"&&(t=!t)}return t||r},yS=(e,n)=>{let t=e.substring(n,n+3)==="```",r=n>0&&e.substring(n-1,n+2)==="```",i=n>1&&e.substring(n-2,n+1)==="```";return t||r||i},bS=e=>{let n=0;for(let t=0;t<e.length;t+=1){if(e[t]==="\\"&&t+1<e.length&&e[t+1]==="`"){t+=1;continue}e[t]==="`"&&!yS(e,t)&&(n+=1)}return n},Rn=(e,n)=>{let t=!1,r=!1,i=-1;for(let o=0;o<e.length;o+=1){if(e[o]==="\\"&&o+1<e.length&&e[o+1]==="`"){o+=1;continue}if(e.substring(o,o+3)==="```"){r=!r,o+=2;continue}if(!r&&e[o]==="`")if(t){if(i<n&&n<o)return!0;t=!1,i=-1}else t=!0,i=o}return!1},wS=/^(\s*(?:[-*+]|\d+[.)]) +)>(=?\s*[$]?\d)/gm,SS=e=>!e||typeof e!="string"||!e.includes(">")?e:e.replace(wS,(n,t,r,i)=>It(e,i)?n:`${t}\\>${r}`),TS=/(\*\*)([^*]*\*?)$/,xS=/(__)([^_]*?)$/,kS=/(\*\*\*)([^*]*?)$/,vS=/(\*)([^*]*?)$/,AS=/(_)([^_]*?)$/,ES=/(`)([^`]*?)$/,_S=/(~~)([^~]*?)$/,Vn=/^[\s_~*`]*$/,qf=/^[\s]*[-*+][\s]+$/,RS=/[\p{L}\p{N}_]/u,OS=/^```[^`\n]*```?$/,IS=/^\*{4,}$/,CS=/(__)([^_]+)_$/,PS=/(~~)([^~]+)~$/,Lf=/~~/g,On=e=>{if(!e)return!1;let n=e.charCodeAt(0);return n>=48&&n<=57||n>=65&&n<=90||n>=97&&n<=122||n===95?!0:RS.test(e)};var MS=(e,n)=>{let t=1;for(let r=n-1;r>=0;r-=1)if(e[r]==="]")t+=1;else if(e[r]==="["&&(t-=1,t===0))return r;return-1},jf=(e,n)=>{let t=1;for(let r=n+1;r<e.length;r+=1)if(e[r]==="[")t+=1;else if(e[r]==="]"&&(t-=1,t===0))return r;return-1},Fo=(e,n)=>{let t=!1,r=!1;for(let i=0;i<e.length&&i<n;i+=1){if(e[i]==="\\"&&e[i+1]==="$"){i+=1;continue}e[i]==="$"&&(e[i+1]==="$"?(r=!r,i+=1,t=!1):r||(t=!t))}return t||r},NS=(e,n)=>{for(let t=n;t<e.length;t+=1){if(e[t]===")")return!0;if(e[t]===`
120
120
  `)return!1}return!1},Bf=(e,n)=>{for(let t=n-1;t>=0;t-=1){if(e[t]===")")return!1;if(e[t]==="(")return t>0&&e[t-1]==="]"?NS(e,n):!1;if(e[t]===`
121
121
  `)return!1}return!1},LS=(e,n)=>{for(let t=n-1;t>=0;t-=1){if(e[t]===">")return!1;if(e[t]==="<"){let r=t+1<e.length?e[t+1]:"";return r>="a"&&r<="z"||r>="A"&&r<="Z"||r==="/"}if(e[t]===`
122
122
  `)return!1}return!1},Sl=(e,n,t)=>{let r=0;for(let u=n-1;u>=0;u-=1)if(e[u]===`
@@ -89,10 +89,10 @@ et dolore magna aliqua Ut enim ad minim veniam quis nostrud exercitation ullamco
89
89
  commodo consequat Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
90
90
  pariatur Excepteur sint occaecat cupidatat non proident sunt in culpa qui officia deserunt mollit anim id est
91
91
  laborum`.split(/\W/),Tt=Ki,Rt={type:He.ALLOWED_TYPES},dn=Ji,sr=Gi,hn=Qi,kt=zi,gn=Xi,mn=Zi,or="[a-zA-Z][a-zA-Z0-9+-.]*",_t=`https?://{hostname}(?:${or})+`,yn="(?:\\?([a-z]{1,7}(=\\w{1,5})?&){0,3})?",De={email:"[a-zA-Z\\d][a-zA-Z\\d-]{1,13}[a-zA-Z\\d]@{hostname}",hostname:"[a-zA-Z]{1,33}\\.[a-z]{2,4}",ipv6:"[a-f\\d]{4}(:[a-f\\d]{4}){7}",uri:_t,slug:"[a-zA-Z\\d_-]+","uri-reference":`${_t}${yn}`,"uri-template":_t.replace("(?:","(?:/\\{[a-z][:a-zA-Z0-9-]*\\}|"),"json-pointer":`(/(?:${or.replace("]*","/]*")}|~[01]))+`,uuid:"^[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$",duration:"^P(?!$)((\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+S)?)?|(\\d+W)?)$"},De.iri=De["uri-reference"],De["iri-reference"]=De["uri-reference"],De["idn-email"]=De.email,De["idn-hostname"]=De.hostname,wn=new RegExp(`\\{(${Object.keys(De).join("|")})\\}`),Sn=es,An=rs,En={boolean:on,null:cn,array:un,integer:fn,number:ir,object:dn,string:An},ct=En,On=Ze,vn=({refs:e,schema:t,container:r,synchronous:l,refDepthMax:c,refDepthMin:p})=>{let f={},E={},$=0,A,D;return f.resolveSchema=(T,Y,j)=>{if(T==null)return null;if(typeof T.generate=="function")return T;if(typeof(T.$id||T.id)=="string"&&(delete T.id,delete T.$id,delete T.$schema),typeof T.$ref=="string"){let Q=Math.max(p,c)-1;if(T.$ref==="#"||E[T.$ref]<0||A===T.$ref&&++$>Q)return T.$ref!=="#"&&D&&D.length===j.length?ue.getLocalRef(t,T.$ref,l&&e):(delete T.$ref,T);typeof E[T.$ref]=="undefined"&&(E[T.$ref]=X.number(p,c)-1),D=j,A=T.$ref;let te;T.$ref.indexOf("#/")===-1?te=e[T.$ref]||null:te=ue.getLocalRef(t,T.$ref,l&&e)||null;let pe;if(typeof te!="undefined"){if(!te&&ee("ignoreMissingRefs")!==!0)throw new Error(`Reference not found: ${T.$ref}`);E[T.$ref]-=1,ue.merge(T,te||{}),pe=l&&te&&te.$ref}return pe||delete T.$ref,T}if(Array.isArray(T.allOf)){let Q=T.allOf;delete T.allOf,Q.forEach(te=>{let pe=f.resolveSchema(te,null,j);ue.merge(T,typeof pe.thunk=="function"?pe.thunk(T):pe),Array.isArray(T.allOf)&&f.resolveSchema(T,Y,j)})}if(Array.isArray(T.oneOf||T.anyOf)&&j[j.length-2]!=="dependencies"){let Q=T.oneOf||T.anyOf;return T.enum&&T.oneOf&&(T.enum=T.enum.filter(te=>ue.validate(te,Q))),{thunk(te){let pe=ue.omitProps(T,["anyOf","oneOf"]),he=X.pick(Q);return ue.merge(pe,he),Q.forEach(F=>{F.required&&F!==he&&F.required.forEach(y=>{if(he.required&&he.required.includes(y))return;let S=pe.required&&pe.required.includes(y);pe.properties&&!S&&delete pe.properties[y],te&&te.properties&&delete te.properties[y]})}),pe}}}if(Object.keys(T).forEach(Q=>{(Array.isArray(T[Q])||typeof T[Q]=="object")&&!ue.isKey(Q)&&(T[Q]=f.resolveSchema(T[Q],Q,j.concat(Q)))}),j){let Q=j[j.length-1];if(Q==="properties"||Q==="items")return T}return r.wrap(T)},f},bn=vn,ar=os,lr=as,Pe=Jt(Br(),1),us=Pe.default.binaryOptions,fs=Pe.default.boolOptions,ps=Pe.default.intOptions,ds=Pe.default.nullOptions,hs=Pe.default.strOptions,gs=Pe.default.Schema,ms=Pe.default.Alias,ys=Pe.default.Collection,ws=Pe.default.Merge,Ss=Pe.default.Node,As=Pe.default.Pair,Es=Pe.default.Scalar,Tn=Pe.default.YAMLMap,Rn=Pe.default.YAMLSeq,ut=cs,qe=new Zr,Ae=(e,t,r)=>(console.debug("[json-schema-faker] calling JSONSchemaFaker() is deprecated, call either .generate() or .resolve()"),r&&console.debug("[json-schema-faker] local references are only supported by calling .resolve()"),Ae.generate(e,t)),Ae.generateWithContext=(e,t)=>{let r=_r(t,e);return ar(r,e,qe,!0)},Ae.generate=(e,t)=>lr(Ae.generateWithContext(e,t)),Ae.generateYAML=(e,t)=>ut(Ae.generateWithContext(e,t)),Ae.resolveWithContext=(e,t,r)=>{typeof t=="string"&&(r=t,t={}),r=r||(typeof process!="undefined"&&typeof process.cwd=="function"?process.cwd():""),r=`${r.replace(/\/+$/,"")}/`;let l=_r(t,e),c={order:1,canRead(f){let E=f.url.replace("/:",":");return l[E]||l[E.split("/").pop()]},read(f,E){try{E(null,this.canRead(f))}catch($){E($)}}},{$RefParser:p}=Xt();return p.bundle(r,e,{resolve:{file:{order:100},http:{order:200},fixedRefs:c},dereference:{circular:"ignore"}}).then(f=>ar(l,f,qe)).catch(f=>{throw new Error(`Error while resolving schema (${f.message})`)})},Ae.resolve=(e,t,r)=>Ae.resolveWithContext(e,t,r).then(lr),Ae.resolveYAML=(e,t,r)=>Ae.resolveWithContext(e,t,r).then(ut),kr(),Ae.format=nr,Ae.option=ee,Ae.random=X,Ae.extend=(e,t)=>(qe.extend(e,t),Ae),Ae.define=(e,t)=>(qe.define(e,t),Ae),Ae.reset=e=>(qe.reset(e),kr(),Ae),Ae.locate=e=>qe.get(e),Ae.VERSION="0.5.5",kn={...Ae},_n=Ae}}),vs=W({"src/src/main.iife.js"(e,t){var r=(Os(),z(se));typeof $RefParser!="undefined"&&typeof JSONPath!="undefined"&&r.setDependencies({...JSONPath,$RefParser}),typeof window!="undefined"&&(window.JSONSchemaFaker=r.default),t.exports=r.default,t.exports.JSONSchemaFaker=r.JSONSchemaFaker}});return vs()})();((w,i)=>{w.JSONSchemaFaker=i()})(typeof self!="undefined"?self:typeof window!="undefined"?window:globalThis,()=>xt);xt.random.shuffle=function(){return["[placeholder]"]};xt.option({useDefaultValue:!0,alwaysFakeOptionals:!0});function ui(w){return xt.generate(w)}var fi=async(w,i)=>{let a=new TextEncoder,m=a.encode(w),b=a.encode(i),W=await crypto.subtle.importKey("raw",m,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]),I=await crypto.subtle.sign("HMAC",W,b);return Array.from(new Uint8Array(I)).map(V=>V.toString(16).padStart(2,"0")).join("")},pi=(w,i)=>{if(typeof w!="string"||typeof i!="string"||w.length!==i.length)return!1;let a=0;for(let m=0;m<w.length;m+=1)a|=w.charCodeAt(m)^i.charCodeAt(m);return a===0};import{Response as Ds}from"cross-fetch";var Mo=()=>typeof Response!="undefined"?Response:Ds,di=async()=>{if(process.env.NOVU_BRIDGE_ORIGIN)return`${process.env.NOVU_BRIDGE_ORIGIN}/api/novu`;if(process.env.NEXT_PUBLIC_VERCEL_ENV==="preview"&&process.env.NEXT_PUBLIC_VERCEL_URL)return`https://${process.env.NEXT_PUBLIC_VERCEL_URL}/api/novu`;try{if(process.env.NODE_ENV==="development"||process.env.NODE_ENV==="dev"){let i=await(await fetch("http://localhost:2022/.well-known/novu")).json();return`${i.tunnelOrigin}${i.route}`}}catch(w){console.error(w)}return""};function hi(w){return!!w&&typeof w=="object"&&"error"in w&&"message"in w&&"statusCode"in w}var Lt=(w,i)=>{if(!w)throw new Fn;return{post:async(a,m)=>{let b=await fetch(`${i}/v1${a}`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`ApiKey ${w}`},body:JSON.stringify(m)}),W=await b.json();if(b.ok)return W;throw hi(W)?new Bn(W.statusCode,W.error,W.message):new Nt(W)},delete:async a=>(await fetch(`${i}/v1${a}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:`ApiKey ${w}`}})).json()}};import rt from"chalk";var me={info:w=>rt.blue(w),warning:w=>rt.yellow(w),error:w=>rt.red(w),success:w=>rt.green(w),underline:w=>rt.underline(w),bold:w=>rt.bold(w)},Re={SUCCESS:me.success("\u2714"),ERROR:me.error("\u2717"),WARNING:me.warning("\u26A0"),INFO:me.info("\u2139"),ARROW:me.bold("\u2192"),MOCK:me.info("\u25CB"),HYDRATED:me.bold(me.info("\u2192")),STEP:me.info("\u03C3"),ACTION:me.info("\u03B1"),DURATION:me.info("\u0394"),PROVIDER:me.info("\u2699"),OUTPUT:me.info("\u21E2"),INPUT:me.info("\u21E0"),WORKFLOW:me.info("\u03C9"),STATE:me.info("\u03C3"),EXECUTE:me.info("\u03B5"),PREVIEW:me.info("\u03C1")};function $t(w){return w||process.env.NOVU_API_URL||"https://api.novu.co"}function Dt(w){return w||process.env.NOVU_SECRET_KEY||process.env.NOVU_API_KEY||""}import mi from"sanitize-html";var Ws=["src","alt","width","height","loading","srcset","sizes","crossorigin","usemap","ismap","class","id","style","title","dir","lang"];function Fs(w){return w.toLowerCase().startsWith("on")}function Bs(w){return w.replace(/<\/([a-zA-Z][a-zA-Z0-9]*)\s*\/[^>]*>/g,"</$1>")}var js={allowedTags:mi.defaults.allowedTags.concat(["style","img","html","head","body","link","meta","title"]),allowedAttributes:!1,transformTags:{"*":(w,i)=>{let a={};for(let[m,b]of Object.entries(i))Fs(m)||(a[m]=b);return{tagName:w,attribs:a}},img:(w,i)=>{let a={};for(let[m,b]of Object.entries(i))Ws.includes(m.toLowerCase())&&(a[m]=b);return{tagName:w,attribs:a}}},allowVulnerableTags:!0,parseStyleAttributes:!1,parser:{lowerCaseAttributeNames:!0}},gi=w=>{if(!w)return w;let i=Bs(w),a=/^<!DOCTYPE .*?>/,m=i.match(a),b=mi(i,js);return m?m[0]+b:b},Wt=w=>Object.keys(w).reduce((i,a)=>{let m=w[a];return typeof m=="string"?i[a]=gi(m):Array.isArray(m)?i[a]=m.map(b=>typeof b=="string"?gi(b):typeof b=="object"?Wt(b):b):typeof m=="object"&&m!==null?i[a]=Wt(m):i[a]=m,i},{});function yi(w,i=!0,a=console){i&&(a.info(`
92
- ${me.bold(me.underline("Discovered workflowId:"))} '${w.workflowId}'`),w.steps.forEach((m,b)=>{let W=b===w.steps.length-1,I=W?"\u2514":"\u251C";a.info(`${I} ${Re.STEP} Discovered stepId: '${m.stepId}' Type: '${m.type}'`),m.providers.forEach((V,z)=>{let se=z===m.providers.length-1,Te=W?" ":"\u2502",ye=se?"\u2514":"\u251C";a.info(`${Te} ${ye} ${Re.PROVIDER} Discovered provider: '${V.type}'`)})}))}import{jsonrepair as Us}from"jsonrepair";function wi(w){let i=w.trim();return(i.startsWith("{")&&i.endsWith("}")||i.startsWith("[")&&i.endsWith("]"))&&i.length>2}var Si="__novuJsonString";function Hs(w){return typeof w=="object"&&w!==null&&!Array.isArray(w)&&w[Si]===!0}function mt(w){if(typeof w=="string"){if(!wi(w))return w;try{let i=JSON.parse(w);return{[Si]:!0,value:mt(i)}}catch{return w}}if(Array.isArray(w))return w.map(i=>mt(i));if(w&&typeof w=="object"){let i={};for(let[a,m]of Object.entries(w))i[a]=mt(m);return i}return w}function yt(w){if(Hs(w))return JSON.stringify(yt(w.value));if(Array.isArray(w))return w.map(i=>yt(i));if(w&&typeof w=="object"){let i={};for(let[a,m]of Object.entries(w))i[a]=yt(m);return i}return w}function Ys(w){try{return JSON.parse(w),w}catch{try{return Us(w)}catch{return w}}}function Ai(w){return Object.fromEntries(Object.entries(w).map(([i,a])=>typeof a=="string"?[i,wi(a)?Ys(a):a]:typeof a=="object"&&a!==null&&!Array.isArray(a)?[i,Ai(a)]:[i,a]))}function Ei(w){return!(w!=null&&w.data)||typeof w.data!="object"||Array.isArray(w.data)?w:{...w,data:Ai(w.data)}}function Oi(){return["development",void 0,"dev"].includes(process.env.NODE_ENV)}var wt=class{constructor(i){this.discoveredWorkflows=new Map;this.discoverWorkflowPromises=new Map;this.registeredAgents=new Map;this.version="2.11.2-alpha.1";let a=this.buildOptions(i);this.apiUrl=a.apiUrl,this.secretKey=a.secretKey,this.strictAuthentication=a.strictAuthentication,this.verbose=a.verbose,this.logger=a.logger,this.templateEngine=zn()}buildOptions(i){let a={apiUrl:$t(i==null?void 0:i.apiUrl),secretKey:Dt(i==null?void 0:i.secretKey),strictAuthentication:!Oi(),verbose:Oi(),logger:console};return(i==null?void 0:i.strictAuthentication)!==void 0?a.strictAuthentication=i.strictAuthentication:process.env.NOVU_STRICT_AUTHENTICATION_ENABLED!==void 0&&(a.strictAuthentication=process.env.NOVU_STRICT_AUTHENTICATION_ENABLED==="true"),(i==null?void 0:i.verbose)!==void 0&&(a.verbose=i.verbose),(i==null?void 0:i.logger)!==void 0&&(a.logger=i.logger),a}log(...i){this.verbose&&this.logger.info(...i)}async addWorkflows(i){for(let a of i){if(this.discoveredWorkflows.has(a.id))continue;let m=this.discoverWorkflowPromises.get(a.id);if(m){await m;continue}let b=this.addWorkflow(a);this.discoverWorkflowPromises.set(a.id,b),await b}}addAgents(i){for(let a of i)this.registeredAgents.set(a.id,a)}getAgent(i){return this.registeredAgents.get(i)}async addWorkflow(i){try{let a=await i.discover();yi(a,this.verbose,this.logger),this.discoveredWorkflows.set(i.id,a)}finally{this.discoverWorkflowPromises.delete(i.id)}}healthCheck(){let i=this.getRegisteredWorkflows(),a=i.length,m=i.reduce((b,W)=>b+W.steps.length,0);return{status:"ok",sdkVersion:"2.11.2-alpha.1",frameworkVersion:"2024-06-26",discovered:{workflows:a,steps:m}}}getWorkflow(i){let a=this.discoveredWorkflows.get(i);if(a)return a;throw new dr(i)}getStep(i,a){let b=this.getWorkflow(i).steps.find(W=>W.stepId===a);if(b)return b;throw new Jn(a)}getRegisteredWorkflows(){return Array.from(this.discoveredWorkflows.values())}discover(){return{workflows:this.getRegisteredWorkflows(),agents:Array.from(this.registeredAgents.keys()).map(i=>({agentId:i}))}}mock(i){try{return ui(i)}catch(a){return this.logger.warn("Failed to mock schema, returning empty object:",a),{}}}async validate(i,a,m,b,W,I,V){let z=await Pt(a,i);if(z.success)return z.data;switch(m){case"event":this.throwInvalidEvent(b,W,z.errors);case"step":this.throwInvalidStep(I,b,W,z.errors);case"provider":this.throwInvalidProvider(I,V,b,W,z.errors);default:throw new Error(`Invalid component: '${m}'`)}}throwInvalidProvider(i,a,m,b,W){throw i?a?m==="output"?new Ln(b,i,a,W):new Error(`Invalid payload type: '${m}'`):new Error("providerId is required"):new Error("stepId is required")}throwInvalidStep(i,a,m,b){if(!i)throw new Error("stepId is required");switch(a){case"output":throw new Pn(m,i,b);case"result":throw new In(m,i,b);case"controls":throw new Nn(m,i,b);default:throw new Error(`Invalid payload type: '${a}'`)}}throwInvalidEvent(i,a,m){switch(i){case"controls":throw new Cn(a,m);case"payload":throw new fr(a,m);default:throw new Error(`Invalid payload type: '${i}'`)}}executeStepFactory(i,a,m){return async(b,W,I)=>{if(m())return;let V=this.getStep(i.workflowId,b),z=i.action==="preview";if(!z&&b===i.stepId){let ke=await this.createStepControls(V,i),Le=await this.compileControls(ke,i);if(await this.shouldSkip(I==null?void 0:I.skip,Le))return a({options:{skip:!0},outputs:{},providers:{}}),{}}let se=this.previewStep.bind(this),Te=this.executeStep.bind(this),we=await(z?se:Te)(i,{...V,providers:V.providers.map(ke=>{var Ge;let Le=(Ge=I==null?void 0:I.providers)==null?void 0:Ge[ke.type];if(!Le)throw new jn(ke.type);return{...ke,resolve:Le}}),resolve:W});return this.shouldSanitize({stepType:V.type,options:I})&&(we={...we,outputs:Wt(we.outputs)}),b===i.stepId&&a({...we,options:{skip:!1}}),we.outputs}}shouldSanitize({stepType:i,options:a}){return(a==null?void 0:a.disableOutputSanitization)===!0?!1:["email","in_app"].includes(i)}async shouldSkip(i,a){return i?i(a):!1}async executeWorkflow(i){let b=`${{execute:"Executing",preview:"Previewing"}[i.action]||i.action} workflowId:`;this.log(`
92
+ ${me.bold(me.underline("Discovered workflowId:"))} '${w.workflowId}'`),w.steps.forEach((m,b)=>{let W=b===w.steps.length-1,I=W?"\u2514":"\u251C";a.info(`${I} ${Re.STEP} Discovered stepId: '${m.stepId}' Type: '${m.type}'`),m.providers.forEach((V,z)=>{let se=z===m.providers.length-1,Te=W?" ":"\u2502",ye=se?"\u2514":"\u251C";a.info(`${Te} ${ye} ${Re.PROVIDER} Discovered provider: '${V.type}'`)})}))}import{jsonrepair as Us}from"jsonrepair";function wi(w){let i=w.trim();return(i.startsWith("{")&&i.endsWith("}")||i.startsWith("[")&&i.endsWith("]"))&&i.length>2}var Si="__novuJsonString";function Hs(w){return typeof w=="object"&&w!==null&&!Array.isArray(w)&&w[Si]===!0}function mt(w){if(typeof w=="string"){if(!wi(w))return w;try{let i=JSON.parse(w);return{[Si]:!0,value:mt(i)}}catch{return w}}if(Array.isArray(w))return w.map(i=>mt(i));if(w&&typeof w=="object"){let i={};for(let[a,m]of Object.entries(w))i[a]=mt(m);return i}return w}function yt(w){if(Hs(w))return JSON.stringify(yt(w.value));if(Array.isArray(w))return w.map(i=>yt(i));if(w&&typeof w=="object"){let i={};for(let[a,m]of Object.entries(w))i[a]=yt(m);return i}return w}function Ys(w){try{return JSON.parse(w),w}catch{try{return Us(w)}catch{return w}}}function Ai(w){return Object.fromEntries(Object.entries(w).map(([i,a])=>typeof a=="string"?[i,wi(a)?Ys(a):a]:typeof a=="object"&&a!==null&&!Array.isArray(a)?[i,Ai(a)]:[i,a]))}function Ei(w){return!(w!=null&&w.data)||typeof w.data!="object"||Array.isArray(w.data)?w:{...w,data:Ai(w.data)}}function Oi(){return["development",void 0,"dev"].includes(process.env.NODE_ENV)}var wt=class{constructor(i){this.discoveredWorkflows=new Map;this.discoverWorkflowPromises=new Map;this.registeredAgents=new Map;this.version="2.12.0";let a=this.buildOptions(i);this.apiUrl=a.apiUrl,this.secretKey=a.secretKey,this.strictAuthentication=a.strictAuthentication,this.verbose=a.verbose,this.logger=a.logger,this.templateEngine=zn()}buildOptions(i){let a={apiUrl:$t(i==null?void 0:i.apiUrl),secretKey:Dt(i==null?void 0:i.secretKey),strictAuthentication:!Oi(),verbose:Oi(),logger:console};return(i==null?void 0:i.strictAuthentication)!==void 0?a.strictAuthentication=i.strictAuthentication:process.env.NOVU_STRICT_AUTHENTICATION_ENABLED!==void 0&&(a.strictAuthentication=process.env.NOVU_STRICT_AUTHENTICATION_ENABLED==="true"),(i==null?void 0:i.verbose)!==void 0&&(a.verbose=i.verbose),(i==null?void 0:i.logger)!==void 0&&(a.logger=i.logger),a}log(...i){this.verbose&&this.logger.info(...i)}async addWorkflows(i){for(let a of i){if(this.discoveredWorkflows.has(a.id))continue;let m=this.discoverWorkflowPromises.get(a.id);if(m){await m;continue}let b=this.addWorkflow(a);this.discoverWorkflowPromises.set(a.id,b),await b}}addAgents(i){for(let a of i)this.registeredAgents.set(a.id,a)}getAgent(i){return this.registeredAgents.get(i)}async addWorkflow(i){try{let a=await i.discover();yi(a,this.verbose,this.logger),this.discoveredWorkflows.set(i.id,a)}finally{this.discoverWorkflowPromises.delete(i.id)}}healthCheck(){let i=this.getRegisteredWorkflows(),a=i.length,m=i.reduce((b,W)=>b+W.steps.length,0);return{status:"ok",sdkVersion:"2.12.0",frameworkVersion:"2024-06-26",discovered:{workflows:a,steps:m}}}getWorkflow(i){let a=this.discoveredWorkflows.get(i);if(a)return a;throw new dr(i)}getStep(i,a){let b=this.getWorkflow(i).steps.find(W=>W.stepId===a);if(b)return b;throw new Jn(a)}getRegisteredWorkflows(){return Array.from(this.discoveredWorkflows.values())}discover(){return{workflows:this.getRegisteredWorkflows(),agents:Array.from(this.registeredAgents.keys()).map(i=>({agentId:i}))}}mock(i){try{return ui(i)}catch(a){return this.logger.warn("Failed to mock schema, returning empty object:",a),{}}}async validate(i,a,m,b,W,I,V){let z=await Pt(a,i);if(z.success)return z.data;switch(m){case"event":this.throwInvalidEvent(b,W,z.errors);case"step":this.throwInvalidStep(I,b,W,z.errors);case"provider":this.throwInvalidProvider(I,V,b,W,z.errors);default:throw new Error(`Invalid component: '${m}'`)}}throwInvalidProvider(i,a,m,b,W){throw i?a?m==="output"?new Ln(b,i,a,W):new Error(`Invalid payload type: '${m}'`):new Error("providerId is required"):new Error("stepId is required")}throwInvalidStep(i,a,m,b){if(!i)throw new Error("stepId is required");switch(a){case"output":throw new Pn(m,i,b);case"result":throw new In(m,i,b);case"controls":throw new Nn(m,i,b);default:throw new Error(`Invalid payload type: '${a}'`)}}throwInvalidEvent(i,a,m){switch(i){case"controls":throw new Cn(a,m);case"payload":throw new fr(a,m);default:throw new Error(`Invalid payload type: '${i}'`)}}executeStepFactory(i,a,m){return async(b,W,I)=>{if(m())return;let V=this.getStep(i.workflowId,b),z=i.action==="preview";if(!z&&b===i.stepId){let ke=await this.createStepControls(V,i),Le=await this.compileControls(ke,i);if(await this.shouldSkip(I==null?void 0:I.skip,Le))return a({options:{skip:!0},outputs:{},providers:{}}),{}}let se=this.previewStep.bind(this),Te=this.executeStep.bind(this),we=await(z?se:Te)(i,{...V,providers:V.providers.map(ke=>{var Ge;let Le=(Ge=I==null?void 0:I.providers)==null?void 0:Ge[ke.type];if(!Le)throw new jn(ke.type);return{...ke,resolve:Le}}),resolve:W});return this.shouldSanitize({stepType:V.type,options:I})&&(we={...we,outputs:Wt(we.outputs)}),b===i.stepId&&a({...we,options:{skip:!1}}),we.outputs}}shouldSanitize({stepType:i,options:a}){return(a==null?void 0:a.disableOutputSanitization)===!0?!1:["email","in_app"].includes(i)}async shouldSkip(i,a){return i?i(a):!1}async executeWorkflow(i){let b=`${{execute:"Executing",preview:"Previewing"}[i.action]||i.action} workflowId:`;this.log(`
93
93
  ${me.bold(me.underline(b))} '${i.workflowId}'`);let W=this.getWorkflow(i.workflowId),I=process.hrtime(),V={outputs:{},providers:{},options:{skip:!1}},z,se=!1,Te=new Promise(Ue=>{z=Ue}),ye=Ue=>{if(se)throw new Error("setResult can only be called once per workflow execution");z(),se=!0,V=Ue},we=()=>se,ke;try{if(i.action==="execute"&&!i.payload)throw new fr(i.workflowId,{message:"Event `payload` is required"});let Ue=await this.createExecutionPayload(i,W),Fe={...i,payload:Ue};await Promise.race([Te,W.execute({payload:Ue,env:i.env,controls:{},subscriber:i.subscriber,context:i.context,step:{email:this.executeStepFactory(Fe,ye,we),sms:this.executeStepFactory(Fe,ye,we),inApp:this.executeStepFactory(Fe,ye,we),digest:this.executeStepFactory(Fe,ye,we),delay:this.executeStepFactory(Fe,ye,we),push:this.executeStepFactory(Fe,ye,we),chat:this.executeStepFactory(Fe,ye,we),custom:this.executeStepFactory(Fe,ye,we),throttle:this.executeStepFactory(Fe,ye,we)}})])}catch(Ue){ke=Ue}let Le=process.hrtime(I),Ge=Le[0],je=Le[1],St=Ge*1e3+je/1e6,Bt=ke?Re.ERROR:Re.SUCCESS,At={execute:"Executed",preview:"Previewed"}[i.action]||i.action;if(this.log(`${Bt} ${At} workflowId: \`${i.workflowId}\``),this.prettyPrintExecute(i,St,ke),ke)throw ke;return{outputs:V.outputs,providers:V.providers,options:V.options,metadata:{status:"success",error:!1,duration:St}}}async createExecutionPayload(i,a){let{payload:m}=i;if(i.action==="preview"){let W=this.mock(a.payload.schema);m=Object.assign(W,m)}return await this.validate(m,a.payload.unknownSchema,"event","payload",i.workflowId)}prettyPrintExecute(i,a,m){if(!this.verbose)return;let b=m?Re.ERROR:Re.SUCCESS,I={execute:"Executed",preview:"Previewed"}[i.action]||i.action,V=m?"Failed to execute":I,z=m?me.error:me.success,se=`${b} ${V} workflowId: '${i.workflowId}`;this.logger.info(`
94
94
  ${me.bold(z(se))}'
95
95
  \u251C ${Re.STEP} stepId: '${i.stepId}'
96
96
  \u251C ${Re.ACTION} action: '${i.action}'
97
97
  \u2514 ${Re.DURATION} duration: '${a.toFixed(2)}ms'
98
- `)}async executeProviders(i,a,m){return a.providers.reduce(async(b,W)=>{let I=await b,V=this.previewProvider.bind(this),z=this.executeProvider.bind(this),Te=await(i.action==="preview"?V:z)(i,a,W,m);return{...I,[W.type]:Te}},Promise.resolve({}))}previewProvider(i,a,m,b){return this.log(` ${Re.MOCK} Mocked provider: \`${m.type}\``),this.mock(m.outputs.schema)}async executeProvider(i,a,m,b){try{if(i.stepId===a.stepId){let W=await this.createStepControls(a,i),I=await m.resolve({controls:W,outputs:b}),V=await this.validate(I,m.outputs.unknownSchema,"step","output",i.workflowId,a.stepId,m.type);return this.log(` ${Re.SUCCESS} Executed provider: \`${m.type}\``),{...V,_passthrough:I._passthrough}}else return this.log(` ${Re.HYDRATED} Hydrated provider: \`${m.type}\``),{}}catch(W){throw this.log(` ${Re.ERROR} Failed to execute provider: \`${m.type}\``),new Un(m.type,i.action,W)}}async executeStep(i,a){if(i.stepId===a.stepId)try{let m=await this.createStepControls(a,i),b=await this.compileControls(m,i),W=await a.resolve(b),I=await this.validate(W,a.outputs.unknownSchema,"step","output",i.workflowId,a.stepId),V=await this.executeProviders(i,a,I);return this.log(` ${Re.SUCCESS} Executed stepId: \`${a.stepId}\``),{outputs:I,providers:V}}catch(m){throw this.log(` ${Re.ERROR} Failed to execute stepId: \`${a.stepId}\``),pt(m)?m:new pr(a.stepId,i.action,m)}else try{let m=this.getStepState(i,a.stepId);if(m){let b=await this.validate(m.outputs,a.results.unknownSchema,"step","result",i.workflowId,a.stepId);return this.log(` ${Re.HYDRATED} Hydrated stepId: \`${a.stepId}\``),{outputs:b,providers:await this.executeProviders(i,a,b)}}else throw new Mn(i.workflowId,a.stepId)}catch(m){throw this.log(` ${Re.ERROR} Failed to hydrate stepId: \`${a.stepId}\``),m}}async compileControls(i,a){var m;try{let b=mt(i),W=this.preprocessTranslationPatterns(JSON.stringify(b));W=this.preprocessFilterTranslationArgs(W);let I=this.templateEngine.parse(W),V=this.getWorkflow(a.workflowId),z={workflow:{workflowId:V.workflowId,name:V.name,description:V.description,tags:V.tags,severity:V.severity},payload:a.payload,subscriber:a.subscriber,...a.actor&&{actor:a.actor},context:a.context,steps:Vs(a.state),env:(m=a.env)!=null?m:{}},se=await this.templateEngine.render(I,z),Te=this.postprocessTranslationMarkers(se),ye=qs(Te),we=JSON.parse(ye),ke=yt(we);return Ei(ke)}catch(b){throw new xn(a.workflowId,a.stepId,b)}}preprocessTranslationPatterns(i){return i.replace(/\{\{\s*t\.([\p{L}\p{N}_.-]+)\s*\}\}/gu,"[T:$1]")}preprocessFilterTranslationArgs(i){return i.replace(/'t\.([\p{L}\p{N}_.-]+)'/gu,"'[T:$1]'")}postprocessTranslationMarkers(i){return i.replace(/\[T:([\p{L}\p{N}_.-]+)\]/gu,"{{t.$1}}")}async createStepControls(i,a){return await this.validate(a.controls,i.controls.unknownSchema,"step","controls",a.workflowId,i.stepId)}async previewStep(i,a){try{return await this.constructStepForPreview(i,a)}catch(m){throw this.log(` ${Re.ERROR} Failed to preview stepId: \`${a.stepId}\``),pt(m)?m:new pr(a.stepId,i.action,m)}}async constructStepForPreview(i,a){return i.stepId===a.stepId?await this.previewRequiredStep(a,i):await this.extractMockDataForPreviousSteps(i,a)}async extractMockDataForPreviousSteps(i,a){let m={},b=this.getStepState(i,a.stepId),W=this.mock(a.results.schema);return{outputs:Qn(W,(b==null?void 0:b.outputs)||{}),providers:await this.executeProviders(i,a,m)}}async previewRequiredStep(i,a){let m=await this.createStepControls(i,a),b=await this.compileControls(m,a),W=await i.resolve(b),I=await this.validate(W,i.outputs.unknownSchema,"step","output",a.workflowId,i.stepId);return this.log(` ${Re.MOCK} Mocked stepId: \`${i.stepId}\``),{outputs:I,providers:await this.executeProviders(a,i,I)}}getStepState(i,a){return i.state.find(m=>m.stepId===a)}getStepCode(i,a){return{code:this.getStep(i,a).resolve.toString()}}getWorkflowCode(i){return{code:this.getWorkflow(i).execute.toString()}}getCode(i,a){let m;if(i)a?m=this.getStepCode(i,a):m=this.getWorkflowCode(i);else throw new dr(i);return m}};function Vs(w){let i={};for(let a of w)i[a.stepId]=a.outputs;return i}function Ks(w){return!!(typeof w=="string"||typeof w=="object"&&w!==null&&ti(w)||typeof w=="object"&&w!==null&&("markdown"in w||"card"in w||"files"in w))}function Js(w,i){return w}function Gs(w,i){var a;for(let m of w){let b=m.toolData;if(m.type==="tool_approval_request"&&(b==null?void 0:b.approvalId)===i&&b.toolCallId)return{approvalId:b.approvalId,toolCallId:b.toolCallId,name:(a=b.toolName)!=null?a:"tool",input:b.input}}}async function vi(w){var W;let i=new ni(w.bridge,w.secretKey,w.agent.handlers.toolApproval),{agent:a,event:m,logger:b}=w;try{await Qs(a,m,i),await i.flush()}catch(I){let V=It(I);b==null||b.error(`[agent:${a.id}] Turn failed (${m}): ${V.message}`,(W=V.cause)!=null?W:V);let z=!1;if(a.handlers.onError)try{let se=await a.handlers.onError(V,Js(i,m));ei(se)?z=!0:Ks(se)&&(await i.reply(se),z=!0)}catch(se){b==null||b.error(`[agent:${a.id}] onError failed:`,se)}z||await i.reportTurnError()}finally{try{await i.typing.stop()}catch{}}}async function Qs(w,i,a){var b,W;let m=async I=>{I instanceof Zn||I===void 0||await a.reply(I)};switch(i){case"onMessage":{await m(await w.handlers.onMessage(a.message,a));break}case"onAction":{let I=ri((b=a.action)==null?void 0:b.id);if(I&&w.handlers.onToolApproval){let{approved:V,approvalId:z}=I,se=Gs(a.history,z),Te=se?{id:se.toolCallId,name:se.name,input:se.input}:{id:z,name:""},ye=a.createReplyHandle((W=a.action.sourceMessageId)!=null?W:""),we={toolCall:Te,approved:V,approvalMessage:ye};w.userOnToolApproval===!1&&(await a.typing(),a.action.sourceMessageId&&await ye.delete());let ke=await w.handlers.onToolApproval(we,a);await m(ke);break}w.handlers.onAction&&await m(await w.handlers.onAction(a.action,a));break}case"onReaction":w.handlers.onReaction&&await m(await w.handlers.onReaction(a.reaction,a));break;case"onResolve":w.handlers.onResolve&&await m(await w.handlers.onResolve(a));break;default:throw new dt(i,Xn)}}function bi(w){let i={};for(let b of w.split(",")){let W=b.trim();if(!W)continue;let I=W.indexOf("=");if(I<=0)continue;let V=W.slice(0,I),z=W.slice(I+1);V&&z&&!(V in i)&&(i[V]=z)}let a=i.t,m=a!==void 0?Number(a):Number.NaN;return{t:Number.isFinite(m)?m:void 0,v1:i.v1}}var Sr=class{constructor(i){this.handler=i.handler,this.client=i.client?i.client:new wt,this.workflows=i.workflows||[],this.agents=i.agents||[],this.http=Lt(this.client.secretKey,this.client.apiUrl),this.frameworkName=i.frameworkName,this.hmacEnabled=this.client.strictAuthentication,this.client.addAgents(this.agents)}createHandler(){return async(...i)=>{await this.client.addWorkflows(this.workflows);let a=await this.handler(...i),m=await this.handleAction({actions:a});return a.transformResponse(m)}}getStaticHeaders(){let i=`novu-framework:v${this.client.version}`;return{"content-type":"application/json","access-control-allow-origin":"*","access-control-allow-private-network":"true","access-control-allow-methods":"GET, POST","access-control-allow-headers":"*","access-control-max-age":"604800","novu-framework-version":"2024-06-26","novu-framework-sdk":"2.11.2-alpha.1","novu-framework-server":this.frameworkName,"user-agent":i}}createResponse(i,a){return{status:i,body:JSON.stringify(a),headers:{...this.getStaticHeaders()}}}createError(i){return{status:i.statusCode,body:JSON.stringify({message:i.message,data:i.data,code:i.code}),headers:this.getStaticHeaders()}}async handleAction({actions:i}){let a=await i.url(),m=await i.method(),b=a.searchParams.get("action")||"health-check",W=a.searchParams.get("workflowId")||"",I=a.searchParams.get("stepId")||"",V=a.searchParams.get("agentId")||"",z=a.searchParams.get("event")||"",se=await i.headers("novu-signature")||"",Te={};try{m==="POST"&&(Te=await i.body())}catch{}try{b!=="health-check"&&await this.validateHmac(Te,se);let ye=this.getPostActionMap(Te,W,I,b,V,z,i.waitUntil),we=this.getGetActionMap(W,I);if(m==="POST")return await this.handlePostAction(b,ye);if(m==="GET")return await this.handleGetAction(b,we);if(m==="OPTIONS")return this.createResponse(200,{})}catch(ye){return this.handleError(ye)}return this.createError(new Wn(m))}getPostActionMap(i,a,m,b,W,I,V){return{trigger:this.triggerAction({workflowId:a,...i}),execute:async()=>{let z=await this.client.executeWorkflow({...i,workflowId:a,stepId:m,action:b});return this.createResponse(200,z)},preview:async()=>{let z=await this.client.executeWorkflow({...i,workflowId:a,stepId:m,action:b});return this.createResponse(200,z)},"agent-event":async()=>{let z=this.client.getAgent(W);if(!z)return this.createResponse(404,{error:`Agent '${W}' not registered`});let se=vi({agent:z,event:I,bridge:i,secretKey:this.client.secretKey,logger:this.client.logger});return V&&V(se),this.createResponse(200,{status:"ack"})}}}triggerAction(i){return async()=>{let a={name:i.workflowId,to:i.to,payload:(i==null?void 0:i.payload)||{},transactionId:i.transactionId,overrides:i.overrides||{},...i.actor&&{actor:i.actor},...i.bridgeUrl&&{bridgeUrl:i.bridgeUrl},...i.controls&&{controls:i.controls},...i.context&&{context:i.context}},m=await this.http.post("/events/trigger",a);return this.createResponse(200,m)}}getGetActionMap(i,a){return{discover:async()=>{let m=await this.client.discover();return this.createResponse(200,m)},"health-check":async()=>{let m=await this.client.healthCheck();return this.createResponse(200,m)},code:async()=>{let m=await this.client.getCode(i,a);return this.createResponse(200,m)}}}async handlePostAction(i,a){if(Object.values(Ct).includes(i)){let m=a[i];return m()}else throw new dt(i,Ct)}async handleGetAction(i,a){if(Object.values(cr).includes(i)){let m=a[i];return m()}else throw new dt(i,cr)}handleError(i){if(pt(i))return i.statusCode>=500&&this.client.logger.error(i),this.createError(i);if(Dn(i))return this.createError(i);{let a=new Nt(i);return this.client.logger.error(a),this.createError(a)}}async validateHmac(i,a){if(!this.hmacEnabled)return;if(!a)throw new Yn;if(!this.client.secretKey)throw new Kn;let m=bi(a);if(!m.v1||m.t===void 0)throw new qn;let b=Date.now();if(m.t<b-3e5||m.t>b+3e5)throw new Vn;let W=await fi(this.client.secretKey,`${m.t}.${JSON.stringify(i)}`);if(!pi(W,m.v1))throw new Hn}};function Ti(w,i){if(!w)throw new Error("agent() requires a non-empty agentId");if(!(i!=null&&i.onMessage))throw new Error(`agent('${w}') requires an onMessage handler`);return{id:w,handlers:i,userOnToolApproval:typeof i.onToolApproval=="function"}}async function nt(w,i,a){if(w.steps.some(m=>m.stepId===i))throw new Gn(i);w.steps.push(a)}async function Ft(w,i,a,m){return async(b,W,I={})=>{let V=(I==null?void 0:I.controlSchema)||xe;return await nt(w,b,{stepId:b,type:i,controls:{schema:await Ce(V),unknownSchema:V},outputs:{schema:await Ce(a),unknownSchema:a},results:{schema:await Ce(m),unknownSchema:m},resolve:W,code:W.toString(),options:I,providers:[]}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}async function Ri(w,i,a){let m=hr[i],b=Object.entries(a).map(async([W,I])=>{let V=m[W];return{type:W,code:I.toString(),resolve:I,outputs:{schema:await Ce(V.output),unknownSchema:V.output}}});w.providers.push(...await Promise.all(b))}async function it(w,i,a,m){return async(b,W,I={})=>{let V=(I==null?void 0:I.controlSchema)||xe,z={stepId:b,type:i,controls:{schema:await Ce(V),unknownSchema:V},outputs:{schema:await Ce(a),unknownSchema:a},results:{schema:await Ce(m),unknownSchema:m},resolve:W,code:W.toString(),options:I,providers:[]};return await nt(w,b,z),Object.keys(I.providers||{}).length>0&&await Ri(z,i,I.providers||{}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}async function Ar(w,i){return async(a,m,b={})=>{let W=(b==null?void 0:b.controlSchema)||xe,I=(b==null?void 0:b.outputSchema)||xe,[V,z]=await Promise.all([Ce(W),Ce(I)]);return await nt(w,a,{stepId:a,type:i,controls:{schema:V,unknownSchema:W},outputs:{schema:z,unknownSchema:I},results:{schema:z,unknownSchema:I},resolve:m,code:m.toString(),options:b,providers:[]}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}var lo={email:"email",sms:"sms",push:"push",inApp:"in_app",chat:"chat"};function ki(w){if(!w)return{};let i={};return w.all&&(i.all=w.all),Object.entries(w.channels||{}).forEach(([a,m])=>{let b=lo[a];b&&(i.channels||(i.channels={}),i.channels[b]=m)}),i}function uo(w,i,a){let m=a||{};return{id:w,trigger:async I=>{let V=Lt(Dt(I.secretKey),$t(I.apiUrl)),z=I.payload||{},se;if(m.payloadSchema){let Le=await Pt(m.payloadSchema,z);if(Le.success===!1)throw new $n(w,Le.errors);se=Le.data}else se=I.payload;let Te=await di(),ye={name:w,to:I.to,payload:{...se},...I.transactionId&&{transactionId:I.transactionId},...I.overrides&&{overrides:I.overrides},...I.actor&&{actor:I.actor},...I.context&&{context:I.context},...Te&&{bridgeUrl:Te}},we=await V.post("/events/trigger",ye);return{cancel:async()=>V.delete(`/events/trigger/${we.transactionId}`),data:we}},discover:async()=>{var V;let I={workflowId:w,severity:(V=m.severity)!=null?V:"none",steps:[],code:i.toString(),payload:{schema:await Ce(m.payloadSchema||xe),unknownSchema:m.payloadSchema||xe},controls:{schema:await Ce(m.controlSchema||xe),unknownSchema:m.controlSchema||xe},env:{schema:await Ce(m.envSchema||xe),unknownSchema:m.envSchema||xe},tags:m.tags||[],preferences:ki(m.preferences),name:m.name,description:m.description,execute:i};return await i({payload:{},subscriber:{},env:{},controls:{},context:{},step:{push:await it(I,"push",Be.push.output,Be.push.result),chat:await it(I,"chat",Be.chat.output,Be.chat.result),email:await it(I,"email",Be.email.output,Be.email.result),sms:await it(I,"sms",Be.sms.output,Be.sms.result),inApp:await it(I,"in_app",Be.in_app.output,Be.in_app.result),digest:await Ft(I,"digest",mr.output,mr.result),delay:await Ft(I,"delay",gr.output,gr.result),throttle:await Ft(I,"throttle",yr.output,yr.result),custom:await Ar(I,"custom"),httpRequest:await Ar(I,"http_request")}}),I}}}export{Mo as a,wt as b,Sr as c,Ti as d,uo as e};
98
+ `)}async executeProviders(i,a,m){return a.providers.reduce(async(b,W)=>{let I=await b,V=this.previewProvider.bind(this),z=this.executeProvider.bind(this),Te=await(i.action==="preview"?V:z)(i,a,W,m);return{...I,[W.type]:Te}},Promise.resolve({}))}previewProvider(i,a,m,b){return this.log(` ${Re.MOCK} Mocked provider: \`${m.type}\``),this.mock(m.outputs.schema)}async executeProvider(i,a,m,b){try{if(i.stepId===a.stepId){let W=await this.createStepControls(a,i),I=await m.resolve({controls:W,outputs:b}),V=await this.validate(I,m.outputs.unknownSchema,"step","output",i.workflowId,a.stepId,m.type);return this.log(` ${Re.SUCCESS} Executed provider: \`${m.type}\``),{...V,_passthrough:I._passthrough}}else return this.log(` ${Re.HYDRATED} Hydrated provider: \`${m.type}\``),{}}catch(W){throw this.log(` ${Re.ERROR} Failed to execute provider: \`${m.type}\``),new Un(m.type,i.action,W)}}async executeStep(i,a){if(i.stepId===a.stepId)try{let m=await this.createStepControls(a,i),b=await this.compileControls(m,i),W=await a.resolve(b),I=await this.validate(W,a.outputs.unknownSchema,"step","output",i.workflowId,a.stepId),V=await this.executeProviders(i,a,I);return this.log(` ${Re.SUCCESS} Executed stepId: \`${a.stepId}\``),{outputs:I,providers:V}}catch(m){throw this.log(` ${Re.ERROR} Failed to execute stepId: \`${a.stepId}\``),pt(m)?m:new pr(a.stepId,i.action,m)}else try{let m=this.getStepState(i,a.stepId);if(m){let b=await this.validate(m.outputs,a.results.unknownSchema,"step","result",i.workflowId,a.stepId);return this.log(` ${Re.HYDRATED} Hydrated stepId: \`${a.stepId}\``),{outputs:b,providers:await this.executeProviders(i,a,b)}}else throw new Mn(i.workflowId,a.stepId)}catch(m){throw this.log(` ${Re.ERROR} Failed to hydrate stepId: \`${a.stepId}\``),m}}async compileControls(i,a){var m;try{let b=mt(i),W=this.preprocessTranslationPatterns(JSON.stringify(b));W=this.preprocessFilterTranslationArgs(W);let I=this.templateEngine.parse(W),V=this.getWorkflow(a.workflowId),z={workflow:{workflowId:V.workflowId,name:V.name,description:V.description,tags:V.tags,severity:V.severity},payload:a.payload,subscriber:a.subscriber,...a.actor&&{actor:a.actor},context:a.context,steps:Vs(a.state),env:(m=a.env)!=null?m:{}},se=await this.templateEngine.render(I,z),Te=this.postprocessTranslationMarkers(se),ye=qs(Te),we=JSON.parse(ye),ke=yt(we);return Ei(ke)}catch(b){throw new xn(a.workflowId,a.stepId,b)}}preprocessTranslationPatterns(i){return i.replace(/\{\{\s*t\.([\p{L}\p{N}_.-]+)\s*\}\}/gu,"[T:$1]")}preprocessFilterTranslationArgs(i){return i.replace(/'t\.([\p{L}\p{N}_.-]+)'/gu,"'[T:$1]'")}postprocessTranslationMarkers(i){return i.replace(/\[T:([\p{L}\p{N}_.-]+)\]/gu,"{{t.$1}}")}async createStepControls(i,a){return await this.validate(a.controls,i.controls.unknownSchema,"step","controls",a.workflowId,i.stepId)}async previewStep(i,a){try{return await this.constructStepForPreview(i,a)}catch(m){throw this.log(` ${Re.ERROR} Failed to preview stepId: \`${a.stepId}\``),pt(m)?m:new pr(a.stepId,i.action,m)}}async constructStepForPreview(i,a){return i.stepId===a.stepId?await this.previewRequiredStep(a,i):await this.extractMockDataForPreviousSteps(i,a)}async extractMockDataForPreviousSteps(i,a){let m={},b=this.getStepState(i,a.stepId),W=this.mock(a.results.schema);return{outputs:Qn(W,(b==null?void 0:b.outputs)||{}),providers:await this.executeProviders(i,a,m)}}async previewRequiredStep(i,a){let m=await this.createStepControls(i,a),b=await this.compileControls(m,a),W=await i.resolve(b),I=await this.validate(W,i.outputs.unknownSchema,"step","output",a.workflowId,i.stepId);return this.log(` ${Re.MOCK} Mocked stepId: \`${i.stepId}\``),{outputs:I,providers:await this.executeProviders(a,i,I)}}getStepState(i,a){return i.state.find(m=>m.stepId===a)}getStepCode(i,a){return{code:this.getStep(i,a).resolve.toString()}}getWorkflowCode(i){return{code:this.getWorkflow(i).execute.toString()}}getCode(i,a){let m;if(i)a?m=this.getStepCode(i,a):m=this.getWorkflowCode(i);else throw new dr(i);return m}};function Vs(w){let i={};for(let a of w)i[a.stepId]=a.outputs;return i}function Ks(w){return!!(typeof w=="string"||typeof w=="object"&&w!==null&&ti(w)||typeof w=="object"&&w!==null&&("markdown"in w||"card"in w||"files"in w))}function Js(w,i){return w}function Gs(w,i){var a;for(let m of w){let b=m.toolData;if(m.type==="tool_approval_request"&&(b==null?void 0:b.approvalId)===i&&b.toolCallId)return{approvalId:b.approvalId,toolCallId:b.toolCallId,name:(a=b.toolName)!=null?a:"tool",input:b.input}}}async function vi(w){var W;let i=new ni(w.bridge,w.secretKey,w.agent.handlers.toolApproval),{agent:a,event:m,logger:b}=w;try{await Qs(a,m,i),await i.flush()}catch(I){let V=It(I);b==null||b.error(`[agent:${a.id}] Turn failed (${m}): ${V.message}`,(W=V.cause)!=null?W:V);let z=!1;if(a.handlers.onError)try{let se=await a.handlers.onError(V,Js(i,m));ei(se)?z=!0:Ks(se)&&(await i.reply(se),z=!0)}catch(se){b==null||b.error(`[agent:${a.id}] onError failed:`,se)}z||await i.reportTurnError()}finally{try{await i.typing.stop()}catch{}}}async function Qs(w,i,a){var b,W;let m=async I=>{I instanceof Zn||I===void 0||await a.reply(I)};switch(i){case"onMessage":{await m(await w.handlers.onMessage(a.message,a));break}case"onAction":{let I=ri((b=a.action)==null?void 0:b.id);if(I&&w.handlers.onToolApproval){let{approved:V,approvalId:z}=I,se=Gs(a.history,z),Te=se?{id:se.toolCallId,name:se.name,input:se.input}:{id:z,name:""},ye=a.createReplyHandle((W=a.action.sourceMessageId)!=null?W:""),we={toolCall:Te,approved:V,approvalMessage:ye};w.userOnToolApproval===!1&&(await a.typing(),a.action.sourceMessageId&&await ye.delete());let ke=await w.handlers.onToolApproval(we,a);await m(ke);break}w.handlers.onAction&&await m(await w.handlers.onAction(a.action,a));break}case"onReaction":w.handlers.onReaction&&await m(await w.handlers.onReaction(a.reaction,a));break;case"onResolve":w.handlers.onResolve&&await m(await w.handlers.onResolve(a));break;default:throw new dt(i,Xn)}}function bi(w){let i={};for(let b of w.split(",")){let W=b.trim();if(!W)continue;let I=W.indexOf("=");if(I<=0)continue;let V=W.slice(0,I),z=W.slice(I+1);V&&z&&!(V in i)&&(i[V]=z)}let a=i.t,m=a!==void 0?Number(a):Number.NaN;return{t:Number.isFinite(m)?m:void 0,v1:i.v1}}var Sr=class{constructor(i){this.handler=i.handler,this.client=i.client?i.client:new wt,this.workflows=i.workflows||[],this.agents=i.agents||[],this.http=Lt(this.client.secretKey,this.client.apiUrl),this.frameworkName=i.frameworkName,this.hmacEnabled=this.client.strictAuthentication,this.client.addAgents(this.agents)}createHandler(){return async(...i)=>{await this.client.addWorkflows(this.workflows);let a=await this.handler(...i),m=await this.handleAction({actions:a});return a.transformResponse(m)}}getStaticHeaders(){let i=`novu-framework:v${this.client.version}`;return{"content-type":"application/json","access-control-allow-origin":"*","access-control-allow-private-network":"true","access-control-allow-methods":"GET, POST","access-control-allow-headers":"*","access-control-max-age":"604800","novu-framework-version":"2024-06-26","novu-framework-sdk":"2.12.0","novu-framework-server":this.frameworkName,"user-agent":i}}createResponse(i,a){return{status:i,body:JSON.stringify(a),headers:{...this.getStaticHeaders()}}}createError(i){return{status:i.statusCode,body:JSON.stringify({message:i.message,data:i.data,code:i.code}),headers:this.getStaticHeaders()}}async handleAction({actions:i}){let a=await i.url(),m=await i.method(),b=a.searchParams.get("action")||"health-check",W=a.searchParams.get("workflowId")||"",I=a.searchParams.get("stepId")||"",V=a.searchParams.get("agentId")||"",z=a.searchParams.get("event")||"",se=await i.headers("novu-signature")||"",Te={};try{m==="POST"&&(Te=await i.body())}catch{}try{b!=="health-check"&&await this.validateHmac(Te,se);let ye=this.getPostActionMap(Te,W,I,b,V,z,i.waitUntil),we=this.getGetActionMap(W,I);if(m==="POST")return await this.handlePostAction(b,ye);if(m==="GET")return await this.handleGetAction(b,we);if(m==="OPTIONS")return this.createResponse(200,{})}catch(ye){return this.handleError(ye)}return this.createError(new Wn(m))}getPostActionMap(i,a,m,b,W,I,V){return{trigger:this.triggerAction({workflowId:a,...i}),execute:async()=>{let z=await this.client.executeWorkflow({...i,workflowId:a,stepId:m,action:b});return this.createResponse(200,z)},preview:async()=>{let z=await this.client.executeWorkflow({...i,workflowId:a,stepId:m,action:b});return this.createResponse(200,z)},"agent-event":async()=>{let z=this.client.getAgent(W);if(!z)return this.createResponse(404,{error:`Agent '${W}' not registered`});let se=vi({agent:z,event:I,bridge:i,secretKey:this.client.secretKey,logger:this.client.logger});return V&&V(se),this.createResponse(200,{status:"ack"})}}}triggerAction(i){return async()=>{let a={name:i.workflowId,to:i.to,payload:(i==null?void 0:i.payload)||{},transactionId:i.transactionId,overrides:i.overrides||{},...i.actor&&{actor:i.actor},...i.bridgeUrl&&{bridgeUrl:i.bridgeUrl},...i.controls&&{controls:i.controls},...i.context&&{context:i.context}},m=await this.http.post("/events/trigger",a);return this.createResponse(200,m)}}getGetActionMap(i,a){return{discover:async()=>{let m=await this.client.discover();return this.createResponse(200,m)},"health-check":async()=>{let m=await this.client.healthCheck();return this.createResponse(200,m)},code:async()=>{let m=await this.client.getCode(i,a);return this.createResponse(200,m)}}}async handlePostAction(i,a){if(Object.values(Ct).includes(i)){let m=a[i];return m()}else throw new dt(i,Ct)}async handleGetAction(i,a){if(Object.values(cr).includes(i)){let m=a[i];return m()}else throw new dt(i,cr)}handleError(i){if(pt(i))return i.statusCode>=500&&this.client.logger.error(i),this.createError(i);if(Dn(i))return this.createError(i);{let a=new Nt(i);return this.client.logger.error(a),this.createError(a)}}async validateHmac(i,a){if(!this.hmacEnabled)return;if(!a)throw new Yn;if(!this.client.secretKey)throw new Kn;let m=bi(a);if(!m.v1||m.t===void 0)throw new qn;let b=Date.now();if(m.t<b-3e5||m.t>b+3e5)throw new Vn;let W=await fi(this.client.secretKey,`${m.t}.${JSON.stringify(i)}`);if(!pi(W,m.v1))throw new Hn}};function Ti(w,i){if(!w)throw new Error("agent() requires a non-empty agentId");if(!(i!=null&&i.onMessage))throw new Error(`agent('${w}') requires an onMessage handler`);return{id:w,handlers:i,userOnToolApproval:typeof i.onToolApproval=="function"}}async function nt(w,i,a){if(w.steps.some(m=>m.stepId===i))throw new Gn(i);w.steps.push(a)}async function Ft(w,i,a,m){return async(b,W,I={})=>{let V=(I==null?void 0:I.controlSchema)||xe;return await nt(w,b,{stepId:b,type:i,controls:{schema:await Ce(V),unknownSchema:V},outputs:{schema:await Ce(a),unknownSchema:a},results:{schema:await Ce(m),unknownSchema:m},resolve:W,code:W.toString(),options:I,providers:[]}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}async function Ri(w,i,a){let m=hr[i],b=Object.entries(a).map(async([W,I])=>{let V=m[W];return{type:W,code:I.toString(),resolve:I,outputs:{schema:await Ce(V.output),unknownSchema:V.output}}});w.providers.push(...await Promise.all(b))}async function it(w,i,a,m){return async(b,W,I={})=>{let V=(I==null?void 0:I.controlSchema)||xe,z={stepId:b,type:i,controls:{schema:await Ce(V),unknownSchema:V},outputs:{schema:await Ce(a),unknownSchema:a},results:{schema:await Ce(m),unknownSchema:m},resolve:W,code:W.toString(),options:I,providers:[]};return await nt(w,b,z),Object.keys(I.providers||{}).length>0&&await Ri(z,i,I.providers||{}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}async function Ar(w,i){return async(a,m,b={})=>{let W=(b==null?void 0:b.controlSchema)||xe,I=(b==null?void 0:b.outputSchema)||xe,[V,z]=await Promise.all([Ce(W),Ce(I)]);return await nt(w,a,{stepId:a,type:i,controls:{schema:V,unknownSchema:W},outputs:{schema:z,unknownSchema:I},results:{schema:z,unknownSchema:I},resolve:m,code:m.toString(),options:b,providers:[]}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}var lo={email:"email",sms:"sms",push:"push",inApp:"in_app",chat:"chat"};function ki(w){if(!w)return{};let i={};return w.all&&(i.all=w.all),Object.entries(w.channels||{}).forEach(([a,m])=>{let b=lo[a];b&&(i.channels||(i.channels={}),i.channels[b]=m)}),i}function uo(w,i,a){let m=a||{};return{id:w,trigger:async I=>{let V=Lt(Dt(I.secretKey),$t(I.apiUrl)),z=I.payload||{},se;if(m.payloadSchema){let Le=await Pt(m.payloadSchema,z);if(Le.success===!1)throw new $n(w,Le.errors);se=Le.data}else se=I.payload;let Te=await di(),ye={name:w,to:I.to,payload:{...se},...I.transactionId&&{transactionId:I.transactionId},...I.overrides&&{overrides:I.overrides},...I.actor&&{actor:I.actor},...I.context&&{context:I.context},...Te&&{bridgeUrl:Te}},we=await V.post("/events/trigger",ye);return{cancel:async()=>V.delete(`/events/trigger/${we.transactionId}`),data:we}},discover:async()=>{var V;let I={workflowId:w,severity:(V=m.severity)!=null?V:"none",steps:[],code:i.toString(),payload:{schema:await Ce(m.payloadSchema||xe),unknownSchema:m.payloadSchema||xe},controls:{schema:await Ce(m.controlSchema||xe),unknownSchema:m.controlSchema||xe},env:{schema:await Ce(m.envSchema||xe),unknownSchema:m.envSchema||xe},tags:m.tags||[],preferences:ki(m.preferences),name:m.name,description:m.description,execute:i};return await i({payload:{},subscriber:{},env:{},controls:{},context:{},step:{push:await it(I,"push",Be.push.output,Be.push.result),chat:await it(I,"chat",Be.chat.output,Be.chat.result),email:await it(I,"email",Be.email.output,Be.email.result),sms:await it(I,"sms",Be.sms.output,Be.sms.result),inApp:await it(I,"in_app",Be.in_app.output,Be.in_app.result),digest:await Ft(I,"digest",mr.output,mr.result),delay:await Ft(I,"delay",gr.output,gr.result),throttle:await Ft(I,"throttle",yr.output,yr.result),custom:await Ar(I,"custom"),httpRequest:await Ar(I,"http_request")}}),I}}}export{Mo as a,wt as b,Sr as c,Ti as d,uo as e};
package/dist/esm/index.js CHANGED
@@ -1 +1 @@
1
- import{b as k,c as o,d as p,e as s}from"./chunk-Q6BV36LU.js";import{a,b,c,d,e,f,g,h,i}from"./chunk-C3P3ZH2I.js";import"./chunk-3XT6S7TZ.js";import{a as t}from"./chunk-2M25EATE.js";import"./chunk-22DBAEUX.js";import{M as l,N as m,O as n,V as r}from"./chunk-E2MET7IR.js";import{a as q}from"./chunk-CANJPWLT.js";import{f as j}from"./chunk-FRWG7YTE.js";import"./chunk-W6DIBD4Z.js";import"./chunk-FHYMHX3T.js";export{a as Actions,m as AgentDeliveryError,l as AgentError,b as Button,c as Card,d as CardLink,e as CardText,k as Client,j as CronExpression,f as Divider,o as NovuRequestHandler,g as Select,h as SelectOption,r as SeverityLevelEnum,i as TextInput,p as agent,q as providerSchemas,t as step,n as toAgentError,s as workflow};
1
+ import{b as k,c as o,d as p,e as s}from"./chunk-TEOO6V72.js";import{a,b,c,d,e,f,g,h,i}from"./chunk-C3P3ZH2I.js";import"./chunk-3XT6S7TZ.js";import{a as t}from"./chunk-2M25EATE.js";import"./chunk-22DBAEUX.js";import{M as l,N as m,O as n,V as r}from"./chunk-E2MET7IR.js";import{a as q}from"./chunk-CANJPWLT.js";import{f as j}from"./chunk-FRWG7YTE.js";import"./chunk-W6DIBD4Z.js";import"./chunk-FHYMHX3T.js";export{a as Actions,m as AgentDeliveryError,l as AgentError,b as Button,c as Card,d as CardLink,e as CardText,k as Client,j as CronExpression,f as Divider,o as NovuRequestHandler,g as Select,h as SelectOption,r as SeverityLevelEnum,i as TextInput,p as agent,q as providerSchemas,t as step,n as toAgentError,s as workflow};
@@ -1 +1 @@
1
- import{b as x,c as a,d as V,e as O}from"../chunk-Q6BV36LU.js";import{a as y,b as h,c,d as m,e as f,f as H,g as v,h as w,i as E}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as $}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as A,N,O as R,V as k}from"../chunk-E2MET7IR.js";import{a as b}from"../chunk-CANJPWLT.js";import{f as S}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";var l="express",U=p=>new a({frameworkName:l,...p,handler:(t,o)=>({body:()=>t.body,headers:e=>{let r=t.headers[e];return Array.isArray(r)?r[0]:r},method:()=>t.method||"GET",url:()=>{let e=t.headers.host||"",r=e!=null&&e.includes("://")?"":`${t.protocol||"https"}://`;return new URL(t.originalUrl||t.url||"",`${r}${e||""}`)},queryString:e=>{let r=t.query[e];return Array.isArray(r)?r[0]:r},transformResponse:({body:e,headers:r,status:s})=>(Object.entries(r).forEach(([n,d])=>{o.setHeader(n,d)}),o.status(s).send(e))})}).createHandler();export{y as Actions,N as AgentDeliveryError,A as AgentError,h as Button,c as Card,m as CardLink,f as CardText,x as Client,S as CronExpression,H as Divider,a as NovuRequestHandler,v as Select,w as SelectOption,k as SeverityLevelEnum,E as TextInput,V as agent,l as frameworkName,b as providerSchemas,U as serve,$ as step,R as toAgentError,O as workflow};
1
+ import{b as x,c as a,d as V,e as O}from"../chunk-TEOO6V72.js";import{a as y,b as h,c,d as m,e as f,f as H,g as v,h as w,i as E}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as $}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as A,N,O as R,V as k}from"../chunk-E2MET7IR.js";import{a as b}from"../chunk-CANJPWLT.js";import{f as S}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";var l="express",U=p=>new a({frameworkName:l,...p,handler:(t,o)=>({body:()=>t.body,headers:e=>{let r=t.headers[e];return Array.isArray(r)?r[0]:r},method:()=>t.method||"GET",url:()=>{let e=t.headers.host||"",r=e!=null&&e.includes("://")?"":`${t.protocol||"https"}://`;return new URL(t.originalUrl||t.url||"",`${r}${e||""}`)},queryString:e=>{let r=t.query[e];return Array.isArray(r)?r[0]:r},transformResponse:({body:e,headers:r,status:s})=>(Object.entries(r).forEach(([n,d])=>{o.setHeader(n,d)}),o.status(s).send(e))})}).createHandler();export{y as Actions,N as AgentDeliveryError,A as AgentError,h as Button,c as Card,m as CardLink,f as CardText,x as Client,S as CronExpression,H as Divider,a as NovuRequestHandler,v as Select,w as SelectOption,k as SeverityLevelEnum,E as TextInput,V as agent,l as frameworkName,b as providerSchemas,U as serve,$ as step,R as toAgentError,O as workflow};
@@ -1 +1 @@
1
- import{b as E,c as t,d as b,e as $}from"../chunk-Q6BV36LU.js";import{a as l,b as y,c as H,d as S,e as i,f,g,h as N,i as w}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as B}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as k,N as x,O,V as F}from"../chunk-E2MET7IR.js";import{a as q}from"../chunk-CANJPWLT.js";import{f as c}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";import{getHeader as o,getQuery as a,readBody as p,send as n,setHeaders as m}from"h3";var h="h3",L=d=>new t({frameworkName:h,...d,handler:r=>({body:()=>p(r),headers:e=>o(r,e),method:()=>r.method,url:()=>new URL(String(r.path),`${process.env.NODE_ENV==="development"?"http":"https"}://${String(o(r,"host"))}`),queryString:e=>String(a(r)[e]),transformResponse:e=>{let{res:s}=r.node;return s.statusCode=e.status,m(r,e.headers),n(r,e.body)}})}).createHandler();export{l as Actions,x as AgentDeliveryError,k as AgentError,y as Button,H as Card,S as CardLink,i as CardText,E as Client,c as CronExpression,f as Divider,t as NovuRequestHandler,g as Select,N as SelectOption,F as SeverityLevelEnum,w as TextInput,b as agent,h as frameworkName,q as providerSchemas,L as serve,B as step,O as toAgentError,$ as workflow};
1
+ import{b as E,c as t,d as b,e as $}from"../chunk-TEOO6V72.js";import{a as l,b as y,c as H,d as S,e as i,f,g,h as N,i as w}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as B}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as k,N as x,O,V as F}from"../chunk-E2MET7IR.js";import{a as q}from"../chunk-CANJPWLT.js";import{f as c}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";import{getHeader as o,getQuery as a,readBody as p,send as n,setHeaders as m}from"h3";var h="h3",L=d=>new t({frameworkName:h,...d,handler:r=>({body:()=>p(r),headers:e=>o(r,e),method:()=>r.method,url:()=>new URL(String(r.path),`${process.env.NODE_ENV==="development"?"http":"https"}://${String(o(r,"host"))}`),queryString:e=>String(a(r)[e]),transformResponse:e=>{let{res:s}=r.node;return s.statusCode=e.status,m(r,e.headers),n(r,e.body)}})}).createHandler();export{l as Actions,x as AgentDeliveryError,k as AgentError,y as Button,H as Card,S as CardLink,i as CardText,E as Client,c as CronExpression,f as Divider,t as NovuRequestHandler,g as Select,N as SelectOption,F as SeverityLevelEnum,w as TextInput,b as agent,h as frameworkName,q as providerSchemas,L as serve,B as step,O as toAgentError,$ as workflow};
@@ -1 +1 @@
1
- import{b as E,c as n,d as S,e as g}from"../chunk-Q6BV36LU.js";import{a as m,b as u,c as P,d as h,e as i,f as w,g as l,h as f,i as x}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as V}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as I,N as A,O as G,V as q}from"../chunk-E2MET7IR.js";import{a as b}from"../chunk-CANJPWLT.js";import{f as c}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";var p="lambda",N=y=>new n({frameworkName:p,...y,handler:r=>{let s=(e=>e.version==="2.0")(r);return{url:()=>{let e=s?r.requestContext.http.path:r.path,t=r.headers["x-forwarded-proto"]||"https",a=new URL(e,`${t}://${r.headers.host||r.headers.Host||""}`);for(let o in r.queryStringParameters)o&&a.searchParams.set(o,r.queryStringParameters[o]);return a},body:()=>{let e="{}";return r.body&&(e=r.isBase64Encoded?Buffer.from(r.body,"base64").toString():r.body),JSON.parse(e)},headers:e=>r.headers[e],queryString:e=>{var t;return(t=r.queryStringParameters)==null?void 0:t[e]},transformResponse:({body:e,status:t,headers:a})=>Promise.resolve({body:e,statusCode:t,headers:a}),method:()=>s?r.requestContext.http.method:r.httpMethod}}}).createHandler();export{m as Actions,A as AgentDeliveryError,I as AgentError,u as Button,P as Card,h as CardLink,i as CardText,E as Client,c as CronExpression,w as Divider,n as NovuRequestHandler,l as Select,f as SelectOption,q as SeverityLevelEnum,x as TextInput,S as agent,p as frameworkName,b as providerSchemas,N as serve,V as step,G as toAgentError,g as workflow};
1
+ import{b as E,c as n,d as S,e as g}from"../chunk-TEOO6V72.js";import{a as m,b as u,c as P,d as h,e as i,f as w,g as l,h as f,i as x}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as V}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as I,N as A,O as G,V as q}from"../chunk-E2MET7IR.js";import{a as b}from"../chunk-CANJPWLT.js";import{f as c}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";var p="lambda",N=y=>new n({frameworkName:p,...y,handler:r=>{let s=(e=>e.version==="2.0")(r);return{url:()=>{let e=s?r.requestContext.http.path:r.path,t=r.headers["x-forwarded-proto"]||"https",a=new URL(e,`${t}://${r.headers.host||r.headers.Host||""}`);for(let o in r.queryStringParameters)o&&a.searchParams.set(o,r.queryStringParameters[o]);return a},body:()=>{let e="{}";return r.body&&(e=r.isBase64Encoded?Buffer.from(r.body,"base64").toString():r.body),JSON.parse(e)},headers:e=>r.headers[e],queryString:e=>{var t;return(t=r.queryStringParameters)==null?void 0:t[e]},transformResponse:({body:e,status:t,headers:a})=>Promise.resolve({body:e,statusCode:t,headers:a}),method:()=>s?r.requestContext.http.method:r.httpMethod}}}).createHandler();export{m as Actions,A as AgentDeliveryError,I as AgentError,u as Button,P as Card,h as CardLink,i as CardText,E as Client,c as CronExpression,w as Divider,n as NovuRequestHandler,l as Select,f as SelectOption,q as SeverityLevelEnum,x as TextInput,S as agent,p as frameworkName,b as providerSchemas,N as serve,V as step,G as toAgentError,g as workflow};
@@ -1 +1 @@
1
- import{b as J,c as P,d as Z,e as te}from"../chunk-Q6BV36LU.js";import{a as j,b as F,c as L,d as V,e as U,f as k,g as B,h as $,i as K}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as oe}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as Q,N as W,O as X,V as re}from"../chunk-E2MET7IR.js";import{a as ee}from"../chunk-CANJPWLT.js";import{f as z}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import{d as n,e as i}from"../chunk-FHYMHX3T.js";import{Inject as N,Injectable as H}from"@nestjs/common";import{ConfigurableModuleBuilder as x}from"@nestjs/common";var{ConfigurableModuleClass:u,MODULE_OPTIONS_TOKEN:m,OPTIONS_TYPE:pe,ASYNC_OPTIONS_TYPE:ae}=new x().setClassMethodName("register").setFactoryMethodName("createNovuModuleOptions").setExtras(o=>({...o,isGlobal:!0})).build();var h="REGISTER_API_PATH",E="REGISTER_CONTROLLER_DECORATORS";import{Injectable as A}from"@nestjs/common";var c=class{handler(e,r){return{body:()=>e.body,headers:t=>{let a=e.headers[t.toLowerCase()];return Array.isArray(a)?a[0]:a},method:()=>e.method||"GET",queryString:t=>{let a=e.query[t];return Array.isArray(a)?a[0]:a},url:()=>{let t=e.headers.host||"",a=t!=null&&t.includes("://")?"":`${e.protocol||"https"}://`;return new URL(e.originalUrl||e.url||"",`${a}${t||""}`)},transformResponse:({body:t,headers:a,status:y})=>(Object.entries(a).forEach(([I,_])=>{r.setHeader(I,_)}),r.status(y).send(t))}}};c=n([A()],c);var q="nest",l=class{constructor(e,r){this.options=e;this.novuHandler=r;this.novuRequestHandler=new P({frameworkName:q,...this.options,handler:this.novuHandler.handler})}async handleRequest(e,r){await this.novuRequestHandler.createHandler()(e,r)}};l=n([H(),i(0,N(m)),i(1,N(c))],l);import{Controller as M,Get as D,Inject as C,Options as b,Post as w,Req as f,Res as O}from"@nestjs/common";var p=class{constructor(e){this.novuService=e}async handleGet(e,r){await this.novuService.handleRequest(e,r)}async handlePost(e,r){await this.novuService.handleRequest(e,r)}async handleOptions(e,r){await this.novuService.handleRequest(e,r)}};n([D(),i(0,f()),i(1,O())],p.prototype,"handleGet",1),n([w(),i(0,f()),i(1,O())],p.prototype,"handlePost",1),n([b(),i(0,f()),i(1,O())],p.prototype,"handleOptions",1),p=n([M(),i(0,C(l))],p);import{Module as G}from"@nestjs/common";import{PATH_METADATA as Y}from"@nestjs/common/constants";var R={provide:h,useFactory:o=>{if(!o.apiPath)throw new Error("`apiPath` must be provided to set the controller path");Reflect.defineMetadata(Y,o.apiPath,p)},inject:[m]};function T(o,e=[]){return e.reduce((r,s)=>{let t=s(r);return t!=null?t:r},o)}function g(o,e){var r;for(let s of(r=Reflect.getMetadataKeys(o))!=null?r:[])Reflect.defineMetadata(s,Reflect.getMetadata(s,o),e)}function S(o,e=[]){let r=T(o,e);r!==o&&g(r,o)}var v={provide:E,useFactory:o=>{var e;S(p,(e=o.controllerDecorators)!=null?e:[])},inject:[m]};var d=class extends u{static register(e,r){var t;let s=u.register(e);return s.controllers=[T(p,e.controllerDecorators||[])],(t=s.providers)==null||t.push(R,l,c,...r||[]),s.exports=[l,c],s}static registerAsync(e,r){var t;let s=u.registerAsync(e);return s.controllers=[p],(t=s.providers)==null||t.push(R,v,l,c,...r||[]),s.exports=[l,c],s}};d=n([G({})],d);export{j as Actions,W as AgentDeliveryError,Q as AgentError,F as Button,L as Card,V as CardLink,U as CardText,J as Client,z as CronExpression,k as Divider,m as NOVU_OPTIONS,l as NovuClient,p as NovuController,c as NovuHandler,d as NovuModule,P as NovuRequestHandler,h as REGISTER_API_PATH,E as REGISTER_CONTROLLER_DECORATORS,B as Select,$ as SelectOption,re as SeverityLevelEnum,K as TextInput,Z as agent,q as frameworkName,ee as providerSchemas,R as registerApiPath,v as registerControllerDecorators,oe as step,X as toAgentError,te as workflow};
1
+ import{b as J,c as P,d as Z,e as te}from"../chunk-TEOO6V72.js";import{a as j,b as F,c as L,d as V,e as U,f as k,g as B,h as $,i as K}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as oe}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as Q,N as W,O as X,V as re}from"../chunk-E2MET7IR.js";import{a as ee}from"../chunk-CANJPWLT.js";import{f as z}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import{d as n,e as i}from"../chunk-FHYMHX3T.js";import{Inject as N,Injectable as H}from"@nestjs/common";import{ConfigurableModuleBuilder as x}from"@nestjs/common";var{ConfigurableModuleClass:u,MODULE_OPTIONS_TOKEN:m,OPTIONS_TYPE:pe,ASYNC_OPTIONS_TYPE:ae}=new x().setClassMethodName("register").setFactoryMethodName("createNovuModuleOptions").setExtras(o=>({...o,isGlobal:!0})).build();var h="REGISTER_API_PATH",E="REGISTER_CONTROLLER_DECORATORS";import{Injectable as A}from"@nestjs/common";var c=class{handler(e,r){return{body:()=>e.body,headers:t=>{let a=e.headers[t.toLowerCase()];return Array.isArray(a)?a[0]:a},method:()=>e.method||"GET",queryString:t=>{let a=e.query[t];return Array.isArray(a)?a[0]:a},url:()=>{let t=e.headers.host||"",a=t!=null&&t.includes("://")?"":`${e.protocol||"https"}://`;return new URL(e.originalUrl||e.url||"",`${a}${t||""}`)},transformResponse:({body:t,headers:a,status:y})=>(Object.entries(a).forEach(([I,_])=>{r.setHeader(I,_)}),r.status(y).send(t))}}};c=n([A()],c);var q="nest",l=class{constructor(e,r){this.options=e;this.novuHandler=r;this.novuRequestHandler=new P({frameworkName:q,...this.options,handler:this.novuHandler.handler})}async handleRequest(e,r){await this.novuRequestHandler.createHandler()(e,r)}};l=n([H(),i(0,N(m)),i(1,N(c))],l);import{Controller as M,Get as D,Inject as C,Options as b,Post as w,Req as f,Res as O}from"@nestjs/common";var p=class{constructor(e){this.novuService=e}async handleGet(e,r){await this.novuService.handleRequest(e,r)}async handlePost(e,r){await this.novuService.handleRequest(e,r)}async handleOptions(e,r){await this.novuService.handleRequest(e,r)}};n([D(),i(0,f()),i(1,O())],p.prototype,"handleGet",1),n([w(),i(0,f()),i(1,O())],p.prototype,"handlePost",1),n([b(),i(0,f()),i(1,O())],p.prototype,"handleOptions",1),p=n([M(),i(0,C(l))],p);import{Module as G}from"@nestjs/common";import{PATH_METADATA as Y}from"@nestjs/common/constants";var R={provide:h,useFactory:o=>{if(!o.apiPath)throw new Error("`apiPath` must be provided to set the controller path");Reflect.defineMetadata(Y,o.apiPath,p)},inject:[m]};function T(o,e=[]){return e.reduce((r,s)=>{let t=s(r);return t!=null?t:r},o)}function g(o,e){var r;for(let s of(r=Reflect.getMetadataKeys(o))!=null?r:[])Reflect.defineMetadata(s,Reflect.getMetadata(s,o),e)}function S(o,e=[]){let r=T(o,e);r!==o&&g(r,o)}var v={provide:E,useFactory:o=>{var e;S(p,(e=o.controllerDecorators)!=null?e:[])},inject:[m]};var d=class extends u{static register(e,r){var t;let s=u.register(e);return s.controllers=[T(p,e.controllerDecorators||[])],(t=s.providers)==null||t.push(R,l,c,...r||[]),s.exports=[l,c],s}static registerAsync(e,r){var t;let s=u.registerAsync(e);return s.controllers=[p],(t=s.providers)==null||t.push(R,v,l,c,...r||[]),s.exports=[l,c],s}};d=n([G({})],d);export{j as Actions,W as AgentDeliveryError,Q as AgentError,F as Button,L as Card,V as CardLink,U as CardText,J as Client,z as CronExpression,k as Divider,m as NOVU_OPTIONS,l as NovuClient,p as NovuController,c as NovuHandler,d as NovuModule,P as NovuRequestHandler,h as REGISTER_API_PATH,E as REGISTER_CONTROLLER_DECORATORS,B as Select,$ as SelectOption,re as SeverityLevelEnum,K as TextInput,Z as agent,q as frameworkName,ee as providerSchemas,R as registerApiPath,v as registerControllerDecorators,oe as step,X as toAgentError,te as workflow};
@@ -1 +1 @@
1
- import{a as l,b as v,c,d as k,e as U}from"../chunk-Q6BV36LU.js";import{a as O,b as x,c as q,d as S,e as T,f as w,g as P,h as A,i as E}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as L}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as g,N as F,O as j,V as I}from"../chunk-E2MET7IR.js";import{a as G}from"../chunk-CANJPWLT.js";import{f as b}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";var m="next",N=o=>typeof o=="object"&&o!==null&&typeof o.setHeader=="function"&&typeof o.status=="function"&&typeof o.send=="function",V=o=>{let p=new c({frameworkName:m,...o,handler:(h,R,d)=>{let n=R,i=e=>{let t=typeof n.headers.get=="function"?n.headers.get(e):n.headers[e];return Array.isArray(t)?t[0]:t};return{body:()=>typeof n.json=="function"?n.json():n.body,headers:i,method:()=>h||n.method||"",queryString:(e,t)=>{var a;let r=((a=n.query)==null?void 0:a[e])||t.searchParams.get(e);return Array.isArray(r)?r[0]:r},url:()=>{let e;try{e=new URL(n.url)}catch{}if(e){let s=i("host");if(s){let u=new URL(s.includes("://")?s:`${e.protocol}//${s}`);e.protocol=u.protocol,e.host=u.host,e.port=u.port,e.username=u.username,e.password=u.password}return e}let t="https",r=i("host")||"";try{(process.env.NODE_ENV==="development"||process.env.NODE_ENV==="dev")&&(t="http")}catch{}return new URL(n.url,`${t}://${r}`)},transformResponse:({body:e,headers:t,status:r})=>{if(N(d)){Object.entries(t).forEach(([s,u])=>{d.setHeader(s,u)}),d.status(r).send(e);return}let a=l();return new a(e,{status:r,headers:t})}}}}).createHandler(),f=p.bind(null,void 0);return Object.defineProperties(f,{GET:{value:p.bind(null,"GET")},POST:{value:p.bind(null,"POST")},OPTIONS:{value:p.bind(null,"OPTIONS")}})};export{O as Actions,F as AgentDeliveryError,g as AgentError,x as Button,q as Card,S as CardLink,T as CardText,v as Client,b as CronExpression,w as Divider,c as NovuRequestHandler,P as Select,A as SelectOption,I as SeverityLevelEnum,E as TextInput,k as agent,m as frameworkName,G as providerSchemas,V as serve,L as step,j as toAgentError,U as workflow};
1
+ import{a as l,b as v,c,d as k,e as U}from"../chunk-TEOO6V72.js";import{a as O,b as x,c as q,d as S,e as T,f as w,g as P,h as A,i as E}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as L}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as g,N as F,O as j,V as I}from"../chunk-E2MET7IR.js";import{a as G}from"../chunk-CANJPWLT.js";import{f as b}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";var m="next",N=o=>typeof o=="object"&&o!==null&&typeof o.setHeader=="function"&&typeof o.status=="function"&&typeof o.send=="function",V=o=>{let p=new c({frameworkName:m,...o,handler:(h,R,d)=>{let n=R,i=e=>{let t=typeof n.headers.get=="function"?n.headers.get(e):n.headers[e];return Array.isArray(t)?t[0]:t};return{body:()=>typeof n.json=="function"?n.json():n.body,headers:i,method:()=>h||n.method||"",queryString:(e,t)=>{var a;let r=((a=n.query)==null?void 0:a[e])||t.searchParams.get(e);return Array.isArray(r)?r[0]:r},url:()=>{let e;try{e=new URL(n.url)}catch{}if(e){let s=i("host");if(s){let u=new URL(s.includes("://")?s:`${e.protocol}//${s}`);e.protocol=u.protocol,e.host=u.host,e.port=u.port,e.username=u.username,e.password=u.password}return e}let t="https",r=i("host")||"";try{(process.env.NODE_ENV==="development"||process.env.NODE_ENV==="dev")&&(t="http")}catch{}return new URL(n.url,`${t}://${r}`)},transformResponse:({body:e,headers:t,status:r})=>{if(N(d)){Object.entries(t).forEach(([s,u])=>{d.setHeader(s,u)}),d.status(r).send(e);return}let a=l();return new a(e,{status:r,headers:t})}}}}).createHandler(),f=p.bind(null,void 0);return Object.defineProperties(f,{GET:{value:p.bind(null,"GET")},POST:{value:p.bind(null,"POST")},OPTIONS:{value:p.bind(null,"OPTIONS")}})};export{O as Actions,F as AgentDeliveryError,g as AgentError,x as Button,q as Card,S as CardLink,T as CardText,v as Client,b as CronExpression,w as Divider,c as NovuRequestHandler,P as Select,A as SelectOption,I as SeverityLevelEnum,E as TextInput,k as agent,m as frameworkName,G as providerSchemas,V as serve,L as step,j as toAgentError,U as workflow};
@@ -1 +1 @@
1
- import{b as x,c as t,d as b,e as $}from"../chunk-Q6BV36LU.js";import{a as l,b as H,c as S,d as i,e as y,f,g,h as N,i as w}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as B}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as E,N as k,O,V as F}from"../chunk-E2MET7IR.js";import{a as q}from"../chunk-CANJPWLT.js";import{f as c}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";import{getHeader as o,getQuery as a,readBody as n,send as p,setHeaders as m}from"h3";var u="nuxt",Q=d=>new t({frameworkName:u,...d,handler:r=>({queryString:e=>String(a(r)[e]),body:()=>n(r),headers:e=>o(r,e),url:()=>new URL(String(r.path),`${process.env.NODE_ENV==="development"?"http":"https"}://${String(o(r,"host"))}`),method:()=>r.method,transformResponse:e=>{let{res:s}=r.node;return s.statusCode=e.status,m(r,e.headers),p(r,e.body)}})}).createHandler();export{l as Actions,k as AgentDeliveryError,E as AgentError,H as Button,S as Card,i as CardLink,y as CardText,x as Client,c as CronExpression,f as Divider,t as NovuRequestHandler,g as Select,N as SelectOption,F as SeverityLevelEnum,w as TextInput,b as agent,u as frameworkName,q as providerSchemas,Q as serve,B as step,O as toAgentError,$ as workflow};
1
+ import{b as x,c as t,d as b,e as $}from"../chunk-TEOO6V72.js";import{a as l,b as H,c as S,d as i,e as y,f,g,h as N,i as w}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as B}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as E,N as k,O,V as F}from"../chunk-E2MET7IR.js";import{a as q}from"../chunk-CANJPWLT.js";import{f as c}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";import{getHeader as o,getQuery as a,readBody as n,send as p,setHeaders as m}from"h3";var u="nuxt",Q=d=>new t({frameworkName:u,...d,handler:r=>({queryString:e=>String(a(r)[e]),body:()=>n(r),headers:e=>o(r,e),url:()=>new URL(String(r.path),`${process.env.NODE_ENV==="development"?"http":"https"}://${String(o(r,"host"))}`),method:()=>r.method,transformResponse:e=>{let{res:s}=r.node;return s.statusCode=e.status,m(r,e.headers),p(r,e.body)}})}).createHandler();export{l as Actions,k as AgentDeliveryError,E as AgentError,H as Button,S as Card,i as CardLink,y as CardText,x as Client,c as CronExpression,f as Divider,t as NovuRequestHandler,g as Select,N as SelectOption,F as SeverityLevelEnum,w as TextInput,b as agent,u as frameworkName,q as providerSchemas,Q as serve,B as step,O as toAgentError,$ as workflow};
@@ -1 +1 @@
1
- import{a as t,b as v,c as o,d as g,e as F}from"../chunk-Q6BV36LU.js";import{a as u,b as h,c as l,d as R,e as c,f as i,g as w,h as f,i as x}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as O}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as H,N,O as S,V as q}from"../chunk-E2MET7IR.js";import{a as y}from"../chunk-CANJPWLT.js";import{f as k}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";var m="remix",L=s=>new o({frameworkName:m,...s,handler:({request:e})=>({body:()=>e.json(),headers:r=>e.headers.get(r),method:()=>e.method,url:()=>new URL(e.url,`https://${e.headers.get("host")||""}`),transformResponse:({body:r,status:n,headers:p})=>{let a=t();return new a(r,{status:n,headers:p})}})}).createHandler();export{u as Actions,N as AgentDeliveryError,H as AgentError,h as Button,l as Card,R as CardLink,c as CardText,v as Client,k as CronExpression,i as Divider,o as NovuRequestHandler,w as Select,f as SelectOption,q as SeverityLevelEnum,x as TextInput,g as agent,m as frameworkName,y as providerSchemas,L as serve,O as step,S as toAgentError,F as workflow};
1
+ import{a as t,b as v,c as o,d as g,e as F}from"../chunk-TEOO6V72.js";import{a as u,b as h,c as l,d as R,e as c,f as i,g as w,h as f,i as x}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as O}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as H,N,O as S,V as q}from"../chunk-E2MET7IR.js";import{a as y}from"../chunk-CANJPWLT.js";import{f as k}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";var m="remix",L=s=>new o({frameworkName:m,...s,handler:({request:e})=>({body:()=>e.json(),headers:r=>e.headers.get(r),method:()=>e.method,url:()=>new URL(e.url,`https://${e.headers.get("host")||""}`),transformResponse:({body:r,status:n,headers:p})=>{let a=t();return new a(r,{status:n,headers:p})}})}).createHandler();export{u as Actions,N as AgentDeliveryError,H as AgentError,h as Button,l as Card,R as CardLink,c as CardText,v as Client,k as CronExpression,i as Divider,o as NovuRequestHandler,w as Select,f as SelectOption,q as SeverityLevelEnum,x as TextInput,g as agent,m as frameworkName,y as providerSchemas,L as serve,O as step,S as toAgentError,F as workflow};
@@ -1 +1 @@
1
- import{a as r,b as q,c as s,d as y,e as k}from"../chunk-Q6BV36LU.js";import{a as v,b as E,c as P,d as R,e as T,f as S,g as c,h as f,i as h}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as H}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as F,N as b,O as w,V as I}from"../chunk-E2MET7IR.js";import{a as G}from"../chunk-CANJPWLT.js";import{f as N}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";var m="sveltekit",j=o=>{let t=new s({frameworkName:m,...o,handler:(u,e)=>({method:()=>u||e.request.method||"",body:()=>e.request.json(),headers:n=>e.request.headers.get(n),url:()=>{let n=process.env.NODE_ENV==="development"||process.env.NODE_ENV==="dev"?"http":"https";return new URL(e.request.url,`${n}://${e.request.headers.get("host")||""}`)},transformResponse:({body:n,headers:d,status:a})=>{let l=r();return new l(n,{status:a,headers:d})}})}).createHandler(),p=t.bind(null,void 0);return Object.defineProperties(p,{GET:{value:t.bind(null,"GET")},POST:{value:t.bind(null,"POST")},OPTIONS:{value:t.bind(null,"OPTIONS")}})};export{v as Actions,b as AgentDeliveryError,F as AgentError,E as Button,P as Card,R as CardLink,T as CardText,q as Client,N as CronExpression,S as Divider,s as NovuRequestHandler,c as Select,f as SelectOption,I as SeverityLevelEnum,h as TextInput,y as agent,m as frameworkName,G as providerSchemas,j as serve,H as step,w as toAgentError,k as workflow};
1
+ import{a as r,b as q,c as s,d as y,e as k}from"../chunk-TEOO6V72.js";import{a as v,b as E,c as P,d as R,e as T,f as S,g as c,h as f,i as h}from"../chunk-C3P3ZH2I.js";import"../chunk-3XT6S7TZ.js";import{a as H}from"../chunk-2M25EATE.js";import"../chunk-22DBAEUX.js";import{M as F,N as b,O as w,V as I}from"../chunk-E2MET7IR.js";import{a as G}from"../chunk-CANJPWLT.js";import{f as N}from"../chunk-FRWG7YTE.js";import"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";var m="sveltekit",j=o=>{let t=new s({frameworkName:m,...o,handler:(u,e)=>({method:()=>u||e.request.method||"",body:()=>e.request.json(),headers:n=>e.request.headers.get(n),url:()=>{let n=process.env.NODE_ENV==="development"||process.env.NODE_ENV==="dev"?"http":"https";return new URL(e.request.url,`${n}://${e.request.headers.get("host")||""}`)},transformResponse:({body:n,headers:d,status:a})=>{let l=r();return new l(n,{status:a,headers:d})}})}).createHandler(),p=t.bind(null,void 0);return Object.defineProperties(p,{GET:{value:t.bind(null,"GET")},POST:{value:t.bind(null,"POST")},OPTIONS:{value:t.bind(null,"OPTIONS")}})};export{v as Actions,b as AgentDeliveryError,F as AgentError,E as Button,P as Card,R as CardLink,T as CardText,q as Client,N as CronExpression,S as Divider,s as NovuRequestHandler,c as Select,f as SelectOption,I as SeverityLevelEnum,h as TextInput,y as agent,m as frameworkName,G as providerSchemas,j as serve,H as step,w as toAgentError,k as workflow};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@novu/framework",
3
- "version": "2.11.2-alpha.1",
3
+ "version": "2.12.0",
4
4
  "description": "The Code-First Notifications Workflow SDK.",
5
5
  "main": "./dist/cjs/index.cjs",
6
6
  "types": "./dist/cjs/index.d.cts",