@botpress/cli 4.17.7 → 4.17.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,32 +1,32 @@
1
1
 
2
- > @botpress/cli@4.17.7 build /home/runner/work/botpress/botpress/packages/cli
2
+ > @botpress/cli@4.17.8 build /home/runner/work/botpress/botpress/packages/cli
3
3
  > pnpm run bundle && pnpm run template:gen
4
4
 
5
5
 
6
- > @botpress/cli@4.17.7 bundle /home/runner/work/botpress/botpress/packages/cli
6
+ > @botpress/cli@4.17.8 bundle /home/runner/work/botpress/botpress/packages/cli
7
7
  > ts-node -T build.ts
8
8
 
9
9
 
10
- > @botpress/cli@4.17.7 template:gen /home/runner/work/botpress/botpress/packages/cli
10
+ > @botpress/cli@4.17.8 template:gen /home/runner/work/botpress/botpress/packages/cli
11
11
  > pnpm -r --stream -F @bp-templates/* exec bp gen
12
12
 
13
- 🤖 Botpress CLI v4.17.7
14
- 🤖 Botpress CLI v4.17.7
15
- 🤖 Botpress CLI v4.17.7
16
- 🤖 Botpress CLI v4.17.7
17
- ○ Generating typings for integration hello-world...
18
- ○ Generating typings for plugin empty-plugin...
13
+ 🤖 Botpress CLI v4.17.8
14
+ 🤖 Botpress CLI v4.17.8
15
+ 🤖 Botpress CLI v4.17.8
16
+ 🤖 Botpress CLI v4.17.8
17
+ ○ Generating typings for integration empty-integration...
19
18
  ✓ Typings available at .botpress
20
19
 
20
+ ○ Generating typings for integration hello-world...
21
+ ○ Generating typings for plugin empty-plugin...
21
22
  ✓ Typings available at .botpress
22
23
 
23
24
  ○ Generating typings for bot...
24
25
  ✓ Typings available at .botpress
25
26
 
26
- ○ Generating typings for integration empty-integration...
27
27
  ✓ Typings available at .botpress
28
28
 
29
- 🤖 Botpress CLI v4.17.7
29
+ 🤖 Botpress CLI v4.17.8
30
30
  ○ Generating typings for integration webhook-message...
31
31
  ✓ Typings available at .botpress
32
32
 
@@ -123,7 +123,11 @@ class ChatCommand extends import_global_command.GlobalCommand {
123
123
  });
124
124
  line.success("Chat integration installed");
125
125
  line.commit();
126
- return this._findChatInstance(bot);
126
+ const inst = this._findChatInstance(bot);
127
+ if (!inst) {
128
+ throw new errors.BotpressCLIError("Chat integration was installed but could not be found");
129
+ }
130
+ return inst;
127
131
  };
128
132
  _findChatInstance = (bot) => {
129
133
  const integrationInstances = Object.entries(bot.integrations).map(([integrationId, integrationInstance]) => ({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/chat-command.ts"],
4
- "sourcesContent": ["import * as chat from '@botpress/chat'\nimport * as client from '@botpress/client'\nimport semver from 'semver'\nimport { ApiClient } from '../api'\nimport { Chat } from '../chat'\nimport type commandDefinitions from '../command-definitions'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\nimport { GlobalCommand } from './global-command'\n\ntype IntegrationInstance = {\n id: string\n instance: client.Bot['integrations'][string]\n}\n\nexport type ChatCommandDefinition = typeof commandDefinitions.chat\nexport class ChatCommand extends GlobalCommand<ChatCommandDefinition> {\n public async run(): Promise<void> {\n if (process.platform === 'win32') {\n this.logger.warn('The chat command was not tested on Windows and may not work as expected')\n }\n\n const api = await this.ensureLoginAndCreateClient(this.argv)\n const botId = this.argv.botId ?? (await this._selectBot(api))\n const { bot } = await api.client.getBot({ id: botId }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not fetch bot \"${botId}\"`)\n })\n\n const targetChatVersion = this._getChatApiTargetVersionRange()\n let chatIntegrationInstance = this._findChatInstance(bot)\n\n if (!chatIntegrationInstance) {\n this.logger.log(`Chat integration with version ${targetChatVersion} is not installed in the selected bot`)\n const confirmInstall = await this.prompt.confirm('Do you wish to install it now?')\n if (!confirmInstall) {\n throw new errors.BotpressCLIError('Chat integration is required to proceed')\n }\n chatIntegrationInstance = await this._installChatIntegration(api, botId)\n }\n\n const { webhookId } = chatIntegrationInstance.instance\n const chatApiBaseUrl = this._getChatApiUrl(api)\n this.logger.debug(`using chat api url: \"${chatApiBaseUrl}\"`)\n\n const chatApiUrl = `${chatApiBaseUrl}/${webhookId}`\n const chatClient = await chat.Client.connect({ apiUrl: chatApiUrl })\n await this._chat(chatClient)\n }\n\n private _chat = async (client: chat.AuthenticatedClient): Promise<void> => {\n const convLine = this.logger.line()\n convLine.started('Creating a conversation...')\n const { conversation } = await client.createConversation({})\n convLine.success(`Conversation created with id \"${conversation.id}\"`)\n convLine.commit()\n\n const chat = Chat.launch({ client, conversationId: conversation.id })\n await chat.wait()\n }\n\n private _getChatApiUrl = (api: ApiClient): string => {\n if (this.argv.chatApiUrl) {\n return this.argv.chatApiUrl\n }\n\n const parseResult = utils.url.parse(api.url)\n if (parseResult.status === 'error') {\n return consts.defaultChatApiUrl\n }\n\n const { host, ...url } = parseResult.url\n if (!host.startsWith('api.')) {\n return consts.defaultChatApiUrl\n }\n\n const newHost = host.replace('api.', 'chat.')\n return utils.url.format({ ...url, host: newHost })\n }\n\n private _selectBot = async (api: ApiClient): Promise<string> => {\n const availableBots = await api\n .listAllPages(api.client.listBots, (r) => r.bots)\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not fetch existing bots')\n })\n\n if (!availableBots.length) {\n throw new errors.NoBotsFoundError()\n }\n\n const prompted = await this.prompt.select('Which bot do you want to deploy?', {\n choices: availableBots.map((bot) => ({ title: bot.name, value: bot.id })),\n })\n\n if (!prompted) {\n throw new errors.ParamRequiredError('Bot Id')\n }\n\n return prompted\n }\n\n private _installChatIntegration = async (api: ApiClient, botId: string): Promise<IntegrationInstance> => {\n const line = this.logger.line()\n line.started('Installing chat integration...')\n\n const { integration } = await api.client.getPublicIntegration({\n name: 'chat',\n version: this._getChatApiTargetVersion(),\n })\n\n const { bot } = await api.client.updateBot({\n id: botId,\n integrations: {\n [integration.id]: {\n enabled: true,\n configuration: {}, // empty object will always be a valid chat integration configuration\n },\n },\n })\n\n line.success('Chat integration installed')\n line.commit()\n\n return this._findChatInstance(bot)!\n }\n\n private _findChatInstance = (bot: client.Bot): IntegrationInstance | undefined => {\n const integrationInstances = Object.entries(bot.integrations).map(([integrationId, integrationInstance]) => ({\n id: integrationId,\n instance: integrationInstance,\n }))\n\n const targetChatVersion = this._getChatApiTargetVersionRange()\n return integrationInstances.find(\n (i) => i.instance.name === 'chat' && semver.satisfies(i.instance.version, targetChatVersion)\n )\n }\n\n private _getChatApiTargetVersionRange = (): string => {\n const targetApiVersion = this._getChatApiTargetVersion()\n const nextMajor = semver.inc(targetApiVersion, 'major')\n return `>=${targetApiVersion} <${nextMajor}`\n }\n\n private _getChatApiTargetVersion = (): string => {\n const dummyClient = new chat.Client({ apiUrl: '' })\n return dummyClient.apiVersion\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as chat from '@botpress/chat'\nimport * as client from '@botpress/client'\nimport semver from 'semver'\nimport { ApiClient } from '../api'\nimport { Chat } from '../chat'\nimport type commandDefinitions from '../command-definitions'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\nimport { GlobalCommand } from './global-command'\n\ntype IntegrationInstance = {\n id: string\n instance: client.Bot['integrations'][string]\n}\n\nexport type ChatCommandDefinition = typeof commandDefinitions.chat\nexport class ChatCommand extends GlobalCommand<ChatCommandDefinition> {\n public async run(): Promise<void> {\n if (process.platform === 'win32') {\n this.logger.warn('The chat command was not tested on Windows and may not work as expected')\n }\n\n const api = await this.ensureLoginAndCreateClient(this.argv)\n const botId = this.argv.botId ?? (await this._selectBot(api))\n const { bot } = await api.client.getBot({ id: botId }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not fetch bot \"${botId}\"`)\n })\n\n const targetChatVersion = this._getChatApiTargetVersionRange()\n let chatIntegrationInstance = this._findChatInstance(bot)\n\n if (!chatIntegrationInstance) {\n this.logger.log(`Chat integration with version ${targetChatVersion} is not installed in the selected bot`)\n const confirmInstall = await this.prompt.confirm('Do you wish to install it now?')\n if (!confirmInstall) {\n throw new errors.BotpressCLIError('Chat integration is required to proceed')\n }\n chatIntegrationInstance = await this._installChatIntegration(api, botId)\n }\n\n const { webhookId } = chatIntegrationInstance.instance\n const chatApiBaseUrl = this._getChatApiUrl(api)\n this.logger.debug(`using chat api url: \"${chatApiBaseUrl}\"`)\n\n const chatApiUrl = `${chatApiBaseUrl}/${webhookId}`\n const chatClient = await chat.Client.connect({ apiUrl: chatApiUrl })\n await this._chat(chatClient)\n }\n\n private _chat = async (client: chat.AuthenticatedClient): Promise<void> => {\n const convLine = this.logger.line()\n convLine.started('Creating a conversation...')\n const { conversation } = await client.createConversation({})\n convLine.success(`Conversation created with id \"${conversation.id}\"`)\n convLine.commit()\n\n const chat = Chat.launch({ client, conversationId: conversation.id })\n await chat.wait()\n }\n\n private _getChatApiUrl = (api: ApiClient): string => {\n if (this.argv.chatApiUrl) {\n return this.argv.chatApiUrl\n }\n\n const parseResult = utils.url.parse(api.url)\n if (parseResult.status === 'error') {\n return consts.defaultChatApiUrl\n }\n\n const { host, ...url } = parseResult.url\n if (!host.startsWith('api.')) {\n return consts.defaultChatApiUrl\n }\n\n const newHost = host.replace('api.', 'chat.')\n return utils.url.format({ ...url, host: newHost })\n }\n\n private _selectBot = async (api: ApiClient): Promise<string> => {\n const availableBots = await api\n .listAllPages(api.client.listBots, (r) => r.bots)\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not fetch existing bots')\n })\n\n if (!availableBots.length) {\n throw new errors.NoBotsFoundError()\n }\n\n const prompted = await this.prompt.select('Which bot do you want to deploy?', {\n choices: availableBots.map((bot) => ({ title: bot.name, value: bot.id })),\n })\n\n if (!prompted) {\n throw new errors.ParamRequiredError('Bot Id')\n }\n\n return prompted\n }\n\n private _installChatIntegration = async (api: ApiClient, botId: string): Promise<IntegrationInstance> => {\n const line = this.logger.line()\n line.started('Installing chat integration...')\n\n const { integration } = await api.client.getPublicIntegration({\n name: 'chat',\n version: this._getChatApiTargetVersion(),\n })\n\n const { bot } = await api.client.updateBot({\n id: botId,\n integrations: {\n [integration.id]: {\n enabled: true,\n configuration: {}, // empty object will always be a valid chat integration configuration\n },\n },\n })\n\n line.success('Chat integration installed')\n line.commit()\n\n const inst = this._findChatInstance(bot)\n if (!inst) {\n throw new errors.BotpressCLIError('Chat integration was installed but could not be found')\n }\n\n return inst\n }\n\n private _findChatInstance = (bot: client.Bot): IntegrationInstance | undefined => {\n const integrationInstances = Object.entries(bot.integrations).map(([integrationId, integrationInstance]) => ({\n id: integrationId,\n instance: integrationInstance,\n }))\n\n const targetChatVersion = this._getChatApiTargetVersionRange()\n return integrationInstances.find(\n (i) => i.instance.name === 'chat' && semver.satisfies(i.instance.version, targetChatVersion)\n )\n }\n\n private _getChatApiTargetVersionRange = (): string => {\n const targetApiVersion = this._getChatApiTargetVersion()\n const nextMajor = semver.inc(targetApiVersion, 'major')\n return `>=${targetApiVersion} <${nextMajor}`\n }\n\n private _getChatApiTargetVersion = (): string => {\n const dummyClient = new chat.Client({ apiUrl: '' })\n return dummyClient.apiVersion\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["client", "chat", "semver"]
7
7
  }
@@ -292,6 +292,10 @@ class DevCommand extends import_project_command.ProjectCommand {
292
292
  const { bot: updatedBot } = await api.client.updateBot(updateBotBody).catch((thrown) => {
293
293
  throw errors.BotpressCLIError.wrap(thrown, "Could not deploy dev bot");
294
294
  });
295
+ const failedIntegrationNames = Object.values(updatedBot.integrations).filter((integration) => integration.enabled && integration.status === "registration_failed").map(({ name }) => name);
296
+ if (failedIntegrationNames.length > 0) {
297
+ throw new errors.BotpressCLIError(`${failedIntegrationNames.join(", ")} integrations failed to register`);
298
+ }
295
299
  updateLine.success(`Dev Bot deployed with id "${updatedBot.id}" at "${externalUrl}"`);
296
300
  updateLine.commit();
297
301
  const tablesPublisher = new tables.TablesPublisher({ api, logger: this.logger, prompt: this.prompt });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/dev-command.ts"],
4
- "sourcesContent": ["import type * as client from '@botpress/client'\nimport type * as sdk from '@botpress/sdk'\nimport { TunnelRequest, TunnelResponse } from '@bpinternal/tunnel'\nimport axios, { AxiosRequestConfig, AxiosResponse } from 'axios'\nimport chalk from 'chalk'\nimport * as pathlib from 'path'\nimport * as uuid from 'uuid'\nimport * as apiUtils from '../api'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport * as tables from '../tables'\nimport * as utils from '../utils'\nimport { Worker } from '../worker'\nimport { BuildCommand } from './build-command'\nimport { ProjectCommand, ProjectDefinition } from './project-command'\n\nconst DEFAULT_BOT_PORT = 8075\nconst DEFAULT_INTEGRATION_PORT = 8076\nconst TUNNEL_HELLO_INTERVAL = 5000\nconst FILEWATCHER_DEBOUNCE_MS = 2000\n\nexport type DevCommandDefinition = typeof commandDefinitions.dev\nexport class DevCommand extends ProjectCommand<DevCommandDefinition> {\n private _initialDef: ProjectDefinition | undefined = undefined\n\n public async run(): Promise<void> {\n this.logger.warn('This command is experimental and subject to breaking changes without notice.')\n\n const api = await this.ensureLoginAndCreateClient(this.argv)\n\n const projectDef = await this.readProjectDefinitionFromFS()\n if (projectDef.type === 'interface') {\n throw new errors.BotpressCLIError('This feature is not available for interfaces.')\n }\n this._initialDef = projectDef\n\n let env: Record<string, string> = {\n ...process.env,\n BP_API_URL: api.url,\n BP_TOKEN: api.token,\n }\n\n let defaultPort = DEFAULT_BOT_PORT\n if (this._initialDef.type === 'integration') {\n defaultPort = DEFAULT_INTEGRATION_PORT\n // TODO: store secrets in local cache to avoid prompting every time\n const secretEnvVariables = await this.promptSecrets(this._initialDef.definition, this.argv, { formatEnv: true })\n const nonNullSecretEnvVariables = utils.records.filterValues(secretEnvVariables, utils.guards.is.notNull)\n env = { ...env, ...nonNullSecretEnvVariables }\n }\n\n const port = this.argv.port ?? defaultPort\n\n const urlParseResult = utils.url.parse(this.argv.tunnelUrl)\n if (urlParseResult.status === 'error') {\n throw new errors.BotpressCLIError(`Invalid tunnel URL: ${urlParseResult.error}`)\n }\n\n const tunnelId = uuid.v4()\n\n const { url: parsedTunnelUrl } = urlParseResult\n const isSecured = parsedTunnelUrl.protocol === 'https' || parsedTunnelUrl.protocol === 'wss'\n\n const wsTunnelUrl: string = utils.url.format({ ...parsedTunnelUrl, protocol: isSecured ? 'wss' : 'ws' })\n const httpTunnelUrl: string = utils.url.format({\n ...parsedTunnelUrl,\n protocol: isSecured ? 'https' : 'http',\n path: `/${tunnelId}`,\n })\n\n let worker: Worker | undefined = undefined\n\n const supervisor = new utils.tunnel.TunnelSupervisor(wsTunnelUrl, tunnelId, this.logger)\n supervisor.events.on('connected', ({ tunnel }) => {\n // prevents the tunnel from closing due to inactivity\n const timer = setInterval(() => {\n if (tunnel.closed) {\n return handleClose()\n }\n tunnel.hello()\n }, TUNNEL_HELLO_INTERVAL)\n const handleClose = (): void => clearInterval(timer)\n tunnel.events.on('close', handleClose)\n\n tunnel.events.on('request', (req) => {\n if (!worker) {\n this.logger.debug('Worker not ready yet, ignoring request')\n tunnel.send({ requestId: req.id, status: 503, body: 'Worker not ready yet' })\n return\n }\n\n void this._forwardTunnelRequest(`http://localhost:${port}`, req)\n .then((res) => {\n tunnel.send(res)\n })\n .catch((thrown) => {\n const err = errors.BotpressCLIError.wrap(thrown, 'An error occurred while handling request')\n this.logger.error(err.message)\n tunnel.send({\n requestId: req.id,\n status: 500,\n body: err.message,\n })\n })\n })\n })\n\n supervisor.events.on('manuallyClosed', () => {\n this.logger.debug('Tunnel manually closed')\n })\n\n await supervisor.start()\n\n await this._runBuild()\n await this._deploy(api, httpTunnelUrl)\n worker = await this._spawnWorker(env, port)\n\n try {\n const watcher = await utils.filewatcher.FileWatcher.watch(\n this.argv.workDir,\n async (events) => {\n if (!worker) {\n this.logger.debug('Worker not ready yet, ignoring file change event')\n return\n }\n\n const typescriptEvents = events.filter((e) => pathlib.extname(e.path) === '.ts')\n if (typescriptEvents.length === 0) {\n return\n }\n\n this.logger.log('Changes detected, rebuilding')\n await this._restart(api, worker, httpTunnelUrl)\n },\n {\n ignore: [this.projectPaths.abs.outDir],\n debounceMs: FILEWATCHER_DEBOUNCE_MS,\n }\n )\n\n await Promise.race([worker.wait(), watcher.wait(), supervisor.wait()])\n\n if (worker.running) {\n await worker.kill()\n }\n await watcher.close()\n supervisor.close()\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, 'An error occurred while running the dev server')\n } finally {\n if (worker.running) {\n await worker.kill()\n }\n }\n }\n\n private _restart = async (api: apiUtils.ApiClient, worker: Worker, tunnelUrl: string) => {\n try {\n await this._runBuild()\n } catch (thrown) {\n const error = errors.BotpressCLIError.wrap(thrown, 'Build failed')\n this.logger.error(error.message)\n return\n }\n\n await this._deploy(api, tunnelUrl)\n await worker.reload()\n }\n\n private _deploy = async (api: apiUtils.ApiClient, tunnelUrl: string) => {\n const projectDef = await this.readProjectDefinitionFromFS()\n\n if (projectDef.type === 'interface') {\n throw new errors.BotpressCLIError('This feature is not available for interfaces.')\n }\n if (projectDef.type === 'integration') {\n this._checkSecrets(projectDef.definition)\n return await this._deployDevIntegration(api, tunnelUrl, projectDef.definition)\n }\n if (projectDef.type === 'bot') {\n return await this._deployDevBot(api, tunnelUrl, projectDef.definition)\n }\n throw new errors.UnsupportedProjectType()\n }\n\n private _checkSecrets(integrationDef: sdk.IntegrationDefinition) {\n if (this._initialDef?.type !== 'integration') {\n return\n }\n const initialSecrets = this._initialDef?.definition.secrets ?? {}\n const currentSecrets = integrationDef.secrets ?? {}\n const newSecrets = Object.keys(currentSecrets).filter((s) => !initialSecrets[s])\n if (newSecrets.length > 0) {\n throw new errors.BotpressCLIError('Secrets were added while the server was running. A restart is required.')\n }\n }\n\n private _spawnWorker = async (env: Record<string, string>, port: number) => {\n const outfile = this.projectPaths.abs.outFileCJS\n const importPath = utils.path.toUnix(outfile)\n const code = `require('${importPath}').default.start(${port})`\n const worker = await Worker.spawn(\n {\n type: 'code',\n code,\n env,\n },\n this.logger\n ).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not start dev worker')\n })\n\n return worker\n }\n\n private _runBuild() {\n return new BuildCommand(this.api, this.prompt, this.logger, this.argv).run()\n }\n\n private async _deployDevIntegration(\n api: apiUtils.ApiClient,\n externalUrl: string,\n integrationDef: sdk.IntegrationDefinition\n ): Promise<void> {\n const devId = await this.projectCache.get('devId')\n\n let integration: client.Integration | undefined = undefined\n\n if (devId) {\n const resp = await api.client.getIntegration({ id: devId }).catch(async (thrown) => {\n const err = errors.BotpressCLIError.wrap(thrown, `Could not find existing dev integration with id \"${devId}\"`)\n this.logger.warn(err.message)\n return { integration: undefined }\n })\n\n if (resp.integration?.dev) {\n integration = resp.integration\n } else {\n await this.projectCache.rm('devId')\n }\n }\n\n const line = this.logger.line()\n line.started(`Deploying dev integration ${chalk.bold(integrationDef.name)}...`)\n\n const createIntegrationBody = {\n ...(await this.prepareCreateIntegrationBody(integrationDef)),\n ...(await this.prepareIntegrationDependencies(integrationDef, api)),\n url: externalUrl,\n }\n\n if (integration) {\n const updateIntegrationBody = apiUtils.prepareUpdateIntegrationBody(\n { ...createIntegrationBody, id: integration.id },\n integration\n )\n\n const resp = await api.client.updateIntegration(updateIntegrationBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update dev integration \"${integrationDef.name}\"`)\n })\n integration = resp.integration\n } else {\n const resp = await api.client.createIntegration({ ...createIntegrationBody, dev: true }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not deploy dev integration \"${integrationDef.name}\"`)\n })\n integration = resp.integration\n }\n\n line.success(`Dev Integration deployed with id \"${integration.id}\" at \"${externalUrl}\"`)\n line.commit()\n\n await this.projectCache.set('devId', integration.id)\n }\n\n private async _deployDevBot(api: apiUtils.ApiClient, externalUrl: string, botDef: sdk.BotDefinition): Promise<void> {\n const devId = await this.projectCache.get('devId')\n\n let bot: client.Bot | undefined = undefined\n\n if (devId) {\n const resp = await api.client.getBot({ id: devId }).catch(async (thrown) => {\n const err = errors.BotpressCLIError.wrap(thrown, `Could not find existing dev bot with id \"${devId}\"`)\n this.logger.warn(err.message)\n return { bot: undefined }\n })\n\n if (resp.bot?.dev) {\n bot = resp.bot\n } else {\n await this.projectCache.rm('devId')\n }\n }\n\n if (!bot) {\n const createLine = this.logger.line()\n createLine.started('Creating dev bot...')\n const resp = await api.client\n .createBot({\n dev: true,\n url: externalUrl,\n })\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not deploy dev bot')\n })\n\n bot = resp.bot\n createLine.log('Dev Bot created')\n createLine.commit()\n await this.projectCache.set('devId', bot.id)\n }\n\n const updateLine = this.logger.line()\n updateLine.started('Deploying dev bot...')\n\n const updateBotBody = apiUtils.prepareUpdateBotBody(\n {\n ...(await apiUtils.prepareCreateBotBody(botDef)),\n ...(await this.prepareBotDependencies(botDef, api)),\n id: bot.id,\n url: externalUrl,\n },\n bot\n )\n\n const { bot: updatedBot } = await api.client.updateBot(updateBotBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not deploy dev bot')\n })\n updateLine.success(`Dev Bot deployed with id \"${updatedBot.id}\" at \"${externalUrl}\"`)\n updateLine.commit()\n\n const tablesPublisher = new tables.TablesPublisher({ api, logger: this.logger, prompt: this.prompt })\n await tablesPublisher.deployTables({ botId: updatedBot.id, botDefinition: botDef })\n\n this.displayWebhookUrls(updatedBot)\n }\n\n private _forwardTunnelRequest = async (baseUrl: string, request: TunnelRequest): Promise<TunnelResponse> => {\n const axiosConfig = {\n method: request.method,\n url: this._formatLocalUrl(baseUrl, request),\n headers: request.headers,\n data: request.body,\n responseType: 'text',\n validateStatus: () => true,\n } satisfies AxiosRequestConfig\n\n this.logger.debug(`Forwarding request to ${axiosConfig.url}`)\n const response = await axios(axiosConfig)\n this.logger.debug('Sending back response up the tunnel')\n\n return {\n requestId: request.id,\n status: response.status,\n headers: this._getHeaders(response.headers),\n body: response.data,\n }\n }\n\n private _formatLocalUrl = (baseUrl: string, req: TunnelRequest): string => {\n if (req.query) {\n return `${baseUrl}${req.path}?${req.query}`\n }\n return `${baseUrl}${req.path}`\n }\n\n private _getHeaders = (res: AxiosResponse['headers']): TunnelResponse['headers'] => {\n const headers: TunnelResponse['headers'] = {}\n for (const key in res) {\n if (typeof res[key] === 'string' || typeof res[key] === 'number') {\n headers[key] = String(res[key])\n }\n }\n return headers\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type * as client from '@botpress/client'\nimport type * as sdk from '@botpress/sdk'\nimport { TunnelRequest, TunnelResponse } from '@bpinternal/tunnel'\nimport axios, { AxiosRequestConfig, AxiosResponse } from 'axios'\nimport chalk from 'chalk'\nimport * as pathlib from 'path'\nimport * as uuid from 'uuid'\nimport * as apiUtils from '../api'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport * as tables from '../tables'\nimport * as utils from '../utils'\nimport { Worker } from '../worker'\nimport { BuildCommand } from './build-command'\nimport { ProjectCommand, ProjectDefinition } from './project-command'\n\nconst DEFAULT_BOT_PORT = 8075\nconst DEFAULT_INTEGRATION_PORT = 8076\nconst TUNNEL_HELLO_INTERVAL = 5000\nconst FILEWATCHER_DEBOUNCE_MS = 2000\n\nexport type DevCommandDefinition = typeof commandDefinitions.dev\nexport class DevCommand extends ProjectCommand<DevCommandDefinition> {\n private _initialDef: ProjectDefinition | undefined = undefined\n\n public async run(): Promise<void> {\n this.logger.warn('This command is experimental and subject to breaking changes without notice.')\n\n const api = await this.ensureLoginAndCreateClient(this.argv)\n\n const projectDef = await this.readProjectDefinitionFromFS()\n if (projectDef.type === 'interface') {\n throw new errors.BotpressCLIError('This feature is not available for interfaces.')\n }\n this._initialDef = projectDef\n\n let env: Record<string, string> = {\n ...process.env,\n BP_API_URL: api.url,\n BP_TOKEN: api.token,\n }\n\n let defaultPort = DEFAULT_BOT_PORT\n if (this._initialDef.type === 'integration') {\n defaultPort = DEFAULT_INTEGRATION_PORT\n // TODO: store secrets in local cache to avoid prompting every time\n const secretEnvVariables = await this.promptSecrets(this._initialDef.definition, this.argv, { formatEnv: true })\n const nonNullSecretEnvVariables = utils.records.filterValues(secretEnvVariables, utils.guards.is.notNull)\n env = { ...env, ...nonNullSecretEnvVariables }\n }\n\n const port = this.argv.port ?? defaultPort\n\n const urlParseResult = utils.url.parse(this.argv.tunnelUrl)\n if (urlParseResult.status === 'error') {\n throw new errors.BotpressCLIError(`Invalid tunnel URL: ${urlParseResult.error}`)\n }\n\n const tunnelId = uuid.v4()\n\n const { url: parsedTunnelUrl } = urlParseResult\n const isSecured = parsedTunnelUrl.protocol === 'https' || parsedTunnelUrl.protocol === 'wss'\n\n const wsTunnelUrl: string = utils.url.format({ ...parsedTunnelUrl, protocol: isSecured ? 'wss' : 'ws' })\n const httpTunnelUrl: string = utils.url.format({\n ...parsedTunnelUrl,\n protocol: isSecured ? 'https' : 'http',\n path: `/${tunnelId}`,\n })\n\n let worker: Worker | undefined = undefined\n\n const supervisor = new utils.tunnel.TunnelSupervisor(wsTunnelUrl, tunnelId, this.logger)\n supervisor.events.on('connected', ({ tunnel }) => {\n // prevents the tunnel from closing due to inactivity\n const timer = setInterval(() => {\n if (tunnel.closed) {\n return handleClose()\n }\n tunnel.hello()\n }, TUNNEL_HELLO_INTERVAL)\n const handleClose = (): void => clearInterval(timer)\n tunnel.events.on('close', handleClose)\n\n tunnel.events.on('request', (req) => {\n if (!worker) {\n this.logger.debug('Worker not ready yet, ignoring request')\n tunnel.send({ requestId: req.id, status: 503, body: 'Worker not ready yet' })\n return\n }\n\n void this._forwardTunnelRequest(`http://localhost:${port}`, req)\n .then((res) => {\n tunnel.send(res)\n })\n .catch((thrown) => {\n const err = errors.BotpressCLIError.wrap(thrown, 'An error occurred while handling request')\n this.logger.error(err.message)\n tunnel.send({\n requestId: req.id,\n status: 500,\n body: err.message,\n })\n })\n })\n })\n\n supervisor.events.on('manuallyClosed', () => {\n this.logger.debug('Tunnel manually closed')\n })\n\n await supervisor.start()\n\n await this._runBuild()\n await this._deploy(api, httpTunnelUrl)\n worker = await this._spawnWorker(env, port)\n\n try {\n const watcher = await utils.filewatcher.FileWatcher.watch(\n this.argv.workDir,\n async (events) => {\n if (!worker) {\n this.logger.debug('Worker not ready yet, ignoring file change event')\n return\n }\n\n const typescriptEvents = events.filter((e) => pathlib.extname(e.path) === '.ts')\n if (typescriptEvents.length === 0) {\n return\n }\n\n this.logger.log('Changes detected, rebuilding')\n await this._restart(api, worker, httpTunnelUrl)\n },\n {\n ignore: [this.projectPaths.abs.outDir],\n debounceMs: FILEWATCHER_DEBOUNCE_MS,\n }\n )\n\n await Promise.race([worker.wait(), watcher.wait(), supervisor.wait()])\n\n if (worker.running) {\n await worker.kill()\n }\n await watcher.close()\n supervisor.close()\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, 'An error occurred while running the dev server')\n } finally {\n if (worker.running) {\n await worker.kill()\n }\n }\n }\n\n private _restart = async (api: apiUtils.ApiClient, worker: Worker, tunnelUrl: string) => {\n try {\n await this._runBuild()\n } catch (thrown) {\n const error = errors.BotpressCLIError.wrap(thrown, 'Build failed')\n this.logger.error(error.message)\n return\n }\n\n await this._deploy(api, tunnelUrl)\n await worker.reload()\n }\n\n private _deploy = async (api: apiUtils.ApiClient, tunnelUrl: string) => {\n const projectDef = await this.readProjectDefinitionFromFS()\n\n if (projectDef.type === 'interface') {\n throw new errors.BotpressCLIError('This feature is not available for interfaces.')\n }\n if (projectDef.type === 'integration') {\n this._checkSecrets(projectDef.definition)\n return await this._deployDevIntegration(api, tunnelUrl, projectDef.definition)\n }\n if (projectDef.type === 'bot') {\n return await this._deployDevBot(api, tunnelUrl, projectDef.definition)\n }\n throw new errors.UnsupportedProjectType()\n }\n\n private _checkSecrets(integrationDef: sdk.IntegrationDefinition) {\n if (this._initialDef?.type !== 'integration') {\n return\n }\n const initialSecrets = this._initialDef?.definition.secrets ?? {}\n const currentSecrets = integrationDef.secrets ?? {}\n const newSecrets = Object.keys(currentSecrets).filter((s) => !initialSecrets[s])\n if (newSecrets.length > 0) {\n throw new errors.BotpressCLIError('Secrets were added while the server was running. A restart is required.')\n }\n }\n\n private _spawnWorker = async (env: Record<string, string>, port: number) => {\n const outfile = this.projectPaths.abs.outFileCJS\n const importPath = utils.path.toUnix(outfile)\n const code = `require('${importPath}').default.start(${port})`\n const worker = await Worker.spawn(\n {\n type: 'code',\n code,\n env,\n },\n this.logger\n ).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not start dev worker')\n })\n\n return worker\n }\n\n private _runBuild() {\n return new BuildCommand(this.api, this.prompt, this.logger, this.argv).run()\n }\n\n private async _deployDevIntegration(\n api: apiUtils.ApiClient,\n externalUrl: string,\n integrationDef: sdk.IntegrationDefinition\n ): Promise<void> {\n const devId = await this.projectCache.get('devId')\n\n let integration: client.Integration | undefined = undefined\n\n if (devId) {\n const resp = await api.client.getIntegration({ id: devId }).catch(async (thrown) => {\n const err = errors.BotpressCLIError.wrap(thrown, `Could not find existing dev integration with id \"${devId}\"`)\n this.logger.warn(err.message)\n return { integration: undefined }\n })\n\n if (resp.integration?.dev) {\n integration = resp.integration\n } else {\n await this.projectCache.rm('devId')\n }\n }\n\n const line = this.logger.line()\n line.started(`Deploying dev integration ${chalk.bold(integrationDef.name)}...`)\n\n const createIntegrationBody = {\n ...(await this.prepareCreateIntegrationBody(integrationDef)),\n ...(await this.prepareIntegrationDependencies(integrationDef, api)),\n url: externalUrl,\n }\n\n if (integration) {\n const updateIntegrationBody = apiUtils.prepareUpdateIntegrationBody(\n { ...createIntegrationBody, id: integration.id },\n integration\n )\n\n const resp = await api.client.updateIntegration(updateIntegrationBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update dev integration \"${integrationDef.name}\"`)\n })\n integration = resp.integration\n } else {\n const resp = await api.client.createIntegration({ ...createIntegrationBody, dev: true }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not deploy dev integration \"${integrationDef.name}\"`)\n })\n integration = resp.integration\n }\n\n line.success(`Dev Integration deployed with id \"${integration.id}\" at \"${externalUrl}\"`)\n line.commit()\n\n await this.projectCache.set('devId', integration.id)\n }\n\n private async _deployDevBot(api: apiUtils.ApiClient, externalUrl: string, botDef: sdk.BotDefinition): Promise<void> {\n const devId = await this.projectCache.get('devId')\n\n let bot: client.Bot | undefined = undefined\n\n if (devId) {\n const resp = await api.client.getBot({ id: devId }).catch(async (thrown) => {\n const err = errors.BotpressCLIError.wrap(thrown, `Could not find existing dev bot with id \"${devId}\"`)\n this.logger.warn(err.message)\n return { bot: undefined }\n })\n\n if (resp.bot?.dev) {\n bot = resp.bot\n } else {\n await this.projectCache.rm('devId')\n }\n }\n\n if (!bot) {\n const createLine = this.logger.line()\n createLine.started('Creating dev bot...')\n const resp = await api.client\n .createBot({\n dev: true,\n url: externalUrl,\n })\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not deploy dev bot')\n })\n\n bot = resp.bot\n createLine.log('Dev Bot created')\n createLine.commit()\n await this.projectCache.set('devId', bot.id)\n }\n\n const updateLine = this.logger.line()\n updateLine.started('Deploying dev bot...')\n\n const updateBotBody = apiUtils.prepareUpdateBotBody(\n {\n ...(await apiUtils.prepareCreateBotBody(botDef)),\n ...(await this.prepareBotDependencies(botDef, api)),\n id: bot.id,\n url: externalUrl,\n },\n bot\n )\n\n const { bot: updatedBot } = await api.client.updateBot(updateBotBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not deploy dev bot')\n })\n\n const failedIntegrationNames = Object.values(updatedBot.integrations)\n .filter((integration) => integration.enabled && integration.status === 'registration_failed')\n .map(({ name }) => name)\n\n if (failedIntegrationNames.length > 0) {\n throw new errors.BotpressCLIError(`${failedIntegrationNames.join(', ')} integrations failed to register`)\n }\n\n updateLine.success(`Dev Bot deployed with id \"${updatedBot.id}\" at \"${externalUrl}\"`)\n updateLine.commit()\n\n const tablesPublisher = new tables.TablesPublisher({ api, logger: this.logger, prompt: this.prompt })\n await tablesPublisher.deployTables({ botId: updatedBot.id, botDefinition: botDef })\n\n this.displayWebhookUrls(updatedBot)\n }\n\n private _forwardTunnelRequest = async (baseUrl: string, request: TunnelRequest): Promise<TunnelResponse> => {\n const axiosConfig = {\n method: request.method,\n url: this._formatLocalUrl(baseUrl, request),\n headers: request.headers,\n data: request.body,\n responseType: 'text',\n validateStatus: () => true,\n } satisfies AxiosRequestConfig\n\n this.logger.debug(`Forwarding request to ${axiosConfig.url}`)\n const response = await axios(axiosConfig)\n this.logger.debug('Sending back response up the tunnel')\n\n return {\n requestId: request.id,\n status: response.status,\n headers: this._getHeaders(response.headers),\n body: response.data,\n }\n }\n\n private _formatLocalUrl = (baseUrl: string, req: TunnelRequest): string => {\n if (req.query) {\n return `${baseUrl}${req.path}?${req.query}`\n }\n return `${baseUrl}${req.path}`\n }\n\n private _getHeaders = (res: AxiosResponse['headers']): TunnelResponse['headers'] => {\n const headers: TunnelResponse['headers'] = {}\n for (const key in res) {\n if (typeof res[key] === 'string' || typeof res[key] === 'number') {\n headers[key] = String(res[key])\n }\n }\n return headers\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["chalk", "axios"]
7
7
  }
@@ -0,0 +1,14 @@
1
+ import rootConfig from '../../eslint.config.mjs'
2
+
3
+ export default [
4
+ ...rootConfig,
5
+ {
6
+ ignores: ['templates/**/*', 'e2e/fixtures/**/*'],
7
+ languageOptions: {
8
+ parserOptions: {
9
+ project: ['./tsconfig.json'],
10
+ tsconfigRootDir: import.meta.dirname,
11
+ },
12
+ },
13
+ },
14
+ ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botpress/cli",
3
- "version": "4.17.7",
3
+ "version": "4.17.8",
4
4
  "description": "Botpress CLI",
5
5
  "scripts": {
6
6
  "build": "pnpm run bundle && pnpm run template:gen",
@@ -24,5 +24,5 @@
24
24
  "noPropertyAccessFromIndexSignature": false,
25
25
  "noUnusedLocals": false
26
26
  },
27
- "include": [".botpress/**/*", "src/**/*", "./*.ts", "./*.json"]
27
+ "include": [".botpress/**/*", "src/**/*", "*.ts", "*.json"]
28
28
  }
@@ -24,5 +24,5 @@
24
24
  "noPropertyAccessFromIndexSignature": false,
25
25
  "noUnusedLocals": false
26
26
  },
27
- "include": [".botpress/**/*", "src/**/*", "./*.ts", "./*.json"]
27
+ "include": [".botpress/**/*", "src/**/*", "*.ts", "*.json"]
28
28
  }
@@ -24,5 +24,5 @@
24
24
  "noPropertyAccessFromIndexSignature": false,
25
25
  "noUnusedLocals": false
26
26
  },
27
- "include": [".botpress/**/*", "src/**/*", "./*.ts", "./*.json"]
27
+ "include": [".botpress/**/*", "src/**/*", "*.ts", "*.json"]
28
28
  }
@@ -24,5 +24,5 @@
24
24
  "noPropertyAccessFromIndexSignature": false,
25
25
  "noUnusedLocals": false
26
26
  },
27
- "include": [".botpress/**/*", "src/**/*", "./*.ts", "./*.json"]
27
+ "include": [".botpress/**/*", "src/**/*", "*.ts", "*.json"]
28
28
  }
@@ -24,5 +24,5 @@
24
24
  "noPropertyAccessFromIndexSignature": false,
25
25
  "noUnusedLocals": false
26
26
  },
27
- "include": [".botpress/**/*", "src/**/*", "./*.ts", "./*.json"]
27
+ "include": [".botpress/**/*", "src/**/*", "*.ts", "*.json"]
28
28
  }