@novu/framework 2.13.1 → 2.13.2

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.
@@ -145,13 +145,13 @@ $$`:`${e}$$`},nT=e=>ZS(e)%2===0?e:tT(e),rT=e=>eT(e)%2===1?`${e}$`:e,iT=(e,n,t)=>
145
145
  `);t&&r.length>0&&r.at(-1)===""&&r.pop();let i=[],o=!1,a=!1;for(let u=0;u<r.length;u++){let p=r[u].trim();if(!o&&(p.startsWith("```")||p.startsWith("~~~"))){a=!a,i.push(r[u]);continue}if(a){i.push(r[u]);continue}let d=p!==""&&(Ml.test(p)||Nl.test(p));if(d&&!o){let h=!1;for(let g=u;g<r.length;g++){let y=r[g].trim();if(Nl.test(y)){h=!0;break}if(y===""||!Ml.test(y))break}h&&(i.push("```"),o=!0)}else!d&&o&&(i.push("```"),o=!1);i.push(r[u])}o&&n&&i.push("```");let s=i.join(`
146
146
  `);return t&&(s+=`
147
147
  `),s}function FT(e){return"adapterName"in e&&!("adapter"in e)}var wf="thread-state:";function UT(e){return e!==null&&typeof e=="object"&&Symbol.asyncIterator in e}var LP=class Ll{constructor(n){ke(this,"id");ke(this,"channelId");ke(this,"isDM");ke(this,"channelVisibility");ke(this,"_adapter");ke(this,"_adapterName");ke(this,"_stateAdapterInstance");ke(this,"_recentMessages",[]);ke(this,"_isSubscribedContext");ke(this,"_currentMessage");ke(this,"_streamingUpdateIntervalMs");ke(this,"_fallbackStreamingPlaceholderText");ke(this,"_channel");ke(this,"_threadHistory");ke(this,"_logger");var t,r,i,o;this.id=n.id,this.channelId=n.channelId,this.isDM=(t=n.isDM)!=null?t:!1,this.channelVisibility=(r=n.channelVisibility)!=null?r:"unknown",this._isSubscribedContext=(i=n.isSubscribedContext)!=null?i:!1,this._currentMessage=n.currentMessage,this._logger=n.logger,this._streamingUpdateIntervalMs=(o=n.streamingUpdateIntervalMs)!=null?o:500,this._fallbackStreamingPlaceholderText=n.fallbackStreamingPlaceholderText!==void 0?n.fallbackStreamingPlaceholderText:"...",FT(n)?this._adapterName=n.adapterName:(this._adapter=n.adapter,this._stateAdapterInstance=n.stateAdapter,this._threadHistory=n.threadHistory),n.initialMessage&&(this._recentMessages=[n.initialMessage])}get adapter(){if(this._adapter)return this._adapter;if(!this._adapterName)throw new Error("Thread has no adapter configured");let t=Vo().getAdapter(this._adapterName);if(!t)throw new Error(`Adapter "${this._adapterName}" not found in Chat singleton`);return this._adapter=t,t}get _stateAdapter(){if(this._stateAdapterInstance)return this._stateAdapterInstance;let n=Vo();return this._stateAdapterInstance=n.getState(),this._stateAdapterInstance}get recentMessages(){return this._recentMessages}set recentMessages(n){this._recentMessages=n}get state(){return this._stateAdapter.get(`${wf}${this.id}`)}async setState(n,t){let r=`${wf}${this.id}`;if(t!=null&&t.replace)await this._stateAdapter.set(r,n,Ho);else{let o={...await this._stateAdapter.get(r),...n};await this._stateAdapter.set(r,o,Ho)}}get channel(){if(!this._channel){let n=IT(this.adapter,this.id);this._channel=new CT({id:n,adapter:this.adapter,stateAdapter:this._stateAdapter,isDM:this.isDM,channelVisibility:this.channelVisibility,threadHistory:this._threadHistory})}return this._channel}get messages(){let n=this.adapter,t=this.id,r=this._threadHistory;return{async*[Symbol.asyncIterator](){let i,o=!1;for(;;){let a=await n.fetchMessages(t,{cursor:i,direction:"backward"}),s=[...a.messages].reverse();for(let u of s)o=!0,yield u;if(!a.nextCursor||a.messages.length===0)break;i=a.nextCursor}if(!o&&r){let a=await r.getMessages(t);for(let s=a.length-1;s>=0;s--)yield a[s]}}}}get allMessages(){let n=this.adapter,t=this.id,r=this._threadHistory;return{async*[Symbol.asyncIterator](){let i,o=!1;for(;;){let a=await n.fetchMessages(t,{limit:100,cursor:i,direction:"forward"});for(let s of a.messages)o=!0,yield s;if(!a.nextCursor||a.messages.length===0)break;i=a.nextCursor}if(!o&&r){let a=await r.getMessages(t);for(let s of a)yield s}}}}async getParticipants(){let n=new Map;this._currentMessage&&!this._currentMessage.author.isMe&&!this._currentMessage.author.isBot&&n.set(this._currentMessage.author.userId,this._currentMessage.author);for await(let t of this.allMessages)t.author.isMe||t.author.isBot||n.has(t.author.userId)||n.set(t.author.userId,t.author);return[...n.values()]}async isSubscribed(){return this._isSubscribedContext?!0:this._stateAdapter.isSubscribed(this.id)}async subscribe(){await this._stateAdapter.subscribe(this.id),this.adapter.onThreadSubscribe&&await this.adapter.onThreadSubscribe(this.id)}async unsubscribe(){await this._stateAdapter.unsubscribe(this.id)}async post(n){if(vf(n)){if(n.kind==="stream"){let o=n.getPostData(),a={...o.options.updateIntervalMs?{updateIntervalMs:o.options.updateIntervalMs}:{},...o.options.groupTasks?{taskDisplayMode:o.options.groupTasks}:{},...o.options.endWith?{stopBlocks:o.options.endWith}:{}};return await this.handleStream(o.stream,a),n}return await this.handlePostableObject(n),n}if(UT(n))return this.handleStream(n);let t=n;if(Ht(n)){let o=Vt(n);if(!o)throw new Error("Invalid JSX element: must be a Card element");t=o}t=await this.processCallbackUrls(t);let r=await this.adapter.postMessage(this.id,t),i=this.createSentMessage(r.id,t,r.threadId);return this._threadHistory&&await this._threadHistory.append(this.id,new Vn(i)),i}async handlePostableObject(n){await Af(n,this.adapter,this.id,(t,r)=>this.adapter.postMessage(t,r),this._logger)}async postEphemeral(n,t,r){let{fallbackToDM:i}=r,o=typeof n=="string"?n:n.userId,a;if(Ht(t)){let s=Vt(t);if(!s)throw new Error("Invalid JSX element: must be a Card element");a=s}else a=t;if(a=await this.processCallbackUrls(a),this.adapter.postEphemeral)return this.adapter.postEphemeral(this.id,o,a);if(!i)return null;if(this.adapter.openDM){let s=await this.adapter.openDM(o),u=await this.adapter.postMessage(s,a);return{id:u.id,threadId:s,usedFallback:!0,raw:u.raw}}return null}async processCallbackUrls(n){var t;if(typeof n=="string")return n;if("type"in n&&n.type==="card")return zo(n,this._stateAdapter);if("card"in n&&((t=n.card)==null?void 0:t.type)==="card"){let r=await zo(n.card,this._stateAdapter);if(r!==n.card)return{...n,card:r}}return n}async schedule(n,t){let r;if(Ht(n)){let i=Vt(n);if(!i)throw new Error("Invalid JSX element: must be a Card element");r=i}else r=n;if(r=await this.processCallbackUrls(r),!this.adapter.scheduleMessage)throw new Ef("Scheduled messages are not supported by this adapter","scheduling");return this.adapter.scheduleMessage(this.id,r,t)}async handleStream(n,t){let r=kf(n),i={updateIntervalMs:this._streamingUpdateIntervalMs,...t};if(this._currentMessage&&(i.recipientUserId=this._currentMessage.author.userId,i.recipientTeamId=this.extractSlackRecipientTeamId(this._currentMessage.raw)),this.adapter.stream){let a="",s={[Symbol.asyncIterator]:()=>{let p=r[Symbol.asyncIterator]();return{async next(){let d=await p.next();if(!d.done){let h=d.value;typeof h=="string"?a+=h:h.type==="markdown_text"&&(a+=h.text)}return d}}}},u=await this.adapter.stream(this.id,s,i);if(u){let p=this.createSentMessage(u.id,{markdown:a},u.threadId);return this._threadHistory&&await this._threadHistory.append(this.id,new Vn(p)),p}}let o={[Symbol.asyncIterator]:()=>{let a=r[Symbol.asyncIterator]();return{async next(){for(;;){let s=await a.next();if(s.done)return{value:void 0,done:!0};let u=s.value;if(typeof u=="string")return{value:u,done:!1};if(u.type==="markdown_text")return{value:u.text,done:!1}}}}}};return this.fallbackStream(o,i)}extractSlackRecipientTeamId(n){var r;if(!n||typeof n!="object")return;let t=n;if(typeof t.team_id=="string"&&t.team_id)return t.team_id;if(typeof t.team=="string"&&t.team)return t.team;if(t.team&&typeof t.team=="object"&&typeof t.team.id=="string"&&t.team.id)return t.team.id;if(typeof((r=t.user)==null?void 0:r.team_id)=="string"&&t.user.team_id)return t.user.team_id}async startTyping(n){await this.adapter.startTyping(this.id,n)}async fallbackStream(n,t){var B;let r=(B=t==null?void 0:t.updateIntervalMs)!=null?B:this._streamingUpdateIntervalMs,i=this._fallbackStreamingPlaceholderText,o=i===null?null:await this.adapter.postMessage(this.id,i),a=this.id,s=new MT,u="",p=!1,d=null,h=null;o&&(a=o.threadId||this.id,u=i!=null?i:"");let g=()=>{h=setTimeout(()=>{d=y()},r)},y=async()=>{var ne;if(p||!o)return;let ue=s.render();if(ue.trim()&&ue!==u)try{await this.adapter.editMessage(a,o.id,{markdown:ue}),u=ue}catch(ve){(ne=this._logger)==null||ne.warn("fallbackStream edit failed",ve)}p||g()};o&&g();try{for await(let ue of n)if(s.push(ue),!o){let ne=s.render();ne.trim()&&(o=await this.adapter.postMessage(this.id,{markdown:ne}),a=o.threadId||this.id,u=ne,g())}}finally{p=!0,h&&(clearTimeout(h),h=null)}d&&await d;let P=s.getText(),ee=s.finish();o||(o=await this.adapter.postMessage(this.id,{markdown:P.trim()?P:" "}),a=o.threadId||this.id,u=P),ee.trim()&&ee!==u&&await this.adapter.editMessage(a,o.id,{markdown:P});let Z=this.createSentMessage(o.id,{markdown:P},a);return this._threadHistory&&await this._threadHistory.append(this.id,new Vn(Z)),Z}async refresh(){let n=await this.adapter.fetchMessages(this.id,{limit:50});n.messages.length>0?this._recentMessages=n.messages:this._threadHistory?this._recentMessages=await this._threadHistory.getMessages(this.id,50):this._recentMessages=[]}mentionUser(n){return`<@${n}>`}toJSON(){var n,t;return{_type:"chat:Thread",id:this.id,channelId:this.channelId,channelVisibility:this.channelVisibility,currentMessage:(n=this._currentMessage)==null?void 0:n.toJSON(),isDM:this.isDM,adapterName:(t=this._adapterName)!=null?t:this.adapter.name}}static fromJSON(n,t){let r=new Ll({id:n.id,adapterName:n.adapterName,channelId:n.channelId,channelVisibility:n.channelVisibility,currentMessage:n.currentMessage?Vn.fromJSON(n.currentMessage):void 0,isDM:n.isDM});return t&&(r._adapter=t),r}static[or](n){return n.toJSON()}static[ar](n){return Ll.fromJSON(n)}createSentMessage(n,t,r){let i=this.adapter,o=r||this.id,a=this,{plainText:s,formatted:u,attachments:p}=$T(t);return{id:n,threadId:o,text:s,formatted:u,raw:null,links:[],author:{userId:"self",userName:i.userName,fullName:i.userName,isBot:!0,isMe:!0},metadata:{dateSent:new Date,edited:!1},attachments:p,toJSON(){return new Vn(this).toJSON()},async edit(h){let g=h;if(Ht(h)){let y=Vt(h);if(!y)throw new Error("Invalid JSX element: must be a Card element");g=y}return g=await a.processCallbackUrls(g),await i.editMessage(o,n,g),a.createSentMessage(n,g)},async delete(){await i.deleteMessage(o,n)},async addReaction(h){await i.addReaction(o,n,h)},async removeReaction(h){await i.removeReaction(o,n,h)}}}createSentMessageFromMessage(n){let t=this.adapter,r=this.id,i=n.id,o=this;return{id:n.id,threadId:n.threadId,text:n.text,formatted:n.formatted,raw:n.raw,author:n.author,metadata:n.metadata,attachments:n.attachments,links:n.links,isMention:n.isMention,toJSON(){return n.toJSON()},async edit(a){let s=a;if(Ht(a)){let u=Vt(a);if(!u)throw new Error("Invalid JSX element: must be a Card element");s=u}return s=await o.processCallbackUrls(s),await t.editMessage(r,i,s),o.createSentMessage(i,s,r)},async delete(){await t.deleteMessage(r,i)},async addReaction(a){await t.addReaction(r,i,a)},async removeReaction(a){await t.removeReaction(r,i,a)}}}};function $T(e){if(typeof e=="string")return{plainText:e,formatted:yn([gn([mn(e)])]),attachments:[]};if("raw"in e)return{plainText:e.raw,formatted:yn([gn([mn(e.raw)])]),attachments:e.attachments||[]};if("markdown"in e){let n=yl(e.markdown);return{plainText:Br(n),formatted:n,attachments:e.attachments||[]}}if("ast"in e)return{plainText:Br(e.ast),formatted:e.ast,attachments:e.attachments||[]};if("card"in e){let n=e.fallbackText||zr(e.card);return{plainText:n,formatted:yn([gn([mn(n)])]),attachments:[]}}if("type"in e&&e.type==="card"){let n=zr(e);return{plainText:n,formatted:yn([gn([mn(n)])]),attachments:[]}}throw new Error("Invalid PostableMessage format")}var DP=10080*60*1e3;var FP=600*1e3,UP=1440*60*1e3;var Sf=new Map;function sr(e){let n=Sf.get(e);return n||(n=Object.freeze({name:e,toString:()=>`{{emoji:${e}}}`,toJSON:()=>`{{emoji:${e}}}`}),Sf.set(e,n)),n}var qT={thumbs_up:{slack:["+1","thumbsup"],gchat:"\u{1F44D}"},thumbs_down:{slack:["-1","thumbsdown"],gchat:"\u{1F44E}"},clap:{slack:"clap",gchat:"\u{1F44F}"},wave:{slack:"wave",gchat:"\u{1F44B}"},pray:{slack:"pray",gchat:"\u{1F64F}"},muscle:{slack:"muscle",gchat:"\u{1F4AA}"},ok_hand:{slack:"ok_hand",gchat:"\u{1F44C}"},point_up:{slack:"point_up",gchat:"\u{1F446}"},point_down:{slack:"point_down",gchat:"\u{1F447}"},point_left:{slack:"point_left",gchat:"\u{1F448}"},point_right:{slack:"point_right",gchat:"\u{1F449}"},raised_hands:{slack:"raised_hands",gchat:"\u{1F64C}"},shrug:{slack:"shrug",gchat:"\u{1F937}"},facepalm:{slack:"facepalm",gchat:"\u{1F926}"},heart:{slack:"heart",gchat:["\u2764\uFE0F","\u2764"]},smile:{slack:["smile","slightly_smiling_face"],gchat:"\u{1F60A}"},laugh:{slack:["laughing","satisfied","joy"],gchat:["\u{1F602}","\u{1F606}"]},thinking:{slack:"thinking_face",gchat:"\u{1F914}"},sad:{slack:["cry","sad","white_frowning_face"],gchat:"\u{1F622}"},cry:{slack:"sob",gchat:"\u{1F62D}"},angry:{slack:"angry",gchat:"\u{1F620}"},love_eyes:{slack:"heart_eyes",gchat:"\u{1F60D}"},cool:{slack:"sunglasses",gchat:"\u{1F60E}"},wink:{slack:"wink",gchat:"\u{1F609}"},surprised:{slack:"open_mouth",gchat:"\u{1F62E}"},worried:{slack:"worried",gchat:"\u{1F61F}"},confused:{slack:"confused",gchat:"\u{1F615}"},neutral:{slack:"neutral_face",gchat:"\u{1F610}"},sleeping:{slack:"sleeping",gchat:"\u{1F634}"},sick:{slack:"nauseated_face",gchat:"\u{1F922}"},mind_blown:{slack:"exploding_head",gchat:"\u{1F92F}"},relieved:{slack:"relieved",gchat:"\u{1F60C}"},grimace:{slack:"grimacing",gchat:"\u{1F62C}"},rolling_eyes:{slack:"rolling_eyes",gchat:"\u{1F644}"},hug:{slack:"hugging_face",gchat:"\u{1F917}"},zany:{slack:"zany_face",gchat:"\u{1F92A}"},check:{slack:["white_check_mark","heavy_check_mark"],gchat:["\u2705","\u2714\uFE0F"]},x:{slack:["x","heavy_multiplication_x"],gchat:["\u274C","\u2716\uFE0F"]},question:{slack:"question",gchat:["\u2753","?"]},exclamation:{slack:"exclamation",gchat:"\u2757"},warning:{slack:"warning",gchat:"\u26A0\uFE0F"},stop:{slack:"octagonal_sign",gchat:"\u{1F6D1}"},info:{slack:"information_source",gchat:"\u2139\uFE0F"},100:{slack:"100",gchat:"\u{1F4AF}"},fire:{slack:"fire",gchat:"\u{1F525}"},star:{slack:"star",gchat:"\u2B50"},sparkles:{slack:"sparkles",gchat:"\u2728"},lightning:{slack:"zap",gchat:"\u26A1"},boom:{slack:"boom",gchat:"\u{1F4A5}"},eyes:{slack:"eyes",gchat:"\u{1F440}"},green_circle:{slack:"large_green_circle",gchat:"\u{1F7E2}"},yellow_circle:{slack:"large_yellow_circle",gchat:"\u{1F7E1}"},red_circle:{slack:"red_circle",gchat:"\u{1F534}"},blue_circle:{slack:"large_blue_circle",gchat:"\u{1F535}"},white_circle:{slack:"white_circle",gchat:"\u26AA"},black_circle:{slack:"black_circle",gchat:"\u26AB"},rocket:{slack:"rocket",gchat:"\u{1F680}"},party:{slack:["tada","partying_face"],gchat:["\u{1F389}","\u{1F973}"]},confetti:{slack:"confetti_ball",gchat:"\u{1F38A}"},balloon:{slack:"balloon",gchat:"\u{1F388}"},gift:{slack:"gift",gchat:"\u{1F381}"},trophy:{slack:"trophy",gchat:"\u{1F3C6}"},medal:{slack:"first_place_medal",gchat:"\u{1F947}"},lightbulb:{slack:"bulb",gchat:"\u{1F4A1}"},gear:{slack:"gear",gchat:"\u2699\uFE0F"},wrench:{slack:"wrench",gchat:"\u{1F527}"},hammer:{slack:"hammer",gchat:"\u{1F528}"},bug:{slack:"bug",gchat:"\u{1F41B}"},link:{slack:"link",gchat:"\u{1F517}"},lock:{slack:"lock",gchat:"\u{1F512}"},unlock:{slack:"unlock",gchat:"\u{1F513}"},key:{slack:"key",gchat:"\u{1F511}"},pin:{slack:"pushpin",gchat:"\u{1F4CC}"},memo:{slack:"memo",gchat:"\u{1F4DD}"},clipboard:{slack:"clipboard",gchat:"\u{1F4CB}"},calendar:{slack:"calendar",gchat:"\u{1F4C5}"},clock:{slack:"clock1",gchat:"\u{1F550}"},hourglass:{slack:"hourglass",gchat:"\u23F3"},bell:{slack:"bell",gchat:"\u{1F514}"},megaphone:{slack:"mega",gchat:"\u{1F4E2}"},speech_bubble:{slack:"speech_balloon",gchat:"\u{1F4AC}"},email:{slack:"email",gchat:"\u{1F4E7}"},inbox:{slack:"inbox_tray",gchat:"\u{1F4E5}"},outbox:{slack:"outbox_tray",gchat:"\u{1F4E4}"},package:{slack:"package",gchat:"\u{1F4E6}"},folder:{slack:"file_folder",gchat:"\u{1F4C1}"},file:{slack:"page_facing_up",gchat:"\u{1F4C4}"},chart_up:{slack:"chart_with_upwards_trend",gchat:"\u{1F4C8}"},chart_down:{slack:"chart_with_downwards_trend",gchat:"\u{1F4C9}"},coffee:{slack:"coffee",gchat:"\u2615"},pizza:{slack:"pizza",gchat:"\u{1F355}"},beer:{slack:"beer",gchat:"\u{1F37A}"},arrow_up:{slack:"arrow_up",gchat:"\u2B06\uFE0F"},arrow_down:{slack:"arrow_down",gchat:"\u2B07\uFE0F"},arrow_left:{slack:"arrow_left",gchat:"\u2B05\uFE0F"},arrow_right:{slack:"arrow_right",gchat:"\u27A1\uFE0F"},refresh:{slack:"arrows_counterclockwise",gchat:"\u{1F504}"},sun:{slack:"sunny",gchat:"\u2600\uFE0F"},cloud:{slack:"cloud",gchat:"\u2601\uFE0F"},rain:{slack:"rain_cloud",gchat:"\u{1F327}\uFE0F"},snow:{slack:"snowflake",gchat:"\u2744\uFE0F"},rainbow:{slack:"rainbow",gchat:"\u{1F308}"}},jT=class{constructor(e){ke(this,"emojiMap");ke(this,"slackToNormalized");ke(this,"gchatToNormalized");this.emojiMap={...qT,...e},this.slackToNormalized=new Map,this.gchatToNormalized=new Map,this.buildReverseMaps()}buildReverseMaps(){for(let[e,n]of Object.entries(this.emojiMap)){let t=Array.isArray(n.slack)?n.slack:[n.slack];for(let i of t)this.slackToNormalized.set(i.toLowerCase(),e);let r=Array.isArray(n.gchat)?n.gchat:[n.gchat];for(let i of r)this.gchatToNormalized.set(i,e)}}fromSlack(e){var r;let n=e.replace(/^:|:$/g,"").toLowerCase(),t=(r=this.slackToNormalized.get(n))!=null?r:e;return sr(t)}fromGChat(e){var t;let n=(t=this.gchatToNormalized.get(e))!=null?t:e;return sr(n)}fromTeams(e){var r;let t=(r={like:"thumbs_up",heart:"heart",laugh:"laugh",surprised:"surprised",sad:"sad",angry:"angry"}[e])!=null?r:e;return sr(t)}toSlack(e){let n=typeof e=="string"?e:e.name,t=this.emojiMap[n];return t?Array.isArray(t.slack)?t.slack[0]:t.slack:n}toGChat(e){let n=typeof e=="string"?e:e.name,t=this.emojiMap[n];return t?Array.isArray(t.gchat)?t.gchat[0]:t.gchat:n}toDiscord(e){return this.toGChat(e)}matches(e,n){let t=typeof n=="string"?n:n.name,r=this.emojiMap[t];if(!r)return e===t;let i=Array.isArray(r.slack)?r.slack:[r.slack],o=Array.isArray(r.gchat)?r.gchat:[r.gchat],a=e.replace(/^:|:$/g,"").toLowerCase();return i.some(s=>s.toLowerCase()===a)||o.includes(e)}extend(e){Object.assign(this.emojiMap,e),this.buildReverseMaps()}},BT=new jT;function zT(e){let n=["thumbs_up","thumbs_down","clap","wave","pray","muscle","ok_hand","point_up","point_down","point_left","point_right","raised_hands","shrug","facepalm","heart","smile","laugh","thinking","sad","cry","angry","love_eyes","cool","wink","surprised","worried","confused","neutral","sleeping","sick","mind_blown","relieved","grimace","rolling_eyes","hug","zany","check","x","question","exclamation","warning","stop","info","100","fire","star","sparkles","lightning","boom","eyes","green_circle","yellow_circle","red_circle","blue_circle","white_circle","black_circle","rocket","party","confetti","balloon","gift","trophy","medal","lightbulb","gear","wrench","hammer","bug","link","lock","unlock","key","pin","memo","clipboard","calendar","clock","hourglass","bell","megaphone","speech_bubble","email","inbox","outbox","package","folder","file","chart_up","chart_down","coffee","pizza","beer","arrow_up","arrow_down","arrow_left","arrow_right","refresh","sun","cloud","rain","snow","rainbow"],t={custom:r=>sr(r)};for(let r of n)t[r]=sr(r);if(e){for(let r of Object.keys(e))t[r]=sr(r);BT.extend(e)}return t}var $P=zT(),Hr=_o,Wr=Oo,Yr=bl;var Jr=No,Gr=Gh,Kr=Eo,Rf=Io,_f=Po;var Xr=Ao;var Of=Co,Cf=Ro,If=Mo;var Pf=Uo,Mf=Lo,Nf=qo,Qr=Fo,Zr=$o,ei=Do;function Wo(e){return"type"in e&&e.type==="card"}function Lf(e){return typeof e=="object"&&e!==null&&e.type==="tool-approval-card"}function Dl(e,n){return(e==null?void 0:e.workflowId)===n.id}var VT=Symbol.for("chat.jsx.element"),HT=new Set([Hr,Wr,Yr,Jr,Gr,Kr,Pf,Rf,_f,Xr,Of,Mf,Nf,Cf,Qr,Zr,If,ei]);function WT(e){return typeof e=="object"&&e!==null&&e.$$typeof===VT}async function Jo(e){let n=Yo(e);if(n&&typeof n=="object"&&Wo(n))return n;let{isJSX:t,toCardElement:r}=await Promise.resolve().then(()=>(Ff(),Df));return t(n)?r(n):null}function Yo(e){var n;if(Array.isArray(e))return e.map(t=>Yo(t));if(!WT(e))return e;if(typeof e.type=="function"&&!HT.has(e.type)){let t={...(n=e.props)!=null?n:{}};return e.children!==void 0&&(t.children=e.children),Yo(e.type(t))}return{...e,children:Yo(e.children)}}var Uf=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("")},$f=(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 qf=require("cross-fetch"),jf=()=>typeof Response!="undefined"?Response:qf.Response,Bf=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 zf(e){return!!e&&typeof e=="object"&&"error"in e&&"message"in e&&"statusCode"in e}var Go=(e,n)=>{if(!e)throw new Ni;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 zf(o)?new Li(o.statusCode,o.error,o.message):new Kn(o)},delete:async t=>(await fetch(`${n}/v1${t}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:`ApiKey ${e}`}})).json()}};var Gf=require("liquidjs");function Fl(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]=Fl(t[r]||{},i):(Array.isArray(i),t[r]=i)}return t}function Ko(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 Vf(e,n=2,t,r=", "){if(!Array.isArray(e)||e.length===0)return"";let i=t?e.map(s=>typeof s!="object"||!s?"":Ko(s,t)):e;if(i.length===1)return i[0];if(i.length===2)return`${i[0]} and ${i[1]}`;if(n>=i.length){let s=i.slice(0,-1),u=i[i.length-1];return`${s.join(r)} and ${u}`}let o=i.slice(0,n),a=i.length-n;return`${o.join(r)} and ${a} ${a===1?"other":"others"}`}var Hf=jt(require("pluralize"),1);function Wf(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,Hf.default)(n,i),r==="true"?`${i} ${o}`:o}var YT=require("liquidjs"),Yf=jt(require("pluralize"),1),JT=require("zod");var GT="",KT=2,XT="other",QT=", ",ZT=" and ",ex=", and ";function Jf(e,n=GT,t=KT,r=XT,i=QT,o=ZT,a=ex){if(!Array.isArray(e)||e.length===0)return"";let s=n?e.map(g=>typeof g!="object"||!g?"":Ko(g,n)):e,u=s.length;if(u===1)return s[0];if(u===2)return`${s[0]}${o}${s[1]}`;if(t>=u){let g=s.slice(0,u-1),y=s[u-1];return`${g.join(i)}${a}${y}`}let p=s.slice(0,t),d=u-t,h=t===1?o:a;return`${p.join(i)}${h}${d} ${(0,Yf.default)(r,d)}`}function tx(e){return Array.isArray(e)||typeof e=="object"&&e!==null?Kf(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 Kf=(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 Xf(e){let n=new Gf.Liquid({outputEscape:tx,...e});return n.registerFilter("json",(t,r)=>Kf(t,r)),n.registerFilter("digest",Vf),n.registerFilter("toSentence",Jf),n.registerFilter("pluralize",Wf),n}var Hn=jt(require("chalk"),1),et={info:e=>Hn.default.blue(e),warning:e=>Hn.default.yellow(e),error:e=>Hn.default.red(e),success:e=>Hn.default.green(e),underline:e=>Hn.default.underline(e),bold:e=>Hn.default.bold(e)},lt={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 Xo(e){return e||process.env.NOVU_API_URL||"https://api.novu.co"}function Qo(e){return e||process.env.NOVU_SECRET_KEY||process.env.NOVU_API_KEY||""}var Ul=jt(require("sanitize-html"),1),nx=["src","alt","width","height","loading","srcset","sizes","crossorigin","usemap","ismap","class","id","style","title","dir","lang"];function rx(e){return e.toLowerCase().startsWith("on")}function ix(e){return e.replace(/<\/([a-zA-Z][a-zA-Z0-9]*)\s*\/[^>]*>/g,"</$1>")}var ox={allowedTags:Ul.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))rx(r)||(t[r]=i);return{tagName:e,attribs:t}},img:(e,n)=>{let t={};for(let[r,i]of Object.entries(n))nx.includes(r.toLowerCase())&&(t[r]=i);return{tagName:e,attribs:t}}},allowVulnerableTags:!0,parseStyleAttributes:!1,parser:{lowerCaseAttributeNames:!0}},Qf=e=>{if(!e)return e;let n=ix(e),t=/^<!DOCTYPE .*?>/,r=n.match(t),i=(0,Ul.default)(n,ox);return r?r[0]+i:i},Zo=e=>Object.keys(e).reduce((n,t)=>{let r=e[t];return typeof r=="string"?n[t]=Qf(r):Array.isArray(r)?n[t]=r.map(i=>typeof i=="string"?Qf(i):typeof i=="object"?Zo(i):i):typeof r=="object"&&r!==null?n[t]=Zo(r):n[t]=r,n},{});function Zf(e,n=!0,t=console){n&&(t.info(`
148
- ${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} ${lt.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} ${lt.PROVIDER} Discovered provider: '${s.type}'`)})}))}var em=require("jsonrepair");function tm(e){let n=e.trim();return(n.startsWith("{")&&n.endsWith("}")||n.startsWith("[")&&n.endsWith("]"))&&n.length>2}var nm="__novuJsonString";function ax(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&e[nm]===!0}function ti(e){if(typeof e=="string"){if(!tm(e))return e;try{let n=JSON.parse(e);return{[nm]:!0,value:ti(n)}}catch{return e}}if(Array.isArray(e))return e.map(n=>ti(n));if(e&&typeof e=="object"){let n={};for(let[t,r]of Object.entries(e))n[t]=ti(r);return n}return e}function ni(e){if(ax(e))return JSON.stringify(ni(e.value));if(Array.isArray(e))return e.map(n=>ni(n));if(e&&typeof e=="object"){let n={};for(let[t,r]of Object.entries(e))n[t]=ni(r);return n}return e}function sx(e){try{return JSON.parse(e),e}catch{try{return(0,em.jsonrepair)(e)}catch{return e}}}function rm(e){return Object.fromEntries(Object.entries(e).map(([n,t])=>typeof t=="string"?[n,tm(t)?sx(t):t]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[n,rm(t)]:[n,t]))}function im(e){return!(e!=null&&e.data)||typeof e.data!="object"||Array.isArray(e.data)?e:{...e,data:rm(e.data)}}var am=jt(require("ajv"),1),sm=jt(require("ajv-formats"),1);var om=e=>typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e));var ea=class extends xn{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 ta=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 ea(n,Array.from(t))};var na=class{constructor(){this.requiredImports=[];this.ajv=new am.default({useDefaults:!0,removeAdditional:"failing",strict:!1}),(0,sm.default)(this.ajv),this.compiledSchemas=new Map}async canHandle(n){let t=n.type==="object"||!!n.anyOf||!!n.allOf||!!n.oneOf;return t&&await ta(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=om(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 ra=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 ta(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 ia=new ra,oa=new na,ri=async(e,n)=>{if(await ia.canHandle(e))return ia.validate(n,e);if(await oa.canHandle(e))return oa.validate(n,e);throw new Error("Invalid schema")},bt=async e=>{if(await ia.canHandle(e))return ia.transformToJsonSchema(e);if(await oa.canHandle(e))return oa.transformToJsonSchema(e);throw new Error("Invalid schema")};function lm(){return["development",void 0,"dev"].includes(process.env.NODE_ENV)}var lr=class{constructor(n){this.discoveredWorkflows=new Map;this.discoverWorkflowPromises=new Map;this.registeredAgents=new Map;this.version="2.13.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=Xf()}buildOptions(n){let t={apiUrl:Xo(n==null?void 0:n.apiUrl),secretKey:Qo(n==null?void 0:n.secretKey),strictAuthentication:!lm(),verbose:lm(),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();Zf(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.13.1",frameworkVersion:"2024-06-26",discovered:{workflows:t,steps:r}}}getWorkflow(n){let t=this.discoveredWorkflows.get(n);if(t)return t;throw new _r(n)}getStep(n,t){let i=this.getWorkflow(n).steps.find(o=>o.stepId===t);if(i)return i;throw new zi(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 nu(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 ri(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 Ci(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 Ri(r,n,i);case"result":throw new _i(r,n,i);case"controls":throw new Ei(r,n,i);default:throw new Error(`Invalid payload type: '${t}'`)}}throwInvalidEvent(n,t,r){switch(n){case"controls":throw new Ai(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 y=await this.createStepControls(s,n),P=await this.compileControls(y,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),g=await(u?p:d)(n,{...s,providers:s.providers.map(y=>{var ee;let P=(ee=a==null?void 0:a.providers)==null?void 0:ee[y.type];if(!P)throw new Di(y.type);return{...y,resolve:P}}),resolve:o});return this.shouldSanitize({stepType:s.type,options:a})&&(g={...g,outputs:Zo(g.outputs)}),i===n.stepId&&t({...g,options:{skip:!1}}),g.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(`
148
+ ${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} ${lt.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} ${lt.PROVIDER} Discovered provider: '${s.type}'`)})}))}var em=require("jsonrepair");function tm(e){let n=e.trim();return(n.startsWith("{")&&n.endsWith("}")||n.startsWith("[")&&n.endsWith("]"))&&n.length>2}var nm="__novuJsonString";function ax(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&e[nm]===!0}function ti(e){if(typeof e=="string"){if(!tm(e))return e;try{let n=JSON.parse(e);return{[nm]:!0,value:ti(n)}}catch{return e}}if(Array.isArray(e))return e.map(n=>ti(n));if(e&&typeof e=="object"){let n={};for(let[t,r]of Object.entries(e))n[t]=ti(r);return n}return e}function ni(e){if(ax(e))return JSON.stringify(ni(e.value));if(Array.isArray(e))return e.map(n=>ni(n));if(e&&typeof e=="object"){let n={};for(let[t,r]of Object.entries(e))n[t]=ni(r);return n}return e}function sx(e){try{return JSON.parse(e),e}catch{try{return(0,em.jsonrepair)(e)}catch{return e}}}function rm(e){return Object.fromEntries(Object.entries(e).map(([n,t])=>typeof t=="string"?[n,tm(t)?sx(t):t]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[n,rm(t)]:[n,t]))}function im(e){return!(e!=null&&e.data)||typeof e.data!="object"||Array.isArray(e.data)?e:{...e,data:rm(e.data)}}var am=jt(require("ajv"),1),sm=jt(require("ajv-formats"),1);var om=e=>typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e));var ea=class extends xn{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 ta=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 ea(n,Array.from(t))};var na=class{constructor(){this.requiredImports=[];this.ajv=new am.default({useDefaults:!0,removeAdditional:"failing",strict:!1}),(0,sm.default)(this.ajv),this.compiledSchemas=new Map}async canHandle(n){let t=n.type==="object"||!!n.anyOf||!!n.allOf||!!n.oneOf;return t&&await ta(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=om(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 ra=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 ta(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 ia=new ra,oa=new na,ri=async(e,n)=>{if(await ia.canHandle(e))return ia.validate(n,e);if(await oa.canHandle(e))return oa.validate(n,e);throw new Error("Invalid schema")},bt=async e=>{if(await ia.canHandle(e))return ia.transformToJsonSchema(e);if(await oa.canHandle(e))return oa.transformToJsonSchema(e);throw new Error("Invalid schema")};function lm(){return["development",void 0,"dev"].includes(process.env.NODE_ENV)}var lr=class{constructor(n){this.discoveredWorkflows=new Map;this.discoverWorkflowPromises=new Map;this.registeredAgents=new Map;this.version="2.13.2";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=Xf()}buildOptions(n){let t={apiUrl:Xo(n==null?void 0:n.apiUrl),secretKey:Qo(n==null?void 0:n.secretKey),strictAuthentication:!lm(),verbose:lm(),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();Zf(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.13.2",frameworkVersion:"2024-06-26",discovered:{workflows:t,steps:r}}}getWorkflow(n){let t=this.discoveredWorkflows.get(n);if(t)return t;throw new _r(n)}getStep(n,t){let i=this.getWorkflow(n).steps.find(o=>o.stepId===t);if(i)return i;throw new zi(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 nu(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 ri(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 Ci(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 Ri(r,n,i);case"result":throw new _i(r,n,i);case"controls":throw new Ei(r,n,i);default:throw new Error(`Invalid payload type: '${t}'`)}}throwInvalidEvent(n,t,r){switch(n){case"controls":throw new Ai(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 y=await this.createStepControls(s,n),P=await this.compileControls(y,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),g=await(u?p:d)(n,{...s,providers:s.providers.map(y=>{var ee;let P=(ee=a==null?void 0:a.providers)==null?void 0:ee[y.type];if(!P)throw new Di(y.type);return{...y,resolve:P}}),resolve:o});return this.shouldSanitize({stepType:s.type,options:a})&&(g={...g,outputs:Zo(g.outputs)}),i===n.stepId&&t({...g,options:{skip:!1}}),g.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(`
149
149
  ${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},g=()=>p,y;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,g),sms:this.executeStepFactory($,h,g),inApp:this.executeStepFactory($,h,g),digest:this.executeStepFactory($,h,g),delay:this.executeStepFactory($,h,g),push:this.executeStepFactory($,h,g),chat:this.executeStepFactory($,h,g),custom:this.executeStepFactory($,h,g),throttle:this.executeStepFactory($,h,g),tool:this.executeStepFactory($,h,g)}})])}catch(Oe){y=Oe}let P=process.hrtime(a),ee=P[0],Z=P[1],B=ee*1e3+Z/1e6,ue=y?lt.ERROR:lt.SUCCESS,ve={execute:"Executed",preview:"Previewed"}[n.action]||n.action;if(this.log(`${ue} ${ve} workflowId: \`${n.workflowId}\``),this.prettyPrintExecute(n,B,y),y)throw y;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?lt.ERROR:lt.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(`
150
150
  ${et.bold(u(p))}'
151
151
  \u251C ${lt.STEP} stepId: '${n.stepId}'
152
152
  \u251C ${lt.ACTION} action: '${n.action}'
153
153
  \u2514 ${lt.DURATION} duration: '${t.toFixed(2)}ms'
154
- `)}async executeProviders(n,t,r,i){return t.providers.reduce(async(o,a)=>{let s=await o,u=await this.runProvider(n,t,a,r,i);return{...s,[a.type]:u}},Promise.resolve({}))}async runProvider(n,t,r,i,o){let a=n.action==="preview";if(n.stepId!==t.stepId)return a?(this.log(` ${lt.MOCK} Mocked provider: \`${r.type}\``),this.mock(r.outputs.schema)):(this.log(` ${lt.HYDRATED} Hydrated provider: \`${r.type}\``),{});try{return await this.resolveProviderOutput(n,t,r,o,i)}catch(s){if(this.log(` ${lt.ERROR} Failed to execute provider: \`${r.type}\``),a)return this.log(` ${lt.MOCK} Mocked provider: \`${r.type}\``),this.mock(r.outputs.schema);throw new Fi(r.type,n.action,s)}}async resolveProviderOutput(n,t,r,i,o){let a=await r.resolve({controls:i,outputs:o}),s=await this.validate(a,r.outputs.unknownSchema,"step","output",n.workflowId,t.stepId,r.type);return this.log(` ${lt.SUCCESS} Executed provider: \`${r.type}\``),{...s,_passthrough:a._passthrough}}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.normalizeChatCardOutput(t,o),s=await this.validate(a,t.outputs.unknownSchema,"step","output",n.workflowId,t.stepId),u=await this.executeProviders(n,t,s,i);return this.log(` ${lt.SUCCESS} Executed stepId: \`${t.stepId}\``),{outputs:s,providers:u}}catch(r){throw this.log(` ${lt.ERROR} Failed to execute stepId: \`${t.stepId}\``),Mn(r)?r:new Rr(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(` ${lt.HYDRATED} Hydrated stepId: \`${t.stepId}\``),{outputs:i,providers:await this.executeProviders(n,t,i,{})}}else throw new vi(n.workflowId,t.stepId)}catch(r){throw this.log(` ${lt.ERROR} Failed to hydrate stepId: \`${t.stepId}\``),r}}async normalizeChatCardOutput(n,t){if(n.type!=="chat"||(t==null?void 0:t.card)==null)return t;let r=await Jo(t.card);return r?{...t,card:r}:t}async compileControls(n,t){var r;try{let i=ti(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:cx(t.state),env:(r=t.env)!=null?r:{}},p=await this.templateEngine.render(a,u),d=this.postprocessTranslationMarkers(p),h=(0,cm.jsonrepair)(d),g=JSON.parse(h),y=ni(g);return im(y)}catch(i){throw new Oi(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(` ${lt.ERROR} Failed to preview stepId: \`${t.stepId}\``),Mn(r)?r:new Rr(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:Fl(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.normalizeChatCardOutput(n,o),s=await this.validate(a,n.outputs.unknownSchema,"step","output",t.workflowId,n.stepId);return this.log(` ${lt.MOCK} Mocked stepId: \`${n.stepId}\``),{outputs:s,providers:await this.executeProviders(t,n,s,i)}}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 _r(n);return r}};function cx(e){let n={};for(let t of e)n[t.stepId]=t.outputs;return n}var ux={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 aa(e){return typeof e=="string"&&e.trim()?e:!e||typeof e!="object"?null:aa(e.message)}function px(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=aa(t.message);if(r)return r;let i=aa(t.error);if(i)return i;let o=t.errors;return Array.isArray(o)?aa(o[0]):null}function dx(e,n){var i;let t=(i=ux[e])!=null?i:e,r=px(n);return r?`Delivery failed: ${t}: ${r}`:`Delivery failed: ${t}`}var bn=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}},Wt=class extends bn{constructor(n,t){let r={statusCode:n,responseBody:t};super(dx(n,t),{delivery:r}),this.name="AgentDeliveryError",this.statusCode=n,this.responseBody=t}};function ii(e){return e instanceof bn?e:e instanceof Error?new bn(e.message,{cause:e}):new bn("Turn failed",{cause:e})}var um=Symbol.for("novu.agent.runtimeContext");var $l=(i=>(i.ON_MESSAGE="onMessage",i.ON_ACTION="onAction",i.ON_RESOLVE="onResolve",i.ON_REACTION="onReaction",i))($l||{}),cr=class{constructor(){this.__novuPendingApproval=!0}};function pm(e){return typeof e=="object"&&e!==null&&"suppress"in e&&e.suppress===!0}var dm=1;function hx(e){return new Promise(n=>{setTimeout(n,e)})}function fx(e){return e>=500||e===408||e===429}var sa=class{constructor(n){this.sequence=0;this.buffer=[];this.chain=Promise.resolve();var t,r;this.runId=`run_${crypto.randomUUID()}`,this.eventsUrl=n.eventsUrl,this.secretKey=n.secretKey,this.conversationId=n.conversationId,this.agentId=n.agentId,this.turnId=n.turnId,this.fetchFn=(t=n.fetchFn)!=null?t:fetch,this.maxRetries=(r=n.maxRetries)!=null?r:3}enqueue(n){this.sequence+=1,this.buffer.push({version:dm,conversationId:this.conversationId,agentId:this.agentId,runId:this.runId,turnId:this.turnId,sequence:this.sequence,timestamp:new Date().toISOString(),event:n})}flush(){if(this.buffer.length===0)return this.chain;let n=this.buffer;return this.buffer=[],this.chain=this.chain.then(()=>this.postBatchWithRetry(n)),this.chain}async emit(n){this.enqueue(n),await this.flush()}async postBatchWithRetry(n){let t;for(let r=1;r<=this.maxRetries;r+=1)try{await this.postBatch(n);return}catch(i){if(t=i,!mx(i))throw i;r<this.maxRetries&&await hx(250*r)}throw t}async postBatch(n){let t;try{t=await this.fetchFn(this.eventsUrl,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`ApiKey ${this.secretKey}`},body:JSON.stringify({events:n})})}catch(i){throw gx(i)}let r=await t.text().catch(()=>"");if(!t.ok)throw new Wt(t.status,r)}};function mx(e){return!(e instanceof Wt)||e.statusCode===0?!0:fx(e.statusCode)}function gx(e){if(e instanceof Wt)return e;let n=e instanceof Error?e.message:"Network request failed";return new Wt(0,n)}function hm(e){let n=typeof e=="string"?[e]:e,t=[],r=new Set;for(let i of n){if(typeof i!="string")throw new Error("`to` must be a subscriberId string or an array of subscriberIds");let o=i.trim();!o||r.has(o)||(r.add(o),t.push(o))}if(t.length===0)throw new Error("`to` must include at least one subscriberId");if(t.length>50)throw new Error("`to` supports at most 50 subscriberIds");return t}var fm="tool-approval";function yx(e){return e==="approve"||e==="deny"}function ql(e,n){return`${fm}:${e}:${n}`}function mm(e){let[n,t,...r]=(e!=null?e:"").split(":"),i=r.join(":");return n!==fm||!yx(t)||!i?null:{approved:t==="approve",approvalId:i}}async function gm(e,n,t,r){var p,d;let i=r!=null?r:n.id,o={approve:ql("approve",i),deny:ql("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),Lf(s)){await e.replyApprovalCard(s);return}await e.reply(s)}var bx=5*1024*1024,wx=5*1024*1024,ym=32768,Sx=/^[A-Za-z0-9+/]*={0,2}$/;function si(e,n){return e.filename?`"${e.filename}"`:`at index ${n}`}function Tm(){return globalThis.Buffer}function Tx(e){var n,t,r;return(r=(t=(n=Tm())==null?void 0:n.isBuffer)==null?void 0:t.call(n,e))!=null?r:!1}function xx(e){return typeof Blob!="undefined"&&e instanceof Blob}function jl(e){let n=Tm();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+=ym){let i=e.subarray(r,r+ym);t+=String.fromCharCode(...i)}return btoa(t)}function xm(e){let n=e.replace(/\s/g,""),t=n.length%4;if(!n||t===1||!Sx.test(n))return null;let r=n.endsWith("==")?2:n.endsWith("=")?1:0;return Math.floor(n.length*3/4)-r}function oi(e,n,t){if(e>bx)throw new Error(`Invalid file ${si(n,t)}: inline data must be 5 MB or smaller. Use a publicly-accessible URL for larger files.`)}async function kx(e,n,t){if(typeof e=="string"){let r=xm(e);if(r===null)throw new Error(`Invalid file ${si(n,t)}: data must be a base64-encoded string.`);return oi(r,n,t),e}if(Tx(e))return oi(e.byteLength,n,t),e.toString("base64");if(e instanceof Uint8Array)return oi(e.byteLength,n,t),jl(e);if(e instanceof ArrayBuffer)return oi(e.byteLength,n,t),jl(new Uint8Array(e));if(xx(e))return oi(e.size,n,t),jl(new Uint8Array(await e.arrayBuffer()));throw new Error(`Invalid file ${si(n,t)}: data must be a base64 string, Buffer, Uint8Array, ArrayBuffer, or Blob.`)}async function vx(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 ${si(i,r)}: provide exactly one of data or url.`);if(s){let p=await kx(o,i,r),d=xm(p);if(t+=d!=null?d:0,t>wx)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 ${si(i,r)}: url must be a string.`);n.push(i)}return n}async function km(e,n){let t=await vx(n);if(typeof e=="string")return t?{markdown:e,files:t}:{markdown:e};let r=await Jo(e);if(r)return t?{card:r,files:t}:{card:r};throw new Error("Invalid message content \u2014 expected string or CardElement")}function vm(e){return`${e}_${crypto.randomUUID()}`}function bm(e){if(e.markdown!==void 0)return{markdown:e.markdown};if(e.card!==void 0)return{card:e.card};throw new Error("Invalid reply content \u2014 expected markdown or card")}function wm(e){if(e!=null&&e.length)return e.map((n,t)=>({fileId:n.filename||`file_${t}`,name:n.filename,mediaType:n.mimeType,...n.data!==void 0?{data:typeof n.data=="string"?n.data:void 0}:{},...n.url!==void 0?{url:n.url}:{}}))}function Bl(e,n){n.toolApprovalRequest&&(e.toolApprovalRequest=n.toolApprovalRequest),n.signals.length&&(e.signals=n.signals),n.toolResults.length&&(e.toolResults=n.toolResults),n.addReactions.length&&(e.addReactions=n.addReactions),n.deleteMessages.length&&(e.deleteMessages=n.deleteMessages),n.resolve&&(e.resolve=n.resolve)}function zl(e,n){var r;let t=[];if(e.toolApprovalRequest){let i=e.toolApprovalRequest;t.push({type:"tool-approval-request",approvalId:i.approvalId,toolUseId:i.toolCallId,toolName:i.name,input:i.input,...n!=null&&n.deliverApprovalCard?{deliverCard:!0}:{}})}for(let i of e.toolResults)t.push({type:"tool-use-result",toolUseId:i.toolCallId,content:[{type:"text",text:String((r=i.preview)!=null?r:"")},{type:"json",value:i.output}]});for(let i of e.signals)t.push({type:"signal",signal:i});for(let i of e.addReactions)t.push({type:"channel.reaction",messageId:i.messageId,emoji:i.emojiName,op:"add"});for(let i of e.deleteMessages)t.push({type:"channel.delete",messageId:i.messageId});return e.resolve&&t.push({type:"resolve",summary:e.resolve.summary}),t}var Vl=class{constructor(n,t,r,i){this.replyUrl=n;this.secretKey=t;this.conversationId=r;this.integrationIdentifier=i}async sendReply(n,t){let r=this._baseBody();return r.reply=n,Bl(r,t),this._post(r)}async sendApprovalCard(n,t){let r=this._baseBody();return r.reply={toolApprovalCard:n},Bl(r,t),this._post(r)}async editMessage(n,t){return this._post({...this._baseBody(),edit:{messageId:n,content:t}})}async deleteMessage(n){await this._post({...this._baseBody(),deleteMessages:[{messageId:n}]})}async setTyping(n){await this._post({...this._baseBody(),typing:n})}async flushSideEffects(n){let t=this._baseBody();Bl(t,n),await this._post(t)}async emitCustom(){}queueRunStart(){}async emitRunFinish(){}async reportTurnError(){await this._post({...this._baseBody(),error:!0})}_baseBody(){return{conversationId:this.conversationId,integrationIdentifier:this.integrationIdentifier}}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 Wt(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}},Hl=class{constructor(n){this.outbox=n}async sendReply(n,t){let r=vm("msg"),i=zl(t);return i.push({type:"message",role:"assistant",messageId:r,content:bm(n),files:wm(n.files)}),await this._emitAndFlush(i),{messageId:r,platformThreadId:""}}async sendApprovalCard(n,t){return await this._emitAndFlush(zl(t,{deliverApprovalCard:!0})),"unaddressable"}async editMessage(n,t){return await this.outbox.emit({type:"channel.edit",messageId:n,content:bm(t),files:wm(t.files)}),{messageId:n,platformThreadId:""}}async deleteMessage(n){await this.outbox.emit({type:"channel.delete",messageId:n})}async setTyping(n){if(n==="stop"){await this.outbox.emit({type:"channel.typing",state:"off"});return}let t=typeof n=="object"&&"status"in n?n.status:void 0;await this.outbox.emit({type:"channel.typing",state:"on",status:t})}async flushSideEffects(n){await this._emitAndFlush(zl(n))}async emitCustom(n,t){await this.outbox.emit({type:"custom",name:n,data:t})}queueRunStart(){this.outbox.enqueue({type:"run-start"})}async emitRunFinish(n){await this.outbox.emit({type:"run-finish",outcome:n})}async reportTurnError(n){await this.outbox.emit({type:"run-error",message:n!=null?n:"agent handler failed"})}async _emitAndFlush(n){if(n.length!==0){for(let t of n)this.outbox.enqueue(t);await this.outbox.flush()}}},ai=class{constructor(n,t,r){this.transport=r;this.editedByHandler=!1;this.messageId=n,this.platformThreadId=t}async edit(n,t){this.editedByHandler=!0;let r=await km(n,t==null?void 0:t.files),i=await this.transport.editMessage(this.messageId,r);if(!i)throw new Error("Agent edit did not return a message handle");return this.messageId=i.messageId,this.platformThreadId=i.platformThreadId,this}async delete(){await this.transport.deleteMessage(this.messageId)}},Wl=class{constructor(){this.messageId="";this.platformThreadId=""}async edit(){return this}async delete(){}},Sm;Sm=um;var la=class{constructor(n,t,r){this[Sm]=!0;this._signals=[];this._toolResults=[];this._pendingToolApprovalRequest=null;this._pendingReactions=[];this._pendingDeletes=[];this._resolveSignal=null;var s,u,p,d,h;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.context=(u=n.context)!=null?u:null,this.notification=(p=n.notification)!=null?p:null,this.history=n.history,this.platform=n.platform,this.platformContext=n.platformContext,this.humanResponse=(d=n.humanResponse)!=null?d:null,this._toolApprovalConfig=r,this._transport=n.eventsUrl?new Hl(new sa({eventsUrl:n.eventsUrl,secretKey:t,conversationId:n.conversationId,agentId:n.agentId,turnId:n.deliveryId})):new Vl(n.replyUrl,t,n.conversationId,n.integrationIdentifier),this._metadataState={...(h=n.conversation.metadata)!=null?h:{}};let i=this;this.metadata={get(g){return i._metadataState[g]},set(g,y){i._metadataState[g]=y,i._signals.push({type:"metadata",action:"set",key:g,value:y})},delete(g){delete i._metadataState[g],i._signals.push({type:"metadata",action:"delete",key:g})},clear(){i._metadataState={},i._signals.push({type:"metadata",action:"clear"})},get current(){return{...i._metadataState}}};let o=g=>this._transport.setTyping(g),a=(g=>o(g===void 0?{}:{status:g}));a.stop=()=>o("stop"),this.typing=a,this.toolApproval={request:async g=>(await gm(this,g,this._toolApprovalConfig),new cr)}}asMessageContext(){return this}async reply(n,t){let r=await km(n,t==null?void 0:t.files),i=this._drainSideEffectsSnapshot(),o=await this._transport.sendReply(r,i);if(!o)throw new Error("Agent reply did not return a message handle");return new ai(o.messageId,o.platformThreadId,this._transport)}async replyApprovalCard(n){let t=this._drainSideEffectsSnapshot(),r=await this._transport.sendApprovalCard(n,t);if(r==="unaddressable")return new Wl;if(!r)throw new Error("Agent approval card reply did not return a message handle");return new ai(r.messageId,r.platformThreadId,this._transport)}createReplyHandle(n){return new ai(n,"",this._transport)}async emit(n){await this._transport.emitCustom(n.name,n.data)}resolve(n){this._resolveSignal={summary:n}}trigger(n,t){this._signals.push({...t,type:"trigger",workflowId:n})}ask(n,t){return this.queueHumanSignal("ask",n,t)}approve(n,t){return this.queueHumanSignal("approve",n,t)}choose(n,t,r){if(t.length<2||t.length>10)throw new Error("ctx.choose requires between 2 and 10 options");if(t.some(i=>typeof i!="string"||i.trim().length===0))throw new Error("ctx.choose options must be non-empty strings");return this.queueHumanSignal("choose",n,r,t)}tell(n,t){return this.queueHumanSignal("tell",n,t)}queueHumanSignal(n,t,r,i){let o=vm("hr"),a=(r==null?void 0:r.to)!==void 0?hm(r.to):void 0;return this._signals.push({type:"human",kind:n,prompt:t,requestId:o,...i?{options:i}:{},...r!=null&&r.from?{from:r.from}:{},...r&&"ttlSeconds"in r&&r.ttlSeconds!==void 0?{ttlSeconds:r.ttlSeconds}:{},...a!==void 0?{to:a}:{}}),o}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})}queueRunStart(){this._transport.queueRunStart()}async emitRunFinish(n){try{await this._transport.emitRunFinish(n.outcome)}catch(t){console.error("[agent] Failed to emit run finish:",t)}}async reportTurnError(n){try{await this._transport.reportTurnError(n)}catch(t){console.error("[agent] Failed to report turn error:",t)}}async flush(){if(!this._hasPendingSideEffects())return;let n=this._drainSideEffectsSnapshot();await this._transport.flushSideEffects(n)}_hasPendingSideEffects(){return!!(this._pendingToolApprovalRequest||this._signals.length||this._toolResults.length||this._resolveSignal||this._pendingReactions.length||this._pendingDeletes.length)}_drainSideEffectsSnapshot(){let n={toolApprovalRequest:this._pendingToolApprovalRequest,signals:this._signals,toolResults:this._toolResults,addReactions:this._pendingReactions,deleteMessages:this._pendingDeletes,resolve:this._resolveSignal};return this._pendingToolApprovalRequest=null,this._signals=[],this._toolResults=[],this._pendingReactions=[],this._pendingDeletes=[],this._resolveSignal=null,n}};function Ax(e){return!!(typeof e=="string"||typeof e=="object"&&e!==null&&Wo(e)||typeof e=="object"&&e!==null&&("markdown"in e||"card"in e||"files"in e))}function Ex(e,n){return e}function Rx(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 Am(e){var o;let n=new la(e.bridge,e.secretKey,e.agent.handlers.toolApproval),{agent:t,event:r,logger:i}=e;try{n.queueRunStart(),await _x(t,r,n),await n.flush(),await n.emitRunFinish({outcome:"completed"})}catch(a){let s=ii(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,Ex(n,r));pm(p)?u=!0:Ax(p)&&(await n.reply(p),u=!0)}catch(p){i==null||i.error(`[agent:${t.id}] onError failed:`,p)}u?await n.emitRunFinish({outcome:"completed"}):await n.reportTurnError(s.message)}finally{try{await n.typing.stop(),await n.flush()}catch{}}}async function _x(e,n,t){var i,o;let r=async a=>{a instanceof cr||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=mm((i=t.action)==null?void 0:i.id);if(a&&e.handlers.onToolApproval){let{approved:s,approvalId:u}=a,p=Rx(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:""),g={toolCall:d,approved:s,approvalMessage:h};e.userOnToolApproval===!1&&(await t.typing(),t.action.sourceMessageId&&await h.delete());let y=await e.handlers.onToolApproval(g,t);await r(y);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 Nn(n,$l)}}function Em(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 ur=class{constructor(n){this.handler=n.handler,this.client=n.client?n.client:new lr,this.workflows=n.workflows||[],this.agents=n.agents||[],this.http=Go(this.client.secretKey,this.client.apiUrl),this.frameworkName=n.frameworkName,this.hmacEnabled=this.client.strictAuthentication,this.waitUntil=n.waitUntil,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.13.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}){var h;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 g=this.getPostActionMap(d,o,a,i,s,u,(h=this.waitUntil)!=null?h:n.waitUntil),y=this.getGetActionMap(o,a);if(r==="POST")return await this.handlePostAction(i,g);if(r==="GET")return await this.handleGetAction(i,y);if(r==="OPTIONS")return this.createResponse(200,{})}catch(g){return this.handleError(g)}return this.createError(new Mi(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=Am({agent:u,event:a,bridge:n,secretKey:this.client.secretKey,logger:this.client.logger});return s?s(p):this.warnOnUnprotectedServerlessRuntime(o),this.createResponse(200,{status:"ack"})}}}warnOnUnprotectedServerlessRuntime(n){let t;try{process.env.AWS_LAMBDA_FUNCTION_NAME?t="AWS Lambda":process.env.VERCEL&&(t="Vercel")}catch{}t&&this.client.logger.warn(`[agent:${n}] Agent event acknowledged without a \`waitUntil\` primitive while running on ${t}. The runtime may freeze once the response is sent, silently dropping the rest of the agent turn. Pass \`waitUntil\` to \`serve()\` (e.g. \`serve({ agents, waitUntil })\`) to extend the invocation lifetime.`)}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},...n.agentId!==void 0&&{agentId:n.agentId}},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 Nn(n,kr)}async handleGetAction(n,t){if(Object.values(Si).includes(n)){let r=t[n];return r()}else throw new Nn(n,Si)}handleError(n){if(Mn(n))return n.statusCode>=500&&this.client.logger.error(n),this.createError(n);if(Jc(n))return this.createError(n);{let t=new Kn(n);return this.client.logger.error(t),this.createError(t)}}async validateHmac(n,t){if(!this.hmacEnabled)return;if(!t)throw new $i;if(!this.client.secretKey)throw new Bi;let r=Em(t);if(!r.v1||r.t===void 0)throw new qi;let i=Date.now();if(r.t<i-3e5||r.t>i+3e5)throw new ji;let o=await Uf(this.client.secretKey,`${r.t}.${JSON.stringify(n)}`);if(!$f(o,r.v1))throw new Ui}};function Yl(e,n){if(!e)throw new Error("agent() requires a non-empty agentId");if(!(n!=null&&n.onMessage))throw new Error(`agent('${e}') requires an onMessage handler`);return{id:e,handlers:n,userOnToolApproval:typeof n.onToolApproval=="function"}}var oe={output:{type:"object",properties:{},required:[],additionalProperties:!0}};var Ox={type:"object",properties:{webhookUrl:{type:"string",format:"uri"},text:{type:"string"},blocks:{type:"array",items:{type:"object",properties:{type:{type:"string"}},required:["type"],additionalProperties:!0}}},additionalProperties:!0},_m={output:Ox};var Om={"chat-webhook":oe,discord:oe,getstream:oe,"grafana-on-call":oe,line:oe,mattermost:oe,msteams:oe,"novu-slack":oe,"novu-web-chat":oe,"rocket-chat":oe,ryver:oe,sendblue:oe,slack:_m,"webex-messaging":oe,"whatsapp-business":oe,zulip:oe,telegram:oe};var Cx={type:"object",properties:{to:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}],description:'Email address of the recipient(s). Example: "Bob bob@host.com". You can use commas to separate multiple recipients (e.g.: "test@example.com,test@example.com" or ["test@example.com", "test@example.com"]).'},from:{type:"string"},subject:{type:"string",description:"Subject of the message."},text:{type:"string",description:"Text version of the message."},html:{type:"string",description:"HTML version of the message."},message:{type:"string",description:"MIME string of the message. Make sure to use multipart/form-data to send this as a file upload."},cc:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}],description:"Same as To but for carbon copy"},bcc:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}],description:"Same as To but for blind carbon copy"},ampHtml:{type:"string"},tVersion:{type:"string"},tText:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}]},oTag:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}],description:"Tag string. See Tagging for more information."},oDkim:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}],description:"Enables/disabled DKIM signatures on per-message basis. Pass yes or no"},oDeliverytime:{type:"string",description:"Desired time of delivery. See Date Format. Note: Messages can be scheduled for a maximum of 3 days in the future."},oDeliverytimeOptimizePeriod:{type:"string"},oTimeZoneLocalize:{type:"string"},oTestmode:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}],description:"Enables sending in test mode. Pass yes if needed. See Sending in Test Mode"},oTracking:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}],description:"Toggles tracking on a per-message basis, see Tracking Messages for details. Pass yes or no."},oTrackingClicks:{anyOf:[{type:"string",enum:["yes","no","htmlonly"]},{type:"boolean"}],description:"Toggles clicks tracking on a per-message basis. Has higher priority than domain-level setting. Pass yes, no or htmlonly."},oTrackingOpens:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}],description:"Toggles opens tracking on a per-message basis. Has higher priority than domain-level setting. Pass yes or no."},oRequireTls:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}]},oSkipVerification:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}]},recipientVariables:{type:"string"}},required:[],additionalProperties:!0},Cm={output:Cx};var Wn={type:"object",properties:{name:{type:"string"},email:{type:"string"}},description:'JSON object, containing 2 properties: Name and Email address of a previously validated and active sender. Including the Name property in the JSON is optional. This property is not mandatory in case you use TemplateID and you specified a From address for the template. Format : { "Email":"value", "Name":"value" }.',required:["Email"],additionalProperties:!0},Ix={type:"object",properties:{contentType:{type:"string"},filename:{type:"string"},base64Content:{type:"string"}},required:["ContentType","Filename","Base64Content"],additionalProperties:!0},Px={type:"object",properties:{filename:{type:"string"},contentType:{type:"string"},contentId:{type:"string"},base64Content:{type:"string"}},required:["ContentType","Filename","Base64Content"],additionalProperties:!0},Mx={type:"object",properties:{from:Wn,sender:Wn,to:{type:"array",items:Wn},cc:{type:"array",items:Wn},bcc:{type:"array",items:Wn},replyTo:Wn,subject:{type:"string"},textPart:{type:"string",description:"Content of the message, sent in Text and/or HTML format. At least one of these content types needs to be specified. When the HTML part is the only part provided, Mailjet will not generate a Text-part from the HTML version. The property can't be set when you use TemplateID"},htmlPart:{type:"string",description:"Content of the message, sent in Text and/or HTML format. At least one of these content types needs to be specified. When the HTML part is the only part provided, Mailjet will not generate a Text-part from the HTML version. The property can't be set when you use TemplateID"},templateId:{type:"number",description:"an ID for a template that is previously created and stored in Mailjet's system. It is mandatory when From and TextPart and/or HtmlPart are not provided. "},templateLanguage:{type:"boolean"},templateErrorReporting:Wn,templateErrorDeliver:{type:"boolean"},attachments:{type:"array",items:Ix},inlineAttachments:{type:"array",items:Px},priority:{type:"number"},customCampaign:{type:"string"},deduplicateCampaign:{type:"boolean"},trackOpens:{type:"string",enum:["account_default","disabled","enabled"]},trackClicks:{type:"string",enum:["account_default","disabled","enabled"]},customId:{type:"string"},eventPayload:{type:"string"},urlTags:{type:"string"},headers:{type:"object",additionalProperties:!0},variables:{type:"object",additionalProperties:!0}},required:[],additionalProperties:!0},Im={output:Mx};var Gt={type:"object",properties:{address:{type:"string"},name:{type:"string"}},additionalProperties:!0},ca={type:"object",properties:{content:{type:"string"},path:{type:"string"}},additionalProperties:!0},Nx={type:"object",properties:{from:{anyOf:[{type:"string"},Gt]},sender:{anyOf:[{type:"string"},Gt]},to:{anyOf:[{type:"string"},Gt,{type:"array",items:Gt}]},cc:{anyOf:[{type:"string"},Gt,{type:"array",items:Gt}]},bcc:{anyOf:[{type:"string"},Gt,{type:"array",items:Gt}]},replyTo:{anyOf:[{type:"string"},Gt,{type:"array",items:Gt}]},inReplyTo:{anyOf:[{type:"string"},Gt]},references:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}]},subject:{type:"string"},text:{anyOf:[{type:"string"},ca]},html:{anyOf:[{type:"string"},ca]},watchHtml:{anyOf:[{type:"string"},ca]},amp:{anyOf:[{type:"string"},{type:"object",properties:{content:{type:"string"},path:{type:"string"},href:{type:"string"},encoding:{type:"string"},contentType:{type:"string"},raw:{anyOf:[{type:"string"},ca]}}}]},icalEvent:{anyOf:[{type:"string"},{type:"object",properties:{content:{type:"string"},path:{type:"string"},method:{type:"string"},filename:{anyOf:[{type:"string"},{type:"boolean"}]},href:{type:"string"},encoding:{type:"string"}}}]},headers:{anyOf:[{type:"object",additionalProperties:!0},{type:"array",items:{type:"object",additionalProperties:!0}}]},list:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}]},attachments:{type:"array",items:{type:"object",properties:{content:{type:"string"},path:{type:"string"}},additionalProperties:!0}}},required:[],additionalProperties:!0},Pm={output:Nx};var Lx={type:"object",properties:{},required:[],additionalProperties:!1},Mm={output:Lx};var Dx={type:"object",properties:{personalizations:{type:"array",description:"An array of messages and their metadata. Each object within personalizations can be thought of as an envelope - it defines who should receive an individual message and how that message should be handled. See our [Personalizations documentation](https://sendgrid.com/docs/for-developers/sending-email/personalizations/) for examples.",uniqueItems:!1,maxItems:1e3,items:{type:"object",properties:{from:{title:"From Email Object",type:"object",properties:{email:{type:"string",format:"email",description:"The 'From' email address used to deliver the message. This address should be a verified sender in your Twilio SendGrid account."},name:{type:"string",description:"A name or title associated with the sending email address."}},required:["email"]},to:{title:"To Email Array",type:"array",items:{type:"object",properties:{email:{type:"string",format:"email",description:"The intended recipient's email address."},name:{type:"string",description:"The intended recipient's name."}},required:["email"]}},cc:{type:"array",description:"An array of recipients who will receive a copy of your email. Each object in this array must contain the recipient's email address. Each object in the array may optionally contain the recipient's name.",maxItems:1e3,items:{title:"CC BCC Email Object",type:"object",properties:{email:{type:"string",format:"email",description:"The intended recipient's email address."},name:{type:"string",description:"The intended recipient's name."}},required:["email"]}},bcc:{type:"array",description:"An array of recipients who will receive a blind carbon copy of your email. Each object in this array must contain the recipient's email address. Each object in the array may optionally contain the recipient's name.",maxItems:1e3,items:{title:"CC BCC Email Object",type:"object",properties:{email:{type:"string",format:"email",description:"The intended recipient's email address."},name:{type:"string",description:"The intended recipient's name."}},required:["email"]}},subject:{type:"string",description:"The subject of your email. See character length requirements according to [RFC 2822](http://stackoverflow.com/questions/1592291/what-is-the-email-subject-length-limit#answer-1592310).",minLength:1},headers:{type:"object",description:"A collection of JSON key/value pairs allowing you to specify handling instructions for your email. You may not overwrite the following headers: `x-sg-id`, `x-sg-eid`, `received`, `dkim-signature`, `Content-Type`, `Content-Transfer-Encoding`, `To`, `From`, `Subject`, `Reply-To`, `CC`, `BCC`"},substitutions:{type:"object",description:'Substitutions allow you to insert data without using Dynamic Transactional Templates. This field should **not** be used in combination with a Dynamic Transactional Template, which can be identified by a `templateId` starting with `d-`. This field is a collection of key/value pairs following the pattern "substitutionTag":"value to substitute". The key/value pairs must be strings. These substitutions will apply to the text and html content of the body of your email, in addition to the `subject` and `reply-to` parameters. The total collective size of your substitutions may not exceed 10,000 bytes per personalization object.',maxProperties:1e4},dynamicTemplateData:{type:"object",description:'Dynamic template data is available using Handlebars syntax in Dynamic Transactional Templates. This field should be used in combination with a Dynamic Transactional Template, which can be identified by a `templateId` starting with `d-`. This field is a collection of key/value pairs following the pattern "variable_name":"value to insert".'},customArgs:{type:"object",description:"Values that are specific to this personalization that will be carried along with the email and its activity data. Substitutions will not be made on custom arguments, so any string that is entered into this parameter will be assumed to be the custom argument that you would like to be used. This field may not exceed 10,000 bytes.",maxProperties:1e4},sendAt:{type:"integer",description:"A unix timestamp allowing you to specify when your email should be delivered. Scheduling delivery more than 72 hours in advance is forbidden."}},required:["to"]}},from:{title:"From Email Object",type:"object",properties:{email:{type:"string",format:"email",description:"The 'From' email address used to deliver the message. This address should be a verified sender in your Twilio SendGrid account."},name:{type:"string",description:"A name or title associated with the sending email address."}},required:["email"]},replyTo:{title:"Reply_to Email Object",type:"object",properties:{email:{type:"string",format:"email",description:"The email address where any replies or bounces will be returned."},name:{type:"string",description:"A name or title associated with the `replyTo` email address."}},required:["email"]},replyToList:{type:"array",description:"An array of recipients who will receive replies and/or bounces. Each object in this array must contain the recipient's email address. Each object in the array may optionally contain the recipient's name. You can either choose to use \u201CreplyTo\u201D field or \u201CreplyToList\u201D but not both.",uniqueItems:!0,maxItems:1e3,items:{type:"object",properties:{email:{type:"string",description:"The email address where any replies or bounces will be returned.",format:"email"},name:{type:"string",description:"A name or title associated with the `replyToList` email address."}},required:["email"]}},subject:{type:"string",description:"The global or 'message level' subject of your email. This may be overridden by subject lines set in personalizations.",minLength:1},content:{type:"array",description:"An array where you can specify the content of your email. You can include multiple [MIME types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of content, but you must specify at least one MIME type. To include more than one MIME type, add another object to the array containing the `type` and `value` parameters.",items:{type:"object",properties:{type:{type:"string",description:"The MIME type of the content you are including in your email (e.g., `\u201Ctext/plain\u201D` or `\u201Ctext/html\u201D`).",minLength:1},value:{type:"string",description:"The actual content of the specified MIME type that you are including in your email.",minLength:1}},required:["type","value"]}},attachments:{type:"array",description:"An array of objects where you can specify any attachments you want to include.",items:{type:"object",properties:{content:{type:"string",description:"The Base64 encoded content of the attachment.",minLength:1},type:{type:"string",description:"The MIME type of the content you are attaching (e.g., `\u201Ctext/plain\u201D` or `\u201Ctext/html\u201D`).",minLength:1},filename:{type:"string",description:"The attachment's filename."},disposition:{type:"string",default:"attachment",description:"The attachment's content-disposition, specifying how you would like the attachment to be displayed. For example, `\u201Cinline\u201D` results in the attached file are displayed automatically within the message while `\u201Cattachment\u201D` results in the attached file require some action to be taken before it is displayed, such as opening or downloading the file.",enum:["inline","attachment"]},contentId:{type:"string",description:"The attachment's content ID. This is used when the disposition is set to `\u201Cinline\u201D` and the attachment is an image, allowing the file to be displayed within the body of your email."}},required:["content","filename"]}},templateId:{type:"string",description:"An email template ID. A template that contains a subject and content \u2014 either text or html \u2014 will override any subject and content values specified at the personalizations or message level."},headers:{description:"An object containing key/value pairs of header names and the value to substitute for them. The key/value pairs must be strings. You must ensure these are properly encoded if they contain unicode characters. These headers cannot be one of the reserved headers.",type:"object"},categories:{type:"array",description:"An array of category names for this message. Each category name may not exceed 255 characters. ",uniqueItems:!0,maxItems:10,items:{type:"string",maxLength:255}},customArgs:{description:"Values that are specific to the entire send that will be carried along with the email and its activity data. Key/value pairs must be strings. Substitutions will not be made on custom arguments, so any string that is entered into this parameter will be assumed to be the custom argument that you would like to be used. This parameter is overridden by `customArgs` set at the personalizations level. Total `customArgs` size may not exceed 10,000 bytes.",type:"string"},sendAt:{type:"integer",description:"A unix timestamp allowing you to specify when you want your email to be delivered. This may be overridden by the `sendAt` parameter set at the personalizations level. Delivery cannot be scheduled more than 72 hours in advance. If you have the flexibility, it's better to schedule mail for off-peak times. Most emails are scheduled and sent at the top of the hour or half hour. Scheduling email to avoid peak times \u2014 for example, scheduling at 10:53 \u2014 can result in lower deferral rates due to the reduced traffic during off-peak times."},batchId:{type:"string",description:"An ID representing a batch of emails to be sent at the same time. Including a `batchId` in your request allows you include this email in that batch. It also enables you to cancel or pause the delivery of that batch. For more information, see the [Cancel Scheduled Sends API](https://sendgrid.com/docs/api-reference/)."},asm:{type:"object",description:"An object allowing you to specify how to handle unsubscribes.",properties:{groupId:{type:"integer",description:"The unsubscribe group to associate with this email."},groupsToDisplay:{type:"array",description:"An array containing the unsubscribe groups that you would like to be displayed on the unsubscribe preferences page.",maxItems:25,items:{type:"integer"}}},required:["groupId"]},ipPoolName:{type:"string",description:"The IP Pool that you would like to send this email from.",minLength:2,maxLength:64},mailSettings:{type:"object",description:"A collection of different mail settings that you can use to specify how you would like this email to be handled.",properties:{bypassListManagement:{type:"object",description:"Allows you to bypass all unsubscribe groups and suppressions to ensure that the email is delivered to every single recipient. This should only be used in emergencies when it is absolutely necessary that every recipient receives your email. This filter cannot be combined with any other bypass filters. See our [documentation](https://sendgrid.com/docs/ui/sending-email/index-suppressions/#bypass-suppressions) for more about bypass filters.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."}}},bypassSpamManagement:{type:"object",description:"Allows you to bypass the spam report list to ensure that the email is delivered to recipients. Bounce and unsubscribe lists will still be checked; addresses on these other lists will not receive the message. This filter cannot be combined with the `bypassListManagement` filter. See our [documentation](https://sendgrid.com/docs/ui/sending-email/index-suppressions/#bypass-suppressions) for more about bypass filters.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."}}},bypassBounceManagement:{type:"object",description:"Allows you to bypass the bounce list to ensure that the email is delivered to recipients. Spam report and unsubscribe lists will still be checked; addresses on these other lists will not receive the message. This filter cannot be combined with the `bypassListManagement` filter. See our [documentation](https://sendgrid.com/docs/ui/sending-email/index-suppressions/#bypass-suppressions) for more about bypass filters.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."}}},bypassUnsubscribeManagement:{type:"object",description:"Allows you to bypass the global unsubscribe list to ensure that the email is delivered to recipients. Bounce and spam report lists will still be checked; addresses on these other lists will not receive the message. This filter applies only to global unsubscribes and will not bypass group unsubscribes. This filter cannot be combined with the `bypassListManagement` filter. See our [documentation](https://sendgrid.com/docs/ui/sending-email/index-suppressions/#bypass-suppressions) for more about bypass filters.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."}}},footer:{type:"object",description:"The default footer that you would like included on every email.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."},text:{type:"string",description:"The plain text content of your footer."},html:{type:"string",description:"The HTML content of your footer."}}},sandboxMode:{type:"object",description:"Sandbox Mode allows you to send a test email to ensure that your request body is valid and formatted correctly.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."}}}}},trackingSettings:{type:"object",description:"Settings to determine how you would like to track the metrics of how your recipients interact with your email.",properties:{clickTracking:{type:"object",description:"Allows you to track if a recipient clicked a link in your email.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."},enableText:{type:"boolean",description:"Indicates if this setting should be included in the `text/plain` portion of your email."}}},openTracking:{type:"object",description:"Allows you to track if the email was opened by including a single pixel image in the body of the content. When the pixel is loaded, Twilio SendGrid can log that the email was opened.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."},substitutionTag:{type:"string",description:"Allows you to specify a substitution tag that you can insert in the body of your email at a location that you desire. This tag will be replaced by the open tracking pixel."}}},subscriptionTracking:{type:"object",description:"Allows you to insert a subscription management link at the bottom of the text and HTML bodies of your email. If you would like to specify the location of the link within your email, you may use the `substitutionTag`.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."},text:{type:"string",description:"Text to be appended to the email with the subscription tracking link. You may control where the link is by using the tag <% %>"},html:{type:"string",description:"HTML to be appended to the email with the subscription tracking link. You may control where the link is by using the tag <% %>"},substitutionTag:{type:"string",description:"A tag that will be replaced with the unsubscribe URL. for example: `[unsubscribe_url]`. If this parameter is used, it will override both the `text` and `html` parameters. The URL of the link will be placed at the substitution tag\u2019s location with no additional formatting."}}},ganalytics:{type:"object",description:"Allows you to enable tracking provided by Google Analytics.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."},utmSource:{type:"string",description:"Name of the referrer source. (e.g. Google, SomeDomain.com, or Marketing Email)"},utmMedium:{type:"string",description:"Name of the marketing medium. (e.g. Email)"},utmTerm:{type:"string",description:"Used to identify any paid keywords."},utmContent:{type:"string",description:"Used to differentiate your campaign from advertisements."},utmCampaign:{type:"string",description:"The name of the campaign."}}}}}},required:[],additionalProperties:!1},Nm={output:Dx};var Lm={anypost:oe,braze:oe,clickatell:oe,nodemailer:Pm,emailjs:oe,"email-webhook":oe,"infobip-email":oe,mailersend:oe,mailgun:Cm,mailjet:Im,mailtrap:oe,mandrill:oe,netcore:oe,"novu-email":Mm,outlook365:oe,plunk:oe,postmark:oe,resend:oe,sendgrid:Nm,sendinblue:oe,ses:oe,sparkpost:oe};var Fx={type:"object",properties:{},required:[],additionalProperties:!1},Dm={output:Fx};var Fm={novu:Dm};var Um={anyOf:[{type:"string"},{type:"object",additionalProperties:!0,properties:{name:{type:"string"},volume:{type:"number"},critical:{type:"number"}},required:["name","volume","critical"]}]},Ux={type:"object",properties:{topic:{type:"string",description:"The destination topic for the notification."},id:{type:"string",description:"A UUID to identify the notification with APNS. If an id is not supplied, APNS will generate one automatically. If an error occurs the response will contain the id. This property populates the apns-id header."},expiry:{type:"number",description:"A UNIX timestamp when the notification should expire. If the notification cannot be delivered to the device, APNS will retry until it expires. An expiry of 0 indicates that the notification expires immediately, therefore no retries will be attempted."},priority:{type:"number",description:`Provide one of the following values:
154
+ `)}async executeProviders(n,t,r,i){return t.providers.reduce(async(o,a)=>{let s=await o,u=await this.runProvider(n,t,a,r,i);return{...s,[a.type]:u}},Promise.resolve({}))}async runProvider(n,t,r,i,o){let a=n.action==="preview";if(n.stepId!==t.stepId)return a?(this.log(` ${lt.MOCK} Mocked provider: \`${r.type}\``),this.mock(r.outputs.schema)):(this.log(` ${lt.HYDRATED} Hydrated provider: \`${r.type}\``),{});try{return await this.resolveProviderOutput(n,t,r,o,i)}catch(s){if(this.log(` ${lt.ERROR} Failed to execute provider: \`${r.type}\``),a)return this.log(` ${lt.MOCK} Mocked provider: \`${r.type}\``),this.mock(r.outputs.schema);throw new Fi(r.type,n.action,s)}}async resolveProviderOutput(n,t,r,i,o){let a=await r.resolve({controls:i,outputs:o}),s=await this.validate(a,r.outputs.unknownSchema,"step","output",n.workflowId,t.stepId,r.type);return this.log(` ${lt.SUCCESS} Executed provider: \`${r.type}\``),{...s,_passthrough:a._passthrough}}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.normalizeChatCardOutput(t,o),s=await this.validate(a,t.outputs.unknownSchema,"step","output",n.workflowId,t.stepId),u=await this.executeProviders(n,t,s,i);return this.log(` ${lt.SUCCESS} Executed stepId: \`${t.stepId}\``),{outputs:s,providers:u}}catch(r){throw this.log(` ${lt.ERROR} Failed to execute stepId: \`${t.stepId}\``),Mn(r)?r:new Rr(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(` ${lt.HYDRATED} Hydrated stepId: \`${t.stepId}\``),{outputs:i,providers:await this.executeProviders(n,t,i,{})}}else throw new vi(n.workflowId,t.stepId)}catch(r){throw this.log(` ${lt.ERROR} Failed to hydrate stepId: \`${t.stepId}\``),r}}async normalizeChatCardOutput(n,t){if(n.type!=="chat"||(t==null?void 0:t.card)==null)return t;let r=await Jo(t.card);return r?{...t,card:r}:t}async compileControls(n,t){var r;try{let i=ti(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:cx(t.state),env:(r=t.env)!=null?r:{}},p=await this.templateEngine.render(a,u),d=this.postprocessTranslationMarkers(p),h=(0,cm.jsonrepair)(d),g=JSON.parse(h),y=ni(g);return im(y)}catch(i){throw new Oi(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(` ${lt.ERROR} Failed to preview stepId: \`${t.stepId}\``),Mn(r)?r:new Rr(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:Fl(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.normalizeChatCardOutput(n,o),s=await this.validate(a,n.outputs.unknownSchema,"step","output",t.workflowId,n.stepId);return this.log(` ${lt.MOCK} Mocked stepId: \`${n.stepId}\``),{outputs:s,providers:await this.executeProviders(t,n,s,i)}}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 _r(n);return r}};function cx(e){let n={};for(let t of e)n[t.stepId]=t.outputs;return n}var ux={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 aa(e){return typeof e=="string"&&e.trim()?e:!e||typeof e!="object"?null:aa(e.message)}function px(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=aa(t.message);if(r)return r;let i=aa(t.error);if(i)return i;let o=t.errors;return Array.isArray(o)?aa(o[0]):null}function dx(e,n){var i;let t=(i=ux[e])!=null?i:e,r=px(n);return r?`Delivery failed: ${t}: ${r}`:`Delivery failed: ${t}`}var bn=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}},Wt=class extends bn{constructor(n,t){let r={statusCode:n,responseBody:t};super(dx(n,t),{delivery:r}),this.name="AgentDeliveryError",this.statusCode=n,this.responseBody=t}};function ii(e){return e instanceof bn?e:e instanceof Error?new bn(e.message,{cause:e}):new bn("Turn failed",{cause:e})}var um=Symbol.for("novu.agent.runtimeContext");var $l=(i=>(i.ON_MESSAGE="onMessage",i.ON_ACTION="onAction",i.ON_RESOLVE="onResolve",i.ON_REACTION="onReaction",i))($l||{}),cr=class{constructor(){this.__novuPendingApproval=!0}};function pm(e){return typeof e=="object"&&e!==null&&"suppress"in e&&e.suppress===!0}var dm=1;function hx(e){return new Promise(n=>{setTimeout(n,e)})}function fx(e){return e>=500||e===408||e===429}var sa=class{constructor(n){this.sequence=0;this.buffer=[];this.chain=Promise.resolve();var t,r;this.runId=`run_${crypto.randomUUID()}`,this.eventsUrl=n.eventsUrl,this.secretKey=n.secretKey,this.conversationId=n.conversationId,this.agentId=n.agentId,this.turnId=n.turnId,this.fetchFn=(t=n.fetchFn)!=null?t:fetch,this.maxRetries=(r=n.maxRetries)!=null?r:3}enqueue(n){this.sequence+=1,this.buffer.push({version:dm,conversationId:this.conversationId,agentId:this.agentId,runId:this.runId,turnId:this.turnId,sequence:this.sequence,timestamp:new Date().toISOString(),event:n})}flush(){if(this.buffer.length===0)return this.chain;let n=this.buffer;return this.buffer=[],this.chain=this.chain.then(()=>this.postBatchWithRetry(n)),this.chain}async emit(n){this.enqueue(n),await this.flush()}async postBatchWithRetry(n){let t;for(let r=1;r<=this.maxRetries;r+=1)try{await this.postBatch(n);return}catch(i){if(t=i,!mx(i))throw i;r<this.maxRetries&&await hx(250*r)}throw t}async postBatch(n){let t;try{t=await this.fetchFn(this.eventsUrl,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`ApiKey ${this.secretKey}`},body:JSON.stringify({events:n})})}catch(i){throw gx(i)}let r=await t.text().catch(()=>"");if(!t.ok)throw new Wt(t.status,r)}};function mx(e){return!(e instanceof Wt)||e.statusCode===0?!0:fx(e.statusCode)}function gx(e){if(e instanceof Wt)return e;let n=e instanceof Error?e.message:"Network request failed";return new Wt(0,n)}function hm(e){let n=typeof e=="string"?[e]:e,t=[],r=new Set;for(let i of n){if(typeof i!="string")throw new Error("`to` must be a subscriberId string or an array of subscriberIds");let o=i.trim();!o||r.has(o)||(r.add(o),t.push(o))}if(t.length===0)throw new Error("`to` must include at least one subscriberId");if(t.length>50)throw new Error("`to` supports at most 50 subscriberIds");return t}var fm="tool-approval";function yx(e){return e==="approve"||e==="deny"}function ql(e,n){return`${fm}:${e}:${n}`}function mm(e){let[n,t,...r]=(e!=null?e:"").split(":"),i=r.join(":");return n!==fm||!yx(t)||!i?null:{approved:t==="approve",approvalId:i}}async function gm(e,n,t,r){var p,d;let i=r!=null?r:n.id,o={approve:ql("approve",i),deny:ql("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),Lf(s)){await e.replyApprovalCard(s);return}await e.reply(s)}var bx=5*1024*1024,wx=5*1024*1024,ym=32768,Sx=/^[A-Za-z0-9+/]*={0,2}$/;function si(e,n){return e.filename?`"${e.filename}"`:`at index ${n}`}function Tm(){return globalThis.Buffer}function Tx(e){var n,t,r;return(r=(t=(n=Tm())==null?void 0:n.isBuffer)==null?void 0:t.call(n,e))!=null?r:!1}function xx(e){return typeof Blob!="undefined"&&e instanceof Blob}function jl(e){let n=Tm();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+=ym){let i=e.subarray(r,r+ym);t+=String.fromCharCode(...i)}return btoa(t)}function xm(e){let n=e.replace(/\s/g,""),t=n.length%4;if(!n||t===1||!Sx.test(n))return null;let r=n.endsWith("==")?2:n.endsWith("=")?1:0;return Math.floor(n.length*3/4)-r}function oi(e,n,t){if(e>bx)throw new Error(`Invalid file ${si(n,t)}: inline data must be 5 MB or smaller. Use a publicly-accessible URL for larger files.`)}async function kx(e,n,t){if(typeof e=="string"){let r=xm(e);if(r===null)throw new Error(`Invalid file ${si(n,t)}: data must be a base64-encoded string.`);return oi(r,n,t),e}if(Tx(e))return oi(e.byteLength,n,t),e.toString("base64");if(e instanceof Uint8Array)return oi(e.byteLength,n,t),jl(e);if(e instanceof ArrayBuffer)return oi(e.byteLength,n,t),jl(new Uint8Array(e));if(xx(e))return oi(e.size,n,t),jl(new Uint8Array(await e.arrayBuffer()));throw new Error(`Invalid file ${si(n,t)}: data must be a base64 string, Buffer, Uint8Array, ArrayBuffer, or Blob.`)}async function vx(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 ${si(i,r)}: provide exactly one of data or url.`);if(s){let p=await kx(o,i,r),d=xm(p);if(t+=d!=null?d:0,t>wx)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 ${si(i,r)}: url must be a string.`);n.push(i)}return n}async function km(e,n){let t=await vx(n);if(typeof e=="string")return t?{markdown:e,files:t}:{markdown:e};let r=await Jo(e);if(r)return t?{card:r,files:t}:{card:r};throw new Error("Invalid message content \u2014 expected string or CardElement")}function vm(e){return`${e}_${crypto.randomUUID()}`}function bm(e){if(e.markdown!==void 0)return{markdown:e.markdown};if(e.card!==void 0)return{card:e.card};throw new Error("Invalid reply content \u2014 expected markdown or card")}function wm(e){if(e!=null&&e.length)return e.map((n,t)=>({fileId:n.filename||`file_${t}`,name:n.filename,mediaType:n.mimeType,...n.data!==void 0?{data:typeof n.data=="string"?n.data:void 0}:{},...n.url!==void 0?{url:n.url}:{}}))}function Bl(e,n){n.toolApprovalRequest&&(e.toolApprovalRequest=n.toolApprovalRequest),n.signals.length&&(e.signals=n.signals),n.toolResults.length&&(e.toolResults=n.toolResults),n.addReactions.length&&(e.addReactions=n.addReactions),n.deleteMessages.length&&(e.deleteMessages=n.deleteMessages),n.resolve&&(e.resolve=n.resolve)}function zl(e,n){var r;let t=[];if(e.toolApprovalRequest){let i=e.toolApprovalRequest;t.push({type:"tool-approval-request",approvalId:i.approvalId,toolUseId:i.toolCallId,toolName:i.name,input:i.input,...n!=null&&n.deliverApprovalCard?{deliverCard:!0}:{}})}for(let i of e.toolResults)t.push({type:"tool-use-result",toolUseId:i.toolCallId,content:[{type:"text",text:String((r=i.preview)!=null?r:"")},{type:"json",value:i.output}]});for(let i of e.signals)t.push({type:"signal",signal:i});for(let i of e.addReactions)t.push({type:"channel.reaction",messageId:i.messageId,emoji:i.emojiName,op:"add"});for(let i of e.deleteMessages)t.push({type:"channel.delete",messageId:i.messageId});return e.resolve&&t.push({type:"resolve",summary:e.resolve.summary}),t}var Vl=class{constructor(n,t,r,i){this.replyUrl=n;this.secretKey=t;this.conversationId=r;this.integrationIdentifier=i}async sendReply(n,t){let r=this._baseBody();return r.reply=n,Bl(r,t),this._post(r)}async sendApprovalCard(n,t){let r=this._baseBody();return r.reply={toolApprovalCard:n},Bl(r,t),this._post(r)}async editMessage(n,t){return this._post({...this._baseBody(),edit:{messageId:n,content:t}})}async deleteMessage(n){await this._post({...this._baseBody(),deleteMessages:[{messageId:n}]})}async setTyping(n){await this._post({...this._baseBody(),typing:n})}async flushSideEffects(n){let t=this._baseBody();Bl(t,n),await this._post(t)}async emitCustom(){}queueRunStart(){}async emitRunFinish(){}async reportTurnError(){await this._post({...this._baseBody(),error:!0})}_baseBody(){return{conversationId:this.conversationId,integrationIdentifier:this.integrationIdentifier}}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 Wt(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}},Hl=class{constructor(n){this.outbox=n}async sendReply(n,t){let r=vm("msg"),i=zl(t);return i.push({type:"message",role:"assistant",messageId:r,content:bm(n),files:wm(n.files)}),await this._emitAndFlush(i),{messageId:r,platformThreadId:""}}async sendApprovalCard(n,t){return await this._emitAndFlush(zl(t,{deliverApprovalCard:!0})),"unaddressable"}async editMessage(n,t){return await this.outbox.emit({type:"channel.edit",messageId:n,content:bm(t),files:wm(t.files)}),{messageId:n,platformThreadId:""}}async deleteMessage(n){await this.outbox.emit({type:"channel.delete",messageId:n})}async setTyping(n){if(n==="stop"){await this.outbox.emit({type:"channel.typing",state:"off"});return}let t=typeof n=="object"&&"status"in n?n.status:void 0;await this.outbox.emit({type:"channel.typing",state:"on",status:t})}async flushSideEffects(n){await this._emitAndFlush(zl(n))}async emitCustom(n,t){await this.outbox.emit({type:"custom",name:n,data:t})}queueRunStart(){this.outbox.enqueue({type:"run-start"})}async emitRunFinish(n){await this.outbox.emit({type:"run-finish",outcome:n})}async reportTurnError(n){await this.outbox.emit({type:"run-error",message:n!=null?n:"agent handler failed"})}async _emitAndFlush(n){if(n.length!==0){for(let t of n)this.outbox.enqueue(t);await this.outbox.flush()}}},ai=class{constructor(n,t,r){this.transport=r;this.editedByHandler=!1;this.messageId=n,this.platformThreadId=t}async edit(n,t){this.editedByHandler=!0;let r=await km(n,t==null?void 0:t.files),i=await this.transport.editMessage(this.messageId,r);if(!i)throw new Error("Agent edit did not return a message handle");return this.messageId=i.messageId,this.platformThreadId=i.platformThreadId,this}async delete(){await this.transport.deleteMessage(this.messageId)}},Wl=class{constructor(){this.messageId="";this.platformThreadId=""}async edit(){return this}async delete(){}},Sm;Sm=um;var la=class{constructor(n,t,r){this[Sm]=!0;this._signals=[];this._toolResults=[];this._pendingToolApprovalRequest=null;this._pendingReactions=[];this._pendingDeletes=[];this._resolveSignal=null;var s,u,p,d,h;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.context=(u=n.context)!=null?u:null,this.notification=(p=n.notification)!=null?p:null,this.history=n.history,this.platform=n.platform,this.platformContext=n.platformContext,this.humanResponse=(d=n.humanResponse)!=null?d:null,this._toolApprovalConfig=r,this._transport=n.eventsUrl?new Hl(new sa({eventsUrl:n.eventsUrl,secretKey:t,conversationId:n.conversationId,agentId:n.agentId,turnId:n.deliveryId})):new Vl(n.replyUrl,t,n.conversationId,n.integrationIdentifier),this._metadataState={...(h=n.conversation.metadata)!=null?h:{}};let i=this;this.metadata={get(g){return i._metadataState[g]},set(g,y){i._metadataState[g]=y,i._signals.push({type:"metadata",action:"set",key:g,value:y})},delete(g){delete i._metadataState[g],i._signals.push({type:"metadata",action:"delete",key:g})},clear(){i._metadataState={},i._signals.push({type:"metadata",action:"clear"})},get current(){return{...i._metadataState}}};let o=g=>this._transport.setTyping(g),a=(g=>o(g===void 0?{}:{status:g}));a.stop=()=>o("stop"),this.typing=a,this.toolApproval={request:async g=>(await gm(this,g,this._toolApprovalConfig),new cr)}}asMessageContext(){return this}async reply(n,t){let r=await km(n,t==null?void 0:t.files),i=this._drainSideEffectsSnapshot(),o=await this._transport.sendReply(r,i);if(!o)throw new Error("Agent reply did not return a message handle");return new ai(o.messageId,o.platformThreadId,this._transport)}async replyApprovalCard(n){let t=this._drainSideEffectsSnapshot(),r=await this._transport.sendApprovalCard(n,t);if(r==="unaddressable")return new Wl;if(!r)throw new Error("Agent approval card reply did not return a message handle");return new ai(r.messageId,r.platformThreadId,this._transport)}createReplyHandle(n){return new ai(n,"",this._transport)}async emit(n){await this._transport.emitCustom(n.name,n.data)}resolve(n){this._resolveSignal={summary:n}}trigger(n,t){this._signals.push({...t,type:"trigger",workflowId:n})}ask(n,t){return this.queueHumanSignal("ask",n,t)}approve(n,t){return this.queueHumanSignal("approve",n,t)}choose(n,t,r){if(t.length<2||t.length>10)throw new Error("ctx.choose requires between 2 and 10 options");if(t.some(i=>typeof i!="string"||i.trim().length===0))throw new Error("ctx.choose options must be non-empty strings");return this.queueHumanSignal("choose",n,r,t)}tell(n,t){return this.queueHumanSignal("tell",n,t)}queueHumanSignal(n,t,r,i){let o=vm("hr"),a=(r==null?void 0:r.to)!==void 0?hm(r.to):void 0;return this._signals.push({type:"human",kind:n,prompt:t,requestId:o,...i?{options:i}:{},...r!=null&&r.from?{from:r.from}:{},...r&&"ttlSeconds"in r&&r.ttlSeconds!==void 0?{ttlSeconds:r.ttlSeconds}:{},...a!==void 0?{to:a}:{}}),o}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})}queueRunStart(){this._transport.queueRunStart()}async emitRunFinish(n){try{await this._transport.emitRunFinish(n.outcome)}catch(t){console.error("[agent] Failed to emit run finish:",t)}}async reportTurnError(n){try{await this._transport.reportTurnError(n)}catch(t){console.error("[agent] Failed to report turn error:",t)}}async flush(){if(!this._hasPendingSideEffects())return;let n=this._drainSideEffectsSnapshot();await this._transport.flushSideEffects(n)}_hasPendingSideEffects(){return!!(this._pendingToolApprovalRequest||this._signals.length||this._toolResults.length||this._resolveSignal||this._pendingReactions.length||this._pendingDeletes.length)}_drainSideEffectsSnapshot(){let n={toolApprovalRequest:this._pendingToolApprovalRequest,signals:this._signals,toolResults:this._toolResults,addReactions:this._pendingReactions,deleteMessages:this._pendingDeletes,resolve:this._resolveSignal};return this._pendingToolApprovalRequest=null,this._signals=[],this._toolResults=[],this._pendingReactions=[],this._pendingDeletes=[],this._resolveSignal=null,n}};function Ax(e){return!!(typeof e=="string"||typeof e=="object"&&e!==null&&Wo(e)||typeof e=="object"&&e!==null&&("markdown"in e||"card"in e||"files"in e))}function Ex(e,n){return e}function Rx(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 Am(e){var o;let n=new la(e.bridge,e.secretKey,e.agent.handlers.toolApproval),{agent:t,event:r,logger:i}=e;try{n.queueRunStart(),await _x(t,r,n),await n.flush(),await n.emitRunFinish({outcome:"completed"})}catch(a){let s=ii(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,Ex(n,r));pm(p)?u=!0:Ax(p)&&(await n.reply(p),u=!0)}catch(p){i==null||i.error(`[agent:${t.id}] onError failed:`,p)}u?await n.emitRunFinish({outcome:"completed"}):await n.reportTurnError(s.message)}finally{try{await n.typing.stop(),await n.flush()}catch{}}}async function _x(e,n,t){var i,o;let r=async a=>{a instanceof cr||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=mm((i=t.action)==null?void 0:i.id);if(a&&e.handlers.onToolApproval){let{approved:s,approvalId:u}=a,p=Rx(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:""),g={toolCall:d,approved:s,approvalMessage:h};e.userOnToolApproval===!1&&(await t.typing(),t.action.sourceMessageId&&await h.delete());let y=await e.handlers.onToolApproval(g,t);await r(y);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 Nn(n,$l)}}function Em(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 ur=class{constructor(n){this.handler=n.handler,this.client=n.client?n.client:new lr,this.workflows=n.workflows||[],this.agents=n.agents||[],this.http=Go(this.client.secretKey,this.client.apiUrl),this.frameworkName=n.frameworkName,this.hmacEnabled=this.client.strictAuthentication,this.waitUntil=n.waitUntil,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.13.2","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}){var h;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 g=this.getPostActionMap(d,o,a,i,s,u,(h=this.waitUntil)!=null?h:n.waitUntil),y=this.getGetActionMap(o,a);if(r==="POST")return await this.handlePostAction(i,g);if(r==="GET")return await this.handleGetAction(i,y);if(r==="OPTIONS")return this.createResponse(200,{})}catch(g){return this.handleError(g)}return this.createError(new Mi(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=Am({agent:u,event:a,bridge:n,secretKey:this.client.secretKey,logger:this.client.logger});return s?s(p):this.warnOnUnprotectedServerlessRuntime(o),this.createResponse(200,{status:"ack"})}}}warnOnUnprotectedServerlessRuntime(n){let t;try{process.env.AWS_LAMBDA_FUNCTION_NAME?t="AWS Lambda":process.env.VERCEL&&(t="Vercel")}catch{}t&&this.client.logger.warn(`[agent:${n}] Agent event acknowledged without a \`waitUntil\` primitive while running on ${t}. The runtime may freeze once the response is sent, silently dropping the rest of the agent turn. Pass \`waitUntil\` to \`serve()\` (e.g. \`serve({ agents, waitUntil })\`) to extend the invocation lifetime.`)}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},...n.agentId!==void 0&&{agentId:n.agentId}},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 Nn(n,kr)}async handleGetAction(n,t){if(Object.values(Si).includes(n)){let r=t[n];return r()}else throw new Nn(n,Si)}handleError(n){if(Mn(n))return n.statusCode>=500&&this.client.logger.error(n),this.createError(n);if(Jc(n))return this.createError(n);{let t=new Kn(n);return this.client.logger.error(t),this.createError(t)}}async validateHmac(n,t){if(!this.hmacEnabled)return;if(!t)throw new $i;if(!this.client.secretKey)throw new Bi;let r=Em(t);if(!r.v1||r.t===void 0)throw new qi;let i=Date.now();if(r.t<i-3e5||r.t>i+3e5)throw new ji;let o=await Uf(this.client.secretKey,`${r.t}.${JSON.stringify(n)}`);if(!$f(o,r.v1))throw new Ui}};function Yl(e,n){if(!e)throw new Error("agent() requires a non-empty agentId");if(!(n!=null&&n.onMessage))throw new Error(`agent('${e}') requires an onMessage handler`);return{id:e,handlers:n,userOnToolApproval:typeof n.onToolApproval=="function"}}var oe={output:{type:"object",properties:{},required:[],additionalProperties:!0}};var Ox={type:"object",properties:{webhookUrl:{type:"string",format:"uri"},text:{type:"string"},blocks:{type:"array",items:{type:"object",properties:{type:{type:"string"}},required:["type"],additionalProperties:!0}}},additionalProperties:!0},_m={output:Ox};var Om={"chat-webhook":oe,discord:oe,getstream:oe,"grafana-on-call":oe,line:oe,mattermost:oe,msteams:oe,"novu-slack":oe,"novu-web-chat":oe,"rocket-chat":oe,ryver:oe,sendblue:oe,slack:_m,"webex-messaging":oe,"whatsapp-business":oe,zulip:oe,telegram:oe};var Cx={type:"object",properties:{to:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}],description:'Email address of the recipient(s). Example: "Bob bob@host.com". You can use commas to separate multiple recipients (e.g.: "test@example.com,test@example.com" or ["test@example.com", "test@example.com"]).'},from:{type:"string"},subject:{type:"string",description:"Subject of the message."},text:{type:"string",description:"Text version of the message."},html:{type:"string",description:"HTML version of the message."},message:{type:"string",description:"MIME string of the message. Make sure to use multipart/form-data to send this as a file upload."},cc:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}],description:"Same as To but for carbon copy"},bcc:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}],description:"Same as To but for blind carbon copy"},ampHtml:{type:"string"},tVersion:{type:"string"},tText:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}]},oTag:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}],description:"Tag string. See Tagging for more information."},oDkim:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}],description:"Enables/disabled DKIM signatures on per-message basis. Pass yes or no"},oDeliverytime:{type:"string",description:"Desired time of delivery. See Date Format. Note: Messages can be scheduled for a maximum of 3 days in the future."},oDeliverytimeOptimizePeriod:{type:"string"},oTimeZoneLocalize:{type:"string"},oTestmode:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}],description:"Enables sending in test mode. Pass yes if needed. See Sending in Test Mode"},oTracking:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}],description:"Toggles tracking on a per-message basis, see Tracking Messages for details. Pass yes or no."},oTrackingClicks:{anyOf:[{type:"string",enum:["yes","no","htmlonly"]},{type:"boolean"}],description:"Toggles clicks tracking on a per-message basis. Has higher priority than domain-level setting. Pass yes, no or htmlonly."},oTrackingOpens:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}],description:"Toggles opens tracking on a per-message basis. Has higher priority than domain-level setting. Pass yes or no."},oRequireTls:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}]},oSkipVerification:{anyOf:[{type:"string",enum:["yes","no"]},{type:"boolean"}]},recipientVariables:{type:"string"}},required:[],additionalProperties:!0},Cm={output:Cx};var Wn={type:"object",properties:{name:{type:"string"},email:{type:"string"}},description:'JSON object, containing 2 properties: Name and Email address of a previously validated and active sender. Including the Name property in the JSON is optional. This property is not mandatory in case you use TemplateID and you specified a From address for the template. Format : { "Email":"value", "Name":"value" }.',required:["Email"],additionalProperties:!0},Ix={type:"object",properties:{contentType:{type:"string"},filename:{type:"string"},base64Content:{type:"string"}},required:["ContentType","Filename","Base64Content"],additionalProperties:!0},Px={type:"object",properties:{filename:{type:"string"},contentType:{type:"string"},contentId:{type:"string"},base64Content:{type:"string"}},required:["ContentType","Filename","Base64Content"],additionalProperties:!0},Mx={type:"object",properties:{from:Wn,sender:Wn,to:{type:"array",items:Wn},cc:{type:"array",items:Wn},bcc:{type:"array",items:Wn},replyTo:Wn,subject:{type:"string"},textPart:{type:"string",description:"Content of the message, sent in Text and/or HTML format. At least one of these content types needs to be specified. When the HTML part is the only part provided, Mailjet will not generate a Text-part from the HTML version. The property can't be set when you use TemplateID"},htmlPart:{type:"string",description:"Content of the message, sent in Text and/or HTML format. At least one of these content types needs to be specified. When the HTML part is the only part provided, Mailjet will not generate a Text-part from the HTML version. The property can't be set when you use TemplateID"},templateId:{type:"number",description:"an ID for a template that is previously created and stored in Mailjet's system. It is mandatory when From and TextPart and/or HtmlPart are not provided. "},templateLanguage:{type:"boolean"},templateErrorReporting:Wn,templateErrorDeliver:{type:"boolean"},attachments:{type:"array",items:Ix},inlineAttachments:{type:"array",items:Px},priority:{type:"number"},customCampaign:{type:"string"},deduplicateCampaign:{type:"boolean"},trackOpens:{type:"string",enum:["account_default","disabled","enabled"]},trackClicks:{type:"string",enum:["account_default","disabled","enabled"]},customId:{type:"string"},eventPayload:{type:"string"},urlTags:{type:"string"},headers:{type:"object",additionalProperties:!0},variables:{type:"object",additionalProperties:!0}},required:[],additionalProperties:!0},Im={output:Mx};var Gt={type:"object",properties:{address:{type:"string"},name:{type:"string"}},additionalProperties:!0},ca={type:"object",properties:{content:{type:"string"},path:{type:"string"}},additionalProperties:!0},Nx={type:"object",properties:{from:{anyOf:[{type:"string"},Gt]},sender:{anyOf:[{type:"string"},Gt]},to:{anyOf:[{type:"string"},Gt,{type:"array",items:Gt}]},cc:{anyOf:[{type:"string"},Gt,{type:"array",items:Gt}]},bcc:{anyOf:[{type:"string"},Gt,{type:"array",items:Gt}]},replyTo:{anyOf:[{type:"string"},Gt,{type:"array",items:Gt}]},inReplyTo:{anyOf:[{type:"string"},Gt]},references:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}]},subject:{type:"string"},text:{anyOf:[{type:"string"},ca]},html:{anyOf:[{type:"string"},ca]},watchHtml:{anyOf:[{type:"string"},ca]},amp:{anyOf:[{type:"string"},{type:"object",properties:{content:{type:"string"},path:{type:"string"},href:{type:"string"},encoding:{type:"string"},contentType:{type:"string"},raw:{anyOf:[{type:"string"},ca]}}}]},icalEvent:{anyOf:[{type:"string"},{type:"object",properties:{content:{type:"string"},path:{type:"string"},method:{type:"string"},filename:{anyOf:[{type:"string"},{type:"boolean"}]},href:{type:"string"},encoding:{type:"string"}}}]},headers:{anyOf:[{type:"object",additionalProperties:!0},{type:"array",items:{type:"object",additionalProperties:!0}}]},list:{anyOf:[{type:"string"},{type:"array",items:{type:"string"}}]},attachments:{type:"array",items:{type:"object",properties:{content:{type:"string"},path:{type:"string"}},additionalProperties:!0}}},required:[],additionalProperties:!0},Pm={output:Nx};var Lx={type:"object",properties:{},required:[],additionalProperties:!1},Mm={output:Lx};var Dx={type:"object",properties:{personalizations:{type:"array",description:"An array of messages and their metadata. Each object within personalizations can be thought of as an envelope - it defines who should receive an individual message and how that message should be handled. See our [Personalizations documentation](https://sendgrid.com/docs/for-developers/sending-email/personalizations/) for examples.",uniqueItems:!1,maxItems:1e3,items:{type:"object",properties:{from:{title:"From Email Object",type:"object",properties:{email:{type:"string",format:"email",description:"The 'From' email address used to deliver the message. This address should be a verified sender in your Twilio SendGrid account."},name:{type:"string",description:"A name or title associated with the sending email address."}},required:["email"]},to:{title:"To Email Array",type:"array",items:{type:"object",properties:{email:{type:"string",format:"email",description:"The intended recipient's email address."},name:{type:"string",description:"The intended recipient's name."}},required:["email"]}},cc:{type:"array",description:"An array of recipients who will receive a copy of your email. Each object in this array must contain the recipient's email address. Each object in the array may optionally contain the recipient's name.",maxItems:1e3,items:{title:"CC BCC Email Object",type:"object",properties:{email:{type:"string",format:"email",description:"The intended recipient's email address."},name:{type:"string",description:"The intended recipient's name."}},required:["email"]}},bcc:{type:"array",description:"An array of recipients who will receive a blind carbon copy of your email. Each object in this array must contain the recipient's email address. Each object in the array may optionally contain the recipient's name.",maxItems:1e3,items:{title:"CC BCC Email Object",type:"object",properties:{email:{type:"string",format:"email",description:"The intended recipient's email address."},name:{type:"string",description:"The intended recipient's name."}},required:["email"]}},subject:{type:"string",description:"The subject of your email. See character length requirements according to [RFC 2822](http://stackoverflow.com/questions/1592291/what-is-the-email-subject-length-limit#answer-1592310).",minLength:1},headers:{type:"object",description:"A collection of JSON key/value pairs allowing you to specify handling instructions for your email. You may not overwrite the following headers: `x-sg-id`, `x-sg-eid`, `received`, `dkim-signature`, `Content-Type`, `Content-Transfer-Encoding`, `To`, `From`, `Subject`, `Reply-To`, `CC`, `BCC`"},substitutions:{type:"object",description:'Substitutions allow you to insert data without using Dynamic Transactional Templates. This field should **not** be used in combination with a Dynamic Transactional Template, which can be identified by a `templateId` starting with `d-`. This field is a collection of key/value pairs following the pattern "substitutionTag":"value to substitute". The key/value pairs must be strings. These substitutions will apply to the text and html content of the body of your email, in addition to the `subject` and `reply-to` parameters. The total collective size of your substitutions may not exceed 10,000 bytes per personalization object.',maxProperties:1e4},dynamicTemplateData:{type:"object",description:'Dynamic template data is available using Handlebars syntax in Dynamic Transactional Templates. This field should be used in combination with a Dynamic Transactional Template, which can be identified by a `templateId` starting with `d-`. This field is a collection of key/value pairs following the pattern "variable_name":"value to insert".'},customArgs:{type:"object",description:"Values that are specific to this personalization that will be carried along with the email and its activity data. Substitutions will not be made on custom arguments, so any string that is entered into this parameter will be assumed to be the custom argument that you would like to be used. This field may not exceed 10,000 bytes.",maxProperties:1e4},sendAt:{type:"integer",description:"A unix timestamp allowing you to specify when your email should be delivered. Scheduling delivery more than 72 hours in advance is forbidden."}},required:["to"]}},from:{title:"From Email Object",type:"object",properties:{email:{type:"string",format:"email",description:"The 'From' email address used to deliver the message. This address should be a verified sender in your Twilio SendGrid account."},name:{type:"string",description:"A name or title associated with the sending email address."}},required:["email"]},replyTo:{title:"Reply_to Email Object",type:"object",properties:{email:{type:"string",format:"email",description:"The email address where any replies or bounces will be returned."},name:{type:"string",description:"A name or title associated with the `replyTo` email address."}},required:["email"]},replyToList:{type:"array",description:"An array of recipients who will receive replies and/or bounces. Each object in this array must contain the recipient's email address. Each object in the array may optionally contain the recipient's name. You can either choose to use \u201CreplyTo\u201D field or \u201CreplyToList\u201D but not both.",uniqueItems:!0,maxItems:1e3,items:{type:"object",properties:{email:{type:"string",description:"The email address where any replies or bounces will be returned.",format:"email"},name:{type:"string",description:"A name or title associated with the `replyToList` email address."}},required:["email"]}},subject:{type:"string",description:"The global or 'message level' subject of your email. This may be overridden by subject lines set in personalizations.",minLength:1},content:{type:"array",description:"An array where you can specify the content of your email. You can include multiple [MIME types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of content, but you must specify at least one MIME type. To include more than one MIME type, add another object to the array containing the `type` and `value` parameters.",items:{type:"object",properties:{type:{type:"string",description:"The MIME type of the content you are including in your email (e.g., `\u201Ctext/plain\u201D` or `\u201Ctext/html\u201D`).",minLength:1},value:{type:"string",description:"The actual content of the specified MIME type that you are including in your email.",minLength:1}},required:["type","value"]}},attachments:{type:"array",description:"An array of objects where you can specify any attachments you want to include.",items:{type:"object",properties:{content:{type:"string",description:"The Base64 encoded content of the attachment.",minLength:1},type:{type:"string",description:"The MIME type of the content you are attaching (e.g., `\u201Ctext/plain\u201D` or `\u201Ctext/html\u201D`).",minLength:1},filename:{type:"string",description:"The attachment's filename."},disposition:{type:"string",default:"attachment",description:"The attachment's content-disposition, specifying how you would like the attachment to be displayed. For example, `\u201Cinline\u201D` results in the attached file are displayed automatically within the message while `\u201Cattachment\u201D` results in the attached file require some action to be taken before it is displayed, such as opening or downloading the file.",enum:["inline","attachment"]},contentId:{type:"string",description:"The attachment's content ID. This is used when the disposition is set to `\u201Cinline\u201D` and the attachment is an image, allowing the file to be displayed within the body of your email."}},required:["content","filename"]}},templateId:{type:"string",description:"An email template ID. A template that contains a subject and content \u2014 either text or html \u2014 will override any subject and content values specified at the personalizations or message level."},headers:{description:"An object containing key/value pairs of header names and the value to substitute for them. The key/value pairs must be strings. You must ensure these are properly encoded if they contain unicode characters. These headers cannot be one of the reserved headers.",type:"object"},categories:{type:"array",description:"An array of category names for this message. Each category name may not exceed 255 characters. ",uniqueItems:!0,maxItems:10,items:{type:"string",maxLength:255}},customArgs:{description:"Values that are specific to the entire send that will be carried along with the email and its activity data. Key/value pairs must be strings. Substitutions will not be made on custom arguments, so any string that is entered into this parameter will be assumed to be the custom argument that you would like to be used. This parameter is overridden by `customArgs` set at the personalizations level. Total `customArgs` size may not exceed 10,000 bytes.",type:"string"},sendAt:{type:"integer",description:"A unix timestamp allowing you to specify when you want your email to be delivered. This may be overridden by the `sendAt` parameter set at the personalizations level. Delivery cannot be scheduled more than 72 hours in advance. If you have the flexibility, it's better to schedule mail for off-peak times. Most emails are scheduled and sent at the top of the hour or half hour. Scheduling email to avoid peak times \u2014 for example, scheduling at 10:53 \u2014 can result in lower deferral rates due to the reduced traffic during off-peak times."},batchId:{type:"string",description:"An ID representing a batch of emails to be sent at the same time. Including a `batchId` in your request allows you include this email in that batch. It also enables you to cancel or pause the delivery of that batch. For more information, see the [Cancel Scheduled Sends API](https://sendgrid.com/docs/api-reference/)."},asm:{type:"object",description:"An object allowing you to specify how to handle unsubscribes.",properties:{groupId:{type:"integer",description:"The unsubscribe group to associate with this email."},groupsToDisplay:{type:"array",description:"An array containing the unsubscribe groups that you would like to be displayed on the unsubscribe preferences page.",maxItems:25,items:{type:"integer"}}},required:["groupId"]},ipPoolName:{type:"string",description:"The IP Pool that you would like to send this email from.",minLength:2,maxLength:64},mailSettings:{type:"object",description:"A collection of different mail settings that you can use to specify how you would like this email to be handled.",properties:{bypassListManagement:{type:"object",description:"Allows you to bypass all unsubscribe groups and suppressions to ensure that the email is delivered to every single recipient. This should only be used in emergencies when it is absolutely necessary that every recipient receives your email. This filter cannot be combined with any other bypass filters. See our [documentation](https://sendgrid.com/docs/ui/sending-email/index-suppressions/#bypass-suppressions) for more about bypass filters.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."}}},bypassSpamManagement:{type:"object",description:"Allows you to bypass the spam report list to ensure that the email is delivered to recipients. Bounce and unsubscribe lists will still be checked; addresses on these other lists will not receive the message. This filter cannot be combined with the `bypassListManagement` filter. See our [documentation](https://sendgrid.com/docs/ui/sending-email/index-suppressions/#bypass-suppressions) for more about bypass filters.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."}}},bypassBounceManagement:{type:"object",description:"Allows you to bypass the bounce list to ensure that the email is delivered to recipients. Spam report and unsubscribe lists will still be checked; addresses on these other lists will not receive the message. This filter cannot be combined with the `bypassListManagement` filter. See our [documentation](https://sendgrid.com/docs/ui/sending-email/index-suppressions/#bypass-suppressions) for more about bypass filters.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."}}},bypassUnsubscribeManagement:{type:"object",description:"Allows you to bypass the global unsubscribe list to ensure that the email is delivered to recipients. Bounce and spam report lists will still be checked; addresses on these other lists will not receive the message. This filter applies only to global unsubscribes and will not bypass group unsubscribes. This filter cannot be combined with the `bypassListManagement` filter. See our [documentation](https://sendgrid.com/docs/ui/sending-email/index-suppressions/#bypass-suppressions) for more about bypass filters.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."}}},footer:{type:"object",description:"The default footer that you would like included on every email.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."},text:{type:"string",description:"The plain text content of your footer."},html:{type:"string",description:"The HTML content of your footer."}}},sandboxMode:{type:"object",description:"Sandbox Mode allows you to send a test email to ensure that your request body is valid and formatted correctly.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."}}}}},trackingSettings:{type:"object",description:"Settings to determine how you would like to track the metrics of how your recipients interact with your email.",properties:{clickTracking:{type:"object",description:"Allows you to track if a recipient clicked a link in your email.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."},enableText:{type:"boolean",description:"Indicates if this setting should be included in the `text/plain` portion of your email."}}},openTracking:{type:"object",description:"Allows you to track if the email was opened by including a single pixel image in the body of the content. When the pixel is loaded, Twilio SendGrid can log that the email was opened.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."},substitutionTag:{type:"string",description:"Allows you to specify a substitution tag that you can insert in the body of your email at a location that you desire. This tag will be replaced by the open tracking pixel."}}},subscriptionTracking:{type:"object",description:"Allows you to insert a subscription management link at the bottom of the text and HTML bodies of your email. If you would like to specify the location of the link within your email, you may use the `substitutionTag`.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."},text:{type:"string",description:"Text to be appended to the email with the subscription tracking link. You may control where the link is by using the tag <% %>"},html:{type:"string",description:"HTML to be appended to the email with the subscription tracking link. You may control where the link is by using the tag <% %>"},substitutionTag:{type:"string",description:"A tag that will be replaced with the unsubscribe URL. for example: `[unsubscribe_url]`. If this parameter is used, it will override both the `text` and `html` parameters. The URL of the link will be placed at the substitution tag\u2019s location with no additional formatting."}}},ganalytics:{type:"object",description:"Allows you to enable tracking provided by Google Analytics.",properties:{enable:{type:"boolean",description:"Indicates if this setting is enabled."},utmSource:{type:"string",description:"Name of the referrer source. (e.g. Google, SomeDomain.com, or Marketing Email)"},utmMedium:{type:"string",description:"Name of the marketing medium. (e.g. Email)"},utmTerm:{type:"string",description:"Used to identify any paid keywords."},utmContent:{type:"string",description:"Used to differentiate your campaign from advertisements."},utmCampaign:{type:"string",description:"The name of the campaign."}}}}}},required:[],additionalProperties:!1},Nm={output:Dx};var Lm={anypost:oe,braze:oe,clickatell:oe,nodemailer:Pm,emailjs:oe,"email-webhook":oe,"infobip-email":oe,mailersend:oe,mailgun:Cm,mailjet:Im,mailtrap:oe,mandrill:oe,netcore:oe,"novu-email":Mm,outlook365:oe,plunk:oe,postmark:oe,resend:oe,sendgrid:Nm,sendinblue:oe,ses:oe,sparkpost:oe};var Fx={type:"object",properties:{},required:[],additionalProperties:!1},Dm={output:Fx};var Fm={novu:Dm};var Um={anyOf:[{type:"string"},{type:"object",additionalProperties:!0,properties:{name:{type:"string"},volume:{type:"number"},critical:{type:"number"}},required:["name","volume","critical"]}]},Ux={type:"object",properties:{topic:{type:"string",description:"The destination topic for the notification."},id:{type:"string",description:"A UUID to identify the notification with APNS. If an id is not supplied, APNS will generate one automatically. If an error occurs the response will contain the id. This property populates the apns-id header."},expiry:{type:"number",description:"A UNIX timestamp when the notification should expire. If the notification cannot be delivered to the device, APNS will retry until it expires. An expiry of 0 indicates that the notification expires immediately, therefore no retries will be attempted."},priority:{type:"number",description:`Provide one of the following values:
155
155
 
156
156
  10 - The push notification is sent to the device immediately. (Default)
157
157
  The push notification must trigger an alert, sound, or badge on the device. It is an error to use this priority for a push notification that contains only the content-available key.
@@ -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=Ji,Rt={type:je.ALLOWED_TYPES},dn=Gi,sr=zi,hn=Qi,kt=Xi,gn=Zi,mn=es,or="[a-zA-Z][a-zA-Z0-9+-.]*",_t=`https?://{hostname}(?:${or})+`,yn="(?:\\?([a-z]{1,7}(=\\w{1,5})?&){0,3})?",Fe={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)?)$"},Fe.iri=Fe["uri-reference"],Fe["iri-reference"]=Fe["uri-reference"],Fe["idn-email"]=Fe.email,Fe["idn-hostname"]=Fe.hostname,wn=new RegExp(`\\{(${Object.keys(Fe).join("|")})\\}`),Sn=ts,An=ns,On={boolean:on,null:cn,array:un,integer:fn,number:ir,object:dn,string:An},ct=On,En=et,vn=({refs:e,schema:t,container:r,synchronous:l,refDepthMax:c,refDepthMin:p})=>{let f={},O={},$=0,A,D;return f.resolveSchema=(T,V,H)=>{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 z=Math.max(p,c)-1;if(T.$ref==="#"||O[T.$ref]<0||A===T.$ref&&++$>z)return T.$ref!=="#"&&D&&D.length===H.length?ue.getLocalRef(t,T.$ref,l&&e):(delete T.$ref,T);typeof O[T.$ref]=="undefined"&&(O[T.$ref]=X.number(p,c)-1),D=H,A=T.$ref;let te;T.$ref.indexOf("#/")===-1?te=e[T.$ref]||null:te=ue.getLocalRef(t,T.$ref,l&&e)||null;let de;if(typeof te!="undefined"){if(!te&&ee("ignoreMissingRefs")!==!0)throw new Error(`Reference not found: ${T.$ref}`);O[T.$ref]-=1,ue.merge(T,te||{}),de=l&&te&&te.$ref}return de||delete T.$ref,T}if(Array.isArray(T.allOf)){let z=T.allOf;delete T.allOf,z.forEach(te=>{let de=f.resolveSchema(te,null,H);ue.merge(T,typeof de.thunk=="function"?de.thunk(T):de),Array.isArray(T.allOf)&&f.resolveSchema(T,V,H)})}if(Array.isArray(T.oneOf||T.anyOf)&&H[H.length-2]!=="dependencies"){let z=T.oneOf||T.anyOf;return T.enum&&T.oneOf&&(T.enum=T.enum.filter(te=>ue.validate(te,z))),{thunk(te){let de=ue.omitProps(T,["anyOf","oneOf"]),ge=X.pick(z);return ue.merge(de,ge),z.forEach(F=>{F.required&&F!==ge&&F.required.forEach(y=>{if(ge.required&&ge.required.includes(y))return;let S=de.required&&de.required.includes(y);de.properties&&!S&&delete de.properties[y],te&&te.properties&&delete te.properties[y]})}),de}}}if(Object.keys(T).forEach(z=>{(Array.isArray(T[z])||typeof T[z]=="object")&&!ue.isKey(z)&&(T[z]=f.resolveSchema(T[z],z,H.concat(z)))}),H){let z=H[H.length-1];if(z==="properties"||z==="items")return T}return r.wrap(T)},f},bn=vn,ar=as,lr=ls,Pe=Jt(Br(),1),fs=Pe.default.binaryOptions,ps=Pe.default.boolOptions,ds=Pe.default.intOptions,hs=Pe.default.nullOptions,gs=Pe.default.strOptions,ms=Pe.default.Schema,ys=Pe.default.Alias,ws=Pe.default.Collection,Ss=Pe.default.Merge,As=Pe.default.Node,Os=Pe.default.Pair,Es=Pe.default.Scalar,Tn=Pe.default.YAMLMap,Rn=Pe.default.YAMLSeq,ut=us,Ve=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,Ve,!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 O=f.url.replace("/:",":");return l[O]||l[O.split("/").pop()]},read(f,O){try{O(null,this.canRead(f))}catch($){O($)}}},{$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,Ve)).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)=>(Ve.extend(e,t),Ae),Ae.define=(e,t)=>(Ve.define(e,t),Ae),Ae.reset=e=>(Ve.reset(e),kr(),Ae),Ae.locate=e=>Ve.get(e),Ae.VERSION="0.5.5",kn={...Ae},_n=Ae}}),bs=W({"src/src/main.iife.js"(e,t){var r=(vs(),Q(ae));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 bs()})();((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,fillProperties:!1});function fi(w){return xt.generate(w)}var pi=async(w,i)=>{let a=new TextEncoder,g=a.encode(w),b=a.encode(i),W=await crypto.subtle.importKey("raw",g,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]),I=await crypto.subtle.sign("HMAC",W,b);return Array.from(new Uint8Array(I)).map(U=>U.toString(16).padStart(2,"0")).join("")},di=(w,i)=>{if(typeof w!="string"||typeof i!="string"||w.length!==i.length)return!1;let a=0;for(let g=0;g<w.length;g+=1)a|=w.charCodeAt(g)^i.charCodeAt(g);return a===0};import{Response as Ws}from"cross-fetch";var Io=()=>typeof Response!="undefined"?Response:Ws,hi=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 gi(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,g)=>{let b=await fetch(`${i}/v1${a}`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`ApiKey ${w}`},body:JSON.stringify(g)}),W=await b.json();if(b.ok)return W;throw gi(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 nt from"chalk";var ye={info:w=>nt.blue(w),warning:w=>nt.yellow(w),error:w=>nt.red(w),success:w=>nt.green(w),underline:w=>nt.underline(w),bold:w=>nt.bold(w)},Te={SUCCESS:ye.success("\u2714"),ERROR:ye.error("\u2717"),WARNING:ye.warning("\u26A0"),INFO:ye.info("\u2139"),ARROW:ye.bold("\u2192"),MOCK:ye.info("\u25CB"),HYDRATED:ye.bold(ye.info("\u2192")),STEP:ye.info("\u03C3"),ACTION:ye.info("\u03B1"),DURATION:ye.info("\u0394"),PROVIDER:ye.info("\u2699"),OUTPUT:ye.info("\u21E2"),INPUT:ye.info("\u21E0"),WORKFLOW:ye.info("\u03C9"),STATE:ye.info("\u03C3"),EXECUTE:ye.info("\u03B5"),PREVIEW:ye.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 yi from"sanitize-html";var Fs=["src","alt","width","height","loading","srcset","sizes","crossorigin","usemap","ismap","class","id","style","title","dir","lang"];function Bs(w){return w.toLowerCase().startsWith("on")}function Us(w){return w.replace(/<\/([a-zA-Z][a-zA-Z0-9]*)\s*\/[^>]*>/g,"</$1>")}var Hs={allowedTags:yi.defaults.allowedTags.concat(["style","img","html","head","body","link","meta","title"]),allowedAttributes:!1,transformTags:{"*":(w,i)=>{let a={};for(let[g,b]of Object.entries(i))Bs(g)||(a[g]=b);return{tagName:w,attribs:a}},img:(w,i)=>{let a={};for(let[g,b]of Object.entries(i))Fs.includes(g.toLowerCase())&&(a[g]=b);return{tagName:w,attribs:a}}},allowVulnerableTags:!0,parseStyleAttributes:!1,parser:{lowerCaseAttributeNames:!0}},mi=w=>{if(!w)return w;let i=Us(w),a=/^<!DOCTYPE .*?>/,g=i.match(a),b=yi(i,Hs);return g?g[0]+b:b},Wt=w=>Object.keys(w).reduce((i,a)=>{let g=w[a];return typeof g=="string"?i[a]=mi(g):Array.isArray(g)?i[a]=g.map(b=>typeof b=="string"?mi(b):typeof b=="object"?Wt(b):b):typeof g=="object"&&g!==null?i[a]=Wt(g):i[a]=g,i},{});function wi(w,i=!0,a=console){i&&(a.info(`
92
- ${ye.bold(ye.underline("Discovered workflowId:"))} '${w.workflowId}'`),w.steps.forEach((g,b)=>{let W=b===w.steps.length-1,I=W?"\u2514":"\u251C";a.info(`${I} ${Te.STEP} Discovered stepId: '${g.stepId}' Type: '${g.type}'`),g.providers.forEach((U,Q)=>{let ae=Q===g.providers.length-1,ke=W?" ":"\u2502",Se=ae?"\u2514":"\u251C";a.info(`${ke} ${Se} ${Te.PROVIDER} Discovered provider: '${U.type}'`)})}))}import{jsonrepair as js}from"jsonrepair";function Si(w){let i=w.trim();return(i.startsWith("{")&&i.endsWith("}")||i.startsWith("[")&&i.endsWith("]"))&&i.length>2}var Ai="__novuJsonString";function Ys(w){return typeof w=="object"&&w!==null&&!Array.isArray(w)&&w[Ai]===!0}function mt(w){if(typeof w=="string"){if(!Si(w))return w;try{let i=JSON.parse(w);return{[Ai]:!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,g]of Object.entries(w))i[a]=mt(g);return i}return w}function yt(w){if(Ys(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,g]of Object.entries(w))i[a]=yt(g);return i}return w}function Vs(w){try{return JSON.parse(w),w}catch{try{return js(w)}catch{return w}}}function Oi(w){return Object.fromEntries(Object.entries(w).map(([i,a])=>typeof a=="string"?[i,Si(a)?Vs(a):a]:typeof a=="object"&&a!==null&&!Array.isArray(a)?[i,Oi(a)]:[i,a]))}function Ei(w){return!(w!=null&&w.data)||typeof w.data!="object"||Array.isArray(w.data)?w:{...w,data:Oi(w.data)}}function vi(){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.13.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:!vi(),verbose:vi(),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 g=this.discoverWorkflowPromises.get(a.id);if(g){await g;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();wi(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,g=i.reduce((b,W)=>b+W.steps.length,0);return{status:"ok",sdkVersion:"2.13.1",frameworkVersion:"2024-06-26",discovered:{workflows:a,steps:g}}}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 fi(i)}catch(a){return this.logger.warn("Failed to mock schema, returning empty object:",a),{}}}async validate(i,a,g,b,W,I,U){let Q=await Pt(a,i);if(Q.success)return Q.data;switch(g){case"event":this.throwInvalidEvent(b,W,Q.errors);case"step":this.throwInvalidStep(I,b,W,Q.errors);case"provider":this.throwInvalidProvider(I,U,b,W,Q.errors);default:throw new Error(`Invalid component: '${g}'`)}}throwInvalidProvider(i,a,g,b,W){throw i?a?g==="output"?new Ln(b,i,a,W):new Error(`Invalid payload type: '${g}'`):new Error("providerId is required"):new Error("stepId is required")}throwInvalidStep(i,a,g,b){if(!i)throw new Error("stepId is required");switch(a){case"output":throw new Pn(g,i,b);case"result":throw new In(g,i,b);case"controls":throw new Nn(g,i,b);default:throw new Error(`Invalid payload type: '${a}'`)}}throwInvalidEvent(i,a,g){switch(i){case"controls":throw new Mn(a,g);case"payload":throw new fr(a,g);default:throw new Error(`Invalid payload type: '${i}'`)}}executeStepFactory(i,a,g){return async(b,W,I)=>{if(g())return;let U=this.getStep(i.workflowId,b),Q=i.action==="preview";if(!Q&&b===i.stepId){let Re=await this.createStepControls(U,i),Le=await this.compileControls(Re,i);if(await this.shouldSkip(I==null?void 0:I.skip,Le))return a({options:{skip:!0},outputs:{},providers:{}}),{}}let ae=this.previewStep.bind(this),ke=this.executeStep.bind(this),pe=await(Q?ae:ke)(i,{...U,providers:U.providers.map(Re=>{var Ge;let Le=(Ge=I==null?void 0:I.providers)==null?void 0:Ge[Re.type];if(!Le)throw new Un(Re.type);return{...Re,resolve:Le}}),resolve:W});return this.shouldSanitize({stepType:U.type,options:I})&&(pe={...pe,outputs:Wt(pe.outputs)}),b===i.stepId&&a({...pe,options:{skip:!1}}),pe.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
+ ${ye.bold(ye.underline("Discovered workflowId:"))} '${w.workflowId}'`),w.steps.forEach((g,b)=>{let W=b===w.steps.length-1,I=W?"\u2514":"\u251C";a.info(`${I} ${Te.STEP} Discovered stepId: '${g.stepId}' Type: '${g.type}'`),g.providers.forEach((U,Q)=>{let ae=Q===g.providers.length-1,ke=W?" ":"\u2502",Se=ae?"\u2514":"\u251C";a.info(`${ke} ${Se} ${Te.PROVIDER} Discovered provider: '${U.type}'`)})}))}import{jsonrepair as js}from"jsonrepair";function Si(w){let i=w.trim();return(i.startsWith("{")&&i.endsWith("}")||i.startsWith("[")&&i.endsWith("]"))&&i.length>2}var Ai="__novuJsonString";function Ys(w){return typeof w=="object"&&w!==null&&!Array.isArray(w)&&w[Ai]===!0}function mt(w){if(typeof w=="string"){if(!Si(w))return w;try{let i=JSON.parse(w);return{[Ai]:!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,g]of Object.entries(w))i[a]=mt(g);return i}return w}function yt(w){if(Ys(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,g]of Object.entries(w))i[a]=yt(g);return i}return w}function Vs(w){try{return JSON.parse(w),w}catch{try{return js(w)}catch{return w}}}function Oi(w){return Object.fromEntries(Object.entries(w).map(([i,a])=>typeof a=="string"?[i,Si(a)?Vs(a):a]:typeof a=="object"&&a!==null&&!Array.isArray(a)?[i,Oi(a)]:[i,a]))}function Ei(w){return!(w!=null&&w.data)||typeof w.data!="object"||Array.isArray(w.data)?w:{...w,data:Oi(w.data)}}function vi(){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.13.2";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:!vi(),verbose:vi(),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 g=this.discoverWorkflowPromises.get(a.id);if(g){await g;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();wi(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,g=i.reduce((b,W)=>b+W.steps.length,0);return{status:"ok",sdkVersion:"2.13.2",frameworkVersion:"2024-06-26",discovered:{workflows:a,steps:g}}}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 fi(i)}catch(a){return this.logger.warn("Failed to mock schema, returning empty object:",a),{}}}async validate(i,a,g,b,W,I,U){let Q=await Pt(a,i);if(Q.success)return Q.data;switch(g){case"event":this.throwInvalidEvent(b,W,Q.errors);case"step":this.throwInvalidStep(I,b,W,Q.errors);case"provider":this.throwInvalidProvider(I,U,b,W,Q.errors);default:throw new Error(`Invalid component: '${g}'`)}}throwInvalidProvider(i,a,g,b,W){throw i?a?g==="output"?new Ln(b,i,a,W):new Error(`Invalid payload type: '${g}'`):new Error("providerId is required"):new Error("stepId is required")}throwInvalidStep(i,a,g,b){if(!i)throw new Error("stepId is required");switch(a){case"output":throw new Pn(g,i,b);case"result":throw new In(g,i,b);case"controls":throw new Nn(g,i,b);default:throw new Error(`Invalid payload type: '${a}'`)}}throwInvalidEvent(i,a,g){switch(i){case"controls":throw new Mn(a,g);case"payload":throw new fr(a,g);default:throw new Error(`Invalid payload type: '${i}'`)}}executeStepFactory(i,a,g){return async(b,W,I)=>{if(g())return;let U=this.getStep(i.workflowId,b),Q=i.action==="preview";if(!Q&&b===i.stepId){let Re=await this.createStepControls(U,i),Le=await this.compileControls(Re,i);if(await this.shouldSkip(I==null?void 0:I.skip,Le))return a({options:{skip:!0},outputs:{},providers:{}}),{}}let ae=this.previewStep.bind(this),ke=this.executeStep.bind(this),pe=await(Q?ae:ke)(i,{...U,providers:U.providers.map(Re=>{var Ge;let Le=(Ge=I==null?void 0:I.providers)==null?void 0:Ge[Re.type];if(!Le)throw new Un(Re.type);return{...Re,resolve:Le}}),resolve:W});return this.shouldSanitize({stepType:U.type,options:I})&&(pe={...pe,outputs:Wt(pe.outputs)}),b===i.stepId&&a({...pe,options:{skip:!1}}),pe.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
  ${ye.bold(ye.underline(b))} '${i.workflowId}'`);let W=this.getWorkflow(i.workflowId),I=process.hrtime(),U={outputs:{},providers:{},options:{skip:!1}},Q,ae=!1,ke=new Promise(He=>{Q=He}),Se=He=>{if(ae)throw new Error("setResult can only be called once per workflow execution");Q(),ae=!0,U=He},pe=()=>ae,Re;try{if(i.action==="execute"&&!i.payload)throw new fr(i.workflowId,{message:"Event `payload` is required"});let He=await this.createExecutionPayload(i,W),We={...i,payload:He};await Promise.race([ke,W.execute({payload:He,env:i.env,controls:{},subscriber:i.subscriber,context:i.context,step:{email:this.executeStepFactory(We,Se,pe),sms:this.executeStepFactory(We,Se,pe),inApp:this.executeStepFactory(We,Se,pe),digest:this.executeStepFactory(We,Se,pe),delay:this.executeStepFactory(We,Se,pe),push:this.executeStepFactory(We,Se,pe),chat:this.executeStepFactory(We,Se,pe),custom:this.executeStepFactory(We,Se,pe),throttle:this.executeStepFactory(We,Se,pe),tool:this.executeStepFactory(We,Se,pe)}})])}catch(He){Re=He}let Le=process.hrtime(I),Ge=Le[0],Ue=Le[1],St=Ge*1e3+Ue/1e6,Bt=Re?Te.ERROR:Te.SUCCESS,At={execute:"Executed",preview:"Previewed"}[i.action]||i.action;if(this.log(`${Bt} ${At} workflowId: \`${i.workflowId}\``),this.prettyPrintExecute(i,St,Re),Re)throw Re;return{outputs:U.outputs,providers:U.providers,options:U.options,metadata:{status:"success",error:!1,duration:St}}}async createExecutionPayload(i,a){let{payload:g}=i;if(i.action==="preview"){let W=this.mock(a.payload.schema);g=Object.assign(W,g)}return await this.validate(g,a.payload.unknownSchema,"event","payload",i.workflowId)}prettyPrintExecute(i,a,g){if(!this.verbose)return;let b=g?Te.ERROR:Te.SUCCESS,I={execute:"Executed",preview:"Previewed"}[i.action]||i.action,U=g?"Failed to execute":I,Q=g?ye.error:ye.success,ae=`${b} ${U} workflowId: '${i.workflowId}`;this.logger.info(`
94
94
  ${ye.bold(Q(ae))}'
95
95
  \u251C ${Te.STEP} stepId: '${i.stepId}'
96
96
  \u251C ${Te.ACTION} action: '${i.action}'
97
97
  \u2514 ${Te.DURATION} duration: '${a.toFixed(2)}ms'
98
- `)}async executeProviders(i,a,g,b){return a.providers.reduce(async(W,I)=>{let U=await W,Q=await this.runProvider(i,a,I,g,b);return{...U,[I.type]:Q}},Promise.resolve({}))}async runProvider(i,a,g,b,W){let I=i.action==="preview";if(i.stepId!==a.stepId)return I?(this.log(` ${Te.MOCK} Mocked provider: \`${g.type}\``),this.mock(g.outputs.schema)):(this.log(` ${Te.HYDRATED} Hydrated provider: \`${g.type}\``),{});try{return await this.resolveProviderOutput(i,a,g,W,b)}catch(U){if(this.log(` ${Te.ERROR} Failed to execute provider: \`${g.type}\``),I)return this.log(` ${Te.MOCK} Mocked provider: \`${g.type}\``),this.mock(g.outputs.schema);throw new Hn(g.type,i.action,U)}}async resolveProviderOutput(i,a,g,b,W){let I=await g.resolve({controls:b,outputs:W}),U=await this.validate(I,g.outputs.unknownSchema,"step","output",i.workflowId,a.stepId,g.type);return this.log(` ${Te.SUCCESS} Executed provider: \`${g.type}\``),{...U,_passthrough:I._passthrough}}async executeStep(i,a){if(i.stepId===a.stepId)try{let g=await this.createStepControls(a,i),b=await this.compileControls(g,i),W=await a.resolve(b),I=await this.normalizeChatCardOutput(a,W),U=await this.validate(I,a.outputs.unknownSchema,"step","output",i.workflowId,a.stepId),Q=await this.executeProviders(i,a,U,b);return this.log(` ${Te.SUCCESS} Executed stepId: \`${a.stepId}\``),{outputs:U,providers:Q}}catch(g){throw this.log(` ${Te.ERROR} Failed to execute stepId: \`${a.stepId}\``),pt(g)?g:new pr(a.stepId,i.action,g)}else try{let g=this.getStepState(i,a.stepId);if(g){let b=await this.validate(g.outputs,a.results.unknownSchema,"step","result",i.workflowId,a.stepId);return this.log(` ${Te.HYDRATED} Hydrated stepId: \`${a.stepId}\``),{outputs:b,providers:await this.executeProviders(i,a,b,{})}}else throw new Cn(i.workflowId,a.stepId)}catch(g){throw this.log(` ${Te.ERROR} Failed to hydrate stepId: \`${a.stepId}\``),g}}async normalizeChatCardOutput(i,a){if(i.type!=="chat"||(a==null?void 0:a.card)==null)return a;let g=await Qn(a.card);return g?{...a,card:g}:a}async compileControls(i,a){var g;try{let b=mt(i),W=this.preprocessTranslationPatterns(JSON.stringify(b));W=this.preprocessFilterTranslationArgs(W);let I=this.templateEngine.parse(W),U=this.getWorkflow(a.workflowId),Q={workflow:{workflowId:U.workflowId,name:U.name,description:U.description,tags:U.tags,severity:U.severity},payload:a.payload,subscriber:a.subscriber,...a.actor&&{actor:a.actor},context:a.context,steps:Js(a.state),env:(g=a.env)!=null?g:{}},ae=await this.templateEngine.render(I,Q),ke=this.postprocessTranslationMarkers(ae),Se=Ks(ke),pe=JSON.parse(Se),Re=yt(pe);return Ei(Re)}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(g){throw this.log(` ${Te.ERROR} Failed to preview stepId: \`${a.stepId}\``),pt(g)?g:new pr(a.stepId,i.action,g)}}async constructStepForPreview(i,a){return i.stepId===a.stepId?await this.previewRequiredStep(a,i):await this.extractMockDataForPreviousSteps(i,a)}async extractMockDataForPreviousSteps(i,a){let g={},b=this.getStepState(i,a.stepId),W=this.mock(a.results.schema);return{outputs:Xn(W,(b==null?void 0:b.outputs)||{}),providers:await this.executeProviders(i,a,g,{})}}async previewRequiredStep(i,a){let g=await this.createStepControls(i,a),b=await this.compileControls(g,a),W=await i.resolve(b),I=await this.normalizeChatCardOutput(i,W),U=await this.validate(I,i.outputs.unknownSchema,"step","output",a.workflowId,i.stepId);return this.log(` ${Te.MOCK} Mocked stepId: \`${i.stepId}\``),{outputs:U,providers:await this.executeProviders(a,i,U,b)}}getStepState(i,a){return i.state.find(g=>g.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 g;if(i)a?g=this.getStepCode(i,a):g=this.getWorkflowCode(i);else throw new dr(i);return g}};function Js(w){let i={};for(let a of w)i[a.stepId]=a.outputs;return i}function Gs(w){return!!(typeof w=="string"||typeof w=="object"&&w!==null&&zn(w)||typeof w=="object"&&w!==null&&("markdown"in w||"card"in w||"files"in w))}function zs(w,i){return w}function Qs(w,i){var a;for(let g of w){let b=g.toolData;if(g.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 bi(w){var W;let i=new ii(w.bridge,w.secretKey,w.agent.handlers.toolApproval),{agent:a,event:g,logger:b}=w;try{i.queueRunStart(),await Xs(a,g,i),await i.flush(),await i.emitRunFinish({outcome:"completed"})}catch(I){let U=It(I);b==null||b.error(`[agent:${a.id}] Turn failed (${g}): ${U.message}`,(W=U.cause)!=null?W:U);let Q=!1;if(a.handlers.onError)try{let ae=await a.handlers.onError(U,zs(i,g));ri(ae)?Q=!0:Gs(ae)&&(await i.reply(ae),Q=!0)}catch(ae){b==null||b.error(`[agent:${a.id}] onError failed:`,ae)}Q?await i.emitRunFinish({outcome:"completed"}):await i.reportTurnError(U.message)}finally{try{await i.typing.stop(),await i.flush()}catch{}}}async function Xs(w,i,a){var b,W;let g=async I=>{I instanceof ti||I===void 0||await a.reply(I)};switch(i){case"onMessage":{await g(await w.handlers.onMessage(a.message,a));break}case"onAction":{let I=ni((b=a.action)==null?void 0:b.id);if(I&&w.handlers.onToolApproval){let{approved:U,approvalId:Q}=I,ae=Qs(a.history,Q),ke=ae?{id:ae.toolCallId,name:ae.name,input:ae.input}:{id:Q,name:""},Se=a.createReplyHandle((W=a.action.sourceMessageId)!=null?W:""),pe={toolCall:ke,approved:U,approvalMessage:Se};w.userOnToolApproval===!1&&(await a.typing(),a.action.sourceMessageId&&await Se.delete());let Re=await w.handlers.onToolApproval(pe,a);await g(Re);break}w.handlers.onAction&&await g(await w.handlers.onAction(a.action,a));break}case"onReaction":w.handlers.onReaction&&await g(await w.handlers.onReaction(a.reaction,a));break;case"onResolve":w.handlers.onResolve&&await g(await w.handlers.onResolve(a));break;default:throw new dt(i,ei)}}function Ti(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 U=W.slice(0,I),Q=W.slice(I+1);U&&Q&&!(U in i)&&(i[U]=Q)}let a=i.t,g=a!==void 0?Number(a):Number.NaN;return{t:Number.isFinite(g)?g: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.waitUntil=i.waitUntil,this.client.addAgents(this.agents)}createHandler(){return async(...i)=>{await this.client.addWorkflows(this.workflows);let a=await this.handler(...i),g=await this.handleAction({actions:a});return a.transformResponse(g)}}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.13.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}){var Se;let a=await i.url(),g=await i.method(),b=a.searchParams.get("action")||"health-check",W=a.searchParams.get("workflowId")||"",I=a.searchParams.get("stepId")||"",U=a.searchParams.get("agentId")||"",Q=a.searchParams.get("event")||"",ae=await i.headers("novu-signature")||"",ke={};try{g==="POST"&&(ke=await i.body())}catch{}try{b!=="health-check"&&await this.validateHmac(ke,ae);let pe=this.getPostActionMap(ke,W,I,b,U,Q,(Se=this.waitUntil)!=null?Se:i.waitUntil),Re=this.getGetActionMap(W,I);if(g==="POST")return await this.handlePostAction(b,pe);if(g==="GET")return await this.handleGetAction(b,Re);if(g==="OPTIONS")return this.createResponse(200,{})}catch(pe){return this.handleError(pe)}return this.createError(new Wn(g))}getPostActionMap(i,a,g,b,W,I,U){return{trigger:this.triggerAction({workflowId:a,...i}),execute:async()=>{let Q=await this.client.executeWorkflow({...i,workflowId:a,stepId:g,action:b});return this.createResponse(200,Q)},preview:async()=>{let Q=await this.client.executeWorkflow({...i,workflowId:a,stepId:g,action:b});return this.createResponse(200,Q)},"agent-event":async()=>{let Q=this.client.getAgent(W);if(!Q)return this.createResponse(404,{error:`Agent '${W}' not registered`});let ae=bi({agent:Q,event:I,bridge:i,secretKey:this.client.secretKey,logger:this.client.logger});return U?U(ae):this.warnOnUnprotectedServerlessRuntime(W),this.createResponse(200,{status:"ack"})}}}warnOnUnprotectedServerlessRuntime(i){let a;try{process.env.AWS_LAMBDA_FUNCTION_NAME?a="AWS Lambda":process.env.VERCEL&&(a="Vercel")}catch{}a&&this.client.logger.warn(`[agent:${i}] Agent event acknowledged without a \`waitUntil\` primitive while running on ${a}. The runtime may freeze once the response is sent, silently dropping the rest of the agent turn. Pass \`waitUntil\` to \`serve()\` (e.g. \`serve({ agents, waitUntil })\`) to extend the invocation lifetime.`)}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},...i.agentId!==void 0&&{agentId:i.agentId}},g=await this.http.post("/events/trigger",a);return this.createResponse(200,g)}}getGetActionMap(i,a){return{discover:async()=>{let g=await this.client.discover();return this.createResponse(200,g)},"health-check":async()=>{let g=await this.client.healthCheck();return this.createResponse(200,g)},code:async()=>{let g=await this.client.getCode(i,a);return this.createResponse(200,g)}}}async handlePostAction(i,a){if(Object.values(Mt).includes(i)){let g=a[i];return g()}else throw new dt(i,Mt)}async handleGetAction(i,a){if(Object.values(cr).includes(i)){let g=a[i];return g()}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 g=Ti(a);if(!g.v1||g.t===void 0)throw new Vn;let b=Date.now();if(g.t<b-3e5||g.t>b+3e5)throw new qn;let W=await pi(this.client.secretKey,`${g.t}.${JSON.stringify(i)}`);if(!di(W,g.v1))throw new jn}};function Ri(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 it(w,i,a){if(w.steps.some(g=>g.stepId===i))throw new Gn(i);w.steps.push(a)}async function Ft(w,i,a,g){return async(b,W,I={})=>{let U=(I==null?void 0:I.controlSchema)||xe;return await it(w,b,{stepId:b,type:i,controls:{schema:await Me(U),unknownSchema:U},outputs:{schema:await Me(a),unknownSchema:a},results:{schema:await Me(g),unknownSchema:g},resolve:W,code:W.toString(),options:I,providers:[]}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}async function ki(w,i,a){let g=hr[i],b=Object.entries(a).map(async([W,I])=>{let U=g[W];return{type:W,code:I.toString(),resolve:I,outputs:{schema:await Me(U.output),unknownSchema:U.output}}});w.providers.push(...await Promise.all(b))}async function Xe(w,i,a,g){return async(b,W,I={})=>{let U=(I==null?void 0:I.controlSchema)||xe,Q={stepId:b,type:i,controls:{schema:await Me(U),unknownSchema:U},outputs:{schema:await Me(a),unknownSchema:a},results:{schema:await Me(g),unknownSchema:g},resolve:W,code:W.toString(),options:I,providers:[]};return await it(w,b,Q),Object.keys(I.providers||{}).length>0&&await ki(Q,i,I.providers||{}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}async function Ar(w,i){return async(a,g,b={})=>{let W=(b==null?void 0:b.controlSchema)||xe,I=(b==null?void 0:b.outputSchema)||xe,[U,Q]=await Promise.all([Me(W),Me(I)]);return await it(w,a,{stepId:a,type:i,controls:{schema:U,unknownSchema:W},outputs:{schema:Q,unknownSchema:I},results:{schema:Q,unknownSchema:I},resolve:g,code:g.toString(),options:b,providers:[]}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}var po={email:"email",sms:"sms",push:"push",inApp:"in_app",chat:"chat",tool:"tool"};function _i(w){if(!w)return{};let i={};return w.all&&(i.all=w.all),Object.entries(w.channels||{}).forEach(([a,g])=>{let b=po[a];b&&(i.channels||(i.channels={}),i.channels[b]=g)}),i}function go(w,i,a){let g=a||{};return{id:w,trigger:async I=>{let U=Lt(Dt(I.secretKey),$t(I.apiUrl)),Q=I.payload||{},ae;if(g.payloadSchema){let Le=await Pt(g.payloadSchema,Q);if(Le.success===!1)throw new $n(w,Le.errors);ae=Le.data}else ae=I.payload;let ke=await hi(),Se={name:w,to:I.to,payload:{...ae},...I.transactionId&&{transactionId:I.transactionId},...I.overrides&&{overrides:I.overrides},...I.actor&&{actor:I.actor},...I.context&&{context:I.context},...I.agentId!==void 0&&{agentId:I.agentId},...ke&&{bridgeUrl:ke}},pe=await U.post("/events/trigger",Se);return{cancel:async()=>U.delete(`/events/trigger/${pe.transactionId}`),data:pe}},discover:async()=>{var U;let I={workflowId:w,severity:(U=g.severity)!=null?U:"none",steps:[],code:i.toString(),payload:{schema:await Me(g.payloadSchema||xe),unknownSchema:g.payloadSchema||xe},controls:{schema:await Me(g.controlSchema||xe),unknownSchema:g.controlSchema||xe},env:{schema:await Me(g.envSchema||xe),unknownSchema:g.envSchema||xe},tags:g.tags||[],preferences:_i(g.preferences),name:g.name,description:g.description,execute:i};return await i({payload:{},subscriber:{},env:{},controls:{},context:{},step:{push:await Xe(I,"push",De.push.output,De.push.result),chat:await Xe(I,"chat",De.chat.output,De.chat.result),email:await Xe(I,"email",De.email.output,De.email.result),sms:await Xe(I,"sms",De.sms.output,De.sms.result),inApp:await Xe(I,"in_app",De.in_app.output,De.in_app.result),tool:await Xe(I,"tool",De.tool.output,De.tool.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{Io as a,wt as b,Sr as c,Ri as d,go as e};
98
+ `)}async executeProviders(i,a,g,b){return a.providers.reduce(async(W,I)=>{let U=await W,Q=await this.runProvider(i,a,I,g,b);return{...U,[I.type]:Q}},Promise.resolve({}))}async runProvider(i,a,g,b,W){let I=i.action==="preview";if(i.stepId!==a.stepId)return I?(this.log(` ${Te.MOCK} Mocked provider: \`${g.type}\``),this.mock(g.outputs.schema)):(this.log(` ${Te.HYDRATED} Hydrated provider: \`${g.type}\``),{});try{return await this.resolveProviderOutput(i,a,g,W,b)}catch(U){if(this.log(` ${Te.ERROR} Failed to execute provider: \`${g.type}\``),I)return this.log(` ${Te.MOCK} Mocked provider: \`${g.type}\``),this.mock(g.outputs.schema);throw new Hn(g.type,i.action,U)}}async resolveProviderOutput(i,a,g,b,W){let I=await g.resolve({controls:b,outputs:W}),U=await this.validate(I,g.outputs.unknownSchema,"step","output",i.workflowId,a.stepId,g.type);return this.log(` ${Te.SUCCESS} Executed provider: \`${g.type}\``),{...U,_passthrough:I._passthrough}}async executeStep(i,a){if(i.stepId===a.stepId)try{let g=await this.createStepControls(a,i),b=await this.compileControls(g,i),W=await a.resolve(b),I=await this.normalizeChatCardOutput(a,W),U=await this.validate(I,a.outputs.unknownSchema,"step","output",i.workflowId,a.stepId),Q=await this.executeProviders(i,a,U,b);return this.log(` ${Te.SUCCESS} Executed stepId: \`${a.stepId}\``),{outputs:U,providers:Q}}catch(g){throw this.log(` ${Te.ERROR} Failed to execute stepId: \`${a.stepId}\``),pt(g)?g:new pr(a.stepId,i.action,g)}else try{let g=this.getStepState(i,a.stepId);if(g){let b=await this.validate(g.outputs,a.results.unknownSchema,"step","result",i.workflowId,a.stepId);return this.log(` ${Te.HYDRATED} Hydrated stepId: \`${a.stepId}\``),{outputs:b,providers:await this.executeProviders(i,a,b,{})}}else throw new Cn(i.workflowId,a.stepId)}catch(g){throw this.log(` ${Te.ERROR} Failed to hydrate stepId: \`${a.stepId}\``),g}}async normalizeChatCardOutput(i,a){if(i.type!=="chat"||(a==null?void 0:a.card)==null)return a;let g=await Qn(a.card);return g?{...a,card:g}:a}async compileControls(i,a){var g;try{let b=mt(i),W=this.preprocessTranslationPatterns(JSON.stringify(b));W=this.preprocessFilterTranslationArgs(W);let I=this.templateEngine.parse(W),U=this.getWorkflow(a.workflowId),Q={workflow:{workflowId:U.workflowId,name:U.name,description:U.description,tags:U.tags,severity:U.severity},payload:a.payload,subscriber:a.subscriber,...a.actor&&{actor:a.actor},context:a.context,steps:Js(a.state),env:(g=a.env)!=null?g:{}},ae=await this.templateEngine.render(I,Q),ke=this.postprocessTranslationMarkers(ae),Se=Ks(ke),pe=JSON.parse(Se),Re=yt(pe);return Ei(Re)}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(g){throw this.log(` ${Te.ERROR} Failed to preview stepId: \`${a.stepId}\``),pt(g)?g:new pr(a.stepId,i.action,g)}}async constructStepForPreview(i,a){return i.stepId===a.stepId?await this.previewRequiredStep(a,i):await this.extractMockDataForPreviousSteps(i,a)}async extractMockDataForPreviousSteps(i,a){let g={},b=this.getStepState(i,a.stepId),W=this.mock(a.results.schema);return{outputs:Xn(W,(b==null?void 0:b.outputs)||{}),providers:await this.executeProviders(i,a,g,{})}}async previewRequiredStep(i,a){let g=await this.createStepControls(i,a),b=await this.compileControls(g,a),W=await i.resolve(b),I=await this.normalizeChatCardOutput(i,W),U=await this.validate(I,i.outputs.unknownSchema,"step","output",a.workflowId,i.stepId);return this.log(` ${Te.MOCK} Mocked stepId: \`${i.stepId}\``),{outputs:U,providers:await this.executeProviders(a,i,U,b)}}getStepState(i,a){return i.state.find(g=>g.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 g;if(i)a?g=this.getStepCode(i,a):g=this.getWorkflowCode(i);else throw new dr(i);return g}};function Js(w){let i={};for(let a of w)i[a.stepId]=a.outputs;return i}function Gs(w){return!!(typeof w=="string"||typeof w=="object"&&w!==null&&zn(w)||typeof w=="object"&&w!==null&&("markdown"in w||"card"in w||"files"in w))}function zs(w,i){return w}function Qs(w,i){var a;for(let g of w){let b=g.toolData;if(g.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 bi(w){var W;let i=new ii(w.bridge,w.secretKey,w.agent.handlers.toolApproval),{agent:a,event:g,logger:b}=w;try{i.queueRunStart(),await Xs(a,g,i),await i.flush(),await i.emitRunFinish({outcome:"completed"})}catch(I){let U=It(I);b==null||b.error(`[agent:${a.id}] Turn failed (${g}): ${U.message}`,(W=U.cause)!=null?W:U);let Q=!1;if(a.handlers.onError)try{let ae=await a.handlers.onError(U,zs(i,g));ri(ae)?Q=!0:Gs(ae)&&(await i.reply(ae),Q=!0)}catch(ae){b==null||b.error(`[agent:${a.id}] onError failed:`,ae)}Q?await i.emitRunFinish({outcome:"completed"}):await i.reportTurnError(U.message)}finally{try{await i.typing.stop(),await i.flush()}catch{}}}async function Xs(w,i,a){var b,W;let g=async I=>{I instanceof ti||I===void 0||await a.reply(I)};switch(i){case"onMessage":{await g(await w.handlers.onMessage(a.message,a));break}case"onAction":{let I=ni((b=a.action)==null?void 0:b.id);if(I&&w.handlers.onToolApproval){let{approved:U,approvalId:Q}=I,ae=Qs(a.history,Q),ke=ae?{id:ae.toolCallId,name:ae.name,input:ae.input}:{id:Q,name:""},Se=a.createReplyHandle((W=a.action.sourceMessageId)!=null?W:""),pe={toolCall:ke,approved:U,approvalMessage:Se};w.userOnToolApproval===!1&&(await a.typing(),a.action.sourceMessageId&&await Se.delete());let Re=await w.handlers.onToolApproval(pe,a);await g(Re);break}w.handlers.onAction&&await g(await w.handlers.onAction(a.action,a));break}case"onReaction":w.handlers.onReaction&&await g(await w.handlers.onReaction(a.reaction,a));break;case"onResolve":w.handlers.onResolve&&await g(await w.handlers.onResolve(a));break;default:throw new dt(i,ei)}}function Ti(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 U=W.slice(0,I),Q=W.slice(I+1);U&&Q&&!(U in i)&&(i[U]=Q)}let a=i.t,g=a!==void 0?Number(a):Number.NaN;return{t:Number.isFinite(g)?g: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.waitUntil=i.waitUntil,this.client.addAgents(this.agents)}createHandler(){return async(...i)=>{await this.client.addWorkflows(this.workflows);let a=await this.handler(...i),g=await this.handleAction({actions:a});return a.transformResponse(g)}}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.13.2","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}){var Se;let a=await i.url(),g=await i.method(),b=a.searchParams.get("action")||"health-check",W=a.searchParams.get("workflowId")||"",I=a.searchParams.get("stepId")||"",U=a.searchParams.get("agentId")||"",Q=a.searchParams.get("event")||"",ae=await i.headers("novu-signature")||"",ke={};try{g==="POST"&&(ke=await i.body())}catch{}try{b!=="health-check"&&await this.validateHmac(ke,ae);let pe=this.getPostActionMap(ke,W,I,b,U,Q,(Se=this.waitUntil)!=null?Se:i.waitUntil),Re=this.getGetActionMap(W,I);if(g==="POST")return await this.handlePostAction(b,pe);if(g==="GET")return await this.handleGetAction(b,Re);if(g==="OPTIONS")return this.createResponse(200,{})}catch(pe){return this.handleError(pe)}return this.createError(new Wn(g))}getPostActionMap(i,a,g,b,W,I,U){return{trigger:this.triggerAction({workflowId:a,...i}),execute:async()=>{let Q=await this.client.executeWorkflow({...i,workflowId:a,stepId:g,action:b});return this.createResponse(200,Q)},preview:async()=>{let Q=await this.client.executeWorkflow({...i,workflowId:a,stepId:g,action:b});return this.createResponse(200,Q)},"agent-event":async()=>{let Q=this.client.getAgent(W);if(!Q)return this.createResponse(404,{error:`Agent '${W}' not registered`});let ae=bi({agent:Q,event:I,bridge:i,secretKey:this.client.secretKey,logger:this.client.logger});return U?U(ae):this.warnOnUnprotectedServerlessRuntime(W),this.createResponse(200,{status:"ack"})}}}warnOnUnprotectedServerlessRuntime(i){let a;try{process.env.AWS_LAMBDA_FUNCTION_NAME?a="AWS Lambda":process.env.VERCEL&&(a="Vercel")}catch{}a&&this.client.logger.warn(`[agent:${i}] Agent event acknowledged without a \`waitUntil\` primitive while running on ${a}. The runtime may freeze once the response is sent, silently dropping the rest of the agent turn. Pass \`waitUntil\` to \`serve()\` (e.g. \`serve({ agents, waitUntil })\`) to extend the invocation lifetime.`)}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},...i.agentId!==void 0&&{agentId:i.agentId}},g=await this.http.post("/events/trigger",a);return this.createResponse(200,g)}}getGetActionMap(i,a){return{discover:async()=>{let g=await this.client.discover();return this.createResponse(200,g)},"health-check":async()=>{let g=await this.client.healthCheck();return this.createResponse(200,g)},code:async()=>{let g=await this.client.getCode(i,a);return this.createResponse(200,g)}}}async handlePostAction(i,a){if(Object.values(Mt).includes(i)){let g=a[i];return g()}else throw new dt(i,Mt)}async handleGetAction(i,a){if(Object.values(cr).includes(i)){let g=a[i];return g()}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 g=Ti(a);if(!g.v1||g.t===void 0)throw new Vn;let b=Date.now();if(g.t<b-3e5||g.t>b+3e5)throw new qn;let W=await pi(this.client.secretKey,`${g.t}.${JSON.stringify(i)}`);if(!di(W,g.v1))throw new jn}};function Ri(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 it(w,i,a){if(w.steps.some(g=>g.stepId===i))throw new Gn(i);w.steps.push(a)}async function Ft(w,i,a,g){return async(b,W,I={})=>{let U=(I==null?void 0:I.controlSchema)||xe;return await it(w,b,{stepId:b,type:i,controls:{schema:await Me(U),unknownSchema:U},outputs:{schema:await Me(a),unknownSchema:a},results:{schema:await Me(g),unknownSchema:g},resolve:W,code:W.toString(),options:I,providers:[]}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}async function ki(w,i,a){let g=hr[i],b=Object.entries(a).map(async([W,I])=>{let U=g[W];return{type:W,code:I.toString(),resolve:I,outputs:{schema:await Me(U.output),unknownSchema:U.output}}});w.providers.push(...await Promise.all(b))}async function Xe(w,i,a,g){return async(b,W,I={})=>{let U=(I==null?void 0:I.controlSchema)||xe,Q={stepId:b,type:i,controls:{schema:await Me(U),unknownSchema:U},outputs:{schema:await Me(a),unknownSchema:a},results:{schema:await Me(g),unknownSchema:g},resolve:W,code:W.toString(),options:I,providers:[]};return await it(w,b,Q),Object.keys(I.providers||{}).length>0&&await ki(Q,i,I.providers||{}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}async function Ar(w,i){return async(a,g,b={})=>{let W=(b==null?void 0:b.controlSchema)||xe,I=(b==null?void 0:b.outputSchema)||xe,[U,Q]=await Promise.all([Me(W),Me(I)]);return await it(w,a,{stepId:a,type:i,controls:{schema:U,unknownSchema:W},outputs:{schema:Q,unknownSchema:I},results:{schema:Q,unknownSchema:I},resolve:g,code:g.toString(),options:b,providers:[]}),{_ctx:{timestamp:Date.now(),state:{status:"pending",error:!1}}}}}var po={email:"email",sms:"sms",push:"push",inApp:"in_app",chat:"chat",tool:"tool"};function _i(w){if(!w)return{};let i={};return w.all&&(i.all=w.all),Object.entries(w.channels||{}).forEach(([a,g])=>{let b=po[a];b&&(i.channels||(i.channels={}),i.channels[b]=g)}),i}function go(w,i,a){let g=a||{};return{id:w,trigger:async I=>{let U=Lt(Dt(I.secretKey),$t(I.apiUrl)),Q=I.payload||{},ae;if(g.payloadSchema){let Le=await Pt(g.payloadSchema,Q);if(Le.success===!1)throw new $n(w,Le.errors);ae=Le.data}else ae=I.payload;let ke=await hi(),Se={name:w,to:I.to,payload:{...ae},...I.transactionId&&{transactionId:I.transactionId},...I.overrides&&{overrides:I.overrides},...I.actor&&{actor:I.actor},...I.context&&{context:I.context},...I.agentId!==void 0&&{agentId:I.agentId},...ke&&{bridgeUrl:ke}},pe=await U.post("/events/trigger",Se);return{cancel:async()=>U.delete(`/events/trigger/${pe.transactionId}`),data:pe}},discover:async()=>{var U;let I={workflowId:w,severity:(U=g.severity)!=null?U:"none",steps:[],code:i.toString(),payload:{schema:await Me(g.payloadSchema||xe),unknownSchema:g.payloadSchema||xe},controls:{schema:await Me(g.controlSchema||xe),unknownSchema:g.controlSchema||xe},env:{schema:await Me(g.envSchema||xe),unknownSchema:g.envSchema||xe},tags:g.tags||[],preferences:_i(g.preferences),name:g.name,description:g.description,execute:i};return await i({payload:{},subscriber:{},env:{},controls:{},context:{},step:{push:await Xe(I,"push",De.push.output,De.push.result),chat:await Xe(I,"chat",De.chat.output,De.chat.result),email:await Xe(I,"email",De.email.output,De.email.result),sms:await Xe(I,"sms",De.sms.output,De.sms.result),inApp:await Xe(I,"in_app",De.in_app.output,De.in_app.result),tool:await Xe(I,"tool",De.tool.output,De.tool.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{Io as a,wt as b,Sr as c,Ri as d,go as e};
package/dist/esm/index.js CHANGED
@@ -1 +1 @@
1
- import{b as m,c as q,d as r,e as u}from"./chunk-PBC7WR2R.js";import{a as v}from"./chunk-YLCLZVYS.js";import"./chunk-XIVU4VDS.js";import{N as n,O as o,P as p,W as t}from"./chunk-4ETX7FIT.js";import{a,b,c,d,e,f,i as g,p as h,q as i,r as j}from"./chunk-X5AZIKIR.js";import"./chunk-RBTQQ5IZ.js";import{a as s}from"./chunk-IREH6K2M.js";import{f as k}from"./chunk-VY27ZAO7.js";import{b as l}from"./chunk-PU74XQ2P.js";import"./chunk-FHYMHX3T.js";export{a as Actions,o as AgentDeliveryError,n as AgentError,b as Button,c as Card,d as CardLink,e as CardText,m as Client,k as CronExpression,f as Divider,g as Image,q as NovuRequestHandler,h as Select,i as SelectOption,t as SeverityLevelEnum,j as TextInput,r as agent,l as isFromWorkflow,s as providerSchemas,v as step,p as toAgentError,u as workflow};
1
+ import{b as m,c as q,d as r,e as u}from"./chunk-JLKEQIWC.js";import{a as v}from"./chunk-YLCLZVYS.js";import"./chunk-XIVU4VDS.js";import{N as n,O as o,P as p,W as t}from"./chunk-4ETX7FIT.js";import{a,b,c,d,e,f,i as g,p as h,q as i,r as j}from"./chunk-X5AZIKIR.js";import"./chunk-RBTQQ5IZ.js";import{a as s}from"./chunk-IREH6K2M.js";import{f as k}from"./chunk-VY27ZAO7.js";import{b as l}from"./chunk-PU74XQ2P.js";import"./chunk-FHYMHX3T.js";export{a as Actions,o as AgentDeliveryError,n as AgentError,b as Button,c as Card,d as CardLink,e as CardText,m as Client,k as CronExpression,f as Divider,g as Image,q as NovuRequestHandler,h as Select,i as SelectOption,t as SeverityLevelEnum,j as TextInput,r as agent,l as isFromWorkflow,s as providerSchemas,v as step,p as toAgentError,u as workflow};