@botpress/sdk 0.2.2 → 0.3.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.
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.ts", "../src/bot/client.ts", "../src/const.ts", "../src/serve.ts", "../src/log.ts", "../src/bot/server.ts", "../src/bot/context.ts", "../src/bot/implementation.ts", "../src/integration/client.ts", "../src/integration/error.ts", "../src/integration/context.ts", "../src/integration/definition.ts", "../src/integration/schema.ts", "../src/integration/server.ts", "../src/integration/logger.ts", "../src/integration/implementation.ts", "../src/message.ts"],
4
- "sourcesContent": ["import { BotClient } from './bot'\nimport { IntegrationClient } from './integration'\n\nexport * as messages from './message'\nexport const clients = { IntegrationClient, BotClient }\n\nexport * from './const'\nexport * from './serve'\n\nexport {\n IntegrationDefinition,\n IntegrationDefinitionProps,\n IntegrationImplementation as Integration,\n IntegrationImplementationProps as IntegrationProps,\n IntegrationContext,\n IntegrationOperation,\n ActionDefinitions,\n ChannelDefinitions,\n EventDefinitions,\n AckFunction,\n} from './integration'\nexport { Bot, BotContext, BotOperation, IntegrationInstance } from './bot'\n", "import axiosGlobal, { Axios as AxiosInstance } from 'axios'\nimport type { Merge, Except } from 'type-fest'\nimport { botIdHeader, operationHeader, configurationHeader, typeHeader } from '../const'\nimport type { BotContext, BotOperation } from './context'\nimport type { RegisterBotPayload, UnregisterBotPayload, EventReceivedBotPayload } from './implementation'\n\ntype Props<T = any> = Merge<\n Except<BotContext, 'operation'>,\n {\n url: string\n data: T\n }\n>\n\n/**\n * @description Meant to query your bot server directly (e.g. without going through the Botpress API)\n */\nexport class BotClient {\n private axios: AxiosInstance\n\n public constructor(axiosInstance?: AxiosInstance) {\n this.axios = axiosInstance ?? axiosGlobal.create({ timeout: 5000 })\n }\n\n public register = (props: Props<RegisterBotPayload>) => request('register', props, this.axios)\n public unregister = (props: Props<UnregisterBotPayload>) => request('unregister', props, this.axios)\n public eventReceived = (props: Props<EventReceivedBotPayload>) => request('event_received', props, this.axios)\n}\n\nexport function formatBotHeaders(ctx: BotContext) {\n return {\n [typeHeader]: ctx.type,\n [botIdHeader]: ctx.botId,\n [operationHeader]: ctx.operation,\n [configurationHeader]: Buffer.from(\n typeof ctx.configuration === 'string' ? ctx.configuration : JSON.stringify(ctx.configuration),\n 'utf-8'\n ).toString('base64'),\n }\n}\n\nasync function request<O = any>(operation: BotOperation, { url, data, ...ctx }: Props, axios: AxiosInstance) {\n const response = await axios.post<O>(url, data, {\n headers: formatBotHeaders({\n ...ctx,\n operation,\n }),\n })\n\n return response.data\n}\n", "export const botIdHeader = 'x-bot-id'\nexport const botUserIdHeader = 'x-bot-user-id'\nexport const integrationIdHeader = 'x-integration-id'\nexport const webhookIdHeader = 'x-webhook-id'\n\nexport const configurationHeader = 'x-bp-configuration'\nexport const operationHeader = 'x-bp-operation'\nexport const typeHeader = 'x-bp-type'\n", "import { createServer, IncomingMessage, Server } from 'node:http'\nimport { log } from './log'\n\nexport type Request = {\n body?: string\n path: string\n query: string\n method: string\n headers: { [key: string]: string | undefined }\n}\n\nexport type Response = {\n body?: string\n headers?: { [key: string]: string }\n status?: number\n}\n\nexport type Handler = (req: Request) => Promise<Response | void>\n\nexport async function serve(\n handler: Handler,\n port: number = 8072,\n callback: (port: number) => void = defaultCallback\n): Promise<Server> {\n /* eslint-disable @typescript-eslint/no-misused-promises */\n const server = createServer(async (req, res) => {\n try {\n const request = await mapIncomingMessageToRequest(req)\n const response = await handler(request)\n res.writeHead(response?.status ?? 200, response?.headers ?? {}).end(response?.body ?? '{}')\n } catch (e: any) {\n log.error('Error while handling request', { error: e?.message ?? 'Internal error occured' })\n res.writeHead(500).end(JSON.stringify({ error: e?.message ?? 'Internal error occured' }))\n }\n })\n\n server.listen(port, () => callback(port))\n return server\n}\n\nasync function mapIncomingMessageToRequest(incoming: IncomingMessage): Promise<Request> {\n const body = await readBody(incoming)\n const headers = {} as Request['headers']\n\n for (let i = 0; i < incoming.rawHeaders.length; i += 2) {\n const key = incoming.rawHeaders[i]!.toLowerCase()\n const value = incoming.rawHeaders[i + 1]!\n headers[key] = value\n }\n\n const url = new URL(\n incoming.url ?? '',\n incoming.headers.host ? `http://${incoming.headers.host}` : 'http://botpress.cloud'\n )\n\n return {\n body,\n path: url.pathname,\n query: trimPrefix(url.search, '?'),\n headers,\n method: incoming.method?.toUpperCase() ?? 'GET',\n }\n}\n\nfunction trimPrefix(value: string, prefix: string) {\n return value.indexOf(prefix) === 0 ? value.slice(prefix.length) : value\n}\n\nasync function readBody(incoming: IncomingMessage) {\n return new Promise<string | undefined>((resolve, reject) => {\n if (incoming.method !== 'POST' && incoming.method !== 'PUT' && incoming.method !== 'PATCH') {\n return resolve(undefined)\n }\n\n let body = ''\n\n incoming.on('data', (chunk) => (body += chunk.toString()))\n incoming.on('error', (e) => reject(e))\n incoming.on('end', () => resolve(body))\n })\n}\n\nfunction defaultCallback(port: number) {\n log.info(`Listening on port ${port}`)\n}\n", "export type Logger = {\n debug(message: string, metadata?: any): void\n info(message: string, metadata?: any): void\n warn(message: string, metadata?: any): void\n error(message: string, metadata?: any): void\n}\nexport const log: Logger = console\n", "import { Client } from '@botpress/client'\nimport { botIdHeader, configurationHeader, operationHeader, typeHeader } from '../const'\nimport { log } from '../log'\nimport type { Handler, Request, Response } from '../serve'\nimport { BotContext, botOperationSchema } from './context'\nimport type { EventReceivedBotPayload } from './implementation'\nimport type { BotState } from './state'\n\ntype OperationHandlerProps = {\n botState: BotState\n ctx: BotContext\n client: Client\n req: Request\n}\n\nexport const createBotHandler =\n (botState: BotState): Handler =>\n async (req: Request): Promise<Response> => {\n const ctx = extractContext(req.headers)\n\n if (ctx.operation !== 'ping') {\n log.info(`Received ${ctx.operation} operation for bot ${ctx.botId} of type ${ctx.type}`)\n }\n\n const client = new Client({ botId: ctx.botId })\n\n const props: OperationHandlerProps = {\n req,\n botState,\n ctx,\n client,\n }\n\n switch (ctx.operation) {\n case 'event_received':\n await onEventReceived(props)\n break\n case 'register':\n await onRegister(props)\n break\n case 'unregister':\n await onUnregister(props)\n break\n case 'ping':\n await onPing(props)\n break\n default:\n throw new Error(`Unknown operation ${ctx.operation}`)\n }\n\n return { status: 200 }\n }\n\nfunction extractContext(headers: Record<string, string | undefined>): BotContext {\n const botId = headers[botIdHeader]\n const base64Configuration = headers[configurationHeader]\n const type = headers[typeHeader]\n const operation = botOperationSchema.parse(headers[operationHeader])\n\n if (!botId) {\n throw new Error('Missing bot headers')\n }\n\n if (!type) {\n throw new Error('Missing type headers')\n }\n\n if (!base64Configuration) {\n throw new Error('Missing configuration headers')\n }\n\n if (!operation) {\n throw new Error('Missing operation headers')\n }\n\n return {\n botId,\n operation,\n type,\n configuration: base64Configuration ? JSON.parse(Buffer.from(base64Configuration, 'base64').toString('utf-8')) : {},\n }\n}\n\nasync function onEventReceived({ botState, ctx, req }: OperationHandlerProps) {\n log.debug(`Received event ${ctx.type}`)\n\n const client = new Client({ botId: ctx.botId })\n\n const body = parseBody<EventReceivedBotPayload>(req)\n\n switch (ctx.type) {\n case 'message_created':\n await Promise.all(\n botState.messageHandlers.map((handler) =>\n handler({\n client,\n user: body.event.payload.user as any,\n conversation: body.event.payload.conversation as any,\n message: body.event.payload.message as any,\n event: body.event,\n ctx,\n })\n )\n )\n break\n case 'state_expired':\n await Promise.all(\n botState.stateExpiredHandlers.map((handler) =>\n handler({\n client,\n state: body.event.payload.state as any,\n ctx,\n })\n )\n )\n break\n default:\n await Promise.all(\n botState.eventHandlers.map((handler) =>\n handler({\n client,\n event: body.event,\n ctx,\n })\n )\n )\n }\n}\n\n// TODO implement the ping operation once the signature is defined\nasync function onPing(_: OperationHandlerProps) {}\n\nasync function onRegister(_: OperationHandlerProps) {}\n\nasync function onUnregister(_: OperationHandlerProps) {}\n\nfunction parseBody<T>(req: Request): T {\n if (!req.body) {\n throw new Error('Missing body')\n }\n\n return JSON.parse(req.body)\n}\n", "import { z } from 'zod'\n\nexport const botOperationSchema = z.enum(['event_received', 'register', 'unregister', 'ping'])\n\nexport type BotOperation = z.infer<typeof botOperationSchema>\n\nexport type BotContext<Configuration = any, Type extends string = string> = {\n botId: string\n type: Type\n operation: BotOperation\n configuration: Configuration\n}\n", "import type { Bot as BotType, Event } from '@botpress/client'\nimport type { Server } from 'node:http'\nimport { serve } from '../serve'\nimport { createBotHandler } from './server'\nimport type { BotState, EventHandler, MessageHandler, StateExpiredHandler } from './state'\n\nexport type RegisterBotPayload = {\n bot: BotType\n}\n\nexport type UnregisterBotPayload = {\n bot: BotType\n}\n\nexport type EventReceivedBotPayload = {\n event: Event\n}\n\nexport type BotDefinitionTag = {\n title?: string\n description?: string\n}\n\nexport type BotDefinitionStateType = 'conversation' | 'user' | 'bot'\nexport type BotDefinitionState = {\n type: BotDefinitionStateType\n schema: Record<string, any>\n expiry?: number\n}\n\nexport type IntegrationInstance = {\n id: string\n enabled?: boolean\n configuration?: { [key: string]: any }\n}\n\nexport type BotDefinitionRecurringEvent = {\n type: string\n payload: Record<string, any>\n schedule: {\n cron: string\n }\n}\n\nexport type BotDefinitionEvent = {\n schema: Record<string, any>\n}\n\nexport type BotDefinitionConfiguration = {\n schema: Record<string, any>\n}\n\nexport type BotDefinitionUser = {\n tags?: Record<string, BotDefinitionTag>\n}\n\nexport type BotDefinitionConversation = {\n tags?: Record<string, BotDefinitionTag>\n}\n\nexport type BotDefinitionMessage = {\n tags?: Record<string, BotDefinitionTag>\n}\n\nexport type BotDefinition = {\n user?: BotDefinitionUser\n conversation?: BotDefinitionConversation\n message?: BotDefinitionMessage\n states?: Record<string, BotDefinitionState>\n integrations?: IntegrationInstance[]\n configuration?: BotDefinitionConfiguration\n events?: Record<string, BotDefinitionEvent>\n recurringEvents?: Record<string, BotDefinitionRecurringEvent>\n}\n\nexport class Bot {\n private _state: BotState = {\n registerHandlers: [],\n unregisterHandlers: [],\n messageHandlers: [],\n eventHandlers: [],\n stateExpiredHandlers: [],\n }\n\n public readonly definition: BotDefinition\n\n public constructor(def: BotDefinition = {}) {\n this.definition = def\n }\n\n public message = (handler: MessageHandler): void => {\n this._state.messageHandlers.push(handler)\n }\n public event = (handler: EventHandler): void => {\n this._state.eventHandlers.push(handler)\n }\n public stateExpired = (handler: StateExpiredHandler): void => {\n this._state.stateExpiredHandlers.push(handler)\n }\n\n public handler = createBotHandler(this._state)\n public start = (port?: number): Promise<Server> => serve(this.handler, port)\n}\n", "import { Conversation, RuntimeError, Message, User } from '@botpress/client'\nimport axiosGlobal, { Axios as AxiosInstance } from 'axios'\nimport {\n botIdHeader,\n operationHeader,\n integrationIdHeader,\n configurationHeader,\n botUserIdHeader,\n webhookIdHeader,\n} from '../const'\nimport type { IntegrationContext, IntegrationOperation } from './context'\nimport { runtimeErrorSchema } from './error'\nimport type {\n ActionPayload,\n CreateConversationPayload,\n CreateUserPayload,\n MessagePayload,\n RegisterPayload,\n UnregisterPayload,\n WebhookPayload,\n} from './implementation'\n\ntype Props<T = any> = {\n url: string\n data: T\n} & Omit<IntegrationContext, 'operation'>\n\n/**\n * @description Meant to query your integration server directly (e.g. without going through the Botpress API)\n */\nexport class IntegrationClient {\n private axios: AxiosInstance\n\n public constructor(axiosInstance?: AxiosInstance) {\n this.axios = axiosInstance ?? axiosGlobal.create({ timeout: 5000 })\n }\n\n public actionTriggered = (props: Props<ActionPayload<string, any>>) => request('action_triggered', props, this.axios)\n public messageCreated = (props: Props<MessagePayload<any, Message, Conversation, User>>) =>\n request('message_created', props, this.axios)\n public register = (props: Props<RegisterPayload>) => request('register', props, this.axios)\n public unregister = (props: Props<UnregisterPayload>) => request('unregister', props, this.axios)\n public webhookReceived = (props: Props<WebhookPayload>) => webhookRequest('webhook_received', props, this.axios)\n public createUser = (props: Props<CreateUserPayload>) =>\n request<{ user: { id: User['id'] } }>('create_user', props, this.axios)\n public createConversation = (props: Props<CreateConversationPayload>) =>\n request<{ conversation: { id: Conversation['id'] } }>('create_conversation', props, this.axios)\n}\n\nexport function formatIntegrationHeaders(ctx: IntegrationContext) {\n return {\n [botIdHeader]: ctx.botId,\n [operationHeader]: ctx.operation,\n [botUserIdHeader]: ctx.botUserId,\n [integrationIdHeader]: ctx.integrationId,\n [webhookIdHeader]: ctx.webhookId,\n [configurationHeader]: Buffer.from(\n typeof ctx.configuration === 'string' ? ctx.configuration : JSON.stringify(ctx.configuration),\n 'utf-8'\n ).toString('base64'),\n }\n}\n\nasync function webhookRequest(operation: IntegrationOperation, { url, data, ...ctx }: Props, axios: AxiosInstance) {\n const response = await axios\n .post<unknown>(url, data, {\n headers: formatIntegrationHeaders({\n ...ctx,\n operation,\n }),\n })\n .catch((e) => {\n if (axiosGlobal.isAxiosError(e) && e.response?.status && e.response.status < 500) {\n return e.response\n }\n\n throw e\n })\n\n return response\n}\n\nasync function request<O = any>(operation: IntegrationOperation, { url, data, ...ctx }: Props, axios: AxiosInstance) {\n try {\n const response = await axios.post<O>(url, data, {\n headers: formatIntegrationHeaders({\n ...ctx,\n operation,\n }),\n })\n\n return response\n } catch (e) {\n const runtimeErrorCode = new RuntimeError('').code\n if (axiosGlobal.isAxiosError(e) && e.response?.status === runtimeErrorCode) {\n const result = runtimeErrorSchema.safeParse(e.response.data)\n if (result.success) {\n throw new RuntimeError(result.data.message)\n }\n }\n throw e\n }\n}\n", "import { RuntimeError } from '@botpress/client'\nimport { z } from 'zod'\n\n// simply used to build the schema\nconst e = new RuntimeError('')\n\nexport const runtimeErrorSchema = z.object({\n code: z.literal(e.code),\n type: z.literal(e.type),\n message: z.string(),\n})\n", "import { z } from 'zod'\n\nexport const integrationOperationSchema = z.enum([\n 'webhook_received',\n 'message_created',\n 'action_triggered',\n 'register',\n 'unregister',\n 'ping',\n 'create_user',\n 'create_conversation',\n])\n\nexport type IntegrationOperation = z.infer<typeof integrationOperationSchema>\n\nexport type IntegrationContext<Configuration = any> = {\n botId: string\n botUserId: string\n integrationId: string\n webhookId: string\n operation: IntegrationOperation\n configuration: Configuration\n}\n", "import { mapValues } from 'radash'\nimport { z } from 'zod'\n\nimport { SchemaDefinition, schemaDefinitionToJsonSchema } from './schema'\n\nconst nonEmptyDict = <V extends z.ZodTypeAny>(v: V) => {\n const r = z.record(v)\n return {\n min: (n: number) =>\n r.refine((obj) => Object.keys(obj).length >= n, { message: `At least ${n} item(s) must be defined` }),\n }\n}\n\nexport const schemaSchema = z.object({}).passthrough()\n\nexport const configurationDefinitionSchema = z.object({\n schema: schemaSchema,\n})\n\nexport const eventDefinitionSchema = z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n schema: schemaSchema,\n})\n\nexport const actionDefinitionSchema = z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n input: z.object({\n schema: schemaSchema,\n }),\n output: z.object({\n schema: schemaSchema,\n }),\n})\n\nexport const messageDefinitionSchema = z.object({\n schema: schemaSchema,\n})\n\nexport const tagDefinitionSchema = z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n})\n\nexport const channelDefinitionSchema = z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n messages: nonEmptyDict(messageDefinitionSchema).min(1),\n message: z\n .object({\n tags: z.record(tagDefinitionSchema),\n })\n .partial()\n .optional(),\n conversation: z\n .object({\n tags: z.record(tagDefinitionSchema),\n creation: z.object({\n enabled: z.boolean(),\n requiredTags: z.array(z.string()),\n }),\n })\n .partial()\n .optional(),\n})\n\nexport const stateDefinitionSchema = z.object({\n type: z.union([z.literal('integration'), z.literal('conversation'), z.literal('user')]),\n schema: schemaSchema,\n})\n\nconst PUBLIC_VERSION = '0.2.0' as const\nconst PRIVATE_VERSION = '0.0.1' as const\n\nexport const integrationDefinitionSchema = z.object({\n name: z.string(),\n version: z.enum([PRIVATE_VERSION, PUBLIC_VERSION]),\n title: z.string().optional(),\n description: z.string().optional(),\n icon: z.string().optional(),\n readme: z.string().optional(),\n configuration: configurationDefinitionSchema.optional(),\n events: z.record(eventDefinitionSchema).optional(),\n actions: z.record(actionDefinitionSchema).optional(),\n channels: z.record(channelDefinitionSchema).optional(),\n states: z.record(stateDefinitionSchema).optional(),\n user: z\n .object({\n tags: z.record(tagDefinitionSchema),\n creation: z.object({\n enabled: z.boolean(),\n requiredTags: z.array(z.string()),\n }),\n })\n .partial()\n .optional(),\n secrets: z.array(z.string()).optional(),\n})\n\nexport type ConfigurationDefinition = z.infer<typeof configurationDefinitionSchema>\nexport type EventDefinition = z.infer<typeof eventDefinitionSchema>\nexport type ChannelDefinition = z.infer<typeof channelDefinitionSchema>\nexport type ActionDefinition = z.infer<typeof actionDefinitionSchema>\nexport type MessageDefinition = z.infer<typeof messageDefinitionSchema>\nexport type StateDefinition = z.infer<typeof stateDefinitionSchema>\n\ntype IntegrationDefinitionInput = z.input<typeof integrationDefinitionSchema>\ntype IntegrationDefinitionOutput = z.infer<typeof integrationDefinitionSchema>\n\ntype AnyZodObject = z.ZodObject<any>\ntype Merge<A extends object, B extends object> = Omit<A, keyof B> & B\ntype Cast<T, U> = T extends U ? T : U\n\ntype BaseConfig = AnyZodObject\ntype BaseEvent = Record<string, AnyZodObject>\ntype BaseAction = Record<string, Record<'input' | 'output', AnyZodObject>>\ntype BaseChannel = Record<string, Record<string, AnyZodObject>>\ntype BaseState = Record<string, AnyZodObject>\n\n// TODO: allow any versions\ntype IntegrationDefinitionVersion =\n | {\n /** Only version 0.2.0 is supported for public integrations yet. This is temporary. */\n version: typeof PUBLIC_VERSION\n }\n | {\n /** Only version 0.0.1 is supported for private integrations yet. This is temporary. */\n version: typeof PRIVATE_VERSION\n }\n\nexport type IntegrationDefinitionProps<\n TConfig extends BaseConfig = BaseConfig,\n TEvent extends BaseEvent = BaseEvent,\n TAction extends BaseAction = BaseAction,\n TChannel extends BaseChannel = BaseChannel,\n TState extends BaseState = BaseState\n> = Omit<\n IntegrationDefinitionOutput,\n 'public' | 'version' | 'configuration' | 'events' | 'actions' | 'channels' | 'states'\n> &\n IntegrationDefinitionVersion & {\n configuration?: Merge<ConfigurationDefinition, SchemaDefinition<TConfig>>\n events?: { [K in keyof TEvent]: Merge<EventDefinition, SchemaDefinition<TEvent[K]>> }\n\n actions?: {\n [K in keyof TAction]: Merge<\n ActionDefinition,\n {\n ['input']: SchemaDefinition<Cast<TAction[K]['input'], AnyZodObject>>\n ['output']: SchemaDefinition<Cast<TAction[K]['output'], AnyZodObject>>\n }\n >\n }\n\n channels?: {\n [K in keyof TChannel]: Merge<\n ChannelDefinition,\n {\n messages: {\n [L in keyof TChannel[K]]: Merge<MessageDefinition, SchemaDefinition<TChannel[K][L]>>\n }\n }\n >\n }\n\n states?: {\n [K in keyof TState]: Merge<StateDefinition, SchemaDefinition<TState[K]>>\n }\n }\n\nfunction formatIntegrationDefinition(\n definition: IntegrationDefinitionProps<BaseConfig, BaseEvent, BaseAction, BaseChannel, BaseState>\n): IntegrationDefinitionInput {\n return {\n ...definition,\n configuration: definition.configuration\n ? {\n ...definition.configuration,\n schema: schemaDefinitionToJsonSchema(definition.configuration),\n }\n : undefined,\n events: definition.events\n ? mapValues(definition.events, (event) => ({\n ...event,\n schema: schemaDefinitionToJsonSchema(event),\n }))\n : undefined,\n actions: definition.actions\n ? mapValues(definition.actions, (action) => ({\n ...action,\n input: {\n ...action.input,\n schema: schemaDefinitionToJsonSchema(action.input),\n },\n output: {\n ...action.output,\n schema: schemaDefinitionToJsonSchema(action.output),\n },\n }))\n : undefined,\n channels: definition.channels\n ? mapValues(definition.channels, (channel) => ({\n ...channel,\n messages: mapValues(channel.messages, (message) => ({\n ...message,\n schema: schemaDefinitionToJsonSchema(message),\n })),\n }))\n : undefined,\n states: definition.states\n ? mapValues(definition.states, (state) => ({\n ...state,\n schema: schemaDefinitionToJsonSchema(state),\n }))\n : undefined,\n user: definition.user,\n }\n}\n\nexport class IntegrationDefinition<\n TConfig extends BaseConfig = BaseConfig,\n TEvent extends BaseEvent = BaseEvent,\n TAction extends BaseAction = BaseAction,\n TChannel extends BaseChannel = BaseChannel,\n TState extends BaseState = BaseState\n> {\n public readonly name: IntegrationDefinitionOutput['name']\n public readonly version: IntegrationDefinitionOutput['version']\n public readonly icon: IntegrationDefinitionOutput['icon']\n public readonly readme: IntegrationDefinitionOutput['readme']\n public readonly title: IntegrationDefinitionOutput['title']\n public readonly description: IntegrationDefinitionOutput['description']\n public readonly configuration: IntegrationDefinitionOutput['configuration']\n public readonly events: IntegrationDefinitionOutput['events']\n public readonly actions: IntegrationDefinitionOutput['actions']\n public readonly channels: IntegrationDefinitionOutput['channels']\n public readonly states: IntegrationDefinitionOutput['states']\n public readonly user: IntegrationDefinitionOutput['user']\n public readonly secrets: IntegrationDefinitionOutput['secrets']\n public constructor(props: IntegrationDefinitionProps<TConfig, TEvent, TAction, TChannel, TState>) {\n const integrationDefinitionInput = formatIntegrationDefinition(props)\n const parsed = integrationDefinitionSchema.parse(integrationDefinitionInput)\n\n const {\n name,\n version,\n icon,\n readme,\n title,\n description,\n configuration,\n events,\n actions,\n channels,\n states,\n user,\n secrets,\n } = parsed\n this.name = name\n this.version = version\n this.icon = icon\n this.readme = readme\n this.title = title\n this.description = description\n this.configuration = configuration\n this.events = events\n this.actions = actions\n this.channels = channels\n this.states = states\n this.user = user\n this.secrets = secrets\n }\n}\n", "import type { z } from 'zod'\nimport zodToJsonSchema from 'zod-to-json-schema'\nimport type { JsonSchema7Type } from 'zod-to-json-schema/src/parseDef'\nimport type { JsonSchema7ObjectType } from 'zod-to-json-schema/src/parsers/object'\n\ntype JsonSchemaPropertyType = JsonSchema7Type & { title?: string; examples?: any[] }\nconst isObjectSchema = (schema: JsonSchema7Type): schema is JsonSchema7ObjectType => {\n return (schema as any)?.type === 'object'\n}\n\nexport type SchemaOptions<T> = {\n title: string\n examples: T[]\n}\n\ntype IsEmptyObject<T> = keyof T extends never ? true : false\n\nexport type UiDefinition<TSchema extends z.ZodObject<any>> = IsEmptyObject<z.infer<TSchema>> extends true\n ? Record<string, never>\n : {\n [K in keyof z.infer<TSchema>]: Partial<SchemaOptions<z.infer<TSchema>[K]>>\n }\n\nexport type SchemaDefinition<TSchema extends z.ZodObject<any>> = {\n schema: TSchema\n ui?: Partial<UiDefinition<TSchema>>\n}\n\nexport function schemaDefinitionToJsonSchema(\n definition: SchemaDefinition<z.ZodObject<any>>\n): ReturnType<typeof zodToJsonSchema> {\n const schema = zodToJsonSchema(definition.schema, { errorMessages: true })\n if (!isObjectSchema(schema) || !definition.ui) {\n return schema\n }\n\n for (const [key, value] of Object.entries(definition.ui ?? {})) {\n const property = schema.properties?.[key] as JsonSchemaPropertyType | undefined\n\n if (!property) {\n continue\n }\n\n if (!!value?.title) {\n property.title = value.title\n }\n\n if (!!value?.examples) {\n property.examples = value.examples\n }\n }\n\n return schema\n}\n", "import { Client, Conversation, Message, User, RuntimeError } from '@botpress/client'\n\nimport {\n botIdHeader,\n botUserIdHeader,\n configurationHeader,\n integrationIdHeader,\n operationHeader,\n webhookIdHeader,\n} from '../const'\nimport { Request, Response, serve } from '../serve'\nimport { IntegrationContext, integrationOperationSchema } from './context'\nimport type {\n ActionPayload,\n CreateConversationPayload,\n CreateUserPayload,\n IntegrationImplementationProps,\n RegisterPayload,\n UnregisterPayload,\n WebhookPayload,\n} from './implementation'\nimport { IntegrationLogger, integrationLogger } from './logger'\n\ntype OperationHandlerProps = {\n integration: IntegrationImplementationProps\n ctx: IntegrationContext\n req: Request\n client: Client\n logger: IntegrationLogger\n}\n\nexport const serveIntegration = async (integration: IntegrationImplementationProps, port = 6853) => {\n await serve(integrationHandler(integration), port)\n}\n\nexport const integrationHandler =\n (integration: IntegrationImplementationProps) =>\n // eslint-disable-next-line complexity\n async (req: Request): Promise<Response | void> => {\n const ctx = extractContext(req.headers)\n const client = new Client({ botId: ctx.botId, integrationId: ctx.integrationId })\n\n const props: OperationHandlerProps = {\n integration,\n ctx,\n req,\n client,\n logger: integrationLogger,\n }\n\n try {\n let response: Response | void\n switch (ctx.operation) {\n case 'webhook_received':\n response = await onWebhook(props)\n break\n case 'register':\n response = await onRegister(props)\n break\n case 'unregister':\n response = await onUnregister(props)\n break\n case 'message_created':\n response = await onMessageCreated(props)\n break\n case 'action_triggered':\n response = await onActionTriggered(props)\n break\n case 'ping':\n response = await onPing(props)\n break\n case 'create_user':\n response = await onCreateUser(props)\n break\n case 'create_conversation':\n response = await onCreateConversation(props)\n break\n default:\n throw new Error(`Unknown operation ${ctx.operation}`)\n }\n return response ? { ...response, status: response.status ?? 200 } : { status: 200 }\n } catch (e) {\n if (e instanceof RuntimeError) {\n return { status: e.code, body: JSON.stringify(e.toJSON()) }\n } else {\n throw e\n }\n }\n }\n\nfunction extractContext(headers: Record<string, string | undefined>): IntegrationContext {\n const botId = headers[botIdHeader]\n const botUserId = headers[botUserIdHeader]\n const integrationId = headers[integrationIdHeader]\n const webhookId = headers[webhookIdHeader]\n const base64Configuration = headers[configurationHeader]\n const operation = integrationOperationSchema.parse(headers[operationHeader])\n\n if (!botId) {\n throw new Error('Missing bot headers')\n }\n\n if (!botUserId) {\n throw new Error('Missing bot user headers')\n }\n\n if (!integrationId) {\n throw new Error('Missing integration headers')\n }\n\n if (!webhookId) {\n throw new Error('Missing webhook headers')\n }\n\n if (!base64Configuration) {\n throw new Error('Missing configuration headers')\n }\n\n if (!operation) {\n throw new Error('Missing operation headers')\n }\n\n return {\n botId,\n botUserId,\n integrationId,\n webhookId,\n operation,\n configuration: base64Configuration ? JSON.parse(Buffer.from(base64Configuration, 'base64').toString('utf-8')) : {},\n }\n}\n\nfunction parseBody<T>(req: Request): T {\n if (!req.body) {\n throw new Error('Missing body')\n }\n\n return JSON.parse(req.body)\n}\n\n// TODO implement the ping operation once the signature is defined\nasync function onPing(_: OperationHandlerProps) {}\n\nasync function onWebhook({ client, ctx, integration, req: incomingRequest, logger }: OperationHandlerProps) {\n const { req } = parseBody<WebhookPayload>(incomingRequest)\n return integration.handler({ client, ctx, req, logger })\n}\n\nasync function onRegister({ client, ctx, integration, req, logger }: OperationHandlerProps) {\n if (!integration.register) {\n return\n }\n\n const { webhookUrl } = parseBody<RegisterPayload>(req)\n\n await integration.register({ client, ctx, webhookUrl, logger })\n}\n\nasync function onUnregister({ client, ctx, integration, req, logger }: OperationHandlerProps) {\n if (!integration.unregister) {\n return\n }\n\n const { webhookUrl } = parseBody<UnregisterPayload>(req)\n\n await integration.unregister({ ctx, webhookUrl, client, logger })\n}\n\nasync function onCreateUser({ client, ctx, integration, req, logger }: OperationHandlerProps) {\n if (!integration.createUser) {\n return\n }\n\n const { tags } = parseBody<CreateUserPayload>(req)\n\n return await integration.createUser({ ctx, client, tags, logger })\n}\n\nasync function onCreateConversation({ client, ctx, integration, req, logger }: OperationHandlerProps) {\n if (!integration.createConversation) {\n return\n }\n\n const { channel, tags } = parseBody<CreateConversationPayload>(req)\n\n return await integration.createConversation({ ctx, client, channel, tags, logger })\n}\n\nexport type MessageCreatedPayload = {\n conversation: Conversation\n user: User\n message: Message\n payload: any\n type: string\n}\n\nasync function onMessageCreated({ ctx, integration, req, client, logger }: OperationHandlerProps) {\n const { conversation, user, type, payload, message } = parseBody<MessageCreatedPayload>(req)\n\n const channelHandler = integration.channels[conversation.channel]\n\n if (!channelHandler) {\n throw new Error(`Channel ${conversation.channel} not found`)\n }\n\n const messageHandler = channelHandler.messages[type]\n\n if (!messageHandler) {\n throw new Error(`Message of type ${type} not found in channel ${conversation.channel}`)\n }\n\n const ack = async ({ tags }: { tags: { [key: string]: string } }) => {\n await client.updateMessage({\n id: message.id,\n tags,\n })\n }\n\n await messageHandler({ ctx, conversation, message, user, type, client, payload, ack, logger })\n}\n\nasync function onActionTriggered({ req, integration, ctx, client, logger }: OperationHandlerProps) {\n const { input, type } = parseBody<ActionPayload<string, any>>(req)\n\n if (!type) {\n throw new Error('Missing action type')\n }\n\n const action = integration.actions[type]\n\n if (!action) {\n throw new Error(`Action ${type} not found`)\n }\n\n const output = await action({ ctx, input, client, type, logger })\n\n return {\n body: JSON.stringify({ output }),\n }\n}\n", "/* eslint-disable no-console */\nimport util from 'util'\n\nconst serializeForBotMessage = (args: Parameters<typeof util.format>) => {\n if (process.env['BP_LOG_FORMAT'] === 'json') {\n return JSON.stringify({ msg: util.format(...args), visible_to_bot_owner: true })\n } else {\n const [format, ...param] = args\n return util.format(`[For Bot Owner] ${format}`, ...param)\n }\n}\n\nexport const integrationLogger = {\n /**\n * Use this function to log messages that will be displayed to the Bot Owner.\n */\n forBot: () => {\n return {\n info: (...args: Parameters<typeof console.info>) => {\n console.info(serializeForBotMessage(args))\n },\n warn: (...args: Parameters<typeof console.warn>) => {\n console.warn(serializeForBotMessage(args))\n },\n error: (...args: Parameters<typeof console.error>) => {\n console.error(serializeForBotMessage(args))\n },\n debug: (...args: Parameters<typeof console.debug>) => {\n console.debug(serializeForBotMessage(args))\n },\n }\n },\n}\n\nexport type IntegrationLogger = typeof integrationLogger\n", "import type { Client, Conversation, Message, User } from '@botpress/client'\nimport type { Server } from 'node:http'\nimport { Request, Response, serve } from '../serve'\nimport type { IntegrationContext } from './context'\nimport { IntegrationLogger } from './logger'\nimport { integrationHandler } from './server'\n\ntype IntegrationProps<Configuration> = {\n ctx: IntegrationContext<Configuration>\n client: Client\n logger: IntegrationLogger\n}\n\nexport type RegisterPayload = {\n webhookUrl: string\n}\n\nexport type UnregisterPayload = {\n webhookUrl: string\n}\n\nexport type WebhookPayload = {\n req: Request\n}\n\nexport type ActionPayload<T, I> = {\n type: T\n input: I\n}\n\nexport type EventPayload<E> = {\n event: E\n}\n\nexport type CreateUserPayload = {\n tags: Tags\n}\n\nexport type CreateConversationPayload = {\n channel: string\n tags: Tags\n}\n\ntype Tags = { [key: string]: string }\n\nexport type AckFunction = (props: { tags: Tags }) => Promise<void>\n\nexport type MessagePayload<P, M, C, U> = {\n payload: P\n conversation: C\n message: M\n user: U\n type: string\n}\n\nexport type ActionDefinitions = {\n [actionType: string]: {\n input: any\n output: any\n }\n}\n\nexport type ChannelDefinitions = {\n [channelName: string]: MessageDefinitions\n}\n\nexport type EventDefinitions = {\n [eventName: string]: any\n}\n\ntype MessageDefinitions = {\n [messageType: string]: any\n}\n\ntype ActionFunctions<Configuration, A extends ActionDefinitions> = {\n [actionType in keyof A]: (\n props: IntegrationProps<Configuration> & ActionPayload<actionType, A[actionType]['input']>\n ) => Promise<A[actionType]['output']>\n}\n\ntype MessageHandlerProps = {\n ack: AckFunction\n}\n\nexport type ChannelFunctions<Configuration, C extends ChannelDefinitions> = {\n [channelName in keyof C]: {\n messages: {\n [messageType in keyof C[channelName]]: (\n props: IntegrationProps<Configuration> &\n MessagePayload<C[channelName][messageType], Message, Conversation, User> &\n MessageHandlerProps\n ) => Promise<void>\n }\n }\n}\n\ntype BaseConfig = any\ntype BaseActions = ActionDefinitions\ntype BaseChannels = ChannelDefinitions\ntype BaseEvents = EventDefinitions\n\nexport type IntegrationImplementationProps<\n Configuration extends any = BaseConfig,\n Actions extends ActionDefinitions = BaseActions,\n Channels extends ChannelDefinitions = BaseChannels,\n _Events extends EventDefinitions = BaseEvents\n> = {\n register: (props: IntegrationProps<Configuration> & RegisterPayload) => Promise<void>\n unregister: (props: IntegrationProps<Configuration> & UnregisterPayload) => Promise<void>\n handler: (props: IntegrationProps<Configuration> & WebhookPayload) => Promise<Response | void>\n createUser?: (props: IntegrationProps<Configuration> & CreateUserPayload) => Promise<Response | void>\n createConversation?: (props: IntegrationProps<Configuration> & CreateConversationPayload) => Promise<Response | void>\n actions: ActionFunctions<Configuration, Actions>\n channels: ChannelFunctions<Configuration, Channels>\n}\n\nexport class IntegrationImplementation<\n Configuration extends any = BaseConfig,\n Actions extends ActionDefinitions = BaseActions,\n Channels extends ChannelDefinitions = BaseChannels,\n Events extends EventDefinitions = BaseEvents\n> {\n public readonly props: IntegrationImplementationProps<Configuration, Actions, Channels, Events>\n public readonly actions: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['actions']\n public readonly channels: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['channels']\n public readonly register: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['register']\n public readonly unregister: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['unregister']\n public readonly createUser: IntegrationImplementationProps<Configuration, Actions, Channels, Events>['createUser']\n public readonly createConversation: IntegrationImplementationProps<\n Configuration,\n Actions,\n Channels,\n Events\n >['createConversation']\n public readonly handler: ReturnType<typeof integrationHandler>\n public readonly start: (port?: number) => Promise<Server>\n\n public constructor(props: IntegrationImplementationProps<Configuration, Actions, Channels, Events>) {\n this.props = props\n this.actions = props.actions\n this.channels = props.channels\n this.register = props.register\n this.unregister = props.unregister\n this.createUser = props.createUser\n this.createConversation = props.createConversation\n this.handler = integrationHandler(props as IntegrationImplementationProps)\n this.start = (port?: number) => serve(this.handler, port)\n }\n}\n", "import { z } from 'zod'\n\nconst NonEmptyString = z.string().min(1)\n\nconst textMessageSchema = z.object({\n text: NonEmptyString,\n})\n\nconst markdownMessageSchema = z.object({\n markdown: NonEmptyString,\n})\n\nconst imageMessageSchema = z.object({\n imageUrl: NonEmptyString,\n})\n\nconst audioMessageSchema = z.object({\n audioUrl: NonEmptyString,\n})\n\nconst videoMessageSchema = z.object({\n videoUrl: NonEmptyString,\n})\n\nconst fileMessageSchema = z.object({\n fileUrl: NonEmptyString,\n title: NonEmptyString.optional(),\n})\n\nconst locationMessageSchema = z.object({\n latitude: z.number(),\n longitude: z.number(),\n address: z.string().optional(),\n title: z.string().optional(),\n})\n\nconst cardSchema = z.object({\n title: NonEmptyString,\n subtitle: NonEmptyString.optional(),\n imageUrl: NonEmptyString.optional(),\n actions: z.array(\n z.object({\n action: z.enum(['postback', 'url', 'say']),\n label: NonEmptyString,\n value: NonEmptyString,\n })\n ),\n})\n\nconst choiceSchema = z.object({\n text: NonEmptyString,\n options: z.array(\n z.object({\n label: NonEmptyString,\n value: NonEmptyString,\n })\n ),\n})\n\nconst carouselSchema = z.object({\n items: z.array(cardSchema),\n})\n\nexport const defaults = {\n text: { schema: textMessageSchema },\n markdown: { schema: markdownMessageSchema },\n image: { schema: imageMessageSchema },\n audio: { schema: audioMessageSchema },\n video: { schema: videoMessageSchema },\n file: { schema: fileMessageSchema },\n location: { schema: locationMessageSchema },\n carousel: { schema: carouselSchema },\n card: { schema: cardSchema },\n dropdown: { schema: choiceSchema },\n choice: { schema: choiceSchema },\n} as const // should use satisfies operator but this works for older versions of TS\n"],
5
- "mappings": "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",
6
- "names": ["src_exports", "__export", "Bot", "IntegrationImplementation", "IntegrationDefinition", "botIdHeader", "botUserIdHeader", "clients", "configurationHeader", "integrationIdHeader", "message_exports", "operationHeader", "serve", "typeHeader", "webhookIdHeader", "__toCommonJS", "import_axios", "botIdHeader", "botUserIdHeader", "integrationIdHeader", "webhookIdHeader", "configurationHeader", "operationHeader", "typeHeader", "BotClient", "axiosInstance", "axiosGlobal", "props", "request", "formatBotHeaders", "ctx", "typeHeader", "botIdHeader", "operationHeader", "configurationHeader", "operation", "url", "data", "axios", "import_node_http", "log", "serve", "handler", "port", "callback", "defaultCallback", "server", "req", "res", "request", "mapIncomingMessageToRequest", "response", "e", "log", "incoming", "body", "readBody", "headers", "i", "key", "value", "url", "trimPrefix", "prefix", "resolve", "reject", "chunk", "import_client", "import_zod", "botOperationSchema", "createBotHandler", "botState", "req", "ctx", "extractContext", "log", "client", "props", "onEventReceived", "onRegister", "onUnregister", "onPing", "headers", "botId", "botIdHeader", "base64Configuration", "configurationHeader", "type", "typeHeader", "operation", "botOperationSchema", "operationHeader", "body", "parseBody", "handler", "_", "Bot", "def", "handler", "createBotHandler", "port", "serve", "import_client", "import_axios", "import_client", "import_zod", "e", "runtimeErrorSchema", "IntegrationClient", "axiosInstance", "axiosGlobal", "props", "request", "webhookRequest", "formatIntegrationHeaders", "ctx", "botIdHeader", "operationHeader", "botUserIdHeader", "integrationIdHeader", "webhookIdHeader", "configurationHeader", "operation", "url", "data", "axios", "e", "runtimeErrorCode", "result", "runtimeErrorSchema", "import_zod", "integrationOperationSchema", "import_radash", "import_zod", "import_zod_to_json_schema", "isObjectSchema", "schema", "schemaDefinitionToJsonSchema", "definition", "zodToJsonSchema", "key", "value", "property", "nonEmptyDict", "v", "r", "obj", "schemaSchema", "configurationDefinitionSchema", "eventDefinitionSchema", "actionDefinitionSchema", "messageDefinitionSchema", "tagDefinitionSchema", "channelDefinitionSchema", "stateDefinitionSchema", "PUBLIC_VERSION", "PRIVATE_VERSION", "integrationDefinitionSchema", "formatIntegrationDefinition", "definition", "schemaDefinitionToJsonSchema", "event", "action", "channel", "message", "state", "IntegrationDefinition", "props", "integrationDefinitionInput", "parsed", "name", "version", "icon", "readme", "title", "description", "configuration", "events", "actions", "channels", "states", "user", "secrets", "import_client", "import_util", "serializeForBotMessage", "args", "util", "format", "param", "integrationLogger", "integrationHandler", "integration", "req", "ctx", "extractContext", "client", "props", "integrationLogger", "response", "onWebhook", "onRegister", "onUnregister", "onMessageCreated", "onActionTriggered", "onPing", "onCreateUser", "onCreateConversation", "e", "headers", "botId", "botIdHeader", "botUserId", "botUserIdHeader", "integrationId", "integrationIdHeader", "webhookId", "webhookIdHeader", "base64Configuration", "configurationHeader", "operation", "integrationOperationSchema", "operationHeader", "parseBody", "_", "incomingRequest", "logger", "webhookUrl", "tags", "channel", "conversation", "user", "type", "payload", "message", "channelHandler", "messageHandler", "input", "action", "output", "IntegrationImplementation", "props", "integrationHandler", "port", "serve", "message_exports", "__export", "defaults", "import_zod", "NonEmptyString", "textMessageSchema", "markdownMessageSchema", "imageMessageSchema", "audioMessageSchema", "videoMessageSchema", "fileMessageSchema", "locationMessageSchema", "cardSchema", "choiceSchema", "carouselSchema", "clients", "IntegrationClient", "BotClient"]
3
+ "sources": ["../src/index.ts", "../src/message.ts", "../src/const.ts", "../src/serve.ts", "../src/log.ts", "../src/integration/context.ts", "../src/integration/definition.ts", "../src/integration/server.ts", "../src/integration/client/index.ts", "../src/integration/logger.ts", "../src/integration/implementation.ts", "../src/bot/server.ts", "../src/bot/client/index.ts", "../src/bot/context.ts", "../src/bot/implementation.ts"],
4
+ "sourcesContent": ["export * as messages from './message'\nexport * from './const'\nexport * from './serve'\n\nexport {\n IntegrationDefinition,\n IntegrationDefinitionProps,\n IntegrationImplementation as Integration,\n IntegrationImplementationProps as IntegrationProps,\n IntegrationContext,\n IntegrationSpecificClient,\n} from './integration'\n\nexport { Bot, BotProps, BotContext, BotSpecificClient, IntegrationInstance } from './bot'\n\n/**\n * @deprecated Infer type of integration message handlers instead\n */\nexport type AckFunction = (props: { tags: Record<string, string> }) => Promise<void>\n", "import { z } from 'zod'\n\nconst NonEmptyString = z.string().min(1)\n\nconst textMessageSchema = z.object({\n text: NonEmptyString,\n})\n\nconst markdownMessageSchema = z.object({\n markdown: NonEmptyString,\n})\n\nconst imageMessageSchema = z.object({\n imageUrl: NonEmptyString,\n})\n\nconst audioMessageSchema = z.object({\n audioUrl: NonEmptyString,\n})\n\nconst videoMessageSchema = z.object({\n videoUrl: NonEmptyString,\n})\n\nconst fileMessageSchema = z.object({\n fileUrl: NonEmptyString,\n title: NonEmptyString.optional(),\n})\n\nconst locationMessageSchema = z.object({\n latitude: z.number(),\n longitude: z.number(),\n address: z.string().optional(),\n title: z.string().optional(),\n})\n\nconst cardSchema = z.object({\n title: NonEmptyString,\n subtitle: NonEmptyString.optional(),\n imageUrl: NonEmptyString.optional(),\n actions: z.array(\n z.object({\n action: z.enum(['postback', 'url', 'say']),\n label: NonEmptyString,\n value: NonEmptyString,\n })\n ),\n})\n\nconst choiceSchema = z.object({\n text: NonEmptyString,\n options: z.array(\n z.object({\n label: NonEmptyString,\n value: NonEmptyString,\n })\n ),\n})\n\nconst carouselSchema = z.object({\n items: z.array(cardSchema),\n})\n\nexport const defaults = {\n text: { schema: textMessageSchema },\n markdown: { schema: markdownMessageSchema },\n image: { schema: imageMessageSchema },\n audio: { schema: audioMessageSchema },\n video: { schema: videoMessageSchema },\n file: { schema: fileMessageSchema },\n location: { schema: locationMessageSchema },\n carousel: { schema: carouselSchema },\n card: { schema: cardSchema },\n dropdown: { schema: choiceSchema },\n choice: { schema: choiceSchema },\n} as const // should use satisfies operator but this works for older versions of TS\n", "export const botIdHeader = 'x-bot-id'\nexport const botUserIdHeader = 'x-bot-user-id'\nexport const integrationIdHeader = 'x-integration-id'\nexport const webhookIdHeader = 'x-webhook-id'\n\nexport const configurationHeader = 'x-bp-configuration'\nexport const operationHeader = 'x-bp-operation'\nexport const typeHeader = 'x-bp-type'\n", "import { createServer, IncomingMessage, Server } from 'node:http'\nimport { log } from './log'\n\nexport type Request = {\n body?: string\n path: string\n query: string\n method: string\n headers: { [key: string]: string | undefined }\n}\n\nexport type Response = {\n body?: string\n headers?: { [key: string]: string }\n status?: number\n}\n\nexport type Handler = (req: Request) => Promise<Response | void>\n\nexport function parseBody<T>(req: Request): T {\n if (!req.body) {\n throw new Error('Missing body')\n }\n return JSON.parse(req.body)\n}\n\nexport async function serve(\n handler: Handler,\n port: number = 8072,\n callback: (port: number) => void = defaultCallback\n): Promise<Server> {\n /* eslint-disable @typescript-eslint/no-misused-promises */\n const server = createServer(async (req, res) => {\n try {\n const request = await mapIncomingMessageToRequest(req)\n const response = await handler(request)\n res.writeHead(response?.status ?? 200, response?.headers ?? {}).end(response?.body ?? '{}')\n } catch (e: any) {\n log.error('Error while handling request', { error: e?.message ?? 'Internal error occured' })\n res.writeHead(500).end(JSON.stringify({ error: e?.message ?? 'Internal error occured' }))\n }\n })\n\n server.listen(port, () => callback(port))\n return server\n}\n\nasync function mapIncomingMessageToRequest(incoming: IncomingMessage): Promise<Request> {\n const body = await readBody(incoming)\n const headers = {} as Request['headers']\n\n for (let i = 0; i < incoming.rawHeaders.length; i += 2) {\n const key = incoming.rawHeaders[i]!.toLowerCase()\n const value = incoming.rawHeaders[i + 1]!\n headers[key] = value\n }\n\n const url = new URL(\n incoming.url ?? '',\n incoming.headers.host ? `http://${incoming.headers.host}` : 'http://botpress.cloud'\n )\n\n return {\n body,\n path: url.pathname,\n query: trimPrefix(url.search, '?'),\n headers,\n method: incoming.method?.toUpperCase() ?? 'GET',\n }\n}\n\nfunction trimPrefix(value: string, prefix: string) {\n return value.indexOf(prefix) === 0 ? value.slice(prefix.length) : value\n}\n\nasync function readBody(incoming: IncomingMessage) {\n return new Promise<string | undefined>((resolve, reject) => {\n if (incoming.method !== 'POST' && incoming.method !== 'PUT' && incoming.method !== 'PATCH') {\n return resolve(undefined)\n }\n\n let body = ''\n\n incoming.on('data', (chunk) => (body += chunk.toString()))\n incoming.on('error', (e) => reject(e))\n incoming.on('end', () => resolve(body))\n })\n}\n\nfunction defaultCallback(port: number) {\n log.info(`Listening on port ${port}`)\n}\n", "export type Logger = {\n debug(message: string, metadata?: any): void\n info(message: string, metadata?: any): void\n warn(message: string, metadata?: any): void\n error(message: string, metadata?: any): void\n}\nexport const log: Logger = console\n", "import { z } from 'zod'\nimport {\n botIdHeader,\n botUserIdHeader,\n configurationHeader,\n integrationIdHeader,\n operationHeader,\n webhookIdHeader,\n} from '../const'\n\nexport const integrationOperationSchema = z.enum([\n 'webhook_received',\n 'message_created',\n 'action_triggered',\n 'register',\n 'unregister',\n 'ping',\n 'create_user',\n 'create_conversation',\n])\n\nexport type IntegrationOperation = z.infer<typeof integrationOperationSchema>\n\nexport type IntegrationContext<Configuration = any> = {\n botId: string\n botUserId: string\n integrationId: string\n webhookId: string\n operation: IntegrationOperation\n configuration: Configuration\n}\n\nexport const extractContext = (headers: Record<string, string | undefined>): IntegrationContext => {\n const botId = headers[botIdHeader]\n const botUserId = headers[botUserIdHeader]\n const integrationId = headers[integrationIdHeader]\n const webhookId = headers[webhookIdHeader]\n const base64Configuration = headers[configurationHeader]\n const operation = integrationOperationSchema.parse(headers[operationHeader])\n\n if (!botId) {\n throw new Error('Missing bot headers')\n }\n\n if (!botUserId) {\n throw new Error('Missing bot user headers')\n }\n\n if (!integrationId) {\n throw new Error('Missing integration headers')\n }\n\n if (!webhookId) {\n throw new Error('Missing webhook headers')\n }\n\n if (!base64Configuration) {\n throw new Error('Missing configuration headers')\n }\n\n if (!operation) {\n throw new Error('Missing operation headers')\n }\n\n return {\n botId,\n botUserId,\n integrationId,\n webhookId,\n operation,\n configuration: base64Configuration ? JSON.parse(Buffer.from(base64Configuration, 'base64').toString('utf-8')) : {},\n }\n}\n", "import { SchemaDefinition } from '../schema'\nimport { AnyZodObject } from '../type-utils'\n\ntype BaseConfig = AnyZodObject\ntype BaseEvents = Record<string, AnyZodObject>\ntype BaseActions = Record<string, Record<'input' | 'output', AnyZodObject>>\ntype BaseChannels = Record<string, Record<string, AnyZodObject>>\ntype BaseStates = Record<string, AnyZodObject>\n\ntype TagDefinition = {\n title?: string\n description?: string\n}\n\ntype ConfigurationDefinition<TConfig extends BaseConfig> = SchemaDefinition<TConfig>\n\ntype EventDefinition<TEvent extends BaseEvents[string]> = SchemaDefinition<TEvent> & {\n title?: string\n description?: string\n}\n\ntype ChannelDefinition<TChannel extends BaseChannels[string]> = {\n title?: string\n description?: string\n messages: {\n [K in keyof TChannel]: SchemaDefinition<TChannel[K]>\n }\n message?: {\n tags?: Record<string, TagDefinition>\n }\n conversation?: Partial<{\n tags: Record<string, TagDefinition>\n creation: {\n enabled: boolean\n requiredTags: string[]\n }\n }>\n}\n\ntype ActionDefinition<TAction extends BaseActions[string]> = {\n title?: string\n description?: string\n input: SchemaDefinition<TAction['input']>\n output: SchemaDefinition<TAction['output']>\n}\n\ntype StateDefinition<TState extends BaseStates[string]> = SchemaDefinition<TState> & {\n type: 'integration' | 'conversation' | 'user'\n}\n\ntype UserDefinition = Partial<{\n tags: Record<string, TagDefinition>\n creation: {\n enabled: boolean\n requiredTags: string[]\n }\n}>\n\nexport type IntegrationDefinitionProps<\n TConfig extends BaseConfig = BaseConfig,\n TEvents extends BaseEvents = BaseEvents,\n TActions extends BaseActions = BaseActions,\n TChannels extends BaseChannels = BaseChannels,\n TStates extends BaseStates = BaseStates\n> = {\n name: string\n version: '0.2.0' | '0.0.1' // TODO: allow any version\n\n title?: string\n description?: string\n icon?: string\n readme?: string\n\n configuration?: ConfigurationDefinition<TConfig>\n events?: { [K in keyof TEvents]: EventDefinition<TEvents[K]> }\n\n actions?: {\n [K in keyof TActions]: ActionDefinition<TActions[K]>\n }\n\n channels?: {\n [K in keyof TChannels]: ChannelDefinition<TChannels[K]>\n }\n\n states?: {\n [K in keyof TStates]: StateDefinition<TStates[K]>\n }\n\n user?: UserDefinition\n\n secrets?: string[]\n}\n\nexport class IntegrationDefinition<\n TConfig extends BaseConfig = BaseConfig,\n TEvents extends BaseEvents = BaseEvents,\n TActions extends BaseActions = BaseActions,\n TChannels extends BaseChannels = BaseChannels,\n TStates extends BaseStates = BaseStates\n> {\n public readonly name: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['name']\n public readonly version: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['version']\n public readonly title: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['title']\n public readonly description: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['description']\n public readonly icon: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['icon']\n public readonly readme: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['readme']\n public readonly configuration: IntegrationDefinitionProps<\n TConfig,\n TEvents,\n TActions,\n TChannels,\n TStates\n >['configuration']\n public readonly events: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['events']\n public readonly actions: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['actions']\n public readonly channels: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['channels']\n public readonly states: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['states']\n public readonly user: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['user']\n public readonly secrets: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>['secrets']\n\n public constructor(props: IntegrationDefinitionProps<TConfig, TEvents, TActions, TChannels, TStates>) {\n const {\n name,\n version,\n icon,\n readme,\n title,\n description,\n configuration,\n events,\n actions,\n channels,\n states,\n user,\n secrets,\n } = props\n this.name = name\n this.version = version\n this.icon = icon\n this.readme = readme\n this.title = title\n this.description = description\n this.configuration = configuration\n this.events = events\n this.actions = actions\n this.channels = channels\n this.states = states\n this.user = user\n this.secrets = secrets\n }\n}\n", "import { Client, RuntimeError, type Conversation, type Message, type User } from '@botpress/client'\nimport { Request, Response, parseBody } from '../serve'\nimport { Cast, Merge } from '../type-utils'\nimport { IntegrationSpecificClient } from './client'\nimport { ToTags } from './client/types'\nimport { extractContext, type IntegrationContext } from './context'\nimport { BaseIntegration } from './generic'\nimport { IntegrationLogger, integrationLogger } from './logger'\n\ntype PrefixConfig<TIntegration extends BaseIntegration> = { enforcePrefix: TIntegration['name'] }\n\ntype CommonArgs<TIntegration extends BaseIntegration> = {\n ctx: IntegrationContext<TIntegration['configuration']>\n client: IntegrationSpecificClient<TIntegration>\n logger: IntegrationLogger\n}\n\ntype RegisterPayload = { webhookUrl: string }\ntype RegisterArgs<TIntegration extends BaseIntegration> = CommonArgs<TIntegration> & RegisterPayload\n\ntype UnregisterPayload = { webhookUrl: string }\ntype UnregisterArgs<TIntegration extends BaseIntegration> = CommonArgs<TIntegration> & UnregisterPayload\n\ntype WebhookPayload = { req: Request }\ntype WebhookArgs<TIntegration extends BaseIntegration> = CommonArgs<TIntegration> & WebhookPayload\n\ntype ActionPayload<T extends string, I> = { type: T; input: I }\ntype ActionArgs<TIntegration extends BaseIntegration, T extends string, I> = CommonArgs<TIntegration> &\n ActionPayload<T, I>\n\ntype CreateUserPayload<TIntegration extends BaseIntegration> = {\n tags: ToTags<keyof TIntegration['user']['tags'], PrefixConfig<TIntegration>>\n}\ntype CreateUserArgs<TIntegration extends BaseIntegration> = CommonArgs<TIntegration> & CreateUserPayload<TIntegration>\n\ntype CreateConversationPayload<\n TIntegration extends BaseIntegration,\n TChannel extends keyof TIntegration['channels'] = keyof TIntegration['channels']\n> = {\n channel: TChannel\n tags: ToTags<keyof TIntegration['channels'][TChannel]['conversation']['tags'], PrefixConfig<TIntegration>>\n}\ntype CreateConversationArgs<TIntegration extends BaseIntegration> = CommonArgs<TIntegration> &\n CreateConversationPayload<TIntegration>\n\ntype MessagePayload<\n TIntegration extends BaseIntegration,\n TChannel extends keyof TIntegration['channels'],\n TMessage extends keyof TIntegration['channels'][TChannel]['messages']\n> = {\n type: TMessage\n payload: TIntegration['channels'][TChannel]['messages'][TMessage]\n conversation: Merge<\n Conversation,\n {\n tags: ToTags<keyof TIntegration['channels'][TChannel]['conversation']['tags'], PrefixConfig<TIntegration>>\n }\n >\n message: Merge<\n Message,\n {\n tags: ToTags<keyof TIntegration['channels'][TChannel]['message']['tags'], PrefixConfig<TIntegration>>\n }\n >\n user: Merge<\n User,\n {\n tags: ToTags<keyof TIntegration['user']['tags'], PrefixConfig<TIntegration>>\n }\n >\n}\ntype MessageArgs<\n TIntegration extends BaseIntegration,\n TChannel extends keyof TIntegration['channels'],\n TMessage extends keyof TIntegration['channels'][TChannel]['messages']\n> = CommonArgs<TIntegration> &\n MessagePayload<TIntegration, TChannel, TMessage> & {\n ack: (props: {\n tags: ToTags<keyof TIntegration['channels'][TChannel]['message']['tags'], PrefixConfig<TIntegration>>\n }) => Promise<void>\n }\n\nexport type RegisterFunction<TIntegration extends BaseIntegration> = (\n props: RegisterArgs<TIntegration>\n) => Promise<void>\n\nexport type UnregisterFunction<TIntegration extends BaseIntegration> = (\n props: UnregisterArgs<TIntegration>\n) => Promise<void>\n\nexport type WebhookFunction<TIntegration extends BaseIntegration> = (\n props: WebhookArgs<TIntegration>\n) => Promise<Response | void>\n\nexport type ActionFunctions<TIntegration extends BaseIntegration> = {\n [ActionType in keyof TIntegration['actions']]: (\n props: ActionArgs<TIntegration, Cast<ActionType, string>, TIntegration['actions'][ActionType]['input']>\n ) => Promise<TIntegration['actions'][ActionType]['output']>\n}\n\nexport type CreateUserFunction<TIntegration extends BaseIntegration> = (\n props: CreateUserArgs<TIntegration>\n) => Promise<Response | void>\n\nexport type CreateConversationFunction<TIntegration extends BaseIntegration> = (\n props: CreateConversationArgs<TIntegration>\n) => Promise<Response | void>\n\nexport type ChannelFunctions<TIntegration extends BaseIntegration> = {\n [ChannelName in keyof TIntegration['channels']]: {\n messages: {\n [MessageType in keyof TIntegration['channels'][ChannelName]['messages']]: (\n props: CommonArgs<TIntegration> & MessageArgs<TIntegration, ChannelName, MessageType>\n ) => Promise<void>\n }\n }\n}\n\nexport type IntegrationHandlers<TIntegration extends BaseIntegration> = {\n register: RegisterFunction<TIntegration>\n unregister: UnregisterFunction<TIntegration>\n webhook: WebhookFunction<TIntegration>\n createUser?: CreateUserFunction<TIntegration>\n createConversation?: CreateConversationFunction<TIntegration>\n actions: ActionFunctions<TIntegration>\n channels: ChannelFunctions<TIntegration>\n}\n\ntype ServerProps<TIntegration extends BaseIntegration> = CommonArgs<TIntegration> & {\n req: Request\n instance: IntegrationHandlers<TIntegration>\n}\n\nexport const integrationHandler =\n <TIntegration extends BaseIntegration>(instance: IntegrationHandlers<TIntegration>) =>\n async (req: Request): Promise<Response | void> => {\n const ctx = extractContext(req.headers)\n\n const client = new IntegrationSpecificClient<TIntegration>(\n new Client({ botId: ctx.botId, integrationId: ctx.integrationId })\n )\n\n const props = {\n ctx,\n req,\n client,\n logger: integrationLogger,\n instance,\n }\n\n try {\n let response: Response | void\n switch (ctx.operation) {\n case 'webhook_received':\n response = await onWebhook<TIntegration>(props)\n break\n case 'register':\n response = await onRegister<TIntegration>(props)\n break\n case 'unregister':\n response = await onUnregister<TIntegration>(props)\n break\n case 'message_created':\n response = await onMessageCreated<TIntegration>(props)\n break\n case 'action_triggered':\n response = await onActionTriggered<TIntegration>(props)\n break\n case 'ping':\n response = await onPing<TIntegration>(props)\n break\n case 'create_user':\n response = await onCreateUser<TIntegration>(props)\n break\n case 'create_conversation':\n response = await onCreateConversation<TIntegration>(props)\n break\n default:\n throw new Error(`Unknown operation ${ctx.operation}`)\n }\n return response ? { ...response, status: response.status ?? 200 } : { status: 200 }\n } catch (e) {\n if (e instanceof RuntimeError) {\n return { status: e.code, body: JSON.stringify(e.toJSON()) }\n } else {\n throw e\n }\n }\n }\n\nconst onPing = async <TIntegration extends BaseIntegration>(_: ServerProps<TIntegration>) => {}\n\nconst onWebhook = async <TIntegration extends BaseIntegration>({\n client,\n ctx,\n req: incomingRequest,\n logger,\n instance,\n}: ServerProps<TIntegration>) => {\n const { req } = parseBody<WebhookPayload>(incomingRequest)\n return instance.webhook({ client, ctx, req, logger })\n}\n\nconst onRegister = async <TIntegration extends BaseIntegration>({\n client,\n ctx,\n req,\n logger,\n instance,\n}: ServerProps<TIntegration>) => {\n if (!instance.register) {\n return\n }\n const { webhookUrl } = parseBody<RegisterPayload>(req)\n await instance.register({ client, ctx, webhookUrl, logger })\n}\n\nconst onUnregister = async <TIntegration extends BaseIntegration>({\n client,\n ctx,\n req,\n logger,\n instance,\n}: ServerProps<TIntegration>) => {\n if (!instance.unregister) {\n return\n }\n const { webhookUrl } = parseBody<UnregisterPayload>(req)\n await instance.unregister({ ctx, webhookUrl, client, logger })\n}\n\nconst onCreateUser = async <TIntegration extends BaseIntegration>({\n client,\n ctx,\n req,\n logger,\n instance,\n}: ServerProps<TIntegration>) => {\n if (!instance.createUser) {\n return\n }\n const { tags } = parseBody<CreateUserPayload<TIntegration>>(req)\n return await instance.createUser({ ctx, client, tags, logger })\n}\n\nconst onCreateConversation = async <TIntegration extends BaseIntegration>({\n client,\n ctx,\n req,\n logger,\n instance,\n}: ServerProps<TIntegration>) => {\n if (!instance.createConversation) {\n return\n }\n const { channel, tags } = parseBody<CreateConversationPayload<TIntegration>>(req)\n return await instance.createConversation({ ctx, client, channel, tags, logger })\n}\n\nconst onMessageCreated = async <TIntegration extends BaseIntegration>({\n ctx,\n req,\n client,\n logger,\n instance,\n}: ServerProps<TIntegration>) => {\n const { conversation, user, type, payload, message } = parseBody<MessagePayload<TIntegration, string, string>>(req)\n\n const channelHandler = instance.channels[conversation.channel]\n\n if (!channelHandler) {\n throw new Error(`Channel ${conversation.channel} not found`)\n }\n\n const messageHandler = channelHandler.messages[type]\n\n if (!messageHandler) {\n throw new Error(`Message of type ${type} not found in channel ${conversation.channel}`)\n }\n\n const ack = async ({ tags }: { tags: Record<string, string> }) => {\n await client.updateMessage({\n id: message.id,\n tags: tags as any, // TODO: fix this\n })\n }\n\n await messageHandler({ ctx, conversation, message, user, type, client, payload, ack, logger })\n}\n\nconst onActionTriggered = async <TIntegration extends BaseIntegration>({\n req,\n ctx,\n client,\n logger,\n instance,\n}: ServerProps<TIntegration>) => {\n const { input, type } = parseBody<ActionPayload<string, any>>(req)\n\n if (!type) {\n throw new Error('Missing action type')\n }\n\n const action = instance.actions[type]\n\n if (!action) {\n throw new Error(`Action ${type} not found`)\n }\n\n const output = await action({ ctx, input, client, type, logger })\n\n return {\n body: JSON.stringify({ output }),\n }\n}\n", "import { Client } from '@botpress/client'\nimport { BaseIntegration } from '../generic'\nimport * as routes from './routes'\n\n/**\n * Just like the regular botpress client, but typed with the integration's properties.\n */\nexport class IntegrationSpecificClient<TIntegration extends BaseIntegration> {\n public constructor(private readonly client: Client) {}\n\n public createConversation: routes.CreateConversation<TIntegration> = (x) => this.client.createConversation(x)\n public getConversation: routes.GetConversation<TIntegration> = (x) => this.client.getConversation(x)\n public listConversations: routes.ListConversations<TIntegration> = (x) => this.client.listConversations(x)\n public getOrCreateConversation: routes.GetOrCreateConversation<TIntegration> = (x) =>\n this.client.getOrCreateConversation(x)\n public updateConversation: routes.UpdateConversation<TIntegration> = (x) => this.client.updateConversation(x)\n public deleteConversation: routes.DeleteConversation<TIntegration> = (x) => this.client.deleteConversation(x)\n\n public createEvent: routes.CreateEvent<TIntegration> = (x) => this.client.createEvent(x)\n public getEvent: routes.GetEvent<TIntegration> = (x) => this.client.getEvent(x)\n public listEvents: routes.ListEvents<TIntegration> = (x) => this.client.listEvents(x)\n\n public createMessage: routes.CreateMessage<TIntegration> = (x) => this.client.createMessage(x)\n public getOrCreateMessage: routes.GetOrCreateMessage<TIntegration> = (x) => this.client.getOrCreateMessage(x)\n public getMessage: routes.GetMessage<TIntegration> = (x) => this.client.getMessage(x)\n public updateMessage: routes.UpdateMessage<TIntegration> = (x) => this.client.updateMessage(x)\n public listMessages: routes.ListMessages<TIntegration> = (x) => this.client.listMessages(x)\n public deleteMessage: routes.DeleteMessage<TIntegration> = (x) => this.client.deleteMessage(x)\n\n public createUser: routes.CreateUser<TIntegration> = (x) => this.client.createUser(x)\n public getUser: routes.GetUser<TIntegration> = (x) => this.client.getUser(x)\n public listUsers: routes.ListUsers<TIntegration> = (x) => this.client.listUsers(x)\n public getOrCreateUser: routes.GetOrCreateUser<TIntegration> = (x) => this.client.getOrCreateUser(x)\n public updateUser: routes.UpdateUser<TIntegration> = (x) => this.client.updateUser(x)\n public deleteUser: routes.DeleteUser<TIntegration> = (x) => this.client.deleteUser(x)\n\n public getState: routes.GetState<TIntegration> = (x) =>\n this.client.getState(x).then((y) => ({ state: { ...y.state, payload: y.state.payload as any } }))\n public setState: routes.SetState<TIntegration> = (x) =>\n this.client.setState(x).then((y) => ({ state: { ...y.state, payload: y.state.payload as any } }))\n public patchState: routes.PatchState<TIntegration> = (x) =>\n this.client.patchState(x).then((y) => ({ state: { ...y.state, payload: y.state.payload as any } }))\n\n public configureIntegration: routes.ConfigureIntegration<TIntegration> = (x) => this.client.configureIntegration(x)\n}\n", "/* eslint-disable no-console */\nimport util from 'util'\n\nconst serializeForBotMessage = (args: Parameters<typeof util.format>) => {\n if (process.env['BP_LOG_FORMAT'] === 'json') {\n return JSON.stringify({ msg: util.format(...args), visible_to_bot_owner: true })\n } else {\n const [format, ...param] = args\n return util.format(`[For Bot Owner] ${format}`, ...param)\n }\n}\n\nexport const integrationLogger = {\n /**\n * Use this function to log messages that will be displayed to the Bot Owner.\n */\n forBot: () => {\n return {\n info: (...args: Parameters<typeof console.info>) => {\n console.info(serializeForBotMessage(args))\n },\n warn: (...args: Parameters<typeof console.warn>) => {\n console.warn(serializeForBotMessage(args))\n },\n error: (...args: Parameters<typeof console.error>) => {\n console.error(serializeForBotMessage(args))\n },\n debug: (...args: Parameters<typeof console.debug>) => {\n console.debug(serializeForBotMessage(args))\n },\n }\n },\n}\n\nexport type IntegrationLogger = typeof integrationLogger\n", "import type { Server } from 'node:http'\nimport { serve } from '../serve'\nimport { BaseIntegration } from './generic'\nimport {\n RegisterFunction,\n UnregisterFunction,\n WebhookFunction,\n CreateUserFunction,\n CreateConversationFunction,\n ActionFunctions,\n ChannelFunctions,\n integrationHandler,\n} from './server'\n\nexport type IntegrationImplementationProps<TIntegration extends BaseIntegration = BaseIntegration> = {\n register: RegisterFunction<TIntegration>\n unregister: UnregisterFunction<TIntegration>\n handler: WebhookFunction<TIntegration>\n createUser?: CreateUserFunction<TIntegration>\n createConversation?: CreateConversationFunction<TIntegration>\n actions: ActionFunctions<TIntegration>\n channels: ChannelFunctions<TIntegration>\n}\n\nexport class IntegrationImplementation<TIntegration extends BaseIntegration = BaseIntegration> {\n public readonly props: IntegrationImplementationProps<TIntegration>\n public readonly actions: IntegrationImplementationProps<TIntegration>['actions']\n public readonly channels: IntegrationImplementationProps<TIntegration>['channels']\n public readonly register: IntegrationImplementationProps<TIntegration>['register']\n public readonly unregister: IntegrationImplementationProps<TIntegration>['unregister']\n public readonly createUser: IntegrationImplementationProps<TIntegration>['createUser']\n public readonly createConversation: IntegrationImplementationProps<TIntegration>['createConversation']\n public readonly webhook: IntegrationImplementationProps<TIntegration>['handler']\n\n public constructor(props: IntegrationImplementationProps<TIntegration>) {\n this.props = props\n this.actions = props.actions\n this.channels = props.channels\n this.register = props.register\n this.unregister = props.unregister\n this.createUser = props.createUser\n this.createConversation = props.createConversation\n this.webhook = props.handler\n }\n\n public readonly handler = integrationHandler<TIntegration>(this)\n public readonly start = (port?: number): Promise<Server> => serve(this.handler, port)\n}\n", "import * as bpclient from '@botpress/client'\nimport { log } from '../log'\nimport { Request, Response, parseBody } from '../serve'\nimport { Merge } from '../type-utils'\nimport { BotSpecificClient } from './client'\nimport { EnumerateEvents } from './client/types'\nimport { BotContext, extractContext } from './context'\nimport { BaseBot } from './generic'\n\ntype CommonArgs<TBot extends BaseBot> = {\n ctx: BotContext\n client: BotSpecificClient<TBot>\n}\n\ntype MessagePayload = {\n user: bpclient.User\n conversation: bpclient.Conversation\n message: bpclient.Message\n event: bpclient.Event\n}\ntype MessageArgs<TBot extends BaseBot> = CommonArgs<TBot> & MessagePayload\n\ntype EventPayload<TBot extends BaseBot> = {\n event: {\n [K in keyof EnumerateEvents<TBot>]: Merge<bpclient.Event, { type: K; payload: EnumerateEvents<TBot>[K] }>\n }[keyof EnumerateEvents<TBot>]\n}\ntype EventArgs<TBot extends BaseBot> = CommonArgs<TBot> & EventPayload<TBot>\n\ntype StateExpiredPayload = { state: bpclient.State }\ntype StateExpiredArgs<TBot extends BaseBot> = CommonArgs<TBot> & StateExpiredPayload\n\nexport type MessageHandler<TBot extends BaseBot> = (args: MessageArgs<TBot>) => Promise<void>\n\nexport type EventHandler<TBot extends BaseBot> = (args: EventArgs<TBot>) => Promise<void>\n\nexport type StateExpiredHandler<TBot extends BaseBot> = (args: StateExpiredArgs<TBot>) => Promise<void>\n\nexport type BotHandlers<TBot extends BaseBot> = {\n messageHandlers: MessageHandler<TBot>[]\n eventHandlers: EventHandler<TBot>[]\n stateExpiredHandlers: StateExpiredHandler<TBot>[]\n}\n\ntype ServerProps<TBot extends BaseBot> = CommonArgs<TBot> & {\n req: Request\n instance: BotHandlers<TBot>\n}\n\nexport const botHandler =\n <TBot extends BaseBot>(instance: BotHandlers<TBot>) =>\n async (req: Request): Promise<Response | void> => {\n const ctx = extractContext(req.headers)\n\n if (ctx.operation !== 'ping') {\n log.info(`Received ${ctx.operation} operation for bot ${ctx.botId} of type ${ctx.type}`)\n }\n\n const client = new BotSpecificClient(new bpclient.Client({ botId: ctx.botId }))\n\n const props = {\n req,\n ctx,\n client,\n instance,\n }\n\n switch (ctx.operation) {\n case 'event_received':\n await onEventReceived<TBot>(props)\n break\n case 'register':\n await onRegister<TBot>(props)\n break\n case 'unregister':\n await onUnregister<TBot>(props)\n break\n case 'ping':\n await onPing<TBot>(props)\n break\n default:\n throw new Error(`Unknown operation ${ctx.operation}`)\n }\n\n return { status: 200 }\n }\n\nconst onPing = async <TBot extends BaseBot>(_: ServerProps<TBot>) => {}\nconst onRegister = async <TBot extends BaseBot>(_: ServerProps<TBot>) => {}\nconst onUnregister = async <TBot extends BaseBot>(_: ServerProps<TBot>) => {}\nconst onEventReceived = async <TBot extends BaseBot>({ ctx, req, client, instance }: ServerProps<TBot>) => {\n log.debug(`Received event ${ctx.type}`)\n\n const body = parseBody<EventPayload<TBot>>(req)\n const event = body.event as bpclient.Event\n\n switch (ctx.type) {\n case 'message_created':\n const messagePayload: MessagePayload = {\n user: event.payload.user,\n conversation: event.payload.conversation,\n message: event.payload.message,\n event,\n }\n\n await Promise.all(\n instance.messageHandlers.map((handler) =>\n handler({\n client,\n ctx,\n ...messagePayload,\n })\n )\n )\n break\n case 'state_expired':\n const statePayload: StateExpiredPayload = { state: event.payload.state }\n await Promise.all(\n instance.stateExpiredHandlers.map((handler) =>\n handler({\n client,\n ctx,\n ...statePayload,\n })\n )\n )\n break\n default:\n const eventPayload = { event: body.event } as EventPayload<TBot>\n await Promise.all(\n instance.eventHandlers.map((handler) =>\n handler({\n client,\n ctx,\n ...eventPayload,\n })\n )\n )\n }\n}\n", "import { Client } from '@botpress/client'\nimport { BaseBot } from '../generic'\nimport * as routes from './routes'\n\n/**\n * Just like the regular botpress client, but typed with the bot's properties.\n */\nexport class BotSpecificClient<TBot extends BaseBot> {\n public constructor(private readonly client: Client) {}\n\n public createConversation: routes.CreateConversation<TBot> = (x) => this.client.createConversation(x)\n public getConversation: routes.GetConversation<TBot> = (x) => this.client.getConversation(x)\n public listConversations: routes.ListConversations<TBot> = (x) => this.client.listConversations(x)\n public getOrCreateConversation: routes.GetOrCreateConversation<TBot> = (x) => this.client.getOrCreateConversation(x)\n public updateConversation: routes.UpdateConversation<TBot> = (x) => this.client.updateConversation(x)\n public deleteConversation: routes.DeleteConversation<TBot> = (x) => this.client.deleteConversation(x)\n\n public createEvent: routes.CreateEvent<TBot> = (x) => this.client.createEvent(x)\n public getEvent: routes.GetEvent<TBot> = (x) => this.client.getEvent(x)\n public listEvents: routes.ListEvents<TBot> = (x) => this.client.listEvents(x)\n\n public createMessage: routes.CreateMessage<TBot> = (x) => this.client.createMessage(x)\n public getOrCreateMessage: routes.GetOrCreateMessage<TBot> = (x) => this.client.getOrCreateMessage(x)\n public getMessage: routes.GetMessage<TBot> = (x) => this.client.getMessage(x)\n public updateMessage: routes.UpdateMessage<TBot> = (x) => this.client.updateMessage(x)\n public listMessages: routes.ListMessages<TBot> = (x) => this.client.listMessages(x)\n public deleteMessage: routes.DeleteMessage<TBot> = (x) => this.client.deleteMessage(x)\n\n public createUser: routes.CreateUser<TBot> = (x) => this.client.createUser(x)\n public getUser: routes.GetUser<TBot> = (x) => this.client.getUser(x)\n public listUsers: routes.ListUsers<TBot> = (x) => this.client.listUsers(x)\n public getOrCreateUser: routes.GetOrCreateUser<TBot> = (x) => this.client.getOrCreateUser(x)\n public updateUser: routes.UpdateUser<TBot> = (x) => this.client.updateUser(x)\n public deleteUser: routes.DeleteUser<TBot> = (x) => this.client.deleteUser(x)\n\n public getState: routes.GetState<TBot> = (x) => this.client.getState(x)\n public setState: routes.SetState<TBot> = (x) => this.client.setState(x)\n public patchState: routes.PatchState<TBot> = (x) => this.client.patchState(x)\n\n public callAction: routes.CallAction<TBot> = (x) => this.client.callAction(x)\n}\n", "import { z } from 'zod'\nimport { botIdHeader, configurationHeader, operationHeader, typeHeader } from '../const'\n\nexport const botOperationSchema = z.enum(['event_received', 'register', 'unregister', 'ping'])\n\nexport type BotOperation = z.infer<typeof botOperationSchema>\n\nexport type BotContext<Configuration = any, Type extends string = string> = {\n botId: string\n type: Type\n operation: BotOperation\n configuration: Configuration\n}\n\nexport const extractContext = (headers: Record<string, string | undefined>): BotContext => {\n const botId = headers[botIdHeader]\n const base64Configuration = headers[configurationHeader]\n const type = headers[typeHeader]\n const operation = botOperationSchema.parse(headers[operationHeader])\n\n if (!botId) {\n throw new Error('Missing bot headers')\n }\n\n if (!type) {\n throw new Error('Missing type headers')\n }\n\n if (!base64Configuration) {\n throw new Error('Missing configuration headers')\n }\n\n if (!operation) {\n throw new Error('Missing operation headers')\n }\n\n return {\n botId,\n operation,\n type,\n configuration: base64Configuration ? JSON.parse(Buffer.from(base64Configuration, 'base64').toString('utf-8')) : {},\n }\n}\n", "import type { Server } from 'node:http'\nimport { z } from 'zod'\nimport { SchemaDefinition } from '../schema'\nimport { serve } from '../serve'\nimport { AnyZodObject, Cast } from '../type-utils'\nimport { BaseIntegrations } from './generic'\nimport { IntegrationInstance } from './integration-instance'\nimport { botHandler, MessageHandler, EventHandler, StateExpiredHandler } from './server'\n\ntype BaseStates = Record<string, AnyZodObject>\ntype BaseEvents = Record<string, AnyZodObject>\n\ntype TagDefinition = {\n title?: string\n description?: string\n}\n\ntype StateDefinition<TState extends BaseStates[string]> = SchemaDefinition<TState> & {\n type: 'conversation' | 'user' | 'bot'\n expiry?: number\n}\n\ntype RecurringEventDefinition = {\n type: string\n payload: Record<string, any>\n schedule: { cron: string }\n}\n\ntype EventDefinition<TEvent extends BaseEvents[string]> = SchemaDefinition<TEvent>\n\ntype ConfigurationDefinition = SchemaDefinition\n\ntype UserDefinition = {\n tags?: Record<string, TagDefinition>\n}\n\ntype ConversationDefinition = {\n tags?: Record<string, TagDefinition>\n}\n\ntype MessageDefinition = {\n tags?: Record<string, TagDefinition>\n}\n\nexport type BotProps<\n TIntegrations extends BaseIntegrations = BaseIntegrations,\n TStates extends BaseStates = BaseStates,\n TEvents extends BaseEvents = BaseEvents\n> = {\n integrations?: {\n [K in keyof TIntegrations]?: IntegrationInstance<Cast<K, string>>\n }\n user?: UserDefinition\n conversation?: ConversationDefinition\n message?: MessageDefinition\n states?: {\n [K in keyof TStates]: StateDefinition<TStates[K]>\n }\n configuration?: ConfigurationDefinition\n events?: {\n [K in keyof TEvents]: EventDefinition<TEvents[K]>\n }\n recurringEvents?: Record<string, RecurringEventDefinition>\n}\n\ntype BotFrom<TIntegrations extends BaseIntegrations, TStates extends BaseStates, TEvents extends BaseEvents> = {\n integrations: TIntegrations\n states: {\n [K in keyof TStates]: z.infer<TStates[K]>\n }\n events: {\n [K in keyof TEvents]: z.infer<TEvents[K]>\n }\n}\n\ntype BotState<\n TIntegrations extends BaseIntegrations = BaseIntegrations,\n TStates extends BaseStates = BaseStates,\n TEvents extends BaseEvents = BaseEvents\n> = {\n messageHandlers: MessageHandler<BotFrom<TIntegrations, TStates, TEvents>>[]\n eventHandlers: EventHandler<BotFrom<TIntegrations, TStates, TEvents>>[]\n stateExpiredHandlers: StateExpiredHandler<BotFrom<TIntegrations, TStates, TEvents>>[]\n}\n\nexport class Bot<\n TIntegrations extends BaseIntegrations = BaseIntegrations,\n TStates extends BaseStates = BaseStates,\n TEvents extends BaseEvents = BaseEvents\n> {\n private _state: BotState<TIntegrations, TStates, TEvents> = {\n messageHandlers: [],\n eventHandlers: [],\n stateExpiredHandlers: [],\n }\n\n public readonly props: BotProps<TIntegrations, TStates, TEvents>\n\n public constructor(props: BotProps<TIntegrations, TStates, TEvents>) {\n this.props = props\n }\n\n public readonly message = (handler: MessageHandler<BotFrom<TIntegrations, TStates, TEvents>>): void => {\n this._state.messageHandlers.push(handler)\n }\n public readonly event = (handler: EventHandler<BotFrom<TIntegrations, TStates, TEvents>>): void => {\n this._state.eventHandlers.push(handler)\n }\n public readonly stateExpired = (handler: StateExpiredHandler<BotFrom<TIntegrations, TStates, TEvents>>): void => {\n this._state.stateExpiredHandlers.push(handler)\n }\n\n public readonly handler = botHandler(this._state)\n public readonly start = (port?: number): Promise<Server> => serve(this.handler, port)\n}\n"],
5
+ "mappings": "+jBAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,SAAAE,EAAA,sBAAAC,EAAA,gBAAAC,EAAA,0BAAAC,EAAA,8BAAAC,EAAA,gBAAAC,EAAA,oBAAAC,EAAA,wBAAAC,EAAA,wBAAAC,EAAA,aAAAC,EAAA,oBAAAC,EAAA,cAAAC,EAAA,UAAAC,EAAA,eAAAC,EAAA,oBAAAC,IAAA,eAAAC,GAAAjB,ICAA,IAAAkB,EAAA,GAAAC,EAAAD,EAAA,cAAAE,KAAA,IAAAC,EAAkB,eAEZC,EAAiB,IAAE,OAAO,EAAE,IAAI,CAAC,EAEjCC,GAAoB,IAAE,OAAO,CACjC,KAAMD,CACR,CAAC,EAEKE,GAAwB,IAAE,OAAO,CACrC,SAAUF,CACZ,CAAC,EAEKG,GAAqB,IAAE,OAAO,CAClC,SAAUH,CACZ,CAAC,EAEKI,GAAqB,IAAE,OAAO,CAClC,SAAUJ,CACZ,CAAC,EAEKK,GAAqB,IAAE,OAAO,CAClC,SAAUL,CACZ,CAAC,EAEKM,GAAoB,IAAE,OAAO,CACjC,QAASN,EACT,MAAOA,EAAe,SAAS,CACjC,CAAC,EAEKO,GAAwB,IAAE,OAAO,CACrC,SAAU,IAAE,OAAO,EACnB,UAAW,IAAE,OAAO,EACpB,QAAS,IAAE,OAAO,EAAE,SAAS,EAC7B,MAAO,IAAE,OAAO,EAAE,SAAS,CAC7B,CAAC,EAEKC,EAAa,IAAE,OAAO,CAC1B,MAAOR,EACP,SAAUA,EAAe,SAAS,EAClC,SAAUA,EAAe,SAAS,EAClC,QAAS,IAAE,MACT,IAAE,OAAO,CACP,OAAQ,IAAE,KAAK,CAAC,WAAY,MAAO,KAAK,CAAC,EACzC,MAAOA,EACP,MAAOA,CACT,CAAC,CACH,CACF,CAAC,EAEKS,EAAe,IAAE,OAAO,CAC5B,KAAMT,EACN,QAAS,IAAE,MACT,IAAE,OAAO,CACP,MAAOA,EACP,MAAOA,CACT,CAAC,CACH,CACF,CAAC,EAEKU,GAAiB,IAAE,OAAO,CAC9B,MAAO,IAAE,MAAMF,CAAU,CAC3B,CAAC,EAEYV,GAAW,CACtB,KAAM,CAAE,OAAQG,EAAkB,EAClC,SAAU,CAAE,OAAQC,EAAsB,EAC1C,MAAO,CAAE,OAAQC,EAAmB,EACpC,MAAO,CAAE,OAAQC,EAAmB,EACpC,MAAO,CAAE,OAAQC,EAAmB,EACpC,KAAM,CAAE,OAAQC,EAAkB,EAClC,SAAU,CAAE,OAAQC,EAAsB,EAC1C,SAAU,CAAE,OAAQG,EAAe,EACnC,KAAM,CAAE,OAAQF,CAAW,EAC3B,SAAU,CAAE,OAAQC,CAAa,EACjC,OAAQ,CAAE,OAAQA,CAAa,CACjC,EC3EO,IAAME,EAAc,WACdC,EAAkB,gBAClBC,EAAsB,mBACtBC,EAAkB,eAElBC,EAAsB,qBACtBC,EAAkB,iBAClBC,EAAa,YCP1B,IAAAC,EAAsD,qBCM/C,IAAMC,EAAc,QDapB,SAASC,EAAaC,EAAiB,CAC5C,GAAI,CAACA,EAAI,KACP,MAAM,IAAI,MAAM,cAAc,EAEhC,OAAO,KAAK,MAAMA,EAAI,IAAI,CAC5B,CAEA,eAAsBC,EACpBC,EACAC,EAAe,KACfC,EAAmCC,GAClB,CAEjB,IAAMC,KAAS,gBAAa,MAAON,EAAKO,IAAQ,CAC9C,GAAI,CACF,IAAMC,EAAU,MAAMC,GAA4BT,CAAG,EAC/CU,EAAW,MAAMR,EAAQM,CAAO,EACtCD,EAAI,UAAUG,GAAU,QAAU,IAAKA,GAAU,SAAW,CAAC,CAAC,EAAE,IAAIA,GAAU,MAAQ,IAAI,CAC5F,OAASC,EAAP,CACAC,EAAI,MAAM,+BAAgC,CAAE,MAAOD,GAAG,SAAW,wBAAyB,CAAC,EAC3FJ,EAAI,UAAU,GAAG,EAAE,IAAI,KAAK,UAAU,CAAE,MAAOI,GAAG,SAAW,wBAAyB,CAAC,CAAC,CAC1F,CACF,CAAC,EAED,OAAAL,EAAO,OAAOH,EAAM,IAAMC,EAASD,CAAI,CAAC,EACjCG,CACT,CAEA,eAAeG,GAA4BI,EAA6C,CACtF,IAAMC,EAAO,MAAMC,GAASF,CAAQ,EAC9BG,EAAU,CAAC,EAEjB,QAASC,EAAI,EAAGA,EAAIJ,EAAS,WAAW,OAAQI,GAAK,EAAG,CACtD,IAAMC,EAAML,EAAS,WAAWI,CAAC,EAAG,YAAY,EAC1CE,EAAQN,EAAS,WAAWI,EAAI,CAAC,EACvCD,EAAQE,CAAG,EAAIC,CACjB,CAEA,IAAMC,EAAM,IAAI,IACdP,EAAS,KAAO,GAChBA,EAAS,QAAQ,KAAO,UAAUA,EAAS,QAAQ,OAAS,uBAC9D,EAEA,MAAO,CACL,KAAAC,EACA,KAAMM,EAAI,SACV,MAAOC,GAAWD,EAAI,OAAQ,GAAG,EACjC,QAAAJ,EACA,OAAQH,EAAS,QAAQ,YAAY,GAAK,KAC5C,CACF,CAEA,SAASQ,GAAWF,EAAeG,EAAgB,CACjD,OAAOH,EAAM,QAAQG,CAAM,IAAM,EAAIH,EAAM,MAAMG,EAAO,MAAM,EAAIH,CACpE,CAEA,eAAeJ,GAASF,EAA2B,CACjD,OAAO,IAAI,QAA4B,CAACU,EAASC,IAAW,CAC1D,GAAIX,EAAS,SAAW,QAAUA,EAAS,SAAW,OAASA,EAAS,SAAW,QACjF,OAAOU,EAAQ,MAAS,EAG1B,IAAIT,EAAO,GAEXD,EAAS,GAAG,OAASY,GAAWX,GAAQW,EAAM,SAAS,CAAE,EACzDZ,EAAS,GAAG,QAAUF,GAAMa,EAAOb,CAAC,CAAC,EACrCE,EAAS,GAAG,MAAO,IAAMU,EAAQT,CAAI,CAAC,CACxC,CAAC,CACH,CAEA,SAAST,GAAgBF,EAAc,CACrCS,EAAI,KAAK,qBAAqBT,GAAM,CACtC,CE3FA,IAAAuB,EAAkB,eAUX,IAAMC,GAA6B,IAAE,KAAK,CAC/C,mBACA,kBACA,mBACA,WACA,aACA,OACA,cACA,qBACF,CAAC,EAaYC,EAAkBC,GAAoE,CACjG,IAAMC,EAAQD,EAAQE,CAAW,EAC3BC,EAAYH,EAAQI,CAAe,EACnCC,EAAgBL,EAAQM,CAAmB,EAC3CC,EAAYP,EAAQQ,CAAe,EACnCC,EAAsBT,EAAQU,CAAmB,EACjDC,EAAYb,GAA2B,MAAME,EAAQY,CAAe,CAAC,EAE3E,GAAI,CAACX,EACH,MAAM,IAAI,MAAM,qBAAqB,EAGvC,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,0BAA0B,EAG5C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,6BAA6B,EAG/C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,yBAAyB,EAG3C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,+BAA+B,EAGjD,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,2BAA2B,EAG7C,MAAO,CACL,MAAAV,EACA,UAAAE,EACA,cAAAE,EACA,UAAAE,EACA,UAAAI,EACA,cAAeF,EAAsB,KAAK,MAAM,OAAO,KAAKA,EAAqB,QAAQ,EAAE,SAAS,OAAO,CAAC,EAAI,CAAC,CACnH,CACF,ECqBO,IAAMI,EAAN,KAML,CACgB,KACA,QACA,MACA,YACA,KACA,OACA,cAOA,OACA,QACA,SACA,OACA,KACA,QAET,YAAYC,EAAmF,CACpG,GAAM,CACJ,KAAAC,EACA,QAAAC,EACA,KAAAC,EACA,OAAAC,EACA,MAAAC,EACA,YAAAC,EACA,cAAAC,EACA,OAAAC,EACA,QAAAC,EACA,SAAAC,EACA,OAAAC,EACA,KAAAC,EACA,QAAAC,CACF,EAAIb,EACJ,KAAK,KAAOC,EACZ,KAAK,QAAUC,EACf,KAAK,KAAOC,EACZ,KAAK,OAASC,EACd,KAAK,MAAQC,EACb,KAAK,YAAcC,EACnB,KAAK,cAAgBC,EACrB,KAAK,OAASC,EACd,KAAK,QAAUC,EACf,KAAK,SAAWC,EAChB,KAAK,OAASC,EACd,KAAK,KAAOC,EACZ,KAAK,QAAUC,CACjB,CACF,ECtJA,IAAAC,EAAiF,4BCO1E,IAAMC,EAAN,KAAsE,CACpE,YAA6BC,EAAgB,CAAhB,YAAAA,CAAiB,CAE9C,mBAA+DC,GAAM,KAAK,OAAO,mBAAmBA,CAAC,EACrG,gBAAyDA,GAAM,KAAK,OAAO,gBAAgBA,CAAC,EAC5F,kBAA6DA,GAAM,KAAK,OAAO,kBAAkBA,CAAC,EAClG,wBAAyEA,GAC9E,KAAK,OAAO,wBAAwBA,CAAC,EAChC,mBAA+DA,GAAM,KAAK,OAAO,mBAAmBA,CAAC,EACrG,mBAA+DA,GAAM,KAAK,OAAO,mBAAmBA,CAAC,EAErG,YAAiDA,GAAM,KAAK,OAAO,YAAYA,CAAC,EAChF,SAA2CA,GAAM,KAAK,OAAO,SAASA,CAAC,EACvE,WAA+CA,GAAM,KAAK,OAAO,WAAWA,CAAC,EAE7E,cAAqDA,GAAM,KAAK,OAAO,cAAcA,CAAC,EACtF,mBAA+DA,GAAM,KAAK,OAAO,mBAAmBA,CAAC,EACrG,WAA+CA,GAAM,KAAK,OAAO,WAAWA,CAAC,EAC7E,cAAqDA,GAAM,KAAK,OAAO,cAAcA,CAAC,EACtF,aAAmDA,GAAM,KAAK,OAAO,aAAaA,CAAC,EACnF,cAAqDA,GAAM,KAAK,OAAO,cAAcA,CAAC,EAEtF,WAA+CA,GAAM,KAAK,OAAO,WAAWA,CAAC,EAC7E,QAAyCA,GAAM,KAAK,OAAO,QAAQA,CAAC,EACpE,UAA6CA,GAAM,KAAK,OAAO,UAAUA,CAAC,EAC1E,gBAAyDA,GAAM,KAAK,OAAO,gBAAgBA,CAAC,EAC5F,WAA+CA,GAAM,KAAK,OAAO,WAAWA,CAAC,EAC7E,WAA+CA,GAAM,KAAK,OAAO,WAAWA,CAAC,EAE7E,SAA2CA,GAChD,KAAK,OAAO,SAASA,CAAC,EAAE,KAAMC,IAAO,CAAE,MAAO,CAAE,GAAGA,EAAE,MAAO,QAASA,EAAE,MAAM,OAAe,CAAE,EAAE,EAC3F,SAA2CD,GAChD,KAAK,OAAO,SAASA,CAAC,EAAE,KAAMC,IAAO,CAAE,MAAO,CAAE,GAAGA,EAAE,MAAO,QAASA,EAAE,MAAM,OAAe,CAAE,EAAE,EAC3F,WAA+CD,GACpD,KAAK,OAAO,WAAWA,CAAC,EAAE,KAAMC,IAAO,CAAE,MAAO,CAAE,GAAGA,EAAE,MAAO,QAASA,EAAE,MAAM,OAAe,CAAE,EAAE,EAE7F,qBAAmED,GAAM,KAAK,OAAO,qBAAqBA,CAAC,CACpH,EC3CA,IAAAE,EAAiB,mBAEXC,EAA0BC,GAAyC,CACvE,GAAI,QAAQ,IAAI,gBAAqB,OACnC,OAAO,KAAK,UAAU,CAAE,IAAK,EAAAC,QAAK,OAAO,GAAGD,CAAI,EAAG,qBAAsB,EAAK,CAAC,EAC1E,CACL,GAAM,CAACE,EAAQ,GAAGC,CAAK,EAAIH,EAC3B,OAAO,EAAAC,QAAK,OAAO,mBAAmBC,IAAU,GAAGC,CAAK,CAC1D,CACF,EAEaC,EAAoB,CAI/B,OAAQ,KACC,CACL,KAAM,IAAIJ,IAA0C,CAClD,QAAQ,KAAKD,EAAuBC,CAAI,CAAC,CAC3C,EACA,KAAM,IAAIA,IAA0C,CAClD,QAAQ,KAAKD,EAAuBC,CAAI,CAAC,CAC3C,EACA,MAAO,IAAIA,IAA2C,CACpD,QAAQ,MAAMD,EAAuBC,CAAI,CAAC,CAC5C,EACA,MAAO,IAAIA,IAA2C,CACpD,QAAQ,MAAMD,EAAuBC,CAAI,CAAC,CAC5C,CACF,EAEJ,EFqGO,IAAMK,EAC4BC,GACvC,MAAOC,GAA2C,CAChD,IAAMC,EAAMC,EAAeF,EAAI,OAAO,EAEhCG,EAAS,IAAIC,EACjB,IAAI,SAAO,CAAE,MAAOH,EAAI,MAAO,cAAeA,EAAI,aAAc,CAAC,CACnE,EAEMI,EAAQ,CACZ,IAAAJ,EACA,IAAAD,EACA,OAAAG,EACA,OAAQG,EACR,SAAAP,CACF,EAEA,GAAI,CACF,IAAIQ,EACJ,OAAQN,EAAI,UAAW,CACrB,IAAK,mBACHM,EAAW,MAAMC,GAAwBH,CAAK,EAC9C,MACF,IAAK,WACHE,EAAW,MAAME,GAAyBJ,CAAK,EAC/C,MACF,IAAK,aACHE,EAAW,MAAMG,GAA2BL,CAAK,EACjD,MACF,IAAK,kBACHE,EAAW,MAAMI,GAA+BN,CAAK,EACrD,MACF,IAAK,mBACHE,EAAW,MAAMK,GAAgCP,CAAK,EACtD,MACF,IAAK,OACHE,EAAW,MAAMM,GAAqBR,CAAK,EAC3C,MACF,IAAK,cACHE,EAAW,MAAMO,GAA2BT,CAAK,EACjD,MACF,IAAK,sBACHE,EAAW,MAAMQ,GAAmCV,CAAK,EACzD,MACF,QACE,MAAM,IAAI,MAAM,qBAAqBJ,EAAI,WAAW,CACxD,CACA,OAAOM,EAAW,CAAE,GAAGA,EAAU,OAAQA,EAAS,QAAU,GAAI,EAAI,CAAE,OAAQ,GAAI,CACpF,OAASS,EAAP,CACA,GAAIA,aAAa,eACf,MAAO,CAAE,OAAQA,EAAE,KAAM,KAAM,KAAK,UAAUA,EAAE,OAAO,CAAC,CAAE,EAE1D,MAAMA,CAEV,CACF,EAEIH,GAAS,MAA6CI,GAAiC,CAAC,EAExFT,GAAY,MAA6C,CAC7D,OAAAL,EACA,IAAAF,EACA,IAAKiB,EACL,OAAAC,EACA,SAAApB,CACF,IAAiC,CAC/B,GAAM,CAAE,IAAAC,CAAI,EAAIoB,EAA0BF,CAAe,EACzD,OAAOnB,EAAS,QAAQ,CAAE,OAAAI,EAAQ,IAAAF,EAAK,IAAAD,EAAK,OAAAmB,CAAO,CAAC,CACtD,EAEMV,GAAa,MAA6C,CAC9D,OAAAN,EACA,IAAAF,EACA,IAAAD,EACA,OAAAmB,EACA,SAAApB,CACF,IAAiC,CAC/B,GAAI,CAACA,EAAS,SACZ,OAEF,GAAM,CAAE,WAAAsB,CAAW,EAAID,EAA2BpB,CAAG,EACrD,MAAMD,EAAS,SAAS,CAAE,OAAAI,EAAQ,IAAAF,EAAK,WAAAoB,EAAY,OAAAF,CAAO,CAAC,CAC7D,EAEMT,GAAe,MAA6C,CAChE,OAAAP,EACA,IAAAF,EACA,IAAAD,EACA,OAAAmB,EACA,SAAApB,CACF,IAAiC,CAC/B,GAAI,CAACA,EAAS,WACZ,OAEF,GAAM,CAAE,WAAAsB,CAAW,EAAID,EAA6BpB,CAAG,EACvD,MAAMD,EAAS,WAAW,CAAE,IAAAE,EAAK,WAAAoB,EAAY,OAAAlB,EAAQ,OAAAgB,CAAO,CAAC,CAC/D,EAEML,GAAe,MAA6C,CAChE,OAAAX,EACA,IAAAF,EACA,IAAAD,EACA,OAAAmB,EACA,SAAApB,CACF,IAAiC,CAC/B,GAAI,CAACA,EAAS,WACZ,OAEF,GAAM,CAAE,KAAAuB,CAAK,EAAIF,EAA2CpB,CAAG,EAC/D,OAAO,MAAMD,EAAS,WAAW,CAAE,IAAAE,EAAK,OAAAE,EAAQ,KAAAmB,EAAM,OAAAH,CAAO,CAAC,CAChE,EAEMJ,GAAuB,MAA6C,CACxE,OAAAZ,EACA,IAAAF,EACA,IAAAD,EACA,OAAAmB,EACA,SAAApB,CACF,IAAiC,CAC/B,GAAI,CAACA,EAAS,mBACZ,OAEF,GAAM,CAAE,QAAAwB,EAAS,KAAAD,CAAK,EAAIF,EAAmDpB,CAAG,EAChF,OAAO,MAAMD,EAAS,mBAAmB,CAAE,IAAAE,EAAK,OAAAE,EAAQ,QAAAoB,EAAS,KAAAD,EAAM,OAAAH,CAAO,CAAC,CACjF,EAEMR,GAAmB,MAA6C,CACpE,IAAAV,EACA,IAAAD,EACA,OAAAG,EACA,OAAAgB,EACA,SAAApB,CACF,IAAiC,CAC/B,GAAM,CAAE,aAAAyB,EAAc,KAAAC,EAAM,KAAAC,EAAM,QAAAC,EAAS,QAAAC,CAAQ,EAAIR,EAAwDpB,CAAG,EAE5G6B,EAAiB9B,EAAS,SAASyB,EAAa,OAAO,EAE7D,GAAI,CAACK,EACH,MAAM,IAAI,MAAM,WAAWL,EAAa,mBAAmB,EAG7D,IAAMM,EAAiBD,EAAe,SAASH,CAAI,EAEnD,GAAI,CAACI,EACH,MAAM,IAAI,MAAM,mBAAmBJ,0BAA6BF,EAAa,SAAS,EAUxF,MAAMM,EAAe,CAAE,IAAA7B,EAAK,aAAAuB,EAAc,QAAAI,EAAS,KAAAH,EAAM,KAAAC,EAAM,OAAAvB,EAAQ,QAAAwB,EAAS,IAPpE,MAAO,CAAE,KAAAL,CAAK,IAAwC,CAChE,MAAMnB,EAAO,cAAc,CACzB,GAAIyB,EAAQ,GACZ,KAAMN,CACR,CAAC,CACH,EAEqF,OAAAH,CAAO,CAAC,CAC/F,EAEMP,GAAoB,MAA6C,CACrE,IAAAZ,EACA,IAAAC,EACA,OAAAE,EACA,OAAAgB,EACA,SAAApB,CACF,IAAiC,CAC/B,GAAM,CAAE,MAAAgC,EAAO,KAAAL,CAAK,EAAIN,EAAsCpB,CAAG,EAEjE,GAAI,CAAC0B,EACH,MAAM,IAAI,MAAM,qBAAqB,EAGvC,IAAMM,EAASjC,EAAS,QAAQ2B,CAAI,EAEpC,GAAI,CAACM,EACH,MAAM,IAAI,MAAM,UAAUN,aAAgB,EAG5C,IAAMO,EAAS,MAAMD,EAAO,CAAE,IAAA/B,EAAK,MAAA8B,EAAO,OAAA5B,EAAQ,KAAAuB,EAAM,OAAAP,CAAO,CAAC,EAEhE,MAAO,CACL,KAAM,KAAK,UAAU,CAAE,OAAAc,CAAO,CAAC,CACjC,CACF,EGlSO,IAAMC,EAAN,KAAwF,CAC7E,MACA,QACA,SACA,SACA,WACA,WACA,mBACA,QAET,YAAYC,EAAqD,CACtE,KAAK,MAAQA,EACb,KAAK,QAAUA,EAAM,QACrB,KAAK,SAAWA,EAAM,SACtB,KAAK,SAAWA,EAAM,SACtB,KAAK,WAAaA,EAAM,WACxB,KAAK,WAAaA,EAAM,WACxB,KAAK,mBAAqBA,EAAM,mBAChC,KAAK,QAAUA,EAAM,OACvB,CAEgB,QAAUC,EAAiC,IAAI,EAC/C,MAASC,GAAmCC,EAAM,KAAK,QAASD,CAAI,CACtF,EC/CA,IAAAE,EAA0B,+BCOnB,IAAMC,EAAN,KAA8C,CAC5C,YAA6BC,EAAgB,CAAhB,YAAAA,CAAiB,CAE9C,mBAAuDC,GAAM,KAAK,OAAO,mBAAmBA,CAAC,EAC7F,gBAAiDA,GAAM,KAAK,OAAO,gBAAgBA,CAAC,EACpF,kBAAqDA,GAAM,KAAK,OAAO,kBAAkBA,CAAC,EAC1F,wBAAiEA,GAAM,KAAK,OAAO,wBAAwBA,CAAC,EAC5G,mBAAuDA,GAAM,KAAK,OAAO,mBAAmBA,CAAC,EAC7F,mBAAuDA,GAAM,KAAK,OAAO,mBAAmBA,CAAC,EAE7F,YAAyCA,GAAM,KAAK,OAAO,YAAYA,CAAC,EACxE,SAAmCA,GAAM,KAAK,OAAO,SAASA,CAAC,EAC/D,WAAuCA,GAAM,KAAK,OAAO,WAAWA,CAAC,EAErE,cAA6CA,GAAM,KAAK,OAAO,cAAcA,CAAC,EAC9E,mBAAuDA,GAAM,KAAK,OAAO,mBAAmBA,CAAC,EAC7F,WAAuCA,GAAM,KAAK,OAAO,WAAWA,CAAC,EACrE,cAA6CA,GAAM,KAAK,OAAO,cAAcA,CAAC,EAC9E,aAA2CA,GAAM,KAAK,OAAO,aAAaA,CAAC,EAC3E,cAA6CA,GAAM,KAAK,OAAO,cAAcA,CAAC,EAE9E,WAAuCA,GAAM,KAAK,OAAO,WAAWA,CAAC,EACrE,QAAiCA,GAAM,KAAK,OAAO,QAAQA,CAAC,EAC5D,UAAqCA,GAAM,KAAK,OAAO,UAAUA,CAAC,EAClE,gBAAiDA,GAAM,KAAK,OAAO,gBAAgBA,CAAC,EACpF,WAAuCA,GAAM,KAAK,OAAO,WAAWA,CAAC,EACrE,WAAuCA,GAAM,KAAK,OAAO,WAAWA,CAAC,EAErE,SAAmCA,GAAM,KAAK,OAAO,SAASA,CAAC,EAC/D,SAAmCA,GAAM,KAAK,OAAO,SAASA,CAAC,EAC/D,WAAuCA,GAAM,KAAK,OAAO,WAAWA,CAAC,EAErE,WAAuCA,GAAM,KAAK,OAAO,WAAWA,CAAC,CAC9E,ECxCA,IAAAC,EAAkB,eAGX,IAAMC,GAAqB,IAAE,KAAK,CAAC,iBAAkB,WAAY,aAAc,MAAM,CAAC,EAWhFC,EAAkBC,GAA4D,CACzF,IAAMC,EAAQD,EAAQE,CAAW,EAC3BC,EAAsBH,EAAQI,CAAmB,EACjDC,EAAOL,EAAQM,CAAU,EACzBC,EAAYT,GAAmB,MAAME,EAAQQ,CAAe,CAAC,EAEnE,GAAI,CAACP,EACH,MAAM,IAAI,MAAM,qBAAqB,EAGvC,GAAI,CAACI,EACH,MAAM,IAAI,MAAM,sBAAsB,EAGxC,GAAI,CAACF,EACH,MAAM,IAAI,MAAM,+BAA+B,EAGjD,GAAI,CAACI,EACH,MAAM,IAAI,MAAM,2BAA2B,EAG7C,MAAO,CACL,MAAAN,EACA,UAAAM,EACA,KAAAF,EACA,cAAeF,EAAsB,KAAK,MAAM,OAAO,KAAKA,EAAqB,QAAQ,EAAE,SAAS,OAAO,CAAC,EAAI,CAAC,CACnH,CACF,EFOO,IAAMM,EACYC,GACvB,MAAOC,GAA2C,CAChD,IAAMC,EAAMC,EAAeF,EAAI,OAAO,EAElCC,EAAI,YAAc,QACpBE,EAAI,KAAK,YAAYF,EAAI,+BAA+BA,EAAI,iBAAiBA,EAAI,MAAM,EAGzF,IAAMG,EAAS,IAAIC,EAAkB,IAAa,SAAO,CAAE,MAAOJ,EAAI,KAAM,CAAC,CAAC,EAExEK,EAAQ,CACZ,IAAAN,EACA,IAAAC,EACA,OAAAG,EACA,SAAAL,CACF,EAEA,OAAQE,EAAI,UAAW,CACrB,IAAK,iBACH,MAAMM,GAAsBD,CAAK,EACjC,MACF,IAAK,WACH,MAAME,GAAiBF,CAAK,EAC5B,MACF,IAAK,aACH,MAAMG,GAAmBH,CAAK,EAC9B,MACF,IAAK,OACH,MAAMI,GAAaJ,CAAK,EACxB,MACF,QACE,MAAM,IAAI,MAAM,qBAAqBL,EAAI,WAAW,CACxD,CAEA,MAAO,CAAE,OAAQ,GAAI,CACvB,EAEIS,GAAS,MAA6BC,GAAyB,CAAC,EAChEH,GAAa,MAA6BG,GAAyB,CAAC,EACpEF,GAAe,MAA6BE,GAAyB,CAAC,EACtEJ,GAAkB,MAA6B,CAAE,IAAAN,EAAK,IAAAD,EAAK,OAAAI,EAAQ,SAAAL,CAAS,IAAyB,CACzGI,EAAI,MAAM,kBAAkBF,EAAI,MAAM,EAEtC,IAAMW,EAAOC,EAA8Bb,CAAG,EACxCc,EAAQF,EAAK,MAEnB,OAAQX,EAAI,KAAM,CAChB,IAAK,kBACH,IAAMc,EAAiC,CACrC,KAAMD,EAAM,QAAQ,KACpB,aAAcA,EAAM,QAAQ,aAC5B,QAASA,EAAM,QAAQ,QACvB,MAAAA,CACF,EAEA,MAAM,QAAQ,IACZf,EAAS,gBAAgB,IAAKiB,GAC5BA,EAAQ,CACN,OAAAZ,EACA,IAAAH,EACA,GAAGc,CACL,CAAC,CACH,CACF,EACA,MACF,IAAK,gBACH,IAAME,EAAoC,CAAE,MAAOH,EAAM,QAAQ,KAAM,EACvE,MAAM,QAAQ,IACZf,EAAS,qBAAqB,IAAKiB,GACjCA,EAAQ,CACN,OAAAZ,EACA,IAAAH,EACA,GAAGgB,CACL,CAAC,CACH,CACF,EACA,MACF,QACE,IAAMC,EAAe,CAAE,MAAON,EAAK,KAAM,EACzC,MAAM,QAAQ,IACZb,EAAS,cAAc,IAAKiB,GAC1BA,EAAQ,CACN,OAAAZ,EACA,IAAAH,EACA,GAAGiB,CACL,CAAC,CACH,CACF,CACJ,CACF,EGtDO,IAAMC,EAAN,KAIL,CACQ,OAAoD,CAC1D,gBAAiB,CAAC,EAClB,cAAe,CAAC,EAChB,qBAAsB,CAAC,CACzB,EAEgB,MAET,YAAYC,EAAkD,CACnE,KAAK,MAAQA,CACf,CAEgB,QAAWC,GAA4E,CACrG,KAAK,OAAO,gBAAgB,KAAKA,CAAO,CAC1C,EACgB,MAASA,GAA0E,CACjG,KAAK,OAAO,cAAc,KAAKA,CAAO,CACxC,EACgB,aAAgBA,GAAiF,CAC/G,KAAK,OAAO,qBAAqB,KAAKA,CAAO,CAC/C,EAEgB,QAAUC,EAAW,KAAK,MAAM,EAChC,MAASC,GAAmCC,EAAM,KAAK,QAASD,CAAI,CACtF",
6
+ "names": ["src_exports", "__export", "Bot", "BotSpecificClient", "IntegrationImplementation", "IntegrationDefinition", "IntegrationSpecificClient", "botIdHeader", "botUserIdHeader", "configurationHeader", "integrationIdHeader", "message_exports", "operationHeader", "parseBody", "serve", "typeHeader", "webhookIdHeader", "__toCommonJS", "message_exports", "__export", "defaults", "import_zod", "NonEmptyString", "textMessageSchema", "markdownMessageSchema", "imageMessageSchema", "audioMessageSchema", "videoMessageSchema", "fileMessageSchema", "locationMessageSchema", "cardSchema", "choiceSchema", "carouselSchema", "botIdHeader", "botUserIdHeader", "integrationIdHeader", "webhookIdHeader", "configurationHeader", "operationHeader", "typeHeader", "import_node_http", "log", "parseBody", "req", "serve", "handler", "port", "callback", "defaultCallback", "server", "res", "request", "mapIncomingMessageToRequest", "response", "e", "log", "incoming", "body", "readBody", "headers", "i", "key", "value", "url", "trimPrefix", "prefix", "resolve", "reject", "chunk", "import_zod", "integrationOperationSchema", "extractContext", "headers", "botId", "botIdHeader", "botUserId", "botUserIdHeader", "integrationId", "integrationIdHeader", "webhookId", "webhookIdHeader", "base64Configuration", "configurationHeader", "operation", "operationHeader", "IntegrationDefinition", "props", "name", "version", "icon", "readme", "title", "description", "configuration", "events", "actions", "channels", "states", "user", "secrets", "import_client", "IntegrationSpecificClient", "client", "x", "y", "import_util", "serializeForBotMessage", "args", "util", "format", "param", "integrationLogger", "integrationHandler", "instance", "req", "ctx", "extractContext", "client", "IntegrationSpecificClient", "props", "integrationLogger", "response", "onWebhook", "onRegister", "onUnregister", "onMessageCreated", "onActionTriggered", "onPing", "onCreateUser", "onCreateConversation", "e", "_", "incomingRequest", "logger", "parseBody", "webhookUrl", "tags", "channel", "conversation", "user", "type", "payload", "message", "channelHandler", "messageHandler", "input", "action", "output", "IntegrationImplementation", "props", "integrationHandler", "port", "serve", "bpclient", "BotSpecificClient", "client", "x", "import_zod", "botOperationSchema", "extractContext", "headers", "botId", "botIdHeader", "base64Configuration", "configurationHeader", "type", "typeHeader", "operation", "operationHeader", "botHandler", "instance", "req", "ctx", "extractContext", "log", "client", "BotSpecificClient", "props", "onEventReceived", "onRegister", "onUnregister", "onPing", "_", "body", "parseBody", "event", "messagePayload", "handler", "statePayload", "eventPayload", "Bot", "props", "handler", "botHandler", "port", "serve"]
7
7
  }
@@ -0,0 +1,35 @@
1
+ import { Client } from '@botpress/client';
2
+ import { BaseIntegration } from '../generic';
3
+ import * as routes from './routes';
4
+ /**
5
+ * Just like the regular botpress client, but typed with the integration's properties.
6
+ */
7
+ export declare class IntegrationSpecificClient<TIntegration extends BaseIntegration> {
8
+ private readonly client;
9
+ constructor(client: Client);
10
+ createConversation: routes.CreateConversation<TIntegration>;
11
+ getConversation: routes.GetConversation<TIntegration>;
12
+ listConversations: routes.ListConversations<TIntegration>;
13
+ getOrCreateConversation: routes.GetOrCreateConversation<TIntegration>;
14
+ updateConversation: routes.UpdateConversation<TIntegration>;
15
+ deleteConversation: routes.DeleteConversation<TIntegration>;
16
+ createEvent: routes.CreateEvent<TIntegration>;
17
+ getEvent: routes.GetEvent<TIntegration>;
18
+ listEvents: routes.ListEvents<TIntegration>;
19
+ createMessage: routes.CreateMessage<TIntegration>;
20
+ getOrCreateMessage: routes.GetOrCreateMessage<TIntegration>;
21
+ getMessage: routes.GetMessage<TIntegration>;
22
+ updateMessage: routes.UpdateMessage<TIntegration>;
23
+ listMessages: routes.ListMessages<TIntegration>;
24
+ deleteMessage: routes.DeleteMessage<TIntegration>;
25
+ createUser: routes.CreateUser<TIntegration>;
26
+ getUser: routes.GetUser<TIntegration>;
27
+ listUsers: routes.ListUsers<TIntegration>;
28
+ getOrCreateUser: routes.GetOrCreateUser<TIntegration>;
29
+ updateUser: routes.UpdateUser<TIntegration>;
30
+ deleteUser: routes.DeleteUser<TIntegration>;
31
+ getState: routes.GetState<TIntegration>;
32
+ setState: routes.SetState<TIntegration>;
33
+ patchState: routes.PatchState<TIntegration>;
34
+ configureIntegration: routes.ConfigureIntegration<TIntegration>;
35
+ }
@@ -0,0 +1,95 @@
1
+ import { Client } from '@botpress/client';
2
+ import { Merge, Cast } from '../../type-utils';
3
+ import { BaseIntegration } from '../generic';
4
+ import { GetChannelByName, ToTags, WithPrefix } from './types';
5
+ type Arg<F extends (...args: any[]) => any> = Parameters<F>[number];
6
+ type Res<F extends (...args: any[]) => any> = ReturnType<F>;
7
+ type PrefixConfig<TIntegration extends BaseIntegration> = {
8
+ allowPrefix: TIntegration['name'];
9
+ };
10
+ type AllChannels<TIntegration extends BaseIntegration> = TIntegration['channels'][keyof TIntegration['channels']];
11
+ export type CreateConversation<TIntegration extends BaseIntegration> = <ChannelName extends keyof TIntegration['channels']>(x: {
12
+ channel: Cast<ChannelName, string>;
13
+ tags: ToTags<keyof GetChannelByName<TIntegration, ChannelName>['conversation']['tags'], PrefixConfig<TIntegration>>;
14
+ }) => Res<Client['createConversation']>;
15
+ export type GetConversation<_TIntegration extends BaseIntegration> = Client['getConversation'];
16
+ export type ListConversations<TIntegration extends BaseIntegration> = (x: Merge<Arg<Client['listConversations']>, {
17
+ tags?: ToTags<keyof AllChannels<TIntegration>['conversation']['tags'], PrefixConfig<TIntegration>>;
18
+ }>) => Res<Client['listConversations']>;
19
+ export type GetOrCreateConversation<TIntegration extends BaseIntegration> = <ChannelName extends keyof TIntegration['channels']>(x: {
20
+ channel: Cast<ChannelName, string>;
21
+ tags: ToTags<keyof GetChannelByName<TIntegration, ChannelName>['conversation']['tags'], PrefixConfig<TIntegration>>;
22
+ }) => Res<Client['getOrCreateConversation']>;
23
+ export type UpdateConversation<TIntegration extends BaseIntegration> = (x: Merge<Arg<Client['updateConversation']>, {
24
+ tags: ToTags<keyof AllChannels<TIntegration>['conversation']['tags'], PrefixConfig<TIntegration>>;
25
+ }>) => Res<Client['updateConversation']>;
26
+ export type DeleteConversation<_TIntegration extends BaseIntegration> = Client['deleteConversation'];
27
+ export type CreateEvent<TIntegration extends BaseIntegration> = <TEvent extends keyof TIntegration['events']>(x: Merge<Arg<Client['createEvent']>, {
28
+ type: WithPrefix<Cast<TEvent, string>, {
29
+ allowPrefix: TIntegration['name'];
30
+ }>;
31
+ payload: TIntegration['events'][TEvent]['payload'];
32
+ }>) => Res<Client['createEvent']>;
33
+ export type GetEvent<_TIntegration extends BaseIntegration> = Client['getEvent'];
34
+ export type ListEvents<TIntegration extends BaseIntegration> = (x: Merge<Arg<Client['listEvents']>, {
35
+ type: WithPrefix<Cast<keyof TIntegration['events'], string>, {
36
+ allowPrefix: TIntegration['name'];
37
+ }>;
38
+ }>) => Res<Client['listEvents']>;
39
+ export type CreateMessage<TIntegration extends BaseIntegration> = <TChannel extends keyof TIntegration['channels'], TMessage extends keyof TIntegration['channels'][TChannel]['messages']>(x: Merge<Arg<Client['createMessage']>, {
40
+ type: Cast<TMessage, string>;
41
+ payload: TIntegration['channels'][TChannel]['messages'][TMessage];
42
+ tags: ToTags<keyof TIntegration['channels'][TChannel]['message']['tags'], PrefixConfig<TIntegration>>;
43
+ }>) => Res<Client['createMessage']>;
44
+ export type GetOrCreateMessage<TIntegration extends BaseIntegration> = <TMessage extends keyof AllChannels<TIntegration>['messages']>(x: Merge<Arg<Client['getOrCreateMessage']>, {
45
+ type: Cast<TMessage, string>;
46
+ payload: AllChannels<TIntegration>['messages'][TMessage];
47
+ tags: ToTags<keyof AllChannels<TIntegration>['message']['tags'], PrefixConfig<TIntegration>>;
48
+ }>) => Res<Client['getOrCreateMessage']>;
49
+ export type GetMessage<_TIntegration extends BaseIntegration> = Client['getMessage'];
50
+ export type UpdateMessage<TIntegration extends BaseIntegration> = (x: Merge<Arg<Client['updateMessage']>, {
51
+ tags: ToTags<keyof AllChannels<TIntegration>['message']['tags'], PrefixConfig<TIntegration>>;
52
+ }>) => Res<Client['updateMessage']>;
53
+ export type ListMessages<TIntegration extends BaseIntegration> = (x: Merge<Arg<Client['listMessages']>, {
54
+ tags: ToTags<keyof AllChannels<TIntegration>['message']['tags'], PrefixConfig<TIntegration>>;
55
+ }>) => Res<Client['listMessages']>;
56
+ export type DeleteMessage<_TIntegration extends BaseIntegration> = Client['deleteMessage'];
57
+ export type CreateUser<TIntegration extends BaseIntegration> = (x: {
58
+ tags: ToTags<keyof TIntegration['user']['tags'], PrefixConfig<TIntegration>>;
59
+ }) => Res<Client['createUser']>;
60
+ export type GetUser<_TIntegration extends BaseIntegration> = Client['getUser'];
61
+ export type ListUsers<TIntegration extends BaseIntegration> = (x: Merge<Arg<Client['listUsers']>, {
62
+ tags: ToTags<keyof TIntegration['user']['tags'], PrefixConfig<TIntegration>>;
63
+ }>) => Res<Client['listUsers']>;
64
+ export type GetOrCreateUser<TIntegration extends BaseIntegration> = (x: {
65
+ tags: ToTags<keyof TIntegration['user']['tags'], PrefixConfig<TIntegration>>;
66
+ }) => Res<Client['getOrCreateUser']>;
67
+ export type UpdateUser<TIntegration extends BaseIntegration> = (x: Merge<Arg<Client['updateUser']>, {
68
+ tags: ToTags<keyof TIntegration['user']['tags'], PrefixConfig<TIntegration>>;
69
+ }>) => Res<Client['updateUser']>;
70
+ export type DeleteUser<_TIntegration extends BaseIntegration> = Client['deleteUser'];
71
+ export type GetState<TIntegration extends BaseIntegration> = <TState extends keyof TIntegration['states']>(x: Merge<Arg<Client['getState']>, {
72
+ name: Cast<TState, string>;
73
+ }>) => Promise<{
74
+ state: Merge<Awaited<Res<Client['getState']>>['state'], {
75
+ payload: TIntegration['states'][TState];
76
+ }>;
77
+ }>;
78
+ export type SetState<TIntegration extends BaseIntegration> = <TState extends keyof TIntegration['states']>(x: Merge<Arg<Client['setState']>, {
79
+ name: Cast<TState, string>;
80
+ payload: TIntegration['states'][TState];
81
+ }>) => Promise<{
82
+ state: Merge<Awaited<Res<Client['setState']>>['state'], {
83
+ payload: TIntegration['states'][TState];
84
+ }>;
85
+ }>;
86
+ export type PatchState<TIntegration extends BaseIntegration> = <TState extends keyof TIntegration['states']>(x: Merge<Arg<Client['patchState']>, {
87
+ name: Cast<TState, string>;
88
+ payload: Partial<TIntegration['states'][TState]>;
89
+ }>) => Promise<{
90
+ state: Merge<Awaited<Res<Client['patchState']>>['state'], {
91
+ payload: TIntegration['states'][TState];
92
+ }>;
93
+ }>;
94
+ export type ConfigureIntegration<_TIntegration extends BaseIntegration> = Client['configureIntegration'];
95
+ export {};
@@ -0,0 +1,22 @@
1
+ import { Cast, Join } from '../../type-utils';
2
+ import { BaseIntegration } from '../generic';
3
+ export type ConfigurationDefinition = BaseIntegration['configuration'];
4
+ export type ActionDefinition = BaseIntegration['actions'][string];
5
+ export type ChannelDefinition = BaseIntegration['channels'][string];
6
+ export type EventDefinition = BaseIntegration['events'][string];
7
+ export type StateDefinition = BaseIntegration['states'][string];
8
+ export type UserDefinition = BaseIntegration['user'];
9
+ export type GetChannelByName<TIntegration extends BaseIntegration, TChannelName extends keyof TIntegration['channels']> = Cast<TIntegration['channels'][TChannelName], ChannelDefinition>;
10
+ export type AsTags<T extends Record<string, string | undefined>> = Cast<T, Record<string, string>>;
11
+ type PrefixConfig = {
12
+ allowPrefix: string;
13
+ } | {
14
+ enforcePrefix: string;
15
+ } | null;
16
+ export type WithPrefix<TTags extends string, TPrefix extends PrefixConfig = null> = TPrefix extends {
17
+ allowPrefix: string;
18
+ } ? TTags | Join<[TPrefix['allowPrefix'], ':', TTags]> : TPrefix extends {
19
+ enforcePrefix: string;
20
+ } ? Join<[TPrefix['enforcePrefix'], ':', TTags]> : TTags;
21
+ export type ToTags<TTags extends string | number | symbol, TPrefix extends PrefixConfig = null> = AsTags<Partial<Record<WithPrefix<Cast<TTags, string>, TPrefix>, string>>>;
22
+ export {};
@@ -9,3 +9,4 @@ export type IntegrationContext<Configuration = any> = {
9
9
  operation: IntegrationOperation;
10
10
  configuration: Configuration;
11
11
  };
12
+ export declare const extractContext: (headers: Record<string, string | undefined>) => IntegrationContext;