@botpress/sdk 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,12 @@
1
1
 
2
- > @botpress/sdk@0.9.0 build /home/runner/work/botpress/botpress/packages/sdk
2
+ > @botpress/sdk@0.10.0 build /home/runner/work/botpress/botpress/packages/sdk
3
3
  > pnpm build:type && pnpm build:node
4
4
 
5
5
 
6
- > @botpress/sdk@0.9.0 build:type /home/runner/work/botpress/botpress/packages/sdk
6
+ > @botpress/sdk@0.10.0 build:type /home/runner/work/botpress/botpress/packages/sdk
7
7
  > tsc --emitDeclarationOnly --declaration
8
8
 
9
9
 
10
- > @botpress/sdk@0.9.0 build:node /home/runner/work/botpress/botpress/packages/sdk
10
+ > @botpress/sdk@0.10.0 build:node /home/runner/work/botpress/botpress/packages/sdk
11
11
  > ts-node -T build.ts
12
12
 
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var Oe=Object.create;var G=Object.defineProperty;var je=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var He=Object.getPrototypeOf,Ge=Object.prototype.hasOwnProperty;var C=(t,e)=>{for(var o in e)G(t,o,{get:e[o],enumerable:!0})},H=(t,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Fe(e))!Ge.call(t,s)&&s!==o&&G(t,s,{get:()=>e[s],enumerable:!(a=je(e,s))||a.enumerable});return t},m=(t,e,o)=>(H(t,e,"default"),o&&H(o,e,"default")),ae=(t,e,o)=>(o=t!=null?Oe(He(t)):{},H(e||!t||!t.__esModule?G(o,"default",{value:t,enumerable:!0}):o,t)),Ne=t=>H(G({},"__esModule",{value:!0}),t);var I={};C(I,{Bot:()=>z,BotSpecificClient:()=>R,Integration:()=>_,IntegrationDefinition:()=>E,IntegrationSpecificClient:()=>w,InterfaceDeclaration:()=>u,RuntimeError:()=>K.RuntimeError,botIdHeader:()=>D,botUserIdHeader:()=>te,configurationHeader:()=>O,integrationIdHeader:()=>ne,interfaces:()=>ee,isApiError:()=>K.isApiError,messages:()=>Z,operationHeader:()=>j,parseBody:()=>y,serve:()=>F,studioComponentDefinitions:()=>re,typeHeader:()=>se,webhookIdHeader:()=>oe});module.exports=Ne(I);var Z={};C(Z,{defaults:()=>Le});var r={};C(r,{default:()=>n,studioComponentDefinitions:()=>re});var c=require("@bpinternal/zui");m(r,require("@bpinternal/zui"));var b=c.z.object({allowDynamicVariable:c.z.boolean().optional(),horizontal:c.z.boolean().optional()}),re={string:{text:{id:"text",params:b.extend({multiLine:c.z.boolean().optional(),growVertically:c.z.boolean().optional(),suggestions:c.z.array(c.z.string()).optional()})},dropdown:{id:"dropdown",params:b.extend({filterable:c.z.boolean().optional()})},radiogroup:{id:"radiogroup",params:b.extend({})},date:{id:"date",params:b.extend({dateFormat:c.z.string().optional(),minDate:c.z.string().optional(),maxDate:c.z.string().optional(),defaultTimezone:c.z.string().optional(),disableTimezoneSelection:c.z.boolean().optional(),highlightCurrentDay:c.z.boolean().optional(),showShortcutButtons:c.z.boolean().optional(),showOutsideDaysOfMonth:c.z.boolean().optional(),firstDayOfWeek:c.z.number().optional(),canChangeMonth:c.z.boolean().optional(),showWeekNumbers:c.z.boolean().optional()})},time:{id:"time",params:b.extend({useAMPM:c.z.boolean().optional(),timeFormat:c.z.string().optional(),minTime:c.z.string().optional(),maxTime:c.z.string().optional(),showArrowButtons:c.z.boolean().optional(),precision:c.z.enum(["minute","second","millisecond"]).optional()})},richtext:{id:"richtext",params:c.z.object({allowDynamicVariable:c.z.boolean().optional(),resizable:c.z.boolean().optional()})},json:{id:"json",params:b.extend({showPreview:c.z.boolean().optional(),showValidationError:c.z.boolean().optional()})},file:{id:"file",params:b.extend({fileTypes:c.z.array(c.z.enum(["image","audio","video"])).optional(),showUploadedFiles:c.z.boolean().optional()})}},number:{number:{id:"number",params:b.extend({allowNumericCharactersOnly:c.z.boolean().optional(),stepSize:c.z.number().optional()})},slider:{id:"slider",params:c.z.object({horizontal:c.z.boolean().optional(),stepSize:c.z.number().optional()})}},boolean:{switch:{id:"switch",params:b}},array:{options:{id:"options",params:b},strings:{id:"strings",params:b},daterange:{id:"daterange",params:c.z.object({dateFormat:c.z.string().optional(),minDate:c.z.string().optional(),maxDate:c.z.string().optional(),defaultTimezone:c.z.string().optional(),allowSingleDayRange:c.z.boolean().optional(),highlightCurrentDay:c.z.boolean().optional(),showOutsideDaysOfMonth:c.z.boolean().optional(),firstDayOfWeek:c.z.number().optional(),canChangeMonth:c.z.boolean().optional(),showWeekNumbers:c.z.boolean().optional()})}},object:{collapsible:{id:"collapsible",params:c.z.object({defaultOpen:c.z.boolean().optional()})},modal:{id:"modal",params:c.z.object({title:c.z.string().optional(),buttonLabel:c.z.string().optional(),closeButtonLabel:c.z.string().optional()})},popover:{id:"popover",params:c.z.object({buttonLabel:c.z.string().optional()})}},discriminatedUnion:{}},n=c.z;var T=r.z.string().min(1),le=r.z.object({text:T}),pe=r.z.object({markdown:T}),ge=r.z.object({imageUrl:T}),de=r.z.object({audioUrl:T}),me=r.z.object({videoUrl:T}),ue=r.z.object({fileUrl:T,title:T.optional()}),he=r.z.object({latitude:r.z.number(),longitude:r.z.number(),address:r.z.string().optional(),title:r.z.string().optional()}),Te=r.z.object({title:T,subtitle:T.optional(),imageUrl:T.optional(),actions:r.z.array(r.z.object({action:r.z.enum(["postback","url","say"]),label:T,value:T}))}),ce=r.z.object({text:T,options:r.z.array(r.z.object({label:T,value:T}))}),_e=r.z.object({items:r.z.array(Te)}),ze=r.z.discriminatedUnion("type",[r.z.object({type:r.z.literal("text"),payload:le}),r.z.object({type:r.z.literal("markdown"),payload:pe}),r.z.object({type:r.z.literal("image"),payload:ge}),r.z.object({type:r.z.literal("audio"),payload:de}),r.z.object({type:r.z.literal("video"),payload:me}),r.z.object({type:r.z.literal("file"),payload:ue}),r.z.object({type:r.z.literal("location"),payload:he})]),Ke=r.z.object({items:r.z.array(ze)}),Le={text:{schema:le},markdown:{schema:pe},image:{schema:ge},audio:{schema:de},video:{schema:me},file:{schema:ue},location:{schema:he},carousel:{schema:_e},card:{schema:Te},dropdown:{schema:ce},choice:{schema:ce},bloc:{schema:Ke}};var ee={};C(ee,{creatable:()=>it,deletable:()=>ct,listable:()=>st,llm:()=>Je,readable:()=>at,schemas:()=>Y,speechToText:()=>nt,textToImage:()=>Ye,updatable:()=>rt});var Ze=t=>Array.from(new Set(t)),x=t=>Object.entries(t);var S=(t,e)=>Object.fromEntries(x(t).map(([o,a])=>[o,e(a,o)])),U=(t,e,o)=>{let a=Ze([...Object.keys(t),...Object.keys(e)]),s={};for(let i of a){let l=t[i],g=e[i];l&&g?s[i]=o(l,g):l?s[i]=l:g&&(s[i]=g)}return s};var V=Symbol("schemaName"),fe=t=>t?S(t,(o,a)=>({...o,[V]:a})):{},be=t=>t[V]!==void 0,ye=t=>t[V];var E=class{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.icon=e.icon,this.readme=e.readme,this.title=e.title,this.identifier=e.identifier,this.description=e.description,this.configuration=e.configuration,this.events=e.events,this.actions=e.actions,this.channels=e.channels,this.states=e.states,this.user=e.user,this.secrets=e.secrets,this.entities=e.entities}name;version;title;description;icon;readme;configuration;events;actions;channels;states;user;secrets;identifier;entities;interfaces={};clone(e){let o=new E({...this,...e});for(let[a,s]of Object.entries(this.interfaces))o.interfaces[a]=s;return o}extend(e,o){let a=o(fe(this.entities)),s=x(a).find(([h,B])=>!be(B));if(s)throw new Error(`Cannot extend interface "${e.name}" with entity "${s[0]}"; the provided schema is not part of the integration's entities.`);let i=S(a,h=>({name:ye(h),schema:h.schema})),{resolved:l,implementStatement:g}=e.resolve({entities:i}),p=this;p.actions=U(p.actions??{},l.actions,this._mergeActions),p.channels=U(p.channels??{},l.channels,this._mergeChannels),p.events=U(p.events??{},l.events,this._mergeEvents);let d=Object.values(i).map(h=>h.name),f=`${e.name}<${d.join(",")}>`;return this.interfaces[f]=g,this}_mergeActions=(e,o)=>({title:o.title??e.title,description:o.description??e.description,input:{schema:e.input.schema.merge(o.input.schema)},output:{schema:e.output.schema.merge(o.output.schema)}});_mergeEvents=(e,o)=>({title:o.title??e.title,description:o.description??e.description,schema:e.schema.merge(o.schema)});_mergeChannels=(e,o)=>{let a=U(e.messages,o.messages,this._mergeMessage);return{title:o.title??e.title,description:o.description??e.description,conversation:o.conversation??e.conversation,message:o.message??e.message,messages:a}};_mergeMessage=(e,o)=>({schema:e.schema.merge(o.schema)})};var u=class{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.entities=e.entities??{},this.events=e.events??{},this.actions=e.actions??{},this.channels=e.channels??{},this.templateName=e.templateName}name;version;entities;events;actions;channels;templateName;resolve(e){let{entities:o}=e,a={name:this.name,version:this.version,entities:S(o,p=>({name:p.name})),actions:{},events:{}},s={},i={},l={};for(let[p,d]of x(this.actions)){let f=this._dereference(d.input.schema,o),h=this._dereference(d.output.schema,o),B=this._rename(o,p);s[B]={input:{schema:f},output:{schema:h}},a.actions[p]={name:B}}for(let[p,d]of x(this.events)){let f=this._dereference(d.schema,o),h=this._rename(o,p);i[h]={schema:f},a.events[p]={name:h}}for(let[p,d]of x(this.channels)){let f={};for(let[h,B]of x(d.messages)){let L=this._dereference(B.schema,o);f[h]={schema:L}}l[p]={messages:f}}return{resolved:{actions:s,events:i,channels:l},implementStatement:a}}_dereference(e,o){let a={},s={};for(let[i,l]of x(o))a[i]=l.schema,s[i]=n.ref(i);return e(s).dereference(a)}_rename(e,o){if(!this.templateName)return o;let a=S(e,s=>s.name);return this.templateName(o,a)}};var qe=n.object({id:n.string(),type:n.enum(["function"]),function:n.object({name:n.string(),arguments:n.record(n.any()).nullable().describe("Some LLMs may generate invalid JSON for a tool call, so this will be `null` when it happens.")})}),Ve=n.object({type:n.enum(["auto","specific","any","none",""]).optional(),functionName:n.string().optional().describe('Required if `type` is "specific"')}),Ie=n.object({role:n.enum(["user","assistant"]),type:n.enum(["text","tool_calls","tool_result","multipart"]).default("text"),toolCalls:n.array(qe).optional().describe('Required if `type` is "tool_calls"'),toolResultCallId:n.string().optional().describe('Required if `type` is "tool_result"'),content:n.string().or(n.array(n.object({type:n.enum(["text","image"]),mimeType:n.string().optional().describe("Indicates the MIME type of the content. If not provided it will be detected from the content-type header of the provided URL."),text:n.string().optional().describe('Required if part type is "text" '),url:n.string().optional().describe('Required if part type is "image"')}))).optional().nullable().describe('Required unless `type` is "tool_call". If `type` is "multipart", this field must be an array of content objects. If `type` is "tool_result" then this field should be the result of the tool call (a plain string or a JSON-encoded array or object). If `type` is "tool_call" then the `toolCalls` field should be used instead.')}),$=n.object({id:n.string()}),$e=$.extend({name:n.string(),input:n.object({maxTokens:n.number().int(),costPer1MTokens:n.number().describe("Cost per 1 million tokens, in U.S. dollars")}),output:n.object({maxTokens:n.number().int(),costPer1MTokens:n.number().describe("Cost per 1 million tokens, in U.S. dollars")})}),ve=t=>n.object({model:t.describe("Model to use for content generation").optional(),systemPrompt:n.string().optional().describe("Optional system prompt to guide the model"),messages:n.array(Ie).describe("Array of messages for the model to process"),responseFormat:n.enum(["text","json_object"]).optional().describe('Response format expected from the model. If "json_object" is chosen, you must instruct the model to generate JSON either via the system prompt or a user message.'),maxTokens:n.number().optional().describe("Maximum number of tokens allowed in the generated response"),temperature:n.number().min(0).max(2).displayAs({id:"slider",params:{stepSize:.01,horizontal:!0}}).default(1).describe("Sampling temperature for the model. Higher values result in more random outputs."),topP:n.number().min(0).max(1).default(1).displayAs({id:"slider",params:{stepSize:.01,horizontal:!0}}).describe("Top-p sampling parameter. Limits sampling to the smallest set of tokens with a cumulative probability above the threshold."),stopSequences:n.array(n.string()).max(4).optional().describe("Sequences where the model should stop generating further tokens."),tools:n.array(n.object({type:n.literal("function"),function:n.object({name:n.string().describe("Function name"),description:n.string().optional(),argumentsSchema:n.object({}).passthrough().optional().describe("JSON schema of the function arguments")})})).optional(),toolChoice:Ve.optional(),userId:n.string().optional(),debug:n.boolean().optional().describe("Set to `true` to output debug information to the bot logs")}),qt=ve($),We=n.object({id:n.string().describe("Response ID from LLM provider"),provider:n.string().describe("LLM provider name"),model:n.string().describe("Model name"),choices:n.array(Ie.omit({role:!0}).extend({role:n.literal("assistant"),index:n.number().int(),stopReason:n.enum(["stop","max_tokens","tool_calls","content_filter","other"])})),usage:n.object({inputTokens:n.number().int().describe("Number of input tokens used by the model"),inputCost:n.number().describe("Cost of the input tokens received by the model, in U.S. dollars"),outputTokens:n.number().int().describe("Number of output tokens used by the model"),outputCost:n.number().describe("Cost of the output tokens generated by the model, in U.S. dollars")})}),Je=new u({name:"llm",version:"3.1.0",entities:{modelRef:{schema:$}},events:{},actions:{generateContent:{input:{schema:({modelRef:t})=>ve(t)},output:{schema:()=>We}},listLanguageModels:{input:{schema:()=>n.object({})},output:{schema:({modelRef:t})=>n.object({models:n.array(n.intersection($e,t))})}}}});var W=n.object({id:n.string()}),Qe=W.extend({name:n.string(),costPerImage:n.number().describe("Cost per image generation, in U.S. dollars"),sizes:n.array(n.string()).describe("Available image sizes"),defaultSize:n.string().describe("Default image size generated by model")}),xe=n.object({}).describe("Model-specific parameters for image generation"),Be=(t,e)=>n.object({model:t.optional().describe("Model to use for image generation"),prompt:n.string(),size:n.string().optional(),params:e.optional()}),Jt=Be(W,xe),Xe=n.object({model:n.string().describe("Model name used"),imageUrl:n.string().describe("Temporary URL of generated image"),cost:n.number().describe("Cost of the image generation, in U.S. dollars")}),Ye=new u({name:"textToImage",version:"1.0.0",entities:{imageModelRef:{schema:W},imageGenerationParams:{schema:xe}},actions:{generateImage:{input:{schema:({imageModelRef:t,imageGenerationParams:e})=>Be(t,e)},output:{schema:()=>Xe}},listImageModels:{input:{schema:()=>n.object({})},output:{schema:({imageModelRef:t})=>n.object({models:n.array(n.intersection(Qe,t))})}}}});var Q={};C(Q,{OpenAITranscribeAudioOutputSchema:()=>J});var J=n.object({language:n.string().describe("Detected language of the audio"),duration:n.number().describe("Duration of the audio file, in seconds"),segments:n.array(n.object({text:n.string().describe("Text content of the segment."),id:n.number().describe("Unique identifier of the segment"),seek:n.number().describe("Seek offset of the segment"),start:n.number().describe("Start time of the segment in seconds."),end:n.number().describe("End time of the segment in seconds."),tokens:n.array(n.number()).describe("Array of token IDs for the text content."),temperature:n.number().describe("Temperature parameter used for generating the segment."),avg_logprob:n.number().describe("Average logprob of the segment. If the value is lower than -1, consider the logprobs failed."),compression_ratio:n.number().describe("Compression ratio of the segment. If the value is greater than 2.4, consider the compression failed."),no_speech_prob:n.number().describe("Probability of no speech in the segment. If the value is higher than 1.0 and the avg_logprob is below -1, consider this segment silent.")}))});var X=n.object({id:n.string()}),et=X.extend({name:n.string(),costPerMinute:n.number().describe("Cost per minute of speech transcription, in U.S. dollars")}),Se=t=>n.object({model:t.optional().describe("Model to use for speech-to-text transcription (optional)"),fileUrl:n.string().url().describe("URL of the audio file to transcribe. The URL should return a content-type header in order to detect the audio format. Supported audio formats supported are: mp3, mp4, mpeg, mpga, m4a, wav, webm"),language:n.string().optional().describe("The language of the input audio (optional). Supplying the input language in ISO-639-1 format will improve accuracy and latency."),prompt:n.string().optional().describe("An optional text to guide the model's style or continue a previous audio segment. The prompt should match the audio language."),temperature:n.number().default(0).optional().describe("The sampling temperature (optional), between 0 and 1. Defaults to 0 (automatic). Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.")}),nn=Se(X),tt=J.extend({model:n.string().describe("Model name used"),cost:n.number().describe("Total cost of this transcription, in U.S. dollars")}),nt=new u({name:"speechToText",version:"1.0.0",entities:{speechToTextModelRef:{schema:X}},actions:{transcribeAudio:{input:{schema:({speechToTextModelRef:t})=>Se(t)},output:{schema:()=>tt}},listSpeechToTextModels:{input:{schema:()=>n.object({})},output:{schema:({speechToTextModelRef:t})=>n.object({models:n.array(n.intersection(et,t))})}}}});var Y={};C(Y,{speechToText:()=>Q});var v=n.object({id:n.string()}),M=t=>n.intersection(t,v),ot=t=>t[0].toUpperCase()+t.slice(1),k=(...t)=>{let[e,...o]=t.filter(a=>a.length>0).map(a=>a.toLowerCase());return e?[e,...o.map(ot)].join(""):""},Ce=n.string().optional(),st=new u({name:"listable",version:"0.0.1",entities:{item:{schema:v}},events:{},actions:{list:{input:{schema:()=>n.object({nextToken:Ce})},output:{schema:t=>n.object({items:n.array(M(t.item)),meta:n.object({nextToken:Ce})})}}},templateName:(t,e)=>k(e.item,t)}),it=new u({name:"creatable",version:"0.0.1",entities:{item:{schema:v}},events:{created:{schema:t=>n.object({item:M(t.item)})}},actions:{create:{input:{schema:t=>n.object({item:t.item})},output:{schema:t=>n.object({item:M(t.item)})}}},templateName:(t,e)=>k(e.item,t)}),at=new u({name:"readable",version:"0.0.1",entities:{item:{schema:v}},events:{},actions:{read:{input:{schema:()=>v},output:{schema:t=>n.object({item:M(t.item)})}}},templateName:(t,e)=>k(e.item,t)}),rt=new u({name:"updatable",version:"0.0.1",entities:{item:{schema:v}},events:{updated:{schema:t=>n.object({item:M(t.item)})}},actions:{update:{input:{schema:t=>v.extend({item:t.item})},output:{schema:t=>n.object({item:M(t.item)})}}},templateName:(t,e)=>k(e.item,t)}),ct=new u({name:"deletable",version:"0.0.1",entities:{item:{schema:v}},events:{deleted:{schema:()=>v}},actions:{delete:{input:{schema:()=>v},output:{schema:()=>n.object({})}}},templateName:(t,e)=>k(e.item,t)});var D="x-bot-id",te="x-bot-user-id",ne="x-integration-id",oe="x-webhook-id",O="x-bp-configuration",j="x-bp-operation",se="x-bp-type";var Ee=require("node:http");var P=console;function y(t){if(!t.body)throw new Error("Missing body");return JSON.parse(t.body)}async function F(t,e=8072,o=dt){let a=(0,Ee.createServer)(async(s,i)=>{try{let l=await lt(s);if(l.path==="/health"){i.writeHead(200).end("ok");return}let g=await t(l);i.writeHead(g?.status??200,g?.headers??{}).end(g?.body??"{}")}catch(l){P.error("Error while handling request",{error:l?.message??"Internal error occured"}),i.writeHead(500).end(JSON.stringify({error:l?.message??"Internal error occured"}))}});return a.listen(e,()=>o(e)),a}async function lt(t){let e=await gt(t),o={};for(let s=0;s<t.rawHeaders.length;s+=2){let i=t.rawHeaders[s].toLowerCase(),l=t.rawHeaders[s+1];o[i]=l}let a=new URL(t.url??"",t.headers.host?`http://${t.headers.host}`:"http://botpress.cloud");return{body:e,path:a.pathname,query:pt(a.search,"?"),headers:o,method:t.method?.toUpperCase()??"GET"}}function pt(t,e){return t.indexOf(e)===0?t.slice(e.length):t}async function gt(t){return new Promise((e,o)=>{if(t.method!=="POST"&&t.method!=="PUT"&&t.method!=="PATCH")return e(void 0);let a="";t.on("data",s=>a+=s.toString()),t.on("error",s=>o(s)),t.on("end",()=>e(a))})}function dt(t){P.info(`Listening on port ${t}`)}m(I,r,module.exports);var K=require("@botpress/client");var Me=require("@bpinternal/zui");var mt=Me.z.enum(["webhook_received","message_created","action_triggered","register","unregister","ping","create_user","create_conversation"]),Pe=t=>{let e=t[D],o=t[te],a=t[ne],s=t[oe],i=t[O],l=mt.parse(t[j]);if(!e)throw new Error("Missing bot headers");if(!o)throw new Error("Missing bot user headers");if(!a)throw new Error("Missing integration headers");if(!s)throw new Error("Missing webhook headers");if(!i)throw new Error("Missing configuration headers");if(!l)throw new Error("Missing operation headers");return{botId:e,botUserId:o,integrationId:a,webhookId:s,operation:l,configuration:i?JSON.parse(Buffer.from(i,"base64").toString("utf-8")):{}}};var A=require("@botpress/client");var w=class{constructor(e){this.client=e}createConversation=e=>this.client.createConversation(e);getConversation=e=>this.client.getConversation(e);listConversations=e=>this.client.listConversations(e);getOrCreateConversation=e=>this.client.getOrCreateConversation(e);updateConversation=e=>this.client.updateConversation(e);deleteConversation=e=>this.client.deleteConversation(e);listParticipants=e=>this.client.listParticipants(e);addParticipant=e=>this.client.addParticipant(e);getParticipant=e=>this.client.getParticipant(e);removeParticipant=e=>this.client.removeParticipant(e);createEvent=e=>this.client.createEvent(e);getEvent=e=>this.client.getEvent(e);listEvents=e=>this.client.listEvents(e);createMessage=e=>this.client.createMessage(e);getOrCreateMessage=e=>this.client.getOrCreateMessage(e);getMessage=e=>this.client.getMessage(e);updateMessage=e=>this.client.updateMessage(e);listMessages=e=>this.client.listMessages(e);deleteMessage=e=>this.client.deleteMessage(e);createUser=e=>this.client.createUser(e);getUser=e=>this.client.getUser(e);listUsers=e=>this.client.listUsers(e);getOrCreateUser=e=>this.client.getOrCreateUser(e);updateUser=e=>this.client.updateUser(e);deleteUser=e=>this.client.deleteUser(e);getState=e=>this.client.getState(e);setState=e=>this.client.setState(e);getOrSetState=e=>this.client.getOrSetState(e);patchState=e=>this.client.patchState(e);configureIntegration=e=>this.client.configureIntegration(e);uploadFile=e=>this.client.uploadFile(e);upsertFile=e=>this.client.upsertFile(e);deleteFile=e=>this.client.deleteFile(e);listFiles=e=>this.client.listFiles(e);getFile=e=>this.client.getFile(e);updateFileMetadata=e=>this.client.updateFileMetadata(e)};var ie=ae(require("util")),N=t=>{if(process.env.BP_LOG_FORMAT==="json")return JSON.stringify({msg:ie.default.format(...t),visible_to_bot_owner:!0});{let[e,...o]=t;return ie.default.format(`[For Bot Owner] ${e}`,...o)}},we={forBot:()=>({info:(...t)=>{console.info(N(t))},warn:(...t)=>{console.warn(N(t))},error:(...t)=>{console.error(N(t))},debug:(...t)=>{console.debug(N(t))}})};var Ae=t=>async e=>{let o=Pe(e.headers),a=new w(new A.Client({botId:o.botId,integrationId:o.integrationId})),s={ctx:o,req:e,client:a,logger:we,instance:t};try{let i;switch(o.operation){case"webhook_received":i=await ht(s);break;case"register":i=await Tt(s);break;case"unregister":i=await ft(s);break;case"message_created":i=await It(s);break;case"action_triggered":i=await vt(s);break;case"ping":i=await ut(s);break;case"create_user":i=await bt(s);break;case"create_conversation":i=await yt(s);break;default:throw new Error(`Unknown operation ${o.operation}`)}return i?{...i,status:i.status??200}:{status:200}}catch(i){if((0,A.isApiError)(i)){let l=new A.RuntimeError(i.message,i);return{status:l.code,body:JSON.stringify(l.toJSON())}}throw i}},ut=async t=>{},ht=async({client:t,ctx:e,req:o,logger:a,instance:s})=>{let{req:i}=y(o);return s.webhook({client:t,ctx:e,req:i,logger:a})},Tt=async({client:t,ctx:e,req:o,logger:a,instance:s})=>{if(!s.register)return;let{webhookUrl:i}=y(o);await s.register({client:t,ctx:e,webhookUrl:i,logger:a})},ft=async({client:t,ctx:e,req:o,logger:a,instance:s})=>{if(!s.unregister)return;let{webhookUrl:i}=y(o);await s.unregister({ctx:e,webhookUrl:i,client:t,logger:a})},bt=async({client:t,ctx:e,req:o,logger:a,instance:s})=>{if(!s.createUser)return;let{tags:i}=y(o);return await s.createUser({ctx:e,client:t,tags:i,logger:a})},yt=async({client:t,ctx:e,req:o,logger:a,instance:s})=>{if(!s.createConversation)return;let{channel:i,tags:l}=y(o);return await s.createConversation({ctx:e,client:t,channel:i,tags:l,logger:a})},It=async({ctx:t,req:e,client:o,logger:a,instance:s})=>{let{conversation:i,user:l,type:g,payload:p,message:d}=y(e),f=s.channels[i.channel];if(!f)throw new Error(`Channel ${i.channel} not found`);let h=f.messages[g];if(!h)throw new Error(`Message of type ${g} not found in channel ${i.channel}`);await h({ctx:t,conversation:i,message:d,user:l,type:g,client:o,payload:p,ack:async({tags:L})=>{await o.updateMessage({id:d.id,tags:L})},logger:a})},vt=async({req:t,ctx:e,client:o,logger:a,instance:s})=>{let{input:i,type:l}=y(t);if(!l)throw new Error("Missing action type");let g=s.actions[l];if(!g)throw new Error(`Action ${l} not found`);let p=await g({ctx:e,input:i,client:o,type:l,logger:a});return{body:JSON.stringify({output:p})}};var _=class{props;actions;channels;register;unregister;createUser;createConversation;webhook;constructor(e){this.props=e,this.actions=e.actions,this.channels=e.channels,this.register=e.register,this.unregister=e.unregister,this.createUser=e.createUser,this.createConversation=e.createConversation,this.webhook=e.handler}handler=Ae(this);start=e=>F(this.handler,e)};var ke=ae(require("@botpress/client"));var R=class{constructor(e){this.client=e}getConversation=e=>this.client.getConversation(e);listConversations=e=>this.client.listConversations(e);updateConversation=e=>this.client.updateConversation(e);deleteConversation=e=>this.client.deleteConversation(e);listParticipants=e=>this.client.listParticipants(e);addParticipant=e=>this.client.addParticipant(e);getParticipant=e=>this.client.getParticipant(e);removeParticipant=e=>this.client.removeParticipant(e);getEvent=e=>this.client.getEvent(e);listEvents=e=>this.client.listEvents(e);createMessage=e=>this.client.createMessage(e);getOrCreateMessage=e=>this.client.getOrCreateMessage(e);getMessage=e=>this.client.getMessage(e);updateMessage=e=>this.client.updateMessage(e);listMessages=e=>this.client.listMessages(e);deleteMessage=e=>this.client.deleteMessage(e);getUser=e=>this.client.getUser(e);listUsers=e=>this.client.listUsers(e);updateUser=e=>this.client.updateUser(e);deleteUser=e=>this.client.deleteUser(e);getState=e=>this.client.getState(e).then(o=>({state:{...o.state,payload:o.state.payload}}));setState=e=>this.client.setState(e).then(o=>({state:{...o.state,payload:o.state.payload}}));getOrSetState=e=>this.client.getOrSetState(e).then(o=>({state:{...o.state,payload:o.state.payload}}));patchState=e=>this.client.patchState(e).then(o=>({state:{...o.state,payload:o.state.payload}}));callAction=e=>this.client.callAction(e);uploadFile=e=>this.client.uploadFile(e);upsertFile=e=>this.client.upsertFile(e);deleteFile=e=>this.client.deleteFile(e);listFiles=e=>this.client.listFiles(e);getFile=e=>this.client.getFile(e);updateFileMetadata=e=>this.client.updateFileMetadata(e);searchFiles=e=>this.client.searchFiles(e);createConversation=e=>this.client.createConversation(e);getOrCreateConversation=e=>this.client.getOrCreateConversation(e);createUser=e=>this.client.createUser(e);getOrCreateUser=e=>this.client.getOrCreateUser(e)};var Re=require("@bpinternal/zui");var xt=Re.z.enum(["event_received","register","unregister","ping","action_triggered"]),Ue=t=>{let e=t[D],o=t[O],a=t[se],s=xt.parse(t[j]);if(!e)throw new Error("Missing bot headers");if(!a)throw new Error("Missing type headers");if(!o)throw new Error("Missing configuration headers");if(!s)throw new Error("Missing operation headers");return{botId:e,operation:s,type:a,configuration:o?JSON.parse(Buffer.from(o,"base64").toString("utf-8")):{}}};var De=t=>async e=>{let o=Ue(e.headers);o.operation!=="ping"&&P.info(`Received ${o.operation} operation for bot ${o.botId} of type ${o.type}`);let a=new R(new ke.Client({botId:o.botId})),s={req:e,ctx:o,client:a,instance:t};switch(o.operation){case"action_triggered":throw new Error(`Operation ${o.operation} not supported yet`);case"event_received":await Et(s);break;case"register":await St(s);break;case"unregister":await Ct(s);break;case"ping":await Bt(s);break;default:throw new Error(`Unknown operation ${o.operation}`)}return{status:200}},Bt=async t=>{},St=async t=>{},Ct=async t=>{},Et=async({ctx:t,req:e,client:o,instance:a})=>{P.debug(`Received event ${t.type}`);let s=y(e),i=s.event;switch(t.type){case"message_created":let l={user:i.payload.user,conversation:i.payload.conversation,message:i.payload.message,states:i.payload.states,event:i};await Promise.all(a.messageHandlers.map(d=>d({client:o,ctx:t,...l})));break;case"state_expired":let g={state:i.payload.state};await Promise.all(a.stateExpiredHandlers.map(d=>d({client:o,ctx:t,...g})));break;default:let p={event:s.event};await Promise.all(a.eventHandlers.map(d=>d({client:o,ctx:t,...p})))}};var z=class{_state={messageHandlers:[],eventHandlers:[],stateExpiredHandlers:[]};props;constructor(e){this.props=e}message=e=>{this._state.messageHandlers.push(e)};event=e=>{this._state.eventHandlers.push(e)};stateExpired=e=>{this._state.stateExpiredHandlers.push(e)};handler=De(this._state);start=e=>F(this.handler,e)};0&&(module.exports={Bot,BotSpecificClient,Integration,IntegrationDefinition,IntegrationSpecificClient,InterfaceDeclaration,RuntimeError,botIdHeader,botUserIdHeader,configurationHeader,integrationIdHeader,interfaces,isApiError,messages,operationHeader,parseBody,serve,studioComponentDefinitions,typeHeader,webhookIdHeader});
1
+ "use strict";var Oe=Object.create;var G=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var He=Object.getOwnPropertyNames;var Ge=Object.getPrototypeOf,Ne=Object.prototype.hasOwnProperty;var C=(t,e)=>{for(var o in e)G(t,o,{get:e[o],enumerable:!0})},H=(t,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of He(e))!Ne.call(t,s)&&s!==o&&G(t,s,{get:()=>e[s],enumerable:!(a=Fe(e,s))||a.enumerable});return t},u=(t,e,o)=>(H(t,e,"default"),o&&H(o,e,"default")),re=(t,e,o)=>(o=t!=null?Oe(Ge(t)):{},H(e||!t||!t.__esModule?G(o,"default",{value:t,enumerable:!0}):o,t)),_e=t=>H(G({},"__esModule",{value:!0}),t);var I={};C(I,{Bot:()=>K,BotSpecificClient:()=>R,Integration:()=>z,IntegrationDefinition:()=>E,IntegrationSpecificClient:()=>w,InterfaceDeclaration:()=>d,RuntimeError:()=>L.RuntimeError,botIdHeader:()=>U,botUserIdHeader:()=>J,configurationHeader:()=>k,integrationIdHeader:()=>Q,interfaces:()=>ae,isApiError:()=>L.isApiError,messages:()=>N,operationHeader:()=>D,parseBody:()=>y,serve:()=>O,studioComponentDefinitions:()=>ce,typeHeader:()=>Y,webhookIdHeader:()=>X});module.exports=_e(I);var N={};C(N,{defaults:()=>q});var r={};C(r,{default:()=>n,studioComponentDefinitions:()=>ce});var c=require("@bpinternal/zui");u(r,require("@bpinternal/zui"));var b=c.z.object({allowDynamicVariable:c.z.boolean().optional(),horizontal:c.z.boolean().optional()}),ce={string:{text:{id:"text",params:b.extend({multiLine:c.z.boolean().optional(),growVertically:c.z.boolean().optional(),suggestions:c.z.array(c.z.string()).optional()})},dropdown:{id:"dropdown",params:b.extend({filterable:c.z.boolean().optional()})},radiogroup:{id:"radiogroup",params:b.extend({})},date:{id:"date",params:b.extend({dateFormat:c.z.string().optional(),minDate:c.z.string().optional(),maxDate:c.z.string().optional(),defaultTimezone:c.z.string().optional(),disableTimezoneSelection:c.z.boolean().optional(),highlightCurrentDay:c.z.boolean().optional(),showShortcutButtons:c.z.boolean().optional(),showOutsideDaysOfMonth:c.z.boolean().optional(),firstDayOfWeek:c.z.number().optional(),canChangeMonth:c.z.boolean().optional(),showWeekNumbers:c.z.boolean().optional()})},time:{id:"time",params:b.extend({useAMPM:c.z.boolean().optional(),timeFormat:c.z.string().optional(),minTime:c.z.string().optional(),maxTime:c.z.string().optional(),showArrowButtons:c.z.boolean().optional(),precision:c.z.enum(["minute","second","millisecond"]).optional()})},richtext:{id:"richtext",params:c.z.object({allowDynamicVariable:c.z.boolean().optional(),resizable:c.z.boolean().optional()})},json:{id:"json",params:b.extend({showPreview:c.z.boolean().optional(),showValidationError:c.z.boolean().optional()})},file:{id:"file",params:b.extend({fileTypes:c.z.array(c.z.enum(["image","audio","video"])).optional(),showUploadedFiles:c.z.boolean().optional()})}},number:{number:{id:"number",params:b.extend({allowNumericCharactersOnly:c.z.boolean().optional(),stepSize:c.z.number().optional()})},slider:{id:"slider",params:c.z.object({horizontal:c.z.boolean().optional(),stepSize:c.z.number().optional()})}},boolean:{switch:{id:"switch",params:b}},array:{options:{id:"options",params:b},strings:{id:"strings",params:b},daterange:{id:"daterange",params:c.z.object({dateFormat:c.z.string().optional(),minDate:c.z.string().optional(),maxDate:c.z.string().optional(),defaultTimezone:c.z.string().optional(),allowSingleDayRange:c.z.boolean().optional(),highlightCurrentDay:c.z.boolean().optional(),showOutsideDaysOfMonth:c.z.boolean().optional(),firstDayOfWeek:c.z.number().optional(),canChangeMonth:c.z.boolean().optional(),showWeekNumbers:c.z.boolean().optional()})}},object:{collapsible:{id:"collapsible",params:c.z.object({defaultOpen:c.z.boolean().optional()})},modal:{id:"modal",params:c.z.object({title:c.z.string().optional(),buttonLabel:c.z.string().optional(),closeButtonLabel:c.z.string().optional()})},popover:{id:"popover",params:c.z.object({buttonLabel:c.z.string().optional()})}},discriminatedUnion:{}},n=c.z;var T=r.z.string().min(1),pe=r.z.object({text:T}),ge=r.z.object({markdown:T}),de=r.z.object({imageUrl:T}),me=r.z.object({audioUrl:T}),ue=r.z.object({videoUrl:T}),he=r.z.object({fileUrl:T,title:T.optional()}),Te=r.z.object({latitude:r.z.number(),longitude:r.z.number(),address:r.z.string().optional(),title:r.z.string().optional()}),fe=r.z.object({title:T,subtitle:T.optional(),imageUrl:T.optional(),actions:r.z.array(r.z.object({action:r.z.enum(["postback","url","say"]),label:T,value:T}))}),le=r.z.object({text:T,options:r.z.array(r.z.object({label:T,value:T}))}),ze=r.z.object({items:r.z.array(fe)}),Ke=r.z.discriminatedUnion("type",[r.z.object({type:r.z.literal("text"),payload:pe}),r.z.object({type:r.z.literal("markdown"),payload:ge}),r.z.object({type:r.z.literal("image"),payload:de}),r.z.object({type:r.z.literal("audio"),payload:me}),r.z.object({type:r.z.literal("video"),payload:ue}),r.z.object({type:r.z.literal("file"),payload:he}),r.z.object({type:r.z.literal("location"),payload:Te})]),Le=r.z.object({items:r.z.array(Ke)}),q={text:{schema:pe},markdown:{schema:ge},image:{schema:de},audio:{schema:me},video:{schema:ue},file:{schema:he},location:{schema:Te},carousel:{schema:ze},card:{schema:fe},dropdown:{schema:le},choice:{schema:le},bloc:{schema:Le}};var ae={};C(ae,{creatable:()=>ft,deletable:()=>It,hitl:()=>at,listable:()=>Tt,llm:()=>gt,readable:()=>bt,schemas:()=>W,speechToText:()=>ut,textToImage:()=>Bt,updatable:()=>yt});var W={};C(W,{speechToText:()=>$});var $={};C($,{OpenAITranscribeAudioOutputSchema:()=>V});var V=n.object({language:n.string().describe("Detected language of the audio"),duration:n.number().describe("Duration of the audio file, in seconds"),segments:n.array(n.object({text:n.string().describe("Text content of the segment."),id:n.number().describe("Unique identifier of the segment"),seek:n.number().describe("Seek offset of the segment"),start:n.number().describe("Start time of the segment in seconds."),end:n.number().describe("End time of the segment in seconds."),tokens:n.array(n.number()).describe("Array of token IDs for the text content."),temperature:n.number().describe("Temperature parameter used for generating the segment."),avg_logprob:n.number().describe("Average logprob of the segment. If the value is lower than -1, consider the logprobs failed."),compression_ratio:n.number().describe("Compression ratio of the segment. If the value is greater than 2.4, consider the compression failed."),no_speech_prob:n.number().describe("Probability of no speech in the segment. If the value is higher than 1.0 and the avg_logprob is below -1, consider this segment silent.")}))});var be=require("@bpinternal/zui");var U="x-bot-id",J="x-bot-user-id",Q="x-integration-id",X="x-webhook-id",k="x-bp-configuration",D="x-bp-operation",Y="x-bp-type";var Ze=be.z.enum(["webhook_received","message_created","action_triggered","register","unregister","ping","create_user","create_conversation"]),ye=t=>{let e=t[U],o=t[J],a=t[Q],s=t[X],i=t[k],l=Ze.parse(t[D]);if(!e)throw new Error("Missing bot headers");if(!o)throw new Error("Missing bot user headers");if(!a)throw new Error("Missing integration headers");if(!s)throw new Error("Missing webhook headers");if(!i)throw new Error("Missing configuration headers");if(!l)throw new Error("Missing operation headers");return{botId:e,botUserId:o,integrationId:a,webhookId:s,operation:l,configuration:i?JSON.parse(Buffer.from(i,"base64").toString("utf-8")):{}}};var qe=t=>Array.from(new Set(t)),x=t=>Object.entries(t);var S=(t,e)=>Object.fromEntries(x(t).map(([o,a])=>[o,e(a,o)])),j=(t,e,o)=>{let a=qe([...Object.keys(t),...Object.keys(e)]),s={};for(let i of a){let l=t[i],g=e[i];l&&g?s[i]=o(l,g):l?s[i]=l:g&&(s[i]=g)}return s};var te=Symbol("schemaName"),Ie=t=>t?S(t,(o,a)=>({...o,[te]:a})):{},ve=t=>t[te]!==void 0,xe=t=>t[te];var E=class{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.icon=e.icon,this.readme=e.readme,this.title=e.title,this.identifier=e.identifier,this.description=e.description,this.configuration=e.configuration,this.events=e.events,this.actions=e.actions,this.channels=e.channels,this.states=e.states,this.user=e.user,this.secrets=e.secrets,this.entities=e.entities}name;version;title;description;icon;readme;configuration;events;actions;channels;states;user;secrets;identifier;entities;interfaces={};clone(e){let o=new E({...this,...e});for(let[a,s]of Object.entries(this.interfaces))o.interfaces[a]=s;return o}extend(e,o){let a=o(Ie(this.entities)),s=x(a).find(([h,B])=>!ve(B));if(s)throw new Error(`Cannot extend interface "${e.name}" with entity "${s[0]}"; the provided schema is not part of the integration's entities.`);let i=S(a,h=>({name:xe(h),schema:h.schema})),{resolved:l,implementStatement:g}=e.resolve({entities:i}),p=this;p.actions=j(p.actions??{},l.actions,this._mergeActions),p.channels=j(p.channels??{},l.channels,this._mergeChannels),p.events=j(p.events??{},l.events,this._mergeEvents);let m=Object.values(i).map(h=>h.name),f=`${e.name}<${m.join(",")}>`;return this.interfaces[f]=g,this}_mergeActions=(e,o)=>({title:o.title??e.title,description:o.description??e.description,input:{schema:e.input.schema.merge(o.input.schema)},output:{schema:e.output.schema.merge(o.output.schema)}});_mergeEvents=(e,o)=>({title:o.title??e.title,description:o.description??e.description,schema:e.schema.merge(o.schema)});_mergeChannels=(e,o)=>{let a=j(e.messages,o.messages,this._mergeMessage);return{title:o.title??e.title,description:o.description??e.description,conversation:o.conversation??e.conversation,message:o.message??e.message,messages:a}};_mergeMessage=(e,o)=>({schema:e.schema.merge(o.schema)})};var d=class{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.entities=e.entities??{},this.events=e.events??{},this.actions=e.actions??{},this.channels=e.channels??{},this.templateName=e.templateName}name;version;entities;events;actions;channels;templateName;resolve(e){let{entities:o}=e,a={name:this.name,version:this.version,entities:S(o,p=>({name:p.name})),actions:{},events:{}},s={},i={},l={};for(let[p,m]of x(this.actions)){let f=this._dereference(m.input.schema,o),h=this._dereference(m.output.schema,o),B=this._rename(o,p);s[B]={input:{schema:f},output:{schema:h}},a.actions[p]={name:B}}for(let[p,m]of x(this.events)){let f=this._dereference(m.schema,o),h=this._rename(o,p);i[h]={schema:f},a.events[p]={name:h}}for(let[p,m]of x(this.channels)){let f={};for(let[h,B]of x(m.messages)){let Z=this._dereference(B.schema,o);f[h]={schema:Z}}l[p]={messages:f}}return{resolved:{actions:s,events:i,channels:l},implementStatement:a}}_dereference(e,o){let a={},s={};for(let[i,l]of x(o))a[i]=l.schema,s[i]=n.ref(i);return e(s).dereference(a)}_rename(e,o){if(!this.templateName)return o;let a=S(e,s=>s.name);return this.templateName(o,a)}};var Be=require("node:http");var M=console;function y(t){if(!t.body)throw new Error("Missing body");return JSON.parse(t.body)}async function O(t,e=8072,o=Je){let a=(0,Be.createServer)(async(s,i)=>{try{let l=await Ve(s);if(l.path==="/health"){i.writeHead(200).end("ok");return}let g=await t(l);i.writeHead(g?.status??200,g?.headers??{}).end(g?.body??"{}")}catch(l){M.error("Error while handling request",{error:l?.message??"Internal error occured"}),i.writeHead(500).end(JSON.stringify({error:l?.message??"Internal error occured"}))}});return a.listen(e,()=>o(e)),a}async function Ve(t){let e=await We(t),o={};for(let s=0;s<t.rawHeaders.length;s+=2){let i=t.rawHeaders[s].toLowerCase(),l=t.rawHeaders[s+1];o[i]=l}let a=new URL(t.url??"",t.headers.host?`http://${t.headers.host}`:"http://botpress.cloud");return{body:e,path:a.pathname,query:$e(a.search,"?"),headers:o,method:t.method?.toUpperCase()??"GET"}}function $e(t,e){return t.indexOf(e)===0?t.slice(e.length):t}async function We(t){return new Promise((e,o)=>{if(t.method!=="POST"&&t.method!=="PUT"&&t.method!=="PATCH")return e(void 0);let a="";t.on("data",s=>a+=s.toString()),t.on("error",s=>o(s)),t.on("end",()=>e(a))})}function Je(t){M.info(`Listening on port ${t}`)}var P=require("@botpress/client");var w=class{constructor(e){this.client=e}createConversation=e=>this.client.createConversation(e);getConversation=e=>this.client.getConversation(e);listConversations=e=>this.client.listConversations(e);getOrCreateConversation=e=>this.client.getOrCreateConversation(e);updateConversation=e=>this.client.updateConversation(e);deleteConversation=e=>this.client.deleteConversation(e);listParticipants=e=>this.client.listParticipants(e);addParticipant=e=>this.client.addParticipant(e);getParticipant=e=>this.client.getParticipant(e);removeParticipant=e=>this.client.removeParticipant(e);createEvent=e=>this.client.createEvent(e);getEvent=e=>this.client.getEvent(e);listEvents=e=>this.client.listEvents(e);createMessage=e=>this.client.createMessage(e);getOrCreateMessage=e=>this.client.getOrCreateMessage(e);getMessage=e=>this.client.getMessage(e);updateMessage=e=>this.client.updateMessage(e);listMessages=e=>this.client.listMessages(e);deleteMessage=e=>this.client.deleteMessage(e);createUser=e=>this.client.createUser(e);getUser=e=>this.client.getUser(e);listUsers=e=>this.client.listUsers(e);getOrCreateUser=e=>this.client.getOrCreateUser(e);updateUser=e=>this.client.updateUser(e);deleteUser=e=>this.client.deleteUser(e);getState=e=>this.client.getState(e);setState=e=>this.client.setState(e);getOrSetState=e=>this.client.getOrSetState(e);patchState=e=>this.client.patchState(e);configureIntegration=e=>this.client.configureIntegration(e);uploadFile=e=>this.client.uploadFile(e);upsertFile=e=>this.client.upsertFile(e);deleteFile=e=>this.client.deleteFile(e);listFiles=e=>this.client.listFiles(e);getFile=e=>this.client.getFile(e);updateFileMetadata=e=>this.client.updateFileMetadata(e)};var ne=re(require("util")),_=t=>{if(process.env.BP_LOG_FORMAT==="json")return JSON.stringify({msg:ne.default.format(...t),visible_to_bot_owner:!0});{let[e,...o]=t;return ne.default.format(`[For Bot Owner] ${e}`,...o)}},Se={forBot:()=>({info:(...t)=>{console.info(_(t))},warn:(...t)=>{console.warn(_(t))},error:(...t)=>{console.error(_(t))},debug:(...t)=>{console.debug(_(t))}})};var Ce=t=>async e=>{let o=ye(e.headers),a=new w(new P.Client({botId:o.botId,integrationId:o.integrationId})),s={ctx:o,req:e,client:a,logger:Se,instance:t};try{let i;switch(o.operation){case"webhook_received":i=await Xe(s);break;case"register":i=await Ye(s);break;case"unregister":i=await et(s);break;case"message_created":i=await ot(s);break;case"action_triggered":i=await st(s);break;case"ping":i=await Qe(s);break;case"create_user":i=await tt(s);break;case"create_conversation":i=await nt(s);break;default:throw new Error(`Unknown operation ${o.operation}`)}return i?{...i,status:i.status??200}:{status:200}}catch(i){if((0,P.isApiError)(i)){let l=new P.RuntimeError(i.message,i);return{status:l.code,body:JSON.stringify(l.toJSON())}}throw i}},Qe=async t=>{},Xe=async({client:t,ctx:e,req:o,logger:a,instance:s})=>{let{req:i}=y(o);return s.webhook({client:t,ctx:e,req:i,logger:a})},Ye=async({client:t,ctx:e,req:o,logger:a,instance:s})=>{if(!s.register)return;let{webhookUrl:i}=y(o);await s.register({client:t,ctx:e,webhookUrl:i,logger:a})},et=async({client:t,ctx:e,req:o,logger:a,instance:s})=>{if(!s.unregister)return;let{webhookUrl:i}=y(o);await s.unregister({ctx:e,webhookUrl:i,client:t,logger:a})},tt=async({client:t,ctx:e,req:o,logger:a,instance:s})=>{if(!s.createUser)return;let{tags:i}=y(o);return await s.createUser({ctx:e,client:t,tags:i,logger:a})},nt=async({client:t,ctx:e,req:o,logger:a,instance:s})=>{if(!s.createConversation)return;let{channel:i,tags:l}=y(o);return await s.createConversation({ctx:e,client:t,channel:i,tags:l,logger:a})},ot=async({ctx:t,req:e,client:o,logger:a,instance:s})=>{let{conversation:i,user:l,type:g,payload:p,message:m}=y(e),f=s.channels[i.channel];if(!f)throw new Error(`Channel ${i.channel} not found`);let h=f.messages[g];if(!h)throw new Error(`Message of type ${g} not found in channel ${i.channel}`);await h({ctx:t,conversation:i,message:m,user:l,type:g,client:o,payload:p,ack:async({tags:Z})=>{await o.updateMessage({id:m.id,tags:Z})},logger:a})},st=async({req:t,ctx:e,client:o,logger:a,instance:s})=>{let{input:i,type:l}=y(t);if(!l)throw new Error("Missing action type");let g=s.actions[l];if(!g)throw new Error(`Action ${l} not found`);let p=await g({ctx:e,input:i,client:o,type:l,logger:a});return{body:JSON.stringify({output:p})}};var z=class{props;actions;channels;register;unregister;createUser;createConversation;webhook;constructor(e){this.props=e,this.actions=e.actions,this.channels=e.channels,this.register=e.register,this.unregister=e.unregister,this.createUser=e.createUser,this.createConversation=e.createConversation,this.webhook=e.handler}handler=Ce(this);start=e=>O(this.handler,e)};var it=t=>({...t,schema:()=>t.schema.extend({userId:n.string().optional().describe("Allows sending a message pretending to be a certain user")})}),at=new d({name:"hitl",version:"0.2.0",entities:{},events:{hitlAssigned:{schema:()=>n.object({conversationId:n.string(),userId:n.string()})},hitlStopped:{schema:()=>n.object({conversationId:n.string()})}},actions:{createUser:{input:{schema:()=>n.object({name:n.string().optional(),pictureUrl:n.string().optional(),email:n.string().optional()})},output:{schema:()=>n.object({userId:n.string()})}},startHitl:{input:{schema:()=>n.object({userId:n.string(),title:n.string(),description:n.string().optional()})},output:{schema:()=>n.object({conversationId:n.string()})}},stopHitl:{input:{schema:()=>n.object({conversationId:n.string(),reason:n.enum(["timeout","cancel"]).optional()})},output:{schema:()=>n.object({})}}},channels:{hitl:{messages:{text:it(q.text)}}}});var rt=n.object({id:n.string(),type:n.enum(["function"]),function:n.object({name:n.string(),arguments:n.record(n.any()).nullable().describe("Some LLMs may generate invalid JSON for a tool call, so this will be `null` when it happens.")})}),ct=n.object({type:n.enum(["auto","specific","any","none",""]).optional(),functionName:n.string().optional().describe('Required if `type` is "specific"')}),Ee=n.object({role:n.enum(["user","assistant"]),type:n.enum(["text","tool_calls","tool_result","multipart"]).default("text"),toolCalls:n.array(rt).optional().describe('Required if `type` is "tool_calls"'),toolResultCallId:n.string().optional().describe('Required if `type` is "tool_result"'),content:n.string().or(n.array(n.object({type:n.enum(["text","image"]),mimeType:n.string().optional().describe("Indicates the MIME type of the content. If not provided it will be detected from the content-type header of the provided URL."),text:n.string().optional().describe('Required if part type is "text" '),url:n.string().optional().describe('Required if part type is "image"')}))).optional().nullable().describe('Required unless `type` is "tool_call". If `type` is "multipart", this field must be an array of content objects. If `type` is "tool_result" then this field should be the result of the tool call (a plain string or a JSON-encoded array or object). If `type` is "tool_call" then the `toolCalls` field should be used instead.')}),oe=n.object({id:n.string()}),lt=oe.extend({name:n.string(),input:n.object({maxTokens:n.number().int(),costPer1MTokens:n.number().describe("Cost per 1 million tokens, in U.S. dollars")}),output:n.object({maxTokens:n.number().int(),costPer1MTokens:n.number().describe("Cost per 1 million tokens, in U.S. dollars")})}),Me=t=>n.object({model:t.describe("Model to use for content generation").optional(),systemPrompt:n.string().optional().describe("Optional system prompt to guide the model"),messages:n.array(Ee).describe("Array of messages for the model to process"),responseFormat:n.enum(["text","json_object"]).optional().describe('Response format expected from the model. If "json_object" is chosen, you must instruct the model to generate JSON either via the system prompt or a user message.'),maxTokens:n.number().optional().describe("Maximum number of tokens allowed in the generated response"),temperature:n.number().min(0).max(2).displayAs({id:"slider",params:{stepSize:.01,horizontal:!0}}).default(1).describe("Sampling temperature for the model. Higher values result in more random outputs."),topP:n.number().min(0).max(1).default(1).displayAs({id:"slider",params:{stepSize:.01,horizontal:!0}}).describe("Top-p sampling parameter. Limits sampling to the smallest set of tokens with a cumulative probability above the threshold."),stopSequences:n.array(n.string()).max(4).optional().describe("Sequences where the model should stop generating further tokens."),tools:n.array(n.object({type:n.literal("function"),function:n.object({name:n.string().describe("Function name"),description:n.string().optional(),argumentsSchema:n.object({}).passthrough().optional().describe("JSON schema of the function arguments")})})).optional(),toolChoice:ct.optional(),userId:n.string().optional(),debug:n.boolean().optional().describe("Set to `true` to output debug information to the bot logs")}),kn=Me(oe),pt=n.object({id:n.string().describe("Response ID from LLM provider"),provider:n.string().describe("LLM provider name"),model:n.string().describe("Model name"),choices:n.array(Ee.omit({role:!0}).extend({role:n.literal("assistant"),index:n.number().int(),stopReason:n.enum(["stop","max_tokens","tool_calls","content_filter","other"])})),usage:n.object({inputTokens:n.number().int().describe("Number of input tokens used by the model"),inputCost:n.number().describe("Cost of the input tokens received by the model, in U.S. dollars"),outputTokens:n.number().int().describe("Number of output tokens used by the model"),outputCost:n.number().describe("Cost of the output tokens generated by the model, in U.S. dollars")})}),gt=new d({name:"llm",version:"3.1.0",entities:{modelRef:{schema:oe}},events:{},actions:{generateContent:{input:{schema:({modelRef:t})=>Me(t)},output:{schema:()=>pt}},listLanguageModels:{input:{schema:()=>n.object({})},output:{schema:({modelRef:t})=>n.object({models:n.array(n.intersection(lt,t))})}}}});var se=n.object({id:n.string()}),dt=se.extend({name:n.string(),costPerMinute:n.number().describe("Cost per minute of speech transcription, in U.S. dollars")}),we=t=>n.object({model:t.optional().describe("Model to use for speech-to-text transcription (optional)"),fileUrl:n.string().url().describe("URL of the audio file to transcribe. The URL should return a content-type header in order to detect the audio format. Supported audio formats supported are: mp3, mp4, mpeg, mpga, m4a, wav, webm"),language:n.string().optional().describe("The language of the input audio (optional). Supplying the input language in ISO-639-1 format will improve accuracy and latency."),prompt:n.string().optional().describe("An optional text to guide the model's style or continue a previous audio segment. The prompt should match the audio language."),temperature:n.number().default(0).optional().describe("The sampling temperature (optional), between 0 and 1. Defaults to 0 (automatic). Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.")}),Hn=we(se),mt=V.extend({model:n.string().describe("Model name used"),cost:n.number().describe("Total cost of this transcription, in U.S. dollars")}),ut=new d({name:"speechToText",version:"1.0.0",entities:{speechToTextModelRef:{schema:se}},actions:{transcribeAudio:{input:{schema:({speechToTextModelRef:t})=>we(t)},output:{schema:()=>mt}},listSpeechToTextModels:{input:{schema:()=>n.object({})},output:{schema:({speechToTextModelRef:t})=>n.object({models:n.array(n.intersection(dt,t))})}}}});var v=n.object({id:n.string()}),A=t=>n.intersection(t,v),ht=t=>t[0].toUpperCase()+t.slice(1),F=(...t)=>{let[e,...o]=t.filter(a=>a.length>0).map(a=>a.toLowerCase());return e?[e,...o.map(ht)].join(""):""},Pe=n.string().optional(),Tt=new d({name:"listable",version:"0.0.1",entities:{item:{schema:v}},events:{},actions:{list:{input:{schema:()=>n.object({nextToken:Pe})},output:{schema:t=>n.object({items:n.array(A(t.item)),meta:n.object({nextToken:Pe})})}}},templateName:(t,e)=>F(e.item,t)}),ft=new d({name:"creatable",version:"0.0.1",entities:{item:{schema:v}},events:{created:{schema:t=>n.object({item:A(t.item)})}},actions:{create:{input:{schema:t=>n.object({item:t.item})},output:{schema:t=>n.object({item:A(t.item)})}}},templateName:(t,e)=>F(e.item,t)}),bt=new d({name:"readable",version:"0.0.1",entities:{item:{schema:v}},events:{},actions:{read:{input:{schema:()=>v},output:{schema:t=>n.object({item:A(t.item)})}}},templateName:(t,e)=>F(e.item,t)}),yt=new d({name:"updatable",version:"0.0.1",entities:{item:{schema:v}},events:{updated:{schema:t=>n.object({item:A(t.item)})}},actions:{update:{input:{schema:t=>v.extend({item:t.item})},output:{schema:t=>n.object({item:A(t.item)})}}},templateName:(t,e)=>F(e.item,t)}),It=new d({name:"deletable",version:"0.0.1",entities:{item:{schema:v}},events:{deleted:{schema:()=>v}},actions:{delete:{input:{schema:()=>v},output:{schema:()=>n.object({})}}},templateName:(t,e)=>F(e.item,t)});var ie=n.object({id:n.string()}),vt=ie.extend({name:n.string(),costPerImage:n.number().describe("Cost per image generation, in U.S. dollars"),sizes:n.array(n.string()).describe("Available image sizes"),defaultSize:n.string().describe("Default image size generated by model")}),Ae=n.object({}).describe("Model-specific parameters for image generation"),Re=(t,e)=>n.object({model:t.optional().describe("Model to use for image generation"),prompt:n.string(),size:n.string().optional(),params:e.optional()}),Zn=Re(ie,Ae),xt=n.object({model:n.string().describe("Model name used"),imageUrl:n.string().describe("Temporary URL of generated image"),cost:n.number().describe("Cost of the image generation, in U.S. dollars")}),Bt=new d({name:"textToImage",version:"1.0.0",entities:{imageModelRef:{schema:ie},imageGenerationParams:{schema:Ae}},actions:{generateImage:{input:{schema:({imageModelRef:t,imageGenerationParams:e})=>Re(t,e)},output:{schema:()=>xt}},listImageModels:{input:{schema:()=>n.object({})},output:{schema:({imageModelRef:t})=>n.object({models:n.array(n.intersection(vt,t))})}}}});u(I,r,module.exports);var L=require("@botpress/client");var De=re(require("@botpress/client"));var R=class{constructor(e){this.client=e}getConversation=e=>this.client.getConversation(e);listConversations=e=>this.client.listConversations(e);updateConversation=e=>this.client.updateConversation(e);deleteConversation=e=>this.client.deleteConversation(e);listParticipants=e=>this.client.listParticipants(e);addParticipant=e=>this.client.addParticipant(e);getParticipant=e=>this.client.getParticipant(e);removeParticipant=e=>this.client.removeParticipant(e);getEvent=e=>this.client.getEvent(e);listEvents=e=>this.client.listEvents(e);createMessage=e=>this.client.createMessage(e);getOrCreateMessage=e=>this.client.getOrCreateMessage(e);getMessage=e=>this.client.getMessage(e);updateMessage=e=>this.client.updateMessage(e);listMessages=e=>this.client.listMessages(e);deleteMessage=e=>this.client.deleteMessage(e);getUser=e=>this.client.getUser(e);listUsers=e=>this.client.listUsers(e);updateUser=e=>this.client.updateUser(e);deleteUser=e=>this.client.deleteUser(e);getState=e=>this.client.getState(e).then(o=>({state:{...o.state,payload:o.state.payload}}));setState=e=>this.client.setState(e).then(o=>({state:{...o.state,payload:o.state.payload}}));getOrSetState=e=>this.client.getOrSetState(e).then(o=>({state:{...o.state,payload:o.state.payload}}));patchState=e=>this.client.patchState(e).then(o=>({state:{...o.state,payload:o.state.payload}}));callAction=e=>this.client.callAction(e);uploadFile=e=>this.client.uploadFile(e);upsertFile=e=>this.client.upsertFile(e);deleteFile=e=>this.client.deleteFile(e);listFiles=e=>this.client.listFiles(e);getFile=e=>this.client.getFile(e);updateFileMetadata=e=>this.client.updateFileMetadata(e);searchFiles=e=>this.client.searchFiles(e);createConversation=e=>this.client.createConversation(e);getOrCreateConversation=e=>this.client.getOrCreateConversation(e);createUser=e=>this.client.createUser(e);getOrCreateUser=e=>this.client.getOrCreateUser(e)};var Ue=require("@bpinternal/zui");var St=Ue.z.enum(["event_received","register","unregister","ping","action_triggered"]),ke=t=>{let e=t[U],o=t[k],a=t[Y],s=St.parse(t[D]);if(!e)throw new Error("Missing bot headers");if(!a)throw new Error("Missing type headers");if(!o)throw new Error("Missing configuration headers");if(!s)throw new Error("Missing operation headers");return{botId:e,operation:s,type:a,configuration:o?JSON.parse(Buffer.from(o,"base64").toString("utf-8")):{}}};var je=t=>async e=>{let o=ke(e.headers);o.operation!=="ping"&&M.info(`Received ${o.operation} operation for bot ${o.botId} of type ${o.type}`);let a=new R(new De.Client({botId:o.botId})),s={req:e,ctx:o,client:a,instance:t};switch(o.operation){case"action_triggered":throw new Error(`Operation ${o.operation} not supported yet`);case"event_received":await wt(s);break;case"register":await Et(s);break;case"unregister":await Mt(s);break;case"ping":await Ct(s);break;default:throw new Error(`Unknown operation ${o.operation}`)}return{status:200}},Ct=async t=>{},Et=async t=>{},Mt=async t=>{},wt=async({ctx:t,req:e,client:o,instance:a})=>{M.debug(`Received event ${t.type}`);let s=y(e),i=s.event;switch(t.type){case"message_created":let l={user:i.payload.user,conversation:i.payload.conversation,message:i.payload.message,states:i.payload.states,event:i};await Promise.all(a.messageHandlers.map(m=>m({client:o,ctx:t,...l})));break;case"state_expired":let g={state:i.payload.state};await Promise.all(a.stateExpiredHandlers.map(m=>m({client:o,ctx:t,...g})));break;default:let p={event:s.event};await Promise.all(a.eventHandlers.map(m=>m({client:o,ctx:t,...p})))}};var K=class{_state={messageHandlers:[],eventHandlers:[],stateExpiredHandlers:[]};props;constructor(e){this.props=e}message=e=>{this._state.messageHandlers.push(e)};event=e=>{this._state.eventHandlers.push(e)};stateExpired=e=>{this._state.stateExpiredHandlers.push(e)};handler=je(this._state);start=e=>O(this.handler,e)};0&&(module.exports={Bot,BotSpecificClient,Integration,IntegrationDefinition,IntegrationSpecificClient,InterfaceDeclaration,RuntimeError,botIdHeader,botUserIdHeader,configurationHeader,integrationIdHeader,interfaces,isApiError,messages,operationHeader,parseBody,serve,studioComponentDefinitions,typeHeader,webhookIdHeader});
2
2
  //# sourceMappingURL=index.js.map