@botpress/cli 6.8.1 → 6.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +11 -11
- package/dist/api/bot-body.js +26 -3
- package/dist/api/bot-body.js.map +2 -2
- package/dist/api/integration-body.js +67 -48
- package/dist/api/integration-body.js.map +2 -2
- package/dist/api/interface-body.js +59 -42
- package/dist/api/interface-body.js.map +2 -2
- package/dist/api/plugin-body.js +64 -50
- package/dist/api/plugin-body.js.map +2 -2
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +2 -2
- package/dist/command-implementations/base-command.js +1 -2
- package/dist/command-implementations/base-command.js.map +2 -2
- package/dist/command-implementations/dev-command.js +10 -3
- package/dist/command-implementations/dev-command.js.map +2 -2
- package/dist/command-implementations/project-command.js +25 -12
- package/dist/command-implementations/project-command.js.map +2 -2
- package/dist/errors.d.ts +9 -1
- package/dist/errors.js +46 -6
- package/dist/errors.js.map +2 -2
- package/dist/errors.test.d.ts +1 -0
- package/dist/errors.test.js +53 -0
- package/dist/errors.test.js.map +7 -0
- package/dist/register-yargs.js +1 -1
- package/dist/register-yargs.js.map +2 -2
- package/dist/utils/tunnel-utils.d.ts +5 -2
- package/dist/utils/tunnel-utils.js +10 -5
- package/dist/utils/tunnel-utils.js.map +2 -2
- package/package.json +1 -1
package/dist/api/plugin-body.js
CHANGED
|
@@ -32,64 +32,78 @@ __export(plugin_body_exports, {
|
|
|
32
32
|
prepareUpdatePluginBody: () => prepareUpdatePluginBody
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(plugin_body_exports);
|
|
35
|
+
var errors = __toESM(require("../errors"));
|
|
35
36
|
var utils = __toESM(require("../utils"));
|
|
36
|
-
const prepareCreatePluginBody = async (plugin) =>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
tags: plugin.message?.tags ?? {}
|
|
49
|
-
},
|
|
50
|
-
configuration: plugin.configuration ? {
|
|
51
|
-
...plugin.configuration,
|
|
52
|
-
schema: await utils.schema.mapZodToJsonSchema(plugin.configuration, {
|
|
53
|
-
useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,
|
|
54
|
-
toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions
|
|
55
|
-
})
|
|
56
|
-
} : void 0,
|
|
57
|
-
events: plugin.events ? await utils.records.mapValuesAsync(plugin.events, async (event) => ({
|
|
58
|
-
...event,
|
|
59
|
-
schema: await utils.schema.mapZodToJsonSchema(event, {
|
|
60
|
-
useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,
|
|
61
|
-
toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions
|
|
62
|
-
})
|
|
63
|
-
})) : void 0,
|
|
64
|
-
actions: plugin.actions ? await utils.records.mapValuesAsync(plugin.actions, async (action) => ({
|
|
65
|
-
...action,
|
|
66
|
-
input: {
|
|
67
|
-
...action.input,
|
|
68
|
-
schema: await utils.schema.mapZodToJsonSchema(action.input, {
|
|
69
|
-
useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,
|
|
70
|
-
toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions
|
|
71
|
-
})
|
|
37
|
+
const prepareCreatePluginBody = async (plugin) => {
|
|
38
|
+
const base = `Failed to convert ZUI to JSON schema for plugin ${plugin.name}`;
|
|
39
|
+
return {
|
|
40
|
+
name: plugin.name,
|
|
41
|
+
version: plugin.version,
|
|
42
|
+
title: "title" in plugin ? plugin.title : void 0,
|
|
43
|
+
description: "description" in plugin ? plugin.description : void 0,
|
|
44
|
+
user: {
|
|
45
|
+
tags: plugin.user?.tags ?? {}
|
|
46
|
+
},
|
|
47
|
+
conversation: {
|
|
48
|
+
tags: plugin.conversation?.tags ?? {}
|
|
72
49
|
},
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
50
|
+
message: {
|
|
51
|
+
tags: plugin.message?.tags ?? {}
|
|
52
|
+
},
|
|
53
|
+
configuration: plugin.configuration ? {
|
|
54
|
+
...plugin.configuration,
|
|
55
|
+
schema: await utils.schema.mapZodToJsonSchema(plugin.configuration, {
|
|
76
56
|
useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,
|
|
77
57
|
toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions
|
|
58
|
+
}).catch((thrown) => {
|
|
59
|
+
throw errors.BotpressCLIError.wrap(thrown, `${base} for configuration`);
|
|
78
60
|
})
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
...state,
|
|
84
|
-
schema: await utils.schema.mapZodToJsonSchema(state, {
|
|
61
|
+
} : void 0,
|
|
62
|
+
events: plugin.events ? await utils.records.mapValuesAsync(plugin.events, async (event, eventName) => ({
|
|
63
|
+
...event,
|
|
64
|
+
schema: await utils.schema.mapZodToJsonSchema(event, {
|
|
85
65
|
useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,
|
|
86
66
|
toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions
|
|
67
|
+
}).catch((thrown) => {
|
|
68
|
+
throw errors.BotpressCLIError.wrap(thrown, `${base} for event ${eventName}`);
|
|
87
69
|
})
|
|
88
|
-
})),
|
|
89
|
-
(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
70
|
+
})) : void 0,
|
|
71
|
+
actions: plugin.actions ? await utils.records.mapValuesAsync(plugin.actions, async (action, actionName) => ({
|
|
72
|
+
...action,
|
|
73
|
+
input: {
|
|
74
|
+
...action.input,
|
|
75
|
+
schema: await utils.schema.mapZodToJsonSchema(action.input, {
|
|
76
|
+
useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,
|
|
77
|
+
toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions
|
|
78
|
+
}).catch((thrown) => {
|
|
79
|
+
throw errors.BotpressCLIError.wrap(thrown, `${base} for action ${actionName} input`);
|
|
80
|
+
})
|
|
81
|
+
},
|
|
82
|
+
output: {
|
|
83
|
+
...action.output,
|
|
84
|
+
schema: await utils.schema.mapZodToJsonSchema(action.output, {
|
|
85
|
+
useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,
|
|
86
|
+
toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions
|
|
87
|
+
}).catch((thrown) => {
|
|
88
|
+
throw errors.BotpressCLIError.wrap(thrown, `${base} for action ${actionName} output`);
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
})) : void 0,
|
|
92
|
+
states: plugin.states ? utils.records.filterValues(
|
|
93
|
+
await utils.records.mapValuesAsync(plugin.states, async (state, stateName) => ({
|
|
94
|
+
...state,
|
|
95
|
+
schema: await utils.schema.mapZodToJsonSchema(state, {
|
|
96
|
+
useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,
|
|
97
|
+
toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions
|
|
98
|
+
}).catch((thrown) => {
|
|
99
|
+
throw errors.BotpressCLIError.wrap(thrown, `${base} for state ${stateName}`);
|
|
100
|
+
})
|
|
101
|
+
})),
|
|
102
|
+
({ type }) => type !== "workflow"
|
|
103
|
+
) : void 0,
|
|
104
|
+
attributes: plugin.attributes
|
|
105
|
+
};
|
|
106
|
+
};
|
|
93
107
|
const prepareUpdatePluginBody = (localPlugin, remotePlugin) => {
|
|
94
108
|
const actions = utils.attributes.prepareAttributeUpdateBody({
|
|
95
109
|
localItems: utils.records.setNullOnMissingValues(localPlugin.actions, remotePlugin.actions),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/api/plugin-body.ts"],
|
|
4
|
-
"sourcesContent": ["import * as client from '@botpress/client'\nimport * as sdk from '@botpress/sdk'\nimport * as utils from '../utils'\nimport * as types from './types'\n\nexport const prepareCreatePluginBody = async (
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,YAAuB;AAGhB,MAAM,0BAA0B,
|
|
4
|
+
"sourcesContent": ["import * as client from '@botpress/client'\nimport * as sdk from '@botpress/sdk'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\nimport * as types from './types'\n\nexport const prepareCreatePluginBody = async (plugin: sdk.PluginDefinition): Promise<types.CreatePluginRequestBody> => {\n const base = `Failed to convert ZUI to JSON schema for plugin ${plugin.name}`\n return {\n name: plugin.name,\n version: plugin.version,\n title: 'title' in plugin ? plugin.title : undefined,\n description: 'description' in plugin ? plugin.description : undefined,\n user: {\n tags: plugin.user?.tags ?? {},\n },\n conversation: {\n tags: plugin.conversation?.tags ?? {},\n },\n message: {\n tags: plugin.message?.tags ?? {},\n },\n configuration: plugin.configuration\n ? {\n ...plugin.configuration,\n schema: await utils.schema\n .mapZodToJsonSchema(plugin.configuration, {\n useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,\n toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions,\n })\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `${base} for configuration`)\n }),\n }\n : undefined,\n events: plugin.events\n ? await utils.records.mapValuesAsync(plugin.events, async (event, eventName) => ({\n ...event,\n schema: await utils.schema\n .mapZodToJsonSchema(event, {\n useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,\n toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions,\n })\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `${base} for event ${eventName}`)\n }),\n }))\n : undefined,\n actions: plugin.actions\n ? await utils.records.mapValuesAsync(plugin.actions, async (action, actionName) => ({\n ...action,\n input: {\n ...action.input,\n schema: await utils.schema\n .mapZodToJsonSchema(action.input, {\n useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,\n toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions,\n })\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `${base} for action ${actionName} input`)\n }),\n },\n output: {\n ...action.output,\n schema: await utils.schema\n .mapZodToJsonSchema(action.output, {\n useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,\n toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions,\n })\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `${base} for action ${actionName} output`)\n }),\n },\n }))\n : undefined,\n states: plugin.states\n ? (utils.records.filterValues(\n await utils.records.mapValuesAsync(plugin.states, async (state, stateName) => ({\n ...state,\n schema: await utils.schema\n .mapZodToJsonSchema(state, {\n useLegacyZuiTransformer: plugin.__advanced?.useLegacyZuiTransformer,\n toJSONSchemaOptions: plugin.__advanced?.toJSONSchemaOptions,\n })\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `${base} for state ${stateName}`)\n }),\n })),\n ({ type }) => type !== 'workflow'\n ) as types.CreatePluginRequestBody['states'])\n : undefined,\n attributes: plugin.attributes,\n }\n}\n\nexport const prepareUpdatePluginBody = (\n localPlugin: types.UpdatePluginRequestBody,\n remotePlugin: client.Plugin\n): types.UpdatePluginRequestBody => {\n const actions = utils.attributes.prepareAttributeUpdateBody({\n localItems: utils.records.setNullOnMissingValues(localPlugin.actions, remotePlugin.actions),\n remoteItems: remotePlugin.actions,\n })\n const events = utils.attributes.prepareAttributeUpdateBody({\n localItems: utils.records.setNullOnMissingValues(localPlugin.events, remotePlugin.events),\n remoteItems: remotePlugin.events,\n })\n const states = utils.records.setNullOnMissingValues(localPlugin.states, remotePlugin.states)\n\n const attributes = utils.records.setNullOnMissingValues(localPlugin.attributes, remotePlugin.attributes)\n\n const dependencies: types.UpdatePluginRequestBody['dependencies'] = {\n integrations: utils.records.setNullOnMissingValues(\n localPlugin.dependencies?.integrations,\n remotePlugin.dependencies?.integrations\n ),\n interfaces: utils.records.setNullOnMissingValues(\n localPlugin.dependencies?.interfaces,\n remotePlugin.dependencies?.interfaces\n ),\n }\n\n // TODO: set null to conversation, user and message tags that are removed\n\n return {\n ...localPlugin,\n actions,\n events,\n states,\n attributes,\n dependencies,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cli.js
CHANGED
|
@@ -31,15 +31,17 @@ var import_logger = require("./logger");
|
|
|
31
31
|
var import_register_yargs = require("./register-yargs");
|
|
32
32
|
const logError = (thrown) => {
|
|
33
33
|
const error = errors.BotpressCLIError.map(thrown);
|
|
34
|
-
new import_logger.Logger().error(error
|
|
34
|
+
new import_logger.Logger().error(errors.BotpressCLIError.fullStack(error));
|
|
35
35
|
};
|
|
36
36
|
const onError = (thrown) => {
|
|
37
37
|
logError(thrown);
|
|
38
38
|
process.exit(1);
|
|
39
39
|
};
|
|
40
40
|
const yargsFail = (msg) => {
|
|
41
|
-
|
|
41
|
+
if (msg !== void 0) {
|
|
42
|
+
new import_logger.Logger().error(`${msg}
|
|
42
43
|
`);
|
|
44
|
+
}
|
|
43
45
|
import_yargs_extra.default.showHelp();
|
|
44
46
|
process.exit(1);
|
|
45
47
|
};
|
package/dist/cli.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cli.ts"],
|
|
4
|
-
"sourcesContent": ["import 'dotenv/config'\nimport yargs from '@bpinternal/yargs-extra'\nimport commandDefinitions from './command-definitions'\nimport commandImplementations from './command-implementations'\nimport * as tree from './command-tree'\nimport * as errors from './errors'\nimport { Logger } from './logger'\nimport { registerYargs } from './register-yargs'\n\nconst logError = (thrown: unknown) => {\n const error = errors.BotpressCLIError.map(thrown)\n new Logger().error(error
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA,oBAAO;AACP,yBAAkB;AAClB,iCAA+B;AAC/B,qCAAmC;AACnC,WAAsB;AACtB,aAAwB;AACxB,oBAAuB;AACvB,4BAA8B;AAE9B,MAAM,WAAW,CAAC,WAAoB;AACpC,QAAM,QAAQ,OAAO,iBAAiB,IAAI,MAAM;
|
|
4
|
+
"sourcesContent": ["import 'dotenv/config'\nimport yargs from '@bpinternal/yargs-extra'\nimport commandDefinitions from './command-definitions'\nimport commandImplementations from './command-implementations'\nimport * as tree from './command-tree'\nimport * as errors from './errors'\nimport { Logger } from './logger'\nimport { registerYargs } from './register-yargs'\n\nconst logError = (thrown: unknown) => {\n const error = errors.BotpressCLIError.map(thrown)\n // genuine crashes only: print the full chain so headless callers (no -v) still get the reason.\n new Logger().error(errors.BotpressCLIError.fullStack(error))\n}\n\nconst onError = (thrown: unknown) => {\n logError(thrown)\n process.exit(1)\n}\n\nconst yargsFail = (msg?: string) => {\n // usage errors are bad input, not crashes; show the clean message and help, never a stack.\n if (msg !== undefined) {\n new Logger().error(`${msg}\\n`)\n }\n yargs.showHelp()\n process.exit(1)\n}\n\nprocess.on('uncaughtException', (thrown: unknown) => onError(thrown))\nprocess.on('unhandledRejection', (thrown: unknown) => onError(thrown))\n\nconst commands = tree.zipTree(commandDefinitions, commandImplementations)\n\nregisterYargs(yargs, commands)\n\nvoid yargs\n .version()\n .scriptName('bp')\n .demandCommand(1, \"You didn't provide any command. Use the --help flag to see the list of available commands.\")\n .recommendCommands()\n .strict()\n .help()\n .fail(yargsFail)\n .parse()\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA,oBAAO;AACP,yBAAkB;AAClB,iCAA+B;AAC/B,qCAAmC;AACnC,WAAsB;AACtB,aAAwB;AACxB,oBAAuB;AACvB,4BAA8B;AAE9B,MAAM,WAAW,CAAC,WAAoB;AACpC,QAAM,QAAQ,OAAO,iBAAiB,IAAI,MAAM;AAEhD,MAAI,qBAAO,EAAE,MAAM,OAAO,iBAAiB,UAAU,KAAK,CAAC;AAC7D;AAEA,MAAM,UAAU,CAAC,WAAoB;AACnC,WAAS,MAAM;AACf,UAAQ,KAAK,CAAC;AAChB;AAEA,MAAM,YAAY,CAAC,QAAiB;AAElC,MAAI,QAAQ,QAAW;AACrB,QAAI,qBAAO,EAAE,MAAM,GAAG,GAAG;AAAA,CAAI;AAAA,EAC/B;AACA,qBAAAA,QAAM,SAAS;AACf,UAAQ,KAAK,CAAC;AAChB;AAEA,QAAQ,GAAG,qBAAqB,CAAC,WAAoB,QAAQ,MAAM,CAAC;AACpE,QAAQ,GAAG,sBAAsB,CAAC,WAAoB,QAAQ,MAAM,CAAC;AAErE,MAAM,WAAW,KAAK,QAAQ,2BAAAC,SAAoB,+BAAAC,OAAsB;AAAA,IAExE,qCAAc,mBAAAF,SAAO,QAAQ;AAE7B,KAAK,mBAAAA,QACF,QAAQ,EACR,WAAW,IAAI,EACf,cAAc,GAAG,4FAA4F,EAC7G,kBAAkB,EAClB,OAAO,EACP,KAAK,EACL,KAAK,SAAS,EACd,MAAM;",
|
|
6
6
|
"names": ["yargs", "commandDefinitions", "commandImplementations"]
|
|
7
7
|
}
|
|
@@ -50,8 +50,7 @@ class BaseCommand {
|
|
|
50
50
|
} catch (thrown) {
|
|
51
51
|
const error = errors.BotpressCLIError.map(thrown);
|
|
52
52
|
this.logger.error(error.message);
|
|
53
|
-
|
|
54
|
-
this.logger.debug(`[${this._cmdName}] ${stack}`);
|
|
53
|
+
this.logger.debug(`[${this._cmdName}] ${errors.BotpressCLIError.fullStack(error)}`);
|
|
55
54
|
exitCode = 1;
|
|
56
55
|
} finally {
|
|
57
56
|
if (this.teardown) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/command-implementations/base-command.ts"],
|
|
4
|
-
"sourcesContent": ["import * as errors from '../errors'\nimport type { Logger } from '../logger'\nimport type { CommandArgv, CommandDefinition } from '../typings'\n\nexport abstract class BaseCommand<C extends CommandDefinition> {\n public constructor(\n protected readonly logger: Logger,\n protected readonly argv: CommandArgv<C>\n ) {}\n\n protected abstract run(): Promise<void>\n protected bootstrap?(): Promise<void>\n protected teardown?(): Promise<void>\n\n private get _cmdName(): string {\n return this.constructor.name\n }\n\n public async handler(): Promise<{ exitCode: number }> {\n let exitCode = 0\n try {\n if (this.bootstrap) {\n await this.bootstrap()\n }\n await this.run()\n } catch (thrown) {\n const error = errors.BotpressCLIError.map(thrown)\n\n this.logger.error(error.message)\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAwB;AAIjB,MAAe,YAAyC;AAAA,EACtD,YACc,QACA,MACnB;AAFmB;AACA;AAAA,EAClB;AAAA,EAMH,IAAY,WAAmB;AAC7B,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,MAAa,UAAyC;AACpD,QAAI,WAAW;AACf,QAAI;AACF,UAAI,KAAK,WAAW;AAClB,cAAM,KAAK,UAAU;AAAA,MACvB;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,SAAS,QAAQ;AACf,YAAM,QAAQ,OAAO,iBAAiB,IAAI,MAAM;AAEhD,WAAK,OAAO,MAAM,MAAM,OAAO;
|
|
4
|
+
"sourcesContent": ["import * as errors from '../errors'\nimport type { Logger } from '../logger'\nimport type { CommandArgv, CommandDefinition } from '../typings'\n\nexport abstract class BaseCommand<C extends CommandDefinition> {\n public constructor(\n protected readonly logger: Logger,\n protected readonly argv: CommandArgv<C>\n ) {}\n\n protected abstract run(): Promise<void>\n protected bootstrap?(): Promise<void>\n protected teardown?(): Promise<void>\n\n private get _cmdName(): string {\n return this.constructor.name\n }\n\n public async handler(): Promise<{ exitCode: number }> {\n let exitCode = 0\n try {\n if (this.bootstrap) {\n await this.bootstrap()\n }\n await this.run()\n } catch (thrown) {\n const error = errors.BotpressCLIError.map(thrown)\n\n this.logger.error(error.message)\n this.logger.debug(`[${this._cmdName}] ${errors.BotpressCLIError.fullStack(error)}`)\n\n exitCode = 1\n } finally {\n if (this.teardown) {\n await this.teardown()\n }\n }\n\n return { exitCode }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAwB;AAIjB,MAAe,YAAyC;AAAA,EACtD,YACc,QACA,MACnB;AAFmB;AACA;AAAA,EAClB;AAAA,EAMH,IAAY,WAAmB;AAC7B,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,MAAa,UAAyC;AACpD,QAAI,WAAW;AACf,QAAI;AACF,UAAI,KAAK,WAAW;AAClB,cAAM,KAAK,UAAU;AAAA,MACvB;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,SAAS,QAAQ;AACf,YAAM,QAAQ,OAAO,iBAAiB,IAAI,MAAM;AAEhD,WAAK,OAAO,MAAM,MAAM,OAAO;AAC/B,WAAK,OAAO,MAAM,IAAI,KAAK,QAAQ,KAAK,OAAO,iBAAiB,UAAU,KAAK,CAAC,EAAE;AAElF,iBAAW;AAAA,IACb,UAAE;AACA,UAAI,KAAK,UAAU;AACjB,cAAM,KAAK,SAAS;AAAA,MACtB;AAAA,IACF;AAEA,WAAO,EAAE,SAAS;AAAA,EACpB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -139,12 +139,16 @@ class DevCommand extends import_project_command.ProjectCommand {
|
|
|
139
139
|
void this._forwardTunnelRequest(`http://localhost:${port}`, req).then((res) => {
|
|
140
140
|
tunnel.send(res);
|
|
141
141
|
}).catch((thrown) => {
|
|
142
|
-
const err = errors.BotpressCLIError.wrap(
|
|
142
|
+
const err = errors.BotpressCLIError.wrap(
|
|
143
|
+
thrown,
|
|
144
|
+
`An error occurred while handling request ${req.method} ${req.path}`
|
|
145
|
+
);
|
|
143
146
|
this.logger.error(err.message);
|
|
147
|
+
this.logger.debug(errors.BotpressCLIError.fullStack(err));
|
|
144
148
|
tunnel.send({
|
|
145
149
|
requestId: req.id,
|
|
146
150
|
status: 500,
|
|
147
|
-
body:
|
|
151
|
+
body: "Internal error while handling request"
|
|
148
152
|
});
|
|
149
153
|
});
|
|
150
154
|
});
|
|
@@ -199,6 +203,7 @@ class DevCommand extends import_project_command.ProjectCommand {
|
|
|
199
203
|
} catch (thrown) {
|
|
200
204
|
const error = errors.BotpressCLIError.wrap(thrown, "Build failed");
|
|
201
205
|
this.logger.error(error.message);
|
|
206
|
+
this.logger.debug(errors.BotpressCLIError.fullStack(error));
|
|
202
207
|
return;
|
|
203
208
|
}
|
|
204
209
|
await worker.reload();
|
|
@@ -276,7 +281,7 @@ class DevCommand extends import_project_command.ProjectCommand {
|
|
|
276
281
|
},
|
|
277
282
|
this.logger
|
|
278
283
|
).catch((thrown) => {
|
|
279
|
-
throw errors.BotpressCLIError.wrap(thrown,
|
|
284
|
+
throw errors.BotpressCLIError.wrap(thrown, `Could not start dev worker on port ${port}`);
|
|
280
285
|
});
|
|
281
286
|
return worker;
|
|
282
287
|
};
|
|
@@ -290,6 +295,7 @@ class DevCommand extends import_project_command.ProjectCommand {
|
|
|
290
295
|
const resp = await api.client.getIntegration({ id: devId }).catch(async (thrown) => {
|
|
291
296
|
const err = errors.BotpressCLIError.wrap(thrown, `Could not find existing dev integration with id "${devId}"`);
|
|
292
297
|
this.logger.warn(err.message);
|
|
298
|
+
this.logger.debug(errors.BotpressCLIError.fullStack(err));
|
|
293
299
|
return { integration: void 0 };
|
|
294
300
|
});
|
|
295
301
|
if (resp.integration?.dev) {
|
|
@@ -331,6 +337,7 @@ class DevCommand extends import_project_command.ProjectCommand {
|
|
|
331
337
|
const resp = await api.client.getBot({ id: devId }).catch(async (thrown) => {
|
|
332
338
|
const err = errors.BotpressCLIError.wrap(thrown, `Could not find existing dev bot with id "${devId}"`);
|
|
333
339
|
this.logger.warn(err.message);
|
|
340
|
+
this.logger.debug(errors.BotpressCLIError.fullStack(err));
|
|
334
341
|
return { bot: void 0 };
|
|
335
342
|
});
|
|
336
343
|
if (resp.bot?.dev) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/command-implementations/dev-command.ts"],
|
|
4
|
-
"sourcesContent": ["import type * as client from '@botpress/client'\nimport * as sdk from '@botpress/sdk'\nimport { TunnelRequest, TunnelResponse } from '@bpinternal/tunnel'\nimport axios, { AxiosRequestConfig, AxiosResponse } from 'axios'\nimport chalk from 'chalk'\nimport { isEqual } from 'lodash'\nimport * as pathlib from 'path'\nimport * as uuid from 'uuid'\nimport * as apiUtils from '../api'\nimport { secretEnvVariableName, stripSecretEnvVariablePrefix } from '../code-generation/secret-module'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport * as tables from '../tables'\nimport * as utils from '../utils'\nimport { Worker } from '../worker'\nimport { BuildCommand } from './build-command'\nimport { ProjectCommand, ProjectDefinition } from './project-command'\n\nconst DEFAULT_BOT_PORT = 8075\nconst DEFAULT_INTEGRATION_PORT = 8076\nconst TUNNEL_HELLO_INTERVAL = 5000\nconst FILEWATCHER_DEBOUNCE_MS = 500\n\nexport type DevCommandDefinition = typeof commandDefinitions.dev\nexport class DevCommand extends ProjectCommand<DevCommandDefinition> {\n private _initialDef: ProjectDefinition | undefined = undefined\n private _deployedIntegrationName: string | undefined = undefined\n private _cacheDevRequestBody: apiUtils.UpdateBotRequestBody | apiUtils.UpdateIntegrationRequestBody | undefined\n private _buildContext: utils.esbuild.BuildCodeContext\n\n public constructor(...args: ConstructorParameters<typeof ProjectCommand<DevCommandDefinition>>) {\n super(...args)\n this._buildContext = new utils.esbuild.BuildCodeContext()\n }\n\n public async run(): Promise<void> {\n this.logger.warn('This command is experimental and subject to breaking changes without notice.')\n\n let api = await this.ensureLoginAndCreateClient(this.argv)\n\n const { projectType, resolveProjectDefinition } = this.readProjectDefinitionFromFS()\n if (projectType === 'interface') {\n throw new errors.BotpressCLIError('This feature is not available for interfaces.')\n }\n const projectDef = await resolveProjectDefinition()\n this._initialDef = projectDef\n\n if (projectDef.type === 'integration') {\n const handleResult = await this.manageWorkspaceHandle(api, projectDef.definition)\n if (!handleResult) return\n if (handleResult.workspaceId) {\n api = api.switchWorkspace(handleResult.workspaceId)\n }\n this._deployedIntegrationName = handleResult.integration.name\n }\n\n let env: Record<string, string> = {\n ...process.env,\n BP_API_URL: api.url,\n BP_TOKEN: api.token,\n }\n\n const defaultPort = this._initialDef.type === 'integration' ? DEFAULT_INTEGRATION_PORT : DEFAULT_BOT_PORT\n if (this._initialDef.type === 'integration' || this._initialDef.type === 'bot') {\n const knownSecrets = await this._readKnownSecretsFromCache()\n let secretEnvVariables = await this.promptSecrets(this._initialDef.definition, this.argv, {\n knownSecrets: Object.keys(knownSecrets),\n formatEnv: true,\n })\n secretEnvVariables = { ...this._applyPrefixToSecrets(knownSecrets), ...secretEnvVariables }\n const nonNullSecretEnvVariables = utils.records.filterValues(secretEnvVariables, utils.guards.is.notNull)\n\n if (!this.argv.noSecretCaching) {\n await this._writeKnownSecretsToCache(secretEnvVariables)\n }\n\n env = { ...env, ...nonNullSecretEnvVariables }\n }\n\n const port = this.argv.port ?? defaultPort\n\n const urlParseResult = utils.url.parse(this.argv.tunnelUrl)\n if (urlParseResult.status === 'error') {\n throw new errors.BotpressCLIError(`Invalid tunnel URL: ${urlParseResult.error}`)\n }\n\n const cachedTunnelId = await this.projectCache.get('tunnelId')\n\n let tunnelId: string\n if (this.argv.tunnelId) {\n tunnelId = this.argv.tunnelId\n } else if (cachedTunnelId) {\n tunnelId = cachedTunnelId\n } else {\n tunnelId = uuid.v4()\n }\n\n if (cachedTunnelId !== tunnelId) {\n await this.projectCache.set('tunnelId', tunnelId)\n }\n\n const { url: parsedTunnelUrl } = urlParseResult\n const isSecured = parsedTunnelUrl.protocol === 'https' || parsedTunnelUrl.protocol === 'wss'\n\n const wsTunnelUrl: string = utils.url.format({ ...parsedTunnelUrl, protocol: isSecured ? 'wss' : 'ws' })\n const httpTunnelUrl: string = utils.url.format({\n ...parsedTunnelUrl,\n protocol: isSecured ? 'https' : 'http',\n path: `/${tunnelId}`,\n })\n\n let worker: Worker | undefined = undefined\n\n const supervisor = new utils.tunnel.TunnelSupervisor(wsTunnelUrl, tunnelId, this.logger)\n supervisor.events.on('connected', ({ tunnel }) => {\n // prevents the tunnel from closing due to inactivity\n const timer = setInterval(() => {\n if (tunnel.closed) {\n return handleClose()\n }\n tunnel.hello()\n }, TUNNEL_HELLO_INTERVAL)\n const handleClose = (): void => clearInterval(timer)\n tunnel.events.on('close', handleClose)\n\n tunnel.events.on('request', (req) => {\n if (!worker) {\n this.logger.debug('Worker not ready yet, ignoring request')\n tunnel.send({ requestId: req.id, status: 503, body: 'Worker not ready yet' })\n return\n }\n\n void this._forwardTunnelRequest(`http://localhost:${port}`, req)\n .then((res) => {\n tunnel.send(res)\n })\n .catch((thrown) => {\n const err = errors.BotpressCLIError.wrap(thrown, 'An error occurred while handling request')\n this.logger.error(err.message)\n tunnel.send({\n requestId: req.id,\n status: 500,\n body: err.message,\n })\n })\n })\n })\n\n supervisor.events.on('manuallyClosed', () => {\n this.logger.debug('Tunnel manually closed')\n })\n\n await supervisor.start()\n\n await this._runBuild()\n worker = await this._spawnWorker(env, port)\n await this._deploy(api, httpTunnelUrl)\n\n try {\n const watcher = await utils.filewatcher.FileWatcher.watch(\n this.argv.workDir,\n async (events) => {\n if (!worker) {\n this.logger.debug('Worker not ready yet, ignoring file change event')\n return\n }\n\n const typescriptEvents = events\n .filter((e) => !e.path.startsWith(this.projectPaths.abs.outDir))\n .filter((e) => pathlib.extname(e.path) === '.ts')\n\n const packageJsonEvents = events\n .filter((e) => !e.path.startsWith(this.projectPaths.abs.outDir))\n .filter((e) => pathlib.basename(e.path) === 'package.json')\n\n const distEvents = events.filter((e) => e.path.startsWith(this.projectPaths.abs.distDir))\n\n if (typescriptEvents.length > 0 || packageJsonEvents.length > 0) {\n this.logger.log('Changes detected, rebuilding')\n await this._restart(api, worker, httpTunnelUrl)\n } else if (distEvents.length > 0) {\n this.logger.log('Changes detected in output directory, reloading worker')\n await worker.reload()\n }\n },\n {\n debounceMs: FILEWATCHER_DEBOUNCE_MS,\n }\n )\n\n await Promise.race([worker.wait(), watcher.wait(), supervisor.wait()])\n\n if (worker.running) {\n await worker.kill()\n }\n await watcher.close()\n supervisor.close()\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, 'An error occurred while running the dev server')\n } finally {\n if (worker.running) {\n await worker.kill()\n }\n }\n }\n\n private _restart = async (api: apiUtils.ApiClient, worker: Worker, tunnelUrl: string) => {\n try {\n await this._runBuild()\n } catch (thrown) {\n const error = errors.BotpressCLIError.wrap(thrown, 'Build failed')\n this.logger.error(error.message)\n return\n }\n\n await worker.reload()\n await this._deploy(api, tunnelUrl)\n }\n\n private _deploy = async (api: apiUtils.ApiClient, tunnelUrl: string) => {\n const { projectType, resolveProjectDefinition } = this.readProjectDefinitionFromFS()\n\n if (projectType === 'interface') {\n throw new errors.BotpressCLIError('This feature is not available for interfaces.')\n }\n if (projectType === 'integration' && this._initialDef?.type === 'integration') {\n const projectDef = await resolveProjectDefinition()\n this._checkSecrets(projectDef.definition)\n if (projectDef.definition.name !== this._initialDef.definition.name) {\n throw new errors.BotpressCLIError(\n `Integration name changed from \"${this._initialDef.definition.name}\" to \"${projectDef.definition.name}\". Renaming integrations during bp dev is not supported. Please restart bp dev.`\n )\n }\n const integrationDef = new sdk.IntegrationDefinition({\n ...projectDef.definition,\n name: this._deployedIntegrationName ?? this._initialDef.definition.name,\n })\n return await this._deployDevIntegration(api, tunnelUrl, integrationDef)\n }\n if (projectType === 'bot') {\n const projectDef = await resolveProjectDefinition()\n this._checkSecrets(projectDef.definition)\n return await this._deployDevBot(api, tunnelUrl, projectDef.definition)\n }\n throw new errors.UnsupportedProjectType()\n }\n\n private async _writeKnownSecretsToCache(secretEnvVariables: Record<string, string | null>) {\n const knownSecrets: Record<string, string | null> = {}\n for (const [prefixedSecretName, secretValue] of Object.entries(secretEnvVariables)) {\n const secretName = stripSecretEnvVariablePrefix(prefixedSecretName)\n knownSecrets[secretName] = secretValue\n }\n\n const nonNullKnownSecrets = utils.records.filterValues(knownSecrets, utils.guards.is.notNull)\n if (Object.keys(nonNullKnownSecrets).length === 0) {\n await this.projectCache.rm('secrets')\n return\n }\n await this.projectCache.set('secrets', nonNullKnownSecrets)\n }\n\n private async _readKnownSecretsFromCache() {\n return (await this.projectCache.get('secrets')) ?? {}\n }\n\n private _applyPrefixToSecrets(secrets: Record<string, string>): Record<string, string> {\n const prefixedSecretEntries = Object.entries(secrets).map(([secretName, secretValue]) => [\n secretEnvVariableName(secretName),\n secretValue,\n ])\n return Object.fromEntries(prefixedSecretEntries)\n }\n\n private _checkSecrets(projectDef: sdk.IntegrationDefinition | sdk.BotDefinition) {\n if (this._initialDef?.type !== 'integration' && this._initialDef?.type !== 'bot') {\n return\n }\n const initialSecrets = this._initialDef?.definition.secrets ?? {}\n const currentSecrets = projectDef.secrets ?? {}\n const newSecrets = Object.keys(currentSecrets).filter((s) => !initialSecrets[s])\n if (newSecrets.length > 0) {\n throw new errors.BotpressCLIError('Secrets were added while the server was running. A restart is required.')\n }\n }\n\n private _spawnWorker = async (env: Record<string, string>, port: number) => {\n const outfile = this.projectPaths.abs.outFileCJS\n const importPath = utils.path.toUnix(outfile)\n const code = `require('${importPath}').default.start(${port})`\n const worker = await Worker.spawn(\n {\n type: 'code',\n code,\n env,\n },\n this.logger\n ).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not start dev worker')\n })\n\n return worker\n }\n\n private _runBuild() {\n return new BuildCommand(this.api, this.prompt, this.logger, this.argv)\n .setProjectContext(this.projectContext)\n .run(this._buildContext)\n }\n\n private async _deployDevIntegration(\n api: apiUtils.ApiClient,\n externalUrl: string,\n integrationDef: sdk.IntegrationDefinition\n ): Promise<void> {\n const devId = await this.projectCache.get('devId')\n\n let integration: client.Integration | undefined = undefined\n\n if (devId) {\n const resp = await api.client.getIntegration({ id: devId }).catch(async (thrown) => {\n const err = errors.BotpressCLIError.wrap(thrown, `Could not find existing dev integration with id \"${devId}\"`)\n this.logger.warn(err.message)\n return { integration: undefined }\n })\n\n if (resp.integration?.dev) {\n integration = resp.integration\n } else {\n await this.projectCache.rm('devId')\n }\n }\n\n const line = this.logger.line()\n line.started(`Deploying dev integration ${chalk.bold(integrationDef.name)}...`)\n\n const createIntegrationBody = {\n ...(await this.prepareCreateIntegrationBody(integrationDef)),\n ...(await this.prepareIntegrationDependencies(integrationDef, api)),\n url: externalUrl,\n }\n\n if (integration) {\n const updateIntegrationBody = apiUtils.prepareUpdateIntegrationBody(\n { ...createIntegrationBody, id: integration.id },\n integration\n )\n\n const resp = await api.client.updateIntegration(updateIntegrationBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update dev integration \"${integrationDef.name}\"`)\n })\n integration = resp.integration\n } else {\n const resp = await api.client.createIntegration({ ...createIntegrationBody, dev: true }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not deploy dev integration \"${integrationDef.name}\"`)\n })\n integration = resp.integration\n }\n\n line.success(`Dev Integration deployed with id \"${integration.id}\" at \"${externalUrl}\"`)\n line.commit()\n\n await this.projectCache.set('devId', integration.id)\n }\n\n private async _deployDevBot(api: apiUtils.ApiClient, externalUrl: string, botDef: sdk.BotDefinition): Promise<void> {\n const devId = await this.projectCache.get('devId')\n\n let bot: client.Bot | undefined = undefined\n\n if (devId) {\n const resp = await api.client.getBot({ id: devId }).catch(async (thrown) => {\n const err = errors.BotpressCLIError.wrap(thrown, `Could not find existing dev bot with id \"${devId}\"`)\n this.logger.warn(err.message)\n return { bot: undefined }\n })\n\n if (resp.bot?.dev) {\n bot = resp.bot\n } else {\n await this.projectCache.rm('devId')\n }\n }\n\n if (!bot) {\n const createLine = this.logger.line()\n createLine.started('Creating dev bot...')\n const resp = await api.client\n .createBot({\n dev: true,\n url: externalUrl,\n })\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not deploy dev bot')\n })\n\n bot = resp.bot\n createLine.log('Dev Bot created')\n createLine.commit()\n await this.projectCache.set('devId', bot.id)\n }\n\n const updateBotBody = apiUtils.prepareUpdateBotBody(\n {\n ...(await apiUtils.prepareCreateBotBody(botDef)),\n ...(await this.prepareBotDependencies(botDef, api)),\n id: bot.id,\n url: externalUrl,\n },\n bot\n )\n\n if (!(await this._didDefinitionChange(updateBotBody))) {\n this.logger.log('Skipping deployment step. No changes found in bot.definition.ts')\n return\n }\n const updateLine = this.logger.line()\n updateLine.started('Deploying dev bot...')\n\n const { bot: updatedBot } = await api.client.updateBot(updateBotBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not deploy dev bot')\n })\n\n this.validateIntegrationRegistration(updatedBot, (failedIntegrations) => {\n throw new errors.BotpressCLIError(\n `Some integrations failed to register:\\n${Object.entries(failedIntegrations)\n .map(([key, int]) => `\u2022 ${key}: ${int.statusReason}`)\n .join('\\n')}`\n )\n })\n\n updateLine.success(`Dev Bot deployed with id \"${updatedBot.id}\" at \"${externalUrl}\"`)\n updateLine.commit()\n\n const tablesPublisher = new tables.TablesPublisher({ api, logger: this.logger, prompt: this.prompt })\n await tablesPublisher.deployTables({ botId: updatedBot.id, botDefinition: botDef })\n\n await this.displayIntegrationUrls({ api, bot: updatedBot })\n }\n\n private async _didDefinitionChange(body: apiUtils.UpdateBotRequestBody | apiUtils.UpdateIntegrationRequestBody) {\n const didChange = !isEqual(body, this._cacheDevRequestBody)\n this._cacheDevRequestBody = { ...body }\n return didChange\n }\n\n private _forwardTunnelRequest = async (baseUrl: string, request: TunnelRequest): Promise<TunnelResponse> => {\n const axiosConfig = {\n method: request.method,\n url: this._formatLocalUrl(baseUrl, request),\n headers: request.headers,\n data: request.body,\n responseType: 'text',\n validateStatus: () => true,\n } satisfies AxiosRequestConfig\n\n this.logger.debug(`Forwarding request to ${axiosConfig.url}`)\n const response = await axios(axiosConfig)\n this.logger.debug('Sending back response up the tunnel')\n\n return {\n requestId: request.id,\n status: response.status,\n headers: this._getHeaders(response.headers),\n body: response.data,\n }\n }\n\n private _formatLocalUrl = (baseUrl: string, req: TunnelRequest): string => {\n if (req.query) {\n return `${baseUrl}${req.path}?${req.query}`\n }\n return `${baseUrl}${req.path}`\n }\n\n private _getHeaders = (res: AxiosResponse['headers']): TunnelResponse['headers'] => {\n const headers: TunnelResponse['headers'] = {}\n for (const key in res) {\n if (typeof res[key] === 'string' || typeof res[key] === 'number') {\n headers[key] = String(res[key])\n }\n }\n return headers\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type * as client from '@botpress/client'\nimport * as sdk from '@botpress/sdk'\nimport { TunnelRequest, TunnelResponse } from '@bpinternal/tunnel'\nimport axios, { AxiosRequestConfig, AxiosResponse } from 'axios'\nimport chalk from 'chalk'\nimport { isEqual } from 'lodash'\nimport * as pathlib from 'path'\nimport * as uuid from 'uuid'\nimport * as apiUtils from '../api'\nimport { secretEnvVariableName, stripSecretEnvVariablePrefix } from '../code-generation/secret-module'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport * as tables from '../tables'\nimport * as utils from '../utils'\nimport { Worker } from '../worker'\nimport { BuildCommand } from './build-command'\nimport { ProjectCommand, ProjectDefinition } from './project-command'\n\nconst DEFAULT_BOT_PORT = 8075\nconst DEFAULT_INTEGRATION_PORT = 8076\nconst TUNNEL_HELLO_INTERVAL = 5000\nconst FILEWATCHER_DEBOUNCE_MS = 500\n\nexport type DevCommandDefinition = typeof commandDefinitions.dev\nexport class DevCommand extends ProjectCommand<DevCommandDefinition> {\n private _initialDef: ProjectDefinition | undefined = undefined\n private _deployedIntegrationName: string | undefined = undefined\n private _cacheDevRequestBody: apiUtils.UpdateBotRequestBody | apiUtils.UpdateIntegrationRequestBody | undefined\n private _buildContext: utils.esbuild.BuildCodeContext\n\n public constructor(...args: ConstructorParameters<typeof ProjectCommand<DevCommandDefinition>>) {\n super(...args)\n this._buildContext = new utils.esbuild.BuildCodeContext()\n }\n\n public async run(): Promise<void> {\n this.logger.warn('This command is experimental and subject to breaking changes without notice.')\n\n let api = await this.ensureLoginAndCreateClient(this.argv)\n\n const { projectType, resolveProjectDefinition } = this.readProjectDefinitionFromFS()\n if (projectType === 'interface') {\n throw new errors.BotpressCLIError('This feature is not available for interfaces.')\n }\n const projectDef = await resolveProjectDefinition()\n this._initialDef = projectDef\n\n if (projectDef.type === 'integration') {\n const handleResult = await this.manageWorkspaceHandle(api, projectDef.definition)\n if (!handleResult) return\n if (handleResult.workspaceId) {\n api = api.switchWorkspace(handleResult.workspaceId)\n }\n this._deployedIntegrationName = handleResult.integration.name\n }\n\n let env: Record<string, string> = {\n ...process.env,\n BP_API_URL: api.url,\n BP_TOKEN: api.token,\n }\n\n const defaultPort = this._initialDef.type === 'integration' ? DEFAULT_INTEGRATION_PORT : DEFAULT_BOT_PORT\n if (this._initialDef.type === 'integration' || this._initialDef.type === 'bot') {\n const knownSecrets = await this._readKnownSecretsFromCache()\n let secretEnvVariables = await this.promptSecrets(this._initialDef.definition, this.argv, {\n knownSecrets: Object.keys(knownSecrets),\n formatEnv: true,\n })\n secretEnvVariables = { ...this._applyPrefixToSecrets(knownSecrets), ...secretEnvVariables }\n const nonNullSecretEnvVariables = utils.records.filterValues(secretEnvVariables, utils.guards.is.notNull)\n\n if (!this.argv.noSecretCaching) {\n await this._writeKnownSecretsToCache(secretEnvVariables)\n }\n\n env = { ...env, ...nonNullSecretEnvVariables }\n }\n\n const port = this.argv.port ?? defaultPort\n\n const urlParseResult = utils.url.parse(this.argv.tunnelUrl)\n if (urlParseResult.status === 'error') {\n throw new errors.BotpressCLIError(`Invalid tunnel URL: ${urlParseResult.error}`)\n }\n\n const cachedTunnelId = await this.projectCache.get('tunnelId')\n\n let tunnelId: string\n if (this.argv.tunnelId) {\n tunnelId = this.argv.tunnelId\n } else if (cachedTunnelId) {\n tunnelId = cachedTunnelId\n } else {\n tunnelId = uuid.v4()\n }\n\n if (cachedTunnelId !== tunnelId) {\n await this.projectCache.set('tunnelId', tunnelId)\n }\n\n const { url: parsedTunnelUrl } = urlParseResult\n const isSecured = parsedTunnelUrl.protocol === 'https' || parsedTunnelUrl.protocol === 'wss'\n\n const wsTunnelUrl: string = utils.url.format({ ...parsedTunnelUrl, protocol: isSecured ? 'wss' : 'ws' })\n const httpTunnelUrl: string = utils.url.format({\n ...parsedTunnelUrl,\n protocol: isSecured ? 'https' : 'http',\n path: `/${tunnelId}`,\n })\n\n let worker: Worker | undefined = undefined\n\n const supervisor = new utils.tunnel.TunnelSupervisor(wsTunnelUrl, tunnelId, this.logger)\n supervisor.events.on('connected', ({ tunnel }) => {\n // prevents the tunnel from closing due to inactivity\n const timer = setInterval(() => {\n if (tunnel.closed) {\n return handleClose()\n }\n tunnel.hello()\n }, TUNNEL_HELLO_INTERVAL)\n const handleClose = (): void => clearInterval(timer)\n tunnel.events.on('close', handleClose)\n\n tunnel.events.on('request', (req) => {\n if (!worker) {\n this.logger.debug('Worker not ready yet, ignoring request')\n tunnel.send({ requestId: req.id, status: 503, body: 'Worker not ready yet' })\n return\n }\n\n void this._forwardTunnelRequest(`http://localhost:${port}`, req)\n .then((res) => {\n tunnel.send(res)\n })\n .catch((thrown) => {\n const err = errors.BotpressCLIError.wrap(\n thrown,\n `An error occurred while handling request ${req.method} ${req.path}`\n )\n this.logger.error(err.message)\n this.logger.debug(errors.BotpressCLIError.fullStack(err))\n tunnel.send({\n requestId: req.id,\n status: 500,\n body: 'Internal error while handling request',\n })\n })\n })\n })\n\n supervisor.events.on('manuallyClosed', () => {\n this.logger.debug('Tunnel manually closed')\n })\n\n await supervisor.start()\n\n await this._runBuild()\n worker = await this._spawnWorker(env, port)\n await this._deploy(api, httpTunnelUrl)\n\n try {\n const watcher = await utils.filewatcher.FileWatcher.watch(\n this.argv.workDir,\n async (events) => {\n if (!worker) {\n this.logger.debug('Worker not ready yet, ignoring file change event')\n return\n }\n\n const typescriptEvents = events\n .filter((e) => !e.path.startsWith(this.projectPaths.abs.outDir))\n .filter((e) => pathlib.extname(e.path) === '.ts')\n\n const packageJsonEvents = events\n .filter((e) => !e.path.startsWith(this.projectPaths.abs.outDir))\n .filter((e) => pathlib.basename(e.path) === 'package.json')\n\n const distEvents = events.filter((e) => e.path.startsWith(this.projectPaths.abs.distDir))\n\n if (typescriptEvents.length > 0 || packageJsonEvents.length > 0) {\n this.logger.log('Changes detected, rebuilding')\n await this._restart(api, worker, httpTunnelUrl)\n } else if (distEvents.length > 0) {\n this.logger.log('Changes detected in output directory, reloading worker')\n await worker.reload()\n }\n },\n {\n debounceMs: FILEWATCHER_DEBOUNCE_MS,\n }\n )\n\n await Promise.race([worker.wait(), watcher.wait(), supervisor.wait()])\n\n if (worker.running) {\n await worker.kill()\n }\n await watcher.close()\n supervisor.close()\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, 'An error occurred while running the dev server')\n } finally {\n if (worker.running) {\n await worker.kill()\n }\n }\n }\n\n private _restart = async (api: apiUtils.ApiClient, worker: Worker, tunnelUrl: string) => {\n try {\n await this._runBuild()\n } catch (thrown) {\n const error = errors.BotpressCLIError.wrap(thrown, 'Build failed')\n this.logger.error(error.message)\n this.logger.debug(errors.BotpressCLIError.fullStack(error))\n return\n }\n\n await worker.reload()\n await this._deploy(api, tunnelUrl)\n }\n\n private _deploy = async (api: apiUtils.ApiClient, tunnelUrl: string) => {\n const { projectType, resolveProjectDefinition } = this.readProjectDefinitionFromFS()\n\n if (projectType === 'interface') {\n throw new errors.BotpressCLIError('This feature is not available for interfaces.')\n }\n if (projectType === 'integration' && this._initialDef?.type === 'integration') {\n const projectDef = await resolveProjectDefinition()\n this._checkSecrets(projectDef.definition)\n if (projectDef.definition.name !== this._initialDef.definition.name) {\n throw new errors.BotpressCLIError(\n `Integration name changed from \"${this._initialDef.definition.name}\" to \"${projectDef.definition.name}\". Renaming integrations during bp dev is not supported. Please restart bp dev.`\n )\n }\n const integrationDef = new sdk.IntegrationDefinition({\n ...projectDef.definition,\n name: this._deployedIntegrationName ?? this._initialDef.definition.name,\n })\n return await this._deployDevIntegration(api, tunnelUrl, integrationDef)\n }\n if (projectType === 'bot') {\n const projectDef = await resolveProjectDefinition()\n this._checkSecrets(projectDef.definition)\n return await this._deployDevBot(api, tunnelUrl, projectDef.definition)\n }\n throw new errors.UnsupportedProjectType()\n }\n\n private async _writeKnownSecretsToCache(secretEnvVariables: Record<string, string | null>) {\n const knownSecrets: Record<string, string | null> = {}\n for (const [prefixedSecretName, secretValue] of Object.entries(secretEnvVariables)) {\n const secretName = stripSecretEnvVariablePrefix(prefixedSecretName)\n knownSecrets[secretName] = secretValue\n }\n\n const nonNullKnownSecrets = utils.records.filterValues(knownSecrets, utils.guards.is.notNull)\n if (Object.keys(nonNullKnownSecrets).length === 0) {\n await this.projectCache.rm('secrets')\n return\n }\n await this.projectCache.set('secrets', nonNullKnownSecrets)\n }\n\n private async _readKnownSecretsFromCache() {\n return (await this.projectCache.get('secrets')) ?? {}\n }\n\n private _applyPrefixToSecrets(secrets: Record<string, string>): Record<string, string> {\n const prefixedSecretEntries = Object.entries(secrets).map(([secretName, secretValue]) => [\n secretEnvVariableName(secretName),\n secretValue,\n ])\n return Object.fromEntries(prefixedSecretEntries)\n }\n\n private _checkSecrets(projectDef: sdk.IntegrationDefinition | sdk.BotDefinition) {\n if (this._initialDef?.type !== 'integration' && this._initialDef?.type !== 'bot') {\n return\n }\n const initialSecrets = this._initialDef?.definition.secrets ?? {}\n const currentSecrets = projectDef.secrets ?? {}\n const newSecrets = Object.keys(currentSecrets).filter((s) => !initialSecrets[s])\n if (newSecrets.length > 0) {\n throw new errors.BotpressCLIError('Secrets were added while the server was running. A restart is required.')\n }\n }\n\n private _spawnWorker = async (env: Record<string, string>, port: number) => {\n const outfile = this.projectPaths.abs.outFileCJS\n const importPath = utils.path.toUnix(outfile)\n const code = `require('${importPath}').default.start(${port})`\n const worker = await Worker.spawn(\n {\n type: 'code',\n code,\n env,\n },\n this.logger\n ).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not start dev worker on port ${port}`)\n })\n\n return worker\n }\n\n private _runBuild() {\n return new BuildCommand(this.api, this.prompt, this.logger, this.argv)\n .setProjectContext(this.projectContext)\n .run(this._buildContext)\n }\n\n private async _deployDevIntegration(\n api: apiUtils.ApiClient,\n externalUrl: string,\n integrationDef: sdk.IntegrationDefinition\n ): Promise<void> {\n const devId = await this.projectCache.get('devId')\n\n let integration: client.Integration | undefined = undefined\n\n if (devId) {\n const resp = await api.client.getIntegration({ id: devId }).catch(async (thrown) => {\n const err = errors.BotpressCLIError.wrap(thrown, `Could not find existing dev integration with id \"${devId}\"`)\n this.logger.warn(err.message)\n this.logger.debug(errors.BotpressCLIError.fullStack(err))\n return { integration: undefined }\n })\n\n if (resp.integration?.dev) {\n integration = resp.integration\n } else {\n await this.projectCache.rm('devId')\n }\n }\n\n const line = this.logger.line()\n line.started(`Deploying dev integration ${chalk.bold(integrationDef.name)}...`)\n\n const createIntegrationBody = {\n ...(await this.prepareCreateIntegrationBody(integrationDef)),\n ...(await this.prepareIntegrationDependencies(integrationDef, api)),\n url: externalUrl,\n }\n\n if (integration) {\n const updateIntegrationBody = apiUtils.prepareUpdateIntegrationBody(\n { ...createIntegrationBody, id: integration.id },\n integration\n )\n\n const resp = await api.client.updateIntegration(updateIntegrationBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not update dev integration \"${integrationDef.name}\"`)\n })\n integration = resp.integration\n } else {\n const resp = await api.client.createIntegration({ ...createIntegrationBody, dev: true }).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not deploy dev integration \"${integrationDef.name}\"`)\n })\n integration = resp.integration\n }\n\n line.success(`Dev Integration deployed with id \"${integration.id}\" at \"${externalUrl}\"`)\n line.commit()\n\n await this.projectCache.set('devId', integration.id)\n }\n\n private async _deployDevBot(api: apiUtils.ApiClient, externalUrl: string, botDef: sdk.BotDefinition): Promise<void> {\n const devId = await this.projectCache.get('devId')\n\n let bot: client.Bot | undefined = undefined\n\n if (devId) {\n const resp = await api.client.getBot({ id: devId }).catch(async (thrown) => {\n const err = errors.BotpressCLIError.wrap(thrown, `Could not find existing dev bot with id \"${devId}\"`)\n this.logger.warn(err.message)\n this.logger.debug(errors.BotpressCLIError.fullStack(err))\n return { bot: undefined }\n })\n\n if (resp.bot?.dev) {\n bot = resp.bot\n } else {\n await this.projectCache.rm('devId')\n }\n }\n\n if (!bot) {\n const createLine = this.logger.line()\n createLine.started('Creating dev bot...')\n const resp = await api.client\n .createBot({\n dev: true,\n url: externalUrl,\n })\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not deploy dev bot')\n })\n\n bot = resp.bot\n createLine.log('Dev Bot created')\n createLine.commit()\n await this.projectCache.set('devId', bot.id)\n }\n\n const updateBotBody = apiUtils.prepareUpdateBotBody(\n {\n ...(await apiUtils.prepareCreateBotBody(botDef)),\n ...(await this.prepareBotDependencies(botDef, api)),\n id: bot.id,\n url: externalUrl,\n },\n bot\n )\n\n if (!(await this._didDefinitionChange(updateBotBody))) {\n this.logger.log('Skipping deployment step. No changes found in bot.definition.ts')\n return\n }\n const updateLine = this.logger.line()\n updateLine.started('Deploying dev bot...')\n\n const { bot: updatedBot } = await api.client.updateBot(updateBotBody).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not deploy dev bot')\n })\n\n this.validateIntegrationRegistration(updatedBot, (failedIntegrations) => {\n throw new errors.BotpressCLIError(\n `Some integrations failed to register:\\n${Object.entries(failedIntegrations)\n .map(([key, int]) => `\u2022 ${key}: ${int.statusReason}`)\n .join('\\n')}`\n )\n })\n\n updateLine.success(`Dev Bot deployed with id \"${updatedBot.id}\" at \"${externalUrl}\"`)\n updateLine.commit()\n\n const tablesPublisher = new tables.TablesPublisher({ api, logger: this.logger, prompt: this.prompt })\n await tablesPublisher.deployTables({ botId: updatedBot.id, botDefinition: botDef })\n\n await this.displayIntegrationUrls({ api, bot: updatedBot })\n }\n\n private async _didDefinitionChange(body: apiUtils.UpdateBotRequestBody | apiUtils.UpdateIntegrationRequestBody) {\n const didChange = !isEqual(body, this._cacheDevRequestBody)\n this._cacheDevRequestBody = { ...body }\n return didChange\n }\n\n private _forwardTunnelRequest = async (baseUrl: string, request: TunnelRequest): Promise<TunnelResponse> => {\n const axiosConfig = {\n method: request.method,\n url: this._formatLocalUrl(baseUrl, request),\n headers: request.headers,\n data: request.body,\n responseType: 'text',\n validateStatus: () => true,\n } satisfies AxiosRequestConfig\n\n this.logger.debug(`Forwarding request to ${axiosConfig.url}`)\n const response = await axios(axiosConfig)\n this.logger.debug('Sending back response up the tunnel')\n\n return {\n requestId: request.id,\n status: response.status,\n headers: this._getHeaders(response.headers),\n body: response.data,\n }\n }\n\n private _formatLocalUrl = (baseUrl: string, req: TunnelRequest): string => {\n if (req.query) {\n return `${baseUrl}${req.path}?${req.query}`\n }\n return `${baseUrl}${req.path}`\n }\n\n private _getHeaders = (res: AxiosResponse['headers']): TunnelResponse['headers'] => {\n const headers: TunnelResponse['headers'] = {}\n for (const key in res) {\n if (typeof res[key] === 'string' || typeof res[key] === 'number') {\n headers[key] = String(res[key])\n }\n }\n return headers\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["chalk", "axios"]
|
|
7
7
|
}
|
|
@@ -446,6 +446,11 @@ class ProjectCommand extends import_global_command.GlobalCommand {
|
|
|
446
446
|
schema: await utils.schema.mapZodToJsonSchema(integrationDef.configuration, {
|
|
447
447
|
useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,
|
|
448
448
|
toJSONSchemaOptions: integrationDef.__advanced?.toJSONSchemaOptions
|
|
449
|
+
}).catch((thrown) => {
|
|
450
|
+
throw errors.BotpressCLIError.wrap(
|
|
451
|
+
thrown,
|
|
452
|
+
`Failed to convert ZUI to JSON schema for integration ${integrationDef.name} for configuration`
|
|
453
|
+
);
|
|
449
454
|
}),
|
|
450
455
|
identifier: {
|
|
451
456
|
required: integrationDef.configuration.identifier?.required,
|
|
@@ -454,18 +459,26 @@ class ProjectCommand extends import_global_command.GlobalCommand {
|
|
|
454
459
|
)
|
|
455
460
|
}
|
|
456
461
|
} : void 0,
|
|
457
|
-
configurations: integrationDef.configurations ? await utils.records.mapValuesAsync(
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
462
|
+
configurations: integrationDef.configurations ? await utils.records.mapValuesAsync(
|
|
463
|
+
integrationDef.configurations,
|
|
464
|
+
async (configuration, configurationName) => ({
|
|
465
|
+
title: configuration.title,
|
|
466
|
+
description: configuration.description,
|
|
467
|
+
schema: await utils.schema.mapZodToJsonSchema(configuration, {
|
|
468
|
+
useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,
|
|
469
|
+
toJSONSchemaOptions: integrationDef.__advanced?.toJSONSchemaOptions
|
|
470
|
+
}).catch((thrown) => {
|
|
471
|
+
throw errors.BotpressCLIError.wrap(
|
|
472
|
+
thrown,
|
|
473
|
+
`Failed to convert ZUI to JSON schema for integration ${integrationDef.name} for configuration ${configurationName}`
|
|
474
|
+
);
|
|
475
|
+
}),
|
|
476
|
+
identifier: {
|
|
477
|
+
required: configuration.identifier?.required,
|
|
478
|
+
linkTemplateScript: await this.readProjectFile(configuration.identifier?.linkTemplateScript)
|
|
479
|
+
}
|
|
480
|
+
})
|
|
481
|
+
) : void 0
|
|
469
482
|
};
|
|
470
483
|
}
|
|
471
484
|
async prepareBotDependencies(botDef, api) {
|