@holocronlab/botruntime-sdk 6.13.3 → 6.13.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var pt=Object.create;var Y=Object.defineProperty;var ft=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var ht=Object.getPrototypeOf,yt=Object.prototype.hasOwnProperty;var W=(n,e)=>{for(var t in e)Y(n,t,{get:e[t],enumerable:!0})},Se=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of mt(e))!yt.call(n,i)&&i!==t&&Y(n,i,{get:()=>e[i],enumerable:!(s=ft(e,i))||s.enumerable});return n};var he=(n,e,t)=>(t=n!=null?pt(ht(n)):{},Se(e||!n||!n.__esModule?Y(t,"default",{value:n,enumerable:!0}):t,n)),Tt=n=>Se(Y({},"__esModule",{value:!0}),n);var yn={};W(yn,{Bot:()=>de,BotDefinition:()=>ce,BotLogger:()=>Z,BotSpecificClient:()=>O,Integration:()=>re,IntegrationDefinition:()=>ee,IntegrationLogger:()=>F,IntegrationSpecificClient:()=>N,InterfaceDefinition:()=>ge,OAUTH_IDENTIFIER_HEADER:()=>Bt,Plugin:()=>pe,PluginDefinition:()=>ue,RuntimeError:()=>fe.RuntimeError,WELL_KNOWN_ATTRIBUTES:()=>kt,errors:()=>_e,handlerErrorToHttpResponse:()=>V,isApiError:()=>fe.isApiError,messages:()=>ye,parseBody:()=>P,serve:()=>q,version:()=>Ee,z:()=>d.z});module.exports=Tt(yn);var ye={};W(ye,{defaults:()=>Pt,markdown:()=>bt,markdownBloc:()=>wt});var _n=require("@holocronlab/botruntime-zui"),d=require("@holocronlab/botruntime-zui");var T=d.z.string().min(1),Oe=d.z.object({text:T}),Ce=d.z.object({markdown:T}),Re=d.z.object({imageUrl:T,title:T.optional()}),Ae=d.z.object({audioUrl:T,title:T.optional()}),De=d.z.object({videoUrl:T,title:T.optional()}),Me=d.z.object({fileUrl:T,title:T.optional()}),Ue=d.z.object({latitude:d.z.number(),longitude:d.z.number(),address:d.z.string().optional(),title:d.z.string().optional()}),We=d.z.object({title:T,subtitle:T.optional(),imageUrl:T.optional(),actions:d.z.array(d.z.object({action:d.z.enum(["postback","url","say"]),label:T,value:T}))}),He=d.z.object({text:T,options:d.z.array(d.z.object({label:T,value:T}))}),_t=d.z.object({items:d.z.array(We)}),je=d.z.union([d.z.object({type:d.z.literal("text"),payload:Oe}),d.z.object({type:d.z.literal("image"),payload:Re}),d.z.object({type:d.z.literal("audio"),payload:Ae}),d.z.object({type:d.z.literal("video"),payload:De}),d.z.object({type:d.z.literal("file"),payload:Me}),d.z.object({type:d.z.literal("location"),payload:Ue})]),vt=d.z.object({items:d.z.array(je)}),bt={schema:Ce},wt={schema:d.z.object({items:d.z.array(d.z.union([...je.options,d.z.object({type:d.z.literal("markdown"),payload:Ce})]))})},Pt={text:{schema:Oe},image:{schema:Re},audio:{schema:Ae},video:{schema:De},file:{schema:Me},location:{schema:Ue},carousel:{schema:_t},card:{schema:We},dropdown:{schema:He},choice:{schema:He},bloc:{schema:vt}};var kt={HIDDEN_IN_STUDIO:{bpActionHiddenInStudio:"true"},AWAIT_RETURN:{bpActionAwaitReturn:"true"}},Bt="x-bp-integration-identifier";var R=require("@holocronlab/botruntime-client"),Ke=require("browser-or-node");var Te=console;function P(n){if(!n.body)throw new R.InvalidPayloadError("Missing body");try{return JSON.parse(n.body)}catch(e){throw new R.InvalidPayloadError(e instanceof Error?e.message:String(e))}}var V=({thrown:n,unexpectedErrorMessage:e})=>{let t=n instanceof Error?n:new Error(String(n));if((0,R.isApiError)(t)&&(t.type==="Runtime"||t.type==="InvalidPayload"))return{status:t.code,body:JSON.stringify(t.toJSON()),error:t};let s=(0,R.isApiError)(t)?new R.RuntimeError(t.message,t):new R.RuntimeError(e,t);return{status:500,body:JSON.stringify(s.toJSON()),error:s}};async function q(n,e=8072,t=St){if(!Ke.isNode)throw new Error("This function can only be called in Node.js");let i=require("http").createServer(async(a,o)=>{try{let r=await xt(a);if(r.path==="/health"){o.writeHead(200).end("ok");return}let l=await n(r);o.writeHead(l?.status??200,l?.headers??{}).end(l?.body??"{}")}catch(r){let l=r instanceof Error?r.message:String(r);Te.error("Error while handling request",{error:l??"Internal error occured"}),o.writeHead(500).end(JSON.stringify({error:l??"Internal error occured"}))}});return i.listen(e,()=>t(e)),i}async function xt(n){let e=await Et(n),t={};for(let i=0;i<n.rawHeaders.length;i+=2){let a=n.rawHeaders[i].toLowerCase(),o=n.rawHeaders[i+1];t[a]=o}let s=new URL(n.url??"",n.headers.host?`http://${n.headers.host}`:"http://localhost");return{body:e,path:s.pathname,query:It(s.search,"?"),headers:t,method:n.method?.toUpperCase()??"GET"}}function It(n,e){return n.indexOf(e)===0?n.slice(e.length):n}async function Et(n){return new Promise((e,t)=>{if(n.method!=="POST"&&n.method!=="PUT"&&n.method!=="PATCH")return e(void 0);let s="";n.on("data",i=>s+=i.toString()),n.on("error",i=>t(i)),n.on("end",()=>e(s))})}function St(n){Te.info(`Listening on port ${n}`)}var fe=require("@holocronlab/botruntime-client");var _e={};W(_e,{DefinitionError:()=>w,isDefinitionError:()=>Ht});var w=class extends Error{__IS_SDK_ERROR__=!0;type="definition_error"},Ht=n=>n instanceof w||typeof n=="object"&&n!==null&&"__IS_SDK_ERROR__"in n&&n.__IS_SDK_ERROR__===!0&&"type"in n&&n.type==="definition_error";var y={};W(y,{mapKeys:()=>Rt,mapValues:()=>Ct,mergeRecords:()=>Dt,pairs:()=>X,stripUndefinedProps:()=>At,values:()=>Ot});var X=n=>Object.entries(n),Ot=n=>Object.values(n),Ct=(n,e)=>Object.fromEntries(X(n).map(([t,s])=>[t,e(s,t)])),Rt=(n,e)=>Object.fromEntries(X(n).map(([t,s])=>[e(t),s])),At=n=>Object.fromEntries(X(n).filter(([,e])=>e!==void 0)),Dt=(n,e,t)=>{let s=[...Object.keys(n),...Object.keys(e)],i=[...new Set(s)],a={};for(let o of i){let r=n[o],l=e[o];r&&l?a[o]=t(r,l):r?a[o]=r:l&&(a[o]=l)}return a};var p={};W(p,{safePush:()=>Mt,unique:()=>Ut});var Mt=(n,...e)=>n?[...n,...e]:[...e],Ut=n=>Array.from(new Set(n));var _={};W(_,{setName:()=>Wt});var Wt=(n,e)=>(Object.defineProperty(n,"name",{value:e}),n);var Ne=n=>{let{name:e,version:t}=n,s={actions:{},events:{},channels:{}},i={name:e,version:t,entities:y.mapValues(n.entities,o=>({name:o.name})),actions:{},events:{},channels:{}},a=y.mapValues(n.entities,o=>o.schema);for(let[o,r]of Object.entries(n.definition.actions??{})){let l=r.input.schema.dereference(a),c=r.output.schema.dereference(a),g=n.actions?.[o]?.name??o;s.actions[g]={...r,...n.actions?.[o]??{},input:{schema:l},output:{schema:c}},i.actions[o]={name:g}}for(let[o,r]of Object.entries(n.definition.events??{})){let l=r.schema.dereference(a),c=n.events?.[o]?.name??o;s.events[c]={...r,...n.events?.[o]??{},schema:l},i.events[o]={name:c}}for(let[o,r]of Object.entries(n.definition.channels??{})){let l={};for(let[g,u]of Object.entries(r.messages)){let f=u.schema.dereference(a);l[g]={...u,schema:f}}let c=n.channels?.[o]?.name??o;s.channels[c]={...r,...n.channels?.[o]??{},message:{...r.message??{},tags:{...r.message?.tags??{},...n.channels?.[o]?.message?.tags??{}}},conversation:{...r.conversation??{},tags:{...r.conversation?.tags??{},...n.channels?.[o]?.conversation?.tags??{}}},messages:l},i.channels[o]={name:c}}return{resolved:s,statement:i}};var ze="6.13.3";var D=ze;var Q=Symbol("schemaName"),Fe=n=>n?y.mapValues(n,(t,s)=>({...t,[Q]:s})):{},Ze=n=>Q in n&&n[Q]!==void 0,Ge=n=>n[Q];var ee=class n{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.icon=e.icon,this.readme=e.readme,this.title=e.title,this.identifier=e.identifier,this.description=e.description,this.configuration=e.configuration,this.configurations=e.configurations,this.events=e.events,this.actions=e.actions,this.channels=e.channels,this.states=e.states,this.user=e.user,this.secrets=e.secrets,this.entities=e.entities,this.interfaces=e.interfaces,this.__advanced=e.__advanced,this.attributes=e.attributes,this.network=e.network}name;version;title;description;icon;readme;configuration;configurations;events;actions;channels;states;user;secrets;identifier;entities;interfaces;__advanced;attributes;network;get metadata(){return{sdkVersion:D}}clone=e=>new n({...this.props,actions:this.actions,events:this.events,channels:this.channels,interfaces:this.interfaces,...e});extend(e,t){let{entities:s,actions:i,events:a,channels:o}=this._callBuilder(e,t),r=this;r.interfaces??={};let l=Object.values(s).map(f=>f.name),c=l.length===0?e.name:`${e.name}<${l.join(",")}>`,{resolved:g,statement:u}=Ne({...e,entities:s,actions:y.stripUndefinedProps(i),events:y.stripUndefinedProps(a),channels:y.stripUndefinedProps(o)});return r.actions=y.mergeRecords(r.actions??{},g.actions,this._mergeActions),r.channels=y.mergeRecords(r.channels??{},g.channels,this._mergeChannels),r.events=y.mergeRecords(r.events??{},g.events,this._mergeEvents),r.interfaces[c]={id:e.id,...u},this}_callBuilder(e,t){let i={entities:Fe(this.entities)},a=t(i),o=y.pairs(a.entities).find(([l,c])=>!Ze(c));if(o)throw new w(`Cannot extend interface "${e.name}" with entity "${o[0]}"; the provided schema is not part of the integration's entities.`);return{entities:y.mapValues(a.entities,l=>({name:Ge(l),schema:l.schema})),actions:a.actions??{},events:a.events??{},channels:a.channels??{}}}_mergeActions=(e,t)=>({...e,...t,input:{schema:this._mergeObjectSchemas(e.input.schema,t.input.schema)},output:{schema:this._mergeObjectSchemas(e.output.schema,t.output.schema)}});_mergeEvents=(e,t)=>({...e,...t,schema:this._mergeObjectSchemas(e.schema,t.schema)});_mergeChannels=(e,t)=>{let s=y.mergeRecords(e.messages,t.messages,this._mergeMessage),i;(e.conversation||t.conversation)&&(i={tags:{...e.conversation?.tags,...t.conversation?.tags}});let a;return(e.message||t.message)&&(a={tags:{...e.message?.tags,...t.message?.tags}}),{...e,...t,messages:s,conversation:i,message:a}};_mergeMessage=(e,t)=>({schema:this._mergeObjectSchemas(e.schema,t.schema)});_mergeObjectSchemas=(e,t)=>{let s=e._def,i=t._def;if(s.typeName==="ZodObject"&&i.typeName==="ZodObject"){let a=s.shape(),o=i.shape();return d.z.object({...a,...o})}if(s.typeName==="ZodRecord"&&i.typeName==="ZodRecord")return d.z.record(d.z.intersection(s.valueType,i.valueType));throw new Error("Cannot merge object schemas with record schemas")}};var M=require("@holocronlab/botruntime-client");var Le=he(require("@holocronlab/botruntime-client")),te={retries:3,retryCondition:n=>Le.axiosRetry.isNetworkOrIdempotentRequestError(n)||[429,502].includes(n.response?.status??0),retryDelay:(n,e)=>(Kt(e.response?.headers??{})??n)*1e3},Kt=n=>{let e=["RateLimit-Reset","X-RateLimit-Reset","Retry-After","ratelimit-reset","x-ratelimit-reset","retry-after"];for(let t of e){let s=n[t];if(s!==void 0)return Nt(String(s))}},Nt=n=>{let e=zt(n)?Ft(n):n.length>0?parseInt(n,10):void 0;return e===void 0||isNaN(e)?void 0:e},zt=n=>n.includes(" "),Ft=n=>{let e=Zt(n);if(!e)return;let t=new Date;return Math.max(0,Math.floor((e.getTime()-t.getTime())/1e3))},Zt=n=>{let e=new Date(n);return isNaN(e.getTime())?void 0:e};var N=class{constructor(e){this._client=e}get _inner(){return this._client}createConversation=(e=>this._client.createConversation(e));getConversation=(e=>this._client.getConversation(e));listConversations=(e=>this._client.listConversations(e));getOrCreateConversation=(e=>this._client.getOrCreateConversation(e));updateConversation=(e=>this._client.updateConversation(e));deleteConversation=(e=>this._client.deleteConversation(e));listParticipants=(e=>this._client.listParticipants(e));addParticipant=(e=>this._client.addParticipant(e));getParticipant=(e=>this._client.getParticipant(e));removeParticipant=(e=>this._client.removeParticipant(e));createEvent=(e=>this._client.createEvent(e));getEvent=(e=>this._client.getEvent(e));listEvents=(e=>this._client.listEvents(e));createMessage=(e=>this._client.createMessage(e));getOrCreateMessage=(e=>this._client.getOrCreateMessage(e));getMessage=(e=>this._client.getMessage(e).then(t=>t));updateMessage=(e=>this._client.updateMessage(e).then(t=>t));listMessages=(e=>this._client.listMessages(e));deleteMessage=(e=>this._client.deleteMessage(e));initializeIncomingMessage=(e=>this._client.initializeIncomingMessage(e));createUser=(e=>this._client.createUser(e));getUser=(e=>this._client.getUser(e));listUsers=e=>this._client.listUsers(e);getOrCreateUser=(e=>this._client.getOrCreateUser(e));updateUser=(e=>this._client.updateUser(e));deleteUser=e=>this._client.deleteUser(e);getState=(e=>this._client.getState(e));setState=(e=>this._client.setState(e));getOrSetState=(e=>this._client.getOrSetState(e));patchState=(e=>this._client.patchState(e));configureIntegration=e=>this._client.configureIntegration(e);uploadFile=e=>this._client.uploadFile(e);upsertFile=e=>this._client.upsertFile(e);deleteFile=e=>this._client.deleteFile(e);listFiles=e=>this._client.listFiles(e);getFile=e=>this._client.getFile(e);updateFileMetadata=e=>this._client.updateFileMetadata(e);trackAnalytics=e=>this._client.trackAnalytics(e)};var ne=class{_cost=0;get cost(){return this._cost}setCost(e){this._cost=e}toJSON(){return{cost:this.cost}}};var Qe=require("@holocronlab/botruntime-zui");var E="#",se="x-bot-id",$e="x-bot-user-id",Ve="x-integration-id",qe="x-integration-alias",Je="x-webhook-id",Ye="x-bp-configuration-type",ie="x-bp-configuration",oe="x-bp-operation",Xe="x-bp-type";var k=n=>{throw n instanceof Error?n:new Error(n)};var qn=Qe.z.enum(["webhook_received","message_created","action_triggered","register","unregister","ping","create_user","create_conversation"]),et=n=>({botId:n[se]||k("Missing bot header"),botUserId:n[$e]||k("Missing bot user header"),integrationId:n[Ve]||k("Missing integration header"),integrationAlias:n[qe]||k("Missing integration alias header"),webhookId:n[Je]||k("Missing webhook header"),operation:n[oe]||k("Missing operation header"),configurationType:n[Ye]??null,configuration:JSON.parse(Buffer.from(n[ie]||k("Missing configuration header"),"base64").toString("utf-8"))});var tt=he(require("util")),z=class{defaultOptions;constructor(e){this.defaultOptions=e}info(...e){this._log("info",e)}debug(...e){this._log("debug",e)}warn(...e){this._log("warn",e)}error(...e){this._log("error",e)}issue(e){console.info(JSON.stringify({...e,...this.getIssueContext()}))}getIssueContext(){return{}}_log(e,t){this._getConsoleMethod(e)(this._serializeMessage(e,t))}_serializeMessage(e,t){let s=tt.default.format(...t);return process.env.BP_LOG_FORMAT==="json"?this.getJsonMessage(e,s):s}getJsonMessage(e,t){return JSON.stringify({msg:t,level:e,options:this.defaultOptions})}_getConsoleMethod(e){switch(e){case"debug":return console.debug;case"warn":return console.warn;case"error":return console.error;default:return console.info}}};var F=class n extends z{constructor(e){super({visibleToBotOwners:!1,hiddenToIntegrationOwners:!1,...e})}with(e){return new n({...this.defaultOptions,...e})}withUserId(e){return this.with({userId:e})}withConversationId(e){return this.with({conversationId:e})}withVisibleToBotOwners(e){return this.with({visibleToBotOwners:e})}withHiddenToIntegrationOwners(e){return this.with({hiddenToIntegrationOwners:e})}forBot(){return this.with({hiddenToIntegrationOwners:!1,visibleToBotOwners:!0})}forBotOnly(){return this.with({hiddenToIntegrationOwners:!0,visibleToBotOwners:!0})}getJsonMessage(e,t){return JSON.stringify({msg:t,level:e,botId:this.defaultOptions.botId,integrationId:this.defaultOptions.integrationId,integrationAlias:this.defaultOptions.integrationAlias,visible_to_bot_owner:this.defaultOptions.visibleToBotOwners,hidden_to_integration_owner:this.defaultOptions.hiddenToIntegrationOwners,options:this.defaultOptions})}getIssueContext(){let{botId:e,integrationId:t,integrationAlias:s}=this.defaultOptions;return{...e&&{botId:e},...t&&{integrationId:t},...s&&{integrationAlias:s}}}};var Gt=n=>["traceparent","tracestate"].reduce((e,t)=>(n[t]&&(e[t]=n[t]),e),{}),Lt=(n,e,t)=>{let[,s]=(e.headers.traceparent||"").split("-"),i=new M.Client({botId:n.botId,integrationId:n.integrationId,integrationAlias:n.integrationAlias,retry:te,headers:t.managesOwnTracePropagation?{}:Gt(e.headers)}),a=new N(i),o=new F({traceId:s,botId:n.botId,integrationId:n.integrationId,integrationAlias:n.integrationAlias});return{ctx:n,req:e,client:a,logger:o,instance:t}},$t=async n=>{let{ctx:e}=n;switch(e.operation){case"webhook_received":return await qt(n);case"register":return await Jt(n);case"unregister":return await Yt(n);case"message_created":return await en(n);case"action_triggered":return await tn(n);case"ping":return await Vt(n);case"create_user":return await Xt(n);case"create_conversation":return await Qt(n);default:throw new M.InvalidPayloadError(`Unknown operation ${e.operation}`)}},nt=n=>async e=>{let t=et(e.headers),s=Lt(t,e,n),{logger:i}=s;try{let a;return a=await nn(s),a?{...a,status:a.status??200}:(a=await $t(s),a?{...a,status:a.status??200}:{status:200})}catch(a){let{status:o,body:r,error:l}=V({thrown:a,unexpectedErrorMessage:"An unexpected error occurred in the integration. Bot owners: Check logs for more informations. Integration owners: throw a RuntimeError to return a custom error message instead."});return o>=500&&console.error(a),i.forBot().error(l.message),{status:o,body:r}}},Vt=async n=>{},qt=async({client:n,ctx:e,req:t,logger:s,instance:i})=>{let{req:a}=P(t);return i.webhook({client:n,ctx:e,req:a,logger:s})},Jt=async({client:n,ctx:e,req:t,logger:s,instance:i})=>{if(!i.register)return;let{webhookUrl:a}=P(t);await i.register({client:n,ctx:e,webhookUrl:a,logger:s})},Yt=async({client:n,ctx:e,req:t,logger:s,instance:i})=>{if(!i.unregister)return;let{webhookUrl:a}=P(t);await i.unregister({ctx:e,webhookUrl:a,client:n,logger:s})},Xt=async({client:n,ctx:e,req:t,logger:s,instance:i})=>{if(!i.createUser)return;let{tags:a}=P(t);return await i.createUser({ctx:e,client:n,tags:a,logger:s})},Qt=async({client:n,ctx:e,req:t,logger:s,instance:i})=>{if(!i.createConversation)return;let{channel:a,tags:o}=P(t);return await i.createConversation({ctx:e,client:n,channel:a,tags:o,logger:s})},en=async({ctx:n,req:e,client:t,logger:s,instance:i})=>{let{conversation:a,user:o,type:r,payload:l,message:c}=P(e),g=i.channels[a.channel];if(!g)throw new M.InvalidPayloadError(`Channel ${a.channel} not found`);let u=g.messages[r];if(!u)throw new M.InvalidPayloadError(`Message of type ${r} not found in channel ${a.channel}`);await u({ctx:n,conversation:a,message:c,user:o,type:r,client:t,payload:l,ack:async({tags:m})=>{await t.updateMessage({id:c.id,tags:m})},logger:s})},tn=async({req:n,ctx:e,client:t,logger:s,instance:i})=>{let{input:a,type:o}=P(n);if(!o)throw new M.InvalidPayloadError("Missing action type");let r=i.actions[o];if(!r)throw new M.InvalidPayloadError(`Action ${o} not found`);let l=new ne,g={output:await r({ctx:e,input:a,client:t,type:o,logger:s,metadata:l}),meta:l.toJSON()};return{body:JSON.stringify(g)}},nn=async({instance:n,client:e,ctx:t,logger:s,req:i})=>{let a=n.unknownOperationHandler;if(a)return await a({client:e,ctx:t,logger:s,req:i})};var re=class{constructor(e){this.props=e;this.actions=e.actions,this.channels=e.channels,this.register=e.register,this.unregister=e.unregister,this.createUser=e.createUser,this.createConversation=e.createConversation,this.webhook=e.handler,this.unknownOperationHandler=e.__advanced?.unknownOperationHandler,this.managesOwnTracePropagation=e.__advanced?.managesOwnTracePropagation}actions;channels;register;unregister;createUser;createConversation;webhook;unknownOperationHandler;managesOwnTracePropagation;handler=nt(this);start=e=>q(this.handler,e)};function ae(n){if(n)return Object.fromEntries(Object.entries(n).map(([e,{recurrence:t,...s}])=>[e,s]))}function le(n,e){let s={...Object.fromEntries(Object.entries(n??{}).map(([i,a])=>a.recurrence?[i,{type:i,payload:a.recurrence.payload,schedule:{cron:a.recurrence.cron}}]:null).filter(i=>i!==null)),...e};return Object.keys(s).length?s:void 0}var ce=class n{constructor(e){this.props=e;let t=ae(e.events),s=le(e.events,e.recurringEvents);this.integrations=e.integrations,this.plugins=e.plugins,this.user=e.user,this.conversation=e.conversation,this.message=e.message,this.states=e.states,this.configuration=e.configuration,this.events=t,this.recurringEvents=s,this.actions=e.actions,this.tables=e.tables,this.secrets=e.secrets,this.workflows=e.workflows,this.attributes=e.attributes,this.__advanced=e.__advanced,this.withPlugins={user:e.user,conversation:e.conversation,message:e.message,states:e.states,events:t,recurringEvents:s,actions:e.actions,tables:e.tables,workflows:e.workflows}}integrations;plugins;user;conversation;message;states;configuration;events;recurringEvents;actions;tables;secrets;workflows;attributes;__advanced;withPlugins;get metadata(){return{sdkVersion:D}}clone=e=>new n({...this.props,integrations:this.integrations,plugins:this.plugins,...e});addIntegration(e,t){let s=this;s.integrations||(s.integrations={});let i=t?.alias??e.name;if(s.integrations[i])throw new w(`Another integration with alias "${i}" is already installed in the bot`);let a=t&&"configurationType"in t?t.configurationType:void 0,o=t&&"configuration"in t?t.configuration??{}:{},r=a?e.definition.configurations?.[a]?.schema:e.definition.configuration?.schema,l=r?r.safeParse(o):null,c=l?.success?{...o,...l.data}:o;return s.integrations[i]={...e,alias:i,enabled:t?.enabled,configurationType:a,configuration:c,disabledChannels:t?.disabledChannels},this}addPlugin(e,t){let s=this;s.plugins||(s.plugins={});let i=t.alias??e.name;if(s.plugins[i])throw new w(`Another plugin with alias "${i}" is already installed in the bot`);let a=Object.fromEntries(Object.entries(t.dependencies??{}).filter(([u,f])=>"integrationInterfaceAlias"in f).map(([u,f])=>{let m=this.integrations?.[f.integrationAlias];if(!m){let I=Object.keys(this.integrations??{}).join(", ")||"(none)";throw new w(`Interface with alias "${u}" of plugin with alias "${i}" references integration with alias "${f.integrationAlias}" which is not installed. Please make sure to add the integration via addIntegration() before calling addPlugin().
1
+ "use strict";var pt=Object.create;var Y=Object.defineProperty;var ft=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var ht=Object.getPrototypeOf,yt=Object.prototype.hasOwnProperty;var W=(n,e)=>{for(var t in e)Y(n,t,{get:e[t],enumerable:!0})},Se=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of mt(e))!yt.call(n,i)&&i!==t&&Y(n,i,{get:()=>e[i],enumerable:!(s=ft(e,i))||s.enumerable});return n};var he=(n,e,t)=>(t=n!=null?pt(ht(n)):{},Se(e||!n||!n.__esModule?Y(t,"default",{value:n,enumerable:!0}):t,n)),Tt=n=>Se(Y({},"__esModule",{value:!0}),n);var yn={};W(yn,{Bot:()=>de,BotDefinition:()=>ce,BotLogger:()=>Z,BotSpecificClient:()=>O,Integration:()=>re,IntegrationDefinition:()=>ee,IntegrationLogger:()=>F,IntegrationSpecificClient:()=>N,InterfaceDefinition:()=>ge,OAUTH_IDENTIFIER_HEADER:()=>Bt,Plugin:()=>pe,PluginDefinition:()=>ue,RuntimeError:()=>fe.RuntimeError,WELL_KNOWN_ATTRIBUTES:()=>kt,errors:()=>_e,handlerErrorToHttpResponse:()=>V,isApiError:()=>fe.isApiError,messages:()=>ye,parseBody:()=>P,serve:()=>q,version:()=>Ee,z:()=>d.z});module.exports=Tt(yn);var ye={};W(ye,{defaults:()=>Pt,markdown:()=>bt,markdownBloc:()=>wt});var _n=require("@holocronlab/botruntime-zui"),d=require("@holocronlab/botruntime-zui");var T=d.z.string().min(1),Oe=d.z.object({text:T}),Ce=d.z.object({markdown:T}),Re=d.z.object({imageUrl:T,title:T.optional()}),Ae=d.z.object({audioUrl:T,title:T.optional()}),De=d.z.object({videoUrl:T,title:T.optional()}),Me=d.z.object({fileUrl:T,title:T.optional()}),Ue=d.z.object({latitude:d.z.number(),longitude:d.z.number(),address:d.z.string().optional(),title:d.z.string().optional()}),We=d.z.object({title:T,subtitle:T.optional(),imageUrl:T.optional(),actions:d.z.array(d.z.object({action:d.z.enum(["postback","url","say"]),label:T,value:T}))}),He=d.z.object({text:T,options:d.z.array(d.z.object({label:T,value:T}))}),_t=d.z.object({items:d.z.array(We)}),je=d.z.union([d.z.object({type:d.z.literal("text"),payload:Oe}),d.z.object({type:d.z.literal("image"),payload:Re}),d.z.object({type:d.z.literal("audio"),payload:Ae}),d.z.object({type:d.z.literal("video"),payload:De}),d.z.object({type:d.z.literal("file"),payload:Me}),d.z.object({type:d.z.literal("location"),payload:Ue})]),vt=d.z.object({items:d.z.array(je)}),bt={schema:Ce},wt={schema:d.z.object({items:d.z.array(d.z.union([...je.options,d.z.object({type:d.z.literal("markdown"),payload:Ce})]))})},Pt={text:{schema:Oe},image:{schema:Re},audio:{schema:Ae},video:{schema:De},file:{schema:Me},location:{schema:Ue},carousel:{schema:_t},card:{schema:We},dropdown:{schema:He},choice:{schema:He},bloc:{schema:vt}};var kt={HIDDEN_IN_STUDIO:{bpActionHiddenInStudio:"true"},AWAIT_RETURN:{bpActionAwaitReturn:"true"}},Bt="x-bp-integration-identifier";var R=require("@holocronlab/botruntime-client"),Ke=require("browser-or-node");var Te=console;function P(n){if(!n.body)throw new R.InvalidPayloadError("Missing body");try{return JSON.parse(n.body)}catch(e){throw new R.InvalidPayloadError(e instanceof Error?e.message:String(e))}}var V=({thrown:n,unexpectedErrorMessage:e})=>{let t=n instanceof Error?n:new Error(String(n));if((0,R.isApiError)(t)&&(t.type==="Runtime"||t.type==="InvalidPayload"))return{status:t.code,body:JSON.stringify(t.toJSON()),error:t};let s=(0,R.isApiError)(t)?new R.RuntimeError(t.message,t):new R.RuntimeError(e,t);return{status:500,body:JSON.stringify(s.toJSON()),error:s}};async function q(n,e=8072,t=St){if(!Ke.isNode)throw new Error("This function can only be called in Node.js");let i=require("http").createServer(async(a,o)=>{try{let r=await xt(a);if(r.path==="/health"){o.writeHead(200).end("ok");return}let l=await n(r);o.writeHead(l?.status??200,l?.headers??{}).end(l?.body??"{}")}catch(r){let l=r instanceof Error?r.message:String(r);Te.error("Error while handling request",{error:l??"Internal error occured"}),o.writeHead(500).end(JSON.stringify({error:l??"Internal error occured"}))}});return i.listen(e,()=>t(e)),i}async function xt(n){let e=await Et(n),t={};for(let i=0;i<n.rawHeaders.length;i+=2){let a=n.rawHeaders[i].toLowerCase(),o=n.rawHeaders[i+1];t[a]=o}let s=new URL(n.url??"",n.headers.host?`http://${n.headers.host}`:"http://localhost");return{body:e,path:s.pathname,query:It(s.search,"?"),headers:t,method:n.method?.toUpperCase()??"GET"}}function It(n,e){return n.indexOf(e)===0?n.slice(e.length):n}async function Et(n){return new Promise((e,t)=>{if(n.method!=="POST"&&n.method!=="PUT"&&n.method!=="PATCH")return e(void 0);let s="";n.on("data",i=>s+=i.toString()),n.on("error",i=>t(i)),n.on("end",()=>e(s))})}function St(n){Te.info(`Listening on port ${n}`)}var fe=require("@holocronlab/botruntime-client");var _e={};W(_e,{DefinitionError:()=>w,isDefinitionError:()=>Ht});var w=class extends Error{__IS_SDK_ERROR__=!0;type="definition_error"},Ht=n=>n instanceof w||typeof n=="object"&&n!==null&&"__IS_SDK_ERROR__"in n&&n.__IS_SDK_ERROR__===!0&&"type"in n&&n.type==="definition_error";var y={};W(y,{mapKeys:()=>Rt,mapValues:()=>Ct,mergeRecords:()=>Dt,pairs:()=>X,stripUndefinedProps:()=>At,values:()=>Ot});var X=n=>Object.entries(n),Ot=n=>Object.values(n),Ct=(n,e)=>Object.fromEntries(X(n).map(([t,s])=>[t,e(s,t)])),Rt=(n,e)=>Object.fromEntries(X(n).map(([t,s])=>[e(t),s])),At=n=>Object.fromEntries(X(n).filter(([,e])=>e!==void 0)),Dt=(n,e,t)=>{let s=[...Object.keys(n),...Object.keys(e)],i=[...new Set(s)],a={};for(let o of i){let r=n[o],l=e[o];r&&l?a[o]=t(r,l):r?a[o]=r:l&&(a[o]=l)}return a};var p={};W(p,{safePush:()=>Mt,unique:()=>Ut});var Mt=(n,...e)=>n?[...n,...e]:[...e],Ut=n=>Array.from(new Set(n));var _={};W(_,{setName:()=>Wt});var Wt=(n,e)=>(Object.defineProperty(n,"name",{value:e}),n);var Ne=n=>{let{name:e,version:t}=n,s={actions:{},events:{},channels:{}},i={name:e,version:t,entities:y.mapValues(n.entities,o=>({name:o.name})),actions:{},events:{},channels:{}},a=y.mapValues(n.entities,o=>o.schema);for(let[o,r]of Object.entries(n.definition.actions??{})){let l=r.input.schema.dereference(a),c=r.output.schema.dereference(a),g=n.actions?.[o]?.name??o;s.actions[g]={...r,...n.actions?.[o]??{},input:{schema:l},output:{schema:c}},i.actions[o]={name:g}}for(let[o,r]of Object.entries(n.definition.events??{})){let l=r.schema.dereference(a),c=n.events?.[o]?.name??o;s.events[c]={...r,...n.events?.[o]??{},schema:l},i.events[o]={name:c}}for(let[o,r]of Object.entries(n.definition.channels??{})){let l={};for(let[g,u]of Object.entries(r.messages)){let f=u.schema.dereference(a);l[g]={...u,schema:f}}let c=n.channels?.[o]?.name??o;s.channels[c]={...r,...n.channels?.[o]??{},message:{...r.message??{},tags:{...r.message?.tags??{},...n.channels?.[o]?.message?.tags??{}}},conversation:{...r.conversation??{},tags:{...r.conversation?.tags??{},...n.channels?.[o]?.conversation?.tags??{}}},messages:l},i.channels[o]={name:c}}return{resolved:s,statement:i}};var ze="6.13.4";var D=ze;var Q=Symbol("schemaName"),Fe=n=>n?y.mapValues(n,(t,s)=>({...t,[Q]:s})):{},Ze=n=>Q in n&&n[Q]!==void 0,Ge=n=>n[Q];var ee=class n{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.icon=e.icon,this.readme=e.readme,this.title=e.title,this.identifier=e.identifier,this.description=e.description,this.configuration=e.configuration,this.configurations=e.configurations,this.events=e.events,this.actions=e.actions,this.channels=e.channels,this.states=e.states,this.user=e.user,this.secrets=e.secrets,this.entities=e.entities,this.interfaces=e.interfaces,this.__advanced=e.__advanced,this.attributes=e.attributes,this.network=e.network}name;version;title;description;icon;readme;configuration;configurations;events;actions;channels;states;user;secrets;identifier;entities;interfaces;__advanced;attributes;network;get metadata(){return{sdkVersion:D}}clone=e=>new n({...this.props,actions:this.actions,events:this.events,channels:this.channels,interfaces:this.interfaces,...e});extend(e,t){let{entities:s,actions:i,events:a,channels:o}=this._callBuilder(e,t),r=this;r.interfaces??={};let l=Object.values(s).map(f=>f.name),c=l.length===0?e.name:`${e.name}<${l.join(",")}>`,{resolved:g,statement:u}=Ne({...e,entities:s,actions:y.stripUndefinedProps(i),events:y.stripUndefinedProps(a),channels:y.stripUndefinedProps(o)});return r.actions=y.mergeRecords(r.actions??{},g.actions,this._mergeActions),r.channels=y.mergeRecords(r.channels??{},g.channels,this._mergeChannels),r.events=y.mergeRecords(r.events??{},g.events,this._mergeEvents),r.interfaces[c]={id:e.id,...u},this}_callBuilder(e,t){let i={entities:Fe(this.entities)},a=t(i),o=y.pairs(a.entities).find(([l,c])=>!Ze(c));if(o)throw new w(`Cannot extend interface "${e.name}" with entity "${o[0]}"; the provided schema is not part of the integration's entities.`);return{entities:y.mapValues(a.entities,l=>({name:Ge(l),schema:l.schema})),actions:a.actions??{},events:a.events??{},channels:a.channels??{}}}_mergeActions=(e,t)=>({...e,...t,input:{schema:this._mergeObjectSchemas(e.input.schema,t.input.schema)},output:{schema:this._mergeObjectSchemas(e.output.schema,t.output.schema)}});_mergeEvents=(e,t)=>({...e,...t,schema:this._mergeObjectSchemas(e.schema,t.schema)});_mergeChannels=(e,t)=>{let s=y.mergeRecords(e.messages,t.messages,this._mergeMessage),i;(e.conversation||t.conversation)&&(i={tags:{...e.conversation?.tags,...t.conversation?.tags}});let a;return(e.message||t.message)&&(a={tags:{...e.message?.tags,...t.message?.tags}}),{...e,...t,messages:s,conversation:i,message:a}};_mergeMessage=(e,t)=>({schema:this._mergeObjectSchemas(e.schema,t.schema)});_mergeObjectSchemas=(e,t)=>{let s=e._def,i=t._def;if(s.typeName==="ZodObject"&&i.typeName==="ZodObject"){let a=s.shape(),o=i.shape();return d.z.object({...a,...o})}if(s.typeName==="ZodRecord"&&i.typeName==="ZodRecord")return d.z.record(d.z.intersection(s.valueType,i.valueType));throw new Error("Cannot merge object schemas with record schemas")}};var M=require("@holocronlab/botruntime-client");var Le=he(require("@holocronlab/botruntime-client")),te={retries:3,retryCondition:n=>Le.axiosRetry.isNetworkOrIdempotentRequestError(n)||[429,502].includes(n.response?.status??0),retryDelay:(n,e)=>(Kt(e.response?.headers??{})??n)*1e3},Kt=n=>{let e=["RateLimit-Reset","X-RateLimit-Reset","Retry-After","ratelimit-reset","x-ratelimit-reset","retry-after"];for(let t of e){let s=n[t];if(s!==void 0)return Nt(String(s))}},Nt=n=>{let e=zt(n)?Ft(n):n.length>0?parseInt(n,10):void 0;return e===void 0||isNaN(e)?void 0:e},zt=n=>n.includes(" "),Ft=n=>{let e=Zt(n);if(!e)return;let t=new Date;return Math.max(0,Math.floor((e.getTime()-t.getTime())/1e3))},Zt=n=>{let e=new Date(n);return isNaN(e.getTime())?void 0:e};var N=class{constructor(e){this._client=e}get _inner(){return this._client}createConversation=(e=>this._client.createConversation(e));getConversation=(e=>this._client.getConversation(e));listConversations=(e=>this._client.listConversations(e));getOrCreateConversation=(e=>this._client.getOrCreateConversation(e));updateConversation=(e=>this._client.updateConversation(e));deleteConversation=(e=>this._client.deleteConversation(e));listParticipants=(e=>this._client.listParticipants(e));addParticipant=(e=>this._client.addParticipant(e));getParticipant=(e=>this._client.getParticipant(e));removeParticipant=(e=>this._client.removeParticipant(e));createEvent=(e=>this._client.createEvent(e));getEvent=(e=>this._client.getEvent(e));listEvents=(e=>this._client.listEvents(e));createMessage=(e=>this._client.createMessage(e));getOrCreateMessage=(e=>this._client.getOrCreateMessage(e));getMessage=(e=>this._client.getMessage(e).then(t=>t));updateMessage=(e=>this._client.updateMessage(e).then(t=>t));listMessages=(e=>this._client.listMessages(e));deleteMessage=(e=>this._client.deleteMessage(e));initializeIncomingMessage=(e=>this._client.initializeIncomingMessage(e));createUser=(e=>this._client.createUser(e));getUser=(e=>this._client.getUser(e));listUsers=e=>this._client.listUsers(e);getOrCreateUser=(e=>this._client.getOrCreateUser(e));updateUser=(e=>this._client.updateUser(e));deleteUser=e=>this._client.deleteUser(e);getState=(e=>this._client.getState(e));setState=(e=>this._client.setState(e));getOrSetState=(e=>this._client.getOrSetState(e));patchState=(e=>this._client.patchState(e));configureIntegration=e=>this._client.configureIntegration(e);uploadFile=e=>this._client.uploadFile(e);upsertFile=e=>this._client.upsertFile(e);deleteFile=e=>this._client.deleteFile(e);listFiles=e=>this._client.listFiles(e);getFile=e=>this._client.getFile(e);updateFileMetadata=e=>this._client.updateFileMetadata(e);trackAnalytics=e=>this._client.trackAnalytics(e)};var ne=class{_cost=0;get cost(){return this._cost}setCost(e){this._cost=e}toJSON(){return{cost:this.cost}}};var Qe=require("@holocronlab/botruntime-zui");var E="#",se="x-bot-id",$e="x-bot-user-id",Ve="x-integration-id",qe="x-integration-alias",Je="x-webhook-id",Ye="x-bp-configuration-type",ie="x-bp-configuration",oe="x-bp-operation",Xe="x-bp-type";var k=n=>{throw n instanceof Error?n:new Error(n)};var qn=Qe.z.enum(["webhook_received","message_created","action_triggered","register","unregister","ping","create_user","create_conversation"]),et=n=>({botId:n[se]||k("Missing bot header"),botUserId:n[$e]||k("Missing bot user header"),integrationId:n[Ve]||k("Missing integration header"),integrationAlias:n[qe]||k("Missing integration alias header"),webhookId:n[Je]||k("Missing webhook header"),operation:n[oe]||k("Missing operation header"),configurationType:n[Ye]??null,configuration:JSON.parse(Buffer.from(n[ie]||k("Missing configuration header"),"base64").toString("utf-8"))});var tt=he(require("util")),z=class{defaultOptions;constructor(e){this.defaultOptions=e}info(...e){this._log("info",e)}debug(...e){this._log("debug",e)}warn(...e){this._log("warn",e)}error(...e){this._log("error",e)}issue(e){console.info(JSON.stringify({...e,...this.getIssueContext()}))}getIssueContext(){return{}}_log(e,t){this._getConsoleMethod(e)(this._serializeMessage(e,t))}_serializeMessage(e,t){let s=tt.default.format(...t);return process.env.BP_LOG_FORMAT==="json"?this.getJsonMessage(e,s):s}getJsonMessage(e,t){return JSON.stringify({msg:t,level:e,options:this.defaultOptions})}_getConsoleMethod(e){switch(e){case"debug":return console.debug;case"warn":return console.warn;case"error":return console.error;default:return console.info}}};var F=class n extends z{constructor(e){super({visibleToBotOwners:!1,hiddenToIntegrationOwners:!1,...e})}with(e){return new n({...this.defaultOptions,...e})}withUserId(e){return this.with({userId:e})}withConversationId(e){return this.with({conversationId:e})}withVisibleToBotOwners(e){return this.with({visibleToBotOwners:e})}withHiddenToIntegrationOwners(e){return this.with({hiddenToIntegrationOwners:e})}forBot(){return this.with({hiddenToIntegrationOwners:!1,visibleToBotOwners:!0})}forBotOnly(){return this.with({hiddenToIntegrationOwners:!0,visibleToBotOwners:!0})}getJsonMessage(e,t){return JSON.stringify({msg:t,level:e,botId:this.defaultOptions.botId,integrationId:this.defaultOptions.integrationId,integrationAlias:this.defaultOptions.integrationAlias,visible_to_bot_owner:this.defaultOptions.visibleToBotOwners,hidden_to_integration_owner:this.defaultOptions.hiddenToIntegrationOwners,options:this.defaultOptions})}getIssueContext(){let{botId:e,integrationId:t,integrationAlias:s}=this.defaultOptions;return{...e&&{botId:e},...t&&{integrationId:t},...s&&{integrationAlias:s}}}};var Gt=n=>["traceparent","tracestate"].reduce((e,t)=>(n[t]&&(e[t]=n[t]),e),{}),Lt=(n,e,t)=>{let[,s]=(e.headers.traceparent||"").split("-"),i=new M.Client({botId:n.botId,integrationId:n.integrationId,integrationAlias:n.integrationAlias,retry:te,headers:t.managesOwnTracePropagation?{}:Gt(e.headers)}),a=new N(i),o=new F({traceId:s,botId:n.botId,integrationId:n.integrationId,integrationAlias:n.integrationAlias});return{ctx:n,req:e,client:a,logger:o,instance:t}},$t=async n=>{let{ctx:e}=n;switch(e.operation){case"webhook_received":return await qt(n);case"register":return await Jt(n);case"unregister":return await Yt(n);case"message_created":return await en(n);case"action_triggered":return await tn(n);case"ping":return await Vt(n);case"create_user":return await Xt(n);case"create_conversation":return await Qt(n);default:throw new M.InvalidPayloadError(`Unknown operation ${e.operation}`)}},nt=n=>async e=>{let t=et(e.headers),s=Lt(t,e,n),{logger:i}=s;try{let a;return a=await nn(s),a?{...a,status:a.status??200}:(a=await $t(s),a?{...a,status:a.status??200}:{status:200})}catch(a){let{status:o,body:r,error:l}=V({thrown:a,unexpectedErrorMessage:"An unexpected error occurred in the integration. Bot owners: Check logs for more informations. Integration owners: throw a RuntimeError to return a custom error message instead."});return o>=500&&console.error(a),i.forBot().error(l.message),{status:o,body:r}}},Vt=async n=>{},qt=async({client:n,ctx:e,req:t,logger:s,instance:i})=>{let{req:a}=P(t);return i.webhook({client:n,ctx:e,req:a,logger:s})},Jt=async({client:n,ctx:e,req:t,logger:s,instance:i})=>{if(!i.register)return;let{webhookUrl:a}=P(t);await i.register({client:n,ctx:e,webhookUrl:a,logger:s})},Yt=async({client:n,ctx:e,req:t,logger:s,instance:i})=>{if(!i.unregister)return;let{webhookUrl:a}=P(t);await i.unregister({ctx:e,webhookUrl:a,client:n,logger:s})},Xt=async({client:n,ctx:e,req:t,logger:s,instance:i})=>{if(!i.createUser)return;let{tags:a}=P(t);return await i.createUser({ctx:e,client:n,tags:a,logger:s})},Qt=async({client:n,ctx:e,req:t,logger:s,instance:i})=>{if(!i.createConversation)return;let{channel:a,tags:o}=P(t);return await i.createConversation({ctx:e,client:n,channel:a,tags:o,logger:s})},en=async({ctx:n,req:e,client:t,logger:s,instance:i})=>{let{conversation:a,user:o,type:r,payload:l,message:c}=P(e),g=i.channels[a.channel];if(!g)throw new M.InvalidPayloadError(`Channel ${a.channel} not found`);let u=g.messages[r];if(!u)throw new M.InvalidPayloadError(`Message of type ${r} not found in channel ${a.channel}`);await u({ctx:n,conversation:a,message:c,user:o,type:r,client:t,payload:l,ack:async({tags:m})=>{await t.updateMessage({id:c.id,tags:m})},logger:s})},tn=async({req:n,ctx:e,client:t,logger:s,instance:i})=>{let{input:a,type:o}=P(n);if(!o)throw new M.InvalidPayloadError("Missing action type");let r=i.actions[o];if(!r)throw new M.InvalidPayloadError(`Action ${o} not found`);let l=new ne,g={output:await r({ctx:e,input:a,client:t,type:o,logger:s,metadata:l}),meta:l.toJSON()};return{body:JSON.stringify(g)}},nn=async({instance:n,client:e,ctx:t,logger:s,req:i})=>{let a=n.unknownOperationHandler;if(a)return await a({client:e,ctx:t,logger:s,req:i})};var re=class{constructor(e){this.props=e;this.actions=e.actions,this.channels=e.channels,this.register=e.register,this.unregister=e.unregister,this.createUser=e.createUser,this.createConversation=e.createConversation,this.webhook=e.handler,this.unknownOperationHandler=e.__advanced?.unknownOperationHandler,this.managesOwnTracePropagation=e.__advanced?.managesOwnTracePropagation}actions;channels;register;unregister;createUser;createConversation;webhook;unknownOperationHandler;managesOwnTracePropagation;handler=nt(this);start=e=>q(this.handler,e)};function ae(n){if(n)return Object.fromEntries(Object.entries(n).map(([e,{recurrence:t,...s}])=>[e,s]))}function le(n,e){let s={...Object.fromEntries(Object.entries(n??{}).map(([i,a])=>a.recurrence?[i,{type:i,payload:a.recurrence.payload,schedule:{cron:a.recurrence.cron}}]:null).filter(i=>i!==null)),...e};return Object.keys(s).length?s:void 0}var ce=class n{constructor(e){this.props=e;let t=ae(e.events),s=le(e.events,e.recurringEvents);this.integrations=e.integrations,this.plugins=e.plugins,this.user=e.user,this.conversation=e.conversation,this.message=e.message,this.states=e.states,this.configuration=e.configuration,this.events=t,this.recurringEvents=s,this.actions=e.actions,this.tables=e.tables,this.secrets=e.secrets,this.workflows=e.workflows,this.attributes=e.attributes,this.__advanced=e.__advanced,this.withPlugins={user:e.user,conversation:e.conversation,message:e.message,states:e.states,events:t,recurringEvents:s,actions:e.actions,tables:e.tables,workflows:e.workflows}}integrations;plugins;user;conversation;message;states;configuration;events;recurringEvents;actions;tables;secrets;workflows;attributes;__advanced;withPlugins;get metadata(){return{sdkVersion:D}}clone=e=>new n({...this.props,integrations:this.integrations,plugins:this.plugins,...e});addIntegration(e,t){let s=this;s.integrations||(s.integrations={});let i=t?.alias??e.name;if(s.integrations[i])throw new w(`Another integration with alias "${i}" is already installed in the bot`);let a=t&&"configurationType"in t?t.configurationType:void 0,o=t&&"configuration"in t?t.configuration??{}:{},r=a?e.definition.configurations?.[a]?.schema:e.definition.configuration?.schema,l=r?r.safeParse(o):null,c=l?.success?{...o,...l.data}:o;return s.integrations[i]={...e,alias:i,enabled:t?.enabled,configurationType:a,configuration:c,disabledChannels:t?.disabledChannels},this}addPlugin(e,t){let s=this;s.plugins||(s.plugins={});let i=t.alias??e.name;if(s.plugins[i])throw new w(`Another plugin with alias "${i}" is already installed in the bot`);let a=Object.fromEntries(Object.entries(t.dependencies??{}).filter(([u,f])=>"integrationInterfaceAlias"in f).map(([u,f])=>{let m=this.integrations?.[f.integrationAlias];if(!m){let I=Object.keys(this.integrations??{}).join(", ")||"(none)";throw new w(`Interface with alias "${u}" of plugin with alias "${i}" references integration with alias "${f.integrationAlias}" which is not installed. Please make sure to add the integration via addIntegration() before calling addPlugin().
2
2
  Available integration aliases: ${I}`)}let h=m.definition.interfaces?.[f.integrationInterfaceAlias];if(!h){let I=Object.keys(m.definition.interfaces??{}).join(", ")||"(none)";throw new w(`Interface with alias "${f.integrationInterfaceAlias}" does not exist in integration "${m.name}" referenced by interface with alias "${u}" of plugin with alias "${i}".
3
3
  Available interface aliases: ${I}`)}return[u,{...h,id:m.id,name:m.name,version:m.version,...f}]})),o=Object.fromEntries(Object.entries(t.dependencies??{}).filter(([u,f])=>!("integrationInterfaceAlias"in f)).map(([u,f])=>{let m=this.integrations?.[f.integrationAlias];if(!m){let h=Object.keys(this.integrations??{}).join(", ")||"(none)";throw new Error(`Integration with alias "${u}" of plugin with alias "${i}" references integration with alias "${f.integrationAlias}" which is not installed. Please make sure to add the integration via addIntegration() before calling addPlugin().
4
4
  Available integration aliases: ${h}`)}return[u,{...m,...f}]})),r=t.configuration??{},l=e.definition.configuration?.schema,c=l?l.safeParse(r):null,g=c?.success?{...r,...c.data}:r;return s.plugins[i]={...e,alias:i,configuration:g,interfaces:a,integrations:o},s.withPlugins.user=this._mergeUser(s.withPlugins.user,e.definition.user),s.withPlugins.conversation=this._mergeConversation(s.withPlugins.conversation,e.definition.conversation),s.withPlugins.message=this._mergeMessage(s.withPlugins.message,e.definition.message),s.withPlugins.recurringEvents=this._mergeRecurringEvents(s.withPlugins.recurringEvents,e.definition.recurringEvents),s.withPlugins.tables=this._mergeTables(s.withPlugins.tables,e.definition.tables),s.withPlugins.workflows=this._mergeWorkflows(s.withPlugins.workflows,e.definition.workflows),s.withPlugins.states=this._mergeStates(s.withPlugins.states,this._prefixKeysWithPluginAlias(e.definition.states,i)),s.withPlugins.events=this._mergeEvents(s.withPlugins.events,this._prefixKeysWithPluginAlias(e.definition.events,i)),s.withPlugins.actions=this._mergeActions(s.withPlugins.actions,this._prefixKeysWithPluginAlias(e.definition.actions,i)),this}_mergeUser=(e,t)=>({tags:{...e?.tags,...t?.tags}});_mergeConversation=(e,t)=>({tags:{...e?.tags,...t?.tags}});_mergeMessage=(e,t)=>({tags:{...e?.tags,...t?.tags}});_mergeStates=(e,t)=>({...e,...t});_mergeEvents=(e,t)=>({...e,...t});_mergeRecurringEvents=(e,t)=>({...e,...t});_mergeActions=(e,t)=>({...e,...t});_mergeTables=(e,t)=>({...e,...t});_mergeWorkflows=(e,t)=>({...e,...t});_prefixKeysWithPluginAlias=(e,t)=>y.mapKeys(e??{},s=>`${t}${E}${s}`);dereferencePluginEntities(){let e=this._buildZuiReferenceMap();return{...this,withPlugins:{...this.withPlugins,events:this._dereferenceDefinitionSchemas(this.withPlugins.events,e),states:this._dereferenceDefinitionSchemas(this.withPlugins.states,e),tables:this._dereferenceDefinitionSchemas(this.withPlugins.tables,e),actions:this._dereferenceActionDefinitionSchemas(this.withPlugins.actions,e)},plugins:Object.fromEntries(Object.entries(this.plugins??{}).map(([t,s])=>[t,{...s,definition:{...s.definition,configuration:this._dereferenceDefinitionSchema(s.definition.configuration,e),events:this._dereferenceDefinitionSchemas(s.definition.events,e),states:this._dereferenceDefinitionSchemas(s.definition.states,e),tables:this._dereferenceDefinitionSchemas(s.definition.tables,e),actions:this._dereferenceActionDefinitionSchemas(s.definition.actions,e)}}]))}}_buildZuiReferenceMap(){let e={},t=Object.entries(this.plugins??{});for(let[s,i]of t){let a=Object.entries(i.interfaces??{});for(let[o,r]of a){let l=this.integrations?.[r.integrationAlias];if(!l)throw new w(`Interface with alias "${o}" of plugin with alias "${s}" references integration "${r.name}" which is not installed`);let c=Object.entries(r.entities??{});for(let[g,{name:u}]of c){let f=l.definition.entities?.[u]?.schema;if(!f)throw new Error(`Interface entity "${u}" does not exist in integration "${l.name}"`);e[`interface:${o}/entities/${g}`]=f}}}return e}_dereferenceZuiSchema(e,t){return e.dereference(t)}_dereferenceDefinitionSchemas(e,t){return Object.fromEntries(Object.entries(e??{}).map(([s,i])=>[s,this._dereferenceDefinitionSchema(i,t)]))}_dereferenceDefinitionSchema(e,t){return e&&{...e,schema:this._dereferenceZuiSchema(e.schema,t)}}_dereferenceActionDefinitionSchemas(e,t){return Object.fromEntries(Object.entries(e??{}).map(([s,i])=>[s,{...i,input:{schema:this._dereferenceZuiSchema(i.input.schema,t)},output:{schema:this._dereferenceZuiSchema(i.output.schema,t)}}]))}};var G=require("@holocronlab/botruntime-client");var Z=class n extends z{constructor(e){super({...e})}with(e){return new n({...this.defaultOptions,...e})}withUserId(e){return this.with({userId:e})}withConversationId(e){return this.with({conversationId:e})}withWorkflowId(e){return this.with({workflowId:e})}withEventId(e){return this.with({eventId:e})}withMessageId(e){return this.with({messageId:e})}};var O=class{constructor(e,t={before:{},after:{}}){this._client=e;this._hooks=t}get _inner(){return this._client}getConversation=(e=>this._run("getConversation",e));listConversations=(e=>this._run("listConversations",e));updateConversation=(e=>this._run("updateConversation",e));deleteConversation=(e=>this._run("deleteConversation",e));listParticipants=(e=>this._run("listParticipants",e));addParticipant=(e=>this._run("addParticipant",e));getParticipant=(e=>this._run("getParticipant",e));removeParticipant=(e=>this._run("removeParticipant",e));createEvent=(e=>this._run("createEvent",e));getEvent=(e=>this._run("getEvent",e));listEvents=(e=>this._run("listEvents",e));createMessage=(e=>this._run("createMessage",e));getMessage=(e=>this._run("getMessage",e));updateMessage=(e=>this._run("updateMessage",e));listMessages=(e=>this._run("listMessages",e));deleteMessage=(e=>this._run("deleteMessage",e));getUser=(e=>this._run("getUser",e));listUsers=(e=>this._run("listUsers",e));updateUser=(e=>this._run("updateUser",e));deleteUser=(e=>this._run("deleteUser",e));getState=(e=>this._run("getState",e));setState=(e=>this._run("setState",e));getOrSetState=(e=>this._run("getOrSetState",e));patchState=(e=>this._run("patchState",e));callAction=(e=>this._run("callAction",e));uploadFile=(e=>this._run("uploadFile",e));upsertFile=(e=>this._run("upsertFile",e));deleteFile=(e=>this._run("deleteFile",e));listFiles=(e=>this._run("listFiles",e));getFile=(e=>this._run("getFile",e));updateFileMetadata=(e=>this._run("updateFileMetadata",e));searchFiles=(e=>this._run("searchFiles",e));trackAnalytics=(e=>this._run("trackAnalytics",e));getTableRow=(e=>this._run("getTableRow",e));createTableRows=(e=>this._run("createTableRows",e));findTableRows=(e=>this._run("findTableRows",e));deleteTableRows=(e=>this._run("deleteTableRows",e));updateTableRows=(e=>this._run("updateTableRows",e));upsertTableRows=(e=>this._run("upsertTableRows",e));createWorkflow=(e=>this._run("createWorkflow",e));getOrCreateWorkflow=(e=>this._run("getOrCreateWorkflow",e));getWorkflow=(e=>this._run("getWorkflow",e));updateWorkflow=(e=>this._run("updateWorkflow",e));deleteWorkflow=(e=>this._run("deleteWorkflow",e));listWorkflows=(e=>this._run("listWorkflows",e));createConversation=e=>this._client.createConversation(e);getOrCreateConversation=e=>this._client.getOrCreateConversation(e);createUser=e=>this._client.createUser(e);getOrCreateUser=e=>this._client.getOrCreateUser(e);_run=async(e,t)=>{let s=this._hooks.before[e];s&&(t=await s(t));let i=await this._client[e](t),a=this._hooks.after[e];return a&&(i=await a(i,t)),i}};var st=require("@holocronlab/botruntime-zui");var sn=st.z.enum(["event_received","register","unregister","ping","action_triggered"]),it=n=>({botId:n[se]||k("Missing bot id header"),operation:sn.parse(n[oe]),type:n[Xe]||k("Missing type header"),configuration:JSON.parse(Buffer.from(n[ie]||k("Missing configuration header"),"base64").toString("utf-8"))});var v={status:200};var be=n=>{switch(n){case"workflow_continued":return"continued";case"workflow_started":return"started";case"workflow_timedout":return"timed_out";default:throw new Error(`Unsupported workflow update type: ${n}`)}};var on=["child_workflow_deleted","child_workflow_finished","workflow_timedout","workflow_started","workflow_continued"],ot=async(n,e)=>{if(n.ctx.type!=="workflow_update"||!on.includes(e.payload.type))throw new Error("Unexpected event type");let t={...n,logger:rn(n,e)};if(!e.payload.workflow.name)return t.logger.warn("Received workflow update event without a workflow name. Assuming this workflow was not defined by the bot.",e.payload.workflow),v;switch(e.payload.type){case"child_workflow_deleted":case"child_workflow_finished":t.logger.info(`Received child workflow event "${e.payload.type}", but child workflows are not yet supported`);break;case"workflow_timedout":case"workflow_started":case"workflow_continued":return await an(t,e);default:e.payload.type}return v},rn=(n,e)=>n.logger.with({eventId:e.id,workflowId:e.payload.workflow.id,conversationId:e.payload.conversation?.id,userId:e.payload.user?.id}),an=async(n,e)=>{let t=be(e.payload.type),s=n.self.workflowHandlers[t]?.[e.payload.workflow.name];if(!s||s.length===0)return n.logger.warn(`No ${t} handler found for workflow "${e.payload.workflow.name}"`),v;let{updatedWorkflow:i}=await ln(n,e);return i.status==="pending"&&n.logger.warn(`Workflow "${e.payload.workflow.name}" is still in pending status after processing "${t}" event. This may indicate that the workflow was not properly acknowledged or terminated by the handler. `),v},ln=async(n,e)=>{let t=be(e.payload.type),s=n.self.workflowHandlers[t]?.[e.payload.workflow.name],i=structuredClone(e.payload.workflow);for(let a of s??[])i=await a({...n,event:e,conversation:e.payload.conversation,user:e.payload.user,workflow:i});return{updatedWorkflow:i}};var rt=n=>async e=>{let t=it(e.headers),s=new Z,i=new G.Client({botId:t.botId,retry:te}),a=new O(i,{before:{createMessage:async r=>{let l=n.hookHandlers.before_outgoing_message[r.type]??[];for(let c of l){let g=new O(i);r=(await c({client:g,ctx:t,logger:s.with({conversationId:r.conversationId,userId:r.userId}),data:r}))?.data??r}return r},callAction:async r=>{let l=n.hookHandlers.before_outgoing_call_action[r.type]??[];for(let c of l){let g=new O(i);r=(await c({client:g,ctx:t,logger:s,data:r}))?.data??r}return r}},after:{createMessage:async r=>{let l=n.hookHandlers.after_outgoing_message[r.message.type]??[];for(let c of l){let g=new O(i);r=(await c({client:g,ctx:t,logger:s.with({messageId:r.message.id,conversationId:r.message.conversationId,userId:r.message.userId}),data:r}))?.data??r}return r},callAction:async(r,l)=>{let{type:c}=l,g=n.hookHandlers.after_outgoing_call_action[c]??[];for(let u of g){let f=new O(i);r=(await u({client:f,ctx:t,logger:s,data:{type:c,...r}}))?.data??r}return r}}}),o={req:e,ctx:t,logger:s,client:a,self:n};try{switch(t.operation){case"action_triggered":return await pn(o);case"event_received":return await un(o);case"register":return await dn(o);case"unregister":return await gn(o);case"ping":return await cn(o);default:throw new G.InvalidPayloadError(`Unknown operation ${t.operation}`)}}catch(r){let{status:l,body:c,error:g}=V({thrown:r,unexpectedErrorMessage:"An unexpected error occurred in the bot."});return l>=500?s.error(g.message,r):s.error(g.message),{status:l,body:c}}},cn=async n=>v,dn=async n=>(await n.self.registerHandler?.({client:n.client,ctx:n.ctx,logger:n.logger}),v),gn=async n=>v,un=async n=>{let{ctx:e,logger:t,req:s,client:i,self:a}=n,o={client:i,ctx:e,logger:t},r=P(s);if(o.logger=o.logger.with({eventId:r.event.id,messageId:r.event.messageId,conversationId:r.event.conversationId,userId:r.event.userId}),e.type==="workflow_update")return await ot(n,r.event);if(e.type==="message_created"){let m=r.event,h=m.payload.message,I=m.payload.user,U=m.payload.conversation;o.logger=o.logger.with({messageId:h.id,conversationId:h.conversationId,userId:h.userId});let me=a.hookHandlers.before_incoming_message[h.type]??[];for(let L of me){let $=await L({...o,user:I,conversation:U,data:h});if(h=$?.data??h,$?.stop)return v}let dt={...o,user:I,conversation:U,message:h,event:m},gt=a.messageHandlers[h.type]??[];for(let L of gt)await L(dt);let ut=a.hookHandlers.after_incoming_message[h.type]??[];for(let L of ut){let $=await L({...o,user:I,conversation:U,data:h});if(h=$?.data??h,$?.stop)return v}return v}if(e.type==="state_expired"){let h=r.event.payload.state,I={...o,state:h},U=a.stateExpiredHandlers[h.name]??[];for(let me of U)await me(I);return v}let l=r.event,c=a.hookHandlers.before_incoming_event[l.type]??[];for(let m of c){let h=await m({...o,data:l});if(l=h?.data??l,h?.stop)return v}let g={...o,event:l},u=a.eventHandlers[l.type]??[];for(let m of u)await m(g);let f=a.hookHandlers.after_incoming_event[l.type]??[];for(let m of f){let h=await m({...o,data:l});if(l=h?.data??l,h?.stop)return v}return v},pn=async({ctx:n,logger:e,req:t,client:s,self:i})=>{let{input:a,type:o}=P(t);if(!o)throw new G.InvalidPayloadError("Missing action type");let r=i.hookHandlers.before_incoming_call_action[o]??[];for(let f of r){let m=await f({ctx:n,logger:e,client:s,data:{type:o,input:a}});a=m?.data?.input??a,o=m?.data?.type??o}let l=i.actionHandlers[o];if(!l)throw new G.InvalidPayloadError(`Action ${o} not found`);let c=await l({ctx:n,logger:e,input:a,client:s,type:o}),g=i.hookHandlers.after_incoming_call_action[o]??[];for(let f of g){let m=await f({ctx:n,logger:e,client:s,data:{type:o,output:c}});o=m?.data?.type??o,c=m?.data?.output??c}return{status:200,body:JSON.stringify({output:c})}};var C=(n,{alias:e})=>{if(!("tags"in n)||!e)return n;let t=`${e}${E}`,s=Object.fromEntries(Object.entries(n.tags??{}).flatMap(([i,a])=>i.startsWith(t)?[[i.slice(t.length),a]]:[]));return{...n,tags:s}},b=(n,{alias:e})=>{if(!("tags"in n)||!e)return n;let t=`${e}${E}`,s=Object.fromEntries(Object.entries(n.tags??{}).map(([i,a])=>[i.startsWith(t)?i:`${t}${i}`,a]));return{...n,tags:s}};var we=class{constructor(e){this._list=e}_nextToken;_elementsBuffer=[];_isExhausted=!1;[Symbol.asyncIterator](){return this}async next(){return this._bufferIsEmpty&&!this._isExhausted&&await this._fetchNextPageIntoBuffer(),this._bufferIsEmpty?{done:!0,value:void 0}:{done:!1,value:this._elementsBuffer.shift()}}async take(e){let t=[];for(let s=0;s<e;++s){let i=await this.next();if(i.done)break;t.push(i.value)}return t}async takePage(e){for(let s=0;s<e;++s)this._isExhausted||await this._fetchNextPageIntoBuffer();let t=[...this._elementsBuffer];return this._elementsBuffer.length=0,t}async takeAll(){return this.take(Number.POSITIVE_INFINITY)}get isExhausted(){return this._isExhausted}async _fetchNextPageIntoBuffer(){let{items:e,meta:t}=await this._list({nextToken:this._nextToken});this._elementsBuffer.push(...e),this._nextToken=t.nextToken,t.nextToken||(this._isExhausted=!0)}get _bufferIsEmpty(){return this._elementsBuffer.length===0}},B=n=>new we(n);var A=n=>new Proxy({},{get:(e,t)=>({listInstances:s=>B(({nextToken:i})=>n.client.listWorkflows({...s,name:t,nextToken:i}).then(({meta:a,workflows:o})=>({meta:a,items:o.map(r=>x({...n,workflow:r}))}))),startNewInstance:async s=>{let{workflow:i}=await n.client.createWorkflow({name:t,status:"pending",...b(s,{alias:void 0})});return{workflow:x({...n,workflow:i})}}})}),x=n=>{let e=!1;return{...C(n.workflow,{alias:void 0}),async update(t){let{workflow:s}=await n.client.updateWorkflow({id:n.workflow.id,...b(t,{alias:void 0})});return await n.onWorkflowUpdate?.(s),{workflow:x({...n,workflow:s})}},async acknowledgeStartOfProcessing(){if(!n.event||n.workflow.status!=="pending"||e)return{workflow:x(n)};let{workflow:t}=await n.client.updateWorkflow({id:n.workflow.id,status:"in_progress",eventId:n.event.id});return e=!0,await n.onWorkflowUpdate?.(t),{workflow:x({...n,workflow:t})}},async setFailed({failureReason:t}){let{workflow:s}=await n.client.updateWorkflow({id:n.workflow.id,status:"failed",failureReason:t});return await n.onWorkflowUpdate?.(s),{workflow:x({...n,workflow:s})}},async setCompleted({output:t}={}){let{workflow:s}=await n.client.updateWorkflow({id:n.workflow.id,status:"completed",output:t});return await n.onWorkflowUpdate?.(s),{workflow:x({...n,workflow:s})}},async cancel(){let{workflow:t}=await n.client.updateWorkflow({id:n.workflow.id,status:"cancelled"});return await n.onWorkflowUpdate?.(t),{workflow:x({...n,workflow:t})}}}};var de=class{constructor(e){this.props=e;this._registerHandler=e.register,this._actionHandlers=e.actions,this._plugins=e.plugins}_registerHandler;_actionHandlers;_messageHandlers={};_eventHandlers={};_stateExpiredHandlers={};_hookHandlers={before_incoming_event:{},before_incoming_message:{},before_outgoing_message:{},before_outgoing_call_action:{},before_incoming_call_action:{},after_incoming_event:{},after_incoming_message:{},after_outgoing_message:{},after_outgoing_call_action:{},after_incoming_call_action:{}};_workflowHandlers={started:{},continued:{},timed_out:{}};_plugins={};_registerOrder=0;get registerHandler(){return this._registerHandler}get actionHandlers(){return new Proxy({},{get:(e,t)=>{let s=this._actionHandlers[t];if(s)return _.setName(i=>s({...i,workflows:A(i)}),s.name);for(let[i,a]of Object.entries(this._plugins)){let[o,r]=t.split(E);if(!(o!==i||!r))return a.actionHandlers[r]}}})}get messageHandlers(){return new Proxy({},{get:(e,t)=>{let s=Object.values(this._plugins).flatMap(r=>r.messageHandlers[t]??[]),i=t==="*"?[]:this._messageHandlers[t]??[],a=this._messageHandlers["*"]??[],o=[...i,...a].sort((r,l)=>r.order-l.order).map(({handler:r})=>_.setName(l=>r({...l,workflows:A(l)}),r.name));return p.unique([...s,...o])}})}get eventHandlers(){return new Proxy({},{get:(e,t)=>{let s=Object.values(this._plugins).flatMap(r=>r.eventHandlers[t]??[]),i=t==="*"?[]:this._eventHandlers[t]??[],a=this._eventHandlers["*"]??[],o=[...i,...a].sort((r,l)=>r.order-l.order).map(({handler:r})=>_.setName(l=>r({...l,workflows:A(l)}),r.name));return p.unique([...s,...o])}})}get stateExpiredHandlers(){return new Proxy({},{get:(e,t)=>{let s=Object.values(this._plugins).flatMap(r=>r.stateExpiredHandlers[t]??[]),i=t==="*"?[]:this._stateExpiredHandlers[t]??[],a=this._stateExpiredHandlers["*"]??[],o=[...i,...a].sort((r,l)=>r.order-l.order).map(({handler:r})=>_.setName(l=>r({...l,workflows:A(l)}),r.name));return p.unique([...s,...o])}})}get hookHandlers(){return new Proxy({},{get:(e,t)=>{if(this._hookHandlers[t])return new Proxy({},{get:(i,a)=>{let o=Object.values(this._plugins).flatMap(u=>u.hookHandlers[t]?.[a]??[]),r=this._hookHandlers[t]??{},l=a==="*"?[]:r[a]??[],c=r["*"]??[],g=[...l,...c].sort((u,f)=>u.order-f.order).map(({handler:u})=>_.setName(f=>u({...f,workflows:A(f)}),u.name));return p.unique([...o,...g])}})}})}get workflowHandlers(){return new Proxy({},{get:(e,t)=>{let s=this._workflowHandlers[t];if(s)return new Proxy({},{get:(i,a)=>{let o=s[a]?.sort((l,c)=>l.order-c.order).map(({handler:l})=>_.setName(async c=>{let g=c.workflow;return await l({...c,workflow:x({...c,onWorkflowUpdate(u){g=u}}),workflows:A(c)}),g},l.name))??[],r=Object.values(this._plugins).flatMap(l=>l.workflowHandlers[t]?.[a]??[]);return p.unique([...o,...r])}})}})}on={message:(e,t)=>{this._messageHandlers[e]=p.safePush(this._messageHandlers[e],{handler:t,order:this._registerOrder++})},event:(e,t)=>{this._eventHandlers[e]=p.safePush(this._eventHandlers[e],{handler:t,order:this._registerOrder++})},stateExpired:(e,t)=>{this._stateExpiredHandlers[e]=p.safePush(this._stateExpiredHandlers[e],{handler:t,order:this._registerOrder++})},beforeIncomingEvent:(e,t)=>{this._hookHandlers.before_incoming_event[e]=p.safePush(this._hookHandlers.before_incoming_event[e],{handler:t,order:this._registerOrder++})},beforeIncomingMessage:(e,t)=>{this._hookHandlers.before_incoming_message[e]=p.safePush(this._hookHandlers.before_incoming_message[e],{handler:t,order:this._registerOrder++})},beforeOutgoingMessage:(e,t)=>{this._hookHandlers.before_outgoing_message[e]=p.safePush(this._hookHandlers.before_outgoing_message[e],{handler:t,order:this._registerOrder++})},beforeOutgoingCallAction:(e,t)=>{this._hookHandlers.before_outgoing_call_action[e]=p.safePush(this._hookHandlers.before_outgoing_call_action[e],{handler:t,order:this._registerOrder++})},beforeIncomingCallAction:(e,t)=>{this._hookHandlers.before_incoming_call_action[e]=p.safePush(this._hookHandlers.before_incoming_call_action[e],{handler:t,order:this._registerOrder++})},afterIncomingEvent:(e,t)=>{this._hookHandlers.after_incoming_event[e]=p.safePush(this._hookHandlers.after_incoming_event[e],{handler:t,order:this._registerOrder++})},afterIncomingMessage:(e,t)=>{this._hookHandlers.after_incoming_message[e]=p.safePush(this._hookHandlers.after_incoming_message[e],{handler:t,order:this._registerOrder++})},afterOutgoingMessage:(e,t)=>{this._hookHandlers.after_outgoing_message[e]=p.safePush(this._hookHandlers.after_outgoing_message[e],{handler:t,order:this._registerOrder++})},afterOutgoingCallAction:(e,t)=>{this._hookHandlers.after_outgoing_call_action[e]=p.safePush(this._hookHandlers.after_outgoing_call_action[e],{handler:t,order:this._registerOrder++})},afterIncomingCallAction:(e,t)=>{this._hookHandlers.after_incoming_call_action[e]=p.safePush(this._hookHandlers.after_incoming_call_action[e],{handler:t,order:this._registerOrder++})},workflowStart:(e,t)=>{this._workflowHandlers.started[e]=p.safePush(this._workflowHandlers.started[e],{handler:t,order:this._registerOrder++})},workflowContinue:(e,t)=>{this._workflowHandlers.continued[e]=p.safePush(this._workflowHandlers.continued[e],{handler:t,order:this._registerOrder++})},workflowTimeout:(e,t)=>{this._workflowHandlers.timed_out[e]=p.safePush(this._workflowHandlers.timed_out[e],{handler:t,order:this._registerOrder++})}};handler=rt(this);start=e=>q(this.handler,e)};var ge=class n{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.icon=e.icon,this.title=e.title,this.description=e.description,this.readme=e.readme,this.entities=e.entities??{},this.attributes=e.attributes,this.__advanced=e.__advanced;let t=this._getEntityReference(this.entities),s=e.events===void 0?{}:y.mapValues(e.events,o=>({...o,schema:o.schema(t)})),i=e.actions===void 0?{}:y.mapValues(e.actions,o=>({...o,input:{...o.input,schema:o.input.schema(t)},output:{...o.output,schema:o.output.schema(t)}})),a=e.channels===void 0?{}:y.mapValues(e.channels,o=>({...o,messages:y.mapValues(o.messages,r=>({...r,schema:r.schema(t)}))}));this.events=s,this.actions=i,this.channels=a}name;version;title;description;icon;readme;attributes;entities;events;actions;channels;__advanced;get metadata(){return{sdkVersion:D}}clone=e=>new n({...this.props,...e});_getEntityReference=e=>{let t={};for(let[s,i]of Object.entries(e)){let a=i.schema._def["x-zui"]?.title,o=i.schema._def.description,r=d.z.ref(s);a&&r.title(a),o&&r.describe(o),t[s]=r}return t}};var ue=class n{constructor(e){this.props=e;let t=Object.fromEntries(Object.entries(e.interfaces??{}).map(([a,o])=>[a,Object.fromEntries(Object.entries(o.definition.entities??{}).map(([r])=>[r,d.z.ref(`interface:${a}/entities/${r}`)]))]));this.name=e.name,this.version=e.version,this.icon=e.icon,this.readme=e.readme,this.title=e.title,this.description=e.description,this.integrations=e.integrations,this.interfaces=e.interfaces,this.user=e.user,this.conversation=e.conversation,this.message=e.message,this.workflows=e.workflows,this.attributes=e.attributes,this.__advanced=e.__advanced;let s=new Set;for(let a of[...Object.keys(e.integrations??{}),...Object.keys(e.interfaces??{})]){if(s.has(a))throw new w(`Duplicate interface or integration alias detected in plugin definition: '${a}'. Please use unique aliases for each interface and integration.`);s.add(a)}this.configuration=e.configuration?{...e.configuration,schema:typeof e.configuration.schema=="object"?e.configuration.schema:e.configuration.schema({entities:t})}:void 0,this.states=Object.fromEntries(Object.entries(e.states??{}).map(([a,o])=>[a,{...o,schema:typeof o.schema=="object"?o.schema:o.schema({entities:t})}]));let i=Object.fromEntries(Object.entries(e.events??{}).map(([a,o])=>[a,{...o,schema:typeof o.schema=="object"?o.schema:o.schema({entities:t})}]));this.events=ae(i),this.recurringEvents=le(i,e.recurringEvents),this.actions=Object.fromEntries(Object.entries(e.actions??{}).map(([a,o])=>[a,{...o,input:{...o.input,schema:typeof o.input.schema=="object"?o.input.schema:o.input.schema({entities:t})},output:{...o.output,schema:typeof o.output.schema=="object"?o.output.schema:o.output.schema({entities:t})}}])),this.tables=Object.fromEntries(Object.entries(e.tables??{}).map(([a,o])=>[a,{...o,schema:typeof o.schema=="object"?o.schema:o.schema({entities:t})}]))}name;version;title;description;icon;readme;attributes;integrations;interfaces;user;conversation;message;states;configuration;events;recurringEvents;actions;tables;workflows;__advanced;get metadata(){return{sdkVersion:D}}clone=e=>new n({...this.props,...e});dereferenceEntities({intersectWithUnknownRecord:e}={intersectWithUnknownRecord:!0}){let t=this._buildZuiReferenceMap(e);return{...this,configuration:this.configuration?{...this.configuration,schema:this._dereferenceZuiSchema(this.configuration.schema,t)}:void 0,events:this._dereferenceDefinitionSchemas(this.events,t),states:this._dereferenceDefinitionSchemas(this.states,t),tables:this._dereferenceDefinitionSchemas(this.tables,t),actions:this._dereferenceActionDefinitionSchemas(this.actions,t)}}_buildZuiReferenceMap(e){return Object.fromEntries(Object.entries(this.interfaces??{}).flatMap(([t,s])=>Object.entries(s.definition.entities??{}).map(([i,a])=>[`interface:${t}/entities/${i}`,e?a.schema.and(d.z.record(d.z.string(),d.z.unknown())):a.schema])))}_dereferenceZuiSchema(e,t){return e.dereference(t)}_dereferenceDefinitionSchemas(e,t){return Object.fromEntries(Object.entries(e??{}).map(([s,i])=>[s,{...i,schema:this._dereferenceZuiSchema(i.schema,t)}]))}_dereferenceActionDefinitionSchemas(e,t){return Object.fromEntries(Object.entries(e??{}).map(([s,i])=>[s,{...i,input:{schema:this._dereferenceZuiSchema(i.input.schema,t)},output:{schema:this._dereferenceZuiSchema(i.output.schema,t)}}]))}};var at=(n,e)=>new Proxy({},{get:(t,s)=>new Proxy({},{get:(i,a)=>o=>{let r=(e.integrations[s]??e.interfaces[s])?.integrationAlias,l=e.interfaces[s]?.actions?.[a]?.name??a;return n.callAction({type:`${r}:${l}`,input:o}).then(c=>c.output)}})});var Pe=n=>({async getById({id:e}){let t=await n.client.getMessage({id:e});return S({...n,message:t.message})},list(e){return B(({nextToken:t})=>n.client.listMessages({...b(e??{},{alias:n.plugin?.alias}),nextToken:t}).then(({meta:s,messages:i})=>({meta:s,items:i.map(a=>S({...n,message:a}))})))}}),S=n=>({...C(n.message,{alias:n.plugin?.alias}),async delete(){await n.client.deleteMessage({id:n.message.id})},async update(e){let{message:t}=await n.client.updateMessage({...b(e,{alias:n.plugin?.alias}),id:n.message.id});return S({...n,message:t})}});var ke=n=>({list(e){return B(({nextToken:t})=>n.client.listUsers({...b(e??{},{alias:n.pluginAlias}),nextToken:t}).then(({meta:s,users:i})=>({meta:s,items:i.map(a=>H({...n,conversationId:e?.conversationId,user:a}))})))},async getById({id:e}){let t=await n.client.getUser({id:e});return H({...n,user:t.user,conversationId:void 0})}}),H=n=>{let e={...C(n.user,{alias:n.pluginAlias}),async update(t){let{user:s}=await n.client.updateUser({...b(t,{alias:n.pluginAlias}),id:n.user.id});return H({...n,user:s})}};return n.conversationId?{...e,async removeFromConversation(){return await n.client.removeParticipant({id:n.conversationId,userId:n.user.id}),H({...n,conversationId:void 0})}}:{...e,async addToConversation({conversationId:t}){let{participant:s}=await n.client.addParticipant({id:t,userId:n.user.id});return H({...n,user:s,conversationId:t})}}};var Be=n=>new Proxy({},{get:(e,t)=>new Proxy({},{get:(s,i)=>({list(a){let o=n.plugin?.interfaces[t]?.integrationAlias??n.plugin?.integrations[t]?.integrationAlias,r=n.plugin?.interfaces[t]?.channels?.[i]?.name??i;return B(({nextToken:l})=>n.client.listConversations({...b(a??{},{alias:n.plugin?.alias}),channel:r==="*"?void 0:r,integrationName:o==="*"?void 0:o,nextToken:l}).then(({meta:c,conversations:g})=>({meta:c,items:g.map(u=>K({...n,conversation:u}))})))},async getById({id:a}){let o=await n.client.getConversation({id:a});return K({...n,conversation:o.conversation})}})})}),K=n=>{let e=n.client;return{...C(n.conversation,{alias:n.plugin?.alias}),async delete(){await e.deleteConversation({id:n.conversation.id})},async update(t){let{conversation:s}=await e.updateConversation({...b(t,{alias:n.plugin?.alias}),id:n.conversation.id});return K({...n,conversation:s})},async getMessage({id:t}){let s=await e.getMessage({id:t});return S({...n,message:s.message})},async getOrCreateMessage(t){let{message:s}=await e.getOrCreateMessage({...b(t,{alias:n.plugin?.alias}),conversationId:n.conversation.id});return S({...n,message:s})},async createMessage(t){let{message:s}=await e.createMessage({...b(t,{alias:n.plugin?.alias}),conversationId:n.conversation.id});return S({...n,message:s})},listMessages(t){return B(({nextToken:s})=>e.listMessages({...b(t??{},{alias:n.plugin?.alias}),conversationId:n.conversation.id,nextToken:s}).then(({meta:i,messages:a})=>({meta:i,items:a.map(o=>S({...n,message:o}))})))},listParticipants(){return B(({nextToken:t})=>e.listParticipants({id:n.conversation.id,nextToken:t}).then(({meta:s,participants:i})=>({meta:s,items:i.map(a=>H({...n,user:a,conversationId:n.conversation.id}))})))}}};var xe=class n{constructor(e){this._props=e}async emit(e){let{conversationId:t,userId:s,messageId:i}=this._props,{event:a}=await this._props.client.createEvent({type:this._props.eventName,payload:e,conversationId:t,userId:s,messageId:i});return a}async schedule(e,t){let{conversationId:s,userId:i,messageId:a}=this._props,{event:o}=await this._props.client.createEvent({type:this._props.eventName,payload:e,conversationId:s,userId:i,messageId:a,schedule:t});return o}withConversationId(e){return new n({...this._props,conversationId:e})}withUserId(e){return new n({...this._props,userId:e})}withMessageId(e){return new n({...this._props,messageId:e})}async getById(e){return(await this._props.client.getEvent({id:e.id})).event}list(e){return B(({nextToken:t})=>this._props.client.listEvents({...e,type:this._props.eventName,conversationId:this._props.conversationId,userId:this._props.userId,messageId:this._props.messageId,nextToken:t}).then(({meta:s,events:i})=>({meta:s,items:i})))}},lt=(n,e)=>new Proxy({},{get:(t,s)=>{let i=e.alias!==void 0?`${e.alias}${E}${s}`:s;return new xe({client:n,eventName:i})}});var Ie=class{constructor(e,t,s){this._client=e;this._stateType=t;this._stateName=s}async get(e){return await this._client.getState({type:this._stateType,name:this._stateName,id:e}).then(t=>t.state.payload)}async set(e,t,s){await this._client.setState({type:this._stateType,name:this._stateName,id:e,payload:t,expiry:s?.expiryMs})}async getOrSet(e,t,s){return await this._client.getOrSetState({type:this._stateType,name:this._stateName,id:e,payload:t,expiry:s?.expiryMs}).then(i=>i.state.payload)}async delete(e){await this._client.setState({type:this._stateType,name:this._stateName,id:e,payload:null})}async patch(e,t){await this._client.patchState({type:this._stateType,name:this._stateName,id:e,payload:t})}},ct=(n,e)=>new Proxy({},{get:(t,s)=>new Proxy({},{get:(i,a)=>{let o=e.alias!==void 0?`${e.alias}${E}${a}`:a;return new Ie(n,s,o)}})});var fn=n=>"user"in n&&"conversation"in n,pe=class{constructor(e){this.props=e;this._actionHandlers=e.actions}_runtimeProps;_actionHandlers;_messageHandlers={};_eventHandlers={};_stateExpiredHandlers={};_hookHandlers={before_incoming_event:{},before_incoming_message:{},before_outgoing_message:{},before_outgoing_call_action:{},before_incoming_call_action:{},after_incoming_event:{},after_incoming_message:{},after_outgoing_message:{},after_outgoing_call_action:{},after_incoming_call_action:{}};_workflowHandlers={started:{},continued:{},timed_out:{}};_registerOrder=0;initialize(e){return this._runtimeProps=e,this}get _runtime(){if(!this._runtimeProps)throw new Error("Plugin not correctly initialized. This is likely because you access your plugin config outside of an handler.");return this._runtimeProps}_getTools(e){let{configuration:t,interfaces:s,integrations:i,alias:a}=this._runtime,o=at(e,this._runtime),r=ct(e,this._runtime),l=A({client:e,pluginAlias:this._runtime.alias}),c=lt(e,this._runtime),g=ke({client:e,pluginAlias:this._runtime.alias}),u=Be({client:e,plugin:this._runtime}),f=Pe({client:e,plugin:this._runtime});return{configuration:t,interfaces:s,integrations:i,actions:o,states:r,alias:a,workflows:l,events:c,users:g,conversations:u,messages:f}}get actionHandlers(){return new Proxy({},{get:(e,t)=>{t=this._stripAliasPrefix(t);let s=this._actionHandlers[t];if(s)return _.setName(i=>s({...i,...this._getTools(i.client)}),s.name)}})}get messageHandlers(){return new Proxy({},{get:(e,t)=>{t=this._stripAliasPrefix(t);let s=t==="*"?[]:this._messageHandlers[t]??[],i=this._messageHandlers["*"]??[];return p.unique([...s,...i]).sort((o,r)=>o.order-r.order).map(({handler:o})=>_.setName(r=>o({...r,user:H({...r,conversationId:r.conversation.id,pluginAlias:this._runtime.alias}),message:S({...r,plugin:this._runtime,message:r.message}),conversation:K({...r,plugin:this._runtime,conversation:r.conversation}),...this._getTools(r.client)}),o.name))}})}get eventHandlers(){return new Proxy({},{get:(e,t)=>{t=this._stripAliasPrefix(t);let s=t==="*"?[]:this._eventHandlers[t]??[],i=Object.entries(this._eventHandlers).filter(([r])=>this._eventResolvesTo(r,t)).flatMap(([,r])=>r??[]),a=this._eventHandlers["*"]??[];return p.unique([...s,...i,...a]).sort((r,l)=>r.order-l.order).map(({handler:r})=>_.setName(l=>r({...l,...this._getTools(l.client)}),r.name))}})}get stateExpiredHandlers(){return new Proxy({},{get:(e,t)=>{t=this._stripAliasPrefix(t);let s=t==="*"?[]:this._stateExpiredHandlers[t]??[],i=this._stateExpiredHandlers["*"]??[];return p.unique([...s,...i]).sort((o,r)=>o.order-r.order).map(({handler:o})=>_.setName(r=>o({...r,...this._getTools(r.client)}),o.name))}})}get hookHandlers(){return new Proxy({},{get:(e,t)=>{let s=this._hookHandlers[t];if(s)return new Proxy({},{get:(i,a)=>{a=this._stripAliasPrefix(a);let o=a==="*"?[]:s[a]??[],r=Object.entries(s).filter(([g])=>this._eventResolvesTo(g,a)).flatMap(([,g])=>g??[]),l=s["*"]??[];return p.unique([...o,...r,...l]).sort((g,u)=>g.order-u.order).map(({handler:g})=>_.setName(u=>{let f=C(u.data,{alias:this._runtime.alias}),m=this._getTools(u.client),h={};if(fn(u)){let I=H({client:u.client,user:u.user,conversationId:u.conversation.id,pluginAlias:this._runtime.alias}),U=K({client:u.client,plugin:this._runtime,conversation:u.conversation});h={user:I,conversation:U}}return g({...u,data:f,...h,...m})},g.name))}})}})}get workflowHandlers(){return new Proxy({},{get:(e,t)=>{let s=this._workflowHandlers[t];if(s)return new Proxy({},{get:(i,a)=>(s[a]?.sort((r,l)=>r.order-l.order)??[]).map(({handler:r})=>_.setName(async l=>{let c=l.workflow;return await r({...l,workflow:x({...l,workflow:c,onWorkflowUpdate(g){c=g},pluginAlias:this._runtime.alias}),...this._getTools(l.client)}),c},r.name))})}})}on={message:(e,t)=>{this._messageHandlers[e]=p.safePush(this._messageHandlers[e],{handler:t,order:this._registerOrder++})},event:(e,t)=>{this._eventHandlers[e]=p.safePush(this._eventHandlers[e],{handler:t,order:this._registerOrder++})},stateExpired:(e,t)=>{this._stateExpiredHandlers[e]=p.safePush(this._stateExpiredHandlers[e],{handler:t,order:this._registerOrder++})},beforeIncomingEvent:(e,t)=>{this._hookHandlers.before_incoming_event[e]=p.safePush(this._hookHandlers.before_incoming_event[e],{handler:t,order:this._registerOrder++})},beforeIncomingMessage:(e,t)=>{this._hookHandlers.before_incoming_message[e]=p.safePush(this._hookHandlers.before_incoming_message[e],{handler:t,order:this._registerOrder++})},beforeOutgoingMessage:(e,t)=>{this._hookHandlers.before_outgoing_message[e]=p.safePush(this._hookHandlers.before_outgoing_message[e],{handler:t,order:this._registerOrder++})},beforeOutgoingCallAction:(e,t)=>{this._hookHandlers.before_outgoing_call_action[e]=p.safePush(this._hookHandlers.before_outgoing_call_action[e],{handler:t,order:this._registerOrder++})},beforeIncomingCallAction:(e,t)=>{this._hookHandlers.before_incoming_call_action[e]=p.safePush(this._hookHandlers.before_incoming_call_action[e],{handler:t,order:this._registerOrder++})},afterIncomingEvent:(e,t)=>{this._hookHandlers.after_incoming_event[e]=p.safePush(this._hookHandlers.after_incoming_event[e],{handler:t,order:this._registerOrder++})},afterIncomingMessage:(e,t)=>{this._hookHandlers.after_incoming_message[e]=p.safePush(this._hookHandlers.after_incoming_message[e],{handler:t,order:this._registerOrder++})},afterOutgoingMessage:(e,t)=>{this._hookHandlers.after_outgoing_message[e]=p.safePush(this._hookHandlers.after_outgoing_message[e],{handler:t,order:this._registerOrder++})},afterOutgoingCallAction:(e,t)=>{this._hookHandlers.after_outgoing_call_action[e]=p.safePush(this._hookHandlers.after_outgoing_call_action[e],{handler:t,order:this._registerOrder++})},afterIncomingCallAction:(e,t)=>{this._hookHandlers.after_incoming_call_action[e]=p.safePush(this._hookHandlers.after_incoming_call_action[e],{handler:t,order:this._registerOrder++})},workflowStart:(e,t)=>{this._workflowHandlers.started[e]=p.safePush(this._workflowHandlers.started[e],{handler:t,order:this._registerOrder++})},workflowContinue:(e,t)=>{this._workflowHandlers.continued[e]=p.safePush(this._workflowHandlers.continued[e],{handler:t,order:this._registerOrder++})},workflowTimeout:(e,t)=>{this._workflowHandlers.timed_out[e]=p.safePush(this._workflowHandlers.timed_out[e],{handler:t,order:this._registerOrder++})}};_eventResolvesTo=(e,t)=>{let[i,a]=e.split(":");if(!i||!a)return!1;let o=this._runtime.interfaces[i];if(o&&t===`${o.integrationAlias}:${o?.events?.[a]?.name}`)return!0;let r=this._runtime.integrations[i];return!!(r&&t===`${r.integrationAlias}:${a}`)};_stripAliasPrefix=e=>{let{alias:t}=this._runtime;if(!t)return e;let s=`${t}#`;return e.startsWith(s)?e.slice(s.length):e}};var Ee={};W(Ee,{allWithinMajorOf:()=>mn,allWithinMinorOf:()=>hn});var J=he(require("semver"));function mn(n){let e=J.major(n.version);return{...n,version:`>=${e}.0.0 <${e+1}.0.0`}}function hn(n){let e=J.major(n.version),t=J.minor(n.version);return{...n,version:`>=${e}.${t}.0 <${e}.${t+1}.0`}}0&&(module.exports={Bot,BotDefinition,BotLogger,BotSpecificClient,Integration,IntegrationDefinition,IntegrationLogger,IntegrationSpecificClient,InterfaceDefinition,OAUTH_IDENTIFIER_HEADER,Plugin,PluginDefinition,RuntimeError,WELL_KNOWN_ATTRIBUTES,errors,handlerErrorToHttpResponse,isApiError,messages,parseBody,serve,version,z});