diff --git a/package.json b/package.json index 9788088cb29..82d315bff2a 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ }, "devDependencies": { "@aws-sdk/client-dynamodb": "^3.564.0", - "@botpress/api": "1.70.2", + "@botpress/api": "1.71.0", "@botpress/cli": "workspace:*", "@botpress/client": "workspace:*", "@botpress/sdk": "workspace:*", diff --git a/packages/cli/package.json b/packages/cli/package.json index acc2581e6fa..5b82bc163b1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@botpress/cli", - "version": "5.5.0", + "version": "5.5.1", "description": "Botpress CLI", "scripts": { "build": "pnpm run build:types && pnpm run bundle && pnpm run template:gen", @@ -27,8 +27,8 @@ "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.7.0", "@botpress/chat": "0.5.4", - "@botpress/client": "1.31.0", - "@botpress/sdk": "5.3.2", + "@botpress/client": "1.32.0", + "@botpress/sdk": "5.3.3", "@bpinternal/const": "^0.1.0", "@bpinternal/tunnel": "^0.1.1", "@bpinternal/verel": "^0.2.0", diff --git a/packages/cli/src/command-implementations/lint-command.ts b/packages/cli/src/command-implementations/lint-command.ts index 2e193357f4f..0637f44f5ce 100644 --- a/packages/cli/src/command-implementations/lint-command.ts +++ b/packages/cli/src/command-implementations/lint-command.ts @@ -9,11 +9,21 @@ import { import * as apiUtils from '../api' import type commandDefinitions from '../command-definitions' import * as errors from '../errors' +import { BaseLinter } from '../linter/base-linter' import { BotLinter } from '../linter/bot-linter' import { IntegrationLinter } from '../linter/integration-linter' import { InterfaceLinter } from '../linter/interface-linter' import { ProjectCommand } from './project-command' +const _getIssuesDetectedMessage = (linter: BaseLinter, nonEmptyPrefix: string = '') => { + const message = linter + .getIssuesCountBySeverity() + .map(({ name, count }) => `${count} ${name}(s)`) + .join(', ') + + return message.length > 0 ? `${nonEmptyPrefix}${message}` : '' +} + export type LintCommandDefinition = typeof commandDefinitions.lint export class LintCommand extends ProjectCommand { public async run(): Promise { @@ -59,11 +69,13 @@ export class LintCommand extends ProjectCommand { await linter.lint() linter.logResults(this.logger) + const issueCountsSuffix = _getIssuesDetectedMessage(linter, ' - ') + if (linter.hasErrors()) { - throw new errors.BotpressCLIError('Interface definition contains linting errors') + throw new errors.BotpressCLIError(`Interface definition contains linting errors${issueCountsSuffix}`) } - this.logger.success('Interface definition is valid') + this.logger.success(`Interface definition is valid${issueCountsSuffix}`) } private async _runLintForBot(definition: BotDefinition): Promise { @@ -74,11 +86,13 @@ export class LintCommand extends ProjectCommand { await linter.lint() linter.logResults(this.logger) + const issueCountsSuffix = _getIssuesDetectedMessage(linter, ' - ') + if (linter.hasErrors()) { - throw new errors.BotpressCLIError('Bot definition contains linting errors') + throw new errors.BotpressCLIError(`Bot definition contains linting errors${issueCountsSuffix}`) } - this.logger.success('Bot definition is valid') + this.logger.success(`Bot definition is valid${issueCountsSuffix}`) } private _stripAutoGeneratedContentFromBot(definition: BotDefinition) { @@ -99,11 +113,13 @@ export class LintCommand extends ProjectCommand { await linter.lint() linter.logResults(this.logger) + const issueCountsSuffix = _getIssuesDetectedMessage(linter, ' - ') + if (linter.hasErrors()) { - throw new errors.BotpressCLIError('Integration definition contains linting errors') + throw new errors.BotpressCLIError(`Integration definition contains linting errors${issueCountsSuffix}`) } - this.logger.success('Integration definition is valid') + this.logger.success(`Integration definition is valid${issueCountsSuffix}`) } private _stripAutoGeneratedContentFromIntegration(definition: IntegrationDefinition) { diff --git a/packages/cli/src/linter/base-linter.ts b/packages/cli/src/linter/base-linter.ts index 19c4dad4425..dd9517259c2 100644 --- a/packages/cli/src/linter/base-linter.ts +++ b/packages/cli/src/linter/base-linter.ts @@ -1,9 +1,15 @@ import { Spectral, Document, type ISpectralDiagnostic, type RulesetDefinition } from '@stoplight/spectral-core' import { Json as JsonParser, type JsonParserResult } from '@stoplight/spectral-parsers' +import { DiagnosticSeverity } from '@stoplight/types' import { type Logger } from '../logger' import { TRUTHY_WITH_MESSAGE_ID } from './spectral-functions' -type ProblemSeverity = 0 | 1 | 2 | 3 +enum ProblemSeverity { + Error = 0, + Warning = 1, + Info = 2, + Debug = 3, +} const _injectLoggerIntoRulesetOptions = (ruleset: RulesetDefinition, logger?: Logger) => { // This is the most jankiest thing I've ever done but @@ -62,11 +68,31 @@ export abstract class BaseLinter { return this._results.some((result) => result.severity === 0) } + public getIssuesCountBySeverity() { + return Object.values( + this._getResults().reduce( + (acc, { severity }) => { + if (!acc.hasOwnProperty(severity)) { + acc[severity] = { + severityLevel: severity, + name: ProblemSeverity[severity] ?? 'Unknown', + count: 0, + } + } + + acc[severity].count += 1 + return acc + }, + {} as Record + ) + ).toSorted((a, b) => a.severityLevel - b.severityLevel) + } + private _getResults() { return this._results.map((result) => ({ message: result.message, path: this._simplifyPath(result.path), - severity: result.severity as ProblemSeverity, + severity: result.severity as StoplightServerity, })) } @@ -76,12 +102,21 @@ export abstract class BaseLinter { private _logResultMessage(logger: Logger, message: string, severity: ProblemSeverity) { const logLevelMapping = { - 0: logger.error, - 1: logger.warn, - 2: logger.log, - 3: logger.debug, - } as const + [ProblemSeverity.Error]: logger.error, + [ProblemSeverity.Warning]: logger.warn, + [ProblemSeverity.Info]: logger.log, + [ProblemSeverity.Debug]: logger.debug, + } as const satisfies Record logLevelMapping[severity].call(logger, message) } } + +type ResultSeverityCount = { + severityLevel: ProblemSeverity + name: string + count: number +} + +type EnumToIndices = `${Extract}` extends `${infer N extends number}` ? N : never +type StoplightServerity = EnumToIndices diff --git a/packages/cli/templates/empty-bot/package.json b/packages/cli/templates/empty-bot/package.json index 10740e80de7..c63a117d719 100644 --- a/packages/cli/templates/empty-bot/package.json +++ b/packages/cli/templates/empty-bot/package.json @@ -5,8 +5,8 @@ }, "private": true, "dependencies": { - "@botpress/client": "1.31.0", - "@botpress/sdk": "5.3.2" + "@botpress/client": "1.32.0", + "@botpress/sdk": "5.3.3" }, "devDependencies": { "@types/node": "^22.16.4", diff --git a/packages/cli/templates/empty-integration/package.json b/packages/cli/templates/empty-integration/package.json index bbe0e4d5cec..1e1d5ed38ab 100644 --- a/packages/cli/templates/empty-integration/package.json +++ b/packages/cli/templates/empty-integration/package.json @@ -6,8 +6,8 @@ }, "private": true, "dependencies": { - "@botpress/client": "1.31.0", - "@botpress/sdk": "5.3.2" + "@botpress/client": "1.32.0", + "@botpress/sdk": "5.3.3" }, "devDependencies": { "@types/node": "^22.16.4", diff --git a/packages/cli/templates/empty-plugin/package.json b/packages/cli/templates/empty-plugin/package.json index 7207039a127..38ac47fdd64 100644 --- a/packages/cli/templates/empty-plugin/package.json +++ b/packages/cli/templates/empty-plugin/package.json @@ -6,7 +6,7 @@ }, "private": true, "dependencies": { - "@botpress/sdk": "5.3.2" + "@botpress/sdk": "5.3.3" }, "devDependencies": { "@types/node": "^22.16.4", diff --git a/packages/cli/templates/hello-world/package.json b/packages/cli/templates/hello-world/package.json index 1f74e5f64dc..45c98b138b0 100644 --- a/packages/cli/templates/hello-world/package.json +++ b/packages/cli/templates/hello-world/package.json @@ -6,8 +6,8 @@ }, "private": true, "dependencies": { - "@botpress/client": "1.31.0", - "@botpress/sdk": "5.3.2" + "@botpress/client": "1.32.0", + "@botpress/sdk": "5.3.3" }, "devDependencies": { "@types/node": "^22.16.4", diff --git a/packages/cli/templates/webhook-message/package.json b/packages/cli/templates/webhook-message/package.json index f1cb6c4141b..82390ef93ed 100644 --- a/packages/cli/templates/webhook-message/package.json +++ b/packages/cli/templates/webhook-message/package.json @@ -6,8 +6,8 @@ }, "private": true, "dependencies": { - "@botpress/client": "1.31.0", - "@botpress/sdk": "5.3.2", + "@botpress/client": "1.32.0", + "@botpress/sdk": "5.3.3", "axios": "^1.6.8" }, "devDependencies": { diff --git a/packages/client/package.json b/packages/client/package.json index 85a386f772a..3fea061a404 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@botpress/client", - "version": "1.31.0", + "version": "1.32.0", "description": "Botpress Client", "main": "./dist/index.cjs", "module": "./dist/index.mjs", diff --git a/packages/cognitive/package.json b/packages/cognitive/package.json index 0e01992f119..a69fb6d0a8f 100644 --- a/packages/cognitive/package.json +++ b/packages/cognitive/package.json @@ -1,6 +1,6 @@ { "name": "@botpress/cognitive", - "version": "0.3.8", + "version": "0.3.9", "description": "Wrapper around the Botpress Client to call LLMs", "main": "./dist/index.cjs", "module": "./dist/index.mjs", diff --git a/packages/llmz/package.json b/packages/llmz/package.json index 9065a54f168..8bef377b159 100644 --- a/packages/llmz/package.json +++ b/packages/llmz/package.json @@ -2,7 +2,7 @@ "name": "llmz", "type": "module", "description": "LLMz - An LLM-native Typescript VM built on top of Zui", - "version": "0.0.46", + "version": "0.0.47", "types": "./dist/index.d.ts", "main": "./dist/index.cjs", "module": "./dist/index.js", @@ -71,8 +71,8 @@ "tsx": "^4.19.2" }, "peerDependencies": { - "@botpress/client": "1.31.0", - "@botpress/cognitive": "0.3.8", + "@botpress/client": "1.32.0", + "@botpress/cognitive": "0.3.9", "@bpinternal/thicktoken": "^1.0.5", "@bpinternal/zui": "^1.3.2" }, diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 6d6c0f2cd47..34c2be64223 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@botpress/sdk", - "version": "5.3.2", + "version": "5.3.3", "description": "Botpress SDK", "main": "./dist/index.cjs", "module": "./dist/index.mjs", @@ -20,7 +20,7 @@ "author": "", "license": "MIT", "dependencies": { - "@botpress/client": "1.31.0", + "@botpress/client": "1.32.0", "browser-or-node": "^2.1.1", "semver": "^7.3.8" }, diff --git a/packages/vai/package.json b/packages/vai/package.json index dacdb81f7a5..ba3359a4bcb 100644 --- a/packages/vai/package.json +++ b/packages/vai/package.json @@ -1,6 +1,6 @@ { "name": "@botpress/vai", - "version": "0.0.11", + "version": "0.0.12", "description": "Vitest AI (vai) – a vitest extension for testing with LLMs", "types": "./dist/index.d.ts", "exports": { @@ -40,7 +40,7 @@ "tsup": "^8.0.2" }, "peerDependencies": { - "@botpress/client": "1.31.0", + "@botpress/client": "1.32.0", "@bpinternal/thicktoken": "^1.0.1", "@bpinternal/zui": "^1.3.2", "lodash": "^4.17.21", diff --git a/packages/zai/package.json b/packages/zai/package.json index 1f317ad0f26..b2a544bf993 100644 --- a/packages/zai/package.json +++ b/packages/zai/package.json @@ -1,7 +1,7 @@ { "name": "@botpress/zai", "description": "Zui AI (zai) – An LLM utility library written on top of Zui and the Botpress API", - "version": "2.5.11", + "version": "2.5.12", "main": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { @@ -32,7 +32,7 @@ "author": "", "license": "ISC", "dependencies": { - "@botpress/cognitive": "0.3.8", + "@botpress/cognitive": "0.3.9", "json5": "^2.2.3", "jsonrepair": "^3.10.0", "lodash-es": "^4.17.21", diff --git a/plugins/conversation-insights/package.json b/plugins/conversation-insights/package.json index 867aa222b82..7a003506a06 100644 --- a/plugins/conversation-insights/package.json +++ b/plugins/conversation-insights/package.json @@ -7,7 +7,7 @@ }, "private": true, "dependencies": { - "@botpress/cognitive": "0.3.8", + "@botpress/cognitive": "0.3.9", "@botpress/sdk": "workspace:*", "browser-or-node": "^2.1.1", "jsonrepair": "^3.10.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b41e64e1201..9d2ce1b4a14 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,8 +17,8 @@ importers: specifier: ^3.564.0 version: 3.709.0 '@botpress/api': - specifier: 1.70.2 - version: 1.70.2 + specifier: 1.71.0 + version: 1.71.0 '@botpress/cli': specifier: workspace:* version: link:packages/cli @@ -2480,10 +2480,10 @@ importers: specifier: 0.5.4 version: link:../chat-client '@botpress/client': - specifier: 1.31.0 + specifier: 1.32.0 version: link:../client '@botpress/sdk': - specifier: 5.3.2 + specifier: 5.3.3 version: link:../sdk '@bpinternal/const': specifier: ^0.1.0 @@ -2604,10 +2604,10 @@ importers: packages/cli/templates/empty-bot: dependencies: '@botpress/client': - specifier: 1.31.0 + specifier: 1.32.0 version: link:../../../client '@botpress/sdk': - specifier: 5.3.2 + specifier: 5.3.3 version: link:../../../sdk devDependencies: '@types/node': @@ -2620,10 +2620,10 @@ importers: packages/cli/templates/empty-integration: dependencies: '@botpress/client': - specifier: 1.31.0 + specifier: 1.32.0 version: link:../../../client '@botpress/sdk': - specifier: 5.3.2 + specifier: 5.3.3 version: link:../../../sdk devDependencies: '@types/node': @@ -2636,7 +2636,7 @@ importers: packages/cli/templates/empty-plugin: dependencies: '@botpress/sdk': - specifier: 5.3.2 + specifier: 5.3.3 version: link:../../../sdk devDependencies: '@types/node': @@ -2649,10 +2649,10 @@ importers: packages/cli/templates/hello-world: dependencies: '@botpress/client': - specifier: 1.31.0 + specifier: 1.32.0 version: link:../../../client '@botpress/sdk': - specifier: 5.3.2 + specifier: 5.3.3 version: link:../../../sdk devDependencies: '@types/node': @@ -2665,10 +2665,10 @@ importers: packages/cli/templates/webhook-message: dependencies: '@botpress/client': - specifier: 1.31.0 + specifier: 1.32.0 version: link:../../../client '@botpress/sdk': - specifier: 5.3.2 + specifier: 5.3.3 version: link:../../../sdk axios: specifier: ^1.6.8 @@ -2819,10 +2819,10 @@ importers: specifier: ^7.26.3 version: 7.26.9 '@botpress/client': - specifier: 1.31.0 + specifier: 1.32.0 version: link:../client '@botpress/cognitive': - specifier: 0.3.8 + specifier: 0.3.9 version: link:../cognitive '@bpinternal/thicktoken': specifier: ^1.0.5 @@ -2925,7 +2925,7 @@ importers: packages/sdk: dependencies: '@botpress/client': - specifier: 1.31.0 + specifier: 1.32.0 version: link:../client '@bpinternal/zui': specifier: ^1.3.2 @@ -2962,7 +2962,7 @@ importers: packages/vai: dependencies: '@botpress/client': - specifier: 1.31.0 + specifier: 1.32.0 version: link:../client '@bpinternal/thicktoken': specifier: ^1.0.1 @@ -3008,7 +3008,7 @@ importers: packages/zai: dependencies: '@botpress/cognitive': - specifier: 0.3.8 + specifier: 0.3.9 version: link:../cognitive '@bpinternal/thicktoken': specifier: ^1.0.0 @@ -3127,7 +3127,7 @@ importers: plugins/conversation-insights: dependencies: '@botpress/cognitive': - specifier: 0.3.8 + specifier: 0.3.9 version: link:../../packages/cognitive '@botpress/sdk': specifier: workspace:* @@ -3969,8 +3969,8 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@botpress/api@1.70.2': - resolution: {integrity: sha512-K/4pdxmco0PyJV/IukWM8zD26OtFn0hcG51Gwv2LXJu0SzvTswr6myhzdspYuY3O1GR8+CLVbIXJT9eYul77pA==} + '@botpress/api@1.71.0': + resolution: {integrity: sha512-8lK5rAzc1KKQ46HKisdzTOb6dqvc3xXI8SRT9HOl4YiR5ekrbtqhWqGri4Y/LvgoWajYdNvza4Iy9CG0st7V0w==} '@bpinternal/const@0.1.0': resolution: {integrity: sha512-iIQg9oYYXOt+LSK34oNhJVQTcgRdtLmLZirEUaE+R9hnmbKONA5reR2kTewxZmekGyxej+5RtDK9xrC/0hmeAw==} @@ -8187,15 +8187,17 @@ packages: glob@10.3.10: resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} @@ -13138,7 +13140,7 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@botpress/api@1.70.2': + '@botpress/api@1.71.0': dependencies: '@bpinternal/opapi': 1.0.0(openapi-types@12.1.3) transitivePeerDependencies: