@botpress/cli 6.0.0 → 6.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.
Files changed (65) hide show
  1. package/.turbo/turbo-build.log +13 -13
  2. package/dist/api/bot-body.js +10 -5
  3. package/dist/api/bot-body.js.map +2 -2
  4. package/dist/api/integration-body.js +12 -6
  5. package/dist/api/integration-body.js.map +2 -2
  6. package/dist/api/interface-body.js +10 -5
  7. package/dist/api/interface-body.js.map +2 -2
  8. package/dist/api/plugin-body.js +10 -5
  9. package/dist/api/plugin-body.js.map +2 -2
  10. package/dist/code-generation/bot-implementation/index.js +9 -1
  11. package/dist/code-generation/bot-implementation/index.js.map +2 -2
  12. package/dist/code-generation/index.d.ts +1 -1
  13. package/dist/code-generation/index.js +2 -2
  14. package/dist/code-generation/index.js.map +2 -2
  15. package/dist/code-generation/integration-implementation/index.js +2 -2
  16. package/dist/code-generation/integration-implementation/index.js.map +2 -2
  17. package/dist/code-generation/secret-module.d.ts +12 -0
  18. package/dist/code-generation/{integration-implementation/integration-secret.js → secret-module.js} +13 -13
  19. package/dist/code-generation/secret-module.js.map +7 -0
  20. package/dist/command-definitions.d.ts +43 -0
  21. package/dist/command-definitions.js +4 -0
  22. package/dist/command-definitions.js.map +2 -2
  23. package/dist/command-implementations/deploy-command.js +1 -0
  24. package/dist/command-implementations/deploy-command.js.map +2 -2
  25. package/dist/command-implementations/dev-command.js +9 -9
  26. package/dist/command-implementations/dev-command.js.map +2 -2
  27. package/dist/command-implementations/index.d.ts +45 -0
  28. package/dist/command-implementations/index.js +2 -1
  29. package/dist/command-implementations/index.js.map +2 -2
  30. package/dist/command-implementations/profile-commands.d.ts +4 -0
  31. package/dist/command-implementations/profile-commands.js +31 -1
  32. package/dist/command-implementations/profile-commands.js.map +2 -2
  33. package/dist/command-implementations/project-command.d.ts +3 -1
  34. package/dist/command-implementations/project-command.js +7 -5
  35. package/dist/command-implementations/project-command.js.map +2 -2
  36. package/dist/command-implementations/serve-command.js +1 -1
  37. package/dist/command-implementations/serve-command.js.map +2 -2
  38. package/dist/config.d.ts +40 -0
  39. package/dist/config.js +12 -1
  40. package/dist/config.js.map +2 -2
  41. package/dist/index.d.ts +45 -0
  42. package/dist/index.js +2 -1
  43. package/dist/index.js.map +2 -2
  44. package/dist/linter/base-linter.test.js +4 -2
  45. package/dist/linter/base-linter.test.js.map +2 -2
  46. package/dist/linter/ruleset-tests/bot.ruleset.test.js +22 -0
  47. package/dist/linter/ruleset-tests/bot.ruleset.test.js.map +2 -2
  48. package/dist/linter/rulesets/bot.ruleset.js +3 -1
  49. package/dist/linter/rulesets/bot.ruleset.js.map +2 -2
  50. package/dist/linter/rulesets/integration.ruleset.js +2 -12
  51. package/dist/linter/rulesets/integration.ruleset.js.map +2 -2
  52. package/dist/linter/rulesets/shared-rules.d.ts +2 -0
  53. package/dist/linter/rulesets/shared-rules.js +41 -0
  54. package/dist/linter/rulesets/shared-rules.js.map +7 -0
  55. package/dist/utils/schema-utils.d.ts +1 -0
  56. package/dist/utils/schema-utils.js +5 -2
  57. package/dist/utils/schema-utils.js.map +2 -2
  58. package/package.json +3 -3
  59. package/templates/empty-bot/package.json +2 -2
  60. package/templates/empty-integration/package.json +2 -2
  61. package/templates/empty-plugin/package.json +1 -1
  62. package/templates/hello-world/package.json +2 -2
  63. package/templates/webhook-message/package.json +2 -2
  64. package/dist/code-generation/integration-implementation/integration-secret.d.ts +0 -9
  65. package/dist/code-generation/integration-implementation/integration-secret.js.map +0 -7
@@ -106,7 +106,8 @@ var command_implementations_default = {
106
106
  subcommands: {
107
107
  list: getHandler(profiles.ListProfilesCommand),
108
108
  active: getHandler(profiles.ActiveProfileCommand),
109
- use: getHandler(profiles.UseProfileCommand)
109
+ use: getHandler(profiles.UseProfileCommand),
110
+ get: getHandler(profiles.GetProfileCommand)
110
111
  }
111
112
  }
112
113
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/index.ts"],
4
- "sourcesContent": ["import { ApiClient } from '../api/client'\nimport type commandDefinitions from '../command-definitions'\nimport type { ImplementationTree } from '../command-tree'\nimport { Logger } from '../logger'\nimport type { CommandArgv } from '../typings'\nimport * as utils from '../utils'\nimport { AddCommand } from './add-command'\nimport type { BaseCommand } from './base-command'\nimport * as bots from './bot-commands'\nimport { BuildCommand } from './build-command'\nimport { BundleCommand } from './bundle-command'\nimport { ChatCommand } from './chat-command'\nimport { DeployCommand } from './deploy-command'\nimport { DevCommand } from './dev-command'\nimport { GenerateCommand } from './gen-command'\nimport type { GlobalCommand, GlobalCommandDefinition } from './global-command'\nimport { InitCommand } from './init-command'\nimport * as integrations from './integration-commands'\nimport * as interfaces from './interface-commands'\nimport { LintCommand } from './lint-command'\nimport { LoginCommand } from './login-command'\nimport { LogoutCommand } from './logout-command'\nimport * as plugins from './plugin-commands'\nimport * as profiles from './profile-commands'\nimport { ReadCommand } from './read-command'\nimport { RemoveCommand } from './remove-command'\nimport { ServeCommand } from './serve-command'\n\ntype GlobalCtor<C extends GlobalCommandDefinition> = new (\n ...args: ConstructorParameters<typeof GlobalCommand<C>>\n) => BaseCommand<C>\n\nconst getHandler =\n <C extends GlobalCommandDefinition>(cls: GlobalCtor<C>) =>\n async (argv: CommandArgv<C>) => {\n const logger = new Logger(argv)\n const prompt = new utils.prompt.CLIPrompt(argv, logger)\n return new cls(ApiClient, prompt, logger, argv).handler()\n }\n\nexport default {\n login: getHandler(LoginCommand),\n logout: getHandler(LogoutCommand),\n bots: {\n subcommands: {\n create: getHandler(bots.CreateBotCommand),\n get: getHandler(bots.GetBotCommand),\n delete: getHandler(bots.DeleteBotCommand),\n list: getHandler(bots.ListBotsCommand),\n },\n },\n integrations: {\n subcommands: {\n get: getHandler(integrations.GetIntegrationCommand),\n list: getHandler(integrations.ListIntegrationsCommand),\n delete: getHandler(integrations.DeleteIntegrationCommand),\n },\n },\n interfaces: {\n subcommands: {\n get: getHandler(interfaces.GetInterfaceCommand),\n list: getHandler(interfaces.ListInterfacesCommand),\n delete: getHandler(interfaces.DeleteInterfaceCommand),\n },\n },\n plugins: {\n subcommands: {\n get: getHandler(plugins.GetPluginCommand),\n list: getHandler(plugins.ListPluginsCommand),\n delete: getHandler(plugins.DeletePluginCommand),\n },\n },\n init: getHandler(InitCommand),\n generate: getHandler(GenerateCommand),\n bundle: getHandler(BundleCommand),\n build: getHandler(BuildCommand),\n read: getHandler(ReadCommand),\n serve: getHandler(ServeCommand),\n deploy: getHandler(DeployCommand),\n add: getHandler(AddCommand),\n remove: getHandler(RemoveCommand),\n dev: getHandler(DevCommand),\n lint: getHandler(LintCommand),\n chat: getHandler(ChatCommand),\n profiles: {\n subcommands: {\n list: getHandler(profiles.ListProfilesCommand),\n active: getHandler(profiles.ActiveProfileCommand),\n use: getHandler(profiles.UseProfileCommand),\n },\n },\n} satisfies ImplementationTree<typeof commandDefinitions>\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA0B;AAG1B,oBAAuB;AAEvB,YAAuB;AACvB,yBAA2B;AAE3B,WAAsB;AACtB,2BAA6B;AAC7B,4BAA8B;AAC9B,0BAA4B;AAC5B,4BAA8B;AAC9B,yBAA2B;AAC3B,yBAAgC;AAEhC,0BAA4B;AAC5B,mBAA8B;AAC9B,iBAA4B;AAC5B,0BAA4B;AAC5B,2BAA6B;AAC7B,4BAA8B;AAC9B,cAAyB;AACzB,eAA0B;AAC1B,0BAA4B;AAC5B,4BAA8B;AAC9B,2BAA6B;AAM7B,MAAM,aACJ,CAAoC,QACpC,OAAO,SAAyB;AAC9B,QAAM,SAAS,IAAI,qBAAO,IAAI;AAC9B,QAAM,SAAS,IAAI,MAAM,OAAO,UAAU,MAAM,MAAM;AACtD,SAAO,IAAI,IAAI,yBAAW,QAAQ,QAAQ,IAAI,EAAE,QAAQ;AAC1D;AAEF,IAAO,kCAAQ;AAAA,EACb,OAAO,WAAW,iCAAY;AAAA,EAC9B,QAAQ,WAAW,mCAAa;AAAA,EAChC,MAAM;AAAA,IACJ,aAAa;AAAA,MACX,QAAQ,WAAW,KAAK,gBAAgB;AAAA,MACxC,KAAK,WAAW,KAAK,aAAa;AAAA,MAClC,QAAQ,WAAW,KAAK,gBAAgB;AAAA,MACxC,MAAM,WAAW,KAAK,eAAe;AAAA,IACvC;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,aAAa;AAAA,MACX,KAAK,WAAW,aAAa,qBAAqB;AAAA,MAClD,MAAM,WAAW,aAAa,uBAAuB;AAAA,MACrD,QAAQ,WAAW,aAAa,wBAAwB;AAAA,IAC1D;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,aAAa;AAAA,MACX,KAAK,WAAW,WAAW,mBAAmB;AAAA,MAC9C,MAAM,WAAW,WAAW,qBAAqB;AAAA,MACjD,QAAQ,WAAW,WAAW,sBAAsB;AAAA,IACtD;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,MACX,KAAK,WAAW,QAAQ,gBAAgB;AAAA,MACxC,MAAM,WAAW,QAAQ,kBAAkB;AAAA,MAC3C,QAAQ,WAAW,QAAQ,mBAAmB;AAAA,IAChD;AAAA,EACF;AAAA,EACA,MAAM,WAAW,+BAAW;AAAA,EAC5B,UAAU,WAAW,kCAAe;AAAA,EACpC,QAAQ,WAAW,mCAAa;AAAA,EAChC,OAAO,WAAW,iCAAY;AAAA,EAC9B,MAAM,WAAW,+BAAW;AAAA,EAC5B,OAAO,WAAW,iCAAY;AAAA,EAC9B,QAAQ,WAAW,mCAAa;AAAA,EAChC,KAAK,WAAW,6BAAU;AAAA,EAC1B,QAAQ,WAAW,mCAAa;AAAA,EAChC,KAAK,WAAW,6BAAU;AAAA,EAC1B,MAAM,WAAW,+BAAW;AAAA,EAC5B,MAAM,WAAW,+BAAW;AAAA,EAC5B,UAAU;AAAA,IACR,aAAa;AAAA,MACX,MAAM,WAAW,SAAS,mBAAmB;AAAA,MAC7C,QAAQ,WAAW,SAAS,oBAAoB;AAAA,MAChD,KAAK,WAAW,SAAS,iBAAiB;AAAA,IAC5C;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { ApiClient } from '../api/client'\nimport type commandDefinitions from '../command-definitions'\nimport type { ImplementationTree } from '../command-tree'\nimport { Logger } from '../logger'\nimport type { CommandArgv } from '../typings'\nimport * as utils from '../utils'\nimport { AddCommand } from './add-command'\nimport type { BaseCommand } from './base-command'\nimport * as bots from './bot-commands'\nimport { BuildCommand } from './build-command'\nimport { BundleCommand } from './bundle-command'\nimport { ChatCommand } from './chat-command'\nimport { DeployCommand } from './deploy-command'\nimport { DevCommand } from './dev-command'\nimport { GenerateCommand } from './gen-command'\nimport type { GlobalCommand, GlobalCommandDefinition } from './global-command'\nimport { InitCommand } from './init-command'\nimport * as integrations from './integration-commands'\nimport * as interfaces from './interface-commands'\nimport { LintCommand } from './lint-command'\nimport { LoginCommand } from './login-command'\nimport { LogoutCommand } from './logout-command'\nimport * as plugins from './plugin-commands'\nimport * as profiles from './profile-commands'\nimport { ReadCommand } from './read-command'\nimport { RemoveCommand } from './remove-command'\nimport { ServeCommand } from './serve-command'\n\ntype GlobalCtor<C extends GlobalCommandDefinition> = new (\n ...args: ConstructorParameters<typeof GlobalCommand<C>>\n) => BaseCommand<C>\n\nconst getHandler =\n <C extends GlobalCommandDefinition>(cls: GlobalCtor<C>) =>\n async (argv: CommandArgv<C>) => {\n const logger = new Logger(argv)\n const prompt = new utils.prompt.CLIPrompt(argv, logger)\n return new cls(ApiClient, prompt, logger, argv).handler()\n }\n\nexport default {\n login: getHandler(LoginCommand),\n logout: getHandler(LogoutCommand),\n bots: {\n subcommands: {\n create: getHandler(bots.CreateBotCommand),\n get: getHandler(bots.GetBotCommand),\n delete: getHandler(bots.DeleteBotCommand),\n list: getHandler(bots.ListBotsCommand),\n },\n },\n integrations: {\n subcommands: {\n get: getHandler(integrations.GetIntegrationCommand),\n list: getHandler(integrations.ListIntegrationsCommand),\n delete: getHandler(integrations.DeleteIntegrationCommand),\n },\n },\n interfaces: {\n subcommands: {\n get: getHandler(interfaces.GetInterfaceCommand),\n list: getHandler(interfaces.ListInterfacesCommand),\n delete: getHandler(interfaces.DeleteInterfaceCommand),\n },\n },\n plugins: {\n subcommands: {\n get: getHandler(plugins.GetPluginCommand),\n list: getHandler(plugins.ListPluginsCommand),\n delete: getHandler(plugins.DeletePluginCommand),\n },\n },\n init: getHandler(InitCommand),\n generate: getHandler(GenerateCommand),\n bundle: getHandler(BundleCommand),\n build: getHandler(BuildCommand),\n read: getHandler(ReadCommand),\n serve: getHandler(ServeCommand),\n deploy: getHandler(DeployCommand),\n add: getHandler(AddCommand),\n remove: getHandler(RemoveCommand),\n dev: getHandler(DevCommand),\n lint: getHandler(LintCommand),\n chat: getHandler(ChatCommand),\n profiles: {\n subcommands: {\n list: getHandler(profiles.ListProfilesCommand),\n active: getHandler(profiles.ActiveProfileCommand),\n use: getHandler(profiles.UseProfileCommand),\n get: getHandler(profiles.GetProfileCommand),\n },\n },\n} satisfies ImplementationTree<typeof commandDefinitions>\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA0B;AAG1B,oBAAuB;AAEvB,YAAuB;AACvB,yBAA2B;AAE3B,WAAsB;AACtB,2BAA6B;AAC7B,4BAA8B;AAC9B,0BAA4B;AAC5B,4BAA8B;AAC9B,yBAA2B;AAC3B,yBAAgC;AAEhC,0BAA4B;AAC5B,mBAA8B;AAC9B,iBAA4B;AAC5B,0BAA4B;AAC5B,2BAA6B;AAC7B,4BAA8B;AAC9B,cAAyB;AACzB,eAA0B;AAC1B,0BAA4B;AAC5B,4BAA8B;AAC9B,2BAA6B;AAM7B,MAAM,aACJ,CAAoC,QACpC,OAAO,SAAyB;AAC9B,QAAM,SAAS,IAAI,qBAAO,IAAI;AAC9B,QAAM,SAAS,IAAI,MAAM,OAAO,UAAU,MAAM,MAAM;AACtD,SAAO,IAAI,IAAI,yBAAW,QAAQ,QAAQ,IAAI,EAAE,QAAQ;AAC1D;AAEF,IAAO,kCAAQ;AAAA,EACb,OAAO,WAAW,iCAAY;AAAA,EAC9B,QAAQ,WAAW,mCAAa;AAAA,EAChC,MAAM;AAAA,IACJ,aAAa;AAAA,MACX,QAAQ,WAAW,KAAK,gBAAgB;AAAA,MACxC,KAAK,WAAW,KAAK,aAAa;AAAA,MAClC,QAAQ,WAAW,KAAK,gBAAgB;AAAA,MACxC,MAAM,WAAW,KAAK,eAAe;AAAA,IACvC;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,aAAa;AAAA,MACX,KAAK,WAAW,aAAa,qBAAqB;AAAA,MAClD,MAAM,WAAW,aAAa,uBAAuB;AAAA,MACrD,QAAQ,WAAW,aAAa,wBAAwB;AAAA,IAC1D;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,aAAa;AAAA,MACX,KAAK,WAAW,WAAW,mBAAmB;AAAA,MAC9C,MAAM,WAAW,WAAW,qBAAqB;AAAA,MACjD,QAAQ,WAAW,WAAW,sBAAsB;AAAA,IACtD;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,MACX,KAAK,WAAW,QAAQ,gBAAgB;AAAA,MACxC,MAAM,WAAW,QAAQ,kBAAkB;AAAA,MAC3C,QAAQ,WAAW,QAAQ,mBAAmB;AAAA,IAChD;AAAA,EACF;AAAA,EACA,MAAM,WAAW,+BAAW;AAAA,EAC5B,UAAU,WAAW,kCAAe;AAAA,EACpC,QAAQ,WAAW,mCAAa;AAAA,EAChC,OAAO,WAAW,iCAAY;AAAA,EAC9B,MAAM,WAAW,+BAAW;AAAA,EAC5B,OAAO,WAAW,iCAAY;AAAA,EAC9B,QAAQ,WAAW,mCAAa;AAAA,EAChC,KAAK,WAAW,6BAAU;AAAA,EAC1B,QAAQ,WAAW,mCAAa;AAAA,EAChC,KAAK,WAAW,6BAAU;AAAA,EAC1B,MAAM,WAAW,+BAAW;AAAA,EAC5B,MAAM,WAAW,+BAAW;AAAA,EAC5B,UAAU;AAAA,IACR,aAAa;AAAA,MACX,MAAM,WAAW,SAAS,mBAAmB;AAAA,MAC7C,QAAQ,WAAW,SAAS,oBAAoB;AAAA,MAChD,KAAK,WAAW,SAAS,iBAAiB;AAAA,MAC1C,KAAK,WAAW,SAAS,iBAAiB;AAAA,IAC5C;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -12,3 +12,7 @@ export type UseProfileCommandDefinition = typeof commandDefinitions.profiles.sub
12
12
  export declare class UseProfileCommand extends GlobalCommand<UseProfileCommandDefinition> {
13
13
  run(): Promise<void>;
14
14
  }
15
+ export type GetProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.get;
16
+ export declare class GetProfileCommand extends GlobalCommand<GetProfileCommandDefinition> {
17
+ run(): Promise<void>;
18
+ }
@@ -29,6 +29,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
29
29
  var profile_commands_exports = {};
30
30
  __export(profile_commands_exports, {
31
31
  ActiveProfileCommand: () => ActiveProfileCommand,
32
+ GetProfileCommand: () => GetProfileCommand,
32
33
  ListProfilesCommand: () => ListProfilesCommand,
33
34
  UseProfileCommand: () => UseProfileCommand
34
35
  });
@@ -78,7 +79,7 @@ class UseProfileCommand extends import_global_command.GlobalCommand {
78
79
  return;
79
80
  }
80
81
  const profiles = await this.readProfilesFromFS();
81
- const choices = Object.entries(profiles).map(([profileName, _]) => ({
82
+ const choices = Object.keys(profiles).map((profileName) => ({
82
83
  title: profileName,
83
84
  description: "",
84
85
  value: profileName
@@ -95,6 +96,34 @@ class UseProfileCommand extends import_global_command.GlobalCommand {
95
96
  logSuccess(selectedProfile);
96
97
  }
97
98
  }
99
+ class GetProfileCommand extends import_global_command.GlobalCommand {
100
+ async run() {
101
+ const logResult = (profileEntry) => {
102
+ const profile2 = _shouldOmitToken(this.argv) ? _stripProfileToken(profileEntry) : profileEntry;
103
+ this.logger.log("Profile:");
104
+ this.logger.json(profile2);
105
+ };
106
+ if (this.argv.profileToGet) {
107
+ const profile2 = await this.readProfileFromFS(this.argv.profileToGet);
108
+ logResult({ name: this.argv.profileToGet, ...profile2 });
109
+ return;
110
+ }
111
+ const profiles = await this.readProfilesFromFS();
112
+ const choices = Object.keys(profiles).map((profileName) => ({
113
+ title: profileName,
114
+ description: "",
115
+ value: profileName
116
+ }));
117
+ const selectedProfile = await this.prompt.select("Select the profile you want to get.", { choices });
118
+ if (!selectedProfile) {
119
+ this.logger.log("No profile selected, aborting.");
120
+ return;
121
+ }
122
+ const profile = profiles[selectedProfile];
123
+ if (!profile) throw new errors.BotpressCLIError("The selected profile could not be read");
124
+ logResult({ name: selectedProfile, ...profile });
125
+ }
126
+ }
98
127
  const _updateGlobalCache = async (props) => {
99
128
  await props.globalCache.set("activeProfile", props.profileName);
100
129
  await props.globalCache.set("apiUrl", props.profile.apiUrl);
@@ -110,6 +139,7 @@ const _shouldOmitToken = (argv) => !argv.displayToken;
110
139
  // Annotate the CommonJS export names for ESM import in node:
111
140
  0 && (module.exports = {
112
141
  ActiveProfileCommand,
142
+ GetProfileCommand,
113
143
  ListProfilesCommand,
114
144
  UseProfileCommand
115
145
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/profile-commands.ts"],
4
- "sourcesContent": ["import chalk from 'chalk'\nimport type commandDefinitions from '../command-definitions'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\nimport { GlobalCache, GlobalCommand, ProfileCredentials } from './global-command'\n\ntype ProfileEntry = ProfileCredentials & {\n name: string\n}\n\ntype ProfileEntryWithoutToken = Omit<ProfileEntry, 'token'>\n\nexport type ActiveProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.active\nexport class ActiveProfileCommand extends GlobalCommand<ActiveProfileCommandDefinition> {\n public async run(): Promise<void> {\n let activeProfileName = await this.globalCache.get('activeProfile')\n\n if (!activeProfileName) {\n this.logger.debug(`No active profile set, defaulting to ${consts.defaultProfileName}`)\n activeProfileName = consts.defaultProfileName\n await this.globalCache.set('activeProfile', activeProfileName)\n }\n\n const profile = await this.readProfileFromFS(activeProfileName)\n let profileEntry: ProfileEntry | ProfileEntryWithoutToken = { name: activeProfileName, ...profile }\n if (_shouldOmitToken(this.argv)) profileEntry = _stripProfileToken(profileEntry)\n\n this.logger.log('Active profile:')\n this.logger.json(profileEntry)\n }\n}\n\nexport type ListProfilesCommandDefinition = typeof commandDefinitions.profiles.subcommands.list\nexport class ListProfilesCommand extends GlobalCommand<ListProfilesCommandDefinition> {\n public async run(): Promise<void> {\n const profiles = await this.readProfilesFromFS()\n const profileEntries: ProfileEntry[] = Object.entries(profiles).map(([name, profile]) => ({ name, ...profile }))\n if (!profileEntries.length) {\n this.logger.log('No profiles found')\n return\n }\n const activeProfileName = await this.globalCache.get('activeProfile')\n const activeProfileMsg = `Active profile: '${chalk.bold(chalk.cyanBright(activeProfileName))}'`\n\n this.logger.log(activeProfileMsg)\n this.logger.json(!_shouldOmitToken(this.argv) ? profileEntries : profileEntries.map(_stripProfileToken))\n this.logger.log(activeProfileMsg)\n }\n}\n\nexport type UseProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.use\nexport class UseProfileCommand extends GlobalCommand<UseProfileCommandDefinition> {\n public async run(): Promise<void> {\n const logSuccess = (profileName: string) => this.logger.success(`Now using profile \"${profileName}\"`)\n\n if (this.argv.profileToUse) {\n const profile = await this.readProfileFromFS(this.argv.profileToUse)\n await this.globalCache.set('activeProfile', this.argv.profileToUse)\n await _updateGlobalCache({ globalCache: this.globalCache, profileName: this.argv.profileToUse, profile })\n logSuccess(this.argv.profileToUse)\n return\n }\n const profiles = await this.readProfilesFromFS()\n const choices = Object.entries(profiles).map(([profileName, _]) => ({\n title: profileName,\n description: '',\n value: profileName,\n }))\n const selectedProfile = await this.prompt.select('Select the profile you want to use.', { choices })\n\n if (!selectedProfile) {\n this.logger.log('No profile selected, aborting.')\n return\n }\n\n const profile = profiles[selectedProfile]\n if (!profile) throw new errors.BotpressCLIError('The selected profile could not be read')\n await this.globalCache.set('activeProfile', selectedProfile)\n await _updateGlobalCache({ globalCache: this.globalCache, profileName: selectedProfile, profile })\n logSuccess(selectedProfile)\n }\n}\n\nconst _updateGlobalCache = async (props: {\n globalCache: utils.cache.FSKeyValueCache<GlobalCache>\n profileName: string\n profile: ProfileCredentials\n}): Promise<void> => {\n await props.globalCache.set('activeProfile', props.profileName)\n await props.globalCache.set('apiUrl', props.profile.apiUrl)\n await props.globalCache.set('token', props.profile.token)\n await props.globalCache.set('workspaceId', props.profile.workspaceId)\n}\n\nconst _stripProfileToken = (profile: ProfileEntry | ProfileEntryWithoutToken): ProfileEntryWithoutToken => ({\n name: profile.name,\n apiUrl: profile.apiUrl,\n workspaceId: profile.workspaceId,\n})\n\nconst _shouldOmitToken = (argv: { displayToken: boolean }) => !argv.displayToken\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import chalk from 'chalk'\nimport type commandDefinitions from '../command-definitions'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\nimport { GlobalCache, GlobalCommand, ProfileCredentials } from './global-command'\n\ntype ProfileEntry = ProfileCredentials & {\n name: string\n}\n\ntype ProfileEntryWithoutToken = Omit<ProfileEntry, 'token'>\n\nexport type ActiveProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.active\nexport class ActiveProfileCommand extends GlobalCommand<ActiveProfileCommandDefinition> {\n public async run(): Promise<void> {\n let activeProfileName = await this.globalCache.get('activeProfile')\n\n if (!activeProfileName) {\n this.logger.debug(`No active profile set, defaulting to ${consts.defaultProfileName}`)\n activeProfileName = consts.defaultProfileName\n await this.globalCache.set('activeProfile', activeProfileName)\n }\n\n const profile = await this.readProfileFromFS(activeProfileName)\n let profileEntry: ProfileEntry | ProfileEntryWithoutToken = { name: activeProfileName, ...profile }\n if (_shouldOmitToken(this.argv)) profileEntry = _stripProfileToken(profileEntry)\n\n this.logger.log('Active profile:')\n this.logger.json(profileEntry)\n }\n}\n\nexport type ListProfilesCommandDefinition = typeof commandDefinitions.profiles.subcommands.list\nexport class ListProfilesCommand extends GlobalCommand<ListProfilesCommandDefinition> {\n public async run(): Promise<void> {\n const profiles = await this.readProfilesFromFS()\n const profileEntries: ProfileEntry[] = Object.entries(profiles).map(([name, profile]) => ({ name, ...profile }))\n if (!profileEntries.length) {\n this.logger.log('No profiles found')\n return\n }\n const activeProfileName = await this.globalCache.get('activeProfile')\n const activeProfileMsg = `Active profile: '${chalk.bold(chalk.cyanBright(activeProfileName))}'`\n\n this.logger.log(activeProfileMsg)\n this.logger.json(!_shouldOmitToken(this.argv) ? profileEntries : profileEntries.map(_stripProfileToken))\n this.logger.log(activeProfileMsg)\n }\n}\n\nexport type UseProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.use\nexport class UseProfileCommand extends GlobalCommand<UseProfileCommandDefinition> {\n public async run(): Promise<void> {\n const logSuccess = (profileName: string) => this.logger.success(`Now using profile \"${profileName}\"`)\n\n if (this.argv.profileToUse) {\n const profile = await this.readProfileFromFS(this.argv.profileToUse)\n await this.globalCache.set('activeProfile', this.argv.profileToUse)\n await _updateGlobalCache({ globalCache: this.globalCache, profileName: this.argv.profileToUse, profile })\n logSuccess(this.argv.profileToUse)\n return\n }\n const profiles = await this.readProfilesFromFS()\n const choices = Object.keys(profiles).map((profileName) => ({\n title: profileName,\n description: '',\n value: profileName,\n }))\n const selectedProfile = await this.prompt.select('Select the profile you want to use.', { choices })\n\n if (!selectedProfile) {\n this.logger.log('No profile selected, aborting.')\n return\n }\n\n const profile = profiles[selectedProfile]\n if (!profile) throw new errors.BotpressCLIError('The selected profile could not be read')\n await this.globalCache.set('activeProfile', selectedProfile)\n await _updateGlobalCache({ globalCache: this.globalCache, profileName: selectedProfile, profile })\n logSuccess(selectedProfile)\n }\n}\n\nexport type GetProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.get\nexport class GetProfileCommand extends GlobalCommand<GetProfileCommandDefinition> {\n public async run(): Promise<void> {\n const logResult = (profileEntry: ProfileEntry) => {\n const profile = _shouldOmitToken(this.argv) ? _stripProfileToken(profileEntry) : profileEntry\n this.logger.log('Profile:')\n this.logger.json(profile)\n }\n\n if (this.argv.profileToGet) {\n const profile = await this.readProfileFromFS(this.argv.profileToGet)\n logResult({ name: this.argv.profileToGet, ...profile })\n return\n }\n\n const profiles = await this.readProfilesFromFS()\n const choices = Object.keys(profiles).map((profileName) => ({\n title: profileName,\n description: '',\n value: profileName,\n }))\n const selectedProfile = await this.prompt.select('Select the profile you want to get.', { choices })\n\n if (!selectedProfile) {\n this.logger.log('No profile selected, aborting.')\n return\n }\n\n const profile = profiles[selectedProfile]\n if (!profile) throw new errors.BotpressCLIError('The selected profile could not be read')\n logResult({ name: selectedProfile, ...profile })\n }\n}\n\nconst _updateGlobalCache = async (props: {\n globalCache: utils.cache.FSKeyValueCache<GlobalCache>\n profileName: string\n profile: ProfileCredentials\n}): Promise<void> => {\n await props.globalCache.set('activeProfile', props.profileName)\n await props.globalCache.set('apiUrl', props.profile.apiUrl)\n await props.globalCache.set('token', props.profile.token)\n await props.globalCache.set('workspaceId', props.profile.workspaceId)\n}\n\nconst _stripProfileToken = (profile: ProfileEntry | ProfileEntryWithoutToken): ProfileEntryWithoutToken => ({\n name: profile.name,\n apiUrl: profile.apiUrl,\n workspaceId: profile.workspaceId,\n})\n\nconst _shouldOmitToken = (argv: { displayToken: boolean }) => !argv.displayToken\n"],
5
+ "mappings": "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",
6
6
  "names": ["chalk", "profile"]
7
7
  }
@@ -99,7 +99,9 @@ export declare abstract class ProjectCommand<C extends ProjectCommandDefinition>
99
99
  private _getAuthorizationLink;
100
100
  private _getSandboxLink;
101
101
  private _displaySandboxLinkAndCode;
102
- protected promptSecrets(integrationDef: sdk.IntegrationDefinition, argv: YargsConfig<typeof config.schemas.secrets>, opts?: {
102
+ protected promptSecrets(def: {
103
+ secrets?: Record<string, sdk.SecretDefinition>;
104
+ }, argv: YargsConfig<typeof config.schemas.secrets>, opts?: {
103
105
  formatEnv?: boolean;
104
106
  knownSecrets?: string[];
105
107
  }): Promise<Record<string, string | null>>;
@@ -363,17 +363,17 @@ class ProjectCommand extends import_global_command.GlobalCommand {
363
363
  });
364
364
  }
365
365
  }
366
- async promptSecrets(integrationDef, argv, opts = {}) {
366
+ async promptSecrets(def, argv, opts = {}) {
367
367
  const formatEnv = opts.formatEnv ?? false;
368
368
  const knownSecrets = opts.knownSecrets ?? [];
369
- const { secrets: secretDefinitions } = integrationDef;
369
+ const { secrets: secretDefinitions } = def;
370
370
  if (!secretDefinitions) {
371
371
  return {};
372
372
  }
373
373
  const secretArgv = this._parseArgvSecrets(argv.secrets);
374
374
  const invalidSecret = Object.keys(secretArgv).find((s) => !secretDefinitions[s]);
375
375
  if (invalidSecret) {
376
- throw new errors.BotpressCLIError(`Secret ${invalidSecret} is not defined in integration definition`);
376
+ throw new errors.BotpressCLIError(`Secret ${invalidSecret} is not defined in the definition`);
377
377
  }
378
378
  const values = {};
379
379
  for (const [secretName, { optional }] of Object.entries(secretDefinitions)) {
@@ -443,7 +443,8 @@ class ProjectCommand extends import_global_command.GlobalCommand {
443
443
  },
444
444
  configuration: integrationDef.configuration ? {
445
445
  schema: await utils.schema.mapZodToJsonSchema(integrationDef.configuration, {
446
- useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer
446
+ useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,
447
+ toJSONSchemaOptions: integrationDef.__advanced?.toJSONSchemaOptions
447
448
  }),
448
449
  identifier: {
449
450
  required: integrationDef.configuration.identifier?.required,
@@ -456,7 +457,8 @@ class ProjectCommand extends import_global_command.GlobalCommand {
456
457
  title: configuration.title,
457
458
  description: configuration.description,
458
459
  schema: await utils.schema.mapZodToJsonSchema(configuration, {
459
- useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer
460
+ useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,
461
+ toJSONSchemaOptions: integrationDef.__advanced?.toJSONSchemaOptions
460
462
  }),
461
463
  identifier: {
462
464
  required: configuration.identifier?.required,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/project-command.ts"],
4
- "sourcesContent": ["import type * as client from '@botpress/client'\nimport type * as sdk from '@botpress/sdk'\nimport type { YargsConfig } from '@bpinternal/yargs-extra'\nimport chalk from 'chalk'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport semver from 'semver'\nimport * as apiUtils from '../api'\nimport * as codegen from '../code-generation'\nimport * as config from '../config'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport { validateIntegrationDefinition, validateBotDefinition } from '../sdk'\nimport type { CommandArgv, CommandDefinition } from '../typings'\nimport * as utils from '../utils'\nimport { GlobalCommand } from './global-command'\n\nexport type ProjectCommandDefinition = CommandDefinition<typeof config.schemas.project>\nexport type ProjectCache = {\n botId: string\n devId: string\n tunnelId: string\n secrets: {\n [secretName: string]: string\n }\n}\n\ntype ConfigurableProjectPaths = { workDir: string }\ntype ConstantProjectPaths = typeof consts.fromWorkDir\ntype AllProjectPaths = ConfigurableProjectPaths & ConstantProjectPaths\n\ntype LintIgnoredConfig = { bpLintDisabled?: boolean }\n\nexport type ProjectType = ProjectDefinition['type']\nexport type ProjectDefinition = LintIgnoredConfig &\n (\n | { type: 'integration'; definition: sdk.IntegrationDefinition }\n | { type: 'interface'; definition: sdk.InterfaceDefinition }\n | { type: 'bot'; definition: sdk.BotDefinition }\n | { type: 'plugin'; definition: sdk.PluginDefinition }\n )\n\ntype ProjectDefinitionResolver<T> = () => Promise<LintIgnoredConfig & T>\n\nexport type ProjectDefinitionLazy =\n | {\n projectType: 'integration'\n resolveProjectDefinition: ProjectDefinitionResolver<{\n type: 'integration'\n definition: sdk.IntegrationDefinition\n }>\n }\n | {\n projectType: 'bot'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'bot'; definition: sdk.BotDefinition }>\n }\n | {\n projectType: 'interface'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'interface'; definition: sdk.InterfaceDefinition }>\n }\n | {\n projectType: 'plugin'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'plugin'; definition: sdk.PluginDefinition }>\n }\n\ntype UpdatedBot = client.Bot\n\ntype ClientIntegrationDefinitions = Record<string, client.Integration>\ntype ClientIntegration = client.Bot['integrations'][string]\n\nclass ProjectPaths extends utils.path.PathStore<keyof AllProjectPaths> {\n public constructor(argv: CommandArgv<ProjectCommandDefinition>) {\n const absWorkDir = utils.path.absoluteFrom(utils.path.cwd(), argv.workDir)\n super({\n workDir: absWorkDir,\n ..._.mapValues(consts.fromWorkDir, (p) => utils.path.absoluteFrom(absWorkDir, p)),\n })\n }\n}\n\nexport class ProjectDefinitionContext {\n private _codeCache: Map<string, object> = new Map()\n private _buildContext: utils.esbuild.BuildEntrypointContext = new utils.esbuild.BuildEntrypointContext()\n\n public getOrResolveDefinition<T extends object>(code: string): T {\n const definition = this._codeCache.get(code)\n if (definition) {\n return definition as T\n }\n const result = utils.require.requireJsCode<{ default: object }>(code)\n this._codeCache.set(code, result.default)\n return result.default as T\n }\n\n public rebuildEntrypoint(...args: Parameters<utils.esbuild.BuildEntrypointContext['rebuild']>) {\n return this._buildContext.rebuild(...args)\n }\n}\n\ntype ResolvedDependency = { id: string }\ntype DependencyCacheKey = `${'integration' | 'plugin' | 'interface'}:${string}@${string}`\n\nexport abstract class ProjectCommand<C extends ProjectCommandDefinition> extends GlobalCommand<C> {\n protected projectContext: ProjectDefinitionContext = new ProjectDefinitionContext()\n private _dependencyCache = new Map<DependencyCacheKey, ResolvedDependency>()\n\n public setProjectContext(projectContext: ProjectDefinitionContext) {\n this.projectContext = projectContext\n return this\n }\n\n protected override async bootstrap() {\n await super.bootstrap()\n await this._notifyUpdateSdk()\n }\n\n protected get projectPaths() {\n return new ProjectPaths(this.argv)\n }\n\n protected get projectCache() {\n return new utils.cache.FSKeyValueCache<ProjectCache>(this.projectPaths.abs.projectCacheFile)\n }\n\n private _readProjectType(projectPaths: ProjectPaths): ProjectType {\n const abs = projectPaths.abs\n if (fs.existsSync(abs.integrationDefinition)) {\n return 'integration'\n }\n if (fs.existsSync(abs.interfaceDefinition)) {\n return 'interface'\n }\n if (fs.existsSync(abs.botDefinition)) {\n return 'bot'\n }\n if (fs.existsSync(abs.pluginDefinition)) {\n return 'plugin'\n }\n throw new errors.UnsupportedProjectType()\n }\n\n protected readProjectDefinitionFromFS(): ProjectDefinitionLazy {\n try {\n const type = this._readProjectType(this.projectPaths)\n if (type === 'integration') {\n return {\n projectType: 'integration',\n resolveProjectDefinition: async () => ({\n type: 'integration',\n ...(await this._readIntegrationDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'plugin') {\n return {\n projectType: 'plugin',\n resolveProjectDefinition: async () => ({\n type: 'plugin',\n ...(await this._readPluginDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'interface') {\n return {\n projectType: 'interface',\n resolveProjectDefinition: async () => ({\n type: 'interface',\n ...(await this._readInterfaceDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'bot') {\n return {\n projectType: 'bot',\n resolveProjectDefinition: async () => ({\n type: 'bot',\n ...(await this._readBotDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n } catch (thrown: unknown) {\n throw errors.BotpressCLIError.wrap(thrown, 'Error while reading project definition')\n }\n throw new errors.ProjectDefinitionNotFoundError(this.projectPaths.abs.workDir)\n }\n\n private async _readIntegrationDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'integrationDefinition'>\n ): Promise<{ definition: sdk.IntegrationDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.integrationDefinition)) {\n throw new errors.BotpressCLIError('Could not read integration definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.integrationDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.integrationDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read integration definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.IntegrationDefinition>(artifact.text)\n validateIntegrationDefinition(definition)\n return { definition, bpLintDisabled }\n }\n\n private async _readInterfaceDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'interfaceDefinition'>\n ): Promise<{ definition: sdk.InterfaceDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.interfaceDefinition)) {\n throw new errors.BotpressCLIError('Could not read interface definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.interfaceDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.interfaceDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read interface definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.InterfaceDefinition>(artifact.text)\n\n return { definition, bpLintDisabled }\n }\n\n private async _readBotDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'botDefinition'>\n ): Promise<{ definition: sdk.BotDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.botDefinition)) {\n throw new errors.BotpressCLIError('Could not read bot definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.botDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.botDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read bot definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.BotDefinition>(artifact.text)\n validateBotDefinition(definition)\n return { definition, bpLintDisabled }\n }\n\n private async _readPluginDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'pluginDefinition'>\n ): Promise<{ definition: sdk.PluginDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.pluginDefinition)) {\n throw new errors.BotpressCLIError('Could not read plugin definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.pluginDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.pluginDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read plugin definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.PluginDefinition>(artifact.text)\n // TODO: validate plugin definition\n return { definition, bpLintDisabled }\n }\n\n private async _isBpLintDisabled(definitionPath: string): Promise<boolean> {\n const tsContent = await fs.promises.readFile(definitionPath, 'utf-8')\n const regex = /\\/\\* bplint-disable \\*\\//\n return regex.test(tsContent)\n }\n\n protected async displayIntegrationUrls({ api, bot }: { api: apiUtils.ApiClient; bot: client.Bot }) {\n if (!_.keys(bot.integrations).length) {\n this.logger.debug('No integrations in bot')\n return\n }\n\n const integrationDefinitions = await utils.records.mapValuesAsync(bot.integrations, async (integration) =>\n api.getPublicOrPrivateIntegration({\n type: 'id',\n id: integration.id,\n })\n )\n\n this.logger.log('Integrations:')\n for (const [alias, integration] of Object.entries(bot.integrations)) {\n if (integration.enabled) {\n this.logger.log(`${alias} ${integration.version}:`, { prefix: { symbol: '\u2192', indent: 2 } })\n } else {\n this.logger.log(`${alias} ${integration.version} ${chalk.italic('(disabled)')}:`, {\n prefix: { symbol: '\u2192', indent: 2 },\n })\n }\n\n const integrationDefinition = integrationDefinitions[alias]\n const linkTemplateScript = integrationDefinition\n ? this._getLinkTemplateScript({ integration, integrationDefinition })\n : undefined\n this._displayWebhookUrl({ integration, integrationDefinition, linkTemplateScript })\n if (!integrationDefinition) {\n this.logger.debug(\n `No integration definition for integration ${alias} (${integration.name}, ${integration.id}), skipping OAuth or Sandbox links`\n )\n this.logger.line().commit()\n continue\n }\n const isSandbox =\n integration.configurationType === 'sandbox' && !!integrationDefinition.sandbox?.identifierExtractScript\n const showLink = !!linkTemplateScript && (isSandbox || !!integrationDefinition.identifier?.extractScript)\n if (showLink && isSandbox) {\n await this._displaySandboxLinkAndCode({ integration, alias, bot, api, linkTemplateScript })\n } else if (showLink) {\n this._displayAuthorizationLink({ integration, api, linkTemplateScript })\n }\n this.logger.line().commit()\n }\n }\n\n private _getLinkTemplateScript({\n integration,\n integrationDefinition,\n }: {\n integration: ClientIntegration\n integrationDefinition?: ClientIntegrationDefinitions[string]\n }) {\n const config =\n integration.configurationType === null\n ? integrationDefinition?.configuration\n : integrationDefinition?.configurations[integration.configurationType]\n return config?.identifier?.linkTemplateScript\n }\n\n private _displayWebhookUrl({\n integration,\n integrationDefinition,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n integrationDefinition?: ClientIntegrationDefinitions[string]\n linkTemplateScript?: string\n }) {\n const needsWebhook = !(integrationDefinition?.identifier && linkTemplateScript)\n const logFn = (needsWebhook ? this.logger.log : this.logger.debug).bind(this.logger)\n\n if (integration.enabled) {\n logFn(`${chalk.bold('Webhook')}: ${integration.webhookUrl}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n logFn(`Webhook: ${integration.webhookUrl}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n private _displayAuthorizationLink({\n integration,\n api,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n const authorizationLink = this._getAuthorizationLink({ integration, api, linkTemplateScript })\n const isAuthorized = !!integration.identifier\n const authorizationStatus = integration.identifier ? 'Authorized \u2713' : 'Authorize'\n if (integration.enabled && isAuthorized) {\n this.logger.log(`${chalk.bold(authorizationStatus)} : ${authorizationLink}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n this.logger.log(`${authorizationStatus}: ${authorizationLink}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n private _getLinkTemplateArgs({ integration, api }: { integration: ClientIntegration; api: apiUtils.ApiClient }) {\n // These are the values used by the studio\n let env: 'development' | 'preview' | 'production'\n if (api.url.includes(consts.stagingBotpressDomain)) {\n env = 'preview'\n } else if (api.url.includes(consts.productionBotpressDomain)) {\n env = 'production'\n } else {\n env = 'development'\n }\n return {\n env,\n webhookId: integration.webhookId,\n webhookUrl: api.url.replace('api', 'webhook'),\n }\n }\n\n private _getAuthorizationLink({\n integration,\n api,\n linkTemplateScript,\n }: {\n integration: client.Bot['integrations'][string]\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n return utils.vrl.getStringResult({\n code: linkTemplateScript,\n data: this._getLinkTemplateArgs({ integration, api }),\n })\n }\n\n private _getSandboxLink({\n shareableId,\n integration,\n api,\n linkTemplateScript,\n }: {\n shareableId: string\n integration: ClientIntegration\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n return utils.vrl.getStringResult({\n code: linkTemplateScript,\n data: { shareableId, ...this._getLinkTemplateArgs({ integration, api }) },\n })\n }\n\n private async _displaySandboxLinkAndCode({\n integration,\n alias,\n bot,\n api,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n alias: string\n bot: client.Bot\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n const shareableId = await api.getOrGenerateShareableId(bot.id, integration.id, alias)\n const sandboxLink = this._getSandboxLink({ shareableId, integration, api, linkTemplateScript })\n const sandboxInstruction = `Send '${shareableId}' to ${sandboxLink}`\n if (integration.enabled) {\n this.logger.log(`${chalk.bold('Sandbox')}: ${sandboxInstruction}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n this.logger.log(`Sandbox: ${sandboxInstruction}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n protected async promptSecrets(\n integrationDef: sdk.IntegrationDefinition,\n argv: YargsConfig<typeof config.schemas.secrets>,\n opts: { formatEnv?: boolean; knownSecrets?: string[] } = {}\n ): Promise<Record<string, string | null>> {\n const formatEnv = opts.formatEnv ?? false\n const knownSecrets = opts.knownSecrets ?? []\n\n const { secrets: secretDefinitions } = integrationDef\n if (!secretDefinitions) {\n return {}\n }\n\n const secretArgv = this._parseArgvSecrets(argv.secrets)\n const invalidSecret = Object.keys(secretArgv).find((s) => !secretDefinitions[s])\n if (invalidSecret) {\n throw new errors.BotpressCLIError(`Secret ${invalidSecret} is not defined in integration definition`)\n }\n\n const values: Record<string, string | null> = {}\n for (const [secretName, { optional }] of Object.entries(secretDefinitions)) {\n const argvSecret = secretArgv[secretName]\n if (argvSecret) {\n this.logger.debug(`Using secret \"${secretName}\" from argv`)\n values[secretName] = argvSecret\n continue\n }\n\n const alreadyKnown = knownSecrets.includes(secretName)\n let mode: string\n if (alreadyKnown) {\n mode = 'already set'\n } else if (optional) {\n mode = 'optional'\n } else {\n mode = 'required'\n }\n\n const prompted = await this.prompt.text(`Enter value for secret \"${secretName}\" (${mode})`)\n if (prompted) {\n values[secretName] = prompted\n continue\n }\n\n if (alreadyKnown) {\n this.logger.log(`Secret \"${secretName}\" is unchanged`)\n } else if (optional) {\n this.logger.warn(`Secret \"${secretName}\" is unassigned`)\n } else {\n throw new errors.BotpressCLIError(`Secret \"${secretName}\" is required`)\n }\n }\n\n for (const secretName of knownSecrets) {\n const isDefined = secretName in secretDefinitions\n if (isDefined) {\n continue\n }\n const prompted = await this.prompt.confirm(`Secret \"${secretName}\" was removed. Do you wish to delete it?`)\n if (prompted) {\n this.logger.log(`Deleting secret \"${secretName}\"`, { prefix: { symbol: '\u00D7', fg: 'red' } })\n values[secretName] = null\n }\n }\n\n if (!formatEnv) {\n return values\n }\n\n const envVariables = _.mapKeys(values, (_v, k) => codegen.secretEnvVariableName(k))\n return envVariables\n }\n\n protected async prepareCreateIntegrationBody(\n integrationDef: sdk.IntegrationDefinition\n ): Promise<apiUtils.CreateIntegrationRequestBody> {\n const partialBody = await apiUtils.prepareCreateIntegrationBody(integrationDef)\n\n let code: string | undefined = undefined\n if (fs.existsSync(this.projectPaths.abs.outFileCJS)) {\n code = await this.readProjectFile(this.projectPaths.abs.outFileCJS)\n }\n\n const icon = await this.readProjectFile(integrationDef.icon, 'base64')\n const readme = await this.readProjectFile(integrationDef.readme, 'base64')\n const extractScript = await this.readProjectFile(integrationDef.identifier?.extractScript)\n const fallbackHandlerScript = await this.readProjectFile(integrationDef.identifier?.fallbackHandlerScript)\n return {\n ...partialBody,\n code,\n icon,\n readme,\n identifier: {\n extractScript,\n fallbackHandlerScript,\n },\n configuration: integrationDef.configuration\n ? {\n schema: await utils.schema.mapZodToJsonSchema(integrationDef.configuration, {\n useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,\n }),\n identifier: {\n required: integrationDef.configuration.identifier?.required,\n linkTemplateScript: await this.readProjectFile(\n integrationDef.configuration.identifier?.linkTemplateScript\n ),\n },\n }\n : undefined,\n configurations: integrationDef.configurations\n ? await utils.records.mapValuesAsync(integrationDef.configurations, async (configuration) => ({\n title: configuration.title,\n description: configuration.description,\n schema: await utils.schema.mapZodToJsonSchema(configuration, {\n useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,\n }),\n identifier: {\n required: configuration.identifier?.required,\n linkTemplateScript: await this.readProjectFile(configuration.identifier?.linkTemplateScript),\n },\n }))\n : undefined,\n }\n }\n\n protected async prepareBotDependencies(\n botDef: sdk.BotDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.UpdateBotRequestBody>> {\n const integrations = await this._fetchDependencies({\n deps: botDef.integrations ?? {},\n fetcher: ({ name, version }) => api.getPublicOrPrivateIntegration({ type: 'name', name, version }),\n cacheKey: ({ name, version }) => `integration:${name}@${version}`,\n })\n\n const plugins = await this._fetchDependencies({\n deps: botDef.plugins ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivatePlugin({ type: 'name', name, version }),\n cacheKey: ({ name, version }) => `plugin:${name}@${version}`,\n })\n\n const pluginsWithBackingIntegrations = await utils.records.mapValuesAsync(plugins, async (plugin) => ({\n ...plugin,\n interfaces: await this._fetchDependencies({\n deps: plugin.interfaces ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivateIntegration({ name, version, type: 'name' }),\n cacheKey: ({ name, version }) => `interface:${name}@${version}`,\n }),\n integrations: await this._fetchDependencies({\n deps: plugin.integrations ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivateIntegration({ name, version, type: 'name' }),\n cacheKey: ({ name, version }) => `integration:${name}@${version}`,\n }),\n }))\n\n return {\n integrations: utils.records.mapValues(\n integrations,\n ({ enabled, configurationType, configuration, disabledChannels, id }) =>\n ({\n enabled,\n configurationType,\n configuration,\n disabledChannels,\n integrationId: id,\n }) satisfies NonNullable<apiUtils.UpdateBotRequestBody['integrations']>[string]\n ),\n plugins: utils.records.mapValues(pluginsWithBackingIntegrations, (plugin) => ({\n ...plugin,\n interfaces: utils.records.mapValues(\n plugin.interfaces ?? {},\n (iface) =>\n ({\n integrationId: iface.id,\n integrationAlias: iface.integrationAlias,\n integrationInterfaceAlias: iface.integrationInterfaceAlias,\n }) satisfies NonNullable<\n NonNullable<NonNullable<apiUtils.UpdateBotRequestBody['plugins']>[string]>['interfaces']\n >[string]\n ),\n integrations: utils.records.mapValues(\n plugin.integrations ?? {},\n (integration) =>\n ({\n integrationId: integration.id,\n integrationAlias: integration.integrationAlias,\n }) satisfies NonNullable<\n NonNullable<NonNullable<apiUtils.UpdateBotRequestBody['plugins']>[string]>['integrations']\n >[string]\n ),\n })),\n }\n }\n\n protected async prepareIntegrationDependencies(\n integrationDef: sdk.IntegrationDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.CreateIntegrationRequestBody>> {\n const interfaces = await this._fetchDependencies({\n deps: integrationDef.interfaces ?? {},\n fetcher: ({ name, version }) => api.getPublicInterface({ type: 'name', name, version }),\n cacheKey: (dep) => `interface:${dep.name}@${dep.version}`,\n })\n return { interfaces }\n }\n\n protected async preparePluginDependencies(\n pluginDef: sdk.PluginDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.CreatePluginRequestBody>> {\n const integrations = await this._fetchDependencies({\n deps: pluginDef.integrations ?? {},\n fetcher: ({ name, version }) => api.getPublicOrPrivateIntegration({ type: 'name', name, version }),\n cacheKey: (dep) => `integration:${dep.name}@${dep.version}`,\n })\n const interfaces = await this._fetchDependencies({\n deps: pluginDef.interfaces ?? {},\n fetcher: ({ name, version }) => api.getPublicInterface({ type: 'name', name, version }),\n cacheKey: (dep) => `interface:${dep.name}@${dep.version}`,\n })\n return {\n dependencies: {\n integrations,\n interfaces,\n },\n }\n }\n\n private _fetchDependencies = async <T extends { id?: string; name: string; version: string }>({\n deps,\n fetcher,\n cacheKey: getCacheKey,\n }: {\n deps: Record<string, T>\n fetcher: (dep: T) => Promise<ResolvedDependency>\n cacheKey: (dep: T) => DependencyCacheKey\n }): Promise<Record<string, T & ResolvedDependency>> => {\n const isRemote = (dep: T): dep is T & ResolvedDependency => dep.id !== undefined\n return utils.records.mapValuesAsync(deps, async (dep): Promise<T & ResolvedDependency> => {\n if (isRemote(dep)) {\n return dep\n }\n\n const cacheKey = getCacheKey(dep)\n const cached = this._dependencyCache.get(cacheKey)\n\n if (cached) {\n return { ...dep, id: cached.id }\n }\n\n const { id } = await fetcher(dep)\n this._dependencyCache.set(cacheKey, { id })\n\n return { ...dep, id }\n })\n }\n\n protected readProjectFile = async (\n filePath: string | undefined,\n encoding: BufferEncoding = 'utf-8'\n ): Promise<string | undefined> => {\n if (!filePath) {\n return undefined\n }\n const absoluteFilePath = utils.path.absoluteFrom(this.projectPaths.abs.workDir, filePath)\n return fs.promises.readFile(absoluteFilePath, encoding).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not read file \"${absoluteFilePath}\"`)\n })\n }\n\n private _parseArgvSecrets(argvSecrets: string[]): Record<string, string> {\n const parsed: Record<string, string> = {}\n for (const secret of argvSecrets) {\n const [key, value] = utils.string.splitOnce(secret, '=')\n if (!value) {\n throw new errors.BotpressCLIError(\n `Secret \"${key}\" is missing a value. Expected format: \"SECRET_NAME=secretValue\"`\n )\n }\n parsed[key!] = value\n }\n\n return parsed\n }\n\n private _notifyUpdateSdk = async (): Promise<void> => {\n try {\n this.logger.debug('Checking if sdk is up to date')\n\n const { workDir } = this.projectPaths.abs\n const readProjectPkgJsonResult = await utils.pkgJson.safeReadPackageJson(workDir)\n if (!readProjectPkgJsonResult.success) {\n this.logger.debug(`Could not read package.json at \"${workDir}\": ${readProjectPkgJsonResult.error.message}`)\n return\n }\n\n if (!readProjectPkgJsonResult.pkgJson) {\n this.logger.debug(`Could not find package.json at \"${workDir}\"`)\n return\n }\n\n const { pkgJson: projectPkgJson } = readProjectPkgJsonResult\n const sdkPackageName = '@botpress/sdk'\n const actualSdkVersion = utils.pkgJson.findDependency(projectPkgJson, sdkPackageName)\n if (!actualSdkVersion) {\n this.logger.debug(`Could not find dependency \"${sdkPackageName}\" in project package.json`)\n return\n }\n\n if (actualSdkVersion.startsWith('workspace:')) {\n return\n }\n\n const actualCleanedSdkVersion = semver.valid(semver.coerce(actualSdkVersion))\n if (!actualCleanedSdkVersion) {\n this.logger.debug(`Invalid sdk version \"${actualSdkVersion}\" in project package.json`)\n return\n }\n\n const cliPkgJson = await this.readCLIPkgJson()\n const expectedSdkVersion = utils.pkgJson.findDependency(cliPkgJson, sdkPackageName)\n if (!expectedSdkVersion) {\n this.logger.debug(`Could not find dependency \"${sdkPackageName}\" in cli package.json`)\n return\n }\n\n const expectedCleanedSdkVersion = semver.valid(semver.coerce(expectedSdkVersion))\n if (!expectedCleanedSdkVersion) {\n this.logger.debug(`Invalid sdk version \"${expectedSdkVersion}\" in cli package.json`)\n return\n }\n\n if (semver.eq(actualCleanedSdkVersion, expectedCleanedSdkVersion)) {\n return\n }\n\n const diff = semver.diff(actualCleanedSdkVersion, expectedCleanedSdkVersion)\n if (!diff) {\n this.logger.debug(`Could not compare versions \"${actualCleanedSdkVersion}\" and \"${expectedCleanedSdkVersion}\"`)\n return\n }\n\n const errorMsg = `Project SDK version is \"${actualCleanedSdkVersion}\", but expected \"${expectedCleanedSdkVersion}\"`\n if (utils.semver.releases.lt(diff, 'minor')) {\n this.logger.debug(`${errorMsg}. This may cause compatibility issues.`)\n return\n }\n\n this.logger.warn(chalk.bold(`${errorMsg}. This will cause compatibility issues.`))\n } catch (thrown) {\n const err = errors.BotpressCLIError.map(thrown)\n this.logger.debug(`Failed to check if sdk is up to date: ${err.message}`)\n }\n }\n protected validateIntegrationRegistration(\n updatedBot: UpdatedBot,\n onFailCallback: (failedIntegrations: UpdatedBot['integrations']) => void\n ) {\n let failedIntegrations: UpdatedBot['integrations'] = {}\n for (const [integrationName, integration] of Object.entries(updatedBot.integrations)) {\n if (integration.status === 'registration_failed') {\n failedIntegrations = { ...failedIntegrations, [integrationName]: integration }\n }\n }\n if (Object.keys(failedIntegrations).length > 0) {\n onFailCallback(failedIntegrations)\n }\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 type { YargsConfig } from '@bpinternal/yargs-extra'\nimport chalk from 'chalk'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport semver from 'semver'\nimport * as apiUtils from '../api'\nimport * as codegen from '../code-generation'\nimport * as config from '../config'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport { validateIntegrationDefinition, validateBotDefinition } from '../sdk'\nimport type { CommandArgv, CommandDefinition } from '../typings'\nimport * as utils from '../utils'\nimport { GlobalCommand } from './global-command'\n\nexport type ProjectCommandDefinition = CommandDefinition<typeof config.schemas.project>\nexport type ProjectCache = {\n botId: string\n devId: string\n tunnelId: string\n secrets: {\n [secretName: string]: string\n }\n}\n\ntype ConfigurableProjectPaths = { workDir: string }\ntype ConstantProjectPaths = typeof consts.fromWorkDir\ntype AllProjectPaths = ConfigurableProjectPaths & ConstantProjectPaths\n\ntype LintIgnoredConfig = { bpLintDisabled?: boolean }\n\nexport type ProjectType = ProjectDefinition['type']\nexport type ProjectDefinition = LintIgnoredConfig &\n (\n | { type: 'integration'; definition: sdk.IntegrationDefinition }\n | { type: 'interface'; definition: sdk.InterfaceDefinition }\n | { type: 'bot'; definition: sdk.BotDefinition }\n | { type: 'plugin'; definition: sdk.PluginDefinition }\n )\n\ntype ProjectDefinitionResolver<T> = () => Promise<LintIgnoredConfig & T>\n\nexport type ProjectDefinitionLazy =\n | {\n projectType: 'integration'\n resolveProjectDefinition: ProjectDefinitionResolver<{\n type: 'integration'\n definition: sdk.IntegrationDefinition\n }>\n }\n | {\n projectType: 'bot'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'bot'; definition: sdk.BotDefinition }>\n }\n | {\n projectType: 'interface'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'interface'; definition: sdk.InterfaceDefinition }>\n }\n | {\n projectType: 'plugin'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'plugin'; definition: sdk.PluginDefinition }>\n }\n\ntype UpdatedBot = client.Bot\n\ntype ClientIntegrationDefinitions = Record<string, client.Integration>\ntype ClientIntegration = client.Bot['integrations'][string]\n\nclass ProjectPaths extends utils.path.PathStore<keyof AllProjectPaths> {\n public constructor(argv: CommandArgv<ProjectCommandDefinition>) {\n const absWorkDir = utils.path.absoluteFrom(utils.path.cwd(), argv.workDir)\n super({\n workDir: absWorkDir,\n ..._.mapValues(consts.fromWorkDir, (p) => utils.path.absoluteFrom(absWorkDir, p)),\n })\n }\n}\n\nexport class ProjectDefinitionContext {\n private _codeCache: Map<string, object> = new Map()\n private _buildContext: utils.esbuild.BuildEntrypointContext = new utils.esbuild.BuildEntrypointContext()\n\n public getOrResolveDefinition<T extends object>(code: string): T {\n const definition = this._codeCache.get(code)\n if (definition) {\n return definition as T\n }\n const result = utils.require.requireJsCode<{ default: object }>(code)\n this._codeCache.set(code, result.default)\n return result.default as T\n }\n\n public rebuildEntrypoint(...args: Parameters<utils.esbuild.BuildEntrypointContext['rebuild']>) {\n return this._buildContext.rebuild(...args)\n }\n}\n\ntype ResolvedDependency = { id: string }\ntype DependencyCacheKey = `${'integration' | 'plugin' | 'interface'}:${string}@${string}`\n\nexport abstract class ProjectCommand<C extends ProjectCommandDefinition> extends GlobalCommand<C> {\n protected projectContext: ProjectDefinitionContext = new ProjectDefinitionContext()\n private _dependencyCache = new Map<DependencyCacheKey, ResolvedDependency>()\n\n public setProjectContext(projectContext: ProjectDefinitionContext) {\n this.projectContext = projectContext\n return this\n }\n\n protected override async bootstrap() {\n await super.bootstrap()\n await this._notifyUpdateSdk()\n }\n\n protected get projectPaths() {\n return new ProjectPaths(this.argv)\n }\n\n protected get projectCache() {\n return new utils.cache.FSKeyValueCache<ProjectCache>(this.projectPaths.abs.projectCacheFile)\n }\n\n private _readProjectType(projectPaths: ProjectPaths): ProjectType {\n const abs = projectPaths.abs\n if (fs.existsSync(abs.integrationDefinition)) {\n return 'integration'\n }\n if (fs.existsSync(abs.interfaceDefinition)) {\n return 'interface'\n }\n if (fs.existsSync(abs.botDefinition)) {\n return 'bot'\n }\n if (fs.existsSync(abs.pluginDefinition)) {\n return 'plugin'\n }\n throw new errors.UnsupportedProjectType()\n }\n\n protected readProjectDefinitionFromFS(): ProjectDefinitionLazy {\n try {\n const type = this._readProjectType(this.projectPaths)\n if (type === 'integration') {\n return {\n projectType: 'integration',\n resolveProjectDefinition: async () => ({\n type: 'integration',\n ...(await this._readIntegrationDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'plugin') {\n return {\n projectType: 'plugin',\n resolveProjectDefinition: async () => ({\n type: 'plugin',\n ...(await this._readPluginDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'interface') {\n return {\n projectType: 'interface',\n resolveProjectDefinition: async () => ({\n type: 'interface',\n ...(await this._readInterfaceDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'bot') {\n return {\n projectType: 'bot',\n resolveProjectDefinition: async () => ({\n type: 'bot',\n ...(await this._readBotDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n } catch (thrown: unknown) {\n throw errors.BotpressCLIError.wrap(thrown, 'Error while reading project definition')\n }\n throw new errors.ProjectDefinitionNotFoundError(this.projectPaths.abs.workDir)\n }\n\n private async _readIntegrationDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'integrationDefinition'>\n ): Promise<{ definition: sdk.IntegrationDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.integrationDefinition)) {\n throw new errors.BotpressCLIError('Could not read integration definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.integrationDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.integrationDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read integration definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.IntegrationDefinition>(artifact.text)\n validateIntegrationDefinition(definition)\n return { definition, bpLintDisabled }\n }\n\n private async _readInterfaceDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'interfaceDefinition'>\n ): Promise<{ definition: sdk.InterfaceDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.interfaceDefinition)) {\n throw new errors.BotpressCLIError('Could not read interface definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.interfaceDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.interfaceDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read interface definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.InterfaceDefinition>(artifact.text)\n\n return { definition, bpLintDisabled }\n }\n\n private async _readBotDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'botDefinition'>\n ): Promise<{ definition: sdk.BotDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.botDefinition)) {\n throw new errors.BotpressCLIError('Could not read bot definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.botDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.botDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read bot definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.BotDefinition>(artifact.text)\n validateBotDefinition(definition)\n return { definition, bpLintDisabled }\n }\n\n private async _readPluginDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'pluginDefinition'>\n ): Promise<{ definition: sdk.PluginDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.pluginDefinition)) {\n throw new errors.BotpressCLIError('Could not read plugin definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.pluginDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.pluginDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read plugin definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.PluginDefinition>(artifact.text)\n // TODO: validate plugin definition\n return { definition, bpLintDisabled }\n }\n\n private async _isBpLintDisabled(definitionPath: string): Promise<boolean> {\n const tsContent = await fs.promises.readFile(definitionPath, 'utf-8')\n const regex = /\\/\\* bplint-disable \\*\\//\n return regex.test(tsContent)\n }\n\n protected async displayIntegrationUrls({ api, bot }: { api: apiUtils.ApiClient; bot: client.Bot }) {\n if (!_.keys(bot.integrations).length) {\n this.logger.debug('No integrations in bot')\n return\n }\n\n const integrationDefinitions = await utils.records.mapValuesAsync(bot.integrations, async (integration) =>\n api.getPublicOrPrivateIntegration({\n type: 'id',\n id: integration.id,\n })\n )\n\n this.logger.log('Integrations:')\n for (const [alias, integration] of Object.entries(bot.integrations)) {\n if (integration.enabled) {\n this.logger.log(`${alias} ${integration.version}:`, { prefix: { symbol: '\u2192', indent: 2 } })\n } else {\n this.logger.log(`${alias} ${integration.version} ${chalk.italic('(disabled)')}:`, {\n prefix: { symbol: '\u2192', indent: 2 },\n })\n }\n\n const integrationDefinition = integrationDefinitions[alias]\n const linkTemplateScript = integrationDefinition\n ? this._getLinkTemplateScript({ integration, integrationDefinition })\n : undefined\n this._displayWebhookUrl({ integration, integrationDefinition, linkTemplateScript })\n if (!integrationDefinition) {\n this.logger.debug(\n `No integration definition for integration ${alias} (${integration.name}, ${integration.id}), skipping OAuth or Sandbox links`\n )\n this.logger.line().commit()\n continue\n }\n const isSandbox =\n integration.configurationType === 'sandbox' && !!integrationDefinition.sandbox?.identifierExtractScript\n const showLink = !!linkTemplateScript && (isSandbox || !!integrationDefinition.identifier?.extractScript)\n if (showLink && isSandbox) {\n await this._displaySandboxLinkAndCode({ integration, alias, bot, api, linkTemplateScript })\n } else if (showLink) {\n this._displayAuthorizationLink({ integration, api, linkTemplateScript })\n }\n this.logger.line().commit()\n }\n }\n\n private _getLinkTemplateScript({\n integration,\n integrationDefinition,\n }: {\n integration: ClientIntegration\n integrationDefinition?: ClientIntegrationDefinitions[string]\n }) {\n const config =\n integration.configurationType === null\n ? integrationDefinition?.configuration\n : integrationDefinition?.configurations[integration.configurationType]\n return config?.identifier?.linkTemplateScript\n }\n\n private _displayWebhookUrl({\n integration,\n integrationDefinition,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n integrationDefinition?: ClientIntegrationDefinitions[string]\n linkTemplateScript?: string\n }) {\n const needsWebhook = !(integrationDefinition?.identifier && linkTemplateScript)\n const logFn = (needsWebhook ? this.logger.log : this.logger.debug).bind(this.logger)\n\n if (integration.enabled) {\n logFn(`${chalk.bold('Webhook')}: ${integration.webhookUrl}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n logFn(`Webhook: ${integration.webhookUrl}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n private _displayAuthorizationLink({\n integration,\n api,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n const authorizationLink = this._getAuthorizationLink({ integration, api, linkTemplateScript })\n const isAuthorized = !!integration.identifier\n const authorizationStatus = integration.identifier ? 'Authorized \u2713' : 'Authorize'\n if (integration.enabled && isAuthorized) {\n this.logger.log(`${chalk.bold(authorizationStatus)} : ${authorizationLink}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n this.logger.log(`${authorizationStatus}: ${authorizationLink}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n private _getLinkTemplateArgs({ integration, api }: { integration: ClientIntegration; api: apiUtils.ApiClient }) {\n // These are the values used by the studio\n let env: 'development' | 'preview' | 'production'\n if (api.url.includes(consts.stagingBotpressDomain)) {\n env = 'preview'\n } else if (api.url.includes(consts.productionBotpressDomain)) {\n env = 'production'\n } else {\n env = 'development'\n }\n return {\n env,\n webhookId: integration.webhookId,\n webhookUrl: api.url.replace('api', 'webhook'),\n }\n }\n\n private _getAuthorizationLink({\n integration,\n api,\n linkTemplateScript,\n }: {\n integration: client.Bot['integrations'][string]\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n return utils.vrl.getStringResult({\n code: linkTemplateScript,\n data: this._getLinkTemplateArgs({ integration, api }),\n })\n }\n\n private _getSandboxLink({\n shareableId,\n integration,\n api,\n linkTemplateScript,\n }: {\n shareableId: string\n integration: ClientIntegration\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n return utils.vrl.getStringResult({\n code: linkTemplateScript,\n data: { shareableId, ...this._getLinkTemplateArgs({ integration, api }) },\n })\n }\n\n private async _displaySandboxLinkAndCode({\n integration,\n alias,\n bot,\n api,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n alias: string\n bot: client.Bot\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n const shareableId = await api.getOrGenerateShareableId(bot.id, integration.id, alias)\n const sandboxLink = this._getSandboxLink({ shareableId, integration, api, linkTemplateScript })\n const sandboxInstruction = `Send '${shareableId}' to ${sandboxLink}`\n if (integration.enabled) {\n this.logger.log(`${chalk.bold('Sandbox')}: ${sandboxInstruction}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n this.logger.log(`Sandbox: ${sandboxInstruction}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n protected async promptSecrets(\n def: { secrets?: Record<string, sdk.SecretDefinition> },\n argv: YargsConfig<typeof config.schemas.secrets>,\n opts: { formatEnv?: boolean; knownSecrets?: string[] } = {}\n ): Promise<Record<string, string | null>> {\n const formatEnv = opts.formatEnv ?? false\n const knownSecrets = opts.knownSecrets ?? []\n\n const { secrets: secretDefinitions } = def\n if (!secretDefinitions) {\n return {}\n }\n\n const secretArgv = this._parseArgvSecrets(argv.secrets)\n const invalidSecret = Object.keys(secretArgv).find((s) => !secretDefinitions[s])\n if (invalidSecret) {\n throw new errors.BotpressCLIError(`Secret ${invalidSecret} is not defined in the definition`)\n }\n\n const values: Record<string, string | null> = {}\n for (const [secretName, { optional }] of Object.entries(secretDefinitions)) {\n const argvSecret = secretArgv[secretName]\n if (argvSecret) {\n this.logger.debug(`Using secret \"${secretName}\" from argv`)\n values[secretName] = argvSecret\n continue\n }\n\n const alreadyKnown = knownSecrets.includes(secretName)\n let mode: string\n if (alreadyKnown) {\n mode = 'already set'\n } else if (optional) {\n mode = 'optional'\n } else {\n mode = 'required'\n }\n\n const prompted = await this.prompt.text(`Enter value for secret \"${secretName}\" (${mode})`)\n if (prompted) {\n values[secretName] = prompted\n continue\n }\n\n if (alreadyKnown) {\n this.logger.log(`Secret \"${secretName}\" is unchanged`)\n } else if (optional) {\n this.logger.warn(`Secret \"${secretName}\" is unassigned`)\n } else {\n throw new errors.BotpressCLIError(`Secret \"${secretName}\" is required`)\n }\n }\n\n for (const secretName of knownSecrets) {\n const isDefined = secretName in secretDefinitions\n if (isDefined) {\n continue\n }\n const prompted = await this.prompt.confirm(`Secret \"${secretName}\" was removed. Do you wish to delete it?`)\n if (prompted) {\n this.logger.log(`Deleting secret \"${secretName}\"`, { prefix: { symbol: '\u00D7', fg: 'red' } })\n values[secretName] = null\n }\n }\n\n if (!formatEnv) {\n return values\n }\n\n const envVariables = _.mapKeys(values, (_v, k) => codegen.secretEnvVariableName(k))\n return envVariables\n }\n\n protected async prepareCreateIntegrationBody(\n integrationDef: sdk.IntegrationDefinition\n ): Promise<apiUtils.CreateIntegrationRequestBody> {\n const partialBody = await apiUtils.prepareCreateIntegrationBody(integrationDef)\n\n let code: string | undefined = undefined\n if (fs.existsSync(this.projectPaths.abs.outFileCJS)) {\n code = await this.readProjectFile(this.projectPaths.abs.outFileCJS)\n }\n\n const icon = await this.readProjectFile(integrationDef.icon, 'base64')\n const readme = await this.readProjectFile(integrationDef.readme, 'base64')\n const extractScript = await this.readProjectFile(integrationDef.identifier?.extractScript)\n const fallbackHandlerScript = await this.readProjectFile(integrationDef.identifier?.fallbackHandlerScript)\n return {\n ...partialBody,\n code,\n icon,\n readme,\n identifier: {\n extractScript,\n fallbackHandlerScript,\n },\n configuration: integrationDef.configuration\n ? {\n schema: await utils.schema.mapZodToJsonSchema(integrationDef.configuration, {\n useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,\n toJSONSchemaOptions: integrationDef.__advanced?.toJSONSchemaOptions,\n }),\n identifier: {\n required: integrationDef.configuration.identifier?.required,\n linkTemplateScript: await this.readProjectFile(\n integrationDef.configuration.identifier?.linkTemplateScript\n ),\n },\n }\n : undefined,\n configurations: integrationDef.configurations\n ? await utils.records.mapValuesAsync(integrationDef.configurations, async (configuration) => ({\n title: configuration.title,\n description: configuration.description,\n schema: await utils.schema.mapZodToJsonSchema(configuration, {\n useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,\n toJSONSchemaOptions: integrationDef.__advanced?.toJSONSchemaOptions,\n }),\n identifier: {\n required: configuration.identifier?.required,\n linkTemplateScript: await this.readProjectFile(configuration.identifier?.linkTemplateScript),\n },\n }))\n : undefined,\n }\n }\n\n protected async prepareBotDependencies(\n botDef: sdk.BotDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.UpdateBotRequestBody>> {\n const integrations = await this._fetchDependencies({\n deps: botDef.integrations ?? {},\n fetcher: ({ name, version }) => api.getPublicOrPrivateIntegration({ type: 'name', name, version }),\n cacheKey: ({ name, version }) => `integration:${name}@${version}`,\n })\n\n const plugins = await this._fetchDependencies({\n deps: botDef.plugins ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivatePlugin({ type: 'name', name, version }),\n cacheKey: ({ name, version }) => `plugin:${name}@${version}`,\n })\n\n const pluginsWithBackingIntegrations = await utils.records.mapValuesAsync(plugins, async (plugin) => ({\n ...plugin,\n interfaces: await this._fetchDependencies({\n deps: plugin.interfaces ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivateIntegration({ name, version, type: 'name' }),\n cacheKey: ({ name, version }) => `interface:${name}@${version}`,\n }),\n integrations: await this._fetchDependencies({\n deps: plugin.integrations ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivateIntegration({ name, version, type: 'name' }),\n cacheKey: ({ name, version }) => `integration:${name}@${version}`,\n }),\n }))\n\n return {\n integrations: utils.records.mapValues(\n integrations,\n ({ enabled, configurationType, configuration, disabledChannels, id }) =>\n ({\n enabled,\n configurationType,\n configuration,\n disabledChannels,\n integrationId: id,\n }) satisfies NonNullable<apiUtils.UpdateBotRequestBody['integrations']>[string]\n ),\n plugins: utils.records.mapValues(pluginsWithBackingIntegrations, (plugin) => ({\n ...plugin,\n interfaces: utils.records.mapValues(\n plugin.interfaces ?? {},\n (iface) =>\n ({\n integrationId: iface.id,\n integrationAlias: iface.integrationAlias,\n integrationInterfaceAlias: iface.integrationInterfaceAlias,\n }) satisfies NonNullable<\n NonNullable<NonNullable<apiUtils.UpdateBotRequestBody['plugins']>[string]>['interfaces']\n >[string]\n ),\n integrations: utils.records.mapValues(\n plugin.integrations ?? {},\n (integration) =>\n ({\n integrationId: integration.id,\n integrationAlias: integration.integrationAlias,\n }) satisfies NonNullable<\n NonNullable<NonNullable<apiUtils.UpdateBotRequestBody['plugins']>[string]>['integrations']\n >[string]\n ),\n })),\n }\n }\n\n protected async prepareIntegrationDependencies(\n integrationDef: sdk.IntegrationDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.CreateIntegrationRequestBody>> {\n const interfaces = await this._fetchDependencies({\n deps: integrationDef.interfaces ?? {},\n fetcher: ({ name, version }) => api.getPublicInterface({ type: 'name', name, version }),\n cacheKey: (dep) => `interface:${dep.name}@${dep.version}`,\n })\n return { interfaces }\n }\n\n protected async preparePluginDependencies(\n pluginDef: sdk.PluginDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.CreatePluginRequestBody>> {\n const integrations = await this._fetchDependencies({\n deps: pluginDef.integrations ?? {},\n fetcher: ({ name, version }) => api.getPublicOrPrivateIntegration({ type: 'name', name, version }),\n cacheKey: (dep) => `integration:${dep.name}@${dep.version}`,\n })\n const interfaces = await this._fetchDependencies({\n deps: pluginDef.interfaces ?? {},\n fetcher: ({ name, version }) => api.getPublicInterface({ type: 'name', name, version }),\n cacheKey: (dep) => `interface:${dep.name}@${dep.version}`,\n })\n return {\n dependencies: {\n integrations,\n interfaces,\n },\n }\n }\n\n private _fetchDependencies = async <T extends { id?: string; name: string; version: string }>({\n deps,\n fetcher,\n cacheKey: getCacheKey,\n }: {\n deps: Record<string, T>\n fetcher: (dep: T) => Promise<ResolvedDependency>\n cacheKey: (dep: T) => DependencyCacheKey\n }): Promise<Record<string, T & ResolvedDependency>> => {\n const isRemote = (dep: T): dep is T & ResolvedDependency => dep.id !== undefined\n return utils.records.mapValuesAsync(deps, async (dep): Promise<T & ResolvedDependency> => {\n if (isRemote(dep)) {\n return dep\n }\n\n const cacheKey = getCacheKey(dep)\n const cached = this._dependencyCache.get(cacheKey)\n\n if (cached) {\n return { ...dep, id: cached.id }\n }\n\n const { id } = await fetcher(dep)\n this._dependencyCache.set(cacheKey, { id })\n\n return { ...dep, id }\n })\n }\n\n protected readProjectFile = async (\n filePath: string | undefined,\n encoding: BufferEncoding = 'utf-8'\n ): Promise<string | undefined> => {\n if (!filePath) {\n return undefined\n }\n const absoluteFilePath = utils.path.absoluteFrom(this.projectPaths.abs.workDir, filePath)\n return fs.promises.readFile(absoluteFilePath, encoding).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not read file \"${absoluteFilePath}\"`)\n })\n }\n\n private _parseArgvSecrets(argvSecrets: string[]): Record<string, string> {\n const parsed: Record<string, string> = {}\n for (const secret of argvSecrets) {\n const [key, value] = utils.string.splitOnce(secret, '=')\n if (!value) {\n throw new errors.BotpressCLIError(\n `Secret \"${key}\" is missing a value. Expected format: \"SECRET_NAME=secretValue\"`\n )\n }\n parsed[key!] = value\n }\n\n return parsed\n }\n\n private _notifyUpdateSdk = async (): Promise<void> => {\n try {\n this.logger.debug('Checking if sdk is up to date')\n\n const { workDir } = this.projectPaths.abs\n const readProjectPkgJsonResult = await utils.pkgJson.safeReadPackageJson(workDir)\n if (!readProjectPkgJsonResult.success) {\n this.logger.debug(`Could not read package.json at \"${workDir}\": ${readProjectPkgJsonResult.error.message}`)\n return\n }\n\n if (!readProjectPkgJsonResult.pkgJson) {\n this.logger.debug(`Could not find package.json at \"${workDir}\"`)\n return\n }\n\n const { pkgJson: projectPkgJson } = readProjectPkgJsonResult\n const sdkPackageName = '@botpress/sdk'\n const actualSdkVersion = utils.pkgJson.findDependency(projectPkgJson, sdkPackageName)\n if (!actualSdkVersion) {\n this.logger.debug(`Could not find dependency \"${sdkPackageName}\" in project package.json`)\n return\n }\n\n if (actualSdkVersion.startsWith('workspace:')) {\n return\n }\n\n const actualCleanedSdkVersion = semver.valid(semver.coerce(actualSdkVersion))\n if (!actualCleanedSdkVersion) {\n this.logger.debug(`Invalid sdk version \"${actualSdkVersion}\" in project package.json`)\n return\n }\n\n const cliPkgJson = await this.readCLIPkgJson()\n const expectedSdkVersion = utils.pkgJson.findDependency(cliPkgJson, sdkPackageName)\n if (!expectedSdkVersion) {\n this.logger.debug(`Could not find dependency \"${sdkPackageName}\" in cli package.json`)\n return\n }\n\n const expectedCleanedSdkVersion = semver.valid(semver.coerce(expectedSdkVersion))\n if (!expectedCleanedSdkVersion) {\n this.logger.debug(`Invalid sdk version \"${expectedSdkVersion}\" in cli package.json`)\n return\n }\n\n if (semver.eq(actualCleanedSdkVersion, expectedCleanedSdkVersion)) {\n return\n }\n\n const diff = semver.diff(actualCleanedSdkVersion, expectedCleanedSdkVersion)\n if (!diff) {\n this.logger.debug(`Could not compare versions \"${actualCleanedSdkVersion}\" and \"${expectedCleanedSdkVersion}\"`)\n return\n }\n\n const errorMsg = `Project SDK version is \"${actualCleanedSdkVersion}\", but expected \"${expectedCleanedSdkVersion}\"`\n if (utils.semver.releases.lt(diff, 'minor')) {\n this.logger.debug(`${errorMsg}. This may cause compatibility issues.`)\n return\n }\n\n this.logger.warn(chalk.bold(`${errorMsg}. This will cause compatibility issues.`))\n } catch (thrown) {\n const err = errors.BotpressCLIError.map(thrown)\n this.logger.debug(`Failed to check if sdk is up to date: ${err.message}`)\n }\n }\n protected validateIntegrationRegistration(\n updatedBot: UpdatedBot,\n onFailCallback: (failedIntegrations: UpdatedBot['integrations']) => void\n ) {\n let failedIntegrations: UpdatedBot['integrations'] = {}\n for (const [integrationName, integration] of Object.entries(updatedBot.integrations)) {\n if (integration.status === 'registration_failed') {\n failedIntegrations = { ...failedIntegrations, [integrationName]: integration }\n }\n }\n if (Object.keys(failedIntegrations).length > 0) {\n onFailCallback(failedIntegrations)\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["_", "fs", "chalk", "config", "semver"]
7
7
  }
@@ -45,7 +45,7 @@ class ServeCommand extends import_project_command.ProjectCommand {
45
45
  if (projectType === "interface") {
46
46
  throw new errors.BotpressCLIError("An interface project has no implementation to serve.");
47
47
  }
48
- if (projectType === "integration") {
48
+ if (projectType === "integration" || projectType === "bot") {
49
49
  const projectDef = await resolveProjectDefinition();
50
50
  const secretEnvVariables = await this.promptSecrets(projectDef.definition, this.argv, { formatEnv: true });
51
51
  const nonNullSecretEnvVariables = utils.records.filterValues(secretEnvVariables, utils.guards.is.notNull);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/serve-command.ts"],
4
- "sourcesContent": ["import type { Bot as BotImpl, Integration as IntegrationImpl } from '@botpress/sdk'\nimport * as fs from 'fs'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\nimport { ProjectCommand } from './project-command'\n\ntype Serveable = BotImpl | IntegrationImpl\n\nexport type ServeCommandDefinition = typeof commandDefinitions.serve\nexport class ServeCommand extends ProjectCommand<ServeCommandDefinition> {\n public async run(): Promise<void> {\n const outfile = this.projectPaths.abs.outFileCJS\n if (!fs.existsSync(outfile)) {\n throw new errors.NoBundleFoundError()\n }\n\n const { projectType, resolveProjectDefinition } = this.readProjectDefinitionFromFS()\n if (projectType === 'interface') {\n throw new errors.BotpressCLIError('An interface project has no implementation to serve.')\n }\n\n if (projectType === 'integration') {\n const projectDef = await resolveProjectDefinition()\n // TODO: store secrets in local cache to avoid prompting every time\n const secretEnvVariables = await this.promptSecrets(projectDef.definition, this.argv, { formatEnv: true })\n const nonNullSecretEnvVariables = utils.records.filterValues(secretEnvVariables, utils.guards.is.notNull)\n for (const [key, value] of Object.entries(nonNullSecretEnvVariables)) {\n process.env[key] = value\n }\n }\n\n this.logger.log(`Serving ${projectType}...`)\n\n const { default: serveable } = utils.require.requireJsFile<{ default: Serveable }>(outfile)\n const server = await serveable.start(this.argv.port)\n\n await new Promise<void>((resolve, reject) => {\n server.on('error', reject)\n server.on('close', resolve)\n })\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,SAAoB;AAEpB,aAAwB;AACxB,YAAuB;AACvB,6BAA+B;AAKxB,MAAM,qBAAqB,sCAAuC;AAAA,EACvE,MAAa,MAAqB;AAChC,UAAM,UAAU,KAAK,aAAa,IAAI;AACtC,QAAI,CAAC,GAAG,WAAW,OAAO,GAAG;AAC3B,YAAM,IAAI,OAAO,mBAAmB;AAAA,IACtC;AAEA,UAAM,EAAE,aAAa,yBAAyB,IAAI,KAAK,4BAA4B;AACnF,QAAI,gBAAgB,aAAa;AAC/B,YAAM,IAAI,OAAO,iBAAiB,sDAAsD;AAAA,IAC1F;AAEA,QAAI,gBAAgB,eAAe;AACjC,YAAM,aAAa,MAAM,yBAAyB;AAElD,YAAM,qBAAqB,MAAM,KAAK,cAAc,WAAW,YAAY,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC;AACzG,YAAM,4BAA4B,MAAM,QAAQ,aAAa,oBAAoB,MAAM,OAAO,GAAG,OAAO;AACxG,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,yBAAyB,GAAG;AACpE,gBAAQ,IAAI,GAAG,IAAI;AAAA,MACrB;AAAA,IACF;AAEA,SAAK,OAAO,IAAI,WAAW,WAAW,KAAK;AAE3C,UAAM,EAAE,SAAS,UAAU,IAAI,MAAM,QAAQ,cAAsC,OAAO;AAC1F,UAAM,SAAS,MAAM,UAAU,MAAM,KAAK,KAAK,IAAI;AAEnD,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,aAAO,GAAG,SAAS,MAAM;AACzB,aAAO,GAAG,SAAS,OAAO;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;",
4
+ "sourcesContent": ["import type { Bot as BotImpl, Integration as IntegrationImpl } from '@botpress/sdk'\nimport * as fs from 'fs'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\nimport { ProjectCommand } from './project-command'\n\ntype Serveable = BotImpl | IntegrationImpl\n\nexport type ServeCommandDefinition = typeof commandDefinitions.serve\nexport class ServeCommand extends ProjectCommand<ServeCommandDefinition> {\n public async run(): Promise<void> {\n const outfile = this.projectPaths.abs.outFileCJS\n if (!fs.existsSync(outfile)) {\n throw new errors.NoBundleFoundError()\n }\n\n const { projectType, resolveProjectDefinition } = this.readProjectDefinitionFromFS()\n if (projectType === 'interface') {\n throw new errors.BotpressCLIError('An interface project has no implementation to serve.')\n }\n\n if (projectType === 'integration' || projectType === 'bot') {\n const projectDef = await resolveProjectDefinition()\n // TODO: store secrets in local cache to avoid prompting every time\n const secretEnvVariables = await this.promptSecrets(projectDef.definition, this.argv, { formatEnv: true })\n const nonNullSecretEnvVariables = utils.records.filterValues(secretEnvVariables, utils.guards.is.notNull)\n for (const [key, value] of Object.entries(nonNullSecretEnvVariables)) {\n process.env[key] = value\n }\n }\n\n this.logger.log(`Serving ${projectType}...`)\n\n const { default: serveable } = utils.require.requireJsFile<{ default: Serveable }>(outfile)\n const server = await serveable.start(this.argv.port)\n\n await new Promise<void>((resolve, reject) => {\n server.on('error', reject)\n server.on('close', resolve)\n })\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,SAAoB;AAEpB,aAAwB;AACxB,YAAuB;AACvB,6BAA+B;AAKxB,MAAM,qBAAqB,sCAAuC;AAAA,EACvE,MAAa,MAAqB;AAChC,UAAM,UAAU,KAAK,aAAa,IAAI;AACtC,QAAI,CAAC,GAAG,WAAW,OAAO,GAAG;AAC3B,YAAM,IAAI,OAAO,mBAAmB;AAAA,IACtC;AAEA,UAAM,EAAE,aAAa,yBAAyB,IAAI,KAAK,4BAA4B;AACnF,QAAI,gBAAgB,aAAa;AAC/B,YAAM,IAAI,OAAO,iBAAiB,sDAAsD;AAAA,IAC1F;AAEA,QAAI,gBAAgB,iBAAiB,gBAAgB,OAAO;AAC1D,YAAM,aAAa,MAAM,yBAAyB;AAElD,YAAM,qBAAqB,MAAM,KAAK,cAAc,WAAW,YAAY,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC;AACzG,YAAM,4BAA4B,MAAM,QAAQ,aAAa,oBAAoB,MAAM,OAAO,GAAG,OAAO;AACxG,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,yBAAyB,GAAG;AACpE,gBAAQ,IAAI,GAAG,IAAI;AAAA,MACrB;AAAA,IACF;AAEA,SAAK,OAAO,IAAI,WAAW,WAAW,KAAK;AAE3C,UAAM,EAAE,SAAS,UAAU,IAAI,MAAM,QAAQ,cAAsC,OAAO;AAC1F,UAAM,SAAS,MAAM,UAAU,MAAM,KAAK,KAAK,IAAI;AAEnD,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,aAAO,GAAG,SAAS,MAAM;AACzB,aAAO,GAAG,SAAS,OAAO;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;",
6
6
  "names": []
7
7
  }
package/dist/config.d.ts CHANGED
@@ -1517,4 +1517,44 @@ export declare const schemas: {
1517
1517
  alias: string;
1518
1518
  };
1519
1519
  };
1520
+ readonly getProfile: {
1521
+ profileToGet: {
1522
+ type: "string";
1523
+ description: string;
1524
+ positional: true;
1525
+ idx: number;
1526
+ };
1527
+ displayToken: {
1528
+ type: "boolean";
1529
+ description: string;
1530
+ default: boolean;
1531
+ };
1532
+ verbose: {
1533
+ type: "boolean";
1534
+ description: string;
1535
+ alias: string;
1536
+ default: boolean;
1537
+ };
1538
+ confirm: {
1539
+ type: "boolean";
1540
+ description: string;
1541
+ alias: string;
1542
+ default: boolean;
1543
+ };
1544
+ json: {
1545
+ type: "boolean";
1546
+ description: string;
1547
+ default: boolean;
1548
+ };
1549
+ botpressHome: {
1550
+ type: "string";
1551
+ description: string;
1552
+ default: string;
1553
+ };
1554
+ profile: {
1555
+ type: "string";
1556
+ description: string;
1557
+ alias: string;
1558
+ };
1559
+ };
1520
1560
  };
package/dist/config.js CHANGED
@@ -372,6 +372,16 @@ const useProfileSchema = {
372
372
  idx: 0
373
373
  }
374
374
  };
375
+ const getProfileSchema = {
376
+ ...globalSchema,
377
+ profileToGet: {
378
+ type: "string",
379
+ description: "The CLI profile defined in the $BP_BOTPRESS_HOME/profiles.json",
380
+ positional: true,
381
+ idx: 0
382
+ },
383
+ displayToken: { type: "boolean", description: "Display the token in the bp profile", default: false }
384
+ };
375
385
  const schemas = {
376
386
  global: globalSchema,
377
387
  project: projectSchema,
@@ -406,7 +416,8 @@ const schemas = {
406
416
  chat: chatSchema,
407
417
  listProfiles: listProfilesSchema,
408
418
  activeProfile: activeProfileSchema,
409
- useProfile: useProfileSchema
419
+ useProfile: useProfileSchema,
420
+ getProfile: getProfileSchema
410
421
  };
411
422
  // Annotate the CommonJS export names for ESM import in node:
412
423
  0 && (module.exports = {