@botpress/cli 3.1.2 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,22 +1,22 @@
1
1
 
2
- > @botpress/cli@3.1.2 build /home/runner/work/botpress/botpress/packages/cli
2
+ > @botpress/cli@3.2.0 build /home/runner/work/botpress/botpress/packages/cli
3
3
  > pnpm run bundle && pnpm run template:gen
4
4
 
5
5
 
6
- > @botpress/cli@3.1.2 bundle /home/runner/work/botpress/botpress/packages/cli
6
+ > @botpress/cli@3.2.0 bundle /home/runner/work/botpress/botpress/packages/cli
7
7
  > ts-node -T build.ts
8
8
 
9
9
 
10
- > @botpress/cli@3.1.2 template:gen /home/runner/work/botpress/botpress/packages/cli
10
+ > @botpress/cli@3.2.0 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 v3.1.2
14
- šŸ¤– Botpress CLI v3.1.2
15
- šŸ¤– Botpress CLI v3.1.2
16
- šŸ¤– Botpress CLI v3.1.2
17
- ā—‹ Generating typings for integration hello-world...ā—‹ Generating typings for bot...āœ“ Typings available at .botpress
18
- ā—‹ Generating typings for plugin empty-plugin...āœ“ Typings available at .botpress
13
+ šŸ¤– Botpress CLI v3.2.0
14
+ šŸ¤– Botpress CLI v3.2.0
15
+ šŸ¤– Botpress CLI v3.2.0
16
+ šŸ¤– Botpress CLI v3.2.0
17
+ ā—‹ Generating typings for integration empty-integration...ā—‹ Generating typings for integration hello-world...āœ“ Typings available at .botpress
18
+ ā—‹ Generating typings for bot...āœ“ Typings available at .botpress
19
19
  āœ“ Typings available at .botpress
20
- ā—‹ Generating typings for integration empty-integration...āœ“ Typings available at .botpress
21
- šŸ¤– Botpress CLI v3.1.2
20
+ ā—‹ Generating typings for plugin empty-plugin...āœ“ Typings available at .botpress
21
+ šŸ¤– Botpress CLI v3.2.0
22
22
  ā—‹ Generating typings for integration webhook-message...āœ“ Typings available at .botpress
@@ -70,8 +70,8 @@ class ApiClient {
70
70
  return this.client.getWorkspace({ id: this.workspaceId });
71
71
  }
72
72
  async findWorkspaceByHandle(handle) {
73
- const workspaces = await paging.listAllPages(this.client.listWorkspaces, (r) => r.workspaces);
74
- return workspaces.find((w) => w.handle === handle);
73
+ const { workspaces } = await this.client.listWorkspaces({ handle });
74
+ return workspaces[0];
75
75
  }
76
76
  switchWorkspace(workspaceId) {
77
77
  return ApiClient.newClient({ apiUrl: this.url, token: this.token, workspaceId }, this._logger);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/api/client.ts"],
4
- "sourcesContent": ["import * as client from '@botpress/client'\nimport semver from 'semver'\nimport yn from 'yn'\nimport type { Logger } from '../logger'\nimport { formatPackageRef, ApiPackageRef, NamePackageRef, isLatest } from '../package-ref'\nimport * as utils from '../utils'\nimport { findPreviousIntegrationVersion } from './find-previous-version'\nimport * as paging from './paging'\n\nimport {\n ApiClientProps,\n PublicIntegration,\n PrivateIntegration,\n Integration,\n Interface,\n Plugin,\n BotSummary,\n} from './types'\n\nexport * from './types'\n\n/**\n * This class is used to wrap the Botpress API and provide a more convenient way to interact with it.\n */\nexport class ApiClient {\n public readonly client: client.Client\n public readonly url: string\n public readonly token: string\n public readonly workspaceId: string\n public readonly botId?: string\n\n public static newClient = (props: ApiClientProps, logger: Logger) => new ApiClient(props, logger)\n\n public constructor(\n props: ApiClientProps,\n private _logger: Logger\n ) {\n const { apiUrl, token, workspaceId, botId } = props\n this.client = new client.Client({ apiUrl, token, workspaceId, botId })\n this.url = apiUrl\n this.token = token\n this.workspaceId = workspaceId\n this.botId = botId\n }\n\n public get isBotpressWorkspace(): boolean {\n // this environment variable is undocumented and only used internally for dev purposes\n const isBotpressWorkspace = yn(process.env.BP_IS_BOTPRESS_WORKSPACE)\n if (isBotpressWorkspace !== undefined) {\n return isBotpressWorkspace\n }\n return [\n '6a76fa10-e150-4ff6-8f59-a300feec06c1',\n '95de33eb-1551-4af9-9088-e5dcb02efd09',\n '11111111-1111-1111-aaaa-111111111111',\n ].includes(this.workspaceId)\n }\n\n public async getWorkspace(): Promise<client.ClientOutputs['getWorkspace']> {\n return this.client.getWorkspace({ id: this.workspaceId })\n }\n\n public async findWorkspaceByHandle(handle: string): Promise<client.ClientOutputs['getWorkspace'] | undefined> {\n const workspaces = await paging.listAllPages(this.client.listWorkspaces, (r) => r.workspaces)\n return workspaces.find((w) => w.handle === handle)\n }\n\n public switchWorkspace(workspaceId: string): ApiClient {\n return ApiClient.newClient({ apiUrl: this.url, token: this.token, workspaceId }, this._logger)\n }\n\n public switchBot(botId: string): ApiClient {\n return ApiClient.newClient(\n { apiUrl: this.url, token: this.token, botId, workspaceId: this.workspaceId },\n this._logger\n )\n }\n\n public async updateWorkspace(\n props: utils.types.SafeOmit<client.ClientInputs['updateWorkspace'], 'id'>\n ): Promise<client.ClientOutputs['updateWorkspace']> {\n return this.client.updateWorkspace({ id: this.workspaceId, ...props })\n }\n\n public async getIntegration(ref: ApiPackageRef): Promise<Integration> {\n const integration = await this.findIntegration(ref)\n if (!integration) {\n throw new Error(`Integration \"${formatPackageRef(ref)}\" not found`)\n }\n return integration\n }\n\n public async findIntegration(ref: ApiPackageRef): Promise<Integration | undefined> {\n const formatted = formatPackageRef(ref)\n\n const privateIntegration = await this.findPrivateIntegration(ref)\n if (privateIntegration) {\n this._logger.debug(`Found integration \"${formatted}\" in workspace`)\n return privateIntegration\n }\n\n const publicIntegration = await this.findPublicIntegration(ref)\n if (publicIntegration) {\n this._logger.debug(`Found integration \"${formatted}\" in hub`)\n return publicIntegration\n }\n\n return\n }\n\n public async findPrivateIntegration(ref: ApiPackageRef): Promise<PrivateIntegration | undefined> {\n const { workspaceId } = this\n if (ref.type === 'id') {\n return this.client\n .getIntegration(ref)\n .then((r) => ({ ...r.integration, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getIntegrationByName(ref)\n .then((r) => ({ ...r.integration, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async findPublicIntegration(ref: ApiPackageRef): Promise<PublicIntegration | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getPublicIntegrationById(ref)\n .then((r) => r.integration)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getPublicIntegration(ref)\n .then((r) => r.integration)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async getPublicInterface(ref: ApiPackageRef): Promise<Interface> {\n const intrface = await this.findPublicInterface(ref)\n if (!intrface) {\n throw new Error(`Interface \"${formatPackageRef(ref)}\" not found`)\n }\n return intrface\n }\n\n public async findPublicInterface(ref: ApiPackageRef): Promise<Interface | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getInterface(ref)\n .then((r) => r.interface)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n if (isLatest(ref)) {\n // TODO: handle latest keyword in backend\n return this._findLatestInterfaceVersion(ref)\n }\n\n return this.client\n .getInterfaceByName(ref)\n .then((r) => r.interface)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async findPublicPlugin(ref: ApiPackageRef): Promise<Plugin | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getPlugin(ref)\n .then((r) => r.plugin)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n if (isLatest(ref)) {\n // TODO: handle latest keyword in backend\n return this._findLatestPluginVersion(ref)\n }\n\n return this.client\n .getPluginByName(ref)\n .then((r) => r.plugin)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n private _findLatestInterfaceVersion = async ({ name }: NamePackageRef): Promise<Interface | undefined> => {\n const { interfaces: allVersions } = await this.client.listInterfaces({ name })\n const sorted = allVersions.sort((a, b) => semver.compare(b.version, a.version))\n const latestVersion = sorted[0]\n if (!latestVersion) {\n return\n }\n return this.client.getInterface({ id: latestVersion.id }).then((r) => r.interface)\n }\n\n private _findLatestPluginVersion = async ({ name }: NamePackageRef): Promise<Plugin | undefined> => {\n const { plugins: allVersions } = await this.client.listPlugins({ name })\n const sorted = allVersions.sort((a, b) => semver.compare(b.version, a.version))\n const latestVersion = sorted[0]\n if (!latestVersion) {\n return\n }\n return this.client.getPlugin({ id: latestVersion.id }).then((r) => r.plugin)\n }\n\n public async testLogin(): Promise<void> {\n await this.client.listBots({})\n }\n\n public listAllPages = paging.listAllPages\n\n public async findPreviousIntegrationVersion(ref: NamePackageRef): Promise<Integration | undefined> {\n const previous = await findPreviousIntegrationVersion(this.client, ref)\n if (!previous) {\n return\n }\n return this.findIntegration({ type: 'id', id: previous.id })\n }\n\n public async findBotByName(name: string): Promise<BotSummary | undefined> {\n // api does not allow filtering bots by name\n const allBots = await this.listAllPages(this.client.listBots, (r) => r.bots)\n return allBots.find((b) => b.name === name)\n }\n\n private _returnUndefinedOnError =\n (type: client.ApiError['type']) =>\n (thrown: any): undefined => {\n if (client.isApiError(thrown) && thrown.type === type) {\n return\n }\n throw thrown\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as client from '@botpress/client'\nimport semver from 'semver'\nimport yn from 'yn'\nimport type { Logger } from '../logger'\nimport { formatPackageRef, ApiPackageRef, NamePackageRef, isLatest } from '../package-ref'\nimport * as utils from '../utils'\nimport { findPreviousIntegrationVersion } from './find-previous-version'\nimport * as paging from './paging'\n\nimport {\n ApiClientProps,\n PublicIntegration,\n PrivateIntegration,\n Integration,\n Interface,\n Plugin,\n BotSummary,\n} from './types'\n\nexport * from './types'\n\n/**\n * This class is used to wrap the Botpress API and provide a more convenient way to interact with it.\n */\nexport class ApiClient {\n public readonly client: client.Client\n public readonly url: string\n public readonly token: string\n public readonly workspaceId: string\n public readonly botId?: string\n\n public static newClient = (props: ApiClientProps, logger: Logger) => new ApiClient(props, logger)\n\n public constructor(\n props: ApiClientProps,\n private _logger: Logger\n ) {\n const { apiUrl, token, workspaceId, botId } = props\n this.client = new client.Client({ apiUrl, token, workspaceId, botId })\n this.url = apiUrl\n this.token = token\n this.workspaceId = workspaceId\n this.botId = botId\n }\n\n public get isBotpressWorkspace(): boolean {\n // this environment variable is undocumented and only used internally for dev purposes\n const isBotpressWorkspace = yn(process.env.BP_IS_BOTPRESS_WORKSPACE)\n if (isBotpressWorkspace !== undefined) {\n return isBotpressWorkspace\n }\n return [\n '6a76fa10-e150-4ff6-8f59-a300feec06c1',\n '95de33eb-1551-4af9-9088-e5dcb02efd09',\n '11111111-1111-1111-aaaa-111111111111',\n ].includes(this.workspaceId)\n }\n\n public async getWorkspace(): Promise<client.ClientOutputs['getWorkspace']> {\n return this.client.getWorkspace({ id: this.workspaceId })\n }\n\n public async findWorkspaceByHandle(handle: string): Promise<client.ClientOutputs['getWorkspace'] | undefined> {\n const { workspaces } = await this.client.listWorkspaces({ handle })\n return workspaces[0] // There should be only one workspace with a given handle\n }\n\n public switchWorkspace(workspaceId: string): ApiClient {\n return ApiClient.newClient({ apiUrl: this.url, token: this.token, workspaceId }, this._logger)\n }\n\n public switchBot(botId: string): ApiClient {\n return ApiClient.newClient(\n { apiUrl: this.url, token: this.token, botId, workspaceId: this.workspaceId },\n this._logger\n )\n }\n\n public async updateWorkspace(\n props: utils.types.SafeOmit<client.ClientInputs['updateWorkspace'], 'id'>\n ): Promise<client.ClientOutputs['updateWorkspace']> {\n return this.client.updateWorkspace({ id: this.workspaceId, ...props })\n }\n\n public async getIntegration(ref: ApiPackageRef): Promise<Integration> {\n const integration = await this.findIntegration(ref)\n if (!integration) {\n throw new Error(`Integration \"${formatPackageRef(ref)}\" not found`)\n }\n return integration\n }\n\n public async findIntegration(ref: ApiPackageRef): Promise<Integration | undefined> {\n const formatted = formatPackageRef(ref)\n\n const privateIntegration = await this.findPrivateIntegration(ref)\n if (privateIntegration) {\n this._logger.debug(`Found integration \"${formatted}\" in workspace`)\n return privateIntegration\n }\n\n const publicIntegration = await this.findPublicIntegration(ref)\n if (publicIntegration) {\n this._logger.debug(`Found integration \"${formatted}\" in hub`)\n return publicIntegration\n }\n\n return\n }\n\n public async findPrivateIntegration(ref: ApiPackageRef): Promise<PrivateIntegration | undefined> {\n const { workspaceId } = this\n if (ref.type === 'id') {\n return this.client\n .getIntegration(ref)\n .then((r) => ({ ...r.integration, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getIntegrationByName(ref)\n .then((r) => ({ ...r.integration, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async findPublicIntegration(ref: ApiPackageRef): Promise<PublicIntegration | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getPublicIntegrationById(ref)\n .then((r) => r.integration)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getPublicIntegration(ref)\n .then((r) => r.integration)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async getPublicInterface(ref: ApiPackageRef): Promise<Interface> {\n const intrface = await this.findPublicInterface(ref)\n if (!intrface) {\n throw new Error(`Interface \"${formatPackageRef(ref)}\" not found`)\n }\n return intrface\n }\n\n public async findPublicInterface(ref: ApiPackageRef): Promise<Interface | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getInterface(ref)\n .then((r) => r.interface)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n if (isLatest(ref)) {\n // TODO: handle latest keyword in backend\n return this._findLatestInterfaceVersion(ref)\n }\n\n return this.client\n .getInterfaceByName(ref)\n .then((r) => r.interface)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async findPublicPlugin(ref: ApiPackageRef): Promise<Plugin | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getPlugin(ref)\n .then((r) => r.plugin)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n if (isLatest(ref)) {\n // TODO: handle latest keyword in backend\n return this._findLatestPluginVersion(ref)\n }\n\n return this.client\n .getPluginByName(ref)\n .then((r) => r.plugin)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n private _findLatestInterfaceVersion = async ({ name }: NamePackageRef): Promise<Interface | undefined> => {\n const { interfaces: allVersions } = await this.client.listInterfaces({ name })\n const sorted = allVersions.sort((a, b) => semver.compare(b.version, a.version))\n const latestVersion = sorted[0]\n if (!latestVersion) {\n return\n }\n return this.client.getInterface({ id: latestVersion.id }).then((r) => r.interface)\n }\n\n private _findLatestPluginVersion = async ({ name }: NamePackageRef): Promise<Plugin | undefined> => {\n const { plugins: allVersions } = await this.client.listPlugins({ name })\n const sorted = allVersions.sort((a, b) => semver.compare(b.version, a.version))\n const latestVersion = sorted[0]\n if (!latestVersion) {\n return\n }\n return this.client.getPlugin({ id: latestVersion.id }).then((r) => r.plugin)\n }\n\n public async testLogin(): Promise<void> {\n await this.client.listBots({})\n }\n\n public listAllPages = paging.listAllPages\n\n public async findPreviousIntegrationVersion(ref: NamePackageRef): Promise<Integration | undefined> {\n const previous = await findPreviousIntegrationVersion(this.client, ref)\n if (!previous) {\n return\n }\n return this.findIntegration({ type: 'id', id: previous.id })\n }\n\n public async findBotByName(name: string): Promise<BotSummary | undefined> {\n // api does not allow filtering bots by name\n const allBots = await this.listAllPages(this.client.listBots, (r) => r.bots)\n return allBots.find((b) => b.name === name)\n }\n\n private _returnUndefinedOnError =\n (type: client.ApiError['type']) =>\n (thrown: any): undefined => {\n if (client.isApiError(thrown) && thrown.type === type) {\n return\n }\n throw thrown\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["yn", "semver"]
7
7
  }
@@ -36,6 +36,8 @@ var utils = __toESM(require("../utils"));
36
36
  const prepareCreatePluginBody = async (plugin) => ({
37
37
  name: plugin.name,
38
38
  version: plugin.version,
39
+ title: "title" in plugin ? plugin.title : void 0,
40
+ description: "description" in plugin ? plugin.description : void 0,
39
41
  user: {
40
42
  tags: plugin.user?.tags ?? {}
41
43
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/api/plugin-body.ts"],
4
- "sourcesContent": ["import * as client from '@botpress/client'\nimport * as sdk from '@botpress/sdk'\nimport * as utils from '../utils'\nimport * as types from './types'\n\nexport const prepareCreatePluginBody = async (\n plugin: sdk.PluginDefinition | sdk.PluginPackage['definition']\n): Promise<types.CreatePluginRequestBody> => ({\n name: plugin.name,\n version: plugin.version,\n user: {\n tags: plugin.user?.tags ?? {},\n },\n conversation: {\n tags: plugin.conversation?.tags ?? {},\n },\n configuration: plugin.configuration\n ? {\n ...plugin.configuration,\n schema: await utils.schema.mapZodToJsonSchema(plugin.configuration),\n }\n : undefined,\n events: plugin.events\n ? await utils.records.mapValuesAsync(plugin.events, async (event) => ({\n ...event,\n schema: await utils.schema.mapZodToJsonSchema(event),\n }))\n : undefined,\n actions: plugin.actions\n ? await utils.records.mapValuesAsync(plugin.actions, async (action) => ({\n ...action,\n input: {\n ...action.input,\n schema: await utils.schema.mapZodToJsonSchema(action.input),\n },\n output: {\n ...action.output,\n schema: await utils.schema.mapZodToJsonSchema(action.output),\n },\n }))\n : undefined,\n states: plugin.states\n ? await utils.records.mapValuesAsync(plugin.states, async (state) => ({\n ...state,\n schema: await utils.schema.mapZodToJsonSchema(state),\n }))\n : undefined,\n})\n\nexport const prepareUpdatePluginBody = (\n localPlugin: types.UpdatePluginRequestBody,\n remotePlugin: client.Plugin\n): types.UpdatePluginRequestBody => {\n const actions = utils.records.setNullOnMissingValues(localPlugin.actions, remotePlugin.actions)\n const events = utils.records.setNullOnMissingValues(localPlugin.events, remotePlugin.events)\n const states = utils.records.setNullOnMissingValues(localPlugin.states, remotePlugin.states)\n\n return {\n ...localPlugin,\n actions,\n events,\n states,\n user: localPlugin.user, // TODO: allow deleting user tags with null\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,YAAuB;AAGhB,MAAM,0BAA0B,OACrC,YAC4C;AAAA,EAC5C,MAAM,OAAO;AAAA,EACb,SAAS,OAAO;AAAA,EAChB,MAAM;AAAA,IACJ,MAAM,OAAO,MAAM,QAAQ,CAAC;AAAA,EAC9B;AAAA,EACA,cAAc;AAAA,IACZ,MAAM,OAAO,cAAc,QAAQ,CAAC;AAAA,EACtC;AAAA,EACA,eAAe,OAAO,gBAClB;AAAA,IACE,GAAG,OAAO;AAAA,IACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,aAAa;AAAA,EACpE,IACA;AAAA,EACJ,QAAQ,OAAO,SACX,MAAM,MAAM,QAAQ,eAAe,OAAO,QAAQ,OAAO,WAAW;AAAA,IAClE,GAAG;AAAA,IACH,QAAQ,MAAM,MAAM,OAAO,mBAAmB,KAAK;AAAA,EACrD,EAAE,IACF;AAAA,EACJ,SAAS,OAAO,UACZ,MAAM,MAAM,QAAQ,eAAe,OAAO,SAAS,OAAO,YAAY;AAAA,IACpE,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,OAAO;AAAA,MACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,KAAK;AAAA,IAC5D;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,OAAO;AAAA,MACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,MAAM;AAAA,IAC7D;AAAA,EACF,EAAE,IACF;AAAA,EACJ,QAAQ,OAAO,SACX,MAAM,MAAM,QAAQ,eAAe,OAAO,QAAQ,OAAO,WAAW;AAAA,IAClE,GAAG;AAAA,IACH,QAAQ,MAAM,MAAM,OAAO,mBAAmB,KAAK;AAAA,EACrD,EAAE,IACF;AACN;AAEO,MAAM,0BAA0B,CACrC,aACA,iBACkC;AAClC,QAAM,UAAU,MAAM,QAAQ,uBAAuB,YAAY,SAAS,aAAa,OAAO;AAC9F,QAAM,SAAS,MAAM,QAAQ,uBAAuB,YAAY,QAAQ,aAAa,MAAM;AAC3F,QAAM,SAAS,MAAM,QAAQ,uBAAuB,YAAY,QAAQ,aAAa,MAAM;AAE3F,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,YAAY;AAAA;AAAA,EACpB;AACF;",
4
+ "sourcesContent": ["import * as client from '@botpress/client'\nimport * as sdk from '@botpress/sdk'\nimport * as utils from '../utils'\nimport * as types from './types'\n\nexport const prepareCreatePluginBody = async (\n plugin: sdk.PluginDefinition | sdk.PluginPackage['definition']\n): Promise<types.CreatePluginRequestBody> => ({\n name: plugin.name,\n version: plugin.version,\n title: 'title' in plugin ? plugin.title : undefined,\n description: 'description' in plugin ? plugin.description : undefined,\n user: {\n tags: plugin.user?.tags ?? {},\n },\n conversation: {\n tags: plugin.conversation?.tags ?? {},\n },\n configuration: plugin.configuration\n ? {\n ...plugin.configuration,\n schema: await utils.schema.mapZodToJsonSchema(plugin.configuration),\n }\n : undefined,\n events: plugin.events\n ? await utils.records.mapValuesAsync(plugin.events, async (event) => ({\n ...event,\n schema: await utils.schema.mapZodToJsonSchema(event),\n }))\n : undefined,\n actions: plugin.actions\n ? await utils.records.mapValuesAsync(plugin.actions, async (action) => ({\n ...action,\n input: {\n ...action.input,\n schema: await utils.schema.mapZodToJsonSchema(action.input),\n },\n output: {\n ...action.output,\n schema: await utils.schema.mapZodToJsonSchema(action.output),\n },\n }))\n : undefined,\n states: plugin.states\n ? await utils.records.mapValuesAsync(plugin.states, async (state) => ({\n ...state,\n schema: await utils.schema.mapZodToJsonSchema(state),\n }))\n : undefined,\n})\n\nexport const prepareUpdatePluginBody = (\n localPlugin: types.UpdatePluginRequestBody,\n remotePlugin: client.Plugin\n): types.UpdatePluginRequestBody => {\n const actions = utils.records.setNullOnMissingValues(localPlugin.actions, remotePlugin.actions)\n const events = utils.records.setNullOnMissingValues(localPlugin.events, remotePlugin.events)\n const states = utils.records.setNullOnMissingValues(localPlugin.states, remotePlugin.states)\n\n return {\n ...localPlugin,\n actions,\n events,\n states,\n user: localPlugin.user, // TODO: allow deleting user tags with null\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,YAAuB;AAGhB,MAAM,0BAA0B,OACrC,YAC4C;AAAA,EAC5C,MAAM,OAAO;AAAA,EACb,SAAS,OAAO;AAAA,EAChB,OAAO,WAAW,SAAS,OAAO,QAAQ;AAAA,EAC1C,aAAa,iBAAiB,SAAS,OAAO,cAAc;AAAA,EAC5D,MAAM;AAAA,IACJ,MAAM,OAAO,MAAM,QAAQ,CAAC;AAAA,EAC9B;AAAA,EACA,cAAc;AAAA,IACZ,MAAM,OAAO,cAAc,QAAQ,CAAC;AAAA,EACtC;AAAA,EACA,eAAe,OAAO,gBAClB;AAAA,IACE,GAAG,OAAO;AAAA,IACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,aAAa;AAAA,EACpE,IACA;AAAA,EACJ,QAAQ,OAAO,SACX,MAAM,MAAM,QAAQ,eAAe,OAAO,QAAQ,OAAO,WAAW;AAAA,IAClE,GAAG;AAAA,IACH,QAAQ,MAAM,MAAM,OAAO,mBAAmB,KAAK;AAAA,EACrD,EAAE,IACF;AAAA,EACJ,SAAS,OAAO,UACZ,MAAM,MAAM,QAAQ,eAAe,OAAO,SAAS,OAAO,YAAY;AAAA,IACpE,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,OAAO;AAAA,MACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,KAAK;AAAA,IAC5D;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,OAAO;AAAA,MACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,MAAM;AAAA,IAC7D;AAAA,EACF,EAAE,IACF;AAAA,EACJ,QAAQ,OAAO,SACX,MAAM,MAAM,QAAQ,eAAe,OAAO,QAAQ,OAAO,WAAW;AAAA,IAClE,GAAG;AAAA,IACH,QAAQ,MAAM,MAAM,OAAO,mBAAmB,KAAK;AAAA,EACrD,EAAE,IACF;AACN;AAEO,MAAM,0BAA0B,CACrC,aACA,iBACkC;AAClC,QAAM,UAAU,MAAM,QAAQ,uBAAuB,YAAY,SAAS,aAAa,OAAO;AAC9F,QAAM,SAAS,MAAM,QAAQ,uBAAuB,YAAY,QAAQ,aAAa,MAAM;AAC3F,QAAM,SAAS,MAAM,QAAQ,uBAAuB,YAAY,QAAQ,aAAa,MAAM;AAE3F,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,YAAY;AAAA;AAAA,EACpB;AACF;",
6
6
  "names": []
7
7
  }
@@ -218,6 +218,12 @@ class DeployCommand extends import_project_command.ProjectCommand {
218
218
  const codeCJS = await fs.promises.readFile(this.projectPaths.abs.outFileCJS, "utf-8");
219
219
  const codeESM = await fs.promises.readFile(this.projectPaths.abs.outFileESM, "utf-8");
220
220
  const { name, version } = pluginDef;
221
+ if (pluginDef.icon && !pluginDef.icon.toLowerCase().endsWith(".svg")) {
222
+ throw new errors.BotpressCLIError("Icon must be an SVG file");
223
+ }
224
+ if (pluginDef.readme && !pluginDef.readme.toLowerCase().endsWith(".md")) {
225
+ throw new errors.BotpressCLIError("Readme must be a Markdown file");
226
+ }
221
227
  const plugin = await api.findPublicPlugin({ type: "name", name, version });
222
228
  let message;
223
229
  if (plugin) {
@@ -232,9 +238,13 @@ class DeployCommand extends import_project_command.ProjectCommand {
232
238
  return;
233
239
  }
234
240
  this.logger.debug("Preparing plugin request body...");
241
+ const icon = await this.readProjectFile(pluginDef.icon, "base64");
242
+ const readme = await this.readProjectFile(pluginDef.readme, "base64");
235
243
  const createBody = {
236
244
  ...await apiUtils.prepareCreatePluginBody(pluginDef),
237
245
  ...await this.preparePluginDependencies(pluginDef, api),
246
+ icon,
247
+ readme,
238
248
  code: {
239
249
  node: codeCJS,
240
250
  browser: codeESM
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/deploy-command.ts"],
4
- "sourcesContent": ["import type * as client from '@botpress/client'\nimport * as sdk from '@botpress/sdk'\nimport chalk from 'chalk'\nimport * as fs from 'fs'\nimport semver from 'semver'\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 { BuildCommand } from './build-command'\nimport { ProjectCommand } from './project-command'\n\nexport type DeployCommandDefinition = typeof commandDefinitions.deploy\nexport class DeployCommand extends ProjectCommand<DeployCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n\n if (!this.argv.noBuild) {\n await this._runBuild() // This ensures the bundle is always synced with source code\n }\n\n const projectDef = await this.readProjectDefinitionFromFS()\n\n if (projectDef.type === 'integration') {\n return this._deployIntegration(api, projectDef.definition)\n }\n if (projectDef.type === 'interface') {\n return this._deployInterface(api, projectDef.definition)\n }\n if (projectDef.type === 'plugin') {\n return this._deployPlugin(api, projectDef.definition)\n }\n if (projectDef.type === 'bot') {\n return this._deployBot(api, projectDef.definition, this.argv.botId, this.argv.createNewBot)\n }\n throw new errors.UnsupportedProjectType()\n }\n\n private async _runBuild() {\n return new BuildCommand(this.api, this.prompt, this.logger, this.argv).run()\n }\n\n private async _deployIntegration(api: apiUtils.ApiClient, integrationDef: sdk.IntegrationDefinition) {\n const { integration: updatedIntegrationDef, workspaceId } = await this._manageWorkspaceHandle(api, integrationDef)\n integrationDef = updatedIntegrationDef\n if (workspaceId) {\n api = api.switchWorkspace(workspaceId)\n }\n\n const { name, version } = integrationDef\n\n if (integrationDef.icon && !integrationDef.icon.toLowerCase().endsWith('.svg')) {\n throw new errors.BotpressCLIError('Icon must be an SVG file')\n }\n\n if (integrationDef.readme && !integrationDef.readme.toLowerCase().endsWith('.md')) {\n throw new errors.BotpressCLIError('Readme must be a Markdown file')\n }\n\n const integration = await api.findIntegration({ type: 'name', name, version })\n if (integration && integration.workspaceId !== api.workspaceId) {\n throw new errors.BotpressCLIError(\n `Public integration ${name} v${version} is already deployed in another workspace.`\n )\n }\n\n if (integration && integration.public && !api.isBotpressWorkspace) {\n throw new errors.BotpressCLIError(\n `Integration ${name} v${version} is already deployed publicly and cannot be updated. Please bump the version.`\n )\n }\n\n let message: string\n if (integration) {\n this.logger.warn('Integration already exists. If you decide to deploy, it will override the existing one.')\n message = `Are you sure you want to override integration ${name} v${version}?`\n } else {\n message = `Are you sure you want to deploy integration ${name} v${version}?`\n }\n\n const confirm = await this.prompt.confirm(message)\n if (!confirm) {\n this.logger.log('Aborted')\n return\n }\n\n this.logger.debug('Preparing integration request body...')\n\n const createBody = {\n ...(await this.prepareCreateIntegrationBody(integrationDef)),\n ...(await this.prepareIntegrationDependencies(integrationDef, api)),\n public: this.argv.public,\n }\n\n const startedMessage = `Deploying integration ${chalk.bold(name)} v${version}...`\n const successMessage = 'Integration deployed'\n if (integration) {\n const updateBody = apiUtils.prepareUpdateIntegrationBody(\n {\n id: integration.id,\n ...createBody,\n },\n integration\n )\n\n const { secrets: knownSecrets } = integration\n updateBody.secrets = await this.promptSecrets(integrationDef, this.argv, { knownSecrets })\n this._detectDeprecatedFeatures(integrationDef, { allowDeprecated: true })\n\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.log('Dry-run mode is active. Simulating integration update...')\n\n await api.client.validateIntegrationUpdate(updateBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update integration \"${name}\"`)\n })\n } else {\n await api.client.updateIntegration(updateBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update integration \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n } else {\n this.logger.debug(`looking for previous version of integration \"${name}\"`)\n const previousVersion = await api.findPreviousIntegrationVersion({ type: 'name', name, version })\n\n if (previousVersion) {\n this.logger.debug(`previous version found: ${previousVersion.version}`)\n } else {\n this.logger.debug('no previous version found')\n }\n\n const knownSecrets = previousVersion?.secrets\n\n const createSecrets = await this.promptSecrets(integrationDef, this.argv, { knownSecrets })\n createBody.secrets = utils.records.filterValues(createSecrets, utils.guards.is.notNull)\n\n this._detectDeprecatedFeatures(integrationDef, {\n allowDeprecated: this._allowDeprecatedFeatures(integrationDef, previousVersion),\n })\n\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.log('Dry-run mode is active. Simulating integration creation...')\n\n await api.client.validateIntegrationCreation(createBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not create integration \"${name}\"`)\n })\n } else {\n await api.client.createIntegration(createBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not create integration \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n }\n }\n\n private async _deployInterface(api: apiUtils.ApiClient, interfaceDeclaration: sdk.InterfaceDefinition) {\n if (!api.isBotpressWorkspace) {\n throw new errors.BotpressCLIError('Your workspace is not allowed to deploy interfaces.')\n }\n\n const { name, version } = interfaceDeclaration\n const intrface = await api.findPublicInterface({ type: 'name', name, version })\n\n let message: string\n if (intrface) {\n this.logger.warn('Interface already exists. If you decide to deploy, it will override the existing one.')\n message = `Are you sure you want to override interface ${name} v${version}?`\n } else {\n message = `Are you sure you want to deploy interface ${name} v${version}?`\n }\n\n const confirm = await this.prompt.confirm(message)\n if (!confirm) {\n this.logger.log('Aborted')\n return\n }\n\n const createBody = await apiUtils.prepareCreateInterfaceBody(interfaceDeclaration)\n\n const startedMessage = `Deploying interface ${chalk.bold(name)} v${version}...`\n const successMessage = 'Interface deployed'\n if (intrface) {\n const updateBody = apiUtils.prepareUpdateInterfaceBody(\n {\n id: intrface.id,\n ...createBody,\n },\n intrface\n )\n\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.warn('Dry-run mode is not supported for interface updates. Skipping deployment...')\n } else {\n await api.client.updateInterface(updateBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update interface \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n } else {\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.warn('Dry-run mode is not supported for interface creation. Skipping deployment...')\n } else {\n await api.client.createInterface(createBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not create interface \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n }\n }\n\n private async _deployPlugin(api: apiUtils.ApiClient, pluginDef: sdk.PluginDefinition) {\n const codeCJS = await fs.promises.readFile(this.projectPaths.abs.outFileCJS, 'utf-8')\n const codeESM = await fs.promises.readFile(this.projectPaths.abs.outFileESM, 'utf-8')\n\n const { name, version } = pluginDef\n\n const plugin = await api.findPublicPlugin({ type: 'name', name, version })\n\n let message: string\n if (plugin) {\n this.logger.warn('Plugin already exists. If you decide to deploy, it will override the existing one.')\n message = `Are you sure you want to override plugin ${name} v${version}?`\n } else {\n message = `Are you sure you want to deploy plugin ${name} v${version}?`\n }\n\n const confirm = await this.prompt.confirm(message)\n if (!confirm) {\n this.logger.log('Aborted')\n return\n }\n\n this.logger.debug('Preparing plugin request body...')\n\n const createBody = {\n ...(await apiUtils.prepareCreatePluginBody(pluginDef)),\n ...(await this.preparePluginDependencies(pluginDef, api)),\n code: {\n node: codeCJS,\n browser: codeESM,\n },\n }\n\n const startedMessage = `Deploying plugin ${chalk.bold(name)} v${version}...`\n const successMessage = 'Plugin deployed'\n if (plugin) {\n const updateBody = apiUtils.prepareUpdatePluginBody(\n {\n id: plugin.id,\n ...createBody,\n },\n plugin\n )\n\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.warn('Dry-run mode is not supported for plugin updates. Skipping deployment...')\n } else {\n await api.client.updatePlugin(updateBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update plugin \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n } else {\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.warn('Dry-run mode is not supported for plugin creation. Skipping deployment...')\n } else {\n await api.client.createPlugin(createBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not create plugin \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n }\n }\n\n private _allowDeprecatedFeatures(\n integrationDef: sdk.IntegrationDefinition,\n previousVersion: client.Integration | undefined\n ): boolean {\n if (this.argv.allowDeprecated) {\n return true\n }\n\n if (!previousVersion) {\n return false\n }\n\n const versionDiff = semver.diff(integrationDef.version, previousVersion.version)\n if (!versionDiff) {\n return false\n }\n\n return utils.semver.releases.lt(versionDiff, 'major')\n }\n\n private _detectDeprecatedFeatures(\n integrationDef: sdk.IntegrationDefinition,\n opts: { allowDeprecated?: boolean } = {}\n ) {\n const deprecatedFields: string[] = []\n const { user, channels } = integrationDef\n if (user?.creation?.enabled) {\n deprecatedFields.push('user.creation')\n }\n\n for (const [channelName, channel] of Object.entries(channels ?? {})) {\n if (channel?.conversation?.creation?.enabled) {\n deprecatedFields.push(`channels.${channelName}.creation`)\n }\n }\n\n if (!deprecatedFields.length) {\n return\n }\n\n const errorMessage = `The following fields of the integration's definition are deprecated: ${deprecatedFields.join(\n ', '\n )}`\n\n if (opts.allowDeprecated) {\n this.logger.warn(errorMessage)\n } else {\n throw new errors.BotpressCLIError(errorMessage)\n }\n }\n\n private async _deployBot(\n api: apiUtils.ApiClient,\n botDefinition: sdk.BotDefinition,\n argvBotId: string | undefined,\n argvCreateNew: boolean | undefined\n ) {\n if (this.argv.dryRun) {\n this.logger.warn('Dry-run mode is not supported for bot deployments. Skipping deployment...')\n return\n }\n\n const outfile = this.projectPaths.abs.outFileCJS\n const code = await fs.promises.readFile(outfile, 'utf-8')\n\n let bot: client.Bot\n if (argvBotId && argvCreateNew) {\n throw new errors.BotpressCLIError('Cannot specify both --botId and --createNew')\n } else if (argvCreateNew) {\n const confirm = await this.prompt.confirm('Are you sure you want to create a new bot ?')\n if (!confirm) {\n this.logger.log('Aborted')\n return\n }\n\n bot = await this._createNewBot(api)\n } else {\n bot = await this._getExistingBot(api, argvBotId)\n\n const confirm = await this.prompt.confirm(`Are you sure you want to deploy the bot \"${bot.name}\"?`)\n if (!confirm) {\n this.logger.log('Aborted')\n return\n }\n }\n\n const line = this.logger.line()\n line.started(`Deploying bot ${chalk.bold(bot.name)}...`)\n\n const updateBotBody = apiUtils.prepareUpdateBotBody(\n {\n ...(await apiUtils.prepareCreateBotBody(botDefinition)),\n ...(await this.prepareBotDependencies(botDefinition, api)),\n id: bot.id,\n code,\n },\n bot\n )\n\n const { bot: updatedBot } = await api.client.updateBot(updateBotBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update bot \"${bot.name}\"`)\n })\n\n const tablesPublisher = new tables.TablesPublisher({ api, logger: this.logger, prompt: this.prompt })\n await tablesPublisher.deployTables({ botId: updatedBot.id, botDefinition })\n\n line.success('Bot deployed')\n this.displayWebhookUrls(updatedBot)\n }\n\n private async _createNewBot(api: apiUtils.ApiClient): Promise<client.Bot> {\n const line = this.logger.line()\n const { bot: createdBot } = await api.client.createBot({}).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not create bot')\n })\n line.success(`Bot created with ID \"${createdBot.id}\" and name \"${createdBot.name}\"`)\n await this.projectCache.set('botId', createdBot.id)\n return createdBot\n }\n\n private async _getExistingBot(api: apiUtils.ApiClient, botId: string | undefined): Promise<client.Bot> {\n const promptedBotId = await this.projectCache.sync('botId', botId, async (defaultId) => {\n const userBots = 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 (!userBots.length) {\n throw new errors.NoBotsFoundError()\n }\n\n const initial = userBots.find((bot) => bot.id === defaultId)\n\n const prompted = await this.prompt.select('Which bot do you want to deploy?', {\n initial: initial && { title: initial.name, value: initial.id },\n choices: userBots.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 const { bot: fetchedBot } = await api.client.getBot({ id: promptedBotId }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not get bot info')\n })\n\n return fetchedBot\n }\n\n private async _manageWorkspaceHandle(\n api: apiUtils.ApiClient,\n integration: sdk.IntegrationDefinition\n ): Promise<{\n integration: sdk.IntegrationDefinition\n workspaceId?: string // Set if user opted to deploy on another available workspace\n }> {\n const { name: localName, workspaceHandle: localHandle } = this._parseIntegrationName(integration.name)\n if (!localHandle && api.isBotpressWorkspace) {\n this.logger.debug('Botpress workspace detected; workspace handle omitted')\n return { integration } // botpress has the right to omit workspace handle\n }\n\n const { handle: remoteHandle, name: workspaceName } = await api.getWorkspace().catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not fetch workspace')\n })\n\n if (localHandle && remoteHandle) {\n let workspaceId: string | undefined = undefined\n if (localHandle !== remoteHandle) {\n const remoteWorkspace = await api.findWorkspaceByHandle(localHandle).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not list workspaces')\n })\n if (!remoteWorkspace) {\n throw new errors.BotpressCLIError(\n `The integration handle \"${localHandle}\" is not associated with any of your workspaces.`\n )\n }\n this.logger.warn(\n `Your are logged in to workspace \"${workspaceName}\" but integration handle \"${localHandle}\" belongs to \"${remoteWorkspace.name}\".`\n )\n const confirmUseAlternateWorkspace = await this.prompt.confirm(\n 'Do you want to deploy integration on this workspace instead?'\n )\n if (!confirmUseAlternateWorkspace) {\n throw new errors.BotpressCLIError(\n `Cannot deploy integration with handle \"${localHandle}\" on workspace \"${workspaceName}\"`\n )\n }\n\n workspaceId = remoteWorkspace.id\n }\n return { integration, workspaceId }\n }\n\n const workspaceHandleIsMandatoryMsg = 'Cannot deploy integration without workspace handle'\n\n if (!localHandle && remoteHandle) {\n const confirmAddHandle = await this.prompt.confirm(\n `Your current workspace handle is \"${remoteHandle}\". Do you want to use the name \"${remoteHandle}/${localName}\"?`\n )\n if (!confirmAddHandle) {\n throw new errors.BotpressCLIError(workspaceHandleIsMandatoryMsg)\n }\n const newName = `${remoteHandle}/${localName}`\n return { integration: new sdk.IntegrationDefinition({ ...integration, name: newName }) }\n }\n\n if (localHandle && !remoteHandle) {\n const { available } = await api.client.checkHandleAvailability({ handle: localHandle }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not check handle availability')\n })\n\n if (!available) {\n throw new errors.BotpressCLIError(`Handle \"${localHandle}\" is not yours and is not available`)\n }\n\n const confirmClaimHandle = await this.prompt.confirm(\n `Handle \"${localHandle}\" is available. Do you want to claim it for your workspace ${workspaceName}?`\n )\n if (!confirmClaimHandle) {\n throw new errors.BotpressCLIError(workspaceHandleIsMandatoryMsg)\n }\n\n await api.updateWorkspace({ handle: localHandle }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not claim handle \"${localHandle}\"`)\n })\n\n this.logger.success(`Handle \"${localHandle}\" is now yours!`)\n return { integration }\n }\n\n this.logger.warn(\"It seems you don't have a workspace handle yet.\")\n let claimedHandle: string | undefined = undefined\n do {\n const prompted = await this.prompt.text('Please enter a workspace handle')\n if (!prompted) {\n throw new errors.BotpressCLIError(workspaceHandleIsMandatoryMsg)\n }\n\n const { available, suggestions } = await api.client.checkHandleAvailability({ handle: prompted })\n if (!available) {\n this.logger.warn(`Handle \"${prompted}\" is not available. Suggestions: ${suggestions.join(', ')}`)\n continue\n }\n\n claimedHandle = prompted\n await api.updateWorkspace({ handle: claimedHandle }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not claim handle \"${claimedHandle}\"`)\n })\n } while (!claimedHandle)\n\n this.logger.success(`Handle \"${claimedHandle}\" is yours!`)\n const newName = `${claimedHandle}/${localName}`\n return { integration: new sdk.IntegrationDefinition({ ...integration, name: newName }) }\n }\n\n private _parseIntegrationName = (integrationName: string): { name: string; workspaceHandle?: string } => {\n const parts = integrationName.split('/')\n if (parts.length > 2) {\n throw new errors.BotpressCLIError(\n `Invalid integration name \"${integrationName}\": a single forward slash is allowed`\n )\n }\n if (parts.length === 2) {\n const [workspaceHandle, name] = parts as [string, string]\n return { name, workspaceHandle }\n }\n const [name] = parts as [string]\n return { name }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type * as client from '@botpress/client'\nimport * as sdk from '@botpress/sdk'\nimport chalk from 'chalk'\nimport * as fs from 'fs'\nimport semver from 'semver'\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 { BuildCommand } from './build-command'\nimport { ProjectCommand } from './project-command'\n\nexport type DeployCommandDefinition = typeof commandDefinitions.deploy\nexport class DeployCommand extends ProjectCommand<DeployCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n\n if (!this.argv.noBuild) {\n await this._runBuild() // This ensures the bundle is always synced with source code\n }\n\n const projectDef = await this.readProjectDefinitionFromFS()\n\n if (projectDef.type === 'integration') {\n return this._deployIntegration(api, projectDef.definition)\n }\n if (projectDef.type === 'interface') {\n return this._deployInterface(api, projectDef.definition)\n }\n if (projectDef.type === 'plugin') {\n return this._deployPlugin(api, projectDef.definition)\n }\n if (projectDef.type === 'bot') {\n return this._deployBot(api, projectDef.definition, this.argv.botId, this.argv.createNewBot)\n }\n throw new errors.UnsupportedProjectType()\n }\n\n private async _runBuild() {\n return new BuildCommand(this.api, this.prompt, this.logger, this.argv).run()\n }\n\n private async _deployIntegration(api: apiUtils.ApiClient, integrationDef: sdk.IntegrationDefinition) {\n const { integration: updatedIntegrationDef, workspaceId } = await this._manageWorkspaceHandle(api, integrationDef)\n integrationDef = updatedIntegrationDef\n if (workspaceId) {\n api = api.switchWorkspace(workspaceId)\n }\n\n const { name, version } = integrationDef\n\n if (integrationDef.icon && !integrationDef.icon.toLowerCase().endsWith('.svg')) {\n throw new errors.BotpressCLIError('Icon must be an SVG file')\n }\n\n if (integrationDef.readme && !integrationDef.readme.toLowerCase().endsWith('.md')) {\n throw new errors.BotpressCLIError('Readme must be a Markdown file')\n }\n\n const integration = await api.findIntegration({ type: 'name', name, version })\n if (integration && integration.workspaceId !== api.workspaceId) {\n throw new errors.BotpressCLIError(\n `Public integration ${name} v${version} is already deployed in another workspace.`\n )\n }\n\n if (integration && integration.public && !api.isBotpressWorkspace) {\n throw new errors.BotpressCLIError(\n `Integration ${name} v${version} is already deployed publicly and cannot be updated. Please bump the version.`\n )\n }\n\n let message: string\n if (integration) {\n this.logger.warn('Integration already exists. If you decide to deploy, it will override the existing one.')\n message = `Are you sure you want to override integration ${name} v${version}?`\n } else {\n message = `Are you sure you want to deploy integration ${name} v${version}?`\n }\n\n const confirm = await this.prompt.confirm(message)\n if (!confirm) {\n this.logger.log('Aborted')\n return\n }\n\n this.logger.debug('Preparing integration request body...')\n\n const createBody = {\n ...(await this.prepareCreateIntegrationBody(integrationDef)),\n ...(await this.prepareIntegrationDependencies(integrationDef, api)),\n public: this.argv.public,\n }\n\n const startedMessage = `Deploying integration ${chalk.bold(name)} v${version}...`\n const successMessage = 'Integration deployed'\n if (integration) {\n const updateBody = apiUtils.prepareUpdateIntegrationBody(\n {\n id: integration.id,\n ...createBody,\n },\n integration\n )\n\n const { secrets: knownSecrets } = integration\n updateBody.secrets = await this.promptSecrets(integrationDef, this.argv, { knownSecrets })\n this._detectDeprecatedFeatures(integrationDef, { allowDeprecated: true })\n\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.log('Dry-run mode is active. Simulating integration update...')\n\n await api.client.validateIntegrationUpdate(updateBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update integration \"${name}\"`)\n })\n } else {\n await api.client.updateIntegration(updateBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update integration \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n } else {\n this.logger.debug(`looking for previous version of integration \"${name}\"`)\n const previousVersion = await api.findPreviousIntegrationVersion({ type: 'name', name, version })\n\n if (previousVersion) {\n this.logger.debug(`previous version found: ${previousVersion.version}`)\n } else {\n this.logger.debug('no previous version found')\n }\n\n const knownSecrets = previousVersion?.secrets\n\n const createSecrets = await this.promptSecrets(integrationDef, this.argv, { knownSecrets })\n createBody.secrets = utils.records.filterValues(createSecrets, utils.guards.is.notNull)\n\n this._detectDeprecatedFeatures(integrationDef, {\n allowDeprecated: this._allowDeprecatedFeatures(integrationDef, previousVersion),\n })\n\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.log('Dry-run mode is active. Simulating integration creation...')\n\n await api.client.validateIntegrationCreation(createBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not create integration \"${name}\"`)\n })\n } else {\n await api.client.createIntegration(createBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not create integration \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n }\n }\n\n private async _deployInterface(api: apiUtils.ApiClient, interfaceDeclaration: sdk.InterfaceDefinition) {\n if (!api.isBotpressWorkspace) {\n throw new errors.BotpressCLIError('Your workspace is not allowed to deploy interfaces.')\n }\n\n const { name, version } = interfaceDeclaration\n const intrface = await api.findPublicInterface({ type: 'name', name, version })\n\n let message: string\n if (intrface) {\n this.logger.warn('Interface already exists. If you decide to deploy, it will override the existing one.')\n message = `Are you sure you want to override interface ${name} v${version}?`\n } else {\n message = `Are you sure you want to deploy interface ${name} v${version}?`\n }\n\n const confirm = await this.prompt.confirm(message)\n if (!confirm) {\n this.logger.log('Aborted')\n return\n }\n\n const createBody = await apiUtils.prepareCreateInterfaceBody(interfaceDeclaration)\n\n const startedMessage = `Deploying interface ${chalk.bold(name)} v${version}...`\n const successMessage = 'Interface deployed'\n if (intrface) {\n const updateBody = apiUtils.prepareUpdateInterfaceBody(\n {\n id: intrface.id,\n ...createBody,\n },\n intrface\n )\n\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.warn('Dry-run mode is not supported for interface updates. Skipping deployment...')\n } else {\n await api.client.updateInterface(updateBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update interface \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n } else {\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.warn('Dry-run mode is not supported for interface creation. Skipping deployment...')\n } else {\n await api.client.createInterface(createBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not create interface \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n }\n }\n\n private async _deployPlugin(api: apiUtils.ApiClient, pluginDef: sdk.PluginDefinition) {\n const codeCJS = await fs.promises.readFile(this.projectPaths.abs.outFileCJS, 'utf-8')\n const codeESM = await fs.promises.readFile(this.projectPaths.abs.outFileESM, 'utf-8')\n\n const { name, version } = pluginDef\n\n if (pluginDef.icon && !pluginDef.icon.toLowerCase().endsWith('.svg')) {\n throw new errors.BotpressCLIError('Icon must be an SVG file')\n }\n\n if (pluginDef.readme && !pluginDef.readme.toLowerCase().endsWith('.md')) {\n throw new errors.BotpressCLIError('Readme must be a Markdown file')\n }\n\n const plugin = await api.findPublicPlugin({ type: 'name', name, version })\n\n let message: string\n if (plugin) {\n this.logger.warn('Plugin already exists. If you decide to deploy, it will override the existing one.')\n message = `Are you sure you want to override plugin ${name} v${version}?`\n } else {\n message = `Are you sure you want to deploy plugin ${name} v${version}?`\n }\n\n const confirm = await this.prompt.confirm(message)\n if (!confirm) {\n this.logger.log('Aborted')\n return\n }\n\n this.logger.debug('Preparing plugin request body...')\n\n const icon = await this.readProjectFile(pluginDef.icon, 'base64')\n const readme = await this.readProjectFile(pluginDef.readme, 'base64')\n\n const createBody = {\n ...(await apiUtils.prepareCreatePluginBody(pluginDef)),\n ...(await this.preparePluginDependencies(pluginDef, api)),\n icon,\n readme,\n code: {\n node: codeCJS,\n browser: codeESM,\n },\n }\n\n const startedMessage = `Deploying plugin ${chalk.bold(name)} v${version}...`\n const successMessage = 'Plugin deployed'\n if (plugin) {\n const updateBody = apiUtils.prepareUpdatePluginBody(\n {\n id: plugin.id,\n ...createBody,\n },\n plugin\n )\n\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.warn('Dry-run mode is not supported for plugin updates. Skipping deployment...')\n } else {\n await api.client.updatePlugin(updateBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update plugin \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n } else {\n const line = this.logger.line()\n line.started(startedMessage)\n\n if (this.argv.dryRun) {\n this.logger.warn('Dry-run mode is not supported for plugin creation. Skipping deployment...')\n } else {\n await api.client.createPlugin(createBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not create plugin \"${name}\"`)\n })\n }\n\n line.success(successMessage)\n }\n }\n\n private _allowDeprecatedFeatures(\n integrationDef: sdk.IntegrationDefinition,\n previousVersion: client.Integration | undefined\n ): boolean {\n if (this.argv.allowDeprecated) {\n return true\n }\n\n if (!previousVersion) {\n return false\n }\n\n const versionDiff = semver.diff(integrationDef.version, previousVersion.version)\n if (!versionDiff) {\n return false\n }\n\n return utils.semver.releases.lt(versionDiff, 'major')\n }\n\n private _detectDeprecatedFeatures(\n integrationDef: sdk.IntegrationDefinition,\n opts: { allowDeprecated?: boolean } = {}\n ) {\n const deprecatedFields: string[] = []\n const { user, channels } = integrationDef\n if (user?.creation?.enabled) {\n deprecatedFields.push('user.creation')\n }\n\n for (const [channelName, channel] of Object.entries(channels ?? {})) {\n if (channel?.conversation?.creation?.enabled) {\n deprecatedFields.push(`channels.${channelName}.creation`)\n }\n }\n\n if (!deprecatedFields.length) {\n return\n }\n\n const errorMessage = `The following fields of the integration's definition are deprecated: ${deprecatedFields.join(\n ', '\n )}`\n\n if (opts.allowDeprecated) {\n this.logger.warn(errorMessage)\n } else {\n throw new errors.BotpressCLIError(errorMessage)\n }\n }\n\n private async _deployBot(\n api: apiUtils.ApiClient,\n botDefinition: sdk.BotDefinition,\n argvBotId: string | undefined,\n argvCreateNew: boolean | undefined\n ) {\n if (this.argv.dryRun) {\n this.logger.warn('Dry-run mode is not supported for bot deployments. Skipping deployment...')\n return\n }\n\n const outfile = this.projectPaths.abs.outFileCJS\n const code = await fs.promises.readFile(outfile, 'utf-8')\n\n let bot: client.Bot\n if (argvBotId && argvCreateNew) {\n throw new errors.BotpressCLIError('Cannot specify both --botId and --createNew')\n } else if (argvCreateNew) {\n const confirm = await this.prompt.confirm('Are you sure you want to create a new bot ?')\n if (!confirm) {\n this.logger.log('Aborted')\n return\n }\n\n bot = await this._createNewBot(api)\n } else {\n bot = await this._getExistingBot(api, argvBotId)\n\n const confirm = await this.prompt.confirm(`Are you sure you want to deploy the bot \"${bot.name}\"?`)\n if (!confirm) {\n this.logger.log('Aborted')\n return\n }\n }\n\n const line = this.logger.line()\n line.started(`Deploying bot ${chalk.bold(bot.name)}...`)\n\n const updateBotBody = apiUtils.prepareUpdateBotBody(\n {\n ...(await apiUtils.prepareCreateBotBody(botDefinition)),\n ...(await this.prepareBotDependencies(botDefinition, api)),\n id: bot.id,\n code,\n },\n bot\n )\n\n const { bot: updatedBot } = await api.client.updateBot(updateBotBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update bot \"${bot.name}\"`)\n })\n\n const tablesPublisher = new tables.TablesPublisher({ api, logger: this.logger, prompt: this.prompt })\n await tablesPublisher.deployTables({ botId: updatedBot.id, botDefinition })\n\n line.success('Bot deployed')\n this.displayWebhookUrls(updatedBot)\n }\n\n private async _createNewBot(api: apiUtils.ApiClient): Promise<client.Bot> {\n const line = this.logger.line()\n const { bot: createdBot } = await api.client.createBot({}).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not create bot')\n })\n line.success(`Bot created with ID \"${createdBot.id}\" and name \"${createdBot.name}\"`)\n await this.projectCache.set('botId', createdBot.id)\n return createdBot\n }\n\n private async _getExistingBot(api: apiUtils.ApiClient, botId: string | undefined): Promise<client.Bot> {\n const promptedBotId = await this.projectCache.sync('botId', botId, async (defaultId) => {\n const userBots = 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 (!userBots.length) {\n throw new errors.NoBotsFoundError()\n }\n\n const initial = userBots.find((bot) => bot.id === defaultId)\n\n const prompted = await this.prompt.select('Which bot do you want to deploy?', {\n initial: initial && { title: initial.name, value: initial.id },\n choices: userBots.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 const { bot: fetchedBot } = await api.client.getBot({ id: promptedBotId }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not get bot info')\n })\n\n return fetchedBot\n }\n\n private async _manageWorkspaceHandle(\n api: apiUtils.ApiClient,\n integration: sdk.IntegrationDefinition\n ): Promise<{\n integration: sdk.IntegrationDefinition\n workspaceId?: string // Set if user opted to deploy on another available workspace\n }> {\n const { name: localName, workspaceHandle: localHandle } = this._parseIntegrationName(integration.name)\n if (!localHandle && api.isBotpressWorkspace) {\n this.logger.debug('Botpress workspace detected; workspace handle omitted')\n return { integration } // botpress has the right to omit workspace handle\n }\n\n const { handle: remoteHandle, name: workspaceName } = await api.getWorkspace().catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not fetch workspace')\n })\n\n if (localHandle && remoteHandle) {\n let workspaceId: string | undefined = undefined\n if (localHandle !== remoteHandle) {\n const remoteWorkspace = await api.findWorkspaceByHandle(localHandle).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not list workspaces')\n })\n if (!remoteWorkspace) {\n throw new errors.BotpressCLIError(\n `The integration handle \"${localHandle}\" is not associated with any of your workspaces.`\n )\n }\n this.logger.warn(\n `Your are logged in to workspace \"${workspaceName}\" but integration handle \"${localHandle}\" belongs to \"${remoteWorkspace.name}\".`\n )\n const confirmUseAlternateWorkspace = await this.prompt.confirm(\n 'Do you want to deploy integration on this workspace instead?'\n )\n if (!confirmUseAlternateWorkspace) {\n throw new errors.BotpressCLIError(\n `Cannot deploy integration with handle \"${localHandle}\" on workspace \"${workspaceName}\"`\n )\n }\n\n workspaceId = remoteWorkspace.id\n }\n return { integration, workspaceId }\n }\n\n const workspaceHandleIsMandatoryMsg = 'Cannot deploy integration without workspace handle'\n\n if (!localHandle && remoteHandle) {\n const confirmAddHandle = await this.prompt.confirm(\n `Your current workspace handle is \"${remoteHandle}\". Do you want to use the name \"${remoteHandle}/${localName}\"?`\n )\n if (!confirmAddHandle) {\n throw new errors.BotpressCLIError(workspaceHandleIsMandatoryMsg)\n }\n const newName = `${remoteHandle}/${localName}`\n return { integration: new sdk.IntegrationDefinition({ ...integration, name: newName }) }\n }\n\n if (localHandle && !remoteHandle) {\n const { available } = await api.client.checkHandleAvailability({ handle: localHandle }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not check handle availability')\n })\n\n if (!available) {\n throw new errors.BotpressCLIError(`Handle \"${localHandle}\" is not yours and is not available`)\n }\n\n const confirmClaimHandle = await this.prompt.confirm(\n `Handle \"${localHandle}\" is available. Do you want to claim it for your workspace ${workspaceName}?`\n )\n if (!confirmClaimHandle) {\n throw new errors.BotpressCLIError(workspaceHandleIsMandatoryMsg)\n }\n\n await api.updateWorkspace({ handle: localHandle }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not claim handle \"${localHandle}\"`)\n })\n\n this.logger.success(`Handle \"${localHandle}\" is now yours!`)\n return { integration }\n }\n\n this.logger.warn(\"It seems you don't have a workspace handle yet.\")\n let claimedHandle: string | undefined = undefined\n do {\n const prompted = await this.prompt.text('Please enter a workspace handle')\n if (!prompted) {\n throw new errors.BotpressCLIError(workspaceHandleIsMandatoryMsg)\n }\n\n const { available, suggestions } = await api.client.checkHandleAvailability({ handle: prompted })\n if (!available) {\n this.logger.warn(`Handle \"${prompted}\" is not available. Suggestions: ${suggestions.join(', ')}`)\n continue\n }\n\n claimedHandle = prompted\n await api.updateWorkspace({ handle: claimedHandle }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not claim handle \"${claimedHandle}\"`)\n })\n } while (!claimedHandle)\n\n this.logger.success(`Handle \"${claimedHandle}\" is yours!`)\n const newName = `${claimedHandle}/${localName}`\n return { integration: new sdk.IntegrationDefinition({ ...integration, name: newName }) }\n }\n\n private _parseIntegrationName = (integrationName: string): { name: string; workspaceHandle?: string } => {\n const parts = integrationName.split('/')\n if (parts.length > 2) {\n throw new errors.BotpressCLIError(\n `Invalid integration name \"${integrationName}\": a single forward slash is allowed`\n )\n }\n if (parts.length === 2) {\n const [workspaceHandle, name] = parts as [string, string]\n return { name, workspaceHandle }\n }\n const [name] = parts as [string]\n return { name }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["chalk", "semver", "newName", "name"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/global-command.ts"],
4
- "sourcesContent": ["import type { YargsConfig } from '@bpinternal/yargs-extra'\nimport chalk from 'chalk'\nimport latestVersion from 'latest-version'\nimport _ from 'lodash'\nimport semver from 'semver'\nimport type { ApiClientFactory } from '../api/client'\nimport type * as config from '../config'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport type { CommandArgv, CommandDefinition } from '../typings'\nimport * as utils from '../utils'\nimport { BaseCommand } from './base-command'\n\nexport type GlobalCommandDefinition = CommandDefinition<typeof config.schemas.global>\nexport type GlobalCache = { apiUrl: string; token: string; workspaceId: string }\n\nexport type ConfigurableGlobalPaths = { botpressHomeDir: string; cliRootDir: utils.path.AbsolutePath }\nexport type ConstantGlobalPaths = typeof consts.fromHomeDir & typeof consts.fromCliRootDir\nexport type AllGlobalPaths = ConfigurableGlobalPaths & ConstantGlobalPaths\n\nclass GlobalPaths extends utils.path.PathStore<keyof AllGlobalPaths> {\n public constructor(argv: CommandArgv<GlobalCommandDefinition>) {\n const absBotpressHome = utils.path.absoluteFrom(utils.path.cwd(), argv.botpressHome)\n super({\n cliRootDir: consts.cliRootDir,\n botpressHomeDir: absBotpressHome,\n ..._.mapValues(consts.fromHomeDir, (p) => utils.path.absoluteFrom(absBotpressHome, p)),\n ..._.mapValues(consts.fromCliRootDir, (p) => utils.path.absoluteFrom(consts.cliRootDir, p)),\n })\n }\n}\n\nexport abstract class GlobalCommand<C extends GlobalCommandDefinition> extends BaseCommand<C> {\n protected api: ApiClientFactory\n protected prompt: utils.prompt.CLIPrompt\n private _pkgJson: utils.pkgJson.PackageJson | undefined\n\n public constructor(\n api: ApiClientFactory,\n prompt: utils.prompt.CLIPrompt,\n ...args: ConstructorParameters<typeof BaseCommand<C>>\n ) {\n super(...args)\n this.api = api\n this.prompt = prompt\n }\n\n protected get globalPaths() {\n return new GlobalPaths(this.argv)\n }\n\n protected get globalCache() {\n return new utils.cache.FSKeyValueCache<GlobalCache>(this.globalPaths.abs.globalCacheFile)\n }\n\n protected override async bootstrap() {\n const pkgJson = await this.readPkgJson()\n const versionText = chalk.bold(`v${pkgJson.version}`)\n this.logger.log(`Botpress CLI ${versionText}`, { prefix: '\uD83E\uDD16' })\n\n await this._notifyUpdateCli()\n\n const paths = this.globalPaths\n if (paths.abs.botpressHomeDir !== consts.defaultBotpressHome) {\n this.logger.log(`Using custom botpress home: ${paths.abs.botpressHomeDir}`, { prefix: '\uD83C\uDFE0' })\n }\n }\n\n protected override teardown = async () => {\n this.logger.cleanup()\n }\n\n protected async ensureLoginAndCreateClient(credentials: YargsConfig<typeof config.schemas.credentials>) {\n const cache = this.globalCache\n const token = await cache.get('token')\n const workspaceId = credentials.workspaceId ?? (await cache.get('workspaceId'))\n const apiUrl = credentials.apiUrl ?? (await cache.get('apiUrl'))\n\n if (!(token && workspaceId && apiUrl)) {\n throw new errors.NotLoggedInError()\n }\n\n if (apiUrl !== consts.defaultBotpressApiUrl) {\n this.logger.log(`Using custom url ${apiUrl}`, { prefix: '\uD83D\uDD17' })\n }\n\n return this.api.newClient({ apiUrl, token, workspaceId }, this.logger)\n }\n\n private _notifyUpdateCli = async (): Promise<void> => {\n try {\n this.logger.debug('Checking if cli is up to date')\n\n const pkgJson = await this.readPkgJson()\n if (!pkgJson.version) {\n throw new errors.BotpressCLIError('Could not find version in package.json')\n }\n\n const latest = await latestVersion(pkgJson.name)\n const isOutdated = semver.lt(pkgJson.version, latest)\n if (isOutdated) {\n this.logger.box(\n [\n `${chalk.bold('Update available')} ${chalk.dim(pkgJson.version)} \u2192 ${chalk.green(latest)}`,\n '',\n 'To update, run:',\n ` for npm ${chalk.cyan(`npm i -g ${pkgJson.name}`)}`,\n ` for yarn ${chalk.cyan(`yarn global add ${pkgJson.name}`)}`,\n ` for pnpm ${chalk.cyan(`pnpm i -g ${pkgJson.name}`)}`,\n ].join('\\n')\n )\n }\n } catch (thrown) {\n const err = errors.BotpressCLIError.map(thrown)\n this.logger.debug(`Failed to check if cli is up to date: ${err.message}`)\n }\n }\n\n protected async readPkgJson(): Promise<utils.pkgJson.PackageJson> {\n if (this._pkgJson) {\n return this._pkgJson\n }\n const { cliRootDir } = this.globalPaths.abs\n const pkgJson = await utils.pkgJson.readPackageJson(cliRootDir)\n if (!pkgJson) {\n throw new errors.BotpressCLIError(`Could not find package.json at \"${cliRootDir}\"`)\n }\n\n this._pkgJson = pkgJson\n return pkgJson\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { YargsConfig } from '@bpinternal/yargs-extra'\nimport chalk from 'chalk'\nimport latestVersion from 'latest-version'\nimport _ from 'lodash'\nimport semver from 'semver'\nimport type { ApiClientFactory } from '../api/client'\nimport type * as config from '../config'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport type { CommandArgv, CommandDefinition } from '../typings'\nimport * as utils from '../utils'\nimport { BaseCommand } from './base-command'\n\nexport type GlobalCommandDefinition = CommandDefinition<typeof config.schemas.global>\nexport type GlobalCache = { apiUrl: string; token: string; workspaceId: string }\n\nexport type ConfigurableGlobalPaths = { botpressHomeDir: string; cliRootDir: utils.path.AbsolutePath }\nexport type ConstantGlobalPaths = typeof consts.fromHomeDir & typeof consts.fromCliRootDir\nexport type AllGlobalPaths = ConfigurableGlobalPaths & ConstantGlobalPaths\n\nclass GlobalPaths extends utils.path.PathStore<keyof AllGlobalPaths> {\n public constructor(argv: CommandArgv<GlobalCommandDefinition>) {\n const absBotpressHome = utils.path.absoluteFrom(utils.path.cwd(), argv.botpressHome)\n super({\n cliRootDir: consts.cliRootDir,\n botpressHomeDir: absBotpressHome,\n ..._.mapValues(consts.fromHomeDir, (p) => utils.path.absoluteFrom(absBotpressHome, p)),\n ..._.mapValues(consts.fromCliRootDir, (p) => utils.path.absoluteFrom(consts.cliRootDir, p)),\n })\n }\n}\n\nexport abstract class GlobalCommand<C extends GlobalCommandDefinition> extends BaseCommand<C> {\n protected api: ApiClientFactory\n protected prompt: utils.prompt.CLIPrompt\n private _pkgJson: utils.pkgJson.PackageJson | undefined\n\n public constructor(\n api: ApiClientFactory,\n prompt: utils.prompt.CLIPrompt,\n ...args: ConstructorParameters<typeof BaseCommand<C>>\n ) {\n super(...args)\n this.api = api\n this.prompt = prompt\n }\n\n protected get globalPaths() {\n return new GlobalPaths(this.argv)\n }\n\n protected get globalCache() {\n return new utils.cache.FSKeyValueCache<GlobalCache>(this.globalPaths.abs.globalCacheFile)\n }\n\n protected override async bootstrap() {\n const pkgJson = await this.readPkgJson()\n const versionText = chalk.bold(`v${pkgJson.version}`)\n this.logger.log(`Botpress CLI ${versionText}`, { prefix: '\uD83E\uDD16' })\n\n await this._notifyUpdateCli()\n\n const paths = this.globalPaths\n if (paths.abs.botpressHomeDir !== consts.defaultBotpressHome) {\n this.logger.log(`Using custom botpress home: ${paths.abs.botpressHomeDir}`, { prefix: '\uD83C\uDFE0' })\n }\n }\n\n protected override teardown = async () => {\n this.logger.cleanup()\n }\n\n protected async ensureLoginAndCreateClient(credentials: YargsConfig<typeof config.schemas.credentials>) {\n const cache = this.globalCache\n\n const token = await cache.get('token')\n const workspaceId = credentials.workspaceId ?? (await cache.get('workspaceId'))\n const apiUrl = credentials.apiUrl ?? (await cache.get('apiUrl'))\n\n if (!(token && workspaceId && apiUrl)) {\n throw new errors.NotLoggedInError()\n }\n\n if (apiUrl !== consts.defaultBotpressApiUrl) {\n this.logger.log(`Using custom url ${apiUrl}`, { prefix: '\uD83D\uDD17' })\n }\n\n return this.api.newClient({ apiUrl, token, workspaceId }, this.logger)\n }\n\n private _notifyUpdateCli = async (): Promise<void> => {\n try {\n this.logger.debug('Checking if cli is up to date')\n\n const pkgJson = await this.readPkgJson()\n if (!pkgJson.version) {\n throw new errors.BotpressCLIError('Could not find version in package.json')\n }\n\n const latest = await latestVersion(pkgJson.name)\n const isOutdated = semver.lt(pkgJson.version, latest)\n if (isOutdated) {\n this.logger.box(\n [\n `${chalk.bold('Update available')} ${chalk.dim(pkgJson.version)} \u2192 ${chalk.green(latest)}`,\n '',\n 'To update, run:',\n ` for npm ${chalk.cyan(`npm i -g ${pkgJson.name}`)}`,\n ` for yarn ${chalk.cyan(`yarn global add ${pkgJson.name}`)}`,\n ` for pnpm ${chalk.cyan(`pnpm i -g ${pkgJson.name}`)}`,\n ].join('\\n')\n )\n }\n } catch (thrown) {\n const err = errors.BotpressCLIError.map(thrown)\n this.logger.debug(`Failed to check if cli is up to date: ${err.message}`)\n }\n }\n\n protected async readPkgJson(): Promise<utils.pkgJson.PackageJson> {\n if (this._pkgJson) {\n return this._pkgJson\n }\n const { cliRootDir } = this.globalPaths.abs\n const pkgJson = await utils.pkgJson.readPackageJson(cliRootDir)\n if (!pkgJson) {\n throw new errors.BotpressCLIError(`Could not find package.json at \"${cliRootDir}\"`)\n }\n\n this._pkgJson = pkgJson\n return pkgJson\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAkB;AAClB,4BAA0B;AAC1B,oBAAc;AACd,oBAAmB;AAGnB,aAAwB;AACxB,aAAwB;AAExB,YAAuB;AACvB,0BAA4B;AAS5B,MAAM,oBAAoB,MAAM,KAAK,UAAgC;AAAA,EAC5D,YAAY,MAA4C;AAC7D,UAAM,kBAAkB,MAAM,KAAK,aAAa,MAAM,KAAK,IAAI,GAAG,KAAK,YAAY;AACnF,UAAM;AAAA,MACJ,YAAY,OAAO;AAAA,MACnB,iBAAiB;AAAA,MACjB,GAAG,cAAAA,QAAE,UAAU,OAAO,aAAa,CAAC,MAAM,MAAM,KAAK,aAAa,iBAAiB,CAAC,CAAC;AAAA,MACrF,GAAG,cAAAA,QAAE,UAAU,OAAO,gBAAgB,CAAC,MAAM,MAAM,KAAK,aAAa,OAAO,YAAY,CAAC,CAAC;AAAA,IAC5F,CAAC;AAAA,EACH;AACF;AAEO,MAAe,sBAAyD,gCAAe;AAAA,EAClF;AAAA,EACA;AAAA,EACF;AAAA,EAED,YACL,KACA,WACG,MACH;AACA,UAAM,GAAG,IAAI;AACb,SAAK,MAAM;AACX,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAc,cAAc;AAC1B,WAAO,IAAI,YAAY,KAAK,IAAI;AAAA,EAClC;AAAA,EAEA,IAAc,cAAc;AAC1B,WAAO,IAAI,MAAM,MAAM,gBAA6B,KAAK,YAAY,IAAI,eAAe;AAAA,EAC1F;AAAA,EAEA,MAAyB,YAAY;AACnC,UAAM,UAAU,MAAM,KAAK,YAAY;AACvC,UAAM,cAAc,aAAAC,QAAM,KAAK,IAAI,QAAQ,SAAS;AACpD,SAAK,OAAO,IAAI,gBAAgB,eAAe,EAAE,QAAQ,YAAK,CAAC;AAE/D,UAAM,KAAK,iBAAiB;AAE5B,UAAM,QAAQ,KAAK;AACnB,QAAI,MAAM,IAAI,oBAAoB,OAAO,qBAAqB;AAC5D,WAAK,OAAO,IAAI,+BAA+B,MAAM,IAAI,mBAAmB,EAAE,QAAQ,YAAK,CAAC;AAAA,IAC9F;AAAA,EACF;AAAA,EAEmB,WAAW,YAAY;AACxC,SAAK,OAAO,QAAQ;AAAA,EACtB;AAAA,EAEA,MAAgB,2BAA2B,aAA6D;AACtG,UAAM,QAAQ,KAAK;AAEnB,UAAM,QAAQ,MAAM,MAAM,IAAI,OAAO;AACrC,UAAM,cAAc,YAAY,eAAgB,MAAM,MAAM,IAAI,aAAa;AAC7E,UAAM,SAAS,YAAY,UAAW,MAAM,MAAM,IAAI,QAAQ;AAE9D,QAAI,EAAE,SAAS,eAAe,SAAS;AACrC,YAAM,IAAI,OAAO,iBAAiB;AAAA,IACpC;AAEA,QAAI,WAAW,OAAO,uBAAuB;AAC3C,WAAK,OAAO,IAAI,oBAAoB,UAAU,EAAE,QAAQ,YAAK,CAAC;AAAA,IAChE;AAEA,WAAO,KAAK,IAAI,UAAU,EAAE,QAAQ,OAAO,YAAY,GAAG,KAAK,MAAM;AAAA,EACvE;AAAA,EAEQ,mBAAmB,YAA2B;AACpD,QAAI;AACF,WAAK,OAAO,MAAM,+BAA+B;AAEjD,YAAM,UAAU,MAAM,KAAK,YAAY;AACvC,UAAI,CAAC,QAAQ,SAAS;AACpB,cAAM,IAAI,OAAO,iBAAiB,wCAAwC;AAAA,MAC5E;AAEA,YAAM,SAAS,UAAM,sBAAAC,SAAc,QAAQ,IAAI;AAC/C,YAAM,aAAa,cAAAC,QAAO,GAAG,QAAQ,SAAS,MAAM;AACpD,UAAI,YAAY;AACd,aAAK,OAAO;AAAA,UACV;AAAA,YACE,GAAG,aAAAF,QAAM,KAAK,kBAAkB,KAAK,aAAAA,QAAM,IAAI,QAAQ,OAAO,YAAO,aAAAA,QAAM,MAAM,MAAM;AAAA,YACvF;AAAA,YACA;AAAA,YACA,cAAc,aAAAA,QAAM,KAAK,YAAY,QAAQ,MAAM;AAAA,YACnD,cAAc,aAAAA,QAAM,KAAK,mBAAmB,QAAQ,MAAM;AAAA,YAC1D,cAAc,aAAAA,QAAM,KAAK,aAAa,QAAQ,MAAM;AAAA,UACtD,EAAE,KAAK,IAAI;AAAA,QACb;AAAA,MACF;AAAA,IACF,SAAS,QAAP;AACA,YAAM,MAAM,OAAO,iBAAiB,IAAI,MAAM;AAC9C,WAAK,OAAO,MAAM,yCAAyC,IAAI,SAAS;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAgB,cAAkD;AAChE,QAAI,KAAK,UAAU;AACjB,aAAO,KAAK;AAAA,IACd;AACA,UAAM,EAAE,WAAW,IAAI,KAAK,YAAY;AACxC,UAAM,UAAU,MAAM,MAAM,QAAQ,gBAAgB,UAAU;AAC9D,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,OAAO,iBAAiB,mCAAmC,aAAa;AAAA,IACpF;AAEA,SAAK,WAAW;AAChB,WAAO;AAAA,EACT;AACF;",
6
6
  "names": ["_", "chalk", "latestVersion", "semver"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botpress/cli",
3
- "version": "3.1.2",
3
+ "version": "3.2.0",
4
4
  "description": "Botpress CLI",
5
5
  "scripts": {
6
6
  "build": "pnpm run bundle && pnpm run template:gen",
@@ -20,9 +20,9 @@
20
20
  "main": "dist/index.js",
21
21
  "dependencies": {
22
22
  "@apidevtools/json-schema-ref-parser": "^11.7.0",
23
- "@botpress/chat": "0.4.9",
24
- "@botpress/client": "0.42.0",
25
- "@botpress/sdk": "3.1.0",
23
+ "@botpress/chat": "0.5.0",
24
+ "@botpress/client": "0.45.0",
25
+ "@botpress/sdk": "3.2.0",
26
26
  "@bpinternal/const": "^0.0.20",
27
27
  "@bpinternal/tunnel": "^0.1.1",
28
28
  "@bpinternal/yargs-extra": "^0.0.3",
@@ -5,8 +5,8 @@
5
5
  },
6
6
  "private": true,
7
7
  "dependencies": {
8
- "@botpress/client": "0.42.0",
9
- "@botpress/sdk": "3.1.0"
8
+ "@botpress/client": "0.45.0",
9
+ "@botpress/sdk": "3.2.0"
10
10
  },
11
11
  "devDependencies": {
12
12
  "@types/node": "^18.19.67",
@@ -6,8 +6,8 @@
6
6
  },
7
7
  "private": true,
8
8
  "dependencies": {
9
- "@botpress/client": "0.42.0",
10
- "@botpress/sdk": "3.1.0"
9
+ "@botpress/client": "0.45.0",
10
+ "@botpress/sdk": "3.2.0"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@types/node": "^18.19.67",
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "private": true,
8
8
  "dependencies": {
9
- "@botpress/sdk": "3.1.0"
9
+ "@botpress/sdk": "3.2.0"
10
10
  },
11
11
  "devDependencies": {
12
12
  "@types/node": "^18.19.67",
@@ -6,8 +6,8 @@
6
6
  },
7
7
  "private": true,
8
8
  "dependencies": {
9
- "@botpress/client": "0.42.0",
10
- "@botpress/sdk": "3.1.0"
9
+ "@botpress/client": "0.45.0",
10
+ "@botpress/sdk": "3.2.0"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@types/node": "^18.19.67",
@@ -6,8 +6,8 @@
6
6
  },
7
7
  "private": true,
8
8
  "dependencies": {
9
- "@botpress/client": "0.42.0",
10
- "@botpress/sdk": "3.1.0",
9
+ "@botpress/client": "0.45.0",
10
+ "@botpress/sdk": "3.2.0",
11
11
  "axios": "^1.6.8"
12
12
  },
13
13
  "devDependencies": {