@botpress/sdk 0.0.10 → 0.0.13

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.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var ue=Object.create;var H=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var fe=Object.getPrototypeOf,me=Object.prototype.hasOwnProperty;var K=(t,e)=>{for(var n in e)H(t,n,{get:e[n],enumerable:!0})},Z=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ye(e))!me.call(t,o)&&o!==n&&H(t,o,{get:()=>e[o],enumerable:!(r=le(e,o))||r.enumerable});return t};var j=(t,e,n)=>(n=t!=null?ue(fe(t)):{},Z(e||!t||!t.__esModule?H(n,"default",{value:t,enumerable:!0}):n,t)),he=t=>Z(H({},"__esModule",{value:!0}),t);var at={};K(at,{Bot:()=>E,Integration:()=>M,IntegrationDefinition:()=>k,botIdHeader:()=>d,botUserIdHeader:()=>C,clients:()=>it,configurationHeader:()=>u,integrationIdHeader:()=>P,messages:()=>N,operationHeader:()=>l,serve:()=>b,typeHeader:()=>S,webhookIdHeader:()=>I});module.exports=he(at);var L=j(require("axios"));var d="x-bot-id",C="x-bot-user-id",P="x-integration-id",I="x-webhook-id",u="x-bp-configuration",l="x-bp-operation",S="x-bp-type";var O=class{axios;constructor(e){this.axios=e??L.default.create({timeout:5e3})}register=e=>_("register",e,this.axios);unregister=e=>_("unregister",e,this.axios);eventReceived=e=>_("event_received",e,this.axios)};function be(t){return{[S]:t.type,[d]:t.botId,[l]:t.operation,[u]:Buffer.from(typeof t.configuration=="string"?t.configuration:JSON.stringify(t.configuration),"utf-8").toString("base64")}}async function _(t,{url:e,data:n,...r},o){return(await o.post(e,n,{headers:be({...r,operation:t})})).data}var F=require("node:http");var h=console;async function b(t,e=8072,n=Pe){let r=(0,F.createServer)(async(o,i)=>{try{let s=await xe(o),g=await t(s);i.writeHead(g?.status??200,g?.headers??{}).end(g?.body??"{}")}catch(s){h.error("Error while handling request",{error:s?.message??"Internal error occured"}),i.writeHead(500).end(JSON.stringify({error:s?.message??"Internal error occured"}))}});return r.listen(e,()=>n(e)),r}async function xe(t){let e=await Ce(t),n={};for(let o=0;o<t.rawHeaders.length;o+=2){let i=t.rawHeaders[o].toLowerCase(),s=t.rawHeaders[o+1];n[i]=s}let r=new URL(t.url??"",t.headers.host?`http://${t.headers.host}`:"http://botpress.cloud");return{body:e,path:r.pathname,query:ve(r.search,"?"),headers:n,method:t.method?.toUpperCase()??"GET"}}function ve(t,e){return t.indexOf(e)===0?t.slice(e.length):t}async function Ce(t){return new Promise((e,n)=>{if(t.method!=="POST"&&t.method!=="PUT"&&t.method!=="PATCH")return e(void 0);let r="";t.on("data",o=>r+=o.toString()),t.on("error",o=>n(o)),t.on("end",()=>e(r))})}function Pe(t){h.info(`Listening on port ${t}`)}var z=require("@botpress/client");var W=require("zod"),G=W.z.enum(["event_received","register","unregister","ping"]);var V=t=>async e=>{let n=Ie(e.headers);n.operation!=="ping"&&h.info(`Received ${n.operation} operation for bot ${n.botId} of type ${n.type}`);let r=new z.Client({botId:n.botId}),o={req:e,botState:t,ctx:n,client:r};switch(n.operation){case"event_received":await Se(o);break;case"register":await De(o);break;case"unregister":await Te(o);break;case"ping":await we(o);break;default:throw new Error(`Unknown operation ${n.operation}`)}return{status:200}};function Ie(t){let e=t[d],n=t[u],r=t[S],o=G.parse(t[l]);if(!e)throw new Error("Missing bot headers");if(!r)throw new Error("Missing type headers");if(!n)throw new Error("Missing configuration headers");if(!o)throw new Error("Missing operation headers");return{botId:e,operation:o,type:r,configuration:n?JSON.parse(Buffer.from(n,"base64").toString("utf-8")):{}}}async function Se({botState:t,ctx:e,req:n}){h.debug(`Received event ${e.type}`);let r=new z.Client({botId:e.botId}),o=Be(n);switch(e.type){case"message_created":await Promise.all(t.messageHandlers.map(i=>i({client:r,user:o.event.payload.user,conversation:o.event.payload.conversation,message:o.event.payload.message,event:o.event,ctx:e})));break;case"state_expired":await Promise.all(t.stateExpiredHandlers.map(i=>i({client:r,state:o.event.payload.state,ctx:e})));break;default:await Promise.all(t.eventHandlers.map(i=>i({client:r,event:o.event,ctx:e})))}}async function we(t){}async function De(t){}async function Te(t){}function Be(t){if(!t.body)throw new Error("Missing body");return JSON.parse(t.body)}var E=class{_state={registerHandlers:[],unregisterHandlers:[],messageHandlers:[],eventHandlers:[],stateExpiredHandlers:[]};tags;states;integrations;configuration;events;recurringEvents;constructor(e={}){this.tags=e.tags,this.states=e.states,this.integrations=e.integrations,this.configuration=e.configuration,this.events=e.events,this.recurringEvents=e.recurringEvents}register=e=>{};unregister=e=>{};message=(e,n)=>{this._state.messageHandlers.push(n)};conversation=(e,n)=>{};user=(e,n)=>{};event=(e,n)=>{this._state.eventHandlers.push(n)};stateExpired=(e,n)=>{this._state.stateExpiredHandlers.push(n)};handler=V(this._state);start=e=>b(this.handler,e)};var q=require("@botpress/client"),J=j(require("axios"));var X=require("@botpress/client"),w=require("zod"),Q=new X.RuntimeError(""),Y=w.z.object({code:w.z.literal(Q.code),type:w.z.literal(Q.type),message:w.z.string()});var R=class{axios;constructor(e){this.axios=e??J.default.create({timeout:5e3})}actionTriggered=e=>y("action_triggered",e,this.axios);messageCreated=e=>y("message_created",e,this.axios);register=e=>y("register",e,this.axios);unregister=e=>y("unregister",e,this.axios);webhookReceived=e=>y("webhook_received",e,this.axios);createUser=e=>y("create_user",e,this.axios);createConversation=e=>y("create_conversation",e,this.axios)};function He(t){return{[d]:t.botId,[l]:t.operation,[C]:t.botUserId,[P]:t.integrationId,[I]:t.webhookId,[u]:Buffer.from(typeof t.configuration=="string"?t.configuration:JSON.stringify(t.configuration),"utf-8").toString("base64")}}async function y(t,{url:e,data:n,...r},o){try{return await o.post(e,n,{headers:He({...r,operation:t})})}catch(i){let s=new q.RuntimeError("").code;if(J.default.isAxiosError(i)&&i.response?.status===s){let g=Y.safeParse(i.response.data);if(g.success)throw new q.RuntimeError(g.data.message)}throw i}}var ee=require("zod"),te=ee.z.enum(["webhook_received","message_created","action_triggered","register","unregister","ping","create_user","create_conversation"]);var x=require("radash"),a=require("zod");var ne=j(require("zod-to-json-schema")),Oe=t=>t?.type==="object";function f(t){let e=(0,ne.default)(t.schema,{errorMessages:!0});if(!Oe(e)||!t.ui)return e;for(let[n,r]of Object.entries(t.ui??{})){let o=e.properties?.[n];o&&(r?.title&&(o.title=r.title),r?.examples&&(o.examples=r.examples))}return e}var Ee=t=>{let e=a.z.record(t);return{min:n=>e.refine(r=>Object.keys(r).length>=n,{message:`At least ${n} item(s) must be defined`})}},v=a.z.object({}).passthrough(),Re=a.z.object({schema:v}),ke=a.z.object({schema:v}),Ae=a.z.object({input:a.z.object({schema:v}),output:a.z.object({schema:v})}),Me=a.z.object({schema:v}),oe=a.z.object({conversations:a.z.array(a.z.string()).optional(),users:a.z.array(a.z.string()).optional(),messages:a.z.array(a.z.string()).optional()}),Ue=a.z.object({tags:oe.omit({users:!0}).optional(),messages:Ee(Me).min(1),conversation:a.z.object({creation:a.z.object({enabled:a.z.boolean(),requiredTags:a.z.array(a.z.string())})}).optional()}),je=a.z.object({type:a.z.union([a.z.literal("integration"),a.z.literal("conversation"),a.z.literal("user")]),schema:v}),_e=a.z.object({name:a.z.string(),version:a.z.string(),icon:a.z.string().optional(),title:a.z.string().optional(),description:a.z.string().optional(),tags:oe.pick({users:!0}).optional(),configuration:Re.optional(),events:a.z.record(ke).optional(),actions:a.z.record(Ae).optional(),channels:a.z.record(Ue).optional(),states:a.z.record(je).optional(),user:a.z.object({creation:a.z.object({enabled:a.z.boolean(),requiredTags:a.z.array(a.z.string())})}).optional(),public:a.z.boolean().optional(),secrets:a.z.array(a.z.string()).optional()});function ze(t){return{...t,configuration:t.configuration?{...t.configuration,schema:f(t.configuration)}:void 0,events:t.events?(0,x.mapValues)(t.events,e=>({...e,schema:f(e)})):void 0,actions:t.actions?(0,x.mapValues)(t.actions,e=>({...e,input:{...e.input,schema:f(e.input)},output:{...e.output,schema:f(e.output)}})):void 0,channels:t.channels?(0,x.mapValues)(t.channels,e=>({...e,messages:(0,x.mapValues)(e.messages,n=>({...n,schema:f(n)}))})):void 0,states:t.states?(0,x.mapValues)(t.states,e=>({...e,schema:f(e)})):void 0,user:t.user}}var k=class{name;version;icon;title;description;tags;configuration;events;actions;channels;states;user;public;secrets;constructor(e){let n=ze(e),r=_e.parse(n),{name:o,version:i,icon:s,title:g,description:D,tags:T,configuration:B,events:$,actions:U,channels:se,states:ce,user:pe,public:ge,secrets:de}=r;this.name=o,this.version=i,this.icon=s,this.title=g,this.description=D,this.tags=T,this.configuration=B,this.events=$,this.actions=U,this.channels=se,this.states=ce,this.user=pe,this.public=ge,this.secrets=de}};var A=require("@botpress/client");var qe=console;var re=t=>async e=>{let n=Je(e.headers),r=new A.Client({botId:n.botId,integrationId:n.integrationId});n.operation!=="ping"&&qe.debug("Received webhook request",{headers:e.headers,body:e.body});let o={integration:t,ctx:n,req:e,client:r};try{let i;switch(n.operation){case"webhook_received":i=await $e(o);break;case"register":i=await Ke(o);break;case"unregister":i=await Ze(o);break;case"message_created":i=await We(o);break;case"action_triggered":i=await Ge(o);break;case"ping":i=await Ne(o);break;case"create_user":i=await Le(o);break;case"create_conversation":i=await Fe(o);break;default:throw new Error(`Unknown operation ${n.operation}`)}return i?{...i,status:i.status??200}:{status:200}}catch(i){if(i instanceof A.RuntimeError)return{status:i.code,body:JSON.stringify(i.toJSON())};throw i}};function Je(t){let e=t[d],n=t[C],r=t[P],o=t[I],i=t[u],s=te.parse(t[l]);if(!e)throw new Error("Missing bot headers");if(!n)throw new Error("Missing bot user headers");if(!r)throw new Error("Missing integration headers");if(!o)throw new Error("Missing webhook headers");if(!i)throw new Error("Missing configuration headers");if(!s)throw new Error("Missing operation headers");return{botId:e,botUserId:n,integrationId:r,webhookId:o,operation:s,configuration:i?JSON.parse(Buffer.from(i,"base64").toString("utf-8")):{}}}function m(t){if(!t.body)throw new Error("Missing body");return JSON.parse(t.body)}async function Ne(t){}async function $e({client:t,ctx:e,integration:n,req:r}){let{req:o}=m(r);return n.handler({client:t,ctx:e,req:o})}async function Ke({client:t,ctx:e,integration:n,req:r}){if(!n.register)return;let{webhookUrl:o}=m(r);await n.register({client:t,ctx:e,webhookUrl:o})}async function Ze({client:t,ctx:e,integration:n,req:r}){if(!n.unregister)return;let{webhookUrl:o}=m(r);await n.unregister({ctx:e,webhookUrl:o,client:t})}async function Le({client:t,ctx:e,integration:n,req:r}){if(!n.createUser)return;let{tags:o}=m(r);return await n.createUser({ctx:e,client:t,tags:o})}async function Fe({client:t,ctx:e,integration:n,req:r}){if(!n.createConversation)return;let{channel:o,tags:i}=m(r);return await n.createConversation({ctx:e,client:t,channel:o,tags:i})}async function We({ctx:t,integration:e,req:n,client:r}){let{conversation:o,user:i,type:s,payload:g,message:D}=m(n),T=e.channels[o.channel];if(!T)throw new Error(`Channel ${o.channel} not found`);let B=T.messages[s];if(!B)throw new Error(`Message of type ${s} not found in channel ${o.channel}`);await B({ctx:t,conversation:o,message:D,user:i,type:s,client:r,payload:g,ack:async({tags:U})=>{await r.updateMessage({id:D.id,tags:U})}})}async function Ge({req:t,integration:e,ctx:n,client:r}){let{input:o,type:i}=m(t);if(!i)throw new Error("Missing action type");let s=e.actions[i];if(!s)throw new Error(`Action ${i} not found`);let g=await s({ctx:n,input:o,client:r,type:i});return{body:JSON.stringify({output:g})}}var M=class{actions;channels;register;unregister;handler;start;constructor(e){this.actions=e.actions,this.channels=e.channels,this.register=e.register,this.unregister=e.unregister,this.handler=re(e),this.start=n=>b(this.handler,n)}};var N={};K(N,{defaults:()=>rt});var c=require("zod"),p=c.z.string().min(1),Ve=c.z.object({text:p}),Qe=c.z.object({markdown:p}),Xe=c.z.object({imageUrl:p}),Ye=c.z.object({audioUrl:p}),et=c.z.object({videoUrl:p}),tt=c.z.object({fileUrl:p,title:p.optional()}),nt=c.z.object({latitude:c.z.number(),longitude:c.z.number()}),ae=c.z.object({title:p,subtitle:p.optional(),imageUrl:p.optional(),actions:c.z.array(c.z.object({action:c.z.enum(["postback","url","say"]),label:p,value:p}))}),ie=c.z.object({text:p,options:c.z.array(c.z.object({label:p,value:p}))}),ot=c.z.object({items:c.z.array(ae)}),rt={text:{schema:Ve},markdown:{schema:Qe},image:{schema:Xe},audio:{schema:Ye},video:{schema:et},file:{schema:tt},location:{schema:nt},carousel:{schema:ot},card:{schema:ae},dropdown:{schema:ie},choice:{schema:ie}};var it={IntegrationClient:R,BotClient:O};0&&(module.exports={Bot,Integration,IntegrationDefinition,botIdHeader,botUserIdHeader,clients,configurationHeader,integrationIdHeader,messages,operationHeader,serve,typeHeader,webhookIdHeader});
1
+ "use strict";var me=Object.create;var O=Object.defineProperty;var he=Object.getOwnPropertyDescriptor;var be=Object.getOwnPropertyNames;var ve=Object.getPrototypeOf,xe=Object.prototype.hasOwnProperty;var K=(e,t)=>{for(var n in t)O(e,n,{get:t[n],enumerable:!0})},Z=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of be(t))!xe.call(e,o)&&o!==n&&O(e,o,{get:()=>t[o],enumerable:!(r=he(t,o))||r.enumerable});return e};var _=(e,t,n)=>(n=e!=null?me(ve(e)):{},Z(t||!e||!e.__esModule?O(n,"default",{value:e,enumerable:!0}):n,e)),Ie=e=>Z(O({},"__esModule",{value:!0}),e);var pt={};K(pt,{Bot:()=>H,Integration:()=>U,IntegrationDefinition:()=>A,botIdHeader:()=>d,botUserIdHeader:()=>I,clients:()=>ct,configurationHeader:()=>u,integrationIdHeader:()=>P,messages:()=>N,operationHeader:()=>l,serve:()=>h,typeHeader:()=>w,webhookIdHeader:()=>C});module.exports=Ie(pt);var L=_(require("axios"));var d="x-bot-id",I="x-bot-user-id",P="x-integration-id",C="x-webhook-id",u="x-bp-configuration",l="x-bp-operation",w="x-bp-type";var B=class{axios;constructor(t){this.axios=t??L.default.create({timeout:5e3})}register=t=>z("register",t,this.axios);unregister=t=>z("unregister",t,this.axios);eventReceived=t=>z("event_received",t,this.axios)};function Pe(e){return{[w]:e.type,[d]:e.botId,[l]:e.operation,[u]:Buffer.from(typeof e.configuration=="string"?e.configuration:JSON.stringify(e.configuration),"utf-8").toString("base64")}}async function z(e,{url:t,data:n,...r},o){return(await o.post(t,n,{headers:Pe({...r,operation:e})})).data}var V=require("node:http");var m=console;async function h(e,t=8072,n=De){let r=(0,V.createServer)(async(o,i)=>{try{let s=await Ce(o),g=await e(s);i.writeHead(g?.status??200,g?.headers??{}).end(g?.body??"{}")}catch(s){m.error("Error while handling request",{error:s?.message??"Internal error occured"}),i.writeHead(500).end(JSON.stringify({error:s?.message??"Internal error occured"}))}});return r.listen(t,()=>n(t)),r}async function Ce(e){let t=await Se(e),n={};for(let o=0;o<e.rawHeaders.length;o+=2){let i=e.rawHeaders[o].toLowerCase(),s=e.rawHeaders[o+1];n[i]=s}let r=new URL(e.url??"",e.headers.host?`http://${e.headers.host}`:"http://botpress.cloud");return{body:t,path:r.pathname,query:we(r.search,"?"),headers:n,method:e.method?.toUpperCase()??"GET"}}function we(e,t){return e.indexOf(t)===0?e.slice(t.length):e}async function Se(e){return new Promise((t,n)=>{if(e.method!=="POST"&&e.method!=="PUT"&&e.method!=="PATCH")return t(void 0);let r="";e.on("data",o=>r+=o.toString()),e.on("error",o=>n(o)),e.on("end",()=>t(r))})}function De(e){m.info(`Listening on port ${e}`)}var q=require("@botpress/client");var F=require("zod"),W=F.z.enum(["event_received","register","unregister","ping"]);var G=e=>async t=>{let n=Te(t.headers);n.operation!=="ping"&&m.info(`Received ${n.operation} operation for bot ${n.botId} of type ${n.type}`);let r=new q.Client({botId:n.botId}),o={req:t,botState:e,ctx:n,client:r};switch(n.operation){case"event_received":await Ee(o);break;case"register":await Be(o);break;case"unregister":await He(o);break;case"ping":await Oe(o);break;default:throw new Error(`Unknown operation ${n.operation}`)}return{status:200}};function Te(e){let t=e[d],n=e[u],r=e[w],o=W.parse(e[l]);if(!t)throw new Error("Missing bot headers");if(!r)throw new Error("Missing type headers");if(!n)throw new Error("Missing configuration headers");if(!o)throw new Error("Missing operation headers");return{botId:t,operation:o,type:r,configuration:n?JSON.parse(Buffer.from(n,"base64").toString("utf-8")):{}}}async function Ee({botState:e,ctx:t,req:n}){m.debug(`Received event ${t.type}`);let r=new q.Client({botId:t.botId}),o=Re(n);switch(t.type){case"message_created":await Promise.all(e.messageHandlers.map(i=>i({client:r,user:o.event.payload.user,conversation:o.event.payload.conversation,message:o.event.payload.message,event:o.event,ctx:t})));break;case"state_expired":await Promise.all(e.stateExpiredHandlers.map(i=>i({client:r,state:o.event.payload.state,ctx:t})));break;default:await Promise.all(e.eventHandlers.map(i=>i({client:r,event:o.event,ctx:t})))}}async function Oe(e){}async function Be(e){}async function He(e){}function Re(e){if(!e.body)throw new Error("Missing body");return JSON.parse(e.body)}var H=class{_state={registerHandlers:[],unregisterHandlers:[],messageHandlers:[],eventHandlers:[],stateExpiredHandlers:[]};tags;states;integrations;configuration;events;recurringEvents;constructor(t={}){this.tags=t.tags,this.states=t.states,this.integrations=t.integrations,this.configuration=t.configuration,this.events=t.events,this.recurringEvents=t.recurringEvents}register=t=>{};unregister=t=>{};message=(t,n)=>{this._state.messageHandlers.push(n)};conversation=(t,n)=>{};user=(t,n)=>{};event=(t,n)=>{this._state.eventHandlers.push(n)};stateExpired=(t,n)=>{this._state.stateExpiredHandlers.push(n)};handler=G(this._state);start=t=>h(this.handler,t)};var J=require("@botpress/client"),k=_(require("axios"));var X=require("@botpress/client"),S=require("zod"),Q=new X.RuntimeError(""),Y=S.z.object({code:S.z.literal(Q.code),type:S.z.literal(Q.type),message:S.z.string()});var R=class{axios;constructor(t){this.axios=t??k.default.create({timeout:5e3})}actionTriggered=t=>b("action_triggered",t,this.axios);messageCreated=t=>b("message_created",t,this.axios);register=t=>b("register",t,this.axios);unregister=t=>b("unregister",t,this.axios);webhookReceived=t=>ke("webhook_received",t,this.axios);createUser=t=>b("create_user",t,this.axios);createConversation=t=>b("create_conversation",t,this.axios)};function ee(e){return{[d]:e.botId,[l]:e.operation,[I]:e.botUserId,[P]:e.integrationId,[C]:e.webhookId,[u]:Buffer.from(typeof e.configuration=="string"?e.configuration:JSON.stringify(e.configuration),"utf-8").toString("base64")}}async function ke(e,{url:t,data:n,...r},o){return await o.post(t,n,{headers:ee({...r,operation:e})}).catch(s=>{if(k.default.isAxiosError(s)&&s.response?.status&&s.response.status<500)return s.response;throw s})}async function b(e,{url:t,data:n,...r},o){try{return await o.post(t,n,{headers:ee({...r,operation:e})})}catch(i){let s=new J.RuntimeError("").code;if(k.default.isAxiosError(i)&&i.response?.status===s){let g=Y.safeParse(i.response.data);if(g.success)throw new J.RuntimeError(g.data.message)}throw i}}var te=require("zod"),ne=te.z.enum(["webhook_received","message_created","action_triggered","register","unregister","ping","create_user","create_conversation"]);var v=require("radash"),a=require("zod");var oe=_(require("zod-to-json-schema")),Ae=e=>e?.type==="object";function f(e){let t=(0,oe.default)(e.schema,{errorMessages:!0});if(!Ae(t)||!e.ui)return t;for(let[n,r]of Object.entries(e.ui??{})){let o=t.properties?.[n];o&&(r?.title&&(o.title=r.title),r?.examples&&(o.examples=r.examples))}return t}var Me=e=>{let t=a.z.record(e);return{min:n=>t.refine(r=>Object.keys(r).length>=n,{message:`At least ${n} item(s) must be defined`})}},x=a.z.object({}).passthrough(),Ue=a.z.object({schema:x}),je=a.z.object({schema:x}),_e=a.z.object({input:a.z.object({schema:x}),output:a.z.object({schema:x})}),ze=a.z.object({schema:x}),ae=a.z.object({conversations:a.z.array(a.z.string()).optional(),users:a.z.array(a.z.string()).optional(),messages:a.z.array(a.z.string()).optional()}),qe=a.z.object({tags:ae.omit({users:!0}).optional(),messages:Me(ze).min(1),conversation:a.z.object({creation:a.z.object({enabled:a.z.boolean(),requiredTags:a.z.array(a.z.string())})}).optional()}),Je=a.z.object({type:a.z.union([a.z.literal("integration"),a.z.literal("conversation"),a.z.literal("user")]),schema:x}),Ne=a.z.object({name:a.z.string(),version:a.z.string(),public:a.z.boolean().optional(),title:a.z.string().optional(),description:a.z.string().optional(),icon:a.z.string().optional(),readme:a.z.string().optional(),tags:ae.pick({users:!0}).optional(),configuration:Ue.optional(),events:a.z.record(je).optional(),actions:a.z.record(_e).optional(),channels:a.z.record(qe).optional(),states:a.z.record(Je).optional(),user:a.z.object({creation:a.z.object({enabled:a.z.boolean(),requiredTags:a.z.array(a.z.string())})}).optional(),secrets:a.z.array(a.z.string()).optional()}),re="0.2.0",ie="0.0.1";function $e(e){return{...e,configuration:e.configuration?{...e.configuration,schema:f(e.configuration)}:void 0,events:e.events?(0,v.mapValues)(e.events,t=>({...t,schema:f(t)})):void 0,actions:e.actions?(0,v.mapValues)(e.actions,t=>({...t,input:{...t.input,schema:f(t.input)},output:{...t.output,schema:f(t.output)}})):void 0,channels:e.channels?(0,v.mapValues)(e.channels,t=>({...t,messages:(0,v.mapValues)(t.messages,n=>({...n,schema:f(n)}))})):void 0,states:e.states?(0,v.mapValues)(e.states,t=>({...t,schema:f(t)})):void 0,user:e.user}}var A=class{name;version;icon;readme;title;description;tags;configuration;events;actions;channels;states;user;public;secrets;constructor(t){let n=$e(t),r=Ne.parse(n);if(r.public&&r.version!==re)throw new Error(`Public integrations must have version ${re}`);if(!r.public&&r.version!==ie)throw new Error(`Private integrations must have version ${ie}`);let{name:o,version:i,icon:s,readme:g,title:D,description:T,tags:E,configuration:$,events:j,actions:ge,channels:de,states:ue,user:le,public:fe,secrets:ye}=r;this.name=o,this.version=i,this.icon=s,this.readme=g,this.title=D,this.description=T,this.tags=E,this.configuration=$,this.events=j,this.actions=ge,this.channels=de,this.states=ue,this.user=le,this.public=fe,this.secrets=ye}};var M=require("@botpress/client");var se=e=>async t=>{let n=Ke(t.headers),r=new M.Client({botId:n.botId,integrationId:n.integrationId}),o={integration:e,ctx:n,req:t,client:r};try{let i;switch(n.operation){case"webhook_received":i=await Le(o);break;case"register":i=await Ve(o);break;case"unregister":i=await Fe(o);break;case"message_created":i=await Qe(o);break;case"action_triggered":i=await Xe(o);break;case"ping":i=await Ze(o);break;case"create_user":i=await We(o);break;case"create_conversation":i=await Ge(o);break;default:throw new Error(`Unknown operation ${n.operation}`)}return i?{...i,status:i.status??200}:{status:200}}catch(i){if(i instanceof M.RuntimeError)return{status:i.code,body:JSON.stringify(i.toJSON())};throw i}};function Ke(e){let t=e[d],n=e[I],r=e[P],o=e[C],i=e[u],s=ne.parse(e[l]);if(!t)throw new Error("Missing bot headers");if(!n)throw new Error("Missing bot user headers");if(!r)throw new Error("Missing integration headers");if(!o)throw new Error("Missing webhook headers");if(!i)throw new Error("Missing configuration headers");if(!s)throw new Error("Missing operation headers");return{botId:t,botUserId:n,integrationId:r,webhookId:o,operation:s,configuration:i?JSON.parse(Buffer.from(i,"base64").toString("utf-8")):{}}}function y(e){if(!e.body)throw new Error("Missing body");return JSON.parse(e.body)}async function Ze(e){}async function Le({client:e,ctx:t,integration:n,req:r}){let{req:o}=y(r);return n.handler({client:e,ctx:t,req:o})}async function Ve({client:e,ctx:t,integration:n,req:r}){if(!n.register)return;let{webhookUrl:o}=y(r);await n.register({client:e,ctx:t,webhookUrl:o})}async function Fe({client:e,ctx:t,integration:n,req:r}){if(!n.unregister)return;let{webhookUrl:o}=y(r);await n.unregister({ctx:t,webhookUrl:o,client:e})}async function We({client:e,ctx:t,integration:n,req:r}){if(!n.createUser)return;let{tags:o}=y(r);return await n.createUser({ctx:t,client:e,tags:o})}async function Ge({client:e,ctx:t,integration:n,req:r}){if(!n.createConversation)return;let{channel:o,tags:i}=y(r);return await n.createConversation({ctx:t,client:e,channel:o,tags:i})}async function Qe({ctx:e,integration:t,req:n,client:r}){let{conversation:o,user:i,type:s,payload:g,message:D}=y(n),T=t.channels[o.channel];if(!T)throw new Error(`Channel ${o.channel} not found`);let E=T.messages[s];if(!E)throw new Error(`Message of type ${s} not found in channel ${o.channel}`);await E({ctx:e,conversation:o,message:D,user:i,type:s,client:r,payload:g,ack:async({tags:j})=>{await r.updateMessage({id:D.id,tags:j})}})}async function Xe({req:e,integration:t,ctx:n,client:r}){let{input:o,type:i}=y(e);if(!i)throw new Error("Missing action type");let s=t.actions[i];if(!s)throw new Error(`Action ${i} not found`);let g=await s({ctx:n,input:o,client:r,type:i});return{body:JSON.stringify({output:g})}}var U=class{actions;channels;register;unregister;handler;start;constructor(t){this.actions=t.actions,this.channels=t.channels,this.register=t.register,this.unregister=t.unregister,this.handler=se(t),this.start=n=>h(this.handler,n)}};var N={};K(N,{defaults:()=>st});var c=require("zod"),p=c.z.string().min(1),Ye=c.z.object({text:p}),et=c.z.object({markdown:p}),tt=c.z.object({imageUrl:p}),nt=c.z.object({audioUrl:p}),ot=c.z.object({videoUrl:p}),rt=c.z.object({fileUrl:p,title:p.optional()}),it=c.z.object({latitude:c.z.number(),longitude:c.z.number()}),pe=c.z.object({title:p,subtitle:p.optional(),imageUrl:p.optional(),actions:c.z.array(c.z.object({action:c.z.enum(["postback","url","say"]),label:p,value:p}))}),ce=c.z.object({text:p,options:c.z.array(c.z.object({label:p,value:p}))}),at=c.z.object({items:c.z.array(pe)}),st={text:{schema:Ye},markdown:{schema:et},image:{schema:tt},audio:{schema:nt},video:{schema:ot},file:{schema:rt},location:{schema:it},carousel:{schema:at},card:{schema:pe},dropdown:{schema:ce},choice:{schema:ce}};var ct={IntegrationClient:R,BotClient:B};0&&(module.exports={Bot,Integration,IntegrationDefinition,botIdHeader,botUserIdHeader,clients,configurationHeader,integrationIdHeader,messages,operationHeader,serve,typeHeader,webhookIdHeader});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/bot/client.ts", "../src/const.ts", "../src/serve.ts", "../src/log.ts", "../src/bot/server.ts", "../src/bot/context.ts", "../src/bot/implementation.ts", "../src/integration/client.ts", "../src/integration/error.ts", "../src/integration/context.ts", "../src/integration/definition.ts", "../src/integration/schema.ts", "../src/integration/server.ts", "../src/integration/implementation.ts", "../src/message.ts"],
4
- "sourcesContent": ["import { BotClient } from './bot'\nimport { IntegrationClient } from './integration'\n\nexport * as messages from './message'\nexport const clients = { IntegrationClient, BotClient }\n\nexport * from './const'\nexport * from './serve'\n\nexport {\n IntegrationDefinition,\n IntegrationDefinitionProps,\n IntegrationImplementation as Integration,\n IntegrationImplementationProps as IntegrationProps,\n IntegrationContext,\n IntegrationOperation,\n AckFunction,\n} from './integration'\nexport { Bot, BotContext, BotOperation, IntegrationInstance } from './bot'\n", "import axiosGlobal, { Axios as AxiosInstance } from 'axios'\nimport type { Merge, Except } from 'type-fest'\nimport { botIdHeader, operationHeader, configurationHeader, typeHeader } from '../const'\nimport type { BotContext, BotOperation } from './context'\nimport type { RegisterBotPayload, UnregisterBotPayload, EventReceivedBotPayload } from './implementation'\n\ntype Props<T = any> = Merge<\n Except<BotContext, 'operation'>,\n {\n url: string\n data: T\n }\n>\n\n/**\n * @description Meant to query your bot server directly (e.g. without going through the Botpress API)\n */\nexport class BotClient {\n private axios: AxiosInstance\n\n public constructor(axiosInstance?: AxiosInstance) {\n this.axios = axiosInstance ?? axiosGlobal.create({ timeout: 5000 })\n }\n\n public register = (props: Props<RegisterBotPayload>) => request('register', props, this.axios)\n public unregister = (props: Props<UnregisterBotPayload>) => request('unregister', props, this.axios)\n public eventReceived = (props: Props<EventReceivedBotPayload>) => request('event_received', props, this.axios)\n}\n\nexport function formatBotHeaders(ctx: BotContext) {\n return {\n [typeHeader]: ctx.type,\n [botIdHeader]: ctx.botId,\n [operationHeader]: ctx.operation,\n [configurationHeader]: Buffer.from(\n typeof ctx.configuration === 'string' ? ctx.configuration : JSON.stringify(ctx.configuration),\n 'utf-8'\n ).toString('base64'),\n }\n}\n\nasync function request<O = any>(operation: BotOperation, { url, data, ...ctx }: Props, axios: AxiosInstance) {\n const response = await axios.post<O>(url, data, {\n headers: formatBotHeaders({\n ...ctx,\n operation,\n }),\n })\n\n return response.data\n}\n", "export const botIdHeader = 'x-bot-id'\nexport const botUserIdHeader = 'x-bot-user-id'\nexport const integrationIdHeader = 'x-integration-id'\nexport const webhookIdHeader = 'x-webhook-id'\n\nexport const configurationHeader = 'x-bp-configuration'\nexport const operationHeader = 'x-bp-operation'\nexport const typeHeader = 'x-bp-type'\n", "import { createServer, IncomingMessage, Server } from 'node:http'\nimport { log } from './log'\n\nexport type Request = {\n body?: string\n path: string\n query: string\n method: string\n headers: { [key: string]: string | undefined }\n}\n\nexport type Response = {\n body?: string\n headers?: { [key: string]: string }\n status?: number\n}\n\nexport type Handler = (req: Request) => Promise<Response | void>\n\nexport async function serve(\n handler: Handler,\n port: number = 8072,\n callback: (port: number) => void = defaultCallback\n): Promise<Server> {\n /* eslint-disable @typescript-eslint/no-misused-promises */\n const server = createServer(async (req, res) => {\n try {\n const request = await mapIncomingMessageToRequest(req)\n const response = await handler(request)\n res.writeHead(response?.status ?? 200, response?.headers ?? {}).end(response?.body ?? '{}')\n } catch (e: any) {\n log.error('Error while handling request', { error: e?.message ?? 'Internal error occured' })\n res.writeHead(500).end(JSON.stringify({ error: e?.message ?? 'Internal error occured' }))\n }\n })\n\n server.listen(port, () => callback(port))\n return server\n}\n\nasync function mapIncomingMessageToRequest(incoming: IncomingMessage): Promise<Request> {\n const body = await readBody(incoming)\n const headers = {} as Request['headers']\n\n for (let i = 0; i < incoming.rawHeaders.length; i += 2) {\n const key = incoming.rawHeaders[i]!.toLowerCase()\n const value = incoming.rawHeaders[i + 1]!\n headers[key] = value\n }\n\n const url = new URL(\n incoming.url ?? '',\n incoming.headers.host ? `http://${incoming.headers.host}` : 'http://botpress.cloud'\n )\n\n return {\n body,\n path: url.pathname,\n query: trimPrefix(url.search, '?'),\n headers,\n method: incoming.method?.toUpperCase() ?? 'GET',\n }\n}\n\nfunction trimPrefix(value: string, prefix: string) {\n return value.indexOf(prefix) === 0 ? value.slice(prefix.length) : value\n}\n\nasync function readBody(incoming: IncomingMessage) {\n return new Promise<string | undefined>((resolve, reject) => {\n if (incoming.method !== 'POST' && incoming.method !== 'PUT' && incoming.method !== 'PATCH') {\n return resolve(undefined)\n }\n\n let body = ''\n\n incoming.on('data', (chunk) => (body += chunk.toString()))\n incoming.on('error', (e) => reject(e))\n incoming.on('end', () => resolve(body))\n })\n}\n\nfunction defaultCallback(port: number) {\n log.info(`Listening on port ${port}`)\n}\n", "export type Logger = {\n debug(message: string, metadata?: any): void\n info(message: string, metadata?: any): void\n warn(message: string, metadata?: any): void\n error(message: string, metadata?: any): void\n}\nexport const log: Logger = console\n", "import { Client } from '@botpress/client'\nimport { botIdHeader, configurationHeader, operationHeader, typeHeader } from '../const'\nimport { log } from '../log'\nimport type { Handler, Request, Response } from '../serve'\nimport { BotContext, botOperationSchema } from './context'\nimport type { EventReceivedBotPayload } from './implementation'\nimport type { BotState } from './state'\n\ntype OperationHandlerProps = {\n botState: BotState\n ctx: BotContext\n client: Client\n req: Request\n}\n\nexport const createBotHandler =\n (botState: BotState): Handler =>\n async (req: Request): Promise<Response> => {\n const ctx = extractContext(req.headers)\n\n if (ctx.operation !== 'ping') {\n log.info(`Received ${ctx.operation} operation for bot ${ctx.botId} of type ${ctx.type}`)\n }\n\n const client = new Client({ botId: ctx.botId })\n\n const props: OperationHandlerProps = {\n req,\n botState,\n ctx,\n client,\n }\n\n switch (ctx.operation) {\n case 'event_received':\n await onEventReceived(props)\n break\n case 'register':\n await onRegister(props)\n break\n case 'unregister':\n await onUnregister(props)\n break\n case 'ping':\n await onPing(props)\n break\n default:\n throw new Error(`Unknown operation ${ctx.operation}`)\n }\n\n return { status: 200 }\n }\n\nfunction extractContext(headers: Record<string, string | undefined>): BotContext {\n const botId = headers[botIdHeader]\n const base64Configuration = headers[configurationHeader]\n const type = headers[typeHeader]\n const operation = botOperationSchema.parse(headers[operationHeader])\n\n if (!botId) {\n throw new Error('Missing bot headers')\n }\n\n if (!type) {\n throw new Error('Missing type headers')\n }\n\n if (!base64Configuration) {\n throw new Error('Missing configuration headers')\n }\n\n if (!operation) {\n throw new Error('Missing operation headers')\n }\n\n return {\n botId,\n operation,\n type,\n configuration: base64Configuration ? JSON.parse(Buffer.from(base64Configuration, 'base64').toString('utf-8')) : {},\n }\n}\n\nasync function onEventReceived({ botState, ctx, req }: OperationHandlerProps) {\n log.debug(`Received event ${ctx.type}`)\n\n const client = new Client({ botId: ctx.botId })\n\n const body = parseBody<EventReceivedBotPayload>(req)\n\n switch (ctx.type) {\n case 'message_created':\n await Promise.all(\n botState.messageHandlers.map((handler) =>\n handler({\n client,\n user: body.event.payload.user as any,\n conversation: body.event.payload.conversation as any,\n message: body.event.payload.message as any,\n event: body.event,\n ctx,\n })\n )\n )\n break\n case 'state_expired':\n await Promise.all(\n botState.stateExpiredHandlers.map((handler) =>\n handler({\n client,\n state: body.event.payload.state as any,\n ctx,\n })\n )\n )\n break\n default:\n await Promise.all(\n botState.eventHandlers.map((handler) =>\n handler({\n client,\n event: body.event,\n ctx,\n })\n )\n )\n }\n}\n\n// TODO implement the ping operation once the signature is defined\nasync function onPing(_: OperationHandlerProps) {}\n\nasync function onRegister(_: OperationHandlerProps) {}\n\nasync function onUnregister(_: OperationHandlerProps) {}\n\nfunction parseBody<T>(req: Request): T {\n if (!req.body) {\n throw new Error('Missing body')\n }\n\n return JSON.parse(req.body)\n}\n", "import { z } from 'zod'\n\nexport const botOperationSchema = z.enum(['event_received', 'register', 'unregister', 'ping'])\n\nexport type BotOperation = z.infer<typeof botOperationSchema>\n\nexport type BotContext<Configuration = any, Type extends string = string> = {\n botId: string\n type: Type\n operation: BotOperation\n configuration: Configuration\n}\n", "import type { Bot as BotType, Event } from '@botpress/client'\nimport type { Server } from 'node:http'\nimport { serve } from '../serve'\nimport { createBotHandler } from './server'\nimport type {\n BotState,\n EventHandler,\n MessageHandler,\n RegisterHandler,\n StateExpiredHandler,\n UnregisterHandler,\n} from './state'\n\nexport type RegisterBotPayload = {\n bot: BotType\n}\n\nexport type UnregisterBotPayload = {\n bot: BotType\n}\n\nexport type EventReceivedBotPayload = {\n event: Event\n}\n\nexport type BotDefinitionTags = {\n messages?: string[]\n conversations?: string[]\n users?: string[]\n}\n\nexport type BotDefinitionStateType = 'conversation' | 'user' | 'bot'\nexport type BotDefinitionState = {\n type: BotDefinitionStateType\n schema: Record<string, any>\n expiry?: number\n}\n\nexport type IntegrationInstance = {\n enabled: boolean\n id: string\n configuration: { [key: string]: any }\n}\n\nexport type BotDefinitionRecurringEvent = {\n type: string\n payload: Record<string, any>\n schedule: {\n cron: string\n }\n}\n\nexport type BotDefinitionEvent = {\n schema: Record<string, any>\n}\n\nexport type BotDefinitionConfiguration = {\n schema: Record<string, any>\n}\n\nexport type BotDefinition = {\n tags?: BotDefinitionTags\n states?: Record<string, BotDefinitionState>\n integrations?: IntegrationInstance[]\n configuration?: BotDefinitionConfiguration\n events?: Record<string, BotDefinitionEvent>\n recurringEvents?: Record<string, BotDefinitionRecurringEvent>\n}\n\nexport class Bot {\n private _state: BotState = {\n registerHandlers: [],\n unregisterHandlers: [],\n messageHandlers: [],\n eventHandlers: [],\n stateExpiredHandlers: [],\n }\n\n public readonly tags?: BotDefinitionTags\n public readonly states?: Record<string, BotDefinitionState>\n public readonly integrations?: IntegrationInstance[]\n public readonly configuration?: BotDefinitionConfiguration\n public readonly events?: Record<string, BotDefinitionEvent>\n public readonly recurringEvents?: Record<string, BotDefinitionRecurringEvent>\n\n public constructor(def: BotDefinition = {}) {\n this.tags = def.tags\n this.states = def.states\n this.integrations = def.integrations\n this.configuration = def.configuration\n this.events = def.events\n this.recurringEvents = def.recurringEvents\n }\n\n public register = (_handler: RegisterHandler): void => {}\n public unregister = (_handler: UnregisterHandler): void => {}\n public message = (_type: string, handler: MessageHandler): void => {\n this._state.messageHandlers.push(handler)\n }\n public conversation = (_type: string, _handler: MessageHandler): void => {}\n public user = (_type: string, _handler: MessageHandler): void => {}\n public event = (_type: string, handler: EventHandler): void => {\n this._state.eventHandlers.push(handler)\n }\n public stateExpired = (_type: string, handler: StateExpiredHandler): void => {\n this._state.stateExpiredHandlers.push(handler)\n }\n\n public handler = createBotHandler(this._state)\n public start = (port?: number): Promise<Server> => serve(this.handler, port)\n}\n", "import { Conversation, RuntimeError, Message, User } from '@botpress/client'\nimport axiosGlobal, { Axios as AxiosInstance } from 'axios'\nimport {\n botIdHeader,\n operationHeader,\n integrationIdHeader,\n configurationHeader,\n botUserIdHeader,\n webhookIdHeader,\n} from '../const'\nimport type { IntegrationContext, IntegrationOperation } from './context'\nimport { runtimeErrorSchema } from './error'\nimport type {\n ActionPayload,\n CreateConversationPayload,\n CreateUserPayload,\n MessagePayload,\n RegisterPayload,\n UnregisterPayload,\n WebhookPayload,\n} from './implementation'\n\ntype Props<T = any> = {\n url: string\n data: T\n} & Omit<IntegrationContext, 'operation'>\n\n/**\n * @description Meant to query your integration server directly (e.g. without going through the Botpress API)\n */\nexport class IntegrationClient {\n private axios: AxiosInstance\n\n public constructor(axiosInstance?: AxiosInstance) {\n this.axios = axiosInstance ?? axiosGlobal.create({ timeout: 5000 })\n }\n\n public actionTriggered = (props: Props<ActionPayload<string, any>>) => request('action_triggered', props, this.axios)\n public messageCreated = (props: Props<MessagePayload<any, Message, Conversation, User>>) =>\n request('message_created', props, this.axios)\n public register = (props: Props<RegisterPayload>) => request('register', props, this.axios)\n public unregister = (props: Props<UnregisterPayload>) => request('unregister', props, this.axios)\n public webhookReceived = (props: Props<WebhookPayload>) => request('webhook_received', props, this.axios)\n public createUser = (props: Props<CreateUserPayload>) =>\n request<{ user: { id: User['id'] } }>('create_user', props, this.axios)\n public createConversation = (props: Props<CreateConversationPayload>) =>\n request<{ conversation: { id: Conversation['id'] } }>('create_conversation', props, this.axios)\n}\n\nexport function formatIntegrationHeaders(ctx: IntegrationContext) {\n return {\n [botIdHeader]: ctx.botId,\n [operationHeader]: ctx.operation,\n [botUserIdHeader]: ctx.botUserId,\n [integrationIdHeader]: ctx.integrationId,\n [webhookIdHeader]: ctx.webhookId,\n [configurationHeader]: Buffer.from(\n typeof ctx.configuration === 'string' ? ctx.configuration : JSON.stringify(ctx.configuration),\n 'utf-8'\n ).toString('base64'),\n }\n}\n\nasync function request<O = any>(operation: IntegrationOperation, { url, data, ...ctx }: Props, axios: AxiosInstance) {\n try {\n const response = await axios.post<O>(url, data, {\n headers: formatIntegrationHeaders({\n ...ctx,\n operation,\n }),\n })\n\n return response\n } catch (e) {\n const runtimeErrorCode = new RuntimeError('').code\n if (axiosGlobal.isAxiosError(e) && e.response?.status === runtimeErrorCode) {\n const result = runtimeErrorSchema.safeParse(e.response.data)\n if (result.success) {\n throw new RuntimeError(result.data.message)\n }\n }\n throw e\n }\n}\n", "import { RuntimeError } from '@botpress/client'\nimport { z } from 'zod'\n\n// simply used to build the schema\nconst e = new RuntimeError('')\n\nexport const runtimeErrorSchema = z.object({\n code: z.literal(e.code),\n type: z.literal(e.type),\n message: z.string(),\n})\n", "import { z } from 'zod'\n\nexport const integrationOperationSchema = z.enum([\n 'webhook_received',\n 'message_created',\n 'action_triggered',\n 'register',\n 'unregister',\n 'ping',\n 'create_user',\n 'create_conversation',\n])\n\nexport type IntegrationOperation = z.infer<typeof integrationOperationSchema>\n\nexport type IntegrationContext<Configuration = any> = {\n botId: string\n botUserId: string\n integrationId: string\n webhookId: string\n operation: IntegrationOperation\n configuration: Configuration\n}\n", "import { mapValues } from 'radash'\nimport { z } from 'zod'\n\nimport { SchemaDefinition, schemaDefinitionToJsonSchema } from './schema'\n\nconst nonEmptyDict = <V extends z.ZodTypeAny>(v: V) => {\n const r = z.record(v)\n return {\n min: (n: number) =>\n r.refine((obj) => Object.keys(obj).length >= n, { message: `At least ${n} item(s) must be defined` }),\n }\n}\n\nexport const schemaSchema = z.object({}).passthrough()\n\nexport const configurationDefinitionSchema = z.object({\n schema: schemaSchema,\n})\n\nexport const eventDefinitionSchema = z.object({\n schema: schemaSchema,\n})\n\nexport const actionDefinitionSchema = z.object({\n input: z.object({\n schema: schemaSchema,\n }),\n output: z.object({\n schema: schemaSchema,\n }),\n})\n\nexport const messageDefinitionSchema = z.object({\n schema: schemaSchema,\n})\n\nexport const tagsDefinitionSchema = z.object({\n conversations: z.array(z.string()).optional(),\n users: z.array(z.string()).optional(),\n messages: z.array(z.string()).optional(),\n})\n\nexport const channelDefinitionSchema = z.object({\n tags: tagsDefinitionSchema.omit({ users: true }).optional(),\n messages: nonEmptyDict(messageDefinitionSchema).min(1),\n conversation: z\n .object({\n creation: z.object({\n enabled: z.boolean(),\n requiredTags: z.array(z.string()),\n }),\n })\n .optional(),\n})\n\nexport const stateDefinitionSchema = z.object({\n type: z.union([z.literal('integration'), z.literal('conversation'), z.literal('user')]),\n schema: schemaSchema,\n})\n\nexport const integrationDefinitionSchema = z.object({\n name: z.string(),\n version: z.string(),\n icon: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n tags: tagsDefinitionSchema.pick({ users: true }).optional(),\n configuration: configurationDefinitionSchema.optional(),\n events: z.record(eventDefinitionSchema).optional(),\n actions: z.record(actionDefinitionSchema).optional(),\n channels: z.record(channelDefinitionSchema).optional(),\n states: z.record(stateDefinitionSchema).optional(),\n user: z\n .object({\n creation: z.object({\n enabled: z.boolean(),\n requiredTags: z.array(z.string()),\n }),\n })\n .optional(),\n public: z.boolean().optional(),\n secrets: z.array(z.string()).optional(),\n})\n\nexport type ConfigurationDefinition = z.infer<typeof configurationDefinitionSchema>\nexport type EventDefinition = z.infer<typeof eventDefinitionSchema>\nexport type TagDefinition = z.infer<typeof tagsDefinitionSchema>\nexport type ChannelDefinition = z.infer<typeof channelDefinitionSchema>\nexport type ActionDefinition = z.infer<typeof actionDefinitionSchema>\nexport type MessageDefinition = z.infer<typeof messageDefinitionSchema>\nexport type StateDefinition = z.infer<typeof stateDefinitionSchema>\n\ntype IntegrationDefinitionInput = z.input<typeof integrationDefinitionSchema>\ntype IntegrationDefinitionOutput = z.infer<typeof integrationDefinitionSchema>\n\ntype AnyZodObject = z.ZodObject<any>\ntype Merge<A extends object, B extends object> = Omit<A, keyof B> & B\ntype Cast<T, U> = T extends U ? T : U\n\ntype BaseConfig = AnyZodObject\ntype BaseEvent = Record<string, AnyZodObject>\ntype BaseAction = Record<string, Record<'input' | 'output', AnyZodObject>>\ntype BaseChannel = Record<string, Record<string, AnyZodObject>>\ntype BaseState = Record<string, AnyZodObject>\n\nexport type IntegrationDefinitionProps<\n TConfig extends BaseConfig,\n TEvent extends BaseEvent,\n TAction extends BaseAction,\n TChannel extends BaseChannel,\n TState extends BaseState\n> = Omit<IntegrationDefinitionOutput, 'configuration' | 'events' | 'actions' | 'channels' | 'states'> & {\n configuration?: Merge<ConfigurationDefinition, SchemaDefinition<TConfig>>\n events?: { [K in keyof TEvent]: Merge<EventDefinition, SchemaDefinition<TEvent[K]>> }\n\n /**\n * TODO:\n * - remove the need to cast\n * - the type inference breaks when using keys \"input\" and \"output\" instead of keyof TAction[K]\n */\n actions?: {\n [K in keyof TAction]: Merge<\n ActionDefinition,\n {\n [L in keyof TAction[K]]: SchemaDefinition<Cast<TAction[K][L], AnyZodObject>>\n }\n >\n }\n\n channels?: {\n [K in keyof TChannel]: Merge<\n ChannelDefinition,\n {\n messages: {\n [L in keyof TChannel[K]]: Merge<MessageDefinition, SchemaDefinition<TChannel[K][L]>>\n }\n }\n >\n }\n\n states?: {\n [K in keyof TState]: Merge<StateDefinition, SchemaDefinition<TState[K]>>\n }\n}\n\nfunction formatIntegrationDefinition(\n definition: IntegrationDefinitionProps<BaseConfig, BaseEvent, BaseAction, BaseChannel, BaseState>\n): IntegrationDefinitionInput {\n return {\n ...definition,\n configuration: definition.configuration\n ? {\n ...definition.configuration,\n schema: schemaDefinitionToJsonSchema(definition.configuration),\n }\n : undefined,\n events: definition.events\n ? mapValues(definition.events, (event) => ({\n ...event,\n schema: schemaDefinitionToJsonSchema(event),\n }))\n : undefined,\n actions: definition.actions\n ? mapValues(definition.actions, (action) => ({\n ...action,\n input: {\n ...action.input,\n schema: schemaDefinitionToJsonSchema(action.input),\n },\n output: {\n ...action.output,\n schema: schemaDefinitionToJsonSchema(action.output),\n },\n }))\n : undefined,\n channels: definition.channels\n ? mapValues(definition.channels, (channel) => ({\n ...channel,\n messages: mapValues(channel.messages, (message) => ({\n ...message,\n schema: schemaDefinitionToJsonSchema(message),\n })),\n }))\n : undefined,\n states: definition.states\n ? mapValues(definition.states, (state) => ({\n ...state,\n schema: schemaDefinitionToJsonSchema(state),\n }))\n : undefined,\n user: definition.user,\n }\n}\n\nexport class IntegrationDefinition<\n TConfig extends BaseConfig = BaseConfig,\n TEvent extends BaseEvent = BaseEvent,\n TAction extends BaseAction = BaseAction,\n TChannel extends BaseChannel = BaseChannel,\n TState extends BaseState = BaseState\n> {\n public readonly name: IntegrationDefinitionOutput['name']\n public readonly version: IntegrationDefinitionOutput['version']\n public readonly icon: IntegrationDefinitionOutput['icon']\n public readonly title: IntegrationDefinitionOutput['title']\n public readonly description: IntegrationDefinitionOutput['description']\n public readonly tags: IntegrationDefinitionOutput['tags']\n public readonly configuration: IntegrationDefinitionOutput['configuration']\n public readonly events: IntegrationDefinitionOutput['events']\n public readonly actions: IntegrationDefinitionOutput['actions']\n public readonly channels: IntegrationDefinitionOutput['channels']\n public readonly states: IntegrationDefinitionOutput['states']\n public readonly user: IntegrationDefinitionOutput['user']\n public readonly public: IntegrationDefinitionOutput['public']\n public readonly secrets: IntegrationDefinitionOutput['secrets']\n public constructor(props: IntegrationDefinitionProps<TConfig, TEvent, TAction, TChannel, TState>) {\n const integrationDefinitionInput = formatIntegrationDefinition(props)\n const parsed = integrationDefinitionSchema.parse(integrationDefinitionInput)\n const {\n name,\n version,\n icon,\n title,\n description,\n tags,\n configuration,\n events,\n actions,\n channels,\n states,\n user,\n public: isPublic,\n secrets,\n } = parsed\n this.name = name\n this.version = version\n this.icon = icon\n this.title = title\n this.description = description\n this.tags = tags\n this.configuration = configuration\n this.events = events\n this.actions = actions\n this.channels = channels\n this.states = states\n this.user = user\n this.public = isPublic\n this.secrets = secrets\n }\n}\n", "import type { z } from 'zod'\nimport zodToJsonSchema from 'zod-to-json-schema'\nimport type { JsonSchema7Type } from 'zod-to-json-schema/src/parseDef'\nimport type { JsonSchema7ObjectType } from 'zod-to-json-schema/src/parsers/object'\n\ntype JsonSchemaPropertyType = JsonSchema7Type & { title?: string; examples?: any[] }\nconst isObjectSchema = (schema: JsonSchema7Type): schema is JsonSchema7ObjectType => {\n return (schema as any)?.type === 'object'\n}\n\nexport type SchemaOptions<T> = {\n title: string\n examples: T[]\n}\n\ntype IsEmptyObject<T> = keyof T extends never ? true : false\n\nexport type UiDefinition<TSchema extends z.ZodObject<any>> = IsEmptyObject<z.infer<TSchema>> extends true\n ? Record<string, never>\n : {\n [K in keyof z.infer<TSchema>]: Partial<SchemaOptions<z.infer<TSchema>[K]>>\n }\n\nexport type SchemaDefinition<TSchema extends z.ZodObject<any>> = {\n schema: TSchema\n ui?: Partial<UiDefinition<TSchema>>\n}\n\nexport function schemaDefinitionToJsonSchema(\n definition: SchemaDefinition<z.ZodObject<any>>\n): ReturnType<typeof zodToJsonSchema> {\n const schema = zodToJsonSchema(definition.schema, { errorMessages: true })\n if (!isObjectSchema(schema) || !definition.ui) {\n return schema\n }\n\n for (const [key, value] of Object.entries(definition.ui ?? {})) {\n const property = schema.properties?.[key] as JsonSchemaPropertyType | undefined\n\n if (!property) {\n continue\n }\n\n if (!!value?.title) {\n property.title = value.title\n }\n\n if (!!value?.examples) {\n property.examples = value.examples\n }\n }\n\n return schema\n}\n", "import { Client, Conversation, Message, User, RuntimeError } from '@botpress/client'\n\nimport {\n botIdHeader,\n botUserIdHeader,\n configurationHeader,\n integrationIdHeader,\n operationHeader,\n webhookIdHeader,\n} from '../const'\nimport { Request, Response, serve } from '../serve'\nimport { IntegrationContext, integrationOperationSchema } from './context'\nimport type {\n ActionPayload,\n CreateConversationPayload,\n CreateUserPayload,\n IntegrationImplementationProps as Integration,\n RegisterPayload,\n UnregisterPayload,\n WebhookPayload,\n} from './implementation'\n\ntype OperationHandlerProps = {\n integration: Integration\n ctx: IntegrationContext\n req: Request\n client: Client\n}\n\nconst log = console\n\nexport const serveIntegration = async (integration: Integration, port = 6853) => {\n await serve(integrationHandler(integration), port)\n}\n\nexport const integrationHandler =\n (integration: Integration) =>\n // eslint-disable-next-line complexity\n async (req: Request): Promise<Response | void> => {\n const ctx = extractContext(req.headers)\n const client = new Client({ botId: ctx.botId, integrationId: ctx.integrationId })\n\n if (ctx.operation !== 'ping') {\n log.debug('Received webhook request', { headers: req.headers, body: req.body })\n }\n\n const props: OperationHandlerProps = {\n integration,\n ctx,\n req,\n client,\n }\n\n try {\n let response: Response | void\n switch (ctx.operation) {\n case 'webhook_received':\n response = await onWebhook(props)\n break\n case 'register':\n response = await onRegister(props)\n break\n case 'unregister':\n response = await onUnregister(props)\n break\n case 'message_created':\n response = await onMessageCreated(props)\n break\n case 'action_triggered':\n response = await onActionTriggered(props)\n break\n case 'ping':\n response = await onPing(props)\n break\n case 'create_user':\n response = await onCreateUser(props)\n break\n case 'create_conversation':\n response = await onCreateConversation(props)\n break\n default:\n throw new Error(`Unknown operation ${ctx.operation}`)\n }\n return response ? { ...response, status: response.status ?? 200 } : { status: 200 }\n } catch (e) {\n if (e instanceof RuntimeError) {\n return { status: e.code, body: JSON.stringify(e.toJSON()) }\n } else {\n throw e\n }\n }\n }\n\nfunction extractContext(headers: Record<string, string | undefined>): IntegrationContext {\n const botId = headers[botIdHeader]\n const botUserId = headers[botUserIdHeader]\n const integrationId = headers[integrationIdHeader]\n const webhookId = headers[webhookIdHeader]\n const base64Configuration = headers[configurationHeader]\n const operation = integrationOperationSchema.parse(headers[operationHeader])\n\n if (!botId) {\n throw new Error('Missing bot headers')\n }\n\n if (!botUserId) {\n throw new Error('Missing bot user headers')\n }\n\n if (!integrationId) {\n throw new Error('Missing integration headers')\n }\n\n if (!webhookId) {\n throw new Error('Missing webhook headers')\n }\n\n if (!base64Configuration) {\n throw new Error('Missing configuration headers')\n }\n\n if (!operation) {\n throw new Error('Missing operation headers')\n }\n\n return {\n botId,\n botUserId,\n integrationId,\n webhookId,\n operation,\n configuration: base64Configuration ? JSON.parse(Buffer.from(base64Configuration, 'base64').toString('utf-8')) : {},\n }\n}\n\nfunction parseBody<T>(req: Request): T {\n if (!req.body) {\n throw new Error('Missing body')\n }\n\n return JSON.parse(req.body)\n}\n\n// TODO implement the ping operation once the signature is defined\nasync function onPing(_: OperationHandlerProps) {}\n\nasync function onWebhook({ client, ctx, integration, req: incomingRequest }: OperationHandlerProps) {\n const { req } = parseBody<WebhookPayload>(incomingRequest)\n return integration.handler({ client, ctx, req })\n}\n\nasync function onRegister({ client, ctx, integration, req }: OperationHandlerProps) {\n if (!integration.register) {\n return\n }\n\n const { webhookUrl } = parseBody<RegisterPayload>(req)\n\n await integration.register({ client, ctx, webhookUrl })\n}\n\nasync function onUnregister({ client, ctx, integration, req }: OperationHandlerProps) {\n if (!integration.unregister) {\n return\n }\n\n const { webhookUrl } = parseBody<UnregisterPayload>(req)\n\n await integration.unregister({ ctx, webhookUrl, client })\n}\n\nasync function onCreateUser({ client, ctx, integration, req }: OperationHandlerProps) {\n if (!integration.createUser) {\n return\n }\n\n const { tags } = parseBody<CreateUserPayload>(req)\n\n return await integration.createUser({ ctx, client, tags })\n}\n\nasync function onCreateConversation({ client, ctx, integration, req }: OperationHandlerProps) {\n if (!integration.createConversation) {\n return\n }\n\n const { channel, tags } = parseBody<CreateConversationPayload>(req)\n\n return await integration.createConversation({ ctx, client, channel, tags })\n}\n\nexport type MessageCreatedPayload = {\n conversation: Conversation\n user: User\n message: Message\n payload: any\n type: string\n}\n\nasync function onMessageCreated({ ctx, integration, req, client }: OperationHandlerProps) {\n const { conversation, user, type, payload, message } = parseBody<MessageCreatedPayload>(req)\n\n const channelHandler = integration.channels[conversation.channel]\n\n if (!channelHandler) {\n throw new Error(`Channel ${conversation.channel} not found`)\n }\n\n const messageHandler = channelHandler.messages[type]\n\n if (!messageHandler) {\n throw new Error(`Message of type ${type} not found in channel ${conversation.channel}`)\n }\n\n const ack = async ({ tags }: { tags: { [key: string]: string } }) => {\n await client.updateMessage({\n id: message.id,\n tags,\n })\n }\n\n await messageHandler({ ctx, conversation, message, user, type, client, payload, ack })\n}\n\nasync function onActionTriggered({ req, integration, ctx, client }: OperationHandlerProps) {\n const { input, type } = parseBody<ActionPayload<string, any>>(req)\n\n if (!type) {\n throw new Error('Missing action type')\n }\n\n const action = integration.actions[type]\n\n if (!action) {\n throw new Error(`Action ${type} not found`)\n }\n\n const output = await action({ ctx, input, client, type })\n\n return {\n body: JSON.stringify({ output }),\n }\n}\n", "import type { Client, Conversation, Message, User } from '@botpress/client'\nimport type { Server } from 'node:http'\nimport { Request, Response, serve } from '../serve'\nimport type { IntegrationContext } from './context'\nimport { integrationHandler } from './server'\n\ntype IntegrationProps<Configuration> = {\n ctx: IntegrationContext<Configuration>\n client: Client\n}\n\nexport type RegisterPayload = {\n webhookUrl: string\n}\n\nexport type UnregisterPayload = {\n webhookUrl: string\n}\n\nexport type WebhookPayload = {\n req: Request\n}\n\nexport type ActionPayload<T, I> = {\n type: T\n input: I\n}\n\nexport type EventPayload<E> = {\n event: E\n}\n\nexport type CreateUserPayload = {\n tags: Tags\n}\n\nexport type CreateConversationPayload = {\n channel: string\n tags: Tags\n}\n\ntype Tags = { [key: string]: string }\n\nexport type AckFunction = (props: { tags: Tags }) => Promise<void>\n\nexport type MessagePayload<P, M, C, U> = {\n payload: P\n conversation: C\n message: M\n user: U\n type: string\n}\n\ntype ActionDefinitions = {\n [actionType: string]: {\n input: any\n output: any\n }\n}\n\ntype ChannelDefinitions = {\n [channelName: string]: MessageDefinitions\n}\n\ntype EventDefinitions = {\n [eventName: string]: any\n}\n\ntype MessageDefinitions = {\n [messageType: string]: any\n}\n\ntype ActionFunctions<Configuration, A extends ActionDefinitions> = {\n [actionType in keyof A]: (\n props: IntegrationProps<Configuration> & ActionPayload<actionType, A[actionType]['input']>\n ) => Promise<A[actionType]['output']>\n}\n\ntype MessageHandlerProps = {\n ack: AckFunction\n}\n\nexport type ChannelFunctions<Configuration, C extends ChannelDefinitions> = {\n [channelName in keyof C]: {\n messages: {\n [messageType in keyof C[channelName]]: (\n props: IntegrationProps<Configuration> &\n MessagePayload<C[channelName][messageType], Message, Conversation, User> &\n MessageHandlerProps\n ) => Promise<void>\n }\n }\n}\n\nexport type IntegrationImplementationProps<\n Configuration = any,\n Actions extends ActionDefinitions = any,\n Channels extends ChannelDefinitions = any,\n _Events extends EventDefinitions = any\n> = {\n register: (props: IntegrationProps<Configuration> & RegisterPayload) => Promise<void>\n unregister: (props: IntegrationProps<Configuration> & UnregisterPayload) => Promise<void>\n handler: (props: IntegrationProps<Configuration> & WebhookPayload) => Promise<Response | void>\n createUser?: (props: IntegrationProps<Configuration> & CreateUserPayload) => Promise<Response | void>\n createConversation?: (props: IntegrationProps<Configuration> & CreateConversationPayload) => Promise<Response | void>\n actions: ActionFunctions<Configuration, Actions>\n channels: ChannelFunctions<Configuration, Channels>\n}\n\nexport class IntegrationImplementation<\n Configuration = any,\n Actions extends ActionDefinitions = any,\n Channels extends ChannelDefinitions = any,\n Events extends EventDefinitions = any\n> {\n public readonly actions: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['actions']\n public readonly channels: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['channels']\n public readonly register: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['register']\n public readonly unregister: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['unregister']\n public readonly handler: ReturnType<typeof integrationHandler>\n public readonly start: (port?: number) => Promise<Server>\n\n public constructor(props: IntegrationImplementationProps<Configuration, Actions, Channels, Events>) {\n this.actions = props.actions\n this.channels = props.channels\n this.register = props.register\n this.unregister = props.unregister\n this.handler = integrationHandler(props)\n this.start = (port?: number) => serve(this.handler, port)\n }\n}\n", "import { z } from 'zod'\n\nconst NonEmptyString = z.string().min(1)\n\nconst textMessageSchema = z.object({\n text: NonEmptyString,\n})\n\nconst markdownMessageSchema = z.object({\n markdown: NonEmptyString,\n})\n\nconst imageMessageSchema = z.object({\n imageUrl: NonEmptyString,\n})\n\nconst audioMessageSchema = z.object({\n audioUrl: NonEmptyString,\n})\n\nconst videoMessageSchema = z.object({\n videoUrl: NonEmptyString,\n})\n\nconst fileMessageSchema = z.object({\n fileUrl: NonEmptyString,\n title: NonEmptyString.optional(),\n})\n\nconst locationMessageSchema = z.object({\n latitude: z.number(),\n longitude: z.number(),\n})\n\nconst cardSchema = z.object({\n title: NonEmptyString,\n subtitle: NonEmptyString.optional(),\n imageUrl: NonEmptyString.optional(),\n actions: z.array(\n z.object({\n action: z.enum(['postback', 'url', 'say']),\n label: NonEmptyString,\n value: NonEmptyString,\n })\n ),\n})\n\nconst choiceSchema = z.object({\n text: NonEmptyString,\n options: z.array(\n z.object({\n label: NonEmptyString,\n value: NonEmptyString,\n })\n ),\n})\n\nconst carouselSchema = z.object({\n items: z.array(cardSchema),\n})\n\nexport const defaults = {\n text: { schema: textMessageSchema },\n markdown: { schema: markdownMessageSchema },\n image: { schema: imageMessageSchema },\n audio: { schema: audioMessageSchema },\n video: { schema: videoMessageSchema },\n file: { schema: fileMessageSchema },\n location: { schema: locationMessageSchema },\n carousel: { schema: carouselSchema },\n card: { schema: cardSchema },\n dropdown: { schema: choiceSchema },\n choice: { schema: choiceSchema },\n} as const // should use satisfies operator but this works for older versions of TS\n"],
5
- "mappings": "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",
6
- "names": ["src_exports", "__export", "Bot", "IntegrationImplementation", "IntegrationDefinition", "botIdHeader", "botUserIdHeader", "clients", "configurationHeader", "integrationIdHeader", "message_exports", "operationHeader", "serve", "typeHeader", "webhookIdHeader", "__toCommonJS", "import_axios", "botIdHeader", "botUserIdHeader", "integrationIdHeader", "webhookIdHeader", "configurationHeader", "operationHeader", "typeHeader", "BotClient", "axiosInstance", "axiosGlobal", "props", "request", "formatBotHeaders", "ctx", "typeHeader", "botIdHeader", "operationHeader", "configurationHeader", "operation", "url", "data", "axios", "import_node_http", "log", "serve", "handler", "port", "callback", "defaultCallback", "server", "req", "res", "request", "mapIncomingMessageToRequest", "response", "e", "log", "incoming", "body", "readBody", "headers", "i", "key", "value", "url", "trimPrefix", "prefix", "resolve", "reject", "chunk", "import_client", "import_zod", "botOperationSchema", "createBotHandler", "botState", "req", "ctx", "extractContext", "log", "client", "props", "onEventReceived", "onRegister", "onUnregister", "onPing", "headers", "botId", "botIdHeader", "base64Configuration", "configurationHeader", "type", "typeHeader", "operation", "botOperationSchema", "operationHeader", "body", "parseBody", "handler", "_", "Bot", "def", "_handler", "_type", "handler", "createBotHandler", "port", "serve", "import_client", "import_axios", "import_client", "import_zod", "e", "runtimeErrorSchema", "IntegrationClient", "axiosInstance", "axiosGlobal", "props", "request", "formatIntegrationHeaders", "ctx", "botIdHeader", "operationHeader", "botUserIdHeader", "integrationIdHeader", "webhookIdHeader", "configurationHeader", "operation", "url", "data", "axios", "e", "runtimeErrorCode", "result", "runtimeErrorSchema", "import_zod", "integrationOperationSchema", "import_radash", "import_zod", "import_zod_to_json_schema", "isObjectSchema", "schema", "schemaDefinitionToJsonSchema", "definition", "zodToJsonSchema", "key", "value", "property", "nonEmptyDict", "v", "r", "obj", "schemaSchema", "configurationDefinitionSchema", "eventDefinitionSchema", "actionDefinitionSchema", "messageDefinitionSchema", "tagsDefinitionSchema", "channelDefinitionSchema", "stateDefinitionSchema", "integrationDefinitionSchema", "formatIntegrationDefinition", "definition", "schemaDefinitionToJsonSchema", "event", "action", "channel", "message", "state", "IntegrationDefinition", "props", "integrationDefinitionInput", "parsed", "name", "version", "icon", "title", "description", "tags", "configuration", "events", "actions", "channels", "states", "user", "isPublic", "secrets", "import_client", "log", "integrationHandler", "integration", "req", "ctx", "extractContext", "client", "log", "props", "response", "onWebhook", "onRegister", "onUnregister", "onMessageCreated", "onActionTriggered", "onPing", "onCreateUser", "onCreateConversation", "e", "headers", "botId", "botIdHeader", "botUserId", "botUserIdHeader", "integrationId", "integrationIdHeader", "webhookId", "webhookIdHeader", "base64Configuration", "configurationHeader", "operation", "integrationOperationSchema", "operationHeader", "parseBody", "_", "incomingRequest", "webhookUrl", "tags", "channel", "conversation", "user", "type", "payload", "message", "channelHandler", "messageHandler", "input", "action", "output", "IntegrationImplementation", "props", "integrationHandler", "port", "serve", "message_exports", "__export", "defaults", "import_zod", "NonEmptyString", "textMessageSchema", "markdownMessageSchema", "imageMessageSchema", "audioMessageSchema", "videoMessageSchema", "fileMessageSchema", "locationMessageSchema", "cardSchema", "choiceSchema", "carouselSchema", "clients", "IntegrationClient", "BotClient"]
4
+ "sourcesContent": ["import { BotClient } from './bot'\nimport { IntegrationClient } from './integration'\n\nexport * as messages from './message'\nexport const clients = { IntegrationClient, BotClient }\n\nexport * from './const'\nexport * from './serve'\n\nexport {\n IntegrationDefinition,\n IntegrationDefinitionProps,\n IntegrationImplementation as Integration,\n IntegrationImplementationProps as IntegrationProps,\n IntegrationContext,\n IntegrationOperation,\n AckFunction,\n} from './integration'\nexport { Bot, BotContext, BotOperation, IntegrationInstance } from './bot'\n", "import axiosGlobal, { Axios as AxiosInstance } from 'axios'\nimport type { Merge, Except } from 'type-fest'\nimport { botIdHeader, operationHeader, configurationHeader, typeHeader } from '../const'\nimport type { BotContext, BotOperation } from './context'\nimport type { RegisterBotPayload, UnregisterBotPayload, EventReceivedBotPayload } from './implementation'\n\ntype Props<T = any> = Merge<\n Except<BotContext, 'operation'>,\n {\n url: string\n data: T\n }\n>\n\n/**\n * @description Meant to query your bot server directly (e.g. without going through the Botpress API)\n */\nexport class BotClient {\n private axios: AxiosInstance\n\n public constructor(axiosInstance?: AxiosInstance) {\n this.axios = axiosInstance ?? axiosGlobal.create({ timeout: 5000 })\n }\n\n public register = (props: Props<RegisterBotPayload>) => request('register', props, this.axios)\n public unregister = (props: Props<UnregisterBotPayload>) => request('unregister', props, this.axios)\n public eventReceived = (props: Props<EventReceivedBotPayload>) => request('event_received', props, this.axios)\n}\n\nexport function formatBotHeaders(ctx: BotContext) {\n return {\n [typeHeader]: ctx.type,\n [botIdHeader]: ctx.botId,\n [operationHeader]: ctx.operation,\n [configurationHeader]: Buffer.from(\n typeof ctx.configuration === 'string' ? ctx.configuration : JSON.stringify(ctx.configuration),\n 'utf-8'\n ).toString('base64'),\n }\n}\n\nasync function request<O = any>(operation: BotOperation, { url, data, ...ctx }: Props, axios: AxiosInstance) {\n const response = await axios.post<O>(url, data, {\n headers: formatBotHeaders({\n ...ctx,\n operation,\n }),\n })\n\n return response.data\n}\n", "export const botIdHeader = 'x-bot-id'\nexport const botUserIdHeader = 'x-bot-user-id'\nexport const integrationIdHeader = 'x-integration-id'\nexport const webhookIdHeader = 'x-webhook-id'\nexport const configurationHeader = 'x-bp-configuration'\nexport const operationHeader = 'x-bp-operation'\nexport const typeHeader = 'x-bp-type'\n", "import { createServer, IncomingMessage, Server } from 'node:http'\nimport { log } from './log'\n\nexport type Request = {\n body?: string\n path: string\n query: string\n method: string\n headers: { [key: string]: string | undefined }\n}\n\nexport type Response = {\n body?: string\n headers?: { [key: string]: string }\n status?: number\n}\n\nexport type Handler = (req: Request) => Promise<Response | void>\n\nexport async function serve(\n handler: Handler,\n port: number = 8072,\n callback: (port: number) => void = defaultCallback\n): Promise<Server> {\n /* eslint-disable @typescript-eslint/no-misused-promises */\n const server = createServer(async (req, res) => {\n try {\n const request = await mapIncomingMessageToRequest(req)\n const response = await handler(request)\n res.writeHead(response?.status ?? 200, response?.headers ?? {}).end(response?.body ?? '{}')\n } catch (e: any) {\n log.error('Error while handling request', { error: e?.message ?? 'Internal error occured' })\n res.writeHead(500).end(JSON.stringify({ error: e?.message ?? 'Internal error occured' }))\n }\n })\n\n server.listen(port, () => callback(port))\n return server\n}\n\nasync function mapIncomingMessageToRequest(incoming: IncomingMessage): Promise<Request> {\n const body = await readBody(incoming)\n const headers = {} as Request['headers']\n\n for (let i = 0; i < incoming.rawHeaders.length; i += 2) {\n const key = incoming.rawHeaders[i]!.toLowerCase()\n const value = incoming.rawHeaders[i + 1]!\n headers[key] = value\n }\n\n const url = new URL(\n incoming.url ?? '',\n incoming.headers.host ? `http://${incoming.headers.host}` : 'http://botpress.cloud'\n )\n\n return {\n body,\n path: url.pathname,\n query: trimPrefix(url.search, '?'),\n headers,\n method: incoming.method?.toUpperCase() ?? 'GET',\n }\n}\n\nfunction trimPrefix(value: string, prefix: string) {\n return value.indexOf(prefix) === 0 ? value.slice(prefix.length) : value\n}\n\nasync function readBody(incoming: IncomingMessage) {\n return new Promise<string | undefined>((resolve, reject) => {\n if (incoming.method !== 'POST' && incoming.method !== 'PUT' && incoming.method !== 'PATCH') {\n return resolve(undefined)\n }\n\n let body = ''\n\n incoming.on('data', (chunk) => (body += chunk.toString()))\n incoming.on('error', (e) => reject(e))\n incoming.on('end', () => resolve(body))\n })\n}\n\nfunction defaultCallback(port: number) {\n log.info(`Listening on port ${port}`)\n}\n", "export type Logger = {\n debug(message: string, metadata?: any): void\n info(message: string, metadata?: any): void\n warn(message: string, metadata?: any): void\n error(message: string, metadata?: any): void\n}\nexport const log: Logger = console\n", "import { Client } from '@botpress/client'\nimport { botIdHeader, configurationHeader, operationHeader, typeHeader } from '../const'\nimport { log } from '../log'\nimport type { Handler, Request, Response } from '../serve'\nimport { BotContext, botOperationSchema } from './context'\nimport type { EventReceivedBotPayload } from './implementation'\nimport type { BotState } from './state'\n\ntype OperationHandlerProps = {\n botState: BotState\n ctx: BotContext\n client: Client\n req: Request\n}\n\nexport const createBotHandler =\n (botState: BotState): Handler =>\n async (req: Request): Promise<Response> => {\n const ctx = extractContext(req.headers)\n\n if (ctx.operation !== 'ping') {\n log.info(`Received ${ctx.operation} operation for bot ${ctx.botId} of type ${ctx.type}`)\n }\n\n const client = new Client({ botId: ctx.botId })\n\n const props: OperationHandlerProps = {\n req,\n botState,\n ctx,\n client,\n }\n\n switch (ctx.operation) {\n case 'event_received':\n await onEventReceived(props)\n break\n case 'register':\n await onRegister(props)\n break\n case 'unregister':\n await onUnregister(props)\n break\n case 'ping':\n await onPing(props)\n break\n default:\n throw new Error(`Unknown operation ${ctx.operation}`)\n }\n\n return { status: 200 }\n }\n\nfunction extractContext(headers: Record<string, string | undefined>): BotContext {\n const botId = headers[botIdHeader]\n const base64Configuration = headers[configurationHeader]\n const type = headers[typeHeader]\n const operation = botOperationSchema.parse(headers[operationHeader])\n\n if (!botId) {\n throw new Error('Missing bot headers')\n }\n\n if (!type) {\n throw new Error('Missing type headers')\n }\n\n if (!base64Configuration) {\n throw new Error('Missing configuration headers')\n }\n\n if (!operation) {\n throw new Error('Missing operation headers')\n }\n\n return {\n botId,\n operation,\n type,\n configuration: base64Configuration ? JSON.parse(Buffer.from(base64Configuration, 'base64').toString('utf-8')) : {},\n }\n}\n\nasync function onEventReceived({ botState, ctx, req }: OperationHandlerProps) {\n log.debug(`Received event ${ctx.type}`)\n\n const client = new Client({ botId: ctx.botId })\n\n const body = parseBody<EventReceivedBotPayload>(req)\n\n switch (ctx.type) {\n case 'message_created':\n await Promise.all(\n botState.messageHandlers.map((handler) =>\n handler({\n client,\n user: body.event.payload.user as any,\n conversation: body.event.payload.conversation as any,\n message: body.event.payload.message as any,\n event: body.event,\n ctx,\n })\n )\n )\n break\n case 'state_expired':\n await Promise.all(\n botState.stateExpiredHandlers.map((handler) =>\n handler({\n client,\n state: body.event.payload.state as any,\n ctx,\n })\n )\n )\n break\n default:\n await Promise.all(\n botState.eventHandlers.map((handler) =>\n handler({\n client,\n event: body.event,\n ctx,\n })\n )\n )\n }\n}\n\n// TODO implement the ping operation once the signature is defined\nasync function onPing(_: OperationHandlerProps) {}\n\nasync function onRegister(_: OperationHandlerProps) {}\n\nasync function onUnregister(_: OperationHandlerProps) {}\n\nfunction parseBody<T>(req: Request): T {\n if (!req.body) {\n throw new Error('Missing body')\n }\n\n return JSON.parse(req.body)\n}\n", "import { z } from 'zod'\n\nexport const botOperationSchema = z.enum(['event_received', 'register', 'unregister', 'ping'])\n\nexport type BotOperation = z.infer<typeof botOperationSchema>\n\nexport type BotContext<Configuration = any, Type extends string = string> = {\n botId: string\n type: Type\n operation: BotOperation\n configuration: Configuration\n}\n", "import type { Bot as BotType, Event } from '@botpress/client'\nimport type { Server } from 'node:http'\nimport { serve } from '../serve'\nimport { createBotHandler } from './server'\nimport type {\n BotState,\n EventHandler,\n MessageHandler,\n RegisterHandler,\n StateExpiredHandler,\n UnregisterHandler,\n} from './state'\n\nexport type RegisterBotPayload = {\n bot: BotType\n}\n\nexport type UnregisterBotPayload = {\n bot: BotType\n}\n\nexport type EventReceivedBotPayload = {\n event: Event\n}\n\nexport type BotDefinitionTags = {\n messages?: string[]\n conversations?: string[]\n users?: string[]\n}\n\nexport type BotDefinitionStateType = 'conversation' | 'user' | 'bot'\nexport type BotDefinitionState = {\n type: BotDefinitionStateType\n schema: Record<string, any>\n expiry?: number\n}\n\nexport type IntegrationInstance = {\n enabled: boolean\n id: string\n configuration: { [key: string]: any }\n}\n\nexport type BotDefinitionRecurringEvent = {\n type: string\n payload: Record<string, any>\n schedule: {\n cron: string\n }\n}\n\nexport type BotDefinitionEvent = {\n schema: Record<string, any>\n}\n\nexport type BotDefinitionConfiguration = {\n schema: Record<string, any>\n}\n\nexport type BotDefinition = {\n tags?: BotDefinitionTags\n states?: Record<string, BotDefinitionState>\n integrations?: IntegrationInstance[]\n configuration?: BotDefinitionConfiguration\n events?: Record<string, BotDefinitionEvent>\n recurringEvents?: Record<string, BotDefinitionRecurringEvent>\n}\n\nexport class Bot {\n private _state: BotState = {\n registerHandlers: [],\n unregisterHandlers: [],\n messageHandlers: [],\n eventHandlers: [],\n stateExpiredHandlers: [],\n }\n\n public readonly tags?: BotDefinitionTags\n public readonly states?: Record<string, BotDefinitionState>\n public readonly integrations?: IntegrationInstance[]\n public readonly configuration?: BotDefinitionConfiguration\n public readonly events?: Record<string, BotDefinitionEvent>\n public readonly recurringEvents?: Record<string, BotDefinitionRecurringEvent>\n\n public constructor(def: BotDefinition = {}) {\n this.tags = def.tags\n this.states = def.states\n this.integrations = def.integrations\n this.configuration = def.configuration\n this.events = def.events\n this.recurringEvents = def.recurringEvents\n }\n\n public register = (_handler: RegisterHandler): void => {}\n public unregister = (_handler: UnregisterHandler): void => {}\n public message = (_type: string, handler: MessageHandler): void => {\n this._state.messageHandlers.push(handler)\n }\n public conversation = (_type: string, _handler: MessageHandler): void => {}\n public user = (_type: string, _handler: MessageHandler): void => {}\n public event = (_type: string, handler: EventHandler): void => {\n this._state.eventHandlers.push(handler)\n }\n public stateExpired = (_type: string, handler: StateExpiredHandler): void => {\n this._state.stateExpiredHandlers.push(handler)\n }\n\n public handler = createBotHandler(this._state)\n public start = (port?: number): Promise<Server> => serve(this.handler, port)\n}\n", "import { Conversation, RuntimeError, Message, User } from '@botpress/client'\nimport axiosGlobal, { Axios as AxiosInstance } from 'axios'\nimport {\n botIdHeader,\n operationHeader,\n integrationIdHeader,\n configurationHeader,\n botUserIdHeader,\n webhookIdHeader,\n} from '../const'\nimport type { IntegrationContext, IntegrationOperation } from './context'\nimport { runtimeErrorSchema } from './error'\nimport type {\n ActionPayload,\n CreateConversationPayload,\n CreateUserPayload,\n MessagePayload,\n RegisterPayload,\n UnregisterPayload,\n WebhookPayload,\n} from './implementation'\n\ntype Props<T = any> = {\n url: string\n data: T\n} & Omit<IntegrationContext, 'operation'>\n\n/**\n * @description Meant to query your integration server directly (e.g. without going through the Botpress API)\n */\nexport class IntegrationClient {\n private axios: AxiosInstance\n\n public constructor(axiosInstance?: AxiosInstance) {\n this.axios = axiosInstance ?? axiosGlobal.create({ timeout: 5000 })\n }\n\n public actionTriggered = (props: Props<ActionPayload<string, any>>) => request('action_triggered', props, this.axios)\n public messageCreated = (props: Props<MessagePayload<any, Message, Conversation, User>>) =>\n request('message_created', props, this.axios)\n public register = (props: Props<RegisterPayload>) => request('register', props, this.axios)\n public unregister = (props: Props<UnregisterPayload>) => request('unregister', props, this.axios)\n public webhookReceived = (props: Props<WebhookPayload>) => webhookRequest('webhook_received', props, this.axios)\n public createUser = (props: Props<CreateUserPayload>) =>\n request<{ user: { id: User['id'] } }>('create_user', props, this.axios)\n public createConversation = (props: Props<CreateConversationPayload>) =>\n request<{ conversation: { id: Conversation['id'] } }>('create_conversation', props, this.axios)\n}\n\nexport function formatIntegrationHeaders(ctx: IntegrationContext) {\n return {\n [botIdHeader]: ctx.botId,\n [operationHeader]: ctx.operation,\n [botUserIdHeader]: ctx.botUserId,\n [integrationIdHeader]: ctx.integrationId,\n [webhookIdHeader]: ctx.webhookId,\n [configurationHeader]: Buffer.from(\n typeof ctx.configuration === 'string' ? ctx.configuration : JSON.stringify(ctx.configuration),\n 'utf-8'\n ).toString('base64'),\n }\n}\n\nasync function webhookRequest(operation: IntegrationOperation, { url, data, ...ctx }: Props, axios: AxiosInstance) {\n const response = await axios\n .post<unknown>(url, data, {\n headers: formatIntegrationHeaders({\n ...ctx,\n operation,\n }),\n })\n .catch((e) => {\n if (axiosGlobal.isAxiosError(e) && e.response?.status && e.response.status < 500) {\n return e.response\n }\n\n throw e\n })\n\n return response\n}\n\nasync function request<O = any>(operation: IntegrationOperation, { url, data, ...ctx }: Props, axios: AxiosInstance) {\n try {\n const response = await axios.post<O>(url, data, {\n headers: formatIntegrationHeaders({\n ...ctx,\n operation,\n }),\n })\n\n return response\n } catch (e) {\n const runtimeErrorCode = new RuntimeError('').code\n if (axiosGlobal.isAxiosError(e) && e.response?.status === runtimeErrorCode) {\n const result = runtimeErrorSchema.safeParse(e.response.data)\n if (result.success) {\n throw new RuntimeError(result.data.message)\n }\n }\n throw e\n }\n}\n", "import { RuntimeError } from '@botpress/client'\nimport { z } from 'zod'\n\n// simply used to build the schema\nconst e = new RuntimeError('')\n\nexport const runtimeErrorSchema = z.object({\n code: z.literal(e.code),\n type: z.literal(e.type),\n message: z.string(),\n})\n", "import { z } from 'zod'\n\nexport const integrationOperationSchema = z.enum([\n 'webhook_received',\n 'message_created',\n 'action_triggered',\n 'register',\n 'unregister',\n 'ping',\n 'create_user',\n 'create_conversation',\n])\n\nexport type IntegrationOperation = z.infer<typeof integrationOperationSchema>\n\nexport type IntegrationContext<Configuration = any> = {\n botId: string\n botUserId: string\n integrationId: string\n webhookId: string\n operation: IntegrationOperation\n configuration: Configuration\n}\n", "import { mapValues } from 'radash'\nimport { z } from 'zod'\n\nimport { SchemaDefinition, schemaDefinitionToJsonSchema } from './schema'\n\nconst nonEmptyDict = <V extends z.ZodTypeAny>(v: V) => {\n const r = z.record(v)\n return {\n min: (n: number) =>\n r.refine((obj) => Object.keys(obj).length >= n, { message: `At least ${n} item(s) must be defined` }),\n }\n}\n\nexport const schemaSchema = z.object({}).passthrough()\n\nexport const configurationDefinitionSchema = z.object({\n schema: schemaSchema,\n})\n\nexport const eventDefinitionSchema = z.object({\n schema: schemaSchema,\n})\n\nexport const actionDefinitionSchema = z.object({\n input: z.object({\n schema: schemaSchema,\n }),\n output: z.object({\n schema: schemaSchema,\n }),\n})\n\nexport const messageDefinitionSchema = z.object({\n schema: schemaSchema,\n})\n\nexport const tagsDefinitionSchema = z.object({\n conversations: z.array(z.string()).optional(),\n users: z.array(z.string()).optional(),\n messages: z.array(z.string()).optional(),\n})\n\nexport const channelDefinitionSchema = z.object({\n tags: tagsDefinitionSchema.omit({ users: true }).optional(),\n messages: nonEmptyDict(messageDefinitionSchema).min(1),\n conversation: z\n .object({\n creation: z.object({\n enabled: z.boolean(),\n requiredTags: z.array(z.string()),\n }),\n })\n .optional(),\n})\n\nexport const stateDefinitionSchema = z.object({\n type: z.union([z.literal('integration'), z.literal('conversation'), z.literal('user')]),\n schema: schemaSchema,\n})\n\nexport const integrationDefinitionSchema = z.object({\n name: z.string(),\n version: z.string(),\n public: z.boolean().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n icon: z.string().optional(),\n readme: z.string().optional(),\n tags: tagsDefinitionSchema.pick({ users: true }).optional(),\n configuration: configurationDefinitionSchema.optional(),\n events: z.record(eventDefinitionSchema).optional(),\n actions: z.record(actionDefinitionSchema).optional(),\n channels: z.record(channelDefinitionSchema).optional(),\n states: z.record(stateDefinitionSchema).optional(),\n user: z\n .object({\n creation: z.object({\n enabled: z.boolean(),\n requiredTags: z.array(z.string()),\n }),\n })\n .optional(),\n secrets: z.array(z.string()).optional(),\n})\n\nexport type ConfigurationDefinition = z.infer<typeof configurationDefinitionSchema>\nexport type EventDefinition = z.infer<typeof eventDefinitionSchema>\nexport type TagDefinition = z.infer<typeof tagsDefinitionSchema>\nexport type ChannelDefinition = z.infer<typeof channelDefinitionSchema>\nexport type ActionDefinition = z.infer<typeof actionDefinitionSchema>\nexport type MessageDefinition = z.infer<typeof messageDefinitionSchema>\nexport type StateDefinition = z.infer<typeof stateDefinitionSchema>\n\ntype IntegrationDefinitionInput = z.input<typeof integrationDefinitionSchema>\ntype IntegrationDefinitionOutput = z.infer<typeof integrationDefinitionSchema>\n\ntype AnyZodObject = z.ZodObject<any>\ntype Merge<A extends object, B extends object> = Omit<A, keyof B> & B\ntype Cast<T, U> = T extends U ? T : U\n\ntype BaseConfig = AnyZodObject\ntype BaseEvent = Record<string, AnyZodObject>\ntype BaseAction = Record<string, Record<'input' | 'output', AnyZodObject>>\ntype BaseChannel = Record<string, Record<string, AnyZodObject>>\ntype BaseState = Record<string, AnyZodObject>\n\nconst PUBLIC_VERSION = '0.2.0' as const\nconst PRIVATE_VERSION = '0.0.1' as const\n\n// TODO: allow any versions\ntype IntegrationDefinitionVersion =\n | {\n public: true\n /** Only version 0.2.0 is supported for public integrations yet. This is temporary. */\n version: typeof PUBLIC_VERSION\n }\n | {\n public: false\n /** Only version 0.0.1 is supported for private integrations yet. This is temporary. */\n version: typeof PRIVATE_VERSION\n }\n\nexport type IntegrationDefinitionProps<\n TConfig extends BaseConfig,\n TEvent extends BaseEvent,\n TAction extends BaseAction,\n TChannel extends BaseChannel,\n TState extends BaseState\n> = Omit<\n IntegrationDefinitionOutput,\n 'public' | 'version' | 'configuration' | 'events' | 'actions' | 'channels' | 'states'\n> &\n IntegrationDefinitionVersion & {\n configuration?: Merge<ConfigurationDefinition, SchemaDefinition<TConfig>>\n events?: { [K in keyof TEvent]: Merge<EventDefinition, SchemaDefinition<TEvent[K]>> }\n\n /**\n * TODO:\n * - remove the need to cast\n * - the type inference breaks when using keys \"input\" and \"output\" instead of keyof TAction[K]\n */\n actions?: {\n [K in keyof TAction]: Merge<\n ActionDefinition,\n {\n [L in keyof TAction[K]]: SchemaDefinition<Cast<TAction[K][L], AnyZodObject>>\n }\n >\n }\n\n channels?: {\n [K in keyof TChannel]: Merge<\n ChannelDefinition,\n {\n messages: {\n [L in keyof TChannel[K]]: Merge<MessageDefinition, SchemaDefinition<TChannel[K][L]>>\n }\n }\n >\n }\n\n states?: {\n [K in keyof TState]: Merge<StateDefinition, SchemaDefinition<TState[K]>>\n }\n }\n\nfunction formatIntegrationDefinition(\n definition: IntegrationDefinitionProps<BaseConfig, BaseEvent, BaseAction, BaseChannel, BaseState>\n): IntegrationDefinitionInput {\n return {\n ...definition,\n configuration: definition.configuration\n ? {\n ...definition.configuration,\n schema: schemaDefinitionToJsonSchema(definition.configuration),\n }\n : undefined,\n events: definition.events\n ? mapValues(definition.events, (event) => ({\n ...event,\n schema: schemaDefinitionToJsonSchema(event),\n }))\n : undefined,\n actions: definition.actions\n ? mapValues(definition.actions, (action) => ({\n ...action,\n input: {\n ...action.input,\n schema: schemaDefinitionToJsonSchema(action.input),\n },\n output: {\n ...action.output,\n schema: schemaDefinitionToJsonSchema(action.output),\n },\n }))\n : undefined,\n channels: definition.channels\n ? mapValues(definition.channels, (channel) => ({\n ...channel,\n messages: mapValues(channel.messages, (message) => ({\n ...message,\n schema: schemaDefinitionToJsonSchema(message),\n })),\n }))\n : undefined,\n states: definition.states\n ? mapValues(definition.states, (state) => ({\n ...state,\n schema: schemaDefinitionToJsonSchema(state),\n }))\n : undefined,\n user: definition.user,\n }\n}\n\nexport class IntegrationDefinition<\n TConfig extends BaseConfig = BaseConfig,\n TEvent extends BaseEvent = BaseEvent,\n TAction extends BaseAction = BaseAction,\n TChannel extends BaseChannel = BaseChannel,\n TState extends BaseState = BaseState\n> {\n public readonly name: IntegrationDefinitionOutput['name']\n public readonly version: IntegrationDefinitionOutput['version']\n public readonly icon: IntegrationDefinitionOutput['icon']\n public readonly readme: IntegrationDefinitionOutput['readme']\n public readonly title: IntegrationDefinitionOutput['title']\n public readonly description: IntegrationDefinitionOutput['description']\n public readonly tags: IntegrationDefinitionOutput['tags']\n public readonly configuration: IntegrationDefinitionOutput['configuration']\n public readonly events: IntegrationDefinitionOutput['events']\n public readonly actions: IntegrationDefinitionOutput['actions']\n public readonly channels: IntegrationDefinitionOutput['channels']\n public readonly states: IntegrationDefinitionOutput['states']\n public readonly user: IntegrationDefinitionOutput['user']\n public readonly public: IntegrationDefinitionOutput['public']\n public readonly secrets: IntegrationDefinitionOutput['secrets']\n public constructor(props: IntegrationDefinitionProps<TConfig, TEvent, TAction, TChannel, TState>) {\n const integrationDefinitionInput = formatIntegrationDefinition(props)\n const parsed = integrationDefinitionSchema.parse(integrationDefinitionInput)\n\n if (parsed.public && parsed.version !== PUBLIC_VERSION) {\n throw new Error(`Public integrations must have version ${PUBLIC_VERSION}`)\n }\n if (!parsed.public && parsed.version !== PRIVATE_VERSION) {\n throw new Error(`Private integrations must have version ${PRIVATE_VERSION}`)\n }\n\n const {\n name,\n version,\n icon,\n readme,\n title,\n description,\n tags,\n configuration,\n events,\n actions,\n channels,\n states,\n user,\n public: isPublic,\n secrets,\n } = parsed\n this.name = name\n this.version = version\n this.icon = icon\n this.readme = readme\n this.title = title\n this.description = description\n this.tags = tags\n this.configuration = configuration\n this.events = events\n this.actions = actions\n this.channels = channels\n this.states = states\n this.user = user\n this.public = isPublic\n this.secrets = secrets\n }\n}\n", "import type { z } from 'zod'\nimport zodToJsonSchema from 'zod-to-json-schema'\nimport type { JsonSchema7Type } from 'zod-to-json-schema/src/parseDef'\nimport type { JsonSchema7ObjectType } from 'zod-to-json-schema/src/parsers/object'\n\ntype JsonSchemaPropertyType = JsonSchema7Type & { title?: string; examples?: any[] }\nconst isObjectSchema = (schema: JsonSchema7Type): schema is JsonSchema7ObjectType => {\n return (schema as any)?.type === 'object'\n}\n\nexport type SchemaOptions<T> = {\n title: string\n examples: T[]\n}\n\ntype IsEmptyObject<T> = keyof T extends never ? true : false\n\nexport type UiDefinition<TSchema extends z.ZodObject<any>> = IsEmptyObject<z.infer<TSchema>> extends true\n ? Record<string, never>\n : {\n [K in keyof z.infer<TSchema>]: Partial<SchemaOptions<z.infer<TSchema>[K]>>\n }\n\nexport type SchemaDefinition<TSchema extends z.ZodObject<any>> = {\n schema: TSchema\n ui?: Partial<UiDefinition<TSchema>>\n}\n\nexport function schemaDefinitionToJsonSchema(\n definition: SchemaDefinition<z.ZodObject<any>>\n): ReturnType<typeof zodToJsonSchema> {\n const schema = zodToJsonSchema(definition.schema, { errorMessages: true })\n if (!isObjectSchema(schema) || !definition.ui) {\n return schema\n }\n\n for (const [key, value] of Object.entries(definition.ui ?? {})) {\n const property = schema.properties?.[key] as JsonSchemaPropertyType | undefined\n\n if (!property) {\n continue\n }\n\n if (!!value?.title) {\n property.title = value.title\n }\n\n if (!!value?.examples) {\n property.examples = value.examples\n }\n }\n\n return schema\n}\n", "import { Client, Conversation, Message, User, RuntimeError } from '@botpress/client'\n\nimport {\n botIdHeader,\n botUserIdHeader,\n configurationHeader,\n integrationIdHeader,\n operationHeader,\n webhookIdHeader,\n} from '../const'\nimport { Request, Response, serve } from '../serve'\nimport { IntegrationContext, integrationOperationSchema } from './context'\nimport type {\n ActionPayload,\n CreateConversationPayload,\n CreateUserPayload,\n IntegrationImplementationProps as Integration,\n RegisterPayload,\n UnregisterPayload,\n WebhookPayload,\n} from './implementation'\n\ntype OperationHandlerProps = {\n integration: Integration\n ctx: IntegrationContext\n req: Request\n client: Client\n}\n\nexport const serveIntegration = async (integration: Integration, port = 6853) => {\n await serve(integrationHandler(integration), port)\n}\n\nexport const integrationHandler =\n (integration: Integration) =>\n // eslint-disable-next-line complexity\n async (req: Request): Promise<Response | void> => {\n const ctx = extractContext(req.headers)\n const client = new Client({ botId: ctx.botId, integrationId: ctx.integrationId })\n\n const props: OperationHandlerProps = {\n integration,\n ctx,\n req,\n client,\n }\n\n try {\n let response: Response | void\n switch (ctx.operation) {\n case 'webhook_received':\n response = await onWebhook(props)\n break\n case 'register':\n response = await onRegister(props)\n break\n case 'unregister':\n response = await onUnregister(props)\n break\n case 'message_created':\n response = await onMessageCreated(props)\n break\n case 'action_triggered':\n response = await onActionTriggered(props)\n break\n case 'ping':\n response = await onPing(props)\n break\n case 'create_user':\n response = await onCreateUser(props)\n break\n case 'create_conversation':\n response = await onCreateConversation(props)\n break\n default:\n throw new Error(`Unknown operation ${ctx.operation}`)\n }\n return response ? { ...response, status: response.status ?? 200 } : { status: 200 }\n } catch (e) {\n if (e instanceof RuntimeError) {\n return { status: e.code, body: JSON.stringify(e.toJSON()) }\n } else {\n throw e\n }\n }\n }\n\nfunction extractContext(headers: Record<string, string | undefined>): IntegrationContext {\n const botId = headers[botIdHeader]\n const botUserId = headers[botUserIdHeader]\n const integrationId = headers[integrationIdHeader]\n const webhookId = headers[webhookIdHeader]\n const base64Configuration = headers[configurationHeader]\n const operation = integrationOperationSchema.parse(headers[operationHeader])\n\n if (!botId) {\n throw new Error('Missing bot headers')\n }\n\n if (!botUserId) {\n throw new Error('Missing bot user headers')\n }\n\n if (!integrationId) {\n throw new Error('Missing integration headers')\n }\n\n if (!webhookId) {\n throw new Error('Missing webhook headers')\n }\n\n if (!base64Configuration) {\n throw new Error('Missing configuration headers')\n }\n\n if (!operation) {\n throw new Error('Missing operation headers')\n }\n\n return {\n botId,\n botUserId,\n integrationId,\n webhookId,\n operation,\n configuration: base64Configuration ? JSON.parse(Buffer.from(base64Configuration, 'base64').toString('utf-8')) : {},\n }\n}\n\nfunction parseBody<T>(req: Request): T {\n if (!req.body) {\n throw new Error('Missing body')\n }\n\n return JSON.parse(req.body)\n}\n\n// TODO implement the ping operation once the signature is defined\nasync function onPing(_: OperationHandlerProps) {}\n\nasync function onWebhook({ client, ctx, integration, req: incomingRequest }: OperationHandlerProps) {\n const { req } = parseBody<WebhookPayload>(incomingRequest)\n return integration.handler({ client, ctx, req })\n}\n\nasync function onRegister({ client, ctx, integration, req }: OperationHandlerProps) {\n if (!integration.register) {\n return\n }\n\n const { webhookUrl } = parseBody<RegisterPayload>(req)\n\n await integration.register({ client, ctx, webhookUrl })\n}\n\nasync function onUnregister({ client, ctx, integration, req }: OperationHandlerProps) {\n if (!integration.unregister) {\n return\n }\n\n const { webhookUrl } = parseBody<UnregisterPayload>(req)\n\n await integration.unregister({ ctx, webhookUrl, client })\n}\n\nasync function onCreateUser({ client, ctx, integration, req }: OperationHandlerProps) {\n if (!integration.createUser) {\n return\n }\n\n const { tags } = parseBody<CreateUserPayload>(req)\n\n return await integration.createUser({ ctx, client, tags })\n}\n\nasync function onCreateConversation({ client, ctx, integration, req }: OperationHandlerProps) {\n if (!integration.createConversation) {\n return\n }\n\n const { channel, tags } = parseBody<CreateConversationPayload>(req)\n\n return await integration.createConversation({ ctx, client, channel, tags })\n}\n\nexport type MessageCreatedPayload = {\n conversation: Conversation\n user: User\n message: Message\n payload: any\n type: string\n}\n\nasync function onMessageCreated({ ctx, integration, req, client }: OperationHandlerProps) {\n const { conversation, user, type, payload, message } = parseBody<MessageCreatedPayload>(req)\n\n const channelHandler = integration.channels[conversation.channel]\n\n if (!channelHandler) {\n throw new Error(`Channel ${conversation.channel} not found`)\n }\n\n const messageHandler = channelHandler.messages[type]\n\n if (!messageHandler) {\n throw new Error(`Message of type ${type} not found in channel ${conversation.channel}`)\n }\n\n const ack = async ({ tags }: { tags: { [key: string]: string } }) => {\n await client.updateMessage({\n id: message.id,\n tags,\n })\n }\n\n await messageHandler({ ctx, conversation, message, user, type, client, payload, ack })\n}\n\nasync function onActionTriggered({ req, integration, ctx, client }: OperationHandlerProps) {\n const { input, type } = parseBody<ActionPayload<string, any>>(req)\n\n if (!type) {\n throw new Error('Missing action type')\n }\n\n const action = integration.actions[type]\n\n if (!action) {\n throw new Error(`Action ${type} not found`)\n }\n\n const output = await action({ ctx, input, client, type })\n\n return {\n body: JSON.stringify({ output }),\n }\n}\n", "import type { Client, Conversation, Message, User } from '@botpress/client'\nimport type { Server } from 'node:http'\nimport { Request, Response, serve } from '../serve'\nimport type { IntegrationContext } from './context'\nimport { integrationHandler } from './server'\n\ntype IntegrationProps<Configuration> = {\n ctx: IntegrationContext<Configuration>\n client: Client\n}\n\nexport type RegisterPayload = {\n webhookUrl: string\n}\n\nexport type UnregisterPayload = {\n webhookUrl: string\n}\n\nexport type WebhookPayload = {\n req: Request\n}\n\nexport type ActionPayload<T, I> = {\n type: T\n input: I\n}\n\nexport type EventPayload<E> = {\n event: E\n}\n\nexport type CreateUserPayload = {\n tags: Tags\n}\n\nexport type CreateConversationPayload = {\n channel: string\n tags: Tags\n}\n\ntype Tags = { [key: string]: string }\n\nexport type AckFunction = (props: { tags: Tags }) => Promise<void>\n\nexport type MessagePayload<P, M, C, U> = {\n payload: P\n conversation: C\n message: M\n user: U\n type: string\n}\n\ntype ActionDefinitions = {\n [actionType: string]: {\n input: any\n output: any\n }\n}\n\ntype ChannelDefinitions = {\n [channelName: string]: MessageDefinitions\n}\n\ntype EventDefinitions = {\n [eventName: string]: any\n}\n\ntype MessageDefinitions = {\n [messageType: string]: any\n}\n\ntype ActionFunctions<Configuration, A extends ActionDefinitions> = {\n [actionType in keyof A]: (\n props: IntegrationProps<Configuration> & ActionPayload<actionType, A[actionType]['input']>\n ) => Promise<A[actionType]['output']>\n}\n\ntype MessageHandlerProps = {\n ack: AckFunction\n}\n\nexport type ChannelFunctions<Configuration, C extends ChannelDefinitions> = {\n [channelName in keyof C]: {\n messages: {\n [messageType in keyof C[channelName]]: (\n props: IntegrationProps<Configuration> &\n MessagePayload<C[channelName][messageType], Message, Conversation, User> &\n MessageHandlerProps\n ) => Promise<void>\n }\n }\n}\n\nexport type IntegrationImplementationProps<\n Configuration = any,\n Actions extends ActionDefinitions = any,\n Channels extends ChannelDefinitions = any,\n _Events extends EventDefinitions = any\n> = {\n register: (props: IntegrationProps<Configuration> & RegisterPayload) => Promise<void>\n unregister: (props: IntegrationProps<Configuration> & UnregisterPayload) => Promise<void>\n handler: (props: IntegrationProps<Configuration> & WebhookPayload) => Promise<Response | void>\n createUser?: (props: IntegrationProps<Configuration> & CreateUserPayload) => Promise<Response | void>\n createConversation?: (props: IntegrationProps<Configuration> & CreateConversationPayload) => Promise<Response | void>\n actions: ActionFunctions<Configuration, Actions>\n channels: ChannelFunctions<Configuration, Channels>\n}\n\nexport class IntegrationImplementation<\n Configuration = any,\n Actions extends ActionDefinitions = any,\n Channels extends ChannelDefinitions = any,\n Events extends EventDefinitions = any\n> {\n public readonly actions: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['actions']\n public readonly channels: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['channels']\n public readonly register: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['register']\n public readonly unregister: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['unregister']\n public readonly handler: ReturnType<typeof integrationHandler>\n public readonly start: (port?: number) => Promise<Server>\n\n public constructor(props: IntegrationImplementationProps<Configuration, Actions, Channels, Events>) {\n this.actions = props.actions\n this.channels = props.channels\n this.register = props.register\n this.unregister = props.unregister\n this.handler = integrationHandler(props)\n this.start = (port?: number) => serve(this.handler, port)\n }\n}\n", "import { z } from 'zod'\n\nconst NonEmptyString = z.string().min(1)\n\nconst textMessageSchema = z.object({\n text: NonEmptyString,\n})\n\nconst markdownMessageSchema = z.object({\n markdown: NonEmptyString,\n})\n\nconst imageMessageSchema = z.object({\n imageUrl: NonEmptyString,\n})\n\nconst audioMessageSchema = z.object({\n audioUrl: NonEmptyString,\n})\n\nconst videoMessageSchema = z.object({\n videoUrl: NonEmptyString,\n})\n\nconst fileMessageSchema = z.object({\n fileUrl: NonEmptyString,\n title: NonEmptyString.optional(),\n})\n\nconst locationMessageSchema = z.object({\n latitude: z.number(),\n longitude: z.number(),\n})\n\nconst cardSchema = z.object({\n title: NonEmptyString,\n subtitle: NonEmptyString.optional(),\n imageUrl: NonEmptyString.optional(),\n actions: z.array(\n z.object({\n action: z.enum(['postback', 'url', 'say']),\n label: NonEmptyString,\n value: NonEmptyString,\n })\n ),\n})\n\nconst choiceSchema = z.object({\n text: NonEmptyString,\n options: z.array(\n z.object({\n label: NonEmptyString,\n value: NonEmptyString,\n })\n ),\n})\n\nconst carouselSchema = z.object({\n items: z.array(cardSchema),\n})\n\nexport const defaults = {\n text: { schema: textMessageSchema },\n markdown: { schema: markdownMessageSchema },\n image: { schema: imageMessageSchema },\n audio: { schema: audioMessageSchema },\n video: { schema: videoMessageSchema },\n file: { schema: fileMessageSchema },\n location: { schema: locationMessageSchema },\n carousel: { schema: carouselSchema },\n card: { schema: cardSchema },\n dropdown: { schema: choiceSchema },\n choice: { schema: choiceSchema },\n} as const // should use satisfies operator but this works for older versions of TS\n"],
5
+ "mappings": "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",
6
+ "names": ["src_exports", "__export", "Bot", "IntegrationImplementation", "IntegrationDefinition", "botIdHeader", "botUserIdHeader", "clients", "configurationHeader", "integrationIdHeader", "message_exports", "operationHeader", "serve", "typeHeader", "webhookIdHeader", "__toCommonJS", "import_axios", "botIdHeader", "botUserIdHeader", "integrationIdHeader", "webhookIdHeader", "configurationHeader", "operationHeader", "typeHeader", "BotClient", "axiosInstance", "axiosGlobal", "props", "request", "formatBotHeaders", "ctx", "typeHeader", "botIdHeader", "operationHeader", "configurationHeader", "operation", "url", "data", "axios", "import_node_http", "log", "serve", "handler", "port", "callback", "defaultCallback", "server", "req", "res", "request", "mapIncomingMessageToRequest", "response", "e", "log", "incoming", "body", "readBody", "headers", "i", "key", "value", "url", "trimPrefix", "prefix", "resolve", "reject", "chunk", "import_client", "import_zod", "botOperationSchema", "createBotHandler", "botState", "req", "ctx", "extractContext", "log", "client", "props", "onEventReceived", "onRegister", "onUnregister", "onPing", "headers", "botId", "botIdHeader", "base64Configuration", "configurationHeader", "type", "typeHeader", "operation", "botOperationSchema", "operationHeader", "body", "parseBody", "handler", "_", "Bot", "def", "_handler", "_type", "handler", "createBotHandler", "port", "serve", "import_client", "import_axios", "import_client", "import_zod", "e", "runtimeErrorSchema", "IntegrationClient", "axiosInstance", "axiosGlobal", "props", "request", "webhookRequest", "formatIntegrationHeaders", "ctx", "botIdHeader", "operationHeader", "botUserIdHeader", "integrationIdHeader", "webhookIdHeader", "configurationHeader", "operation", "url", "data", "axios", "e", "runtimeErrorCode", "result", "runtimeErrorSchema", "import_zod", "integrationOperationSchema", "import_radash", "import_zod", "import_zod_to_json_schema", "isObjectSchema", "schema", "schemaDefinitionToJsonSchema", "definition", "zodToJsonSchema", "key", "value", "property", "nonEmptyDict", "v", "r", "obj", "schemaSchema", "configurationDefinitionSchema", "eventDefinitionSchema", "actionDefinitionSchema", "messageDefinitionSchema", "tagsDefinitionSchema", "channelDefinitionSchema", "stateDefinitionSchema", "integrationDefinitionSchema", "PUBLIC_VERSION", "PRIVATE_VERSION", "formatIntegrationDefinition", "definition", "schemaDefinitionToJsonSchema", "event", "action", "channel", "message", "state", "IntegrationDefinition", "props", "integrationDefinitionInput", "parsed", "name", "version", "icon", "readme", "title", "description", "tags", "configuration", "events", "actions", "channels", "states", "user", "isPublic", "secrets", "import_client", "integrationHandler", "integration", "req", "ctx", "extractContext", "client", "props", "response", "onWebhook", "onRegister", "onUnregister", "onMessageCreated", "onActionTriggered", "onPing", "onCreateUser", "onCreateConversation", "e", "headers", "botId", "botIdHeader", "botUserId", "botUserIdHeader", "integrationId", "integrationIdHeader", "webhookId", "webhookIdHeader", "base64Configuration", "configurationHeader", "operation", "integrationOperationSchema", "operationHeader", "parseBody", "_", "incomingRequest", "webhookUrl", "tags", "channel", "conversation", "user", "type", "payload", "message", "channelHandler", "messageHandler", "input", "action", "output", "IntegrationImplementation", "props", "integrationHandler", "port", "serve", "message_exports", "__export", "defaults", "import_zod", "NonEmptyString", "textMessageSchema", "markdownMessageSchema", "imageMessageSchema", "audioMessageSchema", "videoMessageSchema", "fileMessageSchema", "locationMessageSchema", "cardSchema", "choiceSchema", "carouselSchema", "clients", "IntegrationClient", "BotClient"]
7
7
  }
@@ -16,7 +16,7 @@ export declare class IntegrationClient {
16
16
  messageCreated: (props: Props<MessagePayload<any, Message, Conversation, User>>) => Promise<import("axios").AxiosResponse<any, any>>;
17
17
  register: (props: Props<RegisterPayload>) => Promise<import("axios").AxiosResponse<any, any>>;
18
18
  unregister: (props: Props<UnregisterPayload>) => Promise<import("axios").AxiosResponse<any, any>>;
19
- webhookReceived: (props: Props<WebhookPayload>) => Promise<import("axios").AxiosResponse<any, any>>;
19
+ webhookReceived: (props: Props<WebhookPayload>) => Promise<import("axios").AxiosResponse<unknown, any>>;
20
20
  createUser: (props: Props<CreateUserPayload>) => Promise<import("axios").AxiosResponse<{
21
21
  user: {
22
22
  id: User['id'];
@@ -183,22 +183,24 @@ export declare const stateDefinitionSchema: z.ZodObject<{
183
183
  type: z.ZodUnion<[z.ZodLiteral<"integration">, z.ZodLiteral<"conversation">, z.ZodLiteral<"user">]>;
184
184
  schema: z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>;
185
185
  }, "strip", z.ZodTypeAny, {
186
+ type: "user" | "conversation" | "integration";
186
187
  schema: {} & {
187
188
  [k: string]: unknown;
188
189
  };
189
- type: "conversation" | "integration" | "user";
190
190
  }, {
191
+ type: "user" | "conversation" | "integration";
191
192
  schema: {} & {
192
193
  [k: string]: unknown;
193
194
  };
194
- type: "conversation" | "integration" | "user";
195
195
  }>;
196
196
  export declare const integrationDefinitionSchema: z.ZodObject<{
197
197
  name: z.ZodString;
198
198
  version: z.ZodString;
199
- icon: z.ZodOptional<z.ZodString>;
199
+ public: z.ZodOptional<z.ZodBoolean>;
200
200
  title: z.ZodOptional<z.ZodString>;
201
201
  description: z.ZodOptional<z.ZodString>;
202
+ icon: z.ZodOptional<z.ZodString>;
203
+ readme: z.ZodOptional<z.ZodString>;
202
204
  tags: z.ZodOptional<z.ZodObject<Pick<{
203
205
  conversations: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
204
206
  users: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -366,15 +368,15 @@ export declare const integrationDefinitionSchema: z.ZodObject<{
366
368
  type: z.ZodUnion<[z.ZodLiteral<"integration">, z.ZodLiteral<"conversation">, z.ZodLiteral<"user">]>;
367
369
  schema: z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>;
368
370
  }, "strip", z.ZodTypeAny, {
371
+ type: "user" | "conversation" | "integration";
369
372
  schema: {} & {
370
373
  [k: string]: unknown;
371
374
  };
372
- type: "conversation" | "integration" | "user";
373
375
  }, {
376
+ type: "user" | "conversation" | "integration";
374
377
  schema: {} & {
375
378
  [k: string]: unknown;
376
379
  };
377
- type: "conversation" | "integration" | "user";
378
380
  }>>>;
379
381
  user: z.ZodOptional<z.ZodObject<{
380
382
  creation: z.ZodObject<{
@@ -398,14 +400,15 @@ export declare const integrationDefinitionSchema: z.ZodObject<{
398
400
  requiredTags: string[];
399
401
  };
400
402
  }>>;
401
- public: z.ZodOptional<z.ZodBoolean>;
402
403
  secrets: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
403
404
  }, "strip", z.ZodTypeAny, {
404
405
  name: string;
405
406
  version: string;
406
- icon?: string | undefined;
407
+ public?: boolean | undefined;
407
408
  title?: string | undefined;
408
409
  description?: string | undefined;
410
+ icon?: string | undefined;
411
+ readme?: string | undefined;
409
412
  tags?: {
410
413
  users?: string[] | undefined;
411
414
  } | undefined;
@@ -449,10 +452,10 @@ export declare const integrationDefinitionSchema: z.ZodObject<{
449
452
  } | undefined;
450
453
  }> | undefined;
451
454
  states?: Record<string, {
455
+ type: "user" | "conversation" | "integration";
452
456
  schema: {} & {
453
457
  [k: string]: unknown;
454
458
  };
455
- type: "conversation" | "integration" | "user";
456
459
  }> | undefined;
457
460
  user?: {
458
461
  creation: {
@@ -460,14 +463,15 @@ export declare const integrationDefinitionSchema: z.ZodObject<{
460
463
  requiredTags: string[];
461
464
  };
462
465
  } | undefined;
463
- public?: boolean | undefined;
464
466
  secrets?: string[] | undefined;
465
467
  }, {
466
468
  name: string;
467
469
  version: string;
468
- icon?: string | undefined;
470
+ public?: boolean | undefined;
469
471
  title?: string | undefined;
470
472
  description?: string | undefined;
473
+ icon?: string | undefined;
474
+ readme?: string | undefined;
471
475
  tags?: {
472
476
  users?: string[] | undefined;
473
477
  } | undefined;
@@ -511,10 +515,10 @@ export declare const integrationDefinitionSchema: z.ZodObject<{
511
515
  } | undefined;
512
516
  }> | undefined;
513
517
  states?: Record<string, {
518
+ type: "user" | "conversation" | "integration";
514
519
  schema: {} & {
515
520
  [k: string]: unknown;
516
521
  };
517
- type: "conversation" | "integration" | "user";
518
522
  }> | undefined;
519
523
  user?: {
520
524
  creation: {
@@ -522,7 +526,6 @@ export declare const integrationDefinitionSchema: z.ZodObject<{
522
526
  requiredTags: string[];
523
527
  };
524
528
  } | undefined;
525
- public?: boolean | undefined;
526
529
  secrets?: string[] | undefined;
527
530
  }>;
528
531
  export type ConfigurationDefinition = z.infer<typeof configurationDefinitionSchema>;
@@ -541,7 +544,18 @@ type BaseEvent = Record<string, AnyZodObject>;
541
544
  type BaseAction = Record<string, Record<'input' | 'output', AnyZodObject>>;
542
545
  type BaseChannel = Record<string, Record<string, AnyZodObject>>;
543
546
  type BaseState = Record<string, AnyZodObject>;
544
- export type IntegrationDefinitionProps<TConfig extends BaseConfig, TEvent extends BaseEvent, TAction extends BaseAction, TChannel extends BaseChannel, TState extends BaseState> = Omit<IntegrationDefinitionOutput, 'configuration' | 'events' | 'actions' | 'channels' | 'states'> & {
547
+ declare const PUBLIC_VERSION: "0.2.0";
548
+ declare const PRIVATE_VERSION: "0.0.1";
549
+ type IntegrationDefinitionVersion = {
550
+ public: true;
551
+ /** Only version 0.2.0 is supported for public integrations yet. This is temporary. */
552
+ version: typeof PUBLIC_VERSION;
553
+ } | {
554
+ public: false;
555
+ /** Only version 0.0.1 is supported for private integrations yet. This is temporary. */
556
+ version: typeof PRIVATE_VERSION;
557
+ };
558
+ export type IntegrationDefinitionProps<TConfig extends BaseConfig, TEvent extends BaseEvent, TAction extends BaseAction, TChannel extends BaseChannel, TState extends BaseState> = Omit<IntegrationDefinitionOutput, 'public' | 'version' | 'configuration' | 'events' | 'actions' | 'channels' | 'states'> & IntegrationDefinitionVersion & {
545
559
  configuration?: Merge<ConfigurationDefinition, SchemaDefinition<TConfig>>;
546
560
  events?: {
547
561
  [K in keyof TEvent]: Merge<EventDefinition, SchemaDefinition<TEvent[K]>>;
@@ -571,6 +585,7 @@ export declare class IntegrationDefinition<TConfig extends BaseConfig = BaseConf
571
585
  readonly name: IntegrationDefinitionOutput['name'];
572
586
  readonly version: IntegrationDefinitionOutput['version'];
573
587
  readonly icon: IntegrationDefinitionOutput['icon'];
588
+ readonly readme: IntegrationDefinitionOutput['readme'];
574
589
  readonly title: IntegrationDefinitionOutput['title'];
575
590
  readonly description: IntegrationDefinitionOutput['description'];
576
591
  readonly tags: IntegrationDefinitionOutput['tags'];
@@ -4,11 +4,11 @@ export declare const runtimeErrorSchema: z.ZodObject<{
4
4
  type: z.ZodLiteral<"Runtime">;
5
5
  message: z.ZodString;
6
6
  }, "strip", z.ZodTypeAny, {
7
+ code: 400;
7
8
  message: string;
8
9
  type: "Runtime";
9
- code: 400;
10
10
  }, {
11
+ code: 400;
11
12
  message: string;
12
13
  type: "Runtime";
13
- code: 400;
14
14
  }>;
package/package.json CHANGED
@@ -1,19 +1,14 @@
1
1
  {
2
2
  "name": "@botpress/sdk",
3
- "version": "0.0.10",
3
+ "version": "0.0.13",
4
4
  "description": "Botpress SDK",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
- "scripts": {
8
- "build:type": "tsc --emitDeclarationOnly --declaration --target es2019 --module commonjs --moduleResolution node --lib es2019",
9
- "build:index": "ts-node -T build.ts",
10
- "build": "pnpm build:type && pnpm build:index"
11
- },
12
7
  "keywords": [],
13
8
  "author": "",
14
9
  "license": "ISC",
15
10
  "dependencies": {
16
- "@botpress/client": "0.0.11",
11
+ "@botpress/client": "0.0.13",
17
12
  "axios": "0.27.2",
18
13
  "radash": "^9.5.0",
19
14
  "zod": "^3.20.6",
@@ -25,5 +20,10 @@
25
20
  "ts-node": "^10.9.1",
26
21
  "type-fest": "^3.4.0",
27
22
  "typescript": "^4.9.4"
23
+ },
24
+ "scripts": {
25
+ "build:type": "tsc --emitDeclarationOnly --declaration --target es2019 --module commonjs --moduleResolution node --lib es2019",
26
+ "build:index": "ts-node -T build.ts",
27
+ "build": "pnpm build:type && pnpm build:index"
28
28
  }
29
- }
29
+ }