@botpress/sdk 0.11.8 → 1.0.1
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/.turbo/turbo-build.log +3 -3
- package/dist/bot/client/routes.d.ts +1 -1
- package/dist/bot/client/types.d.ts +1 -1
- package/dist/bot/definition.d.ts +77 -0
- package/dist/bot/implementation.d.ts +9 -68
- package/dist/bot/index.d.ts +1 -1
- package/dist/bot/server.d.ts +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +4 -4
- package/dist/integration/client/routes.d.ts +1 -1
- package/dist/integration/client/types.d.ts +1 -1
- package/dist/integration/context.d.ts +1 -1
- package/dist/integration/definition/branded-schema.d.ts +3 -1
- package/dist/integration/definition/generic.d.ts +1 -1
- package/dist/integration/definition/integration-definition.d.ts +17 -11
- package/dist/integration/definition/interface-declaration.d.ts +18 -27
- package/dist/integration/definition/types.d.ts +22 -11
- package/dist/integration/server.d.ts +1 -1
- package/dist/package.d.ts +41 -0
- package/dist/schema.d.ts +2 -3
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/record-utils.d.ts +2 -0
- package/dist/{type-utils.d.ts → utils/type-utils.d.ts} +6 -16
- package/package.json +3 -4
- package/dist/bot/integration-instance.d.ts +0 -9
- package/dist/interfaces/hitl.d.ts +0 -67
- package/dist/interfaces/index.d.ts +0 -7
- package/dist/interfaces/llm.d.ts +0 -856
- package/dist/interfaces/schemas/index.d.ts +0 -1
- package/dist/interfaces/schemas/speech-to-text.d.ts +0 -68
- package/dist/interfaces/speech-to-text.d.ts +0 -168
- package/dist/interfaces/sync.d.ts +0 -125
- package/dist/interfaces/text-to-image.d.ts +0 -114
- package/dist/interfaces/typing-indicator.d.ts +0 -26
- package/dist/utils.d.ts +0 -5
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
|
|
2
|
-
> @botpress/sdk@0.
|
|
2
|
+
> @botpress/sdk@1.0.1 build /home/runner/work/botpress/botpress/packages/sdk
|
|
3
3
|
> pnpm build:type && pnpm build:node
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @botpress/sdk@0.
|
|
6
|
+
> @botpress/sdk@1.0.1 build:type /home/runner/work/botpress/botpress/packages/sdk
|
|
7
7
|
> tsc --emitDeclarationOnly --declaration
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
> @botpress/sdk@0.
|
|
10
|
+
> @botpress/sdk@1.0.1 build:node /home/runner/work/botpress/botpress/packages/sdk
|
|
11
11
|
> ts-node -T build.ts
|
|
12
12
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Client } from '@botpress/client';
|
|
2
|
-
import { Cast, Merge } from '../../type-utils';
|
|
2
|
+
import { Cast, Merge } from '../../utils/type-utils';
|
|
3
3
|
import { BaseBot } from '../generic';
|
|
4
4
|
import * as types from './types';
|
|
5
5
|
type Arg<F extends (...args: any[]) => any> = Parameters<F>[number];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as client from '@botpress/client';
|
|
2
|
-
import { Join, UnionToIntersection, Merge, ValueOf, Split, Cast } from '../../type-utils';
|
|
2
|
+
import { Join, UnionToIntersection, Merge, ValueOf, Split, Cast } from '../../utils/type-utils';
|
|
3
3
|
import { BaseBot } from '../generic';
|
|
4
4
|
/**
|
|
5
5
|
* 0. Definitions
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { IntegrationPackage } from '../package';
|
|
2
|
+
import { SchemaDefinition } from '../schema';
|
|
3
|
+
import { ValueOf } from '../utils/type-utils';
|
|
4
|
+
import z, { AnyZodObject } from '../zui';
|
|
5
|
+
type BaseStates = Record<string, AnyZodObject>;
|
|
6
|
+
type BaseEvents = Record<string, AnyZodObject>;
|
|
7
|
+
export type TagDefinition = {
|
|
8
|
+
title?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
};
|
|
11
|
+
export type StateType = 'conversation' | 'user' | 'bot';
|
|
12
|
+
export type StateDefinition<TState extends BaseStates[string] = BaseStates[string]> = SchemaDefinition<TState> & {
|
|
13
|
+
type: StateType;
|
|
14
|
+
expiry?: number;
|
|
15
|
+
};
|
|
16
|
+
export type RecurringEventDefinition<TEvents extends BaseEvents = BaseEvents> = {
|
|
17
|
+
[K in keyof TEvents]: {
|
|
18
|
+
type: K;
|
|
19
|
+
payload: z.infer<TEvents[K]>;
|
|
20
|
+
schedule: {
|
|
21
|
+
cron: string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
}[keyof TEvents];
|
|
25
|
+
export type EventDefinition<TEvent extends BaseEvents[string] = BaseEvents[string]> = SchemaDefinition<TEvent>;
|
|
26
|
+
export type ConfigurationDefinition = SchemaDefinition;
|
|
27
|
+
export type UserDefinition = {
|
|
28
|
+
tags?: Record<string, TagDefinition>;
|
|
29
|
+
};
|
|
30
|
+
export type ConversationDefinition = {
|
|
31
|
+
tags?: Record<string, TagDefinition>;
|
|
32
|
+
};
|
|
33
|
+
export type MessageDefinition = {
|
|
34
|
+
tags?: Record<string, TagDefinition>;
|
|
35
|
+
};
|
|
36
|
+
export type IntegrationConfigInstance<I extends IntegrationPackage = IntegrationPackage> = {
|
|
37
|
+
enabled: boolean;
|
|
38
|
+
} & ({
|
|
39
|
+
configurationType?: null;
|
|
40
|
+
configuration: z.infer<NonNullable<I['definition']['configuration']>['schema']>;
|
|
41
|
+
} | ValueOf<{
|
|
42
|
+
[K in keyof NonNullable<I['definition']['configurations']>]: {
|
|
43
|
+
configurationType: K;
|
|
44
|
+
configuration: z.infer<NonNullable<I['definition']['configurations']>[K]['schema']>;
|
|
45
|
+
};
|
|
46
|
+
}>);
|
|
47
|
+
export type IntegrationInstance = IntegrationPackage & IntegrationConfigInstance;
|
|
48
|
+
export type BotDefinitionProps<TStates extends BaseStates = BaseStates, TEvents extends BaseEvents = BaseEvents> = {
|
|
49
|
+
integrations?: {
|
|
50
|
+
[K: string]: IntegrationInstance;
|
|
51
|
+
};
|
|
52
|
+
user?: UserDefinition;
|
|
53
|
+
conversation?: ConversationDefinition;
|
|
54
|
+
message?: MessageDefinition;
|
|
55
|
+
states?: {
|
|
56
|
+
[K in keyof TStates]: StateDefinition<TStates[K]>;
|
|
57
|
+
};
|
|
58
|
+
configuration?: ConfigurationDefinition;
|
|
59
|
+
events?: {
|
|
60
|
+
[K in keyof TEvents]: EventDefinition<TEvents[K]>;
|
|
61
|
+
};
|
|
62
|
+
recurringEvents?: Record<string, RecurringEventDefinition<TEvents>>;
|
|
63
|
+
};
|
|
64
|
+
export declare class BotDefinition<TStates extends BaseStates = BaseStates, TEvents extends BaseEvents = BaseEvents> {
|
|
65
|
+
readonly props: BotDefinitionProps<TStates, TEvents>;
|
|
66
|
+
readonly integrations: this['props']['integrations'];
|
|
67
|
+
readonly user: this['props']['user'];
|
|
68
|
+
readonly conversation: this['props']['conversation'];
|
|
69
|
+
readonly message: this['props']['message'];
|
|
70
|
+
readonly states: this['props']['states'];
|
|
71
|
+
readonly configuration: this['props']['configuration'];
|
|
72
|
+
readonly events: this['props']['events'];
|
|
73
|
+
readonly recurringEvents: this['props']['recurringEvents'];
|
|
74
|
+
constructor(props: BotDefinitionProps<TStates, TEvents>);
|
|
75
|
+
add<I extends IntegrationPackage>(integrationPkg: I, config: IntegrationConfigInstance<I>): this;
|
|
76
|
+
}
|
|
77
|
+
export {};
|
|
@@ -1,73 +1,14 @@
|
|
|
1
|
-
import { z } from '@bpinternal/zui';
|
|
2
1
|
import type { Server } from 'node:http';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
type BaseStates = Record<string, AnyZodObject>;
|
|
9
|
-
type BaseEvents = Record<string, AnyZodObject>;
|
|
10
|
-
type TagDefinition = {
|
|
11
|
-
title?: string;
|
|
12
|
-
description?: string;
|
|
13
|
-
};
|
|
14
|
-
type StateDefinition<TState extends BaseStates[string]> = SchemaDefinition<TState> & {
|
|
15
|
-
type: StateType;
|
|
16
|
-
expiry?: number;
|
|
17
|
-
};
|
|
18
|
-
type RecurringEventDefinition<TEvents extends BaseEvents> = {
|
|
19
|
-
[K in keyof TEvents]: {
|
|
20
|
-
type: K;
|
|
21
|
-
payload: z.infer<TEvents[K]>;
|
|
22
|
-
schedule: {
|
|
23
|
-
cron: string;
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
}[keyof TEvents];
|
|
27
|
-
type EventDefinition<TEvent extends BaseEvents[string]> = SchemaDefinition<TEvent>;
|
|
28
|
-
type ConfigurationDefinition = SchemaDefinition;
|
|
29
|
-
type UserDefinition = {
|
|
30
|
-
tags?: Record<string, TagDefinition>;
|
|
31
|
-
};
|
|
32
|
-
type ConversationDefinition = {
|
|
33
|
-
tags?: Record<string, TagDefinition>;
|
|
34
|
-
};
|
|
35
|
-
type MessageDefinition = {
|
|
36
|
-
tags?: Record<string, TagDefinition>;
|
|
37
|
-
};
|
|
38
|
-
export type BotProps<TIntegrations extends BaseIntegrations = BaseIntegrations, TStates extends BaseStates = BaseStates, TEvents extends BaseEvents = BaseEvents> = {
|
|
39
|
-
integrations?: {
|
|
40
|
-
[K in keyof TIntegrations]?: IntegrationInstance<TIntegrations[K]>;
|
|
41
|
-
};
|
|
42
|
-
user?: UserDefinition;
|
|
43
|
-
conversation?: ConversationDefinition;
|
|
44
|
-
message?: MessageDefinition;
|
|
45
|
-
states?: {
|
|
46
|
-
[K in keyof TStates]: StateDefinition<TStates[K]>;
|
|
47
|
-
};
|
|
48
|
-
configuration?: ConfigurationDefinition;
|
|
49
|
-
events?: {
|
|
50
|
-
[K in keyof TEvents]: EventDefinition<TEvents[K]>;
|
|
51
|
-
};
|
|
52
|
-
recurringEvents?: Record<string, RecurringEventDefinition<TEvents>>;
|
|
53
|
-
};
|
|
54
|
-
type BotFrom<TIntegrations extends BaseIntegrations, TStates extends BaseStates, TEvents extends BaseEvents> = {
|
|
55
|
-
integrations: TIntegrations;
|
|
56
|
-
states: {
|
|
57
|
-
[K in keyof TStates]: z.infer<TStates[K]>;
|
|
58
|
-
};
|
|
59
|
-
events: {
|
|
60
|
-
[K in keyof TEvents]: z.infer<TEvents[K]>;
|
|
61
|
-
};
|
|
62
|
-
};
|
|
63
|
-
export declare class Bot<TIntegrations extends BaseIntegrations = BaseIntegrations, TStates extends BaseStates = BaseStates, TEvents extends BaseEvents = BaseEvents> {
|
|
2
|
+
import { BaseBot } from './generic';
|
|
3
|
+
import { MessageHandler, EventHandler, StateExpiredHandler } from './server';
|
|
4
|
+
export type BotImplementationProps<_TBot extends BaseBot = BaseBot> = {};
|
|
5
|
+
export declare class BotImplementation<TBot extends BaseBot = BaseBot> {
|
|
6
|
+
readonly props: BotImplementationProps<TBot>;
|
|
64
7
|
private _state;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
readonly
|
|
68
|
-
readonly
|
|
69
|
-
readonly stateExpired: (handler: StateExpiredHandler<BotFrom<TIntegrations, TStates, TEvents>>) => void;
|
|
8
|
+
constructor(props: BotImplementationProps<TBot>);
|
|
9
|
+
readonly message: (handler: MessageHandler<TBot>) => void;
|
|
10
|
+
readonly event: (handler: EventHandler<TBot>) => void;
|
|
11
|
+
readonly stateExpired: (handler: StateExpiredHandler<TBot>) => void;
|
|
70
12
|
readonly handler: (req: import("../serve").Request) => Promise<void | import("../serve").Response>;
|
|
71
13
|
readonly start: (port?: number) => Promise<Server>;
|
|
72
14
|
}
|
|
73
|
-
export {};
|
package/dist/bot/index.d.ts
CHANGED
package/dist/bot/server.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { Request, Response } from '../serve';
|
|
|
3
3
|
import { BotSpecificClient } from './client';
|
|
4
4
|
import * as types from './client/types';
|
|
5
5
|
import { BotContext } from './context';
|
|
6
|
+
import { StateType } from './definition';
|
|
6
7
|
import { BaseBot } from './generic';
|
|
7
8
|
type CommonArgs<TBot extends BaseBot> = {
|
|
8
9
|
ctx: BotContext;
|
|
@@ -27,7 +28,6 @@ type StateExpiredPayload = {
|
|
|
27
28
|
state: client.State;
|
|
28
29
|
};
|
|
29
30
|
type StateExpiredArgs<TBot extends BaseBot> = CommonArgs<TBot> & StateExpiredPayload;
|
|
30
|
-
export type StateType = 'conversation' | 'user' | 'bot';
|
|
31
31
|
export type MessageHandler<TBot extends BaseBot> = (args: MessageArgs<TBot>) => Promise<void>;
|
|
32
32
|
export type EventHandler<TBot extends BaseBot> = (args: EventArgs<TBot>) => Promise<void>;
|
|
33
33
|
export type StateExpiredHandler<TBot extends BaseBot> = (args: StateExpiredArgs<TBot>) => Promise<void>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export * as messages from './message';
|
|
2
|
-
export * as interfaces from './interfaces';
|
|
3
2
|
export * from './const';
|
|
4
3
|
export * from './serve';
|
|
5
4
|
export * from './zui';
|
|
6
|
-
export { isApiError, RuntimeError } from '@botpress/client';
|
|
5
|
+
export { isApiError, RuntimeError, } from '@botpress/client';
|
|
7
6
|
export { IntegrationDefinition, IntegrationDefinitionProps, IntegrationImplementation as Integration, IntegrationImplementationProps as IntegrationProps, IntegrationContext, IntegrationLogger, IntegrationSpecificClient, InterfaceDeclaration, InterfaceDeclarationProps, TagDefinition, ConfigurationDefinition, AdditionalConfigurationDefinition, EventDefinition, ChannelDefinition, MessageDefinition, ActionDefinition, StateDefinition, UserDefinition, SecretDefinition, EntityDefinition, } from './integration';
|
|
8
|
-
export { Bot, BotProps,
|
|
7
|
+
export { BotDefinition, BotDefinitionProps, BotImplementation as Bot, BotImplementationProps as BotProps, BotSpecificClient, TagDefinition as BotTagDefinition, StateType as BotStateType, StateDefinition as BotStateDefinition, RecurringEventDefinition as BotRecurringEventDefinition, EventDefinition as BotEventDefinition, ConfigurationDefinition as BotConfigurationDefinition, UserDefinition as BotUserDefinition, ConversationDefinition as BotConversationDefinition, MessageDefinition as BotMessageDefinition, } from './bot';
|
|
8
|
+
export { IntegrationPackage, InterfacePackage, } from './package';
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var Oe=Object.create;var O=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var He=Object.getOwnPropertyNames;var Ge=Object.getPrototypeOf,Ne=Object.prototype.hasOwnProperty;var S=(n,e)=>{for(var o in e)O(n,o,{get:e[o],enumerable:!0})},j=(n,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of He(e))!Ne.call(n,i)&&i!==o&&O(n,i,{get:()=>e[i],enumerable:!(s=Fe(e,i))||s.enumerable});return n},h=(n,e,o)=>(j(n,e,"default"),o&&j(o,e,"default")),ce=(n,e,o)=>(o=n!=null?Oe(Ge(n)):{},j(e||!n||!n.__esModule?O(o,"default",{value:n,enumerable:!0}):o,n)),Ke=n=>j(O({},"__esModule",{value:!0}),n);var b={};S(b,{Bot:()=>L,BotSpecificClient:()=>A,Integration:()=>z,IntegrationDefinition:()=>C,IntegrationSpecificClient:()=>M,InterfaceDeclaration:()=>d,RuntimeError:()=>Z.RuntimeError,botIdHeader:()=>w,botUserIdHeader:()=>W,configurationHeader:()=>R,configurationTypeHeader:()=>Y,integrationIdHeader:()=>Q,interfaces:()=>ae,isApiError:()=>Z.isApiError,messages:()=>H,operationHeader:()=>_,parseBody:()=>f,serve:()=>U,typeHeader:()=>ee,webhookIdHeader:()=>X});module.exports=Ke(b);var H={};S(H,{defaults:()=>F});var r={};S(r,{default:()=>t});var le=require("@bpinternal/zui");h(r,require("@bpinternal/zui"));var t=le.z;var u=r.z.string().min(1),ge=r.z.object({text:u}),de=r.z.object({markdown:u}),me=r.z.object({imageUrl:u}),ue=r.z.object({audioUrl:u}),he=r.z.object({videoUrl:u}),Te=r.z.object({fileUrl:u,title:u.optional()}),fe=r.z.object({latitude:r.z.number(),longitude:r.z.number(),address:r.z.string().optional(),title:r.z.string().optional()}),be=r.z.object({title:u,subtitle:u.optional(),imageUrl:u.optional(),actions:r.z.array(r.z.object({action:r.z.enum(["postback","url","say"]),label:u,value:u}))}),pe=r.z.object({text:u,options:r.z.array(r.z.object({label:u,value:u}))}),ze=r.z.object({items:r.z.array(be)}),Le=r.z.discriminatedUnion("type",[r.z.object({type:r.z.literal("text"),payload:ge}),r.z.object({type:r.z.literal("markdown"),payload:de}),r.z.object({type:r.z.literal("image"),payload:me}),r.z.object({type:r.z.literal("audio"),payload:ue}),r.z.object({type:r.z.literal("video"),payload:he}),r.z.object({type:r.z.literal("file"),payload:Te}),r.z.object({type:r.z.literal("location"),payload:fe})]),Ze=r.z.object({items:r.z.array(Le)}),F={text:{schema:ge},markdown:{schema:de},image:{schema:me},audio:{schema:ue},video:{schema:he},file:{schema:Te},location:{schema:fe},carousel:{schema:ze},card:{schema:be},dropdown:{schema:pe},choice:{schema:pe},bloc:{schema:Ze}};var ae={};S(ae,{creatable:()=>vt,deletable:()=>St,hitl:()=>pt,listable:()=>It,llm:()=>ht,readable:()=>xt,schemas:()=>J,speechToText:()=>bt,textToImage:()=>Mt,typingIndicator:()=>Pt,updatable:()=>Bt});var J={};S(J,{speechToText:()=>$});var $={};S($,{OpenAITranscribeAudioOutputSchema:()=>V});var V=t.object({language:t.string().describe("Detected language of the audio"),duration:t.number().describe("Duration of the audio file, in seconds"),segments:t.array(t.object({text:t.string().describe("Text content of the segment."),id:t.number().describe("Unique identifier of the segment"),seek:t.number().describe("Seek offset of the segment"),start:t.number().describe("Start time of the segment in seconds."),end:t.number().describe("End time of the segment in seconds."),tokens:t.array(t.number()).describe("Array of token IDs for the text content."),temperature:t.number().describe("Temperature parameter used for generating the segment."),avg_logprob:t.number().describe("Average logprob of the segment. If the value is lower than -1, consider the logprobs failed."),compression_ratio:t.number().describe("Compression ratio of the segment. If the value is greater than 2.4, consider the compression failed."),no_speech_prob:t.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 ye=require("@bpinternal/zui");var w="x-bot-id",W="x-bot-user-id",Q="x-integration-id",X="x-webhook-id",Y="x-bp-configuration-type",R="x-bp-configuration",_="x-bp-operation",ee="x-bp-type";var qe=ye.z.enum(["webhook_received","message_created","action_triggered","register","unregister","ping","create_user","create_conversation"]),Ie=n=>{let e=n[w],o=n[W],s=n[Q],i=n[X],a=n[Y],c=n[R],l=qe.parse(n[_]);if(!e)throw new Error("Missing bot headers");if(!o)throw new Error("Missing bot user headers");if(!s)throw new Error("Missing integration headers");if(!i)throw new Error("Missing webhook headers");if(!c)throw new Error("Missing configuration headers");if(!l)throw new Error("Missing operation headers");return{botId:e,botUserId:o,integrationId:s,webhookId:i,operation:l,configurationType:a??null,configuration:c?JSON.parse(Buffer.from(c,"base64").toString("utf-8")):{}}};var Ve=n=>Array.from(new Set(n)),I=n=>Object.entries(n);var x=(n,e)=>Object.fromEntries(I(n).map(([o,s])=>[o,e(s,o)])),k=(n,e,o)=>{let s=Ve([...Object.keys(n),...Object.keys(e)]),i={};for(let a of s){let c=n[a],l=e[a];c&&l?i[a]=o(c,l):c?i[a]=c:l&&(i[a]=l)}return i};var ne=Symbol("schemaName"),ve=n=>n?x(n,(o,s)=>({...o,[ne]:s})):{},xe=n=>n[ne]!==void 0,Be=n=>n[ne];var C=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.configurations=e.configurations,this.events=e.events,this.actions=e.actions,this.channels=e.channels,this.states=e.states,this.user=e.user,this.secrets=e.secrets,this.entities=e.entities}name;version;title;description;icon;readme;configuration;configurations;events;actions;channels;states;user;secrets;identifier;entities;interfaces={};clone(e){let o=new C({...this,...e});for(let[s,i]of Object.entries(this.interfaces))o.interfaces[s]=i;return o}extend(e,o){let s=o(ve(this.entities)),i=I(s).find(([m,v])=>!xe(v));if(i)throw new Error(`Cannot extend interface "${e.name}" with entity "${i[0]}"; the provided schema is not part of the integration's entities.`);let a=x(s,m=>({name:Be(m),schema:m.schema})),{resolved:c,implementStatement:l}=e.resolve({entities:a}),p=this;p.actions=k(p.actions??{},c.actions,this._mergeActions),p.channels=k(p.channels??{},c.channels,this._mergeChannels),p.events=k(p.events??{},c.events,this._mergeEvents);let g=Object.values(a).map(m=>m.name),T=g.length===0?e.name:`${e.name}<${g.join(",")}>`;return this.interfaces[T]=l,this}_mergeActions=(e,o)=>({...e,...o,input:{schema:e.input.schema.merge(o.input.schema)},output:{schema:e.output.schema.merge(o.output.schema)}});_mergeEvents=(e,o)=>({...e,...o,schema:e.schema.merge(o.schema)});_mergeChannels=(e,o)=>{let s=k(e.messages,o.messages,this._mergeMessage);return{...e,...o,messages:s}};_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,s={name:this.name,version:this.version,entities:x(o,p=>({name:p.name})),actions:{},events:{}},i={},a={},c={};for(let[p,g]of I(this.actions)){let T=this._dereference(g.input.schema,o),m=this._dereference(g.output.schema,o),v=this._rename(o,p);i[v]={...g,input:{schema:T},output:{schema:m}},s.actions[p]={name:v}}for(let[p,g]of I(this.events)){let T=this._dereference(g.schema,o),m=this._rename(o,p);a[m]={...g,schema:T},s.events[p]={name:m}}for(let[p,g]of I(this.channels)){let T={};for(let[m,v]of I(g.messages)){let q=this._dereference(v.schema,o);T[m]={...v,schema:q}}c[p]={...g,messages:T}}return{resolved:{actions:i,events:a,channels:c},implementStatement:s}}_dereference(e,o){let s={},i={};for(let[a,c]of I(o))s[a]=c.schema,i[a]=t.ref(a);return e(i).dereference(s)}_rename(e,o){if(!this.templateName)return o;let s=x(e,i=>i.name);return this.templateName(o,s)}};var Se=require("node:http");var E=console;function f(n){if(!n.body)throw new Error("Missing body");return JSON.parse(n.body)}async function U(n,e=8072,o=Qe){let s=(0,Se.createServer)(async(i,a)=>{try{let c=await $e(i);if(c.path==="/health"){a.writeHead(200).end("ok");return}let l=await n(c);a.writeHead(l?.status??200,l?.headers??{}).end(l?.body??"{}")}catch(c){E.error("Error while handling request",{error:c?.message??"Internal error occured"}),a.writeHead(500).end(JSON.stringify({error:c?.message??"Internal error occured"}))}});return s.listen(e,()=>o(e)),s}async function $e(n){let e=await We(n),o={};for(let i=0;i<n.rawHeaders.length;i+=2){let a=n.rawHeaders[i].toLowerCase(),c=n.rawHeaders[i+1];o[a]=c}let s=new URL(n.url??"",n.headers.host?`http://${n.headers.host}`:"http://botpress.cloud");return{body:e,path:s.pathname,query:Je(s.search,"?"),headers:o,method:n.method?.toUpperCase()??"GET"}}function Je(n,e){return n.indexOf(e)===0?n.slice(e.length):n}async function We(n){return new Promise((e,o)=>{if(n.method!=="POST"&&n.method!=="PUT"&&n.method!=="PATCH")return e(void 0);let s="";n.on("data",i=>s+=i.toString()),n.on("error",i=>o(i)),n.on("end",()=>e(s))})}function Qe(n){E.info(`Listening on port ${n}`)}var B=require("@botpress/client");var Ce=require("@botpress/client"),G={retries:3,retryCondition:n=>Ce.axiosRetry.isNetworkOrIdempotentRequestError(n)||[429,502].includes(n.response?.status??0),retryDelay:n=>n*1e3};var M=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 oe=ce(require("util")),N=n=>{if(process.env.BP_LOG_FORMAT==="json")return JSON.stringify({msg:oe.default.format(...n),visible_to_bot_owner:!0});{let[e,...o]=n;return oe.default.format(`[For Bot Owner] ${e}`,...o)}},K={forBot:()=>({info:(...n)=>{console.info(N(n))},warn:(...n)=>{console.warn(N(n))},error:(...n)=>{console.error(N(n))},debug:(...n)=>{console.debug(N(n))}})};var Ee=n=>async e=>{let o=Ie(e.headers),s=new B.Client({botId:o.botId,integrationId:o.integrationId,retry:G}),i=new M(s),a={ctx:o,req:e,client:i,logger:K,instance:n};try{let c;switch(o.operation){case"webhook_received":c=await Ye(a);break;case"register":c=await et(a);break;case"unregister":c=await tt(a);break;case"message_created":c=await st(a);break;case"action_triggered":c=await it(a);break;case"ping":c=await Xe(a);break;case"create_user":c=await nt(a);break;case"create_conversation":c=await ot(a);break;default:throw new Error(`Unknown operation ${o.operation}`)}return c?{...c,status:c.status??200}:{status:200}}catch(c){if((0,B.isApiError)(c)){let p=new B.RuntimeError(c.message,c);return K.forBot().error(p.message),{status:p.code,body:JSON.stringify(p.toJSON())}}console.error(c);let l=new B.RuntimeError("An unexpected error occurred in the integration. Bot owners: Check logs for more informations. Integration owners: throw a RuntimeError to return a custom error message instead.");return K.forBot().error(l.message),{status:l.code,body:JSON.stringify(l.toJSON())}}},Xe=async n=>{},Ye=async({client:n,ctx:e,req:o,logger:s,instance:i})=>{let{req:a}=f(o);return i.webhook({client:n,ctx:e,req:a,logger:s})},et=async({client:n,ctx:e,req:o,logger:s,instance:i})=>{if(!i.register)return;let{webhookUrl:a}=f(o);await i.register({client:n,ctx:e,webhookUrl:a,logger:s})},tt=async({client:n,ctx:e,req:o,logger:s,instance:i})=>{if(!i.unregister)return;let{webhookUrl:a}=f(o);await i.unregister({ctx:e,webhookUrl:a,client:n,logger:s})},nt=async({client:n,ctx:e,req:o,logger:s,instance:i})=>{if(!i.createUser)return;let{tags:a}=f(o);return await i.createUser({ctx:e,client:n,tags:a,logger:s})},ot=async({client:n,ctx:e,req:o,logger:s,instance:i})=>{if(!i.createConversation)return;let{channel:a,tags:c}=f(o);return await i.createConversation({ctx:e,client:n,channel:a,tags:c,logger:s})},st=async({ctx:n,req:e,client:o,logger:s,instance:i})=>{let{conversation:a,user:c,type:l,payload:p,message:g}=f(e),T=i.channels[a.channel];if(!T)throw new Error(`Channel ${a.channel} not found`);let m=T.messages[l];if(!m)throw new Error(`Message of type ${l} not found in channel ${a.channel}`);await m({ctx:n,conversation:a,message:g,user:c,type:l,client:o,payload:p,ack:async({tags:q})=>{await o.updateMessage({id:g.id,tags:q})},logger:s})},it=async({req:n,ctx:e,client:o,logger:s,instance:i})=>{let{input:a,type:c}=f(n);if(!c)throw new Error("Missing action type");let l=i.actions[c];if(!l)throw new Error(`Action ${c} not found`);let p=await l({ctx:e,input:a,client:o,type:c,logger:s});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=Ee(this);start=e=>U(this.handler,e)};var rt=n=>({...n,schema:()=>n.schema.extend({userId:t.string().optional().describe("Allows sending a message pretending to be a certain user")})}),at=t.union([t.object({type:t.literal("user"),userId:t.string()}),t.object({type:t.literal("bot")})]),ct=Object.entries(F).map(([n,e])=>t.object({source:at,type:t.literal(n),payload:e.schema})),lt=t.union(ct),pt=new d({name:"hitl",version:"0.4.0",entities:{},events:{hitlAssigned:{schema:()=>t.object({conversationId:t.string(),userId:t.string()})},hitlStopped:{schema:()=>t.object({conversationId:t.string()})}},actions:{createUser:{input:{schema:()=>t.object({name:t.string().optional(),pictureUrl:t.string().optional(),email:t.string().optional()})},output:{schema:()=>t.object({userId:t.string()})}},startHitl:{input:{schema:()=>t.object({userId:t.string(),title:t.string(),description:t.string().optional(),messageHistory:t.array(lt).optional().describe("Message history to display in the HITL session")})},output:{schema:()=>t.object({conversationId:t.string()})}},stopHitl:{input:{schema:()=>t.object({conversationId:t.string(),reason:t.enum(["timeout","cancel"]).optional()})},output:{schema:()=>t.object({})}}},channels:{hitl:{messages:{text:rt(F.text)}}}});var gt=t.object({id:t.string(),type:t.enum(["function"]),function:t.object({name:t.string(),arguments:t.record(t.any()).nullable().describe("Some LLMs may generate invalid JSON for a tool call, so this will be `null` when it happens.")})}),dt=t.object({type:t.enum(["auto","specific","any","none",""]).optional(),functionName:t.string().optional().describe('Required if `type` is "specific"')}),Me=t.object({role:t.enum(["user","assistant"]),type:t.enum(["text","tool_calls","tool_result","multipart"]).default("text"),toolCalls:t.array(gt).optional().describe('Required if `type` is "tool_calls"'),toolResultCallId:t.string().optional().describe('Required if `type` is "tool_result"'),content:t.string().or(t.array(t.object({type:t.enum(["text","image"]),mimeType:t.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:t.string().optional().describe('Required if part type is "text" '),url:t.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.')}),se=t.object({id:t.string()}),mt=se.extend({name:t.string(),description:t.string(),tags:t.array(t.enum(["recommended","deprecated","general-purpose","low-cost","vision","coding","agents","function-calling","roleplay","storytelling"])),input:t.object({maxTokens:t.number().int(),costPer1MTokens:t.number().describe("Cost per 1 million tokens, in U.S. dollars")}),output:t.object({maxTokens:t.number().int(),costPer1MTokens:t.number().describe("Cost per 1 million tokens, in U.S. dollars")})}),Pe=n=>t.object({model:n.describe("Model to use for content generation").optional(),systemPrompt:t.string().optional().describe("Optional system prompt to guide the model"),messages:t.array(Me).describe("Array of messages for the model to process"),responseFormat:t.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:t.number().optional().describe("Maximum number of tokens allowed in the generated response"),temperature:t.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:t.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:t.array(t.string()).max(4).optional().describe("Sequences where the model should stop generating further tokens."),tools:t.array(t.object({type:t.literal("function"),function:t.object({name:t.string().describe("Function name"),description:t.string().optional(),argumentsSchema:t.object({}).passthrough().optional().describe("JSON schema of the function arguments")})})).optional(),toolChoice:dt.optional(),userId:t.string().optional(),debug:t.boolean().optional().hidden().describe("Set to `true` to output debug information to the bot logs"),meta:t.object({promptCategory:t.string().optional().describe("Category of the prompt, e.g. cards/ai-generate, cards/ai-task, nodes/autonomous, etc."),integrationName:t.string().optional().describe("Name of the integration that originally received the message that initiated this action")}).optional().hidden()}),Kn=Pe(se),ut=t.object({id:t.string().describe("Response ID from LLM provider"),provider:t.string().describe("LLM provider name"),model:t.string().describe("Model name"),choices:t.array(Me.omit({role:!0}).extend({role:t.literal("assistant"),index:t.number().int(),stopReason:t.enum(["stop","max_tokens","tool_calls","content_filter","other"])})),usage:t.object({inputTokens:t.number().int().describe("Number of input tokens used by the model"),inputCost:t.number().describe("Cost of the input tokens received by the model, in U.S. dollars"),outputTokens:t.number().int().describe("Number of output tokens used by the model"),outputCost:t.number().describe("Cost of the output tokens generated by the model, in U.S. dollars")}),botpress:t.object({cost:t.number().describe("Total cost of the content generation, in U.S. dollars")})}),ht=new d({name:"llm",version:"5.1.0",entities:{modelRef:{schema:se}},events:{},actions:{generateContent:{billable:!0,cacheable:!0,input:{schema:({modelRef:n})=>Pe(n)},output:{schema:()=>ut}},listLanguageModels:{input:{schema:()=>t.object({})},output:{schema:({modelRef:n})=>t.object({models:t.array(t.intersection(mt,n))})}}}});var ie=t.object({id:t.string()}),Tt=ie.extend({name:t.string(),costPerMinute:t.number().describe("Cost per minute of speech transcription, in U.S. dollars")}),Ae=n=>t.object({model:n.optional().describe("Model to use for speech-to-text transcription (optional)"),fileUrl:t.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:t.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:t.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:t.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.")}),Vn=Ae(ie),ft=V.extend({model:t.string().describe("Model name used"),cost:t.number().describe("Total cost of the transcription, in U.S. dollars (DEPRECATED)"),botpress:t.object({cost:t.number().describe("Total cost of the transcription, in U.S. dollars")})}),bt=new d({name:"speechToText",version:"2.0.0",entities:{speechToTextModelRef:{schema:ie}},actions:{transcribeAudio:{billable:!0,cacheable:!0,input:{schema:({speechToTextModelRef:n})=>Ae(n)},output:{schema:()=>ft}},listSpeechToTextModels:{input:{schema:()=>t.object({})},output:{schema:({speechToTextModelRef:n})=>t.object({models:t.array(t.intersection(Tt,n))})}}}});var y=t.object({id:t.string()}),P=n=>t.intersection(n,y),yt=n=>n[0].toUpperCase()+n.slice(1),D=(...n)=>{let[e,...o]=n.filter(s=>s.length>0).map(s=>s.toLowerCase());return e?[e,...o.map(yt)].join(""):""},we=t.string().optional(),It=new d({name:"listable",version:"0.0.1",entities:{item:{schema:y}},events:{},actions:{list:{input:{schema:()=>t.object({nextToken:we})},output:{schema:n=>t.object({items:t.array(P(n.item)),meta:t.object({nextToken:we})})}}},templateName:(n,e)=>D(e.item,n)}),vt=new d({name:"creatable",version:"0.0.1",entities:{item:{schema:y}},events:{created:{schema:n=>t.object({item:P(n.item)})}},actions:{create:{input:{schema:n=>t.object({item:n.item})},output:{schema:n=>t.object({item:P(n.item)})}}},templateName:(n,e)=>D(e.item,n)}),xt=new d({name:"readable",version:"0.0.1",entities:{item:{schema:y}},events:{},actions:{read:{input:{schema:()=>y},output:{schema:n=>t.object({item:P(n.item)})}}},templateName:(n,e)=>D(e.item,n)}),Bt=new d({name:"updatable",version:"0.0.1",entities:{item:{schema:y}},events:{updated:{schema:n=>t.object({item:P(n.item)})}},actions:{update:{input:{schema:n=>y.extend({item:n.item})},output:{schema:n=>t.object({item:P(n.item)})}}},templateName:(n,e)=>D(e.item,n)}),St=new d({name:"deletable",version:"0.0.1",entities:{item:{schema:y}},events:{deleted:{schema:()=>y}},actions:{delete:{input:{schema:()=>y},output:{schema:()=>t.object({})}}},templateName:(n,e)=>D(e.item,n)});var re=t.object({id:t.string()}),Ct=re.extend({name:t.string(),costPerImage:t.number().describe("Cost per image generation, in U.S. dollars"),sizes:t.array(t.string()).describe("Available image sizes"),defaultSize:t.string().describe("Default image size generated by model")}),Re=t.object({}).describe("Model-specific parameters for image generation"),_e=(n,e)=>t.object({model:n.optional().describe("Model to use for image generation"),prompt:t.string(),size:t.string().optional(),expiration:t.number().int().min(30).max(90).optional().describe("Expiration of the generated image in days, after which the image will be automatically deleted to free up storage space in your account. The default is to keep the image indefinitely (no expiration). The minimum is 30 days and the maximum is 90 days."),params:e.optional()}),eo=_e(re,Re),Et=t.object({model:t.string().describe("Model name used"),imageUrl:t.string().describe("Temporary URL of generated image"),cost:t.number().describe("Cost of the image generation, in U.S. dollars (DEPRECATED)"),botpress:t.object({cost:t.number().describe("Cost of the image generation, in U.S. dollars")})}),Mt=new d({name:"textToImage",version:"2.1.0",entities:{imageModelRef:{schema:re},imageGenerationParams:{schema:Re}},actions:{generateImage:{billable:!0,cacheable:!0,input:{schema:({imageModelRef:n,imageGenerationParams:e})=>_e(n,e)},output:{schema:()=>Et}},listImageModels:{input:{schema:()=>t.object({})},output:{schema:({imageModelRef:n})=>t.object({models:t.array(t.intersection(Ct,n))})}}}});var Pt=new d({name:"typingIndicator",version:"0.0.1",entities:{},events:{},actions:{startTypingIndicator:{input:{schema:()=>t.object({conversationId:t.string(),messageId:t.string().describe("The message ID to which the typing indicator should be attached"),timeout:t.number().optional().describe("The timeout in milliseconds after which the typing indicator should stop")})},output:{schema:()=>t.object({})}},stopTypingIndicator:{input:{schema:()=>t.object({conversationId:t.string(),messageId:t.string().describe("The message ID from which the typing indicator should be removed")})},output:{schema:()=>t.object({})}}}});h(b,r,module.exports);var Z=require("@botpress/client");var De=ce(require("@botpress/client"));var A=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 ke=require("@bpinternal/zui");var At=ke.z.enum(["event_received","register","unregister","ping","action_triggered"]),Ue=n=>{let e=n[w],o=n[R],s=n[ee],i=At.parse(n[_]);if(!e)throw new Error("Missing bot headers");if(!s)throw new Error("Missing type headers");if(!o)throw new Error("Missing configuration headers");if(!i)throw new Error("Missing operation headers");return{botId:e,operation:i,type:s,configuration:o?JSON.parse(Buffer.from(o,"base64").toString("utf-8")):{}}};var je=n=>async e=>{let o=Ue(e.headers);o.operation!=="ping"&&E.info(`Received ${o.operation} operation for bot ${o.botId} of type ${o.type}`);let s=new De.Client({botId:o.botId,retry:G}),i=new A(s),a={req:e,ctx:o,client:i,instance:n};switch(o.operation){case"action_triggered":throw new Error(`Operation ${o.operation} not supported yet`);case"event_received":await kt(a);break;case"register":await Rt(a);break;case"unregister":await _t(a);break;case"ping":await wt(a);break;default:throw new Error(`Unknown operation ${o.operation}`)}return{status:200}},wt=async n=>{},Rt=async n=>{},_t=async n=>{},kt=async({ctx:n,req:e,client:o,instance:s})=>{E.debug(`Received event ${n.type}`);let i=f(e),a=i.event;switch(n.type){case"message_created":let c={user:a.payload.user,conversation:a.payload.conversation,message:a.payload.message,states:a.payload.states,event:a};await Promise.all(s.messageHandlers.map(g=>g({client:o,ctx:n,...c})));break;case"state_expired":let l={state:a.payload.state};await Promise.all(s.stateExpiredHandlers.map(g=>g({client:o,ctx:n,...l})));break;default:let p={event:i.event};await Promise.all(s.eventHandlers.map(g=>g({client:o,ctx:n,...p})))}};var L=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=>U(this.handler,e)};0&&(module.exports={Bot,BotSpecificClient,Integration,IntegrationDefinition,IntegrationSpecificClient,InterfaceDeclaration,RuntimeError,botIdHeader,botUserIdHeader,configurationHeader,configurationTypeHeader,integrationIdHeader,interfaces,isApiError,messages,operationHeader,parseBody,serve,typeHeader,webhookIdHeader});
|
|
1
|
+
"use strict";var Ie=Object.create;var S=Object.defineProperty;var Be=Object.getOwnPropertyDescriptor;var ve=Object.getOwnPropertyNames;var be=Object.getPrototypeOf,Ce=Object.prototype.hasOwnProperty;var P=(t,e)=>{for(var n in e)S(t,n,{get:e[n],enumerable:!0})},E=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ve(e))!Ce.call(t,r)&&r!==n&&S(t,r,{get:()=>e[r],enumerable:!(o=Be(e,r))||o.enumerable});return t},p=(t,e,n)=>(E(t,e,"default"),n&&E(n,e,"default")),V=(t,e,n)=>(n=t!=null?Ie(be(t)):{},E(e||!t||!t.__esModule?S(n,"default",{value:t,enumerable:!0}):n,t)),xe=t=>E(S({},"__esModule",{value:!0}),t);var m={};P(m,{Bot:()=>O,BotDefinition:()=>R,BotSpecificClient:()=>I,Integration:()=>_,IntegrationDefinition:()=>w,IntegrationSpecificClient:()=>y,InterfaceDeclaration:()=>k,RuntimeError:()=>H.RuntimeError,botIdHeader:()=>B,botUserIdHeader:()=>G,configurationHeader:()=>v,configurationTypeHeader:()=>L,integrationIdHeader:()=>N,isApiError:()=>H.isApiError,messages:()=>K,operationHeader:()=>b,parseBody:()=>T,serve:()=>C,typeHeader:()=>z,webhookIdHeader:()=>j});module.exports=xe(m);var K={};P(K,{defaults:()=>Me});var i={};P(i,{default:()=>F});var W=require("@bpinternal/zui");p(i,require("@bpinternal/zui"));var F=W.z;var g=i.z.string().min(1),Q=i.z.object({text:g}),X=i.z.object({markdown:g}),Y=i.z.object({imageUrl:g}),ee=i.z.object({audioUrl:g}),te=i.z.object({videoUrl:g}),ne=i.z.object({fileUrl:g,title:g.optional()}),ie=i.z.object({latitude:i.z.number(),longitude:i.z.number(),address:i.z.string().optional(),title:i.z.string().optional()}),oe=i.z.object({title:g,subtitle:g.optional(),imageUrl:g.optional(),actions:i.z.array(i.z.object({action:i.z.enum(["postback","url","say"]),label:g,value:g}))}),J=i.z.object({text:g,options:i.z.array(i.z.object({label:g,value:g}))}),Ee=i.z.object({items:i.z.array(oe)}),Se=i.z.discriminatedUnion("type",[i.z.object({type:i.z.literal("text"),payload:Q}),i.z.object({type:i.z.literal("markdown"),payload:X}),i.z.object({type:i.z.literal("image"),payload:Y}),i.z.object({type:i.z.literal("audio"),payload:ee}),i.z.object({type:i.z.literal("video"),payload:te}),i.z.object({type:i.z.literal("file"),payload:ne}),i.z.object({type:i.z.literal("location"),payload:ie})]),Pe=i.z.object({items:i.z.array(Se)}),Me={text:{schema:Q},markdown:{schema:X},image:{schema:Y},audio:{schema:ee},video:{schema:te},file:{schema:ne},location:{schema:ie},carousel:{schema:Ee},card:{schema:oe},dropdown:{schema:J},choice:{schema:J},bloc:{schema:Pe}};var B="x-bot-id",G="x-bot-user-id",N="x-integration-id",j="x-webhook-id",L="x-bp-configuration-type",v="x-bp-configuration",b="x-bp-operation",z="x-bp-type";var se=require("node:http");var h=console;function T(t){if(!t.body)throw new Error("Missing body");return JSON.parse(t.body)}async function C(t,e=8072,n=Ae){let o=(0,se.createServer)(async(r,a)=>{try{let s=await we(r);if(s.path==="/health"){a.writeHead(200).end("ok");return}let c=await t(s);a.writeHead(c?.status??200,c?.headers??{}).end(c?.body??"{}")}catch(s){h.error("Error while handling request",{error:s?.message??"Internal error occured"}),a.writeHead(500).end(JSON.stringify({error:s?.message??"Internal error occured"}))}});return o.listen(e,()=>n(e)),o}async function we(t){let e=await Ue(t),n={};for(let r=0;r<t.rawHeaders.length;r+=2){let a=t.rawHeaders[r].toLowerCase(),s=t.rawHeaders[r+1];n[a]=s}let o=new URL(t.url??"",t.headers.host?`http://${t.headers.host}`:"http://botpress.cloud");return{body:e,path:o.pathname,query:ke(o.search,"?"),headers:n,method:t.method?.toUpperCase()??"GET"}}function ke(t,e){return t.indexOf(e)===0?t.slice(e.length):t}async function Ue(t){return new Promise((e,n)=>{if(t.method!=="POST"&&t.method!=="PUT"&&t.method!=="PATCH")return e(void 0);let o="";t.on("data",r=>o+=r.toString()),t.on("error",r=>n(r)),t.on("end",()=>e(o))})}function Ae(t){h.info(`Listening on port ${t}`)}p(m,i,module.exports);var H=require("@botpress/client");var re=require("@bpinternal/zui");var De=re.z.enum(["webhook_received","message_created","action_triggered","register","unregister","ping","create_user","create_conversation"]),ae=t=>{let e=t[B],n=t[G],o=t[N],r=t[j],a=t[L],s=t[v],c=De.parse(t[b]);if(!e)throw new Error("Missing bot headers");if(!n)throw new Error("Missing bot user headers");if(!o)throw new Error("Missing integration headers");if(!r)throw new Error("Missing webhook headers");if(!s)throw new Error("Missing configuration headers");if(!c)throw new Error("Missing operation headers");return{botId:e,botUserId:n,integrationId:o,webhookId:r,operation:c,configurationType:a??null,configuration:s?JSON.parse(Buffer.from(s,"base64").toString("utf-8")):{}}};var d={};P(d,{mapValues:()=>_e,pairs:()=>ce});var ce=t=>Object.entries(t),_e=(t,e)=>Object.fromEntries(ce(t).map(([n,o])=>[n,e(o,n)]));var M=Symbol("schemaName"),ge=t=>t?d.mapValues(t,(n,o)=>({...n,[M]:o})):{},le=t=>M in t&&t[M]!==void 0,pe=t=>t[M];var w=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.configurations=e.configurations,this.events=e.events,this.actions=e.actions,this.channels=e.channels,this.states=e.states,this.user=e.user,this.secrets=e.secrets,this.entities=e.entities,this.interfaces=e.interfaces}name;version;title;description;icon;readme;configuration;configurations;events;actions;channels;states;user;secrets;identifier;entities;interfaces;extend(e,n){let o=n(ge(this.entities)),r=d.pairs(o).find(([l,x])=>!le(x));if(r)throw new Error(`Cannot extend interface "${e.definition.name}" with entity "${r[0]}"; the provided schema is not part of the integration's entities.`);let a=this;a.interfaces??={};let s=d.mapValues(o,l=>({name:pe(l),schema:l.schema})),c=Object.values(s).map(l=>l.name),u=c.length===0?e.definition.name:`${e.definition.name}<${c.join(",")}>`;return a.interfaces[u]={...e,entities:s},this}};var k=class{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.entities=e.entities??{},this.templateName=e.templateName;let n=this._getEntityReference(this.entities),o=e.events===void 0?{}:d.mapValues(e.events,s=>({...s,schema:s.schema(n)})),r=e.actions===void 0?{}:d.mapValues(e.actions,s=>({...s,input:{...s.input,schema:s.input.schema(n)},output:{...s.output,schema:s.output.schema(n)}})),a=e.channels===void 0?{}:d.mapValues(e.channels,s=>({...s,messages:d.mapValues(s.messages,c=>({...c,schema:c.schema(n)}))}));this.events=o,this.actions=r,this.channels=a}name;version;entities;events;actions;channels;templateName;_getEntityReference=e=>{let n={};for(let o of Object.keys(e))n[o]=F.ref(o);return n}};var f=require("@botpress/client");var de=require("@botpress/client"),U={retries:3,retryCondition:t=>de.axiosRetry.isNetworkOrIdempotentRequestError(t)||[429,502].includes(t.response?.status??0),retryDelay:t=>t*1e3};var y=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 q=V(require("util")),A=t=>{if(process.env.BP_LOG_FORMAT==="json")return JSON.stringify({msg:q.default.format(...t),visible_to_bot_owner:!0});{let[e,...n]=t;return q.default.format(`[For Bot Owner] ${e}`,...n)}},D={forBot:()=>({info:(...t)=>{console.info(A(t))},warn:(...t)=>{console.warn(A(t))},error:(...t)=>{console.error(A(t))},debug:(...t)=>{console.debug(A(t))}})};var ue=t=>async e=>{let n=ae(e.headers),o=new f.Client({botId:n.botId,integrationId:n.integrationId,retry:U}),r=new y(o),a={ctx:n,req:e,client:r,logger:D,instance:t};try{let s;switch(n.operation){case"webhook_received":s=await Oe(a);break;case"register":s=await He(a);break;case"unregister":s=await Fe(a);break;case"message_created":s=await Ne(a);break;case"action_triggered":s=await je(a);break;case"ping":s=await Re(a);break;case"create_user":s=await Ke(a);break;case"create_conversation":s=await Ge(a);break;default:throw new Error(`Unknown operation ${n.operation}`)}return s?{...s,status:s.status??200}:{status:200}}catch(s){if((0,f.isApiError)(s)){let u=new f.RuntimeError(s.message,s);return D.forBot().error(u.message),{status:u.code,body:JSON.stringify(u.toJSON())}}console.error(s);let c=new f.RuntimeError("An unexpected error occurred in the integration. Bot owners: Check logs for more informations. Integration owners: throw a RuntimeError to return a custom error message instead.");return D.forBot().error(c.message),{status:c.code,body:JSON.stringify(c.toJSON())}}},Re=async t=>{},Oe=async({client:t,ctx:e,req:n,logger:o,instance:r})=>{let{req:a}=T(n);return r.webhook({client:t,ctx:e,req:a,logger:o})},He=async({client:t,ctx:e,req:n,logger:o,instance:r})=>{if(!r.register)return;let{webhookUrl:a}=T(n);await r.register({client:t,ctx:e,webhookUrl:a,logger:o})},Fe=async({client:t,ctx:e,req:n,logger:o,instance:r})=>{if(!r.unregister)return;let{webhookUrl:a}=T(n);await r.unregister({ctx:e,webhookUrl:a,client:t,logger:o})},Ke=async({client:t,ctx:e,req:n,logger:o,instance:r})=>{if(!r.createUser)return;let{tags:a}=T(n);return await r.createUser({ctx:e,client:t,tags:a,logger:o})},Ge=async({client:t,ctx:e,req:n,logger:o,instance:r})=>{if(!r.createConversation)return;let{channel:a,tags:s}=T(n);return await r.createConversation({ctx:e,client:t,channel:a,tags:s,logger:o})},Ne=async({ctx:t,req:e,client:n,logger:o,instance:r})=>{let{conversation:a,user:s,type:c,payload:u,message:l}=T(e),x=r.channels[a.channel];if(!x)throw new Error(`Channel ${a.channel} not found`);let $=x.messages[c];if(!$)throw new Error(`Message of type ${c} not found in channel ${a.channel}`);await $({ctx:t,conversation:a,message:l,user:s,type:c,client:n,payload:u,ack:async({tags:ye})=>{await n.updateMessage({id:l.id,tags:ye})},logger:o})},je=async({req:t,ctx:e,client:n,logger:o,instance:r})=>{let{input:a,type:s}=T(t);if(!s)throw new Error("Missing action type");let c=r.actions[s];if(!c)throw new Error(`Action ${s} not found`);let u=await c({ctx:e,input:a,client:n,type:s,logger:o});return{body:JSON.stringify({output:u})}};var _=class{constructor(e){this.props=e;this.actions=e.actions,this.channels=e.channels,this.register=e.register,this.unregister=e.unregister,this.createUser=e.createUser,this.createConversation=e.createConversation,this.webhook=e.handler}actions;channels;register;unregister;createUser;createConversation;webhook;handler=ue(this);start=e=>C(this.handler,e)};var R=class{constructor(e){this.props=e;this.integrations=e.integrations,this.user=e.user,this.conversation=e.conversation,this.message=e.message,this.states=e.states,this.configuration=e.configuration,this.events=e.events,this.recurringEvents=e.recurringEvents}integrations;user;conversation;message;states;configuration;events;recurringEvents;add(e,n){let o=this;return o.integrations||(o.integrations={}),o.integrations[e.definition.name]={enabled:n.enabled,...e,configurationType:n.configurationType,configuration:n.configuration},this}};var fe=V(require("@botpress/client"));var I=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(n=>({state:{...n.state,payload:n.state.payload}}));setState=e=>this._client.setState(e).then(n=>({state:{...n.state,payload:n.state.payload}}));getOrSetState=e=>this._client.getOrSetState(e).then(n=>({state:{...n.state,payload:n.state.payload}}));patchState=e=>this._client.patchState(e).then(n=>({state:{...n.state,payload:n.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 Te=require("@bpinternal/zui");var Le=Te.z.enum(["event_received","register","unregister","ping","action_triggered"]),me=t=>{let e=t[B],n=t[v],o=t[z],r=Le.parse(t[b]);if(!e)throw new Error("Missing bot headers");if(!o)throw new Error("Missing type headers");if(!n)throw new Error("Missing configuration headers");if(!r)throw new Error("Missing operation headers");return{botId:e,operation:r,type:o,configuration:n?JSON.parse(Buffer.from(n,"base64").toString("utf-8")):{}}};var he=t=>async e=>{let n=me(e.headers);n.operation!=="ping"&&h.info(`Received ${n.operation} operation for bot ${n.botId} of type ${n.type}`);let o=new fe.Client({botId:n.botId,retry:U}),r=new I(o),a={req:e,ctx:n,client:r,instance:t};switch(n.operation){case"action_triggered":throw new Error(`Operation ${n.operation} not supported yet`);case"event_received":await $e(a);break;case"register":await Ze(a);break;case"unregister":await qe(a);break;case"ping":await ze(a);break;default:throw new Error(`Unknown operation ${n.operation}`)}return{status:200}},ze=async t=>{},Ze=async t=>{},qe=async t=>{},$e=async({ctx:t,req:e,client:n,instance:o})=>{h.debug(`Received event ${t.type}`);let r=T(e),a=r.event;switch(t.type){case"message_created":let s={user:a.payload.user,conversation:a.payload.conversation,message:a.payload.message,states:a.payload.states,event:a};await Promise.all(o.messageHandlers.map(l=>l({client:n,ctx:t,...s})));break;case"state_expired":let c={state:a.payload.state};await Promise.all(o.stateExpiredHandlers.map(l=>l({client:n,ctx:t,...c})));break;default:let u={event:r.event};await Promise.all(o.eventHandlers.map(l=>l({client:n,ctx:t,...u})))}};var O=class{constructor(e){this.props=e}_state={messageHandlers:[],eventHandlers:[],stateExpiredHandlers:[]};message=e=>{this._state.messageHandlers.push(e)};event=e=>{this._state.eventHandlers.push(e)};stateExpired=e=>{this._state.stateExpiredHandlers.push(e)};handler=he(this._state);start=e=>C(this.handler,e)};0&&(module.exports={Bot,BotDefinition,BotSpecificClient,Integration,IntegrationDefinition,IntegrationSpecificClient,InterfaceDeclaration,RuntimeError,botIdHeader,botUserIdHeader,configurationHeader,configurationTypeHeader,integrationIdHeader,isApiError,messages,operationHeader,parseBody,serve,typeHeader,webhookIdHeader});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|