@botpress/adk 1.16.7 → 1.18.0-beta.1
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/dist/agent-init/agent-project-generator.d.ts +32 -8
- package/dist/agent-init/agent-project-generator.d.ts.map +1 -1
- package/dist/agent-init/index.d.ts +1 -0
- package/dist/agent-init/index.d.ts.map +1 -1
- package/dist/agent-project/agent-project.d.ts +13 -1
- package/dist/agent-project/agent-project.d.ts.map +1 -1
- package/dist/agent-project/agent-resolver.d.ts +4 -3
- package/dist/agent-project/agent-resolver.d.ts.map +1 -1
- package/dist/agent-project/config-writer.d.ts +33 -0
- package/dist/agent-project/config-writer.d.ts.map +1 -1
- package/dist/agent-project/dependencies-parser.d.ts.map +1 -1
- package/dist/agent-project/index.d.ts +1 -1
- package/dist/agent-project/index.d.ts.map +1 -1
- package/dist/agent-project/types.d.ts +48 -22
- package/dist/agent-project/types.d.ts.map +1 -1
- package/dist/agent-project/validation-errors.d.ts.map +1 -1
- package/dist/auth/credentials.d.ts +15 -1
- package/dist/auth/credentials.d.ts.map +1 -1
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/bot-generator/dev-id-manager.d.ts.map +1 -1
- package/dist/bot-generator/generator.d.ts.map +1 -1
- package/dist/commands/base-command.d.ts.map +1 -1
- package/dist/commands/bp-add-command.d.ts.map +1 -1
- package/dist/commands/bp-build-command.d.ts.map +1 -1
- package/dist/commands/bp-chat-command.d.ts.map +1 -1
- package/dist/commands/bp-deploy-command.d.ts.map +1 -1
- package/dist/commands/bp-dev-command.d.ts +2 -2
- package/dist/commands/bp-dev-command.d.ts.map +1 -1
- package/dist/commands/opencode-command.d.ts +2 -2
- package/dist/commands/opencode-command.d.ts.map +1 -1
- package/dist/commands/opencode-config.d.ts +1 -1
- package/dist/commands/opencode-config.d.ts.map +1 -1
- package/dist/config/coerce-config-value.d.ts.map +1 -1
- package/dist/config/manager.d.ts +5 -5
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/eval/client.d.ts +8 -0
- package/dist/eval/client.d.ts.map +1 -1
- package/dist/eval/graders/index.d.ts +1 -0
- package/dist/eval/graders/index.d.ts.map +1 -1
- package/dist/eval/graders/llm.d.ts +6 -2
- package/dist/eval/graders/llm.d.ts.map +1 -1
- package/dist/eval/graders/response.d.ts +1 -0
- package/dist/eval/graders/response.d.ts.map +1 -1
- package/dist/eval/graders/state.d.ts +1 -1
- package/dist/eval/graders/state.d.ts.map +1 -1
- package/dist/eval/graders/tables.d.ts.map +1 -1
- package/dist/eval/graders/timing.d.ts +7 -0
- package/dist/eval/graders/timing.d.ts.map +1 -0
- package/dist/eval/graders/workflow.d.ts.map +1 -1
- package/dist/eval/index.d.ts +3 -3
- package/dist/eval/index.d.ts.map +1 -1
- package/dist/eval/loader.d.ts +2 -1
- package/dist/eval/loader.d.ts.map +1 -1
- package/dist/eval/runner.d.ts +1 -0
- package/dist/eval/runner.d.ts.map +1 -1
- package/dist/eval/traces.d.ts.map +1 -1
- package/dist/eval/types.d.ts +62 -4
- package/dist/eval/types.d.ts.map +1 -1
- package/dist/file-watcher/watcher.d.ts +9 -0
- package/dist/file-watcher/watcher.d.ts.map +1 -1
- package/dist/generators/client-wrapper.d.ts.map +1 -1
- package/dist/generators/conversation-types.d.ts.map +1 -1
- package/dist/generators/integration-types.d.ts.map +1 -1
- package/dist/generators/interface-types.d.ts.map +1 -1
- package/dist/generators/plugin-types.d.ts.map +1 -1
- package/dist/generators/table-types.d.ts.map +1 -1
- package/dist/generators/tests.d.ts.map +1 -1
- package/dist/generators/workflow-types.d.ts.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1194 -594
- package/dist/index.js.map +62 -61
- package/dist/integrations/checker.d.ts +2 -2
- package/dist/integrations/checker.d.ts.map +1 -1
- package/dist/integrations/config-utils.d.ts +4 -3
- package/dist/integrations/config-utils.d.ts.map +1 -1
- package/dist/integrations/operations.d.ts +19 -6
- package/dist/integrations/operations.d.ts.map +1 -1
- package/dist/integrations/types.d.ts +1 -1
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/interfaces/manager.d.ts.map +1 -1
- package/dist/interfaces/types.d.ts +1 -1
- package/dist/interfaces/types.d.ts.map +1 -1
- package/dist/knowledge/manager.d.ts.map +1 -1
- package/dist/plugins/types.d.ts +1 -1
- package/dist/plugins/types.d.ts.map +1 -1
- package/dist/preflight/agent-config-sync.d.ts +2 -1
- package/dist/preflight/agent-config-sync.d.ts.map +1 -1
- package/dist/preflight/checker.d.ts.map +1 -1
- package/dist/preflight/types.d.ts +8 -8
- package/dist/preflight/types.d.ts.map +1 -1
- package/dist/runner/index.d.ts +1 -1
- package/dist/runner/script-runner.d.ts +1 -1
- package/dist/runner/script-runner.d.ts.map +1 -1
- package/dist/tables/table-manager.d.ts.map +1 -1
- package/dist/tables/types.d.ts +2 -1
- package/dist/tables/types.d.ts.map +1 -1
- package/dist/templates/README.md +101 -0
- package/dist/templates/blank/README.md +36 -0
- package/dist/templates/blank/agent.config.ts +49 -0
- package/dist/templates/blank/package.json +17 -0
- package/dist/templates/blank/src/actions/index.ts +19 -0
- package/dist/templates/blank/src/conversations/index.ts +16 -0
- package/dist/templates/blank/src/knowledge/index.ts +17 -0
- package/dist/templates/blank/src/tables/index.ts +19 -0
- package/dist/templates/blank/src/triggers/index.ts +20 -0
- package/dist/templates/blank/src/workflows/index.ts +23 -0
- package/dist/templates/blank/tsconfig.json +22 -0
- package/dist/templates/crm-enrichment/README.md +85 -0
- package/dist/templates/crm-enrichment/agent.config.ts +33 -0
- package/dist/templates/crm-enrichment/package.json +17 -0
- package/dist/templates/crm-enrichment/src/actions/enrich-contact.ts +81 -0
- package/dist/templates/crm-enrichment/src/conversations/index.ts +14 -0
- package/dist/templates/crm-enrichment/src/knowledge/index.ts +17 -0
- package/dist/templates/crm-enrichment/src/tables/contacts.ts +43 -0
- package/dist/templates/crm-enrichment/src/triggers/daily-enrichment.ts +30 -0
- package/dist/templates/crm-enrichment/src/workflows/enrichment-pipeline.ts +171 -0
- package/dist/templates/crm-enrichment/tsconfig.json +22 -0
- package/dist/templates/hello-world/README.md +46 -0
- package/dist/templates/hello-world/agent.config.ts +48 -0
- package/dist/templates/hello-world/package.json +17 -0
- package/dist/templates/hello-world/src/actions/index.ts +19 -0
- package/dist/templates/hello-world/src/conversations/index.ts +10 -0
- package/dist/templates/hello-world/src/knowledge/index.ts +17 -0
- package/dist/templates/hello-world/src/tables/index.ts +19 -0
- package/dist/templates/hello-world/src/triggers/index.ts +20 -0
- package/dist/templates/hello-world/src/workflows/index.ts +23 -0
- package/dist/templates/hello-world/tsconfig.json +22 -0
- package/dist/templates/knowledge-assistant/README.md +66 -0
- package/dist/templates/knowledge-assistant/agent.config.ts +26 -0
- package/dist/templates/knowledge-assistant/package.json +17 -0
- package/dist/templates/knowledge-assistant/src/actions/index.ts +19 -0
- package/dist/templates/knowledge-assistant/src/actions/search-docs.ts +50 -0
- package/dist/templates/knowledge-assistant/src/conversations/index.ts +33 -0
- package/dist/templates/knowledge-assistant/src/knowledge/docs.ts +23 -0
- package/dist/templates/knowledge-assistant/src/knowledge/getting-started.md +49 -0
- package/dist/templates/knowledge-assistant/src/tables/index.ts +21 -0
- package/dist/templates/knowledge-assistant/src/triggers/index.ts +17 -0
- package/dist/templates/knowledge-assistant/src/workflows/index.ts +28 -0
- package/dist/templates/knowledge-assistant/tsconfig.json +22 -0
- package/dist/templates/slack-triage/README.md +74 -0
- package/dist/templates/slack-triage/agent.config.ts +35 -0
- package/dist/templates/slack-triage/evals/triage-basic.eval.ts +55 -0
- package/dist/templates/slack-triage/package.json +17 -0
- package/dist/templates/slack-triage/src/actions/classify-request.ts +65 -0
- package/dist/templates/slack-triage/src/conversations/slack-dm.ts +72 -0
- package/dist/templates/slack-triage/src/knowledge/team-directory.md +33 -0
- package/dist/templates/slack-triage/src/tables/routing-rules.ts +38 -0
- package/dist/templates/slack-triage/src/triggers/new-message.ts +44 -0
- package/dist/templates/slack-triage/src/workflows/triage-flow.ts +104 -0
- package/dist/templates/slack-triage/tsconfig.json +22 -0
- package/dist/templates/template.config.json +47 -0
- package/dist/utils/json-ordering.d.ts +5 -4
- package/dist/utils/json-ordering.d.ts.map +1 -1
- package/package.json +31 -38
package/dist/index.js.map
CHANGED
|
@@ -1,108 +1,109 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/agent-project/types.ts", "../src/agent-project/validation-errors.ts", "../src/constants.ts", "../src/agent-project/agent-resolver.ts", "../src/auth/credentials.ts", "../src/utils/fs.ts", "../src/generators/utils.ts", "../src/generators/action-types.ts", "../src/generators/integration-action-types.ts", "../src/auth/index.ts", "../src/auth/service.ts", "../src/auth/bp-cli-import.ts", "../src/commands/base-command.ts", "../src/commands/bp-add-command.ts", "../src/commands/bp-cli.ts", "../src/commands/bp-build-command.ts", "../src/utils/source-map-optimizer.ts", "../src/commands/bp-deploy-command.ts", "../src/commands/bp-dev-command.ts", "../src/commands/bp-chat-command.ts", "../src/commands/opencode-command.ts", "../src/commands/opencode-config.ts", "../src/workspace/workspace-cache.ts", "../src/utils/time.ts", "../src/utils/require-chat.ts", "../src/utils/json-ordering.ts", "../src/agent-project/agent-project.ts", "../src/assets/manager.ts", "../src/assets/cache.ts", "../src/const.ts", "../src/assets/updater.ts", "../src/integrations/manager.ts", "../src/integrations/enhanced-cache.ts", "../src/agent-project/dependencies-parser.ts", "../src/integrations/cache.ts", "../src/integrations/operations.ts", "../src/integrations/hub-cache.ts", "../src/agent-project/config-writer.ts", "../src/integrations/checker.ts", "../src/integrations/config-utils.ts", "../src/integrations/sync-manager.ts", "../src/interfaces/manager.ts", "../src/interfaces/enhanced-cache.ts", "../src/interfaces/parser.ts", "../src/interfaces/operations.ts", "../src/agent-project/expand-exports.ts", "../src/agent-project/file-watcher.ts", "../src/agent-project/index.ts", "../src/config/manager.ts", "../src/config/coerce-config-value.ts", "../src/agent-init/agent-project-generator.ts", "../src/plugins/enhanced-cache.ts", "../src/plugins/manager.ts", "../src/generators/assets.ts", "../src/generators/integration-types.ts", "../src/utils/strings.ts", "../src/utils/ids.ts", "../src/generators/client-wrapper.ts", "../src/bot-generator/generator.ts", "../src/generators/plugin-types.ts", "../src/generators/plugin-action-types.ts", "../src/generators/interface-types.ts", "../src/generators/table-types.ts", "../src/generators/trigger-types.ts", "../src/generators/state-types.ts", "../src/generators/tag-types.ts", "../src/generators/configuration-types.ts", "../src/generators/workflow-types.ts", "../src/generators/conversation-types.ts", "../src/generators/event-types.ts", "../src/utils/link-sdk.ts", "../src/bot-generator/dev-id-manager.ts", "../src/bot-generator/integration-sync.ts", "../src/bot-generator/interface-sync.ts", "../src/bot-generator/plugin-sync.ts", "../src/tables/table-manager.ts", "../src/knowledge/manager.ts", "../src/knowledge/types.ts", "../src/knowledge/sync-formatter.ts", "../src/file-watcher/watcher.ts", "../src/preflight/checker.ts", "../src/preflight/types.ts", "../src/preflight/agent-config-sync.ts", "../src/preflight/formatter.ts", "../src/runner/script-runner.ts", "../src/eval/types.ts", "../src/eval/loader.ts", "../src/eval/runner.ts", "../src/eval/client.ts", "../src/eval/traces.ts", "../src/eval/graders/llm.ts", "../src/eval/graders/response.ts", "../src/eval/graders/match.ts", "../src/eval/graders/tools.ts", "../src/eval/graders/state.ts", "../src/eval/graders/tables.ts", "../src/eval/graders/workflow.ts", "../src/eval/graders/outcome.ts", "../src/eval/store.ts"],
|
|
3
|
+
"sources": ["../src/agent-project/types.ts", "../src/agent-project/validation-errors.ts", "../src/constants.ts", "../src/agent-project/agent-resolver.ts", "../src/auth/credentials.ts", "../src/utils/fs.ts", "../src/generators/utils.ts", "../src/generators/action-types.ts", "../src/generators/integration-action-types.ts", "../src/auth/index.ts", "../src/auth/service.ts", "../src/auth/bp-cli-import.ts", "../src/commands/base-command.ts", "../src/commands/bp-add-command.ts", "../src/commands/bp-cli.ts", "../src/commands/bp-build-command.ts", "../src/utils/source-map-optimizer.ts", "../src/commands/bp-deploy-command.ts", "../src/commands/bp-dev-command.ts", "../src/commands/bp-chat-command.ts", "../src/commands/opencode-command.ts", "../src/commands/opencode-config.ts", "../src/workspace/workspace-cache.ts", "../src/utils/time.ts", "../src/utils/require-chat.ts", "../src/utils/json-ordering.ts", "../src/agent-project/agent-project.ts", "../src/assets/manager.ts", "../src/assets/cache.ts", "../src/const.ts", "../src/assets/updater.ts", "../src/integrations/manager.ts", "../src/integrations/enhanced-cache.ts", "../src/agent-project/dependencies-parser.ts", "../src/integrations/cache.ts", "../src/integrations/operations.ts", "../src/integrations/hub-cache.ts", "../src/agent-project/config-writer.ts", "../src/integrations/checker.ts", "../src/integrations/config-utils.ts", "../src/integrations/sync-manager.ts", "../src/interfaces/manager.ts", "../src/interfaces/enhanced-cache.ts", "../src/interfaces/parser.ts", "../src/interfaces/operations.ts", "../src/agent-project/expand-exports.ts", "../src/agent-project/file-watcher.ts", "../src/agent-project/index.ts", "../src/config/manager.ts", "../src/config/coerce-config-value.ts", "../src/agent-init/agent-project-generator.ts", "../src/plugins/enhanced-cache.ts", "../src/plugins/manager.ts", "../src/generators/assets.ts", "../src/generators/integration-types.ts", "../src/utils/strings.ts", "../src/utils/ids.ts", "../src/generators/client-wrapper.ts", "../src/bot-generator/generator.ts", "../src/generators/plugin-types.ts", "../src/generators/plugin-action-types.ts", "../src/generators/interface-types.ts", "../src/generators/table-types.ts", "../src/generators/trigger-types.ts", "../src/generators/state-types.ts", "../src/generators/tag-types.ts", "../src/generators/configuration-types.ts", "../src/generators/workflow-types.ts", "../src/generators/conversation-types.ts", "../src/generators/event-types.ts", "../src/utils/link-sdk.ts", "../src/bot-generator/dev-id-manager.ts", "../src/bot-generator/integration-sync.ts", "../src/bot-generator/interface-sync.ts", "../src/bot-generator/plugin-sync.ts", "../src/tables/table-manager.ts", "../src/knowledge/manager.ts", "../src/knowledge/types.ts", "../src/knowledge/sync-formatter.ts", "../src/file-watcher/watcher.ts", "../src/preflight/checker.ts", "../src/preflight/types.ts", "../src/preflight/agent-config-sync.ts", "../src/preflight/formatter.ts", "../src/runner/script-runner.ts", "../src/eval/types.ts", "../src/eval/loader.ts", "../src/eval/runner.ts", "../src/eval/client.ts", "../src/eval/traces.ts", "../src/eval/graders/llm.ts", "../src/eval/graders/response.ts", "../src/eval/graders/match.ts", "../src/eval/graders/tools.ts", "../src/eval/graders/state.ts", "../src/eval/graders/tables.ts", "../src/eval/graders/workflow.ts", "../src/eval/graders/timing.ts", "../src/eval/graders/outcome.ts", "../src/eval/store.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { z } from '@botpress/sdk'\nimport { defineConfig } from '@botpress/runtime'\nimport { ValidationErrors } from './validation-errors'\n\nexport type AgentConfig = ReturnType<typeof defineConfig>\n\n// Plugin dependency mapping schema (matches SDK's PluginConfigInstance.dependencies)\nconst pluginDependencyMappingSchema = z.object({\n integrationAlias: z.string(),\n integrationInterfaceAlias: z.string().optional(), // present for interface deps, absent for integration deps\n})\n\n// Dependencies schema\nexport const dependenciesSchema = z.object({\n integrations: z\n .record(\n z.object({\n
|
|
6
|
-
"import { ValidationError, ValidationErrorCode, ValidationSeverity } from './types.js'\n\n/**\n * Factory functions for creating consistent validation errors\n */\n\nexport class ValidationErrors {\n static $type = 'ValidationError' as const\n\n /**\n * Type guard to check if an error is a ValidationError\n */\n static isValidationError(error: unknown): error is ValidationError {\n return (\n error !== null &&\n typeof error === 'object' &&\n '$type' in error &&\n error.$type === 'ValidationError'\n )\n }\n\n // Project structure errors\n static directoryNotFound(path: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.DIRECTORY_NOT_FOUND,\n severity: ValidationSeverity.ERROR,\n message: `Project directory not found: ${path}`,\n hint: 'Ensure the directory exists and you have permission to access it',\n context: { path },\n }\n }\n\n static directoryAccessError(path: string, error: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.DIRECTORY_ACCESS_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Cannot access project directory: ${error}`,\n hint: 'Check file system permissions',\n context: { path, error },\n }\n }\n\n static requiredFileMissing(file: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.REQUIRED_FILE_MISSING,\n severity: ValidationSeverity.ERROR,\n message: `Required file '${file}' not found`,\n file,\n hint: `Create a ${file} file in your project root`,\n documentation: 'https://docs.botpress.com/adk/project-structure',\n }\n }\n\n static invalidStructure(directory: string, expected: 'directory' | 'file'): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_STRUCTURE,\n severity: ValidationSeverity.WARNING,\n message: `Expected '${directory}' to be a ${expected}`,\n file: directory,\n hint: `Ensure ${directory} is a ${expected}, not a ${expected === 'directory' ? 'file' : 'directory'}`,\n }\n }\n\n // Configuration errors\n static invalidConfigSyntax(file: string, error: string, line?: number, column?: number): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_CONFIG_SYNTAX,\n severity: ValidationSeverity.ERROR,\n message: `Invalid syntax in ${file}: ${error}`,\n file,\n line,\n column,\n hint: 'Check for syntax errors like missing commas, brackets, or quotes',\n }\n }\n\n static invalidConfigSchema(file: string, field: string, error: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_CONFIG_SCHEMA,\n severity: ValidationSeverity.ERROR,\n message: `Invalid configuration in ${file}: ${error}`,\n file,\n hint: `Check the '${field}' field matches the expected schema`,\n context: { field, error },\n }\n }\n\n static missingRequiredField(file: string, field: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.MISSING_REQUIRED_FIELD,\n severity: ValidationSeverity.ERROR,\n message: `Missing required field '${field}' in ${file}`,\n file,\n hint: `Add the '${field}' field to your configuration`,\n documentation: 'https://docs.botpress.com/adk/configuration',\n }\n }\n\n // Dependencies errors\n static invalidDependenciesSyntax(error: string, line?: number): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_DEPENDENCIES_SYNTAX,\n severity: ValidationSeverity.ERROR,\n message: `Invalid syntax in agent.config.ts dependencies: ${error}`,\n file: 'agent.config.ts',\n line,\n hint: 'Ensure agent.config.ts exports a valid dependencies object',\n }\n }\n\n static invalidVersionFormat(integration: string, version: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_VERSION_FORMAT,\n severity: ValidationSeverity.ERROR,\n message: `Invalid version format '${version}' for integration '${integration}'`,\n file: 'agent.config.ts',\n hint: 'Use exact versioning (e.g., \"1.2.3\", \"2.0.0\", \"1.5.0\")',\n context: { integration, version },\n }\n }\n\n static invalidIntegrationAlias(alias: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_INTEGRATION_ALIAS,\n severity: ValidationSeverity.ERROR,\n message: `Invalid integration alias '${alias}'`,\n file: 'agent.config.ts',\n hint: 'Integration aliases must be 2-100 characters and contain only lowercase letters, numbers, underscores, and hyphens (e.g., \"slack\", \"my-slack\", \"slack_prod\")',\n context: { alias },\n }\n }\n\n static unknownIntegration(integration: string, source: string, detailedMessage?: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.UNKNOWN_INTEGRATION,\n severity: ValidationSeverity.ERROR,\n message: detailedMessage || `Unknown integration '${integration}' from source '${source}'`,\n file: 'agent.config.ts',\n hint: detailedMessage ? undefined : `Check if the integration name is correct or if it exists in ${source}`,\n context: { integration, source },\n }\n }\n\n static integrationVersionError(integration: string, errorMessage: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.UNKNOWN_INTEGRATION,\n severity: ValidationSeverity.ERROR,\n message: errorMessage,\n file: 'agent.config.ts',\n hint: `Update the version for \"${integration}\" in agent.config.ts dependencies`,\n }\n }\n\n static unknownInterface(errorMessage: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.UNKNOWN_INTEGRATION,\n severity: ValidationSeverity.ERROR,\n message: errorMessage,\n file: 'agent.config.ts',\n }\n }\n\n static incompatibleVersion(integration: string, required: string, available: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INCOMPATIBLE_VERSION,\n severity: ValidationSeverity.ERROR,\n message: `Integration '${integration}' requires version ${required}, but only ${available} is available`,\n file: 'agent.config.ts',\n hint: 'Update the version requirement or check for compatible versions',\n context: { integration, required, available },\n }\n }\n\n // Plugin errors\n static invalidPluginAlias(alias: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_PLUGIN_ALIAS,\n severity: ValidationSeverity.ERROR,\n message: `Invalid plugin alias '${alias}'`,\n file: 'agent.config.ts',\n hint: 'Plugin aliases must be 2-100 characters and contain only lowercase letters, numbers, underscores, and hyphens (e.g., \"hitl\", \"my-plugin\")',\n context: { alias },\n }\n }\n\n static invalidPluginVersionFormat(plugin: string, version: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_VERSION_FORMAT,\n severity: ValidationSeverity.ERROR,\n message: `Invalid version format '${version}' for plugin '${plugin}'`,\n file: 'agent.config.ts',\n hint: 'Use exact versioning (e.g., \"1.2.3\", \"2.0.0\", \"1.5.0\")',\n context: { plugin, version },\n }\n }\n\n static unknownPlugin(plugin: string, source: string, detailedMessage?: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.UNKNOWN_PLUGIN,\n severity: ValidationSeverity.ERROR,\n message: detailedMessage || `Unknown plugin '${plugin}' from source '${source}'`,\n file: 'agent.config.ts',\n hint: detailedMessage ? undefined : `Check if the plugin name is correct or if it exists on the Botpress Hub`,\n context: { plugin, source },\n }\n }\n\n static invalidPluginDependency(plugin: string, integrationAlias: string, availableIntegrations: string[]): ValidationError {\n const available = availableIntegrations.length > 0 ? availableIntegrations.join(', ') : '(none)'\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_PLUGIN_DEPENDENCY,\n severity: ValidationSeverity.ERROR,\n message: `Plugin \"${plugin}\" references integration \"${integrationAlias}\" in its dependencies, but \"${integrationAlias}\" is not declared in dependencies.integrations`,\n file: 'agent.config.ts',\n hint: `Add \"${integrationAlias}\" to dependencies.integrations, or update the plugin dependency to reference one of: ${available}`,\n context: { plugin, integrationAlias, availableIntegrations },\n }\n }\n\n static pluginVersionError(plugin: string, errorMessage: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.UNKNOWN_PLUGIN,\n severity: ValidationSeverity.ERROR,\n message: errorMessage,\n file: 'agent.config.ts',\n hint: `Update the version for \"${plugin}\" in agent.config.ts dependencies`,\n }\n }\n\n // File errors\n static fileTooLarge(file: string, size: number, maxSize: number): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.FILE_TOO_LARGE,\n severity: ValidationSeverity.ERROR,\n message: `File '${file}' is too large (${formatBytes(size)} > ${formatBytes(maxSize)})`,\n file,\n hint: 'Reduce file size or split into smaller files',\n context: { size, maxSize },\n }\n }\n\n static invalidFileType(file: string, type: string, allowedTypes: string[]): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_FILE_TYPE,\n severity: ValidationSeverity.ERROR,\n message: `Invalid file type '${type}' for file '${file}'`,\n file,\n hint: `Allowed file types: ${allowedTypes.join(', ')}`,\n context: { type, allowedTypes },\n }\n }\n\n static invalidFileName(file: string, reason: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_FILE_NAME,\n severity: ValidationSeverity.ERROR,\n message: `Invalid file name '${file}': ${reason}`,\n file,\n hint: 'Use lowercase letters, numbers, and hyphens only',\n }\n }\n\n static duplicateFileName(file: string, existingFile: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.DUPLICATE_FILE_NAME,\n severity: ValidationSeverity.ERROR,\n message: `Duplicate file name '${file}' conflicts with '${existingFile}'`,\n file,\n hint: 'Rename one of the files to avoid conflicts',\n context: { existingFile },\n }\n }\n\n // Runtime errors\n static buildFailed(error: string, file?: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.BUILD_FAILED,\n severity: ValidationSeverity.ERROR,\n message: `Build failed: ${error}`,\n file,\n hint: 'Check the error message and fix any issues in your code',\n }\n }\n\n static syntaxError(file: string, error: string, line?: number, column?: number): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.SYNTAX_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Syntax error: ${error}`,\n file,\n line,\n column,\n hint: 'Check for missing semicolons, brackets, or other syntax issues',\n }\n }\n\n static typeError(file: string, error: string, line?: number): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.TYPE_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Type error: ${error}`,\n file,\n line,\n hint: 'Ensure types match expected values and imports are correct',\n }\n }\n\n static importError(file: string, module: string, error: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.IMPORT_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Cannot import '${module}': ${error}`,\n file,\n hint: 'Check if the module exists and is properly installed',\n context: { module },\n }\n }\n\n // Knowledge errors\n static unsafeKnowledgePath(knowledgeBase: string, pattern: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_FILE_NAME,\n severity: ValidationSeverity.ERROR,\n message: `Knowledge base '${knowledgeBase}' contains unsafe path pattern '${pattern}'`,\n file: `src/knowledge/${knowledgeBase}.ts`,\n hint: 'Knowledge patterns must not reference files outside the agent directory (remove ../ or absolute paths)',\n context: { knowledgeBase, pattern },\n }\n }\n\n // Agent linking errors\n static agentNotLinked(): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.AGENT_NOT_LINKED,\n severity: ValidationSeverity.ERROR,\n message: 'Agent is not linked to a workspace',\n file: 'agent.json',\n hint: 'Please run \"adk link\" to link your agent to a workspace',\n }\n }\n\n static workspaceIdMissing(): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.AGENT_NOT_LINKED,\n severity: ValidationSeverity.ERROR,\n message: 'No workspaceId found in agent.json',\n file: 'agent.json',\n hint: 'Please run \"adk link\" to link your agent to a workspace',\n }\n }\n\n static botIdMissing(): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.AGENT_NOT_LINKED,\n severity: ValidationSeverity.ERROR,\n message: 'No botId found in agent.json',\n file: 'agent.json',\n hint: 'Please run \"adk link\" to link your agent to a bot',\n }\n }\n\n // Utility functions\n static info(message: string, file?: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_STRUCTURE, // Generic code for info\n severity: ValidationSeverity.INFO,\n message,\n file,\n }\n }\n\n static warning(message: string, file?: string, hint?: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_STRUCTURE, // Generic code for warnings\n severity: ValidationSeverity.WARNING,\n message,\n file,\n hint,\n }\n }\n}\n\n// Helper function to format bytes\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n",
|
|
5
|
+
"import { z } from '@botpress/sdk'\nimport { defineConfig } from '@botpress/runtime'\nimport { ValidationErrors } from './validation-errors'\n\nexport type AgentConfig = ReturnType<typeof defineConfig>\n\n// Plugin dependency mapping schema (matches SDK's PluginConfigInstance.dependencies)\nconst pluginDependencyMappingSchema = z.object({\n integrationAlias: z.string(),\n integrationInterfaceAlias: z.string().optional(), // present for interface deps, absent for integration deps\n})\n\n// Dependencies schema\nexport const dependenciesSchema = z.object({\n integrations: z\n .record(\n z.union([\n z.string(), // Shorthand: \"chat@1.0.0\" — server-managed enabled state, disabled on first install\n z.object({\n version: z.string(),\n enabled: z.boolean(), // Whether the integration is enabled\n configurationType: z.string().optional(), // Type of configuration (e.g., \"refreshToken\", \"apiKey\")\n config: z.record(z.any()).optional(), // Local config overrides (non-secret)\n }),\n ])\n )\n .optional(),\n plugins: z\n .record(\n z.object({\n version: z.string(),\n config: z.record(z.any()).optional(),\n dependencies: z.record(pluginDependencyMappingSchema).optional(),\n })\n )\n .optional(),\n})\n\nexport type Dependencies = z.infer<typeof dependenciesSchema>\n\n// Agent deployment info schema\nexport const agentInfoSchema = z.object({\n botId: z.string().describe('The bot ID from Botpress deployment'),\n workspaceId: z.string().describe('The workspace ID where the bot is deployed'),\n apiUrl: z.string().optional().describe('The Botpress API URL (e.g., https://api.botpress.cloud)'),\n devId: z.string().optional().describe('The development ID used during local development'),\n})\n\nexport type AgentInfo = z.infer<typeof agentInfoSchema>\n\n// Agent local info schema (for agent.local.json — gitignored, per-developer overrides)\nexport const agentLocalInfoSchema = z.object({\n botId: z.string().optional().describe('The bot ID (overrides agent.json for local development)'),\n workspaceId: z.string().optional().describe('The workspace ID (overrides agent.json for local development)'),\n apiUrl: z.string().optional().describe('The Botpress API URL (overrides agent.json for local development)'),\n devId: z.string().optional().describe('The development bot ID used during local development'),\n})\nexport type AgentLocalInfo = z.infer<typeof agentLocalInfoSchema>\n\n// File change event types\nexport enum FileChangeType {\n Added = 'added',\n Modified = 'modified',\n Deleted = 'deleted',\n}\n\nexport interface FileChangeEvent {\n type: FileChangeType\n path: string\n relativePath: string\n}\n\n// Build event types\nexport enum BuildEventType {\n Started = 'started',\n Progress = 'progress',\n Success = 'success',\n Error = 'error',\n Warning = 'warning',\n}\n\nexport interface BuildEvent {\n type: BuildEventType\n message?: string\n error?: Error\n warnings?: string[]\n}\n\n// Validation error codes\nexport enum ValidationErrorCode {\n // Project structure errors\n DIRECTORY_NOT_FOUND = 'DIRECTORY_NOT_FOUND',\n DIRECTORY_ACCESS_ERROR = 'DIRECTORY_ACCESS_ERROR',\n REQUIRED_FILE_MISSING = 'REQUIRED_FILE_MISSING',\n INVALID_STRUCTURE = 'INVALID_STRUCTURE',\n\n // Configuration errors\n INVALID_CONFIG_SYNTAX = 'INVALID_CONFIG_SYNTAX',\n INVALID_CONFIG_SCHEMA = 'INVALID_CONFIG_SCHEMA',\n MISSING_REQUIRED_FIELD = 'MISSING_REQUIRED_FIELD',\n AGENT_NOT_LINKED = 'AGENT_NOT_LINKED',\n\n // Dependencies errors\n INVALID_DEPENDENCIES_SYNTAX = 'INVALID_DEPENDENCIES_SYNTAX',\n INVALID_DEPENDENCIES_SCHEMA = 'INVALID_DEPENDENCIES_SCHEMA',\n INVALID_VERSION_FORMAT = 'INVALID_VERSION_FORMAT',\n INVALID_INTEGRATION_ALIAS = 'INVALID_INTEGRATION_ALIAS',\n INVALID_PLUGIN_ALIAS = 'INVALID_PLUGIN_ALIAS',\n UNKNOWN_INTEGRATION = 'UNKNOWN_INTEGRATION',\n UNKNOWN_PLUGIN = 'UNKNOWN_PLUGIN',\n INVALID_PLUGIN_DEPENDENCY = 'INVALID_PLUGIN_DEPENDENCY',\n INCOMPATIBLE_VERSION = 'INCOMPATIBLE_VERSION',\n CIRCULAR_DEPENDENCY = 'CIRCULAR_DEPENDENCY',\n\n // File errors\n FILE_TOO_LARGE = 'FILE_TOO_LARGE',\n INVALID_FILE_TYPE = 'INVALID_FILE_TYPE',\n INVALID_FILE_NAME = 'INVALID_FILE_NAME',\n DUPLICATE_FILE_NAME = 'DUPLICATE_FILE_NAME',\n DUPLICATE_PRIMITIVE = 'DUPLICATE_PRIMITIVE',\n INVALID_PRIMITIVE_DEFINITION = 'INVALID_PRIMITIVE_DEFINITION',\n\n // Runtime errors\n BUILD_FAILED = 'BUILD_FAILED',\n SYNTAX_ERROR = 'SYNTAX_ERROR',\n TYPE_ERROR = 'TYPE_ERROR',\n IMPORT_ERROR = 'IMPORT_ERROR',\n}\n\n// Validation severity levels\nexport enum ValidationSeverity {\n ERROR = 'error',\n WARNING = 'warning',\n INFO = 'info',\n}\n\n// Enhanced validation error interface\nexport interface ValidationError {\n $type: typeof ValidationErrors.$type\n code: ValidationErrorCode\n severity: ValidationSeverity\n message: string\n file?: string\n line?: number\n column?: number\n hint?: string\n documentation?: string\n context?: Record<string, unknown>\n}\n\n// Validation result with categorized errors\nexport interface ValidationResult {\n valid: boolean\n errors: ValidationError[]\n warnings: ValidationError[]\n info: ValidationError[]\n errorCount: number\n warningCount: number\n infoCount: number\n}\n\n// Agent project state\nexport enum ProjectState {\n Unloaded = 'unloaded',\n Loading = 'loading',\n Ready = 'ready',\n Building = 'building',\n Error = 'error',\n}\n\n// Build output types\nexport interface BuildOutput {\n files: Map<string, Buffer | string>\n metadata: {\n buildTime: Date\n version?: string\n checksum?: string\n }\n}\n\n// Watch options\nexport interface WatchOptions {\n ignore?: string[]\n debounce?: number\n autoBuild?: boolean\n}\n\n// Integration types\nexport interface Integration {\n name: string\n version: string\n workspace?: string // Optional workspace name\n config?: Record<string, unknown>\n installed?: boolean\n installedVersion?: string\n hasChannels?: boolean\n}\n\nexport interface IntegrationChange {\n type: 'install' | 'update' | 'uninstall'\n integration: Integration\n from?: string // For updates: from version\n to?: string // For updates: to version\n}\n\nexport interface IntegrationSyncResult {\n changes: IntegrationChange[]\n applied: boolean\n errors?: Error[]\n}\n\nexport interface AgentToolDefinition {\n name: string\n description?: string\n}\n\nexport interface ToolReference {\n path: string\n export: string\n definition: AgentToolDefinition\n}\n\n// Project info\nexport interface ProjectInfo {\n path: string\n config: AgentConfig\n dependencies: Dependencies\n agentInfo?: AgentInfo // Optional deployment information\n state: ProjectState\n lastBuildTime?: Date\n errors: ValidationError[]\n warnings: ValidationError[]\n errorCount: number\n warningCount: number\n infoCount: number\n integrations?: Integration[] // Parsed integrations from dependencies\n}\n\nexport type IntegrationDependency = {\n type: 'integration'\n integration: {\n name: string\n version: string\n enabled: boolean\n }\n}\n\nexport type InterfaceDependency = {\n type: 'interface'\n interface: {\n name: string\n version: string\n }\n}\n\nexport type PluginDependency = {\n type: 'plugin'\n plugin: {\n name: string\n version: string\n }\n}\n\nexport type Dependency = IntegrationDependency | InterfaceDependency | PluginDependency\n",
|
|
6
|
+
"import { ValidationError, ValidationErrorCode, ValidationSeverity } from './types.js'\n\n/**\n * Factory functions for creating consistent validation errors\n */\n\nexport class ValidationErrors {\n static $type = 'ValidationError' as const\n\n /**\n * Type guard to check if an error is a ValidationError\n */\n static isValidationError(error: unknown): error is ValidationError {\n return error !== null && typeof error === 'object' && '$type' in error && error.$type === 'ValidationError'\n }\n\n // Project structure errors\n static directoryNotFound(path: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.DIRECTORY_NOT_FOUND,\n severity: ValidationSeverity.ERROR,\n message: `Project directory not found: ${path}`,\n hint: 'Ensure the directory exists and you have permission to access it',\n context: { path },\n }\n }\n\n static directoryAccessError(path: string, error: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.DIRECTORY_ACCESS_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Cannot access project directory: ${error}`,\n hint: 'Check file system permissions',\n context: { path, error },\n }\n }\n\n static requiredFileMissing(file: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.REQUIRED_FILE_MISSING,\n severity: ValidationSeverity.ERROR,\n message: `Required file '${file}' not found`,\n file,\n hint: `Create a ${file} file in your project root`,\n documentation: 'https://docs.botpress.com/adk/project-structure',\n }\n }\n\n static invalidStructure(directory: string, expected: 'directory' | 'file'): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_STRUCTURE,\n severity: ValidationSeverity.WARNING,\n message: `Expected '${directory}' to be a ${expected}`,\n file: directory,\n hint: `Ensure ${directory} is a ${expected}, not a ${expected === 'directory' ? 'file' : 'directory'}`,\n }\n }\n\n // Configuration errors\n static invalidConfigSyntax(file: string, error: string, line?: number, column?: number): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_CONFIG_SYNTAX,\n severity: ValidationSeverity.ERROR,\n message: `Invalid syntax in ${file}: ${error}`,\n file,\n line,\n column,\n hint: 'Check for syntax errors like missing commas, brackets, or quotes',\n }\n }\n\n static invalidConfigSchema(file: string, field: string, error: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_CONFIG_SCHEMA,\n severity: ValidationSeverity.ERROR,\n message: `Invalid configuration in ${file}: ${error}`,\n file,\n hint: `Check the '${field}' field matches the expected schema`,\n context: { field, error },\n }\n }\n\n static missingRequiredField(file: string, field: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.MISSING_REQUIRED_FIELD,\n severity: ValidationSeverity.ERROR,\n message: `Missing required field '${field}' in ${file}`,\n file,\n hint: `Add the '${field}' field to your configuration`,\n documentation: 'https://docs.botpress.com/adk/configuration',\n }\n }\n\n // Dependencies errors\n static invalidDependenciesSyntax(error: string, line?: number): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_DEPENDENCIES_SYNTAX,\n severity: ValidationSeverity.ERROR,\n message: `Invalid syntax in agent.config.ts dependencies: ${error}`,\n file: 'agent.config.ts',\n line,\n hint: 'Ensure agent.config.ts exports a valid dependencies object',\n }\n }\n\n static invalidVersionFormat(integration: string, version: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_VERSION_FORMAT,\n severity: ValidationSeverity.ERROR,\n message: `Invalid version format '${version}' for integration '${integration}'`,\n file: 'agent.config.ts',\n hint: 'Use exact versioning (e.g., \"1.2.3\", \"2.0.0\", \"1.5.0\")',\n context: { integration, version },\n }\n }\n\n static invalidIntegrationAlias(alias: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_INTEGRATION_ALIAS,\n severity: ValidationSeverity.ERROR,\n message: `Invalid integration alias '${alias}'`,\n file: 'agent.config.ts',\n hint: 'Integration aliases must be 2-100 characters and contain only lowercase letters, numbers, underscores, and hyphens (e.g., \"slack\", \"my-slack\", \"slack_prod\")',\n context: { alias },\n }\n }\n\n static unknownIntegration(integration: string, source: string, detailedMessage?: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.UNKNOWN_INTEGRATION,\n severity: ValidationSeverity.ERROR,\n message: detailedMessage || `Unknown integration '${integration}' from source '${source}'`,\n file: 'agent.config.ts',\n hint: detailedMessage ? undefined : `Check if the integration name is correct or if it exists in ${source}`,\n context: { integration, source },\n }\n }\n\n static integrationVersionError(integration: string, errorMessage: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.UNKNOWN_INTEGRATION,\n severity: ValidationSeverity.ERROR,\n message: errorMessage,\n file: 'agent.config.ts',\n hint: `Update the version for \"${integration}\" in agent.config.ts dependencies`,\n }\n }\n\n static unknownInterface(errorMessage: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.UNKNOWN_INTEGRATION,\n severity: ValidationSeverity.ERROR,\n message: errorMessage,\n file: 'agent.config.ts',\n }\n }\n\n static incompatibleVersion(integration: string, required: string, available: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INCOMPATIBLE_VERSION,\n severity: ValidationSeverity.ERROR,\n message: `Integration '${integration}' requires version ${required}, but only ${available} is available`,\n file: 'agent.config.ts',\n hint: 'Update the version requirement or check for compatible versions',\n context: { integration, required, available },\n }\n }\n\n // Plugin errors\n static invalidPluginAlias(alias: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_PLUGIN_ALIAS,\n severity: ValidationSeverity.ERROR,\n message: `Invalid plugin alias '${alias}'`,\n file: 'agent.config.ts',\n hint: 'Plugin aliases must be 2-100 characters and contain only lowercase letters, numbers, underscores, and hyphens (e.g., \"hitl\", \"my-plugin\")',\n context: { alias },\n }\n }\n\n static invalidPluginVersionFormat(plugin: string, version: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_VERSION_FORMAT,\n severity: ValidationSeverity.ERROR,\n message: `Invalid version format '${version}' for plugin '${plugin}'`,\n file: 'agent.config.ts',\n hint: 'Use exact versioning (e.g., \"1.2.3\", \"2.0.0\", \"1.5.0\")',\n context: { plugin, version },\n }\n }\n\n static unknownPlugin(plugin: string, source: string, detailedMessage?: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.UNKNOWN_PLUGIN,\n severity: ValidationSeverity.ERROR,\n message: detailedMessage || `Unknown plugin '${plugin}' from source '${source}'`,\n file: 'agent.config.ts',\n hint: detailedMessage ? undefined : `Check if the plugin name is correct or if it exists on the Botpress Hub`,\n context: { plugin, source },\n }\n }\n\n static invalidPluginDependency(\n plugin: string,\n integrationAlias: string,\n availableIntegrations: string[]\n ): ValidationError {\n const available = availableIntegrations.length > 0 ? availableIntegrations.join(', ') : '(none)'\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_PLUGIN_DEPENDENCY,\n severity: ValidationSeverity.ERROR,\n message: `Plugin \"${plugin}\" references integration \"${integrationAlias}\" in its dependencies, but \"${integrationAlias}\" is not declared in dependencies.integrations`,\n file: 'agent.config.ts',\n hint: `Add \"${integrationAlias}\" to dependencies.integrations, or update the plugin dependency to reference one of: ${available}`,\n context: { plugin, integrationAlias, availableIntegrations },\n }\n }\n\n static pluginVersionError(plugin: string, errorMessage: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.UNKNOWN_PLUGIN,\n severity: ValidationSeverity.ERROR,\n message: errorMessage,\n file: 'agent.config.ts',\n hint: `Update the version for \"${plugin}\" in agent.config.ts dependencies`,\n }\n }\n\n // File errors\n static fileTooLarge(file: string, size: number, maxSize: number): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.FILE_TOO_LARGE,\n severity: ValidationSeverity.ERROR,\n message: `File '${file}' is too large (${formatBytes(size)} > ${formatBytes(maxSize)})`,\n file,\n hint: 'Reduce file size or split into smaller files',\n context: { size, maxSize },\n }\n }\n\n static invalidFileType(file: string, type: string, allowedTypes: string[]): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_FILE_TYPE,\n severity: ValidationSeverity.ERROR,\n message: `Invalid file type '${type}' for file '${file}'`,\n file,\n hint: `Allowed file types: ${allowedTypes.join(', ')}`,\n context: { type, allowedTypes },\n }\n }\n\n static invalidFileName(file: string, reason: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_FILE_NAME,\n severity: ValidationSeverity.ERROR,\n message: `Invalid file name '${file}': ${reason}`,\n file,\n hint: 'Use lowercase letters, numbers, and hyphens only',\n }\n }\n\n static duplicateFileName(file: string, existingFile: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.DUPLICATE_FILE_NAME,\n severity: ValidationSeverity.ERROR,\n message: `Duplicate file name '${file}' conflicts with '${existingFile}'`,\n file,\n hint: 'Rename one of the files to avoid conflicts',\n context: { existingFile },\n }\n }\n\n // Runtime errors\n static buildFailed(error: string, file?: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.BUILD_FAILED,\n severity: ValidationSeverity.ERROR,\n message: `Build failed: ${error}`,\n file,\n hint: 'Check the error message and fix any issues in your code',\n }\n }\n\n static syntaxError(file: string, error: string, line?: number, column?: number): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.SYNTAX_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Syntax error: ${error}`,\n file,\n line,\n column,\n hint: 'Check for missing semicolons, brackets, or other syntax issues',\n }\n }\n\n static typeError(file: string, error: string, line?: number): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.TYPE_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Type error: ${error}`,\n file,\n line,\n hint: 'Ensure types match expected values and imports are correct',\n }\n }\n\n static importError(file: string, module: string, error: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.IMPORT_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Cannot import '${module}': ${error}`,\n file,\n hint: 'Check if the module exists and is properly installed',\n context: { module },\n }\n }\n\n // Knowledge errors\n static unsafeKnowledgePath(knowledgeBase: string, pattern: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_FILE_NAME,\n severity: ValidationSeverity.ERROR,\n message: `Knowledge base '${knowledgeBase}' contains unsafe path pattern '${pattern}'`,\n file: `src/knowledge/${knowledgeBase}.ts`,\n hint: 'Knowledge patterns must not reference files outside the agent directory (remove ../ or absolute paths)',\n context: { knowledgeBase, pattern },\n }\n }\n\n // Agent linking errors\n static agentNotLinked(): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.AGENT_NOT_LINKED,\n severity: ValidationSeverity.ERROR,\n message: 'Agent is not linked to a workspace',\n file: 'agent.json',\n hint: 'Please run \"adk link\" to link your agent to a workspace',\n }\n }\n\n static workspaceIdMissing(): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.AGENT_NOT_LINKED,\n severity: ValidationSeverity.ERROR,\n message: 'No workspaceId found in agent.json',\n file: 'agent.json',\n hint: 'Please run \"adk link\" to link your agent to a workspace',\n }\n }\n\n static botIdMissing(): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.AGENT_NOT_LINKED,\n severity: ValidationSeverity.ERROR,\n message: 'No botId found in agent.json',\n file: 'agent.json',\n hint: 'Please run \"adk link\" to link your agent to a bot',\n }\n }\n\n // Utility functions\n static info(message: string, file?: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_STRUCTURE, // Generic code for info\n severity: ValidationSeverity.INFO,\n message,\n file,\n }\n }\n\n static warning(message: string, file?: string, hint?: string): ValidationError {\n return {\n $type: ValidationErrors.$type,\n code: ValidationErrorCode.INVALID_STRUCTURE, // Generic code for warnings\n severity: ValidationSeverity.WARNING,\n message,\n file,\n hint,\n }\n }\n}\n\n// Helper function to format bytes\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 Bytes'\n const k = 1024\n const sizes = ['Bytes', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n",
|
|
7
7
|
"/**\n * Default Botpress API URL\n * Used when agent.json doesn't specify an apiUrl (for backwards compatibility)\n */\nexport const DEFAULT_API_URL = 'https://api.botpress.cloud'\n\n/**\n * Built-in interfaces that are always included in ADK projects\n * These are constants and cannot be modified by users\n */\nexport const BUILTIN_INTERFACES = {\n 'typing-indicator': 'typing-indicator@0.0.3',\n llm: 'llm@9.0.0',\n listable: 'listable@0.0.2',\n} as const\n",
|
|
8
|
-
"import fs from 'fs/promises'\nimport path from 'path'\nimport { AgentInfo, agentInfoSchema } from './types.js'\nimport { ValidationErrors } from './validation-errors.js'\nimport { DEFAULT_API_URL } from '../constants.js'\n\nexport interface ResolveAgentOptions {\n /**\n * If true, throws an error if agent.json is missing or invalid.\n * If false, returns null when agent.json is not found.\n */\n required?: boolean\n /**\n * If true, validates that workspaceId exists in agent.json\n */\n requireWorkspace?: boolean\n /**\n * If true, validates that botId exists in agent.json\n */\n requireBot?: boolean\n}\n\n/**\n * Resolve agent information from agent.json
|
|
9
|
-
"import fs from 'fs/promises'\nimport path from 'path'\nimport os from 'os'\nimport { resolveAgent } from '../agent-project/agent-resolver.js'\n\nexport interface Credentials {\n token: string\n apiUrl: string\n workspaceId?: string\n workspaceName?: string\n botId?: string\n}\n\nexport interface Profile {\n name: string\n credentials: Credentials\n apiUrl: string\n lastUsed: string\n email?: string\n displayName?: string\n accountId?: string\n createdAt?: string\n}\n\nexport interface ProfileMetadata {\n lastUsed: string\n accountId?: string\n email?: string\n displayName?: string\n createdAt?: string\n}\n\nexport interface CredentialsStore {\n profiles: Record<string, Credentials>\n profileMetadata: Record<string, ProfileMetadata>\n currentProfile: string\n}\n\nexport class CredentialsManager {\n private credentialsPath: string\n private configDir: string\n\n constructor() {\n // Store credentials in ~/.adk/credentials\n this.configDir = path.join(os.homedir(), '.adk')\n this.credentialsPath = path.join(this.configDir, 'credentials')\n }\n\n private async ensureConfigDir(): Promise<void> {\n try {\n await fs.mkdir(this.configDir, { recursive: true })\n } catch {\n // Directory might already exist, that's fine\n }\n }\n\n private async readCredentials(): Promise<CredentialsStore> {\n try {\n const data = await fs.readFile(this.credentialsPath, 'utf-8')\n return JSON.parse(data)\n } catch {\n // If file doesn't exist or is invalid, return empty store\n return {\n profiles: {},\n profileMetadata: {},\n currentProfile: 'default',\n }\n }\n }\n\n private async writeCredentials(store: CredentialsStore): Promise<void> {\n await this.ensureConfigDir()\n await fs.writeFile(this.credentialsPath, JSON.stringify(store, null, 2))\n // Set restrictive permissions (read/write for owner only)\n await fs.chmod(this.credentialsPath, 0o600)\n }\n\n async saveCredentials(\n profileName: string,\n credentials: Credentials,\n userInfo?: Partial<ProfileMetadata>\n ): Promise<void> {\n const store = await this.readCredentials()\n store.profiles[profileName] = credentials\n\n // Initialize metadata if it doesn't exist\n if (!store.profileMetadata) {\n store.profileMetadata = {}\n }\n\n // Update metadata with user info\n store.profileMetadata[profileName] = {\n lastUsed: new Date().toISOString(),\n ...userInfo,\n }\n\n // If this is the first profile, make it current\n if (Object.keys(store.profiles).length === 1) {\n store.currentProfile = profileName\n }\n\n await this.writeCredentials(store)\n }\n\n async getCredentials(profileName?: string): Promise<Credentials | null> {\n const store = await this.readCredentials()\n const profile = profileName || store.currentProfile\n\n if (!store.profiles[profile]) {\n return null\n }\n\n return store.profiles[profile]\n }\n\n async listProfiles(): Promise<Profile[]> {\n const store = await this.readCredentials()\n\n // Initialize metadata if it doesn't exist\n if (!store.profileMetadata) {\n store.profileMetadata = {}\n }\n\n return Object.entries(store.profiles).map(([name, credentials]) => {\n const metadata = store.profileMetadata[name] || ({} as ProfileMetadata)\n return {\n name,\n credentials,\n apiUrl: credentials.apiUrl,\n lastUsed: metadata.lastUsed || new Date().toISOString(),\n email: metadata.email,\n displayName: metadata.displayName,\n accountId: metadata.accountId,\n createdAt: metadata.createdAt,\n }\n })\n }\n\n async getCurrentProfile(): Promise<string> {\n const store = await this.readCredentials()\n return store.currentProfile || 'default'\n }\n\n async getCurrentProfileDetails(): Promise<Profile | null> {\n const store = await this.readCredentials()\n const currentProfileName = store.currentProfile || 'default'\n\n if (!store.profiles[currentProfileName]) {\n return null\n }\n\n const credentials = store.profiles[currentProfileName]\n const metadata = store.profileMetadata?.[currentProfileName] || ({} as ProfileMetadata)\n\n return {\n name: currentProfileName,\n credentials,\n apiUrl: credentials.apiUrl,\n lastUsed: metadata.lastUsed || new Date().toISOString(),\n email: metadata.email,\n displayName: metadata.displayName,\n accountId: metadata.accountId,\n createdAt: metadata.createdAt,\n }\n }\n\n async setCurrentProfile(profileName: string): Promise<void> {\n const store = await this.readCredentials()\n\n if (!store.profiles[profileName]) {\n throw new Error(`Profile '${profileName}' not found`)\n }\n\n // Initialize metadata if it doesn't exist\n if (!store.profileMetadata) {\n store.profileMetadata = {}\n }\n\n // Update last used time while preserving other metadata\n store.profileMetadata[profileName] = {\n ...store.profileMetadata[profileName], // Preserve existing metadata\n lastUsed: new Date().toISOString(),\n }\n\n store.currentProfile = profileName\n await this.writeCredentials(store)\n }\n\n async deleteProfile(profileName: string): Promise<void> {\n const store = await this.readCredentials()\n\n if (!store.profiles[profileName]) {\n throw new Error(`Profile '${profileName}' not found`)\n }\n\n delete store.profiles[profileName]\n\n // If we deleted the current profile, switch to another one\n if (store.currentProfile === profileName) {\n const remainingProfiles = Object.keys(store.profiles)\n store.currentProfile = remainingProfiles.length > 0 ? remainingProfiles[0]! : 'default'\n }\n\n await this.writeCredentials(store)\n }\n\n async getActiveCredentials(): Promise<Credentials> {\n //
|
|
8
|
+
"import fs from 'fs/promises'\nimport path from 'path'\nimport { type AgentInfo, type AgentLocalInfo, agentInfoSchema, agentLocalInfoSchema } from './types.js'\nimport { ValidationErrors } from './validation-errors.js'\nimport { DEFAULT_API_URL } from '../constants.js'\n\nexport interface ResolveAgentOptions {\n /**\n * If true, throws an error if agent.json is missing or invalid.\n * If false, returns null when agent.json is not found.\n */\n required?: boolean\n /**\n * If true, validates that workspaceId exists in agent.json\n */\n requireWorkspace?: boolean\n /**\n * If true, validates that botId exists in agent.json\n */\n requireBot?: boolean\n}\n\n/**\n * Try to read and parse agent.local.json, returning the validated data or null.\n */\nasync function readLocalInfo(agentPath: string): Promise<AgentLocalInfo | null> {\n const localPath = path.join(agentPath, 'agent.local.json')\n try {\n const localContent = await fs.readFile(localPath, 'utf-8')\n const localData = JSON.parse(localContent)\n const localResult = agentLocalInfoSchema.safeParse(localData)\n if (!localResult.success) {\n const issue = localResult.error.errors[0]\n throw ValidationErrors.warning(\n `agent.local.json has an invalid field: ${issue?.path.join('.')} — ${issue?.message}`,\n 'agent.local.json'\n )\n }\n return localResult.data\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null\n }\n if (ValidationErrors.isValidationError(error)) {\n throw error\n }\n throw ValidationErrors.warning(`Failed to read agent.local.json: ${(error as Error).message}`, 'agent.local.json')\n }\n}\n\n/**\n * Apply agent.local.json overrides onto an AgentInfo object.\n * Local values take precedence over agent.json values.\n */\nfunction applyLocalOverrides(agentInfo: AgentInfo, localInfo: AgentLocalInfo): void {\n if (localInfo.botId) {\n agentInfo.botId = localInfo.botId\n }\n if (localInfo.workspaceId) {\n agentInfo.workspaceId = localInfo.workspaceId\n }\n if (localInfo.apiUrl) {\n agentInfo.apiUrl = localInfo.apiUrl\n }\n if (localInfo.devId) {\n agentInfo.devId = localInfo.devId\n }\n}\n\n/**\n * Resolve agent information from agent.json and agent.local.json files.\n * agent.local.json fields take precedence over agent.json fields.\n * This is the single source of truth for loading agent configuration.\n */\nexport async function resolveAgent(agentPath: string, options: ResolveAgentOptions = {}): Promise<AgentInfo | null> {\n const { required = false, requireWorkspace = false, requireBot = false } = options\n\n const agentJsonPath = path.join(agentPath, 'agent.json')\n const localInfo = await readLocalInfo(agentPath)\n\n let agentInfo: AgentInfo | null = null\n\n try {\n // Read agent.json\n const agentJsonContent = await fs.readFile(agentJsonPath, 'utf-8')\n\n // Parse JSON\n let agentData: unknown\n try {\n agentData = JSON.parse(agentJsonContent)\n } catch (parseError) {\n throw ValidationErrors.invalidConfigSyntax('agent.json', (parseError as Error).message)\n }\n\n // Validate structure\n const validationResult = agentInfoSchema.safeParse(agentData)\n if (!validationResult.success) {\n const zodError = validationResult.error.errors[0]\n throw ValidationErrors.invalidConfigSchema(\n 'agent.json',\n zodError?.path.join('.') || 'unknown',\n zodError?.message || 'Invalid schema'\n )\n }\n\n agentInfo = validationResult.data\n } catch (error) {\n // Handle file not found — agent.local.json may still provide the info\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n // Fall through to check agent.local.json below\n } else if (ValidationErrors.isValidationError(error)) {\n throw error\n } else {\n throw ValidationErrors.warning(`Failed to read agent.json: ${(error as Error).message}`, 'agent.json')\n }\n }\n\n // If agent.json wasn't found, try to construct AgentInfo from agent.local.json alone\n if (!agentInfo) {\n if (localInfo?.botId && localInfo?.workspaceId) {\n agentInfo = {\n botId: localInfo.botId,\n workspaceId: localInfo.workspaceId,\n apiUrl: localInfo.apiUrl,\n devId: localInfo.devId,\n }\n } else if (required || requireWorkspace || requireBot) {\n throw ValidationErrors.requiredFileMissing('agent.json or agent.local.json')\n } else {\n return null\n }\n } else {\n // Apply agent.local.json overrides onto agent.json values\n if (localInfo) {\n applyLocalOverrides(agentInfo, localInfo)\n }\n }\n\n // Default apiUrl to .cloud if missing (for backwards compatibility)\n if (!agentInfo.apiUrl) {\n agentInfo.apiUrl = DEFAULT_API_URL\n }\n\n // Validate workspace requirement\n if (requireWorkspace && !agentInfo.workspaceId) {\n throw ValidationErrors.workspaceIdMissing()\n }\n\n // Validate bot requirement\n if (requireBot && !agentInfo.botId) {\n throw ValidationErrors.botIdMissing()\n }\n\n return agentInfo\n}\n\n/**\n * Check if agent.json exists in the given path\n */\nexport async function hasAgentJson(agentPath: string): Promise<boolean> {\n const agentJsonPath = path.join(agentPath, 'agent.json')\n try {\n await fs.access(agentJsonPath)\n return true\n } catch {\n return false\n }\n}\n",
|
|
9
|
+
"import fs from 'fs/promises'\nimport path from 'path'\nimport os from 'os'\nimport { resolveAgent } from '../agent-project/agent-resolver.js'\n\nexport interface Credentials {\n token: string\n apiUrl: string\n workspaceId?: string\n workspaceName?: string\n botId?: string\n}\n\nexport interface Profile {\n name: string\n credentials: Credentials\n apiUrl: string\n lastUsed: string\n email?: string\n displayName?: string\n accountId?: string\n createdAt?: string\n}\n\nexport interface ProfileMetadata {\n lastUsed: string\n accountId?: string\n email?: string\n displayName?: string\n createdAt?: string\n}\n\nexport interface CredentialsStore {\n profiles: Record<string, Credentials>\n profileMetadata: Record<string, ProfileMetadata>\n currentProfile: string\n}\n\nexport class CredentialsManager {\n private credentialsPath: string\n private configDir: string\n private profileOverride: string | undefined\n\n constructor() {\n // Store credentials in ~/.adk/credentials\n this.configDir = path.join(os.homedir(), '.adk')\n this.credentialsPath = path.join(this.configDir, 'credentials')\n }\n\n /**\n * Set a profile override that takes precedence over ADK_PROFILE env var and stored current profile.\n * This is used by the CLI's global --profile flag.\n */\n setProfileOverride(profile: string | undefined): void {\n this.profileOverride = profile\n }\n\n private async ensureConfigDir(): Promise<void> {\n try {\n await fs.mkdir(this.configDir, { recursive: true })\n } catch {\n // Directory might already exist, that's fine\n }\n }\n\n private async readCredentials(): Promise<CredentialsStore> {\n try {\n const data = await fs.readFile(this.credentialsPath, 'utf-8')\n return JSON.parse(data)\n } catch {\n // If file doesn't exist or is invalid, return empty store\n return {\n profiles: {},\n profileMetadata: {},\n currentProfile: 'default',\n }\n }\n }\n\n private async writeCredentials(store: CredentialsStore): Promise<void> {\n await this.ensureConfigDir()\n await fs.writeFile(this.credentialsPath, JSON.stringify(store, null, 2))\n // Set restrictive permissions (read/write for owner only)\n await fs.chmod(this.credentialsPath, 0o600)\n }\n\n async saveCredentials(\n profileName: string,\n credentials: Credentials,\n userInfo?: Partial<ProfileMetadata>\n ): Promise<void> {\n const store = await this.readCredentials()\n store.profiles[profileName] = credentials\n\n // Initialize metadata if it doesn't exist\n if (!store.profileMetadata) {\n store.profileMetadata = {}\n }\n\n // Update metadata with user info\n store.profileMetadata[profileName] = {\n lastUsed: new Date().toISOString(),\n ...userInfo,\n }\n\n // If this is the first profile, make it current\n if (Object.keys(store.profiles).length === 1) {\n store.currentProfile = profileName\n }\n\n await this.writeCredentials(store)\n }\n\n async getCredentials(profileName?: string): Promise<Credentials | null> {\n const store = await this.readCredentials()\n const profile = profileName || store.currentProfile\n\n if (!store.profiles[profile]) {\n return null\n }\n\n return store.profiles[profile]\n }\n\n async listProfiles(): Promise<Profile[]> {\n const store = await this.readCredentials()\n\n // Initialize metadata if it doesn't exist\n if (!store.profileMetadata) {\n store.profileMetadata = {}\n }\n\n return Object.entries(store.profiles).map(([name, credentials]) => {\n const metadata = store.profileMetadata[name] || ({} as ProfileMetadata)\n return {\n name,\n credentials,\n apiUrl: credentials.apiUrl,\n lastUsed: metadata.lastUsed || new Date().toISOString(),\n email: metadata.email,\n displayName: metadata.displayName,\n accountId: metadata.accountId,\n createdAt: metadata.createdAt,\n }\n })\n }\n\n async getCurrentProfile(): Promise<string> {\n const store = await this.readCredentials()\n return store.currentProfile || 'default'\n }\n\n async getCurrentProfileDetails(): Promise<Profile | null> {\n const store = await this.readCredentials()\n const currentProfileName = store.currentProfile || 'default'\n\n if (!store.profiles[currentProfileName]) {\n return null\n }\n\n const credentials = store.profiles[currentProfileName]\n const metadata = store.profileMetadata?.[currentProfileName] || ({} as ProfileMetadata)\n\n return {\n name: currentProfileName,\n credentials,\n apiUrl: credentials.apiUrl,\n lastUsed: metadata.lastUsed || new Date().toISOString(),\n email: metadata.email,\n displayName: metadata.displayName,\n accountId: metadata.accountId,\n createdAt: metadata.createdAt,\n }\n }\n\n async setCurrentProfile(profileName: string): Promise<void> {\n const store = await this.readCredentials()\n\n if (!store.profiles[profileName]) {\n throw new Error(`Profile '${profileName}' not found`)\n }\n\n // Initialize metadata if it doesn't exist\n if (!store.profileMetadata) {\n store.profileMetadata = {}\n }\n\n // Update last used time while preserving other metadata\n store.profileMetadata[profileName] = {\n ...store.profileMetadata[profileName], // Preserve existing metadata\n lastUsed: new Date().toISOString(),\n }\n\n store.currentProfile = profileName\n await this.writeCredentials(store)\n }\n\n async deleteProfile(profileName: string): Promise<void> {\n const store = await this.readCredentials()\n\n if (!store.profiles[profileName]) {\n throw new Error(`Profile '${profileName}' not found`)\n }\n\n delete store.profiles[profileName]\n\n // If we deleted the current profile, switch to another one\n if (store.currentProfile === profileName) {\n const remainingProfiles = Object.keys(store.profiles)\n store.currentProfile = remainingProfiles.length > 0 ? remainingProfiles[0]! : 'default'\n }\n\n await this.writeCredentials(store)\n }\n\n async getActiveCredentials(): Promise<Credentials> {\n // Priority: 1) profileOverride (--profile flag), 2) ADK_PROFILE env var, 3) stored currentProfile\n const profileName = this.profileOverride || process.env.ADK_PROFILE\n\n const credentials = await this.getCredentials(profileName)\n\n if (!credentials) {\n const displayName = profileName || 'default'\n throw new Error(`No credentials found for profile '${displayName}'. ` + `Please run 'adk login' to authenticate.`)\n }\n\n return credentials\n }\n\n /**\n * Find a profile whose apiUrl matches the given URL.\n * Returns the credentials of the first matching profile, or null if none match.\n * Accepts a pre-loaded store to avoid redundant file reads.\n */\n private findProfileByApiUrl(store: CredentialsStore, apiUrl: string): Credentials | null {\n const normalizedUrl = apiUrl.replace(/\\/+$/, '') // strip trailing slashes\n\n for (const [, credentials] of Object.entries(store.profiles)) {\n if (!credentials.apiUrl) continue\n const profileUrl = credentials.apiUrl.replace(/\\/+$/, '')\n if (profileUrl === normalizedUrl) {\n return credentials\n }\n }\n\n return null\n }\n\n /**\n * Get credentials for agent-specific operations\n * This will prioritize workspaceId and apiUrl from agent.json over credentials file.\n * When no explicit profile is specified, it auto-selects the profile whose apiUrl\n * matches the agent.json apiUrl.\n *\n * @param agentPath - Path to the agent project directory\n * @throws Error if agent.json is missing or doesn't contain workspaceId\n */\n async getAgentCredentials(agentPath: string): Promise<Credentials> {\n // Resolve agent.json first to determine the target API URL\n const agentInfo = await resolveAgent(agentPath, {\n required: true,\n requireWorkspace: true,\n })\n\n // agentInfo is guaranteed to be non-null and have workspaceId due to options above\n // apiUrl is also guaranteed by resolveAgent which defaults it to DEFAULT_API_URL\n const agentApiUrl = agentInfo!.apiUrl!\n\n // Determine base credentials:\n // If user explicitly specified a profile (--profile flag or ADK_PROFILE env), honor that.\n // Otherwise, try to find a profile that matches the agent's API URL.\n let baseCredentials: Credentials\n\n const hasExplicitProfile = !!(this.profileOverride || process.env.ADK_PROFILE)\n\n if (hasExplicitProfile) {\n baseCredentials = await this.getActiveCredentials()\n } else {\n // Read the store once and reuse it for both the profile lookup and the fallback\n const store = await this.readCredentials()\n const matchingCredentials = this.findProfileByApiUrl(store, agentApiUrl)\n if (matchingCredentials) {\n baseCredentials = matchingCredentials\n } else {\n // Fall back to the active profile from the same store read\n const profileName = store.currentProfile || 'default'\n const activeCredentials = store.profiles[profileName]\n if (!activeCredentials) {\n throw new Error(\n `No credentials found for profile '${profileName}'. ` + `Please run 'adk login' to authenticate.`\n )\n }\n baseCredentials = activeCredentials\n }\n }\n\n return {\n ...baseCredentials,\n apiUrl: agentApiUrl,\n workspaceId: agentInfo!.workspaceId,\n botId: agentInfo!.botId,\n }\n }\n}\n",
|
|
10
10
|
"import { mkdir, writeFile } from 'fs/promises'\nimport { parse } from 'path'\n\nexport const createFile = async (path: string, content: string) => {\n const file = parse(path)\n await mkdir(file.dir, { recursive: true })\n await writeFile(path, content)\n}\n",
|
|
11
11
|
"import path from 'path'\n\n// Lazy-load oxfmt because it has a native binding that isn't available\n// in compiled binaries. The dynamic import lets us catch the failure\n// gracefully and fall back to unformatted code.\nlet _format: ((file: string, code: string) => Promise<{ code: string }>) | null = null\nlet _formatLoaded = false\n\nasync function getFormat() {\n if (!_formatLoaded) {\n _formatLoaded = true\n try {\n const oxfmt = await import('oxfmt')\n _format = oxfmt.format\n } catch {\n // Native binding unavailable (e.g. compiled binary) — formatting disabled\n }\n }\n return _format\n}\n\nexport const formatCode = async (code: string, filepath?: string): Promise<string> => {\n try {\n // Skip formatting if code is empty or too large\n if (!code || code.length > 1_000_000) {\n return code\n }\n\n const format = await getFormat()\n if (!format) return code\n\n const fileName = filepath || 'file.ts'\n const result = await format(fileName, code)\n\n return result.code\n } catch (err) {\n console.warn('Failed to format code with oxfmt:', err)\n console.warn(\n code\n .slice(0, 1000)\n .split('\\n')\n .map((l, i) => `\\t${i.toString().padStart(2, '0')} | ${l}`)\n .join('\\n')\n )\n return code\n }\n}\n\n// This constant is injected at build time by esbuild's define\ndeclare const __RUNTIME_VERSION__: string\n\nexport const ADK_VERSION = __RUNTIME_VERSION__\n\nexport const relative = (from: string, to: string): string => {\n const fromDir = path.dirname(from)\n const relative = path.relative(fromDir, to)\n return relative.startsWith('.') ? relative : `./${relative}`\n}\n\nexport function toMultilineComment(comment: string): string {\n // Handle empty or null comments\n if (!comment || comment.trim() === '') {\n return ''\n }\n\n // Escape potentially dangerous characters in the comment\n // Replace */ with *\\/ to prevent premature comment closure\n let safeComment = comment.replace(/\\*\\//g, '*\\\\/')\n\n // Split by newlines to handle multi-line comments\n // Handle all line ending types: \\r\\n (Windows), \\n (Unix), \\r (old Mac)\n const lines = safeComment.split(/\\r\\n|\\r|\\n/)\n\n // If single line and short enough, return inline comment\n if (lines.length === 1 && lines[0] && lines[0].length <= 60) {\n return `/** ${lines[0]} */`\n }\n\n // For multi-line comments, format with proper indentation\n let result = '/**\\n'\n for (const line of lines) {\n // Trim trailing whitespace but preserve leading whitespace for formatting\n const trimmedLine = line.replace(/\\s+$/, '')\n result += ` * ${trimmedLine}\\n`\n }\n result += ' */'\n\n return result\n}\n",
|
|
12
12
|
"import { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\n\nexport async function generateActionTypes(project: AgentProject): Promise<void> {\n // Generate action definitions\n const actionDefs: string[] = []\n\n for (const action of project.actions) {\n // Skip actions with visibility: hidden from type generation\n if (action.definition.attributes?.visibility === 'hidden') {\n continue\n }\n\n try {\n // Skip built-in actions that don't have a real file path\n if (action.path === '<adk:builtin>') {\n // For built-in actions, use the definition directly since we can't import them\n // Built-in actions should already have proper input/output schemas in their definitions\n actionDefs.push(` \"${action.definition.name}\": {\n input: any;\n output: any;\n };`)\n continue\n }\n\n // Import the action module to get the actual instance\n const absolutePath = path.join(project.path, action.path)\n // Bust module cache to ensure fresh action on type generation\n const actionModule = await import(`${absolutePath}?t=${Date.now()}`)\n const actionInstance = actionModule[action.export] || actionModule.default\n\n if (actionInstance && actionInstance.input && actionInstance.output) {\n // Convert Zod schemas to TypeScript types\n const inputType = actionInstance.input.toTypescriptType ? actionInstance.input.toTypescriptType() : 'any'\n const outputType = actionInstance.output.toTypescriptType ? actionInstance.output.toTypescriptType() : 'any'\n\n actionDefs.push(` \"${action.definition.name}\": {\n input: ${inputType};\n output: ${outputType};\n };`)\n }\n } catch (error) {\n console.warn(`Warning: Could not process action ${action.definition.name}:`, error)\n actionDefs.push(` \"${action.definition.name}\": {\n input: any;\n output: any;\n };`)\n }\n }\n\n const content = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ndeclare module \"@botpress/runtime/_types/actions\" {\n\n export interface CallableAction<I, O> {\n (input: I): Promise<O>;\n asTool(): import(\"@botpress/runtime\").Autonomous.Tool;\n }\n\n export type BotActionDefinitions = {\n${actionDefs.join('\\n')}\n };\n \n export type BotActions = {\n [K in keyof BotActionDefinitions]:\n CallableAction<BotActionDefinitions[K][\"input\"], BotActionDefinitions[K][\"output\"]>\n };\n}\n`\n\n // Write to action-types.d.ts in the .adk folder\n const actionTypesPath = path.join(project.path, '.adk', 'action-types.d.ts')\n await createFile(actionTypesPath, await formatCode(content))\n}\n",
|
|
13
13
|
"import { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\n\nexport async function generateIntegrationActionTypes(project: AgentProject): Promise<void> {\n const content = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ntype Integrations = import(\"@botpress/runtime/_types/integrations\").Integrations;\n\ndeclare module \"@botpress/runtime/_types/integration-actions\" {\n\nexport interface CallableAction<I, O> {\n (input: I): Promise<O>;\n asTool(): import(\"@botpress/runtime\").Autonomous.Tool;\n}\n\ntype Callable<T> = T extends { input: infer I; output: infer O }\n ? CallableAction<I, O>\n : never;\n\ntype IntegrationsMap<T> = {\n [Integration in keyof T]: T[Integration] extends { actions: infer Actions }\n ? {\n [Action in keyof Actions]: Callable<Actions[Action]>;\n }\n : never;\n};\n\nexport type IntegrationActions = IntegrationsMap<Integrations>;\n}\n`\n\n // Write to integration-action-types.d.ts in the .adk folder\n const integrationActionTypesPath = path.join(project.path, '.adk', 'integration-action-types.d.ts')\n await createFile(integrationActionTypesPath, await formatCode(content))\n}\n",
|
|
14
|
-
"import { Client } from '@botpress/client'\nimport { CredentialsManager, Credentials, Profile } from './credentials.js'\nimport { AuthService } from './service.js'\n\nexport interface LoginOptions {\n profile?: string\n apiUrl?: string\n}\n\nexport interface AuthAPI {\n login(token: string, options?: LoginOptions): Promise<void>\n logout(profile?: string): Promise<void>\n listProfiles(): Promise<Profile[]>\n getCurrentProfile(): Promise<string>\n getCurrentProfileDetails(): Promise<Profile | null>\n setCurrentProfile(profileName: string): Promise<void>\n getActiveCredentials(): Promise<Credentials>\n getAgentCredentials(agentPath: string): Promise<Credentials>\n validateToken(token: string, apiUrl?: string): Promise<boolean>\n}\n\nclass Auth implements AuthAPI {\n private credentialsManager: CredentialsManager\n\n constructor() {\n this.credentialsManager = new CredentialsManager()\n }\n\n async login(token: string, options: LoginOptions = {}): Promise<void> {\n const { profile = 'default', apiUrl = 'https://api.botpress.cloud' } = options\n\n // Validate the token first\n const authService = new AuthService(apiUrl)\n const authResult = await authService.validateToken(token)\n\n // Set account preference to indicate ADK CLI is connected (best effort, don't fail login)\n try {\n const client = new Client({ apiUrl, token })\n await client.setAccountPreference({ key: 'adkCliConnected', value: true })\n } catch {\n // Silently ignore - this is a non-critical operation\n }\n\n // Save credentials with user info\n await this.credentialsManager.saveCredentials(\n profile,\n {\n token,\n apiUrl,\n workspaceId: authResult.workspaceId,\n workspaceName: authResult.workspaceName,\n botId: authResult.botId,\n },\n {\n email: authResult.email,\n displayName: authResult.displayName,\n accountId: authResult.accountId,\n createdAt: authResult.createdAt,\n }\n )\n }\n\n async logout(profile?: string): Promise<void> {\n if (profile) {\n await this.credentialsManager.deleteProfile(profile)\n } else {\n // Delete current profile\n const currentProfile = await this.credentialsManager.getCurrentProfile()\n await this.credentialsManager.deleteProfile(currentProfile)\n }\n }\n\n async listProfiles(): Promise<Profile[]> {\n return this.credentialsManager.listProfiles()\n }\n\n async getCurrentProfile(): Promise<string> {\n return this.credentialsManager.getCurrentProfile()\n }\n\n async getCurrentProfileDetails(): Promise<Profile | null> {\n return this.credentialsManager.getCurrentProfileDetails()\n }\n\n async setCurrentProfile(profileName: string): Promise<void> {\n return this.credentialsManager.setCurrentProfile(profileName)\n }\n\n async getActiveCredentials(): Promise<Credentials> {\n return this.credentialsManager.getActiveCredentials()\n }\n\n async getAgentCredentials(agentPath: string): Promise<Credentials> {\n return this.credentialsManager.getAgentCredentials(agentPath)\n }\n\n async validateToken(token: string, apiUrl?: string): Promise<boolean> {\n const authService = new AuthService(apiUrl)\n return authService.testConnection(token)\n }\n}\n\n// Export singleton instance\nexport const auth = new Auth()\n\n// Export types\nexport type { Credentials, Profile } from './credentials.js'\nexport type { AuthResult } from './service.js'\n\n// Export classes\nexport { CredentialsManager } from './credentials.js'\n\n// Export BP CLI importer\nexport { bpCliImporter } from './bp-cli-import.js'\n",
|
|
14
|
+
"import { Client } from '@botpress/client'\nimport { CredentialsManager, Credentials, Profile } from './credentials.js'\nimport { AuthService } from './service.js'\n\nexport interface LoginOptions {\n profile?: string\n apiUrl?: string\n}\n\nexport interface AuthAPI {\n login(token: string, options?: LoginOptions): Promise<void>\n logout(profile?: string): Promise<void>\n listProfiles(): Promise<Profile[]>\n getCurrentProfile(): Promise<string>\n getCurrentProfileDetails(): Promise<Profile | null>\n setCurrentProfile(profileName: string): Promise<void>\n setProfileOverride(profile: string | undefined): void\n getActiveCredentials(): Promise<Credentials>\n getAgentCredentials(agentPath: string): Promise<Credentials>\n validateToken(token: string, apiUrl?: string): Promise<boolean>\n}\n\nclass Auth implements AuthAPI {\n private credentialsManager: CredentialsManager\n\n constructor() {\n this.credentialsManager = new CredentialsManager()\n }\n\n async login(token: string, options: LoginOptions = {}): Promise<void> {\n const { profile = 'default', apiUrl = 'https://api.botpress.cloud' } = options\n\n // Validate the token first\n const authService = new AuthService(apiUrl)\n const authResult = await authService.validateToken(token)\n\n // Set account preference to indicate ADK CLI is connected (best effort, don't fail login)\n try {\n const client = new Client({ apiUrl, token })\n await client.setAccountPreference({ key: 'adkCliConnected', value: true })\n } catch {\n // Silently ignore - this is a non-critical operation\n }\n\n // Save credentials with user info\n await this.credentialsManager.saveCredentials(\n profile,\n {\n token,\n apiUrl,\n workspaceId: authResult.workspaceId,\n workspaceName: authResult.workspaceName,\n botId: authResult.botId,\n },\n {\n email: authResult.email,\n displayName: authResult.displayName,\n accountId: authResult.accountId,\n createdAt: authResult.createdAt,\n }\n )\n }\n\n async logout(profile?: string): Promise<void> {\n if (profile) {\n await this.credentialsManager.deleteProfile(profile)\n } else {\n // Delete current profile\n const currentProfile = await this.credentialsManager.getCurrentProfile()\n await this.credentialsManager.deleteProfile(currentProfile)\n }\n }\n\n async listProfiles(): Promise<Profile[]> {\n return this.credentialsManager.listProfiles()\n }\n\n async getCurrentProfile(): Promise<string> {\n return this.credentialsManager.getCurrentProfile()\n }\n\n async getCurrentProfileDetails(): Promise<Profile | null> {\n return this.credentialsManager.getCurrentProfileDetails()\n }\n\n async setCurrentProfile(profileName: string): Promise<void> {\n return this.credentialsManager.setCurrentProfile(profileName)\n }\n\n setProfileOverride(profile: string | undefined): void {\n this.credentialsManager.setProfileOverride(profile)\n }\n\n async getActiveCredentials(): Promise<Credentials> {\n return this.credentialsManager.getActiveCredentials()\n }\n\n async getAgentCredentials(agentPath: string): Promise<Credentials> {\n return this.credentialsManager.getAgentCredentials(agentPath)\n }\n\n async validateToken(token: string, apiUrl?: string): Promise<boolean> {\n const authService = new AuthService(apiUrl)\n return authService.testConnection(token)\n }\n}\n\n// Export singleton instance\nexport const auth = new Auth()\n\n// Export types\nexport type { Credentials, Profile } from './credentials.js'\nexport type { AuthResult } from './service.js'\n\n// Export classes\nexport { CredentialsManager } from './credentials.js'\n\n// Export BP CLI importer\nexport { bpCliImporter } from './bp-cli-import.js'\n",
|
|
15
15
|
"import { Client } from '@botpress/client'\n\nexport interface AuthResult {\n workspaceId?: string\n workspaceName?: string\n botId?: string\n userId?: string\n email?: string\n displayName?: string\n accountId?: string\n createdAt?: string\n}\n\nexport class AuthService {\n private apiUrl: string\n\n constructor(apiUrl?: string) {\n this.apiUrl = apiUrl || 'https://api.botpress.cloud'\n }\n\n async validateToken(token: string): Promise<AuthResult> {\n if (!token || !token.startsWith('bp_')) {\n throw new Error('Invalid token format. Token should start with \"bp_\"')\n }\n\n try {\n // Create a Botpress client with the token\n const client = new Client({\n apiUrl: this.apiUrl,\n token,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n\n // Try to get account details to validate the token\n // This is a lightweight call that will fail if the token is invalid\n const accountResponse = await client.getAccount({})\n const { account } = accountResponse\n\n // Also get workspaces for additional context\n const workspaces = await client.list.workspaces({}).collect()\n\n // If we get here, the token is valid\n return {\n workspaceId: workspaces[0]?.id,\n workspaceName: workspaces[0]?.name,\n accountId: account.id,\n email: account.email,\n displayName: account.displayName,\n createdAt: account.createdAt,\n }\n } catch (error) {\n if (error instanceof Error) {\n // Check for common authentication errors\n if (error.message.includes('401') || error.message.includes('Unauthorized')) {\n throw new Error('Invalid token. Please check your API token and try again.')\n }\n if (error.message.includes('Network') || error.message.includes('ENOTFOUND')) {\n throw new Error(`Unable to connect to ${this.apiUrl}. Please check your internet connection and API URL.`)\n }\n }\n\n // Re-throw the original error if it's not a known authentication error\n throw error\n }\n }\n\n async testConnection(token: string): Promise<boolean> {\n try {\n await this.validateToken(token)\n return true\n } catch {\n return false\n }\n }\n}\n",
|
|
16
16
|
"import fs from 'fs/promises'\nimport path from 'path'\nimport os from 'os'\nimport { auth } from './index.js'\n\ninterface BpCliCredentials {\n token: string\n workspaceId: string\n apiUrl: string\n botId?: string\n}\n\nexport class BpCliImporter {\n private bpCachePath: string\n\n constructor() {\n // BP CLI stores credentials in ~/.botpress/global.cache.json\n this.bpCachePath = path.join(os.homedir(), '.botpress', 'global.cache.json')\n }\n\n async hasBpCliCredentials(): Promise<boolean> {\n try {\n await fs.access(this.bpCachePath)\n return true\n } catch {\n return false\n }\n }\n\n async getBpCliCredentials(): Promise<BpCliCredentials | null> {\n try {\n const data = await fs.readFile(this.bpCachePath, 'utf-8')\n const credentials = JSON.parse(data) as BpCliCredentials\n\n // Validate required fields\n if (!credentials.token || !credentials.workspaceId || !credentials.apiUrl) {\n return null\n }\n\n return credentials\n } catch {\n return null\n }\n }\n\n async importFromBpCli(profileName: string = 'default'): Promise<boolean> {\n const bpCredentials = await this.getBpCliCredentials()\n if (!bpCredentials) {\n return false\n }\n\n try {\n // Login with BP CLI credentials\n await auth.login(bpCredentials.token, {\n profile: profileName,\n apiUrl: bpCredentials.apiUrl,\n })\n\n // The login process will have saved basic credentials\n // Now we need to update them with the workspace ID from BP CLI\n // We'll do this by creating a new CredentialsManager instance\n const credentialsManager = new (await import('./credentials.js')).CredentialsManager()\n\n // Read current credentials\n const store = await credentialsManager['readCredentials']()\n\n if (store.profiles[profileName]) {\n store.profiles[profileName].workspaceId = bpCredentials.workspaceId\n if (bpCredentials.botId) {\n store.profiles[profileName].botId = bpCredentials.botId\n }\n await credentialsManager['writeCredentials'](store)\n }\n\n return true\n } catch {\n return false\n }\n }\n}\n\nexport const bpCliImporter = new BpCliImporter()\n",
|
|
17
|
-
"import { EventEmitter } from 'events'\n\nexport interface BaseProgressEvent {\n type: string\n startTime: number\n endTime?: number\n}\n\nexport interface BaseCommandEvents<TProgress extends BaseProgressEvent = BaseProgressEvent, TDone = never> {\n stdout: (data: string) => void\n stderr: (data: string) => void\n progress: (event: TProgress) => void\n error: (error: { exitCode: number; stderr: string; message: string }) => void\n done: TDone extends never ? never : (result: TDone) => void\n}\n\nexport abstract class BaseCommand<TProgress extends BaseProgressEvent = BaseProgressEvent, TDone = never> {\n protected events = new EventEmitter()\n private deferred = Promise.withResolvers<TDone>()\n\n on<K extends keyof BaseCommandEvents<TProgress, TDone>>(\n event: K,\n listener: BaseCommandEvents<TProgress, TDone>[K]\n ): void {\n this.events.on(event as string, listener)\n }\n\n off<K extends keyof BaseCommandEvents<TProgress, TDone>>(\n event: K,\n listener: BaseCommandEvents<TProgress, TDone>[K]\n ): void {\n this.events.off(event as string, listener)\n }\n\n protected emit<K extends keyof BaseCommandEvents<TProgress, TDone>>(\n event: K,\n ...args: Parameters<BaseCommandEvents<TProgress, TDone>[K]>\n ): void {\n if (event === 'done') {\n this.deferred.resolve(args[0] as TDone)\n } else if (event === 'error') {\n const error = args[0] as {\n exitCode: number\n stderr: string\n message: string\n }\n const err = new Error(error.message)\n ;(err as any).exitCode = error.exitCode\n ;(err as any).stderr = error.stderr\n this.deferred.reject(err)\n }\n\n this.events.emit(event as string, ...args)\n }\n\n output(): Promise<TDone> {\n return this.deferred.promise\n }\n\n abstract run(): Promise<void>\n abstract kill(signal?: NodeJS.Signals): void\n}\n",
|
|
18
|
-
"import { execa, type ResultPromise } from 'execa'\nimport { getBpCli } from './bp-cli.js'\nimport { BaseCommand } from './base-command.js'\n\nexport interface BpAddCommandOptions {\n resource: string // Full resource string like \"integration:slack@1.0.0\" or \"interface:translator@1.0.0\"\n botPath: string\n workspaceId: string\n credentials: {\n token: string\n apiUrl: string\n }\n}\n\nexport class BpAddCommand extends BaseCommand<never, void> {\n private childProcess: ResultPromise | null = null\n private killed = false\n\n constructor(private options: BpAddCommandOptions) {\n super()\n }\n\n async run(): Promise<void> {\n const { resource, botPath, workspaceId, credentials } = this.options\n\n // Get bp command path\n const { path: bpCommand } = getBpCli()\n\n const args = [\n 'add',\n resource, // Use resource as-is (already includes integration: or interface: prefix)\n '-y',\n '--installPath',\n botPath,\n '--token',\n credentials.token,\n '--workspaceId',\n workspaceId,\n '--apiUrl',\n credentials.apiUrl,\n ]\n\n this.childProcess = execa(bpCommand, args, {\n cwd: botPath,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n // Capture stdout\n if (this.childProcess.stdout) {\n this.childProcess.stdout.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stdout', text)\n })\n }\n\n // Capture stderr\n if (this.childProcess.stderr) {\n this.childProcess.stderr.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stderr', text)\n })\n }\n\n // Handle process exit\n this.childProcess.then(\n () => {\n // Process completed successfully\n this.emit('done', undefined)\n },\n (error: any) => {\n if (this.killed) {\n return\n }\n\n const errorObj = {\n exitCode: error.exitCode ?? 1,\n stderr: error.stderr || '',\n message: error.message || 'Process exited with error',\n }\n\n this.emit('error', errorObj)\n }\n )\n }\n\n kill(signal: NodeJS.Signals = 'SIGTERM'): void {\n this.killed = true\n if (this.childProcess) {\n this.childProcess.kill(signal)\n }\n }\n}\n",
|
|
17
|
+
"import { EventEmitter } from 'events'\n\nexport interface BaseProgressEvent {\n type: string\n startTime: number\n endTime?: number\n}\n\nexport interface BaseCommandEvents<TProgress extends BaseProgressEvent = BaseProgressEvent, TDone = never> {\n stdout: (data: string) => void\n stderr: (data: string) => void\n progress: (event: TProgress) => void\n error: (error: { exitCode: number; stderr: string; message: string }) => void\n done: TDone extends never ? never : (result: TDone) => void\n}\n\nexport abstract class BaseCommand<TProgress extends BaseProgressEvent = BaseProgressEvent, TDone = never> {\n protected events = new EventEmitter()\n private deferred = Promise.withResolvers<TDone>()\n\n on<K extends keyof BaseCommandEvents<TProgress, TDone>>(\n event: K,\n listener: BaseCommandEvents<TProgress, TDone>[K]\n ): void {\n this.events.on(event as string, listener)\n }\n\n off<K extends keyof BaseCommandEvents<TProgress, TDone>>(\n event: K,\n listener: BaseCommandEvents<TProgress, TDone>[K]\n ): void {\n this.events.off(event as string, listener)\n }\n\n protected emit<K extends keyof BaseCommandEvents<TProgress, TDone>>(\n event: K,\n ...args: Parameters<BaseCommandEvents<TProgress, TDone>[K]>\n ): void {\n if (event === 'done') {\n this.deferred.resolve(args[0] as TDone)\n } else if (event === 'error') {\n const error = args[0] as {\n exitCode: number\n stderr: string\n message: string\n }\n const err = new Error(error.message)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- attaching non-standard properties to Error\n ;(err as any).exitCode = error.exitCode\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- attaching non-standard properties to Error\n ;(err as any).stderr = error.stderr\n this.deferred.reject(err)\n }\n\n this.events.emit(event as string, ...args)\n }\n\n output(): Promise<TDone> {\n return this.deferred.promise\n }\n\n abstract run(): Promise<void>\n abstract kill(signal?: NodeJS.Signals): void\n}\n",
|
|
18
|
+
"import { execa, type ResultPromise } from 'execa'\nimport { getBpCli } from './bp-cli.js'\nimport { BaseCommand } from './base-command.js'\n\nexport interface BpAddCommandOptions {\n resource: string // Full resource string like \"integration:slack@1.0.0\" or \"interface:translator@1.0.0\"\n botPath: string\n workspaceId: string\n credentials: {\n token: string\n apiUrl: string\n }\n}\n\nexport class BpAddCommand extends BaseCommand<never, void> {\n private childProcess: ResultPromise | null = null\n private killed = false\n\n constructor(private options: BpAddCommandOptions) {\n super()\n }\n\n async run(): Promise<void> {\n const { resource, botPath, workspaceId, credentials } = this.options\n\n // Get bp command path\n const { path: bpCommand } = getBpCli()\n\n const args = [\n 'add',\n resource, // Use resource as-is (already includes integration: or interface: prefix)\n '-y',\n '--installPath',\n botPath,\n '--token',\n credentials.token,\n '--workspaceId',\n workspaceId,\n '--apiUrl',\n credentials.apiUrl,\n ]\n\n this.childProcess = execa(bpCommand, args, {\n cwd: botPath,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n // Capture stdout\n if (this.childProcess.stdout) {\n this.childProcess.stdout.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stdout', text)\n })\n }\n\n // Capture stderr\n if (this.childProcess.stderr) {\n this.childProcess.stderr.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stderr', text)\n })\n }\n\n // Handle process exit\n this.childProcess.then(\n () => {\n // Process completed successfully\n this.emit('done', undefined)\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- child process error callback\n (error: any) => {\n if (this.killed) {\n return\n }\n\n const errorObj = {\n exitCode: error.exitCode ?? 1,\n stderr: error.stderr || '',\n message: error.message || 'Process exited with error',\n }\n\n this.emit('error', errorObj)\n }\n )\n }\n\n kill(signal: NodeJS.Signals = 'SIGTERM'): void {\n this.killed = true\n if (this.childProcess) {\n this.childProcess.kill(signal)\n }\n }\n}\n",
|
|
19
19
|
"import { existsSync } from 'fs'\nimport os from 'os'\nimport path from 'path'\nimport createDebug from 'debug'\n\nconst debug = createDebug('adk:bp-cli')\n\nexport interface BpCliInfo {\n path: string\n version: string\n}\n\n// This constant is injected at build time by esbuild's define\ndeclare const __BP_CLI_VERSION__: string\n\nexport const BP_CLI_VERSION = __BP_CLI_VERSION__\nexport const BP_CLI_INSTALL_ALL = path.join(os.homedir(), '.adk', `bp-cli`)\nexport const BP_CLI_INSTALL_DIR = path.join(BP_CLI_INSTALL_ALL, BP_CLI_VERSION)\nexport const BP_CLI_BIN_PATH = path.join(BP_CLI_INSTALL_DIR, 'node_modules', '@botpress', 'cli', 'bin.js')\n\ndebug('BP_CLI_VERSION=%s (injected at build time)', BP_CLI_VERSION)\ndebug('BP_CLI_INSTALL_ALL=%s', BP_CLI_INSTALL_ALL)\ndebug('BP_CLI_INSTALL_DIR=%s', BP_CLI_INSTALL_DIR)\ndebug('BP_CLI_BIN_PATH=%s', BP_CLI_BIN_PATH)\n\n/**\n * Get bp CLI info (path and version)\n */\nexport function getBpCli(): BpCliInfo {\n debug('getBpCli() called')\n debug('checking if BP_CLI_BIN_PATH exists: %s', BP_CLI_BIN_PATH)\n\n const exists = existsSync(BP_CLI_BIN_PATH)\n debug('BP_CLI_BIN_PATH exists=%s', exists)\n\n if (!exists) {\n debug('ERROR: bp CLI not found at expected path')\n throw new Error(\n `@botpress/cli version ${BP_CLI_VERSION} is not installed in the ADK directory \"${BP_CLI_INSTALL_DIR}\". This is a bug, please report it to the Botpress team.`\n )\n }\n\n const info = {\n path: BP_CLI_BIN_PATH,\n version: BP_CLI_VERSION,\n }\n\n debug('returning BpCliInfo: %O', info)\n return info\n}\n",
|
|
20
|
-
"import { execa, type ResultPromise } from 'execa'\nimport { join } from 'path'\nimport { access } from 'fs/promises'\nimport { getBpCli } from './bp-cli.js'\nimport { BaseCommand } from './base-command.js'\nimport { optimizeSourceMap } from '../utils/source-map-optimizer.js'\n\nexport interface BpBuildCommandOptions {\n botPath: string\n}\n\nexport class BpBuildCommand extends BaseCommand<never, void> {\n private childProcess: ResultPromise | null = null\n private killed = false\n\n constructor(private options: BpBuildCommandOptions) {\n super()\n }\n\n async run(): Promise<void> {\n const { botPath } = this.options\n\n // Get bp command path\n const { path: bpCommand } = getBpCli()\n\n const args = ['build', '--sourceMap']\n\n this.childProcess = execa(bpCommand, args, {\n cwd: botPath,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n // Capture stdout\n if (this.childProcess.stdout) {\n this.childProcess.stdout.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stdout', text)\n })\n }\n\n // Capture stderr\n if (this.childProcess.stderr) {\n this.childProcess.stderr.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stderr', text)\n })\n }\n\n // Handle process exit\n this.childProcess.then(\n async () => {\n // Process completed successfully - optimize source map\n await this.optimizeSourceMapIfExists()\n this.emit('done', undefined)\n },\n (error: any) => {\n if (this.killed) {\n return\n }\n\n const errorObj = {\n exitCode: error.exitCode ?? 1,\n stderr: error.stderr || '',\n message: error.message || 'Process exited with error',\n }\n\n this.emit('error', errorObj)\n }\n )\n }\n\n private async optimizeSourceMapIfExists(): Promise<void> {\n const { botPath } = this.options\n const sourceMapPath = join(botPath, '.botpress', 'dist', 'index.cjs.map')\n\n try {\n // Check if source map exists\n await access(sourceMapPath)\n\n // Get the agent's src directory (parent of botPath)\n const agentSrcPath = join(botPath, '..', '..', 'src')\n\n // Optimize the source map\n await optimizeSourceMap({\n sourceMapPath,\n agentSrcPath,\n })\n } catch {\n // Source map doesn't exist or optimization failed - not critical\n }\n }\n\n kill(signal: NodeJS.Signals = 'SIGTERM'): void {\n this.killed = true\n if (this.childProcess) {\n this.childProcess.kill(signal)\n }\n }\n}\n",
|
|
20
|
+
"import { execa, type ResultPromise } from 'execa'\nimport { join } from 'path'\nimport { access } from 'fs/promises'\nimport { getBpCli } from './bp-cli.js'\nimport { BaseCommand } from './base-command.js'\nimport { optimizeSourceMap } from '../utils/source-map-optimizer.js'\n\nexport interface BpBuildCommandOptions {\n botPath: string\n}\n\nexport class BpBuildCommand extends BaseCommand<never, void> {\n private childProcess: ResultPromise | null = null\n private killed = false\n\n constructor(private options: BpBuildCommandOptions) {\n super()\n }\n\n async run(): Promise<void> {\n const { botPath } = this.options\n\n // Get bp command path\n const { path: bpCommand } = getBpCli()\n\n const args = ['build', '--sourceMap']\n\n this.childProcess = execa(bpCommand, args, {\n cwd: botPath,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n // Capture stdout\n if (this.childProcess.stdout) {\n this.childProcess.stdout.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stdout', text)\n })\n }\n\n // Capture stderr\n if (this.childProcess.stderr) {\n this.childProcess.stderr.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stderr', text)\n })\n }\n\n // Handle process exit\n this.childProcess.then(\n async () => {\n // Process completed successfully - optimize source map\n await this.optimizeSourceMapIfExists()\n this.emit('done', undefined)\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- child process error callback\n (error: any) => {\n if (this.killed) {\n return\n }\n\n const errorObj = {\n exitCode: error.exitCode ?? 1,\n stderr: error.stderr || '',\n message: error.message || 'Process exited with error',\n }\n\n this.emit('error', errorObj)\n }\n )\n }\n\n private async optimizeSourceMapIfExists(): Promise<void> {\n const { botPath } = this.options\n const sourceMapPath = join(botPath, '.botpress', 'dist', 'index.cjs.map')\n\n try {\n // Check if source map exists\n await access(sourceMapPath)\n\n // Get the agent's src directory (parent of botPath)\n const agentSrcPath = join(botPath, '..', '..', 'src')\n\n // Optimize the source map\n await optimizeSourceMap({\n sourceMapPath,\n agentSrcPath,\n })\n } catch {\n // Source map doesn't exist or optimization failed - not critical\n }\n }\n\n kill(signal: NodeJS.Signals = 'SIGTERM'): void {\n this.killed = true\n if (this.childProcess) {\n this.childProcess.kill(signal)\n }\n }\n}\n",
|
|
21
21
|
"/**\n * Source Map Optimizer\n *\n * This module optimizes source maps generated by the Botpress CLI (`bp dev` and `bp build`)\n * by removing sources that fall outside the agent's src directory.\n *\n * ## Problem\n * The bundled bot includes source maps that reference ALL sources, including:\n * - Agent's own code (~10 files)\n * - All node_modules dependencies (~10,000+ files)\n * - Botpress SDK internals\n *\n * This results in source maps that are 30+ MB, where 99% of the content is from\n * dependencies the user doesn't care about when debugging their agent.\n *\n * ## Solution\n * 1. Parse the source map and identify which sources are inside the agent's src directory\n * 2. Remove all sources outside the agent's src directory\n * 3. Rebuild the mappings (VLQ-encoded segments) with updated indices\n * 4. Save both an optimized .map file AND inline it into the .cjs bundle\n *\n * ## What is VLQ?\n * Variable Length Quantity (VLQ) is a compact encoding format used in source maps.\n * Source maps use VLQ to encode the \"mappings\" string, which contains information about\n * how each position in the generated code maps back to the original source.\n *\n * Each segment in the mappings can contain up to 5 fields (all VLQ-encoded):\n * 1. Column position in the generated code\n * 2. Source file index (into the sources array)\n * 3. Line number in the original source\n * 4. Column position in the original source\n * 5. Name index (into the names array) - optional\n *\n * The mappings string uses:\n * - `;` to separate lines\n * - `,` to separate segments within a line\n * - Base64 characters to encode VLQ values\n *\n * ## Why This Approach?\n * Simply blanking out source paths isn't enough - the mappings still reference removed\n * sources, and the names array still contains thousands of unused identifiers. We need to:\n * 1. Completely remove unused sources and sourcesContent\n * 2. Remove unused names\n * 3. Rebuild the mappings with correct indices\n *\n * This reduces file size by 90%+ while keeping the source map valid and functional\n * for debugging the agent's own code.\n */\n\nimport { readFile, writeFile } from 'fs/promises'\nimport { resolve, isAbsolute, relative, dirname } from 'path'\n\nexport interface SourceMapOptimizeOptions {\n /**\n * Path to the source map file (.cjs.map)\n */\n sourceMapPath: string\n\n /**\n * Path to the agent's src directory.\n * Sources outside this directory will be removed.\n */\n agentSrcPath: string\n}\n\ninterface SourceMap {\n version: number\n sources: string[]\n sourcesContent?: (string | null)[]\n mappings: string\n names?: string[]\n file?: string\n sourceRoot?: string\n}\n\n/**\n * Decodes VLQ (Variable Length Quantity) encoded value\n */\nfunction decodeVLQ(input: string, pos: number): [number, number] {\n let result = 0\n let shift = 0\n let continuation = true\n let digit: number\n\n while (continuation) {\n if (pos >= input.length) {\n throw new Error('Unexpected end of VLQ data')\n }\n\n const char = input.charCodeAt(pos++)\n // Base64 decode\n if (char >= 65 && char <= 90)\n digit = char - 65 // A-Z\n else if (char >= 97 && char <= 122)\n digit = char - 97 + 26 // a-z\n else if (char >= 48 && char <= 57)\n digit = char - 48 + 52 // 0-9\n else if (char === 43)\n digit = 62 // +\n else if (char === 47)\n digit = 63 // /\n else throw new Error('Invalid VLQ character')\n\n continuation = (digit & 32) !== 0\n digit &= 31\n result += digit << shift\n shift += 5\n }\n\n const negate = (result & 1) === 1\n result >>= 1\n return [negate ? -result : result, pos]\n}\n\n/**\n * Encodes a number as VLQ\n */\nfunction encodeVLQ(value: number): string {\n const base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\n let encoded = ''\n let num = value < 0 ? (-value << 1) | 1 : value << 1\n\n do {\n let digit = num & 31\n num >>>= 5\n if (num > 0) {\n digit |= 32\n }\n encoded += base64[digit]\n } while (num > 0)\n\n return encoded\n}\n\n/**\n * Parses source map mappings and returns segments with source file references\n */\nfunction parseMappings(mappings: string): Array<{\n line: number\n segments: Array<{\n column: number\n sourceIndex?: number\n sourceLine?: number\n sourceColumn?: number\n nameIndex?: number\n encoded: string\n }>\n}> {\n const lines: Array<{\n line: number\n segments: Array<{\n column: number\n sourceIndex?: number\n sourceLine?: number\n sourceColumn?: number\n nameIndex?: number\n encoded: string\n }>\n }> = []\n\n const lineStrings = mappings.split(';')\n let sourceIndex = 0\n let sourceLine = 0\n let sourceColumn = 0\n let nameIndex = 0\n\n for (let lineNum = 0; lineNum < lineStrings.length; lineNum++) {\n const line = lineStrings[lineNum]\n if (!line) {\n lines.push({ line: lineNum, segments: [] })\n continue\n }\n\n const segments: Array<{\n column: number\n sourceIndex?: number\n sourceLine?: number\n sourceColumn?: number\n nameIndex?: number\n encoded: string\n }> = []\n\n let column = 0\n const segmentStrings = line.split(',')\n\n for (const segmentString of segmentStrings) {\n if (!segmentString) continue\n\n let pos = 0\n const segment: {\n column: number\n sourceIndex?: number\n sourceLine?: number\n sourceColumn?: number\n nameIndex?: number\n encoded: string\n } = {\n column: 0,\n encoded: segmentString,\n }\n\n // Column\n const [colDelta, newPos1] = decodeVLQ(segmentString, pos)\n column += colDelta\n segment.column = column\n pos = newPos1\n\n if (pos < segmentString.length) {\n // Source index\n const [srcDelta, newPos2] = decodeVLQ(segmentString, pos)\n sourceIndex += srcDelta\n segment.sourceIndex = sourceIndex\n pos = newPos2\n\n if (pos < segmentString.length) {\n // Source line\n const [lineDelta, newPos3] = decodeVLQ(segmentString, pos)\n sourceLine += lineDelta\n segment.sourceLine = sourceLine\n pos = newPos3\n\n if (pos < segmentString.length) {\n // Source column\n const [colDelta2, newPos4] = decodeVLQ(segmentString, pos)\n sourceColumn += colDelta2\n segment.sourceColumn = sourceColumn\n pos = newPos4\n\n if (pos < segmentString.length) {\n // Name index\n const [nameDelta, newPos5] = decodeVLQ(segmentString, pos)\n nameIndex += nameDelta\n segment.nameIndex = nameIndex\n pos = newPos5\n }\n }\n }\n }\n\n segments.push(segment)\n }\n\n lines.push({ line: lineNum, segments })\n }\n\n return lines\n}\n\n/**\n * Rebuilds mappings string from parsed segments, remapping indices\n */\nfunction rebuildMappings(\n lines: Array<{\n line: number\n segments: Array<{\n column: number\n sourceIndex?: number\n sourceLine?: number\n sourceColumn?: number\n nameIndex?: number\n encoded: string\n }>\n }>,\n sourceIndexMap: Map<number, number>,\n nameIndexMap: Map<number, number>\n): string {\n const result: string[] = []\n let prevColumn = 0\n let prevSourceIndex = 0\n let prevSourceLine = 0\n let prevSourceColumn = 0\n let prevNameIndex = 0\n\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const line = lines[lineNum]\n if (!line) continue\n\n if (lineNum > 0) {\n result.push(';')\n prevColumn = 0\n }\n\n const segments: string[] = []\n\n for (const segment of line.segments) {\n // Check early if this segment references a removed source - if so, skip entirely\n if (segment.sourceIndex !== undefined) {\n const newSourceIndex = sourceIndexMap.get(segment.sourceIndex)\n if (newSourceIndex === undefined) {\n // Skip segments that reference removed sources\n // Important: Don't update prevColumn here to maintain correct deltas\n continue\n }\n }\n\n const parts: string[] = []\n\n // Column delta\n const colDelta = segment.column - prevColumn\n parts.push(encodeVLQ(colDelta))\n prevColumn = segment.column\n\n if (segment.sourceIndex !== undefined) {\n const newSourceIndex = sourceIndexMap.get(segment.sourceIndex)!\n\n const srcDelta = newSourceIndex - prevSourceIndex\n parts.push(encodeVLQ(srcDelta))\n prevSourceIndex = newSourceIndex\n\n if (segment.sourceLine !== undefined) {\n const lineDelta = segment.sourceLine - prevSourceLine\n parts.push(encodeVLQ(lineDelta))\n prevSourceLine = segment.sourceLine\n\n if (segment.sourceColumn !== undefined) {\n const colDelta2 = segment.sourceColumn - prevSourceColumn\n parts.push(encodeVLQ(colDelta2))\n prevSourceColumn = segment.sourceColumn\n\n if (segment.nameIndex !== undefined) {\n const newNameIndex = nameIndexMap.get(segment.nameIndex)\n if (newNameIndex !== undefined) {\n const nameDelta = newNameIndex - prevNameIndex\n parts.push(encodeVLQ(nameDelta))\n prevNameIndex = newNameIndex\n }\n }\n }\n }\n }\n\n segments.push(parts.join(''))\n }\n\n result.push(segments.join(','))\n }\n\n return result.join('')\n}\n\n/**\n * Optimizes a source map by removing sources that fall outside\n * the agent's src directory and rebuilding the mappings.\n *\n * This dramatically reduces the size of the source map (typically 90%+ reduction)\n * without losing valuable debugging information for the agent's own code.\n *\n * The optimized source map is both:\n * 1. Written to the .map file (for external reference)\n * 2. Inlined as base64 into the .cjs bundle (for runtime debugging)\n *\n * We inline the source map because after optimization it's tiny (usually <1MB),\n * which makes it much easier for tools like VSCode and Chrome DevTools to load\n * and use for debugging. Inline source maps eliminate the need for additional\n * HTTP requests or file system lookups, providing instant source mapping.\n *\n * @param options - Configuration options\n * @returns Promise that resolves when the source map has been optimized\n */\nexport async function optimizeSourceMap(options: SourceMapOptimizeOptions): Promise<void> {\n const { sourceMapPath, agentSrcPath } = options\n\n // Read and parse the source map\n const sourceMapContent = await readFile(sourceMapPath, 'utf-8')\n const sourceMap: SourceMap = JSON.parse(sourceMapContent)\n\n // Resolve absolute paths for comparison\n const resolvedAgentSrc = resolve(agentSrcPath)\n const sourceMapDir = resolve(sourceMapPath, '..')\n\n // Track indices to keep (agent sources only)\n const indicesToKeep = new Set<number>()\n\n // Find all sources that should be kept (inside agent src directory)\n for (let i = 0; i < sourceMap.sources.length; i++) {\n const source = sourceMap.sources[i]\n if (!source) {\n continue\n }\n\n // Resolve the source path from the source map's directory\n const resolvedSource = isAbsolute(source) ? resolve(source) : resolve(sourceMapDir, source)\n\n // Check if this source is inside the agent src directory\n const rel = relative(resolvedAgentSrc, resolvedSource)\n const isInside = !rel.startsWith('..') && !isAbsolute(rel)\n\n if (isInside) {\n indicesToKeep.add(i)\n }\n }\n\n // Parse the mappings (VLQ-encoded segments)\n const parsedLines = parseMappings(sourceMap.mappings)\n\n // Build new sources array and create index mapping\n const newSources: string[] = []\n const newSourcesContent: (string | null)[] = []\n const sourceIndexMap = new Map<number, number>()\n\n for (const oldIndex of Array.from(indicesToKeep).sort((a, b) => a - b)) {\n const newIndex = newSources.length\n sourceIndexMap.set(oldIndex, newIndex)\n const source = sourceMap.sources[oldIndex]\n if (source !== undefined) {\n // Convert relative paths to absolute for better debugger support\n const absoluteSource = isAbsolute(source) ? source : resolve(dirname(sourceMapPath), source)\n newSources.push(absoluteSource)\n }\n if (sourceMap.sourcesContent) {\n newSourcesContent.push(sourceMap.sourcesContent[oldIndex] || null)\n }\n }\n\n // Find used names from kept segments\n const usedNameIndices = new Set<number>()\n for (const line of parsedLines) {\n for (const segment of line.segments) {\n if (\n segment.sourceIndex !== undefined &&\n indicesToKeep.has(segment.sourceIndex) &&\n segment.nameIndex !== undefined\n ) {\n usedNameIndices.add(segment.nameIndex)\n }\n }\n }\n\n // Build new names array and create index mapping\n const newNames: string[] = []\n const nameIndexMap = new Map<number, number>()\n\n if (sourceMap.names) {\n for (const oldIndex of Array.from(usedNameIndices).sort((a, b) => a - b)) {\n if (oldIndex < sourceMap.names.length) {\n const newIndex = newNames.length\n nameIndexMap.set(oldIndex, newIndex)\n const name = sourceMap.names[oldIndex]\n if (name !== undefined) {\n newNames.push(name)\n }\n }\n }\n }\n\n // Rebuild mappings with new indices\n const newMappings = rebuildMappings(parsedLines, sourceIndexMap, nameIndexMap)\n\n // Create optimized source map\n // Note: We don't include sourceRoot since we're using absolute paths\n const optimizedSourceMap: SourceMap = {\n version: sourceMap.version,\n file: sourceMap.file,\n sources: newSources,\n sourcesContent: newSourcesContent.length > 0 ? newSourcesContent : undefined,\n names: newNames.length > 0 ? newNames : undefined,\n mappings: newMappings,\n }\n\n // Create optimized content\n const optimizedContent = JSON.stringify(optimizedSourceMap)\n\n if (optimizedContent === sourceMapContent) {\n return\n }\n\n // 1. Write the optimized source map file\n await writeFile(sourceMapPath, optimizedContent, 'utf-8')\n\n // 2. Inline the source map into the .cjs file\n const cjsPath = sourceMapPath.replace('.cjs.map', '.cjs')\n let cjsContent = await readFile(cjsPath, 'utf-8')\n\n // Convert source map to base64\n const base64SourceMap = Buffer.from(optimizedContent, 'utf-8').toString('base64')\n const inlineSourceMap = `//# sourceMappingURL=data:application/json;base64,${base64SourceMap}`\n\n // Replace existing source map comment with inline version\n cjsContent = cjsContent.replace(/\\/\\/# sourceMappingURL=.*$/m, inlineSourceMap)\n\n // If no source map comment was found, append it\n if (!cjsContent.includes('//# sourceMappingURL=')) {\n cjsContent += `\\n${inlineSourceMap}`\n }\n\n // Write the updated .cjs file\n await writeFile(cjsPath, cjsContent, 'utf-8')\n}\n",
|
|
22
|
-
"import { execa, type ResultPromise } from 'execa'\nimport { getBpCli } from './bp-cli.js'\nimport { BaseCommand } from './base-command.js'\n\nexport interface BpDeployCommandOptions {\n botPath: string\n botId: string\n workspaceId: string\n credentials: {\n token: string\n apiUrl: string\n }\n}\n\nexport class BpDeployCommand extends BaseCommand<never, void> {\n private childProcess: ResultPromise | null = null\n private killed = false\n\n constructor(private options: BpDeployCommandOptions) {\n super()\n }\n\n async run(): Promise<void> {\n const { botPath, botId, workspaceId, credentials } = this.options\n\n // Get bp command path\n const { path: bpCommand } = getBpCli()\n\n const args = [\n 'deploy',\n '--botId',\n botId,\n '-y', // Auto-confirm\n '--token',\n credentials.token,\n '--workspaceId',\n workspaceId,\n '--apiUrl',\n credentials.apiUrl,\n ]\n\n this.childProcess = execa(bpCommand, args, {\n cwd: botPath,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n // Capture stdout\n if (this.childProcess.stdout) {\n this.childProcess.stdout.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stdout', text)\n })\n }\n\n // Capture stderr\n if (this.childProcess.stderr) {\n this.childProcess.stderr.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stderr', text)\n })\n }\n\n // Handle process exit\n this.childProcess.then(\n () => {\n // Process completed successfully\n this.emit('done', undefined)\n },\n (error: any) => {\n if (this.killed) {\n return\n }\n\n const errorObj = {\n exitCode: error.exitCode ?? 1,\n stderr: error.stderr || '',\n message: error.message || 'Process exited with error',\n }\n\n this.emit('error', errorObj)\n }\n )\n }\n\n kill(signal: NodeJS.Signals = 'SIGTERM'): void {\n this.killed = true\n if (this.childProcess) {\n this.childProcess.kill(signal)\n }\n }\n}\n",
|
|
23
|
-
"import { execa, type ResultPromise } from 'execa'\nimport { join } from 'path'\nimport { access } from 'fs/promises'\nimport { getBpCli } from './bp-cli.js'\nimport { BaseCommand } from './base-command.js'\nimport { optimizeSourceMap } from '../utils/source-map-optimizer.js'\n\nexport interface BpDevCommandOptions {\n port: string\n botPath: string\n agentPath: string\n workspaceId: string\n credentials: {\n token: string\n apiUrl: string\n }\n /** The dev bot ID if already known (from agent.json) */\n devBotId?: string\n sourceMap?: boolean\n /** Bot configuration to inject as environment variable */\n configuration?: Record<string, unknown>\n /** Auto-negotiated port for the internal CLI OTLP ingest server (HttpSpanExporter) */\n internalOtlpPort: number\n /** Port for standard OTLP export to external tools (default 4318) */\n otlpPort?: number\n /** Bot name from agent.config.ts, used for OTLP service.name */\n botName?: string\n}\n\nexport type BpDevProgressEvent =\n | {\n type: 'generating'\n startTime: number\n endTime?: number\n }\n | {\n type: 'bundling'\n startTime: number\n endTime?: number\n data?: {\n buildTime: number\n }\n }\n | {\n type: 'deploying'\n startTime: number\n endTime?: number\n data?: {\n botId: string\n tunnelUrl: string\n }\n }\n | {\n type: 'listening'\n startTime: number\n data: {\n port: number\n }\n }\n\nexport class BpDevCommand extends BaseCommand<BpDevProgressEvent> {\n private childProcess: ResultPromise | null = null\n private killed = false\n private stderrLines: string[] = []\n private readonly MAX_STDERR_LINES = 50\n\n // Track progress events\n private progressEvents: Map<BpDevProgressEvent['type'], BpDevProgressEvent> = new Map()\n\n constructor(private options: BpDevCommandOptions) {\n super()\n }\n\n async run(): Promise<void> {\n const { port, botPath, workspaceId, credentials, sourceMap = true } = this.options\n\n // Get bp command path\n const { path: bpCommand } = getBpCli()\n\n const bpArgs = [\n 'dev',\n '--port',\n port,\n '--token',\n credentials.token,\n '--workspaceId',\n workspaceId,\n '--apiUrl',\n credentials.apiUrl,\n ]\n\n if (sourceMap) {\n bpArgs.push('--sourceMap')\n }\n\n const consoleUrl = `http://localhost:${this.options.internalOtlpPort}`\n const otlpEndpoint = this.options.otlpPort ? `http://localhost:${this.options.otlpPort}` : undefined\n\n const traceLines = [`[bp-dev] Trace endpoints:`, ` ADK_CONSOLE_URL=${consoleUrl}`]\n if (otlpEndpoint) {\n traceLines.push(` OTEL_EXPORTER_OTLP_ENDPOINT=${otlpEndpoint}`)\n }\n this.emit('stdout', traceLines.join('\\n') + '\\n')\n\n this.childProcess = execa(bpCommand, bpArgs, {\n cwd: botPath,\n env: {\n ...process.env,\n TRACE_DIR: join(botPath, 'traces'),\n // Child process must use 'development' so the runtime initializes trace writers\n // (Environment.isDevelopment() gates span processor creation in tracing.ts).\n // The React 19 dev mode memory leak fix (NODE_ENV=production) is applied in the\n // parent CLI process only (cli.ts / adk-dev.tsx), not here.\n NODE_ENV: 'development',\n\n // force using \"node\" for LLMz engine\n // remove this when LLMz supports wasm (quickjs)\n VM_DRIVER: 'node',\n\n // in dev mode, we provide the user's PAT so the agent can access\n // restricted resources like adding new integrations\n ADK_LOCAL_PAT: credentials.token,\n\n // ADK runtime environment variables for client initialization\n ADK_TOKEN: credentials.token,\n ADK_API_URL: credentials.apiUrl,\n ADK_BOT_ID: this.options.devBotId || '',\n\n // Inject configuration so it's available at module load time\n ...(this.options.configuration && {\n ADK_CONFIGURATION: JSON.stringify(this.options.configuration),\n }),\n\n WORKER_MODE: 'true',\n WORKER_LIFETIME_MS: process.env.WORKER_LIFETIME_MS || '120000', // Default 2 minutes\n\n // Internal OTLP endpoint for HttpSpanExporter (runtime → CLI trace ingestion)\n ADK_CONSOLE_URL: consoleUrl,\n\n // Standard OTLP endpoint for external tools (Jaeger, otel-tui, etc.)\n ...(otlpEndpoint && { OTEL_EXPORTER_OTLP_ENDPOINT: otlpEndpoint }),\n\n ...(this.options.botName && { ADK_BOT_NAME: this.options.botName }),\n ADK_DIRECTORY: join(botPath, '..'),\n AGENT_DIRECTORY: this.options.agentPath,\n // Enable source maps for better debugging support\n NODE_OPTIONS: `${process.env.NODE_OPTIONS || ''} --enable-source-maps`.trim(),\n },\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n // Capture stdout\n if (this.childProcess.stdout) {\n this.childProcess.stdout.on('data', (data: Buffer) => {\n const text = data.toString()\n if (text.includes('\"worker_stats\"')) {\n // Some chunks can contain both worker_stats and normal logs.\n // Parse only non-worker_stats lines to preserve progress events.\n const nonWorkerStatsText = text\n .split('\\n')\n .filter((line) => !line.includes('\"type\":\"worker_stats\"') && !line.includes('\"type\": \"worker_stats\"'))\n .join('\\n')\n\n if (nonWorkerStatsText.trim()) {\n this.parseOutput(nonWorkerStatsText)\n }\n } else {\n this.parseOutput(text)\n }\n this.emit('stdout', text)\n })\n }\n\n // Capture stderr\n if (this.childProcess.stderr) {\n this.childProcess.stderr.on('data', (data: Buffer) => {\n const text = data.toString()\n\n // Track stderr lines separately (keep last N lines)\n const newLines = text.split('\\n').filter((line) => line.trim())\n this.stderrLines.push(...newLines)\n if (this.stderrLines.length > this.MAX_STDERR_LINES) {\n this.stderrLines = this.stderrLines.slice(-this.MAX_STDERR_LINES)\n }\n\n // Check for fatal errors in stderr\n const lowerText = text.toLowerCase()\n let fatalError: string | null = null\n\n if (lowerText.includes('eaddrinuse') || lowerText.includes('address already in use')) {\n fatalError = `Port ${port} is already in use. Please stop the other process or use a different port.`\n } else if (lowerText.includes('eacces') || lowerText.includes('permission denied')) {\n fatalError = 'Permission denied. You may need administrator privileges.'\n } else if (lowerText.includes('econnrefused') || lowerText.includes('connection refused')) {\n fatalError = 'Connection refused. The Botpress API may be unavailable.'\n }\n\n // If we detected a fatal error, emit it and kill the process\n if (fatalError) {\n const errorObj = {\n exitCode: 1,\n stderr: this.stderrLines.join('\\n'),\n message: fatalError,\n }\n this.emit('error', errorObj)\n\n // Kill the process\n if (this.childProcess) {\n this.childProcess.kill('SIGTERM')\n }\n }\n\n // Parse stderr as well (some status messages might be there)\n this.parseOutput(text)\n this.emit('stderr', text)\n })\n }\n\n // Handle process exit\n this.childProcess.then(\n () => {\n // Process exited normally\n },\n (error: any) => {\n if (this.killed) {\n return\n }\n\n // Build error message with stderr\n let errorMessage = error.message || 'Process exited with error'\n if (this.stderrLines.length > 0) {\n errorMessage += `\\n\\nLast ${this.stderrLines.length} lines of stderr:\\n${this.stderrLines.join('\\n')}`\n }\n\n const errorObj = {\n exitCode: error.exitCode ?? 1,\n stderr: this.stderrLines.join('\\n'),\n message: errorMessage,\n }\n\n this.emit('error', errorObj)\n }\n )\n }\n\n private parseOutput(text: string): void {\n const now = Date.now()\n const lowerText = text.toLowerCase()\n\n // Parse status changes and emit progress events\n if (lowerText.includes('generating') && lowerText.includes('typing')) {\n const event: BpDevProgressEvent = {\n type: 'generating',\n startTime: now,\n }\n this.progressEvents.set('generating', event)\n this.emit('progress', event)\n } else if (lowerText.includes('bundling') && lowerText.includes('bot')) {\n // End generating phase\n const generatingEvent = this.progressEvents.get('generating')\n if (generatingEvent && generatingEvent.type === 'generating' && !generatingEvent.endTime) {\n const updatedEvent: BpDevProgressEvent = {\n ...generatingEvent,\n endTime: now,\n }\n this.progressEvents.set('generating', updatedEvent)\n this.emit('progress', updatedEvent)\n }\n\n // Start bundling phase\n const event: BpDevProgressEvent = {\n type: 'bundling',\n startTime: now,\n }\n this.progressEvents.set('bundling', event)\n this.emit('progress', event)\n } else if (lowerText.includes('deploying') && lowerText.includes('dev')) {\n // End bundling phase\n const bundlingEvent = this.progressEvents.get('bundling')\n if (bundlingEvent && bundlingEvent.type === 'bundling' && !bundlingEvent.endTime) {\n const updatedEvent: BpDevProgressEvent = {\n ...bundlingEvent,\n endTime: now,\n }\n this.progressEvents.set('bundling', updatedEvent)\n this.emit('progress', updatedEvent)\n }\n\n // Start deploying phase\n const event: BpDevProgressEvent = {\n type: 'deploying',\n startTime: now,\n }\n this.progressEvents.set('deploying', event)\n this.emit('progress', event)\n }\n\n // Parse build time\n const buildTimeMatch = text.match(/build\\s+completed\\s+in\\s+(\\d+)\\s*ms/i)\n if (buildTimeMatch && buildTimeMatch[1]) {\n const bundlingEvent = this.progressEvents.get('bundling')\n if (bundlingEvent && bundlingEvent.type === 'bundling') {\n const updatedEvent: BpDevProgressEvent = {\n ...bundlingEvent,\n data: {\n buildTime: parseInt(buildTimeMatch[1], 10),\n },\n }\n this.progressEvents.set('bundling', updatedEvent)\n this.emit('progress', updatedEvent)\n }\n }\n\n // Parse bot deployment info\n const deployMatch = text.match(\n /dev\\s+bot\\s+deployed\\s+with\\s+id\\s+[\"']?([a-f0-9-]+)[\"']?\\s+at\\s+[\"']?(https?:\\/\\/[^\\s\"']+)[\"']?/i\n )\n if (deployMatch && deployMatch[1] && deployMatch[2]) {\n // End deploying phase\n const deployingEvent = this.progressEvents.get('deploying')\n if (deployingEvent && deployingEvent.type === 'deploying' && !deployingEvent.endTime) {\n const updatedEvent: BpDevProgressEvent = {\n ...deployingEvent,\n endTime: now,\n data: {\n botId: deployMatch[1],\n tunnelUrl: deployMatch[2],\n },\n }\n this.progressEvents.set('deploying', updatedEvent)\n this.emit('progress', updatedEvent)\n }\n }\n\n // Parse listening status\n const listeningMatch = text.match(/listening\\s+on\\s+port\\s+(\\d+)/i)\n if (listeningMatch && listeningMatch[1]) {\n const port = parseInt(listeningMatch[1], 10)\n const event: BpDevProgressEvent = {\n type: 'listening',\n startTime: now,\n data: {\n port,\n },\n }\n this.progressEvents.set('listening', event)\n this.emit('progress', event)\n\n // Optimize source map after dev server is listening\n this.optimizeSourceMapIfExists().catch(() => {\n // Silently ignore source map optimization errors\n })\n }\n }\n\n private async optimizeSourceMapIfExists(): Promise<void> {\n const { botPath } = this.options\n const sourceMapPath = join(botPath, '.botpress', 'dist', 'index.cjs.map')\n\n try {\n // Check if source map exists\n await access(sourceMapPath)\n\n // Get the agent's src directory (parent of botPath)\n const agentSrcPath = join(botPath, '..', '..', 'src')\n\n // Optimize the source map\n await optimizeSourceMap({\n sourceMapPath,\n agentSrcPath,\n })\n } catch {\n // Source map doesn't exist or optimization failed - not critical\n }\n }\n\n kill(signal: NodeJS.Signals = 'SIGTERM'): void {\n this.killed = true\n if (this.childProcess) {\n this.childProcess.kill(signal)\n }\n }\n\n async restart(): Promise<BpDevCommand> {\n this.kill('SIGTERM')\n // Wait a bit for the process to clean up\n await new Promise((resolve) => setTimeout(resolve, 1000))\n // Create new instance and start it\n const newCommand = new BpDevCommand(this.options)\n await newCommand.run()\n return newCommand\n }\n\n getProgressEvent(type: BpDevProgressEvent['type']): BpDevProgressEvent | undefined {\n return this.progressEvents.get(type)\n }\n\n getAllProgressEvents(): BpDevProgressEvent[] {\n return Array.from(this.progressEvents.values())\n }\n}\n",
|
|
24
|
-
"import { execa, type ResultPromise } from 'execa'\nimport { getBpCli } from './bp-cli.js'\nimport { BaseCommand } from './base-command.js'\n\nexport interface BpChatCommandOptions {\n botId: string\n workspaceId: string\n credentials: {\n token: string\n apiUrl: string\n }\n projectPath?: string\n}\n\nexport class BpChatCommand extends BaseCommand<never> {\n private childProcess: ResultPromise | null = null\n\n constructor(private options: BpChatCommandOptions) {\n super()\n }\n\n async run(): Promise<void> {\n const { botId, workspaceId, credentials } = this.options\n\n // Get bp command path (uses bundled CLI)\n const { path: bpCommand } = getBpCli()\n\n const bpArgs = [\n 'chat',\n '--botId',\n botId,\n '--workspaceId',\n workspaceId,\n '--token',\n credentials.token,\n '--apiUrl',\n credentials.apiUrl,\n ]\n\n this.childProcess = execa(bpCommand, bpArgs, {\n stdio: 'inherit',\n })\n\n try {\n // Wait for the process to complete\n await this.childProcess\n } catch (error:
|
|
25
|
-
"import { execa, type ResultPromise } from 'execa'\nimport { BaseCommand } from './base-command.js'\nimport { buildOpenCodeConfig } from './opencode-config.js'\n\nexport interface OpenCodeCommandOptions {\n /** Port for the OpenCode server (default: 4096) */\n port: number\n /** Working directory (the agent project path) */\n cwd: string\n /** CORS origins to allow */\n corsOrigins?: string[]\n /** Path to the `adk` CLI binary (for MCP registration) */\n adkBinPath?: string\n /**
|
|
26
|
-
"export interface OpenCodeConfig {\n mcp: Record<string, { type: string; command: string[] }>\n agent: Record<string, { description: string; prompt: string }>\n server?: { port: number; cors?: string[] }\n}\n\nconst COPILOT_PROMPT = `You are the ADK Copilot — an expert assistant embedded in the Botpress Agent Development Kit control panel.\n\n## Who you help\nA developer building an AI agent with the ADK. They're running \\`adk dev\\` and have the control panel open alongside you. They can see traces, logs, integrations, workflows, and tables in the UI.\n\n## What you know\nThe ADK is a high-level framework built on Botpress. An agent project has:\n- /actions — strongly-typed callable functions (Action from @botpress/runtime)\n- /tools — LLM-callable interfaces with natural language descriptions (Tool from @botpress/runtime)\n- /workflows — step-based, resumable long-running processes (Workflow from @botpress/runtime)\n- /conversations — channel-specific interaction handlers (Conversation from @botpress/runtime)\n- /tables — schema-validated data storage with semantic search (Table from @botpress/runtime)\n- /triggers — event subscription system (Trigger from @botpress/runtime)\n- /knowledge — RAG knowledge base documents\n- agent.config.ts — agent metadata, integrations, model configuration, variables\n\nThe ADK compiles these high-level primitives down to Botpress SDK primitives. Default to ADK terms. Only drop to Botpress SDK concepts when the problem requires it (SDK-level errors, compilation issues, or when the developer explicitly asks).\n\nSchemas use \\`z\\` from @botpress/sdk (a Zod fork) — never import Zod directly.\n\nYou also have access to Botpress documentation search for platform-level questions (SDK, API, integrations).\n\n## How you work\n\n**Orient on first interaction.** If you haven't yet, use \\`adk_get_agent_info\\` to learn the project's structure, primitives, and integrations before answering.\n\n**Conceptual vs. project questions.** Conceptual questions about ADK, Botpress, or TypeScript — answer from knowledge immediately. Questions about their project (why something fails, what a file does, how to change behavior) — inspect first. If in doubt, answer what you can immediately and inspect in parallel.\n\n**Read freely, write carefully.** Inspecting files, querying traces, and searching the hub are always safe — do them without asking. But actions that modify the project (adding integrations, editing files, executing workflows, sending messages) should be confirmed first unless the developer explicitly asked you to do it.\n\n**Debug by matching the approach to the problem:**\n- Developer gives you an error message → start from the error, don't begin at \"step 1\"\n- Build or type error → check the file and generated types. Traces won't help.\n- Runtime behavior is wrong (\"it responds wrong\") → query traces (\\`adk_query_traces\\`) for the conversation to find the failing span\n- Nothing happens → check dev logs (\\`adk_get_dev_logs\\`) for silent failures, then check if the handler is registered\n- When in doubt → start with \\`adk_get_dev_logs\\` with error filtering, then query traces\n\n**Integrations.** First check if the integration already exists in the project. If it does, inspect its current configuration. Only search the hub (\\`adk_search_integrations\\`) when adding a new integration. Get details (\\`adk_get_integration\\`) to understand actions, events, channels, and config requirements. Add it (\\`adk_add_integration\\`) after the developer confirms.\n\n**Test iteratively.** Send messages to the running bot (\\`adk_send_message\\`) to verify behavior. To continue a conversation, pass back both the \\`conversationId\\` and \\`userKey\\` from the previous response. Only test against the local dev bot.\n\n**Workflows.** Get the input schema first by calling \\`adk_start_workflow\\` without a payload, then execute by calling it again with \\`payload\\` set to the correct input. For workflows with no required input, pass \\`payload: {}\\` — omitting payload returns the schema, it does not execute.\n\n**Handle failures.** If a tool returns an error, tell the developer what happened and suggest a concrete next step (e.g., \"Dev server isn't running — start it with \\`adk dev\\`\"). Don't silently retry or ignore errors.\n\n**Edit with precision.** When modifying code, change only what's needed to solve the problem. Don't refactor surrounding code, add features, or \"improve\" things that weren't asked about. When writing ADK primitives, match ADK conventions. For utility code, match the patterns already in the project.\n\n## How you communicate\n\n**Lead with the answer.** First sentence is the diagnosis, the solution, or the action you took. Context and explanation come after, if needed.\n\n**Show, don't describe.** Instead of \"you should add error handling,\" show the code change. Instead of \"the trace shows a failure,\" show the relevant span data and what it means.\n\n**Match the developer's energy.** Short question → short answer. Detailed question → detailed response. \"Why is this broken?\" → diagnosis + fix. \"How do workflows work?\" → teach.\n\n**Hypothesize while verifying.** If you have a likely diagnosis, say so while you check. \"This usually means X — checking your trace now\" is better than silence followed by an answer.\n\n**When you fix something, explain what you changed and why.** Don't apply changes silently — the developer needs to understand the fix to trust it and learn from it.\n\n**When you don't know, say so plainly.** \"I don't have enough context — can you share the error message?\" is fine.\n\n**Skip the filler.** No \"Great question!\", no \"Let me help you with that.\" Just do it.\n\n**Never read or display the contents of .env files or credentials.** If you need to verify a configuration value, ask the developer to confirm it.`\n\n/**\n * Build the OpenCode configuration for the ADK Copilot.\n *\n * Registers the ADK MCP server and sets up a default agent prompt\n * scoped to ADK development. Passed to `opencode serve` via\n * the `OPENCODE_CONFIG_CONTENT` environment variable.\n */\nexport function buildOpenCodeConfig(options: {\n adkBinPath: string\n agentPath: string\n
|
|
22
|
+
"import { execa, type ResultPromise } from 'execa'\nimport { getBpCli } from './bp-cli.js'\nimport { BaseCommand } from './base-command.js'\n\nexport interface BpDeployCommandOptions {\n botPath: string\n botId: string\n workspaceId: string\n credentials: {\n token: string\n apiUrl: string\n }\n}\n\nexport class BpDeployCommand extends BaseCommand<never, void> {\n private childProcess: ResultPromise | null = null\n private killed = false\n\n constructor(private options: BpDeployCommandOptions) {\n super()\n }\n\n async run(): Promise<void> {\n const { botPath, botId, workspaceId, credentials } = this.options\n\n // Get bp command path\n const { path: bpCommand } = getBpCli()\n\n const args = [\n 'deploy',\n '--botId',\n botId,\n '-y', // Auto-confirm\n '--token',\n credentials.token,\n '--workspaceId',\n workspaceId,\n '--apiUrl',\n credentials.apiUrl,\n ]\n\n this.childProcess = execa(bpCommand, args, {\n cwd: botPath,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n // Capture stdout\n if (this.childProcess.stdout) {\n this.childProcess.stdout.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stdout', text)\n })\n }\n\n // Capture stderr\n if (this.childProcess.stderr) {\n this.childProcess.stderr.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stderr', text)\n })\n }\n\n // Handle process exit\n this.childProcess.then(\n () => {\n // Process completed successfully\n this.emit('done', undefined)\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- child process error callback\n (error: any) => {\n if (this.killed) {\n return\n }\n\n const errorObj = {\n exitCode: error.exitCode ?? 1,\n stderr: error.stderr || '',\n message: error.message || 'Process exited with error',\n }\n\n this.emit('error', errorObj)\n }\n )\n }\n\n kill(signal: NodeJS.Signals = 'SIGTERM'): void {\n this.killed = true\n if (this.childProcess) {\n this.childProcess.kill(signal)\n }\n }\n}\n",
|
|
23
|
+
"import { execa, type ResultPromise } from 'execa'\nimport { join } from 'path'\nimport { access } from 'fs/promises'\nimport { getBpCli } from './bp-cli.js'\nimport { BaseCommand } from './base-command.js'\nimport { optimizeSourceMap } from '../utils/source-map-optimizer.js'\n\nexport interface BpDevCommandOptions {\n port: string\n botPath: string\n agentPath: string\n workspaceId: string\n credentials: {\n token: string\n apiUrl: string\n }\n /** The dev bot ID if already known (from agent.json) */\n devBotId?: string\n sourceMap?: boolean\n /** Bot configuration to inject as environment variable */\n configuration?: Record<string, unknown>\n /** Auto-negotiated port for the internal CLI span ingest server (HttpSpanExporter) */\n spanIngestPort: number\n /** Port for standard OTLP export to external tools (default 4318) */\n otlpPort?: number\n /** Bot name from agent.config.ts, used for OTLP service.name */\n botName?: string\n}\n\nexport type BpDevProgressEvent =\n | {\n type: 'generating'\n startTime: number\n endTime?: number\n }\n | {\n type: 'bundling'\n startTime: number\n endTime?: number\n data?: {\n buildTime: number\n }\n }\n | {\n type: 'deploying'\n startTime: number\n endTime?: number\n data?: {\n botId: string\n tunnelUrl: string\n }\n }\n | {\n type: 'listening'\n startTime: number\n data: {\n port: number\n }\n }\n\nexport class BpDevCommand extends BaseCommand<BpDevProgressEvent> {\n private childProcess: ResultPromise | null = null\n private killed = false\n private stderrLines: string[] = []\n private readonly MAX_STDERR_LINES = 50\n\n // Track progress events\n private progressEvents: Map<BpDevProgressEvent['type'], BpDevProgressEvent> = new Map()\n\n constructor(private options: BpDevCommandOptions) {\n super()\n }\n\n async run(): Promise<void> {\n const { port, botPath, workspaceId, credentials, sourceMap = true } = this.options\n\n // Get bp command path\n const { path: bpCommand } = getBpCli()\n\n const bpArgs = [\n 'dev',\n '--port',\n port,\n '--token',\n credentials.token,\n '--workspaceId',\n workspaceId,\n '--apiUrl',\n credentials.apiUrl,\n ]\n\n if (sourceMap) {\n bpArgs.push('--sourceMap')\n }\n\n const spanIngestUrl = `http://localhost:${this.options.spanIngestPort}`\n const otlpEndpoint = this.options.otlpPort ? `http://localhost:${this.options.otlpPort}` : undefined\n\n const traceLines = [`[bp-dev] Trace endpoints:`, ` ADK_SPAN_INGEST_URL=${spanIngestUrl}`]\n if (otlpEndpoint) {\n traceLines.push(` OTEL_EXPORTER_OTLP_ENDPOINT=${otlpEndpoint}`)\n }\n this.emit('stdout', traceLines.join('\\n') + '\\n')\n\n this.childProcess = execa(bpCommand, bpArgs, {\n cwd: botPath,\n env: {\n ...process.env,\n TRACE_DIR: join(botPath, 'traces'),\n // Child process must use 'development' so the runtime initializes trace writers\n // (Environment.isDevelopment() gates span processor creation in tracing.ts).\n // The React 19 dev mode memory leak fix (NODE_ENV=production) is applied in the\n // parent CLI process only (cli.ts / adk-dev.tsx), not here.\n NODE_ENV: 'development',\n\n // force using \"node\" for LLMz engine\n // remove this when LLMz supports wasm (quickjs)\n VM_DRIVER: 'node',\n\n // in dev mode, we provide the user's PAT so the agent can access\n // restricted resources like adding new integrations\n ADK_LOCAL_PAT: credentials.token,\n\n // ADK runtime environment variables for client initialization\n ADK_TOKEN: credentials.token,\n ADK_API_URL: credentials.apiUrl,\n ADK_BOT_ID: this.options.devBotId || '',\n\n // Inject configuration so it's available at module load time\n ...(this.options.configuration && {\n ADK_CONFIGURATION: JSON.stringify(this.options.configuration),\n }),\n\n WORKER_MODE: 'true',\n WORKER_LIFETIME_MS: process.env.WORKER_LIFETIME_MS || '120000', // Default 2 minutes\n\n // Internal span ingest endpoint for HttpSpanExporter (runtime → CLI trace ingestion)\n ADK_SPAN_INGEST_URL: spanIngestUrl,\n\n // Standard OTLP endpoint for external tools (Jaeger, otel-tui, etc.)\n ...(otlpEndpoint && { OTEL_EXPORTER_OTLP_ENDPOINT: otlpEndpoint }),\n\n ...(this.options.botName && { ADK_BOT_NAME: this.options.botName }),\n ADK_DIRECTORY: join(botPath, '..'),\n AGENT_DIRECTORY: this.options.agentPath,\n // Enable source maps for better debugging support\n NODE_OPTIONS: `${process.env.NODE_OPTIONS || ''} --enable-source-maps`.trim(),\n },\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n // Capture stdout\n if (this.childProcess.stdout) {\n this.childProcess.stdout.on('data', (data: Buffer) => {\n const text = data.toString()\n if (text.includes('\"worker_stats\"')) {\n // Some chunks can contain both worker_stats and normal logs.\n // Parse only non-worker_stats lines to preserve progress events.\n const nonWorkerStatsText = text\n .split('\\n')\n .filter((line) => !line.includes('\"type\":\"worker_stats\"') && !line.includes('\"type\": \"worker_stats\"'))\n .join('\\n')\n\n if (nonWorkerStatsText.trim()) {\n this.parseOutput(nonWorkerStatsText)\n }\n } else {\n this.parseOutput(text)\n }\n this.emit('stdout', text)\n })\n }\n\n // Capture stderr\n if (this.childProcess.stderr) {\n this.childProcess.stderr.on('data', (data: Buffer) => {\n const text = data.toString()\n\n // Track stderr lines separately (keep last N lines)\n const newLines = text.split('\\n').filter((line) => line.trim())\n this.stderrLines.push(...newLines)\n if (this.stderrLines.length > this.MAX_STDERR_LINES) {\n this.stderrLines = this.stderrLines.slice(-this.MAX_STDERR_LINES)\n }\n\n // Check for fatal errors in stderr\n const lowerText = text.toLowerCase()\n let fatalError: string | null = null\n\n if (lowerText.includes('eaddrinuse') || lowerText.includes('address already in use')) {\n fatalError = `Port ${port} is already in use. Please stop the other process or use a different port.`\n } else if (lowerText.includes('eacces') || lowerText.includes('permission denied')) {\n fatalError = 'Permission denied. You may need administrator privileges.'\n } else if (lowerText.includes('econnrefused') || lowerText.includes('connection refused')) {\n fatalError = 'Connection refused. The Botpress API may be unavailable.'\n }\n\n // If we detected a fatal error, emit it and kill the process\n if (fatalError) {\n const errorObj = {\n exitCode: 1,\n stderr: this.stderrLines.join('\\n'),\n message: fatalError,\n }\n this.emit('error', errorObj)\n\n // Kill the process\n if (this.childProcess) {\n this.childProcess.kill('SIGTERM')\n }\n }\n\n // Parse stderr as well (some status messages might be there)\n this.parseOutput(text)\n this.emit('stderr', text)\n })\n }\n\n // Handle process exit\n this.childProcess.then(\n () => {\n // Process exited normally\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- child process error callback\n (error: any) => {\n if (this.killed) {\n return\n }\n\n // Build error message with stderr\n let errorMessage = error.message || 'Process exited with error'\n if (this.stderrLines.length > 0) {\n errorMessage += `\\n\\nLast ${this.stderrLines.length} lines of stderr:\\n${this.stderrLines.join('\\n')}`\n }\n\n const errorObj = {\n exitCode: error.exitCode ?? 1,\n stderr: this.stderrLines.join('\\n'),\n message: errorMessage,\n }\n\n this.emit('error', errorObj)\n }\n )\n }\n\n private parseOutput(text: string): void {\n const now = Date.now()\n const lowerText = text.toLowerCase()\n\n // Parse status changes and emit progress events\n if (lowerText.includes('generating') && lowerText.includes('typing')) {\n const event: BpDevProgressEvent = {\n type: 'generating',\n startTime: now,\n }\n this.progressEvents.set('generating', event)\n this.emit('progress', event)\n } else if (lowerText.includes('bundling') && lowerText.includes('bot')) {\n // End generating phase\n const generatingEvent = this.progressEvents.get('generating')\n if (generatingEvent && generatingEvent.type === 'generating' && !generatingEvent.endTime) {\n const updatedEvent: BpDevProgressEvent = {\n ...generatingEvent,\n endTime: now,\n }\n this.progressEvents.set('generating', updatedEvent)\n this.emit('progress', updatedEvent)\n }\n\n // Start bundling phase\n const event: BpDevProgressEvent = {\n type: 'bundling',\n startTime: now,\n }\n this.progressEvents.set('bundling', event)\n this.emit('progress', event)\n } else if (lowerText.includes('deploying') && lowerText.includes('dev')) {\n // End bundling phase\n const bundlingEvent = this.progressEvents.get('bundling')\n if (bundlingEvent && bundlingEvent.type === 'bundling' && !bundlingEvent.endTime) {\n const updatedEvent: BpDevProgressEvent = {\n ...bundlingEvent,\n endTime: now,\n }\n this.progressEvents.set('bundling', updatedEvent)\n this.emit('progress', updatedEvent)\n }\n\n // Start deploying phase\n const event: BpDevProgressEvent = {\n type: 'deploying',\n startTime: now,\n }\n this.progressEvents.set('deploying', event)\n this.emit('progress', event)\n }\n\n // Parse build time\n const buildTimeMatch = text.match(/build\\s+completed\\s+in\\s+(\\d+)\\s*ms/i)\n if (buildTimeMatch && buildTimeMatch[1]) {\n const bundlingEvent = this.progressEvents.get('bundling')\n if (bundlingEvent && bundlingEvent.type === 'bundling') {\n const updatedEvent: BpDevProgressEvent = {\n ...bundlingEvent,\n data: {\n buildTime: parseInt(buildTimeMatch[1], 10),\n },\n }\n this.progressEvents.set('bundling', updatedEvent)\n this.emit('progress', updatedEvent)\n }\n }\n\n // Parse bot deployment info\n const deployMatch = text.match(\n /dev\\s+bot\\s+deployed\\s+with\\s+id\\s+[\"']?([a-f0-9-]+)[\"']?\\s+at\\s+[\"']?(https?:\\/\\/[^\\s\"']+)[\"']?/i\n )\n if (deployMatch && deployMatch[1] && deployMatch[2]) {\n // End deploying phase\n const deployingEvent = this.progressEvents.get('deploying')\n if (deployingEvent && deployingEvent.type === 'deploying' && !deployingEvent.endTime) {\n const updatedEvent: BpDevProgressEvent = {\n ...deployingEvent,\n endTime: now,\n data: {\n botId: deployMatch[1],\n tunnelUrl: deployMatch[2],\n },\n }\n this.progressEvents.set('deploying', updatedEvent)\n this.emit('progress', updatedEvent)\n }\n }\n\n // Parse listening status\n const listeningMatch = text.match(/listening\\s+on\\s+port\\s+(\\d+)/i)\n if (listeningMatch && listeningMatch[1]) {\n const port = parseInt(listeningMatch[1], 10)\n const event: BpDevProgressEvent = {\n type: 'listening',\n startTime: now,\n data: {\n port,\n },\n }\n this.progressEvents.set('listening', event)\n this.emit('progress', event)\n\n // Optimize source map after dev server is listening\n this.optimizeSourceMapIfExists().catch(() => {\n // Silently ignore source map optimization errors\n })\n }\n }\n\n private async optimizeSourceMapIfExists(): Promise<void> {\n const { botPath } = this.options\n const sourceMapPath = join(botPath, '.botpress', 'dist', 'index.cjs.map')\n\n try {\n // Check if source map exists\n await access(sourceMapPath)\n\n // Get the agent's src directory (parent of botPath)\n const agentSrcPath = join(botPath, '..', '..', 'src')\n\n // Optimize the source map\n await optimizeSourceMap({\n sourceMapPath,\n agentSrcPath,\n })\n } catch {\n // Source map doesn't exist or optimization failed - not critical\n }\n }\n\n kill(signal: NodeJS.Signals = 'SIGTERM'): void {\n this.killed = true\n if (this.childProcess) {\n this.childProcess.kill(signal)\n }\n }\n\n async restart(): Promise<BpDevCommand> {\n this.kill('SIGTERM')\n // Wait a bit for the process to clean up\n await new Promise((resolve) => setTimeout(resolve, 1000))\n // Create new instance and start it\n const newCommand = new BpDevCommand(this.options)\n await newCommand.run()\n return newCommand\n }\n\n getProgressEvent(type: BpDevProgressEvent['type']): BpDevProgressEvent | undefined {\n return this.progressEvents.get(type)\n }\n\n getAllProgressEvents(): BpDevProgressEvent[] {\n return Array.from(this.progressEvents.values())\n }\n}\n",
|
|
24
|
+
"import { execa, type ResultPromise } from 'execa'\nimport { getBpCli } from './bp-cli.js'\nimport { BaseCommand } from './base-command.js'\n\nexport interface BpChatCommandOptions {\n botId: string\n workspaceId: string\n credentials: {\n token: string\n apiUrl: string\n }\n projectPath?: string\n}\n\nexport class BpChatCommand extends BaseCommand<never> {\n private childProcess: ResultPromise | null = null\n\n constructor(private options: BpChatCommandOptions) {\n super()\n }\n\n async run(): Promise<void> {\n const { botId, workspaceId, credentials } = this.options\n\n // Get bp command path (uses bundled CLI)\n const { path: bpCommand } = getBpCli()\n\n const bpArgs = [\n 'chat',\n '--botId',\n botId,\n '--workspaceId',\n workspaceId,\n '--token',\n credentials.token,\n '--apiUrl',\n credentials.apiUrl,\n ]\n\n this.childProcess = execa(bpCommand, bpArgs, {\n stdio: 'inherit',\n })\n\n try {\n // Wait for the process to complete\n await this.childProcess\n } catch (error: unknown) {\n // Emit error in the expected format\n const errObj = error != null && typeof error === 'object' ? error : {}\n this.emit('error', {\n exitCode: 'exitCode' in errObj ? (errObj as { exitCode: number }).exitCode || 1 : 1,\n stderr: 'stderr' in errObj ? (errObj as { stderr: string }).stderr || '' : '',\n message: error instanceof Error ? error.message || 'Chat command failed' : 'Chat command failed',\n })\n throw error\n }\n }\n\n kill(signal?: NodeJS.Signals | number): void {\n if (this.childProcess) {\n this.childProcess.kill(signal)\n }\n }\n}\n",
|
|
25
|
+
"import { execa, type ResultPromise } from 'execa'\nimport { BaseCommand } from './base-command.js'\nimport { buildOpenCodeConfig } from './opencode-config.js'\n\nexport interface OpenCodeCommandOptions {\n /** Port for the OpenCode server (default: 4096) */\n port: number\n /** Working directory (the agent project path) */\n cwd: string\n /** CORS origins to allow */\n corsOrigins?: string[]\n /** Path to the `adk` CLI binary (for MCP registration) */\n adkBinPath?: string\n /** UI/API server port so MCP tools can reach it */\n uiServerPort?: number\n}\n\nexport type OpenCodeProgressEvent =\n | { type: 'checking'; startTime: number }\n | { type: 'starting'; startTime: number }\n | { type: 'ready'; startTime: number; data: { port: number } }\n | { type: 'error'; startTime: number; data: { reason: string } }\n\nexport class OpenCodeCommand extends BaseCommand<OpenCodeProgressEvent> {\n private childProcess: ResultPromise | null = null\n private killed = false\n private readyEmitted = false\n\n constructor(private options: OpenCodeCommandOptions) {\n super()\n }\n\n // TODO: check opencode version compatibility — we don't control what version\n // the user has installed, and the config format / SSE protocol could drift.\n static async isInstalled(): Promise<boolean> {\n try {\n const cmd = process.platform === 'win32' ? 'where' : 'which'\n await execa(cmd, ['opencode'])\n return true\n } catch {\n return false\n }\n }\n\n private emitReady(): void {\n if (this.readyEmitted || this.killed) return\n this.readyEmitted = true\n this.emit('progress', {\n type: 'ready',\n startTime: Date.now(),\n data: { port: this.options.port },\n })\n }\n\n async run(): Promise<void> {\n const { port, cwd, corsOrigins = [] } = this.options\n\n this.emit('progress', { type: 'checking', startTime: Date.now() })\n\n const installed = await OpenCodeCommand.isInstalled()\n if (!installed) {\n this.emit('progress', {\n type: 'error',\n startTime: Date.now(),\n data: { reason: 'opencode not installed' },\n })\n return\n }\n\n this.emit('progress', { type: 'starting', startTime: Date.now() })\n\n const args = ['serve', '--port', String(port)]\n for (const origin of corsOrigins) {\n args.push('--cors', origin)\n }\n\n const adkBin = this.options.adkBinPath || 'adk'\n const opencodeConfig = JSON.stringify(\n buildOpenCodeConfig({\n adkBinPath: adkBin,\n agentPath: cwd,\n uiServerPort: this.options.uiServerPort,\n openCodePort: port,\n corsOrigins,\n })\n )\n\n this.childProcess = execa('opencode', args, {\n cwd,\n env: { ...process.env, OPENCODE_CONFIG_CONTENT: opencodeConfig },\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n if (this.childProcess.stdout) {\n this.childProcess.stdout.on('data', (data: Buffer) => {\n this.emit('stdout', data.toString())\n })\n }\n\n if (this.childProcess.stderr) {\n this.childProcess.stderr.on('data', (data: Buffer) => {\n const text = data.toString()\n this.emit('stderr', text)\n\n const lower = text.toLowerCase()\n if (lower.includes('eaddrinuse') || lower.includes('address already in use')) {\n this.emit('progress', {\n type: 'error',\n startTime: Date.now(),\n data: { reason: `Port ${port} already in use` },\n })\n this.kill()\n }\n })\n }\n\n this.childProcess.then(\n () => {\n if (!this.killed && !this.readyEmitted) {\n this.readyEmitted = true\n this.emit('progress', {\n type: 'error',\n startTime: Date.now(),\n data: { reason: 'OpenCode process exited unexpectedly' },\n })\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- child process error callback\n (error: any) => {\n if (this.killed) return\n this.readyEmitted = true\n this.emit('progress', {\n type: 'error',\n startTime: Date.now(),\n data: { reason: error.message || 'OpenCode process exited unexpectedly' },\n })\n }\n )\n\n // Poll until the server responds instead of relying on stdout parsing\n this.pollUntilReady(port)\n }\n\n private async pollUntilReady(port: number): Promise<void> {\n const deadline = Date.now() + 15_000\n while (!this.killed && !this.readyEmitted && Date.now() < deadline) {\n try {\n const res = await fetch(`http://localhost:${port}/`)\n if (res.ok || res.status < 500) {\n this.emitReady()\n return\n }\n } catch {\n // Server not up yet\n }\n await new Promise<void>((r) => setTimeout(r, 500))\n }\n if (!this.readyEmitted && !this.killed) {\n this.emit('progress', {\n type: 'error',\n startTime: Date.now(),\n data: { reason: 'OpenCode server did not respond in time' },\n })\n }\n }\n\n kill(signal: NodeJS.Signals = 'SIGTERM'): void {\n this.killed = true\n if (this.childProcess) {\n this.childProcess.kill(signal)\n }\n }\n}\n",
|
|
26
|
+
"export interface OpenCodeConfig {\n mcp: Record<string, { type: string; command: string[] }>\n agent: Record<string, { description: string; prompt: string }>\n server?: { port: number; cors?: string[] }\n}\n\nconst COPILOT_PROMPT = `You are the ADK Copilot — an expert assistant embedded in the Botpress Agent Development Kit control panel.\n\n## Who you help\nA developer building an AI agent with the ADK. They're running \\`adk dev\\` and have the control panel open alongside you. They can see traces, logs, integrations, workflows, and tables in the UI.\n\n## What you know\nThe ADK is a high-level framework built on Botpress. An agent project has:\n- /actions — strongly-typed callable functions (Action from @botpress/runtime)\n- /tools — LLM-callable interfaces with natural language descriptions (Tool from @botpress/runtime)\n- /workflows — step-based, resumable long-running processes (Workflow from @botpress/runtime)\n- /conversations — channel-specific interaction handlers (Conversation from @botpress/runtime)\n- /tables — schema-validated data storage with semantic search (Table from @botpress/runtime)\n- /triggers — event subscription system (Trigger from @botpress/runtime)\n- /knowledge — RAG knowledge base documents\n- agent.config.ts — agent metadata, integrations, model configuration, variables\n\nThe ADK compiles these high-level primitives down to Botpress SDK primitives. Default to ADK terms. Only drop to Botpress SDK concepts when the problem requires it (SDK-level errors, compilation issues, or when the developer explicitly asks).\n\nSchemas use \\`z\\` from @botpress/sdk (a Zod fork) — never import Zod directly.\n\nYou also have access to Botpress documentation search for platform-level questions (SDK, API, integrations).\n\n## How you work\n\n**Orient on first interaction.** If you haven't yet, use \\`adk_get_agent_info\\` to learn the project's structure, primitives, and integrations before answering.\n\n**Conceptual vs. project questions.** Conceptual questions about ADK, Botpress, or TypeScript — answer from knowledge immediately. Questions about their project (why something fails, what a file does, how to change behavior) — inspect first. If in doubt, answer what you can immediately and inspect in parallel.\n\n**Read freely, write carefully.** Inspecting files, querying traces, and searching the hub are always safe — do them without asking. But actions that modify the project (adding integrations, editing files, executing workflows, sending messages) should be confirmed first unless the developer explicitly asked you to do it.\n\n**Debug by matching the approach to the problem:**\n- Developer gives you an error message → start from the error, don't begin at \"step 1\"\n- Build or type error → check the file and generated types. Traces won't help.\n- Runtime behavior is wrong (\"it responds wrong\") → query traces (\\`adk_query_traces\\`) for the conversation to find the failing span\n- Nothing happens → check dev logs (\\`adk_get_dev_logs\\`) for silent failures, then check if the handler is registered\n- When in doubt → start with \\`adk_get_dev_logs\\` with error filtering, then query traces\n\n**Integrations.** First check if the integration already exists in the project. If it does, inspect its current configuration. Only search the hub (\\`adk_search_integrations\\`) when adding a new integration. Get details (\\`adk_get_integration\\`) to understand actions, events, channels, and config requirements. Add it (\\`adk_add_integration\\`) after the developer confirms.\n\n**Test iteratively.** Send messages to the running bot (\\`adk_send_message\\`) to verify behavior. To continue a conversation, pass back both the \\`conversationId\\` and \\`userKey\\` from the previous response. Only test against the local dev bot.\n\n**Workflows.** Get the input schema first by calling \\`adk_start_workflow\\` without a payload, then execute by calling it again with \\`payload\\` set to the correct input. For workflows with no required input, pass \\`payload: {}\\` — omitting payload returns the schema, it does not execute.\n\n**Handle failures.** If a tool returns an error, tell the developer what happened and suggest a concrete next step (e.g., \"Dev server isn't running — start it with \\`adk dev\\`\"). Don't silently retry or ignore errors.\n\n**Edit with precision.** When modifying code, change only what's needed to solve the problem. Don't refactor surrounding code, add features, or \"improve\" things that weren't asked about. When writing ADK primitives, match ADK conventions. For utility code, match the patterns already in the project.\n\n## How you communicate\n\n**Lead with the answer.** First sentence is the diagnosis, the solution, or the action you took. Context and explanation come after, if needed.\n\n**Show, don't describe.** Instead of \"you should add error handling,\" show the code change. Instead of \"the trace shows a failure,\" show the relevant span data and what it means.\n\n**Match the developer's energy.** Short question → short answer. Detailed question → detailed response. \"Why is this broken?\" → diagnosis + fix. \"How do workflows work?\" → teach.\n\n**Hypothesize while verifying.** If you have a likely diagnosis, say so while you check. \"This usually means X — checking your trace now\" is better than silence followed by an answer.\n\n**When you fix something, explain what you changed and why.** Don't apply changes silently — the developer needs to understand the fix to trust it and learn from it.\n\n**When you don't know, say so plainly.** \"I don't have enough context — can you share the error message?\" is fine.\n\n**Skip the filler.** No \"Great question!\", no \"Let me help you with that.\" Just do it.\n\n**Never read or display the contents of .env files or credentials.** If you need to verify a configuration value, ask the developer to confirm it.`\n\n/**\n * Build the OpenCode configuration for the ADK Copilot.\n *\n * Registers the ADK MCP server and sets up a default agent prompt\n * scoped to ADK development. Passed to `opencode serve` via\n * the `OPENCODE_CONFIG_CONTENT` environment variable.\n */\nexport function buildOpenCodeConfig(options: {\n adkBinPath: string\n agentPath: string\n uiServerPort?: number\n openCodePort?: number\n corsOrigins?: string[]\n}): OpenCodeConfig {\n const command = [options.adkBinPath, 'mcp', '--cwd', options.agentPath]\n if (options.uiServerPort) command.push('--port', String(options.uiServerPort))\n\n return {\n ...(options.openCodePort && {\n server: {\n port: options.openCodePort,\n ...(options.corsOrigins?.length && { cors: options.corsOrigins }),\n },\n }),\n mcp: {\n adk: {\n type: 'local',\n command,\n },\n },\n agent: {\n default: {\n description: 'ADK Copilot — helps build and debug Botpress ADK agents',\n prompt: COPILOT_PROMPT,\n },\n },\n }\n}\n",
|
|
27
27
|
"import { Client } from '@botpress/client'\nimport { auth } from '../auth/index.js'\n\ninterface WorkspaceInfo {\n id: string\n name: string\n fetchedAt: number\n}\n\nclass WorkspaceCache {\n private cache: Map<string, WorkspaceInfo> = new Map()\n private readonly CACHE_TTL = 60 * 60 * 1000 // 1 hour\n\n async getWorkspaceName(workspaceId: string): Promise<string | undefined> {\n // Check cache first\n const cached = this.cache.get(workspaceId)\n if (cached && Date.now() - cached.fetchedAt < this.CACHE_TTL) {\n return cached.name\n }\n\n try {\n // Get credentials to create client\n const credentials = await auth.getActiveCredentials()\n const client = new Client({\n apiUrl: credentials.apiUrl,\n token: credentials.token,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n\n // Fetch all workspaces and find the one with matching ID\n const { workspaces } = await client.listWorkspaces({})\n const workspace = workspaces.find((ws) => ws.id === workspaceId)\n\n if (!workspace) {\n return undefined\n }\n\n // Cache the result\n this.cache.set(workspaceId, {\n id: workspaceId,\n name: workspace.name,\n fetchedAt: Date.now(),\n })\n\n return workspace.name\n } catch (error) {\n console.error(`Failed to fetch workspace name for ${workspaceId}:`, error)\n return undefined\n }\n }\n\n clear(): void {\n this.cache.clear()\n }\n}\n\n// Export singleton instance\nexport const workspaceCache = new WorkspaceCache()\n",
|
|
28
28
|
"import { DateTime } from 'luxon'\n\nexport function getRelativeTime(date: string | Date): string {\n const dateTime = typeof date === 'string' ? DateTime.fromISO(date) : DateTime.fromJSDate(date)\n const now = DateTime.now()\n\n const diff = now.diff(dateTime, ['years', 'months', 'days', 'hours', 'minutes'])\n\n if (diff.years >= 1) {\n return `${Math.floor(diff.years)} year${Math.floor(diff.years) > 1 ? 's' : ''} ago`\n } else if (diff.months >= 1) {\n return `${Math.floor(diff.months)} month${Math.floor(diff.months) > 1 ? 's' : ''} ago`\n } else if (diff.days >= 1) {\n return `${Math.floor(diff.days)} day${Math.floor(diff.days) > 1 ? 's' : ''} ago`\n } else if (diff.hours >= 1) {\n return `${Math.floor(diff.hours)} hour${Math.floor(diff.hours) > 1 ? 's' : ''} ago`\n } else if (diff.minutes >= 1) {\n return `${Math.floor(diff.minutes)} minute${Math.floor(diff.minutes) > 1 ? 's' : ''} ago`\n } else {\n return 'just now'\n }\n}\n",
|
|
29
29
|
"/**\n * Utility to load @botpress/chat via CJS resolution from within the ADK's dependency tree.\n *\n * ## Why CJS?\n *\n * @botpress/chat ships two bundles:\n * - index.mjs (browser build): axios 1.2.5 fully inlined with http adapter set to null\n * - index.cjs (Node build): uses external require(\"axios\") with real Node.js http adapter\n *\n * ESM `import()` resolves via the \"module\" field to index.mjs, which has a broken http\n * adapter in any server runtime (Node, Bun, compiled binary). CJS `require()` resolves\n * via \"main\" to index.cjs with a working adapter.\n *\n * ## Why two hops?\n *\n * In a compiled Bun binary, `import.meta.url` points to `/$bunfs/root/` (a virtual FS\n * with no node_modules), so `createRequire` must anchor to `process.cwd()`. But\n * `@botpress/chat` is a dependency of `@botpress/adk`, not the agent project at cwd.\n * So we first resolve `@botpress/adk` from cwd, then resolve `@botpress/chat` from\n * the ADK's location on disk.\n */\n\nimport { createRequire } from 'module'\nimport { join } from 'path'\n\n// preserves typings of the Client class from @botpress/chat without a direct import there\nexport type ChatClient = typeof import('@botpress/chat').Client\n\n// Cache ChatClient per resolved @botpress/adk/package.json path to respect different cwds\nconst _cachedByAdkPath: Map<string, ChatClient> = new Map()\n\n/**\n * Returns the @botpress/chat Client class, resolved via CJS from the ADK's dependency tree.\n * Result is cached per resolved ADK package path after first call.\n */\nexport function getChatClient(cwd = process.cwd()): ChatClient {\n const cwdRequire = createRequire(join(cwd, 'package.json'))\n const adkPkgPath = cwdRequire.resolve('@botpress/adk/package.json')\n\n const cached = _cachedByAdkPath.get(adkPkgPath)\n if (cached) return cached\n\n const adkRequire = createRequire(adkPkgPath)\n const { Client } = adkRequire('@botpress/chat') as { Client: ChatClient }\n\n _cachedByAdkPath.set(adkPkgPath, Client)\n return Client\n}\n",
|
|
30
|
-
"/**\n * Utility for ensuring consistent key ordering in JSON files\n */\n\n// Key ordering arrays for different file types\nexport const agentInfoKeyOrder = ['botId', 'workspaceId', 'apiUrl', 'devId'] as const\nexport const dependenciesKeyOrder = ['integrations'] as const\nexport const integrationKeyOrder = ['version', 'enabled', 'configurationType', 'config'] as const\n\n/**\n * Orders object keys according to a specified order, with unspecified keys at the end alphabetically\n */\nexport function orderKeys<T extends Record<string,
|
|
31
|
-
"import { BuiltInActions, BuiltInWorkflows, Errors, Primitives, setAdkCommand } from '@botpress/runtime/internal'\nimport createDebug from 'debug'\nimport { createRequire } from 'module'\n\nimport fs from 'fs/promises'\nimport path from 'path'\n\nimport { AssetsManager, AssetSyncOptions, AssetSyncPlan, AssetSyncResult } from '../assets/index.js'\nimport { IntegrationManager } from '../integrations/index.js'\nimport { ParsedIntegration } from '../integrations/types.js'\nimport { InterfaceManager } from '../interfaces/index.js'\nimport { ParsedInterface } from '../interfaces/types.js'\n\nimport { agentInfoKeyOrder, stringifyWithOrder } from '../utils/json-ordering.js'\nimport { expandExports } from './expand-exports.js'\nimport { resolveAgent } from './agent-resolver.js'\nimport {\n AgentConfig,\n AgentInfo,\n Dependencies,\n dependenciesSchema,\n Integration,\n ProjectInfo,\n ProjectState,\n ValidationError,\n ValidationErrorCode,\n ValidationResult,\n ValidationSeverity,\n} from './types.js'\nimport { ValidationErrors } from './validation-errors.js'\n\nexport interface AgentProjectOptions {\n noCache?: boolean\n adkCommand?: 'adk-dev' | 'adk-build' | 'adk-deploy'\n}\n\nconst debug = createDebug('adk:agent-project')\ntype ConversationDefinition = Primitives.Definitions.ConversationDefinition\ntype KnowledgeDefinition = Primitives.Definitions.KnowledgeDefinition\ntype TriggerDefinition = Primitives.Definitions.TriggerDefinition\ntype WorkflowDefinition = Primitives.Definitions.WorkflowDefinition\ntype ActionDefinition = Primitives.Definitions.ActionDefinition\ntype TableDefinition = Primitives.Definitions.TableDefinition\ntype PrimitiveDefinition = Primitives.Definitions.PrimitiveDefinition\n\nexport type PrimitiveReference<T extends PrimitiveDefinition = PrimitiveDefinition> = {\n path: string\n export: string\n definition: T\n}\n\nexport class AgentProject {\n private static _projectCache = new Map<string, AgentProject>()\n\n private _options: AgentProjectOptions\n private _path: string\n private _config?: AgentConfig\n private _dependencies?: Dependencies\n private _agentInfo?: AgentInfo\n private _state: ProjectState = ProjectState.Unloaded\n private _errors: ValidationError[] = []\n private _warnings: ValidationError[] = []\n\n private _lastBuildTime?: Date\n private _integrations?: ParsedIntegration[]\n private _interfaces?: ParsedInterface[]\n private _integrationManager: IntegrationManager\n private _interfaceManager: InterfaceManager\n private _assetsManager: AssetsManager\n private _conversations: PrimitiveReference<ConversationDefinition>[] = []\n private _knowledge: PrimitiveReference<KnowledgeDefinition>[] = []\n private _triggers: PrimitiveReference<TriggerDefinition>[] = []\n private _workflows: PrimitiveReference<WorkflowDefinition>[] = []\n private _actions: PrimitiveReference<ActionDefinition>[] = []\n private _tables: PrimitiveReference<TableDefinition>[] = []\n\n constructor(projectPath: string, options: AgentProjectOptions = {}) {\n this._options = options\n this._path = path.resolve(projectPath)\n this._integrationManager = new IntegrationManager({\n noCache: options.noCache,\n })\n this._interfaceManager = new InterfaceManager({\n noCache: options.noCache,\n })\n this._assetsManager = new AssetsManager({\n projectPath: this._path,\n })\n }\n\n // Static factory methods\n static async load(projectPath: string, options: AgentProjectOptions = {}): Promise<AgentProject> {\n const resolvedPath = path.resolve(projectPath)\n\n // Check cache unless explicitly disabled\n if (!options.noCache) {\n const cached = AgentProject._projectCache.get(resolvedPath)\n if (cached) {\n return cached\n }\n }\n\n // Create and load new project\n const project = new AgentProject(resolvedPath, options)\n await project.reload()\n\n // Cache the project unless caching is disabled\n if (!options.noCache) {\n AgentProject._projectCache.set(resolvedPath, project)\n }\n\n return project\n }\n\n // Static method to clear the cache\n static clearCache(): void {\n AgentProject._projectCache.clear()\n }\n\n // Static method to remove a specific project from cache\n static clearCacheForPath(projectPath: string): void {\n const resolvedPath = path.resolve(projectPath)\n AgentProject._projectCache.delete(resolvedPath)\n }\n\n // Public properties\n get path(): string {\n return this._path\n }\n\n get conversations(): PrimitiveReference<ConversationDefinition>[] {\n return this._conversations\n }\n\n get knowledge(): PrimitiveReference<KnowledgeDefinition>[] {\n return this._knowledge\n }\n\n get triggers(): PrimitiveReference<TriggerDefinition>[] {\n return this._triggers\n }\n\n get workflows(): PrimitiveReference<WorkflowDefinition>[] {\n return this._workflows\n }\n\n get actions(): PrimitiveReference<ActionDefinition>[] {\n return this._actions\n }\n\n get tables(): PrimitiveReference<TableDefinition>[] {\n return this._tables\n }\n\n get config(): AgentConfig | undefined {\n return this._config\n }\n\n get dependencies(): Dependencies | undefined {\n return this._dependencies\n }\n\n get agentInfo(): AgentInfo | undefined {\n return this._agentInfo\n }\n\n get state(): ProjectState {\n return this._state\n }\n\n get info(): ProjectInfo {\n return {\n path: this._path,\n config: this._config!,\n dependencies: this._dependencies || {\n integrations: {},\n },\n agentInfo: this._agentInfo,\n state: this._state,\n lastBuildTime: this._lastBuildTime,\n errors: [...this._errors],\n warnings: [...this._warnings],\n errorCount: this._errors.filter((e) => e.severity === ValidationSeverity.ERROR).length,\n warningCount: this._warnings.filter((e) => e.severity === ValidationSeverity.WARNING).length,\n infoCount: [...this._errors, ...this._warnings].filter((e) => e.severity === ValidationSeverity.INFO).length,\n }\n }\n\n // Core methods\n async reload(): Promise<void> {\n this._state = ProjectState.Loading\n\n try {\n // Clear previous state\n this._conversations = []\n this._knowledge = []\n this._triggers = []\n this._workflows = []\n this._actions = []\n this._tables = []\n this._errors = []\n this._warnings = []\n\n // Validate project structure\n const validation = await this.validate()\n this._errors = validation.errors\n this._warnings = validation.warnings\n\n if (!validation.valid) {\n this._state = ProjectState.Error\n\n throw new Error(`Project validation failed: ${validation.errors[0]?.message}`)\n }\n\n // Load agent info FIRST so we have the workspaceId\n await this.loadAgentInfo()\n\n // Create managers with the correct workspaceId from agent.json\n this._integrationManager = new IntegrationManager({\n noCache: this._options.noCache,\n workspaceId: this._agentInfo?.workspaceId,\n })\n\n this._interfaceManager = new InterfaceManager({\n noCache: this._options.noCache,\n workspaceId: this._agentInfo?.workspaceId,\n })\n\n this._assetsManager = new AssetsManager({\n projectPath: this._path,\n workspaceId: this._agentInfo?.workspaceId,\n botId: this._agentInfo?.botId,\n })\n\n // Load configuration (which will use the managers with correct workspaceId)\n await this.loadConfig()\n\n await this.loadBuiltInWorkflows()\n await this.loadBuiltInActions()\n await this.loadAgentPrimitives()\n\n if (this._errors.length > 0) {\n this._state = ProjectState.Error\n } else {\n this._state = ProjectState.Ready\n }\n } catch (error) {\n this._state = ProjectState.Error\n\n throw error\n }\n }\n\n async validate(): Promise<ValidationResult> {\n const errors: ValidationError[] = []\n const warnings: ValidationError[] = []\n const info: ValidationError[] = []\n\n try {\n // Check if directory exists\n await fs.access(this._path)\n\n // Check for required files\n const requiredFiles = ['agent.config.ts']\n for (const file of requiredFiles) {\n try {\n await fs.access(path.join(this._path, file))\n } catch {\n errors.push(ValidationErrors.requiredFileMissing(file))\n }\n }\n\n // Check for agent.json (optional, but warn if missing for deployed projects)\n try {\n await fs.access(path.join(this._path, 'agent.json'))\n } catch {\n // agent.json is optional, but we add an informational message\n info.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.MISSING_REQUIRED_FIELD,\n severity: ValidationSeverity.INFO,\n message: 'agent.json not found - this file will be required for deployment and remote operations',\n file: 'agent.json',\n hint: 'Create agent.json with botId and workspaceId after deploying your agent',\n })\n }\n\n // Check directory structure\n const expectedDirs = ['actions', 'workflows', 'conversations', 'assets']\n for (const dir of expectedDirs) {\n try {\n const stats = await fs.stat(path.join(this._path, dir))\n if (!stats.isDirectory()) {\n warnings.push(ValidationErrors.invalidStructure(dir, 'directory'))\n }\n } catch {\n // Directory doesn't exist, which is okay - they're optional\n }\n }\n } catch (error) {\n errors.push(ValidationErrors.directoryAccessError(this._path, String(error)))\n }\n\n // Filter by severity\n const errorsBySeverity = {\n errors: errors.filter((e) => e.severity === ValidationSeverity.ERROR),\n warnings: [...warnings, ...errors.filter((e) => e.severity === ValidationSeverity.WARNING)],\n info: [...info, ...errors.filter((e) => e.severity === ValidationSeverity.INFO)],\n }\n\n return {\n valid: errorsBySeverity.errors.length === 0,\n errors: errorsBySeverity.errors,\n warnings: errorsBySeverity.warnings,\n info: errorsBySeverity.info,\n errorCount: errorsBySeverity.errors.length,\n warningCount: errorsBySeverity.warnings.length,\n infoCount: errorsBySeverity.info.length,\n }\n }\n\n get integrations(): ParsedIntegration[] {\n if (!this._integrations) {\n throw new Error('Integrations not loaded')\n }\n\n return this._integrations!\n }\n\n get interfaces(): ParsedInterface[] {\n if (!this._interfaces) {\n throw new Error('Interfaces not loaded')\n }\n return this._interfaces!\n }\n\n // Integration management methods\n async getIntegrations(): Promise<Integration[]> {\n if (!this._dependencies || !this._integrations) {\n throw new Error('Project not loaded')\n }\n\n // Convert ParsedIntegration to Integration format\n return this._integrations.map((parsed) => ({\n name: parsed.alias,\n version: parsed.ref.version,\n workspace: parsed.ref.workspace,\n config: parsed.config,\n installed: false, // This would be determined by checking workspace\n installedVersion: undefined,\n hasChannels: parsed.definition?.channels && Object.keys(parsed.definition.channels).length > 0,\n }))\n }\n\n // Asset management methods\n async createAssetSyncPlan(): Promise<AssetSyncPlan> {\n if (this._state !== ProjectState.Ready) {\n throw new Error('Project must be in Ready state to create asset sync plan')\n }\n\n this.requiresAgentInfo('create asset sync plan')\n return await this._assetsManager.createSyncPlan()\n }\n\n async syncAssets(options?: AssetSyncOptions): Promise<AssetSyncResult> {\n if (this._state !== ProjectState.Ready) {\n throw new Error('Project must be in Ready state to sync assets')\n }\n\n this.requiresAgentInfo('sync assets')\n const plan = await this._assetsManager.createSyncPlan()\n return await this._assetsManager.executeSync(plan, options)\n }\n\n async hasAssetsDirectory(): Promise<boolean> {\n return await this._assetsManager.hasAssetsDirectory()\n }\n\n get assetsManager(): AssetsManager {\n return this._assetsManager\n }\n\n // Agent info management methods\n async createAgentInfo(info: AgentInfo): Promise<void> {\n const agentPath = path.join(this._path, 'agent.json')\n const agentContent = stringifyWithOrder(info, agentInfoKeyOrder)\n await fs.writeFile(agentPath, agentContent)\n this._agentInfo = info\n }\n\n async updateAgentInfo(updates: Partial<AgentInfo>): Promise<void> {\n if (!this._agentInfo) {\n throw new Error('No agent.json found. Use createAgentInfo() first.')\n }\n\n const updatedInfo = { ...this._agentInfo, ...updates }\n const agentPath = path.join(this._path, 'agent.json')\n const agentContent = stringifyWithOrder(updatedInfo, agentInfoKeyOrder)\n await fs.writeFile(agentPath, agentContent)\n this._agentInfo = updatedInfo\n }\n\n requiresAgentInfo(operation: string): void {\n if (!this._agentInfo?.botId) {\n throw new Error(\n `Operation \"${operation}\" requires a bot ID. ` +\n 'Please create agent.json with botId and workspaceId after deploying your agent.'\n )\n }\n }\n\n // Private helper methods\n private async loadConfig(): Promise<void> {\n try {\n // Bust module cache to ensure fresh config on reload\n const configPath = path.join(this._path, 'agent.config.ts')\n debug('loading agent.config.ts from %s', configPath)\n\n // Create a require function that resolves from the user's project directory\n // This is critical for compiled binaries which otherwise resolve modules from the binary's location\n const projectRequire = createRequire(path.join(this._path, 'package.json'))\n debug('created projectRequire from %s', path.join(this._path, 'package.json'))\n\n // Clear the module from cache if it exists\n try {\n const resolvedPath = projectRequire.resolve(configPath)\n debug('resolved config path: %s', resolvedPath)\n if (projectRequire.cache[resolvedPath]) {\n debug('clearing require.cache for %s', resolvedPath)\n delete projectRequire.cache[resolvedPath]\n }\n } catch {\n // Module not in cache yet, that's fine\n debug('config not in require.cache (first load)')\n }\n\n let configModule: any\n try {\n // Use ?t= query string for cache busting to ensure fresh imports on reload\n const configUrl = `${configPath}?t=${Date.now()}`\n debug('importing from: %s', configUrl)\n configModule = await import(configUrl)\n debug('successfully loaded agent.config.ts')\n } catch (importError) {\n debug('failed to load agent.config.ts: %O', importError)\n throw importError\n }\n if (!configModule || !configModule.default) {\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_CONFIG_SCHEMA,\n severity: ValidationSeverity.ERROR,\n message: 'agent.config.ts does not export a default configuration object',\n file: 'agent.config.ts',\n })\n return\n }\n\n // Check if the config was created with defineConfig\n const { isAgentConfig } = await import('@botpress/runtime/internal')\n if (!isAgentConfig(configModule.default)) {\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_CONFIG_SCHEMA,\n severity: ValidationSeverity.ERROR,\n message:\n 'agent.config.ts must export the result of defineConfig(). ' +\n \"Example: export default defineConfig({ name: 'my-agent', ... })\",\n file: 'agent.config.ts',\n hint: 'Wrap your config object with defineConfig() from @botpress/runtime',\n })\n return\n }\n\n this._config = configModule.default as AgentConfig\n\n // Extract dependencies from config\n const config = configModule.default as any\n if (config.dependencies) {\n // Validate dependencies against schema\n const validationResult = dependenciesSchema.safeParse(config.dependencies)\n if (!validationResult.success) {\n const errors = validationResult.error.errors\n for (const error of errors) {\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_DEPENDENCIES_SCHEMA,\n severity: ValidationSeverity.ERROR,\n message: `Invalid dependencies in agent.config.ts: ${error.path.join('.')} - ${error.message}`,\n file: 'agent.config.ts',\n hint: error.code === 'invalid_type' ? `Expected ${error.expected}, but got ${error.received}` : undefined,\n })\n }\n this._dependencies = { integrations: {} }\n this._integrations = []\n this._interfaces = []\n return\n }\n\n this._dependencies = validationResult.data\n\n // Validate and load integrations and interfaces\n if (this._dependencies) {\n const [intRes, ifRes] = await Promise.all([\n this._integrationManager.loadIntegrations(this._dependencies),\n this._interfaceManager.loadInterfaces(this._dependencies),\n ])\n this._integrations = intRes.integrations\n this._interfaces = ifRes.interfaces\n\n // Add errors and warnings\n this._errors.push(...intRes.errors, ...ifRes.errors)\n this._warnings.push(...intRes.warnings, ...ifRes.warnings)\n }\n } else {\n // No dependencies in config\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.MISSING_REQUIRED_FIELD,\n severity: ValidationSeverity.ERROR,\n message: 'agent.config.ts must include a dependencies field',\n file: 'agent.config.ts',\n hint: 'Add dependencies: { integrations: {} } to your defineConfig() call',\n })\n this._dependencies = { integrations: {} }\n this._integrations = []\n this._interfaces = []\n }\n } catch (error) {\n const err = error as Error\n debug('loadConfig error: %O', err)\n\n // Build a detailed error message with stack trace for debugging\n let detailedMessage = `Failed to load agent.config.ts: ${err.message}`\n if (err.stack) {\n // Include the stack trace in debug output\n debug('stack trace:\\n%s', err.stack)\n }\n\n // Check for common issues and provide helpful hints\n let hint: string | undefined\n if (err.message.includes('Cannot find module')) {\n const moduleMatch = err.message.match(/Cannot find module '([^']+)'/)\n const moduleName = moduleMatch?.[1] || 'unknown'\n hint = `Module \"${moduleName}\" is not installed. Run \"bun install\" to install dependencies.`\n detailedMessage += `\\n\\n Stack trace:\\n${err.stack?.split('\\n').slice(0, 5).join('\\n')}`\n }\n\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_CONFIG_SYNTAX,\n severity: ValidationSeverity.ERROR,\n message: detailedMessage,\n file: 'agent.config.ts',\n hint,\n })\n }\n }\n\n private async loadAgentInfo(): Promise<void> {\n try {\n // Use the agent resolver to load agent.json (not required for basic project loading)\n const agentInfo = await resolveAgent(this._path, { required: false })\n this._agentInfo = agentInfo ?? undefined\n } catch (error) {\n // Handle validation errors from resolver\n if (ValidationErrors.isValidationError(error)) {\n this._errors.push(error)\n } else if (error instanceof Error) {\n // Unexpected error - wrap it\n this._errors.push(ValidationErrors.warning(`Failed to load agent.json: ${error.message}`, 'agent.json'))\n }\n\n this._agentInfo = undefined\n }\n }\n\n private async loadBuiltInWorkflows(): Promise<void> {\n for (const wf of Object.values(BuiltInWorkflows)) {\n const definition = Primitives.Definitions.getDefinition(wf)\n if (Primitives.Definitions.isWorkflowDefinition(definition)) {\n this._workflows.push({\n definition,\n export: 'default',\n path: '<adk:builtin>',\n })\n }\n }\n }\n\n private async loadBuiltInActions(): Promise<void> {\n for (const action of Object.values(BuiltInActions)) {\n const definition = Primitives.Definitions.getDefinition(action)\n if (Primitives.Definitions.isActionDefinition(definition)) {\n this._actions.push({\n definition,\n export: 'default',\n path: '<adk:builtin>',\n })\n }\n }\n }\n\n private async registerDataSourceWorkflows(knowledgeBase: any, kbPath: string, kbExport: string): Promise<void> {\n try {\n // Each knowledge base has data sources with sync workflows\n if (!knowledgeBase.sources || !Array.isArray(knowledgeBase.sources)) {\n return\n }\n\n for (const source of knowledgeBase.sources) {\n if (!source.syncWorkflow) {\n continue\n }\n\n const workflowDefinition = source.syncWorkflow.getDefinition()\n\n // Check if workflow already exists\n const existing = this._workflows.find((p) => p.definition.name === workflowDefinition.name)\n\n if (existing) {\n // Skip if already registered\n continue\n }\n\n // Register the data source's sync workflow\n this._workflows.push({\n definition: workflowDefinition,\n export: `${kbExport}.sources[${knowledgeBase.sources.indexOf(source)}].syncWorkflow`,\n path: kbPath,\n })\n }\n } catch (error) {\n console.warn(`Failed to register data source workflows for ${kbPath}:`, error)\n }\n }\n\n /**\n * Get list of channels from a channel specification (single, array, or glob)\n * For glob '*', we need to check against all integration channels - but for validation\n * we treat it as a special marker\n */\n private getChannelsList(channelSpec: string | string[]): string[] {\n if (channelSpec === '*') {\n return ['*'] // Glob marker - matches everything\n } else if (Array.isArray(channelSpec)) {\n return channelSpec\n } else {\n return [channelSpec]\n }\n }\n\n private async loadAgentPrimitives(): Promise<void> {\n // Set the ADK command in the runtime environment\n if (this._options.adkCommand) {\n setAdkCommand(this._options.adkCommand)\n }\n\n const src = path.join(this._path, 'src')\n\n if (!(await fs.stat(src).catch(() => false))) {\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_STRUCTURE,\n severity: ValidationSeverity.ERROR,\n message: `\\`src\\` directory not found at expected path: ${src}`,\n })\n return\n }\n\n const allFiles = await fs.readdir(src, {\n withFileTypes: true,\n recursive: true,\n })\n\n for (const file of allFiles.filter((x) => x.isFile())) {\n const filename = file.name\n const absolutePath = path.join(file.parentPath, file.name)\n const relPath = path.relative(this.path, absolutePath)\n\n if (filename.toLowerCase().endsWith('.d.ts')) {\n // Skip TypeScript declaration files\n continue\n }\n\n if (filename.toLowerCase().endsWith('.test.ts') || filename.toLowerCase().endsWith('.test.js')) {\n // Skip test files\n continue\n }\n\n if (!filename.toLowerCase().endsWith('.js') && !filename.toLowerCase().endsWith('.ts')) {\n continue // Only process .js or .ts files\n }\n\n if (file.isSymbolicLink()) {\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_FILE_TYPE,\n severity: ValidationSeverity.WARNING,\n message: `Skipping symbolic link in conversations directory: ${relPath}`,\n file: relPath,\n })\n continue\n }\n\n try {\n const expandedExports = await expandExports({\n absolutePath,\n relPath,\n filename,\n onWarning: (warning) => this._warnings.push(warning),\n })\n\n for (const key of Object.keys(expandedExports)) {\n let definition\n try {\n definition = Primitives.Definitions.getDefinition(expandedExports[key])\n } catch (error) {\n // This might catch errors from getDefinition itself\n if (Errors.isAdkError(error)) {\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_PRIMITIVE_DEFINITION,\n severity: ValidationSeverity.WARNING,\n message: error.message,\n file: relPath,\n hint: `Check the primitive definition in ${filename} -> ${key}`,\n })\n continue\n }\n // Re-throw if it's not an ADK error\n throw error\n }\n\n if (Primitives.Definitions.isConversationDefinition(definition)) {\n // Check for overlapping channel definitions\n const overlapping = this._conversations.find((p) => {\n const existingChannels = this.getChannelsList(p.definition.channel)\n const newChannels = this.getChannelsList(definition.channel)\n\n // Check if any channel overlaps\n return existingChannels.some((ch) => newChannels.includes(ch))\n })\n\n if (overlapping) {\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Overlapping conversation channels found: ${filename} -> ${key} overlaps with ${overlapping.path} -> ${overlapping.export}`,\n file: relPath,\n })\n continue\n }\n this._conversations.push({\n definition,\n export: key,\n path: relPath,\n })\n } else if (Primitives.Definitions.isKnowledgeDefinition(definition)) {\n const existing = this._knowledge.find((p) => p.definition.name === definition.name)\n\n if (existing) {\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Duplicate knowledge definition found: ${filename} -> ${key} (already defined in ${existing.path} -> ${existing.export})`,\n file: relPath,\n })\n continue\n }\n\n this._knowledge.push({\n definition,\n export: key,\n path: relPath,\n })\n\n // Register data source sync workflows\n await this.registerDataSourceWorkflows(expandedExports[key], relPath, key)\n } else if (Primitives.Definitions.isTriggerDefinition(definition)) {\n const existing = this._triggers.find((p) => p.definition.name === definition.name)\n if (existing) {\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Duplicate trigger definition found: ${filename} -> ${key} (already defined in ${existing.path} -> ${existing.export})`,\n file: relPath,\n })\n continue\n }\n this._triggers.push({\n definition,\n export: key,\n path: relPath,\n })\n } else if (Primitives.Definitions.isWorkflowDefinition(definition)) {\n const existing = this._workflows.find((p) => p.definition.name === definition.name)\n if (existing) {\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Duplicate workflow definition found: ${filename} -> ${key} (already defined in ${existing.path} -> ${existing.export})`,\n file: relPath,\n })\n continue\n }\n this._workflows.push({\n definition,\n export: key,\n path: relPath,\n })\n } else if (Primitives.Definitions.isActionDefinition(definition)) {\n const existing = this._actions.find((p) => p.definition.name === definition.name)\n if (existing) {\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Duplicate action definition found: ${filename} -> ${key} (already defined in ${existing.path} -> ${existing.export})`,\n file: relPath,\n })\n continue\n }\n this._actions.push({\n definition,\n export: key,\n path: relPath,\n })\n } else if (Primitives.Definitions.isTableDefinition(definition)) {\n const existing = this._tables.find((p) => p.definition.name === definition.name)\n if (existing) {\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Duplicate table definition found: ${filename} -> ${key} (already defined in ${existing.path} -> ${existing.export})`,\n file: relPath,\n })\n continue\n }\n this._tables.push({\n definition,\n export: key,\n path: relPath,\n })\n }\n }\n } catch (error) {\n // Check if it's an ADK error from expandExports\n if (Errors.isAdkError(error)) {\n // Error is already handled by expandExports, skip this file\n continue\n }\n\n // Log other import errors with context\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.IMPORT_ERROR,\n severity: ValidationSeverity.WARNING,\n message: `Failed to import primitive from ${relPath}: ${error instanceof Error ? error.message : String(error)}`,\n file: relPath,\n hint: 'Ensure the file exports valid primitives and has no syntax errors',\n })\n }\n }\n }\n}\n",
|
|
30
|
+
"/**\n * Utility for ensuring consistent key ordering in JSON files\n */\n\n// Key ordering arrays for different file types\nexport const agentInfoKeyOrder = ['botId', 'workspaceId', 'apiUrl'] as const\nexport const agentLocalInfoKeyOrder = ['botId', 'workspaceId', 'apiUrl', 'devId'] as const\nexport const dependenciesKeyOrder = ['integrations'] as const\nexport const integrationKeyOrder = ['version', 'enabled', 'configurationType', 'config'] as const\n\n/**\n * Orders object keys according to a specified order, with unspecified keys at the end alphabetically\n */\nexport function orderKeys<T extends Record<string, unknown>>(obj: T, keyOrder?: readonly (keyof T)[]): T {\n const objKeys = Object.keys(obj)\n const orderedKeys: string[] = []\n const remainingKeys: string[] = []\n\n // Add keys in the specified order if they exist in the object\n if (keyOrder) {\n for (const key of keyOrder) {\n const keyStr = String(key)\n if (objKeys.includes(keyStr)) {\n orderedKeys.push(keyStr)\n }\n }\n }\n\n // Add remaining keys alphabetically\n for (const key of objKeys) {\n if (!orderedKeys.includes(key)) {\n remainingKeys.push(key)\n }\n }\n remainingKeys.sort()\n\n // Combine ordered keys with remaining keys\n const finalKeys = [...orderedKeys, ...remainingKeys]\n\n const result = {} as T\n for (const key of finalKeys) {\n result[key as keyof T] = obj[key] as T[keyof T]\n }\n\n return result\n}\n\n/**\n * Recursively orders keys in nested objects for integrations\n */\nexport function orderIntegrationKeys(integrations: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n\n for (const [name, config] of Object.entries(integrations)) {\n if (typeof config === 'object' && config !== null && !Array.isArray(config)) {\n result[name] = orderKeys(config as Record<string, unknown>, integrationKeyOrder)\n } else {\n result[name] = config\n }\n }\n\n return result\n}\n\n/**\n * Stringifies JSON with consistent key ordering and formatting\n */\nexport function stringifyWithOrder<T extends Record<string, unknown>>(\n obj: T,\n keyOrder?: readonly (keyof T)[],\n space: number | string = 2\n): string {\n const orderedObj = orderKeys(obj, keyOrder)\n\n // Special handling for dependencies with nested integrations\n if ('integrations' in orderedObj) {\n const integrations = (orderedObj as Record<string, unknown>).integrations\n if (integrations && typeof integrations === 'object') {\n ;(orderedObj as Record<string, unknown>).integrations = orderIntegrationKeys(\n integrations as Record<string, unknown>\n )\n }\n }\n\n return JSON.stringify(orderedObj, null, space)\n}\n",
|
|
31
|
+
"import { BuiltInActions, BuiltInWorkflows, Errors, Primitives, setAdkCommand } from '@botpress/runtime/internal'\nimport { Autonomous } from '@botpress/runtime'\nimport createDebug from 'debug'\nimport { createRequire } from 'module'\n\nimport fs from 'fs/promises'\nimport path from 'path'\n\nimport { AssetsManager, AssetSyncOptions, AssetSyncPlan, AssetSyncResult } from '../assets/index.js'\nimport { IntegrationManager } from '../integrations/index.js'\nimport { ParsedIntegration } from '../integrations/types.js'\nimport { InterfaceManager } from '../interfaces/index.js'\nimport { ParsedInterface } from '../interfaces/types.js'\n\nimport { agentInfoKeyOrder, agentLocalInfoKeyOrder, stringifyWithOrder } from '../utils/json-ordering.js'\nimport { expandExports } from './expand-exports.js'\nimport { resolveAgent } from './agent-resolver.js'\nimport {\n AgentConfig,\n AgentInfo,\n AgentToolDefinition,\n AgentLocalInfo,\n Dependencies,\n dependenciesSchema,\n Integration,\n ProjectInfo,\n ProjectState,\n ValidationError,\n ValidationErrorCode,\n ValidationResult,\n ValidationSeverity,\n ToolReference,\n} from './types.js'\nimport { ValidationErrors } from './validation-errors.js'\n\nexport interface AgentProjectOptions {\n noCache?: boolean\n adkCommand?: 'adk-dev' | 'adk-build' | 'adk-deploy'\n}\n\nconst debug = createDebug('adk:agent-project')\ntype ConversationDefinition = Primitives.Definitions.ConversationDefinition\ntype KnowledgeDefinition = Primitives.Definitions.KnowledgeDefinition\ntype TriggerDefinition = Primitives.Definitions.TriggerDefinition\ntype WorkflowDefinition = Primitives.Definitions.WorkflowDefinition\ntype ActionDefinition = Primitives.Definitions.ActionDefinition\ntype TableDefinition = Primitives.Definitions.TableDefinition\ntype PrimitiveDefinition = Primitives.Definitions.PrimitiveDefinition\n\nexport type PrimitiveReference<T extends PrimitiveDefinition = PrimitiveDefinition> = {\n path: string\n export: string\n definition: T\n}\n\nfunction getToolDefinition(value: unknown): AgentToolDefinition | undefined {\n if (typeof value !== 'object' || value === null) {\n return undefined\n }\n\n const maybeTool = value as Autonomous.Tool & { constructor?: { name?: string } }\n const isAutonomousToolInstance = value instanceof Autonomous.Tool\n const looksLikeAutonomousTool =\n maybeTool.constructor?.name === Autonomous.Tool.name &&\n typeof maybeTool.name === 'string' &&\n typeof maybeTool.execute === 'function' &&\n typeof maybeTool.toJSON === 'function'\n\n if (!isAutonomousToolInstance && !looksLikeAutonomousTool) {\n return undefined\n }\n\n return {\n name: maybeTool.name,\n description: maybeTool.description,\n }\n}\n\nexport class AgentProject {\n private static _projectCache = new Map<string, AgentProject>()\n\n private _options: AgentProjectOptions\n private _path: string\n private _config?: AgentConfig\n private _dependencies?: Dependencies\n private _agentInfo?: AgentInfo\n private _state: ProjectState = ProjectState.Unloaded\n private _errors: ValidationError[] = []\n private _warnings: ValidationError[] = []\n\n private _lastBuildTime?: Date\n private _integrations?: ParsedIntegration[]\n private _interfaces?: ParsedInterface[]\n private _integrationManager: IntegrationManager\n private _interfaceManager: InterfaceManager\n private _assetsManager: AssetsManager\n private _conversations: PrimitiveReference<ConversationDefinition>[] = []\n private _knowledge: PrimitiveReference<KnowledgeDefinition>[] = []\n private _triggers: PrimitiveReference<TriggerDefinition>[] = []\n private _workflows: PrimitiveReference<WorkflowDefinition>[] = []\n private _actions: PrimitiveReference<ActionDefinition>[] = []\n private _tables: PrimitiveReference<TableDefinition>[] = []\n private _tools: ToolReference[] = []\n\n constructor(projectPath: string, options: AgentProjectOptions = {}) {\n this._options = options\n this._path = path.resolve(projectPath)\n this._integrationManager = new IntegrationManager({\n noCache: options.noCache,\n })\n this._interfaceManager = new InterfaceManager({\n noCache: options.noCache,\n })\n this._assetsManager = new AssetsManager({\n projectPath: this._path,\n })\n }\n\n // Static factory methods\n static async load(projectPath: string, options: AgentProjectOptions = {}): Promise<AgentProject> {\n const resolvedPath = path.resolve(projectPath)\n\n // Check cache unless explicitly disabled\n if (!options.noCache) {\n const cached = AgentProject._projectCache.get(resolvedPath)\n if (cached) {\n return cached\n }\n }\n\n // Create and load new project\n const project = new AgentProject(resolvedPath, options)\n await project.reload()\n\n // Cache the project unless caching is disabled\n if (!options.noCache) {\n AgentProject._projectCache.set(resolvedPath, project)\n }\n\n return project\n }\n\n // Static method to clear the cache\n static clearCache(): void {\n AgentProject._projectCache.clear()\n }\n\n // Static method to remove a specific project from cache\n static clearCacheForPath(projectPath: string): void {\n const resolvedPath = path.resolve(projectPath)\n AgentProject._projectCache.delete(resolvedPath)\n }\n\n // Public properties\n get path(): string {\n return this._path\n }\n\n get conversations(): PrimitiveReference<ConversationDefinition>[] {\n return this._conversations\n }\n\n get knowledge(): PrimitiveReference<KnowledgeDefinition>[] {\n return this._knowledge\n }\n\n get triggers(): PrimitiveReference<TriggerDefinition>[] {\n return this._triggers\n }\n\n get workflows(): PrimitiveReference<WorkflowDefinition>[] {\n return this._workflows\n }\n\n get actions(): PrimitiveReference<ActionDefinition>[] {\n return this._actions\n }\n\n get tables(): PrimitiveReference<TableDefinition>[] {\n return this._tables\n }\n\n get tools(): ToolReference[] {\n return this._tools\n }\n\n get config(): AgentConfig | undefined {\n return this._config\n }\n\n get dependencies(): Dependencies | undefined {\n return this._dependencies\n }\n\n get agentInfo(): AgentInfo | undefined {\n return this._agentInfo\n }\n\n get state(): ProjectState {\n return this._state\n }\n\n get info(): ProjectInfo {\n return {\n path: this._path,\n config: this._config!,\n dependencies: this._dependencies || {\n integrations: {},\n },\n agentInfo: this._agentInfo,\n state: this._state,\n lastBuildTime: this._lastBuildTime,\n errors: [...this._errors],\n warnings: [...this._warnings],\n errorCount: this._errors.filter((e) => e.severity === ValidationSeverity.ERROR).length,\n warningCount: this._warnings.filter((e) => e.severity === ValidationSeverity.WARNING).length,\n infoCount: [...this._errors, ...this._warnings].filter((e) => e.severity === ValidationSeverity.INFO).length,\n }\n }\n\n // Core methods\n async reload(): Promise<void> {\n this._state = ProjectState.Loading\n\n try {\n // Clear previous state\n this._conversations = []\n this._knowledge = []\n this._triggers = []\n this._workflows = []\n this._actions = []\n this._tables = []\n this._tools = []\n this._errors = []\n this._warnings = []\n\n // Validate project structure\n const validation = await this.validate()\n this._errors = validation.errors\n this._warnings = validation.warnings\n\n if (!validation.valid) {\n this._state = ProjectState.Error\n\n throw new Error(`Project validation failed: ${validation.errors[0]?.message}`)\n }\n\n // Load agent info FIRST so we have the workspaceId\n await this.loadAgentInfo()\n\n // Create managers with the correct workspaceId from agent.json\n this._integrationManager = new IntegrationManager({\n noCache: this._options.noCache,\n workspaceId: this._agentInfo?.workspaceId,\n })\n\n this._interfaceManager = new InterfaceManager({\n noCache: this._options.noCache,\n workspaceId: this._agentInfo?.workspaceId,\n })\n\n this._assetsManager = new AssetsManager({\n projectPath: this._path,\n workspaceId: this._agentInfo?.workspaceId,\n botId: this._agentInfo?.botId,\n })\n\n // Load configuration (which will use the managers with correct workspaceId)\n await this.loadConfig()\n\n await this.loadBuiltInWorkflows()\n await this.loadBuiltInActions()\n await this.loadAgentPrimitives()\n\n if (this._errors.length > 0) {\n this._state = ProjectState.Error\n } else {\n this._state = ProjectState.Ready\n }\n } catch (error) {\n this._state = ProjectState.Error\n\n throw error\n }\n }\n\n async validate(): Promise<ValidationResult> {\n const errors: ValidationError[] = []\n const warnings: ValidationError[] = []\n const info: ValidationError[] = []\n\n try {\n // Check if directory exists\n await fs.access(this._path)\n\n // Check for required files\n const requiredFiles = ['agent.config.ts']\n for (const file of requiredFiles) {\n try {\n await fs.access(path.join(this._path, file))\n } catch {\n errors.push(ValidationErrors.requiredFileMissing(file))\n }\n }\n\n // Check for agent.json (optional, but warn if missing for deployed projects)\n try {\n await fs.access(path.join(this._path, 'agent.json'))\n } catch {\n // agent.json is optional, but we add an informational message\n info.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.MISSING_REQUIRED_FIELD,\n severity: ValidationSeverity.INFO,\n message: 'agent.json not found - this file will be required for deployment and remote operations',\n file: 'agent.json',\n hint: 'Create agent.json with botId and workspaceId after deploying your agent',\n })\n }\n\n // Check directory structure\n const expectedDirs = ['actions', 'workflows', 'conversations', 'assets']\n for (const dir of expectedDirs) {\n try {\n const stats = await fs.stat(path.join(this._path, dir))\n if (!stats.isDirectory()) {\n warnings.push(ValidationErrors.invalidStructure(dir, 'directory'))\n }\n } catch {\n // Directory doesn't exist, which is okay - they're optional\n }\n }\n } catch (error) {\n errors.push(ValidationErrors.directoryAccessError(this._path, String(error)))\n }\n\n // Filter by severity\n const errorsBySeverity = {\n errors: errors.filter((e) => e.severity === ValidationSeverity.ERROR),\n warnings: [...warnings, ...errors.filter((e) => e.severity === ValidationSeverity.WARNING)],\n info: [...info, ...errors.filter((e) => e.severity === ValidationSeverity.INFO)],\n }\n\n return {\n valid: errorsBySeverity.errors.length === 0,\n errors: errorsBySeverity.errors,\n warnings: errorsBySeverity.warnings,\n info: errorsBySeverity.info,\n errorCount: errorsBySeverity.errors.length,\n warningCount: errorsBySeverity.warnings.length,\n infoCount: errorsBySeverity.info.length,\n }\n }\n\n get integrations(): ParsedIntegration[] {\n if (!this._integrations) {\n throw new Error('Integrations not loaded')\n }\n\n return this._integrations!\n }\n\n get interfaces(): ParsedInterface[] {\n if (!this._interfaces) {\n throw new Error('Interfaces not loaded')\n }\n return this._interfaces!\n }\n\n // Integration management methods\n async getIntegrations(): Promise<Integration[]> {\n if (!this._dependencies || !this._integrations) {\n throw new Error('Project not loaded')\n }\n\n // Convert ParsedIntegration to Integration format\n return this._integrations.map((parsed) => ({\n name: parsed.alias,\n version: parsed.ref.version,\n workspace: parsed.ref.workspace,\n config: parsed.config,\n installed: false, // This would be determined by checking workspace\n installedVersion: undefined,\n hasChannels: parsed.definition?.channels && Object.keys(parsed.definition.channels).length > 0,\n }))\n }\n\n // Asset management methods\n async createAssetSyncPlan(): Promise<AssetSyncPlan> {\n if (this._state !== ProjectState.Ready) {\n throw new Error('Project must be in Ready state to create asset sync plan')\n }\n\n this.requiresAgentInfo('create asset sync plan')\n return await this._assetsManager.createSyncPlan()\n }\n\n async syncAssets(options?: AssetSyncOptions): Promise<AssetSyncResult> {\n if (this._state !== ProjectState.Ready) {\n throw new Error('Project must be in Ready state to sync assets')\n }\n\n this.requiresAgentInfo('sync assets')\n const plan = await this._assetsManager.createSyncPlan()\n return await this._assetsManager.executeSync(plan, options)\n }\n\n async hasAssetsDirectory(): Promise<boolean> {\n return await this._assetsManager.hasAssetsDirectory()\n }\n\n get assetsManager(): AssetsManager {\n return this._assetsManager\n }\n\n // Agent info management methods\n async createAgentInfo(info: AgentInfo): Promise<void> {\n // Extract devId — it goes to agent.local.json, not agent.json\n const { devId, ...agentJsonInfo } = info\n const agentPath = path.join(this._path, 'agent.json')\n const agentContent = stringifyWithOrder(agentJsonInfo, agentInfoKeyOrder)\n await fs.writeFile(agentPath, agentContent)\n this._agentInfo = info\n\n if (devId) {\n await this.createAgentLocalInfo({ devId })\n }\n }\n\n async updateAgentInfo(updates: Partial<AgentInfo>): Promise<void> {\n if (!this._agentInfo) {\n throw new Error('No agent.json found. Use createAgentInfo() first.')\n }\n\n // Extract devId — it goes to agent.local.json, not agent.json\n const { devId, ...agentJsonUpdates } = updates\n\n const updatedInfo = { ...this._agentInfo, ...agentJsonUpdates }\n // Strip devId from agent.json write\n const { devId: _devId, ...agentJsonData } = updatedInfo\n const agentPath = path.join(this._path, 'agent.json')\n const agentContent = stringifyWithOrder(agentJsonData, agentInfoKeyOrder)\n await fs.writeFile(agentPath, agentContent)\n this._agentInfo = updatedInfo\n\n if (devId !== undefined) {\n await this.updateAgentLocalInfo({ devId })\n }\n }\n\n async createAgentLocalInfo(info: AgentLocalInfo): Promise<void> {\n const localPath = path.join(this._path, 'agent.local.json')\n let existing: AgentLocalInfo = {}\n try {\n const content = await fs.readFile(localPath, 'utf-8')\n existing = JSON.parse(content)\n } catch {\n // File doesn't exist yet\n }\n const merged = { ...existing, ...info }\n const content = stringifyWithOrder(merged, agentLocalInfoKeyOrder)\n await fs.writeFile(localPath, content)\n // Update in-memory merged view\n if (this._agentInfo) {\n if (merged.botId) this._agentInfo.botId = merged.botId\n if (merged.workspaceId) this._agentInfo.workspaceId = merged.workspaceId\n if (merged.apiUrl) this._agentInfo.apiUrl = merged.apiUrl\n if (merged.devId) this._agentInfo.devId = merged.devId\n } else if (merged.botId && merged.workspaceId) {\n this._agentInfo = {\n botId: merged.botId,\n workspaceId: merged.workspaceId,\n apiUrl: merged.apiUrl,\n devId: merged.devId,\n }\n }\n }\n\n async updateAgentLocalInfo(updates: Partial<AgentLocalInfo>): Promise<void> {\n const localPath = path.join(this._path, 'agent.local.json')\n let existing: AgentLocalInfo = {}\n try {\n const content = await fs.readFile(localPath, 'utf-8')\n existing = JSON.parse(content)\n } catch {\n // File doesn't exist yet\n }\n const updated: Record<string, unknown> = { ...existing, ...updates }\n // Remove undefined keys\n for (const key of Object.keys(updated)) {\n if (updated[key] === undefined) {\n delete updated[key]\n }\n }\n const content = stringifyWithOrder(updated as AgentLocalInfo, agentLocalInfoKeyOrder)\n await fs.writeFile(localPath, content)\n // Update in-memory merged view\n if (this._agentInfo) {\n const local = updated as AgentLocalInfo\n if (local.botId) this._agentInfo.botId = local.botId\n if (local.workspaceId) this._agentInfo.workspaceId = local.workspaceId\n if (local.apiUrl) this._agentInfo.apiUrl = local.apiUrl\n if (local.devId) this._agentInfo.devId = local.devId\n }\n }\n\n requiresAgentInfo(operation: string): void {\n if (!this._agentInfo?.botId) {\n throw new Error(\n `Operation \"${operation}\" requires a bot ID. ` +\n 'Please create agent.json with botId and workspaceId after deploying your agent.'\n )\n }\n }\n\n // Private helper methods\n private async loadConfig(): Promise<void> {\n try {\n // Bust module cache to ensure fresh config on reload\n const configPath = path.join(this._path, 'agent.config.ts')\n debug('loading agent.config.ts from %s', configPath)\n\n // Create a require function that resolves from the user's project directory\n // This is critical for compiled binaries which otherwise resolve modules from the binary's location\n const projectRequire = createRequire(path.join(this._path, 'package.json'))\n debug('created projectRequire from %s', path.join(this._path, 'package.json'))\n\n // Clear the module from cache if it exists\n try {\n const resolvedPath = projectRequire.resolve(configPath)\n debug('resolved config path: %s', resolvedPath)\n if (projectRequire.cache[resolvedPath]) {\n debug('clearing require.cache for %s', resolvedPath)\n delete projectRequire.cache[resolvedPath]\n }\n } catch {\n // Module not in cache yet, that's fine\n debug('config not in require.cache (first load)')\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic import returns unknown module shape\n let configModule: any\n try {\n // Use ?t= query string for cache busting to ensure fresh imports on reload\n const configUrl = `${configPath}?t=${Date.now()}`\n debug('importing from: %s', configUrl)\n configModule = await import(configUrl)\n debug('successfully loaded agent.config.ts')\n } catch (importError) {\n debug('failed to load agent.config.ts: %O', importError)\n throw importError\n }\n if (!configModule || !configModule.default) {\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_CONFIG_SCHEMA,\n severity: ValidationSeverity.ERROR,\n message: 'agent.config.ts does not export a default configuration object',\n file: 'agent.config.ts',\n })\n return\n }\n\n // Check if the config was created with defineConfig\n const { isAgentConfig } = await import('@botpress/runtime/internal')\n if (!isAgentConfig(configModule.default)) {\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_CONFIG_SCHEMA,\n severity: ValidationSeverity.ERROR,\n message:\n 'agent.config.ts must export the result of defineConfig(). ' +\n \"Example: export default defineConfig({ name: 'my-agent', ... })\",\n file: 'agent.config.ts',\n hint: 'Wrap your config object with defineConfig() from @botpress/runtime',\n })\n return\n }\n\n this._config = configModule.default as AgentConfig\n\n // Extract dependencies from config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic import module shape\n const config = configModule.default as any\n if (config.dependencies) {\n // Validate dependencies against schema\n const validationResult = dependenciesSchema.safeParse(config.dependencies)\n if (!validationResult.success) {\n const errors = validationResult.error.errors\n for (const error of errors) {\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_DEPENDENCIES_SCHEMA,\n severity: ValidationSeverity.ERROR,\n message: `Invalid dependencies in agent.config.ts: ${error.path.join('.')} - ${error.message}`,\n file: 'agent.config.ts',\n hint: error.code === 'invalid_type' ? `Expected ${error.expected}, but got ${error.received}` : undefined,\n })\n }\n this._dependencies = { integrations: {} }\n this._integrations = []\n this._interfaces = []\n return\n }\n\n this._dependencies = validationResult.data\n\n // Validate and load integrations and interfaces\n if (this._dependencies) {\n const [intRes, ifRes] = await Promise.all([\n this._integrationManager.loadIntegrations(this._dependencies),\n this._interfaceManager.loadInterfaces(this._dependencies),\n ])\n this._integrations = intRes.integrations\n this._interfaces = ifRes.interfaces\n\n // Add errors and warnings\n this._errors.push(...intRes.errors, ...ifRes.errors)\n this._warnings.push(...intRes.warnings, ...ifRes.warnings)\n }\n } else {\n // No dependencies in config\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.MISSING_REQUIRED_FIELD,\n severity: ValidationSeverity.ERROR,\n message: 'agent.config.ts must include a dependencies field',\n file: 'agent.config.ts',\n hint: 'Add dependencies: { integrations: {} } to your defineConfig() call',\n })\n this._dependencies = { integrations: {} }\n this._integrations = []\n this._interfaces = []\n }\n } catch (error) {\n const err = error as Error\n debug('loadConfig error: %O', err)\n\n // Build a detailed error message with stack trace for debugging\n let detailedMessage = `Failed to load agent.config.ts: ${err.message}`\n if (err.stack) {\n // Include the stack trace in debug output\n debug('stack trace:\\n%s', err.stack)\n }\n\n // Check for common issues and provide helpful hints\n let hint: string | undefined\n if (err.message.includes('Cannot find module')) {\n const moduleMatch = err.message.match(/Cannot find module '([^']+)'/)\n const moduleName = moduleMatch?.[1] || 'unknown'\n hint = `Module \"${moduleName}\" is not installed. Run \"bun install\" to install dependencies.`\n detailedMessage += `\\n\\n Stack trace:\\n${err.stack?.split('\\n').slice(0, 5).join('\\n')}`\n }\n\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_CONFIG_SYNTAX,\n severity: ValidationSeverity.ERROR,\n message: detailedMessage,\n file: 'agent.config.ts',\n hint,\n })\n }\n }\n\n private async loadAgentInfo(): Promise<void> {\n try {\n // Use the agent resolver to load agent.json (not required for basic project loading)\n const agentInfo = await resolveAgent(this._path, { required: false })\n this._agentInfo = agentInfo ?? undefined\n } catch (error) {\n // Handle validation errors from resolver\n if (ValidationErrors.isValidationError(error)) {\n this._errors.push(error)\n } else if (error instanceof Error) {\n // Unexpected error - wrap it\n this._errors.push(ValidationErrors.warning(`Failed to load agent.json: ${error.message}`, 'agent.json'))\n }\n\n this._agentInfo = undefined\n }\n }\n\n private async loadBuiltInWorkflows(): Promise<void> {\n for (const wf of Object.values(BuiltInWorkflows)) {\n const definition = Primitives.Definitions.getDefinition(wf)\n if (Primitives.Definitions.isWorkflowDefinition(definition)) {\n this._workflows.push({\n definition,\n export: 'default',\n path: '<adk:builtin>',\n })\n }\n }\n }\n\n private async loadBuiltInActions(): Promise<void> {\n for (const action of Object.values(BuiltInActions)) {\n const definition = Primitives.Definitions.getDefinition(action)\n if (Primitives.Definitions.isActionDefinition(definition)) {\n this._actions.push({\n definition,\n export: 'default',\n path: '<adk:builtin>',\n })\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- knowledge base has dynamic structure\n private async registerDataSourceWorkflows(knowledgeBase: any, kbPath: string, kbExport: string): Promise<void> {\n try {\n // Each knowledge base has data sources with sync workflows\n if (!knowledgeBase.sources || !Array.isArray(knowledgeBase.sources)) {\n return\n }\n\n for (const source of knowledgeBase.sources) {\n if (!source.syncWorkflow) {\n continue\n }\n\n const workflowDefinition = source.syncWorkflow.getDefinition()\n\n // Check if workflow already exists\n const existing = this._workflows.find((p) => p.definition.name === workflowDefinition.name)\n\n if (existing) {\n // Skip if already registered\n continue\n }\n\n // Register the data source's sync workflow\n this._workflows.push({\n definition: workflowDefinition,\n export: `${kbExport}.sources[${knowledgeBase.sources.indexOf(source)}].syncWorkflow`,\n path: kbPath,\n })\n }\n } catch (error) {\n console.warn(`Failed to register data source workflows for ${kbPath}:`, error)\n }\n }\n\n /**\n * Get list of channels from a channel specification (single, array, or glob)\n * For glob '*', we need to check against all integration channels - but for validation\n * we treat it as a special marker\n */\n /**\n * Checks if a duplicate primitive is just a re-export from a barrel file (index.ts/index.js).\n * If so, prefers the non-barrel file path for the reference and returns true to signal\n * that the duplicate should be silently skipped.\n */\n private isBarrelReexport(\n existing: PrimitiveReference,\n newPath: string,\n newExport: string,\n newDefinition: PrimitiveDefinition\n ): boolean {\n const isNewBarrel = /^index\\.[tj]s$/i.test(path.basename(newPath))\n const isExistingBarrel = /^index\\.[tj]s$/i.test(path.basename(existing.path))\n\n if (!isNewBarrel && !isExistingBarrel) {\n return false\n }\n\n // Prefer the non-barrel file as the canonical source\n if (isExistingBarrel && !isNewBarrel) {\n existing.path = newPath\n existing.export = newExport\n existing.definition = newDefinition\n }\n\n return true\n }\n\n private isToolBarrelReexport(existingPath: string, newPath: string): boolean {\n const isNewBarrel = /^index\\.[tj]s$/i.test(path.basename(newPath))\n const isExistingBarrel = /^index\\.[tj]s$/i.test(path.basename(existingPath))\n\n if (!isNewBarrel && !isExistingBarrel) {\n return false\n }\n\n return true\n }\n\n private shouldPreferToolDefinition(existingPath: string, newPath: string): boolean {\n const isNewBarrel = /^index\\.[tj]s$/i.test(path.basename(newPath))\n const isExistingBarrel = /^index\\.[tj]s$/i.test(path.basename(existingPath))\n\n return isExistingBarrel && !isNewBarrel\n }\n\n private getChannelsList(channelSpec: string | string[]): string[] {\n if (channelSpec === '*') {\n return ['*'] // Glob marker - matches everything\n } else if (Array.isArray(channelSpec)) {\n return channelSpec\n } else {\n return [channelSpec]\n }\n }\n\n private async loadAgentPrimitives(): Promise<void> {\n // Set the ADK command in the runtime environment\n if (this._options.adkCommand) {\n setAdkCommand(this._options.adkCommand)\n }\n\n const src = path.join(this._path, 'src')\n\n if (!(await fs.stat(src).catch(() => false))) {\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_STRUCTURE,\n severity: ValidationSeverity.ERROR,\n message: `\\`src\\` directory not found at expected path: ${src}`,\n })\n return\n }\n\n const allFiles = await fs.readdir(src, {\n withFileTypes: true,\n recursive: true,\n })\n\n for (const file of allFiles.filter((x) => x.isFile())) {\n const filename = file.name\n const absolutePath = path.join(file.parentPath, file.name)\n const relPath = path.relative(this.path, absolutePath)\n\n if (filename.toLowerCase().endsWith('.d.ts')) {\n // Skip TypeScript declaration files\n continue\n }\n\n if (filename.toLowerCase().endsWith('.test.ts') || filename.toLowerCase().endsWith('.test.js')) {\n // Skip test files\n continue\n }\n\n if (!filename.toLowerCase().endsWith('.js') && !filename.toLowerCase().endsWith('.ts')) {\n continue // Only process .js or .ts files\n }\n\n if (file.isSymbolicLink()) {\n this._errors.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_FILE_TYPE,\n severity: ValidationSeverity.WARNING,\n message: `Skipping symbolic link in conversations directory: ${relPath}`,\n file: relPath,\n })\n continue\n }\n\n try {\n const expandedExports = await expandExports({\n absolutePath,\n relPath,\n filename,\n onWarning: (warning) => this._warnings.push(warning),\n })\n\n for (const key of Object.keys(expandedExports)) {\n let definition\n try {\n definition = Primitives.Definitions.getDefinition(expandedExports[key])\n } catch (error) {\n // This might catch errors from getDefinition itself\n if (Errors.isAdkError(error)) {\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_PRIMITIVE_DEFINITION,\n severity: ValidationSeverity.WARNING,\n message: error.message,\n file: relPath,\n hint: `Check the primitive definition in ${filename} -> ${key}`,\n })\n continue\n }\n // Re-throw if it's not an ADK error\n throw error\n }\n\n if (Primitives.Definitions.isConversationDefinition(definition)) {\n // Check for overlapping channel definitions\n const overlapping = this._conversations.find((p) => {\n const existingChannels = this.getChannelsList(p.definition.channel)\n const newChannels = this.getChannelsList(definition.channel)\n\n // Check if any channel overlaps\n return existingChannels.some((ch) => newChannels.includes(ch))\n })\n\n if (overlapping) {\n if (this.isBarrelReexport(overlapping, relPath, key, definition)) {\n continue\n }\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Overlapping conversation channels found: ${filename} -> ${key} overlaps with ${overlapping.path} -> ${overlapping.export}`,\n file: relPath,\n })\n continue\n }\n this._conversations.push({\n definition,\n export: key,\n path: relPath,\n })\n } else if (Primitives.Definitions.isKnowledgeDefinition(definition)) {\n const existing = this._knowledge.find((p) => p.definition.name === definition.name)\n\n if (existing) {\n if (this.isBarrelReexport(existing, relPath, key, definition)) {\n continue\n }\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Duplicate knowledge definition found: ${filename} -> ${key} (already defined in ${existing.path} -> ${existing.export})`,\n file: relPath,\n })\n continue\n }\n\n this._knowledge.push({\n definition,\n export: key,\n path: relPath,\n })\n\n // Register data source sync workflows\n await this.registerDataSourceWorkflows(expandedExports[key], relPath, key)\n } else if (Primitives.Definitions.isTriggerDefinition(definition)) {\n const existing = this._triggers.find((p) => p.definition.name === definition.name)\n if (existing) {\n if (this.isBarrelReexport(existing, relPath, key, definition)) {\n continue\n }\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Duplicate trigger definition found: ${filename} -> ${key} (already defined in ${existing.path} -> ${existing.export})`,\n file: relPath,\n })\n continue\n }\n this._triggers.push({\n definition,\n export: key,\n path: relPath,\n })\n } else if (Primitives.Definitions.isWorkflowDefinition(definition)) {\n const existing = this._workflows.find((p) => p.definition.name === definition.name)\n if (existing) {\n if (this.isBarrelReexport(existing, relPath, key, definition)) {\n continue\n }\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Duplicate workflow definition found: ${filename} -> ${key} (already defined in ${existing.path} -> ${existing.export})`,\n file: relPath,\n })\n continue\n }\n this._workflows.push({\n definition,\n export: key,\n path: relPath,\n })\n } else if (Primitives.Definitions.isActionDefinition(definition)) {\n const existing = this._actions.find((p) => p.definition.name === definition.name)\n if (existing) {\n if (this.isBarrelReexport(existing, relPath, key, definition)) {\n continue\n }\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Duplicate action definition found: ${filename} -> ${key} (already defined in ${existing.path} -> ${existing.export})`,\n file: relPath,\n })\n continue\n }\n this._actions.push({\n definition,\n export: key,\n path: relPath,\n })\n } else if (Primitives.Definitions.isTableDefinition(definition)) {\n const existing = this._tables.find((p) => p.definition.name === definition.name)\n if (existing) {\n if (this.isBarrelReexport(existing, relPath, key, definition)) {\n continue\n }\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Duplicate table definition found: ${filename} -> ${key} (already defined in ${existing.path} -> ${existing.export})`,\n file: relPath,\n })\n continue\n }\n this._tables.push({\n definition,\n export: key,\n path: relPath,\n })\n } else {\n const toolDefinition = getToolDefinition(expandedExports[key])\n\n if (!toolDefinition) {\n continue\n }\n\n const existing = this._tools.find((tool) => tool.definition.name === toolDefinition.name)\n if (existing) {\n if (this.isToolBarrelReexport(existing.path, relPath)) {\n if (this.shouldPreferToolDefinition(existing.path, relPath)) {\n existing.path = relPath\n existing.export = key\n existing.definition = toolDefinition\n }\n\n continue\n }\n\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.DUPLICATE_PRIMITIVE,\n severity: ValidationSeverity.WARNING,\n message: `Duplicate tool definition found: ${filename} -> ${key} (already defined in ${existing.path} -> ${existing.export})`,\n file: relPath,\n })\n continue\n }\n\n this._tools.push({\n definition: toolDefinition,\n export: key,\n path: relPath,\n })\n }\n }\n } catch (error) {\n // Check if it's an ADK error from expandExports\n if (Errors.isAdkError(error)) {\n // Error is already handled by expandExports, skip this file\n continue\n }\n\n // Log other import errors with context\n this._warnings.push({\n $type: 'ValidationError',\n code: ValidationErrorCode.IMPORT_ERROR,\n severity: ValidationSeverity.WARNING,\n message: `Failed to import primitive from ${relPath}: ${error instanceof Error ? error.message : String(error)}`,\n file: relPath,\n hint: 'Ensure the file exports valid primitives and has no syntax errors',\n })\n }\n }\n }\n}\n",
|
|
32
32
|
"import fs from 'fs/promises'\nimport path from 'path'\nimport crypto from 'crypto'\nimport { Client } from '@botpress/client'\nimport { auth } from '../auth/index.js'\nimport {\n AssetFile,\n LocalAssetFile,\n AssetSyncPlan,\n AssetSyncResult,\n AssetSyncItem,\n AssetSyncOperation,\n AssetSyncOptions,\n AssetsIndex,\n} from './types.js'\nimport { AssetsCacheManager } from './cache.js'\n\nexport interface AssetManagerOptions {\n projectPath: string\n botId?: string\n workspaceId?: string\n}\n\nexport class AssetsManager {\n private projectPath: string\n private assetsPath: string\n private client?: Client\n private botId?: string\n private workspaceId?: string\n private cacheManager: AssetsCacheManager\n\n constructor(options: AssetManagerOptions) {\n this.projectPath = options.projectPath\n this.assetsPath = path.join(this.projectPath, 'assets')\n this.botId = options.botId\n this.workspaceId = options.workspaceId\n this.cacheManager = new AssetsCacheManager(this.projectPath)\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n\n // Use provided workspaceId or fall back to credentials\n const workspaceId = this.workspaceId || credentials.workspaceId\n\n if (!workspaceId) {\n throw new Error('No workspace ID found. Please login again with \"adk login\" or deploy your agent first.')\n }\n\n if (!this.botId) {\n throw new Error(\n 'Bot ID is required for asset operations. Please deploy your agent first or create agent.json with botId and workspaceId.'\n )\n }\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId: workspaceId,\n botId: this.botId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n private assertBotId(operation: string): void {\n if (!this.botId) {\n throw new Error(\n `Operation \"${operation}\" requires a bot ID. ` +\n 'Please deploy your agent first or create agent.json with botId and workspaceId.'\n )\n }\n }\n\n /**\n * Check if assets directory exists\n */\n async hasAssetsDirectory(): Promise<boolean> {\n try {\n const stats = await fs.stat(this.assetsPath)\n return stats.isDirectory()\n } catch {\n return false\n }\n }\n\n /**\n * Get all local asset files with their metadata\n */\n async getLocalAssets(): Promise<LocalAssetFile[]> {\n if (!(await this.hasAssetsDirectory())) {\n return []\n }\n\n const files = await this.scanDirectory(this.assetsPath)\n const assets: LocalAssetFile[] = []\n\n for (const filePath of files) {\n try {\n const stats = await fs.stat(filePath)\n if (stats.isFile()) {\n const relativePath = path.relative(this.assetsPath, filePath)\n const content = await fs.readFile(filePath)\n const hash = this.calculateHash(content)\n const mime = this.getMimeType(filePath)\n\n assets.push({\n relativePath,\n absolutePath: filePath,\n name: path.basename(filePath),\n size: stats.size,\n mime,\n hash,\n stats: {\n mtime: stats.mtime,\n size: stats.size,\n },\n })\n }\n } catch (error) {\n // Skip files that can't be read\n console.warn(`Warning: Could not read asset file ${filePath}:`, error)\n }\n }\n\n return assets\n }\n\n /**\n * Get all remote asset files from Botpress\n */\n async getRemoteAssets(): Promise<AssetFile[]> {\n this.assertBotId('get remote assets')\n\n const client = await this.getClient()\n\n try {\n // List files with ADK asset tags (botId is automatically scoped by client)\n const response = await client.listFiles({\n tags: {\n type: 'asset',\n adk: 'true',\n },\n })\n\n return response.files.map((file) => ({\n path: file.tags?.path || file.key,\n name: path.basename(file.tags?.path || file.key),\n size: file.size || 0,\n mime: file.contentType,\n hash: file.tags?.hash || '',\n createdAt: file.createdAt,\n updatedAt: file.updatedAt,\n fileId: file.id,\n url: file.url || '',\n }))\n } catch (error) {\n throw new Error(`Failed to fetch remote assets: ${error}`)\n }\n }\n\n /**\n * Create a sync plan comparing local and remote assets\n */\n async createSyncPlan(): Promise<AssetSyncPlan> {\n const [localAssets, remoteAssets] = await Promise.all([this.getLocalAssets(), this.getRemoteAssets()])\n\n const items: AssetSyncItem[] = []\n const remoteMap = new Map<string, AssetFile>()\n\n // Map remote assets by path\n for (const remote of remoteAssets) {\n remoteMap.set(remote.path, remote)\n }\n\n // Check local files against remote\n for (const local of localAssets) {\n const remote = remoteMap.get(local.relativePath)\n\n if (!remote) {\n // Local file doesn't exist remotely - needs to be created\n items.push({\n operation: AssetSyncOperation.Create,\n localFile: local,\n reason: 'New local file',\n })\n } else if (local.hash !== remote.hash) {\n // File exists but content is different - needs to be updated\n items.push({\n operation: AssetSyncOperation.Update,\n localFile: local,\n remoteFile: remote,\n reason: 'Content changed',\n })\n } else {\n // Files are identical - no operation needed\n items.push({\n operation: AssetSyncOperation.None,\n localFile: local,\n remoteFile: remote,\n reason: 'Up to date',\n })\n }\n\n // Remove from remote map so we can find orphaned remote files\n remoteMap.delete(local.relativePath)\n }\n\n // Remaining remote files don't have local counterparts - need to be deleted\n for (const [, remote] of remoteMap) {\n items.push({\n operation: AssetSyncOperation.Delete,\n remoteFile: remote,\n reason: 'Local file deleted',\n })\n }\n\n // Calculate totals\n const totalCreate = items.filter((i) => i.operation === AssetSyncOperation.Create).length\n const totalUpdate = items.filter((i) => i.operation === AssetSyncOperation.Update).length\n const totalDelete = items.filter((i) => i.operation === AssetSyncOperation.Delete).length\n const hasChanges = totalCreate > 0 || totalUpdate > 0 || totalDelete > 0\n\n return {\n items,\n totalCreate,\n totalUpdate,\n totalDelete,\n hasChanges,\n }\n }\n\n /**\n * Execute a sync plan\n */\n async executeSync(plan: AssetSyncPlan, options: AssetSyncOptions = {}): Promise<AssetSyncResult> {\n this.assertBotId('sync assets')\n\n if (options.dryRun) {\n return {\n applied: false,\n success: [],\n failed: [],\n summary: {\n created: 0,\n updated: 0,\n deleted: 0,\n failed: 0,\n },\n }\n }\n\n const client = await this.getClient()\n const success: AssetSyncItem[] = []\n const failed: Array<{ item: AssetSyncItem; error: Error }> = []\n\n for (const item of plan.items) {\n if (item.operation === AssetSyncOperation.None) {\n success.push(item)\n continue\n }\n\n try {\n switch (item.operation) {\n case AssetSyncOperation.Create:\n case AssetSyncOperation.Update:\n if (item.localFile) {\n await this.uploadAsset(client, item.localFile)\n success.push(item)\n }\n break\n\n case AssetSyncOperation.Delete:\n if (item.remoteFile?.fileId) {\n await client.deleteFile({ id: item.remoteFile.fileId })\n success.push(item)\n }\n break\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n failed.push({ item, error: err })\n\n if (options.bailOnFailure) {\n break\n }\n }\n }\n\n return {\n applied: true,\n success,\n failed,\n summary: {\n created: success.filter((i) => i.operation === AssetSyncOperation.Create).length,\n updated: success.filter((i) => i.operation === AssetSyncOperation.Update).length,\n deleted: success.filter((i) => i.operation === AssetSyncOperation.Delete).length,\n failed: failed.length,\n },\n }\n }\n\n /**\n * Upload a local asset to Botpress\n */\n private async uploadAsset(client: Client, localFile: LocalAssetFile): Promise<void> {\n const content = await fs.readFile(localFile.absolutePath)\n\n await client.uploadFile({\n key: localFile.relativePath,\n content,\n contentType: localFile.mime,\n tags: {\n type: 'asset',\n adk: 'true',\n path: localFile.relativePath,\n hash: localFile.hash,\n name: localFile.name,\n size: localFile.size.toString(),\n },\n index: true, // Make file searchable\n })\n }\n\n /**\n * Generate TypeScript types for assets\n */\n async generateTypes(): Promise<string> {\n const localAssets = await this.getLocalAssets()\n\n // Generate union type of all asset paths\n const pathUnion = localAssets.map((asset) => `\"${asset.relativePath}\"`).join(' | ')\n\n const paths = localAssets.map((asset) => ` \"${asset.relativePath}\": \"${asset.relativePath}\";`).join('\\n')\n\n return `// Auto-generated asset types\nimport { Asset } from '@botpress/runtime';\n\nexport type AssetPaths = ${pathUnion || 'never'};\n\nexport interface AssetPathMap {\n${paths}\n}\n\n// Runtime asset access\ndeclare global {\n const assets: {\n get<T extends AssetPaths>(path: T): Asset;\n list(): Asset[];\n getSyncStatus(): { \n synced: boolean; \n neverSynced: string[]; \n stale: string[];\n upToDate: string[];\n };\n };\n}\n`\n }\n\n /**\n * Create an assets index file\n */\n async createAssetsIndex(): Promise<AssetsIndex> {\n const remoteAssets = await this.getRemoteAssets()\n\n return {\n files: remoteAssets,\n generatedAt: new Date().toISOString(),\n totalFiles: remoteAssets.length,\n totalSize: remoteAssets.reduce((sum, asset) => sum + asset.size, 0),\n }\n }\n\n /**\n * Get enriched local assets with remote metadata when available\n * Uses cache to avoid unnecessary API calls\n */\n async getEnrichedLocalAssets(): Promise<AssetFile[]> {\n const localAssets = await this.getLocalAssets()\n const enrichedAssets: AssetFile[] = []\n\n // Try to get client if credentials are available\n let remoteAssetsMap: Map<string, AssetFile> = new Map()\n try {\n if (this.botId) {\n const remoteAssets = await this.getRemoteAssets()\n remoteAssetsMap = new Map(remoteAssets.map((asset) => [asset.path, asset]))\n }\n } catch (error) {\n // If we can't fetch remote assets, we'll use cache or placeholders\n console.debug('Could not fetch remote assets:', error)\n }\n\n for (const localAsset of localAssets) {\n const cachedEntry = await this.cacheManager.getEntry(localAsset.relativePath)\n const remoteAsset = remoteAssetsMap.get(localAsset.relativePath)\n\n if (cachedEntry) {\n // We have cached metadata - use it and update the cache with current hashes\n enrichedAssets.push(cachedEntry.metadata)\n await this.cacheManager.setEntry(\n localAsset.relativePath,\n localAsset.hash,\n cachedEntry.remoteHash,\n cachedEntry.metadata\n )\n } else if (remoteAsset) {\n // No cache but we have remote - use remote and cache it\n enrichedAssets.push(remoteAsset)\n await this.cacheManager.setEntry(localAsset.relativePath, localAsset.hash, remoteAsset.hash, remoteAsset)\n } else {\n // No cache and no remote - create placeholder\n const placeholderAsset: AssetFile = {\n url: `__PLACEHOLDER_URL_${localAsset.relativePath}__`,\n path: localAsset.relativePath,\n size: localAsset.size,\n name: localAsset.name,\n mime: localAsset.mime,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n fileId: `__PLACEHOLDER_ID_${localAsset.relativePath}__`,\n hash: localAsset.hash,\n }\n enrichedAssets.push(placeholderAsset)\n }\n }\n\n return enrichedAssets\n }\n\n // Private utility methods\n\n private async scanDirectory(dir: string, files: string[] = []): Promise<string[]> {\n const items = await fs.readdir(dir)\n\n for (const item of items) {\n const fullPath = path.join(dir, item)\n const stats = await fs.stat(fullPath)\n\n if (stats.isDirectory()) {\n await this.scanDirectory(fullPath, files)\n } else {\n files.push(fullPath)\n }\n }\n\n return files\n }\n\n private calculateHash(content: Buffer): string {\n return crypto.createHash('sha256').update(content).digest('hex')\n }\n\n private getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase()\n\n const mimeTypes: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.html': 'text/html',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.zip': 'application/zip',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n }\n\n return mimeTypes[ext] || 'application/octet-stream'\n }\n}\n",
|
|
33
|
-
"import fs from 'fs/promises'\nimport path from 'path'\nimport { AssetFile } from './types.js'\nimport { defaultAdkFolder } from '../const.js'\n\nexport interface AssetsCacheEntry {\n path: string\n localHash: string\n remoteHash: string\n metadata: AssetFile\n lastUpdated: string\n}\n\nexport interface AssetsCache {\n version: string\n entries: Record<string, AssetsCacheEntry>\n}\n\nexport class AssetsCacheManager {\n private cachePath: string\n private cache: AssetsCache | null = null\n\n constructor(private projectPath: string) {\n this.cachePath = path.join(projectPath, defaultAdkFolder, 'assets-cache.json')\n }\n\n async load(): Promise<AssetsCache> {\n if (this.cache) {\n return this.cache\n }\n\n try {\n const content = await fs.readFile(this.cachePath, 'utf-8')\n this.cache = JSON.parse(content)\n return this.cache!\n } catch
|
|
33
|
+
"import fs from 'fs/promises'\nimport path from 'path'\nimport { AssetFile } from './types.js'\nimport { defaultAdkFolder } from '../const.js'\n\nexport interface AssetsCacheEntry {\n path: string\n localHash: string\n remoteHash: string\n metadata: AssetFile\n lastUpdated: string\n}\n\nexport interface AssetsCache {\n version: string\n entries: Record<string, AssetsCacheEntry>\n}\n\nexport class AssetsCacheManager {\n private cachePath: string\n private cache: AssetsCache | null = null\n\n constructor(private projectPath: string) {\n this.cachePath = path.join(projectPath, defaultAdkFolder, 'assets-cache.json')\n }\n\n async load(): Promise<AssetsCache> {\n if (this.cache) {\n return this.cache\n }\n\n try {\n const content = await fs.readFile(this.cachePath, 'utf-8')\n this.cache = JSON.parse(content)\n return this.cache!\n } catch {\n // Cache doesn't exist or is invalid, create new one\n this.cache = {\n version: '1.0',\n entries: {},\n }\n return this.cache\n }\n }\n\n async save(): Promise<void> {\n if (!this.cache) {\n return\n }\n\n const cacheDir = path.dirname(this.cachePath)\n await fs.mkdir(cacheDir, { recursive: true })\n await fs.writeFile(this.cachePath, JSON.stringify(this.cache, null, 2), 'utf-8')\n }\n\n async getEntry(assetPath: string): Promise<AssetsCacheEntry | null> {\n const cache = await this.load()\n return cache.entries[assetPath] || null\n }\n\n async setEntry(assetPath: string, localHash: string, remoteHash: string, metadata: AssetFile): Promise<void> {\n const cache = await this.load()\n cache.entries[assetPath] = {\n path: assetPath,\n localHash,\n remoteHash,\n metadata,\n lastUpdated: new Date().toISOString(),\n }\n await this.save()\n }\n\n async isStale(assetPath: string): Promise<boolean> {\n const entry = await this.getEntry(assetPath)\n if (!entry) return false\n return entry.localHash !== entry.remoteHash\n }\n\n async removeEntry(assetPath: string): Promise<void> {\n const cache = await this.load()\n delete cache.entries[assetPath]\n await this.save()\n }\n\n async clear(): Promise<void> {\n this.cache = {\n version: '1.0',\n entries: {},\n }\n await this.save()\n }\n\n async getAllEntries(): Promise<AssetsCacheEntry[]> {\n const cache = await this.load()\n return Object.values(cache.entries)\n }\n}\n",
|
|
34
34
|
"export const defaultAdkFolder = '.adk'\n//\n",
|
|
35
35
|
"import path from 'path'\nimport { createFile } from '../utils/fs.js'\nimport { defaultAdkFolder } from '../const.js'\nimport { AssetFile } from './types.js'\n\n/**\n * Updates the assets runtime file with actual deployed metadata\n * This is called after assets are uploaded to Botpress\n */\nexport async function updateAssetsRuntime(projectPath: string, deployedAssets: AssetFile[]): Promise<void> {\n // Create a map of deployed assets by path\n const assetsMap: Record<string, AssetFile> = {}\n for (const asset of deployedAssets) {\n assetsMap[asset.path] = asset\n }\n\n // Generate the updated runtime code with real metadata\n const runtimeCode = `\n// Auto-generated assets metadata\nimport { Asset, initAssets } from '@botpress/runtime/runtime';\n\n// Static asset metadata (populated at deploy time)\nexport const assetsMetadata: Record<string, Asset> = ${JSON.stringify(assetsMap, null, 2)};\n\n// Initialize the assets runtime with metadata\n// The global object should be passed by the agent initialization code\nexport function initializeAssets(globalObj: any = globalThis) {\n initAssets(globalObj, assetsMetadata);\n}\n\n// Auto-initialize if running in a supported environment\nif (typeof globalThis !== 'undefined') {\n initializeAssets(globalThis);\n} else if (typeof global !== 'undefined') {\n initializeAssets(global);\n}\n`\n\n const runtimePath = path.join(projectPath, defaultAdkFolder, 'assets-runtime.ts')\n await createFile(runtimePath, runtimeCode)\n}\n",
|
|
36
|
-
"import { Client } from '@botpress/client'\nimport { auth, Credentials } from '../auth/index.js'\nimport { Dependencies, ValidationError } from '../agent-project/types.js'\nimport { IntegrationDefinition, ParsedIntegration, IntegrationValidationResult, IntegrationRef } from './types.js'\nimport { EnhancedIntegrationCache } from './enhanced-cache.js'\nimport { IntegrationParser } from '../agent-project/dependencies-parser.js'\nimport { ValidationErrors } from '../agent-project/validation-errors.js'\n\nexport interface IntegrationManagerOptions {\n noCache?: boolean\n workspaceId?: string\n credentials?: Credentials\n}\n\nexport class IntegrationManager {\n private cache: EnhancedIntegrationCache\n private options: IntegrationManagerOptions\n private client?: Client\n\n constructor(options: IntegrationManagerOptions = {}) {\n this.options = options\n this.cache = new EnhancedIntegrationCache(options.noCache || false)\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = this.options.credentials || (await auth.getActiveCredentials())\n\n // Ensure we have all required credentials\n if (!this.options.workspaceId && !credentials.workspaceId) {\n throw new Error('No workspace ID found in current profile. Please login again with \"adk login\"')\n }\n\n const workspaceId = this.options.workspaceId || credentials.workspaceId\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n /**\n * Load and validate all integrations from dependencies\n */\n async loadIntegrations(dependencies: Dependencies): Promise<{\n integrations: ParsedIntegration[]\n errors: ValidationError[]\n warnings: ValidationError[]\n }> {\n const errors: ValidationError[] = []\n const warnings: ValidationError[] = []\n\n // Parse integrations from dependencies\n const parseResult = IntegrationParser.parseIntegrations(dependencies)\n const integrations = parseResult.integrations\n errors.push(...parseResult.errors)\n\n // Check for duplicates\n const duplicateWarnings = IntegrationParser.checkDuplicates(integrations)\n warnings.push(...duplicateWarnings)\n\n // Fetch integration definitions in parallel\n const fetchPromises = integrations.map(async (integration) => {\n try {\n const definition = await this.fetchIntegration(integration.ref)\n integration.definition = definition\n\n // Validate the integration\n const validation = this.validateIntegration(integration)\n integration.validationResult = validation\n\n if (!validation.valid) {\n validation.errors.forEach(() => {\n errors.push(ValidationErrors.unknownIntegration(integration.alias, integration.ref.fullName))\n })\n }\n\n if (validation.warnings.length > 0) {\n validation.warnings.forEach((warn) => {\n warnings.push(ValidationErrors.warning(warn, 'agent.config.ts'))\n })\n }\n } catch (error) {\n // Use the specific error message if available\n if (error instanceof Error && error.message.includes('version')) {\n // Version-specific error\n errors.push(ValidationErrors.integrationVersionError(integration.alias, error.message))\n } else {\n // Integration not found - use detailed error message if available\n const errorMessage = error instanceof Error ? error.message : undefined\n errors.push(ValidationErrors.unknownIntegration(integration.alias, integration.ref.fullName, errorMessage))\n }\n }\n })\n\n await Promise.all(fetchPromises)\n\n // Check if any integration has channels\n const hasChannels = integrations.some(\n (i) => i.definition?.channels && Object.keys(i.definition.channels).length > 0\n )\n\n if (!hasChannels && integrations.length > 0) {\n warnings.push(\n ValidationErrors.warning(\n 'No integrations with channels found. Your agent may not be able to receive messages.',\n 'agent.config.ts',\n 'Add an integration with channels (e.g., slack, webchat) to enable conversations'\n )\n )\n }\n\n return { integrations, errors, warnings }\n }\n\n /**\n * Fetch integration definition from API or cache\n */\n public async fetchIntegration(ref: IntegrationRef): Promise<IntegrationDefinition> {\n // Level 1: Check version resolution cache (name@version → intver + updatedAt)\n const cachedResolution = await this.cache.getResolution(ref.name, ref.version, ref.workspace)\n\n if (cachedResolution) {\n // Level 2: Check definition cache (intver + updatedAt → definition)\n const cachedDefinition = await this.cache.getDefinition(\n cachedResolution.integrationId,\n cachedResolution.updatedAt\n )\n\n if (cachedDefinition) {\n return cachedDefinition\n }\n }\n\n // No cache hit, fetch from API\n const client = await this.getClient()\n\n // Try to find the integration (private first, then public)\n const integration = await this._findPrivateOrPublicIntegration(client, ref)\n if (!integration) {\n throw await this._buildIntegrationNotFoundError(client, ref)\n }\n\n // Cache Level 1: Version resolution (name@version → intver + updatedAt)\n await this.cache.setResolution(ref.name, ref.version, ref.workspace, integration.id, integration.updatedAt)\n\n // Cache Level 2: Definition (intver + updatedAt → definition)\n const definition: IntegrationDefinition = integration\n await this.cache.setDefinition(integration.id, integration.updatedAt, definition)\n\n return definition\n }\n\n /**\n * Find integration in private workspace first, then public hub\n * Similar to ApiClient.findPublicOrPrivateIntegration from @botpress/cli\n */\n private async _findPrivateOrPublicIntegration(\n client: Client,\n ref: IntegrationRef\n ): Promise<IntegrationDefinition | undefined> {\n // Try private/workspace integration first\n const privateIntegration = await this._findPrivateIntegration(client, ref)\n if (privateIntegration) {\n return privateIntegration\n }\n\n // Try public integration\n const publicIntegration = await this._findPublicIntegration(client, ref)\n if (publicIntegration) {\n return publicIntegration\n }\n\n return undefined\n }\n\n /**\n * Find private/workspace integration\n */\n private async _findPrivateIntegration(\n client: Client,\n ref: IntegrationRef\n ): Promise<IntegrationDefinition | undefined> {\n try {\n // For workspace integrations, always use \"latest\" as they don't support version pinning\n const version = ref.workspace && ref.version !== 'latest' ? 'latest' : ref.version\n\n const response = await client.getIntegrationByName({\n name: ref.fullName,\n version,\n })\n return response.integration\n } catch (error) {\n // Return undefined on ResourceNotFound, throw on other errors\n if (this._isResourceNotFoundError(error)) {\n return undefined\n }\n throw error\n }\n }\n\n /**\n * Find public integration\n */\n private async _findPublicIntegration(\n client: Client,\n ref: IntegrationRef\n ): Promise<IntegrationDefinition | undefined> {\n try {\n const response = await client.getPublicIntegration({\n name: ref.fullName,\n version: ref.version,\n })\n return response.integration\n } catch (error) {\n // Return undefined on ResourceNotFound, throw on other errors\n if (this._isResourceNotFoundError(error)) {\n return undefined\n }\n throw error\n }\n }\n\n /**\n * Check if error is a ResourceNotFound error\n */\n private _isResourceNotFoundError(error: unknown): boolean {\n if (error && typeof error === 'object' && 'type' in error) {\n return (error as any).type === 'ResourceNotFound'\n }\n return false\n }\n\n /**\n * Build a helpful error message when integration is not found\n */\n private async _buildIntegrationNotFoundError(client: Client, ref: IntegrationRef): Promise<Error> {\n // If no workspace prefix, simple error\n if (!ref.workspace) {\n return new Error(`Integration \"${ref.name}\" not found in the official Botpress hub`)\n }\n\n // Get current workspace info to compare handles\n let currentWorkspaceHandle: string | undefined\n let workspaceId: string | undefined\n try {\n const credentials = this.options.credentials || (await auth.getActiveCredentials())\n workspaceId = this.options.workspaceId || credentials.workspaceId\n\n if (workspaceId) {\n // List workspaces to find current workspace and get its handle\n const currentWorkspace = await client.getWorkspace({ id: workspaceId })\n currentWorkspaceHandle = currentWorkspace?.handle\n }\n } catch {\n // If we can't get workspace info, use generic error\n return new Error(`Integration \"${ref.name}\" not found in workspace \"${ref.workspace}\"`)\n }\n\n // Case 1: Trying to install from the same workspace\n if (currentWorkspaceHandle === ref.workspace) {\n return new Error(\n `Integration \"${ref.name}\" not found in workspace \"${ref.workspace}\" (workspaceId: ${workspaceId}). ` +\n `Are you sure you published the integration? ` +\n `Run 'adk deploy' to publish it to your workspace.`\n )\n }\n\n // Case 2: Trying to install from a different workspace (likely private)\n return new Error(\n `Integration \"${ref.name}\" not found in workspace \"${ref.workspace}\" (current workspaceId: ${workspaceId}). ` +\n `This integration may be private. Private integrations can only be installed in the same workspace. ` +\n `If you want to share this integration with other workspaces, deploy it with --visibility=\"unlisted\" or --visibility=\"public\".`\n )\n }\n\n /**\n * Validate an integration definition\n */\n private validateIntegration(integration: ParsedIntegration): IntegrationValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!integration.definition) {\n errors.push(`Integration definition not found for ${integration.alias}`)\n return { valid: false, errors, warnings }\n }\n\n // Check if integration has channels\n const hasChannels = integration.definition.channels && Object.keys(integration.definition.channels).length > 0\n\n // Check if integration requires configuration\n if (!integration.config) {\n let requiresConfig = false\n\n // Check modern configurations (plural)\n if (integration.definition.configurations) {\n requiresConfig = Object.values(integration.definition.configurations).some(\n (config) => config.identifier?.required === true\n )\n }\n\n // Check legacy configuration (singular) - if it has required fields in schema\n if (!requiresConfig && integration.definition.configuration) {\n const config = integration.definition.configuration\n const schema = config.schema\n requiresConfig = schema?.required && schema.required.length > 0\n }\n\n if (requiresConfig) {\n warnings.push(\n `Integration '${integration.alias}' requires configuration. Add a config object in agent.config.ts dependencies`\n )\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n missingChannels: !hasChannels,\n }\n }\n\n /**\n * Get cache statistics\n */\n async getCacheStats(): Promise<{ count: number; sizeBytes: number }> {\n const stats = await this.cache.getStats()\n // Combine resolution and definition cache stats\n return {\n count: stats.resolutions.count + stats.definitions.count,\n sizeBytes: stats.resolutions.sizeBytes + stats.definitions.sizeBytes,\n }\n }\n\n /**\n * Clear integration cache\n */\n async clearCache(): Promise<void> {\n await this.cache.clear()\n }\n}\n",
|
|
36
|
+
"import { Client } from '@botpress/client'\nimport { auth, Credentials } from '../auth/index.js'\nimport { Dependencies, ValidationError } from '../agent-project/types.js'\nimport { IntegrationDefinition, ParsedIntegration, IntegrationValidationResult, IntegrationRef } from './types.js'\nimport { EnhancedIntegrationCache } from './enhanced-cache.js'\nimport { IntegrationParser } from '../agent-project/dependencies-parser.js'\nimport { ValidationErrors } from '../agent-project/validation-errors.js'\n\nexport interface IntegrationManagerOptions {\n noCache?: boolean\n workspaceId?: string\n credentials?: Credentials\n}\n\nexport class IntegrationManager {\n private cache: EnhancedIntegrationCache\n private options: IntegrationManagerOptions\n private client?: Client\n\n constructor(options: IntegrationManagerOptions = {}) {\n this.options = options\n this.cache = new EnhancedIntegrationCache(options.noCache || false)\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = this.options.credentials || (await auth.getActiveCredentials())\n\n // Ensure we have all required credentials\n if (!this.options.workspaceId && !credentials.workspaceId) {\n throw new Error('No workspace ID found in current profile. Please login again with \"adk login\"')\n }\n\n const workspaceId = this.options.workspaceId || credentials.workspaceId\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n /**\n * Load and validate all integrations from dependencies\n */\n async loadIntegrations(dependencies: Dependencies): Promise<{\n integrations: ParsedIntegration[]\n errors: ValidationError[]\n warnings: ValidationError[]\n }> {\n const errors: ValidationError[] = []\n const warnings: ValidationError[] = []\n\n // Parse integrations from dependencies\n const parseResult = IntegrationParser.parseIntegrations(dependencies)\n const integrations = parseResult.integrations\n errors.push(...parseResult.errors)\n\n // Check for duplicates\n const duplicateWarnings = IntegrationParser.checkDuplicates(integrations)\n warnings.push(...duplicateWarnings)\n\n // Fetch integration definitions in parallel\n const fetchPromises = integrations.map(async (integration) => {\n try {\n const definition = await this.fetchIntegration(integration.ref)\n integration.definition = definition\n\n // Validate the integration\n const validation = this.validateIntegration(integration)\n integration.validationResult = validation\n\n if (!validation.valid) {\n validation.errors.forEach(() => {\n errors.push(ValidationErrors.unknownIntegration(integration.alias, integration.ref.fullName))\n })\n }\n\n if (validation.warnings.length > 0) {\n validation.warnings.forEach((warn) => {\n warnings.push(ValidationErrors.warning(warn, 'agent.config.ts'))\n })\n }\n } catch (error) {\n // Use the specific error message if available\n if (error instanceof Error && error.message.includes('version')) {\n // Version-specific error\n errors.push(ValidationErrors.integrationVersionError(integration.alias, error.message))\n } else {\n // Integration not found - use detailed error message if available\n const errorMessage = error instanceof Error ? error.message : undefined\n errors.push(ValidationErrors.unknownIntegration(integration.alias, integration.ref.fullName, errorMessage))\n }\n }\n })\n\n await Promise.all(fetchPromises)\n\n // Check if any integration has channels\n const hasChannels = integrations.some(\n (i) => i.definition?.channels && Object.keys(i.definition.channels).length > 0\n )\n\n if (!hasChannels && integrations.length > 0) {\n warnings.push(\n ValidationErrors.warning(\n 'No integrations with channels found. Your agent may not be able to receive messages.',\n 'agent.config.ts',\n 'Add an integration with channels (e.g., slack, webchat) to enable conversations'\n )\n )\n }\n\n return { integrations, errors, warnings }\n }\n\n /**\n * Fetch integration definition from API or cache\n */\n public async fetchIntegration(ref: IntegrationRef): Promise<IntegrationDefinition> {\n // Level 1: Check version resolution cache (name@version → intver + updatedAt)\n const cachedResolution = await this.cache.getResolution(ref.name, ref.version, ref.workspace)\n\n if (cachedResolution) {\n // Level 2: Check definition cache (intver + updatedAt → definition)\n const cachedDefinition = await this.cache.getDefinition(\n cachedResolution.integrationId,\n cachedResolution.updatedAt\n )\n\n if (cachedDefinition) {\n return cachedDefinition\n }\n }\n\n // No cache hit, fetch from API\n const client = await this.getClient()\n\n // Try to find the integration (private first, then public)\n const integration = await this._findPrivateOrPublicIntegration(client, ref)\n if (!integration) {\n throw await this._buildIntegrationNotFoundError(client, ref)\n }\n\n // Cache Level 1: Version resolution (name@version → intver + updatedAt)\n await this.cache.setResolution(ref.name, ref.version, ref.workspace, integration.id, integration.updatedAt)\n\n // Cache Level 2: Definition (intver + updatedAt → definition)\n const definition: IntegrationDefinition = integration\n await this.cache.setDefinition(integration.id, integration.updatedAt, definition)\n\n return definition\n }\n\n /**\n * Find integration in private workspace first, then public hub\n * Similar to ApiClient.findPublicOrPrivateIntegration from @botpress/cli\n */\n private async _findPrivateOrPublicIntegration(\n client: Client,\n ref: IntegrationRef\n ): Promise<IntegrationDefinition | undefined> {\n // Try private/workspace integration first\n const privateIntegration = await this._findPrivateIntegration(client, ref)\n if (privateIntegration) {\n return privateIntegration\n }\n\n // Try public integration\n const publicIntegration = await this._findPublicIntegration(client, ref)\n if (publicIntegration) {\n return publicIntegration\n }\n\n return undefined\n }\n\n /**\n * Find private/workspace integration\n */\n private async _findPrivateIntegration(\n client: Client,\n ref: IntegrationRef\n ): Promise<IntegrationDefinition | undefined> {\n try {\n // For workspace integrations, always use \"latest\" as they don't support version pinning\n const version = ref.workspace && ref.version !== 'latest' ? 'latest' : ref.version\n\n const response = await client.getIntegrationByName({\n name: ref.fullName,\n version,\n })\n return response.integration\n } catch (error) {\n // Return undefined on ResourceNotFound, throw on other errors\n if (this._isResourceNotFoundError(error)) {\n return undefined\n }\n throw error\n }\n }\n\n /**\n * Find public integration\n */\n private async _findPublicIntegration(\n client: Client,\n ref: IntegrationRef\n ): Promise<IntegrationDefinition | undefined> {\n try {\n const response = await client.getPublicIntegration({\n name: ref.fullName,\n version: ref.version,\n })\n return response.integration\n } catch (error) {\n // Return undefined on ResourceNotFound, throw on other errors\n if (this._isResourceNotFoundError(error)) {\n return undefined\n }\n throw error\n }\n }\n\n /**\n * Check if error is a ResourceNotFound error\n */\n private _isResourceNotFoundError(error: unknown): boolean {\n if (error && typeof error === 'object' && 'type' in error) {\n return (error as { type: unknown }).type === 'ResourceNotFound'\n }\n return false\n }\n\n /**\n * Build a helpful error message when integration is not found\n */\n private async _buildIntegrationNotFoundError(client: Client, ref: IntegrationRef): Promise<Error> {\n // If no workspace prefix, simple error\n if (!ref.workspace) {\n return new Error(`Integration \"${ref.name}\" not found in the official Botpress hub`)\n }\n\n // Get current workspace info to compare handles\n let currentWorkspaceHandle: string | undefined\n let workspaceId: string | undefined\n try {\n const credentials = this.options.credentials || (await auth.getActiveCredentials())\n workspaceId = this.options.workspaceId || credentials.workspaceId\n\n if (workspaceId) {\n // List workspaces to find current workspace and get its handle\n const currentWorkspace = await client.getWorkspace({ id: workspaceId })\n currentWorkspaceHandle = currentWorkspace?.handle\n }\n } catch {\n // If we can't get workspace info, use generic error\n return new Error(`Integration \"${ref.name}\" not found in workspace \"${ref.workspace}\"`)\n }\n\n // Case 1: Trying to install from the same workspace\n if (currentWorkspaceHandle === ref.workspace) {\n return new Error(\n `Integration \"${ref.name}\" not found in workspace \"${ref.workspace}\" (workspaceId: ${workspaceId}). ` +\n `Are you sure you published the integration? ` +\n `Run 'adk deploy' to publish it to your workspace.`\n )\n }\n\n // Case 2: Trying to install from a different workspace (likely private)\n return new Error(\n `Integration \"${ref.name}\" not found in workspace \"${ref.workspace}\" (current workspaceId: ${workspaceId}). ` +\n `This integration may be private. Private integrations can only be installed in the same workspace. ` +\n `If you want to share this integration with other workspaces, deploy it with --visibility=\"unlisted\" or --visibility=\"public\".`\n )\n }\n\n /**\n * Validate an integration definition\n */\n private validateIntegration(integration: ParsedIntegration): IntegrationValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!integration.definition) {\n errors.push(`Integration definition not found for ${integration.alias}`)\n return { valid: false, errors, warnings }\n }\n\n // Check if integration has channels\n const hasChannels = integration.definition.channels && Object.keys(integration.definition.channels).length > 0\n\n // Check if integration requires configuration (only for object-format integrations with explicit enabled)\n if (!integration.config && integration.enabled !== undefined) {\n let requiresConfig = false\n\n // Check modern configurations (plural)\n if (integration.definition.configurations) {\n requiresConfig = Object.values(integration.definition.configurations).some(\n (config) => config.identifier?.required === true\n )\n }\n\n // Check legacy configuration (singular) - if it has required fields in schema\n if (!requiresConfig && integration.definition.configuration) {\n const config = integration.definition.configuration\n const schema = config.schema\n requiresConfig = schema?.required && schema.required.length > 0\n }\n\n if (requiresConfig) {\n warnings.push(\n `Integration '${integration.alias}' requires configuration. Add a config object in agent.config.ts dependencies`\n )\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n missingChannels: !hasChannels,\n }\n }\n\n /**\n * Get cache statistics\n */\n async getCacheStats(): Promise<{ count: number; sizeBytes: number }> {\n const stats = await this.cache.getStats()\n // Combine resolution and definition cache stats\n return {\n count: stats.resolutions.count + stats.definitions.count,\n sizeBytes: stats.resolutions.sizeBytes + stats.definitions.sizeBytes,\n }\n }\n\n /**\n * Clear integration cache\n */\n async clearCache(): Promise<void> {\n await this.cache.clear()\n }\n}\n",
|
|
37
37
|
"import fs from 'fs/promises'\nimport path from 'path'\nimport os from 'os'\nimport { IntegrationDefinition } from './types.js'\n\ninterface VersionResolution {\n integrationId: string\n updatedAt: string\n cachedAt: string\n}\n\ninterface CachedDefinition {\n definition: IntegrationDefinition\n cachedAt: string\n}\n\nexport class EnhancedIntegrationCache {\n private cacheDir: string\n private resolutionsDir: string\n private definitionsDir: string\n private noCache: boolean\n\n constructor(noCache: boolean = false) {\n this.noCache = noCache\n // Global cache in ~/.adk/cache\n this.cacheDir = path.join(os.homedir(), '.adk', 'cache', 'integrations')\n this.resolutionsDir = path.join(this.cacheDir, 'resolutions')\n this.definitionsDir = path.join(this.cacheDir, 'definitions')\n }\n\n private async ensureCacheDirs(): Promise<void> {\n await fs.mkdir(this.resolutionsDir, { recursive: true })\n await fs.mkdir(this.definitionsDir, { recursive: true })\n }\n\n /**\n * Get version resolution from cache (name@version → intver + updatedAt)\n * Returns null if cache miss or expired (5 minutes)\n */\n async getResolution(name: string, version: string, workspace?: string): Promise<VersionResolution | null> {\n if (this.noCache) {\n return null\n }\n\n try {\n const key = this.getResolutionKey(name, version, workspace)\n const cachePath = path.join(this.resolutionsDir, `${key}.json`)\n\n const data = await fs.readFile(cachePath, 'utf-8')\n const resolution: VersionResolution = JSON.parse(data)\n\n // Check if cache is expired (5 minutes)\n const cachedAt = new Date(resolution.cachedAt)\n const now = new Date()\n const ageMinutes = (now.getTime() - cachedAt.getTime()) / (1000 * 60)\n\n if (ageMinutes > 5) {\n // Cache expired\n return null\n }\n\n return resolution\n } catch {\n // Cache miss or error\n return null\n }\n }\n\n /**\n * Cache version resolution (name@version → intver + updatedAt)\n */\n async setResolution(\n name: string,\n version: string,\n workspace: string | undefined,\n integrationId: string,\n updatedAt: string\n ): Promise<void> {\n await this.ensureCacheDirs()\n\n const key = this.getResolutionKey(name, version, workspace)\n const cachePath = path.join(this.resolutionsDir, `${key}.json`)\n\n const resolution: VersionResolution = {\n integrationId,\n updatedAt,\n cachedAt: new Date().toISOString(),\n }\n\n await fs.writeFile(cachePath, JSON.stringify(resolution, null, 2))\n }\n\n /**\n * Get integration definition from cache (intver + updatedAt → definition)\n * Never expires for same intver + updatedAt (immutable)\n */\n async getDefinition(integrationId: string, updatedAt: string): Promise<IntegrationDefinition | null> {\n if (this.noCache) {\n return null\n }\n\n try {\n const key = this.getDefinitionKey(integrationId, updatedAt)\n const cachePath = path.join(this.definitionsDir, `${key}.json`)\n\n const data = await fs.readFile(cachePath, 'utf-8')\n const cached: CachedDefinition = JSON.parse(data)\n\n return cached.definition\n } catch {\n // Cache miss or error\n return null\n }\n }\n\n /**\n * Cache integration definition (intver + updatedAt → definition)\n */\n async setDefinition(integrationId: string, updatedAt: string, definition: IntegrationDefinition): Promise<void> {\n await this.ensureCacheDirs()\n\n const key = this.getDefinitionKey(integrationId, updatedAt)\n const cachePath = path.join(this.definitionsDir, `${key}.json`)\n\n const cached: CachedDefinition = {\n definition,\n cachedAt: new Date().toISOString(),\n }\n\n await fs.writeFile(cachePath, JSON.stringify(cached, null, 2))\n }\n\n /**\n * Clear all caches\n */\n async clear(): Promise<void> {\n try {\n // Clear resolutions\n const resolutionFiles = await fs.readdir(this.resolutionsDir)\n await Promise.all(resolutionFiles.map((file) => fs.unlink(path.join(this.resolutionsDir, file))))\n\n // Clear definitions\n const definitionFiles = await fs.readdir(this.definitionsDir)\n await Promise.all(definitionFiles.map((file) => fs.unlink(path.join(this.definitionsDir, file))))\n } catch {\n // Ignore errors if directories don't exist\n }\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<{\n resolutions: { count: number; sizeBytes: number }\n definitions: { count: number; sizeBytes: number }\n }> {\n const getDirectoryStats = async (dir: string) => {\n try {\n const files = await fs.readdir(dir)\n let totalSize = 0\n\n for (const file of files) {\n const stats = await fs.stat(path.join(dir, file))\n totalSize += stats.size\n }\n\n return {\n count: files.length,\n sizeBytes: totalSize,\n }\n } catch {\n return { count: 0, sizeBytes: 0 }\n }\n }\n\n const [resolutions, definitions] = await Promise.all([\n getDirectoryStats(this.resolutionsDir),\n getDirectoryStats(this.definitionsDir),\n ])\n\n return { resolutions, definitions }\n }\n\n private getResolutionKey(name: string, version: string, workspace?: string): string {\n // Create a safe filesystem key from name@version\n const prefix = workspace ? `${workspace}_` : ''\n const key = `${prefix}${name}_${version}`\n return key.replace(/[^a-zA-Z0-9_-]/g, '_')\n }\n\n private getDefinitionKey(integrationId: string, updatedAt: string): string {\n // Create a safe filesystem key from intver_xxx + updatedAt\n const key = `${integrationId}_${updatedAt}`\n return key.replace(/[^a-zA-Z0-9_-]/g, '_')\n }\n}\n",
|
|
38
|
-
"import { z, ZodIssueCode } from '@botpress/sdk'\nimport { Dependencies } from './types.js'\nimport { IntegrationRef, ParsedIntegration } from '../integrations/types.js'\nimport { PluginRef, ParsedPlugin } from '../plugins/types.js'\nimport { ValidationErrors } from './validation-errors.js'\nimport { ValidationError } from './types.js'\n\n// Integration alias validation constants (matching Botpress API requirements)\nconst INTEGRATION_ALIAS_MIN_LENGTH = 2\nconst INTEGRATION_ALIAS_MAX_LENGTH = 100\n\n// Regex for valid integration alias: lowercase alphanumeric with optional workspace prefix\n// Matches: \"slack\", \"my-slack\", \"slack_prod\", \"workspace/slack\", \"my-workspace/my-integration\"\nconst INTEGRATION_ALIAS_REGEX = /^(?:[a-z][a-z0-9_-]*\\/)?[a-z][a-z0-9_-]*$/\n\n/**\n * Validates an integration alias according to Botpress API requirements\n */\nfunction isIntegrationAliasValid(alias: string): boolean {\n return (\n alias.length >= INTEGRATION_ALIAS_MIN_LENGTH &&\n alias.length <= INTEGRATION_ALIAS_MAX_LENGTH &&\n INTEGRATION_ALIAS_REGEX.test(alias)\n )\n}\n\n// Integration reference schema\nconst integrationRefSchema = z.string().transform((val, ctx) => {\n // Match pattern: [workspace/]name@version\n const match = val.match(/^(?:([^/]+)\\/)?([^@]+)@(.+)$/)\n\n if (!match) {\n ctx.addIssue({\n code: ZodIssueCode.custom,\n message: `Invalid integration version format: ${val}. Expected format: 'name@version' or 'workspace/name@version'`,\n })\n return z.NEVER\n }\n\n const [, workspace, name, version] = match\n\n return {\n workspace: workspace || undefined,\n name: name!,\n version: version!,\n fullName: workspace ? `${workspace}/${name}` : name!,\n }\n})\n\n// Version validation schema\nconst versionSchema = z.string().refine(\n (version) => {\n if (version === 'latest') return true\n const semverPattern = /^(\\d+)\\.(\\d+)\\.(\\d+)(-[\\w.]+)?(\\+[\\w.]+)?$/\n return semverPattern.test(version)\n },\n { message: \"Version must be exact semver (e.g., 1.2.3) or 'latest'\" }\n)\n\nexport class IntegrationParser {\n /**\n * Parse an integration version string into its components\n * Examples:\n * - \"slack@1.2.0\" -> { name: 'slack', version: '1.2.0', fullName: 'slack' }\n * - \"myworkspace/slack@latest\" -> { workspace: 'myworkspace', name: 'slack', version: 'latest', fullName: 'myworkspace/slack' }\n */\n static parseIntegrationRef(versionString: string): IntegrationRef {\n const result = integrationRefSchema.safeParse(versionString)\n if (!result.success) {\n throw new Error(result.error.errors[0]?.message || 'Invalid integration version format')\n }\n return result.data\n }\n\n /**\n * Parse integrations from dependencies object\n */\n static parseIntegrations(dependencies: Dependencies): {\n integrations: ParsedIntegration[]\n errors: ValidationError[]\n } {\n const integrations: ParsedIntegration[] = []\n const errors: ValidationError[] = []\n\n if (!dependencies.integrations) {\n return { integrations, errors }\n }\n\n for (const [alias, value] of Object.entries(dependencies.integrations)) {\n try {\n // Validate alias format\n if (!isIntegrationAliasValid(alias)) {\n errors.push(ValidationErrors.invalidIntegrationAlias(alias))\n continue // Skip this integration, alias is invalid\n }\n\n // Parse the integration reference\n const ref = this.parseIntegrationRef(value.version)\n\n // Validate version format\n const versionResult = versionSchema.safeParse(ref.version)\n if (!versionResult.success) {\n errors.push(ValidationErrors.invalidVersionFormat(alias, ref.version))\n }\n\n integrations.push({\n alias,\n ref,\n enabled: value.enabled,\n configurationType: value.configurationType,\n config: value.config,\n })\n } catch (error) {\n errors.push(\n ValidationErrors.invalidDependenciesSyntax(\n `Invalid integration '${alias}': ${error instanceof Error ? error.message : String(error)}`\n )\n )\n }\n }\n\n return { integrations, errors }\n }\n\n /**\n * Check for duplicate integration names with identical configs (different aliases pointing to same integration)\n */\n static checkDuplicates(integrations: ParsedIntegration[]): ValidationError[] {\n const errors: ValidationError[] = []\n const seen = new Map<string, ParsedIntegration[]>()\n\n for (const integration of integrations) {\n const key = integration.ref.fullName\n const group = seen.get(key) || []\n group.push(integration)\n seen.set(key, group)\n }\n\n // Report duplicates only if they have the same configuration\n for (const [integrationName, group] of seen.entries()) {\n if (group.length > 1) {\n // Check if any two have identical configs\n const duplicateConfigs: string[] = []\n for (let i = 0; i < group.length; i++) {\n for (let j = i + 1; j < group.length; j++) {\n const configA = JSON.stringify(group[i]!.config ?? {})\n const configB = JSON.stringify(group[j]!.config ?? {})\n if (configA === configB) {\n // Add both aliases if not already in the list\n if (!duplicateConfigs.includes(group[i]!.alias)) {\n duplicateConfigs.push(group[i]!.alias)\n }\n if (!duplicateConfigs.includes(group[j]!.alias)) {\n duplicateConfigs.push(group[j]!.alias)\n }\n }\n }\n }\n\n if (duplicateConfigs.length > 0) {\n errors.push(\n ValidationErrors.warning(\n `Integration '${integrationName}' has aliases with identical configurations: ${duplicateConfigs.join(', ')}. Consider using different configs or removing duplicates.`,\n 'agent.config.ts'\n )\n )\n }\n }\n }\n\n return errors\n }\n}\n\n// Plugin alias validation constants\nconst PLUGIN_ALIAS_MIN_LENGTH = 2\nconst PLUGIN_ALIAS_MAX_LENGTH = 100\n\n// Regex for valid plugin alias: lowercase alphanumeric, no workspace prefix\n// Matches: \"hitl\", \"my-plugin\", \"some_plugin\"\nconst PLUGIN_ALIAS_REGEX = /^[a-z][a-z0-9_-]*$/\n\n/**\n * Validates a plugin alias (same rules as integrations, but no workspace prefix allowed)\n */\nfunction isPluginAliasValid(alias: string): boolean {\n return (\n alias.length >= PLUGIN_ALIAS_MIN_LENGTH &&\n alias.length <= PLUGIN_ALIAS_MAX_LENGTH &&\n PLUGIN_ALIAS_REGEX.test(alias)\n )\n}\n\n// Plugin reference schema: name@version only, no workspace prefix\nconst pluginRefSchema = z.string().transform((val, ctx) => {\n // Match pattern: name@version (no workspace prefix allowed)\n const match = val.match(/^([^/@]+)@(.+)$/)\n\n if (!match) {\n ctx.addIssue({\n code: ZodIssueCode.custom,\n message: `Invalid plugin version format: ${val}. Expected format: 'name@version' (no workspace prefix)`,\n })\n return z.NEVER\n }\n\n const [, name, version] = match\n\n return {\n name: name!,\n version: version!,\n fullName: name!,\n }\n})\n\nexport class PluginParser {\n /**\n * Parse a plugin version string into its components\n * Examples:\n * - \"hitl@1.3.0\" -> { name: 'hitl', version: '1.3.0', fullName: 'hitl' }\n * - \"myworkspace/hitl@1.0.0\" -> error (no workspace prefix)\n */\n static parsePluginRef(versionString: string): PluginRef {\n const result = pluginRefSchema.safeParse(versionString)\n if (!result.success) {\n throw new Error(result.error.errors[0]?.message || 'Invalid plugin version format')\n }\n return result.data\n }\n\n /**\n * Parse plugins from dependencies object\n */\n static parsePlugins(dependencies: Dependencies): {\n plugins: ParsedPlugin[]\n errors: ValidationError[]\n } {\n const plugins: ParsedPlugin[] = []\n const errors: ValidationError[] = []\n\n if (!dependencies.plugins) {\n return { plugins, errors }\n }\n\n for (const [alias, value] of Object.entries(dependencies.plugins)) {\n try {\n if (!isPluginAliasValid(alias)) {\n errors.push(ValidationErrors.invalidPluginAlias(alias))\n continue\n }\n\n const ref = this.parsePluginRef(value.version)\n\n const versionResult = versionSchema.safeParse(ref.version)\n if (!versionResult.success) {\n errors.push(ValidationErrors.invalidPluginVersionFormat(alias, ref.version))\n }\n\n plugins.push({\n alias,\n ref,\n config: value.config,\n dependencies: value.dependencies,\n })\n } catch (error) {\n errors.push(\n ValidationErrors.invalidDependenciesSyntax(\n `Invalid plugin '${alias}': ${error instanceof Error ? error.message : String(error)}`\n )\n )\n }\n }\n\n return { plugins, errors }\n }\n\n /**\n * Validate that plugin dependency integrationAlias values reference integrations\n * that are actually declared in dependencies.integrations\n */\n static validateDependencyReferences(dependencies: Dependencies): ValidationError[] {\n const errors: ValidationError[] = []\n\n if (!dependencies.plugins) {\n return errors\n }\n\n const integrationAliases = Object.keys(dependencies.integrations || {})\n\n for (const [alias, pluginConfig] of Object.entries(dependencies.plugins)) {\n if (!pluginConfig.dependencies) {\n continue\n }\n\n for (const [depAlias, depMapping] of Object.entries(pluginConfig.dependencies)) {\n if (!integrationAliases.includes(depMapping.integrationAlias)) {\n errors.push(\n ValidationErrors.invalidPluginDependency(alias, depMapping.integrationAlias, integrationAliases)\n )\n }\n }\n }\n\n return errors\n }\n\n /**\n * Check for duplicate plugin names (different aliases pointing to same plugin)\n */\n static checkDuplicates(plugins: ParsedPlugin[]): ValidationError[] {\n const errors: ValidationError[] = []\n const seen = new Map<string, ParsedPlugin[]>()\n\n for (const plugin of plugins) {\n const key = plugin.ref.fullName\n const group = seen.get(key) || []\n group.push(plugin)\n seen.set(key, group)\n }\n\n for (const [pluginName, group] of seen.entries()) {\n if (group.length > 1) {\n const duplicateConfigs: string[] = []\n for (let i = 0; i < group.length; i++) {\n for (let j = i + 1; j < group.length; j++) {\n const configA = JSON.stringify(group[i]!.config ?? {})\n const configB = JSON.stringify(group[j]!.config ?? {})\n if (configA === configB) {\n if (!duplicateConfigs.includes(group[i]!.alias)) {\n duplicateConfigs.push(group[i]!.alias)\n }\n if (!duplicateConfigs.includes(group[j]!.alias)) {\n duplicateConfigs.push(group[j]!.alias)\n }\n }\n }\n }\n\n if (duplicateConfigs.length > 0) {\n errors.push(\n ValidationErrors.warning(\n `Plugin '${pluginName}' has aliases with identical configurations: ${duplicateConfigs.join(', ')}. Consider using different configs or removing duplicates.`,\n 'agent.config.ts'\n )\n )\n }\n }\n }\n\n return errors\n }\n}\n",
|
|
39
|
-
"import fs from 'fs/promises'\nimport path from 'path'\nimport os from 'os'\nimport { IntegrationDefinition, CachedIntegration } from './types.js'\n\nexport class IntegrationCache {\n private cacheDir: string\n private integrationsDir: string\n\n constructor() {\n // Global cache in ~/.adk/cache\n this.cacheDir = path.join(os.homedir(), '.adk', 'cache')\n this.integrationsDir = path.join(this.cacheDir, 'integrations')\n }\n\n private async ensureCacheDir(): Promise<void> {\n await fs.mkdir(this.integrationsDir, { recursive: true })\n }\n\n private getCacheKey(integrationId: string, updatedAt: string): string {\n // Cache key format: integrationId@updatedAt\n // Remove any special characters that might cause filesystem issues\n const sanitizedId = integrationId.replace(/[^a-zA-Z0-9_-]/g, '_')\n const sanitizedDate = updatedAt.replace(/[^a-zA-Z0-9_-]/g, '_')\n return `${sanitizedId}@${sanitizedDate}.json`\n }\n\n async get(integrationId: string, updatedAt: string): Promise<IntegrationDefinition | null> {\n try {\n const cacheKey = this.getCacheKey(integrationId, updatedAt)\n const cachePath = path.join(this.integrationsDir, cacheKey)\n\n const data = await fs.readFile(cachePath, 'utf-8')\n const cached: CachedIntegration = JSON.parse(data)\n\n // Check if cache is expired\n if (cached.expiresAt) {\n const expiryDate = new Date(cached.expiresAt)\n if (expiryDate < new Date()) {\n // Cache expired, remove it\n await this.remove(integrationId, updatedAt)\n return null\n }\n }\n\n return cached.definition\n } catch
|
|
40
|
-
"import { Client } from '@botpress/client'\nimport * as process from 'process'\nimport { auth } from '../auth/index.js'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { IntegrationManager } from './manager.js'\nimport { IntegrationRef, IntegrationDefinition } from './types.js'\nimport { HubCache } from './hub-cache.js'\nimport { ConfigWriter } from '../agent-project/config-writer.js'\n\nexport interface IntegrationVersionInfo {\n name: string\n version: string\n latestVersion?: string\n availableVersions?: string[]\n}\n\nexport interface AddIntegrationOptions {\n name: string\n version?: string\n alias?: string\n}\n\nexport interface AddIntegrationResult {\n success: boolean\n message?: string\n requiresConfiguration?: boolean\n existingVersion?: string\n newVersion?: string\n}\n\nexport interface UpgradeIntegrationOptions {\n name?: string\n interactive?: boolean\n}\n\nexport interface RemoveIntegrationOptions {\n name?: string\n interactive?: boolean\n}\n\nexport class IntegrationOperations {\n private hubCache: HubCache\n private client?: Client\n private projectPath?: string\n\n constructor(options: { noCache?: boolean; projectPath?: string } = {}) {\n this.hubCache = new HubCache()\n this.projectPath = options.projectPath\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n\n let workspaceId = credentials.workspaceId\n\n try {\n // If projectPath is provided, try to get workspaceId from there\n if (this.projectPath) {\n const project = await AgentProject.load(this.projectPath)\n if (project.agentInfo?.workspaceId) {\n workspaceId = project.agentInfo.workspaceId\n }\n }\n } catch {\n // Ignore errors and fallback to credentials\n }\n\n if (!workspaceId) {\n throw new Error('No workspace ID found in current profile. Please login again with \"adk login\"')\n }\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId: workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n /**\n * Parse integration reference from string (e.g., \"slack@latest\", \"slack@1.0.0\")\n */\n private parseIntegrationRef(input: string): IntegrationRef {\n const parts = input.split('@')\n const name = parts[0] || ''\n const version = parts[1] || 'latest'\n\n if (!name) {\n throw new Error('Invalid integration reference: missing name')\n }\n\n // Check if it's a workspace integration (contains /)\n const workspaceParts = name.split('/')\n if (workspaceParts.length === 2 && workspaceParts[0] && workspaceParts[1]) {\n return {\n fullName: name,\n workspace: workspaceParts[0],\n name: workspaceParts[1],\n version,\n }\n }\n\n return { name, version, fullName: name }\n }\n\n /**\n * Get available versions for an integration\n */\n async getIntegrationVersions(name: string): Promise<IntegrationVersionInfo> {\n const client = await this.getClient()\n const ref = this.parseIntegrationRef(name)\n\n try {\n // Try to get private/workspace integration first\n const latestResponse = await client.getIntegrationByName({\n name: ref.fullName,\n version: 'latest',\n })\n\n return {\n name: ref.fullName,\n version: latestResponse.integration.version,\n latestVersion: latestResponse.integration.version,\n availableVersions: [latestResponse.integration.version],\n }\n } catch {\n // Try public integration\n try {\n const latestResponse = await client.getPublicIntegration({\n name: ref.name,\n version: 'latest',\n })\n\n return {\n name: ref.fullName,\n version: latestResponse.integration.version,\n latestVersion: latestResponse.integration.version,\n availableVersions: [latestResponse.integration.version],\n }\n } catch {\n throw new Error(`Integration \"${ref.fullName}\" not found`)\n }\n }\n }\n\n /**\n * Add an integration to agent.config.ts dependencies\n */\n async addIntegration(options: AddIntegrationOptions): Promise<AddIntegrationResult> {\n const project = await AgentProject.load(this.projectPath || process.cwd())\n\n const { name, version = 'latest' } = options\n\n // Check if integration exists and parse reference\n const ref = this.parseIntegrationRef(`${name}@${version}`)\n\n // Default alias to the base integration name (without workspace prefix)\n // e.g., \"sly/intercom\" -> alias is \"intercom\" by default\n const alias = options.alias || ref.name\n\n // Load current dependencies from project\n const dependencies = project.dependencies || { integrations: {} }\n\n if (!dependencies.integrations) {\n dependencies.integrations = {}\n }\n\n // Check if integration already exists\n const existingIntegration = dependencies.integrations[alias]\n if (existingIntegration) {\n let existingVersion: string\n if (typeof existingIntegration === 'string') {\n const existingRef = this.parseIntegrationRef(existingIntegration)\n existingVersion = existingRef.version\n } else if (typeof existingIntegration === 'object' && existingIntegration.version) {\n const existingRef = this.parseIntegrationRef(existingIntegration.version)\n existingVersion = existingRef.version\n } else {\n existingVersion = 'unknown'\n }\n\n // If version is not specified or same as existing, do nothing\n if (!version || version === 'latest' || version === existingVersion) {\n return {\n success: false,\n message: `Integration '${alias}' already exists with version ${existingVersion}. Use 'adk upgrade ${alias}' to upgrade to the latest version.`,\n existingVersion,\n }\n }\n }\n\n // Verify integration exists and get its definition\n let integrationDefinition: IntegrationDefinition\n try {\n const tempManager = new IntegrationManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const loadResult = await tempManager.loadIntegrations({\n integrations: {\n [alias]: {\n version: `${ref.fullName}@${ref.version}`,\n enabled: true,\n },\n },\n })\n\n if (loadResult.errors.length > 0) {\n const firstError = loadResult.errors[0]\n throw new Error(firstError?.message || 'Unknown error')\n }\n\n // Get the integration definition\n const loadedIntegration = loadResult.integrations[0]\n if (!loadedIntegration?.definition) {\n throw new Error('Failed to load integration definition')\n }\n integrationDefinition = loadedIntegration.definition\n } catch (error) {\n throw new Error(`Failed to add integration: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n // Get the actual version from the loaded integration definition\n const actualVersion = integrationDefinition.version\n const integrationVersion = `${ref.fullName}@${actualVersion}`\n\n // Get existing entry to check for existing config\n const existingEntry = dependencies.integrations[alias]\n const existingConfig = existingEntry && typeof existingEntry === 'object' ? existingEntry.config : undefined\n const existingConfigurationType =\n existingEntry && typeof existingEntry === 'object' ? existingEntry.configurationType : undefined\n\n const configurationType =\n existingConfigurationType || this.selectBestConfigurationType(integrationDefinition.configurations)\n\n let requiresConfiguration = false\n const selectedConfigDef =\n (configurationType && integrationDefinition.configurations?.[configurationType]) ||\n integrationDefinition.configurations?.['default'] ||\n integrationDefinition.configuration\n\n if (selectedConfigDef) {\n if (selectedConfigDef.identifier?.required === true) {\n requiresConfiguration = true\n }\n if (selectedConfigDef.schema?.required && selectedConfigDef.schema.required.length > 0) {\n requiresConfiguration = true\n }\n }\n\n // Get or generate config (preserves existing if present)\n const config =\n requiresConfiguration && !existingConfig\n ? this.getPlaceholderConfig(integrationDefinition, configurationType)\n : existingConfig\n\n // Preserve existing configuration if it's an object\n if (existingEntry && typeof existingEntry === 'object' && 'version' in existingEntry) {\n const resolvedConfigType = existingEntry.configurationType || configurationType\n dependencies.integrations[alias] = {\n version: integrationVersion,\n enabled: existingEntry.enabled,\n ...(resolvedConfigType ? { configurationType: resolvedConfigType } : {}),\n config: existingEntry.config,\n }\n } else {\n // Order: version, enabled, configurationType (if modern), config\n dependencies.integrations[alias] = {\n version: integrationVersion,\n enabled: !requiresConfiguration,\n ...(configurationType ? { configurationType } : {}),\n config: config,\n }\n }\n\n // Write back to agent.config.ts using ConfigWriter\n const configWriter = new ConfigWriter(project.path)\n await configWriter.updateDependencies(dependencies)\n\n return {\n success: true,\n requiresConfiguration,\n newVersion: actualVersion,\n }\n }\n\n // Select the 'easiest' configuration type from available options.\n private selectBestConfigurationType(configurations: Record<string, any> | undefined): string | undefined {\n if (!configurations || Object.keys(configurations).length === 0) {\n return undefined\n }\n\n const keys = Object.keys(configurations)\n\n if (keys.length === 1) {\n return keys[0]!\n }\n\n const priority = ['apiKey', 'api', 'api_key', 'token', 'default', 'refreshToken', 'oauth', 'oauth2']\n\n for (const preferred of priority) {\n const match = keys.find((k) => k.toLowerCase() === preferred.toLowerCase())\n if (match) return match\n }\n\n return keys[0]!\n }\n\n /**\n * Generate placeholder config values from integration schema\n */\n private getPlaceholderConfig(\n integrationDefinition: IntegrationDefinition,\n configurationType?: string\n ): Record<string, any> | undefined {\n // Generate config placeholders from schema\n const configPlaceholder: Record<string, any> = {}\n\n // Try modern configurations format first (using selected configuration type)\n const configDef =\n (configurationType && integrationDefinition.configurations?.[configurationType]) ||\n integrationDefinition.configurations?.['default'] ||\n integrationDefinition.configuration\n\n if (configDef) {\n const schema = configDef.schema\n\n if (schema?.required && schema.required.length > 0) {\n const properties = schema.properties || {}\n for (const fieldName of schema.required) {\n const fieldDef = properties[fieldName]\n // Generate placeholder based on type\n if (fieldDef?.type === 'string') {\n configPlaceholder[fieldName] = `YOUR_${fieldName.toUpperCase()}_HERE`\n } else if (fieldDef?.type === 'number' || fieldDef?.type === 'integer') {\n configPlaceholder[fieldName] = 0\n } else if (fieldDef?.type === 'boolean') {\n configPlaceholder[fieldName] = false\n } else {\n configPlaceholder[fieldName] = null\n }\n }\n\n if (Object.keys(configPlaceholder).length > 0) {\n return configPlaceholder\n }\n }\n }\n\n return undefined\n }\n\n /**\n * Remove an integration from agent.config.ts dependencies\n */\n async removeIntegration(name: string): Promise<void> {\n const project = await AgentProject.load(this.projectPath || process.cwd())\n\n // Load current dependencies from project\n const dependencies = project.dependencies\n\n if (!dependencies || !dependencies.integrations || !dependencies.integrations[name]) {\n throw new Error(`Integration \"${name}\" not found in dependencies`)\n }\n\n // Remove integration\n delete dependencies.integrations[name]\n\n // Write back to agent.config.ts using ConfigWriter\n const configWriter = new ConfigWriter(project.path)\n await configWriter.updateDependencies(dependencies)\n }\n\n /**\n * Upgrade integration(s) to latest version\n */\n async upgradeIntegration(name?: string): Promise<{ upgraded: string[]; failed: string[] }> {\n const project = await AgentProject.load(this.projectPath || process.cwd())\n\n // Load current dependencies from project\n const dependencies = project.dependencies\n\n if (!dependencies || !dependencies.integrations) {\n throw new Error('No integrations found in dependencies')\n }\n\n const upgraded: string[] = []\n const failed: string[] = []\n\n // Get integrations to upgrade\n const integrationsToUpgrade = name ? { [name]: dependencies.integrations[name] } : dependencies.integrations\n\n if (name && !integrationsToUpgrade[name]) {\n throw new Error(`Integration \"${name}\" not found in dependencies`)\n }\n\n // Upgrade each integration\n for (const [alias, value] of Object.entries(integrationsToUpgrade)) {\n try {\n let ref: IntegrationRef\n let currentVersion: string\n\n if (typeof value === 'string') {\n ref = this.parseIntegrationRef(value)\n currentVersion = ref.version\n } else if (typeof value === 'object' && value.version) {\n ref = this.parseIntegrationRef(value.version)\n currentVersion = ref.version\n } else {\n failed.push(alias)\n continue\n }\n\n // Get latest version (using fullName to preserve workspace prefix)\n const versionInfo = await this.getIntegrationVersions(ref.fullName)\n\n if (versionInfo.latestVersion && versionInfo.latestVersion !== currentVersion) {\n // Update to latest (value is always an object now)\n // Use ref.fullName to preserve workspace prefix (e.g., \"sly/intercom\")\n dependencies.integrations[alias] = {\n ...value,\n version: `${ref.fullName}@${versionInfo.latestVersion}`,\n }\n upgraded.push(`${alias} (${currentVersion} → ${versionInfo.latestVersion})`)\n }\n } catch {\n failed.push(alias)\n }\n }\n\n // Write back if any upgrades\n if (upgraded.length > 0) {\n const configWriter = new ConfigWriter(project.path)\n await configWriter.updateDependencies(dependencies)\n }\n\n return { upgraded, failed }\n }\n\n /**\n * Get list of current integrations\n */\n async listIntegrations(): Promise<Array<{ alias: string; name: string; version: string }>> {\n const project = await AgentProject.load(this.projectPath || process.cwd())\n\n // Read dependencies from project\n const dependencies = project.dependencies\n\n if (!dependencies || !dependencies.integrations) {\n return []\n }\n\n const integrations: Array<{\n alias: string\n name: string\n version: string\n }> = []\n\n for (const [alias, value] of Object.entries(dependencies.integrations)) {\n if (typeof value === 'string') {\n const ref = this.parseIntegrationRef(value)\n // Use fullName to preserve workspace prefix (e.g., \"sly/intercom\")\n integrations.push({ alias, name: ref.fullName, version: ref.version })\n } else if (typeof value === 'object' && value.version) {\n const ref = this.parseIntegrationRef(value.version)\n // Use fullName to preserve workspace prefix (e.g., \"sly/intercom\")\n integrations.push({ alias, name: ref.fullName, version: ref.version })\n }\n }\n\n return integrations\n }\n\n /**\n * Search for integrations in the hub cache\n */\n async searchIntegrations(query: string): Promise<\n Array<{\n name: string\n version: string\n title?: string\n description?: string\n }>\n > {\n const results = await this.hubCache.searchIntegrations(query)\n\n // Group by name and get latest version for each\n const latestByName = new Map<string, (typeof results)[0]>()\n for (const integration of results) {\n const existing = latestByName.get(integration.name)\n if (\n !existing ||\n integration.version.localeCompare(existing.version, undefined, {\n numeric: true,\n }) > 0\n ) {\n latestByName.set(integration.name, integration)\n }\n }\n\n return Array.from(latestByName.values()).map((i) => ({\n name: i.name,\n version: i.version,\n title: i.title,\n description: i.description,\n }))\n }\n\n /**\n * Get all available integrations from hub\n */\n async getAllAvailableIntegrations(): Promise<Array<{ name: string; version: string; title?: string }>> {\n const all = await this.hubCache.getAllIntegrations()\n\n // Group by name and get latest version for each\n const latestByName = new Map<string, (typeof all)[0]>()\n for (const integration of all) {\n const existing = latestByName.get(integration.name)\n if (\n !existing ||\n integration.version.localeCompare(existing.version, undefined, {\n numeric: true,\n }) > 0\n ) {\n latestByName.set(integration.name, integration)\n }\n }\n\n return Array.from(latestByName.values()).map((i) => ({\n name: i.name,\n version: i.version,\n title: i.title,\n }))\n }\n}\n",
|
|
38
|
+
"import { z } from '@botpress/sdk'\nimport { Dependencies } from './types.js'\nimport { IntegrationRef, ParsedIntegration } from '../integrations/types.js'\nimport { PluginRef, ParsedPlugin } from '../plugins/types.js'\nimport { ValidationErrors } from './validation-errors.js'\nimport { ValidationError } from './types.js'\n\n// Integration alias validation constants (matching Botpress API requirements)\nconst INTEGRATION_ALIAS_MIN_LENGTH = 2\nconst INTEGRATION_ALIAS_MAX_LENGTH = 100\n\n// Regex for valid integration alias: lowercase alphanumeric with optional workspace prefix\n// Matches: \"slack\", \"my-slack\", \"slack_prod\", \"workspace/slack\", \"my-workspace/my-integration\"\nconst INTEGRATION_ALIAS_REGEX = /^(?:[a-z][a-z0-9_-]*\\/)?[a-z][a-z0-9_-]*$/\n\n/**\n * Validates an integration alias according to Botpress API requirements\n */\nfunction isIntegrationAliasValid(alias: string): boolean {\n return (\n alias.length >= INTEGRATION_ALIAS_MIN_LENGTH &&\n alias.length <= INTEGRATION_ALIAS_MAX_LENGTH &&\n INTEGRATION_ALIAS_REGEX.test(alias)\n )\n}\n\n// Integration reference schema\nconst integrationRefSchema = z.string().transform((val, ctx) => {\n // Match pattern: [workspace/]name@version\n const match = val.match(/^(?:([^/]+)\\/)?([^@]+)@(.+)$/)\n\n if (!match) {\n ctx.addIssue({\n code: 'custom',\n message: `Invalid integration version format: ${val}. Expected format: 'name@version' or 'workspace/name@version'`,\n })\n return undefined as never\n }\n\n const [, workspace, name, version] = match\n\n return {\n workspace: workspace || undefined,\n name: name!,\n version: version!,\n fullName: workspace ? `${workspace}/${name}` : name!,\n }\n})\n\n// Version validation schema\nconst versionSchema = z.string().refine(\n (version) => {\n if (version === 'latest') return true\n const semverPattern = /^(\\d+)\\.(\\d+)\\.(\\d+)(-[\\w.]+)?(\\+[\\w.]+)?$/\n return semverPattern.test(version)\n },\n { message: \"Version must be exact semver (e.g., 1.2.3) or 'latest'\" }\n)\n\nexport class IntegrationParser {\n /**\n * Parse an integration version string into its components\n * Examples:\n * - \"slack@1.2.0\" -> { name: 'slack', version: '1.2.0', fullName: 'slack' }\n * - \"myworkspace/slack@latest\" -> { workspace: 'myworkspace', name: 'slack', version: 'latest', fullName: 'myworkspace/slack' }\n */\n static parseIntegrationRef(versionString: string): IntegrationRef {\n const result = integrationRefSchema.safeParse(versionString)\n if (!result.success) {\n throw new Error(result.error.errors[0]?.message || 'Invalid integration version format')\n }\n return result.data\n }\n\n /**\n * Parse integrations from dependencies object\n */\n static parseIntegrations(dependencies: Dependencies): {\n integrations: ParsedIntegration[]\n errors: ValidationError[]\n } {\n const integrations: ParsedIntegration[] = []\n const errors: ValidationError[] = []\n\n if (!dependencies.integrations) {\n return { integrations, errors }\n }\n\n for (const [alias, value] of Object.entries(dependencies.integrations)) {\n try {\n // Validate alias format\n if (!isIntegrationAliasValid(alias)) {\n errors.push(ValidationErrors.invalidIntegrationAlias(alias))\n continue // Skip this integration, alias is invalid\n }\n\n // Normalize: string shorthand → object with defaults\n const normalized = typeof value === 'string' ? { version: value } : value\n\n // Parse the integration reference\n const ref = this.parseIntegrationRef(normalized.version)\n\n // Validate version format\n const versionResult = versionSchema.safeParse(ref.version)\n if (!versionResult.success) {\n errors.push(ValidationErrors.invalidVersionFormat(alias, ref.version))\n }\n\n integrations.push({\n alias,\n ref,\n enabled: 'enabled' in normalized ? normalized.enabled : undefined,\n configurationType: 'configurationType' in normalized ? normalized.configurationType : undefined,\n config: 'config' in normalized ? normalized.config : undefined,\n })\n } catch (error) {\n errors.push(\n ValidationErrors.invalidDependenciesSyntax(\n `Invalid integration '${alias}': ${error instanceof Error ? error.message : String(error)}`\n )\n )\n }\n }\n\n return { integrations, errors }\n }\n\n /**\n * Check for duplicate integration names with identical configs (different aliases pointing to same integration)\n */\n static checkDuplicates(integrations: ParsedIntegration[]): ValidationError[] {\n const errors: ValidationError[] = []\n const seen = new Map<string, ParsedIntegration[]>()\n\n for (const integration of integrations) {\n const key = integration.ref.fullName\n const group = seen.get(key) || []\n group.push(integration)\n seen.set(key, group)\n }\n\n // Report duplicates only if they have the same configuration\n for (const [integrationName, group] of seen.entries()) {\n if (group.length > 1) {\n // Check if any two have identical configs\n const duplicateConfigs: string[] = []\n for (let i = 0; i < group.length; i++) {\n for (let j = i + 1; j < group.length; j++) {\n const configA = JSON.stringify(group[i]!.config ?? {})\n const configB = JSON.stringify(group[j]!.config ?? {})\n if (configA === configB) {\n // Add both aliases if not already in the list\n if (!duplicateConfigs.includes(group[i]!.alias)) {\n duplicateConfigs.push(group[i]!.alias)\n }\n if (!duplicateConfigs.includes(group[j]!.alias)) {\n duplicateConfigs.push(group[j]!.alias)\n }\n }\n }\n }\n\n if (duplicateConfigs.length > 0) {\n errors.push(\n ValidationErrors.warning(\n `Integration '${integrationName}' has aliases with identical configurations: ${duplicateConfigs.join(', ')}. Consider using different configs or removing duplicates.`,\n 'agent.config.ts'\n )\n )\n }\n }\n }\n\n return errors\n }\n}\n\n// Plugin alias validation constants\nconst PLUGIN_ALIAS_MIN_LENGTH = 2\nconst PLUGIN_ALIAS_MAX_LENGTH = 100\n\n// Regex for valid plugin alias: lowercase alphanumeric, no workspace prefix\n// Matches: \"hitl\", \"my-plugin\", \"some_plugin\"\nconst PLUGIN_ALIAS_REGEX = /^[a-z][a-z0-9_-]*$/\n\n/**\n * Validates a plugin alias (same rules as integrations, but no workspace prefix allowed)\n */\nfunction isPluginAliasValid(alias: string): boolean {\n return (\n alias.length >= PLUGIN_ALIAS_MIN_LENGTH && alias.length <= PLUGIN_ALIAS_MAX_LENGTH && PLUGIN_ALIAS_REGEX.test(alias)\n )\n}\n\n// Plugin reference schema: name@version only, no workspace prefix\nconst pluginRefSchema = z.string().transform((val, ctx) => {\n // Match pattern: name@version (no workspace prefix allowed)\n const match = val.match(/^([^/@]+)@(.+)$/)\n\n if (!match) {\n ctx.addIssue({\n code: 'custom',\n message: `Invalid plugin version format: ${val}. Expected format: 'name@version' (no workspace prefix)`,\n })\n return undefined as never\n }\n\n const [, name, version] = match\n\n return {\n name: name!,\n version: version!,\n fullName: name!,\n }\n})\n\nexport class PluginParser {\n /**\n * Parse a plugin version string into its components\n * Examples:\n * - \"hitl@1.3.0\" -> { name: 'hitl', version: '1.3.0', fullName: 'hitl' }\n * - \"myworkspace/hitl@1.0.0\" -> error (no workspace prefix)\n */\n static parsePluginRef(versionString: string): PluginRef {\n const result = pluginRefSchema.safeParse(versionString)\n if (!result.success) {\n throw new Error(result.error.errors[0]?.message || 'Invalid plugin version format')\n }\n return result.data\n }\n\n /**\n * Parse plugins from dependencies object\n */\n static parsePlugins(dependencies: Dependencies): {\n plugins: ParsedPlugin[]\n errors: ValidationError[]\n } {\n const plugins: ParsedPlugin[] = []\n const errors: ValidationError[] = []\n\n if (!dependencies.plugins) {\n return { plugins, errors }\n }\n\n for (const [alias, value] of Object.entries(dependencies.plugins)) {\n try {\n if (!isPluginAliasValid(alias)) {\n errors.push(ValidationErrors.invalidPluginAlias(alias))\n continue\n }\n\n const ref = this.parsePluginRef(value.version)\n\n const versionResult = versionSchema.safeParse(ref.version)\n if (!versionResult.success) {\n errors.push(ValidationErrors.invalidPluginVersionFormat(alias, ref.version))\n }\n\n plugins.push({\n alias,\n ref,\n config: value.config,\n dependencies: value.dependencies,\n })\n } catch (error) {\n errors.push(\n ValidationErrors.invalidDependenciesSyntax(\n `Invalid plugin '${alias}': ${error instanceof Error ? error.message : String(error)}`\n )\n )\n }\n }\n\n return { plugins, errors }\n }\n\n /**\n * Validate that plugin dependency integrationAlias values reference integrations\n * that are actually declared in dependencies.integrations\n */\n static validateDependencyReferences(dependencies: Dependencies): ValidationError[] {\n const errors: ValidationError[] = []\n\n if (!dependencies.plugins) {\n return errors\n }\n\n const integrationAliases = Object.keys(dependencies.integrations || {})\n\n for (const [alias, pluginConfig] of Object.entries(dependencies.plugins)) {\n if (!pluginConfig.dependencies) {\n continue\n }\n\n for (const [_depAlias, depMapping] of Object.entries(pluginConfig.dependencies)) {\n if (!integrationAliases.includes(depMapping.integrationAlias)) {\n errors.push(ValidationErrors.invalidPluginDependency(alias, depMapping.integrationAlias, integrationAliases))\n }\n }\n }\n\n return errors\n }\n\n /**\n * Check for duplicate plugin names (different aliases pointing to same plugin)\n */\n static checkDuplicates(plugins: ParsedPlugin[]): ValidationError[] {\n const errors: ValidationError[] = []\n const seen = new Map<string, ParsedPlugin[]>()\n\n for (const plugin of plugins) {\n const key = plugin.ref.fullName\n const group = seen.get(key) || []\n group.push(plugin)\n seen.set(key, group)\n }\n\n for (const [pluginName, group] of seen.entries()) {\n if (group.length > 1) {\n const duplicateConfigs: string[] = []\n for (let i = 0; i < group.length; i++) {\n for (let j = i + 1; j < group.length; j++) {\n const configA = JSON.stringify(group[i]!.config ?? {})\n const configB = JSON.stringify(group[j]!.config ?? {})\n if (configA === configB) {\n if (!duplicateConfigs.includes(group[i]!.alias)) {\n duplicateConfigs.push(group[i]!.alias)\n }\n if (!duplicateConfigs.includes(group[j]!.alias)) {\n duplicateConfigs.push(group[j]!.alias)\n }\n }\n }\n }\n\n if (duplicateConfigs.length > 0) {\n errors.push(\n ValidationErrors.warning(\n `Plugin '${pluginName}' has aliases with identical configurations: ${duplicateConfigs.join(', ')}. Consider using different configs or removing duplicates.`,\n 'agent.config.ts'\n )\n )\n }\n }\n }\n\n return errors\n }\n}\n",
|
|
39
|
+
"import fs from 'fs/promises'\nimport path from 'path'\nimport os from 'os'\nimport { IntegrationDefinition, CachedIntegration } from './types.js'\n\nexport class IntegrationCache {\n private cacheDir: string\n private integrationsDir: string\n\n constructor() {\n // Global cache in ~/.adk/cache\n this.cacheDir = path.join(os.homedir(), '.adk', 'cache')\n this.integrationsDir = path.join(this.cacheDir, 'integrations')\n }\n\n private async ensureCacheDir(): Promise<void> {\n await fs.mkdir(this.integrationsDir, { recursive: true })\n }\n\n private getCacheKey(integrationId: string, updatedAt: string): string {\n // Cache key format: integrationId@updatedAt\n // Remove any special characters that might cause filesystem issues\n const sanitizedId = integrationId.replace(/[^a-zA-Z0-9_-]/g, '_')\n const sanitizedDate = updatedAt.replace(/[^a-zA-Z0-9_-]/g, '_')\n return `${sanitizedId}@${sanitizedDate}.json`\n }\n\n async get(integrationId: string, updatedAt: string): Promise<IntegrationDefinition | null> {\n try {\n const cacheKey = this.getCacheKey(integrationId, updatedAt)\n const cachePath = path.join(this.integrationsDir, cacheKey)\n\n const data = await fs.readFile(cachePath, 'utf-8')\n const cached: CachedIntegration = JSON.parse(data)\n\n // Check if cache is expired\n if (cached.expiresAt) {\n const expiryDate = new Date(cached.expiresAt)\n if (expiryDate < new Date()) {\n // Cache expired, remove it\n await this.remove(integrationId, updatedAt)\n return null\n }\n }\n\n return cached.definition\n } catch {\n // Cache miss or error\n return null\n }\n }\n\n async set(\n integrationId: string,\n updatedAt: string,\n definition: IntegrationDefinition,\n ttlHours: number = 24 * 7 // Default 1 week\n ): Promise<void> {\n await this.ensureCacheDir()\n\n const cacheKey = this.getCacheKey(integrationId, updatedAt)\n const cachePath = path.join(this.integrationsDir, cacheKey)\n\n const expiresAt = new Date()\n expiresAt.setHours(expiresAt.getHours() + ttlHours)\n\n const cacheEntry: CachedIntegration = {\n definition,\n cachedAt: new Date().toISOString(),\n expiresAt: expiresAt.toISOString(),\n }\n\n await fs.writeFile(cachePath, JSON.stringify(cacheEntry, null, 2))\n }\n\n async remove(integrationId: string, updatedAt: string): Promise<void> {\n try {\n const cacheKey = this.getCacheKey(integrationId, updatedAt)\n const cachePath = path.join(this.integrationsDir, cacheKey)\n await fs.unlink(cachePath)\n } catch {\n // Ignore errors if file doesn't exist\n }\n }\n\n async clear(): Promise<void> {\n try {\n const files = await fs.readdir(this.integrationsDir)\n await Promise.all(files.map((file) => fs.unlink(path.join(this.integrationsDir, file))))\n } catch {\n // Ignore errors if directory doesn't exist\n }\n }\n\n async getStats(): Promise<{ count: number; sizeBytes: number }> {\n try {\n const files = await fs.readdir(this.integrationsDir)\n let totalSize = 0\n\n for (const file of files) {\n const stats = await fs.stat(path.join(this.integrationsDir, file))\n totalSize += stats.size\n }\n\n return {\n count: files.length,\n sizeBytes: totalSize,\n }\n } catch {\n return { count: 0, sizeBytes: 0 }\n }\n }\n}\n",
|
|
40
|
+
"import { Client } from '@botpress/client'\nimport * as process from 'process'\nimport { auth } from '../auth/index.js'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { IntegrationManager } from './manager.js'\nimport { IntegrationRef, IntegrationDefinition } from './types.js'\nimport { HubCache } from './hub-cache.js'\nimport { ConfigWriter } from '../agent-project/config-writer.js'\n\nexport interface IntegrationVersionInfo {\n name: string\n version: string\n latestVersion?: string\n availableVersions?: string[]\n}\n\nexport interface AddIntegrationOptions {\n name: string\n version?: string\n alias?: string\n}\n\nexport interface AddIntegrationResult {\n success: boolean\n message?: string\n existingVersion?: string\n newVersion?: string\n name?: string\n fullName?: string\n alias?: string\n version?: string\n ref?: string\n}\n\ninterface ResolvedAddIntegrationInput {\n name: string\n fullName: string\n version: string\n alias: string\n ref: string\n isIntegrationId: boolean\n}\n\nexport interface UpgradeIntegrationOptions {\n name?: string\n interactive?: boolean\n}\n\nexport interface RemoveIntegrationOptions {\n name?: string\n interactive?: boolean\n}\n\nexport class IntegrationOperations {\n private hubCache: HubCache\n private client?: Client\n private projectPath?: string\n\n constructor(options: { noCache?: boolean; projectPath?: string } = {}) {\n this.hubCache = new HubCache()\n this.projectPath = options.projectPath\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n\n let workspaceId = credentials.workspaceId\n\n try {\n // If projectPath is provided, try to get workspaceId from there\n if (this.projectPath) {\n const project = await AgentProject.load(this.projectPath)\n if (project.agentInfo?.workspaceId) {\n workspaceId = project.agentInfo.workspaceId\n }\n }\n } catch {\n // Ignore errors and fallback to credentials\n }\n\n if (!workspaceId) {\n throw new Error('No workspace ID found in current profile. Please login again with \"adk login\"')\n }\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId: workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n /**\n * Parse integration reference from string (e.g., \"slack@latest\", \"slack@1.0.0\")\n */\n private parseIntegrationRef(input: string): IntegrationRef {\n const parts = input.split('@')\n const name = parts[0] || ''\n const version = parts[1] || 'latest'\n\n if (!name) {\n throw new Error('Invalid integration reference: missing name')\n }\n\n // Check if it's a workspace integration (contains /)\n const workspaceParts = name.split('/')\n if (workspaceParts.length === 2 && workspaceParts[0] && workspaceParts[1]) {\n return {\n fullName: name,\n workspace: workspaceParts[0],\n name: workspaceParts[1],\n version,\n }\n }\n\n return { name, version, fullName: name }\n }\n\n private isIntegrationVersionId(input: string): boolean {\n return input.startsWith('intver_')\n }\n\n private isResourceNotFoundError(error: unknown): boolean {\n return Boolean(error && typeof error === 'object' && 'type' in error && error.type === 'ResourceNotFound')\n }\n\n private getCanonicalIntegrationFullName(integration: IntegrationDefinition): string {\n if (integration.public) {\n return integration.name\n }\n\n const workspaceHandle = (integration as { ownerWorkspace?: { handle?: string | null } }).ownerWorkspace?.handle\n return workspaceHandle ? `${workspaceHandle}/${integration.name}` : integration.name\n }\n\n private async resolveIntegrationVersionId(id: string): Promise<IntegrationDefinition> {\n const client = await this.getClient()\n\n try {\n const response = await client.getIntegration({ id })\n return response.integration\n } catch (error) {\n if (!this.isResourceNotFoundError(error)) {\n throw error\n }\n }\n\n try {\n const response = await client.getPublicIntegrationById({ id })\n return response.integration\n } catch (error) {\n if (this.isResourceNotFoundError(error)) {\n throw new Error(`Integration \"${id}\" not found`)\n }\n\n throw error\n }\n }\n\n async resolveAddIntegrationInput(options: AddIntegrationOptions): Promise<ResolvedAddIntegrationInput> {\n const requestedVersion = options.version || 'latest'\n\n if (!this.isIntegrationVersionId(options.name)) {\n const ref = this.parseIntegrationRef(`${options.name}@${requestedVersion}`)\n\n return {\n name: ref.name,\n fullName: ref.fullName,\n version: ref.version,\n alias: options.alias || ref.name,\n ref: `${ref.fullName}@${ref.version}`,\n isIntegrationId: false,\n }\n }\n\n if (options.version && options.version !== 'latest') {\n throw new Error(\n 'Integration version IDs are already version-pinned and do not accept an additional @version override'\n )\n }\n\n const integration = await this.resolveIntegrationVersionId(options.name)\n const fullName = this.getCanonicalIntegrationFullName(integration)\n\n return {\n name: integration.name,\n fullName,\n version: integration.version,\n alias: options.alias || integration.name,\n ref: `${fullName}@${integration.version}`,\n isIntegrationId: true,\n }\n }\n\n /**\n * Get available versions for an integration\n */\n async getIntegrationVersions(name: string): Promise<IntegrationVersionInfo> {\n const client = await this.getClient()\n const ref = this.parseIntegrationRef(name)\n\n try {\n // Try to get private/workspace integration first\n const latestResponse = await client.getIntegrationByName({\n name: ref.fullName,\n version: 'latest',\n })\n\n return {\n name: ref.fullName,\n version: latestResponse.integration.version,\n latestVersion: latestResponse.integration.version,\n availableVersions: [latestResponse.integration.version],\n }\n } catch {\n // Try public integration\n try {\n const latestResponse = await client.getPublicIntegration({\n name: ref.name,\n version: 'latest',\n })\n\n return {\n name: ref.fullName,\n version: latestResponse.integration.version,\n latestVersion: latestResponse.integration.version,\n availableVersions: [latestResponse.integration.version],\n }\n } catch {\n throw new Error(`Integration \"${ref.fullName}\" not found`)\n }\n }\n }\n\n /**\n * Add an integration to agent.config.ts dependencies\n */\n async addIntegration(options: AddIntegrationOptions): Promise<AddIntegrationResult> {\n const project = await AgentProject.load(this.projectPath || process.cwd())\n const resolvedInput = await this.resolveAddIntegrationInput(options)\n const { alias } = resolvedInput\n\n // Load current dependencies from project\n const dependencies = project.dependencies || { integrations: {} }\n\n if (!dependencies.integrations) {\n dependencies.integrations = {}\n }\n\n // Check if integration already exists\n const existingIntegration = dependencies.integrations[alias]\n if (existingIntegration) {\n let existingVersion: string\n if (typeof existingIntegration === 'string') {\n const existingRef = this.parseIntegrationRef(existingIntegration)\n existingVersion = existingRef.version\n } else if (typeof existingIntegration === 'object' && existingIntegration.version) {\n const existingRef = this.parseIntegrationRef(existingIntegration.version)\n existingVersion = existingRef.version\n } else {\n existingVersion = 'unknown'\n }\n\n // For integration IDs, the resolved version is already pinned and should be\n // treated like an explicitly supplied version.\n const effectiveVersionSpecified = Boolean(options.version) || resolvedInput.isIntegrationId\n\n // If version is not specified or same as existing, do nothing\n if (\n !effectiveVersionSpecified ||\n resolvedInput.version === 'latest' ||\n resolvedInput.version === existingVersion\n ) {\n return {\n success: false,\n message: `Integration '${alias}' already exists with version ${existingVersion}. Use 'adk upgrade ${alias}' to upgrade to the latest version.`,\n existingVersion,\n name: resolvedInput.name,\n fullName: resolvedInput.fullName,\n alias: resolvedInput.alias,\n version: existingVersion,\n ref: `${resolvedInput.fullName}@${existingVersion}`,\n }\n }\n }\n\n // Verify integration exists and get its definition\n let integrationDefinition: IntegrationDefinition\n try {\n const tempManager = new IntegrationManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const loadResult = await tempManager.loadIntegrations({\n integrations: {\n [alias]: {\n version: resolvedInput.ref,\n enabled: true,\n },\n },\n })\n\n if (loadResult.errors.length > 0) {\n const firstError = loadResult.errors[0]\n throw new Error(firstError?.message || 'Unknown error')\n }\n\n // Get the integration definition\n const loadedIntegration = loadResult.integrations[0]\n if (!loadedIntegration?.definition) {\n throw new Error('Failed to load integration definition')\n }\n integrationDefinition = loadedIntegration.definition\n } catch (error) {\n throw new Error(`Failed to add integration: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n // Get the actual version from the loaded integration definition\n const actualVersion = integrationDefinition.version\n const integrationVersion = `${resolvedInput.fullName}@${actualVersion}`\n\n const existingEntry = dependencies.integrations[alias]\n\n if (existingEntry && typeof existingEntry === 'object' && 'version' in existingEntry) {\n // Preserve existing object format, update version only\n dependencies.integrations[alias] = {\n ...existingEntry,\n version: integrationVersion,\n }\n } else {\n // String shorthand (disabled by default via parser)\n dependencies.integrations[alias] = integrationVersion\n }\n\n // Write back to agent.config.ts using ConfigWriter\n const configWriter = new ConfigWriter(project.path)\n await configWriter.updateDependencies(dependencies)\n\n return {\n success: true,\n newVersion: actualVersion,\n name: resolvedInput.name,\n fullName: resolvedInput.fullName,\n alias: resolvedInput.alias,\n version: actualVersion,\n ref: integrationVersion,\n }\n }\n\n /**\n * Remove an integration from agent.config.ts dependencies\n */\n async removeIntegration(name: string): Promise<void> {\n const project = await AgentProject.load(this.projectPath || process.cwd())\n\n // Load current dependencies from project\n const dependencies = project.dependencies\n\n if (!dependencies || !dependencies.integrations || !dependencies.integrations[name]) {\n throw new Error(`Integration \"${name}\" not found in dependencies`)\n }\n\n // Remove integration\n delete dependencies.integrations[name]\n\n // Write back to agent.config.ts using ConfigWriter\n const configWriter = new ConfigWriter(project.path)\n await configWriter.updateDependencies(dependencies)\n }\n\n /**\n * Upgrade integration(s) to latest version\n */\n async upgradeIntegration(name?: string): Promise<{ upgraded: string[]; failed: string[] }> {\n const project = await AgentProject.load(this.projectPath || process.cwd())\n\n // Load current dependencies from project\n const dependencies = project.dependencies\n\n if (!dependencies || !dependencies.integrations) {\n throw new Error('No integrations found in dependencies')\n }\n\n const upgraded: string[] = []\n const failed: string[] = []\n\n // Get integrations to upgrade\n const integrationsToUpgrade = name ? { [name]: dependencies.integrations[name] } : dependencies.integrations\n\n if (name && !integrationsToUpgrade[name]) {\n throw new Error(`Integration \"${name}\" not found in dependencies`)\n }\n\n // Upgrade each integration\n for (const [alias, value] of Object.entries(integrationsToUpgrade)) {\n try {\n let ref: IntegrationRef\n let currentVersion: string\n\n if (typeof value === 'string') {\n ref = this.parseIntegrationRef(value)\n currentVersion = ref.version\n } else if (typeof value === 'object' && value.version) {\n ref = this.parseIntegrationRef(value.version)\n currentVersion = ref.version\n } else {\n failed.push(alias)\n continue\n }\n\n // Get latest version (using fullName to preserve workspace prefix)\n const versionInfo = await this.getIntegrationVersions(ref.fullName)\n\n if (versionInfo.latestVersion && versionInfo.latestVersion !== currentVersion) {\n // Update to latest, preserving the format (string or object)\n // Use ref.fullName to preserve workspace prefix (e.g., \"sly/intercom\")\n const newVersion = `${ref.fullName}@${versionInfo.latestVersion}`\n dependencies.integrations[alias] = typeof value === 'string' ? newVersion : { ...value, version: newVersion }\n upgraded.push(`${alias} (${currentVersion} → ${versionInfo.latestVersion})`)\n }\n } catch {\n failed.push(alias)\n }\n }\n\n // Write back if any upgrades\n if (upgraded.length > 0) {\n const configWriter = new ConfigWriter(project.path)\n await configWriter.updateDependencies(dependencies)\n }\n\n return { upgraded, failed }\n }\n\n /**\n * Get list of current integrations\n */\n async listIntegrations(): Promise<Array<{ alias: string; name: string; version: string }>> {\n const project = await AgentProject.load(this.projectPath || process.cwd())\n\n // Read dependencies from project\n const dependencies = project.dependencies\n\n if (!dependencies || !dependencies.integrations) {\n return []\n }\n\n const integrations: Array<{\n alias: string\n name: string\n version: string\n }> = []\n\n for (const [alias, value] of Object.entries(dependencies.integrations)) {\n if (typeof value === 'string') {\n const ref = this.parseIntegrationRef(value)\n // Use fullName to preserve workspace prefix (e.g., \"sly/intercom\")\n integrations.push({ alias, name: ref.fullName, version: ref.version })\n } else if (typeof value === 'object' && value.version) {\n const ref = this.parseIntegrationRef(value.version)\n // Use fullName to preserve workspace prefix (e.g., \"sly/intercom\")\n integrations.push({ alias, name: ref.fullName, version: ref.version })\n }\n }\n\n return integrations\n }\n\n /**\n * Search for integrations in the hub cache\n */\n async searchIntegrations(query: string): Promise<\n Array<{\n name: string\n version: string\n title?: string\n description?: string\n }>\n > {\n const results = await this.hubCache.searchIntegrations(query)\n\n // Group by name and get latest version for each\n const latestByName = new Map<string, (typeof results)[0]>()\n for (const integration of results) {\n const existing = latestByName.get(integration.name)\n if (\n !existing ||\n integration.version.localeCompare(existing.version, undefined, {\n numeric: true,\n }) > 0\n ) {\n latestByName.set(integration.name, integration)\n }\n }\n\n return Array.from(latestByName.values()).map((i) => ({\n name: i.name,\n version: i.version,\n title: i.title,\n description: i.description,\n }))\n }\n\n /**\n * Get all available integrations from hub\n */\n async getAllAvailableIntegrations(): Promise<Array<{ name: string; version: string; title?: string }>> {\n const all = await this.hubCache.getAllIntegrations()\n\n // Group by name and get latest version for each\n const latestByName = new Map<string, (typeof all)[0]>()\n for (const integration of all) {\n const existing = latestByName.get(integration.name)\n if (\n !existing ||\n integration.version.localeCompare(existing.version, undefined, {\n numeric: true,\n }) > 0\n ) {\n latestByName.set(integration.name, integration)\n }\n }\n\n return Array.from(latestByName.values()).map((i) => ({\n name: i.name,\n version: i.version,\n title: i.title,\n }))\n }\n}\n",
|
|
41
41
|
"import { Client } from '@botpress/client'\nimport * as fs from 'fs/promises'\nimport * as path from 'path'\nimport * as os from 'os'\nimport { auth } from '../auth/index.js'\n\nexport interface HubCacheEntry {\n id: string\n name: string\n version: string\n updatedAt: string\n createdAt: string\n title?: string\n description?: string\n iconUrl?: string\n public: boolean\n visibility: 'public' | 'private' | 'unlisted'\n ownerWorkspace?: {\n id: string\n name: string\n }\n verificationStatus?: 'unapproved' | 'approved' | 'pending' | 'rejected'\n}\n\nexport interface HubCacheData {\n lastUpdated: string\n integrations: HubCacheEntry[]\n}\n\nexport class HubCache {\n private static readonly CACHE_FILE = 'botpress-hub-cache.json'\n private static readonly CACHE_DIR = path.join(os.homedir(), '.adk', 'cache')\n private static readonly CACHE_PATH = path.join(HubCache.CACHE_DIR, HubCache.CACHE_FILE)\n private static readonly CACHE_DURATION = 30 * 60 * 1000 // 30 minutes in milliseconds\n\n private client?: Client\n\n constructor() {}\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n\n if (!credentials.workspaceId) {\n throw new Error('No workspace ID found in current profile. Please login again with \"adk login\"')\n }\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId: credentials.workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n /**\n * Ensure cache directory exists\n */\n private async ensureCacheDir(): Promise<void> {\n try {\n await fs.mkdir(HubCache.CACHE_DIR, { recursive: true })\n } catch {\n // Directory might already exist, that's fine\n }\n }\n\n /**\n * Load cache from disk\n */\n private async loadCache(): Promise<HubCacheData | null> {\n try {\n const data = await fs.readFile(HubCache.CACHE_PATH, 'utf-8')\n return JSON.parse(data) as HubCacheData\n } catch {\n return null\n }\n }\n\n /**\n * Save cache to disk\n */\n private async saveCache(data: HubCacheData): Promise<void> {\n await this.ensureCacheDir()\n await fs.writeFile(HubCache.CACHE_PATH, JSON.stringify(data, null, 2))\n }\n\n /**\n * Check if cache needs refresh\n */\n private async needsRefresh(): Promise<boolean> {\n const cache = await this.loadCache()\n if (!cache) return true\n\n const lastUpdated = new Date(cache.lastUpdated)\n const now = new Date()\n const diff = now.getTime() - lastUpdated.getTime()\n\n return diff > HubCache.CACHE_DURATION\n }\n\n /**\n * Refresh the hub cache\n */\n async refresh(force: boolean = false): Promise<void> {\n // Check if refresh is needed\n if (!force && !(await this.needsRefresh())) {\n return\n }\n\n const client = await this.getClient()\n const cache = await this.loadCache()\n const latestByName = new Map<string, HubCacheEntry>()\n\n // Load existing cache into map (keyed by name for latest version tracking)\n if (cache) {\n for (const entry of cache.integrations) {\n latestByName.set(entry.name, entry)\n }\n }\n\n try {\n // Fetch integrations sorted by updatedAt descending\n for await (const integration of client.list.publicIntegrations({\n sortBy: 'updatedAt',\n direction: 'desc',\n })) {\n // Check if we have a newer version of this integration\n const existing = latestByName.get(integration.name)\n\n // If we've reached an integration with the same id and updatedAt we already have, stop\n if (existing && integration.id === existing.id && integration.updatedAt === existing.updatedAt) {\n break\n }\n\n if (\n !existing ||\n integration.version.localeCompare(existing.version, undefined, {\n numeric: true,\n }) > 0\n ) {\n // Add or update to latest version\n latestByName.set(integration.name, {\n id: integration.id,\n name: integration.name,\n version: integration.version,\n updatedAt: integration.updatedAt,\n createdAt: integration.createdAt,\n title: integration.title,\n description: integration.description,\n iconUrl: integration.iconUrl,\n public: integration.public,\n visibility: integration.visibility,\n ownerWorkspace: integration.ownerWorkspace\n ? {\n id: integration.ownerWorkspace.id,\n name: integration.ownerWorkspace.name,\n }\n : undefined,\n verificationStatus: integration.verificationStatus,\n })\n }\n }\n\n // Convert map back to array, sorted by updatedAt descending\n const integrations = Array.from(latestByName.values()).sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n\n // If we fetched all integrations (didn't break early), we have a complete list\n // Otherwise, merge with existing cache as done above\n\n // Save the updated cache\n const newCache: HubCacheData = {\n lastUpdated: new Date().toISOString(),\n integrations,\n }\n\n await this.saveCache(newCache)\n } catch (error) {\n throw new Error(`Failed to refresh hub cache: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n\n /**\n * Get all integrations from cache\n */\n async getAllIntegrations(): Promise<HubCacheEntry[]> {\n // Ensure cache is fresh\n await this.refresh()\n\n const cache = await this.loadCache()\n return cache?.integrations || []\n }\n\n /**\n * Search integrations by name\n */\n async searchIntegrations(query: string): Promise<HubCacheEntry[]> {\n const integrations = await this.getAllIntegrations()\n const lowerQuery = query.toLowerCase()\n\n return integrations.filter(\n (integration) =>\n integration.name.toLowerCase().includes(lowerQuery) ||\n integration.title?.toLowerCase().includes(lowerQuery) ||\n integration.description?.toLowerCase().includes(lowerQuery)\n )\n }\n\n /**\n * Get integration by name (latest version)\n */\n async getIntegrationByName(name: string): Promise<HubCacheEntry | null> {\n const integrations = await this.getAllIntegrations()\n\n // Since we only keep latest versions, just find by name\n return integrations.find((i) => i.name === name) || null\n }\n\n /**\n * Get all versions of an integration\n * Note: Since we only cache latest versions, this returns only the latest\n */\n async getIntegrationVersions(name: string): Promise<string[]> {\n const integration = await this.getIntegrationByName(name)\n return integration ? [integration.version] : []\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<{\n lastUpdated: Date | null\n integrationCount: number\n cacheSize: number\n }> {\n const cache = await this.loadCache()\n\n try {\n const stats = await fs.stat(HubCache.CACHE_PATH)\n return {\n lastUpdated: cache ? new Date(cache.lastUpdated) : null,\n integrationCount: cache?.integrations.length || 0,\n cacheSize: stats.size,\n }\n } catch {\n return {\n lastUpdated: null,\n integrationCount: 0,\n cacheSize: 0,\n }\n }\n }\n\n /**\n * Clear the cache\n */\n async clear(): Promise<void> {\n try {\n await fs.unlink(HubCache.CACHE_PATH)\n } catch {\n // File might not exist, that's fine\n }\n }\n}\n",
|
|
42
|
-
"import { Project, SyntaxKind, PropertyAssignment, SourceFile, ObjectLiteralExpression } from 'ts-morph'\nimport * as path from 'path'\nimport type { Dependencies } from './types'\nimport { formatCode } from '../generators/utils'\n\nexport interface ConfigSchemaFieldUpdate {\n action: 'add' | 'update' | 'remove'\n field: string\n /** Raw TS expression for the field type, e.g. \"z.string().default('sk-...')\" */\n definition?: string\n}\n\n/**\n * ConfigWriter handles writing updates to agent.config.ts\n *\n * Note: For reading dependencies, use AgentProject.dependencies instead.\n * This class is only for surgical updates to specific fields.\n */\nexport class ConfigWriter {\n private configPath: string\n\n constructor(projectPath: string) {\n this.configPath = path.join(projectPath, 'agent.config.ts')\n }\n\n private loadConfig(): { sourceFile: SourceFile; configObject: ObjectLiteralExpression } {\n const project = new Project()\n const sourceFile = project.addSourceFileAtPath(this.configPath)\n\n const defineConfigCall = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression).find((call) => {\n return call.getExpression().getText() === 'defineConfig'\n })\n\n if (!defineConfigCall) {\n throw new Error('Could not find defineConfig() call in agent.config.ts')\n }\n\n const configArg = defineConfigCall.getArguments()[0]\n if (!configArg || !configArg.isKind(SyntaxKind.ObjectLiteralExpression)) {\n throw new Error('defineConfig() must have an object literal as its first argument')\n }\n\n return { sourceFile, configObject: configArg as ObjectLiteralExpression }\n }\n\n private async saveConfig(sourceFile: SourceFile): Promise<void> {\n sourceFile.formatText()\n const content = sourceFile.getFullText()\n const formatted = await formatCode(content, this.configPath)\n sourceFile.replaceWithText(formatted)\n await sourceFile.save()\n }\n\n /**\n * Updates the dependencies field in agent.config.ts\n * Uses ts-morph to surgically update only the dependencies property\n * while preserving all other config fields (name, models, state, etc.)\n */\n async updateDependencies(dependencies: Dependencies): Promise<void> {\n const { sourceFile, configObject } = this.loadConfig()\n\n // Find or create the dependencies property\n let dependenciesProperty = configObject.getProperty('dependencies') as PropertyAssignment | undefined\n\n if (dependenciesProperty) {\n // Update existing property\n dependenciesProperty.setInitializer(JSON.stringify(dependencies))\n } else {\n // Add new property at the end\n dependenciesProperty = configObject.addPropertyAssignment({\n name: 'dependencies',\n initializer: JSON.stringify(dependencies),\n })\n }\n\n await this.saveConfig(sourceFile)\n }\n\n /**\n * Updates the name field in agent.config.ts\n */\n async updateName(name: string): Promise<void> {\n const { sourceFile, configObject } = this.loadConfig()\n\n const nameProperty = configObject.getProperty('name') as PropertyAssignment | undefined\n if (nameProperty) {\n nameProperty.setInitializer(`'${name.replace(/'/g, \"\\\\'\")}'`)\n }\n\n await this.saveConfig(sourceFile)\n }\n\n /**\n * Adds, updates, or removes fields inside configuration.schema (the z.object({...}))\n */\n async updateConfiguration(updates: ConfigSchemaFieldUpdate[]): Promise<void> {\n const { sourceFile, configObject } = this.loadConfig()\n\n const hasAdds = updates.some((u) => u.action === 'add')\n\n // Find or create configuration property\n let configProp = configObject.getProperty('configuration') as PropertyAssignment | undefined\n if (!configProp) {\n if (!hasAdds) return\n configProp = configObject.addPropertyAssignment({\n name: 'configuration',\n initializer: '{ schema: z.object({}) }',\n })\n }\n\n const configInit = configProp.getInitializerIfKind(SyntaxKind.ObjectLiteralExpression)\n if (!configInit) return\n\n // Find or create schema property\n let schemaProp = configInit.getProperty('schema') as PropertyAssignment | undefined\n if (!schemaProp) {\n if (!hasAdds) return\n schemaProp = configInit.addPropertyAssignment({\n name: 'schema',\n initializer: 'z.object({})',\n })\n }\n\n const schemaCall = schemaProp.getInitializerIfKind(SyntaxKind.CallExpression)\n if (!schemaCall) return\n\n const schemaArg = schemaCall.getArguments()[0]\n if (!schemaArg || !schemaArg.isKind(SyntaxKind.ObjectLiteralExpression)) return\n\n const schemaObject = schemaArg as ObjectLiteralExpression\n\n for (const update of updates) {\n const existing = schemaObject.getProperty(update.field) as PropertyAssignment | undefined\n\n switch (update.action) {\n case 'add':\n if (!existing && update.definition) {\n schemaObject.addPropertyAssignment({\n name: update.field,\n initializer: update.definition,\n })\n }\n break\n case 'update':\n if (existing && update.definition) {\n existing.setInitializer(update.definition)\n }\n break\n case 'remove':\n if (existing) {\n existing.remove()\n }\n break\n }\n }\n\n await this.saveConfig(sourceFile)\n }\n}\n",
|
|
43
|
-
"import { Client, type Integration, type Bot } from '@botpress/client'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { auth } from '../auth/index.js'\nimport { configsMatch } from './config-utils.js'\nimport { IntegrationManager } from './manager.js'\nimport type { ParsedIntegration } from './types.js'\n\nexport type IntegrationInstallStatus = 'enabled' | 'not_installed' | 'disabled'\nexport type IntegrationRegistrationStatus =\n | 'registered'\n | 'registration_pending'\n | 'registration_failed'\n | 'unregistration_pending'\n | 'unregistered'\n | 'unregistration_failed'\n\nexport interface IntegrationCheckResult {\n alias: string\n name: string\n\n // Current state (from bot)\n installStatus: IntegrationInstallStatus\n registrationStatus?: IntegrationRegistrationStatus\n installedVersion?: string\n currentConfigurationType?: string | null\n currentConfiguration?: Record<string, any>\n\n // Desired state (from agent.config.ts dependencies)\n desiredInstallStatus: IntegrationInstallStatus\n desiredVersion: string\n desiredIntegrationId?: string // The integration ID for the desired version\n desiredConfigurationType?: string | null\n desiredConfiguration?: Record<string, any>\n\n // Integration definition\n definition: Integration\n\n // Flags for easy checking\n needsInstall: boolean\n needsUpdate: boolean\n needsRemoval: boolean\n needsConfiguration: boolean\n hasError: boolean\n errorMessage?: string\n}\n\nexport class IntegrationChecker {\n private projectPath: string\n private client?: Client\n\n constructor(projectPath: string) {\n this.projectPath = projectPath\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n const project = await AgentProject.load(this.projectPath)\n\n const workspaceId = project.agentInfo?.workspaceId || credentials.workspaceId\n\n if (!workspaceId) {\n throw new Error('No workspace ID found. Please login with \"adk login\"')\n }\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n /**\n * Fetch integration definition from Botpress API\n * Try private first, then public\n */\n private async fetchIntegrationDefinition(name: string, version: string): Promise<Integration> {\n const client = await this.getClient()\n\n // Try both private and public in parallel, prefer private\n const [privateResult, publicResult] = await Promise.allSettled([\n client.getIntegrationByName({ name, version }).then(({ integration }) => integration as Integration),\n client.getPublicIntegration({ name, version }).then(({ integration }) => integration as Integration),\n ])\n\n // Prefer private integration\n if (privateResult.status === 'fulfilled') {\n return privateResult.value\n }\n\n if (publicResult.status === 'fulfilled') {\n return publicResult.value\n }\n\n // Both failed\n throw new Error(\n `Failed to fetch integration ${name}@${version}: ${\n privateResult.status === 'rejected' ? privateResult.reason : 'Unknown error'\n }`\n )\n }\n\n /**\n * Check integration status for a specific bot\n */\n async checkIntegrations(botId: string): Promise<IntegrationCheckResult[]> {\n const client = await this.getClient()\n const project = await AgentProject.load(this.projectPath)\n\n // Load desired state from agent.config.ts dependencies\n const integrationManager = new IntegrationManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const loadResult = await integrationManager.loadIntegrations(project.dependencies || { integrations: {} })\n\n if (loadResult.errors.length > 0) {\n throw new Error(`Failed to load integrations: ${loadResult.errors.map((e) => e.message).join(', ')}`)\n }\n\n // Get current bot state\n let bot: Bot\n try {\n const response = await client.getBot({ id: botId })\n bot = response.bot\n } catch (error) {\n throw new Error(`Failed to get bot: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n const results: IntegrationCheckResult[] = []\n const installedIntegrations = bot.integrations || {}\n\n // Track which installed integrations we've processed\n const processedIntegrationIds = new Set<string>()\n\n // Process each integration from agent.config.ts dependencies\n for (const parsedIntegration of loadResult.integrations) {\n const result = await this.checkIntegration(parsedIntegration, installedIntegrations, processedIntegrationIds)\n results.push(result)\n }\n\n // Check for extra integrations that are installed but not in dependencies\n for (const [key, installedIntegration] of Object.entries(installedIntegrations)) {\n if (!processedIntegrationIds.has(installedIntegration.id)) {\n // This integration is installed but not in dependencies - should be removed\n // We need to fetch the full integration definition\n try {\n const integrationDef = await this.fetchIntegrationDefinition(\n installedIntegration.name,\n installedIntegration.version\n )\n\n results.push({\n alias: key,\n name: installedIntegration.name,\n installStatus: installedIntegration.enabled ? 'enabled' : 'disabled',\n registrationStatus: installedIntegration.status,\n installedVersion: installedIntegration.version,\n currentConfigurationType: installedIntegration.configurationType,\n currentConfiguration: installedIntegration.configuration,\n desiredInstallStatus: 'not_installed',\n desiredVersion: installedIntegration.version,\n definition: integrationDef,\n needsInstall: false,\n needsUpdate: false,\n needsRemoval: true,\n needsConfiguration: false,\n hasError: false,\n })\n } catch {\n // If we can't fetch the definition, skip this integration\n continue\n }\n }\n }\n\n return results\n }\n\n private async checkIntegration(\n parsedIntegration: ParsedIntegration,\n installedIntegrations: Record<string, any>,\n processedIntegrationIds: Set<string>\n ): Promise<IntegrationCheckResult> {\n const { alias, ref, enabled, configurationType, config, definition } = parsedIntegration\n\n if (!definition) {\n throw new Error(`Integration definition not found for ${alias}`)\n }\n\n // Find matching installed integration by alias first, then by name for backwards compatibility\n let installedIntegration: any = null\n\n // First, try to match by alias (exact key match) - this is the correct way for multi-integration setups\n if (installedIntegrations[alias]) {\n installedIntegration = installedIntegrations[alias]\n processedIntegrationIds.add(installedIntegration.id)\n } else {\n // Fallback: match by name for backwards compatibility with single-integration setups\n // where the key might be the integration name instead of an alias\n for (const [_key, installed] of Object.entries(installedIntegrations)) {\n // Compare by name, handling both workspace-scoped and public integrations\n // installed.name from API might be \"intercom\" while ref.fullName is \"sly/intercom\"\n // So we need to check both the full name and just the base name\n const matches =\n installed.name === ref.fullName || // Exact match (e.g., \"sly/intercom\" === \"sly/intercom\")\n installed.name === ref.name // Base name match (e.g., \"intercom\" === \"intercom\")\n\n if (matches) {\n installedIntegration = installed\n processedIntegrationIds.add(installed.id)\n break\n }\n }\n }\n\n // Determine desired install status\n const desiredInstallStatus: IntegrationInstallStatus = enabled === false ? 'disabled' : 'enabled'\n\n // Build result\n const result: IntegrationCheckResult = {\n alias,\n name: ref.fullName,\n installStatus: installedIntegration ? (installedIntegration.enabled ? 'enabled' : 'disabled') : 'not_installed',\n desiredInstallStatus,\n installedVersion: installedIntegration?.version,\n desiredVersion: ref.version,\n desiredIntegrationId: definition.id, // The integration ID for the desired version\n currentConfigurationType: installedIntegration?.configurationType,\n currentConfiguration: installedIntegration?.configuration,\n desiredConfigurationType: configurationType ?? null,\n desiredConfiguration: config,\n definition,\n needsInstall: false,\n needsUpdate: false,\n needsRemoval: false,\n needsConfiguration: false,\n hasError: false,\n }\n\n // Set registration status if installed\n if (installedIntegration) {\n result.registrationStatus = installedIntegration.status\n\n // Check for registration errors\n if (installedIntegration.status === 'registration_failed' && installedIntegration.statusReason) {\n result.hasError = true\n result.errorMessage = installedIntegration.statusReason\n }\n }\n\n // Determine what needs to be done\n if (!installedIntegration) {\n result.needsInstall = enabled !== false\n if (result.needsInstall && config) {\n result.needsConfiguration = true\n }\n } else {\n // Already installed - check if update needed\n if (installedIntegration.version !== ref.version) {\n result.needsUpdate = true\n }\n\n // Check if configuration type changed (only if explicitly specified in dependencies)\n if (configurationType !== undefined && configurationType !== installedIntegration.configurationType) {\n result.needsConfiguration = true\n }\n\n // Check if configuration changed (only if explicitly specified in dependencies).\n // Only compare keys defined in local config — server-only keys (e.g. dashboard-set\n // secrets) are intentionally preserved and should not trigger drift detection.\n if (config !== undefined) {\n const configType = configurationType ?? installedIntegration.configurationType\n const schema =\n (configType && definition.configurations?.[configType]?.schema) ||\n definition.configurations?.['default']?.schema ||\n definition.configuration?.schema\n const schemaDefaults = Object.fromEntries(\n Object.entries(schema?.properties || {}).flatMap(([k, v]: [string, any]) =>\n v?.default !== undefined ? [[k, v.default]] : []\n )\n )\n\n if (!configsMatch(installedIntegration.configuration, config, schemaDefaults)) {\n result.needsConfiguration = true\n }\n }\n\n if (enabled !== undefined && enabled !== installedIntegration.enabled) {\n if (enabled === false) {\n result.needsRemoval = true\n } else if (enabled === true && result.installStatus === 'disabled') {\n result.needsConfiguration = true\n }\n }\n }\n\n return result\n }\n}\n",
|
|
44
|
-
"import { Client } from '@botpress/client'\nimport { auth } from '../auth/index.js'\nimport type { AgentProject } from '../agent-project/agent-project.js'\n\n/**\n * Merges integration configuration for API calls.\n * - If no local config is defined (undefined), preserves server-side config entirely.\n * - If local config is defined, merges it on top of server-side config (local wins per-key).\n */\nexport function mergeIntegrationConfig(\n current: Record<string,
|
|
42
|
+
"import { Project, SyntaxKind, PropertyAssignment, SourceFile, ObjectLiteralExpression } from 'ts-morph'\nimport { readFileSync } from 'fs'\nimport * as path from 'path'\nimport type { Dependencies } from './types'\nimport { formatCode } from '../generators/utils'\n\nexport interface ConfigSchemaFieldUpdate {\n action: 'add' | 'update' | 'remove'\n field: string\n /** Raw TS expression for the field type, e.g. \"z.string().default('sk-...')\" */\n definition?: string\n}\n\nexport type DefaultModelSelection = string | string[]\n\nexport interface DefaultModelsUpdate {\n autonomous?: DefaultModelSelection\n zai?: DefaultModelSelection\n}\n\nexport interface IntegrationConfigMigrationState {\n deprecatedAliases: string[]\n migratableAliases: string[]\n}\n\n/**\n * ConfigWriter handles writing updates to agent.config.ts\n *\n * Note: For reading dependencies, use AgentProject.dependencies instead.\n * This class is only for surgical updates to specific fields.\n */\nexport class ConfigWriter {\n private configPath: string\n\n constructor(projectPath: string) {\n this.configPath = path.join(projectPath, 'agent.config.ts')\n }\n\n private loadConfig(): {\n sourceFile: SourceFile\n configObject: ObjectLiteralExpression\n } {\n const project = new Project()\n const sourceFile = project.createSourceFile(this.configPath, readFileSync(this.configPath, 'utf-8'), {\n overwrite: true,\n })\n\n const defineConfigCall = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression).find((call) => {\n return call.getExpression().getText() === 'defineConfig'\n })\n\n if (!defineConfigCall) {\n throw new Error('Could not find defineConfig() call in agent.config.ts')\n }\n\n const configArg = defineConfigCall.getArguments()[0]\n if (!configArg || !configArg.isKind(SyntaxKind.ObjectLiteralExpression)) {\n throw new Error('defineConfig() must have an object literal as its first argument')\n }\n\n return { sourceFile, configObject: configArg as ObjectLiteralExpression }\n }\n\n private async saveConfig(sourceFile: SourceFile): Promise<void> {\n sourceFile.formatText()\n const content = sourceFile.getFullText()\n const formatted = await formatCode(content, this.configPath)\n sourceFile.replaceWithText(formatted)\n await sourceFile.save()\n }\n\n private serializeDefaultModelSelection(value: DefaultModelSelection): string {\n if (Array.isArray(value)) {\n return `[${value.map((entry) => `'${entry.replace(/'/g, \"\\\\'\")}'`).join(', ')}]`\n }\n\n return `'${value.replace(/'/g, \"\\\\'\")}'`\n }\n\n private getIntegrationConfigMigrationCandidates(): {\n sourceFile: SourceFile\n candidates: Array<{\n alias: string\n assignment: PropertyAssignment\n hasConfigProperty: boolean\n versionInitializerText?: string\n }>\n } {\n const { sourceFile, configObject } = this.loadConfig()\n\n const dependenciesProp = configObject.getProperty('dependencies') as PropertyAssignment | undefined\n if (!dependenciesProp) {\n return { sourceFile, candidates: [] }\n }\n\n const depsInit = dependenciesProp.getInitializerIfKind(SyntaxKind.ObjectLiteralExpression)\n if (!depsInit) {\n return { sourceFile, candidates: [] }\n }\n\n const integrationsProp = depsInit.getProperty('integrations') as PropertyAssignment | undefined\n if (!integrationsProp) {\n return { sourceFile, candidates: [] }\n }\n\n const integrationsInit = integrationsProp.getInitializerIfKind(SyntaxKind.ObjectLiteralExpression)\n if (!integrationsInit) {\n return { sourceFile, candidates: [] }\n }\n\n const candidates = integrationsInit.getProperties().flatMap((prop) => {\n if (!prop.isKind(SyntaxKind.PropertyAssignment)) {\n return []\n }\n\n const assignment = prop as PropertyAssignment\n const initializer = assignment.getInitializerIfKind(SyntaxKind.ObjectLiteralExpression)\n if (!initializer) {\n return []\n }\n\n const hasConfigProperty = initializer.getProperty('config') !== undefined\n\n const versionProp = initializer.getProperty('version') as PropertyAssignment | undefined\n const versionInitializer = versionProp?.getInitializer()\n const versionInitializerText =\n versionInitializer &&\n (versionInitializer.isKind(SyntaxKind.StringLiteral) ||\n versionInitializer.isKind(SyntaxKind.NoSubstitutionTemplateLiteral))\n ? versionInitializer.getText()\n : undefined\n\n return [{ alias: assignment.getName(), assignment, hasConfigProperty, versionInitializerText }]\n })\n\n return { sourceFile, candidates }\n }\n\n /**\n * Updates the dependencies field in agent.config.ts\n * Uses ts-morph to surgically update only the dependencies property\n * while preserving all other config fields (name, models, state, etc.)\n */\n async updateDependencies(dependencies: Dependencies): Promise<void> {\n const { sourceFile, configObject } = this.loadConfig()\n\n // Find or create the dependencies property\n let dependenciesProperty = configObject.getProperty('dependencies') as PropertyAssignment | undefined\n\n if (dependenciesProperty) {\n // Update existing property\n dependenciesProperty.setInitializer(JSON.stringify(dependencies))\n } else {\n // Add new property at the end\n dependenciesProperty = configObject.addPropertyAssignment({\n name: 'dependencies',\n initializer: JSON.stringify(dependencies),\n })\n }\n\n await this.saveConfig(sourceFile)\n }\n\n /**\n * Updates the name field in agent.config.ts\n */\n async updateName(name: string): Promise<void> {\n const { sourceFile, configObject } = this.loadConfig()\n\n const nameProperty = configObject.getProperty('name') as PropertyAssignment | undefined\n if (nameProperty) {\n nameProperty.setInitializer(`'${name.replace(/'/g, \"\\\\'\")}'`)\n }\n\n await this.saveConfig(sourceFile)\n }\n\n /**\n * Updates the defaultModels field in agent.config.ts.\n * Creates the object when it does not exist and only mutates the requested keys.\n */\n async updateDefaultModels(updates: DefaultModelsUpdate): Promise<void> {\n const requestedEntries = Object.entries(updates).filter(([, value]) => value !== undefined) as Array<\n [keyof DefaultModelsUpdate, DefaultModelSelection]\n >\n\n if (requestedEntries.length === 0) {\n return\n }\n\n const { sourceFile, configObject } = this.loadConfig()\n\n let defaultModelsProperty = configObject.getProperty('defaultModels') as PropertyAssignment | undefined\n\n if (!defaultModelsProperty) {\n defaultModelsProperty = configObject.addPropertyAssignment({\n name: 'defaultModels',\n initializer: '{}',\n })\n }\n\n const defaultModelsObject = defaultModelsProperty.getInitializerIfKind(SyntaxKind.ObjectLiteralExpression)\n if (!defaultModelsObject) {\n throw new Error('defaultModels must be an object literal in agent.config.ts')\n }\n\n for (const [key, value] of requestedEntries) {\n const existingProperty = defaultModelsObject.getProperty(key) as PropertyAssignment | undefined\n const initializer = this.serializeDefaultModelSelection(value)\n\n if (existingProperty) {\n existingProperty.setInitializer(initializer)\n } else {\n defaultModelsObject.addPropertyAssignment({\n name: key,\n initializer,\n })\n }\n }\n\n await this.saveConfig(sourceFile)\n }\n\n /**\n * Migrates object-format integrations to the string shorthand format.\n * e.g. `chat: { version: \"chat@0.7.6\", enabled: true }` → `chat: \"chat@0.7.6\"`\n *\n * Returns the list of alias names that were migrated.\n */\n async migrateIntegrationsToStringFormat(): Promise<string[]> {\n const { sourceFile, candidates } = this.getIntegrationConfigMigrationCandidates()\n const migrated: string[] = []\n\n for (const candidate of candidates) {\n if (!candidate.versionInitializerText || candidate.hasConfigProperty) {\n continue\n }\n\n candidate.assignment.setInitializer(candidate.versionInitializerText)\n migrated.push(candidate.alias)\n }\n\n if (migrated.length > 0) {\n await this.saveConfig(sourceFile)\n }\n\n return migrated\n }\n\n /**\n * Checks which integrations still use the deprecated object format and which\n * of those entries can be safely rewritten to string shorthand.\n */\n getIntegrationConfigMigrationState(): IntegrationConfigMigrationState {\n try {\n const { candidates } = this.getIntegrationConfigMigrationCandidates()\n const deprecatedAliases = candidates.map((candidate) => candidate.alias)\n const migratableAliases = candidates\n .filter((candidate) => candidate.versionInitializerText && !candidate.hasConfigProperty)\n .map((candidate) => candidate.alias)\n\n return { deprecatedAliases, migratableAliases }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.error(\n `Configuration update failed with error: ${message} — please verify that there are no syntax errors in your agent.config.ts`\n )\n return { deprecatedAliases: [], migratableAliases: [] }\n }\n }\n\n /**\n * Checks if any integrations use the deprecated object format.\n * Returns alias names of integrations using the deprecated format.\n */\n getObjectFormatIntegrations(): string[] {\n return this.getIntegrationConfigMigrationState().deprecatedAliases\n }\n\n /**\n * Adds, updates, or removes fields inside configuration.schema (the z.object({...}))\n */\n async updateConfiguration(updates: ConfigSchemaFieldUpdate[]): Promise<void> {\n const { sourceFile, configObject } = this.loadConfig()\n\n const hasAdds = updates.some((u) => u.action === 'add')\n\n // Find or create configuration property\n let configProp = configObject.getProperty('configuration') as PropertyAssignment | undefined\n if (!configProp) {\n if (!hasAdds) return\n configProp = configObject.addPropertyAssignment({\n name: 'configuration',\n initializer: '{ schema: z.object({}) }',\n })\n }\n\n const configInit = configProp.getInitializerIfKind(SyntaxKind.ObjectLiteralExpression)\n if (!configInit) return\n\n // Find or create schema property\n let schemaProp = configInit.getProperty('schema') as PropertyAssignment | undefined\n if (!schemaProp) {\n if (!hasAdds) return\n schemaProp = configInit.addPropertyAssignment({\n name: 'schema',\n initializer: 'z.object({})',\n })\n }\n\n const schemaCall = schemaProp.getInitializerIfKind(SyntaxKind.CallExpression)\n if (!schemaCall) return\n\n const schemaArg = schemaCall.getArguments()[0]\n if (!schemaArg || !schemaArg.isKind(SyntaxKind.ObjectLiteralExpression)) return\n\n const schemaObject = schemaArg as ObjectLiteralExpression\n\n for (const update of updates) {\n const existing = schemaObject.getProperty(update.field) as PropertyAssignment | undefined\n\n switch (update.action) {\n case 'add':\n if (!existing && update.definition) {\n schemaObject.addPropertyAssignment({\n name: update.field,\n initializer: update.definition,\n })\n }\n break\n case 'update':\n if (existing && update.definition) {\n existing.setInitializer(update.definition)\n }\n break\n case 'remove':\n if (existing) {\n existing.remove()\n }\n break\n }\n }\n\n await this.saveConfig(sourceFile)\n }\n}\n",
|
|
43
|
+
"import { Client, type Integration, type Bot } from '@botpress/client'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { auth } from '../auth/index.js'\nimport { configsMatch } from './config-utils.js'\nimport { IntegrationManager } from './manager.js'\nimport type { ParsedIntegration } from './types.js'\n\nexport type IntegrationInstallStatus = 'enabled' | 'not_installed' | 'disabled'\nexport type IntegrationRegistrationStatus =\n | 'registered'\n | 'registration_pending'\n | 'registration_failed'\n | 'unregistration_pending'\n | 'unregistered'\n | 'unregistration_failed'\n\nexport interface IntegrationCheckResult {\n alias: string\n name: string\n\n // Current state (from bot)\n installStatus: IntegrationInstallStatus\n registrationStatus?: IntegrationRegistrationStatus\n installedVersion?: string\n currentConfigurationType?: string | null\n currentConfiguration?: Record<string, unknown>\n\n // Desired state (from agent.config.ts dependencies)\n desiredInstallStatus: IntegrationInstallStatus\n desiredVersion: string\n desiredIntegrationId?: string // The integration ID for the desired version\n desiredConfigurationType?: string | null\n desiredConfiguration?: Record<string, unknown>\n\n // Integration definition\n definition: Integration\n\n // Flags for easy checking\n needsInstall: boolean\n needsUpdate: boolean\n needsRemoval: boolean\n needsConfiguration: boolean\n hasError: boolean\n errorMessage?: string\n}\n\nexport class IntegrationChecker {\n private projectPath: string\n private client?: Client\n\n constructor(projectPath: string) {\n this.projectPath = projectPath\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n const project = await AgentProject.load(this.projectPath)\n\n const workspaceId = project.agentInfo?.workspaceId || credentials.workspaceId\n\n if (!workspaceId) {\n throw new Error('No workspace ID found. Please login with \"adk login\"')\n }\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n /**\n * Fetch integration definition from Botpress API\n * Try private first, then public\n */\n private async fetchIntegrationDefinition(name: string, version: string): Promise<Integration> {\n const client = await this.getClient()\n\n // Try both private and public in parallel, prefer private\n const [privateResult, publicResult] = await Promise.allSettled([\n client.getIntegrationByName({ name, version }).then(({ integration }) => integration as Integration),\n client.getPublicIntegration({ name, version }).then(({ integration }) => integration as Integration),\n ])\n\n // Prefer private integration\n if (privateResult.status === 'fulfilled') {\n return privateResult.value\n }\n\n if (publicResult.status === 'fulfilled') {\n return publicResult.value\n }\n\n // Both failed\n throw new Error(\n `Failed to fetch integration ${name}@${version}: ${\n privateResult.status === 'rejected' ? privateResult.reason : 'Unknown error'\n }`\n )\n }\n\n /**\n * Check integration status for a specific bot\n */\n async checkIntegrations(botId: string): Promise<IntegrationCheckResult[]> {\n const client = await this.getClient()\n const project = await AgentProject.load(this.projectPath)\n\n // Load desired state from agent.config.ts dependencies\n const integrationManager = new IntegrationManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const loadResult = await integrationManager.loadIntegrations(project.dependencies || { integrations: {} })\n\n if (loadResult.errors.length > 0) {\n throw new Error(`Failed to load integrations: ${loadResult.errors.map((e) => e.message).join(', ')}`)\n }\n\n // Get current bot state\n let bot: Bot\n try {\n const response = await client.getBot({ id: botId })\n bot = response.bot\n } catch (error) {\n throw new Error(`Failed to get bot: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n const results: IntegrationCheckResult[] = []\n const installedIntegrations = bot.integrations || {}\n\n // Track which installed integrations we've processed\n const processedIntegrationIds = new Set<string>()\n\n // Process each integration from agent.config.ts dependencies\n for (const parsedIntegration of loadResult.integrations) {\n const result = await this.checkIntegration(parsedIntegration, installedIntegrations, processedIntegrationIds)\n results.push(result)\n }\n\n // Check for extra integrations that are installed but not in dependencies\n for (const [key, installedIntegration] of Object.entries(installedIntegrations)) {\n if (!processedIntegrationIds.has(installedIntegration.id)) {\n // This integration is installed but not in dependencies - should be removed\n // We need to fetch the full integration definition\n try {\n const integrationDef = await this.fetchIntegrationDefinition(\n installedIntegration.name,\n installedIntegration.version\n )\n\n results.push({\n alias: key,\n name: installedIntegration.name,\n installStatus: installedIntegration.enabled ? 'enabled' : 'disabled',\n registrationStatus: installedIntegration.status,\n installedVersion: installedIntegration.version,\n currentConfigurationType: installedIntegration.configurationType,\n currentConfiguration: installedIntegration.configuration,\n desiredInstallStatus: 'not_installed',\n desiredVersion: installedIntegration.version,\n definition: integrationDef,\n needsInstall: false,\n needsUpdate: false,\n needsRemoval: true,\n needsConfiguration: false,\n hasError: false,\n })\n } catch {\n // If we can't fetch the definition, skip this integration\n continue\n }\n }\n }\n\n return results\n }\n\n private async checkIntegration(\n parsedIntegration: ParsedIntegration,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- bot.integrations shape from Botpress API\n installedIntegrations: Record<string, any>,\n processedIntegrationIds: Set<string>\n ): Promise<IntegrationCheckResult> {\n const { alias, ref, enabled, configurationType, config, definition } = parsedIntegration\n\n if (!definition) {\n throw new Error(`Integration definition not found for ${alias}`)\n }\n\n // Find matching installed integration by alias first, then by name for backwards compatibility\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic integration object from bot.integrations\n let installedIntegration: any = null\n\n // First, try to match by alias (exact key match) - this is the correct way for multi-integration setups\n if (installedIntegrations[alias]) {\n installedIntegration = installedIntegrations[alias]\n processedIntegrationIds.add(installedIntegration.id)\n } else {\n // Fallback: match by name for backwards compatibility with single-integration setups\n // where the key might be the integration name instead of an alias\n for (const [_key, installed] of Object.entries(installedIntegrations)) {\n // Compare by name, handling both workspace-scoped and public integrations\n // installed.name from API might be \"intercom\" while ref.fullName is \"sly/intercom\"\n // So we need to check both the full name and just the base name\n const matches =\n installed.name === ref.fullName || // Exact match (e.g., \"sly/intercom\" === \"sly/intercom\")\n installed.name === ref.name // Base name match (e.g., \"intercom\" === \"intercom\")\n\n if (matches) {\n installedIntegration = installed\n processedIntegrationIds.add(installed.id)\n break\n }\n }\n }\n\n // Determine desired install status\n // undefined = string shorthand (no opinion) → use server state if installed, 'disabled' for new installs\n const desiredInstallStatus: IntegrationInstallStatus =\n enabled === true\n ? 'enabled'\n : enabled === false\n ? 'disabled'\n : installedIntegration\n ? installedIntegration.enabled\n ? 'enabled'\n : 'disabled'\n : 'disabled'\n\n // Build result\n const result: IntegrationCheckResult = {\n alias,\n name: ref.fullName,\n installStatus: installedIntegration ? (installedIntegration.enabled ? 'enabled' : 'disabled') : 'not_installed',\n desiredInstallStatus,\n installedVersion: installedIntegration?.version,\n desiredVersion: ref.version,\n desiredIntegrationId: definition.id, // The integration ID for the desired version\n currentConfigurationType: installedIntegration?.configurationType,\n currentConfiguration: installedIntegration?.configuration,\n desiredConfigurationType: configurationType ?? null,\n desiredConfiguration: config,\n definition,\n needsInstall: false,\n needsUpdate: false,\n needsRemoval: false,\n needsConfiguration: false,\n hasError: false,\n }\n\n // Set registration status if installed\n if (installedIntegration) {\n result.registrationStatus = installedIntegration.status\n\n // Check for registration errors\n if (installedIntegration.status === 'registration_failed' && installedIntegration.statusReason) {\n result.hasError = true\n result.errorMessage = installedIntegration.statusReason\n }\n }\n\n // Determine what needs to be done\n if (!installedIntegration) {\n result.needsInstall = true\n if (result.needsInstall && config) {\n result.needsConfiguration = true\n }\n } else {\n // Already installed - check if update needed\n if (installedIntegration.version !== ref.version) {\n result.needsUpdate = true\n }\n\n // Check if configuration type changed (only if explicitly specified in dependencies)\n if (configurationType !== undefined && configurationType !== installedIntegration.configurationType) {\n result.needsConfiguration = true\n }\n\n // Check if configuration changed (only if explicitly specified in dependencies).\n // Only compare keys defined in local config — server-only keys (e.g. dashboard-set\n // secrets) are intentionally preserved and should not trigger drift detection.\n if (config !== undefined) {\n const configType = configurationType ?? installedIntegration.configurationType\n const schema =\n (configType && definition.configurations?.[configType]?.schema) ||\n definition.configurations?.['default']?.schema ||\n definition.configuration?.schema\n const schemaDefaults = Object.fromEntries(\n Object.entries(schema?.properties || {}).flatMap(([k, v]: [string, unknown]) =>\n (v as Record<string, unknown>)?.default !== undefined ? [[k, (v as Record<string, unknown>).default]] : []\n )\n )\n\n if (!configsMatch(installedIntegration.configuration, config, schemaDefaults)) {\n result.needsConfiguration = true\n }\n }\n\n if (enabled !== undefined && enabled !== installedIntegration.enabled) {\n result.needsUpdate = true\n }\n }\n\n return result\n }\n}\n",
|
|
44
|
+
"import { Client } from '@botpress/client'\nimport { auth } from '../auth/index.js'\nimport type { AgentProject } from '../agent-project/agent-project.js'\n\n/**\n * Merges integration configuration for API calls.\n * - If no local config is defined (undefined), preserves server-side config entirely.\n * - If local config is defined, merges it on top of server-side config (local wins per-key).\n */\nexport function mergeIntegrationConfig(\n current: Record<string, unknown> | undefined,\n desired: Record<string, unknown> | undefined\n): Record<string, unknown> {\n if (desired === undefined) {\n return current || {}\n }\n return { ...(current || {}), ...desired }\n}\n\n/**\n * Checks whether the local (desired) config matches the current (server) config.\n * Only compares keys present in `desired` — server-only keys are intentionally\n * preserved and do not count as drift. Falls back to schema defaults when a value\n * is missing on either side.\n */\nexport function configsMatch(\n current: Record<string, unknown> | undefined,\n desired: Record<string, unknown>,\n schemaDefaults: Record<string, unknown> = {}\n): boolean {\n return Object.keys(desired).every((key) => {\n const currentValue = current?.[key] ?? schemaDefaults[key]\n const desiredValue = desired[key] ?? schemaDefaults[key]\n return JSON.stringify(currentValue) === JSON.stringify(desiredValue)\n })\n}\n\nexport interface FetchServerConfigsResult {\n configs: Record<string, Record<string, unknown>>\n enabledStates: Record<string, boolean>\n fetched: boolean\n skipped: boolean\n error?: string\n}\n\n/**\n * Fetches current integration configurations from the server for a given bot.\n *\n * When `targetBotId` is provided, fetches from that specific bot (used during\n * deploy/build to fetch from the production bot). Otherwise falls back to\n * devId → botId resolution (used during adk dev to fetch from the dev bot).\n */\nexport async function fetchServerIntegrationConfigs(\n project: AgentProject,\n targetBotId?: string\n): Promise<FetchServerConfigsResult> {\n const { devId, botId } = project.agentInfo ?? {}\n const targetId = targetBotId || devId || botId\n if (!targetId) {\n return { configs: {}, enabledStates: {}, fetched: false, skipped: true }\n }\n\n try {\n const credentials = await auth.getActiveCredentials()\n const client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId: project.agentInfo?.workspaceId || credentials.workspaceId,\n headers: { 'x-multiple-integrations': 'true' },\n })\n\n try {\n return await fetchBotConfigs(client, targetId)\n } catch (err) {\n // If explicit target was given, don't fall back\n if (targetBotId) {\n throw err\n }\n // If devId fetch failed and a separate botId exists, fall back to production bot\n if (devId && botId && devId !== botId) {\n return await fetchBotConfigs(client, botId)\n }\n throw err\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return {\n configs: {},\n enabledStates: {},\n fetched: false,\n skipped: false,\n error: message,\n }\n }\n}\n\nasync function fetchBotConfigs(client: Client, botId: string): Promise<FetchServerConfigsResult> {\n const { bot } = await client.getBot({ id: botId })\n const configs: Record<string, Record<string, unknown>> = {}\n const enabledStates: Record<string, boolean> = {}\n\n for (const [alias, integration] of Object.entries(bot.integrations || {})) {\n if (integration.configuration && Object.keys(integration.configuration).length > 0) {\n configs[alias] = integration.configuration\n }\n enabledStates[alias] = integration.enabled\n }\n\n return { configs, enabledStates, fetched: true, skipped: false }\n}\n",
|
|
45
45
|
"import { Client } from '@botpress/client'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { auth } from '../auth/index.js'\nimport type { IntegrationCheckResult } from './checker.js'\nimport { mergeIntegrationConfig } from './config-utils.js'\n\n/**\n * Normalizes configuration type for API calls.\n * \"default\" is not a real configuration type - it's a placeholder used internally.\n * The API will reject it, so we convert it to undefined.\n */\nfunction normalizeConfigurationType(configType: string | null | undefined): string | undefined {\n if (configType === 'default' || configType === null) {\n return undefined\n }\n return configType\n}\n\nexport interface SyncSummary {\n installed: number\n updated: number\n removed: number\n failed: number\n errors: Array<{ alias: string; error: string }>\n}\n\nexport class IntegrationSyncManager {\n private projectPath: string\n private client?: Client\n\n constructor(projectPath: string) {\n this.projectPath = projectPath\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n const project = await AgentProject.load(this.projectPath)\n\n const workspaceId = project.agentInfo?.workspaceId || credentials.workspaceId\n\n if (!workspaceId) {\n throw new Error('No workspace ID found. Please login with \"adk login\"')\n }\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n // Apply integration changes to a bot by installing, updating, or removing them\n async applySyncPlan(checkResults: IntegrationCheckResult[], botId: string): Promise<SyncSummary> {\n const summary: SyncSummary = {\n installed: 0,\n updated: 0,\n removed: 0,\n failed: 0,\n errors: [],\n }\n\n const client = await this.getClient()\n\n for (const result of checkResults) {\n if (result.needsRemoval && result.installStatus !== 'not_installed') {\n try {\n await client.updateBot({\n id: botId,\n integrations: {\n [result.alias]: null,\n },\n })\n summary.removed++\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n summary.failed++\n summary.errors.push({ alias: result.alias, error: errorMsg })\n }\n } else if (result.needsInstall) {\n try {\n await client.updateBot({\n id: botId,\n integrations: {\n [result.alias]: {\n integrationId: result.desiredIntegrationId || result.definition.id,\n enabled: result.desiredInstallStatus === 'enabled',\n configuration: mergeIntegrationConfig(result.currentConfiguration, result.desiredConfiguration),\n configurationType: normalizeConfigurationType(result.desiredConfigurationType),\n },\n },\n })\n summary.installed++\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n summary.failed++\n summary.errors.push({ alias: result.alias, error: errorMsg })\n }\n } else if ((result.needsUpdate || result.needsConfiguration) && result.installStatus !== 'not_installed') {\n try {\n await client.updateBot({\n id: botId,\n integrations: {\n [result.alias]: {\n integrationId: result.desiredIntegrationId || result.definition.id,\n enabled: result.desiredInstallStatus === 'enabled',\n configuration: mergeIntegrationConfig(result.currentConfiguration, result.desiredConfiguration),\n configurationType: normalizeConfigurationType(result.desiredConfigurationType),\n },\n },\n })\n summary.updated++\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n summary.failed++\n summary.errors.push({ alias: result.alias, error: errorMsg })\n }\n }\n }\n\n return summary\n }\n}\n",
|
|
46
|
-
"import { Client } from '@botpress/client'\nimport { auth, Credentials } from '../auth/index.js'\nimport { Dependencies, ValidationError
|
|
46
|
+
"import { Client } from '@botpress/client'\nimport { auth, Credentials } from '../auth/index.js'\nimport { Dependencies, ValidationError } from '../agent-project/types.js'\nimport { InterfaceDefinition, ParsedInterface, InterfaceRef, InterfaceValidationResult } from './types.js'\nimport { EnhancedInterfaceCache } from './enhanced-cache.js'\nimport { InterfaceParser } from './parser.js'\nimport { ValidationErrors } from '../agent-project/validation-errors.js'\n\nexport interface InterfaceManagerOptions {\n noCache?: boolean\n workspaceId?: string\n credentials?: Credentials\n}\n\nexport class InterfaceManager {\n private cache: EnhancedInterfaceCache\n private options: InterfaceManagerOptions\n private client?: Client\n\n constructor(options: InterfaceManagerOptions = {}) {\n this.options = options\n this.cache = new EnhancedInterfaceCache(options.noCache || false)\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = this.options.credentials || (await auth.getActiveCredentials())\n\n if (!this.options.workspaceId && !credentials.workspaceId) {\n throw new Error('No workspace ID found in current profile. Please login again with \"adk login\"')\n }\n\n // Use apiUrl from credentials (which may come from agent.json via getAgentCredentials)\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId: this.options.workspaceId || credentials.workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n async loadInterfaces(dependencies: Dependencies): Promise<{\n interfaces: ParsedInterface[]\n errors: ValidationError[]\n warnings: ValidationError[]\n }> {\n const errors: ValidationError[] = []\n const warnings: ValidationError[] = []\n\n // Parse interfaces from dependencies\n const parseResult = InterfaceParser.parseInterfaces(dependencies)\n const interfaces = parseResult.interfaces\n errors.push(...parseResult.errors)\n\n // Fetch interface definitions in parallel\n const fetchPromises = interfaces.map(async (intf) => {\n try {\n const definition = await this.fetchInterface(intf.ref)\n intf.definition = definition\n\n // Validate\n const validation = this.validateInterface(intf)\n intf.validationResult = validation\n\n if (!validation.valid) {\n validation.errors.forEach((msg) => {\n errors.push(ValidationErrors.warning(msg, 'agent.config.ts'))\n })\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('version')) {\n errors.push(ValidationErrors.unknownInterface(error.message))\n } else {\n errors.push(\n ValidationErrors.invalidDependenciesSyntax(`Unknown interface '${intf.alias}' (${intf.ref.fullName})`)\n )\n }\n }\n })\n\n await Promise.all(fetchPromises)\n\n return { interfaces, errors, warnings }\n }\n\n /**\n * Fetch interface definition from API or cache\n */\n public async fetchInterface(ref: InterfaceRef): Promise<InterfaceDefinition> {\n // Level 1: version resolution cache (name@version -> id + updatedAt)\n const cachedResolution = await this.cache.getResolution(ref.name, ref.version, ref.workspace)\n if (cachedResolution) {\n const cachedDefinition = await this.cache.getDefinition(cachedResolution.interfaceId, cachedResolution.updatedAt)\n if (cachedDefinition) {\n return cachedDefinition\n }\n }\n\n const client = await this.getClient()\n let interfaceResponse: { interface: InterfaceDefinition } | undefined\n let versionError: Error | null = null\n\n try {\n interfaceResponse = await client.getInterfaceByName({\n name: ref.name,\n version: ref.version,\n })\n } catch {\n try {\n interfaceResponse = await client.getPublicInterface({\n name: ref.name,\n version: ref.version,\n })\n } catch (publicError) {\n versionError = publicError as Error\n }\n }\n\n if (!interfaceResponse && versionError) {\n let latestVersion: string | null = null\n try {\n const latestPrivate = await client.getInterfaceByName({\n name: ref.name,\n version: 'latest',\n })\n latestVersion = latestPrivate.interface.version\n } catch {\n try {\n const latestPublic = await client.getPublicInterface({\n name: ref.name,\n version: 'latest',\n })\n latestVersion = latestPublic.interface.version\n } catch {\n const location = ref.workspace ? `workspace \"${ref.workspace}\"` : 'the official Botpress hub'\n throw new Error(`Interface \"${ref.name}\" does not exist in ${location}`)\n }\n }\n const location = ref.workspace ? `workspace \"${ref.workspace}\"` : 'Botpress'\n throw new Error(\n `Interface \"${ref.name}\" version \"${ref.version}\" not found in ${location}. Latest available version is \"${latestVersion}\"`\n )\n }\n\n const intf = interfaceResponse!.interface\n\n await this.cache.setResolution(ref.name, ref.version, ref.workspace, intf.id, intf.updatedAt)\n await this.cache.setDefinition(intf.id, intf.updatedAt, intf)\n return intf\n }\n\n /**\n * Convenience: parse and fetch from a dependency string like \"name@1.2.3\" or \"workspace/name@latest\"\n */\n public async getByDependencyString(dep: string): Promise<InterfaceDefinition> {\n // Reuse parser regex logic without duplicating\n const match = dep.match(/^(?:([^/]+)\\/)?([^@]+)@(.+)$/)\n if (!match) {\n throw new Error(\n `Invalid interface dependency string: ${dep}. Expected 'name@version' or 'workspace/name@version'`\n )\n }\n const [, workspace, name, version] = match\n return this.fetchInterface({\n workspace: workspace || undefined,\n name: name!,\n version: version!,\n fullName: workspace ? `${workspace}/${name}` : name!,\n })\n }\n\n private validateInterface(intf: ParsedInterface): InterfaceValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!intf.definition) {\n errors.push(`Interface definition not found for ${intf.alias}`)\n return { valid: false, errors, warnings }\n }\n\n return { valid: errors.length === 0, errors, warnings }\n }\n\n async getCacheStats(): Promise<{ count: number; sizeBytes: number }> {\n const stats = await this.cache.getStats()\n return {\n count: stats.resolutions.count + stats.definitions.count,\n sizeBytes: stats.resolutions.sizeBytes + stats.definitions.sizeBytes,\n }\n }\n\n async clearCache(): Promise<void> {\n await this.cache.clear()\n }\n}\n",
|
|
47
47
|
"import fs from 'fs/promises'\nimport path from 'path'\nimport os from 'os'\nimport { InterfaceDefinition } from './types.js'\n\ninterface VersionResolution {\n interfaceId: string\n updatedAt: string\n cachedAt: string\n}\n\ninterface CachedDefinition {\n definition: InterfaceDefinition\n cachedAt: string\n}\n\nexport class EnhancedInterfaceCache {\n private cacheDir: string\n private resolutionsDir: string\n private definitionsDir: string\n private noCache: boolean\n\n constructor(noCache: boolean = false) {\n this.noCache = noCache\n this.cacheDir = path.join(os.homedir(), '.adk', 'cache', 'interfaces')\n this.resolutionsDir = path.join(this.cacheDir, 'resolutions')\n this.definitionsDir = path.join(this.cacheDir, 'definitions')\n }\n\n private async ensureCacheDirs(): Promise<void> {\n await fs.mkdir(this.resolutionsDir, { recursive: true })\n await fs.mkdir(this.definitionsDir, { recursive: true })\n }\n\n async getResolution(name: string, version: string, workspace?: string): Promise<VersionResolution | null> {\n if (this.noCache) return null\n try {\n const key = this.getResolutionKey(name, version, workspace)\n const cachePath = path.join(this.resolutionsDir, `${key}.json`)\n const data = await fs.readFile(cachePath, 'utf-8')\n const resolution: VersionResolution = JSON.parse(data)\n const cachedAt = new Date(resolution.cachedAt)\n const ageMinutes = (Date.now() - cachedAt.getTime()) / (1000 * 60)\n if (ageMinutes > 5) return null\n return resolution\n } catch {\n return null\n }\n }\n\n async setResolution(\n name: string,\n version: string,\n workspace: string | undefined,\n interfaceId: string,\n updatedAt: string\n ): Promise<void> {\n await this.ensureCacheDirs()\n const key = this.getResolutionKey(name, version, workspace)\n const cachePath = path.join(this.resolutionsDir, `${key}.json`)\n const resolution: VersionResolution = {\n interfaceId,\n updatedAt,\n cachedAt: new Date().toISOString(),\n }\n await fs.writeFile(cachePath, JSON.stringify(resolution, null, 2))\n }\n\n async getDefinition(interfaceId: string, updatedAt: string): Promise<InterfaceDefinition | null> {\n if (this.noCache) return null\n try {\n const key = this.getDefinitionKey(interfaceId, updatedAt)\n const cachePath = path.join(this.definitionsDir, `${key}.json`)\n const data = await fs.readFile(cachePath, 'utf-8')\n const cached: CachedDefinition = JSON.parse(data)\n return cached.definition\n } catch {\n return null\n }\n }\n\n async setDefinition(interfaceId: string, updatedAt: string, definition: InterfaceDefinition): Promise<void> {\n await this.ensureCacheDirs()\n const key = this.getDefinitionKey(interfaceId, updatedAt)\n const cachePath = path.join(this.definitionsDir, `${key}.json`)\n const cached: CachedDefinition = {\n definition,\n cachedAt: new Date().toISOString(),\n }\n await fs.writeFile(cachePath, JSON.stringify(cached, null, 2))\n }\n\n async clear(): Promise<void> {\n try {\n const resolutionFiles = await fs.readdir(this.resolutionsDir)\n await Promise.all(resolutionFiles.map((f) => fs.unlink(path.join(this.resolutionsDir, f))))\n const definitionFiles = await fs.readdir(this.definitionsDir)\n await Promise.all(definitionFiles.map((f) => fs.unlink(path.join(this.definitionsDir, f))))\n } catch {\n // ignore\n }\n }\n\n async getStats(): Promise<{\n resolutions: { count: number; sizeBytes: number }\n definitions: { count: number; sizeBytes: number }\n }> {\n const getDirectoryStats = async (dir: string) => {\n try {\n const files = await fs.readdir(dir)\n let totalSize = 0\n for (const file of files) {\n const stats = await fs.stat(path.join(dir, file))\n totalSize += stats.size\n }\n return { count: files.length, sizeBytes: totalSize }\n } catch {\n return { count: 0, sizeBytes: 0 }\n }\n }\n const [resolutions, definitions] = await Promise.all([\n getDirectoryStats(this.resolutionsDir),\n getDirectoryStats(this.definitionsDir),\n ])\n return { resolutions, definitions }\n }\n\n private getResolutionKey(name: string, version: string, workspace?: string): string {\n const prefix = workspace ? `${workspace}_` : ''\n const key = `${prefix}${name}_${version}`\n return key.replace(/[^a-zA-Z0-9_-]/g, '_')\n }\n\n private getDefinitionKey(interfaceId: string, updatedAt: string): string {\n const key = `${interfaceId}_${updatedAt}`\n return key.replace(/[^a-zA-Z0-9_-]/g, '_')\n }\n}\n",
|
|
48
48
|
"import { Dependencies, ValidationError } from '../agent-project/types.js'\nimport { ValidationErrors } from '../agent-project/validation-errors.js'\nimport { InterfaceRef, ParsedInterface } from './types.js'\nimport { BUILTIN_INTERFACES } from '../constants.js'\n\nexport class InterfaceParser {\n /**\n * Parse an interface version string into its components\n * Examples:\n * - \"translator@1.2.0\" -> { name: 'translator', version: '1.2.0', fullName: 'translator' }\n * - \"myworkspace/translator@latest\" -> { workspace: 'myworkspace', name: 'translator', version: 'latest', fullName: 'myworkspace/translator' }\n */\n static parseInterfaceRef(versionString: string): InterfaceRef {\n // Match pattern: [workspace/]name@version\n const match = versionString.match(/^(?:([^/]+)\\/)?([^@]+)@(.+)$/)\n\n if (!match) {\n throw new Error(\n `Invalid interface version format: ${versionString}. Expected format: 'name@version' or 'workspace/name@version'`\n )\n }\n\n const [, workspace, name, version] = match\n\n return {\n workspace: workspace || undefined,\n name: name!,\n version: version!,\n fullName: workspace ? `${workspace}/${name}` : name!,\n }\n }\n\n /**\n * Get built-in interfaces (hard-coded constants)\n * The dependencies parameter is kept for API compatibility but not used\n */\n static parseInterfaces(_dependencies: Dependencies): {\n interfaces: ParsedInterface[]\n errors: ValidationError[]\n } {\n const interfaces: ParsedInterface[] = []\n const errors: ValidationError[] = []\n\n for (const [alias, versionString] of Object.entries(BUILTIN_INTERFACES)) {\n try {\n // Parse the interface reference\n const ref = this.parseInterfaceRef(versionString)\n\n // Validate version format\n if (!this.isValidVersion(ref.version)) {\n errors.push(ValidationErrors.invalidVersionFormat(alias, ref.version))\n }\n\n interfaces.push({ alias, ref, config: undefined })\n } catch (error) {\n errors.push(\n ValidationErrors.invalidDependenciesSyntax(\n `Invalid interface '${alias}': ${error instanceof Error ? error.message : String(error)}`\n )\n )\n }\n }\n\n return { interfaces, errors }\n }\n\n /**\n * Validate version format (must be exact semver or \"latest\")\n */\n private static isValidVersion(version: string): boolean {\n if (version === 'latest') return true\n const semverPattern = /^(\\d+)\\.(\\d+)\\.(\\d+)(-[\\w.]+)?(\\+[\\w.]+)?$/\n return semverPattern.test(version)\n }\n}\n",
|
|
49
49
|
"import { InterfaceManager } from './manager.js'\nimport { BUILTIN_INTERFACES } from '../constants.js'\n\nexport interface AddInterfaceResult {\n success: boolean\n alias: string\n name: string\n newVersion?: string\n previousVersion?: string\n message?: string\n}\n\nexport interface InterfaceOperationsOptions {\n projectPath: string\n}\n\nexport class InterfaceOperations {\n private projectPath: string\n private manager: InterfaceManager\n\n constructor(options: InterfaceOperationsOptions) {\n this.projectPath = options.projectPath\n this.manager = new InterfaceManager()\n }\n\n async addInterface(_options: {\n name: string // may include workspace prefix (e.g., \"ws/name\")\n version?: string // optional, defaults to latest\n alias?: string\n }): Promise<AddInterfaceResult> {\n throw new Error(\n 'Interfaces are built-in constants and cannot be added. The following interfaces are always available: ' +\n Object.keys(BUILTIN_INTERFACES).join(', ')\n )\n }\n\n async updateInterface(_options: {\n alias: string\n name: string // may include workspace prefix\n version: string // desired version (or 'latest')\n previousVersion: string\n }): Promise<AddInterfaceResult> {\n throw new Error(\n 'Interfaces are built-in constants and cannot be updated. The following interfaces are always available: ' +\n Object.keys(BUILTIN_INTERFACES).join(', ')\n )\n }\n\n async removeInterface(_alias: string): Promise<boolean> {\n throw new Error(\n 'Interfaces are built-in constants and cannot be removed. The following interfaces are always available: ' +\n Object.keys(BUILTIN_INTERFACES).join(', ')\n )\n }\n\n async listInterfaces(): Promise<\n Array<{\n alias: string\n name: string\n version: string\n }>\n > {\n return Object.entries(BUILTIN_INTERFACES).map(([alias, versionString]) => {\n const [name, version] = versionString.split('@')\n return { alias, name: name || '', version: version || 'latest' }\n })\n }\n\n /**\n * Get latest version info for an interface by name\n */\n async getInterfaceLatestVersion(name: string): Promise<{ name: string; latestVersion: string }> {\n // Resolve latest via manager and return version\n const latest = await this.manager.getByDependencyString(`${name}@latest`)\n return { name, latestVersion: latest.version }\n }\n\n /**\n * Upgrade interface(s) to latest version\n */\n async upgradeInterface(_alias?: string): Promise<{ upgraded: string[]; failed: string[] }> {\n throw new Error(\n 'Interfaces are built-in constants and cannot be upgraded. The following interfaces are always available: ' +\n Object.keys(BUILTIN_INTERFACES).join(', ')\n )\n }\n}\n",
|
|
50
|
-
"import { Primitives, Errors } from '@botpress/runtime/internal'\nimport { ValidationError, ValidationErrorCode, ValidationSeverity } from './types.js'\n\nexport interface ExpandExportsOptions {\n absolutePath: string\n relPath: string\n filename: string\n onWarning: (warning: ValidationError) => void\n}\n\n/**\n * Expands the exports of a module to include all properties,\n * including those on the default export if it is an object or array.\n * For example, exports of type `{ default: { a: 1, b: 2 } }`\n * will be expanded to `{ \"default.a\": 1, \"default.b\": 2 }`.\n *\n * @param options - Options for expanding exports\n * @returns A record of expanded exports\n */\nexport async function expandExports(options: ExpandExportsOptions): Promise<Record<string, unknown>> {\n const { absolutePath, relPath, filename, onWarning } = options\n let result: Record<string, unknown> = {}\n\n try {\n // Bust module cache by adding timestamp query parameter\n // This ensures we always get fresh imports on reload\n const importPath = `${absolutePath}?t=${Date.now()}`\n const exports = await import(importPath)\n\n if (typeof exports === 'object' && exports !== null) {\n for (const key of Object.keys(exports)) {\n try {\n result[key] = exports[key]\n } catch (error) {\n // Skip exports that throw on access\n if (Errors.isAdkError(error)) {\n onWarning({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_PRIMITIVE_DEFINITION,\n severity: ValidationSeverity.WARNING,\n message: error.message,\n file: relPath,\n hint: `Invalid primitive instantiation in ${filename} -> ${key}`,\n })\n }\n }\n }\n\n // Handle default exports\n if (typeof exports.default === 'object' && exports.default !== null) {\n try {\n const definition = Primitives.Definitions.getDefinition(exports.default)\n if (!definition) {\n // If not a primitive, expand the default export\n for (const key of Object.keys(exports.default)) {\n try {\n result[`default.${key}`] = exports.default[key]\n } catch (error) {\n if (Errors.isAdkError(error)) {\n onWarning({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_PRIMITIVE_DEFINITION,\n severity: ValidationSeverity.WARNING,\n message: error.message,\n file: relPath,\n hint: `Invalid primitive instantiation in ${filename} -> default.${key}`,\n })\n }\n }\n }\n }\n } catch (error) {\n // If accessing default throws, check if it's an ADK error\n if (Errors.isAdkError(error)) {\n onWarning({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_PRIMITIVE_DEFINITION,\n severity: ValidationSeverity.WARNING,\n message: error.message,\n file: relPath,\n hint: `Invalid primitive instantiation in ${filename} -> default`,\n })\n }\n }\n }\n }\n\n return result\n } catch (importError:
|
|
50
|
+
"import { Primitives, Errors } from '@botpress/runtime/internal'\nimport { ValidationError, ValidationErrorCode, ValidationSeverity } from './types.js'\n\nexport interface ExpandExportsOptions {\n absolutePath: string\n relPath: string\n filename: string\n onWarning: (warning: ValidationError) => void\n}\n\n/**\n * Expands the exports of a module to include all properties,\n * including those on the default export if it is an object or array.\n * For example, exports of type `{ default: { a: 1, b: 2 } }`\n * will be expanded to `{ \"default.a\": 1, \"default.b\": 2 }`.\n *\n * @param options - Options for expanding exports\n * @returns A record of expanded exports\n */\nexport async function expandExports(options: ExpandExportsOptions): Promise<Record<string, unknown>> {\n const { absolutePath, relPath, filename, onWarning } = options\n let result: Record<string, unknown> = {}\n\n try {\n // Bust module cache by adding timestamp query parameter\n // This ensures we always get fresh imports on reload\n const importPath = `${absolutePath}?t=${Date.now()}`\n const exports = await import(importPath)\n\n if (typeof exports === 'object' && exports !== null) {\n for (const key of Object.keys(exports)) {\n try {\n result[key] = exports[key]\n } catch (error) {\n // Skip exports that throw on access\n if (Errors.isAdkError(error)) {\n onWarning({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_PRIMITIVE_DEFINITION,\n severity: ValidationSeverity.WARNING,\n message: error.message,\n file: relPath,\n hint: `Invalid primitive instantiation in ${filename} -> ${key}`,\n })\n }\n }\n }\n\n // Handle default exports\n if (typeof exports.default === 'object' && exports.default !== null) {\n try {\n const definition = Primitives.Definitions.getDefinition(exports.default)\n if (!definition) {\n // If not a primitive, expand the default export\n for (const key of Object.keys(exports.default)) {\n try {\n result[`default.${key}`] = exports.default[key]\n } catch (error) {\n if (Errors.isAdkError(error)) {\n onWarning({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_PRIMITIVE_DEFINITION,\n severity: ValidationSeverity.WARNING,\n message: error.message,\n file: relPath,\n hint: `Invalid primitive instantiation in ${filename} -> default.${key}`,\n })\n }\n }\n }\n }\n } catch (error) {\n // If accessing default throws, check if it's an ADK error\n if (Errors.isAdkError(error)) {\n onWarning({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_PRIMITIVE_DEFINITION,\n severity: ValidationSeverity.WARNING,\n message: error.message,\n file: relPath,\n hint: `Invalid primitive instantiation in ${filename} -> default`,\n })\n }\n }\n }\n }\n\n return result\n } catch (importError: unknown) {\n // Check if it's an ADK error thrown during primitive instantiation\n if (Errors.isAdkError(importError)) {\n onWarning({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_PRIMITIVE_DEFINITION,\n severity: ValidationSeverity.WARNING,\n message: importError.message,\n file: relPath,\n hint: `Invalid primitive instantiation in ${filename}`,\n })\n return {}\n }\n\n // Check error cause chain for ADK errors (handles module initialization errors)\n let currentError: unknown = importError\n while (currentError) {\n if (Errors.isAdkError(currentError)) {\n onWarning({\n $type: 'ValidationError',\n code: ValidationErrorCode.INVALID_PRIMITIVE_DEFINITION,\n severity: ValidationSeverity.WARNING,\n message: currentError.message,\n file: relPath,\n hint: `Invalid primitive instantiation in ${filename}`,\n })\n return {}\n }\n currentError = currentError instanceof Error ? currentError.cause : undefined\n }\n\n // Re-throw other import errors\n throw importError\n }\n}\n",
|
|
51
51
|
"import { watch, FSWatcher } from 'fs'\nimport { EventEmitter } from 'events'\nimport path from 'path'\nimport { FileChangeEvent, FileChangeType } from './types.js'\n\nexport interface FileWatcherOptions {\n ignore?: string[]\n debounce?: number\n}\n\nexport class FileWatcher extends EventEmitter {\n private watcher?: FSWatcher\n private debounceTimers: Map<string, ReturnType<typeof setTimeout>> = new Map()\n private ignoredPatterns: RegExp[]\n private debounceMs: number\n\n constructor(\n private basePath: string,\n options: FileWatcherOptions = {}\n ) {\n super()\n this.ignoredPatterns = (options.ignore || []).map((pattern) => {\n // Convert glob-like patterns to regex\n const regexPattern = pattern.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*').replace(/\\?/g, '.')\n return new RegExp(`^${regexPattern}$`)\n })\n this.debounceMs = options.debounce || 100\n }\n\n start(): void {\n if (this.watcher) {\n throw new Error('Watcher already started')\n }\n\n this.watcher = watch(this.basePath, { recursive: true }, (eventType, filename) => {\n if (!filename) return\n\n const fullPath = path.join(this.basePath, filename)\n const relativePath = filename\n\n // Check if file should be ignored\n if (this.shouldIgnore(relativePath)) {\n return\n }\n\n // Debounce file changes\n const existingTimer = this.debounceTimers.get(fullPath)\n if (existingTimer) {\n clearTimeout(existingTimer)\n }\n\n const timer = setTimeout(() => {\n this.debounceTimers.delete(fullPath)\n\n let changeType: FileChangeType\n if (eventType === 'rename') {\n // In many cases, 'rename' means the file was added or deleted\n // We'd need to check if the file exists to determine which\n changeType = FileChangeType.Modified\n } else {\n changeType = FileChangeType.Modified\n }\n\n const event: FileChangeEvent = {\n type: changeType,\n path: fullPath,\n relativePath,\n }\n\n this.emit('change', event)\n }, this.debounceMs)\n\n this.debounceTimers.set(fullPath, timer)\n })\n\n this.watcher.on('error', (error) => {\n this.emit('error', error)\n })\n }\n\n stop(): void {\n if (!this.watcher) {\n return\n }\n\n // Clear all pending timers\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer)\n }\n this.debounceTimers.clear()\n\n // Close the watcher\n this.watcher.close()\n this.watcher = undefined\n }\n\n private shouldIgnore(relativePath: string): boolean {\n // Always ignore some common patterns\n const defaultIgnored = [/^\\.git\\//, /^node_modules\\//, /^dist\\//, /^\\.adk\\//, /\\.DS_Store$/]\n\n const allPatterns = [...defaultIgnored, ...this.ignoredPatterns]\n return allPatterns.some((pattern) => pattern.test(relativePath))\n }\n}\n",
|
|
52
|
-
"export { AgentProject } from './agent-project.js'\nexport type { AgentProjectOptions } from './agent-project.js'\nexport { FileWatcher } from './file-watcher.js'\nexport { ValidationErrors } from './validation-errors.js'\nexport { resolveAgent, hasAgentJson } from './agent-resolver.js'\nexport type { ResolveAgentOptions } from './agent-resolver.js'\nexport { ConfigWriter } from './config-writer.js'\nexport type { ConfigSchemaFieldUpdate } from './config-writer.js'\nexport * from './types.js'\n",
|
|
53
|
-
"import { Client } from '@botpress/client'\nimport { z } from '@botpress/sdk'\nimport { sync as jex } from '@bpinternal/jex'\nimport { auth } from '../auth'\nimport { coerceConfigValue, getInnerTypeName } from './coerce-config-value'\n\nexport interface StoredConfig {\n [key: string]:
|
|
54
|
-
"import type { z } from '@botpress/sdk'\n\n/**\n * Coerce a string value from CLI/terminal input to the type expected by a Zod field schema.\n *\n * CLI arguments and text inputs are always strings, but config schemas may expect\n * numbers, booleans, etc. This function inspects the Zod schema's type and converts\n * the raw string accordingly.\n *\n * Returns the coerced value, or the original string if the type is unknown or unsupported\n * (letting Zod validation catch any remaining mismatches).\n */\nexport function coerceConfigValue(value: string, fieldSchema: z.ZodTypeAny): unknown {\n const typeName = getInnerTypeName(fieldSchema)\n\n switch (typeName) {\n case 'ZodNumber': {\n const num = Number(value)\n if (Number.isNaN(num)) {\n return value\n }\n return num\n }\n\n case 'ZodBoolean': {\n const lower = value.toLowerCase()\n if (lower === 'true' || lower === '1' || lower === 'yes') {\n return true\n }\n if (lower === 'false' || lower === '0' || lower === 'no') {\n return false\n }\n return value\n }\n\n default:\n return value\n }\n}\n\n/**\n * Unwrap optional/default/nullable wrappers to get the inner type name.\n * e.g. z.number().optional() has typeName 'ZodOptional' but the inner type is 'ZodNumber'.\n */\nexport function getInnerTypeName(schema: z.ZodTypeAny): string {\n const def = (schema as any)?._def\n if (!def) {\n return 'unknown'\n }\n\n const typeName: string = def.typeName ?? 'unknown'\n\n if ((typeName === 'ZodOptional' || typeName === 'ZodNullable' || typeName === 'ZodDefault') && def.innerType) {\n return getInnerTypeName(def.innerType)\n }\n\n return typeName\n}\n",
|
|
55
|
-
"import * as fs from 'fs'\nimport * as path from 'path'\nimport {
|
|
52
|
+
"export { AgentProject } from './agent-project.js'\nexport type { AgentProjectOptions } from './agent-project.js'\nexport { FileWatcher } from './file-watcher.js'\nexport { ValidationErrors } from './validation-errors.js'\nexport { resolveAgent, hasAgentJson } from './agent-resolver.js'\nexport type { ResolveAgentOptions } from './agent-resolver.js'\nexport { ConfigWriter } from './config-writer.js'\nexport type { ConfigSchemaFieldUpdate, DefaultModelSelection, DefaultModelsUpdate } from './config-writer.js'\nexport * from './types.js'\n",
|
|
53
|
+
"import { Client } from '@botpress/client'\nimport { z } from '@botpress/sdk'\nimport { sync as jex } from '@bpinternal/jex'\nimport { auth } from '../auth'\nimport { coerceConfigValue, getInnerTypeName } from './coerce-config-value'\n\nexport interface StoredConfig {\n [key: string]: unknown\n}\n\nexport interface ConfigFieldDescriptor {\n key: string\n type: 'string' | 'number' | 'boolean' | 'unknown'\n required: boolean\n description?: string\n defaultValue?: unknown\n currentValue?: unknown\n}\n\nexport type SetResult =\n | {\n success: false\n error: string\n }\n | {\n success: true\n data: unknown\n }\n\nexport class ConfigManager {\n private botId: string\n private client: Client | undefined\n\n constructor(botId: string) {\n this.botId = botId\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n botId: this.botId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n /**\n * Load stored configuration from bot.configuration.data\n */\n async load(): Promise<StoredConfig> {\n try {\n const client = await this.getClient()\n const { bot } = await client.getBot({ id: this.botId })\n return (bot.configuration?.data as StoredConfig) || {}\n } catch (error) {\n console.warn(`Failed to load configuration from bot ${this.botId}:`, error)\n return {}\n }\n }\n\n /**\n * Save configuration to bot.configuration\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod requires any for generic ZodObject\n async save(config: StoredConfig, schema?: z.ZodObject<any>): Promise<void> {\n try {\n const client = await this.getClient()\n const { bot } = await client.getBot({ id: this.botId })\n\n // Update schema if provided and different\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK updateBot expects specific schema type\n const updates: { id: string; configuration: { data: StoredConfig; schema?: any } } = {\n id: this.botId,\n configuration: {\n data: config,\n },\n }\n\n if (schema) {\n const schemaJson = schema.toJSONSchema()\n const currentSchema = bot.configuration?.schema || {}\n\n // Use jex to compare schemas (synchronous comparison)\n if (!jex.jsonSchemaEquals(currentSchema, schemaJson)) {\n updates.configuration.schema = schemaJson\n }\n }\n\n await client.updateBot(updates)\n } catch (error) {\n throw new Error(`Failed to save configuration to bot ${this.botId}: ${error}`)\n }\n }\n\n /**\n * Get a configuration value\n */\n async get(key: string): Promise<unknown> {\n const config = await this.load()\n return config[key]\n }\n\n /**\n * Set a configuration value\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod requires any for generic ZodObject\n async set(key: string, value: unknown, schema?: z.ZodObject<any>): Promise<void> {\n const config = await this.load()\n config[key] = value\n await this.save(config, schema)\n }\n\n /**\n * Get all configuration values\n */\n async getAll(): Promise<Record<string, unknown>> {\n return await this.load()\n }\n\n /**\n * Validate configuration against a schema\n * Returns { valid: boolean, errors: string[], missing: string[] }\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod requires any for generic ZodObject\n async validate(schema: z.ZodObject<any>): Promise<{\n valid: boolean\n errors: string[]\n missing: string[]\n }> {\n const config = await this.getAll()\n const result = schema.safeParse(config)\n\n if (result.success) {\n return { valid: true, errors: [], missing: [] }\n }\n\n const errors: string[] = []\n const missing: string[] = []\n\n for (const issue of result.error.issues) {\n const key = issue.path.join('.')\n if (issue.code === 'invalid_type' && issue.received === 'undefined') {\n missing.push(key)\n }\n errors.push(`${key}: ${issue.message}`)\n }\n\n return { valid: false, errors, missing }\n }\n\n /**\n * Get missing required configuration keys\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod requires any for generic ZodObject\n async getMissingKeys(schema: z.ZodObject<any>): Promise<string[]> {\n const validation = await this.validate(schema)\n return validation.missing\n }\n\n /**\n * Check if configuration is valid\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod requires any for generic ZodObject\n async isValid(schema: z.ZodObject<any>): Promise<boolean> {\n const validation = await this.validate(schema)\n return validation.valid\n }\n\n /**\n * Describe the configuration schema as a serializable list of field descriptors.\n * Merges in current stored values so the UI can render a form without Zod access.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod requires any for generic ZodObject\n async describeSchema(schema: z.ZodObject<any>): Promise<ConfigFieldDescriptor[]> {\n const stored = await this.load()\n const shape = schema.shape as Record<string, z.ZodTypeAny>\n const fields: ConfigFieldDescriptor[] = []\n\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const innerType = getInnerTypeName(fieldSchema)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod internal _def not exposed in types\n const def = (fieldSchema as any)?._def\n\n let type: ConfigFieldDescriptor['type'] = 'unknown'\n if (innerType === 'ZodString') type = 'string'\n else if (innerType === 'ZodNumber') type = 'number'\n else if (innerType === 'ZodBoolean') type = 'boolean'\n\n const typeName: string = def?.typeName ?? ''\n const isOptional = typeName === 'ZodOptional' || typeName === 'ZodNullable'\n const hasDefault = typeName === 'ZodDefault'\n const required = !isOptional && !hasDefault\n\n let defaultValue: unknown = undefined\n if (hasDefault) {\n defaultValue = def.defaultValue?.()\n }\n\n const description = fieldSchema.description ?? undefined\n\n fields.push({\n key,\n type,\n required,\n description,\n defaultValue,\n currentValue: stored[key],\n })\n }\n\n return fields\n }\n\n /**\n * Validate and set a single configuration key.\n * Handles coercion from string values (for CLI/UI text inputs).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod requires any for generic ZodObject\n async setWithValidation(key: string, value: unknown, schema: z.ZodObject<any>): Promise<SetResult> {\n const shape = schema.shape as Record<string, z.ZodTypeAny>\n const fieldSchema = shape[key]\n\n if (!fieldSchema) {\n return { success: false, error: `Key \"${key}\" not found in configuration schema` }\n }\n\n // Coerce string values to the expected type\n const coerced = typeof value === 'string' ? coerceConfigValue(value, fieldSchema) : value\n\n const result = fieldSchema.safeParse(coerced)\n if (!result.success) {\n const messages = result.error.issues.map((i) => i.message)\n return { success: false, error: messages.join('; ') }\n }\n\n await this.set(key, result.data)\n return { success: true, data: result.data }\n }\n}\n",
|
|
54
|
+
"import type { z } from '@botpress/sdk'\n\n/**\n * Coerce a string value from CLI/terminal input to the type expected by a Zod field schema.\n *\n * CLI arguments and text inputs are always strings, but config schemas may expect\n * numbers, booleans, etc. This function inspects the Zod schema's type and converts\n * the raw string accordingly.\n *\n * Returns the coerced value, or the original string if the type is unknown or unsupported\n * (letting Zod validation catch any remaining mismatches).\n */\nexport function coerceConfigValue(value: string, fieldSchema: z.ZodTypeAny): unknown {\n const typeName = getInnerTypeName(fieldSchema)\n\n switch (typeName) {\n case 'ZodNumber': {\n const num = Number(value)\n if (Number.isNaN(num)) {\n return value\n }\n return num\n }\n\n case 'ZodBoolean': {\n const lower = value.toLowerCase()\n if (lower === 'true' || lower === '1' || lower === 'yes') {\n return true\n }\n if (lower === 'false' || lower === '0' || lower === 'no') {\n return false\n }\n return value\n }\n\n default:\n return value\n }\n}\n\n/**\n * Unwrap optional/default/nullable wrappers to get the inner type name.\n * e.g. z.number().optional() has typeName 'ZodOptional' but the inner type is 'ZodNumber'.\n */\nexport function getInnerTypeName(schema: z.ZodTypeAny): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- accessing internal Zod _def property\n const def = (schema as any)?._def\n if (!def) {\n return 'unknown'\n }\n\n const typeName: string = def.typeName ?? 'unknown'\n\n if ((typeName === 'ZodOptional' || typeName === 'ZodNullable' || typeName === 'ZodDefault') && def.innerType) {\n return getInnerTypeName(def.innerType)\n }\n\n return typeName\n}\n",
|
|
55
|
+
"import * as fs from 'fs'\nimport * as path from 'path'\nimport { fileURLToPath } from 'url'\nimport { createRequire } from 'module'\nimport { formatCode } from '../generators/utils.js'\n// @ts-expect-error - Bun import attribute for text\nimport aiAssistantInstructions from './ai-assistant-instructions.template.md' with { type: 'text' }\n\n// This constant is injected at build time by esbuild's define\ndeclare const __RUNTIME_VERSION__: string\n\n// File extensions treated as text (placeholder substitution + formatting applied).\n// Everything else is copied as binary with no transformation.\nconst TEXT_EXTENSIONS = new Set([\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.json',\n '.md',\n '.txt',\n '.yml',\n '.yaml',\n '.html',\n '.css',\n '.svg',\n '.gitignore',\n])\n\nfunction isTextFile(filename: string): boolean {\n // .gitignore has no extension but is text\n if (filename === '.gitignore') return true\n const ext = path.extname(filename).toLowerCase()\n return TEXT_EXTENSIONS.has(ext)\n}\n\nexport interface TemplateConfig {\n name: string\n description: string\n category: string\n integrations: string[]\n primitives: string[]\n complexity: 'beginner' | 'intermediate' | 'advanced'\n inspired_by?: string\n postInit?: string[]\n}\n\nexport interface TemplateRegistry {\n templates: TemplateConfig[]\n}\n\nexport class AgentProjectGenerator {\n private projectPath: string\n private projectName: string\n private packageManager: string\n private template: string\n\n constructor(projectPath: string, packageManager: string = 'bun', template: string = 'blank') {\n this.projectPath = path.resolve(projectPath)\n this.projectName = path.basename(this.projectPath)\n this.packageManager = packageManager\n this.template = template\n }\n\n async generate(): Promise<void> {\n this.ensureEmptyDirectory()\n\n const templateDir = this.resolveTemplateDir()\n await this.copyTemplateFiles(templateDir)\n\n // Only create these if the template didn't provide them\n if (!fs.existsSync(path.join(this.projectPath, 'agent.json'))) {\n this.createAgentJson()\n }\n if (!fs.existsSync(path.join(this.projectPath, 'CLAUDE.md'))) {\n this.createAIAssistantInstructions()\n }\n }\n\n /**\n * Returns the list of available templates from the registry.\n */\n static getAvailableTemplates(): TemplateConfig[] {\n try {\n const templatesRoot = AgentProjectGenerator.getTemplatesRoot()\n const configPath = path.join(templatesRoot, 'template.config.json')\n\n if (!fs.existsSync(configPath)) {\n return []\n }\n\n const raw = fs.readFileSync(configPath, 'utf-8')\n const registry: TemplateRegistry = JSON.parse(raw)\n return registry.templates\n } catch {\n // getTemplatesRoot throws if no candidates found — that's expected\n // when templates haven't been extracted yet (compiled binary first run)\n return []\n }\n }\n\n /**\n * Returns the postInit commands for the current template, if any.\n * These run after scaffolding to install integrations at their latest versions.\n */\n getPostInitCommands(): string[] {\n const templates = AgentProjectGenerator.getAvailableTemplates()\n const config = templates.find((t) => t.name === this.template)\n return config?.postInit ?? []\n }\n\n /**\n * Optional external templates provider. When set (e.g., by the CLI from embedded assets),\n * this is used as the templates root instead of filesystem resolution.\n */\n private static _templatesRootOverride: string | null = null\n\n static setTemplatesRoot(dir: string): void {\n AgentProjectGenerator._templatesRootOverride = dir\n }\n\n private static getTemplatesRoot(): string {\n // If an override was set (e.g., CLI extracted templates from embedded assets), use it\n if (AgentProjectGenerator._templatesRootOverride) {\n return AgentProjectGenerator._templatesRootOverride\n }\n\n // Strategy: find the @botpress/adk package root, then look for templates/\n // This works regardless of where the code is bundled (CLI dist, ADK dist, etc.)\n const candidates: string[] = []\n\n // 1. Resolve from @botpress/adk package.json location (ESM-compatible)\n try {\n const esmRequire = createRequire(import.meta.url)\n const adkPkgPath = esmRequire.resolve('@botpress/adk/package.json')\n const adkRoot = path.dirname(adkPkgPath)\n candidates.push(path.join(adkRoot, 'dist', 'templates'))\n candidates.push(path.join(adkRoot, 'templates'))\n } catch {\n // Not resolvable via require.resolve (e.g., running from source or compiled binary)\n }\n\n // 2. Relative to this file (works when running ADK directly)\n const thisDir = path.dirname(fileURLToPath(import.meta.url))\n candidates.push(path.resolve(thisDir, 'templates'))\n candidates.push(path.resolve(thisDir, '../../templates'))\n\n // 3. Relative to process.execPath (compiled binary with templates alongside)\n candidates.push(path.join(path.dirname(process.execPath), 'templates'))\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate) && fs.existsSync(path.join(candidate, 'template.config.json'))) {\n return candidate\n }\n }\n\n const tried = candidates.map((c) => ` - ${c}`).join('\\n')\n throw new Error(\n `Could not find templates directory.\\n\\nSearched:\\n${tried}\\n\\nEnsure the ADK package is properly installed or run the CLI build.`\n )\n }\n\n private resolveTemplateDir(): string {\n const templatesRoot = AgentProjectGenerator.getTemplatesRoot()\n const templateDir = path.join(templatesRoot, this.template)\n\n if (!fs.existsSync(templateDir)) {\n const available = AgentProjectGenerator.getAvailableTemplates()\n const names = available.map((t) => ` - ${t.name}: ${t.description}`).join('\\n')\n throw new Error(`Unknown template: \"${this.template}\"\\n\\nAvailable templates:\\n${names || ' (none found)'}`)\n }\n\n // Verify template has at least an agent.config.ts\n const configFile = path.join(templateDir, 'agent.config.ts')\n if (!fs.existsSync(configFile)) {\n throw new Error(`Template \"${this.template}\" is missing agent.config.ts`)\n }\n\n return templateDir\n }\n\n private async copyTemplateFiles(templateDir: string): Promise<void> {\n const substitutions: Record<string, string> = {\n '{{projectName}}': this.projectName,\n '{{runtimeVersion}}': __RUNTIME_VERSION__,\n '{{packageManager}}': this.packageManager,\n }\n\n await this.copyDirRecursive(templateDir, this.projectPath, substitutions)\n }\n\n private async copyDirRecursive(src: string, dest: string, substitutions: Record<string, string>): Promise<void> {\n if (!fs.existsSync(dest)) {\n fs.mkdirSync(dest, { recursive: true })\n }\n\n const entries = fs.readdirSync(src, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n\n if (entry.isDirectory()) {\n await this.copyDirRecursive(srcPath, destPath, substitutions)\n } else if (isTextFile(entry.name)) {\n // Text files: read as utf-8, apply substitutions, optionally format\n let content = fs.readFileSync(srcPath, 'utf-8')\n\n for (const [placeholder, value] of Object.entries(substitutions)) {\n content = content.replaceAll(placeholder, value)\n }\n\n // Warn if any unresolved placeholders remain\n const remaining = content.match(/\\{\\{[a-zA-Z]+\\}\\}/g)\n if (remaining) {\n console.warn(`Warning: unresolved placeholders in ${entry.name}: ${remaining.join(', ')}`)\n }\n\n // Format TypeScript files (non-fatal: fall back to unformatted on error)\n if (entry.name.endsWith('.ts') || entry.name.endsWith('.tsx')) {\n try {\n content = await formatCode(content, destPath)\n } catch {\n // Formatter unavailable or syntax issue — write unformatted\n }\n }\n\n fs.writeFileSync(destPath, content)\n } else {\n // Binary files: copy as-is with no transformation\n fs.copyFileSync(srcPath, destPath)\n }\n }\n }\n\n private ensureEmptyDirectory(): void {\n if (!fs.existsSync(this.projectPath)) {\n fs.mkdirSync(this.projectPath, { recursive: true })\n }\n\n const files = fs.readdirSync(this.projectPath)\n if (files.length > 0) {\n throw new Error(`Directory ${this.projectPath} is not empty. Please use an empty directory.`)\n }\n }\n\n private createAgentJson(): void {\n const agentJson = {}\n this.writeJsonFile('agent.json', agentJson)\n }\n\n private createAIAssistantInstructions(): void {\n const content = aiAssistantInstructions as string\n this.writeFile('CLAUDE.md', content)\n this.writeFile('AGENTS.md', content)\n }\n\n private writeFile(relativePath: string, content: string): void {\n const filePath = path.join(this.projectPath, relativePath)\n fs.writeFileSync(filePath, content)\n }\n\n private writeJsonFile(relativePath: string, data: unknown): void {\n this.writeFile(relativePath, JSON.stringify(data, null, 2) + '\\n')\n }\n}\n",
|
|
56
56
|
"import fs from 'fs/promises'\nimport path from 'path'\nimport os from 'os'\nimport { PluginDefinition } from './types.js'\n\ninterface VersionResolution {\n pluginId: string\n updatedAt: string\n cachedAt: string\n}\n\ninterface CachedDefinition {\n definition: PluginDefinition\n cachedAt: string\n}\n\nexport class EnhancedPluginCache {\n private cacheDir: string\n private resolutionsDir: string\n private definitionsDir: string\n private noCache: boolean\n\n constructor(noCache: boolean = false) {\n this.noCache = noCache\n this.cacheDir = path.join(os.homedir(), '.adk', 'cache', 'plugins')\n this.resolutionsDir = path.join(this.cacheDir, 'resolutions')\n this.definitionsDir = path.join(this.cacheDir, 'definitions')\n }\n\n private async ensureCacheDirs(): Promise<void> {\n await fs.mkdir(this.resolutionsDir, { recursive: true })\n await fs.mkdir(this.definitionsDir, { recursive: true })\n }\n\n /**\n * Get version resolution from cache (name@version → pluginId + updatedAt)\n * Returns null if cache miss or expired (5 minutes)\n */\n async getResolution(name: string, version: string): Promise<VersionResolution | null> {\n if (this.noCache) {\n return null\n }\n\n try {\n const key = this.getResolutionKey(name, version)\n const cachePath = path.join(this.resolutionsDir, `${key}.json`)\n\n const data = await fs.readFile(cachePath, 'utf-8')\n const resolution: VersionResolution = JSON.parse(data)\n\n // Check if cache is expired (5 minutes)\n const cachedAt = new Date(resolution.cachedAt)\n const now = new Date()\n const ageMinutes = (now.getTime() - cachedAt.getTime()) / (1000 * 60)\n\n if (ageMinutes > 5) {\n return null\n }\n\n return resolution\n } catch {\n return null\n }\n }\n\n /**\n * Cache version resolution (name@version → pluginId + updatedAt)\n */\n async setResolution(name: string, version: string, pluginId: string, updatedAt: string): Promise<void> {\n await this.ensureCacheDirs()\n\n const key = this.getResolutionKey(name, version)\n const cachePath = path.join(this.resolutionsDir, `${key}.json`)\n\n const resolution: VersionResolution = {\n pluginId,\n updatedAt,\n cachedAt: new Date().toISOString(),\n }\n\n await fs.writeFile(cachePath, JSON.stringify(resolution, null, 2))\n }\n\n /**\n * Get plugin definition from cache (pluginId + updatedAt → definition)\n * Never expires for same pluginId + updatedAt (immutable)\n */\n async getDefinition(pluginId: string, updatedAt: string): Promise<PluginDefinition | null> {\n if (this.noCache) {\n return null\n }\n\n try {\n const key = this.getDefinitionKey(pluginId, updatedAt)\n const cachePath = path.join(this.definitionsDir, `${key}.json`)\n\n const data = await fs.readFile(cachePath, 'utf-8')\n const cached: CachedDefinition = JSON.parse(data)\n\n return cached.definition\n } catch {\n return null\n }\n }\n\n /**\n * Cache plugin definition (pluginId + updatedAt → definition)\n */\n async setDefinition(pluginId: string, updatedAt: string, definition: PluginDefinition): Promise<void> {\n await this.ensureCacheDirs()\n\n const key = this.getDefinitionKey(pluginId, updatedAt)\n const cachePath = path.join(this.definitionsDir, `${key}.json`)\n\n const cached: CachedDefinition = {\n definition,\n cachedAt: new Date().toISOString(),\n }\n\n await fs.writeFile(cachePath, JSON.stringify(cached, null, 2))\n }\n\n /**\n * Clear all caches\n */\n async clear(): Promise<void> {\n try {\n const resolutionFiles = await fs.readdir(this.resolutionsDir)\n await Promise.all(resolutionFiles.map((file) => fs.unlink(path.join(this.resolutionsDir, file))))\n\n const definitionFiles = await fs.readdir(this.definitionsDir)\n await Promise.all(definitionFiles.map((file) => fs.unlink(path.join(this.definitionsDir, file))))\n } catch {\n // Ignore errors if directories don't exist\n }\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<{\n resolutions: { count: number; sizeBytes: number }\n definitions: { count: number; sizeBytes: number }\n }> {\n const getDirectoryStats = async (dir: string) => {\n try {\n const files = await fs.readdir(dir)\n let totalSize = 0\n\n for (const file of files) {\n const stats = await fs.stat(path.join(dir, file))\n totalSize += stats.size\n }\n\n return {\n count: files.length,\n sizeBytes: totalSize,\n }\n } catch {\n return { count: 0, sizeBytes: 0 }\n }\n }\n\n const [resolutions, definitions] = await Promise.all([\n getDirectoryStats(this.resolutionsDir),\n getDirectoryStats(this.definitionsDir),\n ])\n\n return { resolutions, definitions }\n }\n\n private getResolutionKey(name: string, version: string): string {\n const key = `${name}_${version}`\n return key.replace(/[^a-zA-Z0-9_-]/g, '_')\n }\n\n private getDefinitionKey(pluginId: string, updatedAt: string): string {\n const key = `${pluginId}_${updatedAt}`\n return key.replace(/[^a-zA-Z0-9_-]/g, '_')\n }\n}\n",
|
|
57
|
-
"import { Client } from '@botpress/client'\nimport { auth, Credentials } from '../auth/index.js'\nimport { Dependencies, ValidationError } from '../agent-project/types.js'\nimport { PluginDefinition, PluginRef, ParsedPlugin } from './types.js'\nimport { EnhancedPluginCache } from './enhanced-cache.js'\nimport { PluginParser } from '../agent-project/dependencies-parser.js'\nimport { ValidationErrors } from '../agent-project/validation-errors.js'\n\nexport interface PluginManagerOptions {\n noCache?: boolean\n workspaceId?: string\n credentials?: Credentials\n}\n\nexport class PluginManager {\n private cache: EnhancedPluginCache\n private options: PluginManagerOptions\n private client?: Client\n\n constructor(options: PluginManagerOptions = {}) {\n this.options = options\n this.cache = new EnhancedPluginCache(options.noCache || false)\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = this.options.credentials || (await auth.getActiveCredentials())\n\n if (!this.options.workspaceId && !credentials.workspaceId) {\n throw new Error('No workspace ID found in current profile. Please login again with \"adk login\"')\n }\n\n const workspaceId = this.options.workspaceId || credentials.workspaceId\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n /**\n * Load and validate all plugins from dependencies\n */\n async loadPlugins(dependencies: Dependencies): Promise<{\n plugins: ParsedPlugin[]\n errors: ValidationError[]\n warnings: ValidationError[]\n }> {\n const errors: ValidationError[] = []\n const warnings: ValidationError[] = []\n\n // Parse plugins from dependencies\n const parseResult = PluginParser.parsePlugins(dependencies)\n const plugins = parseResult.plugins\n errors.push(...parseResult.errors)\n\n // Check for duplicates\n const duplicateWarnings = PluginParser.checkDuplicates(plugins)\n warnings.push(...duplicateWarnings)\n\n // Fetch plugin definitions in parallel\n const fetchPromises = plugins.map(async (plugin) => {\n try {\n plugin.definition = await this.fetchPlugin(plugin.ref)\n } catch (error) {\n if (error instanceof Error && error.message.includes('version')) {\n errors.push(ValidationErrors.pluginVersionError(plugin.alias, error.message))\n } else {\n const errorMessage = error instanceof Error ? error.message : undefined\n errors.push(ValidationErrors.unknownPlugin(plugin.alias, plugin.ref.fullName, errorMessage))\n }\n }\n })\n\n await Promise.all(fetchPromises)\n\n return { plugins, errors, warnings }\n }\n\n /**\n * Fetch plugin definition from API or cache (public Hub only)\n */\n public async fetchPlugin(ref: PluginRef): Promise<PluginDefinition> {\n // Level 1: Check version resolution cache\n const cachedResolution = await this.cache.getResolution(ref.name, ref.version)\n\n if (cachedResolution) {\n // Level 2: Check definition cache\n const cachedDefinition = await this.cache.getDefinition(cachedResolution.pluginId, cachedResolution.updatedAt)\n\n if (cachedDefinition) {\n return cachedDefinition\n }\n }\n\n // No cache hit, fetch from API\n const client = await this.getClient()\n const plugin = await this._findPublicPlugin(client, ref)\n\n if (!plugin) {\n throw new Error(`Plugin \"${ref.name}\" not found on the Botpress Hub`)\n }\n\n // Cache Level 1: Version resolution\n await this.cache.setResolution(ref.name, ref.version, plugin.id, plugin.updatedAt)\n\n // Cache Level 2: Definition\n await this.cache.setDefinition(plugin.id, plugin.updatedAt, plugin)\n\n return plugin\n }\n\n /**\n * Find public plugin on the Botpress Hub\n */\n private async _findPublicPlugin(client: Client, ref: PluginRef): Promise<PluginDefinition | undefined> {\n try {\n const response = await client.getPublicPlugin({\n name: ref.name,\n version: ref.version,\n })\n return response.plugin\n } catch (error) {\n if (this._isResourceNotFoundError(error)) {\n return undefined\n }\n throw error\n }\n }\n\n private _isResourceNotFoundError(error: unknown): boolean {\n if (error && typeof error === 'object' && 'type' in error) {\n return (error as
|
|
58
|
-
"import { createFile } from '../utils/fs.js'\nimport { defaultAdkFolder } from '../const.js'\nimport path from 'path'\nimport { AssetsManager, AssetsCacheManager } from '../assets/index.js'\n\nexport async function generateAssetsTypes(projectPath: string): Promise<void> {\n const assetsManager = new AssetsManager({ projectPath })\n\n // Generate TypeScript types for assets\n const typesCode = await assetsManager.generateTypes()\n\n // Write to the types directory\n const typesPath = path.join(projectPath, defaultAdkFolder, 'assets.d.ts')\n await createFile(typesPath, typesCode)\n}\n\nexport async function generateAssetsRuntime(projectPath: string, botId?: string, workspaceId?: string): Promise<void> {\n const assetsManager = new AssetsManager({ projectPath, botId, workspaceId })\n\n // Get enriched assets with remote metadata when available\n const enrichedAssets = await assetsManager.getEnrichedLocalAssets()\n\n // Generate hardcoded asset metadata\n const assetsMap: Record<string,
|
|
59
|
-
"import { transforms } from '@botpress/sdk'\nimport crypto from 'crypto'\nimport path from 'path'\n\nimport { ParsedIntegration } from '../integrations/types.js'\nimport { pascalCase, snakeCase } from '../utils/strings.js'\nimport { ADK_VERSION, relative, toMultilineComment, formatCode } from './utils.js'\nimport { getIntegrationAlias } from '../utils/ids.js'\n\nconst getIntegrationHash = (integration: ParsedIntegration): string => {\n return crypto\n .createHash('sha256')\n .update(\n `${integration.alias}|${integration.definition?.id}|${integration.definition?.version}|${integration.definition?.updatedAt}`\n )\n .digest('hex')\n}\n\nconst getPascalAlias = (integration: ParsedIntegration) => pascalCase(getIntegrationAlias(integration.alias))\n\nconst getIntegrationNames = (integration: ParsedIntegration) => ({\n typings: {\n index: `Integration_All_${getPascalAlias(integration)}`,\n actions: `Integration_Actions_${getPascalAlias(integration)}`,\n channels: `Integration_Channels_${getPascalAlias(integration)}`,\n events: `Integration_Events_${getPascalAlias(integration)}`,\n users: `Integration_Users_${getPascalAlias(integration)}`,\n configurations: `Integration_Configurations_${getPascalAlias(integration)}`,\n },\n paths: {\n index: path.join(snakeCase(getPascalAlias(integration)), `index.ts`),\n actions: path.join(snakeCase(getPascalAlias(integration)), `actions.ts`),\n channels: path.join(snakeCase(getPascalAlias(integration)), `channels.ts`),\n events: path.join(snakeCase(getPascalAlias(integration)), `events.ts`),\n users: path.join(snakeCase(getPascalAlias(integration)), `users.ts`),\n configurations: path.join(snakeCase(getPascalAlias(integration)), `configurations.ts`),\n },\n})\n\nexport async function generateIntegrationTypes(integration: ParsedIntegration): Promise<{\n names: ReturnType<typeof getIntegrationNames>\n files: Record<string, string>\n}> {\n const names = getIntegrationNames(integration)\n const hash = getIntegrationHash(integration)\n\n const rel = (to: string): string => {\n const from = names.paths.index\n return relative(from, to).replace(/\\.ts$/i, '')\n }\n\n let tIndex = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition?.name}\n // Version: ${integration.definition?.version}\n // File: ${names.paths.index}\n // Hash: ${hash}\n // Updated at: ${integration.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n import { Integration_Actions_${getPascalAlias(integration)} } from \"${rel(names.paths.actions)}\";\n import { Integration_Channels_${getPascalAlias(integration)} } from \"${rel(names.paths.channels)}\";\n import { Integration_Events_${getPascalAlias(integration)} } from \"${rel(names.paths.events)}\";\n import { Integration_Users_${getPascalAlias(integration)} } from \"${rel(names.paths.users)}\";\n import { Integration_Configurations_${getPascalAlias(integration)} } from \"${rel(names.paths.configurations)}\";\n\n export * from \"${rel(names.paths.actions)}\";\n export * from \"${rel(names.paths.channels)}\";\n export * from \"${rel(names.paths.events)}\";\n export * from \"${rel(names.paths.users)}\";\n export * from \"${rel(names.paths.configurations)}\";\n\n export type Integration_All_${getPascalAlias(integration)} = {\n actions: Integration_Actions_${getPascalAlias(integration)};\n channels: Integration_Channels_${getPascalAlias(integration)};\n events: Integration_Events_${getPascalAlias(integration)};\n users: Integration_Users_${getPascalAlias(integration)};\n configurations: Integration_Configurations_${getPascalAlias(integration)};\n };\n `\n\n let tActions = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition?.name}\n // Version: ${integration.definition?.version}\n // File: ${names.paths.actions}\n // Hash: ${hash}\n // Updated at: ${integration.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type Integration_Actions_${getPascalAlias(integration)} = {`\n\n for (const [name, action] of Object.entries(integration.definition!.actions)) {\n const input = transforms.fromJSONSchema(action.input.schema).toTypescriptType()\n const output = transforms.fromJSONSchema(action.output.schema).toTypescriptType()\n\n tActions += `\n ${toMultilineComment(`Title: ${action.title || name}\\nDescription: ${action.description || 'No description'}`)}\n \"${name}\": {\n input: ${input};\n output: ${output};\n },\\n`\n }\n\n tActions += `};`\n\n let tChannels = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition?.name}\n // Version: ${integration.definition?.version}\n // File: ${names.paths.channels}\n // Hash: ${hash}\n // Updated at: ${integration.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type Integration_Channels_${getPascalAlias(integration)} = {`\n\n for (const [channelName, channelDef] of Object.entries(integration.definition?.channels || {})) {\n const convoTagsRecord =\n '{' +\n Object.keys(channelDef.conversation?.tags || {}).reduce((acc, t) => {\n const tag = channelDef.conversation.tags[t]!\n const comment = toMultilineComment(`Title: ${tag?.title}\\nDescription: ${tag.description}`)\n // Use alias instead of ref.fullName since the API returns tags with the alias prefix\n acc += `${comment}\\n[\"${integration.alias}:${t}\"]?: string,\\n`\n return acc\n }, '') +\n '}'\n\n const msgTagsUnion =\n '{' +\n Object.keys(channelDef.message?.tags || {}).reduce((acc, t) => {\n const tag = channelDef.message.tags[t]!\n const comment = toMultilineComment(`Title: ${tag?.title}\\nDescription: ${tag.description}`)\n // Use alias instead of ref.fullName since the API returns tags with the alias prefix\n acc += `${comment}\\n[\"${integration.alias}:${t}\"]?: string,\\n`\n return acc\n }, '') +\n '}'\n\n let messagesBlock = ''\n for (const [messageName, messageDef] of Object.entries(channelDef.messages || {})) {\n const messageType = transforms.fromJSONSchema(messageDef.schema).toTypescriptType()\n messagesBlock += `\\n\"${messageName}\": ${messageType};\\n`\n }\n\n tChannels += `\n ${toMultilineComment(\n `Title: ${channelDef.title || channelName}\\nDescription: ${channelDef.description || 'No description'}`\n )}\n \"${channelName}\": {\n conversation: {\n tags: ${convoTagsRecord};\n };\n message: {\n tags: ${msgTagsUnion};\n };\n messages: {${messagesBlock}\n };\n },`\n }\n\n tChannels += `\n };\n `\n\n let tEvents = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition!.name}\n // Version: ${integration.definition!.version}\n // File: ${names.paths.events}\n // Hash: ${hash}\n // Updated at: ${integration.definition!.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type Integration_Events_${getPascalAlias(integration)} = {`\n\n for (const [eventName, event] of Object.entries(integration.definition!.events || {})) {\n const payloadType = transforms.fromJSONSchema(event.schema).toTypescriptType()\n const attributesComment = Object.keys(event.attributes || {}).length\n ? `\\nAttributes:\\n${Object.entries(event.attributes!)\n .map(([k, v]) => ` - ${k}: ${v}`)\n .join('\\n')}`.trim()\n : ''\n\n tEvents += `\n ${toMultilineComment(\n `Title: ${event.title || eventName}\\nDescription: ${event.description || 'No description'}${attributesComment}`\n )}\n \"${eventName}\": ${payloadType};\n `\n }\n\n tEvents += `\n };\n `\n\n let tUsers = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition?.name}\n // Version: ${integration.definition?.version}\n // File: ${names.paths.users}\n // Hash: ${hash}\n // Updated at: ${integration.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type Integration_Users_${getPascalAlias(integration)} = {`\n\n const userTagKeys = Object.keys(integration.definition?.user?.tags || {})\n const userTagsUnion = userTagKeys.length\n ? userTagKeys\n .map((t) => {\n const tag = (integration.definition?.user!.tags ?? ({} as any))[t]!\n const comment = toMultilineComment(`Title: ${tag?.title}\\nDescription: ${tag?.description}`)\n // Use alias instead of ref.fullName since the API returns tags with the alias prefix\n return `${comment}\\n\"${integration.alias}:${t}\"\\n`\n })\n .join(' | ')\n : 'never'\n\n tUsers += `\n tags: ${userTagsUnion};\n };\n `\n\n // Generate configurations map type with JSDoc comments\n let tConfigurations = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition?.name}\n // Version: ${integration.definition?.version}\n // File: ${names.paths.configurations}\n // Hash: ${hash}\n // Updated at: ${integration.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type Integration_Configurations_${getPascalAlias(integration)} = `\n\n const configEntries: string[] = []\n\n // Add \"default\" configuration from .configuration if it exists\n if (integration.definition?.configuration) {\n const defaultConfig = integration.definition.configuration as any\n const title = defaultConfig.title || 'Default'\n const description = defaultConfig.description || 'Default configuration'\n const schema = defaultConfig.schema\n\n let tsType = '{}'\n if (schema) {\n tsType = transforms.fromJSONSchema(schema).toTypescriptType()\n }\n\n // Build JSDoc comment\n const jsdocLines: string[] = ['/**']\n jsdocLines.push(` * @title ${title}`)\n if (description) {\n jsdocLines.push(` * ${description}`)\n }\n jsdocLines.push(' */')\n\n configEntries.push(`${jsdocLines.join('\\n ')}\\n default: ${tsType}`)\n }\n\n // Add configurations from .configurations\n if (integration.definition?.configurations) {\n for (const [key, config] of Object.entries(integration.definition.configurations)) {\n const title = (config as any).title || key\n const description = (config as any).description || ''\n const schema = (config as any).schema\n\n let tsType = '{}'\n if (schema) {\n tsType = transforms.fromJSONSchema(schema).toTypescriptType()\n }\n\n // Build JSDoc comment\n const jsdocLines: string[] = ['/**']\n jsdocLines.push(` * @title ${title}`)\n if (description) {\n jsdocLines.push(` * ${description}`)\n }\n jsdocLines.push(' */')\n\n configEntries.push(`${jsdocLines.join('\\n ')}\\n ${key}: ${tsType}`)\n }\n }\n\n if (configEntries.length > 0) {\n tConfigurations += `{\n ${configEntries.join(';\\n ')};\n};`\n } else {\n tConfigurations += `Record<string, never>;`\n }\n\n return {\n names,\n files: {\n [names.paths.index]: await formatCode(tIndex),\n [names.paths.actions]: await formatCode(tActions),\n [names.paths.channels]: await formatCode(tChannels),\n [names.paths.events]: await formatCode(tEvents),\n [names.paths.users]: await formatCode(tUsers),\n [names.paths.configurations]: await formatCode(tConfigurations),\n },\n }\n}\n",
|
|
57
|
+
"import { Client } from '@botpress/client'\nimport { auth, Credentials } from '../auth/index.js'\nimport { Dependencies, ValidationError } from '../agent-project/types.js'\nimport { PluginDefinition, PluginRef, ParsedPlugin } from './types.js'\nimport { EnhancedPluginCache } from './enhanced-cache.js'\nimport { PluginParser } from '../agent-project/dependencies-parser.js'\nimport { ValidationErrors } from '../agent-project/validation-errors.js'\n\nexport interface PluginManagerOptions {\n noCache?: boolean\n workspaceId?: string\n credentials?: Credentials\n}\n\nexport class PluginManager {\n private cache: EnhancedPluginCache\n private options: PluginManagerOptions\n private client?: Client\n\n constructor(options: PluginManagerOptions = {}) {\n this.options = options\n this.cache = new EnhancedPluginCache(options.noCache || false)\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = this.options.credentials || (await auth.getActiveCredentials())\n\n if (!this.options.workspaceId && !credentials.workspaceId) {\n throw new Error('No workspace ID found in current profile. Please login again with \"adk login\"')\n }\n\n const workspaceId = this.options.workspaceId || credentials.workspaceId\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n /**\n * Load and validate all plugins from dependencies\n */\n async loadPlugins(dependencies: Dependencies): Promise<{\n plugins: ParsedPlugin[]\n errors: ValidationError[]\n warnings: ValidationError[]\n }> {\n const errors: ValidationError[] = []\n const warnings: ValidationError[] = []\n\n // Parse plugins from dependencies\n const parseResult = PluginParser.parsePlugins(dependencies)\n const plugins = parseResult.plugins\n errors.push(...parseResult.errors)\n\n // Check for duplicates\n const duplicateWarnings = PluginParser.checkDuplicates(plugins)\n warnings.push(...duplicateWarnings)\n\n // Fetch plugin definitions in parallel\n const fetchPromises = plugins.map(async (plugin) => {\n try {\n plugin.definition = await this.fetchPlugin(plugin.ref)\n } catch (error) {\n if (error instanceof Error && error.message.includes('version')) {\n errors.push(ValidationErrors.pluginVersionError(plugin.alias, error.message))\n } else {\n const errorMessage = error instanceof Error ? error.message : undefined\n errors.push(ValidationErrors.unknownPlugin(plugin.alias, plugin.ref.fullName, errorMessage))\n }\n }\n })\n\n await Promise.all(fetchPromises)\n\n return { plugins, errors, warnings }\n }\n\n /**\n * Fetch plugin definition from API or cache (public Hub only)\n */\n public async fetchPlugin(ref: PluginRef): Promise<PluginDefinition> {\n // Level 1: Check version resolution cache\n const cachedResolution = await this.cache.getResolution(ref.name, ref.version)\n\n if (cachedResolution) {\n // Level 2: Check definition cache\n const cachedDefinition = await this.cache.getDefinition(cachedResolution.pluginId, cachedResolution.updatedAt)\n\n if (cachedDefinition) {\n return cachedDefinition\n }\n }\n\n // No cache hit, fetch from API\n const client = await this.getClient()\n const plugin = await this._findPublicPlugin(client, ref)\n\n if (!plugin) {\n throw new Error(`Plugin \"${ref.name}\" not found on the Botpress Hub`)\n }\n\n // Cache Level 1: Version resolution\n await this.cache.setResolution(ref.name, ref.version, plugin.id, plugin.updatedAt)\n\n // Cache Level 2: Definition\n await this.cache.setDefinition(plugin.id, plugin.updatedAt, plugin)\n\n return plugin\n }\n\n /**\n * Find public plugin on the Botpress Hub\n */\n private async _findPublicPlugin(client: Client, ref: PluginRef): Promise<PluginDefinition | undefined> {\n try {\n const response = await client.getPublicPlugin({\n name: ref.name,\n version: ref.version,\n })\n return response.plugin\n } catch (error) {\n if (this._isResourceNotFoundError(error)) {\n return undefined\n }\n throw error\n }\n }\n\n private _isResourceNotFoundError(error: unknown): boolean {\n if (error && typeof error === 'object' && 'type' in error) {\n return (error as { type: unknown }).type === 'ResourceNotFound'\n }\n return false\n }\n\n /**\n * Get cache statistics\n */\n async getCacheStats(): Promise<{ count: number; sizeBytes: number }> {\n const stats = await this.cache.getStats()\n return {\n count: stats.resolutions.count + stats.definitions.count,\n sizeBytes: stats.resolutions.sizeBytes + stats.definitions.sizeBytes,\n }\n }\n\n /**\n * Clear plugin cache\n */\n async clearCache(): Promise<void> {\n await this.cache.clear()\n }\n}\n",
|
|
58
|
+
"import { createFile } from '../utils/fs.js'\nimport { defaultAdkFolder } from '../const.js'\nimport path from 'path'\nimport { AssetsManager, AssetsCacheManager } from '../assets/index.js'\n\nexport async function generateAssetsTypes(projectPath: string): Promise<void> {\n const assetsManager = new AssetsManager({ projectPath })\n\n // Generate TypeScript types for assets\n const typesCode = await assetsManager.generateTypes()\n\n // Write to the types directory\n const typesPath = path.join(projectPath, defaultAdkFolder, 'assets.d.ts')\n await createFile(typesPath, typesCode)\n}\n\nexport async function generateAssetsRuntime(projectPath: string, botId?: string, workspaceId?: string): Promise<void> {\n const assetsManager = new AssetsManager({ projectPath, botId, workspaceId })\n\n // Get enriched assets with remote metadata when available\n const enrichedAssets = await assetsManager.getEnrichedLocalAssets()\n\n // Generate hardcoded asset metadata\n const assetsMap: Record<string, unknown> = {}\n const localHashesMap: Record<string, string> = {}\n\n // Read cache to get local hashes\n const cacheManager = new AssetsCacheManager(projectPath)\n const cache = await cacheManager.load()\n\n for (const asset of enrichedAssets) {\n assetsMap[asset.path] = asset\n const cacheEntry = cache.entries[asset.path]\n if (cacheEntry) {\n localHashesMap[asset.path] = cacheEntry.localHash\n }\n }\n\n // Generate minimal runtime code that only exports metadata\n const runtimeCode = `\n// Auto-generated assets metadata\nimport { Asset, initAssets } from '@botpress/runtime/runtime';\n\n// Static asset metadata (populated at build time)\nexport const assetsMetadata: Record<string, Asset> = ${JSON.stringify(assetsMap, null, 2)};\n\n// Local hashes from cache\nexport const localHashes: Record<string, string> = ${JSON.stringify(localHashesMap, null, 2)};\n\n// Initialize the assets runtime with metadata and local hashes\n// The global object should be passed by the agent initialization code\nexport function initializeAssets(globalObj: any = globalThis) {\n initAssets(globalObj, assetsMetadata, localHashes);\n}\n\n// Auto-initialize if running in a supported environment\nif (typeof globalThis !== 'undefined') {\n initializeAssets(globalThis);\n} else if (typeof global !== 'undefined') {\n initializeAssets(global);\n}\n`\n\n const runtimePath = path.join(projectPath, defaultAdkFolder, 'assets-runtime.ts')\n await createFile(runtimePath, runtimeCode)\n}\n\nexport async function initAssets(projectPath: string, botId?: string, workspaceId?: string): Promise<void> {\n const assetsManager = new AssetsManager({ projectPath, botId, workspaceId })\n\n if (await assetsManager.hasAssetsDirectory()) {\n await generateAssetsTypes(projectPath)\n await generateAssetsRuntime(projectPath, botId, workspaceId)\n } else {\n // Generate empty types if no assets directory exists\n const emptyTypesCode = `// No assets directory found\nimport { Asset } from '@botpress/runtime';\n\nexport type AssetPaths = never;\n\nexport interface AssetPathMap {}\n\n// Runtime asset access\ndeclare global {\n const assets: {\n get<T extends AssetPaths>(path: T): Asset;\n list(): Asset[];\n getSyncStatus(): { \n synced: boolean; \n neverSynced: string[]; \n stale: string[];\n upToDate: string[];\n };\n };\n}\n`\n\n const typesPath = path.join(projectPath, defaultAdkFolder, 'assets.d.ts')\n await createFile(typesPath, emptyTypesCode)\n\n // Generate empty runtime\n const emptyRuntimeCode = `\n// No assets available\nimport { Asset, initAssets } from '@botpress/runtime';\n\n// Empty asset metadata\nexport const assetsMetadata: Record<string, Asset> = {};\n\n// Initialize with empty metadata\nexport function initializeAssets(globalObj: any = globalThis) {\n initAssets(globalObj, assetsMetadata);\n}\n\n// Auto-initialize if running in a supported environment\nif (typeof globalThis !== 'undefined') {\n initializeAssets(globalThis);\n} else if (typeof global !== 'undefined') {\n initializeAssets(global);\n}\n`\n\n const runtimePath = path.join(projectPath, defaultAdkFolder, 'assets-runtime.ts')\n await createFile(runtimePath, emptyRuntimeCode)\n }\n}\n",
|
|
59
|
+
"import { z } from '@botpress/sdk'\nimport crypto from 'crypto'\nimport path from 'path'\n\nimport { ParsedIntegration } from '../integrations/types.js'\n\nconst { transforms } = z\nimport { pascalCase, snakeCase } from '../utils/strings.js'\nimport { ADK_VERSION, relative, toMultilineComment, formatCode } from './utils.js'\nimport { getIntegrationAlias } from '../utils/ids.js'\n\nconst getIntegrationHash = (integration: ParsedIntegration): string => {\n return crypto\n .createHash('sha256')\n .update(\n `${integration.alias}|${integration.definition?.id}|${integration.definition?.version}|${integration.definition?.updatedAt}`\n )\n .digest('hex')\n}\n\nconst getPascalAlias = (integration: ParsedIntegration) => pascalCase(getIntegrationAlias(integration.alias))\n\nconst getIntegrationNames = (integration: ParsedIntegration) => ({\n typings: {\n index: `Integration_All_${getPascalAlias(integration)}`,\n actions: `Integration_Actions_${getPascalAlias(integration)}`,\n channels: `Integration_Channels_${getPascalAlias(integration)}`,\n events: `Integration_Events_${getPascalAlias(integration)}`,\n users: `Integration_Users_${getPascalAlias(integration)}`,\n configurations: `Integration_Configurations_${getPascalAlias(integration)}`,\n },\n paths: {\n index: path.join(snakeCase(getPascalAlias(integration)), `index.ts`),\n actions: path.join(snakeCase(getPascalAlias(integration)), `actions.ts`),\n channels: path.join(snakeCase(getPascalAlias(integration)), `channels.ts`),\n events: path.join(snakeCase(getPascalAlias(integration)), `events.ts`),\n users: path.join(snakeCase(getPascalAlias(integration)), `users.ts`),\n configurations: path.join(snakeCase(getPascalAlias(integration)), `configurations.ts`),\n },\n})\n\nexport async function generateIntegrationTypes(integration: ParsedIntegration): Promise<{\n names: ReturnType<typeof getIntegrationNames>\n files: Record<string, string>\n}> {\n const names = getIntegrationNames(integration)\n const hash = getIntegrationHash(integration)\n\n const rel = (to: string): string => {\n const from = names.paths.index\n return relative(from, to).replace(/\\.ts$/i, '')\n }\n\n let tIndex = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition?.name}\n // Version: ${integration.definition?.version}\n // File: ${names.paths.index}\n // Hash: ${hash}\n // Updated at: ${integration.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n import { Integration_Actions_${getPascalAlias(integration)} } from \"${rel(names.paths.actions)}\";\n import { Integration_Channels_${getPascalAlias(integration)} } from \"${rel(names.paths.channels)}\";\n import { Integration_Events_${getPascalAlias(integration)} } from \"${rel(names.paths.events)}\";\n import { Integration_Users_${getPascalAlias(integration)} } from \"${rel(names.paths.users)}\";\n import { Integration_Configurations_${getPascalAlias(integration)} } from \"${rel(names.paths.configurations)}\";\n\n export * from \"${rel(names.paths.actions)}\";\n export * from \"${rel(names.paths.channels)}\";\n export * from \"${rel(names.paths.events)}\";\n export * from \"${rel(names.paths.users)}\";\n export * from \"${rel(names.paths.configurations)}\";\n\n export type Integration_All_${getPascalAlias(integration)} = {\n actions: Integration_Actions_${getPascalAlias(integration)};\n channels: Integration_Channels_${getPascalAlias(integration)};\n events: Integration_Events_${getPascalAlias(integration)};\n users: Integration_Users_${getPascalAlias(integration)};\n configurations: Integration_Configurations_${getPascalAlias(integration)};\n };\n `\n\n let tActions = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition?.name}\n // Version: ${integration.definition?.version}\n // File: ${names.paths.actions}\n // Hash: ${hash}\n // Updated at: ${integration.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type Integration_Actions_${getPascalAlias(integration)} = {`\n\n for (const [name, action] of Object.entries(integration.definition!.actions)) {\n const input = transforms.fromJSONSchema(action.input.schema).toTypescriptType()\n const output = transforms.fromJSONSchema(action.output.schema).toTypescriptType()\n\n tActions += `\n ${toMultilineComment(`Title: ${action.title || name}\\nDescription: ${action.description || 'No description'}`)}\n \"${name}\": {\n input: ${input};\n output: ${output};\n },\\n`\n }\n\n tActions += `};`\n\n let tChannels = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition?.name}\n // Version: ${integration.definition?.version}\n // File: ${names.paths.channels}\n // Hash: ${hash}\n // Updated at: ${integration.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type Integration_Channels_${getPascalAlias(integration)} = {`\n\n for (const [channelName, channelDef] of Object.entries(integration.definition?.channels || {})) {\n const convoTagsRecord =\n '{' +\n Object.keys(channelDef.conversation?.tags || {}).reduce((acc, t) => {\n const tag = channelDef.conversation.tags[t]!\n const comment = toMultilineComment(`Title: ${tag?.title}\\nDescription: ${tag.description}`)\n // Use alias instead of ref.fullName since the API returns tags with the alias prefix\n acc += `${comment}\\n[\"${integration.alias}:${t}\"]?: string,\\n`\n return acc\n }, '') +\n '}'\n\n const msgTagsUnion =\n '{' +\n Object.keys(channelDef.message?.tags || {}).reduce((acc, t) => {\n const tag = channelDef.message.tags[t]!\n const comment = toMultilineComment(`Title: ${tag?.title}\\nDescription: ${tag.description}`)\n // Use alias instead of ref.fullName since the API returns tags with the alias prefix\n acc += `${comment}\\n[\"${integration.alias}:${t}\"]?: string,\\n`\n return acc\n }, '') +\n '}'\n\n let messagesBlock = ''\n for (const [messageName, messageDef] of Object.entries(channelDef.messages || {})) {\n const messageType = transforms.fromJSONSchema(messageDef.schema).toTypescriptType()\n messagesBlock += `\\n\"${messageName}\": ${messageType};\\n`\n }\n\n tChannels += `\n ${toMultilineComment(\n `Title: ${channelDef.title || channelName}\\nDescription: ${channelDef.description || 'No description'}`\n )}\n \"${channelName}\": {\n conversation: {\n tags: ${convoTagsRecord};\n };\n message: {\n tags: ${msgTagsUnion};\n };\n messages: {${messagesBlock}\n };\n },`\n }\n\n tChannels += `\n };\n `\n\n let tEvents = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition!.name}\n // Version: ${integration.definition!.version}\n // File: ${names.paths.events}\n // Hash: ${hash}\n // Updated at: ${integration.definition!.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type Integration_Events_${getPascalAlias(integration)} = {`\n\n for (const [eventName, event] of Object.entries(integration.definition!.events || {})) {\n const payloadType = transforms.fromJSONSchema(event.schema).toTypescriptType()\n const attributesComment = Object.keys(event.attributes || {}).length\n ? `\\nAttributes:\\n${Object.entries(event.attributes!)\n .map(([k, v]) => ` - ${k}: ${v}`)\n .join('\\n')}`.trim()\n : ''\n\n tEvents += `\n ${toMultilineComment(\n `Title: ${event.title || eventName}\\nDescription: ${event.description || 'No description'}${attributesComment}`\n )}\n \"${eventName}\": ${payloadType};\n `\n }\n\n tEvents += `\n };\n `\n\n let tUsers = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition?.name}\n // Version: ${integration.definition?.version}\n // File: ${names.paths.users}\n // Hash: ${hash}\n // Updated at: ${integration.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type Integration_Users_${getPascalAlias(integration)} = {`\n\n const userTagKeys = Object.keys(integration.definition?.user?.tags || {})\n const userTagsUnion = userTagKeys.length\n ? userTagKeys\n .map((t) => {\n const tag = (integration.definition?.user!.tags ?? ({} as Record<string, unknown>))[t] as\n | Record<string, unknown>\n | undefined\n const comment = toMultilineComment(`Title: ${tag?.title}\\nDescription: ${tag?.description}`)\n // Use alias instead of ref.fullName since the API returns tags with the alias prefix\n return `${comment}\\n\"${integration.alias}:${t}\"\\n`\n })\n .join(' | ')\n : 'never'\n\n tUsers += `\n tags: ${userTagsUnion};\n };\n `\n\n // Generate configurations map type with JSDoc comments\n let tConfigurations = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Integration: ${integration.definition?.name}\n // Version: ${integration.definition?.version}\n // File: ${names.paths.configurations}\n // Hash: ${hash}\n // Updated at: ${integration.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type Integration_Configurations_${getPascalAlias(integration)} = `\n\n const configEntries: string[] = []\n\n // Add \"default\" configuration from .configuration if it exists\n if (integration.definition?.configuration) {\n const defaultConfig = integration.definition.configuration as Record<string, unknown>\n const title = defaultConfig.title || 'Default'\n const description = defaultConfig.description || 'Default configuration'\n const schema = defaultConfig.schema\n\n let tsType = '{}'\n if (schema) {\n tsType = transforms.fromJSONSchema(schema).toTypescriptType()\n }\n\n // Build JSDoc comment\n const jsdocLines: string[] = ['/**']\n jsdocLines.push(` * @title ${title}`)\n if (description) {\n jsdocLines.push(` * ${description}`)\n }\n jsdocLines.push(' */')\n\n configEntries.push(`${jsdocLines.join('\\n ')}\\n default: ${tsType}`)\n }\n\n // Add configurations from .configurations\n if (integration.definition?.configurations) {\n for (const [key, config] of Object.entries(integration.definition.configurations)) {\n const configRecord = config as Record<string, unknown>\n const title = configRecord.title || key\n const description = configRecord.description || ''\n const schema = configRecord.schema\n\n let tsType = '{}'\n if (schema) {\n tsType = transforms.fromJSONSchema(schema).toTypescriptType()\n }\n\n // Build JSDoc comment\n const jsdocLines: string[] = ['/**']\n jsdocLines.push(` * @title ${title}`)\n if (description) {\n jsdocLines.push(` * ${description}`)\n }\n jsdocLines.push(' */')\n\n configEntries.push(`${jsdocLines.join('\\n ')}\\n ${key}: ${tsType}`)\n }\n }\n\n if (configEntries.length > 0) {\n tConfigurations += `{\n ${configEntries.join(';\\n ')};\n};`\n } else {\n tConfigurations += `Record<string, never>;`\n }\n\n return {\n names,\n files: {\n [names.paths.index]: await formatCode(tIndex),\n [names.paths.actions]: await formatCode(tActions),\n [names.paths.channels]: await formatCode(tChannels),\n [names.paths.events]: await formatCode(tEvents),\n [names.paths.users]: await formatCode(tUsers),\n [names.paths.configurations]: await formatCode(tConfigurations),\n },\n }\n}\n",
|
|
60
60
|
"export function pascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n}\n\nexport function camelCase(str: string): string {\n const pascal = pascalCase(str)\n return pascal.charAt(0).toLowerCase() + pascal.slice(1)\n}\n\nexport function kebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\nexport function snakeCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase()\n}\n",
|
|
61
61
|
"export function getIntegrationAlias(integrationName: string) {\n return integrationName.replace(/\\//g, '__').replace(/-/g, '_').toLowerCase()\n}\n\nexport function getPluginAlias(pluginName: string) {\n return pluginName.replace(/-/g, '_').toLowerCase()\n}\n",
|
|
62
|
-
"import path from 'path'\nimport crypto from 'crypto'\nimport { readFile } from 'fs/promises'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport { BuiltInWorkflows } from '@botpress/runtime/internal'\n\nfunction isBuiltinWorkflow(name: string): boolean {\n return !!Object.values(BuiltInWorkflows).find((x) => x.name === name)\n}\n\nexport async function generateClientWrapper(project: AgentProject): Promise<void> {\n // Extract action types\n const actionTypes: Array<{ name: string; inputType: string; outputType: string }> = []\n\n for (const action of project.actions) {\n // Skip hidden actions\n if (action.definition.attributes?.visibility === 'hidden') {\n continue\n }\n\n try {\n // Skip built-in actions\n if (action.path === '<adk:builtin>') {\n actionTypes.push({\n name: action.definition.name,\n inputType: 'any',\n outputType: 'any',\n })\n continue\n }\n\n // Import the action module to get types\n const absolutePath = path.join(project.path, action.path)\n const actionModule = await import(`${absolutePath}?t=${Date.now()}`)\n const actionInstance = actionModule[action.export] || actionModule.default\n\n if (actionInstance && actionInstance.input && actionInstance.output) {\n const inputType = actionInstance.input.toTypescriptType\n ? actionInstance.input.toTypescriptType({ treatDefaultAsOptional: true })\n : 'any'\n const outputType = actionInstance.output.toTypescriptType\n ? actionInstance.output.toTypescriptType()\n : 'any'\n\n actionTypes.push({\n name: action.definition.name,\n inputType,\n outputType,\n })\n }\n } catch (error) {\n console.warn(`Warning: Could not process action ${action.definition.name}:`, error)\n actionTypes.push({\n name: action.definition.name,\n inputType: 'any',\n outputType: 'any',\n })\n }\n }\n\n // Extract workflow types\n const workflowTypes: Array<{ name: string; inputType: string; outputType: string }> = []\n\n for (const workflow of project.workflows) {\n try {\n if (isBuiltinWorkflow(workflow.definition.name)) {\n continue\n }\n\n const workflowPath = path.join(project.path, workflow.path)\n const workflowModule = await import(`${workflowPath}?t=${Date.now()}`)\n const workflowInstance = workflowModule[workflow.export] || workflowModule.default\n\n if (workflowInstance) {\n const inputType = workflowInstance.inputSchema\n ? (workflowInstance.inputSchema as any).toTypescriptType?.({ treatDefaultAsOptional: true }) || 'any'\n : '{}'\n\n const outputType = workflowInstance.outputSchema\n ? (workflowInstance.outputSchema as any).toTypescriptType?.() || 'any'\n : '{}'\n\n workflowTypes.push({\n name: workflow.definition.name,\n inputType,\n outputType,\n })\n }\n } catch (error) {\n console.warn(`Warning: Could not process workflow ${workflow.definition.name}:`, error)\n }\n }\n\n // Extract table types\n const tableTypes: Array<{\n name: string\n inputType: string\n outputType: string\n }> = []\n\n for (const table of project.tables) {\n try {\n const tablePath = path.join(project.path, table.path)\n const tableModule = await import(`${tablePath}?t=${Date.now()}`)\n const tableInstance = tableModule.default || tableModule[table.export]\n\n if (tableInstance && tableInstance.columns) {\n const inputColumns: string[] = []\n const outputColumns: string[] = ['id: number', 'createdAt: string', 'updatedAt: string']\n\n for (const [colName, colDef] of Object.entries(tableInstance.columns)) {\n let schema: any\n let computed = false\n\n if (typeof colDef === 'object' && colDef !== null && 'schema' in colDef) {\n schema = (colDef as any).schema\n computed = (colDef as any).computed || false\n } else {\n schema = colDef\n }\n\n const tsType = schema.toTypescriptType ? schema.toTypescriptType({ treatDefaultAsOptional: true }) : 'any'\n\n if (!computed) {\n inputColumns.push(`${colName}: ${tsType}`)\n }\n outputColumns.push(`${colName}: ${tsType}`)\n }\n\n tableTypes.push({\n name: table.definition.name,\n inputType: `{ ${inputColumns.join('; ')} }`,\n outputType: `{ ${outputColumns.join('; ')} }`,\n })\n }\n } catch (error) {\n console.warn(`Warning: Could not process table ${table.definition.name}:`, error)\n }\n }\n\n // Generate the client wrapper code\n const content = `\n// @ts-nocheck\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\nimport type { Client, Workflow } from '@botpress/client'\n\n// Utility type to simplify complex types\ntype Simplify<T> = T extends (...args: infer A) => infer R\n ? (...args: SimplifyTuple<A>) => Simplify<R>\n : T extends Array<infer E>\n ? Array<Simplify<E>>\n : T extends ReadonlyArray<infer E>\n ? ReadonlyArray<Simplify<E>>\n : T extends Promise<infer R>\n ? Promise<Simplify<R>>\n : T extends Buffer\n ? Buffer\n : T extends object\n ? SimplifyObject<T>\n : T\n\ntype SimplifyTuple<T> = T extends [...infer A] ? { [K in keyof A]: Simplify<A[K]> } : never\ntype SimplifyObject<T extends object> = T extends infer O ? { [K in keyof O]: Simplify<O[K]> } : never\n\ntype GenericWorkflowInput = Record<string, any>\ntype GenericWorkflowOutput = Record<string, any>\n\ntype TypedWorkflow<TInput = GenericWorkflowInput, TOutput = GenericWorkflowOutput> = Simplify<\n Omit<Workflow, 'input' | 'output'> & {\n input: TInput\n output: TOutput\n }\n>\n\n// Extract response types from Client methods\ntype CreateWorkflowResponse = Simplify<Awaited<ReturnType<Client['createWorkflow']>>>\ntype GetWorkflowResponse = Simplify<Awaited<ReturnType<Client['getWorkflow']>>>\ntype UpdateWorkflowResponse = Simplify<Awaited<ReturnType<Client['updateWorkflow']>>>\ntype DeleteWorkflowResponse = Simplify<Awaited<ReturnType<Client['deleteWorkflow']>>>\ntype GetOrCreateWorkflowResponse = Simplify<Awaited<ReturnType<Client['getOrCreateWorkflow']>>>\n\ntype CreateTableRowsResponse = Simplify<Awaited<ReturnType<Client['createTableRows']>>>\ntype UpdateTableRowsResponse = Simplify<Awaited<ReturnType<Client['updateTableRows']>>>\ntype UpsertTableRowsResponse = Simplify<Awaited<ReturnType<Client['upsertTableRows']>>>\ntype DeleteTableRowsResponse = Simplify<Awaited<ReturnType<Client['deleteTableRows']>>>\ntype FindTableRowsResponse = Simplify<Awaited<ReturnType<Client['findTableRows']>>>\ntype GetTableRowResponse = Simplify<Awaited<ReturnType<Client['getTableRow']>>>\n\n// Extract parameter types from Client methods\ntype ParamCreateWorkflow = Simplify<Parameters<Client['createWorkflow']>[0]>\ntype ParamGetWorkflow = Simplify<Parameters<Client['getWorkflow']>[0]>\ntype ParamUpdateWorkflow = Simplify<Parameters<Client['updateWorkflow']>[0]>\ntype ParamDeleteWorkflow = Simplify<Parameters<Client['deleteWorkflow']>[0]>\ntype ParamGetOrCreateWorkflow = Simplify<Parameters<Client['getOrCreateWorkflow']>[0]>\n\ntype ParamCreateTableRows = Simplify<Parameters<Client['createTableRows']>[0]>\ntype ParamUpdateTableRows = Simplify<Parameters<Client['updateTableRows']>[0]>\ntype ParamUpsertTableRows = Simplify<Parameters<Client['upsertTableRows']>[0]>\ntype ParamDeleteTableRows = Simplify<Parameters<Client['deleteTableRows']>[0]>\ntype ParamFindTableRows = Simplify<Parameters<Client['findTableRows']>[0]>\ntype ParamGetTableRow = Simplify<Parameters<Client['getTableRow']>[0]>\n\n/**\n * Typed ADK Client\n *\n * Provides strongly-typed wrappers around the Botpress Client for actions, workflows, and tables.\n */\nexport interface AdkClient {\n /**\n * Typed action calls\n */\n actions: {\n ${actionTypes\n .map(\n (action) => `\n /**\n * Call action: ${action.name}\n */\n '${action.name}': (input: ${action.inputType}) => Promise<${action.outputType}>\n `\n )\n .join('\\n')}\n }\n\n /**\n * Typed workflow operations\n */\n workflows: {\n ${workflowTypes\n .map(\n (workflow) => `\n '${workflow.name}': {\n /**\n * Create workflow: ${workflow.name}\n */\n createWorkflow: (params: Omit<ParamCreateWorkflow, 'name' | 'input'> & { input?: ${workflow.inputType} }) => Promise<Omit<CreateWorkflowResponse, 'workflow'> & { workflow: TypedWorkflow<${workflow.inputType}, ${workflow.outputType}> }>\n /**\n * Get workflow by ID\n */\n getWorkflow: (params: ParamGetWorkflow) => Promise<Omit<GetWorkflowResponse, 'workflow'> & { workflow: TypedWorkflow<${workflow.inputType}, ${workflow.outputType}> }>\n /**\n * Update workflow\n */\n updateWorkflow: (params: Omit<ParamUpdateWorkflow, 'output'> & { output?: ${workflow.outputType} }) => Promise<Omit<UpdateWorkflowResponse, 'workflow'> & { workflow: TypedWorkflow<${workflow.inputType}, ${workflow.outputType}> }>\n /**\n * Delete workflow\n */\n deleteWorkflow: (params: ParamDeleteWorkflow) => Promise<DeleteWorkflowResponse>\n /**\n * Get or create workflow with deduplication key\n */\n getOrCreateWorkflow: (params: Omit<ParamGetOrCreateWorkflow, 'name' | 'input'> & { input?: ${workflow.inputType} }) => Promise<Omit<GetOrCreateWorkflowResponse, 'workflow'> & { workflow: TypedWorkflow<${workflow.inputType}, ${workflow.outputType}> }>\n }\n `\n )\n .join('\\n')}\n }\n\n /**\n * Typed table operations\n */\n tables: {\n ${tableTypes\n .map(\n (table) => `\n '${table.name}': {\n /**\n * Find rows in table: ${table.name}\n */\n findTableRows: (params?: Omit<ParamFindTableRows, 'table'>) => Promise<Omit<FindTableRowsResponse, 'rows'> & { rows: Array<${table.outputType}> }>\n /**\n * Get a single row by ID\n */\n getTableRow: (params: Omit<ParamGetTableRow, 'table'>) => Promise<Omit<GetTableRowResponse, 'row'> & { row: ${table.outputType} }>\n /**\n * Create rows in table: ${table.name}\n */\n createTableRows: (params: Omit<ParamCreateTableRows, 'table'>) => Promise<Omit<CreateTableRowsResponse, 'rows'> & { rows: Array<${table.outputType}> }>\n /**\n * Update rows in table: ${table.name}\n */\n updateTableRows: (params: Omit<ParamUpdateTableRows, 'table'>) => Promise<Omit<UpdateTableRowsResponse, 'rows'> & { rows: Array<${table.outputType}> }>\n /**\n * Upsert rows in table: ${table.name}\n */\n upsertTableRows: (params: Omit<ParamUpsertTableRows, 'table'>) => Promise<Omit<UpsertTableRowsResponse, 'rows'> & { rows: Array<${table.outputType}> }>\n /**\n * Delete rows by IDs\n */\n deleteTableRows: (params: Omit<ParamDeleteTableRows, 'table'>) => Promise<Omit<DeleteTableRowsResponse, 'rows'> & { rows: Array<${table.outputType}> }>\n }\n `\n )\n .join('\\n')}\n }\n\n /**\n * Raw Botpress client (no additional typing)\n */\n client: Client\n}\n\n/**\n * Create a typed ADK client wrapper around a Botpress Client\n *\n * @example\n * \\`\\`\\`typescript\n * import { Client } from '@botpress/client'\n * import { createAdkClient } from './.adk/client'\n *\n * const client = new Client({ token: 'xxx', botId: 'yyy' })\n * const adk = createAdkClient(client)\n *\n * // Typed action calls\n * const result = await adk.actions.myAction({ foo: 'bar' })\n *\n * // Typed workflow operations\n * const wf = await adk.workflows.myWorkflow.createWorkflow({ input: { data: 'value' } })\n * const workflow = await adk.workflows.myWorkflow.getWorkflow({ id: wf.workflow.id })\n * await adk.workflows.myWorkflow.updateWorkflow({ id: wf.workflow.id, status: 'completed' })\n * await adk.workflows.myWorkflow.deleteWorkflow({ id: wf.workflow.id })\n * await adk.workflows.myWorkflow.getOrCreateWorkflow({ key: 'unique-key', input: { data: 'value' } })\n *\n * // Typed table operations\n * const rows = await adk.tables.myTable.findTableRows({ filter: { name: 'John' } })\n * const row = await adk.tables.myTable.getTableRow({ id: 123 })\n * await adk.tables.myTable.createTableRows({ rows: [{ name: 'Jane', age: 30 }] })\n * await adk.tables.myTable.updateTableRows({ rows: [{ id: 123, name: 'Jane' }] })\n * await adk.tables.myTable.upsertTableRows({ rows: [{ name: 'Bob', age: 25 }] })\n * await adk.tables.myTable.deleteTableRows({ ids: [123, 456] })\n * \\`\\`\\`\n */\nexport function createAdkClient(client: Client): AdkClient {\n return {\n actions: {\n ${actionTypes\n .map(\n (action) => `\n '${action.name}': async (input: ${action.inputType}) => {\n const response = await client.callAction({\n type: '${action.name}',\n input,\n })\n return response.output as ${action.outputType}\n }\n `\n )\n .join(',\\n')}\n },\n\n workflows: {\n ${workflowTypes\n .map(\n (workflow) => `\n '${workflow.name}': {\n createWorkflow: async (params) => {\n return client.createWorkflow({\n name: '${workflow.name}',\n ...params,\n }) as any\n },\n getWorkflow: async (params) => {\n return client.getWorkflow(params) as any\n },\n updateWorkflow: async (params) => {\n return client.updateWorkflow(params) as any\n },\n deleteWorkflow: async (params) => {\n return client.deleteWorkflow(params) as any\n },\n getOrCreateWorkflow: async (params) => {\n return client.getOrCreateWorkflow({\n name: '${workflow.name}',\n ...params,\n }) as any\n },\n }\n `\n )\n .join(',\\n')}\n },\n\n tables: {\n ${tableTypes\n .map(\n (table) => `\n '${table.name}': {\n findTableRows: async (params) => {\n return client.findTableRows({\n table: '${table.name}',\n ...params,\n }) as any\n },\n getTableRow: async (params) => {\n return client.getTableRow({\n table: '${table.name}',\n ...params,\n }) as any\n },\n createTableRows: async (params) => {\n return client.createTableRows({\n table: '${table.name}',\n ...params,\n }) as any\n },\n updateTableRows: async (params) => {\n return client.updateTableRows({\n table: '${table.name}',\n ...params,\n }) as any\n },\n upsertTableRows: async (params) => {\n return client.upsertTableRows({\n table: '${table.name}',\n ...params,\n }) as any\n },\n deleteTableRows: async (params) => {\n return client.deleteTableRows({\n table: '${table.name}',\n ...params,\n }) as any\n },\n }\n `\n )\n .join(',\\n')}\n },\n\n client,\n }\n}\n`\n\n // Write the client wrapper to .adk/client.ts\n const clientWrapperPath = path.join(project.path, '.adk', 'client.ts')\n const formattedContent = await formatCode(content)\n\n // Calculate hash of content without timestamp to detect actual changes\n const contentHash = crypto\n .createHash('sha256')\n .update(\n formattedContent\n // Remove the timestamp line for hash calculation\n .replace(/\\/\\/ Generated at: .+\\n/, '')\n )\n .digest('hex')\n\n // Check if file exists and has the same content hash\n try {\n const existingContent = await readFile(clientWrapperPath, 'utf-8')\n const existingHash = crypto\n .createHash('sha256')\n .update(\n existingContent\n // Remove the timestamp line for hash calculation\n .replace(/\\/\\/ Generated at: .+\\n/, '')\n )\n .digest('hex')\n\n // If content hasn't changed (ignoring timestamp), skip writing\n if (contentHash === existingHash) {\n return\n }\n } catch {\n // File doesn't exist or can't be read, proceed with writing\n }\n\n // Content has changed, write the file\n await createFile(clientWrapperPath, formattedContent)\n}\n",
|
|
63
|
-
"import dedent from 'dedent'\nimport { existsSync } from 'fs'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport { AgentProject } from '../agent-project/index.js'\nimport { fetchServerIntegrationConfigs, mergeIntegrationConfig, type FetchServerConfigsResult } from '../integrations/config-utils.js'\nimport type { SyncCallbacks } from '../preflight/types.js'\nimport { generateIntegrationTypes } from '../generators/integration-types.js'\nimport { generatePluginTypes } from '../generators/plugin-types.js'\nimport { generatePluginActionTypes } from '../generators/plugin-action-types.js'\nimport { generateInterfaceTypes } from '../generators/interface-types.js'\nimport { generateTableTypes } from '../generators/table-types.js'\nimport { generateTriggerTypes } from '../generators/trigger-types.js'\nimport { generateStateTypes } from '../generators/state-types.js'\nimport { generateTagTypes } from '../generators/tag-types.js'\nimport { generateConfigurationTypes } from '../generators/configuration-types.js'\nimport { generateWorkflowTypes } from '../generators/workflow-types.js'\nimport { generateConversationTypes } from '../generators/conversation-types.js'\nimport { generateEventTypes } from '../generators/event-types.js'\nimport { generateClientWrapper } from '../generators/client-wrapper.js'\nimport { IntegrationManager } from '../integrations/manager.js'\nimport { PluginManager } from '../plugins/manager.js'\nimport { InterfaceManager } from '../interfaces/manager.js'\nimport { createFile } from '../utils/fs.js'\nimport { linkSdk } from '../utils/link-sdk.js'\nimport { pascalCase } from '../utils/strings.js'\nimport { DevIdManager } from './dev-id-manager.js'\nimport { IntegrationSync } from './integration-sync.js'\nimport { InterfaceSync } from './interface-sync.js'\nimport { PluginSync } from './plugin-sync.js'\nimport { formatCode, ADK_VERSION } from '../generators/utils.js'\nimport { transforms, z } from '@botpress/sdk'\nimport { getIntegrationAlias, getPluginAlias } from '../utils/ids.js'\nimport { PluginParser } from '../agent-project/dependencies-parser.js'\nimport { BUILTIN_INTERFACES } from '../constants.js'\nimport { BuiltInActions, BuiltInWorkflows, Primitives, Workflow } from '@botpress/runtime/internal'\nimport { BUILT_IN_TAGS } from '@botpress/runtime/definition'\n\nexport interface BotGeneratorOptions {\n projectPath: string\n outputPath?: string\n adkCommand?: 'adk-dev' | 'adk-build' | 'adk-deploy'\n callbacks?: SyncCallbacks\n}\n\nconst plural = (n: number, word: string): string => `${n} ${word}${n === 1 ? '' : 's'}`\n\nfunction isBuiltinWorkflow(name: string): boolean {\n return !!Object.values(BuiltInWorkflows).find((x) => x.name === name)\n}\n\nfunction isBuiltinAction(name: string): boolean {\n return !!Object.values(BuiltInActions).find((x) => x.name === name)\n}\n\n/**\n * Generate a normalized import path for use in import statements\n * Converts Windows backslashes to forward slashes and removes .ts extension\n */\nfunction getImportPath(from: string, to: string): string {\n return path.relative(path.dirname(from), to).replace(/\\.ts$/, '').replace(/\\\\/g, '/')\n}\n\nexport class BotGenerator {\n private projectPath: string\n private outputPath: string\n private adkCommand?: 'adk-dev' | 'adk-build' | 'adk-deploy'\n private callbacks?: SyncCallbacks\n\n constructor(options: BotGeneratorOptions) {\n this.projectPath = path.resolve(options.projectPath)\n this.outputPath = path.resolve(options.outputPath || path.join(this.projectPath, '.adk'))\n this.adkCommand = options.adkCommand\n this.callbacks = options.callbacks\n }\n\n private async listFilesRecursive(rootDir: string): Promise<string[]> {\n try {\n if (!existsSync(rootDir)) return []\n const result: string[] = []\n const walk = async (dir: string, relativeBase: string) => {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n for (const entry of entries) {\n const abs = path.join(dir, entry.name)\n const rel = path.join(relativeBase, entry.name)\n if (entry.isDirectory()) {\n await walk(abs, rel)\n } else {\n result.push(rel)\n }\n }\n }\n await walk(rootDir, '')\n return result.sort()\n } catch {\n return []\n }\n }\n\n private async removeEmptyDirectories(rootDir: string): Promise<void> {\n if (!existsSync(rootDir)) return\n const removeIfEmpty = async (dir: string) => {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subdir = path.join(dir, entry.name)\n await removeIfEmpty(subdir)\n }\n }\n\n // Re-read after potential removals\n const after = await fs.readdir(dir)\n if (after.length === 0 && dir !== rootDir) {\n try {\n await fs.rmdir(dir, { recursive: false })\n } catch {}\n }\n }\n await removeIfEmpty(rootDir)\n }\n\n async generate(): Promise<void> {\n // Load the agent project\n const project = await AgentProject.load(this.projectPath)\n\n // Create output directory\n await fs.mkdir(this.outputPath, { recursive: true })\n\n // Generate bot files\n await this.generateBotDefinition()\n await this.generateIntegrationsDefinition()\n await this.generatePluginsDefinition()\n await this.generateInterfacesDefinition()\n await this.generateIntegrationsTypes()\n await this.generatePluginsTypes()\n await this.generateInterfacesTypes()\n await this.generateTableTypes()\n await this.generateTriggerTypes()\n await this.generateTagTypes()\n await this.generateStateTypes()\n await this.generateConfigurationTypes()\n await this.generateWorkflowTypes()\n await this.generateConversationTypes()\n await this.generateActionTypes()\n await this.generateEventTypes()\n await this.generateIntegrationActionTypes()\n await this.generatePluginActionTypes()\n await this.generateRuntimeTypes()\n await this.generateClientWrapper()\n await this.generateBotIndex()\n await this.generatePackageJson(project)\n await this.generateTsConfig()\n await this.generateGlobalTypes()\n await this.copyAssets()\n }\n\n private async generateIntegrationsTypes(): Promise<void> {\n // Load the project to get interfaces\n const project = await AgentProject.load(this.projectPath)\n const manager = new IntegrationManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const integrations = await manager.loadIntegrations(project.dependencies || {})\n\n // List existing files before generation (.adk/integrations)\n const integrationsDir = path.join(this.projectPath, '.adk', 'integrations')\n const existingIntegrationFiles = await this.listFilesRecursive(integrationsDir)\n\n let aliases = new Set<string>()\n let files = new Set<string>() // tracks all files created in this run (relative to .adk/integrations)\n\n // Generate imports for each integration\n for (const integration of integrations.integrations) {\n if (integration.definition) {\n const types = await generateIntegrationTypes(integration)\n\n // Use dynamic import for type\n const importPath = `./${path.join('integrations', types.names.paths.index).replace(/\\\\/g, '/')}`\n aliases.add(`\"${integration.alias}\": import(\"${importPath}\").${types.names.typings.index}`)\n\n for (const [filePath, content] of Object.entries(types.files)) {\n const fullPath = path.join(this.projectPath, '.adk', 'integrations', filePath)\n\n const dir = path.dirname(fullPath)\n await fs.mkdir(dir, { recursive: true })\n await createFile(fullPath, content)\n files.add(filePath)\n }\n }\n }\n\n const types = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Generated at: ${new Date().toISOString()}\n ////////////////////////////////////////////////////////\n\n declare module \"@botpress/runtime/_types/integrations\" {\n export type Integrations = {\n ${Array.from(aliases).join(`, `)}\n };\n }\n `\n\n await createFile(path.join(this.projectPath, '.adk', 'integrations-types.d.ts'), await formatCode(types))\n\n // Cleanup stale integration files\n const staleIntegrationFiles = existingIntegrationFiles.filter((f) => !files.has(f))\n if (staleIntegrationFiles.length > 0) {\n for (const rel of staleIntegrationFiles) {\n const abs = path.join(integrationsDir, rel)\n try {\n await fs.rm(abs, { force: true })\n } catch {}\n }\n }\n // remove empty folders after deletion\n await this.removeEmptyDirectories(integrationsDir)\n }\n\n private async generatePluginsTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n const manager = new PluginManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const result = await manager.loadPlugins(project.dependencies || {})\n\n // List existing files before generation (.adk/plugins)\n const pluginsDir = path.join(this.projectPath, '.adk', 'plugins')\n const existingPluginFiles = await this.listFilesRecursive(pluginsDir)\n\n let aliases = new Set<string>()\n let files = new Set<string>()\n\n for (const plugin of result.plugins) {\n if (plugin.definition) {\n const types = await generatePluginTypes(plugin)\n\n const importPath = `./${path.join('plugins', types.names.paths.index).replace(/\\\\/g, '/')}`\n aliases.add(`\"${plugin.alias}\": import(\"${importPath}\").${types.names.typings.index}`)\n\n for (const [filePath, content] of Object.entries(types.files)) {\n const fullPath = path.join(this.projectPath, '.adk', 'plugins', filePath)\n\n const dir = path.dirname(fullPath)\n await fs.mkdir(dir, { recursive: true })\n await createFile(fullPath, content)\n files.add(filePath)\n }\n }\n }\n\n const types = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Generated at: ${new Date().toISOString()}\n ////////////////////////////////////////////////////////\n\n declare module \"@botpress/runtime/_types/plugins\" {\n export type Plugins = {\n ${Array.from(aliases).join(`, `)}\n };\n }\n `\n\n await createFile(path.join(this.projectPath, '.adk', 'plugins-types.d.ts'), await formatCode(types))\n\n // Cleanup stale plugin files\n const stalePluginFiles = existingPluginFiles.filter((f) => !files.has(f))\n if (stalePluginFiles.length > 0) {\n for (const rel of stalePluginFiles) {\n const abs = path.join(pluginsDir, rel)\n try {\n await fs.rm(abs, { force: true })\n } catch {}\n }\n }\n await this.removeEmptyDirectories(pluginsDir)\n }\n\n private async generateTableTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateTableTypes(project)\n }\n\n private async generateTriggerTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateTriggerTypes(project)\n }\n\n private async generateTagTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateTagTypes(project)\n }\n\n private async generateStateTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateStateTypes(project)\n }\n\n private async generateConfigurationTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateConfigurationTypes(project)\n }\n\n private async generateEventTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateEventTypes(project)\n }\n\n private async generateWorkflowTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateWorkflowTypes(project)\n }\n\n private async generateConversationTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateConversationTypes(project)\n }\n\n private async generateActionTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n const { generateActionTypes } = await import('../generators/action-types.js')\n await generateActionTypes(project)\n }\n\n private async generateIntegrationActionTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n const { generateIntegrationActionTypes } = await import('../generators/integration-action-types.js')\n await generateIntegrationActionTypes(project)\n }\n\n private async generatePluginActionTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generatePluginActionTypes(project)\n }\n\n private async generateClientWrapper(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateClientWrapper(project)\n }\n\n private async generateRuntimeTypes(): Promise<void> {\n // Load the project for conditional imports\n const project = await AgentProject.load(this.projectPath)\n\n // Load integrations to generate channel types\n const manager = new IntegrationManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const integrations = await manager.loadIntegrations(project.dependencies || {})\n\n // Collect all channel names from integrations\n const channels: string[] = []\n for (const integration of integrations.integrations) {\n if (integration.enabled && integration.definition) {\n const alias = integration.alias\n for (const channelName of Object.keys(integration.definition.channels || {})) {\n channels.push(`\"${alias}.${channelName}\"`)\n }\n }\n }\n\n // Generate channel union type\n const channelsType = channels.length > 0 ? channels.join(' | ') : 'never'\n\n // Get state types from agent config\n let botStateType = '{}'\n let userStateType = '{}'\n\n try {\n const configPath = path.join(project.path, 'agent.config.ts')\n // Bust module cache to ensure fresh config on regeneration\n const configModule = await import(`${configPath}?t=${Date.now()}`)\n const config = configModule.default\n\n if (config?.bot?.state) {\n const botSchema = config.bot.state as z.ZodTypeAny\n if (botSchema.toTypescriptType) {\n botStateType = botSchema.toTypescriptType()\n }\n }\n\n if (config?.user?.state) {\n const userSchema = config.user.state as z.ZodTypeAny\n if (userSchema.toTypescriptType) {\n userStateType = userSchema.toTypescriptType()\n }\n }\n } catch (error) {\n console.warn('Failed to load agent config for state types:', error)\n }\n\n const types = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ndeclare module \"@botpress/runtime/_types/channels\" {\n export type Channels = ${channelsType};\n export type ChannelSpec = Channels | readonly Channels[] | '*';\n}\n\ndeclare module \"@botpress/runtime/_types/state\" {\n export type BotState = ${botStateType};\n export type UserState = ${userStateType};\n}\n`\n\n await createFile(path.join(this.projectPath, '.adk', 'runtime.d.ts'), await formatCode(types))\n }\n\n private async generateInterfacesTypes(): Promise<void> {\n // Load the project to get interfaces\n const project = await AgentProject.load(this.projectPath)\n const integrationManager = new IntegrationManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const manager = new InterfaceManager()\n\n // List existing files before generation (.adk/interfaces)\n const interfacesDir = path.join(this.projectPath, '.adk', 'interfaces')\n const existingInterfaceFiles = await this.listFilesRecursive(interfacesDir)\n\n const interfaces = await manager\n .loadInterfaces(project.dependencies || {})\n .then((result) => result.interfaces.filter((int) => int.definition).map((x) => x.definition!))\n\n const integrationsWithAlias = await integrationManager\n .loadIntegrations(project.dependencies || {})\n .then((result) =>\n result.integrations\n .filter((int) => int.enabled && int.definition)\n .map((x) => ({ alias: x.alias, definition: x.definition! }))\n )\n\n let imports = new Set<string>()\n let aliases = new Set<string>()\n let files = new Set<string>() // tracks all files created in this run (relative to .adk/interfaces)\n\n // Generate imports for each integration\n for (const int of interfaces) {\n const types = await generateInterfaceTypes(int, integrationsWithAlias)\n\n imports.add(\n `import { ${types.names.typings.index} } from \"./${path.join('interfaces', types.names.paths.index).replace(/\\\\/g, '/')}\";`\n )\n\n aliases.add(`\"${types.names.name}\": ${types.names.typings.index}`)\n\n for (const [filePath, content] of Object.entries(types.files)) {\n const fullPath = path.join(this.projectPath, '.adk', 'interfaces', filePath)\n\n const dir = path.dirname(fullPath)\n await fs.mkdir(dir, { recursive: true })\n await createFile(fullPath, content)\n files.add(filePath)\n }\n }\n\n const types = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: interfaces.d.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports).join('\\n')}\n\n declare global {\n export type Interfaces = {\n ${Array.from(aliases).join(`, `)}\n };\n }\n `\n\n const consts = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: interfaces.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map((x) => x.replace('.ts\"', '\"'))\n .join('\\n')}\n\n export const Interfaces = {\n ${Array.from(aliases).join(',\\n')}\n };\n `\n\n await createFile(path.join(this.projectPath, '.adk', 'interfaces.d.ts'), await formatCode(types))\n\n await createFile(path.join(this.projectPath, '.adk', 'interfaces.ts'), await formatCode(consts))\n\n // Cleanup stale interface files\n const staleInterfaceFiles = existingInterfaceFiles.filter((f) => !files.has(f))\n if (staleInterfaceFiles.length > 0) {\n for (const rel of staleInterfaceFiles) {\n const abs = path.join(interfacesDir, rel)\n try {\n await fs.rm(abs, { force: true })\n } catch {}\n }\n }\n // remove empty folders after deletion\n await this.removeEmptyDirectories(interfacesDir)\n }\n\n private async generateIntegrationsDefinition(): Promise<void> {\n // Load the project to get integrations\n const project = await AgentProject.load(this.projectPath)\n const integrations = project.dependencies?.integrations || {}\n\n // Generate imports for each integration\n const imports: string[] = []\n const integrationDefs: string[] = []\n\n // Filter out disabled integrations (enabled: false)\n for (const [alias, config] of Object.entries(integrations)) {\n if (config.enabled === false) {\n continue\n }\n\n const normalizedAlias = getIntegrationAlias(alias)\n imports.push(`import integration_${normalizedAlias} from \"../bp_modules/integration_${normalizedAlias}\";`)\n integrationDefs.push(`\"${alias}\": integration_${normalizedAlias}`)\n }\n\n const content = dedent`\n import { IntegrationPackage } from \"@botpress/sdk\";\n\n ${imports.length > 0 ? '\\n' + imports.join('\\n') : ''}\n\n export const IntegrationDefinitions = {\n ${integrationDefs.length > 0 ? integrationDefs.join(',\\n') : ''}\n } as Record<string, IntegrationPackage>;\n `\n\n await createFile(path.join(this.outputPath, 'src', 'integrations.ts'), content)\n }\n\n private async generatePluginsDefinition(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n const plugins = project.dependencies?.plugins || {}\n\n const imports: string[] = []\n const pluginDefs: string[] = []\n\n for (const [alias] of Object.entries(plugins)) {\n const normalizedAlias = getPluginAlias(alias)\n imports.push(`import plugin_${normalizedAlias} from \"../bp_modules/plugin_${alias}\";`)\n pluginDefs.push(`\"${alias}\": plugin_${normalizedAlias}`)\n }\n\n const content = dedent`\n import { PluginPackage } from \"@botpress/sdk\";\n\n ${imports.length > 0 ? '\\n' + imports.join('\\n') : ''}\n\n export const PluginDefinitions = {\n ${pluginDefs.length > 0 ? pluginDefs.join(',\\n') : ''}\n } as Record<string, PluginPackage>;\n `\n\n await createFile(path.join(this.outputPath, 'src', 'plugins.ts'), content)\n }\n\n private async generateInterfacesDefinition(): Promise<void> {\n // Use hard-coded built-in interfaces\n const interfaces = BUILTIN_INTERFACES\n\n // Generate imports for each interface\n const imports: string[] = []\n const interfaceDefs: string[] = []\n\n for (const alias of Object.keys(interfaces)) {\n const pascalAlias = pascalCase(alias)\n imports.push(`import interface_${pascalAlias} from \"../bp_modules/interface_${pascalAlias}\";`)\n interfaceDefs.push(`${pascalAlias}: interface_${pascalAlias}`)\n }\n\n const content = dedent`\n import { InterfacePackage } from \"@botpress/sdk\";\n\n ${imports.length > 0 ? '\\n' + imports.join('\\n') : ''}\n\n export const InterfaceDefinitions = {\n ${interfaceDefs.length > 0 ? interfaceDefs.join(',\\n') : ''}\n } as Record<string, InterfacePackage>;\n `\n\n await createFile(path.join(this.outputPath, 'src', 'interfaces.ts'), await formatCode(content))\n }\n\n /**\n * Report the result of fetching and merging server-side integration configs.\n * Only emits messages when there's something meaningful to report.\n */\n private reportServerConfigSync(\n serverConfigResult: FetchServerConfigsResult,\n integrations: Array<{ alias: string; config?: Record<string, any> }>\n ): void {\n if (!this.callbacks) {\n return\n }\n\n if (serverConfigResult.error) {\n this.callbacks.onError?.(\n `Failed to fetch remote configs: ${serverConfigResult.error}. Server-only config values may be overwritten.`\n )\n return\n }\n\n if (!serverConfigResult.fetched) {\n return\n }\n\n const configCount = Object.keys(serverConfigResult.configs).length\n if (configCount === 0) {\n return\n }\n\n this.callbacks.onSuccess?.(`Preserved remote configs for ${plural(configCount, 'integration')}`)\n\n for (const { alias, config: localConfig } of integrations) {\n const serverConfig = serverConfigResult.configs[alias]\n if (!serverConfig || Object.keys(serverConfig).length === 0) {\n continue\n }\n\n const preserved = Object.keys(serverConfig).filter((key) => !localConfig || !(key in localConfig))\n if (preserved.length > 0) {\n this.callbacks.onProgress?.(` ${alias}: preserved ${plural(preserved.length, 'remote field')} (${preserved.join(', ')})`)\n }\n\n if (localConfig) {\n const overridden = Object.keys(localConfig).filter((key) => key in serverConfig && localConfig[key] !== serverConfig[key])\n if (overridden.length > 0) {\n this.callbacks.onProgress?.(` ${alias}: local overrides ${plural(overridden.length, 'field')} (${overridden.join(', ')})`)\n }\n }\n }\n }\n\n private async generateBotDefinition(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n const integrations = project.integrations\n const enabledIntegrations = integrations.filter((i) => i.enabled)\n\n // Fetch server-side configs to preserve values (e.g. auth tokens) not in agent.config.ts\n // During deploy/build, fetch from the production bot (botId) to avoid leaking dev config\n const isDeployOrBuild = this.adkCommand === 'adk-deploy' || this.adkCommand === 'adk-build'\n const configTargetBotId = isDeployOrBuild ? project.agentInfo?.botId : undefined\n const serverConfigResult = await fetchServerIntegrationConfigs(project, configTargetBotId)\n this.reportServerConfigSync(serverConfigResult, enabledIntegrations)\n\n const imports: string[] = []\n const addIntegrations: string[] = []\n\n for (const integration of enabledIntegrations) {\n const { alias, configurationType, config } = integration\n const importName = `integration_${getIntegrationAlias(alias)}`\n imports.push(`import ${importName} from \"./bp_modules/${importName}\";`)\n\n // \"default\" is not a real configuration type - omit it (API will reject it)\n const configType =\n configurationType && configurationType !== 'default' ? `, configurationType: \"${configurationType}\"` : ''\n\n const mergedConfig = mergeIntegrationConfig(serverConfigResult.configs[alias], config)\n const configData = Object.keys(mergedConfig).length > 0 ? `, configuration: ${JSON.stringify(mergedConfig)}` : ''\n\n addIntegrations.push(\n `bot.addIntegration(${importName}, { alias: \"${alias}\", enabled: true${configType}${configData} });`\n )\n }\n\n // Validate plugin dependency references before generating\n const depRefErrors = PluginParser.validateDependencyReferences(project.dependencies || {})\n if (depRefErrors.length > 0) {\n const messages = depRefErrors.map((e) => e.message).join('\\n ')\n throw new Error(`Plugin dependency validation failed:\\n ${messages}`)\n }\n\n // Parse plugins and generate addPlugin() calls (must come AFTER addIntegration)\n const plugins = project.dependencies?.plugins || {}\n const addPlugins: string[] = []\n\n for (const [alias, pluginConfig] of Object.entries(plugins)) {\n const normalizedAlias = getPluginAlias(alias)\n const importName = `plugin_${normalizedAlias}`\n imports.push(`import ${importName} from \"./bp_modules/plugin_${alias}\";`)\n\n const configData = pluginConfig.config && Object.keys(pluginConfig.config).length > 0\n ? `, configuration: ${JSON.stringify(pluginConfig.config)}` : ''\n const depsData = pluginConfig.dependencies && Object.keys(pluginConfig.dependencies).length > 0\n ? `, dependencies: ${JSON.stringify(pluginConfig.dependencies)}` : ''\n\n addPlugins.push(\n `bot.addPlugin(${importName}, { alias: \"${alias}\"${configData}${depsData} });`\n )\n }\n\n // Load user-defined tags from agent.config.ts\n const botTags: Record<string, any> = {}\n const userTags: Record<string, any> = {}\n const conversationTags: Record<string, any> = {}\n const messageTags: Record<string, any> = {}\n const workflowTags: Record<string, any> = {}\n\n if (project.config?.bot?.tags) {\n Object.assign(botTags, project.config.bot.tags)\n }\n\n if (project.config?.user?.tags) {\n Object.assign(userTags, project.config.user.tags)\n }\n\n if (project.config?.conversation?.tags) {\n Object.assign(conversationTags, project.config.conversation.tags)\n }\n\n if (project.config?.message?.tags) {\n Object.assign(messageTags, project.config.message.tags)\n }\n\n if (project.config?.workflow?.tags) {\n Object.assign(workflowTags, project.config.workflow.tags)\n }\n\n // Helper to hash strings - creates short uppercase hashes\n const crypto = require('crypto')\n const hashString = (str: string) => {\n return crypto.createHash('md5').update(str).digest('hex').substring(0, 5).toUpperCase()\n }\n\n // For each trigger, we need to add possible tags\n for (const trigger of project.triggers) {\n const triggerName = trigger.definition.name\n\n // Add tag for this trigger - the tag name is based on trigger name\n // The value can be \"*\" for wildcard or a specific match result\n const tagName = `trigger${hashString(triggerName)}`\n conversationTags[tagName] = {\n title: `Trigger: ${triggerName}`,\n description: `Subscribe to events from trigger \"${triggerName}\" (use \"*\" for all events or specific values)`,\n }\n\n // TODO: Only add workflow tags when workflows exist\n // Currently we don't support workflow definitions yet\n // When implemented, check if project.workflows.length > 0\n // workflowTags[tagName] = {\n // title: `Trigger: ${triggerName}`,\n // description: `Subscribe to events from trigger \"${triggerName}\" (use \"*\" for all events or specific values)`\n // };\n }\n\n // Load workflow definitions at build time and generate their schemas\n const workflowDefs: string[] = []\n const recurringWorkflows: Array<{ name: string; schedule: string }> = []\n\n const workflowInstances: Workflow<any>[] = []\n\n for (const workflow of project.workflows) {\n try {\n if (isBuiltinWorkflow(workflow.definition.name)) {\n // Built-in workflow - already handled in runtime\n continue\n }\n\n // User-defined workflow - import from project\n const workflowPath = path.join(project.path, workflow.path)\n // Bust module cache to ensure fresh workflow on regeneration\n const workflowModule = await import(`${workflowPath}?t=${Date.now()}`)\n const workflowInstance = (workflowModule.default || workflowModule[workflow.export]) as Workflow | undefined\n\n if (workflowInstance) {\n workflowInstances.push(workflowInstance)\n }\n } catch (error) {\n console.error(`Failed to load workflow ${workflow.definition.name}:`, error)\n }\n }\n\n for (const workflow of Object.values(BuiltInWorkflows)) {\n workflowInstances.push(workflow)\n }\n\n for (const workflow of workflowInstances) {\n const definition = Primitives.Definitions.getDefinition(workflow)\n if (!Primitives.Definitions.isWorkflowDefinition(definition)) {\n continue\n }\n\n // Check if workflow has a schedule property for recurring execution\n if (definition.schedule) {\n recurringWorkflows.push({\n name: definition.name,\n schedule: definition.schedule,\n })\n }\n\n // Generate the workflow definition as inline code\n const inputSchema = definition.input\n ? transforms.fromJSONSchema(definition.input).naked().toTypescriptSchema()\n : 'z.object({})'\n\n const outputSchema = definition.output\n ? transforms.fromJSONSchema(definition.output).naked().toTypescriptSchema()\n : 'z.object({})'\n\n const parts = []\n if (definition.description) {\n parts.push(`title: ${JSON.stringify(definition.name)}`)\n parts.push(`description: ${JSON.stringify(definition.description)}`)\n }\n parts.push(`input: { schema: ${inputSchema} }`)\n parts.push(`output: { schema: ${outputSchema} }`)\n\n // Add workflow tags with built-in tags spread\n parts.push(`tags: {\n ...BUILT_IN_TAGS.workflow,\n key: {\n title: \"Workflow Key\",\n description: \"Unique key for workflow deduplication\"\n },\n }`)\n\n workflowDefs.push(`\"${definition.name}\": {\\n ${parts.join(',\\n ')}\\n }`)\n }\n\n const actionDefs: Record<string, any> = {}\n for (const action of project.actions) {\n const def = action.definition\n // Include ALL actions in bot.definition.ts (even hidden ones)\n actionDefs[def.name] = {\n title: def.title,\n description: def.description,\n attributes: def.attributes,\n input: def.input,\n output: def.output,\n cached: def.cached,\n }\n }\n\n const toEventName = (ename: string) => ename.replaceAll(/[^a-zA-Z0-9]/g, '').toLowerCase()\n\n // Load custom events from agent.config.ts\n const customEventDefs: string[] = []\n const configForEvents = project.config as Record<string, unknown> | undefined\n const customEvents = (configForEvents?.events || {}) as Record<\n string,\n { schema?: z.ZodTypeAny; description?: string }\n >\n\n for (const [eventName, eventDef] of Object.entries(customEvents)) {\n const schema = eventDef.schema\n let schemaCode = 'z.object({})'\n\n if (schema && typeof schema.toJSONSchema === 'function') {\n schemaCode = transforms.fromJSONSchema(schema.toJSONSchema()).toTypescriptSchema()\n }\n\n const parts = [`schema: ${schemaCode}`]\n if (eventDef.description) {\n parts.unshift(`description: ${JSON.stringify(eventDef.description)}`)\n }\n\n customEventDefs.push(`\"${eventName}\": {\\n ${parts.join(',\\n ')}\\n }`)\n }\n\n // Get configuration schema if defined\n const configSchema = project.config?.configuration?.schema\n const configSchemaCode = configSchema\n ? transforms.fromJSONSchema(configSchema.toJSONSchema()).toTypescriptSchema()\n : undefined\n\n const content = dedent`\n import { BotDefinition, z } from \"@botpress/sdk\";\n import {\n BUILT_IN_STATES,\n BUILT_IN_TAGS,\n TranscriptSchema,\n TrackedStateSchema,\n WorkflowCallbackEvent,\n WorkflowScheduleEvent,\n WorkflowContinueEvent,\n SubworkflowFinished,\n WorkflowDataRequestEvent,\n } from \"@botpress/runtime/definition\";\n ${imports.length > 0 ? '\\n' + imports.join('\\n') : ''}\n\n const bot = new BotDefinition({\n\n attributes: {\n runtime: \"adk\",\n runtimeVersion: \"${ADK_VERSION}\",\n ${\n Object.keys(botTags).length > 0\n ? Object.entries(botTags)\n .map(\n ([tag, meta]) =>\n `${meta.description ? `// ${meta.description}\\n ` : ''}\"${tag}\": ${JSON.stringify(meta.title)}`\n )\n .join(',\\n ')\n : ''\n }\n },\n ${configSchemaCode ? `\\nconfiguration: {\\n schema: ${configSchemaCode}\\n},\\n` : ''}\n user: {\n tags: {\n ...BUILT_IN_TAGS.user,\n ${Object.entries(userTags)\n .filter(([tag]) => !Object.keys(BUILT_IN_TAGS.user).includes(tag))\n .map(\n ([tag, meta]) =>\n `// ${meta.title}\\n ${meta.description ? `// ${meta.description}\\n ` : ''}\"${tag}\": ${JSON.stringify(meta)}`\n )\n .join(',\\n ')}${Object.entries(userTags).filter(([tag]) => !Object.keys(BUILT_IN_TAGS.user).includes(tag)).length > 0 ? ',' : ''}\n },\n },\n message: {\n tags: {\n ...BUILT_IN_TAGS.message,\n ${Object.entries(messageTags)\n .filter(([tag]) => !Object.keys(BUILT_IN_TAGS.message).includes(tag))\n .map(\n ([tag, meta]) =>\n `// ${meta.title}\\n ${meta.description ? `// ${meta.description}\\n ` : ''}\"${tag}\": ${JSON.stringify(meta)}`\n )\n .join(',\\n ')}${Object.entries(messageTags).filter(([tag]) => !Object.keys(BUILT_IN_TAGS.message).includes(tag)).length > 0 ? ',' : ''}\n },\n },\n conversation: {\n tags: {\n ...BUILT_IN_TAGS.conversation,\n ${Object.entries(conversationTags)\n .filter(([tag]) => !Object.keys(BUILT_IN_TAGS.conversation).includes(tag))\n .map(\n ([tag, meta]) =>\n `// ${meta.title}\\n ${meta.description ? `// ${meta.description}\\n ` : ''}\"${tag}\": ${JSON.stringify(meta)}`\n )\n .join(\n ',\\n '\n )}${Object.entries(conversationTags).filter(([tag]) => !Object.keys(BUILT_IN_TAGS.conversation).includes(tag)).length > 0 ? ',' : ''}\n },\n },\n ${\n workflowDefs.length > 0\n ? `workflows: {\n ${workflowDefs.join(',\\n ')}\n },`\n : ''\n }\n ${\n Object.keys(actionDefs).length > 0\n ? `actions: {\n ${Object.entries(actionDefs)\n .map(([name, def]) => {\n const parts = []\n if (def.title) parts.push(`title: ${JSON.stringify(def.title)}`)\n if (def.description) parts.push(`description: ${JSON.stringify(def.description)}`)\n if (def.attributes) parts.push(`attributes: ${JSON.stringify(def.attributes)}`)\n parts.push(`input: { schema: ${transforms.fromJSONSchema(def.input).toTypescriptSchema()} }`)\n parts.push(`output: { schema: ${transforms.fromJSONSchema(def.output).toTypescriptSchema()} }`)\n return `\"${name}\": {\\n ${parts.join(',\\n ')}\\n }`\n })\n .join(',\\n ')}\n },`\n : ''\n }\n ${\n recurringWorkflows.length > 0\n ? `recurringEvents: {\n ${recurringWorkflows\n .map(\n (wf) => `\"${toEventName(wf.name + 'Schedule')}\": {\n type: WorkflowScheduleEvent.name,\n schedule: { cron: \"${wf.schedule}\" },\n payload: { workflow: \"${wf.name}\" },\n }`\n )\n .join(',\\n ')}\n },`\n : ''\n }\n\n events: {\n [WorkflowScheduleEvent.name]: {\n schema: WorkflowScheduleEvent.schema,\n },\n [WorkflowCallbackEvent.name]: {\n schema: WorkflowCallbackEvent.schema,\n },\n [WorkflowContinueEvent.name]: {\n schema: WorkflowContinueEvent.schema,\n },\n [SubworkflowFinished.name]: {\n schema: SubworkflowFinished.schema,\n },\n [WorkflowDataRequestEvent.name]: {\n schema: WorkflowDataRequestEvent.schema,\n },\n ${customEventDefs.length > 0 ? customEventDefs.join(',\\n ') + ',' : ''}\n },\n\n states: {\n /**\n * This is the ADK-native conversation state that contains the\n * necessary data to run the conversation and its handlers.\n */\n conversation: {\n type: \"conversation\",\n schema: z.object({ transcript: TranscriptSchema }),\n },\n\n /**\n * This is a generic state to store the conversation-specific state.\n * This is defined by the users at build-time when they define conversations.\n * Because each conversation can have its own state schema, we use \\`z.any()\\`\n */\n [BUILT_IN_STATES.conversation]: {\n type: \"conversation\",\n schema: TrackedStateSchema,\n },\n\n /**\n * Bot-wide global state that persists across all conversations\n */\n [BUILT_IN_STATES.bot]: {\n type: \"bot\",\n schema: TrackedStateSchema,\n },\n\n /**\n * User-specific state that persists across conversations for each user\n */\n [BUILT_IN_STATES.user]: {\n type: \"user\",\n schema: TrackedStateSchema,\n },\n\n /**\n * Workflow-specific state that persists across workflow executions\n */\n [BUILT_IN_STATES.workflowState]: {\n type: \"workflow\",\n schema: TrackedStateSchema,\n },\n\n /**\n * Workflow cached steps executions\n */\n [BUILT_IN_STATES.workflowSteps]: {\n type: \"workflow\",\n schema: TrackedStateSchema,\n },\n\n /**\n * Data source metadata for dashboard visibility (knowledge base sources)\n */\n [BUILT_IN_STATES.dsData]: {\n type: \"bot\",\n schema: z.record(z.any()),\n },\n },\n });\n `\n\n // This is done so dedent doesn't unescape newlines in multiline integration config inputs\n const integrationsSection = addIntegrations.length > 0 ? '\\n' + addIntegrations.join('\\n') : ''\n const pluginsSection = addPlugins.length > 0 ? '\\n' + addPlugins.join('\\n') : ''\n const fullContent = content + integrationsSection + pluginsSection + '\\n\\nexport default bot;'\n\n await createFile(path.join(this.outputPath, 'bot.definition.ts'), await formatCode(fullContent))\n }\n\n private async generateBotIndex(): Promise<void> {\n const content = dedent`\n import * as bp from '.botpress'\n import { setupAdkRuntime } from './adk-runtime'\n import { Actions } from './actions'\n import {isMainThread, isWorkerMode, initializeParentWorker, runWorker, BuiltInActions} from '@botpress/runtime/internal'\n import { handlers } from \"@botpress/runtime/runtime\";\n\n const bot = new bp.Bot({\n actions: {},\n register: async (props) => {\n handlers.trigger.triggerRegisterEvent(props)\n }\n })\n\n\n // ============================================================================\n // WORKER INITIALIZATION\n // ============================================================================\n\n if (isWorkerMode() && isMainThread) {\n // Branch 1: Main thread in worker mode - initialize parent with pool\n if (process.env.BP_DEBUG) console.log(\"[Main] Initializing parent worker with pool...\");\n initializeParentWorker(bot);\n } else if (isWorkerMode() && process.env.IS_DEV_WORKER === \"true\") {\n // Branch 2: Worker thread - run child worker\n if (process.env.BP_DEBUG) console.log(\"[Worker] Initializing child worker...\");\n runWorker(bot);\n setupAdkRuntime(bot);\n } else {\n // Branch 3: Worker mode disabled - single-thread mode\n if (process.env.BP_DEBUG) console.log(\"[Bot] Running in single-thread mode\");\n setupAdkRuntime(bot);\n }\n\n export default bot\n `\n\n await createFile(path.join(this.outputPath, 'src', 'index.ts'), await formatCode(content))\n }\n\n private async generatePackageJson(project: AgentProject): Promise<void> {\n const packageJson = {\n name: `@bp-templates/${project.config?.name || 'agent'}-bot`,\n scripts: {\n 'check:type': 'tsc --noEmit',\n },\n private: true,\n dependencies: {},\n devDependencies: {\n typescript: '^5.9.3',\n },\n }\n\n await createFile(path.join(this.outputPath, 'package.json'), JSON.stringify(packageJson, null, 2))\n }\n\n private async generateTsConfig(): Promise<void> {\n const tsConfig = {\n compilerOptions: {\n lib: ['es2022'],\n module: 'es2022',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n moduleResolution: 'bundler',\n allowUnusedLabels: false,\n allowUnreachableCode: false,\n noFallthroughCasesInSwitch: true,\n noImplicitOverride: true,\n noImplicitReturns: true,\n noUncheckedIndexedAccess: true,\n noUnusedParameters: true,\n target: 'es2017',\n baseUrl: '.',\n outDir: 'dist',\n checkJs: false,\n incremental: true,\n exactOptionalPropertyTypes: false,\n resolveJsonModule: true,\n noPropertyAccessFromIndexSignature: false,\n noUnusedLocals: false,\n },\n include: ['.botpress/**/*', 'src/**/*', 'bp_modules/**/*', './*.ts', './*.json', '../*.d.ts'],\n }\n\n await createFile(path.join(this.outputPath, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2))\n }\n\n private async generateGlobalTypes(): Promise<void> {\n const content = dedent`\n // Global types for ADK assets\n declare global {\n const assets: {\n get(path: string): Promise<{\n url: string;\n path: string;\n name: string;\n size: number;\n mime: string;\n hash: string;\n createdAt: string;\n updatedAt: string;\n fileId: string;\n }>;\n };\n }\n\n export {};\n `\n\n await createFile(path.join(this.outputPath, 'global.d.ts'), await formatCode(content))\n }\n\n private async copyAssets(): Promise<void> {\n const assetsPath = path.join(this.projectPath, 'assets')\n const targetPath = path.join(this.outputPath, 'assets')\n\n if (existsSync(assetsPath)) {\n await fs.mkdir(targetPath, { recursive: true })\n // Copy assets recursively\n await this.copyDirectory(assetsPath, targetPath)\n }\n }\n\n private async copyDirectory(src: string, dest: string): Promise<void> {\n const entries = await fs.readdir(src, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n\n if (entry.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true })\n await this.copyDirectory(srcPath, destPath)\n } else {\n await fs.copyFile(srcPath, destPath)\n }\n }\n }\n\n async generateAdkRuntime(): Promise<void> {\n const project = new AgentProject(this.projectPath)\n await project.reload()\n\n const srcDir = path.join(this.outputPath, 'src')\n\n /* <conversations.ts> */ {\n const dest = path.join(srcDir, 'conversations.ts')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n let index = 1\n\n for (const conversation of project.conversations) {\n if (!imports.has(conversation.path)) {\n const name = `conversations_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, conversation.path))\n\n imports.set(conversation.path, {\n name,\n statement: `import * as ${name} from \"${importPath}\";`,\n })\n }\n\n exports.add(\n `\"${conversation.definition.channel}\": ${imports.get(conversation.path)!.name}.${conversation.export}`\n )\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: conversations.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Conversations = {\n ${Array.from(exports).join(',\\n')}\n };\n `\n\n await createFile(dest, await formatCode(content))\n } /* </conversations.ts> */\n\n /* <knowledge.ts> */ {\n const dest = path.join(srcDir, 'knowledge.ts')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n let index = 1\n\n for (const knowledge of project.knowledge) {\n if (!imports.has(knowledge.path)) {\n const name = `knowledge_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, knowledge.path))\n\n imports.set(knowledge.path, {\n name,\n statement: `import * as ${name} from \"${importPath}\";`,\n })\n }\n\n exports.add(`\"${knowledge.definition.name}\": ${imports.get(knowledge.path)!.name}.${knowledge.export}`)\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: knowledge.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Knowledge = {\n ${Array.from(exports).join(',\\n')}\n };\n `\n\n await createFile(dest, await formatCode(content))\n } /* </knowledge.ts> */\n\n /* <triggers.ts> */ {\n const dest = path.join(srcDir, 'triggers.ts')\n const { transforms } = await import('@botpress/sdk')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n const payloadTypes: Record<string, string> = {}\n let index = 1\n\n // First pass: collect imports and exports\n for (const trigger of project.triggers) {\n if (!imports.has(trigger.path)) {\n const name = `triggers_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, trigger.path))\n\n imports.set(trigger.path, {\n name,\n statement: `import * as ${name} from \"${importPath}\";`,\n })\n }\n\n exports.add(`\"${trigger.definition.name}\": ${imports.get(trigger.path)!.name}.${trigger.export}`)\n }\n\n // Second pass: extract payload schemas and compile to TypeScript types\n for (const trigger of project.triggers) {\n try {\n // Import the trigger module to get the actual instance\n const absolutePath = path.join(project.path, trigger.path)\n // Bust module cache to ensure fresh trigger on regeneration\n const triggerModule = await import(`${absolutePath}?t=${Date.now()}`)\n const triggerInstance = triggerModule[trigger.export] || triggerModule.default\n\n if (triggerInstance && triggerInstance.payload) {\n // Convert Zod schema to JSON Schema, then to TypeScript type\n const jsonSchema = transforms.toJSONSchema(triggerInstance.payload)\n const payloadType = transforms.fromJSONSchema(jsonSchema).toTypescriptType()\n payloadTypes[trigger.definition.name] = payloadType\n } else {\n payloadTypes[trigger.definition.name] = '{}'\n }\n } catch (error) {\n console.warn(`Warning: Could not process trigger ${trigger.definition.name}:`, error)\n payloadTypes[trigger.definition.name] = '{}'\n }\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: triggers.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Triggers = {\n ${Array.from(exports).join(',\\n')}\n };\n\n // Extract trigger payload types with compiled TypeScript types\n type _TriggerPayloads = {\n ${Object.entries(payloadTypes)\n .map(([name, type]) => `\"${name}\": ${type}`)\n .join(';\\n ')}\n };\n\n declare global {\n export type TriggerPayloads = _TriggerPayloads;\n }\n `\n\n await createFile(dest, await formatCode(content))\n } /* </triggers.ts> */\n\n /* <workflows.ts> */ {\n const dest = path.join(srcDir, 'workflows.ts')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n let index = 1\n\n for (const workflow of project.workflows) {\n if (isBuiltinWorkflow(workflow.definition.name)) {\n // Built-in workflow - already handled in runtime\n continue\n }\n\n if (!imports.has(workflow.path)) {\n // User-defined workflow - import from project\n const name = `workflows_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, workflow.path))\n\n const statement = `import * as ${name} from \"${importPath}\";`\n imports.set(workflow.path, {\n name,\n statement,\n })\n }\n }\n\n // Generate exports\n for (const workflow of project.workflows) {\n if (isBuiltinWorkflow(workflow.definition.name)) {\n // Built-in workflow - already handled in runtime\n continue\n }\n\n const importEntry = imports.get(workflow.path)!\n const exportStatement = workflow.export.replace('].', ']!.')\n\n exports.add(`\"${workflow.definition.name}\": ${importEntry.name}.${exportStatement}`)\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: workflows.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Workflows = {\n ${Array.from(exports).join(',\\n')}\n };\n `\n\n await createFile(dest, await formatCode(content))\n } /* </workflows.ts> */\n\n /* <actions.ts> */ {\n const dest = path.join(srcDir, 'actions.ts')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n let index = 1\n\n for (const action of project.actions) {\n if (isBuiltinAction(action.definition.name)) {\n // Built-in action - already handled in runtime\n continue\n }\n\n if (!imports.has(action.path)) {\n const name = `actions_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, action.path))\n\n imports.set(action.path, {\n name,\n statement: `import * as ${name} from \"${importPath}\";`,\n })\n }\n\n exports.add(`\"${action.definition.name}\": ${imports.get(action.path)!.name}.${action.export}`)\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: actions.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Actions = {\n ${Array.from(exports).join(',\\n')}\n };\n `\n\n await createFile(dest, await formatCode(content))\n } /* </actions.ts> */\n\n /* <tables.ts> */ {\n const dest = path.join(srcDir, 'tables.ts')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n let index = 1\n\n for (const table of project.tables) {\n if (!imports.has(table.path)) {\n const name = `tables_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, table.path))\n\n imports.set(table.path, {\n name,\n statement: `import * as ${name} from \"${importPath}\";`,\n })\n }\n\n exports.add(`\"${table.definition.name}\": ${imports.get(table.path)!.name}.${table.export}`)\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: tables.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Tables = {\n ${Array.from(exports).join(',\\n')}\n };\n `\n\n await createFile(dest, await formatCode(content))\n } /* </tables.ts> */\n\n /* <config.ts> */ {\n const dest = path.join(srcDir, 'config.ts')\n const importPath = getImportPath(dest, path.join(project.path, 'agent.config.ts'))\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: config.ts\n ////////////////////////////////////////////////////////\n\n import AgentConfigImport from \"${importPath}\";\n\n export const AgentConfig = AgentConfigImport;\n `\n\n await createFile(dest, await formatCode(content))\n } /* </config.ts> */\n\n const content = dedent`\n import * as bp from \".botpress\";\n import { IntegrationDefinitions } from \"./integrations\";\n import { InterfaceDefinitions } from \"./interfaces\";\n import { initializeAssets } from \"./assets-runtime\";\n import { handlers, patchHandlers, agentRegistry, z, initialize, register, registerIntegration } from \"@botpress/runtime/runtime\";\n import { AgentConfig } from \"./config\";\n import { Conversations } from \"./conversations\";\n import { Knowledge } from \"./knowledge\";\n import { Triggers } from \"./triggers\";\n import { Workflows } from \"./workflows\";\n import { Actions } from \"./actions\";\n import { Tables } from \"./tables\";\n import { Interfaces } from \"../../interfaces\";\n\n export function setupAdkRuntime(bot: bp.Bot) {\n // Initialize global error handlers for the runtime\n\n initialize({ config: AgentConfig })\n\n register(...Object.values(Conversations));\n register(...Object.values(Workflows));\n register(...Object.values(Triggers));\n register(...Object.values(Actions));\n register(...Object.values(Tables));\n register(...Object.values(Knowledge));\n\n for (const [alias, { definition }] of Object.entries(IntegrationDefinitions)) {\n registerIntegration({ alias, definition });\n }\n\n // Initialize the global agent registry\n agentRegistry.initialize({\n integrations: Object.entries(IntegrationDefinitions).map(([alias, def]) => ({ ...def, alias })),\n interfaces: Object.entries(InterfaceDefinitions).map(([alias, def]) => ({ ...def, alias })),\n interfacesMapping: Interfaces as Record<string, any>\n });\n\n // Patch bot handlers to add runtime context\n patchHandlers(bot);\n\n // Initialize assets system\n initializeAssets();\n\n // Setup conversation, trigger, and workflow handlers\n handlers.conversation.setup(bot);\n handlers.event.setup(bot);\n handlers.trigger.setup(bot);\n handlers.workflow.setup(bot);\n handlers.actions.setup(bot);\n handlers.plugins.setup(bot);\n }\n `\n\n await createFile(path.join(this.outputPath, 'src', 'adk-runtime.ts'), await formatCode(content))\n }\n\n async copyAssetsRuntime(): Promise<void> {\n const assetsRuntimePath = path.join(this.projectPath, '.adk', 'assets-runtime.ts')\n if (existsSync(assetsRuntimePath)) {\n const content = await fs.readFile(assetsRuntimePath, 'utf-8')\n await createFile(path.join(this.outputPath, 'src', 'assets-runtime.ts'), await formatCode(content))\n }\n }\n}\n\nexport async function generateBotProject(options: BotGeneratorOptions): Promise<void> {\n const generator = new BotGenerator(options)\n await generator.generate()\n await generator.generateAdkRuntime()\n await generator.copyAssetsRuntime()\n\n // Link @botpress/sdk from agent's node_modules to .adk/bot/node_modules\n const botPath = options.outputPath || path.join(options.projectPath, '.adk', 'bot')\n await linkSdk(options.projectPath, botPath)\n\n // Handle devId/botId management\n const devIdManager = new DevIdManager(\n options.projectPath,\n options.outputPath || path.join(options.projectPath, '.adk', 'bot')\n )\n\n // Restore any saved devId/botId from agent.json to project cache\n await devIdManager.restoreDevId()\n\n // Sync integrations\n const integrationSync = new IntegrationSync(\n options.projectPath,\n options.outputPath || path.join(options.projectPath, '.adk', 'bot')\n )\n const integrationSyncResult = await integrationSync.syncIntegrations()\n\n if (integrationSyncResult.errors.length > 0) {\n console.warn(`⚠️ Some integrations failed to sync:`)\n integrationSyncResult.errors.forEach(({ alias, error }) => {\n console.warn(` - ${alias}: ${error}`)\n })\n }\n\n // Sync interfaces\n const interfaceSync = new InterfaceSync(\n options.projectPath,\n options.outputPath || path.join(options.projectPath, '.adk', 'bot')\n )\n const interfaceSyncResult = await interfaceSync.syncInterfaces()\n\n if (interfaceSyncResult.errors.length > 0) {\n console.warn(`⚠️ Some interfaces failed to sync:`)\n interfaceSyncResult.errors.forEach(({ alias, error }) => {\n console.warn(` - ${alias}: ${error}`)\n })\n }\n\n // Sync plugins\n const pluginSync = new PluginSync(\n options.projectPath,\n options.outputPath || path.join(options.projectPath, '.adk', 'bot')\n )\n const pluginSyncResult = await pluginSync.syncPlugins()\n\n if (pluginSyncResult.errors.length > 0) {\n console.warn(`⚠️ Some plugins failed to sync:`)\n pluginSyncResult.errors.forEach(({ alias, error }) => {\n console.warn(` - ${alias}: ${error}`)\n })\n }\n}\n",
|
|
64
|
-
"import {
|
|
62
|
+
"import path from 'path'\nimport crypto from 'crypto'\nimport { readFile } from 'fs/promises'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport { BuiltInWorkflows } from '@botpress/runtime/internal'\n\nfunction isBuiltinWorkflow(name: string): boolean {\n return !!Object.values(BuiltInWorkflows).find((x) => x.name === name)\n}\n\nexport async function generateClientWrapper(project: AgentProject): Promise<void> {\n // Extract action types\n const actionTypes: Array<{ name: string; inputType: string; outputType: string }> = []\n\n for (const action of project.actions) {\n // Skip hidden actions\n if (action.definition.attributes?.visibility === 'hidden') {\n continue\n }\n\n try {\n // Skip built-in actions\n if (action.path === '<adk:builtin>') {\n actionTypes.push({\n name: action.definition.name,\n inputType: 'any',\n outputType: 'any',\n })\n continue\n }\n\n // Import the action module to get types\n const absolutePath = path.join(project.path, action.path)\n const actionModule = await import(`${absolutePath}?t=${Date.now()}`)\n const actionInstance = actionModule[action.export] || actionModule.default\n\n if (actionInstance && actionInstance.input && actionInstance.output) {\n const inputType = actionInstance.input.toTypescriptType\n ? actionInstance.input.toTypescriptType({ treatDefaultAsOptional: true })\n : 'any'\n const outputType = actionInstance.output.toTypescriptType ? actionInstance.output.toTypescriptType() : 'any'\n\n actionTypes.push({\n name: action.definition.name,\n inputType,\n outputType,\n })\n }\n } catch (error) {\n console.warn(`Warning: Could not process action ${action.definition.name}:`, error)\n actionTypes.push({\n name: action.definition.name,\n inputType: 'any',\n outputType: 'any',\n })\n }\n }\n\n // Extract workflow types\n const workflowTypes: Array<{ name: string; inputType: string; outputType: string }> = []\n\n for (const workflow of project.workflows) {\n try {\n if (isBuiltinWorkflow(workflow.definition.name)) {\n continue\n }\n\n const workflowPath = path.join(project.path, workflow.path)\n const workflowModule = await import(`${workflowPath}?t=${Date.now()}`)\n const workflowInstance = workflowModule[workflow.export] || workflowModule.default\n\n if (workflowInstance) {\n const inputType = workflowInstance.inputSchema\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- schema may have toTypescriptType from Zui\n (workflowInstance.inputSchema as any).toTypescriptType?.({ treatDefaultAsOptional: true }) || 'any'\n : '{}'\n\n const outputType = workflowInstance.outputSchema\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- schema may have toTypescriptType from Zui\n (workflowInstance.outputSchema as any).toTypescriptType?.() || 'any'\n : '{}'\n\n workflowTypes.push({\n name: workflow.definition.name,\n inputType,\n outputType,\n })\n }\n } catch (error) {\n console.warn(`Warning: Could not process workflow ${workflow.definition.name}:`, error)\n }\n }\n\n // Extract table types\n const tableTypes: Array<{\n name: string\n inputType: string\n outputType: string\n }> = []\n\n for (const table of project.tables) {\n try {\n const tablePath = path.join(project.path, table.path)\n const tableModule = await import(`${tablePath}?t=${Date.now()}`)\n const tableInstance = tableModule.default || tableModule[table.export]\n\n if (tableInstance && tableInstance.columns) {\n const inputColumns: string[] = []\n const outputColumns: string[] = ['id: number', 'createdAt: string', 'updatedAt: string']\n\n for (const [colName, colDef] of Object.entries(tableInstance.columns)) {\n let schema: unknown\n let computed = false\n\n if (typeof colDef === 'object' && colDef !== null && 'schema' in colDef) {\n const colDefRecord = colDef as Record<string, unknown>\n schema = colDefRecord.schema\n computed = (colDefRecord.computed as boolean) || false\n } else {\n schema = colDef\n }\n\n const schemaObj = schema as Record<string, unknown>\n const tsType =\n typeof schemaObj.toTypescriptType === 'function'\n ? schemaObj.toTypescriptType({ treatDefaultAsOptional: true })\n : 'any'\n\n if (!computed) {\n inputColumns.push(`${colName}: ${tsType}`)\n }\n outputColumns.push(`${colName}: ${tsType}`)\n }\n\n tableTypes.push({\n name: table.definition.name,\n inputType: `{ ${inputColumns.join('; ')} }`,\n outputType: `{ ${outputColumns.join('; ')} }`,\n })\n }\n } catch (error) {\n console.warn(`Warning: Could not process table ${table.definition.name}:`, error)\n }\n }\n\n // Generate the client wrapper code\n const content = `\n// @ts-nocheck\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\nimport type { Client, Workflow } from '@botpress/client'\n\n// Utility type to simplify complex types\ntype Simplify<T> = T extends (...args: infer A) => infer R\n ? (...args: SimplifyTuple<A>) => Simplify<R>\n : T extends Array<infer E>\n ? Array<Simplify<E>>\n : T extends ReadonlyArray<infer E>\n ? ReadonlyArray<Simplify<E>>\n : T extends Promise<infer R>\n ? Promise<Simplify<R>>\n : T extends Buffer\n ? Buffer\n : T extends object\n ? SimplifyObject<T>\n : T\n\ntype SimplifyTuple<T> = T extends [...infer A] ? { [K in keyof A]: Simplify<A[K]> } : never\ntype SimplifyObject<T extends object> = T extends infer O ? { [K in keyof O]: Simplify<O[K]> } : never\n\ntype GenericWorkflowInput = Record<string, any>\ntype GenericWorkflowOutput = Record<string, any>\n\ntype TypedWorkflow<TInput = GenericWorkflowInput, TOutput = GenericWorkflowOutput> = Simplify<\n Omit<Workflow, 'input' | 'output'> & {\n input: TInput\n output: TOutput\n }\n>\n\n// Extract response types from Client methods\ntype CreateWorkflowResponse = Simplify<Awaited<ReturnType<Client['createWorkflow']>>>\ntype GetWorkflowResponse = Simplify<Awaited<ReturnType<Client['getWorkflow']>>>\ntype UpdateWorkflowResponse = Simplify<Awaited<ReturnType<Client['updateWorkflow']>>>\ntype DeleteWorkflowResponse = Simplify<Awaited<ReturnType<Client['deleteWorkflow']>>>\ntype GetOrCreateWorkflowResponse = Simplify<Awaited<ReturnType<Client['getOrCreateWorkflow']>>>\n\ntype CreateTableRowsResponse = Simplify<Awaited<ReturnType<Client['createTableRows']>>>\ntype UpdateTableRowsResponse = Simplify<Awaited<ReturnType<Client['updateTableRows']>>>\ntype UpsertTableRowsResponse = Simplify<Awaited<ReturnType<Client['upsertTableRows']>>>\ntype DeleteTableRowsResponse = Simplify<Awaited<ReturnType<Client['deleteTableRows']>>>\ntype FindTableRowsResponse = Simplify<Awaited<ReturnType<Client['findTableRows']>>>\ntype GetTableRowResponse = Simplify<Awaited<ReturnType<Client['getTableRow']>>>\n\n// Extract parameter types from Client methods\ntype ParamCreateWorkflow = Simplify<Parameters<Client['createWorkflow']>[0]>\ntype ParamGetWorkflow = Simplify<Parameters<Client['getWorkflow']>[0]>\ntype ParamUpdateWorkflow = Simplify<Parameters<Client['updateWorkflow']>[0]>\ntype ParamDeleteWorkflow = Simplify<Parameters<Client['deleteWorkflow']>[0]>\ntype ParamGetOrCreateWorkflow = Simplify<Parameters<Client['getOrCreateWorkflow']>[0]>\n\ntype ParamCreateTableRows = Simplify<Parameters<Client['createTableRows']>[0]>\ntype ParamUpdateTableRows = Simplify<Parameters<Client['updateTableRows']>[0]>\ntype ParamUpsertTableRows = Simplify<Parameters<Client['upsertTableRows']>[0]>\ntype ParamDeleteTableRows = Simplify<Parameters<Client['deleteTableRows']>[0]>\ntype ParamFindTableRows = Simplify<Parameters<Client['findTableRows']>[0]>\ntype ParamGetTableRow = Simplify<Parameters<Client['getTableRow']>[0]>\n\n/**\n * Typed ADK Client\n *\n * Provides strongly-typed wrappers around the Botpress Client for actions, workflows, and tables.\n */\nexport interface AdkClient {\n /**\n * Typed action calls\n */\n actions: {\n ${actionTypes\n .map(\n (action) => `\n /**\n * Call action: ${action.name}\n */\n '${action.name}': (input: ${action.inputType}) => Promise<${action.outputType}>\n `\n )\n .join('\\n')}\n }\n\n /**\n * Typed workflow operations\n */\n workflows: {\n ${workflowTypes\n .map(\n (workflow) => `\n '${workflow.name}': {\n /**\n * Create workflow: ${workflow.name}\n */\n createWorkflow: (params: Omit<ParamCreateWorkflow, 'name' | 'input'> & { input?: ${workflow.inputType} }) => Promise<Omit<CreateWorkflowResponse, 'workflow'> & { workflow: TypedWorkflow<${workflow.inputType}, ${workflow.outputType}> }>\n /**\n * Get workflow by ID\n */\n getWorkflow: (params: ParamGetWorkflow) => Promise<Omit<GetWorkflowResponse, 'workflow'> & { workflow: TypedWorkflow<${workflow.inputType}, ${workflow.outputType}> }>\n /**\n * Update workflow\n */\n updateWorkflow: (params: Omit<ParamUpdateWorkflow, 'output'> & { output?: ${workflow.outputType} }) => Promise<Omit<UpdateWorkflowResponse, 'workflow'> & { workflow: TypedWorkflow<${workflow.inputType}, ${workflow.outputType}> }>\n /**\n * Delete workflow\n */\n deleteWorkflow: (params: ParamDeleteWorkflow) => Promise<DeleteWorkflowResponse>\n /**\n * Get or create workflow with deduplication key\n */\n getOrCreateWorkflow: (params: Omit<ParamGetOrCreateWorkflow, 'name' | 'input'> & { input?: ${workflow.inputType} }) => Promise<Omit<GetOrCreateWorkflowResponse, 'workflow'> & { workflow: TypedWorkflow<${workflow.inputType}, ${workflow.outputType}> }>\n }\n `\n )\n .join('\\n')}\n }\n\n /**\n * Typed table operations\n */\n tables: {\n ${tableTypes\n .map(\n (table) => `\n '${table.name}': {\n /**\n * Find rows in table: ${table.name}\n */\n findTableRows: (params?: Omit<ParamFindTableRows, 'table'>) => Promise<Omit<FindTableRowsResponse, 'rows'> & { rows: Array<${table.outputType}> }>\n /**\n * Get a single row by ID\n */\n getTableRow: (params: Omit<ParamGetTableRow, 'table'>) => Promise<Omit<GetTableRowResponse, 'row'> & { row: ${table.outputType} }>\n /**\n * Create rows in table: ${table.name}\n */\n createTableRows: (params: Omit<ParamCreateTableRows, 'table'>) => Promise<Omit<CreateTableRowsResponse, 'rows'> & { rows: Array<${table.outputType}> }>\n /**\n * Update rows in table: ${table.name}\n */\n updateTableRows: (params: Omit<ParamUpdateTableRows, 'table'>) => Promise<Omit<UpdateTableRowsResponse, 'rows'> & { rows: Array<${table.outputType}> }>\n /**\n * Upsert rows in table: ${table.name}\n */\n upsertTableRows: (params: Omit<ParamUpsertTableRows, 'table'>) => Promise<Omit<UpsertTableRowsResponse, 'rows'> & { rows: Array<${table.outputType}> }>\n /**\n * Delete rows by IDs\n */\n deleteTableRows: (params: Omit<ParamDeleteTableRows, 'table'>) => Promise<Omit<DeleteTableRowsResponse, 'rows'> & { rows: Array<${table.outputType}> }>\n }\n `\n )\n .join('\\n')}\n }\n\n /**\n * Raw Botpress client (no additional typing)\n */\n client: Client\n}\n\n/**\n * Create a typed ADK client wrapper around a Botpress Client\n *\n * @example\n * \\`\\`\\`typescript\n * import { Client } from '@botpress/client'\n * import { createAdkClient } from './.adk/client'\n *\n * const client = new Client({ token: 'xxx', botId: 'yyy' })\n * const adk = createAdkClient(client)\n *\n * // Typed action calls\n * const result = await adk.actions.myAction({ foo: 'bar' })\n *\n * // Typed workflow operations\n * const wf = await adk.workflows.myWorkflow.createWorkflow({ input: { data: 'value' } })\n * const workflow = await adk.workflows.myWorkflow.getWorkflow({ id: wf.workflow.id })\n * await adk.workflows.myWorkflow.updateWorkflow({ id: wf.workflow.id, status: 'completed' })\n * await adk.workflows.myWorkflow.deleteWorkflow({ id: wf.workflow.id })\n * await adk.workflows.myWorkflow.getOrCreateWorkflow({ key: 'unique-key', input: { data: 'value' } })\n *\n * // Typed table operations\n * const rows = await adk.tables.myTable.findTableRows({ filter: { name: 'John' } })\n * const row = await adk.tables.myTable.getTableRow({ id: 123 })\n * await adk.tables.myTable.createTableRows({ rows: [{ name: 'Jane', age: 30 }] })\n * await adk.tables.myTable.updateTableRows({ rows: [{ id: 123, name: 'Jane' }] })\n * await adk.tables.myTable.upsertTableRows({ rows: [{ name: 'Bob', age: 25 }] })\n * await adk.tables.myTable.deleteTableRows({ ids: [123, 456] })\n * \\`\\`\\`\n */\nexport function createAdkClient(client: Client): AdkClient {\n return {\n actions: {\n ${actionTypes\n .map(\n (action) => `\n '${action.name}': async (input: ${action.inputType}) => {\n const response = await client.callAction({\n type: '${action.name}',\n input,\n })\n return response.output as ${action.outputType}\n }\n `\n )\n .join(',\\n')}\n },\n\n workflows: {\n ${workflowTypes\n .map(\n (workflow) => `\n '${workflow.name}': {\n createWorkflow: async (params) => {\n return client.createWorkflow({\n name: '${workflow.name}',\n ...params,\n }) as any\n },\n getWorkflow: async (params) => {\n return client.getWorkflow(params) as any\n },\n updateWorkflow: async (params) => {\n return client.updateWorkflow(params) as any\n },\n deleteWorkflow: async (params) => {\n return client.deleteWorkflow(params) as any\n },\n getOrCreateWorkflow: async (params) => {\n return client.getOrCreateWorkflow({\n name: '${workflow.name}',\n ...params,\n }) as any\n },\n }\n `\n )\n .join(',\\n')}\n },\n\n tables: {\n ${tableTypes\n .map(\n (table) => `\n '${table.name}': {\n findTableRows: async (params) => {\n return client.findTableRows({\n table: '${table.name}',\n ...params,\n }) as any\n },\n getTableRow: async (params) => {\n return client.getTableRow({\n table: '${table.name}',\n ...params,\n }) as any\n },\n createTableRows: async (params) => {\n return client.createTableRows({\n table: '${table.name}',\n ...params,\n }) as any\n },\n updateTableRows: async (params) => {\n return client.updateTableRows({\n table: '${table.name}',\n ...params,\n }) as any\n },\n upsertTableRows: async (params) => {\n return client.upsertTableRows({\n table: '${table.name}',\n ...params,\n }) as any\n },\n deleteTableRows: async (params) => {\n return client.deleteTableRows({\n table: '${table.name}',\n ...params,\n }) as any\n },\n }\n `\n )\n .join(',\\n')}\n },\n\n client,\n }\n}\n`\n\n // Write the client wrapper to .adk/client.ts\n const clientWrapperPath = path.join(project.path, '.adk', 'client.ts')\n const formattedContent = await formatCode(content)\n\n // Calculate hash of content without timestamp to detect actual changes\n const contentHash = crypto\n .createHash('sha256')\n .update(\n formattedContent\n // Remove the timestamp line for hash calculation\n .replace(/\\/\\/ Generated at: .+\\n/, '')\n )\n .digest('hex')\n\n // Check if file exists and has the same content hash\n try {\n const existingContent = await readFile(clientWrapperPath, 'utf-8')\n const existingHash = crypto\n .createHash('sha256')\n .update(\n existingContent\n // Remove the timestamp line for hash calculation\n .replace(/\\/\\/ Generated at: .+\\n/, '')\n )\n .digest('hex')\n\n // If content hasn't changed (ignoring timestamp), skip writing\n if (contentHash === existingHash) {\n return\n }\n } catch {\n // File doesn't exist or can't be read, proceed with writing\n }\n\n // Content has changed, write the file\n await createFile(clientWrapperPath, formattedContent)\n}\n",
|
|
63
|
+
"import dedent from 'dedent'\nimport { existsSync } from 'fs'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport { AgentProject } from '../agent-project/index.js'\nimport {\n fetchServerIntegrationConfigs,\n mergeIntegrationConfig,\n type FetchServerConfigsResult,\n} from '../integrations/config-utils.js'\nimport type { SyncCallbacks } from '../preflight/types.js'\nimport { generateIntegrationTypes } from '../generators/integration-types.js'\nimport { generatePluginTypes } from '../generators/plugin-types.js'\nimport { generatePluginActionTypes } from '../generators/plugin-action-types.js'\nimport { generateInterfaceTypes } from '../generators/interface-types.js'\nimport { generateTableTypes } from '../generators/table-types.js'\nimport { generateTriggerTypes } from '../generators/trigger-types.js'\nimport { generateStateTypes } from '../generators/state-types.js'\nimport { generateTagTypes } from '../generators/tag-types.js'\nimport { generateConfigurationTypes } from '../generators/configuration-types.js'\nimport { generateWorkflowTypes } from '../generators/workflow-types.js'\nimport { generateConversationTypes } from '../generators/conversation-types.js'\nimport { generateEventTypes } from '../generators/event-types.js'\nimport { generateClientWrapper } from '../generators/client-wrapper.js'\nimport { IntegrationManager } from '../integrations/manager.js'\nimport { PluginManager } from '../plugins/manager.js'\nimport { InterfaceManager } from '../interfaces/manager.js'\nimport { createFile } from '../utils/fs.js'\nimport { linkSdk } from '../utils/link-sdk.js'\nimport { pascalCase } from '../utils/strings.js'\nimport { DevIdManager } from './dev-id-manager.js'\nimport { IntegrationSync } from './integration-sync.js'\nimport { InterfaceSync } from './interface-sync.js'\nimport { PluginSync } from './plugin-sync.js'\nimport { formatCode, ADK_VERSION } from '../generators/utils.js'\nimport { z } from '@botpress/sdk'\nimport { getIntegrationAlias, getPluginAlias } from '../utils/ids.js'\n\nconst { transforms } = z\nimport { PluginParser } from '../agent-project/dependencies-parser.js'\nimport { BUILTIN_INTERFACES } from '../constants.js'\nimport { BuiltInActions, BuiltInWorkflows, Primitives, Workflow } from '@botpress/runtime/internal'\nimport { BUILT_IN_TAGS } from '@botpress/runtime/definition'\n\nexport interface BotGeneratorOptions {\n projectPath: string\n outputPath?: string\n adkCommand?: 'adk-dev' | 'adk-build' | 'adk-deploy'\n callbacks?: SyncCallbacks\n}\n\nconst plural = (n: number, word: string): string => `${n} ${word}${n === 1 ? '' : 's'}`\n\nfunction isBuiltinWorkflow(name: string): boolean {\n return !!Object.values(BuiltInWorkflows).find((x) => x.name === name)\n}\n\nfunction isBuiltinAction(name: string): boolean {\n return !!Object.values(BuiltInActions).find((x) => x.name === name)\n}\n\n/**\n * Generate a normalized import path for use in import statements\n * Converts Windows backslashes to forward slashes and removes .ts extension\n */\nfunction getImportPath(from: string, to: string): string {\n return path.relative(path.dirname(from), to).replace(/\\.ts$/, '').replace(/\\\\/g, '/')\n}\n\nexport class BotGenerator {\n private projectPath: string\n private outputPath: string\n private adkCommand?: 'adk-dev' | 'adk-build' | 'adk-deploy'\n private callbacks?: SyncCallbacks\n\n constructor(options: BotGeneratorOptions) {\n this.projectPath = path.resolve(options.projectPath)\n this.outputPath = path.resolve(options.outputPath || path.join(this.projectPath, '.adk'))\n this.adkCommand = options.adkCommand\n this.callbacks = options.callbacks\n }\n\n private async listFilesRecursive(rootDir: string): Promise<string[]> {\n try {\n if (!existsSync(rootDir)) return []\n const result: string[] = []\n const walk = async (dir: string, relativeBase: string) => {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n for (const entry of entries) {\n const abs = path.join(dir, entry.name)\n const rel = path.join(relativeBase, entry.name)\n if (entry.isDirectory()) {\n await walk(abs, rel)\n } else {\n result.push(rel)\n }\n }\n }\n await walk(rootDir, '')\n return result.sort()\n } catch {\n return []\n }\n }\n\n private async removeEmptyDirectories(rootDir: string): Promise<void> {\n if (!existsSync(rootDir)) return\n const removeIfEmpty = async (dir: string) => {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subdir = path.join(dir, entry.name)\n await removeIfEmpty(subdir)\n }\n }\n\n // Re-read after potential removals\n const after = await fs.readdir(dir)\n if (after.length === 0 && dir !== rootDir) {\n try {\n await fs.rmdir(dir, { recursive: false })\n } catch {}\n }\n }\n await removeIfEmpty(rootDir)\n }\n\n async generate(): Promise<void> {\n // Load the agent project\n const project = await AgentProject.load(this.projectPath)\n\n // Create output directory\n await fs.mkdir(this.outputPath, { recursive: true })\n\n // Generate bot files\n await this.generateBotDefinition()\n await this.generateIntegrationsDefinition()\n await this.generatePluginsDefinition()\n await this.generateInterfacesDefinition()\n await this.generateIntegrationsTypes()\n await this.generatePluginsTypes()\n await this.generateInterfacesTypes()\n await this.generateTableTypes()\n await this.generateTriggerTypes()\n await this.generateTagTypes()\n await this.generateStateTypes()\n await this.generateConfigurationTypes()\n await this.generateWorkflowTypes()\n await this.generateConversationTypes()\n await this.generateActionTypes()\n await this.generateEventTypes()\n await this.generateIntegrationActionTypes()\n await this.generatePluginActionTypes()\n await this.generateRuntimeTypes()\n await this.generateClientWrapper()\n await this.generateBotIndex()\n await this.generatePackageJson(project)\n await this.generateTsConfig()\n await this.generateGlobalTypes()\n await this.copyAssets()\n }\n\n private async generateIntegrationsTypes(): Promise<void> {\n // Load the project to get interfaces\n const project = await AgentProject.load(this.projectPath)\n const manager = new IntegrationManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const integrations = await manager.loadIntegrations(project.dependencies || {})\n\n // List existing files before generation (.adk/integrations)\n const integrationsDir = path.join(this.projectPath, '.adk', 'integrations')\n const existingIntegrationFiles = await this.listFilesRecursive(integrationsDir)\n\n let aliases = new Set<string>()\n let files = new Set<string>() // tracks all files created in this run (relative to .adk/integrations)\n\n // Generate imports for each integration\n for (const integration of integrations.integrations) {\n if (integration.definition) {\n const types = await generateIntegrationTypes(integration)\n\n // Use dynamic import for type\n const importPath = `./${path.join('integrations', types.names.paths.index).replace(/\\\\/g, '/')}`\n aliases.add(`\"${integration.alias}\": import(\"${importPath}\").${types.names.typings.index}`)\n\n for (const [filePath, content] of Object.entries(types.files)) {\n const fullPath = path.join(this.projectPath, '.adk', 'integrations', filePath)\n\n const dir = path.dirname(fullPath)\n await fs.mkdir(dir, { recursive: true })\n await createFile(fullPath, content)\n files.add(filePath)\n }\n }\n }\n\n const types = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Generated at: ${new Date().toISOString()}\n ////////////////////////////////////////////////////////\n\n declare module \"@botpress/runtime/_types/integrations\" {\n export type Integrations = {\n ${Array.from(aliases).join(`, `)}\n };\n }\n `\n\n await createFile(path.join(this.projectPath, '.adk', 'integrations-types.d.ts'), await formatCode(types))\n\n // Cleanup stale integration files\n const staleIntegrationFiles = existingIntegrationFiles.filter((f) => !files.has(f))\n if (staleIntegrationFiles.length > 0) {\n for (const rel of staleIntegrationFiles) {\n const abs = path.join(integrationsDir, rel)\n try {\n await fs.rm(abs, { force: true })\n } catch {}\n }\n }\n // remove empty folders after deletion\n await this.removeEmptyDirectories(integrationsDir)\n }\n\n private async generatePluginsTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n const manager = new PluginManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const result = await manager.loadPlugins(project.dependencies || {})\n\n // List existing files before generation (.adk/plugins)\n const pluginsDir = path.join(this.projectPath, '.adk', 'plugins')\n const existingPluginFiles = await this.listFilesRecursive(pluginsDir)\n\n let aliases = new Set<string>()\n let files = new Set<string>()\n\n for (const plugin of result.plugins) {\n if (plugin.definition) {\n const types = await generatePluginTypes(plugin)\n\n const importPath = `./${path.join('plugins', types.names.paths.index).replace(/\\\\/g, '/')}`\n aliases.add(`\"${plugin.alias}\": import(\"${importPath}\").${types.names.typings.index}`)\n\n for (const [filePath, content] of Object.entries(types.files)) {\n const fullPath = path.join(this.projectPath, '.adk', 'plugins', filePath)\n\n const dir = path.dirname(fullPath)\n await fs.mkdir(dir, { recursive: true })\n await createFile(fullPath, content)\n files.add(filePath)\n }\n }\n }\n\n const types = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Generated at: ${new Date().toISOString()}\n ////////////////////////////////////////////////////////\n\n declare module \"@botpress/runtime/_types/plugins\" {\n export type Plugins = {\n ${Array.from(aliases).join(`, `)}\n };\n }\n `\n\n await createFile(path.join(this.projectPath, '.adk', 'plugins-types.d.ts'), await formatCode(types))\n\n // Cleanup stale plugin files\n const stalePluginFiles = existingPluginFiles.filter((f) => !files.has(f))\n if (stalePluginFiles.length > 0) {\n for (const rel of stalePluginFiles) {\n const abs = path.join(pluginsDir, rel)\n try {\n await fs.rm(abs, { force: true })\n } catch {}\n }\n }\n await this.removeEmptyDirectories(pluginsDir)\n }\n\n private async generateTableTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateTableTypes(project)\n }\n\n private async generateTriggerTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateTriggerTypes(project)\n }\n\n private async generateTagTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateTagTypes(project)\n }\n\n private async generateStateTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateStateTypes(project)\n }\n\n private async generateConfigurationTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateConfigurationTypes(project)\n }\n\n private async generateEventTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateEventTypes(project)\n }\n\n private async generateWorkflowTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateWorkflowTypes(project)\n }\n\n private async generateConversationTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateConversationTypes(project)\n }\n\n private async generateActionTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n const { generateActionTypes } = await import('../generators/action-types.js')\n await generateActionTypes(project)\n }\n\n private async generateIntegrationActionTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n const { generateIntegrationActionTypes } = await import('../generators/integration-action-types.js')\n await generateIntegrationActionTypes(project)\n }\n\n private async generatePluginActionTypes(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generatePluginActionTypes(project)\n }\n\n private async generateClientWrapper(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n await generateClientWrapper(project)\n }\n\n private async generateRuntimeTypes(): Promise<void> {\n // Load the project for conditional imports\n const project = await AgentProject.load(this.projectPath)\n\n // Load integrations to generate channel types\n const manager = new IntegrationManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const integrations = await manager.loadIntegrations(project.dependencies || {})\n\n // Collect all channel names from integrations\n const channels: string[] = []\n for (const integration of integrations.integrations) {\n if (integration.definition) {\n const alias = integration.alias\n for (const channelName of Object.keys(integration.definition.channels || {})) {\n channels.push(`\"${alias}.${channelName}\"`)\n }\n }\n }\n\n // Generate channel union type\n const channelsType = channels.length > 0 ? channels.join(' | ') : 'never'\n\n // Get state types from agent config\n let botStateType = '{}'\n let userStateType = '{}'\n\n try {\n const configPath = path.join(project.path, 'agent.config.ts')\n // Bust module cache to ensure fresh config on regeneration\n const configModule = await import(`${configPath}?t=${Date.now()}`)\n const config = configModule.default\n\n if (config?.bot?.state) {\n const botSchema = config.bot.state as z.ZodTypeAny\n if (botSchema.toTypescriptType) {\n botStateType = botSchema.toTypescriptType()\n }\n }\n\n if (config?.user?.state) {\n const userSchema = config.user.state as z.ZodTypeAny\n if (userSchema.toTypescriptType) {\n userStateType = userSchema.toTypescriptType()\n }\n }\n } catch (error) {\n console.warn('Failed to load agent config for state types:', error)\n }\n\n const types = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ndeclare module \"@botpress/runtime/_types/channels\" {\n export type Channels = ${channelsType};\n export type ChannelSpec = Channels | readonly Channels[] | '*';\n}\n\ndeclare module \"@botpress/runtime/_types/state\" {\n export type BotState = ${botStateType};\n export type UserState = ${userStateType};\n}\n`\n\n await createFile(path.join(this.projectPath, '.adk', 'runtime.d.ts'), await formatCode(types))\n }\n\n private async generateInterfacesTypes(): Promise<void> {\n // Load the project to get interfaces\n const project = await AgentProject.load(this.projectPath)\n const integrationManager = new IntegrationManager({\n workspaceId: project.agentInfo?.workspaceId,\n })\n const manager = new InterfaceManager()\n\n // List existing files before generation (.adk/interfaces)\n const interfacesDir = path.join(this.projectPath, '.adk', 'interfaces')\n const existingInterfaceFiles = await this.listFilesRecursive(interfacesDir)\n\n const interfaces = await manager\n .loadInterfaces(project.dependencies || {})\n .then((result) => result.interfaces.filter((int) => int.definition).map((x) => x.definition!))\n\n const integrationsWithAlias = await integrationManager\n .loadIntegrations(project.dependencies || {})\n .then((result) =>\n result.integrations.filter((int) => int.definition).map((x) => ({ alias: x.alias, definition: x.definition! }))\n )\n\n let imports = new Set<string>()\n let aliases = new Set<string>()\n let files = new Set<string>() // tracks all files created in this run (relative to .adk/interfaces)\n\n // Generate imports for each integration\n for (const int of interfaces) {\n const types = await generateInterfaceTypes(int, integrationsWithAlias)\n\n imports.add(\n `import { ${types.names.typings.index} } from \"./${path.join('interfaces', types.names.paths.index).replace(/\\\\/g, '/')}\";`\n )\n\n aliases.add(`\"${types.names.name}\": ${types.names.typings.index}`)\n\n for (const [filePath, content] of Object.entries(types.files)) {\n const fullPath = path.join(this.projectPath, '.adk', 'interfaces', filePath)\n\n const dir = path.dirname(fullPath)\n await fs.mkdir(dir, { recursive: true })\n await createFile(fullPath, content)\n files.add(filePath)\n }\n }\n\n const types = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: interfaces.d.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports).join('\\n')}\n\n declare global {\n export type Interfaces = {\n ${Array.from(aliases).join(`, `)}\n };\n }\n `\n\n const consts = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: interfaces.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map((x) => x.replace('.ts\"', '\"'))\n .join('\\n')}\n\n export const Interfaces = {\n ${Array.from(aliases).join(',\\n')}\n };\n `\n\n await createFile(path.join(this.projectPath, '.adk', 'interfaces.d.ts'), await formatCode(types))\n\n await createFile(path.join(this.projectPath, '.adk', 'interfaces.ts'), await formatCode(consts))\n\n // Cleanup stale interface files\n const staleInterfaceFiles = existingInterfaceFiles.filter((f) => !files.has(f))\n if (staleInterfaceFiles.length > 0) {\n for (const rel of staleInterfaceFiles) {\n const abs = path.join(interfacesDir, rel)\n try {\n await fs.rm(abs, { force: true })\n } catch {}\n }\n }\n // remove empty folders after deletion\n await this.removeEmptyDirectories(interfacesDir)\n }\n\n private async generateIntegrationsDefinition(): Promise<void> {\n // Load the project to get integrations\n const project = await AgentProject.load(this.projectPath)\n const integrations = project.dependencies?.integrations || {}\n\n // Generate imports for each integration\n const imports: string[] = []\n const integrationDefs: string[] = []\n\n for (const [alias] of Object.entries(integrations)) {\n const normalizedAlias = getIntegrationAlias(alias)\n imports.push(`import integration_${normalizedAlias} from \"../bp_modules/integration_${normalizedAlias}\";`)\n integrationDefs.push(`\"${alias}\": integration_${normalizedAlias}`)\n }\n\n const content = dedent`\n import { IntegrationPackage } from \"@botpress/sdk\";\n\n ${imports.length > 0 ? '\\n' + imports.join('\\n') : ''}\n\n export const IntegrationDefinitions = {\n ${integrationDefs.length > 0 ? integrationDefs.join(',\\n') : ''}\n } as Record<string, IntegrationPackage>;\n `\n\n await createFile(path.join(this.outputPath, 'src', 'integrations.ts'), content)\n }\n\n private async generatePluginsDefinition(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n const plugins = project.dependencies?.plugins || {}\n\n const imports: string[] = []\n const pluginDefs: string[] = []\n\n for (const [alias] of Object.entries(plugins)) {\n const normalizedAlias = getPluginAlias(alias)\n imports.push(`import plugin_${normalizedAlias} from \"../bp_modules/plugin_${alias}\";`)\n pluginDefs.push(`\"${alias}\": plugin_${normalizedAlias}`)\n }\n\n const content = dedent`\n import { PluginPackage } from \"@botpress/sdk\";\n\n ${imports.length > 0 ? '\\n' + imports.join('\\n') : ''}\n\n export const PluginDefinitions = {\n ${pluginDefs.length > 0 ? pluginDefs.join(',\\n') : ''}\n } as Record<string, PluginPackage>;\n `\n\n await createFile(path.join(this.outputPath, 'src', 'plugins.ts'), content)\n }\n\n private async generateInterfacesDefinition(): Promise<void> {\n // Use hard-coded built-in interfaces\n const interfaces = BUILTIN_INTERFACES\n\n // Generate imports for each interface\n const imports: string[] = []\n const interfaceDefs: string[] = []\n\n for (const alias of Object.keys(interfaces)) {\n const pascalAlias = pascalCase(alias)\n imports.push(`import interface_${pascalAlias} from \"../bp_modules/interface_${pascalAlias}\";`)\n interfaceDefs.push(`${pascalAlias}: interface_${pascalAlias}`)\n }\n\n const content = dedent`\n import { InterfacePackage } from \"@botpress/sdk\";\n\n ${imports.length > 0 ? '\\n' + imports.join('\\n') : ''}\n\n export const InterfaceDefinitions = {\n ${interfaceDefs.length > 0 ? interfaceDefs.join(',\\n') : ''}\n } as Record<string, InterfacePackage>;\n `\n\n await createFile(path.join(this.outputPath, 'src', 'interfaces.ts'), await formatCode(content))\n }\n\n /**\n * Report the result of fetching and merging server-side integration configs.\n * Only emits messages when there's something meaningful to report.\n */\n private reportServerConfigSync(\n serverConfigResult: FetchServerConfigsResult,\n integrations: Array<{ alias: string; config?: Record<string, unknown> }>\n ): void {\n if (!this.callbacks) {\n return\n }\n\n if (serverConfigResult.error) {\n this.callbacks.onError?.(\n `Failed to fetch remote configs: ${serverConfigResult.error}. Server-only config values may be overwritten.`\n )\n return\n }\n\n if (!serverConfigResult.fetched) {\n return\n }\n\n const configCount = Object.keys(serverConfigResult.configs).length\n if (configCount === 0) {\n return\n }\n\n this.callbacks.onSuccess?.(`Preserved remote configs for ${plural(configCount, 'integration')}`)\n\n for (const { alias, config: localConfig } of integrations) {\n const serverConfig = serverConfigResult.configs[alias]\n if (!serverConfig || Object.keys(serverConfig).length === 0) {\n continue\n }\n\n const preserved = Object.keys(serverConfig).filter((key) => !localConfig || !(key in localConfig))\n if (preserved.length > 0) {\n this.callbacks.onProgress?.(\n ` ${alias}: preserved ${plural(preserved.length, 'remote field')} (${preserved.join(', ')})`\n )\n }\n\n if (localConfig) {\n const overridden = Object.keys(localConfig).filter(\n (key) => key in serverConfig && localConfig[key] !== serverConfig[key]\n )\n if (overridden.length > 0) {\n this.callbacks.onProgress?.(\n ` ${alias}: local overrides ${plural(overridden.length, 'field')} (${overridden.join(', ')})`\n )\n }\n }\n }\n }\n\n private async generateBotDefinition(): Promise<void> {\n const project = await AgentProject.load(this.projectPath)\n const integrations = project.integrations\n // Fetch server-side configs to preserve values (e.g. auth tokens) not in agent.config.ts\n // During deploy/build, fetch from the production bot (botId) to avoid leaking dev config\n const isDeployOrBuild = this.adkCommand === 'adk-deploy' || this.adkCommand === 'adk-build'\n const configTargetBotId = isDeployOrBuild ? project.agentInfo?.botId : undefined\n const serverConfigResult = await fetchServerIntegrationConfigs(project, configTargetBotId)\n this.reportServerConfigSync(serverConfigResult, integrations)\n\n const imports: string[] = []\n const addIntegrations: string[] = []\n\n for (const integration of integrations) {\n const { alias, configurationType, config } = integration\n const importName = `integration_${getIntegrationAlias(alias)}`\n imports.push(`import ${importName} from \"./bp_modules/${importName}\";`)\n\n // \"default\" is not a real configuration type - omit it (API will reject it)\n const configType =\n configurationType && configurationType !== 'default' ? `, configurationType: \"${configurationType}\"` : ''\n\n const mergedConfig = mergeIntegrationConfig(serverConfigResult.configs[alias], config)\n const configData = Object.keys(mergedConfig).length > 0 ? `, configuration: ${JSON.stringify(mergedConfig)}` : ''\n\n // If enabled is explicitly set, use it. Otherwise defer to the server state (default false for new installs).\n const enabled = integration.enabled ?? serverConfigResult.enabledStates[alias] ?? false\n\n addIntegrations.push(\n `bot.addIntegration(${importName}, { alias: \"${alias}\", enabled: ${enabled}${configType}${configData} });`\n )\n }\n\n // Validate plugin dependency references before generating\n const depRefErrors = PluginParser.validateDependencyReferences(project.dependencies || {})\n if (depRefErrors.length > 0) {\n const messages = depRefErrors.map((e) => e.message).join('\\n ')\n throw new Error(`Plugin dependency validation failed:\\n ${messages}`)\n }\n\n // Parse plugins and generate addPlugin() calls (must come AFTER addIntegration)\n const plugins = project.dependencies?.plugins || {}\n const addPlugins: string[] = []\n\n for (const [alias, pluginConfig] of Object.entries(plugins)) {\n const normalizedAlias = getPluginAlias(alias)\n const importName = `plugin_${normalizedAlias}`\n imports.push(`import ${importName} from \"./bp_modules/plugin_${alias}\";`)\n\n const configData =\n pluginConfig.config && Object.keys(pluginConfig.config).length > 0\n ? `, configuration: ${JSON.stringify(pluginConfig.config)}`\n : ''\n const depsData =\n pluginConfig.dependencies && Object.keys(pluginConfig.dependencies).length > 0\n ? `, dependencies: ${JSON.stringify(pluginConfig.dependencies)}`\n : ''\n\n addPlugins.push(`bot.addPlugin(${importName}, { alias: \"${alias}\"${configData}${depsData} });`)\n }\n\n // Load user-defined tags from agent.config.ts\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- tag values accessed with dynamic property access\n const botTags: Record<string, any> = {}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- tag values accessed with dynamic property access\n const userTags: Record<string, any> = {}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- tag values accessed with dynamic property access\n const conversationTags: Record<string, any> = {}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- tag values accessed with dynamic property access\n const messageTags: Record<string, any> = {}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- tag values accessed with dynamic property access\n const workflowTags: Record<string, any> = {}\n\n if (project.config?.bot?.tags) {\n Object.assign(botTags, project.config.bot.tags)\n }\n\n if (project.config?.user?.tags) {\n Object.assign(userTags, project.config.user.tags)\n }\n\n if (project.config?.conversation?.tags) {\n Object.assign(conversationTags, project.config.conversation.tags)\n }\n\n if (project.config?.message?.tags) {\n Object.assign(messageTags, project.config.message.tags)\n }\n\n if (project.config?.workflow?.tags) {\n Object.assign(workflowTags, project.config.workflow.tags)\n }\n\n // Helper to hash strings - creates short uppercase hashes\n const crypto = require('crypto')\n const hashString = (str: string) => {\n return crypto.createHash('md5').update(str).digest('hex').substring(0, 5).toUpperCase()\n }\n\n // For each trigger, we need to add possible tags\n for (const trigger of project.triggers) {\n const triggerName = trigger.definition.name\n\n // Add tag for this trigger - the tag name is based on trigger name\n // The value can be \"*\" for wildcard or a specific match result\n const tagName = `trigger${hashString(triggerName)}`\n conversationTags[tagName] = {\n title: `Trigger: ${triggerName}`,\n description: `Subscribe to events from trigger \"${triggerName}\" (use \"*\" for all events or specific values)`,\n }\n\n // TODO: Only add workflow tags when workflows exist\n // Currently we don't support workflow definitions yet\n // When implemented, check if project.workflows.length > 0\n // workflowTags[tagName] = {\n // title: `Trigger: ${triggerName}`,\n // description: `Subscribe to events from trigger \"${triggerName}\" (use \"*\" for all events or specific values)`\n // };\n }\n\n // Load workflow definitions at build time and generate their schemas\n const workflowDefs: string[] = []\n const recurringWorkflows: Array<{ name: string; schedule: string }> = []\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Workflow generic requires any for heterogeneous collection\n const workflowInstances: Workflow<any>[] = []\n\n for (const workflow of project.workflows) {\n try {\n if (isBuiltinWorkflow(workflow.definition.name)) {\n // Built-in workflow - already handled in runtime\n continue\n }\n\n // User-defined workflow - import from project\n const workflowPath = path.join(project.path, workflow.path)\n // Bust module cache to ensure fresh workflow on regeneration\n const workflowModule = await import(`${workflowPath}?t=${Date.now()}`)\n const workflowInstance = (workflowModule.default || workflowModule[workflow.export]) as Workflow | undefined\n\n if (workflowInstance) {\n workflowInstances.push(workflowInstance)\n }\n } catch (error) {\n console.error(`Failed to load workflow ${workflow.definition.name}:`, error)\n }\n }\n\n for (const workflow of Object.values(BuiltInWorkflows)) {\n workflowInstances.push(workflow)\n }\n\n for (const workflow of workflowInstances) {\n const definition = Primitives.Definitions.getDefinition(workflow)\n if (!Primitives.Definitions.isWorkflowDefinition(definition)) {\n continue\n }\n\n // Check if workflow has a schedule property for recurring execution\n if (definition.schedule) {\n recurringWorkflows.push({\n name: definition.name,\n schedule: definition.schedule,\n })\n }\n\n // Generate the workflow definition as inline code\n const inputSchema = definition.input\n ? transforms.fromJSONSchema(definition.input).naked().toTypescriptSchema()\n : 'z.object({})'\n\n const outputSchema = definition.output\n ? transforms.fromJSONSchema(definition.output).naked().toTypescriptSchema()\n : 'z.object({})'\n\n const parts = []\n if (definition.description) {\n parts.push(`title: ${JSON.stringify(definition.name)}`)\n parts.push(`description: ${JSON.stringify(definition.description)}`)\n }\n parts.push(`input: { schema: ${inputSchema} }`)\n parts.push(`output: { schema: ${outputSchema} }`)\n\n // Add workflow tags with built-in tags spread\n parts.push(`tags: {\n ...BUILT_IN_TAGS.workflow,\n key: {\n title: \"Workflow Key\",\n description: \"Unique key for workflow deduplication\"\n },\n }`)\n\n workflowDefs.push(`\"${definition.name}\": {\\n ${parts.join(',\\n ')}\\n }`)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- action def values accessed with dynamic property access\n const actionDefs: Record<string, any> = {}\n for (const action of project.actions) {\n const def = action.definition\n // Include ALL actions in bot.definition.ts (even hidden ones)\n actionDefs[def.name] = {\n title: def.title,\n description: def.description,\n attributes: def.attributes,\n input: def.input,\n output: def.output,\n cached: def.cached,\n }\n }\n\n const toEventName = (ename: string) => ename.replaceAll(/[^a-zA-Z0-9]/g, '').toLowerCase()\n\n // Load custom events from agent.config.ts\n const customEventDefs: string[] = []\n const configForEvents = project.config as Record<string, unknown> | undefined\n const customEvents = (configForEvents?.events || {}) as Record<\n string,\n { schema?: z.ZodTypeAny; description?: string }\n >\n\n for (const [eventName, eventDef] of Object.entries(customEvents)) {\n const schema = eventDef.schema\n let schemaCode = 'z.object({})'\n\n if (schema && typeof schema.toJSONSchema === 'function') {\n schemaCode = transforms.fromJSONSchema(schema.toJSONSchema()).toTypescriptSchema()\n }\n\n const parts = [`schema: ${schemaCode}`]\n if (eventDef.description) {\n parts.unshift(`description: ${JSON.stringify(eventDef.description)}`)\n }\n\n customEventDefs.push(`\"${eventName}\": {\\n ${parts.join(',\\n ')}\\n }`)\n }\n\n // Get configuration schema if defined\n const configSchema = project.config?.configuration?.schema\n const configSchemaCode = configSchema\n ? transforms.fromJSONSchema(configSchema.toJSONSchema()).toTypescriptSchema()\n : undefined\n\n const content = dedent`\n import { BotDefinition, z } from \"@botpress/sdk\";\n import {\n BUILT_IN_STATES,\n BUILT_IN_TAGS,\n TranscriptSchema,\n TrackedStateSchema,\n WorkflowCallbackEvent,\n WorkflowScheduleEvent,\n WorkflowContinueEvent,\n SubworkflowFinished,\n WorkflowDataRequestEvent,\n } from \"@botpress/runtime/definition\";\n ${imports.length > 0 ? '\\n' + imports.join('\\n') : ''}\n\n const bot = new BotDefinition({\n\n attributes: {\n runtime: \"adk\",\n runtimeVersion: \"${ADK_VERSION}\",\n ${\n Object.keys(botTags).length > 0\n ? Object.entries(botTags)\n .map(\n ([tag, meta]) =>\n `${meta.description ? `// ${meta.description}\\n ` : ''}\"${tag}\": ${JSON.stringify(meta.title)}`\n )\n .join(',\\n ')\n : ''\n }\n },\n ${configSchemaCode ? `\\nconfiguration: {\\n schema: ${configSchemaCode}\\n},\\n` : ''}\n user: {\n tags: {\n ...BUILT_IN_TAGS.user,\n ${Object.entries(userTags)\n .filter(([tag]) => !Object.keys(BUILT_IN_TAGS.user).includes(tag))\n .map(\n ([tag, meta]) =>\n `// ${meta.title}\\n ${meta.description ? `// ${meta.description}\\n ` : ''}\"${tag}\": ${JSON.stringify(meta)}`\n )\n .join(\n ',\\n '\n )}${Object.entries(userTags).filter(([tag]) => !Object.keys(BUILT_IN_TAGS.user).includes(tag)).length > 0 ? ',' : ''}\n },\n },\n message: {\n tags: {\n ...BUILT_IN_TAGS.message,\n ${Object.entries(messageTags)\n .filter(([tag]) => !Object.keys(BUILT_IN_TAGS.message).includes(tag))\n .map(\n ([tag, meta]) =>\n `// ${meta.title}\\n ${meta.description ? `// ${meta.description}\\n ` : ''}\"${tag}\": ${JSON.stringify(meta)}`\n )\n .join(\n ',\\n '\n )}${Object.entries(messageTags).filter(([tag]) => !Object.keys(BUILT_IN_TAGS.message).includes(tag)).length > 0 ? ',' : ''}\n },\n },\n conversation: {\n tags: {\n ...BUILT_IN_TAGS.conversation,\n ${Object.entries(conversationTags)\n .filter(([tag]) => !Object.keys(BUILT_IN_TAGS.conversation).includes(tag))\n .map(\n ([tag, meta]) =>\n `// ${meta.title}\\n ${meta.description ? `// ${meta.description}\\n ` : ''}\"${tag}\": ${JSON.stringify(meta)}`\n )\n .join(\n ',\\n '\n )}${Object.entries(conversationTags).filter(([tag]) => !Object.keys(BUILT_IN_TAGS.conversation).includes(tag)).length > 0 ? ',' : ''}\n },\n },\n ${\n workflowDefs.length > 0\n ? `workflows: {\n ${workflowDefs.join(',\\n ')}\n },`\n : ''\n }\n ${\n Object.keys(actionDefs).length > 0\n ? `actions: {\n ${Object.entries(actionDefs)\n .map(([name, def]) => {\n const parts = []\n if (def.title) parts.push(`title: ${JSON.stringify(def.title)}`)\n if (def.description) parts.push(`description: ${JSON.stringify(def.description)}`)\n if (def.attributes) parts.push(`attributes: ${JSON.stringify(def.attributes)}`)\n parts.push(`input: { schema: ${transforms.fromJSONSchema(def.input).toTypescriptSchema()} }`)\n parts.push(`output: { schema: ${transforms.fromJSONSchema(def.output).toTypescriptSchema()} }`)\n return `\"${name}\": {\\n ${parts.join(',\\n ')}\\n }`\n })\n .join(',\\n ')}\n },`\n : ''\n }\n ${\n recurringWorkflows.length > 0\n ? `recurringEvents: {\n ${recurringWorkflows\n .map(\n (wf) => `\"${toEventName(wf.name + 'Schedule')}\": {\n type: WorkflowScheduleEvent.name,\n schedule: { cron: \"${wf.schedule}\" },\n payload: { workflow: \"${wf.name}\" },\n }`\n )\n .join(',\\n ')}\n },`\n : ''\n }\n\n events: {\n [WorkflowScheduleEvent.name]: {\n schema: WorkflowScheduleEvent.schema,\n },\n [WorkflowCallbackEvent.name]: {\n schema: WorkflowCallbackEvent.schema,\n },\n [WorkflowContinueEvent.name]: {\n schema: WorkflowContinueEvent.schema,\n },\n [SubworkflowFinished.name]: {\n schema: SubworkflowFinished.schema,\n },\n [WorkflowDataRequestEvent.name]: {\n schema: WorkflowDataRequestEvent.schema,\n },\n ${customEventDefs.length > 0 ? customEventDefs.join(',\\n ') + ',' : ''}\n },\n\n states: {\n /**\n * This is the ADK-native conversation state that contains the\n * necessary data to run the conversation and its handlers.\n */\n conversation: {\n type: \"conversation\",\n schema: z.object({ transcript: TranscriptSchema }),\n },\n\n /**\n * This is a generic state to store the conversation-specific state.\n * This is defined by the users at build-time when they define conversations.\n * Because each conversation can have its own state schema, we use \\`z.any()\\`\n */\n [BUILT_IN_STATES.conversation]: {\n type: \"conversation\",\n schema: TrackedStateSchema,\n },\n\n /**\n * Bot-wide global state that persists across all conversations\n */\n [BUILT_IN_STATES.bot]: {\n type: \"bot\",\n schema: TrackedStateSchema,\n },\n\n /**\n * User-specific state that persists across conversations for each user\n */\n [BUILT_IN_STATES.user]: {\n type: \"user\",\n schema: TrackedStateSchema,\n },\n\n /**\n * Workflow-specific state that persists across workflow executions\n */\n [BUILT_IN_STATES.workflowState]: {\n type: \"workflow\",\n schema: TrackedStateSchema,\n },\n\n /**\n * Workflow cached steps executions\n */\n [BUILT_IN_STATES.workflowSteps]: {\n type: \"workflow\",\n schema: TrackedStateSchema,\n },\n\n /**\n * Data source metadata for dashboard visibility (knowledge base sources)\n */\n [BUILT_IN_STATES.dsData]: {\n type: \"bot\",\n schema: z.record(z.any()),\n },\n },\n });\n `\n\n // This is done so dedent doesn't unescape newlines in multiline integration config inputs\n const integrationsSection = addIntegrations.length > 0 ? '\\n' + addIntegrations.join('\\n') : ''\n const pluginsSection = addPlugins.length > 0 ? '\\n' + addPlugins.join('\\n') : ''\n const fullContent = content + integrationsSection + pluginsSection + '\\n\\nexport default bot;'\n\n await createFile(path.join(this.outputPath, 'bot.definition.ts'), await formatCode(fullContent))\n }\n\n private async generateBotIndex(): Promise<void> {\n const content = dedent`\n import * as bp from '.botpress'\n import { setupAdkRuntime } from './adk-runtime'\n import { Actions } from './actions'\n import {isMainThread, isWorkerMode, initializeParentWorker, runWorker, BuiltInActions} from '@botpress/runtime/internal'\n import { handlers } from \"@botpress/runtime/runtime\";\n\n const bot = new bp.Bot({\n actions: {},\n register: async (props) => {\n handlers.trigger.triggerRegisterEvent(props)\n }\n })\n\n\n // ============================================================================\n // WORKER INITIALIZATION\n // ============================================================================\n\n if (isWorkerMode() && isMainThread) {\n // Branch 1: Main thread in worker mode - initialize parent with pool\n if (process.env.BP_DEBUG) console.log(\"[Main] Initializing parent worker with pool...\");\n initializeParentWorker(bot);\n } else if (isWorkerMode() && process.env.IS_DEV_WORKER === \"true\") {\n // Branch 2: Worker thread - run child worker\n if (process.env.BP_DEBUG) console.log(\"[Worker] Initializing child worker...\");\n runWorker(bot);\n setupAdkRuntime(bot);\n } else {\n // Branch 3: Worker mode disabled - single-thread mode\n if (process.env.BP_DEBUG) console.log(\"[Bot] Running in single-thread mode\");\n setupAdkRuntime(bot);\n }\n\n export default bot\n `\n\n await createFile(path.join(this.outputPath, 'src', 'index.ts'), await formatCode(content))\n }\n\n private async generatePackageJson(project: AgentProject): Promise<void> {\n const packageJson = {\n name: `@bp-templates/${project.config?.name || 'agent'}-bot`,\n scripts: {\n 'check:type': 'tsc --noEmit',\n },\n private: true,\n dependencies: {},\n devDependencies: {\n typescript: '^5.9.3',\n },\n }\n\n await createFile(path.join(this.outputPath, 'package.json'), JSON.stringify(packageJson, null, 2))\n }\n\n private async generateTsConfig(): Promise<void> {\n const tsConfig = {\n compilerOptions: {\n lib: ['es2022'],\n module: 'es2022',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n moduleResolution: 'bundler',\n allowUnusedLabels: false,\n allowUnreachableCode: false,\n noFallthroughCasesInSwitch: true,\n noImplicitOverride: true,\n noImplicitReturns: true,\n noUncheckedIndexedAccess: true,\n noUnusedParameters: true,\n target: 'es2017',\n baseUrl: '.',\n outDir: 'dist',\n checkJs: false,\n incremental: true,\n exactOptionalPropertyTypes: false,\n resolveJsonModule: true,\n noPropertyAccessFromIndexSignature: false,\n noUnusedLocals: false,\n },\n include: ['.botpress/**/*', 'src/**/*', 'bp_modules/**/*', './*.ts', './*.json', '../*.d.ts'],\n }\n\n await createFile(path.join(this.outputPath, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2))\n }\n\n private async generateGlobalTypes(): Promise<void> {\n const content = dedent`\n // Global types for ADK assets\n declare global {\n const assets: {\n get(path: string): Promise<{\n url: string;\n path: string;\n name: string;\n size: number;\n mime: string;\n hash: string;\n createdAt: string;\n updatedAt: string;\n fileId: string;\n }>;\n };\n }\n\n export {};\n `\n\n await createFile(path.join(this.outputPath, 'global.d.ts'), await formatCode(content))\n }\n\n private async copyAssets(): Promise<void> {\n const assetsPath = path.join(this.projectPath, 'assets')\n const targetPath = path.join(this.outputPath, 'assets')\n\n if (existsSync(assetsPath)) {\n await fs.mkdir(targetPath, { recursive: true })\n // Copy assets recursively\n await this.copyDirectory(assetsPath, targetPath)\n }\n }\n\n private async copyDirectory(src: string, dest: string): Promise<void> {\n const entries = await fs.readdir(src, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n\n if (entry.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true })\n await this.copyDirectory(srcPath, destPath)\n } else {\n await fs.copyFile(srcPath, destPath)\n }\n }\n }\n\n async generateAdkRuntime(): Promise<void> {\n const project = new AgentProject(this.projectPath)\n await project.reload()\n\n const srcDir = path.join(this.outputPath, 'src')\n\n /* <conversations.ts> */ {\n const dest = path.join(srcDir, 'conversations.ts')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n let index = 1\n\n for (const conversation of project.conversations) {\n if (!imports.has(conversation.path)) {\n const name = `conversations_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, conversation.path))\n\n imports.set(conversation.path, {\n name,\n statement: `import * as ${name} from \"${importPath}\";`,\n })\n }\n\n exports.add(\n `\"${conversation.definition.channel}\": ${imports.get(conversation.path)!.name}.${conversation.export}`\n )\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: conversations.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Conversations = {\n ${Array.from(exports).join(',\\n')}\n };\n `\n\n await createFile(dest, await formatCode(content))\n } /* </conversations.ts> */\n\n /* <knowledge.ts> */ {\n const dest = path.join(srcDir, 'knowledge.ts')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n let index = 1\n\n for (const knowledge of project.knowledge) {\n if (!imports.has(knowledge.path)) {\n const name = `knowledge_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, knowledge.path))\n\n imports.set(knowledge.path, {\n name,\n statement: `import * as ${name} from \"${importPath}\";`,\n })\n }\n\n exports.add(`\"${knowledge.definition.name}\": ${imports.get(knowledge.path)!.name}.${knowledge.export}`)\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: knowledge.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Knowledge = {\n ${Array.from(exports).join(',\\n')}\n };\n `\n\n await createFile(dest, await formatCode(content))\n } /* </knowledge.ts> */\n\n /* <triggers.ts> */ {\n const dest = path.join(srcDir, 'triggers.ts')\n const {\n z: { transforms },\n } = await import('@botpress/sdk')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n const payloadTypes: Record<string, string> = {}\n let index = 1\n\n // First pass: collect imports and exports\n for (const trigger of project.triggers) {\n if (!imports.has(trigger.path)) {\n const name = `triggers_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, trigger.path))\n\n imports.set(trigger.path, {\n name,\n statement: `import * as ${name} from \"${importPath}\";`,\n })\n }\n\n exports.add(`\"${trigger.definition.name}\": ${imports.get(trigger.path)!.name}.${trigger.export}`)\n }\n\n // Second pass: extract payload schemas and compile to TypeScript types\n for (const trigger of project.triggers) {\n try {\n // Import the trigger module to get the actual instance\n const absolutePath = path.join(project.path, trigger.path)\n // Bust module cache to ensure fresh trigger on regeneration\n const triggerModule = await import(`${absolutePath}?t=${Date.now()}`)\n const triggerInstance = triggerModule[trigger.export] || triggerModule.default\n\n if (triggerInstance && triggerInstance.payload) {\n // Convert Zod schema to JSON Schema, then to TypeScript type\n const jsonSchema = transforms.toJSONSchema(triggerInstance.payload)\n const payloadType = transforms.fromJSONSchema(jsonSchema).toTypescriptType()\n payloadTypes[trigger.definition.name] = payloadType\n } else {\n payloadTypes[trigger.definition.name] = '{}'\n }\n } catch (error) {\n console.warn(`Warning: Could not process trigger ${trigger.definition.name}:`, error)\n payloadTypes[trigger.definition.name] = '{}'\n }\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: triggers.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Triggers = {\n ${Array.from(exports).join(',\\n')}\n };\n\n // Extract trigger payload types with compiled TypeScript types\n type _TriggerPayloads = {\n ${Object.entries(payloadTypes)\n .map(([name, type]) => `\"${name}\": ${type}`)\n .join(';\\n ')}\n };\n\n declare global {\n export type TriggerPayloads = _TriggerPayloads;\n }\n `\n\n await createFile(dest, await formatCode(content))\n } /* </triggers.ts> */\n\n /* <workflows.ts> */ {\n const dest = path.join(srcDir, 'workflows.ts')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n let index = 1\n\n for (const workflow of project.workflows) {\n if (isBuiltinWorkflow(workflow.definition.name)) {\n // Built-in workflow - already handled in runtime\n continue\n }\n\n if (!imports.has(workflow.path)) {\n // User-defined workflow - import from project\n const name = `workflows_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, workflow.path))\n\n const statement = `import * as ${name} from \"${importPath}\";`\n imports.set(workflow.path, {\n name,\n statement,\n })\n }\n }\n\n // Generate exports\n for (const workflow of project.workflows) {\n if (isBuiltinWorkflow(workflow.definition.name)) {\n // Built-in workflow - already handled in runtime\n continue\n }\n\n const importEntry = imports.get(workflow.path)!\n const exportStatement = workflow.export.replace('].', ']!.')\n\n exports.add(`\"${workflow.definition.name}\": ${importEntry.name}.${exportStatement}`)\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: workflows.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Workflows = {\n ${Array.from(exports).join(',\\n')}\n };\n `\n\n await createFile(dest, await formatCode(content))\n } /* </workflows.ts> */\n\n /* <actions.ts> */ {\n const dest = path.join(srcDir, 'actions.ts')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n let index = 1\n\n for (const action of project.actions) {\n if (isBuiltinAction(action.definition.name)) {\n // Built-in action - already handled in runtime\n continue\n }\n\n if (!imports.has(action.path)) {\n const name = `actions_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, action.path))\n\n imports.set(action.path, {\n name,\n statement: `import * as ${name} from \"${importPath}\";`,\n })\n }\n\n exports.add(`\"${action.definition.name}\": ${imports.get(action.path)!.name}.${action.export}`)\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: actions.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Actions = {\n ${Array.from(exports).join(',\\n')}\n };\n `\n\n await createFile(dest, await formatCode(content))\n } /* </actions.ts> */\n\n /* <tables.ts> */ {\n const dest = path.join(srcDir, 'tables.ts')\n const imports = new Map<\n string,\n {\n statement: string\n name: string\n }\n >()\n const exports = new Set<string>()\n let index = 1\n\n for (const table of project.tables) {\n if (!imports.has(table.path)) {\n const name = `tables_${index++}`\n const importPath = getImportPath(dest, path.join(project.path, table.path))\n\n imports.set(table.path, {\n name,\n statement: `import * as ${name} from \"${importPath}\";`,\n })\n }\n\n exports.add(`\"${table.definition.name}\": ${imports.get(table.path)!.name}.${table.export}`)\n }\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: tables.ts\n ////////////////////////////////////////////////////////\n\n ${Array.from(imports)\n .map(([, { statement }]) => `${statement}`)\n .join('\\n')}\n\n export const Tables = {\n ${Array.from(exports).join(',\\n')}\n };\n `\n\n await createFile(dest, await formatCode(content))\n } /* </tables.ts> */\n\n /* <config.ts> */ {\n const dest = path.join(srcDir, 'config.ts')\n const importPath = getImportPath(dest, path.join(project.path, 'agent.config.ts'))\n\n const content = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // File: config.ts\n ////////////////////////////////////////////////////////\n\n import AgentConfigImport from \"${importPath}\";\n\n export const AgentConfig = AgentConfigImport;\n `\n\n await createFile(dest, await formatCode(content))\n } /* </config.ts> */\n\n const content = dedent`\n import * as bp from \".botpress\";\n import { IntegrationDefinitions } from \"./integrations\";\n import { InterfaceDefinitions } from \"./interfaces\";\n import { initializeAssets } from \"./assets-runtime\";\n import { handlers, patchHandlers, agentRegistry, z, initialize, register, registerIntegration } from \"@botpress/runtime/runtime\";\n import { AgentConfig } from \"./config\";\n import { Conversations } from \"./conversations\";\n import { Knowledge } from \"./knowledge\";\n import { Triggers } from \"./triggers\";\n import { Workflows } from \"./workflows\";\n import { Actions } from \"./actions\";\n import { Tables } from \"./tables\";\n import { Interfaces } from \"../../interfaces\";\n\n export function setupAdkRuntime(bot: bp.Bot) {\n // Initialize global error handlers for the runtime\n\n initialize({ config: AgentConfig })\n\n register(...Object.values(Conversations));\n register(...Object.values(Workflows));\n register(...Object.values(Triggers));\n register(...Object.values(Actions));\n register(...Object.values(Tables));\n register(...Object.values(Knowledge));\n\n for (const [alias, { definition }] of Object.entries(IntegrationDefinitions)) {\n registerIntegration({ alias, definition });\n }\n\n // Initialize the global agent registry\n agentRegistry.initialize({\n integrations: Object.entries(IntegrationDefinitions).map(([alias, def]) => ({ ...def, alias })),\n interfaces: Object.entries(InterfaceDefinitions).map(([alias, def]) => ({ ...def, alias })),\n interfacesMapping: Interfaces as Record<string, any>\n });\n\n // Patch bot handlers to add runtime context\n patchHandlers(bot);\n\n // Initialize assets system\n initializeAssets();\n\n // Setup conversation, trigger, and workflow handlers\n handlers.conversation.setup(bot);\n handlers.event.setup(bot);\n handlers.trigger.setup(bot);\n handlers.workflow.setup(bot);\n handlers.actions.setup(bot);\n handlers.plugins.setup(bot);\n }\n `\n\n await createFile(path.join(this.outputPath, 'src', 'adk-runtime.ts'), await formatCode(content))\n }\n\n async copyAssetsRuntime(): Promise<void> {\n const assetsRuntimePath = path.join(this.projectPath, '.adk', 'assets-runtime.ts')\n if (existsSync(assetsRuntimePath)) {\n const content = await fs.readFile(assetsRuntimePath, 'utf-8')\n await createFile(path.join(this.outputPath, 'src', 'assets-runtime.ts'), await formatCode(content))\n }\n }\n}\n\nexport async function generateBotProject(options: BotGeneratorOptions): Promise<void> {\n const generator = new BotGenerator(options)\n await generator.generate()\n await generator.generateAdkRuntime()\n await generator.copyAssetsRuntime()\n\n // Link @botpress/sdk from agent's node_modules to .adk/bot/node_modules\n const botPath = options.outputPath || path.join(options.projectPath, '.adk', 'bot')\n await linkSdk(options.projectPath, botPath)\n\n // Handle devId/botId management\n const devIdManager = new DevIdManager(\n options.projectPath,\n options.outputPath || path.join(options.projectPath, '.adk', 'bot')\n )\n\n // Restore any saved devId/botId from agent.json to project cache\n await devIdManager.restoreDevId()\n\n // Sync integrations\n const integrationSync = new IntegrationSync(\n options.projectPath,\n options.outputPath || path.join(options.projectPath, '.adk', 'bot')\n )\n const integrationSyncResult = await integrationSync.syncIntegrations()\n\n if (integrationSyncResult.errors.length > 0) {\n console.warn(`⚠️ Some integrations failed to sync:`)\n integrationSyncResult.errors.forEach(({ alias, error }) => {\n console.warn(` - ${alias}: ${error}`)\n })\n }\n\n // Sync interfaces\n const interfaceSync = new InterfaceSync(\n options.projectPath,\n options.outputPath || path.join(options.projectPath, '.adk', 'bot')\n )\n const interfaceSyncResult = await interfaceSync.syncInterfaces()\n\n if (interfaceSyncResult.errors.length > 0) {\n console.warn(`⚠️ Some interfaces failed to sync:`)\n interfaceSyncResult.errors.forEach(({ alias, error }) => {\n console.warn(` - ${alias}: ${error}`)\n })\n }\n\n // Sync plugins\n const pluginSync = new PluginSync(\n options.projectPath,\n options.outputPath || path.join(options.projectPath, '.adk', 'bot')\n )\n const pluginSyncResult = await pluginSync.syncPlugins()\n\n if (pluginSyncResult.errors.length > 0) {\n console.warn(`⚠️ Some plugins failed to sync:`)\n pluginSyncResult.errors.forEach(({ alias, error }) => {\n console.warn(` - ${alias}: ${error}`)\n })\n }\n}\n",
|
|
64
|
+
"import { z } from '@botpress/sdk'\nimport crypto from 'crypto'\nimport path from 'path'\n\nimport { ParsedPlugin } from '../plugins/types.js'\n\nconst { transforms } = z\nimport { pascalCase, snakeCase } from '../utils/strings.js'\nimport { ADK_VERSION, relative, toMultilineComment, formatCode } from './utils.js'\nimport { getPluginAlias } from '../utils/ids.js'\n\n/**\n * Recursively strip $ref entries from a JSON Schema, replacing them with\n * a permissive object type. Plugin schemas may contain interface entity\n * refs (e.g. \"interface:hitl/entities/hitlSession\") that can't be resolved\n * without fetching the full interface definition. Rather than losing all\n * type info, we replace just the ref'd properties with Record<string, unknown>.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- JSON Schema objects are inherently loosely typed\nfunction stripRefs(schema: Record<string, any>): Record<string, any> {\n if (typeof schema !== 'object' || schema === null) {\n return schema\n }\n\n if (schema.$ref) {\n return { type: 'object', additionalProperties: true, 'x-stripped-ref': schema.$ref }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- JSON Schema objects are inherently loosely typed\n const result: Record<string, any> = {}\n for (const [key, value] of Object.entries(schema)) {\n if (key === '$defs' || key === 'definitions') {\n // Drop local defs since we're stripping all refs\n continue\n }\n if (Array.isArray(value)) {\n result[key] = value.map((item) => (typeof item === 'object' && item !== null ? stripRefs(item) : item))\n } else if (typeof value === 'object' && value !== null) {\n result[key] = stripRefs(value)\n } else {\n result[key] = value\n }\n }\n return result\n}\n\n/**\n * Convert a JSON Schema to a TypeScript type string.\n * Strips $ref entries that can't be locally resolved before conversion.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- JSON Schema objects are inherently loosely typed\nfunction jsonSchemaToTypescript(schema: Record<string, any>): string {\n const cleaned = stripRefs(schema)\n return transforms.fromJSONSchema(cleaned).toTypescriptType()\n}\n\nconst getPluginHash = (plugin: ParsedPlugin): string => {\n return crypto\n .createHash('sha256')\n .update(`${plugin.alias}|${plugin.definition?.id}|${plugin.definition?.version}|${plugin.definition?.updatedAt}`)\n .digest('hex')\n}\n\nconst getPascalAlias = (plugin: ParsedPlugin) => pascalCase(getPluginAlias(plugin.alias))\n\nconst getPluginNames = (plugin: ParsedPlugin) => ({\n typings: {\n index: `Plugin_All_${getPascalAlias(plugin)}`,\n actions: `Plugin_Actions_${getPascalAlias(plugin)}`,\n },\n paths: {\n index: path.join(snakeCase(getPascalAlias(plugin)), `index.ts`),\n actions: path.join(snakeCase(getPascalAlias(plugin)), `actions.ts`),\n },\n})\n\nexport async function generatePluginTypes(plugin: ParsedPlugin): Promise<{\n names: ReturnType<typeof getPluginNames>\n files: Record<string, string>\n}> {\n const names = getPluginNames(plugin)\n const hash = getPluginHash(plugin)\n\n const rel = (to: string): string => {\n const from = names.paths.index\n return relative(from, to).replace(/\\.ts$/i, '')\n }\n\n let tIndex = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Plugin: ${plugin.definition?.name}\n // Version: ${plugin.definition?.version}\n // File: ${names.paths.index}\n // Hash: ${hash}\n // Updated at: ${plugin.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n import { Plugin_Actions_${getPascalAlias(plugin)} } from \"${rel(names.paths.actions)}\";\n\n export * from \"${rel(names.paths.actions)}\";\n\n export type Plugin_All_${getPascalAlias(plugin)} = {\n actions: Plugin_Actions_${getPascalAlias(plugin)};\n };\n `\n\n let tActions = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Plugin: ${plugin.definition?.name}\n // Version: ${plugin.definition?.version}\n // File: ${names.paths.actions}\n // Hash: ${hash}\n // Updated at: ${plugin.definition?.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type Plugin_Actions_${getPascalAlias(plugin)} = {`\n\n for (const [name, action] of Object.entries(plugin.definition!.actions)) {\n const input = jsonSchemaToTypescript(action.input.schema)\n const output = jsonSchemaToTypescript(action.output.schema)\n\n tActions += `\n ${toMultilineComment(`Title: ${action.title || name}\\nDescription: ${action.description || 'No description'}`)}\n \"${name}\": {\n input: ${input};\n output: ${output};\n },\\n`\n }\n\n tActions += `};`\n\n return {\n names,\n files: {\n [names.paths.index]: await formatCode(tIndex),\n [names.paths.actions]: await formatCode(tActions),\n },\n }\n}\n",
|
|
65
65
|
"import { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\n\nexport async function generatePluginActionTypes(project: AgentProject): Promise<void> {\n const content = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ntype Plugins = import(\"@botpress/runtime/_types/plugins\").Plugins;\n\ndeclare module \"@botpress/runtime/_types/plugin-actions\" {\n\nexport interface CallableAction<I, O> {\n (input: I): Promise<O>;\n}\n\ntype Callable<T> = T extends { input: infer I; output: infer O }\n ? CallableAction<I, O>\n : never;\n\ntype PluginsMap<T> = {\n [Plugin in keyof T]: T[Plugin] extends { actions: infer Actions }\n ? {\n actions: {\n [Action in keyof Actions]: Callable<Actions[Action]>;\n };\n }\n : never;\n};\n\nexport type PluginActions = PluginsMap<Plugins>;\n}\n`\n\n const pluginActionTypesPath = path.join(project.path, '.adk', 'plugin-action-types.d.ts')\n await createFile(pluginActionTypesPath, await formatCode(content))\n}\n",
|
|
66
|
-
"import { Integration, Interface } from '@botpress/client'\nimport {
|
|
67
|
-
"import { z } from '@botpress/sdk'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\n\nexport interface TableTypeInfo {\n name: string\n columns: Record<string, { type: string; computed?: boolean; searchable?: boolean }>\n}\n\nexport async function generateTableTypes(project: AgentProject): Promise<void> {\n const tables: TableTypeInfo[] = []\n\n // Load each table file to get the actual column definitions\n for (const tableRef of project.tables) {\n try {\n const tablePath = path.join(project.path, tableRef.path)\n // Bust module cache to ensure fresh table on type generation\n const tableModule = await import(`${tablePath}?t=${Date.now()}`)\n const tableInstance = tableModule.default || tableModule[tableRef.export]\n\n if (tableInstance && tableInstance.columns) {\n const columns: Record<string, { type: string; computed?: boolean; searchable?: boolean }> = {}\n\n for (const [colName, colDef] of Object.entries(tableInstance.columns)) {\n let schema: z.ZodTypeAny\n let computed = false\n let searchable = false\n\n if (typeof colDef === 'object' && colDef !== null && 'schema' in colDef) {\n // Long form\n schema = (colDef as any).schema\n computed = (colDef as any).computed || false\n searchable = (colDef as any).searchable || false\n } else {\n // Short form\n schema = colDef as z.ZodTypeAny\n }\n\n // Convert Zod schema to TypeScript type\n const tsType = schema.toTypescriptType ? schema.toTypescriptType() : 'any' // Fallback if toTypescriptType is not available\n\n columns[colName] = { type: tsType, computed, searchable }\n }\n\n tables.push({\n name: tableRef.definition.name,\n columns,\n })\n }\n } catch (error) {\n console.warn(`Failed to load table ${tableRef.definition.name}:`, error)\n }\n }\n\n // Generate the type definitions\n let content = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ndeclare module \"@botpress/runtime/_types/tables\" {\n export type TableDefinitions = {\n`\n\n if (tables.length === 0) {\n content += ' [key: string]: {\\n'\n content += ' Input: any;\\n'\n content += ' Output: {\\n'\n content += ' id: number;\\n'\n content += ' createdAt: string;\\n'\n content += ' updatedAt: string;\\n'\n content += ' } & any;\\n'\n content += ' };\\n'\n } else {\n for (const table of tables) {\n // Generate the input type without computed columns\n const inputColumns = Object.entries(table.columns)\n .filter(([_, col]) => !col.computed)\n .map(([name, col]) => ` ${name}: ${col.type};`)\n .join('\\n')\n\n // Generate the output type with all columns plus system fields\n const outputColumns = [\n ' id: number;',\n ' createdAt: string;',\n ' updatedAt: string;',\n ...Object.entries(table.columns).map(([name, col]) => ` ${name}: ${col.type};`),\n ].join('\\n')\n\n content += ` // Table: ${table.name}\\n`\n content += ` ${table.name}: {\\n`\n content += ` Input: {\\n${inputColumns}\\n };\\n`\n content += ` Output: {\\n${outputColumns}\\n };\\n`\n content += ` };\\n`\n }\n }\n\n content += ` };\n}\n`\n\n // Write to table-types.d.ts in the .adk folder\n const tableTypesPath = path.join(project.path, '.adk', 'table-types.d.ts')\n await createFile(tableTypesPath, await formatCode(content))\n}\n",
|
|
66
|
+
"import { Integration, Interface } from '@botpress/client'\nimport { z } from '@botpress/sdk'\nimport crypto from 'crypto'\nimport path from 'path'\n\nimport { camelCase, pascalCase, snakeCase } from '../utils/strings.js'\n\nconst { transforms } = z\ntype ZodType = z.ZodType\nimport { ADK_VERSION, formatCode, relative, toMultilineComment } from './utils.js'\n\nexport const sameMajorVersion = (a: string, b: string): boolean => {\n const majorA = a.split('.')[0]\n const majorB = b.split('.')[0]\n return majorA === majorB\n}\n\nconst getIntegrationInterface = (\n integration: Integration,\n int: Interface\n): Integration['interfaces']['string'] | undefined => {\n return Object.values(integration.interfaces || {}).find(\n (x) => x.name === int.name && sameMajorVersion(x.version, int.version)\n )\n}\n\ntype IntegrationWithAlias = { alias: string; definition: Integration }\n\nconst getInterfaceHash = (int: Interface, integrations: IntegrationWithAlias[]): string => {\n const versions = integrations\n .filter((x) => !!getIntegrationInterface(x.definition, int))\n .map((x) => `${x.definition.id}|${x.definition.version}|${x.definition.updatedAt}|${x.alias}`)\n .sort()\n .join('|')\n\n return crypto.createHash('sha256').update(`${int.id}|${int.version}|${int.updatedAt}|${versions}`).digest('hex')\n}\n\nconst getInterfaceNames = (int: Interface) => ({\n name: camelCase(int.name),\n typings: {\n index: `Interface_All_${pascalCase(int.name)}`,\n actions: `Interface_Actions_${pascalCase(int.name)}`,\n },\n paths: {\n index: path.join(snakeCase(int.name), `index.ts`),\n actions: path.join(snakeCase(int.name), `actions.ts`),\n },\n})\n\nexport async function generateInterfaceTypes(\n int: Interface,\n integrations: IntegrationWithAlias[]\n): Promise<{\n names: ReturnType<typeof getInterfaceNames>\n files: Record<string, string>\n}> {\n const names = getInterfaceNames(int)\n const hash = getInterfaceHash(int, integrations)\n\n const implementors = integrations\n .filter((x) => !!getIntegrationInterface(x.definition, int))\n .sort((a, b) => a.alias.localeCompare(b.alias))\n\n const rel = (to: string): string => {\n const from = names.paths.index\n return relative(from, to).replace(/\\.ts$/i, '')\n }\n\n let tIndex = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Interface: ${int.name}\n // Integrations: ${implementors.map((x) => x.alias).join(', ')}\n // Version: ${int.version}\n // File: ${names.paths.index}\n // Hash: ${hash}\n // Updated at: ${int.updatedAt}\n ////////////////////////////////////////////////////////\n\n import { ${names.typings.actions} } from \"${rel(names.paths.actions)}\";\n\n export * from \"${rel(names.paths.actions)}\";\n\n export type ${names.typings.index} = {\n actions: ${names.typings.actions};\n };\n\n export const ${names.typings.index} = {\n actions: ${names.typings.actions},\n }\n `\n\n let iActions = ``\n let cActions = new Set<string>()\n\n for (const { alias, definition: integration } of implementors) {\n iActions += `\n // Integration: ${alias} (${integration.name}@${integration.version})\n // Updated at: ${integration.updatedAt}\n \"${alias}\": {`\n\n for (const [name, action] of Object.entries(int.actions)) {\n const integrationInt = getIntegrationInterface(integration, int)\n const mapping = integrationInt?.actions[name]?.name\n\n if (!mapping) {\n continue\n }\n\n const entities = Object.entries(integrationInt.entities).reduce(\n (acc, [entityName, value]) => {\n const entity = integration.entities[value.name]\n\n if (entity) {\n acc[entityName] = transforms\n .fromJSONSchema(entity.schema)\n .title(entity.title || entityName)\n .describe(entity.description || 'No description')\n }\n return acc\n },\n {} as Record<string, ZodType>\n )\n\n const input = transforms.fromJSONSchema(action.input.schema).dereference(entities).toTypescriptType()\n\n const output = transforms.fromJSONSchema(action.output.schema).dereference(entities).toTypescriptType()\n\n // Use alias for mapping key, integration name for the actual action call\n cActions.add(`\"${alias}:${name}\": \"${alias}:${mapping}\"`)\n\n iActions += `\n ${toMultilineComment(`Title: ${action.title || name}\\nDescription: ${action.description || 'No description'}`)}\n \"${name}\": {\n input: ${input};\n output: ${output};\n },\\n`\n }\n\n iActions += `};`\n }\n\n const tActions = `\n ////////////////////////////////////////////////////////\n // DO NOT EDIT THIS FILE DIRECTLY\n // This file is auto-generated from the Botpress ADK\n // ADK Version: ${ADK_VERSION}\n // Interface: ${int.name}\n // Integrations: ${implementors.map((x) => x.alias).join(', ')}\n // Version: ${int.version}\n // File: ${names.paths.index}\n // Hash: ${hash}\n // Updated at: ${int.updatedAt}\n ////////////////////////////////////////////////////////\n\n export type ${names.typings.actions} = {\n ${iActions}\n };\n\n export const ${names.typings.actions} = {\n ${Array.from(cActions).join(',\\n ')}\n };\n\n `\n\n return {\n names,\n files: {\n [names.paths.index]: await formatCode(tIndex),\n [names.paths.actions]: await formatCode(tActions),\n },\n }\n}\n",
|
|
67
|
+
"import { z } from '@botpress/sdk'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\n\nexport interface TableTypeInfo {\n name: string\n columns: Record<string, { type: string; computed?: boolean; searchable?: boolean }>\n}\n\nexport async function generateTableTypes(project: AgentProject): Promise<void> {\n const tables: TableTypeInfo[] = []\n\n // Load each table file to get the actual column definitions\n for (const tableRef of project.tables) {\n try {\n const tablePath = path.join(project.path, tableRef.path)\n // Bust module cache to ensure fresh table on type generation\n const tableModule = await import(`${tablePath}?t=${Date.now()}`)\n const tableInstance = tableModule.default || tableModule[tableRef.export]\n\n if (tableInstance && tableInstance.columns) {\n const columns: Record<string, { type: string; computed?: boolean; searchable?: boolean }> = {}\n\n for (const [colName, colDef] of Object.entries(tableInstance.columns)) {\n let schema: z.ZodTypeAny\n let computed = false\n let searchable = false\n\n if (typeof colDef === 'object' && colDef !== null && 'schema' in colDef) {\n // Long form\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic column definition shape\n schema = (colDef as any).schema\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic column definition shape\n computed = (colDef as any).computed || false\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic column definition shape\n searchable = (colDef as any).searchable || false\n } else {\n // Short form\n schema = colDef as z.ZodTypeAny\n }\n\n // Convert Zod schema to TypeScript type\n const tsType = schema.toTypescriptType ? schema.toTypescriptType() : 'any' // Fallback if toTypescriptType is not available\n\n columns[colName] = { type: tsType, computed, searchable }\n }\n\n tables.push({\n name: tableRef.definition.name,\n columns,\n })\n }\n } catch (error) {\n console.warn(`Failed to load table ${tableRef.definition.name}:`, error)\n }\n }\n\n // Generate the type definitions\n let content = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ndeclare module \"@botpress/runtime/_types/tables\" {\n export type TableDefinitions = {\n`\n\n if (tables.length === 0) {\n content += ' [key: string]: {\\n'\n content += ' Input: any;\\n'\n content += ' Output: {\\n'\n content += ' id: number;\\n'\n content += ' createdAt: string;\\n'\n content += ' updatedAt: string;\\n'\n content += ' } & any;\\n'\n content += ' };\\n'\n } else {\n for (const table of tables) {\n // Generate the input type without computed columns\n const inputColumns = Object.entries(table.columns)\n .filter(([_, col]) => !col.computed)\n .map(([name, col]) => ` ${name}: ${col.type};`)\n .join('\\n')\n\n // Generate the output type with all columns plus system fields\n const outputColumns = [\n ' id: number;',\n ' createdAt: string;',\n ' updatedAt: string;',\n ...Object.entries(table.columns).map(([name, col]) => ` ${name}: ${col.type};`),\n ].join('\\n')\n\n content += ` // Table: ${table.name}\\n`\n content += ` ${table.name}: {\\n`\n content += ` Input: {\\n${inputColumns}\\n };\\n`\n content += ` Output: {\\n${outputColumns}\\n };\\n`\n content += ` };\\n`\n }\n }\n\n content += ` };\n}\n`\n\n // Write to table-types.d.ts in the .adk folder\n const tableTypesPath = path.join(project.path, '.adk', 'table-types.d.ts')\n await createFile(tableTypesPath, await formatCode(content))\n}\n",
|
|
68
68
|
"import { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\n\nexport async function generateTriggerTypes(project: AgentProject): Promise<void> {\n // Get trigger event subscriptions from definitions\n const triggerEvents: Record<string, string[]> = {}\n\n for (const trigger of project.triggers) {\n // The trigger definition should already contain the events array\n triggerEvents[trigger.definition.name] = trigger.definition.events || []\n }\n\n // Generate Triggers type that maps trigger names to their properties\n const triggersType = Object.entries(triggerEvents)\n .map(([triggerName, events]) => {\n let eventType = 'never'\n if (events.length > 0) {\n eventType = events.map((event) => `Event<\"${event}\">`).join(' | ')\n }\n return ` \"${triggerName}\": {\n events: [${events.map((e) => `\"${e}\"`).join(', ')}];\n event: ${eventType};\n };`\n })\n .join('\\n')\n\n const content = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ntype SDKEvent = import(\"@botpress/client\").Event;\ntype Events = import(\"@botpress/runtime/_types/events\").Events;\n\ntype Event<TName extends keyof Events> = Omit<SDKEvent, \"payload\" | \"type\"> & {\n type: TName;\n payload: Events[TName];\n};\n\ndeclare module \"@botpress/runtime/_types/triggers\" {\n // Map of trigger names to their properties\n export type Triggers = {\n${triggersType}\n };\n}\n`\n\n // Write to trigger-types.d.ts in the .adk folder\n const triggerTypesPath = path.join(project.path, '.adk', 'trigger-types.d.ts')\n await createFile(triggerTypesPath, await formatCode(content))\n}\n",
|
|
69
69
|
"import { z } from '@botpress/sdk'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\n\nexport async function generateStateTypes(project: AgentProject): Promise<void> {\n let botStateType = '{}'\n let userStateType = '{}'\n\n // Load the agent config to get state schemas\n try {\n const configPath = path.join(project.path, 'agent.config.ts')\n // Bust module cache to ensure fresh config on type generation\n const configModule = await import(`${configPath}?t=${Date.now()}`)\n const config = configModule.default\n\n if (config?.bot?.state) {\n const botSchema = config.bot.state as z.ZodTypeAny\n if (botSchema.toTypescriptType) {\n botStateType = botSchema.toTypescriptType()\n }\n }\n\n if (config?.user?.state) {\n const userSchema = config.user.state as z.ZodTypeAny\n if (userSchema.toTypescriptType) {\n userStateType = userSchema.toTypescriptType()\n }\n }\n } catch (error) {\n console.warn('Failed to load agent config for state types:', error)\n }\n\n // Generate the type definitions\n const content = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ndeclare module \"@botpress/runtime/_types/state\" {\n export type BotState = ${botStateType};\n export type UserState = ${userStateType};\n}\n`\n\n // Write to state-types.d.ts in the .adk folder\n const stateTypesPath = path.join(project.path, '.adk', 'state-types.d.ts')\n await createFile(stateTypesPath, await formatCode(content))\n}\n",
|
|
70
70
|
"import { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\nimport { BUILT_IN_TAGS } from '@botpress/runtime/definition'\n\n/**\n * Helper to generate tag type strings from tag definitions\n */\nfunction generateTagTypeString(\n builtInTags: Record<string, { title: string; description: string }>,\n configTags?: Record<string, { title: string; description: string }>\n): string {\n const builtInTagStrings = Object.entries(builtInTags).map(([key, tag]) => {\n const jsdoc = tag.description\n ? `/**\\n * ${tag.title}\\n * \\n * ${tag.description}\\n */\\n `\n : `/** ${tag.title} */\\n `\n return `${jsdoc}${key}?: string | undefined`\n })\n\n const configTagStrings = configTags\n ? Object.entries(configTags).map(([key, tag]) => {\n const jsdoc = tag.description\n ? `/**\\n * ${tag.title}\\n * \\n * ${tag.description}\\n */\\n `\n : `/** ${tag.title} */\\n `\n return `${jsdoc}${key}?: string | undefined`\n })\n : []\n\n const allTags = [...builtInTagStrings, ...configTagStrings]\n\n if (allTags.length === 0) {\n return 'Record<string, string | undefined>'\n }\n\n return `{\\n ${allTags.join('\\n ')}\\n}`\n}\n\nexport async function generateTagTypes(project: AgentProject): Promise<void> {\n let botTagsType = 'Record<string, string | undefined>'\n let userTagsType = 'Record<string, string | undefined>'\n let conversationTagsType = 'Record<string, string | undefined>'\n let messageTagsType = 'Record<string, string | undefined>'\n let workflowTagsType = 'Record<string, string | undefined>'\n\n // Load the agent config to get tag definitions\n try {\n const configPath = path.join(project.path, 'agent.config.ts')\n // Bust module cache to ensure fresh config on type generation\n const configModule = await import(`${configPath}?t=${Date.now()}`)\n const config = configModule.default\n\n // Generate all tag types with built-in tags\n botTagsType = generateTagTypeString(BUILT_IN_TAGS.bot, config?.bot?.tags)\n userTagsType = generateTagTypeString(BUILT_IN_TAGS.user, config?.user?.tags)\n conversationTagsType = generateTagTypeString(BUILT_IN_TAGS.conversation, config?.conversation?.tags)\n messageTagsType = generateTagTypeString(BUILT_IN_TAGS.message, config?.message?.tags)\n workflowTagsType = generateTagTypeString(BUILT_IN_TAGS.workflow, config?.workflow?.tags)\n } catch (error) {\n console.warn('Failed to load agent config for tag types:', error)\n }\n\n // Generate the type definitions\n const content = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ndeclare module \"@botpress/runtime/_types/tags\" {\n /**\n * Bot-level tags defined in agent.config.ts\n */\n export type BotTags = ${botTagsType};\n\n /**\n * User-level tags defined in agent.config.ts\n */\n export type UserTags = ${userTagsType};\n\n /**\n * Conversation-level tags defined in agent.config.ts\n */\n export type ConversationTags = ${conversationTagsType};\n\n /**\n * Message-level tags defined in agent.config.ts\n */\n export type MessageTags = ${messageTagsType};\n\n /**\n * Workflow-level tags defined in agent.config.ts\n */\n export type WorkflowTags = ${workflowTagsType};\n}\n`\n\n // Write to tag-types.d.ts in the .adk folder\n const tagTypesPath = path.join(project.path, '.adk', 'tag-types.d.ts')\n await createFile(tagTypesPath, await formatCode(content))\n}\n",
|
|
71
71
|
"import { z } from '@botpress/sdk'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\n\nexport async function generateConfigurationTypes(project: AgentProject): Promise<void> {\n let configurationType = '{}'\n\n // Load the agent config to get configuration schema\n try {\n const configPath = path.join(project.path, 'agent.config.ts')\n // Bust module cache to ensure fresh config on type generation\n const configModule = await import(`${configPath}?t=${Date.now()}`)\n const config = configModule.default\n\n if (config?.configuration?.schema) {\n const configSchema = config.configuration.schema as z.ZodTypeAny\n if (configSchema.toTypescriptType) {\n configurationType = configSchema.toTypescriptType()\n }\n }\n } catch (error) {\n console.warn('Failed to load agent config for configuration types:', error)\n }\n\n // Generate the type definitions\n const content = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ndeclare module \"@botpress/runtime/_types/configuration\" {\n export type Configuration = ${configurationType};\n}\n`\n\n // Write to configuration-types.d.ts in the .adk folder\n const configTypesPath = path.join(project.path, '.adk', 'configuration-types.d.ts')\n await createFile(configTypesPath, await formatCode(content))\n}\n",
|
|
72
|
-
"import * as path from 'path'\nimport { AgentProject } from '../agent-project/index.js'\nimport { formatCode } from '../generators/utils.js'\nimport { createFile } from '../utils/fs.js'\nimport { BuiltInWorkflows } from '@botpress/runtime/internal'\n\nexport type WorkflowTypeInfo = {\n name: string\n input: string\n output: string\n state: string\n requests: string\n}\n\nfunction isBuiltinWorkflow(name: string): boolean {\n return !!Object.values(BuiltInWorkflows).find((x) => x.name === name)\n}\n\nexport async function generateWorkflowTypes(project: AgentProject): Promise<void> {\n const workflows: WorkflowTypeInfo[] = []\n\n // Load and process each workflow\n for (const workflowRef of project.workflows) {\n try {\n if (isBuiltinWorkflow(workflowRef.definition.name)) {\n // Skip built-in workflows - they're not importable from file paths\n continue\n }\n\n const workflowPath = path.join(project.path, workflowRef.path)\n // Bust module cache to ensure fresh workflow on type generation\n const workflowModule = await import(`${workflowPath}?t=${Date.now()}`)\n\n const workflowInstance = workflowModule[workflowRef.export] || workflowModule.default\n\n if (!workflowInstance) {\n continue\n }\n\n // Extract schemas and convert to TypeScript types\n const inputType = workflowInstance.inputSchema\n ? (workflowInstance.inputSchema as any).toTypescriptType?.() || 'any'\n : '{}'\n\n const outputType = workflowInstance.outputSchema\n ? (workflowInstance.outputSchema as any).toTypescriptType?.() || 'any'\n : '{}'\n\n const stateType = workflowInstance.stateSchema\n ? (workflowInstance.stateSchema as any).toTypescriptType?.() || 'any'\n : '{}'\n\n // Extract requests schemas\n let requestsType = '{}'\n const requestsSchemas = workflowInstance._requestsSchemas\n if (requestsSchemas && Object.keys(requestsSchemas).length > 0) {\n const requestTypes = Object.entries(requestsSchemas)\n .map(([key, schema]) => {\n const type = (schema as any).toTypescriptType?.() || 'any'\n return `${key}: ${type}`\n })\n .join('; ')\n requestsType = `{ ${requestTypes} }`\n }\n\n workflows.push({\n name: workflowRef.definition.name,\n input: inputType,\n output: outputType,\n state: stateType,\n requests: requestsType,\n })\n } catch (error) {\n console.error(`Failed to process workflow ${workflowRef.definition.name}:`, error)\n }\n }\n\n // Generate the type definitions file\n const typeDefinitions = workflows\n .map(\n (workflow) =>\n ` ${workflow.name}: {\n input: ${workflow.input};\n output: ${workflow.output};\n state: ${workflow.state};\n requests: ${workflow.requests};\n tags: WorkflowTags;\n };`\n )\n .join('\\n')\n\n const content = `// Generated workflow type definitions\n// Do not edit this file directly - it will be overwritten\n\ntype WorkflowTags = import(\"@botpress/runtime/_types/tags\").WorkflowTags;\n\ndeclare module \"@botpress/runtime/_types/workflows\" {\n export type WorkflowDefinitions = {\n${typeDefinitions || ' // No workflows defined yet'}\n };\n}`\n\n // Write the workflow types file\n const workflowTypesPath = path.join(project.path, '.adk', 'workflow-types.d.ts')\n await createFile(workflowTypesPath, await formatCode(content))\n}\n",
|
|
73
|
-
"import { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\n\n/**\n * Check if an event schema has a conversationId property.\n * Events with conversationId can be routed to conversations.\n */\nfunction hasConversationIdProperty(schema: any): boolean {\n if (!schema || typeof schema !== 'object') {\n return false\n }\n\n // Check direct properties\n if (schema.properties && 'conversationId' in schema.properties) {\n return true\n }\n\n // Check allOf, anyOf, oneOf\n for (const key of ['allOf', 'anyOf', 'oneOf']) {\n if (Array.isArray(schema[key])) {\n for (const subSchema of schema[key]) {\n if (hasConversationIdProperty(subSchema)) {\n return true\n }\n }\n }\n }\n\n return false\n}\n\nexport async function generateConversationTypes(project: AgentProject): Promise<void> {\n // Map conversation definitions to their channel types\n const conversationTypes: Record<string, { channel: string | string[]; state: string }> = {}\n\n for (const conversationRef of project.conversations) {\n try {\n const conversationPath = path.join(project.path, conversationRef.path)\n // Bust module cache to ensure fresh conversation on type generation\n const conversationModule = await import(`${conversationPath}?t=${Date.now()}`)\n\n const conversationInstance = conversationModule[conversationRef.export] || conversationModule.default\n\n if (!conversationInstance) {\n continue\n }\n\n // Get the channel specification\n const channel = conversationInstance.channel\n\n // Extract state schema and convert to TypeScript type\n const stateType = conversationInstance.schema\n ? (conversationInstance.schema as any).toTypescriptType?.() || 'any'\n : '{}'\n\n // Determine the channel key(s)\n let channels: string[]\n if (channel === '*') {\n // Glob - we'll need to handle this specially\n channels = ['*']\n } else if (Array.isArray(channel)) {\n channels = channel as string[]\n } else {\n channels = [channel as string]\n }\n\n // Store conversation info for each channel\n for (const ch of channels) {\n conversationTypes[ch] = {\n channel: ch,\n state: stateType,\n }\n }\n } catch (error) {\n console.error(`Failed to process conversation ${conversationRef.export}:`, error)\n }\n }\n\n // Build a map of integration alias -> array of routable event names (in format \"integration:eventName\")\n const routableEventsByIntegration: Record<string, string[]> = {}\n\n for (const int of project.integrations) {\n if (!int.definition?.events) continue\n\n const routableEvents: string[] = []\n for (const [eventName, event] of Object.entries(int.definition.events)) {\n if (hasConversationIdProperty(event.schema)) {\n // Use format \"integration:eventName\" for event routing\n routableEvents.push(`${int.alias}:${eventName}`)\n }\n }\n\n if (routableEvents.length > 0) {\n routableEventsByIntegration[int.alias] = routableEvents\n }\n }\n\n // Generate type definitions for each channel\n const channelDefinitions = Object.entries(conversationTypes)\n .filter(([channel]) => channel !== '*') // Filter out glob for now\n .map(([channel, info]) => {\n const [integration, channelName] = channel.split('.')\n return ` \"${channel}\": {\n channel: \"${channel}\";\n integration: \"${integration}\";\n state: ${info.state};\n tags: Integrations[\"${integration}\"][\"channels\"][\"${channelName}\"][\"conversation\"][\"tags\"] & ConversationTags;\n messageTags: Integrations[\"${integration}\"][\"channels\"][\"${channelName}\"][\"message\"][\"tags\"] & MessageTags;\n messages: Integrations[\"${integration}\"][\"channels\"][\"${channelName}\"][\"messages\"];\n events: Integrations[\"${integration}\"][\"events\"];\n };`\n })\n .join('\\n')\n\n // Generate ConversationRoutableEvents type\n // This maps each channel to an array of event names that have conversationId\n const routableEventsDefinitions = Object.entries(conversationTypes)\n .filter(([channel]) => channel !== '*')\n .map(([channel]) => {\n const [integration] = channel.split('.') as [string, ...string[]]\n const events = routableEventsByIntegration[integration] || []\n const eventsTuple
|
|
72
|
+
"import * as path from 'path'\nimport { AgentProject } from '../agent-project/index.js'\nimport { formatCode } from '../generators/utils.js'\nimport { createFile } from '../utils/fs.js'\nimport { BuiltInWorkflows } from '@botpress/runtime/internal'\n\nexport type WorkflowTypeInfo = {\n name: string\n input: string\n output: string\n state: string\n requests: string\n}\n\nfunction isBuiltinWorkflow(name: string): boolean {\n return !!Object.values(BuiltInWorkflows).find((x) => x.name === name)\n}\n\nexport async function generateWorkflowTypes(project: AgentProject): Promise<void> {\n const workflows: WorkflowTypeInfo[] = []\n\n // Load and process each workflow\n for (const workflowRef of project.workflows) {\n try {\n if (isBuiltinWorkflow(workflowRef.definition.name)) {\n // Skip built-in workflows - they're not importable from file paths\n continue\n }\n\n const workflowPath = path.join(project.path, workflowRef.path)\n // Bust module cache to ensure fresh workflow on type generation\n const workflowModule = await import(`${workflowPath}?t=${Date.now()}`)\n\n const workflowInstance = workflowModule[workflowRef.export] || workflowModule.default\n\n if (!workflowInstance) {\n continue\n }\n\n // Extract schemas and convert to TypeScript types\n const inputType = workflowInstance.inputSchema\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK schema toTypescriptType not in type definitions\n (workflowInstance.inputSchema as any).toTypescriptType?.() || 'any'\n : '{}'\n\n const outputType = workflowInstance.outputSchema\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK schema toTypescriptType not in type definitions\n (workflowInstance.outputSchema as any).toTypescriptType?.() || 'any'\n : '{}'\n\n const stateType = workflowInstance.stateSchema\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK schema toTypescriptType not in type definitions\n (workflowInstance.stateSchema as any).toTypescriptType?.() || 'any'\n : '{}'\n\n // Extract requests schemas\n let requestsType = '{}'\n const requestsSchemas = workflowInstance._requestsSchemas\n if (requestsSchemas && Object.keys(requestsSchemas).length > 0) {\n const requestTypes = Object.entries(requestsSchemas)\n .map(([key, schema]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK schema toTypescriptType not in type definitions\n const type = (schema as any).toTypescriptType?.() || 'any'\n return `${key}: ${type}`\n })\n .join('; ')\n requestsType = `{ ${requestTypes} }`\n }\n\n workflows.push({\n name: workflowRef.definition.name,\n input: inputType,\n output: outputType,\n state: stateType,\n requests: requestsType,\n })\n } catch (error) {\n console.error(`Failed to process workflow ${workflowRef.definition.name}:`, error)\n }\n }\n\n // Generate the type definitions file\n const typeDefinitions = workflows\n .map(\n (workflow) =>\n ` ${workflow.name}: {\n input: ${workflow.input};\n output: ${workflow.output};\n state: ${workflow.state};\n requests: ${workflow.requests};\n tags: WorkflowTags;\n };`\n )\n .join('\\n')\n\n const content = `// Generated workflow type definitions\n// Do not edit this file directly - it will be overwritten\n\ntype WorkflowTags = import(\"@botpress/runtime/_types/tags\").WorkflowTags;\n\ndeclare module \"@botpress/runtime/_types/workflows\" {\n export type WorkflowDefinitions = {\n${typeDefinitions || ' // No workflows defined yet'}\n };\n}`\n\n // Write the workflow types file\n const workflowTypesPath = path.join(project.path, '.adk', 'workflow-types.d.ts')\n await createFile(workflowTypesPath, await formatCode(content))\n}\n",
|
|
73
|
+
"import { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\n\n/**\n * Check if an event schema has a conversationId property.\n * Events with conversationId can be routed to conversations.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- schema is a dynamic Zod object\nfunction hasConversationIdProperty(schema: any): boolean {\n if (!schema || typeof schema !== 'object') {\n return false\n }\n\n // Check direct properties\n if (schema.properties && 'conversationId' in schema.properties) {\n return true\n }\n\n // Check allOf, anyOf, oneOf\n for (const key of ['allOf', 'anyOf', 'oneOf']) {\n if (Array.isArray(schema[key])) {\n for (const subSchema of schema[key]) {\n if (hasConversationIdProperty(subSchema)) {\n return true\n }\n }\n }\n }\n\n return false\n}\n\nexport async function generateConversationTypes(project: AgentProject): Promise<void> {\n // Map conversation definitions to their channel types\n const conversationTypes: Record<string, { channel: string | string[]; state: string }> = {}\n\n for (const conversationRef of project.conversations) {\n try {\n const conversationPath = path.join(project.path, conversationRef.path)\n // Bust module cache to ensure fresh conversation on type generation\n const conversationModule = await import(`${conversationPath}?t=${Date.now()}`)\n\n const conversationInstance = conversationModule[conversationRef.export] || conversationModule.default\n\n if (!conversationInstance) {\n continue\n }\n\n // Get the channel specification\n const channel = conversationInstance.channel\n\n // Extract state schema and convert to TypeScript type\n const stateType = conversationInstance.schema\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK schema method not in type definitions\n (conversationInstance.schema as any).toTypescriptType?.() || 'any'\n : '{}'\n\n // Determine the channel key(s)\n let channels: string[]\n if (channel === '*') {\n // Glob - we'll need to handle this specially\n channels = ['*']\n } else if (Array.isArray(channel)) {\n channels = channel as string[]\n } else {\n channels = [channel as string]\n }\n\n // Store conversation info for each channel\n for (const ch of channels) {\n conversationTypes[ch] = {\n channel: ch,\n state: stateType,\n }\n }\n } catch (error) {\n console.error(`Failed to process conversation ${conversationRef.export}:`, error)\n }\n }\n\n // Build a map of integration alias -> array of routable event names (in format \"integration:eventName\")\n const routableEventsByIntegration: Record<string, string[]> = {}\n\n for (const int of project.integrations) {\n if (!int.definition?.events) continue\n\n const routableEvents: string[] = []\n for (const [eventName, event] of Object.entries(int.definition.events)) {\n if (hasConversationIdProperty(event.schema)) {\n // Use format \"integration:eventName\" for event routing\n routableEvents.push(`${int.alias}:${eventName}`)\n }\n }\n\n if (routableEvents.length > 0) {\n routableEventsByIntegration[int.alias] = routableEvents\n }\n }\n\n // Generate type definitions for each channel\n const channelDefinitions = Object.entries(conversationTypes)\n .filter(([channel]) => channel !== '*') // Filter out glob for now\n .map(([channel, info]) => {\n const [integration, channelName] = channel.split('.')\n return ` \"${channel}\": {\n channel: \"${channel}\";\n integration: \"${integration}\";\n state: ${info.state};\n tags: Integrations[\"${integration}\"][\"channels\"][\"${channelName}\"][\"conversation\"][\"tags\"] & ConversationTags;\n messageTags: Integrations[\"${integration}\"][\"channels\"][\"${channelName}\"][\"message\"][\"tags\"] & MessageTags;\n messages: Integrations[\"${integration}\"][\"channels\"][\"${channelName}\"][\"messages\"];\n events: Integrations[\"${integration}\"][\"events\"];\n };`\n })\n .join('\\n')\n\n // Generate ConversationRoutableEvents type\n // This maps each channel to an array of event names that have conversationId\n const routableEventsDefinitions = Object.entries(conversationTypes)\n .filter(([channel]) => channel !== '*')\n .map(([channel]) => {\n const [integration] = channel.split('.') as [string, ...string[]]\n const events = routableEventsByIntegration[integration] || []\n const eventsTuple =\n events.length > 0 ? `readonly [${events.map((e: string) => `\"${e}\"`).join(', ')}]` : 'readonly []'\n return ` \"${channel}\": ${eventsTuple};`\n })\n .join('\\n')\n\n const content = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ntype Integrations = import(\"@botpress/runtime/_types/integrations\").Integrations;\ntype ConversationTags = import(\"@botpress/runtime/_types/tags\").ConversationTags;\ntype MessageTags = import(\"@botpress/runtime/_types/tags\").MessageTags;\n\ndeclare module \"@botpress/runtime/_types/conversations\" {\n export type ConversationDefinitions = {\n${channelDefinitions || ' // No conversations defined yet'}\n };\n\n /**\n * Events that can be routed to conversations (events with conversationId property).\n * Keyed by channel, containing a tuple of event names that have conversationId.\n */\n export type ConversationRoutableEvents = {\n${routableEventsDefinitions || ' // No routable events found'}\n };\n}\n`\n\n // Write to conversation-types.d.ts in the .adk folder\n const conversationTypesPath = path.join(project.path, '.adk', 'conversation-types.d.ts')\n await createFile(conversationTypesPath, await formatCode(content))\n}\n",
|
|
74
74
|
"import { AgentProject } from '../agent-project/agent-project.js'\nimport { ADK_VERSION, formatCode } from './utils.js'\nimport { createFile } from '../utils/fs.js'\nimport path from 'path'\nimport { z } from '@botpress/sdk'\n\ntype EventDefinitionEntry = {\n schema?: z.ZodTypeAny\n description?: string\n}\n\nexport async function generateEventTypes(project: AgentProject): Promise<void> {\n const defaultEvents = ['register: {}']\n // Collect all integration events\n const integrationEvents: string[] = []\n\n for (const int of project.integrations) {\n for (const event in int.definition?.events || []) {\n integrationEvents.push(`\"${int.alias}:${event}\": Integrations[\"${int.alias}\"][\"events\"][\"${event}\"];`)\n }\n }\n\n // Collect custom events from agent.config.ts\n const customEvents: string[] = []\n\n // Access events from config - use type assertion since the config is dynamically loaded\n const config = project.config as Record<string, unknown> | undefined\n const customEventEntries = (config?.events || {}) as Record<string, EventDefinitionEntry>\n\n for (const [eventName, eventDef] of Object.entries(customEventEntries)) {\n const schema = eventDef.schema\n let payloadType = '{}'\n\n if (schema && typeof schema.toTypescriptType === 'function') {\n payloadType = schema.toTypescriptType()\n }\n\n customEvents.push(`\"${eventName}\": ${payloadType};`)\n }\n\n const allEvents = [...integrationEvents, ...customEvents, ...defaultEvents]\n\n const content = `\n////////////////////////////////////////////////////////\n// DO NOT EDIT THIS FILE DIRECTLY\n// This file is auto-generated from the Botpress ADK\n// ADK Version: ${ADK_VERSION}\n// Generated at: ${new Date().toISOString()}\n////////////////////////////////////////////////////////\n\ntype Integrations = import(\"@botpress/runtime/_types/integrations\").Integrations;\n\ndeclare module \"@botpress/runtime/_types/events\" {\n /**\n * Global Events type that includes all integration events and custom events.\n * Use this type to reference any event that can occur in the system.\n *\n * Events are namespaced by their source:\n * - Integration events: \"<integration>:<eventName>\" (e.g., \"linear:issueCreated\")\n * - Custom events: \"<eventName>\" (e.g., \"orderPlaced\", \"userRegistered\")\n */\n export type Events = {\n${allEvents.map((e) => ` ${e}`).join('\\n')}\n };\n\n // Export helper type for event names\n export type EventName = keyof Events;\n\n // Export helper to get event payload type\n export type EventPayload<T extends EventName> = Events[T];\n}\n`\n\n // Write to event-types.d.ts in the .adk folder\n const eventTypesPath = path.join(project.path, '.adk', 'event-types.d.ts')\n await createFile(eventTypesPath, await formatCode(content))\n}\n",
|
|
75
75
|
"import { existsSync, realpathSync } from 'fs'\nimport fs from 'fs/promises'\nimport path from 'path'\n\n/**\n * Finds a package by name by walking up the directory tree looking in node_modules.\n * If startDir is a symlink (common with pnpm), it will resolve the real path first.\n */\nfunction findPackage(name: string, startDir: string): string | null {\n // Resolve symlinks to handle pnpm's node_modules structure\n let current: string\n try {\n current = realpathSync(startDir)\n } catch {\n current = startDir\n }\n\n while (current !== path.dirname(current)) {\n const pkgPath = path.join(current, 'node_modules', name)\n if (existsSync(pkgPath)) {\n return pkgPath\n }\n current = path.dirname(current)\n }\n return null\n}\n\n/**\n * Links @botpress/sdk from the agent's node_modules to .adk/bot/node_modules\n *\n * This ensures that the generated bot project can resolve @botpress/sdk\n * using the same version that @botpress/runtime depends on.\n *\n * The linking strategy:\n * 1. If .adk/bot/node_modules/@botpress/sdk already exists, do nothing\n * 2. Find @botpress/runtime from the agent directory\n * 3. Find @botpress/sdk from the runtime's location (either nested or by walking up)\n * 4. Create a symlink in .adk/bot/node_modules/@botpress/sdk pointing to the found SDK\n */\nexport async function linkSdk(agentDir: string, botDir: string): Promise<void> {\n const targetSdkPath = path.join(botDir, 'node_modules', '@botpress', 'sdk')\n\n // If SDK already exists in bot's node_modules, we're done\n if (existsSync(targetSdkPath)) {\n return\n }\n\n // Find @botpress/runtime from the agent directory\n const runtimePath = findPackage('@botpress/runtime', agentDir)\n if (!runtimePath) {\n console.warn('Warning: Could not find @botpress/runtime in agent directory')\n return\n }\n\n // Find @botpress/sdk from the runtime's location\n // First try nested (runtime might have its own node_modules)\n // Then try walking up from runtime\n let sdkPath = findPackage('@botpress/sdk', runtimePath)\n\n if (!sdkPath) {\n console.warn(`Warning: Could not find @botpress/sdk from @botpress/runtime location (${runtimePath})`)\n return\n }\n\n // Create the target directory structure\n const targetBotpressDir = path.join(botDir, 'node_modules', '@botpress')\n await fs.mkdir(targetBotpressDir, { recursive: true })\n\n // Create symlink - use 'dir' on Windows, default (no type) on Unix/macOS\n const symlinkType = process.platform === 'win32' ? 'junction' : undefined\n await fs.symlink(sdkPath, targetSdkPath, symlinkType)\n}\n",
|
|
76
|
-
"import path from 'path'\nimport fs from 'fs/promises'\nimport
|
|
76
|
+
"import path from 'path'\nimport fs from 'fs/promises'\nimport createDebug from 'debug'\nimport { Client } from '@botpress/client'\nimport { auth } from '../auth/index.js'\nimport { AgentProject, ValidationErrors } from '../agent-project/index.js'\n\nconst debug = createDebug('adk:dev-id-manager')\n\nexport interface ProjectCache {\n devId?: string\n botId?: string\n}\n\nexport class DevIdManager {\n private projectPath: string\n private botProjectPath: string\n private projectCachePath: string\n private client?: Client\n\n constructor(projectPath: string, botProjectPath: string) {\n this.projectPath = projectPath\n this.botProjectPath = botProjectPath\n this.projectCachePath = path.join(botProjectPath, '.botpress', 'project.cache.json')\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n const project = await this.getProject()\n\n // Use workspaceId from agent.json if available, otherwise fall back to profile\n const workspaceId = project.agentInfo?.workspaceId || credentials.workspaceId\n\n if (!workspaceId) {\n throw new Error('No workspace ID found in agent.json or current profile. Please login again with \"adk login\"')\n }\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId: workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n async getProject(): Promise<AgentProject> {\n return await AgentProject.load(this.projectPath)\n }\n\n async readProjectCache(): Promise<ProjectCache> {\n try {\n const content = await fs.readFile(this.projectCachePath, 'utf-8')\n\n if (content.trim().length === 0) {\n debug('project cache is empty, treating as bootstrap state: %s', this.projectCachePath)\n return {}\n }\n\n const parsed = JSON.parse(content)\n\n if (!isProjectCache(parsed)) {\n debug('project cache contains unexpected JSON type, treating as bootstrap state: %s', this.projectCachePath)\n return {}\n }\n\n return parsed\n } catch (error) {\n if (isMissingFileError(error)) {\n debug('project cache missing, treating as bootstrap state: %s', this.projectCachePath)\n return {}\n }\n\n if (error instanceof SyntaxError) {\n debug(\n 'project cache contains transient invalid JSON, treating as bootstrap state: %s (%O)',\n this.projectCachePath,\n error\n )\n return {}\n }\n\n console.error('Error reading project.cache.json:', error)\n }\n\n return {}\n }\n\n async saveProjectCache(cache: ProjectCache): Promise<void> {\n try {\n // Ensure directory exists\n await fs.mkdir(path.dirname(this.projectCachePath), { recursive: true })\n\n await fs.writeFile(this.projectCachePath, JSON.stringify(cache, null, 2))\n } catch (error) {\n console.error('Error saving project.cache.json:', error)\n }\n }\n\n async preserveDevId(): Promise<void> {\n // Read devId from project cache after bp dev creates it\n const projectCache = await this.readProjectCache()\n if (projectCache.devId) {\n // Save it to agent.json using AgentProject methods\n const project = await this.getProject()\n\n if (!project.agentInfo) {\n // Agent must be linked before running dev mode\n throw ValidationErrors.agentNotLinked()\n }\n\n // Update agent.local.json with devId (not agent.json — avoids merge conflicts)\n await project.updateAgentLocalInfo({\n devId: projectCache.devId,\n })\n }\n }\n\n async restoreDevId(): Promise<void> {\n // Read from agent.json using AgentProject\n const project = await this.getProject()\n const agentInfo = project.agentInfo\n\n if (agentInfo?.devId || agentInfo?.botId) {\n // Create project cache with the saved IDs\n const cache: ProjectCache = {}\n\n if (agentInfo.devId) {\n cache.devId = agentInfo.devId\n }\n\n if (agentInfo.botId) {\n cache.botId = agentInfo.botId\n }\n\n await this.saveProjectCache(cache)\n }\n }\n\n async checkDevBotExists(): Promise<boolean> {\n const project = await this.getProject()\n const agentInfo = project.agentInfo\n\n // If we have a devId, check if the bot still exists\n if (agentInfo?.devId) {\n try {\n const client = await this.getClient()\n await client.getBot({ id: agentInfo.devId })\n // Bot exists\n return true\n } catch {\n // Bot doesn't exist or error getting it\n return false\n }\n }\n\n // No devId set\n return false\n }\n}\n\nfunction isMissingFileError(error: unknown): error is NodeJS.ErrnoException {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT'\n}\n\nfunction isProjectCache(value: unknown): value is ProjectCache {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n",
|
|
77
77
|
"import path from 'path'\nimport fs from 'fs/promises'\nimport { existsSync } from 'fs'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { auth } from '../auth/index.js'\nimport { getIntegrationAlias } from '../utils/ids.js'\nimport { BpAddCommand } from '../commands/bp-add-command.js'\n\nexport interface IntegrationInfo {\n alias: string\n name: string\n version: string\n fullVersion: string // e.g., \"slack@2.5.5\"\n}\n\nexport interface SyncResult {\n synced: IntegrationInfo[]\n errors: Array<{ alias: string; error: string }>\n}\n\nexport class IntegrationSync {\n private projectPath: string\n private botProjectPath: string\n private bpModulesPath: string\n\n constructor(projectPath: string, botProjectPath: string) {\n this.projectPath = projectPath\n this.botProjectPath = botProjectPath\n this.bpModulesPath = path.join(botProjectPath, 'bp_modules')\n }\n\n /**\n * Parse agent.config.ts dependencies integrations into IntegrationInfo objects\n */\n private async parseIntegrations(): Promise<IntegrationInfo[]> {\n const project = await AgentProject.load(this.projectPath)\n const dependencies = project.dependencies\n\n if (!dependencies?.integrations) {\n return []\n }\n\n const integrations: IntegrationInfo[] = []\n\n for (const [alias, config] of Object.entries(dependencies.integrations)) {\n let version: string\n let name: string\n\n if (typeof config === 'string') {\n // Simple format: \"openai@15.0.4\"\n version = config\n const parts = version.split('@')\n name = parts[0] || ''\n } else {\n // Object format: { version: \"slack@2.5.5\", ... }\n version = config.version\n const parts = version.split('@')\n name = parts[0] || ''\n }\n\n integrations.push({\n alias: getIntegrationAlias(alias),\n name,\n version: version.split('@')[1] || 'latest',\n fullVersion: version,\n })\n }\n\n return integrations\n }\n\n /**\n * Check if an integration is already installed with the correct version\n */\n private async isIntegrationSynced(integration: IntegrationInfo): Promise<boolean> {\n const targetFolder = path.join(this.bpModulesPath, `integration_${integration.alias}`)\n\n if (!existsSync(targetFolder)) {\n return false\n }\n\n // Check if the index.ts has the correct version\n try {\n const indexPath = path.join(targetFolder, 'index.ts')\n if (!existsSync(indexPath)) {\n return false\n }\n\n const indexContent = await fs.readFile(indexPath, 'utf-8')\n\n // Look for version in the format: version: \"2.5.5\",\n const versionMatch = indexContent.match(/version:\\s*[\"']([^\"']+)[\"']/)\n if (!versionMatch) {\n return false\n }\n\n const installedVersion = versionMatch[1]\n return installedVersion === integration.version\n } catch {\n return false\n }\n }\n\n /**\n * Install an integration using bp CLI\n */\n private async installIntegration(integration: IntegrationInfo): Promise<void> {\n // Get credentials\n const credentials = await auth.getActiveCredentials()\n const project = await AgentProject.load(this.projectPath)\n const workspaceId = project.agentInfo?.workspaceId || credentials.workspaceId\n\n if (!workspaceId) {\n throw new Error('No workspace ID found. Please login with \"adk login\"')\n }\n\n const command = new BpAddCommand({\n resource: `integration:${integration.fullVersion}`,\n botPath: this.botProjectPath,\n workspaceId,\n credentials,\n })\n\n await command.run()\n await command.output()\n }\n\n /**\n * Rename integration folder from bp_modules/{name} to bp_modules/integration_{alias}\n */\n private async renameIntegrationFolder(integration: IntegrationInfo): Promise<void> {\n const sourceFolder = path.join(this.bpModulesPath, integration.name.replace('/', '-'))\n\n const targetFolder = path.join(this.bpModulesPath, `integration_${integration.alias}`)\n\n if (!existsSync(sourceFolder)) {\n throw new Error(`Integration folder not found: ${sourceFolder}`)\n }\n\n // Remove target folder if it exists\n if (existsSync(targetFolder)) {\n await fs.rm(targetFolder, { recursive: true, force: true })\n }\n\n // Rename source to target\n await fs.rename(sourceFolder, targetFolder)\n }\n\n /**\n * Remove existing integration folder\n */\n private async removeIntegrationFolder(alias: string): Promise<void> {\n const targetFolder = path.join(this.bpModulesPath, `integration_${alias}`)\n\n if (existsSync(targetFolder)) {\n await fs.rm(targetFolder, { recursive: true, force: true })\n }\n }\n\n /**\n * Sync all integrations\n */\n async syncIntegrations(): Promise<SyncResult> {\n const integrations = await this.parseIntegrations()\n const synced: IntegrationInfo[] = []\n const errors: Array<{ alias: string; error: string }> = []\n\n if (integrations.length === 0) {\n return { synced, errors }\n }\n\n // Ensure bp_modules directory exists\n await fs.mkdir(this.bpModulesPath, { recursive: true })\n\n for (const integration of integrations) {\n try {\n const isAlreadySynced = await this.isIntegrationSynced(integration)\n\n if (isAlreadySynced) {\n synced.push(integration)\n continue\n }\n\n // Remove existing folder if version mismatch\n await this.removeIntegrationFolder(integration.alias)\n\n // Install the integration\n await this.installIntegration(integration)\n\n // Rename to our controlled name\n await this.renameIntegrationFolder(integration)\n\n synced.push(integration)\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push({ alias: integration.alias, error: errorMsg })\n }\n }\n\n return { synced, errors }\n }\n}\n",
|
|
78
78
|
"import path from 'path'\nimport fs from 'fs/promises'\nimport { existsSync } from 'fs'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { auth } from '../auth/index.js'\nimport { pascalCase } from '../utils/strings.js'\nimport { BUILTIN_INTERFACES } from '../constants.js'\nimport { BpAddCommand } from '../commands/bp-add-command.js'\n\nexport interface InterfaceInfo {\n alias: string\n name: string\n version: string\n fullVersion: string // e.g., \"translator@1.0.0\"\n}\n\nexport interface InterfaceSyncResult {\n synced: InterfaceInfo[]\n errors: Array<{ alias: string; error: string }>\n}\n\nexport class InterfaceSync {\n private projectPath: string\n private botProjectPath: string\n private bpModulesPath: string\n\n constructor(projectPath: string, botProjectPath: string) {\n this.projectPath = projectPath\n this.botProjectPath = botProjectPath\n this.bpModulesPath = path.join(botProjectPath, 'bp_modules')\n }\n\n /**\n * Get built-in interfaces (hard-coded constants)\n */\n private async parseInterfaces(): Promise<InterfaceInfo[]> {\n const interfaces: InterfaceInfo[] = []\n\n for (const [alias, fullVersion] of Object.entries(BUILTIN_INTERFACES)) {\n const parts = fullVersion.split('@')\n const name = parts[0] || ''\n const version = parts[1] || 'latest'\n\n interfaces.push({\n alias,\n name,\n version,\n fullVersion,\n })\n }\n\n return interfaces\n }\n\n /**\n * Check if an interface is already installed with the correct version\n */\n private async isInterfaceSynced(interfaceInfo: InterfaceInfo): Promise<boolean> {\n const targetFolder = path.join(this.bpModulesPath, `interface_${pascalCase(interfaceInfo.alias)}`)\n\n if (!existsSync(targetFolder)) {\n return false\n }\n\n // Check if the index.ts has the correct version\n try {\n const indexPath = path.join(targetFolder, 'index.ts')\n if (!existsSync(indexPath)) {\n return false\n }\n\n const indexContent = await fs.readFile(indexPath, 'utf-8')\n\n // Look for version in the format: version: \"1.0.0\",\n const versionMatch = indexContent.match(/version:\\s*[\"']([^\"']+)[\"']/)\n if (!versionMatch) {\n return false\n }\n\n const installedVersion = versionMatch[1]\n return installedVersion === interfaceInfo.version\n } catch {\n return false\n }\n }\n\n /**\n * Install an interface using bp CLI\n */\n private async installInterface(interfaceInfo: InterfaceInfo): Promise<void> {\n // Get credentials\n const credentials = await auth.getActiveCredentials()\n const project = await AgentProject.load(this.projectPath)\n const workspaceId = project.agentInfo?.workspaceId || credentials.workspaceId\n\n if (!workspaceId) {\n throw new Error('No workspace ID found. Please login with \"adk login\"')\n }\n\n return new Promise((resolve, reject) => {\n const command = new BpAddCommand({\n resource: `interface:${interfaceInfo.fullVersion}`,\n botPath: this.botProjectPath,\n workspaceId,\n credentials: {\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n },\n })\n\n let stderr = ''\n\n command.on('stderr', (data: string) => {\n stderr += data\n })\n\n command.on('error', (error: { message: string; stderr?: string }) => {\n reject(new Error(`Failed to install interface ${interfaceInfo.fullVersion}: ${error.stderr || error.message}`))\n })\n\n command.on('done', () => {\n resolve()\n })\n\n command.run().catch(reject)\n })\n }\n\n /**\n * Rename interface folder from bp_modules/{name} to bp_modules/interface_{PascalCaseAlias}\n */\n private async renameInterfaceFolder(interfaceInfo: InterfaceInfo): Promise<void> {\n const sourceFolder = path.join(this.bpModulesPath, interfaceInfo.name)\n const targetFolder = path.join(this.bpModulesPath, `interface_${pascalCase(interfaceInfo.alias)}`)\n\n if (!existsSync(sourceFolder)) {\n throw new Error(`Interface folder not found: ${sourceFolder}`)\n }\n\n // Remove target folder if it exists\n if (existsSync(targetFolder)) {\n await fs.rm(targetFolder, { recursive: true, force: true })\n }\n\n // Rename source to target\n await fs.rename(sourceFolder, targetFolder)\n }\n\n /**\n * Remove existing interface folder\n */\n private async removeInterfaceFolder(alias: string): Promise<void> {\n const targetFolder = path.join(this.bpModulesPath, `interface_${pascalCase(alias)}`)\n\n if (existsSync(targetFolder)) {\n await fs.rm(targetFolder, { recursive: true, force: true })\n }\n }\n\n /**\n * Sync all interfaces\n */\n async syncInterfaces(): Promise<InterfaceSyncResult> {\n const interfaces = await this.parseInterfaces()\n const synced: InterfaceInfo[] = []\n const errors: Array<{ alias: string; error: string }> = []\n\n if (interfaces.length === 0) {\n return { synced, errors }\n }\n\n // Ensure bp_modules directory exists\n await fs.mkdir(this.bpModulesPath, { recursive: true })\n\n for (const interfaceInfo of interfaces) {\n try {\n const isAlreadySynced = await this.isInterfaceSynced(interfaceInfo)\n\n if (isAlreadySynced) {\n synced.push(interfaceInfo)\n continue\n }\n\n // Remove existing folder if version mismatch\n await this.removeInterfaceFolder(interfaceInfo.alias)\n\n // Install the interface\n await this.installInterface(interfaceInfo)\n\n // Rename to our controlled name\n await this.renameInterfaceFolder(interfaceInfo)\n\n synced.push(interfaceInfo)\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push({ alias: interfaceInfo.alias, error: errorMsg })\n }\n }\n\n return { synced, errors }\n }\n}\n",
|
|
79
79
|
"import path from 'path'\nimport fs from 'fs/promises'\nimport { existsSync } from 'fs'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { auth } from '../auth/index.js'\nimport { BpAddCommand } from '../commands/bp-add-command.js'\n\nexport interface PluginInfo {\n alias: string\n name: string\n version: string\n fullVersion: string // e.g., \"hitl@1.3.0\"\n}\n\nexport interface PluginSyncResult {\n synced: PluginInfo[]\n errors: Array<{ alias: string; error: string }>\n}\n\nexport class PluginSync {\n private projectPath: string\n private botProjectPath: string\n private bpModulesPath: string\n\n constructor(projectPath: string, botProjectPath: string) {\n this.projectPath = projectPath\n this.botProjectPath = botProjectPath\n this.bpModulesPath = path.join(botProjectPath, 'bp_modules')\n }\n\n /**\n * Parse agent.config.ts dependencies plugins into PluginInfo objects\n */\n private async parsePlugins(): Promise<PluginInfo[]> {\n const project = await AgentProject.load(this.projectPath)\n const dependencies = project.dependencies\n\n if (!dependencies?.plugins) {\n return []\n }\n\n const plugins: PluginInfo[] = []\n\n for (const [alias, config] of Object.entries(dependencies.plugins)) {\n const version = config.version\n const parts = version.split('@')\n const name = parts[0] || ''\n\n plugins.push({\n alias,\n name,\n version: parts[1] || 'latest',\n fullVersion: version,\n })\n }\n\n return plugins\n }\n\n /**\n * Check if a plugin is already installed with the correct version\n */\n private async isPluginSynced(plugin: PluginInfo): Promise<boolean> {\n const targetFolder = path.join(this.bpModulesPath, `plugin_${plugin.alias}`)\n\n if (!existsSync(targetFolder)) {\n return false\n }\n\n try {\n const indexPath = path.join(targetFolder, 'index.ts')\n if (!existsSync(indexPath)) {\n return false\n }\n\n const indexContent = await fs.readFile(indexPath, 'utf-8')\n\n // Look for version in the format: version: \"1.3.0\",\n const versionMatch = indexContent.match(/version:\\s*[\"']([^\"']+)[\"']/)\n if (!versionMatch) {\n return false\n }\n\n const installedVersion = versionMatch[1]\n return installedVersion === plugin.version\n } catch {\n return false\n }\n }\n\n /**\n * Install a plugin using bp CLI\n */\n private async installPlugin(plugin: PluginInfo): Promise<void> {\n const credentials = await auth.getActiveCredentials()\n const project = await AgentProject.load(this.projectPath)\n const workspaceId = project.agentInfo?.workspaceId || credentials.workspaceId\n\n if (!workspaceId) {\n throw new Error('No workspace ID found. Please login with \"adk login\"')\n }\n\n const command = new BpAddCommand({\n resource: `plugin:${plugin.fullVersion}`,\n botPath: this.botProjectPath,\n workspaceId,\n credentials,\n })\n\n await command.run()\n await command.output()\n }\n\n /**\n * Rename plugin folder from bp_modules/{name} to bp_modules/plugin_{alias}\n */\n private async renamePluginFolder(plugin: PluginInfo): Promise<void> {\n const sourceFolder = path.join(this.bpModulesPath, plugin.name.replace('/', '-'))\n const targetFolder = path.join(this.bpModulesPath, `plugin_${plugin.alias}`)\n\n if (!existsSync(sourceFolder)) {\n throw new Error(`Plugin folder not found: ${sourceFolder}`)\n }\n\n if (existsSync(targetFolder)) {\n await fs.rm(targetFolder, { recursive: true, force: true })\n }\n\n await fs.rename(sourceFolder, targetFolder)\n }\n\n /**\n * Remove existing plugin folder\n */\n private async removePluginFolder(alias: string): Promise<void> {\n const targetFolder = path.join(this.bpModulesPath, `plugin_${alias}`)\n\n if (existsSync(targetFolder)) {\n await fs.rm(targetFolder, { recursive: true, force: true })\n }\n }\n\n /**\n * Sync all plugins\n */\n async syncPlugins(): Promise<PluginSyncResult> {\n const plugins = await this.parsePlugins()\n const synced: PluginInfo[] = []\n const errors: Array<{ alias: string; error: string }> = []\n\n if (plugins.length === 0) {\n return { synced, errors }\n }\n\n await fs.mkdir(this.bpModulesPath, { recursive: true })\n\n for (const plugin of plugins) {\n try {\n const isAlreadySynced = await this.isPluginSynced(plugin)\n\n if (isAlreadySynced) {\n synced.push(plugin)\n continue\n }\n\n // Remove existing folder if version mismatch\n await this.removePluginFolder(plugin.alias)\n\n // Install the plugin\n await this.installPlugin(plugin)\n\n // Rename to our controlled name\n await this.renamePluginFolder(plugin)\n\n synced.push(plugin)\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push({ alias: plugin.alias, error: errorMsg })\n }\n }\n\n return { synced, errors }\n }\n}\n",
|
|
80
|
-
"import { Client } from '@botpress/client'\nimport { JSONSchema7, transforms } from '@botpress/sdk'\n\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { auth } from '../auth/index.js'\nimport {\n ColumnChange,\n LocalTable,\n RemoteTable,\n TableSyncItem,\n TableSyncOperation,\n TableSyncOptions,\n TableSyncPlan,\n TableSyncResult,\n} from './types.js'\n\nexport interface TableManagerOptions {\n project: AgentProject\n botId?: string\n}\n\nexport class TableManager {\n private client?: Client\n private botId?: string\n private project: AgentProject\n\n constructor(options: TableManagerOptions) {\n this.botId = options.botId\n this.project = options.project\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n\n this.assertBotId('initialize client')\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n botId: this.botId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n private assertBotId(operation: string): void {\n if (!this.botId) {\n throw new Error(\n `Operation \"${operation}\" requires a bot ID. ` +\n 'Please deploy your agent first or create agent.json with botId and workspaceId.'\n )\n }\n }\n\n private getSchemaType(schema: any): string {\n if (schema.type) {\n if (schema.type === 'array' && schema.items?.type) {\n return `array<${schema.items.type}>`\n }\n return schema.type\n }\n if (schema.$ref) {\n return schema.$ref.split('/').pop() || 'unknown'\n }\n return 'unknown'\n }\n\n /** Remove automatically generated properties that we can ignore when comparing changes */\n private calculateRenameScore(\n oldName: string,\n newName: string,\n oldSchema: any,\n newSchema: any,\n oldPosition: number,\n newPosition: number\n ): number {\n let score = 0\n\n // Same position in schema (strong signal) +3\n if (oldPosition === newPosition) {\n score += 3\n } else if (Math.abs(oldPosition - newPosition) <= 1) {\n // Adjacent position +1\n score += 1\n }\n\n // Compare descriptions\n const oldDesc = (oldSchema?.description || '').toLowerCase()\n const newDesc = (newSchema?.description || '').toLowerCase()\n\n if (oldDesc && newDesc && oldDesc === newDesc) {\n // Exact description match (very strong signal) +5\n score += 5\n } else if (oldDesc && newDesc && oldDesc.length > 5 && newDesc.length > 5) {\n // Partial description match +2\n if (oldDesc.includes(newDesc) || newDesc.includes(oldDesc)) {\n score += 2\n } else {\n // Check for word overlap\n const oldWords = oldDesc.split(/\\s+/)\n const newWords = newDesc.split(/\\s+/)\n const commonWords = oldWords.filter((w: string) => newWords.includes(w) && w.length > 3)\n if (commonWords.length >= 2) {\n score += 1\n }\n }\n }\n\n // Same required/optional status +1\n const oldOptional = oldSchema?.type?.includes('null') || oldSchema?.nullable === true\n const newOptional = newSchema?.type?.includes('null') || newSchema?.nullable === true\n if (oldOptional === newOptional) {\n score += 1\n }\n\n // Same searchable status +1\n const oldSearchable = oldSchema?.['x-zui']?.searchable\n const newSearchable = newSchema?.['x-zui']?.searchable\n if (oldSearchable === newSearchable) {\n score += 1\n }\n\n return score\n }\n\n private cleanSchemaForComparison(schema: any): any {\n if (!schema || typeof schema !== 'object') {\n return schema\n }\n\n const cleaned = Array.isArray(schema) ? [...schema] : { ...schema }\n\n if (cleaned['x-zui']) {\n const xZui = { ...cleaned['x-zui'] }\n delete xZui.index\n if (Object.keys(xZui).length === 0) {\n delete cleaned['x-zui']\n } else {\n cleaned['x-zui'] = xZui\n }\n }\n\n if (cleaned.properties) {\n const cleanedProps: any = {}\n for (const [key, value] of Object.entries(cleaned.properties)) {\n cleanedProps[key] = this.cleanSchemaForComparison(value)\n }\n cleaned.properties = cleanedProps\n }\n\n if (cleaned.items) {\n cleaned.items = this.cleanSchemaForComparison(cleaned.items)\n }\n\n delete cleaned.additionalProperties\n\n return cleaned\n }\n\n private analyzeColumnChanges(\n local: any,\n remote: any\n ): {\n differences: string[]\n columnChanges: ColumnChange[]\n } {\n const differences: string[] = []\n const columnChanges: ColumnChange[] = []\n\n if (!local || !remote) {\n return { differences, columnChanges }\n }\n\n const cleanedLocal = this.cleanSchemaForComparison(local)\n const cleanedRemote = this.cleanSchemaForComparison(remote)\n\n const localProps = cleanedLocal.properties || {}\n const remoteProps = cleanedRemote.properties || {}\n\n const localKeys = Object.keys(localProps)\n const remoteKeys = Object.keys(remoteProps)\n\n const addedKeys = localKeys.filter((k) => !remoteKeys.includes(k))\n const removedKeys = remoteKeys.filter((k) => !localKeys.includes(k))\n const commonKeys = localKeys.filter((k) => remoteKeys.includes(k))\n\n const addedByType: Map<string, string[]> = new Map()\n const removedByType: Map<string, string[]> = new Map()\n\n for (const key of addedKeys) {\n const localType = this.getSchemaType(localProps[key])\n if (!addedByType.has(localType)) {\n addedByType.set(localType, [])\n }\n addedByType.get(localType)!.push(key)\n }\n\n for (const key of removedKeys) {\n const remoteType = this.getSchemaType(remoteProps[key])\n if (!removedByType.has(remoteType)) {\n removedByType.set(remoteType, [])\n }\n removedByType.get(remoteType)!.push(key)\n }\n\n const renamedColumns = new Set<string>()\n\n // Smart rename detection using multiple heuristics\n for (const [type, removedCols] of removedByType.entries()) {\n const addedCols = addedByType.get(type) || []\n if (removedCols.length === 0 || addedCols.length === 0) {\n continue\n }\n\n // Calculate match scores for each removed-added pair\n const matches: Array<{ removed: string; added: string; score: number }> = []\n\n for (const removed of removedCols) {\n for (const added of addedCols) {\n const score = this.calculateRenameScore(\n removed,\n added,\n remoteProps[removed],\n localProps[added],\n remoteKeys.indexOf(removed),\n localKeys.indexOf(added)\n )\n\n if (score > 0) {\n matches.push({ removed, added, score })\n }\n }\n }\n\n // Sort by score descending\n matches.sort((a, b) => b.score - a.score)\n\n // Greedily match highest scores, ensuring 1:1 mapping\n const usedRemoved = new Set<string>()\n const usedAdded = new Set<string>()\n\n for (const match of matches) {\n if (usedRemoved.has(match.removed) || usedAdded.has(match.added)) {\n continue\n }\n\n // Only consider it a rename if score is high enough\n if (match.score >= 2) {\n columnChanges.push({\n type: 'rename',\n columnName: match.added,\n oldColumnName: match.removed,\n oldType: type,\n newType: type,\n details: `Column \"${match.removed}\" → \"${match.added}\"`,\n })\n\n differences.push(`↔️ Renamed column \"${match.removed}\" → \"${match.added}\" (${type})`)\n\n renamedColumns.add(match.removed)\n renamedColumns.add(match.added)\n usedRemoved.add(match.removed)\n usedAdded.add(match.added)\n }\n }\n }\n\n const localRequired = cleanedLocal.required || []\n const remoteRequired = cleanedRemote.required || []\n\n for (const key of addedKeys) {\n if (!renamedColumns.has(key)) {\n const localType = this.getSchemaType(localProps[key])\n const isRequired = localRequired.includes(key)\n columnChanges.push({\n type: 'add',\n columnName: key,\n newType: localType,\n })\n const requiredSuffix = isRequired ? ' - required' : ''\n differences.push(`➕ Added column \"${key}\" (${localType})${requiredSuffix}`)\n }\n }\n\n for (const key of removedKeys) {\n if (!renamedColumns.has(key)) {\n const remoteType = this.getSchemaType(remoteProps[key])\n const wasRequired = remoteRequired.includes(key)\n columnChanges.push({\n type: 'remove',\n columnName: key,\n oldType: remoteType,\n })\n const requiredSuffix = wasRequired ? ' - was required' : ''\n differences.push(`➖ Removed column \"${key}\" (${remoteType})${requiredSuffix}`)\n }\n }\n\n for (const key of commonKeys) {\n const localCol = localProps[key]\n const remoteCol = remoteProps[key]\n\n const localType = this.getSchemaType(localCol)\n const remoteType = this.getSchemaType(remoteCol)\n\n if (localType !== remoteType) {\n columnChanges.push({\n type: 'modify',\n columnName: key,\n oldType: remoteType,\n newType: localType,\n details: `Type changed from ${remoteType} to ${localType}`,\n })\n differences.push(`🔀 Column \"${key}\": type changed from ${remoteType} to ${localType}`)\n }\n\n const localSearchable = localCol?.['x-zui']?.searchable\n const remoteSearchable = remoteCol?.['x-zui']?.searchable\n if (localSearchable !== remoteSearchable) {\n differences.push(\n `🔍 Column \"${key}\": searchable ${remoteSearchable ? 'disabled' : 'enabled'} (was ${remoteSearchable ? 'enabled' : 'disabled'})`\n )\n }\n\n const localRequired = cleanedLocal.required?.includes(key) || false\n const remoteRequired = cleanedRemote.required?.includes(key) || false\n if (localRequired !== remoteRequired) {\n differences.push(\n `${localRequired ? '🔒' : '🔓'} Column \"${key}\": ${localRequired ? 'now required' : 'now optional'}`\n )\n }\n\n const cleanedLocalCol = this.cleanSchemaForComparison(localCol)\n const cleanedRemoteCol = this.cleanSchemaForComparison(remoteCol)\n\n if (JSON.stringify(cleanedLocalCol) !== JSON.stringify(cleanedRemoteCol) && localType === remoteType) {\n const localDesc = localCol?.description\n const remoteDesc = remoteCol?.description\n if (localDesc !== remoteDesc) {\n differences.push(`💬 Column \"${key}\": description updated`)\n }\n }\n }\n\n return { differences, columnChanges }\n }\n\n private createSchemaForUpdate(localSchema: JSONSchema7, columnChanges: ColumnChange[]): JSONSchema7 {\n const updatedSchema = JSON.parse(JSON.stringify(localSchema)) as JSONSchema7\n\n if (!updatedSchema.properties) {\n updatedSchema.properties = {}\n }\n\n // Ensure required array exists (even if empty) to properly update optional/required status\n if (!updatedSchema.required) {\n updatedSchema.required = []\n }\n\n // Only handle actual removals in the schema\n // Renames are handled separately via renameTableColumn API\n for (const change of columnChanges) {\n if (change.type === 'remove') {\n // Mark column for removal by setting to null\n updatedSchema.properties[change.columnName] = { type: 'null' }\n\n if (updatedSchema.required && updatedSchema.required.includes(change.columnName)) {\n updatedSchema.required = updatedSchema.required.filter((req: string) => req !== change.columnName)\n }\n }\n }\n\n return updatedSchema\n }\n\n async getLocalTables(): Promise<LocalTable[]> {\n const tables: LocalTable[] = []\n\n for (const tableRef of this.project.tables) {\n try {\n // Load the actual table module to get the full definition\n\n tables.push({\n name: tableRef.definition.name,\n factor: tableRef.definition.factor,\n schema: tableRef.definition.schema,\n keyColumn: tableRef.definition.keyColumn,\n tags: tableRef.definition.tags,\n } satisfies LocalTable)\n } catch {}\n }\n\n return tables\n }\n\n async getRemoteTables(): Promise<RemoteTable[]> {\n this.assertBotId('get remote tables')\n\n const client = await this.getClient()\n\n try {\n const response = await client.listTables({})\n\n const tablesWithCounts = await Promise.all(\n response.tables.map(async (table) => {\n let rowCount = 0\n try {\n const tableInfo = await client.getTable({ table: table.name })\n rowCount = tableInfo.rows || 0\n } catch (error) {\n console.warn(`Failed to get row count for table ${table.name}:`, error)\n }\n\n return {\n id: table.id,\n name: table.name,\n createdAt: table.createdAt || new Date().toISOString(),\n updatedAt: table.updatedAt || new Date().toISOString(),\n factor: table.factor || 1,\n schema: table.schema,\n rowCount,\n keyColumn: table.keyColumn || '',\n tags: table.tags || {},\n } satisfies RemoteTable\n })\n )\n\n return tablesWithCounts\n } catch (error) {\n console.error('Failed to list remote tables:', error)\n return []\n }\n }\n\n async createSyncPlan(): Promise<TableSyncPlan> {\n const localTables = await this.getLocalTables()\n const remoteTables = await this.getRemoteTables()\n\n const items: TableSyncItem[] = []\n const remoteMap = new Map(remoteTables.map((t) => [t.name, t]))\n\n // Check each local table\n for (const local of localTables) {\n const remote = remoteMap.get(local.name)\n\n if (!remote) {\n // Table doesn't exist remotely - need to create\n items.push({\n operation: TableSyncOperation.Create,\n localTable: local,\n reason: 'Table does not exist remotely',\n })\n } else {\n // Table exists - check if schema matches\n try {\n const cleanedLocalSchema = this.cleanSchemaForComparison(local.schema)\n const cleanedRemoteSchema = this.cleanSchemaForComparison(remote.schema)\n\n const { differences, columnChanges } = this.analyzeColumnChanges(local.schema, remote.schema)\n const factorMatches = (local.factor || 1) === (remote.factor || 1)\n const keyColumnMatches = (local.keyColumn || '') === (remote.keyColumn || '')\n const tagsMatch = JSON.stringify(local.tags || {}) === JSON.stringify(remote.tags || {})\n\n const localSchema = transforms.fromJSONSchema(cleanedLocalSchema)\n const remoteSchema = transforms.fromJSONSchema(cleanedRemoteSchema)\n const schemasEqual = localSchema.isEqual(remoteSchema)\n const hasMetadataChanges = differences.length > 0\n\n if (!schemasEqual || !factorMatches || hasMetadataChanges || !keyColumnMatches || !tagsMatch) {\n const reasons: string[] = []\n if (differences.length > 0) {\n reasons.push('schema changes detected')\n } else if (!schemasEqual) {\n reasons.push('schema metadata changed')\n }\n if (!factorMatches) {\n differences.push(`⚡ Factor: ${remote.factor || 1} → ${local.factor || 1}`)\n reasons.push('factor changed')\n }\n\n if (!keyColumnMatches) {\n differences.push(`🔑 Key Column: \"${remote.keyColumn || ''}\" → \"${local.keyColumn || ''}\"`)\n reasons.push('key column changed')\n }\n\n if (!tagsMatch) {\n differences.push(\n `🏷️ Tags updated: ${JSON.stringify(remote.tags || {})} → ${JSON.stringify(local.tags || {})}`\n )\n reasons.push('tags changed')\n }\n\n const schemaForUpdate = this.createSchemaForUpdate(local.schema, columnChanges)\n\n items.push({\n operation: TableSyncOperation.Update,\n localTable: local,\n remoteTable: remote,\n reason: `Table ${reasons.join(' and ')}`,\n differences: differences.length > 0 ? differences : undefined,\n columnChanges: columnChanges.length > 0 ? columnChanges : undefined,\n schemaForUpdate,\n })\n } else {\n // Schema matches - no update needed\n items.push({\n operation: TableSyncOperation.None,\n localTable: local,\n remoteTable: remote,\n reason: 'Table schema is up to date',\n })\n }\n } catch {\n // If we can't compare schemas, assume they need updating\n items.push({\n operation: TableSyncOperation.Update,\n localTable: local,\n remoteTable: remote,\n reason: 'Unable to compare schemas - assuming update needed',\n })\n }\n\n // Remove from map so we can find orphaned tables\n remoteMap.delete(local.name)\n }\n }\n\n // Remaining remote tables don't have local counterparts\n for (const [, remote] of remoteMap) {\n items.push({\n operation: TableSyncOperation.Delete,\n remoteTable: remote,\n reason: 'Table no longer defined locally',\n })\n }\n\n // Calculate totals\n const totalCreate = items.filter((i) => i.operation === TableSyncOperation.Create).length\n const totalUpdate = items.filter((i) => i.operation === TableSyncOperation.Update).length\n const totalDelete = items.filter((i) => i.operation === TableSyncOperation.Delete).length\n const hasChanges = totalCreate > 0 || totalUpdate > 0 || totalDelete > 0\n\n return {\n items,\n totalCreate,\n totalUpdate,\n totalDelete,\n hasChanges,\n }\n }\n\n async executeSync(plan: TableSyncPlan, options: TableSyncOptions = {}): Promise<TableSyncResult> {\n this.assertBotId('sync tables')\n\n if (options.dryRun) {\n return {\n applied: false,\n success: [],\n failed: [],\n summary: {\n created: 0,\n updated: 0,\n deleted: 0,\n failed: 0,\n },\n }\n }\n\n const client = await this.getClient()\n const success: TableSyncItem[] = []\n const failed: Array<{ item: TableSyncItem; error: Error }> = []\n\n for (const item of plan.items) {\n if (item.operation === TableSyncOperation.None) {\n success.push(item)\n continue\n }\n\n try {\n switch (item.operation) {\n case TableSyncOperation.Create:\n if (item.localTable) {\n await client.createTable({\n name: item.localTable.name,\n factor: item.localTable.factor || 1,\n schema: item.localTable.schema,\n isComputeEnabled: true,\n keyColumn: item.localTable.keyColumn || '',\n tags: item.localTable.tags || {},\n })\n success.push(item)\n }\n break\n\n case TableSyncOperation.Update:\n if (item.localTable && item.remoteTable) {\n // Step 1: Handle column renames first (must be done before schema update)\n if (item.columnChanges) {\n const renames = item.columnChanges.filter((c) => c.type === 'rename')\n for (const rename of renames) {\n if (rename.oldColumnName && rename.columnName) {\n await client.renameTableColumn({\n table: item.localTable.name,\n name: rename.oldColumnName,\n newName: rename.columnName,\n })\n }\n }\n }\n\n // Step 2: Apply schema updates (after renames are done)\n let schemaToUse = item.schemaForUpdate || item.localTable.schema\n const localFactor = item.localTable.factor || 1\n const localKeyColumn = item.localTable.keyColumn || ''\n const localTags = item.localTable.tags || {}\n // Ensure schema has a required array (even if empty) to properly clear required fields\n if (!schemaToUse.required) {\n schemaToUse = { ...schemaToUse, required: [] }\n }\n\n await client.updateTable({\n table: item.localTable.name,\n factor: localFactor,\n schema: schemaToUse,\n tags: localTags,\n keyColumn: localKeyColumn,\n isComputeEnabled: true,\n })\n success.push(item)\n }\n break\n\n case TableSyncOperation.Delete:\n if (item.remoteTable) {\n // Require explicit confirmation for deletion\n if (!options.autoConfirm) {\n console.warn(`Skipping deletion of table \"${item.remoteTable.name}\" - requires confirmation`)\n continue\n }\n await client.deleteTable({ table: item.remoteTable.name })\n success.push(item)\n }\n break\n }\n } catch (error: any) {\n const err = error instanceof Error ? error : new Error(String(error))\n failed.push({ item, error: err })\n\n if (options.bailOnFailure) {\n break\n }\n }\n }\n\n return {\n applied: true,\n success,\n failed,\n summary: {\n created: success.filter((i) => i.operation === TableSyncOperation.Create).length,\n updated: success.filter((i) => i.operation === TableSyncOperation.Update).length,\n deleted: success.filter((i) => i.operation === TableSyncOperation.Delete).length,\n failed: failed.length,\n },\n }\n }\n}\n",
|
|
81
|
-
"import crypto from 'crypto'\nimport path from 'path'\nimport fs from 'fs/promises'\nimport { glob } from 'glob'\nimport { Client } from '@botpress/client'\nimport { DataSource } from '@botpress/runtime'\n\nimport { auth } from '../auth/index.js'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport {\n LocalKnowledgeBase,\n KBSyncPlan,\n KBSyncResult,\n KBSyncItem,\n KBSyncOperation,\n KBSyncOptions,\n SyncOutput,\n FileChanges,\n WebsiteSyncInfo,\n SourceSyncStatus,\n OrphanedSource,\n OrphanedSourceStatus,\n} from './types.js'\n\ntype RemoteKnowledgeBase = Pick<\n Awaited<ReturnType<Client['listKnowledgeBases']>>['knowledgeBases'][number],\n 'id' | 'name' | 'tags'\n>\n\nexport interface KnowledgeManagerOptions {\n project: AgentProject\n botId?: string\n}\n\n// Well-known tags for KB files (must match runtime constants)\nconst WellKnownTags = {\n KNOWLEDGE: 'source',\n KNOWLEDGE_BASE_ID: 'kbId',\n KNOWLEDGE_BASE_NAME: 'kbName',\n KNOWLEDGE_SOURCE_ID: 'dsId',\n KNOWLEDGE_SOURCE_TYPE: 'dsType',\n}\n\n// Per-source sync tracking stored in KB tags\n// Format: source<dsId><field> (alphanumeric only, must start with lowercase letter)\nfunction sourceTag(dsId: string, field: 'hash' | 'lastupdatedat'): string {\n // Sanitize dsId to be alphanumeric only (remove underscores, dashes, etc.)\n const sanitizedId = dsId.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()\n return `source${sanitizedId}${field}`\n}\n\nconst WellKnownMetadata = {\n TITLE: 'title',\n}\n\ntype FileMetadata = {\n hash: string\n dsId: string\n dsType: string\n relPath: string\n [key: string]: string\n}\n\n/**\n * Type guard for FileMetadata - validates metadata from API responses\n */\nfunction isFileMetadata(metadata: unknown): metadata is FileMetadata {\n return (\n typeof metadata === 'object' &&\n metadata !== null &&\n 'hash' in metadata &&\n typeof metadata.hash === 'string' &&\n 'relPath' in metadata &&\n typeof metadata.relPath === 'string'\n )\n}\n\ntype LocalFile = {\n abs: string\n rel: string\n name: string\n}\n\n/**\n * Manages knowledge base synchronization for ADK projects\n */\nexport class KnowledgeManager {\n private client?: Client\n private botId?: string\n private project: AgentProject\n /** Cache of file hashes by directory path to avoid recalculating */\n private fileHashCache: Map<string, Record<string, string>> = new Map()\n\n constructor(options: KnowledgeManagerOptions) {\n this.botId = options.botId\n this.project = options.project\n }\n\n /**\n * Clear the file hash cache (call before a new sync operation)\n */\n clearHashCache(): void {\n this.fileHashCache.clear()\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n\n this.assertBotId('initialize client')\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n botId: this.botId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n private assertBotId(operation: string): void {\n if (!this.botId) {\n throw new Error(\n `Operation \"${operation}\" requires a bot ID. ` +\n 'Please deploy your agent first or create agent.json with botId and workspaceId.'\n )\n }\n }\n\n /**\n * Format an error for display, including API response data if available\n */\n private formatError(error: unknown): string {\n if (!(error instanceof Error)) {\n return String(error)\n }\n\n let message = error.message\n\n // Check for axios-style API errors with response data\n if (\n 'response' in error &&\n error.response !== null &&\n typeof error.response === 'object' &&\n 'data' in error.response\n ) {\n message += ` - API: ${JSON.stringify(error.response.data)}`\n }\n\n return message\n }\n\n /**\n * Get all knowledge bases from the project\n */\n getLocalKnowledgeBases(): LocalKnowledgeBase[] {\n const kbs: LocalKnowledgeBase[] = []\n\n for (const kbRef of this.project.knowledge) {\n const definition = kbRef.definition\n\n kbs.push({\n name: definition.name,\n description: definition.description,\n sourceCount: definition.sources?.length || 0,\n })\n }\n\n return kbs\n }\n\n /**\n * Calculate content hash from individual file hashes\n * This creates a deterministic hash of all file contents\n */\n private computeContentHash(fileHashes: Record<string, string>): string {\n // Sort keys for deterministic ordering\n const sortedEntries = Object.entries(fileHashes).sort(([a], [b]) => a.localeCompare(b))\n const combined = sortedEntries.map(([filePath, hash]) => `${filePath}:${hash}`).join('\\n')\n return crypto.createHash('sha256').update(combined).digest('hex')\n }\n\n /**\n * List all remote knowledge bases\n */\n private async listRemoteKnowledgeBases(): Promise<RemoteKnowledgeBase[]> {\n const client = await this.getClient()\n const kbs: RemoteKnowledgeBase[] = []\n let nextToken: string | undefined\n\n do {\n const response = await client.listKnowledgeBases({ nextToken })\n kbs.push(...response.knowledgeBases)\n nextToken = response.meta.nextToken\n } while (nextToken)\n\n return kbs\n }\n\n /**\n * Find remote KB by name\n */\n private async findRemoteKB(name: string): Promise<RemoteKnowledgeBase | undefined> {\n const kbs = await this.listRemoteKnowledgeBases()\n return kbs.find((kb) => kb.name === name)\n }\n\n /**\n * Create a new knowledge base\n */\n async createKnowledgeBase(name: string): Promise<RemoteKnowledgeBase> {\n const client = await this.getClient()\n await client.createKnowledgeBase({ name })\n // createKnowledgeBase response doesn't include createdAt, so fetch the full KB\n const created = await this.findRemoteKB(name)\n if (!created) {\n throw new Error(`Failed to find KB \"${name}\" after creation`)\n }\n return created\n }\n\n /**\n * Get remote KBs that don't exist locally (orphaned)\n */\n async getOrphanedKBs(): Promise<RemoteKnowledgeBase[]> {\n const localKbNames = this.getLocalKnowledgeBases().map((kb) => kb.name)\n const remoteKbs = await this.listRemoteKnowledgeBases()\n return remoteKbs.filter((kb) => !localKbNames.includes(kb.name))\n }\n\n /**\n * Get orphaned sources for a KB by listing files and extracting unique dsIds from tags\n * Returns sources that exist in remote files but not in local definition\n */\n async getOrphanedSources(\n kbName: string,\n localDsIds: string[]\n ): Promise<OrphanedSource[]> {\n const client = await this.getClient()\n\n // List ALL files for this KB using raw client to get full file data including tags\n const tags = {\n [WellKnownTags.KNOWLEDGE]: 'knowledge-base',\n [WellKnownTags.KNOWLEDGE_BASE_NAME]: kbName,\n }\n\n const files: Array<{ tags?: Record<string, string>; metadata?: Record<string, unknown> }> = []\n let nextToken: string | undefined\n do {\n const response = await client.listFiles({ tags, nextToken })\n files.push(...response.files)\n nextToken = response.meta.nextToken\n } while (nextToken)\n\n // Group files by dsId from tags (more reliable than metadata for website sources)\n const filesByDsId = new Map<string, number>()\n for (const file of files) {\n // Try to get dsId from tags first (works for all source types)\n const dsId = file.tags?.[WellKnownTags.KNOWLEDGE_SOURCE_ID] ||\n (file.metadata?.dsId as string | undefined)\n if (dsId) {\n filesByDsId.set(dsId, (filesByDsId.get(dsId) || 0) + 1)\n }\n }\n\n // Find orphaned sources (exist in remote but not in local)\n const orphaned: OrphanedSource[] = []\n for (const [dsId, fileCount] of filesByDsId) {\n if (!localDsIds.includes(dsId)) {\n orphaned.push({ dsId, fileCount })\n }\n }\n\n return orphaned\n }\n\n /**\n * Delete all files belonging to an orphaned source using direct dsId tag query\n */\n async deleteOrphanedSource(\n kbName: string,\n dsId: string\n ): Promise<{ deletedFiles: number; errors: string[] }> {\n const client = await this.getClient()\n\n // Query files directly by dsId tag\n const tags = {\n [WellKnownTags.KNOWLEDGE]: 'knowledge-base',\n [WellKnownTags.KNOWLEDGE_BASE_NAME]: kbName,\n [WellKnownTags.KNOWLEDGE_SOURCE_ID]: dsId,\n }\n const files = await this.listExistingFiles(client, tags)\n\n console.log(` Deleting ${files.length} files from orphaned source \"${dsId}\"...`)\n\n // Delete all files in parallel\n const results = await Promise.allSettled(\n files.map((f) => client.deleteFile({ id: f.id }))\n )\n\n const deletedFiles = results.filter((r) => r.status === 'fulfilled').length\n const errors = results\n .filter((r): r is PromiseRejectedResult => r.status === 'rejected')\n .map((r) => String(r.reason))\n\n return { deletedFiles, errors }\n }\n\n /**\n * Clean up source tags from KB after deleting orphaned source\n * Note: Botpress API merges tags, so we set to empty string to \"delete\" them\n */\n private async cleanupSourceTags(\n kbId: string,\n kbName: string,\n dsIds: string[],\n existingTags: Record<string, string>\n ): Promise<void> {\n const client = await this.getClient()\n const newTags = { ...existingTags }\n\n for (const dsId of dsIds) {\n // Sanitize dsId the same way sourceTag() does\n const sanitizedId = dsId.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()\n // Set to empty string to clear (API merges tags, delete doesn't work)\n newTags[`source${sanitizedId}hash`] = ''\n newTags[`source${sanitizedId}lastupdatedat`] = ''\n }\n\n await client.updateKnowledgeBase({ id: kbId, name: kbName, tags: newTags })\n }\n\n /**\n * Delete a KB and all its associated files\n */\n async deleteKnowledgeBase(kbId: string, kbName: string): Promise<{ deletedFiles: number }> {\n const client = await this.getClient()\n\n // First delete all files associated with this KB\n const tags = {\n [WellKnownTags.KNOWLEDGE]: 'knowledge-base',\n [WellKnownTags.KNOWLEDGE_BASE_NAME]: kbName,\n }\n console.log(` Listing files for KB \"${kbName}\"...`)\n const files = await this.listExistingFiles(client, tags)\n console.log(` Found ${files.length} files to delete`)\n\n // Delete all files in parallel\n const results = await Promise.allSettled(\n files.map((file) => client.deleteFile({ id: file.id }))\n )\n const deletedFiles = results.filter((r) => r.status === 'fulfilled').length\n\n // Then delete the KB itself\n console.log(` Deleting KB \"${kbName}\"...`)\n await client.deleteKnowledgeBase({ id: kbId })\n\n return { deletedFiles }\n }\n\n /**\n * Get stored hash for a specific source from KB tags\n */\n private getRemoteSourceHash(kb: RemoteKnowledgeBase, dsId: string): string | undefined {\n return kb.tags?.[sourceTag(dsId, 'hash')]\n }\n\n /**\n * Update source hash in KB tags after sync\n */\n private async updateSourceHash(kbId: string, kbName: string, dsId: string, hash: string, existingTags?: Record<string, string>): Promise<void> {\n const client = await this.getClient()\n\n await client.updateKnowledgeBase({\n id: kbId,\n name: kbName,\n tags: {\n ...existingTags,\n [sourceTag(dsId, 'hash')]: hash,\n [sourceTag(dsId, 'lastupdatedat')]: new Date().toISOString(),\n },\n })\n }\n\n /**\n * Compute config hash for a data source (used for website sources)\n */\n private computeConfigHash(config: Record<string, unknown>): string {\n // Sort keys for deterministic ordering\n const sortedConfig = JSON.stringify(config, Object.keys(config).sort())\n return crypto.createHash('sha256').update(sortedConfig).digest('hex')\n }\n\n /**\n * Trigger website source sync by creating the builtin_knowledge_indexing workflow.\n * For dev bots, this requires adk dev to be running. For prod bots, runs in Botpress Cloud.\n */\n async syncWebsiteSource(kbName: string, kbId: string, force: boolean): Promise<{ workflowId: string }> {\n const client = await this.getClient()\n\n const response = await client.createWorkflow({\n name: 'builtin_knowledge_indexing',\n input: { kbName, kbId, force },\n status: 'pending',\n timeoutAt: new Date(Date.now() + 180 * 60 * 1000).toISOString(), // 180 minutes (matches workflow timeout)\n })\n\n return { workflowId: response.workflow.id }\n }\n\n /**\n * Detect legacy website source files (old tag format)\n * Legacy files have: knowledge: 'true' (old format)\n * Returns count of legacy files found\n */\n async detectLegacyWebsiteFiles(kbName: string, sourceId: string): Promise<number> {\n const client = await this.getClient()\n\n // Legacy tag format used before migration\n const legacyTags = {\n knowledge: 'true',\n sourceId: sourceId,\n kbName: kbName,\n }\n\n const legacyFiles = await this.listExistingFiles(client, legacyTags)\n return legacyFiles.length\n }\n\n /**\n * Delete legacy website source files (old tag format)\n * Called during executeSync when legacy files were detected\n */\n async deleteLegacyWebsiteFiles(kbName: string, sourceId: string): Promise<{ deletedFiles: number }> {\n const client = await this.getClient()\n\n // Legacy tag format used before migration\n const legacyTags = {\n knowledge: 'true',\n sourceId: sourceId,\n kbName: kbName,\n }\n\n const legacyFiles = await this.listExistingFiles(client, legacyTags)\n if (legacyFiles.length === 0) {\n return { deletedFiles: 0 }\n }\n\n console.log(` Found ${legacyFiles.length} legacy website files to migrate`)\n\n const results = await Promise.allSettled(\n legacyFiles.map((f) => client.deleteFile({ id: f.id }))\n )\n\n const deletedFiles = results.filter((r) => r.status === 'fulfilled').length\n console.log(` ✅ Deleted ${deletedFiles} legacy website files`)\n\n return { deletedFiles }\n }\n\n /**\n * Check if a KB has any website sources\n */\n hasWebsiteSources(kbName: string): boolean {\n const kbRef = this.project.knowledge.find((k) => k.definition.name === kbName)\n if (!kbRef) return false\n return kbRef.definition.sources?.some((s) => DataSource.isWebsite(s)) || false\n }\n\n /**\n * Get list of KB names that have website sources\n */\n getKBsWithWebsiteSources(): string[] {\n return this.project.knowledge\n .filter((k) => k.definition.sources?.some((s) => DataSource.isWebsite(s)))\n .map((k) => k.definition.name)\n }\n\n /**\n * Compute content hash for a single directory source\n */\n private async computeDirectorySourceHash(\n directoryPath: string,\n filterFn?: (filePath: string) => boolean\n ): Promise<string> {\n const fileHashes = await this.scanLocalFileHashes(directoryPath, filterFn)\n return this.computeContentHash(fileHashes)\n }\n\n /**\n * Create a sync plan comparing local sources vs remote KB tags\n * Uses per-source hashes stored in KB tags\n */\n async createSyncPlan(): Promise<KBSyncPlan> {\n const localKbs = this.getLocalKnowledgeBases()\n const remoteKbs = await this.listRemoteKnowledgeBases()\n const items: KBSyncItem[] = []\n\n for (const kb of localKbs) {\n const kbRef = this.project.knowledge.find((k) => k.definition.name === kb.name)\n if (!kbRef) continue\n\n // Find matching remote KB by name\n const remoteKb = remoteKbs.find((r) => r.name === kb.name)\n\n if (!remoteKb) {\n // KB doesn't exist remotely yet - needs creation and sync of all sources\n const sources: SourceSyncStatus[] = (kbRef.definition.sources || []).map((source) => ({\n dsId: source.id,\n dsType: DataSource.isDirectory(source) ? 'document' as const : 'web-page' as const,\n needsSync: true,\n reason: 'New KB',\n }))\n\n items.push({\n operation: KBSyncOperation.Sync,\n kb,\n reason: 'Knowledge base not found remotely',\n needsCreation: true,\n sources,\n })\n continue\n }\n\n // Check each source individually\n const sources: SourceSyncStatus[] = []\n let hasChanges = false\n\n for (const source of kbRef.definition.sources || []) {\n const remoteHash = this.getRemoteSourceHash(remoteKb, source.id)\n\n if (DataSource.isDirectory(source)) {\n // Directory source: compute content hash\n const localHash = await this.computeDirectorySourceHash(source.directoryPath, source.filterFn)\n\n if (!remoteHash) {\n sources.push({\n dsId: source.id,\n dsType: 'document',\n needsSync: true,\n reason: 'First-time sync',\n })\n hasChanges = true\n } else if (localHash !== remoteHash) {\n // Get detailed file changes for this source\n const fileChanges = await this.detectDirectorySourceChanges(kb.name, source)\n sources.push({\n dsId: source.id,\n dsType: 'document',\n needsSync: true,\n reason: 'Content changed',\n fileChanges,\n })\n hasChanges = true\n } else {\n sources.push({\n dsId: source.id,\n dsType: 'document',\n needsSync: false,\n reason: 'No changes',\n })\n }\n } else if (DataSource.isWebsite(source)) {\n // Website source: compute config hash\n const config = source.getConfig()\n const localHash = this.computeConfigHash(config)\n\n if (!remoteHash) {\n sources.push({\n dsId: source.id,\n dsType: 'web-page',\n needsSync: true,\n reason: 'First-time crawl',\n })\n hasChanges = true\n } else if (localHash !== remoteHash) {\n sources.push({\n dsId: source.id,\n dsType: 'web-page',\n needsSync: true,\n reason: 'Config changed - needs recrawl',\n })\n hasChanges = true\n } else {\n // Config unchanged - check if legacy files need migration\n const legacyFileCount = await this.detectLegacyWebsiteFiles(kb.name, source.id)\n if (legacyFileCount > 0) {\n sources.push({\n dsId: source.id,\n dsType: 'web-page',\n needsSync: true,\n reason: `${legacyFileCount} legacy files to migrate`,\n legacyFileCount,\n })\n hasChanges = true\n } else {\n sources.push({\n dsId: source.id,\n dsType: 'web-page',\n needsSync: false,\n reason: 'No config changes',\n })\n }\n }\n }\n }\n\n // Detect orphaned sources (exist remotely but not in local definition)\n const localDsIds = (kbRef.definition.sources || []).map((s) => s.id)\n const orphaned = await this.getOrphanedSources(kb.name, localDsIds)\n const orphanedSourceStatuses: OrphanedSourceStatus[] = orphaned.map((o) => ({\n dsId: o.dsId,\n fileCount: o.fileCount,\n willDelete: true,\n }))\n const hasOrphanedSources = orphanedSourceStatuses.length > 0\n\n items.push({\n operation: (hasChanges || hasOrphanedSources) ? KBSyncOperation.Sync : KBSyncOperation.Skip,\n kb,\n reason: hasOrphanedSources\n ? (hasChanges ? 'Sources need sync and orphaned sources to remove' : 'Orphaned sources to remove')\n : (hasChanges ? 'Sources need sync' : 'No changes'),\n sources,\n orphanedSources: hasOrphanedSources ? orphanedSourceStatuses : undefined,\n })\n }\n\n const toSync = items.filter((i) => i.operation === KBSyncOperation.Sync).length\n const toSkip = items.filter((i) => i.operation === KBSyncOperation.Skip).length\n\n // Count sources\n let sourcesToSync = 0\n let sourcesToSkip = 0\n let orphanedSourcesToDelete = 0\n for (const item of items) {\n for (const source of item.sources || []) {\n if (source.needsSync) {\n sourcesToSync++\n } else {\n sourcesToSkip++\n }\n }\n orphanedSourcesToDelete += item.orphanedSources?.length || 0\n }\n\n return {\n items,\n toSync,\n toSkip,\n hasChanges: toSync > 0,\n sourcesToSync,\n sourcesToSkip,\n orphanedSourcesToDelete,\n }\n }\n\n /**\n * Detect file changes for a single directory source\n */\n private async detectDirectorySourceChanges(\n kbName: string,\n source: DataSource.DirectorySource\n ): Promise<FileChanges> {\n const client = await this.getClient()\n\n const added: string[] = []\n const deleted: string[] = []\n const modified: string[] = []\n\n // Get remote files for this source (new tag format)\n const tags = {\n [WellKnownTags.KNOWLEDGE]: 'knowledge-base',\n [WellKnownTags.KNOWLEDGE_SOURCE_ID]: source.id,\n [WellKnownTags.KNOWLEDGE_BASE_NAME]: kbName,\n }\n const remoteFiles = await this.listExistingFiles(client, tags)\n\n // Also check for legacy files (old tag format) that need migration\n const legacyTags = {\n knowledge: 'true', // Old tag format\n sourceId: source.id, // Old tag name\n kbName: kbName,\n }\n const legacyFiles = await this.listExistingFiles(client, legacyTags)\n\n // Build map of remote file hashes by relPath (new format only)\n const remoteHashes: Record<string, string> = {}\n for (const file of remoteFiles) {\n if (isFileMetadata(file.metadata)) {\n remoteHashes[file.metadata.relPath] = file.metadata.hash\n }\n }\n\n // Get local file hashes\n const localHashes = await this.scanLocalFileHashes(source.directoryPath, source.filterFn)\n\n // Check for added/modified files\n for (const [relPath, hash] of Object.entries(localHashes)) {\n if (!remoteHashes[relPath]) {\n added.push(relPath)\n } else if (remoteHashes[relPath] !== hash) {\n modified.push(relPath)\n }\n }\n\n // Check for deleted files\n for (const relPath of Object.keys(remoteHashes)) {\n if (!localHashes[relPath]) {\n deleted.push(relPath)\n }\n }\n\n // If there are legacy files, they need to be migrated (deleted and re-uploaded)\n if (legacyFiles.length > 0) {\n for (const file of legacyFiles) {\n const meta = file.metadata as FileMetadata | undefined\n const relPath = meta?.relPath\n if (relPath) {\n // Mark legacy file for deletion\n if (!deleted.includes(`${relPath} (legacy)`)) {\n deleted.push(`${relPath} (legacy)`)\n }\n // Mark corresponding local file for re-upload if it exists and isn't already in new format\n if (localHashes[relPath] && !added.includes(relPath) && !remoteHashes[relPath]) {\n added.push(relPath)\n }\n }\n }\n }\n\n return { added, deleted, modified }\n }\n\n /**\n * Scan local files for a directory source and return their hashes\n */\n private async scanLocalFileHashes(\n directoryPath: string,\n filterFn?: (filePath: string) => boolean\n ): Promise<Record<string, string>> {\n const projectDir = this.project.path\n const directory = path.resolve(projectDir, directoryPath)\n\n // Check cache first\n if (this.fileHashCache.has(directory)) {\n return this.fileHashCache.get(directory)!\n }\n\n const files = glob.sync(directory + '/**/*.*', { absolute: true, nodir: true })\n .filter((file) => !filterFn || filterFn(file))\n\n const hashes: Record<string, string> = {}\n for (const file of files) {\n const relPath = path.relative(directory, file)\n const content = await fs.readFile(file)\n hashes[relPath] = crypto.createHash('sha256').update(content).digest('hex')\n }\n\n // Store in cache\n this.fileHashCache.set(directory, hashes)\n\n return hashes\n }\n\n /**\n * Execute KB sync based on plan\n * Directly uploads files to Botpress without requiring a running bot.\n * For website sources that need sync, triggers the builtin_knowledge_indexing workflow.\n */\n async executeSync(plan: KBSyncPlan, options: KBSyncOptions = {}): Promise<KBSyncResult> {\n this.assertBotId('sync knowledge bases')\n\n const client = await this.getClient()\n const result: KBSyncResult = {\n synced: [],\n skipped: [],\n failed: [],\n websiteSyncs: [],\n }\n\n for (const item of plan.items) {\n if (item.operation === KBSyncOperation.Skip && !options.force) {\n result.skipped.push({ name: item.kb.name, reason: item.reason })\n continue\n }\n\n try {\n console.log(`Syncing KB \"${item.kb.name}\"...`)\n\n // Find the KB definition in the project\n const kbRef = this.project.knowledge.find((k) => k.definition.name === item.kb.name)\n if (!kbRef) {\n throw new Error(`KB \"${item.kb.name}\" not found in project`)\n }\n\n // Find or create the remote KB\n let remoteKb = await this.findRemoteKB(item.kb.name)\n if (!remoteKb) {\n console.log(` Creating KB \"${item.kb.name}\"...`)\n remoteKb = await this.createKnowledgeBase(item.kb.name)\n }\n\n // Delete orphaned sources first (if any)\n if (item.orphanedSources && item.orphanedSources.length > 0) {\n console.log(` Removing ${item.orphanedSources.length} orphaned source(s)...`)\n\n const deletedSourceIds: string[] = []\n for (const orphaned of item.orphanedSources) {\n const { deletedFiles, errors } = await this.deleteOrphanedSource(item.kb.name, orphaned.dsId)\n console.log(` ✕ ${orphaned.dsId}: ${deletedFiles} files deleted`)\n\n if (errors.length === 0) {\n deletedSourceIds.push(orphaned.dsId)\n } else {\n console.warn(` Warning: ${errors.length} errors during deletion`)\n }\n }\n\n // Clean up KB tags for successfully deleted sources\n if (deletedSourceIds.length > 0) {\n // Fetch fresh KB tags to avoid overwriting with stale data\n const freshKb = await this.findRemoteKB(item.kb.name)\n if (freshKb) {\n await this.cleanupSourceTags(\n freshKb.id,\n item.kb.name,\n deletedSourceIds,\n freshKb.tags || {}\n )\n // Update remoteKb reference with fresh tags for subsequent operations\n remoteKb = freshKb\n }\n }\n }\n\n const syncOutput: SyncOutput = {\n processed: 0,\n added: [],\n updated: [],\n deleted: [],\n errors: [],\n }\n\n // Get sources that need syncing from the plan\n const sourcesToSync = options.force\n ? (item.sources || [])\n : (item.sources || []).filter((s) => s.needsSync)\n\n // Separate document and web-page sources\n const directorySourcesToSync = sourcesToSync.filter((s) => s.dsType === 'document')\n const websiteSourcesToSync = sourcesToSync.filter((s) => s.dsType === 'web-page')\n\n // Sync directory sources directly (CLI uploads files)\n for (const sourceStatus of directorySourcesToSync) {\n const source = kbRef.definition.sources?.find((s) => s.id === sourceStatus.dsId)\n if (!source || !DataSource.isDirectory(source)) continue\n\n console.log(` Syncing directory source \"${source.id}\"...`)\n const sourceOutput = await this.syncDirectorySource(\n client,\n item.kb.name,\n remoteKb.id,\n source.id,\n source.directoryPath,\n source.filterFn,\n options.force || false\n )\n\n // Merge output\n syncOutput.processed += sourceOutput.processed\n syncOutput.added.push(...sourceOutput.added)\n syncOutput.updated.push(...sourceOutput.updated)\n syncOutput.deleted.push(...sourceOutput.deleted)\n syncOutput.errors.push(...sourceOutput.errors)\n\n // Update source hash after successful sync\n const sourceHash = await this.computeDirectorySourceHash(source.directoryPath, source.filterFn)\n await this.updateSourceHash(remoteKb.id, item.kb.name, source.id, sourceHash, remoteKb.tags)\n }\n\n // Trigger workflow ONCE for all website sources (if any need syncing)\n if (websiteSourcesToSync.length > 0) {\n try {\n // Delete legacy files for each source before syncing\n // (always check, not just when legacyFileCount is set - handles config change case)\n for (const sourceStatus of websiteSourcesToSync) {\n await this.deleteLegacyWebsiteFiles(item.kb.name, sourceStatus.dsId)\n }\n\n console.log(` Triggering website sync workflow for ${websiteSourcesToSync.length} source(s)...`)\n const { workflowId } = await this.syncWebsiteSource(item.kb.name, remoteKb.id, options.force || false)\n result.websiteSyncs!.push({ kbName: item.kb.name, workflowId })\n\n // Update config hashes for all website sources\n for (const sourceStatus of websiteSourcesToSync) {\n const source = kbRef.definition.sources?.find((s) => s.id === sourceStatus.dsId)\n if (!source || !DataSource.isWebsite(source)) continue\n\n const config = source.getConfig()\n const configHash = this.computeConfigHash(config)\n await this.updateSourceHash(remoteKb.id, item.kb.name, source.id, configHash, remoteKb.tags)\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n console.warn(` Warning: Could not trigger website sync: ${errorMsg}`)\n }\n }\n\n result.synced.push({ name: item.kb.name, result: syncOutput })\n } catch (error) {\n const errorMessage = this.formatError(error)\n console.error(`Failed to sync KB \"${item.kb.name}\": ${errorMessage}`)\n result.failed.push({ name: item.kb.name, error: errorMessage })\n }\n }\n\n return result\n }\n\n /**\n * Sync a directory data source by uploading files directly\n */\n private async syncDirectorySource(\n client: Client,\n kbName: string,\n kbId: string,\n dsId: string,\n directoryPath: string,\n filterFn: ((filePath: string) => boolean) | undefined,\n force: boolean\n ): Promise<SyncOutput> {\n const projectDir = this.project.path\n const directory = path.resolve(projectDir, directoryPath)\n\n // Validate directory is within project\n if (!directory.startsWith(projectDir)) {\n throw new Error(\"Directory path must be within the agent's directory\")\n }\n\n const tags = {\n [WellKnownTags.KNOWLEDGE]: 'knowledge-base',\n [WellKnownTags.KNOWLEDGE_BASE_ID]: kbId,\n [WellKnownTags.KNOWLEDGE_SOURCE_ID]: dsId,\n [WellKnownTags.KNOWLEDGE_SOURCE_TYPE]: 'document',\n [WellKnownTags.KNOWLEDGE_BASE_NAME]: kbName,\n }\n\n // List local files\n let allFiles = glob\n .sync(directory + '/**/*.*', { absolute: true, nodir: true })\n .filter((file) => {\n if (filterFn) {\n try {\n return filterFn(file)\n } catch {\n return false\n }\n }\n return true\n })\n .map<LocalFile>((f) => ({\n abs: f,\n rel: path.relative(directory, f),\n name: path.basename(f),\n }))\n\n console.log(` Found ${allFiles.length} files in ${directoryPath}`)\n\n // Get cached file hashes (computed earlier during sync plan)\n const cachedHashes = await this.scanLocalFileHashes(directoryPath, filterFn)\n\n // List existing files in Botpress (new tag format)\n const existingFiles = await this.listExistingFiles(client, tags)\n console.log(` Found ${existingFiles.length} existing files in Botpress`)\n\n // Also check for legacy files (old tag format) that need migration\n const legacyTags = {\n knowledge: 'true', // Old tag format\n sourceId: dsId, // Old tag name\n kbName: kbName,\n }\n const legacyFiles = await this.listExistingFiles(client, legacyTags)\n if (legacyFiles.length > 0) {\n console.log(` Found ${legacyFiles.length} legacy files to migrate`)\n }\n\n // Calculate diff (only comparing against new-format files)\n const toRemove = existingFiles.filter(\n (f) => !allFiles.find((af) => af.rel === f.metadata?.relPath)\n )\n // Add ALL legacy files to toRemove - they'll be deleted and re-uploaded with new format\n toRemove.push(...legacyFiles)\n\n const toAdd = allFiles.filter(\n (af) => !existingFiles.find((f) => f.metadata?.relPath === af.rel)\n )\n const toUpdate = allFiles.filter((af) =>\n existingFiles.find((f) => f.metadata?.relPath === af.rel)\n )\n\n const output: SyncOutput = {\n processed: allFiles.length,\n added: [],\n updated: [],\n deleted: [],\n errors: [],\n }\n\n // Delete removed files\n for (const file of toRemove) {\n try {\n await client.deleteFile({ id: file.id })\n output.deleted.push({\n file: file.id,\n name: file.key,\n hash: file.metadata?.hash ?? '',\n size: file.size ?? -1,\n })\n } catch (error) {\n output.errors.push({\n file: file.id,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n // Upload new files\n for (const local of toAdd) {\n const result = await this.upsertFile(client, local, dsId, tags, force, cachedHashes[local.rel])\n if (result) {\n output.added.push(result)\n }\n }\n\n // Update existing files (check hash)\n for (const local of toUpdate) {\n const result = await this.upsertFile(client, local, dsId, tags, force, cachedHashes[local.rel])\n if (result) {\n output.updated.push(result)\n }\n }\n\n console.log(` Synced: ${output.added.length} added, ${output.updated.length} updated, ${output.deleted.length} deleted`)\n\n return output\n }\n\n /**\n * List existing files in Botpress with given tags\n */\n private async listExistingFiles(\n client: Client,\n tags: Record<string, string>\n ): Promise<Array<{ id: string; key: string; size: number | null; metadata?: FileMetadata }>> {\n const files: Array<{ id: string; key: string; size: number | null; metadata?: FileMetadata }> = []\n let nextToken: string | undefined\n\n do {\n const response = await client.listFiles({ tags, nextToken })\n files.push(...response.files.map((f) => ({\n id: f.id,\n key: f.key,\n size: f.size,\n metadata: isFileMetadata(f.metadata) ? f.metadata : undefined,\n })))\n nextToken = response.meta.nextToken\n } while (nextToken)\n\n return files\n }\n\n /**\n * Upload or update a file\n */\n private async upsertFile(\n client: Client,\n local: LocalFile,\n dsId: string,\n tags: Record<string, string>,\n force: boolean,\n cachedHash?: string\n ): Promise<{ file: string; hash: string; name: string; size: number } | null> {\n const key = `data_source://document/${dsId}/${local.rel}`\n\n const content = await fs.readFile(local.abs)\n // Use cached hash if available, otherwise compute\n const hash = cachedHash ?? crypto.createHash('sha256').update(content).digest('hex')\n\n // Check if file exists and has same hash\n try {\n const { file } = await client.getFile({ id: key })\n if (!force && isFileMetadata(file.metadata) && file.metadata.hash === hash) {\n // File unchanged, skip\n return null\n }\n } catch {\n // File doesn't exist, will be created\n }\n\n // Extract title from filename\n const title = path.basename(local.name, path.extname(local.name))\n\n const metadata: FileMetadata = {\n hash,\n dsId: dsId,\n dsType: 'document',\n relPath: local.rel,\n [WellKnownMetadata.TITLE]: title,\n }\n\n const uploaded = await client.uploadFile({\n key,\n content,\n accessPolicies: [],\n tags,\n index: true,\n metadata,\n })\n\n return {\n file: uploaded.file.id,\n hash,\n name: key,\n size: uploaded.file.size ?? -1,\n }\n }\n\n}\n",
|
|
80
|
+
"import { Client } from '@botpress/client'\nimport { z } from '@botpress/sdk'\nimport type { JSONSchema7 } from '@bpinternal/zui'\n\nimport { AgentProject } from '../agent-project/agent-project.js'\n\nconst { transforms } = z\nimport { auth } from '../auth/index.js'\nimport {\n ColumnChange,\n LocalTable,\n RemoteTable,\n TableSyncItem,\n TableSyncOperation,\n TableSyncOptions,\n TableSyncPlan,\n TableSyncResult,\n} from './types.js'\n\nexport interface TableManagerOptions {\n project: AgentProject\n botId?: string\n}\n\nexport class TableManager {\n private client?: Client\n private botId?: string\n private project: AgentProject\n\n constructor(options: TableManagerOptions) {\n this.botId = options.botId\n this.project = options.project\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n\n this.assertBotId('initialize client')\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n botId: this.botId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n private assertBotId(operation: string): void {\n if (!this.botId) {\n throw new Error(\n `Operation \"${operation}\" requires a bot ID. ` +\n 'Please deploy your agent first or create agent.json with botId and workspaceId.'\n )\n }\n }\n\n private getSchemaType(schema: Record<string, unknown>): string {\n if (schema.type) {\n const items = schema.items as Record<string, unknown> | undefined\n if (schema.type === 'array' && items?.type) {\n return `array<${items.type}>`\n }\n return String(schema.type)\n }\n if (schema.$ref) {\n return String(schema.$ref).split('/').pop() || 'unknown'\n }\n return 'unknown'\n }\n\n /** Remove automatically generated properties that we can ignore when comparing changes */\n private calculateRenameScore(\n oldName: string,\n newName: string,\n oldSchema: Record<string, unknown>,\n newSchema: Record<string, unknown>,\n oldPosition: number,\n newPosition: number\n ): number {\n let score = 0\n\n // Same position in schema (strong signal) +3\n if (oldPosition === newPosition) {\n score += 3\n } else if (Math.abs(oldPosition - newPosition) <= 1) {\n // Adjacent position +1\n score += 1\n }\n\n // Compare descriptions\n const oldDesc = String(oldSchema?.description || '').toLowerCase()\n const newDesc = String(newSchema?.description || '').toLowerCase()\n\n if (oldDesc && newDesc && oldDesc === newDesc) {\n // Exact description match (very strong signal) +5\n score += 5\n } else if (oldDesc && newDesc && oldDesc.length > 5 && newDesc.length > 5) {\n // Partial description match +2\n if (oldDesc.includes(newDesc) || newDesc.includes(oldDesc)) {\n score += 2\n } else {\n // Check for word overlap\n const oldWords = oldDesc.split(/\\s+/)\n const newWords = newDesc.split(/\\s+/)\n const commonWords = oldWords.filter((w: string) => newWords.includes(w) && w.length > 3)\n if (commonWords.length >= 2) {\n score += 1\n }\n }\n }\n\n // Same required/optional status +1\n const oldType = oldSchema?.type\n const newType = newSchema?.type\n const oldOptional = (typeof oldType === 'string' && oldType.includes('null')) || oldSchema?.nullable === true\n const newOptional = (typeof newType === 'string' && newType.includes('null')) || newSchema?.nullable === true\n if (oldOptional === newOptional) {\n score += 1\n }\n\n // Same searchable status +1\n const oldSearchable = (oldSchema?.['x-zui'] as Record<string, unknown> | undefined)?.searchable\n const newSearchable = (newSchema?.['x-zui'] as Record<string, unknown> | undefined)?.searchable\n if (oldSearchable === newSearchable) {\n score += 1\n }\n\n return score\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- deeply recursive JSON schema manipulation\n private cleanSchemaForComparison(schema: any): any {\n if (!schema || typeof schema !== 'object') {\n return schema\n }\n\n const cleaned = Array.isArray(schema) ? [...schema] : { ...schema }\n\n if (cleaned['x-zui']) {\n const xZui = { ...cleaned['x-zui'] }\n delete xZui.index\n if (Object.keys(xZui).length === 0) {\n delete cleaned['x-zui']\n } else {\n cleaned['x-zui'] = xZui\n }\n }\n\n if (cleaned.properties) {\n const cleanedProps: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(cleaned.properties)) {\n cleanedProps[key] = this.cleanSchemaForComparison(value)\n }\n cleaned.properties = cleanedProps\n }\n\n if (cleaned.items) {\n cleaned.items = this.cleanSchemaForComparison(cleaned.items)\n }\n\n delete cleaned.additionalProperties\n\n return cleaned\n }\n\n private analyzeColumnChanges(\n local: any, // eslint-disable-line @typescript-eslint/no-explicit-any -- JSON schema objects with dynamic structure\n remote: any // eslint-disable-line @typescript-eslint/no-explicit-any -- JSON schema objects with dynamic structure\n ): {\n differences: string[]\n columnChanges: ColumnChange[]\n } {\n const differences: string[] = []\n const columnChanges: ColumnChange[] = []\n\n if (!local || !remote) {\n return { differences, columnChanges }\n }\n\n const cleanedLocal = this.cleanSchemaForComparison(local)\n const cleanedRemote = this.cleanSchemaForComparison(remote)\n\n const localProps = cleanedLocal.properties || {}\n const remoteProps = cleanedRemote.properties || {}\n\n const localKeys = Object.keys(localProps)\n const remoteKeys = Object.keys(remoteProps)\n\n const addedKeys = localKeys.filter((k) => !remoteKeys.includes(k))\n const removedKeys = remoteKeys.filter((k) => !localKeys.includes(k))\n const commonKeys = localKeys.filter((k) => remoteKeys.includes(k))\n\n const addedByType: Map<string, string[]> = new Map()\n const removedByType: Map<string, string[]> = new Map()\n\n for (const key of addedKeys) {\n const localType = this.getSchemaType(localProps[key])\n if (!addedByType.has(localType)) {\n addedByType.set(localType, [])\n }\n addedByType.get(localType)!.push(key)\n }\n\n for (const key of removedKeys) {\n const remoteType = this.getSchemaType(remoteProps[key])\n if (!removedByType.has(remoteType)) {\n removedByType.set(remoteType, [])\n }\n removedByType.get(remoteType)!.push(key)\n }\n\n const renamedColumns = new Set<string>()\n\n // Smart rename detection using multiple heuristics\n for (const [type, removedCols] of removedByType.entries()) {\n const addedCols = addedByType.get(type) || []\n if (removedCols.length === 0 || addedCols.length === 0) {\n continue\n }\n\n // Calculate match scores for each removed-added pair\n const matches: Array<{ removed: string; added: string; score: number }> = []\n\n for (const removed of removedCols) {\n for (const added of addedCols) {\n const score = this.calculateRenameScore(\n removed,\n added,\n remoteProps[removed],\n localProps[added],\n remoteKeys.indexOf(removed),\n localKeys.indexOf(added)\n )\n\n if (score > 0) {\n matches.push({ removed, added, score })\n }\n }\n }\n\n // Sort by score descending\n matches.sort((a, b) => b.score - a.score)\n\n // Greedily match highest scores, ensuring 1:1 mapping\n const usedRemoved = new Set<string>()\n const usedAdded = new Set<string>()\n\n for (const match of matches) {\n if (usedRemoved.has(match.removed) || usedAdded.has(match.added)) {\n continue\n }\n\n // Only consider it a rename if score is high enough\n if (match.score >= 2) {\n columnChanges.push({\n type: 'rename',\n columnName: match.added,\n oldColumnName: match.removed,\n oldType: type,\n newType: type,\n details: `Column \"${match.removed}\" → \"${match.added}\"`,\n })\n\n differences.push(`↔️ Renamed column \"${match.removed}\" → \"${match.added}\" (${type})`)\n\n renamedColumns.add(match.removed)\n renamedColumns.add(match.added)\n usedRemoved.add(match.removed)\n usedAdded.add(match.added)\n }\n }\n }\n\n const localRequired = cleanedLocal.required || []\n const remoteRequired = cleanedRemote.required || []\n\n for (const key of addedKeys) {\n if (!renamedColumns.has(key)) {\n const localType = this.getSchemaType(localProps[key])\n const isRequired = localRequired.includes(key)\n columnChanges.push({\n type: 'add',\n columnName: key,\n newType: localType,\n })\n const requiredSuffix = isRequired ? ' - required' : ''\n differences.push(`➕ Added column \"${key}\" (${localType})${requiredSuffix}`)\n }\n }\n\n for (const key of removedKeys) {\n if (!renamedColumns.has(key)) {\n const remoteType = this.getSchemaType(remoteProps[key])\n const wasRequired = remoteRequired.includes(key)\n columnChanges.push({\n type: 'remove',\n columnName: key,\n oldType: remoteType,\n })\n const requiredSuffix = wasRequired ? ' - was required' : ''\n differences.push(`➖ Removed column \"${key}\" (${remoteType})${requiredSuffix}`)\n }\n }\n\n for (const key of commonKeys) {\n const localCol = localProps[key]\n const remoteCol = remoteProps[key]\n\n const localType = this.getSchemaType(localCol)\n const remoteType = this.getSchemaType(remoteCol)\n\n if (localType !== remoteType) {\n columnChanges.push({\n type: 'modify',\n columnName: key,\n oldType: remoteType,\n newType: localType,\n details: `Type changed from ${remoteType} to ${localType}`,\n })\n differences.push(`🔀 Column \"${key}\": type changed from ${remoteType} to ${localType}`)\n }\n\n const localSearchable = localCol?.['x-zui']?.searchable\n const remoteSearchable = remoteCol?.['x-zui']?.searchable\n if (localSearchable !== remoteSearchable) {\n differences.push(\n `🔍 Column \"${key}\": searchable ${remoteSearchable ? 'disabled' : 'enabled'} (was ${remoteSearchable ? 'enabled' : 'disabled'})`\n )\n }\n\n const localRequired = cleanedLocal.required?.includes(key) || false\n const remoteRequired = cleanedRemote.required?.includes(key) || false\n if (localRequired !== remoteRequired) {\n differences.push(\n `${localRequired ? '🔒' : '🔓'} Column \"${key}\": ${localRequired ? 'now required' : 'now optional'}`\n )\n }\n\n const cleanedLocalCol = this.cleanSchemaForComparison(localCol)\n const cleanedRemoteCol = this.cleanSchemaForComparison(remoteCol)\n\n if (JSON.stringify(cleanedLocalCol) !== JSON.stringify(cleanedRemoteCol) && localType === remoteType) {\n const localDesc = localCol?.description\n const remoteDesc = remoteCol?.description\n if (localDesc !== remoteDesc) {\n differences.push(`💬 Column \"${key}\": description updated`)\n }\n }\n }\n\n return { differences, columnChanges }\n }\n\n private createSchemaForUpdate(localSchema: JSONSchema7, columnChanges: ColumnChange[]): JSONSchema7 {\n const updatedSchema = JSON.parse(JSON.stringify(localSchema)) as JSONSchema7\n\n if (!updatedSchema.properties) {\n updatedSchema.properties = {}\n }\n\n // Ensure required array exists (even if empty) to properly update optional/required status\n if (!updatedSchema.required) {\n updatedSchema.required = []\n }\n\n // Only handle actual removals in the schema\n // Renames are handled separately via renameTableColumn API\n for (const change of columnChanges) {\n if (change.type === 'remove') {\n // Mark column for removal by setting to null\n updatedSchema.properties[change.columnName] = { type: 'null' }\n\n if (updatedSchema.required && updatedSchema.required.includes(change.columnName)) {\n updatedSchema.required = updatedSchema.required.filter((req: string) => req !== change.columnName)\n }\n }\n }\n\n return updatedSchema\n }\n\n async getLocalTables(): Promise<LocalTable[]> {\n const tables: LocalTable[] = []\n\n for (const tableRef of this.project.tables) {\n try {\n // Load the actual table module to get the full definition\n\n tables.push({\n name: tableRef.definition.name,\n factor: tableRef.definition.factor,\n schema: tableRef.definition.schema,\n keyColumn: tableRef.definition.keyColumn,\n tags: tableRef.definition.tags,\n } satisfies LocalTable)\n } catch {}\n }\n\n return tables\n }\n\n async getRemoteTables(): Promise<RemoteTable[]> {\n this.assertBotId('get remote tables')\n\n const client = await this.getClient()\n\n try {\n const response = await client.listTables({})\n\n const tablesWithCounts = await Promise.all(\n response.tables.map(async (table) => {\n let rowCount = 0\n try {\n const tableInfo = await client.getTable({ table: table.name })\n rowCount = tableInfo.rows || 0\n } catch (error) {\n console.warn(`Failed to get row count for table ${table.name}:`, error)\n }\n\n return {\n id: table.id,\n name: table.name,\n createdAt: table.createdAt || new Date().toISOString(),\n updatedAt: table.updatedAt || new Date().toISOString(),\n factor: table.factor || 1,\n schema: table.schema,\n rowCount,\n keyColumn: table.keyColumn || '',\n tags: table.tags || {},\n } satisfies RemoteTable\n })\n )\n\n return tablesWithCounts\n } catch (error) {\n console.error('Failed to list remote tables:', error)\n return []\n }\n }\n\n async createSyncPlan(): Promise<TableSyncPlan> {\n const localTables = await this.getLocalTables()\n const remoteTables = await this.getRemoteTables()\n\n const items: TableSyncItem[] = []\n const remoteMap = new Map(remoteTables.map((t) => [t.name, t]))\n\n // Check each local table\n for (const local of localTables) {\n const remote = remoteMap.get(local.name)\n\n if (!remote) {\n // Table doesn't exist remotely - need to create\n items.push({\n operation: TableSyncOperation.Create,\n localTable: local,\n reason: 'Table does not exist remotely',\n })\n } else {\n // Table exists - check if schema matches\n try {\n const cleanedLocalSchema = this.cleanSchemaForComparison(local.schema)\n const cleanedRemoteSchema = this.cleanSchemaForComparison(remote.schema)\n\n const { differences, columnChanges } = this.analyzeColumnChanges(local.schema, remote.schema)\n const factorMatches = (local.factor || 1) === (remote.factor || 1)\n const keyColumnMatches = (local.keyColumn || '') === (remote.keyColumn || '')\n const tagsMatch = JSON.stringify(local.tags || {}) === JSON.stringify(remote.tags || {})\n\n const localSchema = transforms.fromJSONSchema(cleanedLocalSchema)\n const remoteSchema = transforms.fromJSONSchema(cleanedRemoteSchema)\n const schemasEqual = localSchema.isEqual(remoteSchema)\n const hasMetadataChanges = differences.length > 0\n\n if (!schemasEqual || !factorMatches || hasMetadataChanges || !keyColumnMatches || !tagsMatch) {\n const reasons: string[] = []\n if (differences.length > 0) {\n reasons.push('schema changes detected')\n } else if (!schemasEqual) {\n reasons.push('schema metadata changed')\n }\n if (!factorMatches) {\n differences.push(`⚡ Factor: ${remote.factor || 1} → ${local.factor || 1}`)\n reasons.push('factor changed')\n }\n\n if (!keyColumnMatches) {\n differences.push(`🔑 Key Column: \"${remote.keyColumn || ''}\" → \"${local.keyColumn || ''}\"`)\n reasons.push('key column changed')\n }\n\n if (!tagsMatch) {\n differences.push(\n `🏷️ Tags updated: ${JSON.stringify(remote.tags || {})} → ${JSON.stringify(local.tags || {})}`\n )\n reasons.push('tags changed')\n }\n\n const schemaForUpdate = this.createSchemaForUpdate(local.schema, columnChanges)\n\n items.push({\n operation: TableSyncOperation.Update,\n localTable: local,\n remoteTable: remote,\n reason: `Table ${reasons.join(' and ')}`,\n differences: differences.length > 0 ? differences : undefined,\n columnChanges: columnChanges.length > 0 ? columnChanges : undefined,\n schemaForUpdate,\n })\n } else {\n // Schema matches - no update needed\n items.push({\n operation: TableSyncOperation.None,\n localTable: local,\n remoteTable: remote,\n reason: 'Table schema is up to date',\n })\n }\n } catch {\n // If we can't compare schemas, assume they need updating\n items.push({\n operation: TableSyncOperation.Update,\n localTable: local,\n remoteTable: remote,\n reason: 'Unable to compare schemas - assuming update needed',\n })\n }\n\n // Remove from map so we can find orphaned tables\n remoteMap.delete(local.name)\n }\n }\n\n // Remaining remote tables don't have local counterparts\n for (const [, remote] of remoteMap) {\n items.push({\n operation: TableSyncOperation.Delete,\n remoteTable: remote,\n reason: 'Table no longer defined locally',\n })\n }\n\n // Calculate totals\n const totalCreate = items.filter((i) => i.operation === TableSyncOperation.Create).length\n const totalUpdate = items.filter((i) => i.operation === TableSyncOperation.Update).length\n const totalDelete = items.filter((i) => i.operation === TableSyncOperation.Delete).length\n const hasChanges = totalCreate > 0 || totalUpdate > 0 || totalDelete > 0\n\n return {\n items,\n totalCreate,\n totalUpdate,\n totalDelete,\n hasChanges,\n }\n }\n\n async executeSync(plan: TableSyncPlan, options: TableSyncOptions = {}): Promise<TableSyncResult> {\n this.assertBotId('sync tables')\n\n if (options.dryRun) {\n return {\n applied: false,\n success: [],\n failed: [],\n summary: {\n created: 0,\n updated: 0,\n deleted: 0,\n failed: 0,\n },\n }\n }\n\n const client = await this.getClient()\n const success: TableSyncItem[] = []\n const failed: Array<{ item: TableSyncItem; error: Error }> = []\n\n for (const item of plan.items) {\n if (item.operation === TableSyncOperation.None) {\n success.push(item)\n continue\n }\n\n try {\n switch (item.operation) {\n case TableSyncOperation.Create:\n if (item.localTable) {\n await client.createTable({\n name: item.localTable.name,\n factor: item.localTable.factor || 1,\n schema: item.localTable.schema,\n isComputeEnabled: true,\n keyColumn: item.localTable.keyColumn || '',\n tags: item.localTable.tags || {},\n })\n success.push(item)\n }\n break\n\n case TableSyncOperation.Update:\n if (item.localTable && item.remoteTable) {\n // Step 1: Handle column renames first (must be done before schema update)\n if (item.columnChanges) {\n const renames = item.columnChanges.filter((c) => c.type === 'rename')\n for (const rename of renames) {\n if (rename.oldColumnName && rename.columnName) {\n await client.renameTableColumn({\n table: item.localTable.name,\n name: rename.oldColumnName,\n newName: rename.columnName,\n })\n }\n }\n }\n\n // Step 2: Apply schema updates (after renames are done)\n let schemaToUse = item.schemaForUpdate || item.localTable.schema\n const localFactor = item.localTable.factor || 1\n const localKeyColumn = item.localTable.keyColumn || ''\n const localTags = item.localTable.tags || {}\n // Ensure schema has a required array (even if empty) to properly clear required fields\n if (!schemaToUse.required) {\n schemaToUse = { ...schemaToUse, required: [] }\n }\n\n await client.updateTable({\n table: item.localTable.name,\n factor: localFactor,\n schema: schemaToUse,\n tags: localTags,\n keyColumn: localKeyColumn,\n isComputeEnabled: true,\n })\n success.push(item)\n }\n break\n\n case TableSyncOperation.Delete:\n if (item.remoteTable) {\n // Require explicit confirmation for deletion\n if (!options.autoConfirm) {\n console.warn(`Skipping deletion of table \"${item.remoteTable.name}\" - requires confirmation`)\n continue\n }\n await client.deleteTable({ table: item.remoteTable.name })\n success.push(item)\n }\n break\n }\n } catch (error: unknown) {\n const err = error instanceof Error ? error : new Error(String(error))\n failed.push({ item, error: err })\n\n if (options.bailOnFailure) {\n break\n }\n }\n }\n\n return {\n applied: true,\n success,\n failed,\n summary: {\n created: success.filter((i) => i.operation === TableSyncOperation.Create).length,\n updated: success.filter((i) => i.operation === TableSyncOperation.Update).length,\n deleted: success.filter((i) => i.operation === TableSyncOperation.Delete).length,\n failed: failed.length,\n },\n }\n }\n}\n",
|
|
81
|
+
"import crypto from 'crypto'\nimport path from 'path'\nimport fs from 'fs/promises'\nimport { glob } from 'glob'\nimport { Client } from '@botpress/client'\nimport { DataSource } from '@botpress/runtime'\n\nimport { auth } from '../auth/index.js'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport {\n LocalKnowledgeBase,\n KBSyncPlan,\n KBSyncResult,\n KBSyncItem,\n KBSyncOperation,\n KBSyncOptions,\n SyncOutput,\n FileChanges,\n SourceSyncStatus,\n OrphanedSource,\n OrphanedSourceStatus,\n} from './types.js'\n\ntype RemoteKnowledgeBase = Pick<\n Awaited<ReturnType<Client['listKnowledgeBases']>>['knowledgeBases'][number],\n 'id' | 'name' | 'tags'\n>\n\nexport interface KnowledgeManagerOptions {\n project: AgentProject\n botId?: string\n}\n\n// Well-known tags for KB files (must match runtime constants)\nconst WellKnownTags = {\n KNOWLEDGE: 'source',\n KNOWLEDGE_BASE_ID: 'kbId',\n KNOWLEDGE_BASE_NAME: 'kbName',\n KNOWLEDGE_SOURCE_ID: 'dsId',\n KNOWLEDGE_SOURCE_TYPE: 'dsType',\n}\n\n// Per-source sync tracking stored in KB tags\n// Format: source<dsId><field> (alphanumeric only, must start with lowercase letter)\nfunction sourceTag(dsId: string, field: 'hash' | 'lastupdatedat'): string {\n // Sanitize dsId to be alphanumeric only (remove underscores, dashes, etc.)\n const sanitizedId = dsId.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()\n return `source${sanitizedId}${field}`\n}\n\nconst WellKnownMetadata = {\n TITLE: 'title',\n}\n\ntype FileMetadata = {\n hash: string\n dsId: string\n dsType: string\n relPath: string\n [key: string]: string\n}\n\n/**\n * Type guard for FileMetadata - validates metadata from API responses\n */\nfunction isFileMetadata(metadata: unknown): metadata is FileMetadata {\n return (\n typeof metadata === 'object' &&\n metadata !== null &&\n 'hash' in metadata &&\n typeof metadata.hash === 'string' &&\n 'relPath' in metadata &&\n typeof metadata.relPath === 'string'\n )\n}\n\ntype LocalFile = {\n abs: string\n rel: string\n name: string\n}\n\n/**\n * Manages knowledge base synchronization for ADK projects\n */\nexport class KnowledgeManager {\n private client?: Client\n private botId?: string\n private project: AgentProject\n /** Cache of file hashes by directory path to avoid recalculating */\n private fileHashCache: Map<string, Record<string, string>> = new Map()\n\n constructor(options: KnowledgeManagerOptions) {\n this.botId = options.botId\n this.project = options.project\n }\n\n /**\n * Clear the file hash cache (call before a new sync operation)\n */\n clearHashCache(): void {\n this.fileHashCache.clear()\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n\n this.assertBotId('initialize client')\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n botId: this.botId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n private assertBotId(operation: string): void {\n if (!this.botId) {\n throw new Error(\n `Operation \"${operation}\" requires a bot ID. ` +\n 'Please deploy your agent first or create agent.json with botId and workspaceId.'\n )\n }\n }\n\n /**\n * Format an error for display, including API response data if available\n */\n private formatError(error: unknown): string {\n if (!(error instanceof Error)) {\n return String(error)\n }\n\n let message = error.message\n\n // Check for axios-style API errors with response data\n if (\n 'response' in error &&\n error.response !== null &&\n typeof error.response === 'object' &&\n 'data' in error.response\n ) {\n message += ` - API: ${JSON.stringify(error.response.data)}`\n }\n\n return message\n }\n\n /**\n * Get all knowledge bases from the project\n */\n getLocalKnowledgeBases(): LocalKnowledgeBase[] {\n const kbs: LocalKnowledgeBase[] = []\n\n for (const kbRef of this.project.knowledge) {\n const definition = kbRef.definition\n\n kbs.push({\n name: definition.name,\n description: definition.description,\n sourceCount: definition.sources?.length || 0,\n })\n }\n\n return kbs\n }\n\n /**\n * Calculate content hash from individual file hashes\n * This creates a deterministic hash of all file contents\n */\n private computeContentHash(fileHashes: Record<string, string>): string {\n // Sort keys for deterministic ordering\n const sortedEntries = Object.entries(fileHashes).sort(([a], [b]) => a.localeCompare(b))\n const combined = sortedEntries.map(([filePath, hash]) => `${filePath}:${hash}`).join('\\n')\n return crypto.createHash('sha256').update(combined).digest('hex')\n }\n\n /**\n * List all remote knowledge bases\n */\n private async listRemoteKnowledgeBases(): Promise<RemoteKnowledgeBase[]> {\n const client = await this.getClient()\n const kbs: RemoteKnowledgeBase[] = []\n let nextToken: string | undefined\n\n do {\n const response = await client.listKnowledgeBases({ nextToken })\n kbs.push(...response.knowledgeBases)\n nextToken = response.meta.nextToken\n } while (nextToken)\n\n return kbs\n }\n\n /**\n * Find remote KB by name\n */\n private async findRemoteKB(name: string): Promise<RemoteKnowledgeBase | undefined> {\n const kbs = await this.listRemoteKnowledgeBases()\n return kbs.find((kb) => kb.name === name)\n }\n\n /**\n * Create a new knowledge base\n */\n async createKnowledgeBase(name: string): Promise<RemoteKnowledgeBase> {\n const client = await this.getClient()\n await client.createKnowledgeBase({ name })\n // createKnowledgeBase response doesn't include createdAt, so fetch the full KB\n const created = await this.findRemoteKB(name)\n if (!created) {\n throw new Error(`Failed to find KB \"${name}\" after creation`)\n }\n return created\n }\n\n /**\n * Get remote KBs that don't exist locally (orphaned)\n */\n async getOrphanedKBs(): Promise<RemoteKnowledgeBase[]> {\n const localKbNames = this.getLocalKnowledgeBases().map((kb) => kb.name)\n const remoteKbs = await this.listRemoteKnowledgeBases()\n return remoteKbs.filter((kb) => !localKbNames.includes(kb.name))\n }\n\n /**\n * Get orphaned sources for a KB by listing files and extracting unique dsIds from tags\n * Returns sources that exist in remote files but not in local definition\n */\n async getOrphanedSources(kbName: string, localDsIds: string[]): Promise<OrphanedSource[]> {\n const client = await this.getClient()\n\n // List ALL files for this KB using raw client to get full file data including tags\n const tags = {\n [WellKnownTags.KNOWLEDGE]: 'knowledge-base',\n [WellKnownTags.KNOWLEDGE_BASE_NAME]: kbName,\n }\n\n const files: Array<{ tags?: Record<string, string>; metadata?: Record<string, unknown> }> = []\n let nextToken: string | undefined\n do {\n const response = await client.listFiles({ tags, nextToken })\n files.push(...response.files)\n nextToken = response.meta.nextToken\n } while (nextToken)\n\n // Group files by dsId from tags (more reliable than metadata for website sources)\n const filesByDsId = new Map<string, number>()\n for (const file of files) {\n // Try to get dsId from tags first (works for all source types)\n const dsId = file.tags?.[WellKnownTags.KNOWLEDGE_SOURCE_ID] || (file.metadata?.dsId as string | undefined)\n if (dsId) {\n filesByDsId.set(dsId, (filesByDsId.get(dsId) || 0) + 1)\n }\n }\n\n // Find orphaned sources (exist in remote but not in local)\n const orphaned: OrphanedSource[] = []\n for (const [dsId, fileCount] of filesByDsId) {\n if (!localDsIds.includes(dsId)) {\n orphaned.push({ dsId, fileCount })\n }\n }\n\n return orphaned\n }\n\n /**\n * Delete all files belonging to an orphaned source using direct dsId tag query\n */\n async deleteOrphanedSource(kbName: string, dsId: string): Promise<{ deletedFiles: number; errors: string[] }> {\n const client = await this.getClient()\n\n // Query files directly by dsId tag\n const tags = {\n [WellKnownTags.KNOWLEDGE]: 'knowledge-base',\n [WellKnownTags.KNOWLEDGE_BASE_NAME]: kbName,\n [WellKnownTags.KNOWLEDGE_SOURCE_ID]: dsId,\n }\n const files = await this.listExistingFiles(client, tags)\n\n console.log(` Deleting ${files.length} files from orphaned source \"${dsId}\"...`)\n\n // Delete all files in parallel\n const results = await Promise.allSettled(files.map((f) => client.deleteFile({ id: f.id })))\n\n const deletedFiles = results.filter((r) => r.status === 'fulfilled').length\n const errors = results\n .filter((r): r is PromiseRejectedResult => r.status === 'rejected')\n .map((r) => String(r.reason))\n\n return { deletedFiles, errors }\n }\n\n /**\n * Clean up source tags from KB after deleting orphaned source\n * Note: Botpress API merges tags, so we set to empty string to \"delete\" them\n */\n private async cleanupSourceTags(\n kbId: string,\n kbName: string,\n dsIds: string[],\n existingTags: Record<string, string>\n ): Promise<void> {\n const client = await this.getClient()\n const newTags = { ...existingTags }\n\n for (const dsId of dsIds) {\n // Sanitize dsId the same way sourceTag() does\n const sanitizedId = dsId.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()\n // Set to empty string to clear (API merges tags, delete doesn't work)\n newTags[`source${sanitizedId}hash`] = ''\n newTags[`source${sanitizedId}lastupdatedat`] = ''\n }\n\n await client.updateKnowledgeBase({ id: kbId, name: kbName, tags: newTags })\n }\n\n /**\n * Delete a KB and all its associated files\n */\n async deleteKnowledgeBase(kbId: string, kbName: string): Promise<{ deletedFiles: number }> {\n const client = await this.getClient()\n\n // First delete all files associated with this KB\n const tags = {\n [WellKnownTags.KNOWLEDGE]: 'knowledge-base',\n [WellKnownTags.KNOWLEDGE_BASE_NAME]: kbName,\n }\n console.log(` Listing files for KB \"${kbName}\"...`)\n const files = await this.listExistingFiles(client, tags)\n console.log(` Found ${files.length} files to delete`)\n\n // Delete all files in parallel\n const results = await Promise.allSettled(files.map((file) => client.deleteFile({ id: file.id })))\n const deletedFiles = results.filter((r) => r.status === 'fulfilled').length\n\n // Then delete the KB itself\n console.log(` Deleting KB \"${kbName}\"...`)\n await client.deleteKnowledgeBase({ id: kbId })\n\n return { deletedFiles }\n }\n\n /**\n * Get stored hash for a specific source from KB tags\n */\n private getRemoteSourceHash(kb: RemoteKnowledgeBase, dsId: string): string | undefined {\n return kb.tags?.[sourceTag(dsId, 'hash')]\n }\n\n /**\n * Update source hash in KB tags after sync\n */\n private async updateSourceHash(\n kbId: string,\n kbName: string,\n dsId: string,\n hash: string,\n existingTags?: Record<string, string>\n ): Promise<void> {\n const client = await this.getClient()\n\n await client.updateKnowledgeBase({\n id: kbId,\n name: kbName,\n tags: {\n ...existingTags,\n [sourceTag(dsId, 'hash')]: hash,\n [sourceTag(dsId, 'lastupdatedat')]: new Date().toISOString(),\n },\n })\n }\n\n /**\n * Compute config hash for a data source (used for website sources)\n */\n private computeConfigHash(config: Record<string, unknown>): string {\n // Sort keys for deterministic ordering\n const sortedConfig = JSON.stringify(config, Object.keys(config).sort())\n return crypto.createHash('sha256').update(sortedConfig).digest('hex')\n }\n\n /**\n * Trigger website source sync by creating the builtin_knowledge_indexing workflow.\n * For dev bots, this requires adk dev to be running. For prod bots, runs in Botpress Cloud.\n */\n async syncWebsiteSource(kbName: string, kbId: string, force: boolean): Promise<{ workflowId: string }> {\n const client = await this.getClient()\n\n const response = await client.createWorkflow({\n name: 'builtin_knowledge_indexing',\n input: { kbName, kbId, force },\n status: 'pending',\n timeoutAt: new Date(Date.now() + 180 * 60 * 1000).toISOString(), // 180 minutes (matches workflow timeout)\n })\n\n return { workflowId: response.workflow.id }\n }\n\n /**\n * Detect legacy website source files (old tag format)\n * Legacy files have: knowledge: 'true' (old format)\n * Returns count of legacy files found\n */\n async detectLegacyWebsiteFiles(kbName: string, sourceId: string): Promise<number> {\n const client = await this.getClient()\n\n // Legacy tag format used before migration\n const legacyTags = {\n knowledge: 'true',\n sourceId: sourceId,\n kbName: kbName,\n }\n\n const legacyFiles = await this.listExistingFiles(client, legacyTags)\n return legacyFiles.length\n }\n\n /**\n * Delete legacy website source files (old tag format)\n * Called during executeSync when legacy files were detected\n */\n async deleteLegacyWebsiteFiles(kbName: string, sourceId: string): Promise<{ deletedFiles: number }> {\n const client = await this.getClient()\n\n // Legacy tag format used before migration\n const legacyTags = {\n knowledge: 'true',\n sourceId: sourceId,\n kbName: kbName,\n }\n\n const legacyFiles = await this.listExistingFiles(client, legacyTags)\n if (legacyFiles.length === 0) {\n return { deletedFiles: 0 }\n }\n\n console.log(` Found ${legacyFiles.length} legacy website files to migrate`)\n\n const results = await Promise.allSettled(legacyFiles.map((f) => client.deleteFile({ id: f.id })))\n\n const deletedFiles = results.filter((r) => r.status === 'fulfilled').length\n console.log(` ✅ Deleted ${deletedFiles} legacy website files`)\n\n return { deletedFiles }\n }\n\n /**\n * Check if a KB has any website sources\n */\n hasWebsiteSources(kbName: string): boolean {\n const kbRef = this.project.knowledge.find((k) => k.definition.name === kbName)\n if (!kbRef) return false\n return kbRef.definition.sources?.some((s) => DataSource.isWebsite(s)) || false\n }\n\n /**\n * Get list of KB names that have website sources\n */\n getKBsWithWebsiteSources(): string[] {\n return this.project.knowledge\n .filter((k) => k.definition.sources?.some((s) => DataSource.isWebsite(s)))\n .map((k) => k.definition.name)\n }\n\n /**\n * Compute content hash for a single directory source\n */\n private async computeDirectorySourceHash(\n directoryPath: string,\n filterFn?: (filePath: string) => boolean\n ): Promise<string> {\n const fileHashes = await this.scanLocalFileHashes(directoryPath, filterFn)\n return this.computeContentHash(fileHashes)\n }\n\n /**\n * Create a sync plan comparing local sources vs remote KB tags\n * Uses per-source hashes stored in KB tags\n */\n async createSyncPlan(): Promise<KBSyncPlan> {\n const localKbs = this.getLocalKnowledgeBases()\n const remoteKbs = await this.listRemoteKnowledgeBases()\n const items: KBSyncItem[] = []\n\n for (const kb of localKbs) {\n const kbRef = this.project.knowledge.find((k) => k.definition.name === kb.name)\n if (!kbRef) continue\n\n // Find matching remote KB by name\n const remoteKb = remoteKbs.find((r) => r.name === kb.name)\n\n if (!remoteKb) {\n // KB doesn't exist remotely yet - needs creation and sync of all sources\n const sources: SourceSyncStatus[] = (kbRef.definition.sources || []).map((source) => ({\n dsId: source.id,\n dsType: DataSource.isDirectory(source) ? ('document' as const) : ('web-page' as const),\n needsSync: true,\n reason: 'New KB',\n }))\n\n items.push({\n operation: KBSyncOperation.Sync,\n kb,\n reason: 'Knowledge base not found remotely',\n needsCreation: true,\n sources,\n })\n continue\n }\n\n // Check each source individually\n const sources: SourceSyncStatus[] = []\n let hasChanges = false\n\n for (const source of kbRef.definition.sources || []) {\n const remoteHash = this.getRemoteSourceHash(remoteKb, source.id)\n\n if (DataSource.isDirectory(source)) {\n // Directory source: compute content hash\n const localHash = await this.computeDirectorySourceHash(source.directoryPath, source.filterFn)\n\n if (!remoteHash) {\n sources.push({\n dsId: source.id,\n dsType: 'document',\n needsSync: true,\n reason: 'First-time sync',\n })\n hasChanges = true\n } else if (localHash !== remoteHash) {\n // Get detailed file changes for this source\n const fileChanges = await this.detectDirectorySourceChanges(kb.name, source)\n sources.push({\n dsId: source.id,\n dsType: 'document',\n needsSync: true,\n reason: 'Content changed',\n fileChanges,\n })\n hasChanges = true\n } else {\n sources.push({\n dsId: source.id,\n dsType: 'document',\n needsSync: false,\n reason: 'No changes',\n })\n }\n } else if (DataSource.isWebsite(source)) {\n // Website source: compute config hash\n const config = source.getConfig()\n const localHash = this.computeConfigHash(config)\n\n if (!remoteHash) {\n sources.push({\n dsId: source.id,\n dsType: 'web-page',\n needsSync: true,\n reason: 'First-time crawl',\n })\n hasChanges = true\n } else if (localHash !== remoteHash) {\n sources.push({\n dsId: source.id,\n dsType: 'web-page',\n needsSync: true,\n reason: 'Config changed - needs recrawl',\n })\n hasChanges = true\n } else {\n // Config unchanged - check if legacy files need migration\n const legacyFileCount = await this.detectLegacyWebsiteFiles(kb.name, source.id)\n if (legacyFileCount > 0) {\n sources.push({\n dsId: source.id,\n dsType: 'web-page',\n needsSync: true,\n reason: `${legacyFileCount} legacy files to migrate`,\n legacyFileCount,\n })\n hasChanges = true\n } else {\n sources.push({\n dsId: source.id,\n dsType: 'web-page',\n needsSync: false,\n reason: 'No config changes',\n })\n }\n }\n }\n }\n\n // Detect orphaned sources (exist remotely but not in local definition)\n const localDsIds = (kbRef.definition.sources || []).map((s) => s.id)\n const orphaned = await this.getOrphanedSources(kb.name, localDsIds)\n const orphanedSourceStatuses: OrphanedSourceStatus[] = orphaned.map((o) => ({\n dsId: o.dsId,\n fileCount: o.fileCount,\n willDelete: true,\n }))\n const hasOrphanedSources = orphanedSourceStatuses.length > 0\n\n items.push({\n operation: hasChanges || hasOrphanedSources ? KBSyncOperation.Sync : KBSyncOperation.Skip,\n kb,\n reason: hasOrphanedSources\n ? hasChanges\n ? 'Sources need sync and orphaned sources to remove'\n : 'Orphaned sources to remove'\n : hasChanges\n ? 'Sources need sync'\n : 'No changes',\n sources,\n orphanedSources: hasOrphanedSources ? orphanedSourceStatuses : undefined,\n })\n }\n\n const toSync = items.filter((i) => i.operation === KBSyncOperation.Sync).length\n const toSkip = items.filter((i) => i.operation === KBSyncOperation.Skip).length\n\n // Count sources\n let sourcesToSync = 0\n let sourcesToSkip = 0\n let orphanedSourcesToDelete = 0\n for (const item of items) {\n for (const source of item.sources || []) {\n if (source.needsSync) {\n sourcesToSync++\n } else {\n sourcesToSkip++\n }\n }\n orphanedSourcesToDelete += item.orphanedSources?.length || 0\n }\n\n return {\n items,\n toSync,\n toSkip,\n hasChanges: toSync > 0,\n sourcesToSync,\n sourcesToSkip,\n orphanedSourcesToDelete,\n }\n }\n\n /**\n * Detect file changes for a single directory source\n */\n private async detectDirectorySourceChanges(kbName: string, source: DataSource.DirectorySource): Promise<FileChanges> {\n const client = await this.getClient()\n\n const added: string[] = []\n const deleted: string[] = []\n const modified: string[] = []\n\n // Get remote files for this source (new tag format)\n const tags = {\n [WellKnownTags.KNOWLEDGE]: 'knowledge-base',\n [WellKnownTags.KNOWLEDGE_SOURCE_ID]: source.id,\n [WellKnownTags.KNOWLEDGE_BASE_NAME]: kbName,\n }\n const remoteFiles = await this.listExistingFiles(client, tags)\n\n // Also check for legacy files (old tag format) that need migration\n const legacyTags = {\n knowledge: 'true', // Old tag format\n sourceId: source.id, // Old tag name\n kbName: kbName,\n }\n const legacyFiles = await this.listExistingFiles(client, legacyTags)\n\n // Build map of remote file hashes by relPath (new format only)\n const remoteHashes: Record<string, string> = {}\n for (const file of remoteFiles) {\n if (isFileMetadata(file.metadata)) {\n remoteHashes[file.metadata.relPath] = file.metadata.hash\n }\n }\n\n // Get local file hashes\n const localHashes = await this.scanLocalFileHashes(source.directoryPath, source.filterFn)\n\n // Check for added/modified files\n for (const [relPath, hash] of Object.entries(localHashes)) {\n if (!remoteHashes[relPath]) {\n added.push(relPath)\n } else if (remoteHashes[relPath] !== hash) {\n modified.push(relPath)\n }\n }\n\n // Check for deleted files\n for (const relPath of Object.keys(remoteHashes)) {\n if (!localHashes[relPath]) {\n deleted.push(relPath)\n }\n }\n\n // If there are legacy files, they need to be migrated (deleted and re-uploaded)\n if (legacyFiles.length > 0) {\n for (const file of legacyFiles) {\n const meta = file.metadata as FileMetadata | undefined\n const relPath = meta?.relPath\n if (relPath) {\n // Mark legacy file for deletion\n if (!deleted.includes(`${relPath} (legacy)`)) {\n deleted.push(`${relPath} (legacy)`)\n }\n // Mark corresponding local file for re-upload if it exists and isn't already in new format\n if (localHashes[relPath] && !added.includes(relPath) && !remoteHashes[relPath]) {\n added.push(relPath)\n }\n }\n }\n }\n\n return { added, deleted, modified }\n }\n\n /**\n * Scan local files for a directory source and return their hashes\n */\n private async scanLocalFileHashes(\n directoryPath: string,\n filterFn?: (filePath: string) => boolean\n ): Promise<Record<string, string>> {\n const projectDir = this.project.path\n const directory = path.resolve(projectDir, directoryPath)\n\n // Check cache first\n if (this.fileHashCache.has(directory)) {\n return this.fileHashCache.get(directory)!\n }\n\n const files = glob\n .sync(directory + '/**/*.*', { absolute: true, nodir: true })\n .filter((file) => !filterFn || filterFn(file))\n\n const hashes: Record<string, string> = {}\n for (const file of files) {\n const relPath = path.relative(directory, file)\n const content = await fs.readFile(file)\n hashes[relPath] = crypto.createHash('sha256').update(content).digest('hex')\n }\n\n // Store in cache\n this.fileHashCache.set(directory, hashes)\n\n return hashes\n }\n\n /**\n * Execute KB sync based on plan\n * Directly uploads files to Botpress without requiring a running bot.\n * For website sources that need sync, triggers the builtin_knowledge_indexing workflow.\n */\n async executeSync(plan: KBSyncPlan, options: KBSyncOptions = {}): Promise<KBSyncResult> {\n this.assertBotId('sync knowledge bases')\n\n const client = await this.getClient()\n const result: KBSyncResult = {\n synced: [],\n skipped: [],\n failed: [],\n websiteSyncs: [],\n }\n\n for (const item of plan.items) {\n if (item.operation === KBSyncOperation.Skip && !options.force) {\n result.skipped.push({ name: item.kb.name, reason: item.reason })\n continue\n }\n\n try {\n console.log(`Syncing KB \"${item.kb.name}\"...`)\n\n // Find the KB definition in the project\n const kbRef = this.project.knowledge.find((k) => k.definition.name === item.kb.name)\n if (!kbRef) {\n throw new Error(`KB \"${item.kb.name}\" not found in project`)\n }\n\n // Find or create the remote KB\n let remoteKb = await this.findRemoteKB(item.kb.name)\n if (!remoteKb) {\n console.log(` Creating KB \"${item.kb.name}\"...`)\n remoteKb = await this.createKnowledgeBase(item.kb.name)\n }\n\n // Delete orphaned sources first (if any)\n if (item.orphanedSources && item.orphanedSources.length > 0) {\n console.log(` Removing ${item.orphanedSources.length} orphaned source(s)...`)\n\n const deletedSourceIds: string[] = []\n for (const orphaned of item.orphanedSources) {\n const { deletedFiles, errors } = await this.deleteOrphanedSource(item.kb.name, orphaned.dsId)\n console.log(` ✕ ${orphaned.dsId}: ${deletedFiles} files deleted`)\n\n if (errors.length === 0) {\n deletedSourceIds.push(orphaned.dsId)\n } else {\n console.warn(` Warning: ${errors.length} errors during deletion`)\n }\n }\n\n // Clean up KB tags for successfully deleted sources\n if (deletedSourceIds.length > 0) {\n // Fetch fresh KB tags to avoid overwriting with stale data\n const freshKb = await this.findRemoteKB(item.kb.name)\n if (freshKb) {\n await this.cleanupSourceTags(freshKb.id, item.kb.name, deletedSourceIds, freshKb.tags || {})\n // Update remoteKb reference with fresh tags for subsequent operations\n remoteKb = freshKb\n }\n }\n }\n\n const syncOutput: SyncOutput = {\n processed: 0,\n added: [],\n updated: [],\n deleted: [],\n errors: [],\n }\n\n // Get sources that need syncing from the plan\n const sourcesToSync = options.force ? item.sources || [] : (item.sources || []).filter((s) => s.needsSync)\n\n // Separate document and web-page sources\n const directorySourcesToSync = sourcesToSync.filter((s) => s.dsType === 'document')\n const websiteSourcesToSync = sourcesToSync.filter((s) => s.dsType === 'web-page')\n\n // Accumulate tags in-memory so multiple updateSourceHash calls on the same KB\n // don't overwrite each other's entries (Bug B: stale remoteKb.tags snapshot).\n // Must be initialized after the remoteKb = freshKb reassignment above.\n let currentTags = { ...(remoteKb.tags ?? {}) }\n\n // Sync directory sources directly (CLI uploads files)\n for (const sourceStatus of directorySourcesToSync) {\n const source = kbRef.definition.sources?.find((s) => s.id === sourceStatus.dsId)\n if (!source || !DataSource.isDirectory(source)) continue\n\n console.log(` Syncing directory source \"${source.id}\"...`)\n const sourceOutput = await this.syncDirectorySource(\n client,\n item.kb.name,\n remoteKb.id,\n source.id,\n source.directoryPath,\n source.filterFn,\n options.force || false\n )\n\n // Merge output\n syncOutput.processed += sourceOutput.processed\n syncOutput.added.push(...sourceOutput.added)\n syncOutput.updated.push(...sourceOutput.updated)\n syncOutput.deleted.push(...sourceOutput.deleted)\n syncOutput.errors.push(...sourceOutput.errors)\n\n // Update source hash after successful sync, using accumulated tags (Bug B fix)\n const sourceHash = await this.computeDirectorySourceHash(source.directoryPath, source.filterFn)\n await this.updateSourceHash(remoteKb.id, item.kb.name, source.id, sourceHash, currentTags)\n currentTags = {\n ...currentTags,\n [sourceTag(source.id, 'hash')]: sourceHash,\n [sourceTag(source.id, 'lastupdatedat')]: new Date().toISOString(),\n }\n }\n\n // Sync website sources directly (CLI fetches and uploads locally)\n for (const sourceStatus of websiteSourcesToSync) {\n const source = kbRef.definition.sources?.find((s) => s.id === sourceStatus.dsId)\n if (!source || !DataSource.isWebsite(source)) continue\n\n // Check if this source can be synced locally\n const config = source.getConfig()\n if (config.mode === 'website') {\n console.warn(\n ` ⚠️ Skipping website source \"${source.id}\": website mode requires browser integration for URL discovery. Use WebsiteSource.fromSitemap() instead.`\n )\n continue\n }\n if (config.fetchStrategy === 'integration:browser') {\n console.warn(\n ` ⚠️ Skipping website source \"${source.id}\": integration:browser fetch strategy requires browser integration. Use fetch: 'node:fetch' or a custom fetch function instead.`\n )\n continue\n }\n\n // Delete legacy files before syncing (only when we will actually re-upload)\n await this.deleteLegacyWebsiteFiles(item.kb.name, sourceStatus.dsId)\n\n try {\n this.assertBotId('sync website source')\n\n console.log(` Syncing website source \"${source.id}\" locally...`)\n const sourceOutput = await source.syncDirect(client, this.botId!, {\n dsId: source.id,\n kbName: item.kb.name,\n kbId: remoteKb.id,\n force: options.force || false,\n })\n\n // Merge output (map runtime string[] errors to manager SyncErrorItem[])\n syncOutput.processed += sourceOutput.processed\n syncOutput.added.push(...sourceOutput.added)\n syncOutput.updated.push(...sourceOutput.updated)\n syncOutput.deleted.push(...sourceOutput.deleted)\n syncOutput.errors.push(\n ...sourceOutput.errors.map((e) => (typeof e === 'string' ? { file: source.id, error: e } : e))\n )\n\n // Update source hash after successful sync\n const configHash = this.computeConfigHash(config)\n await this.updateSourceHash(remoteKb.id, item.kb.name, source.id, configHash, currentTags)\n currentTags = {\n ...currentTags,\n [sourceTag(source.id, 'hash')]: configHash,\n [sourceTag(source.id, 'lastupdatedat')]: new Date().toISOString(),\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n console.error(` Failed to sync website source \"${source.id}\": ${errorMsg}`)\n syncOutput.errors.push({ file: source.id, error: errorMsg })\n }\n }\n\n result.synced.push({ name: item.kb.name, result: syncOutput })\n } catch (error) {\n const errorMessage = this.formatError(error)\n console.error(`Failed to sync KB \"${item.kb.name}\": ${errorMessage}`)\n result.failed.push({ name: item.kb.name, error: errorMessage })\n }\n }\n\n return result\n }\n\n /**\n * Sync a directory data source by uploading files directly\n */\n private async syncDirectorySource(\n client: Client,\n kbName: string,\n kbId: string,\n dsId: string,\n directoryPath: string,\n filterFn: ((filePath: string) => boolean) | undefined,\n force: boolean\n ): Promise<SyncOutput> {\n const projectDir = this.project.path\n const directory = path.resolve(projectDir, directoryPath)\n\n // Validate directory is within project\n if (!directory.startsWith(projectDir)) {\n throw new Error(\"Directory path must be within the agent's directory\")\n }\n\n const tags = {\n [WellKnownTags.KNOWLEDGE]: 'knowledge-base',\n [WellKnownTags.KNOWLEDGE_BASE_ID]: kbId,\n [WellKnownTags.KNOWLEDGE_SOURCE_ID]: dsId,\n [WellKnownTags.KNOWLEDGE_SOURCE_TYPE]: 'document',\n [WellKnownTags.KNOWLEDGE_BASE_NAME]: kbName,\n }\n\n // List local files\n let allFiles = glob\n .sync(directory + '/**/*.*', { absolute: true, nodir: true })\n .filter((file) => {\n if (filterFn) {\n try {\n return filterFn(file)\n } catch {\n return false\n }\n }\n return true\n })\n .map<LocalFile>((f) => ({\n abs: f,\n rel: path.relative(directory, f),\n name: path.basename(f),\n }))\n\n console.log(` Found ${allFiles.length} files in ${directoryPath}`)\n\n // Get cached file hashes (computed earlier during sync plan)\n const cachedHashes = await this.scanLocalFileHashes(directoryPath, filterFn)\n\n // List existing files in Botpress (new tag format)\n const existingFiles = await this.listExistingFiles(client, tags)\n console.log(` Found ${existingFiles.length} existing files in Botpress`)\n\n // Also check for legacy files (old tag format) that need migration\n const legacyTags = {\n knowledge: 'true', // Old tag format\n sourceId: dsId, // Old tag name\n kbName: kbName,\n }\n const legacyFiles = await this.listExistingFiles(client, legacyTags)\n if (legacyFiles.length > 0) {\n console.log(` Found ${legacyFiles.length} legacy files to migrate`)\n }\n\n // Calculate diff (only comparing against new-format files)\n const toRemove = existingFiles.filter((f) => !allFiles.find((af) => af.rel === f.metadata?.relPath))\n // Add ALL legacy files to toRemove - they'll be deleted and re-uploaded with new format\n toRemove.push(...legacyFiles)\n\n const toAdd = allFiles.filter((af) => !existingFiles.find((f) => f.metadata?.relPath === af.rel))\n const toUpdate = allFiles.filter((af) => existingFiles.find((f) => f.metadata?.relPath === af.rel))\n\n const output: SyncOutput = {\n processed: allFiles.length,\n added: [],\n updated: [],\n deleted: [],\n errors: [],\n }\n\n // Delete removed files\n for (const file of toRemove) {\n try {\n await client.deleteFile({ id: file.id })\n output.deleted.push({\n file: file.id,\n name: file.key,\n hash: file.metadata?.hash ?? '',\n size: file.size ?? -1,\n })\n } catch (error) {\n output.errors.push({\n file: file.id,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n // Upload new files\n for (const local of toAdd) {\n const result = await this.upsertFile(client, local, dsId, tags, force, cachedHashes[local.rel])\n if (result) {\n output.added.push(result)\n }\n }\n\n // Update existing files (check hash)\n for (const local of toUpdate) {\n const result = await this.upsertFile(client, local, dsId, tags, force, cachedHashes[local.rel])\n if (result) {\n output.updated.push(result)\n }\n }\n\n console.log(\n ` Synced: ${output.added.length} added, ${output.updated.length} updated, ${output.deleted.length} deleted`\n )\n\n return output\n }\n\n /**\n * List existing files in Botpress with given tags\n */\n private async listExistingFiles(\n client: Client,\n tags: Record<string, string>\n ): Promise<Array<{ id: string; key: string; size: number | null; metadata?: FileMetadata }>> {\n const files: Array<{ id: string; key: string; size: number | null; metadata?: FileMetadata }> = []\n let nextToken: string | undefined\n\n do {\n const response = await client.listFiles({ tags, nextToken })\n files.push(\n ...response.files.map((f) => ({\n id: f.id,\n key: f.key,\n size: f.size,\n metadata: isFileMetadata(f.metadata) ? f.metadata : undefined,\n }))\n )\n nextToken = response.meta.nextToken\n } while (nextToken)\n\n return files\n }\n\n /**\n * Upload or update a file\n */\n private async upsertFile(\n client: Client,\n local: LocalFile,\n dsId: string,\n tags: Record<string, string>,\n force: boolean,\n cachedHash?: string\n ): Promise<{ file: string; hash: string; name: string; size: number } | null> {\n const key = `data_source://document/${dsId}/${local.rel}`\n\n const content = await fs.readFile(local.abs)\n // Use cached hash if available, otherwise compute\n const hash = cachedHash ?? crypto.createHash('sha256').update(content).digest('hex')\n\n // Check if file exists and has same hash\n try {\n const { file } = await client.getFile({ id: key })\n if (!force && isFileMetadata(file.metadata) && file.metadata.hash === hash) {\n // File unchanged, skip\n return null\n }\n } catch {\n // File doesn't exist, will be created\n }\n\n // Extract title from filename\n const title = path.basename(local.name, path.extname(local.name))\n\n const metadata: FileMetadata = {\n hash,\n dsId: dsId,\n dsType: 'document',\n relPath: local.rel,\n [WellKnownMetadata.TITLE]: title,\n }\n\n const uploaded = await client.uploadFile({\n key,\n content,\n accessPolicies: [],\n tags,\n index: true,\n metadata,\n })\n\n return {\n file: uploaded.file.id,\n hash,\n name: key,\n size: uploaded.file.size ?? -1,\n }\n }\n}\n",
|
|
82
82
|
"/**\n * Sync output from KB indexing workflow\n * Mirrors the SyncOutput from runtime\n */\nexport interface SyncOutputItem {\n file: string\n name: string\n hash: string\n size: number\n}\n\nexport interface SyncErrorItem {\n file: string\n error: string\n}\n\nexport interface SyncOutput {\n processed: number\n added: SyncOutputItem[]\n updated: SyncOutputItem[]\n deleted: SyncOutputItem[]\n errors: SyncErrorItem[]\n}\n\n/**\n * Local knowledge base representation from project\n */\nexport interface LocalKnowledgeBase {\n name: string\n description?: string\n sourceCount: number\n}\n\n/**\n * Sync operation type for knowledge bases\n */\nexport enum KBSyncOperation {\n Sync = 'sync',\n Skip = 'skip',\n}\n\n/**\n * File changes detected during sync planning\n */\nexport interface FileChanges {\n added: string[]\n modified: string[]\n deleted: string[]\n}\n\n/**\n * Sync status for a single data source\n */\nexport interface SourceSyncStatus {\n dsId: string\n dsType: 'document' | 'web-page'\n needsSync: boolean\n reason: string\n /** For document sources, detailed file changes */\n fileChanges?: FileChanges\n /** For web-page sources, count of legacy files needing migration */\n legacyFileCount?: number\n}\n\n/**\n * Represents an orphaned source (exists remotely but not in local definition)\n */\nexport interface OrphanedSource {\n dsId: string\n fileCount: number\n}\n\n/**\n * Status for orphaned sources in the sync plan\n */\nexport interface OrphanedSourceStatus {\n dsId: string\n fileCount: number\n willDelete: boolean\n}\n\n/**\n * Individual KB sync plan item\n */\nexport interface KBSyncItem {\n operation: KBSyncOperation\n kb: LocalKnowledgeBase\n reason: string\n /** Whether the KB needs to be created remotely first */\n needsCreation?: boolean\n /** Per-source sync status */\n sources?: SourceSyncStatus[]\n /** Orphaned sources that exist remotely but not in local definition */\n orphanedSources?: OrphanedSourceStatus[]\n}\n\n/**\n * Sync plan for all knowledge bases\n */\nexport interface KBSyncPlan {\n items: KBSyncItem[]\n toSync: number\n toSkip: number\n hasChanges: boolean\n /** Source-level counts */\n sourcesToSync: number\n sourcesToSkip: number\n /** Number of orphaned sources to delete */\n orphanedSourcesToDelete: number\n}\n\n/**\n * Options for KB sync execution\n */\nexport interface KBSyncOptions {\n /** Force sync even if config hash matches */\n force?: boolean\n /** Timeout in ms for waiting for workflow completion (default: 300000 = 5 min) */\n timeout?: number\n /** Auto-confirm operations without prompting */\n autoConfirm?: boolean\n}\n\n/**\n * Website sync workflow info\n */\nexport interface WebsiteSyncInfo {\n kbName: string\n workflowId: string\n}\n\n/**\n * Result of KB sync execution\n */\nexport interface KBSyncResult {\n synced: Array<{ name: string; result: SyncOutput }>\n skipped: Array<{ name: string; reason: string }>\n failed: Array<{ name: string; error: string }>\n /** Website sync workflows triggered (run asynchronously in bot runtime) */\n websiteSyncs?: WebsiteSyncInfo[]\n}\n",
|
|
83
83
|
"import { readFileSync } from 'fs'\nimport { join } from 'path'\nimport type { KBSyncPlan } from './types.js'\nimport { KBSyncOperation } from './types.js'\n\nconst getAdkVersion = (): string => {\n try {\n const packageJson = require('@botpress/adk/package.json')\n return packageJson.version\n } catch {\n try {\n const adkPackagePath = join(process.cwd(), 'node_modules/@botpress/adk/package.json')\n const pkg = JSON.parse(readFileSync(adkPackagePath, 'utf-8'))\n return pkg.version\n } catch {\n return 'unknown'\n }\n }\n}\n\nfunction pluralize(count: number, word: string): string {\n return `${count} ${word}${count !== 1 ? 's' : ''}`\n}\n\n/**\n * Plain text formatter for KB sync plan\n * CLI-agnostic - the CLI should apply colors/styling\n */\nexport class KBSyncFormatter {\n static format(plan: KBSyncPlan, kbsWithWebsites: string[] = []): string {\n const sections: string[] = []\n\n sections.push('')\n sections.push(' ▄▀█ █▀▄ █▄▀ Botpress ADK')\n sections.push(` █▀█ █▄▀ █░█ v${getAdkVersion()}`)\n sections.push('')\n sections.push('Knowledge Base Sync')\n sections.push('')\n\n if (!plan.hasChanges) {\n sections.push('✓ All knowledge bases are up to date.')\n sections.push('')\n return sections.join('\\n')\n }\n\n // Show KBs that need syncing\n const kbsToSync = plan.items.filter((i) => i.operation === KBSyncOperation.Sync)\n const kbsToSkip = plan.items.filter((i) => i.operation === KBSyncOperation.Skip)\n\n if (kbsToSync.length > 0) {\n sections.push('Knowledge Bases to Sync:\\n')\n\n for (const item of kbsToSync) {\n const icon = item.needsCreation ? '+' : '~'\n const action = item.needsCreation ? 'CREATE' : 'UPDATE'\n sections.push(` ${icon} ${item.kb.name}`)\n sections.push(` Action: ${action}`)\n sections.push(` Reason: ${item.reason}`)\n\n // Show per-source details\n if (item.sources && item.sources.length > 0) {\n sections.push(' Sources:')\n for (const source of item.sources) {\n if (source.needsSync) {\n const typeLabel = source.dsType === 'document' ? '📁' : '🌐'\n sections.push(` ${typeLabel} ${source.dsId} (${source.dsType})`)\n sections.push(` ${source.reason}`)\n\n // Show file changes for directory sources\n if (source.fileChanges) {\n const { added, modified, deleted } = source.fileChanges\n if (added.length > 0) {\n sections.push(` + ${pluralize(added.length, 'file')} to add`)\n }\n if (modified.length > 0) {\n sections.push(` ~ ${pluralize(modified.length, 'file')} to update`)\n }\n if (deleted.length > 0) {\n sections.push(` - ${pluralize(deleted.length, 'file')} to delete`)\n }\n }\n }\n }\n }\n sections.push('')\n }\n }\n\n if (kbsToSkip.length > 0) {\n sections.push('Knowledge Bases Already Up to Date:\\n')\n for (const item of kbsToSkip) {\n sections.push(` ✓ ${item.kb.name}`)\n }\n sections.push('')\n }\n\n // Website sources warning\n if (kbsWithWebsites.length > 0) {\n sections.push('⚠️ Website Sources')\n sections.push(' Website crawling will run asynchronously in the bot runtime.')\n sections.push(` KBs with websites: ${kbsWithWebsites.join(', ')}`)\n sections.push('')\n }\n\n // Summary\n sections.push('Summary of Actions\\n')\n\n if (plan.toSync > 0) {\n sections.push(` • Sync: ${pluralize(plan.toSync, 'knowledge base')}`)\n }\n if (plan.toSkip > 0) {\n sections.push(` • Skip: ${pluralize(plan.toSkip, 'knowledge base')} (up to date)`)\n }\n\n sections.push(` • Sources: ${plan.sourcesToSync} to sync, ${plan.sourcesToSkip} up to date`)\n sections.push('')\n\n return sections.join('\\n')\n }\n}\n",
|
|
84
|
-
"import { watch, readdirSync } from 'fs'\nimport { EventEmitter } from 'events'\nimport { join, relative } from 'path'\nimport { existsSync } from 'fs'\n\nexport type WatchChangeType = 'added' | 'modified' | 'deleted'\n\nexport interface FileChange {\n path: string\n type: WatchChangeType\n}\n\nexport interface FileChangeEvent {\n changes: FileChange[]\n timestamp: number\n}\n\nexport interface FileWatcherOptions {\n projectPath: string\n debounceMs?: number\n}\n\n/**\n * File watcher for ADK agent projects\n *\n * Watches the following patterns:\n * - src/**\\/*\n * - agent.config.ts\n * - package.json\n * - agent.json\n */\nexport class FileWatcher extends EventEmitter {\n private projectPath: string\n private watchers: Map<string, ReturnType<typeof watch>> = new Map()\n private fileStates: Map<string, number> = new Map()\n private debounceMs: number\n private debounceTimer: NodeJS.Timeout | null = null\n private pendingChanges: Map<string, FileChange> = new Map()\n\n constructor(options: FileWatcherOptions) {\n super()\n this.projectPath = options.projectPath\n this.debounceMs = options.debounceMs ?? 100\n }\n\n /**\n * Start watching files\n */\n start(): void {\n // Watch individual files at project root\n const rootFiles = ['package.json', 'agent.json', 'agent.config.ts']\n\n for (const file of rootFiles) {\n const filePath = join(this.projectPath, file)\n if (existsSync(filePath)) {\n this.watchFile(filePath)\n }\n }\n\n // Watch src directory recursively\n const srcPath = join(this.projectPath, 'src')\n if (existsSync(srcPath)) {\n // Initialize state for all existing files BEFORE setting up watchers\n this.initializeDirectoryState(srcPath)\n // Now set up the watcher\n this.watchDirectory(srcPath)\n }\n }\n\n /**\n * Initialize state for all files in a directory (recursive)\n */\n private initializeDirectoryState(dirPath: string): void {\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name)\n if (entry.isDirectory()) {\n this.initializeDirectoryState(fullPath)\n } else if (entry.isFile()) {\n this.updateFileState(fullPath)\n }\n }\n } catch
|
|
85
|
-
"import { Client, type Bot } from '@botpress/client'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { auth } from '../auth/index.js'\nimport { IntegrationChecker, type IntegrationCheckResult } from '../integrations/checker.js'\nimport { IntegrationSyncManager } from '../integrations/sync-manager.js'\nimport { generateBotProject } from '../bot-generator/generator.js'\nimport path from 'path'\nimport type {\n PreflightCheckResult,\n IntegrationDiff,\n ConfigFieldDiff,\n AgentConfigDiff,\n IntegrationConfiguration,\n ConfigurationSchema,\n SyncCallbacks,\n} from './types.js'\nimport { hasIntegrationChanges, pluralize } from './types.js'\nimport { AgentConfigSyncManager } from './agent-config-sync.js'\nimport { PreflightFormatter } from './formatter.js'\n\nexport interface PendingPreflightResult {\n result: PreflightCheckResult\n apply: (callbacks?: SyncCallbacks) => Promise<void>\n}\n\nexport class PreflightChecker {\n private projectPath: string\n private client?: Client\n private project?: AgentProject\n\n constructor(projectPath: string) {\n this.projectPath = projectPath\n }\n\n private async getProject(): Promise<AgentProject> {\n if (!this.project) {\n this.project = await AgentProject.load(this.projectPath)\n }\n return this.project\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n const project = await this.getProject()\n\n const workspaceId = project.agentInfo?.workspaceId || credentials.workspaceId\n\n if (!workspaceId) {\n throw new Error('No workspace ID found. Please login with \"adk login\"')\n }\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n private async performCheck(botId: string): Promise<{\n result: PreflightCheckResult\n integrationResults: IntegrationCheckResult[]\n }> {\n const client = await this.getClient()\n const project = await this.getProject()\n\n const { bot } = await client.getBot({ id: botId })\n const integrationChecker = new IntegrationChecker(this.projectPath)\n const integrationResults = await integrationChecker.checkIntegrations(botId)\n\n const integrationDiffs = this.buildIntegrationDiffs(integrationResults)\n const agentConfigDiffs = this.buildAgentConfigDiffs(project, bot)\n const hasChanges = hasIntegrationChanges(integrationDiffs) || agentConfigDiffs.length > 0\n\n return {\n result: {\n integrations: integrationDiffs,\n agentConfig: agentConfigDiffs,\n hasChanges,\n },\n integrationResults,\n }\n }\n\n private buildIntegrationDiffs(results: IntegrationCheckResult[]): {\n toInstall: IntegrationDiff[]\n toRemove: IntegrationDiff[]\n toUpdate: IntegrationDiff[]\n } {\n const toInstall: IntegrationDiff[] = []\n const toRemove: IntegrationDiff[] = []\n const toUpdate: IntegrationDiff[] = []\n\n for (const result of results) {\n if (result.
|
|
86
|
-
"export type IntegrationConfiguration = Record<string,
|
|
87
|
-
"import { Client,
|
|
88
|
-
"import { readFileSync } from 'fs'\nimport { join } from 'path'\nimport type { PreflightCheckResult } from './types.js'\nimport { hasIntegrationChanges, pluralize } from './types.js'\n\nconst getAdkVersion = (): string => {\n try {\n const packageJson = require('@botpress/adk/package.json')\n return packageJson.version\n } catch {\n try {\n const adkPackagePath = join(process.cwd(), 'node_modules/@botpress/adk/package.json')\n const pkg = JSON.parse(readFileSync(adkPackagePath, 'utf-8'))\n return pkg.version\n } catch {\n return 'unknown'\n }\n }\n}\n\n/**\n * Plain text formatter for preflight check results\n * CLI-agnostic - the CLI should apply colors/styling\n */\nexport class PreflightFormatter {\n static format(result: PreflightCheckResult): string {\n const sections: string[] = []\n\n sections.push('')\n sections.push(' ▄▀█ █▀▄ █▄▀ Botpress ADK')\n sections.push(` █▀█ █▄▀ █░█ v${getAdkVersion()}`)\n sections.push('')\n sections.push('Running preflight checks...')\n sections.push('')\n\n const allIntegrations = [\n ...result.integrations.toRemove,\n ...result.integrations.toInstall,\n ...result.integrations.toUpdate,\n ]\n const maxWidth = Math.max(...allIntegrations.map((i) => `${i.alias} (v${i.version})`.length), 30)\n\n if (hasIntegrationChanges(result.integrations)) {\n sections.push('Integrations:\\n')\n\n if (result.integrations.toRemove.length > 0) {\n sections.push('Installed Remotely but NOT in agent.config.ts')\n sections.push('(these will be DISABLED or REMOVED)\\n')\n\n for (const integration of result.integrations.toRemove) {\n const name = `${integration.alias} (v${integration.version})`\n const padding = ' '.repeat(maxWidth - name.length + 4)\n sections.push(` — ${name}${padding}✗ Not present locally`)\n sections.push(` Action: Remove\\n`)\n }\n }\n\n if (result.integrations.toInstall.length > 0) {\n sections.push('Present Locally but NOT Installed Remotely')\n sections.push('(these will be INSTALLED)\\n')\n\n for (const integration of result.integrations.toInstall) {\n const name = `${integration.alias} (v${integration.version})`\n const padding = ' '.repeat(maxWidth - name.length + 4)\n sections.push(` — ${name}${padding}+ Missing remotely`)\n sections.push(` Action: Install\\n`)\n }\n }\n\n if (result.integrations.toUpdate.length > 0) {\n sections.push('Present on both, but config DIFFERS')\n sections.push('(these will be UPDATED)\\n')\n\n for (const integration of result.integrations.toUpdate) {\n sections.push(` — ${integration.alias} (v${integration.version})`)\n\n if (integration.configChanges && integration.configChanges.length > 0) {\n sections.push(' Configuration differences:\\n')\n\n for (const change of integration.configChanges) {\n sections.push(` ${change.field}:`)\n sections.push(` - Remote: ${this.formatValue(change.oldValue)}`)\n sections.push(` + Local: ${this.formatValue(change.newValue)}\\n`)\n }\n }\n }\n }\n }\n\n if (result.agentConfig.length > 0) {\n sections.push('Agent Configuration Differences')\n sections.push('(These are top-level agent settings, not integration settings)\\n')\n\n for (const diff of result.agentConfig) {\n sections.push(` agent.${diff.field}:`)\n sections.push(` - Remote: ${this.formatValue(diff.oldValue)}`)\n sections.push(` + Local: ${this.formatValue(diff.newValue)}\\n`)\n }\n }\n\n sections.push('Summary of Actions\\n')\n const install = result.integrations.toInstall.length\n const remove = result.integrations.toRemove.length\n const update = result.integrations.toUpdate.length\n const agentConfig = result.agentConfig.length\n\n if (install > 0) {\n sections.push(` • Install: ${pluralize(install, 'integration')}`)\n }\n if (remove > 0) {\n sections.push(` • Remove: ${pluralize(remove, 'integration')}`)\n }\n if (update > 0) {\n sections.push(` • Update: ${pluralize(update, 'integration')}`)\n }\n if (agentConfig > 0) {\n sections.push(` • Agent config: ${pluralize(agentConfig, 'change')}`)\n }\n\n sections.push('')\n\n return sections.join('\\n')\n }\n\n static formatPrompt(): string {\n return '❓ Apply these changes before continuing?\\nProceed? [y/N] '\n }\n\n private static formatValue(value:
|
|
89
|
-
"import dedent from 'dedent'\nimport { existsSync } from 'fs'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport { spawn } from 'child_process'\nimport { AgentProject } from '../agent-project/index.js'\nimport { generateBotProject } from '../bot-generator/index.js'\nimport { generateAssetsTypes, generateAssetsRuntime } from '../generators/assets.js'\nimport { formatCode } from '../generators/utils.js'\nimport { BpBuildCommand } from '../commands/bp-build-command.js'\nimport { ConfigManager } from '../config/manager.js'\nimport { CredentialsManager } from '../auth/credentials.js'\n\n/**\n * Find the agent project root by walking up from startPath looking for agent.config.ts\n */\nasync function findAgentRoot(startPath: string): Promise<string | null> {\n let currentPath = path.resolve(startPath)\n const root = path.parse(currentPath).root\n\n while (currentPath !== root) {\n try {\n await fs.access(path.join(currentPath, 'agent.config.ts'))\n return currentPath\n } catch {\n currentPath = path.dirname(currentPath)\n }\n }\n\n return null\n}\n\nexport interface ScriptRunnerCredentials {\n /** Authentication token */\n token: string\n /** API URL */\n apiUrl: string\n}\n\nexport interface ScriptRunnerOptions {\n /** Path to the agent project root */\n projectPath: string\n /** Credentials for API access */\n credentials: ScriptRunnerCredentials\n /** Whether to regenerate the bot project even if it exists */\n forceRegenerate?: boolean\n /** Use production bot ID instead of dev bot ID (default: false, uses devId) */\n prod?: boolean\n}\n\nexport interface RunScriptOptions extends ScriptRunnerOptions {\n /** Path to the script file to run (relative to project or absolute) */\n scriptPath: string\n /** Additional arguments to pass to the script */\n args?: string[]\n /** Environment variables to set */\n env?: Record<string, string>\n /** Whether to inherit stdio */\n inheritStdio?: boolean\n}\n\nexport interface RunOptions {\n /** Additional arguments to pass to the script */\n args?: string[]\n /** Environment variables to set */\n env?: Record<string, string>\n /** Whether to inherit stdio */\n inheritStdio?: boolean\n}\n\nexport interface TestRuntimeResult {\n /** Path to the bot project */\n botPath: string\n /** Path to the adk-runtime module that can be imported */\n runtimePath: string\n /** Bot ID being used */\n botId: string\n /** Workspace ID */\n workspaceId: string\n /** Whether using production bot */\n isProd: boolean\n /** The prepared project instance */\n project: AgentProject\n /**\n * Import and initialize the ADK runtime in the current process.\n * Call this once before running tests that need the runtime.\n * Returns the bot instance.\n */\n initialize: () => Promise<unknown>\n}\n\nexport class ScriptRunner {\n private projectPath: string\n private forceRegenerate: boolean\n private prod: boolean\n private credentials: ScriptRunnerCredentials\n\n constructor(options: ScriptRunnerOptions) {\n this.projectPath = path.resolve(options.projectPath)\n this.forceRegenerate = options.forceRegenerate ?? false\n this.prod = options.prod ?? false\n this.credentials = options.credentials\n }\n\n /**\n * Ensure the bot project is generated and ready for script execution\n */\n async prepare(): Promise<{ botPath: string; runnerPath: string; project: AgentProject }> {\n const project = await AgentProject.load(this.projectPath, {\n adkCommand: 'adk-build',\n })\n\n const botPath = path.join(this.projectPath, '.adk', 'bot')\n const runnerPath = path.join(botPath, 'src', 'script-runner.ts')\n const botpressTypesPath = path.join(botPath, '.botpress', 'implementation', 'index.ts')\n\n // Check if we need to regenerate\n const needsRegenerate = this.forceRegenerate || !existsSync(runnerPath) || !existsSync(botpressTypesPath)\n\n if (needsRegenerate) {\n // Generate assets types first\n try {\n await generateAssetsTypes(project.path)\n await generateAssetsRuntime(project.path, project.agentInfo?.botId, project.agentInfo?.workspaceId)\n } catch {\n // Assets directory might not exist\n }\n\n // Generate the bot project\n await generateBotProject({\n projectPath: project.path,\n outputPath: botPath,\n })\n\n // Generate the script runner entry point\n await this.generateScriptRunner(botPath)\n\n // Run bp build to generate .botpress types\n await this.runBpBuild(botPath)\n }\n\n return { botPath, runnerPath, project }\n }\n\n /**\n * Run bp build to generate .botpress types needed for the script runner\n */\n private async runBpBuild(botPath: string): Promise<void> {\n const buildCommand = new BpBuildCommand({ botPath })\n\n return new Promise((resolve, reject) => {\n buildCommand.on('done', () => resolve())\n buildCommand.on('error', (err) => reject(new Error(err.message)))\n buildCommand.run()\n })\n }\n\n /**\n * Generate the script runner entry point that bootstraps the ADK runtime\n */\n private async generateScriptRunner(botPath: string): Promise<void> {\n const content = dedent`\n /**\n * ADK Script Runner Entry Point\n *\n * This file bootstraps the ADK runtime and then executes a user script.\n * It's auto-generated by the ADK CLI.\n */\n import * as bp from '.botpress'\n import { setupAdkRuntime } from './adk-runtime'\n import { context, agentRegistry } from '@botpress/runtime/runtime'\n import { Autonomous } from '@botpress/runtime'\n import { Client } from '@botpress/client'\n import { BotSpecificClient, BotLogger } from '@botpress/sdk'\n import { Cognitive } from '@botpress/cognitive'\n\n // Create a minimal bot instance for runtime initialization\n const bot = new bp.Bot({\n actions: {}\n })\n\n // Initialize the ADK runtime\n setupAdkRuntime(bot)\n\n // Set up default context for script execution (outside of request handlers)\n const botId = process.env.ADK_BOT_ID!\n const token = process.env.ADK_TOKEN!\n const apiUrl = process.env.ADK_API_URL || 'https://api.botpress.cloud'\n const configuration = process.env.ADK_CONFIGURATION ? JSON.parse(process.env.ADK_CONFIGURATION) : {}\n\n const vanillaClient = new Client({ token, apiUrl, botId })\n const client = new BotSpecificClient(vanillaClient as any)\n const cognitive = new Cognitive({ client: client as any, __experimental_beta: true })\n const logger = new BotLogger({})\n\n context.setDefaultContext({\n executionId: 'script-execution',\n executionFinished: false,\n botId,\n client: client as any,\n cognitive: cognitive as any,\n citations: new Autonomous.CitationsManager(),\n logger: logger as any,\n configuration,\n integrations: agentRegistry.integrations,\n interfaces: agentRegistry.interfaces,\n states: [],\n tags: [],\n scheduledHeavyImports: new Set<string>(),\n })\n\n // Export runtime utilities for scripts to use\n export { bot }\n\n // Get the script path from command line arguments\n const scriptPath = process.argv[2]\n\n if (!scriptPath) {\n console.error('Error: No script path provided')\n console.error('Usage: bun run script-runner.ts <script-path> [args...]')\n process.exit(1)\n }\n\n // Import and run the user script\n async function runScript() {\n try {\n // Dynamic import of the user script\n const scriptModule = await import(scriptPath)\n\n // If the script exports a default function, call it\n if (typeof scriptModule.default === 'function') {\n const args = process.argv.slice(3)\n await scriptModule.default(...args)\n }\n // If it exports a 'run' function, call it\n else if (typeof scriptModule.run === 'function') {\n const args = process.argv.slice(3)\n await scriptModule.run(...args)\n }\n // If it exports a 'main' function, call it\n else if (typeof scriptModule.main === 'function') {\n const args = process.argv.slice(3)\n await scriptModule.main(...args)\n }\n // Otherwise, the script should have run on import (top-level code)\n } catch (error) {\n console.error('Script execution failed:', error)\n process.exit(1)\n }\n }\n\n runScript()\n `\n\n await fs.writeFile(path.join(botPath, 'src', 'script-runner.ts'), await formatCode(content), 'utf-8')\n }\n\n /**\n * Setup the ADK runtime for use in tests (vitest, bun test, etc.)\n *\n * Unlike `run()`, this doesn't spawn a child process. Instead, it:\n * 1. Prepares the bot project (generates types, etc.)\n * 2. Sets up environment variables in the current process\n * 3. Returns paths and an initialize() function to import the runtime\n *\n * Usage in tests:\n * ```typescript\n * import { ScriptRunner } from '@botpress/adk'\n *\n * const runner = new ScriptRunner({ projectPath: '.', credentials: {...} })\n * const runtime = await runner.setupTestRuntime()\n * await runtime.initialize()\n *\n * // Now you can import and use your actions, tools, etc.\n * ```\n */\n async setupTestRuntime(options: { env?: Record<string, string> } = {}): Promise<TestRuntimeResult> {\n const { botPath, project } = await this.prepare()\n\n // Determine which bot ID to use\n const botId = this.prod ? project.agentInfo?.botId : project.agentInfo?.devId || project.agentInfo?.botId\n const workspaceId = project.agentInfo?.workspaceId || ''\n\n if (!botId) {\n const idType = this.prod ? 'botId' : 'devId'\n throw new Error(\n `No ${idType} found in agent.json. ` +\n (this.prod\n ? 'Please deploy your agent first with \"adk deploy\".'\n : 'Please run \"adk dev\" first to create a development bot, or use --prod to use the production bot.')\n )\n }\n\n // Fetch configuration if bot ID is available\n let configuration: Record<string, unknown> | undefined\n try {\n const manager = new ConfigManager(botId)\n configuration = await manager.getAll()\n } catch {\n // Configuration fetch failed - will only be available during request handling\n }\n\n // Set environment variables in the current process\n const envVars: Record<string, string> = {\n ADK_PROJECT_PATH: this.projectPath,\n ADK_BOT_PATH: botPath,\n ADK_BOT_ID: botId,\n ADK_WORKSPACE_ID: workspaceId,\n ADK_IS_PROD: this.prod ? 'true' : 'false',\n BP_DISABLE_WORKER_MODE: 'true',\n ADK_SCRIPT_MODE: 'true',\n ADK_TOKEN: this.credentials.token,\n ADK_API_URL: this.credentials.apiUrl,\n ...(configuration && { ADK_CONFIGURATION: JSON.stringify(configuration) }),\n ...options.env,\n }\n\n // Apply environment variables to current process\n for (const [key, value] of Object.entries(envVars)) {\n process.env[key] = value\n }\n\n const runtimePath = path.join(botPath, 'src', 'index.ts')\n\n return {\n botPath,\n runtimePath,\n botId,\n workspaceId,\n isProd: this.prod,\n project,\n initialize: async () => {\n // Dynamic import of the generated bot index which sets up the runtime\n const botModule = await import(runtimePath)\n\n // After the runtime is initialized, we need to set up a default context\n // that includes integrations from the agentRegistry\n const runtimeModule = await import('@botpress/runtime/runtime')\n const { Autonomous } = await import('@botpress/runtime')\n const { context, agentRegistry } = runtimeModule\n\n // Create a client for making API calls\n const { Client } = await import('@botpress/client')\n const { BotSpecificClient, BotLogger } = await import('@botpress/sdk')\n const { Cognitive } = await import('@botpress/cognitive')\n\n const vanillaClient = new Client({\n token: this.credentials.token,\n apiUrl: this.credentials.apiUrl,\n botId,\n })\n\n const client = new BotSpecificClient(vanillaClient as any)\n\n const cognitive = new Cognitive({\n client: client as any,\n __experimental_beta: true,\n })\n\n const logger = new BotLogger({})\n\n // Set a default context that will be used as fallback when no AsyncLocalStorage context is active\n // This allows actions/integrations to work in tests without wrapping every call\n context.setDefaultContext({\n executionId: 'test-execution',\n executionFinished: false,\n botId,\n client: client as any,\n cognitive: cognitive as any,\n citations: new Autonomous.CitationsManager(),\n logger: logger as any,\n configuration: configuration ?? {},\n integrations: agentRegistry.integrations,\n interfaces: agentRegistry.interfaces,\n states: [],\n tags: [],\n scheduledHeavyImports: new Set<string>(),\n })\n\n return botModule.default\n },\n }\n }\n\n /**\n * Run a script with the ADK runtime initialized\n */\n async run(scriptPath: string, options: RunOptions = {}): Promise<number> {\n const { botPath, runnerPath, project } = await this.prepare()\n\n // Resolve the script path\n const absoluteScriptPath = path.isAbsolute(scriptPath) ? scriptPath : path.resolve(this.projectPath, scriptPath)\n\n if (!existsSync(absoluteScriptPath)) {\n throw new Error(`Script not found: ${absoluteScriptPath}`)\n }\n\n // Determine which bot ID to use\n const botId = this.prod ? project.agentInfo?.botId : project.agentInfo?.devId || project.agentInfo?.botId\n const workspaceId = project.agentInfo?.workspaceId\n\n if (!botId) {\n const idType = this.prod ? 'botId' : 'devId'\n throw new Error(\n `No ${idType} found in agent.json. ` +\n (this.prod\n ? 'Please deploy your agent first with \"adk deploy\".'\n : 'Please run \"adk dev\" first to create a development bot, or use --prod to use the production bot.')\n )\n }\n\n // Build the command arguments\n const args = ['run', runnerPath, absoluteScriptPath, ...(options.args || [])]\n\n // Fetch configuration if bot ID is available\n let configuration: Record<string, unknown> | undefined\n try {\n const manager = new ConfigManager(botId)\n configuration = await manager.getAll()\n } catch {\n // Configuration fetch failed - will only be available during request handling\n }\n\n // Merge environment variables\n const env: Record<string, string> = {\n ...(process.env as Record<string, string>),\n\n // Set the project path so scripts can reference it\n ADK_PROJECT_PATH: this.projectPath,\n ADK_BOT_PATH: botPath,\n // Set bot context\n ADK_BOT_ID: botId,\n ADK_WORKSPACE_ID: workspaceId || '',\n ADK_IS_PROD: this.prod ? 'true' : 'false',\n // Disable worker mode for scripts\n BP_DISABLE_WORKER_MODE: 'true',\n ...options.env,\n ADK_SCRIPT_MODE: 'true',\n ADK_SCRIPT_PATH: absoluteScriptPath,\n ADK_TOKEN: this.credentials.token,\n ADK_API_URL: this.credentials.apiUrl,\n // Inject configuration so it's available at module load time\n ...(configuration && { ADK_CONFIGURATION: JSON.stringify(configuration) }),\n }\n\n return new Promise((resolve, reject) => {\n const child = spawn('bun', args, {\n cwd: botPath,\n env,\n stdio: options.inheritStdio !== false ? 'inherit' : 'pipe',\n })\n\n child.on('error', (error) => {\n reject(error)\n })\n\n child.on('close', (code) => {\n resolve(code ?? 0)\n })\n })\n }\n}\n\n/**\n * Convenience function to run a script with the ADK runtime\n */\nexport async function runScript(options: RunScriptOptions): Promise<number> {\n const runner = new ScriptRunner({\n projectPath: options.projectPath,\n forceRegenerate: options.forceRegenerate,\n prod: options.prod,\n credentials: options.credentials,\n })\n\n return runner.run(options.scriptPath, {\n args: options.args,\n env: options.env,\n inheritStdio: options.inheritStdio,\n })\n}\n\nexport interface SetupTestRuntimeOptions {\n /**\n * Path to the agent project root.\n * If not provided, auto-detects by walking up from CWD looking for agent.config.ts\n */\n projectPath?: string\n /**\n * Credentials for API access.\n * If not provided, loads from the current ADK profile (~/.adk/credentials)\n */\n credentials?: ScriptRunnerCredentials\n /** Whether to regenerate the bot project even if it exists */\n forceRegenerate?: boolean\n /** Use production bot ID instead of dev bot ID (default: false, uses devId) */\n prod?: boolean\n /** Additional environment variables to set */\n env?: Record<string, string>\n}\n\n/**\n * Convenience function to setup the ADK runtime for tests.\n *\n * This is designed to be called from test setup (beforeAll, globalSetup, etc.)\n * to prepare the ADK runtime environment without spawning a child process.\n *\n * Features:\n * - Auto-detects project path by walking up from CWD looking for agent.config.ts\n * - Auto-loads credentials from the current ADK profile (~/.adk/credentials)\n * - Both can be overridden via options\n *\n * @example\n * ```typescript\n * // Minimal usage - auto-detects everything\n * import { setupTestRuntime } from '@botpress/adk'\n *\n * beforeAll(async () => {\n * const runtime = await setupTestRuntime()\n * await runtime.initialize()\n * })\n *\n * // With explicit options\n * beforeAll(async () => {\n * const runtime = await setupTestRuntime({\n * projectPath: '/path/to/agent',\n * credentials: { token: 'custom-token', apiUrl: 'https://api.botpress.cloud' },\n * prod: true,\n * })\n * await runtime.initialize()\n * })\n * ```\n */\nexport async function setupTestRuntime(options: SetupTestRuntimeOptions = {}): Promise<TestRuntimeResult> {\n // Auto-detect project path if not provided\n let projectPath = options.projectPath\n if (!projectPath) {\n const detected = await findAgentRoot(process.cwd())\n if (!detected) {\n throw new Error(\n 'Could not find ADK agent project. No agent.config.ts found in current directory or parents.\\n' +\n 'Either run from within an agent project directory, or provide projectPath explicitly.'\n )\n }\n projectPath = detected\n }\n\n // Auto-load credentials if not provided\n let credentials = options.credentials\n if (!credentials) {\n const credentialsManager = new CredentialsManager()\n const loadedCredentials = await credentialsManager.getCredentials()\n if (!loadedCredentials) {\n throw new Error('No credentials found. Please run \"adk login\" first, or provide credentials explicitly.')\n }\n credentials = {\n token: loadedCredentials.token,\n apiUrl: loadedCredentials.apiUrl,\n }\n }\n\n const runner = new ScriptRunner({\n projectPath,\n forceRegenerate: options.forceRegenerate,\n prod: options.prod,\n credentials,\n })\n\n return runner.setupTestRuntime({ env: options.env })\n}\n",
|
|
90
|
-
"/**\n * Eval type definitions.\n * Ported from adk-eval-standalone/src/parser/schema.ts with added report types.\n */\n\nimport type { Span } from '@botpress/runtime/internal'\n\n// --- Assertion operators for flexible param matching ---\n\nexport type MatchOperator =\n | string\n | { equals: unknown }\n | { contains: string }\n | { not_contains: string }\n | { matches: string }\n | { in: unknown[] }\n | { exists: boolean }\n | { gte: number }\n | { lte: number }\n\n// --- Response assertions ---\n\nexport type ResponseAssertion =\n | { contains: string }\n | { not_contains: string }\n | { matches: string }\n | { llm_judge: string }\n | { similar_to: string }\n\n// --- Tool assertions ---\n\nexport type ToolAssertion =\n | { called: string; params?: Record<string, MatchOperator> }\n | { not_called: string }\n | { call_order: string[] }\n\n// --- Outcome assertion primitives (shared between turn-level and outcome-level) ---\n\nexport interface StateAssertion {\n path: string\n equals?: unknown\n changed?: boolean\n}\n\nexport type TableAssertion =\n | { table: string; row_exists: Record<string, MatchOperator> }\n | { table: string; row_count: MatchOperator; where?: Record<string, MatchOperator> }\n\nexport interface WorkflowAssertion {\n name: string\n entered?: boolean\n completed?: boolean\n}\n\n// --- Turn assertions ---\n\nexport interface TurnAssertions {\n response?: ResponseAssertion[]\n tools?: ToolAssertion[]\n state?: StateAssertion[]\n tables?: TableAssertion[]\n workflow?: WorkflowAssertion[]\n}\n\n// --- Conversation turn ---\n\nexport interface ConversationTurn {\n user: string\n assert?: TurnAssertions\n}\n\n// --- Outcome assertions (reuses the same assertion types) ---\n\nexport interface OutcomeAssertions {\n state?: StateAssertion[]\n tables?: TableAssertion[]\n workflow?: WorkflowAssertion[]\n}\n\n// --- Full eval definition ---\n\nexport interface EvalDefinition {\n name: string\n description?: string\n tags?: string[]\n type?: 'capability' | 'regression'\n conversation: ConversationTurn[]\n outcome?: OutcomeAssertions\n options?: {\n /** Override the idle timeout for this eval (ms). Cascades: eval > agent config > default (15s). */\n idleTimeout?: number\n }\n}\n\n/**
|
|
91
|
-
"/**\n * Eval file loader.\n * Loads *.eval.ts files from a directory using dynamic imports.\n */\n\nimport { readdirSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport type { EvalDefinition, EvalFilter } from './types'\n\nexport async function loadEvalFile(filePath: string): Promise<EvalDefinition> {\n const absPath = resolve(filePath)\n const mod = await import(absPath)\n const
|
|
92
|
-
"/**\n * Eval runner — orchestrates eval execution.\n */\n\nimport { Client as BpClient } from '@botpress/client'\nimport type {\n EvalDefinition,\n EvalReport,\n EvalRunReport,\n EvalRunnerConfig,\n EvalFilter,\n GraderResult,\n TurnReport,\n BotConnection,\n} from './types'\nimport type { Span } from '@botpress/runtime/internal'\nimport { ChatSession, discoverWebhookId } from './client'\nimport { getTraceData } from './traces'\nimport { gradeResponse } from './graders/response'\nimport { gradeTools } from './graders/tools'\nimport { gradeState } from './graders/state'\nimport { gradeTables } from './graders/tables'\nimport { gradeWorkflows } from './graders/workflow'\nimport { gradeOutcome, snapshotOutcomeState } from './graders/outcome'\nimport { initLLMJudge } from './graders/llm'\nimport { loadEvalsFromDir, filterEvals } from './loader'\nimport { randomUUID } from 'crypto'\n\n/**\n * Run a single eval against a bot.\n */\nconst DEFAULT_IDLE_TIMEOUT = 15_000\n\nexport async function runEval(\n evalDef: EvalDefinition,\n connection: BotConnection,\n options: { devServerUrl?: string; idleTimeout?: number } = {}\n): Promise<EvalReport> {\n const devServerUrl = options.devServerUrl || 'http://localhost:3001'\n const idleTimeout = evalDef.options?.idleTimeout ?? options.idleTimeout ?? DEFAULT_IDLE_TIMEOUT\n const start = Date.now()\n const turns: TurnReport[] = []\n let outcomeAssertions: GraderResult[] = []\n\n try {\n const session = new ChatSession(connection.webhookId)\n await session.connect()\n\n let bpClient: BpClient | null = null\n const getBpClient = () => {\n if (!bpClient) {\n bpClient = new BpClient({\n token: connection.token,\n botId: connection.botId,\n apiUrl: connection.apiUrl,\n })\n }\n return bpClient\n }\n\n // Snapshot pre-conversation state for `changed` assertions\n let preSnapshots = new Map<string, unknown>()\n if (evalDef.outcome?.state) {\n const ctx = {\n botId: connection.botId,\n userId: session.userId,\n conversationId: '',\n }\n preSnapshots = await snapshotOutcomeState(getBpClient(), evalDef, ctx)\n }\n\n let previousToolCallCount = 0\n let lastConversationId = ''\n let allSpans: Span[] = []\n\n for (let i = 0; i < evalDef.conversation.length; i++) {\n const turn = evalDef.conversation[i]!\n const turnStart = Date.now()\n\n const result = await session.sendMessage(turn.user, {\n timeout: Math.max(30_000, idleTimeout * 2),\n idleTimeout,\n })\n const botDuration = Date.now() - turnStart\n\n lastConversationId = result.conversationId\n const botResponse = result.responses.map((r) => r.text).join('\\n')\n\n const evalStart = Date.now()\n let assertions: GraderResult[] = []\n\n // Response assertions\n if (turn.assert?.response) {\n assertions = await gradeResponse(botResponse, turn.assert.response, {\n userMessage: turn.user,\n })\n }\n\n // Tool assertions from traces\n if (turn.assert?.tools) {\n try {\n const expectNewCalls = turn.assert.tools.some((a) => 'called' in a || 'call_order' in a)\n const traceData = await getTraceData(result.conversationId, devServerUrl, {\n previousToolCallCount,\n expectNewCalls,\n })\n previousToolCallCount = traceData.totalToolCallCount\n allSpans = traceData.raw\n const toolResults = gradeTools(traceData.toolCalls, turn.assert.tools)\n assertions = [...assertions, ...toolResults]\n } catch (err) {\n for (const toolAssert of turn.assert.tools) {\n const name =\n 'called' in toolAssert\n ? toolAssert.called\n : 'not_called' in toolAssert\n ? toolAssert.not_called\n : 'call_order'\n assertions.push({\n assertion: `tool: ${name}`,\n pass: false,\n expected: `Tool assertion on ${name}`,\n actual: `Failed to fetch traces: ${(err as Error).message}`,\n })\n }\n }\n }\n\n // Per-turn state assertions\n if (turn.assert?.state) {\n try {\n const ctx = {\n botId: connection.botId,\n userId: session.userId,\n conversationId: result.conversationId,\n }\n const stateResults = await gradeState(getBpClient(), turn.assert.state, ctx, preSnapshots)\n assertions.push(...stateResults)\n } catch (err) {\n assertions.push({\n assertion: 'state',\n pass: false,\n expected: 'State assertions executed',\n actual: `Error: ${(err as Error).message}`,\n })\n }\n }\n\n // Per-turn table assertions\n if (turn.assert?.tables) {\n try {\n const tableResults = await gradeTables(getBpClient(), turn.assert.tables)\n assertions.push(...tableResults)\n } catch (err) {\n assertions.push({\n assertion: 'tables',\n pass: false,\n expected: 'Table assertions executed',\n actual: `Error: ${(err as Error).message}`,\n })\n }\n }\n\n // Per-turn workflow assertions\n if (turn.assert?.workflow) {\n if (allSpans.length === 0) {\n try {\n const traceData = await getTraceData(result.conversationId, devServerUrl)\n allSpans = traceData.raw\n } catch {\n // Traces unavailable\n }\n }\n const workflowResults = gradeWorkflows(allSpans, turn.assert.workflow)\n assertions.push(...workflowResults)\n }\n\n const turnPass = assertions.every((a) => a.pass)\n\n const evalDuration = Date.now() - evalStart\n\n turns.push({\n turnNumber: i + 1,\n userMessage: turn.user,\n botResponse,\n assertions,\n pass: turnPass,\n botDuration,\n evalDuration,\n })\n }\n\n // Outcome assertions (after all turns)\n if (evalDef.outcome) {\n if (allSpans.length === 0 && lastConversationId && evalDef.outcome.workflow) {\n try {\n const traceData = await getTraceData(lastConversationId, devServerUrl)\n allSpans = traceData.raw\n } catch {\n // Traces unavailable\n }\n }\n\n const ctx = {\n botId: connection.botId,\n userId: session.userId,\n conversationId: lastConversationId,\n }\n\n try {\n outcomeAssertions = await gradeOutcome(getBpClient(), evalDef, ctx, allSpans, preSnapshots)\n } catch (err) {\n outcomeAssertions = [\n {\n assertion: 'outcome',\n pass: false,\n expected: 'Outcome assertions executed',\n actual: `Error: ${(err as Error).message}`,\n },\n ]\n }\n }\n\n const turnsPass = turns.every((t) => t.pass)\n const outcomePass = outcomeAssertions.every((a) => a.pass)\n\n return {\n name: evalDef.name,\n description: evalDef.description,\n type: evalDef.type,\n tags: evalDef.tags,\n turns,\n outcomeAssertions,\n pass: turnsPass && outcomePass,\n duration: Date.now() - start,\n }\n } catch (err) {\n return {\n name: evalDef.name,\n description: evalDef.description,\n type: evalDef.type,\n tags: evalDef.tags,\n turns,\n outcomeAssertions,\n pass: false,\n duration: Date.now() - start,\n error: (err as Error).message,\n }\n }\n}\n\n/**\n * Run a suite of evals.\n */\nexport async function runEvalSuite(config: EvalRunnerConfig, filter?: EvalFilter): Promise<EvalRunReport> {\n const start = Date.now()\n const runId = randomUUID().replace(/-/g, '').slice(0, 26)\n\n // Initialize the LLM judge with credentials\n initLLMJudge({\n token: config.credentials.token,\n apiUrl: config.credentials.apiUrl,\n botId: config.credentials.botId,\n })\n\n // Load eval definitions\n const evalsDir = `${config.agentPath}/evals`\n const allEvals = await loadEvalsFromDir(evalsDir)\n const evals = filterEvals(allEvals, filter)\n\n if (evals.length === 0) {\n return {\n id: runId,\n timestamp: new Date().toISOString(),\n evals: [],\n passed: 0,\n failed: 0,\n total: 0,\n duration: 0,\n filter,\n }\n }\n\n // Discover webhookId if not provided\n let webhookId = config.credentials.webhookId\n if (!webhookId) {\n webhookId = await discoverWebhookId(config.credentials.botId, config.credentials.token, config.credentials.apiUrl)\n }\n\n const connection: BotConnection = {\n webhookId,\n botId: config.credentials.botId,\n token: config.credentials.token,\n apiUrl: config.credentials.apiUrl,\n }\n\n const devServerUrl = config.devServerUrl || 'http://localhost:3001'\n const reports: EvalReport[] = []\n\n config.onProgress?.({ type: 'suite_start', totalEvals: evals.length })\n\n for (let i = 0; i < evals.length; i++) {\n const evalDef = evals[i]!\n config.onProgress?.({ type: 'eval_start', evalName: evalDef.name, index: i })\n\n const report = await runEval(evalDef, connection, { devServerUrl, idleTimeout: config.evalOptions?.idleTimeout })\n reports.push(report)\n\n config.onProgress?.({ type: 'eval_complete', evalName: evalDef.name, index: i, report })\n }\n\n const runReport: EvalRunReport = {\n id: runId,\n timestamp: new Date().toISOString(),\n evals: reports,\n passed: reports.filter((r) => r.pass).length,\n failed: reports.filter((r) => !r.pass).length,\n total: reports.length,\n duration: Date.now() - start,\n filter,\n }\n\n config.onProgress?.({ type: 'suite_complete', report: runReport })\n\n return runReport\n}\n",
|
|
93
|
-
"/**\n * Chat client for eval conversations.\n * Drives conversations against a running ADK bot via @botpress/chat.\n */\n\nimport { Client as BpClient } from '@botpress/client'\nimport type { BotResponse, TurnResult } from './types'\nimport { getChatClient } from '../utils/require-chat.js'\n\n/**\n * A chat session that maintains a single client connection across turns.\n */\nexport class ChatSession {\n private client: any = null\n private conversationId: string | null = null\n\n constructor(private webhookId: string) {}\n\n async connect() {\n const ChatClient = getChatClient()\n this.client = await ChatClient.connect({ webhookId: this.webhookId })\n }\n\n get userId(): string {\n if (!this.client) {\n throw new Error('ChatSession not connected. Call connect() first.')\n }\n return
|
|
94
|
-
"/**\n * Trace data extraction for evals.\n * Uses the ADK dev server's HTTP API to fetch traces by conversationId.\n * This approach is used instead of direct TraceReader access because:\n * 1. The eval engine runs in the ADK package, not the CLI\n * 2. The dev server is always running when evals execute\n * 3. HTTP is the established interface for trace queries\n */\n\nimport type { Span } from '@botpress/runtime/internal'\nimport type { ToolCall, TraceData } from './types'\n\n/**\n * Fetch traces for a conversationId from the dev server.\n */\nasync function fetchSpans(conversationId: string, devServerUrl: string): Promise<Span[]> {\n const url = `${devServerUrl}/api/traces/query?attributeName=conversationId&attributeValue=${encodeURIComponent(conversationId)}&count=1000`\n const res = await fetch(url)\n\n if (!res.ok) {\n throw new Error(`Failed to fetch traces: ${res.status} ${res.statusText}`)\n }\n\n const data = await res.json()\n return Array.isArray(data) ? data : (data as any).spans || []\n}\n\n/**\n * Extract tool calls from trace spans.\n * Looks for completed `autonomous.tool` spans that have output + status.\n */\nfunction extractToolCalls(spans: Span[]): ToolCall[] {\n const data = (span: Span): Record<string, unknown> =>\n (span.data && typeof span.data === 'object' ? span.data : {}) as Record<string, unknown>\n\n const toolEndSpans = spans.filter(\n (span) =>\n span.name === 'autonomous.tool' &&\n (span.status === 'ok' || span.status === 'error') &&\n data(span)['autonomous.tool.name']\n )\n\n // Deduplicate by span id\n const seen = new Set<string>()\n const unique = toolEndSpans.filter((span) => {\n if (seen.has(span.id.span)) return false\n seen.add(span.id.span)\n return true\n })\n\n return unique\n .sort((a, b) => (a.timing.endedAt ?? 0) - (b.timing.endedAt ?? 0))\n .map((span) => {\n const d = data(span)\n let input: Record<string, unknown> = {}\n try {\n input = JSON.parse(d['autonomous.tool.input'] as string)\n } catch {}\n\n return {\n name: d['autonomous.tool.name'] as string,\n input,\n output: (d['autonomous.tool.output'] as string) || '',\n status: (d['autonomous.tool.status'] as string) || 'unknown',\n }\n })\n}\n\n/**\n * Fetch and extract structured trace data for a conversation.\n * If previousToolCallCount is provided, only returns tool calls after that index.\n * When expectNewCalls is true, retries fetching until new tool calls appear.\n */\nexport async function getTraceData(\n conversationId: string,\n devServerUrl: string,\n options: { previousToolCallCount?: number; expectNewCalls?: boolean } = {}\n): Promise<TraceData> {\n const previousCount = options.previousToolCallCount || 0\n const expectNew = options.expectNewCalls ?? false\n const maxRetries = expectNew ? 5 : 0\n const retryDelay = 500\n\n let allToolCalls: ToolCall[] = []\n let spans: Span[] = []\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n if (attempt > 0) {\n await new Promise((resolve) => setTimeout(resolve, retryDelay))\n }\n spans = await fetchSpans(conversationId, devServerUrl)\n allToolCalls = extractToolCalls(spans)\n if (!expectNew || allToolCalls.length > previousCount) {\n break\n }\n }\n\n const toolCalls = allToolCalls.slice(previousCount)\n return { toolCalls, totalToolCallCount: allToolCalls.length, raw: spans }\n}\n",
|
|
95
|
-
"/**\n * LLM judge grader using @botpress/cognitive.\n * Replaces the OpenAI-based implementation from the standalone project.\n */\n\nimport { Cognitive } from '@botpress/
|
|
96
|
-
"/**\n * Response assertion graders.\n * Checks bot response text against expected assertions.\n */\n\nimport type { ResponseAssertion, GraderResult } from '../types'\nimport { gradeLLMJudge } from './llm'\n\nexport async function gradeResponse(\n botResponse: string,\n assertions: ResponseAssertion[],\n context: { userMessage: string }\n): Promise<GraderResult[]> {\n const results: GraderResult[] = []\n\n for (const assertion of assertions) {\n if ('contains' in assertion) {\n const pass = botResponse.toLowerCase().includes(assertion.contains.toLowerCase())\n results.push({\n assertion: `contains \"${assertion.contains}\"`,\n pass,\n expected: `Response contains \"${assertion.contains}\"`,\n actual: pass ? `Found in response` : `Not found in response`,\n })\n continue\n }\n\n if ('not_contains' in assertion) {\n const pass = !botResponse.toLowerCase().includes(assertion.not_contains.toLowerCase())\n results.push({\n assertion: `not_contains \"${assertion.not_contains}\"`,\n pass,\n expected: `Response does not contain \"${assertion.not_contains}\"`,\n actual: pass ? `Not found in response` : `Found in response`,\n })\n continue\n }\n\n if ('matches' in assertion) {\n const regex = new RegExp(assertion.matches, 'i')\n const pass = regex.test(botResponse)\n results.push({\n assertion: `matches ${assertion.matches}`,\n pass,\n expected: `Response matches /${assertion.matches}/`,\n actual: pass ? `Matched` : `No match`,\n })\n continue\n }\n\n if ('llm_judge' in assertion) {\n const result = await gradeLLMJudge(botResponse, assertion.llm_judge, context)\n results.push(result)\n continue\n }\n\n if ('similar_to' in assertion) {\n results.push({\n assertion: `similar_to: \"${assertion.similar_to}\"`,\n pass: true,\n expected: assertion.similar_to,\n actual: 'SKIPPED — similar_to not yet implemented',\n })\n continue\n }\n\n results.push({\n assertion: 'unknown',\n pass: false,\n expected: 'known assertion type',\n actual: `Unknown assertion: ${JSON.stringify(assertion)}`,\n })\n }\n\n return results\n}\n",
|
|
84
|
+
"import { watch, readdirSync, statSync } from 'fs'\nimport { EventEmitter } from 'events'\nimport { join, relative } from 'path'\nimport { existsSync } from 'fs'\n\nexport type WatchChangeType = 'added' | 'modified' | 'deleted'\n\nexport interface FileChange {\n path: string\n type: WatchChangeType\n}\n\nexport interface FileChangeEvent {\n changes: FileChange[]\n timestamp: number\n}\n\nexport interface FileWatcherOptions {\n projectPath: string\n debounceMs?: number\n}\n\n/**\n * File watcher for ADK agent projects\n *\n * Watches the following patterns:\n * - src/**\\/*\n * - agent.config.ts\n * - package.json\n * - agent.json\n */\nexport class FileWatcher extends EventEmitter {\n private projectPath: string\n private watchers: Map<string, ReturnType<typeof watch>> = new Map()\n private fileStates: Map<string, number> = new Map()\n private debounceMs: number\n private debounceTimer: NodeJS.Timeout | null = null\n private pendingChanges: Map<string, FileChange> = new Map()\n\n constructor(options: FileWatcherOptions) {\n super()\n this.projectPath = options.projectPath\n this.debounceMs = options.debounceMs ?? 100\n }\n\n /**\n * Start watching files\n */\n start(): void {\n // Watch individual files at project root\n const rootFiles = ['package.json', 'agent.json', 'agent.config.ts']\n\n for (const file of rootFiles) {\n const filePath = join(this.projectPath, file)\n if (existsSync(filePath)) {\n this.watchFile(filePath)\n }\n }\n\n // Watch src directory recursively\n const srcPath = join(this.projectPath, 'src')\n if (existsSync(srcPath)) {\n // Initialize state for all existing files BEFORE setting up watchers\n this.initializeDirectoryState(srcPath)\n // Now set up the watcher\n this.watchDirectory(srcPath)\n }\n }\n\n /**\n * Initialize state for all files in a directory (recursive)\n */\n private initializeDirectoryState(dirPath: string): void {\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name)\n if (entry.isDirectory()) {\n this.initializeDirectoryState(fullPath)\n } else if (entry.isFile()) {\n this.updateFileState(fullPath)\n }\n }\n } catch {\n // Ignore errors during initialization\n }\n }\n\n /**\n * Watch a single file\n */\n private watchFile(filePath: string): void {\n if (this.watchers.has(filePath)) {\n return\n }\n\n try {\n // Initialize file state BEFORE setting up watcher to avoid triggering events\n this.updateFileState(filePath)\n\n const watcher = watch(filePath, { persistent: true }, () => {\n this.handleFileChange(filePath)\n })\n\n this.watchers.set(filePath, watcher)\n } catch (error) {\n console.warn(`Failed to watch file ${filePath}:`, error)\n }\n }\n\n /**\n * Watch a directory recursively\n */\n private watchDirectory(dirPath: string): void {\n if (this.watchers.has(dirPath)) {\n return\n }\n\n try {\n const watcher = watch(dirPath, { recursive: true, persistent: true }, (_eventType, filename) => {\n if (filename) {\n const fullPath = join(dirPath, filename)\n this.handleFileChange(fullPath)\n }\n })\n\n this.watchers.set(dirPath, watcher)\n } catch (error) {\n console.warn(`Failed to watch directory ${dirPath}:`, error)\n }\n }\n\n /**\n * Handle file change events - accumulates changes for batch emission\n */\n private handleFileChange(filePath: string): void {\n // On Linux, fs.watch may report directory changes instead of individual files.\n // When a directory change is detected, scan it for new/deleted files.\n try {\n if (existsSync(filePath) && statSync(filePath).isDirectory()) {\n this.scanDirectoryForChanges(filePath)\n return\n }\n } catch {\n // statSync may fail if file was deleted between checks\n }\n\n const fileExists = existsSync(filePath)\n const previousState = this.fileStates.get(filePath)\n\n let changeType: WatchChangeType\n\n if (!fileExists && previousState !== undefined) {\n // File was deleted\n changeType = 'deleted'\n this.fileStates.delete(filePath)\n } else if (fileExists && previousState === undefined) {\n // File was added\n changeType = 'added'\n this.updateFileState(filePath)\n } else if (fileExists) {\n // File was modified\n changeType = 'modified'\n this.updateFileState(filePath)\n } else {\n // Unknown state, skip\n return\n }\n\n const relativePath = relative(this.projectPath, filePath)\n\n // Add to pending changes (overwrites previous change for same file)\n this.pendingChanges.set(relativePath, {\n path: relativePath,\n type: changeType,\n })\n\n this.scheduleDebouncedEmit()\n }\n\n /**\n * Emit all pending changes as a single event\n */\n private emitPendingChanges(): void {\n if (this.pendingChanges.size === 0) {\n return\n }\n\n const changes = Array.from(this.pendingChanges.values())\n this.pendingChanges.clear()\n\n const event: FileChangeEvent = {\n changes,\n timestamp: Date.now(),\n }\n\n this.emit('change', event)\n }\n\n /**\n * Scan a directory for new or deleted files compared to tracked state.\n * Needed on Linux where fs.watch reports directory-level events.\n */\n private scanDirectoryForChanges(dirPath: string): void {\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true })\n const currentFiles = new Set<string>()\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name)\n if (entry.isFile()) {\n currentFiles.add(fullPath)\n if (!this.fileStates.has(fullPath)) {\n // New file detected\n this.updateFileState(fullPath)\n const relativePath = relative(this.projectPath, fullPath)\n this.pendingChanges.set(relativePath, { path: relativePath, type: 'added' })\n this.scheduleDebouncedEmit()\n }\n } else if (entry.isDirectory()) {\n this.scanDirectoryForChanges(fullPath)\n }\n }\n\n // Check for deleted files in this directory\n for (const [trackedPath] of this.fileStates) {\n if (trackedPath.startsWith(dirPath) && !trackedPath.includes('/', dirPath.length + 1)) {\n if (!currentFiles.has(trackedPath)) {\n this.fileStates.delete(trackedPath)\n const relativePath = relative(this.projectPath, trackedPath)\n this.pendingChanges.set(relativePath, { path: relativePath, type: 'deleted' })\n this.scheduleDebouncedEmit()\n }\n }\n }\n } catch {\n // Directory may have been deleted\n }\n }\n\n /**\n * Schedule a debounced emission of pending changes\n */\n private scheduleDebouncedEmit(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer)\n }\n this.debounceTimer = setTimeout(() => {\n this.emitPendingChanges()\n }, this.debounceMs)\n }\n\n /**\n * Update internal file state tracking\n */\n private updateFileState(filePath: string): void {\n if (existsSync(filePath)) {\n this.fileStates.set(filePath, Date.now())\n }\n }\n\n /**\n * Stop watching all files\n */\n stop(): void {\n // Clear debounce timer\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer)\n this.debounceTimer = null\n }\n\n // Close all watchers\n for (const watcher of this.watchers.values()) {\n watcher.close()\n }\n this.watchers.clear()\n this.fileStates.clear()\n this.pendingChanges.clear()\n }\n\n /**\n * Type-safe event listener\n */\n on(event: 'change', listener: (event: FileChangeEvent) => void): this {\n return super.on(event, listener)\n }\n\n /**\n * Type-safe event emitter\n */\n emit(event: 'change', data: FileChangeEvent): boolean {\n return super.emit(event, data)\n }\n}\n",
|
|
85
|
+
"import { Client, type Bot } from '@botpress/client'\nimport { AgentProject } from '../agent-project/agent-project.js'\nimport { auth } from '../auth/index.js'\nimport { IntegrationChecker, type IntegrationCheckResult } from '../integrations/checker.js'\nimport { IntegrationSyncManager } from '../integrations/sync-manager.js'\nimport { generateBotProject } from '../bot-generator/generator.js'\nimport path from 'path'\nimport type {\n PreflightCheckResult,\n IntegrationDiff,\n ConfigFieldDiff,\n AgentConfigDiff,\n IntegrationConfiguration,\n ConfigurationSchema,\n SyncCallbacks,\n} from './types.js'\nimport { hasIntegrationChanges, pluralize } from './types.js'\nimport { AgentConfigSyncManager } from './agent-config-sync.js'\nimport { PreflightFormatter } from './formatter.js'\n\nexport interface PendingPreflightResult {\n result: PreflightCheckResult\n apply: (callbacks?: SyncCallbacks) => Promise<void>\n}\n\nexport class PreflightChecker {\n private projectPath: string\n private client?: Client\n private project?: AgentProject\n\n constructor(projectPath: string) {\n this.projectPath = projectPath\n }\n\n private async getProject(): Promise<AgentProject> {\n if (!this.project) {\n this.project = await AgentProject.load(this.projectPath)\n }\n return this.project\n }\n\n private async getClient(): Promise<Client> {\n if (!this.client) {\n const credentials = await auth.getActiveCredentials()\n const project = await this.getProject()\n\n const workspaceId = project.agentInfo?.workspaceId || credentials.workspaceId\n\n if (!workspaceId) {\n throw new Error('No workspace ID found. Please login with \"adk login\"')\n }\n\n this.client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n workspaceId,\n headers: {\n 'x-multiple-integrations': 'true',\n },\n })\n }\n return this.client\n }\n\n private async performCheck(botId: string): Promise<{\n result: PreflightCheckResult\n integrationResults: IntegrationCheckResult[]\n }> {\n const client = await this.getClient()\n const project = await this.getProject()\n\n const { bot } = await client.getBot({ id: botId })\n const integrationChecker = new IntegrationChecker(this.projectPath)\n const integrationResults = await integrationChecker.checkIntegrations(botId)\n\n const integrationDiffs = this.buildIntegrationDiffs(integrationResults)\n const agentConfigDiffs = this.buildAgentConfigDiffs(project, bot)\n const hasChanges = hasIntegrationChanges(integrationDiffs) || agentConfigDiffs.length > 0\n\n return {\n result: {\n integrations: integrationDiffs,\n agentConfig: agentConfigDiffs,\n hasChanges,\n },\n integrationResults,\n }\n }\n\n private buildIntegrationDiffs(results: IntegrationCheckResult[]): {\n toInstall: IntegrationDiff[]\n toRemove: IntegrationDiff[]\n toUpdate: IntegrationDiff[]\n } {\n const toInstall: IntegrationDiff[] = []\n const toRemove: IntegrationDiff[] = []\n const toUpdate: IntegrationDiff[] = []\n\n for (const result of results) {\n if (result.needsInstall) {\n toInstall.push({\n alias: result.alias,\n name: result.name,\n version: result.desiredVersion,\n action: 'install',\n })\n } else if (result.needsRemoval) {\n toRemove.push({\n alias: result.alias,\n name: result.name,\n version: result.installedVersion || result.desiredVersion,\n action: 'remove',\n })\n } else if (result.needsUpdate || result.needsConfiguration) {\n const configChanges = this.buildConfigDiff(\n result.currentConfiguration || {},\n result.desiredConfiguration || {},\n result.definition.configuration?.schema?.properties || {}\n )\n\n toUpdate.push({\n alias: result.alias,\n name: result.name,\n version: result.desiredVersion,\n action: 'update',\n configChanges: configChanges.length > 0 ? configChanges : undefined,\n })\n }\n }\n\n return { toInstall, toRemove, toUpdate }\n }\n\n private buildConfigDiff(\n current: IntegrationConfiguration,\n desired: IntegrationConfiguration,\n schema: ConfigurationSchema\n ): ConfigFieldDiff[] {\n const diffs: ConfigFieldDiff[] = []\n const currentObj = current ?? {}\n const desiredObj = desired ?? {}\n const allKeys = new Set([...Object.keys(currentObj), ...Object.keys(desiredObj)])\n\n for (const key of allKeys) {\n const schemaDefault = schema.properties?.[key]?.default\n const currentValue = currentObj[key] ?? schemaDefault\n const desiredValue = desiredObj[key] ?? schemaDefault\n\n if (JSON.stringify(currentValue) !== JSON.stringify(desiredValue)) {\n const type = currentValue === undefined ? 'added' : desiredValue === undefined ? 'removed' : 'changed'\n\n diffs.push({\n field: key,\n oldValue: currentValue,\n newValue: desiredValue,\n type,\n })\n }\n }\n\n return diffs\n }\n\n private buildAgentConfigDiffs(project: AgentProject, bot: Bot): AgentConfigDiff[] {\n if (project.config?.name !== undefined && project.config.name !== bot.name) {\n return [\n {\n field: 'name',\n oldValue: bot.name,\n newValue: project.config.name,\n },\n ]\n }\n return []\n }\n\n async checkWithPendingApply(botId: string): Promise<PendingPreflightResult> {\n const { result, integrationResults } = await this.performCheck(botId)\n return {\n result,\n apply: (callbacks) => this.apply(botId, result, integrationResults, callbacks),\n }\n }\n\n async checkAndApply(\n botId: string,\n options: {\n shouldApply?: (result: PreflightCheckResult, formatted: string) => Promise<boolean>\n callbacks?: SyncCallbacks\n } = {}\n ): Promise<{ result: PreflightCheckResult; applied: boolean }> {\n const { result, integrationResults } = await this.performCheck(botId)\n\n if (!result.hasChanges) {\n return { result, applied: false }\n }\n\n if (options.shouldApply) {\n const formatted = PreflightFormatter.format(result)\n const approved = await options.shouldApply(result, formatted)\n if (!approved) {\n return { result, applied: false }\n }\n }\n\n await this.apply(botId, result, integrationResults, options.callbacks)\n return { result, applied: true }\n }\n\n private async apply(\n botId: string,\n result: PreflightCheckResult,\n integrationResults: IntegrationCheckResult[],\n options?: SyncCallbacks\n ): Promise<void> {\n const client = await this.getClient()\n\n if (hasIntegrationChanges(result.integrations)) {\n options?.onProgress?.('Syncing integrations to bot...')\n const integrationSyncer = new IntegrationSyncManager(this.projectPath)\n const syncResult = await integrationSyncer.applySyncPlan(integrationResults, botId)\n\n if (syncResult.installed > 0) {\n options?.onSuccess?.(`Installed ${pluralize(syncResult.installed, 'integration')}`)\n }\n if (syncResult.updated > 0) {\n options?.onSuccess?.(`Updated ${pluralize(syncResult.updated, 'integration')}`)\n }\n if (syncResult.removed > 0) {\n options?.onSuccess?.(`Removed ${pluralize(syncResult.removed, 'integration')}`)\n }\n if (syncResult.failed > 0) {\n options?.onError?.(`Failed to sync ${pluralize(syncResult.failed, 'integration')}`)\n for (const { alias, error } of syncResult.errors) {\n options?.onError?.(` ${alias}: ${error}`)\n }\n }\n }\n\n if (result.agentConfig.length > 0) {\n const configSyncer = new AgentConfigSyncManager(client)\n await configSyncer.syncFromChanges(botId, result.agentConfig, options)\n }\n\n options?.onProgress?.('Regenerating bot project...')\n await generateBotProject({\n projectPath: this.projectPath,\n outputPath: path.join(this.projectPath, '.adk', 'bot'),\n callbacks: options,\n })\n options?.onSuccess?.('Bot project regenerated')\n }\n}\n",
|
|
86
|
+
"export type IntegrationConfiguration = Record<string, unknown> | undefined\n\nexport type ConfigurationSchema = {\n properties?: Record<\n string,\n {\n default?: unknown\n type?: string\n [key: string]: unknown\n }\n >\n [key: string]: unknown\n}\n\nexport interface IntegrationDiff {\n alias: string\n name: string\n version: string\n action: 'install' | 'remove' | 'update'\n configChanges?: ConfigFieldDiff[]\n}\n\nexport interface ConfigFieldDiff {\n field: string\n oldValue: unknown\n newValue: unknown\n type: 'added' | 'removed' | 'changed'\n}\n\nexport interface AgentConfigDiff {\n field: string\n oldValue: unknown\n newValue: unknown\n}\n\nexport interface PreflightCheckResult {\n integrations: {\n toInstall: IntegrationDiff[]\n toRemove: IntegrationDiff[]\n toUpdate: IntegrationDiff[]\n }\n agentConfig: AgentConfigDiff[]\n hasChanges: boolean\n}\n\nexport interface SyncCallbacks {\n onProgress?: (message: string) => void\n onSuccess?: (message: string) => void\n onError?: (message: string) => void\n}\n\nexport function hasIntegrationChanges(integrations: {\n toInstall: IntegrationDiff[]\n toRemove: IntegrationDiff[]\n toUpdate: IntegrationDiff[]\n}): boolean {\n return integrations.toInstall.length > 0 || integrations.toRemove.length > 0 || integrations.toUpdate.length > 0\n}\n\nexport function pluralize(count: number, word: string): string {\n return `${count} ${word}${count > 1 ? 's' : ''}`\n}\n",
|
|
87
|
+
"import { Client, ClientInputs } from '@botpress/client'\nimport type { AgentConfigDiff, SyncCallbacks } from './types.js'\nimport type { AgentConfig } from '../agent-project/types.js'\n\nexport type Bot = Omit<ClientInputs['updateBot'], 'id'>\n\nexport interface AgentConfigSyncOptions extends SyncCallbacks {}\n\nexport class AgentConfigSyncManager {\n private client: Client\n\n constructor(client: Client) {\n this.client = client\n }\n\n private async performSync(botId: string, updates: Partial<Bot>, options?: AgentConfigSyncOptions): Promise<boolean> {\n if (Object.keys(updates).length === 0) {\n return false\n }\n\n try {\n options?.onProgress?.('Updating bot configuration...')\n await this.client.updateBot({ id: botId, ...updates })\n options?.onSuccess?.('Bot configuration updated')\n return true\n } catch (error: unknown) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n options?.onError?.(`Failed to sync agent config: ${errorMsg}`)\n throw error\n }\n }\n\n // Sync agent config from project config object (used by adk-deploy)\n async syncFromConfig(\n botId: string,\n config: Partial<AgentConfig>,\n options?: AgentConfigSyncOptions\n ): Promise<boolean> {\n const updates: Partial<Bot> = {}\n\n if (config.name !== undefined) {\n updates.name = config.name\n }\n\n return this.performSync(botId, updates, options)\n }\n\n // Sync agent config from preflight changes (used by adk-dev)\n async syncFromChanges(\n botId: string,\n configChanges: AgentConfigDiff[],\n options?: AgentConfigSyncOptions\n ): Promise<boolean> {\n if (!configChanges || configChanges.length === 0) {\n return false\n }\n\n const updates: Partial<Bot> = {}\n\n for (const change of configChanges) {\n switch (change.field) {\n case 'name':\n updates.name = change.newValue as string\n break\n default:\n options?.onProgress?.(`Warning: Unknown config field '${change.field}' - skipping sync`)\n }\n }\n\n return this.performSync(botId, updates, options)\n }\n}\n",
|
|
88
|
+
"import { readFileSync } from 'fs'\nimport { join } from 'path'\nimport type { PreflightCheckResult } from './types.js'\nimport { hasIntegrationChanges, pluralize } from './types.js'\n\nconst getAdkVersion = (): string => {\n try {\n const packageJson = require('@botpress/adk/package.json')\n return packageJson.version\n } catch {\n try {\n const adkPackagePath = join(process.cwd(), 'node_modules/@botpress/adk/package.json')\n const pkg = JSON.parse(readFileSync(adkPackagePath, 'utf-8'))\n return pkg.version\n } catch {\n return 'unknown'\n }\n }\n}\n\n/**\n * Plain text formatter for preflight check results\n * CLI-agnostic - the CLI should apply colors/styling\n */\nexport class PreflightFormatter {\n static format(result: PreflightCheckResult): string {\n const sections: string[] = []\n\n sections.push('')\n sections.push(' ▄▀█ █▀▄ █▄▀ Botpress ADK')\n sections.push(` █▀█ █▄▀ █░█ v${getAdkVersion()}`)\n sections.push('')\n sections.push('Running preflight checks...')\n sections.push('')\n\n const allIntegrations = [\n ...result.integrations.toRemove,\n ...result.integrations.toInstall,\n ...result.integrations.toUpdate,\n ]\n const maxWidth = Math.max(...allIntegrations.map((i) => `${i.alias} (v${i.version})`.length), 30)\n\n if (hasIntegrationChanges(result.integrations)) {\n sections.push('Integrations:\\n')\n\n if (result.integrations.toRemove.length > 0) {\n sections.push('Installed Remotely but NOT in agent.config.ts')\n sections.push('(these will be DISABLED or REMOVED)\\n')\n\n for (const integration of result.integrations.toRemove) {\n const name = `${integration.alias} (v${integration.version})`\n const padding = ' '.repeat(maxWidth - name.length + 4)\n sections.push(` — ${name}${padding}✗ Not present locally`)\n sections.push(` Action: Remove\\n`)\n }\n }\n\n if (result.integrations.toInstall.length > 0) {\n sections.push('Present Locally but NOT Installed Remotely')\n sections.push('(these will be INSTALLED)\\n')\n\n for (const integration of result.integrations.toInstall) {\n const name = `${integration.alias} (v${integration.version})`\n const padding = ' '.repeat(maxWidth - name.length + 4)\n sections.push(` — ${name}${padding}+ Missing remotely`)\n sections.push(` Action: Install\\n`)\n }\n }\n\n if (result.integrations.toUpdate.length > 0) {\n sections.push('Present on both, but config DIFFERS')\n sections.push('(these will be UPDATED)\\n')\n\n for (const integration of result.integrations.toUpdate) {\n sections.push(` — ${integration.alias} (v${integration.version})`)\n\n if (integration.configChanges && integration.configChanges.length > 0) {\n sections.push(' Configuration differences:\\n')\n\n for (const change of integration.configChanges) {\n sections.push(` ${change.field}:`)\n sections.push(` - Remote: ${this.formatValue(change.oldValue)}`)\n sections.push(` + Local: ${this.formatValue(change.newValue)}\\n`)\n }\n }\n }\n }\n }\n\n if (result.agentConfig.length > 0) {\n sections.push('Agent Configuration Differences')\n sections.push('(These are top-level agent settings, not integration settings)\\n')\n\n for (const diff of result.agentConfig) {\n sections.push(` agent.${diff.field}:`)\n sections.push(` - Remote: ${this.formatValue(diff.oldValue)}`)\n sections.push(` + Local: ${this.formatValue(diff.newValue)}\\n`)\n }\n }\n\n sections.push('Summary of Actions\\n')\n const install = result.integrations.toInstall.length\n const remove = result.integrations.toRemove.length\n const update = result.integrations.toUpdate.length\n const agentConfig = result.agentConfig.length\n\n if (install > 0) {\n sections.push(` • Install: ${pluralize(install, 'integration')}`)\n }\n if (remove > 0) {\n sections.push(` • Remove: ${pluralize(remove, 'integration')}`)\n }\n if (update > 0) {\n sections.push(` • Update: ${pluralize(update, 'integration')}`)\n }\n if (agentConfig > 0) {\n sections.push(` • Agent config: ${pluralize(agentConfig, 'change')}`)\n }\n\n sections.push('')\n\n return sections.join('\\n')\n }\n\n static formatPrompt(): string {\n return '❓ Apply these changes before continuing?\\nProceed? [y/N] '\n }\n\n private static formatValue(value: unknown): string {\n if (value === undefined || value === null) {\n return '(not set)'\n }\n if (typeof value === 'string') {\n return `\"${value}\"`\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false'\n }\n if (Array.isArray(value)) {\n return `[${value.map((v) => this.formatValue(v)).join(', ')}]`\n }\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n return String(value)\n }\n}\n",
|
|
89
|
+
"import dedent from 'dedent'\nimport { existsSync } from 'fs'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport { spawn } from 'child_process'\nimport { AgentProject } from '../agent-project/index.js'\nimport { generateBotProject } from '../bot-generator/index.js'\nimport { generateAssetsTypes, generateAssetsRuntime } from '../generators/assets.js'\nimport { formatCode } from '../generators/utils.js'\nimport { BpBuildCommand } from '../commands/bp-build-command.js'\nimport { ConfigManager } from '../config/manager.js'\nimport { CredentialsManager } from '../auth/credentials.js'\n\n/**\n * Find the agent project root by walking up from startPath looking for agent.config.ts\n */\nasync function findAgentRoot(startPath: string): Promise<string | null> {\n let currentPath = path.resolve(startPath)\n const root = path.parse(currentPath).root\n\n while (currentPath !== root) {\n try {\n await fs.access(path.join(currentPath, 'agent.config.ts'))\n return currentPath\n } catch {\n currentPath = path.dirname(currentPath)\n }\n }\n\n return null\n}\n\nexport interface ScriptRunnerCredentials {\n /** Authentication token */\n token: string\n /** API URL */\n apiUrl: string\n}\n\nexport interface ScriptRunnerOptions {\n /** Path to the agent project root */\n projectPath: string\n /** Credentials for API access */\n credentials: ScriptRunnerCredentials\n /** Whether to regenerate the bot project even if it exists */\n forceRegenerate?: boolean\n /** Use production bot ID instead of dev bot ID (default: false, uses devId) */\n prod?: boolean\n}\n\nexport interface RunScriptOptions extends ScriptRunnerOptions {\n /** Path to the script file to run (relative to project or absolute) */\n scriptPath: string\n /** Additional arguments to pass to the script */\n args?: string[]\n /** Environment variables to set */\n env?: Record<string, string>\n /** Whether to inherit stdio */\n inheritStdio?: boolean\n}\n\nexport interface RunOptions {\n /** Additional arguments to pass to the script */\n args?: string[]\n /** Environment variables to set */\n env?: Record<string, string>\n /** Whether to inherit stdio */\n inheritStdio?: boolean\n}\n\nexport interface TestRuntimeResult {\n /** Path to the bot project */\n botPath: string\n /** Path to the adk-runtime module that can be imported */\n runtimePath: string\n /** Bot ID being used */\n botId: string\n /** Workspace ID */\n workspaceId: string\n /** Whether using production bot */\n isProd: boolean\n /** The prepared project instance */\n project: AgentProject\n /**\n * Import and initialize the ADK runtime in the current process.\n * Call this once before running tests that need the runtime.\n * Returns the bot instance.\n */\n initialize: () => Promise<unknown>\n}\n\nexport class ScriptRunner {\n private projectPath: string\n private forceRegenerate: boolean\n private prod: boolean\n private credentials: ScriptRunnerCredentials\n\n constructor(options: ScriptRunnerOptions) {\n this.projectPath = path.resolve(options.projectPath)\n this.forceRegenerate = options.forceRegenerate ?? false\n this.prod = options.prod ?? false\n this.credentials = options.credentials\n }\n\n /**\n * Ensure the bot project is generated and ready for script execution\n */\n async prepare(): Promise<{ botPath: string; runnerPath: string; project: AgentProject }> {\n const project = await AgentProject.load(this.projectPath, {\n adkCommand: 'adk-build',\n })\n\n const botPath = path.join(this.projectPath, '.adk', 'bot')\n const runnerPath = path.join(botPath, 'src', 'script-runner.ts')\n const botpressTypesPath = path.join(botPath, '.botpress', 'implementation', 'index.ts')\n\n // Check if we need to regenerate\n const needsRegenerate = this.forceRegenerate || !existsSync(runnerPath) || !existsSync(botpressTypesPath)\n\n if (needsRegenerate) {\n // Generate assets types first\n try {\n await generateAssetsTypes(project.path)\n await generateAssetsRuntime(project.path, project.agentInfo?.botId, project.agentInfo?.workspaceId)\n } catch {\n // Assets directory might not exist\n }\n\n // Generate the bot project\n await generateBotProject({\n projectPath: project.path,\n outputPath: botPath,\n })\n\n // Generate the script runner entry point\n await this.generateScriptRunner(botPath)\n\n // Run bp build to generate .botpress types\n await this.runBpBuild(botPath)\n }\n\n return { botPath, runnerPath, project }\n }\n\n /**\n * Run bp build to generate .botpress types needed for the script runner\n */\n private async runBpBuild(botPath: string): Promise<void> {\n const buildCommand = new BpBuildCommand({ botPath })\n\n return new Promise((resolve, reject) => {\n buildCommand.on('done', () => resolve())\n buildCommand.on('error', (err) => reject(new Error(err.message)))\n buildCommand.run()\n })\n }\n\n /**\n * Generate the script runner entry point that bootstraps the ADK runtime\n */\n private async generateScriptRunner(botPath: string): Promise<void> {\n const content = dedent`\n /**\n * ADK Script Runner Entry Point\n *\n * This file bootstraps the ADK runtime and then executes a user script.\n * It's auto-generated by the ADK CLI.\n */\n import * as bp from '.botpress'\n import { setupAdkRuntime } from './adk-runtime'\n import { context, agentRegistry } from '@botpress/runtime/runtime'\n import { Autonomous } from '@botpress/runtime'\n import { Client } from '@botpress/client'\n import { BotSpecificClient, BotLogger } from '@botpress/sdk'\n import { Cognitive } from '@botpress/cognitive'\n\n // Create a minimal bot instance for runtime initialization\n const bot = new bp.Bot({\n actions: {}\n })\n\n // Initialize the ADK runtime\n setupAdkRuntime(bot)\n\n // Set up default context for script execution (outside of request handlers)\n const botId = process.env.ADK_BOT_ID!\n const token = process.env.ADK_TOKEN!\n const apiUrl = process.env.ADK_API_URL || 'https://api.botpress.cloud'\n const configuration = process.env.ADK_CONFIGURATION ? JSON.parse(process.env.ADK_CONFIGURATION) : {}\n\n const vanillaClient = new Client({ token, apiUrl, botId })\n const client = new BotSpecificClient(vanillaClient as any)\n const cognitive = new Cognitive({ client: client as any, __experimental_beta: true })\n const logger = new BotLogger({})\n\n context.setDefaultContext({\n executionId: 'script-execution',\n executionFinished: false,\n botId,\n client: client as any,\n cognitive: cognitive as any,\n citations: new Autonomous.CitationsManager(),\n logger: logger as any,\n configuration,\n integrations: agentRegistry.integrations,\n interfaces: agentRegistry.interfaces,\n states: [],\n tags: [],\n scheduledHeavyImports: new Set<string>(),\n })\n\n // Export runtime utilities for scripts to use\n export { bot }\n\n // Get the script path from command line arguments\n const scriptPath = process.argv[2]\n\n if (!scriptPath) {\n console.error('Error: No script path provided')\n console.error('Usage: bun run script-runner.ts <script-path> [args...]')\n process.exit(1)\n }\n\n // Import and run the user script\n async function runScript() {\n try {\n // Dynamic import of the user script\n const scriptModule = await import(scriptPath)\n\n // If the script exports a default function, call it\n if (typeof scriptModule.default === 'function') {\n const args = process.argv.slice(3)\n await scriptModule.default(...args)\n }\n // If it exports a 'run' function, call it\n else if (typeof scriptModule.run === 'function') {\n const args = process.argv.slice(3)\n await scriptModule.run(...args)\n }\n // If it exports a 'main' function, call it\n else if (typeof scriptModule.main === 'function') {\n const args = process.argv.slice(3)\n await scriptModule.main(...args)\n }\n // Otherwise, the script should have run on import (top-level code)\n } catch (error) {\n console.error('Script execution failed:', error)\n process.exit(1)\n }\n }\n\n runScript()\n `\n\n await fs.writeFile(path.join(botPath, 'src', 'script-runner.ts'), await formatCode(content), 'utf-8')\n }\n\n /**\n * Setup the ADK runtime for use in tests (bun test)\n *\n * Unlike `run()`, this doesn't spawn a child process. Instead, it:\n * 1. Prepares the bot project (generates types, etc.)\n * 2. Sets up environment variables in the current process\n * 3. Returns paths and an initialize() function to import the runtime\n *\n * Usage in tests:\n * ```typescript\n * import { ScriptRunner } from '@botpress/adk'\n *\n * const runner = new ScriptRunner({ projectPath: '.', credentials: {...} })\n * const runtime = await runner.setupTestRuntime()\n * await runtime.initialize()\n *\n * // Now you can import and use your actions, tools, etc.\n * ```\n */\n async setupTestRuntime(options: { env?: Record<string, string> } = {}): Promise<TestRuntimeResult> {\n const { botPath, project } = await this.prepare()\n\n // Determine which bot ID to use\n const botId = this.prod ? project.agentInfo?.botId : project.agentInfo?.devId || project.agentInfo?.botId\n const workspaceId = project.agentInfo?.workspaceId || ''\n\n if (!botId) {\n const idType = this.prod ? 'botId' : 'devId'\n throw new Error(\n `No ${idType} found in agent.json. ` +\n (this.prod\n ? 'Please deploy your agent first with \"adk deploy\".'\n : 'Please run \"adk dev\" first to create a development bot, or use --prod to use the production bot.')\n )\n }\n\n // Fetch configuration if bot ID is available\n let configuration: Record<string, unknown> | undefined\n try {\n const manager = new ConfigManager(botId)\n configuration = await manager.getAll()\n } catch {\n // Configuration fetch failed - will only be available during request handling\n }\n\n // Set environment variables in the current process\n const envVars: Record<string, string> = {\n ADK_PROJECT_PATH: this.projectPath,\n ADK_BOT_PATH: botPath,\n ADK_BOT_ID: botId,\n ADK_WORKSPACE_ID: workspaceId,\n ADK_IS_PROD: this.prod ? 'true' : 'false',\n BP_DISABLE_WORKER_MODE: 'true',\n ADK_SCRIPT_MODE: 'true',\n ADK_TOKEN: this.credentials.token,\n ADK_API_URL: this.credentials.apiUrl,\n ...(configuration && { ADK_CONFIGURATION: JSON.stringify(configuration) }),\n ...options.env,\n }\n\n // Apply environment variables to current process\n for (const [key, value] of Object.entries(envVars)) {\n process.env[key] = value\n }\n\n const runtimePath = path.join(botPath, 'src', 'index.ts')\n\n return {\n botPath,\n runtimePath,\n botId,\n workspaceId,\n isProd: this.prod,\n project,\n initialize: async () => {\n // Dynamic import of the generated bot index which sets up the runtime\n const botModule = await import(runtimePath)\n\n // After the runtime is initialized, we need to set up a default context\n // that includes integrations from the agentRegistry\n const runtimeModule = await import('@botpress/runtime/runtime')\n const { Autonomous } = await import('@botpress/runtime')\n const { context, agentRegistry } = runtimeModule\n\n // Create a client for making API calls\n const { Client } = await import('@botpress/client')\n const { BotSpecificClient, BotLogger } = await import('@botpress/sdk')\n const { Cognitive } = await import('@botpress/cognitive')\n\n const vanillaClient = new Client({\n token: this.credentials.token,\n apiUrl: this.credentials.apiUrl,\n botId,\n })\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK type mismatch between Client and BotSpecificClient\n const client = new BotSpecificClient(vanillaClient as any)\n\n const cognitive = new Cognitive({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK type mismatch\n client: client as any,\n __experimental_beta: true,\n })\n\n const logger = new BotLogger({})\n\n // Set a default context that will be used as fallback when no AsyncLocalStorage context is active\n // This allows actions/integrations to work in tests without wrapping every call\n context.setDefaultContext({\n executionId: 'test-execution',\n executionFinished: false,\n botId,\n client: client as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n cognitive: cognitive as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n citations: new Autonomous.CitationsManager(),\n logger: logger as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n configuration: configuration ?? {},\n integrations: agentRegistry.integrations,\n interfaces: agentRegistry.interfaces,\n states: [],\n tags: [],\n scheduledHeavyImports: new Set<string>(),\n })\n\n return botModule.default\n },\n }\n }\n\n /**\n * Run a script with the ADK runtime initialized\n */\n async run(scriptPath: string, options: RunOptions = {}): Promise<number> {\n const { botPath, runnerPath, project } = await this.prepare()\n\n // Resolve the script path\n const absoluteScriptPath = path.isAbsolute(scriptPath) ? scriptPath : path.resolve(this.projectPath, scriptPath)\n\n if (!existsSync(absoluteScriptPath)) {\n throw new Error(`Script not found: ${absoluteScriptPath}`)\n }\n\n // Determine which bot ID to use\n const botId = this.prod ? project.agentInfo?.botId : project.agentInfo?.devId || project.agentInfo?.botId\n const workspaceId = project.agentInfo?.workspaceId\n\n if (!botId) {\n const idType = this.prod ? 'botId' : 'devId'\n throw new Error(\n `No ${idType} found in agent.json. ` +\n (this.prod\n ? 'Please deploy your agent first with \"adk deploy\".'\n : 'Please run \"adk dev\" first to create a development bot, or use --prod to use the production bot.')\n )\n }\n\n // Build the command arguments\n const args = ['run', runnerPath, absoluteScriptPath, ...(options.args || [])]\n\n // Fetch configuration if bot ID is available\n let configuration: Record<string, unknown> | undefined\n try {\n const manager = new ConfigManager(botId)\n configuration = await manager.getAll()\n } catch {\n // Configuration fetch failed - will only be available during request handling\n }\n\n // Merge environment variables\n const env: Record<string, string> = {\n ...(process.env as Record<string, string>),\n\n // Set the project path so scripts can reference it\n ADK_PROJECT_PATH: this.projectPath,\n ADK_BOT_PATH: botPath,\n // Set bot context\n ADK_BOT_ID: botId,\n ADK_WORKSPACE_ID: workspaceId || '',\n ADK_IS_PROD: this.prod ? 'true' : 'false',\n // Disable worker mode for scripts\n BP_DISABLE_WORKER_MODE: 'true',\n ...options.env,\n ADK_SCRIPT_MODE: 'true',\n ADK_SCRIPT_PATH: absoluteScriptPath,\n ADK_TOKEN: this.credentials.token,\n ADK_API_URL: this.credentials.apiUrl,\n // Inject configuration so it's available at module load time\n ...(configuration && { ADK_CONFIGURATION: JSON.stringify(configuration) }),\n }\n\n return new Promise((resolve, reject) => {\n const child = spawn('bun', args, {\n cwd: botPath,\n env,\n stdio: options.inheritStdio !== false ? 'inherit' : 'pipe',\n })\n\n child.on('error', (error) => {\n reject(error)\n })\n\n child.on('close', (code) => {\n resolve(code ?? 0)\n })\n })\n }\n}\n\n/**\n * Convenience function to run a script with the ADK runtime\n */\nexport async function runScript(options: RunScriptOptions): Promise<number> {\n const runner = new ScriptRunner({\n projectPath: options.projectPath,\n forceRegenerate: options.forceRegenerate,\n prod: options.prod,\n credentials: options.credentials,\n })\n\n return runner.run(options.scriptPath, {\n args: options.args,\n env: options.env,\n inheritStdio: options.inheritStdio,\n })\n}\n\nexport interface SetupTestRuntimeOptions {\n /**\n * Path to the agent project root.\n * If not provided, auto-detects by walking up from CWD looking for agent.config.ts\n */\n projectPath?: string\n /**\n * Credentials for API access.\n * If not provided, loads from the current ADK profile (~/.adk/credentials)\n */\n credentials?: ScriptRunnerCredentials\n /** Whether to regenerate the bot project even if it exists */\n forceRegenerate?: boolean\n /** Use production bot ID instead of dev bot ID (default: false, uses devId) */\n prod?: boolean\n /** Additional environment variables to set */\n env?: Record<string, string>\n}\n\n/**\n * Convenience function to setup the ADK runtime for tests.\n *\n * This is designed to be called from test setup (beforeAll, globalSetup, etc.)\n * to prepare the ADK runtime environment without spawning a child process.\n *\n * Features:\n * - Auto-detects project path by walking up from CWD looking for agent.config.ts\n * - Auto-loads credentials from the current ADK profile (~/.adk/credentials)\n * - Both can be overridden via options\n *\n * @example\n * ```typescript\n * // Minimal usage - auto-detects everything\n * import { setupTestRuntime } from '@botpress/adk'\n *\n * beforeAll(async () => {\n * const runtime = await setupTestRuntime()\n * await runtime.initialize()\n * })\n *\n * // With explicit options\n * beforeAll(async () => {\n * const runtime = await setupTestRuntime({\n * projectPath: '/path/to/agent',\n * credentials: { token: 'custom-token', apiUrl: 'https://api.botpress.cloud' },\n * prod: true,\n * })\n * await runtime.initialize()\n * })\n * ```\n */\nexport async function setupTestRuntime(options: SetupTestRuntimeOptions = {}): Promise<TestRuntimeResult> {\n // Auto-detect project path if not provided\n let projectPath = options.projectPath\n if (!projectPath) {\n const detected = await findAgentRoot(process.cwd())\n if (!detected) {\n throw new Error(\n 'Could not find ADK agent project. No agent.config.ts found in current directory or parents.\\n' +\n 'Either run from within an agent project directory, or provide projectPath explicitly.'\n )\n }\n projectPath = detected\n }\n\n // Auto-load credentials if not provided\n let credentials = options.credentials\n if (!credentials) {\n const credentialsManager = new CredentialsManager()\n const loadedCredentials = await credentialsManager.getCredentials()\n if (!loadedCredentials) {\n throw new Error('No credentials found. Please run \"adk login\" first, or provide credentials explicitly.')\n }\n credentials = {\n token: loadedCredentials.token,\n apiUrl: loadedCredentials.apiUrl,\n }\n }\n\n const runner = new ScriptRunner({\n projectPath,\n forceRegenerate: options.forceRegenerate,\n prod: options.prod,\n credentials,\n })\n\n return runner.setupTestRuntime({ env: options.env })\n}\n",
|
|
90
|
+
"/**\n * Eval type definitions.\n * Ported from adk-eval-standalone/src/parser/schema.ts with added report types.\n */\n\nimport type { Span } from '@botpress/runtime/internal'\n\n// --- Assertion operators for flexible param matching ---\n\nexport type MatchOperator =\n | string\n | { equals: unknown }\n | { contains: string }\n | { not_contains: string }\n | { matches: string }\n | { in: unknown[] }\n | { exists: boolean }\n | { gte: number }\n | { lte: number }\n\n// --- Response assertions ---\n\nexport type ResponseAssertion =\n | { contains: string }\n | { not_contains: string }\n | { matches: string }\n | { llm_judge: string }\n | { similar_to: string }\n\n// --- Tool assertions ---\n\nexport type ToolAssertion =\n | { called: string; params?: Record<string, MatchOperator> }\n | { not_called: string }\n | { call_order: string[] }\n\n// --- Outcome assertion primitives (shared between turn-level and outcome-level) ---\n\nexport interface StateAssertion {\n path: string\n equals?: unknown\n changed?: boolean\n}\n\nexport type TableAssertion =\n | { table: string; row_exists: Record<string, MatchOperator> }\n | { table: string; row_count: MatchOperator; where?: Record<string, MatchOperator> }\n\nexport interface WorkflowAssertion {\n name: string\n entered?: boolean\n completed?: boolean\n}\n\n// --- Numeric operator (for timing and other numeric assertions) ---\n\nexport type NumericOperator = { equals: number } | { gte: number } | { lte: number }\n\n// --- Timing assertions ---\n\nexport interface TimingAssertion {\n response_time: NumericOperator\n}\n\n// --- Turn assertions ---\n\nexport interface TurnAssertions {\n response?: ResponseAssertion[]\n tools?: ToolAssertion[]\n state?: StateAssertion[]\n tables?: TableAssertion[]\n workflow?: WorkflowAssertion[]\n timing?: TimingAssertion[]\n}\n\n// --- Conversation turn ---\n\nexport interface ConversationTurn {\n user?: string\n event?: { type: string; payload?: Record<string, unknown> }\n expectSilence?: boolean\n assert?: TurnAssertions\n}\n\n// --- Outcome assertions (reuses the same assertion types) ---\n\nexport interface OutcomeAssertions {\n state?: StateAssertion[]\n tables?: TableAssertion[]\n workflow?: WorkflowAssertion[]\n}\n\n// --- Setup state ---\n\nexport interface EvalSetup {\n state?: {\n bot?: Record<string, unknown>\n user?: Record<string, unknown>\n conversation?: Record<string, unknown>\n }\n /**\n * Trigger a workflow before the conversation starts.\n * To test workflows with `step.sleep()`, read the duration from bot state and seed a short value via `setup.state.bot`.\n */\n workflow?: {\n trigger: string\n input?: Record<string, unknown>\n }\n}\n\n// --- Full eval definition ---\n\nexport interface EvalDefinition {\n name: string\n description?: string\n tags?: string[]\n type?: 'capability' | 'regression'\n setup?: EvalSetup\n conversation: ConversationTurn[]\n outcome?: OutcomeAssertions\n options?: {\n /** Override the idle timeout for this eval (ms). Cascades: eval > agent config > default (15s). */\n idleTimeout?: number\n /** Override the LLM judge pass threshold (integer, 1-5). Values outside this range are clamped. Cascades: eval > agent config > default (3). */\n judgePassThreshold?: number\n }\n}\n\n/** A typed eval definition. Use this in your `.eval.ts` files for full IntelliSense. */\nexport class Eval implements EvalDefinition {\n readonly name: string\n readonly description?: string\n readonly tags?: string[]\n readonly type?: 'capability' | 'regression'\n readonly setup?: EvalSetup\n readonly conversation: ConversationTurn[]\n readonly outcome?: OutcomeAssertions\n readonly options?: {\n idleTimeout?: number\n judgePassThreshold?: number\n }\n\n constructor(def: EvalDefinition) {\n this.name = def.name\n this.description = def.description\n this.tags = def.tags\n this.type = def.type\n this.setup = def.setup\n this.conversation = def.conversation\n this.outcome = def.outcome\n this.options = def.options\n }\n}\n\n// --- Shared context for graders ---\n\nexport interface EvalContext {\n botId: string\n userId: string\n conversationId: string\n}\n\n// --- Grader result (universal currency for all graders) ---\n\nexport interface GraderResult {\n assertion: string\n pass: boolean\n expected: string\n actual: string\n}\n\n// --- Tool call extracted from traces ---\n\nexport interface ToolCall {\n name: string\n input: Record<string, unknown>\n output: string\n status: string\n}\n\n// --- Trace data from a conversation ---\n\nexport interface TraceData {\n toolCalls: ToolCall[]\n totalToolCallCount: number\n raw: Span[]\n}\n\n// --- Turn report ---\n\nexport interface TurnReport {\n turnNumber: number\n userMessage: string\n botResponse: string\n assertions: GraderResult[]\n pass: boolean\n /** Time spent waiting for the bot to respond (ms) */\n botDuration: number\n /** Time spent fetching traces + running graders (ms) */\n evalDuration: number\n}\n\n// --- Single eval report ---\n\nexport interface EvalReport {\n name: string\n description?: string\n type?: 'capability' | 'regression'\n tags?: string[]\n turns: TurnReport[]\n outcomeAssertions: GraderResult[]\n pass: boolean\n duration: number\n error?: string\n}\n\n// --- Progress event for real-time UI updates ---\n\nexport type EvalProgressEvent =\n | { type: 'suite_start'; totalEvals: number }\n | { type: 'eval_start'; evalName: string; index: number }\n | { type: 'eval_complete'; evalName: string; index: number; report: EvalReport }\n | { type: 'suite_complete'; report: EvalRunReport }\n\n// --- Eval run report (full suite) ---\n\nexport interface EvalRunReport {\n id: string\n timestamp: string\n evals: EvalReport[]\n passed: number\n failed: number\n total: number\n duration: number\n filter?: {\n names?: string[]\n tags?: string[]\n type?: 'capability' | 'regression'\n }\n}\n\n// --- Bot connection info ---\n\nexport interface BotConnection {\n webhookId: string\n botId: string\n token: string\n apiUrl: string\n}\n\n// --- Bot response from chat ---\n\nexport interface BotResponse {\n text: string\n raw: unknown\n}\n\n// --- Turn result from sending a message ---\n\nexport interface TurnResult {\n conversationId: string\n responses: BotResponse[]\n}\n\n// --- Logger interface ---\n\nexport interface EvalLogger {\n info: (message: string) => void\n warn: (message: string) => void\n error: (message: string) => void\n}\n\n// --- Eval runner configuration ---\n\nexport interface EvalRunnerConfig {\n credentials: {\n token: string\n apiUrl: string\n botId: string\n webhookId?: string\n }\n agentPath: string\n /** URL of the dev server providing traces and config. Defaults to http://localhost:3001 */\n devServerUrl?: string\n onProgress?: (event: EvalProgressEvent) => void\n /** Logger for warnings and errors. Defaults to console. */\n logger?: EvalLogger\n /** Bot-level eval options from agent.config.ts. Cascades: eval > agent config > default. */\n evalOptions?: {\n idleTimeout?: number\n /** LLM judge pass threshold (integer, 1-5). Values outside this range are clamped. Cascades: eval > agent config > default (3). */\n judgePassThreshold?: number\n /** Model to use for llm_judge assertions (e.g. 'openai:gpt-4o'). Defaults to 'fast'. */\n judgeModel?: string\n }\n}\n\n// --- Eval suite filter ---\n\nexport interface EvalFilter {\n names?: string[]\n tags?: string[]\n type?: 'capability' | 'regression'\n}\n",
|
|
91
|
+
"/**\n * Eval file loader.\n * Loads *.eval.ts files from a directory using dynamic imports.\n * Supports both default and named exports, and multiple evals per file.\n */\n\nimport { readdirSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport type { EvalDefinition, EvalFilter } from './types'\nimport { Eval } from './types'\n\nfunction isEvalDefinition(value: unknown): value is EvalDefinition {\n return (\n value !== null &&\n typeof value === 'object' &&\n typeof (value as Record<string, unknown>).name === 'string' &&\n (value as Record<string, unknown>).name !== '' &&\n Array.isArray((value as Record<string, unknown>).conversation)\n )\n}\n\nexport async function loadEvalFile(filePath: string): Promise<EvalDefinition[]> {\n const absPath = resolve(filePath)\n const mod = await import(absPath)\n\n const results: EvalDefinition[] = []\n\n for (const [key, value] of Object.entries(mod as Record<string, unknown>)) {\n if (key === '__esModule') continue\n if (value instanceof Eval || isEvalDefinition(value)) {\n results.push(value)\n }\n }\n\n if (results.length === 0) {\n throw new Error(\n `Invalid eval file ${filePath}: no valid evals found. Export one or more \\`new Eval({...})\\` instances (as default or named exports).`\n )\n }\n\n return results\n}\n\nexport async function loadEvalsFromDir(dirPath: string): Promise<EvalDefinition[]> {\n const absDir = resolve(dirPath)\n if (!existsSync(absDir)) {\n return []\n }\n\n const files = readdirSync(absDir).filter((f) => f.endsWith('.eval.ts'))\n const evals: EvalDefinition[] = []\n\n for (const f of files) {\n const defs = await loadEvalFile(`${absDir}/${f}`)\n evals.push(...defs)\n }\n\n const seen = new Set<string>()\n for (const e of evals) {\n if (seen.has(e.name)) {\n throw new Error(`Duplicate eval name \"${e.name}\" found in ${dirPath}`)\n }\n seen.add(e.name)\n }\n\n return evals\n}\n\nexport async function loadEvalByName(dirPath: string, name: string): Promise<EvalDefinition | null> {\n const absDir = resolve(dirPath)\n if (!existsSync(absDir)) return null\n\n const files = readdirSync(absDir).filter((f) => f.endsWith('.eval.ts'))\n\n for (const f of files) {\n const defs = await loadEvalFile(`${absDir}/${f}`)\n const found = defs.find((d) => d.name === name)\n if (found) return found\n }\n\n return null\n}\n\nexport function filterEvals(evals: EvalDefinition[], filter?: EvalFilter): EvalDefinition[] {\n if (!filter) return evals\n\n return evals.filter((e) => {\n if (filter.names && filter.names.length > 0) {\n if (!filter.names.includes(e.name)) return false\n }\n if (filter.tags && filter.tags.length > 0) {\n if (!e.tags || !filter.tags.some((t) => e.tags!.includes(t))) return false\n }\n if (filter.type) {\n if (e.type !== filter.type) return false\n }\n return true\n })\n}\n",
|
|
92
|
+
"/**\n * Eval runner — orchestrates eval execution.\n */\n\nimport { Client as BpClient } from '@botpress/client'\nimport type {\n EvalDefinition,\n EvalReport,\n EvalRunReport,\n EvalRunnerConfig,\n EvalFilter,\n GraderResult,\n TurnReport,\n BotConnection,\n EvalSetup,\n} from './types'\nimport { BUILT_IN_STATES, type Span } from '@botpress/runtime/internal'\nimport { ChatSession, discoverWebhookId } from './client'\nimport { getTraceData } from './traces'\nimport { gradeResponse } from './graders/response'\nimport { gradeTools } from './graders/tools'\nimport { gradeState } from './graders/state'\nimport { gradeTables } from './graders/tables'\nimport { gradeWorkflows } from './graders/workflow'\nimport { gradeTiming } from './graders/timing'\nimport { gradeOutcome, snapshotOutcomeState } from './graders/outcome'\nimport { initLLMJudge } from './graders/llm'\nimport { loadEvalsFromDir, filterEvals } from './loader'\nimport { randomUUID } from 'crypto'\n\n/**\n * Run a single eval against a bot.\n */\nconst DEFAULT_IDLE_TIMEOUT = 15_000\nconst WORKFLOW_TRIGGER_TIMEOUT_MS = 5 * 60 * 1000\n\nfunction buildStatePayload(value: Record<string, unknown>) {\n // `location` is required by the Botpress setState API schema.\n return {\n value,\n location: { type: 'state' as const },\n }\n}\n\nasync function seedEvalState(\n client: BpClient,\n ctx: { botId: string; userId: string; conversationId?: string },\n setup?: EvalSetup\n): Promise<void> {\n const state = setup?.state\n if (!state) return\n\n const writes: Array<Promise<unknown>> = []\n\n if (state.bot) {\n writes.push(\n client.setState({\n type: 'bot',\n id: ctx.botId,\n name: BUILT_IN_STATES.bot,\n payload: buildStatePayload(state.bot),\n })\n )\n }\n\n if (state.user) {\n writes.push(\n client.setState({\n type: 'user',\n id: ctx.userId,\n name: BUILT_IN_STATES.user,\n payload: buildStatePayload(state.user),\n })\n )\n }\n\n if (state.conversation) {\n if (!ctx.conversationId) {\n throw new Error('Cannot seed conversation state before a conversation is created.')\n }\n\n writes.push(\n client.setState({\n type: 'conversation',\n id: ctx.conversationId,\n name: BUILT_IN_STATES.conversation,\n payload: buildStatePayload(state.conversation),\n })\n )\n }\n\n await Promise.all(writes)\n}\n\nasync function triggerEvalWorkflow(\n client: BpClient,\n ctx: { userId: string; conversationId?: string },\n setup?: EvalSetup\n): Promise<void> {\n const workflow = setup?.workflow\n if (!workflow) return\n\n await client.createWorkflow({\n name: workflow.trigger,\n input: workflow.input ?? {},\n status: 'pending',\n conversationId: ctx.conversationId,\n userId: ctx.userId,\n timeoutAt: new Date(Date.now() + WORKFLOW_TRIGGER_TIMEOUT_MS).toISOString(),\n })\n}\n\nexport async function runEval(\n evalDef: EvalDefinition,\n connection: BotConnection,\n options: { devServerUrl?: string; idleTimeout?: number; judgePassThreshold?: number } = {}\n): Promise<EvalReport> {\n const devServerUrl = options.devServerUrl || 'http://localhost:3001'\n const idleTimeout = evalDef.options?.idleTimeout ?? options.idleTimeout ?? DEFAULT_IDLE_TIMEOUT\n const judgePassThreshold = evalDef.options?.judgePassThreshold ?? options.judgePassThreshold\n const start = Date.now()\n const turns: TurnReport[] = []\n let outcomeAssertions: GraderResult[] = []\n\n try {\n const session = new ChatSession(connection.webhookId)\n await session.connect()\n\n let bpClient: BpClient | null = null\n const getBpClient = () => {\n if (!bpClient) {\n bpClient = new BpClient({\n token: connection.token,\n botId: connection.botId,\n apiUrl: connection.apiUrl,\n })\n }\n return bpClient\n }\n\n let lastConversationId = ''\n if (evalDef.setup?.state?.conversation || evalDef.setup?.workflow) {\n lastConversationId = await session.ensureConversation()\n }\n\n await seedEvalState(\n getBpClient(),\n {\n botId: connection.botId,\n userId: session.userId,\n conversationId: lastConversationId || undefined,\n },\n evalDef.setup\n )\n\n await triggerEvalWorkflow(\n getBpClient(),\n {\n userId: session.userId,\n conversationId: lastConversationId || undefined,\n },\n evalDef.setup\n )\n\n // Snapshot pre-conversation state for `changed` assertions\n let preSnapshots = new Map<string, unknown>()\n if (evalDef.outcome?.state) {\n const ctx = {\n botId: connection.botId,\n userId: session.userId,\n conversationId: lastConversationId,\n }\n preSnapshots = await snapshotOutcomeState(getBpClient(), evalDef, ctx)\n }\n\n let previousToolCallCount = 0\n let allSpans: Span[] = []\n\n for (let i = 0; i < evalDef.conversation.length; i++) {\n const turn = evalDef.conversation[i]!\n const turnStart = Date.now()\n\n if (turn.expectSilence && turn.assert?.response) {\n throw new Error(`Turn ${i + 1}: 'expectSilence' and 'assert.response' are mutually exclusive.`)\n }\n if (turn.user && turn.event) {\n throw new Error(`Turn ${i + 1}: 'user' and 'event' are mutually exclusive.`)\n }\n if (!turn.user && !turn.event) {\n throw new Error(`Turn ${i + 1}: must have either 'user' or 'event'.`)\n }\n\n const sendOptions = { timeout: Math.max(30_000, idleTimeout * 2), idleTimeout, expectSilence: turn.expectSilence }\n const result = turn.event\n ? await session.sendEvent(turn.event.type, turn.event.payload ?? {}, sendOptions)\n : await session.sendMessage(turn.user!, sendOptions)\n const botDuration = Date.now() - turnStart\n\n if (!turn.expectSilence && result.responses.length === 0) {\n throw new Error(`Turn ${i + 1}: bot produced no response.`)\n }\n\n lastConversationId = result.conversationId\n const botResponse = result.responses.map((r) => r.text).join('\\n')\n const turnLabel = turn.event ? `[event: ${turn.event.type}]` : turn.user!\n\n const evalStart = Date.now()\n let assertions: GraderResult[] = []\n\n if (turn.expectSilence) {\n const wasSilent = result.responses.length === 0\n assertions.push({\n assertion: 'no_response',\n pass: wasSilent,\n expected: 'No response',\n actual: wasSilent ? 'No response' : `Bot responded: \"${botResponse}\"`,\n })\n }\n\n // Response assertions\n if (turn.assert?.response) {\n assertions = await gradeResponse(botResponse, turn.assert.response, {\n userMessage: turnLabel,\n judgePassThreshold,\n })\n }\n\n // Tool assertions from traces\n if (turn.assert?.tools) {\n try {\n const expectNewCalls = turn.assert.tools.some((a) => 'called' in a || 'call_order' in a)\n const traceData = await getTraceData(result.conversationId, devServerUrl, {\n previousToolCallCount,\n expectNewCalls,\n })\n previousToolCallCount = traceData.totalToolCallCount\n allSpans = traceData.raw\n const toolResults = gradeTools(traceData.toolCalls, turn.assert.tools)\n assertions = [...assertions, ...toolResults]\n } catch (err) {\n for (const toolAssert of turn.assert.tools) {\n const name =\n 'called' in toolAssert\n ? toolAssert.called\n : 'not_called' in toolAssert\n ? toolAssert.not_called\n : 'call_order'\n assertions.push({\n assertion: `tool: ${name}`,\n pass: false,\n expected: `Tool assertion on ${name}`,\n actual: `Failed to fetch traces: ${(err as Error).message}`,\n })\n }\n }\n }\n\n // Per-turn state assertions\n if (turn.assert?.state) {\n try {\n const ctx = {\n botId: connection.botId,\n userId: session.userId,\n conversationId: result.conversationId,\n }\n const stateResults = await gradeState(getBpClient(), turn.assert.state, ctx, preSnapshots)\n assertions.push(...stateResults)\n } catch (err) {\n assertions.push({\n assertion: 'state',\n pass: false,\n expected: 'State assertions executed',\n actual: `Error: ${(err as Error).message}`,\n })\n }\n }\n\n // Per-turn table assertions\n if (turn.assert?.tables) {\n try {\n const tableResults = await gradeTables(getBpClient(), turn.assert.tables)\n assertions.push(...tableResults)\n } catch (err) {\n assertions.push({\n assertion: 'tables',\n pass: false,\n expected: 'Table assertions executed',\n actual: `Error: ${(err as Error).message}`,\n })\n }\n }\n\n // Per-turn workflow assertions\n if (turn.assert?.workflow) {\n if (allSpans.length === 0) {\n try {\n const traceData = await getTraceData(result.conversationId, devServerUrl)\n allSpans = traceData.raw\n } catch {\n // Traces unavailable\n }\n }\n const workflowResults = gradeWorkflows(allSpans, turn.assert.workflow)\n assertions.push(...workflowResults)\n }\n\n // Per-turn timing assertions\n if (turn.assert?.timing) {\n const timingResults = gradeTiming(botDuration, turn.assert.timing)\n assertions.push(...timingResults)\n }\n\n const turnPass = assertions.every((a) => a.pass)\n\n const evalDuration = Date.now() - evalStart\n\n turns.push({\n turnNumber: i + 1,\n userMessage: turnLabel,\n botResponse,\n assertions,\n pass: turnPass,\n botDuration,\n evalDuration,\n })\n }\n\n // Outcome assertions (after all turns)\n if (evalDef.outcome) {\n if (allSpans.length === 0 && lastConversationId && evalDef.outcome.workflow) {\n try {\n const traceData = await getTraceData(lastConversationId, devServerUrl)\n allSpans = traceData.raw\n } catch {\n // Traces unavailable\n }\n }\n\n const ctx = {\n botId: connection.botId,\n userId: session.userId,\n conversationId: lastConversationId,\n }\n\n try {\n outcomeAssertions = await gradeOutcome(getBpClient(), evalDef, ctx, allSpans, preSnapshots)\n } catch (err) {\n outcomeAssertions = [\n {\n assertion: 'outcome',\n pass: false,\n expected: 'Outcome assertions executed',\n actual: `Error: ${(err as Error).message}`,\n },\n ]\n }\n }\n\n const turnsPass = turns.every((t) => t.pass)\n const outcomePass = outcomeAssertions.every((a) => a.pass)\n\n return {\n name: evalDef.name,\n description: evalDef.description,\n type: evalDef.type,\n tags: evalDef.tags,\n turns,\n outcomeAssertions,\n pass: turnsPass && outcomePass,\n duration: Date.now() - start,\n }\n } catch (err) {\n return {\n name: evalDef.name,\n description: evalDef.description,\n type: evalDef.type,\n tags: evalDef.tags,\n turns,\n outcomeAssertions,\n pass: false,\n duration: Date.now() - start,\n error: (err as Error).message,\n }\n }\n}\n\n/**\n * Run a suite of evals.\n */\nexport async function runEvalSuite(config: EvalRunnerConfig, filter?: EvalFilter): Promise<EvalRunReport> {\n const start = Date.now()\n const runId = randomUUID().replace(/-/g, '').slice(0, 26)\n\n // Initialize the LLM judge with credentials\n await initLLMJudge(\n {\n token: config.credentials.token,\n apiUrl: config.credentials.apiUrl,\n botId: config.credentials.botId,\n },\n { model: config.evalOptions?.judgeModel, logger: config.logger }\n )\n\n // Load eval definitions\n const evalsDir = `${config.agentPath}/evals`\n const allEvals = await loadEvalsFromDir(evalsDir)\n const evals = filterEvals(allEvals, filter)\n\n if (evals.length === 0) {\n return {\n id: runId,\n timestamp: new Date().toISOString(),\n evals: [],\n passed: 0,\n failed: 0,\n total: 0,\n duration: 0,\n filter,\n }\n }\n\n // Discover webhookId if not provided\n let webhookId = config.credentials.webhookId\n if (!webhookId) {\n webhookId = await discoverWebhookId(config.credentials.botId, config.credentials.token, config.credentials.apiUrl)\n }\n\n const connection: BotConnection = {\n webhookId,\n botId: config.credentials.botId,\n token: config.credentials.token,\n apiUrl: config.credentials.apiUrl,\n }\n\n const devServerUrl = config.devServerUrl || 'http://localhost:3001'\n const reports: EvalReport[] = []\n\n config.onProgress?.({ type: 'suite_start', totalEvals: evals.length })\n\n for (let i = 0; i < evals.length; i++) {\n const evalDef = evals[i]!\n config.onProgress?.({ type: 'eval_start', evalName: evalDef.name, index: i })\n\n const report = await runEval(evalDef, connection, {\n devServerUrl,\n idleTimeout: config.evalOptions?.idleTimeout,\n judgePassThreshold: config.evalOptions?.judgePassThreshold,\n })\n reports.push(report)\n\n config.onProgress?.({ type: 'eval_complete', evalName: evalDef.name, index: i, report })\n }\n\n const runReport: EvalRunReport = {\n id: runId,\n timestamp: new Date().toISOString(),\n evals: reports,\n passed: reports.filter((r) => r.pass).length,\n failed: reports.filter((r) => !r.pass).length,\n total: reports.length,\n duration: Date.now() - start,\n filter,\n }\n\n config.onProgress?.({ type: 'suite_complete', report: runReport })\n\n return runReport\n}\n",
|
|
93
|
+
"/**\n * Chat client for eval conversations.\n * Drives conversations against a running ADK bot via @botpress/chat.\n */\n\nimport { Client as BpClient } from '@botpress/client'\nimport type { BotResponse, TurnResult } from './types'\nimport { getChatClient } from '../utils/require-chat.js'\n\n/**\n * A chat session that maintains a single client connection across turns.\n */\nexport class ChatSession {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamically loaded chat client has no static type\n private client: any = null\n private conversationId: string | null = null\n\n constructor(private webhookId: string) {}\n\n async connect() {\n const ChatClient = getChatClient()\n this.client = await ChatClient.connect({ webhookId: this.webhookId })\n }\n\n get userId(): string {\n if (!this.client) {\n throw new Error('ChatSession not connected. Call connect() first.')\n }\n return this.client.user.id\n }\n\n async ensureConversation(): Promise<string> {\n if (!this.client) {\n throw new Error('ChatSession not connected. Call connect() first.')\n }\n\n if (!this.conversationId) {\n const conv = await this.client.createConversation({})\n this.conversationId = conv.conversation.id\n return conv.conversation.id\n }\n\n return this.conversationId\n }\n\n private async _awaitResponses(\n conversationId: string,\n trigger: () => Promise<void>,\n options: { timeout?: number; idleTimeout?: number; expectSilence?: boolean } = {}\n ): Promise<TurnResult> {\n const { timeout = 30_000, idleTimeout = 3_000 } = options\n const responses: BotResponse[] = []\n\n const listener = await this.client.listenConversation({ id: conversationId })\n\n return new Promise<TurnResult>((resolve, reject) => {\n let idleTimer: ReturnType<typeof setTimeout> | null = null\n let resolved = false\n\n const done = () => {\n if (resolved) return\n resolved = true\n if (idleTimer) clearTimeout(idleTimer)\n clearTimeout(overallTimer)\n resolve({ conversationId, responses })\n }\n\n const resetIdle = () => {\n if (idleTimer) clearTimeout(idleTimer)\n idleTimer = setTimeout(done, idleTimeout)\n }\n\n const overallTimer = setTimeout(() => {\n if (!resolved) {\n if (responses.length > 0 || options.expectSilence) {\n done()\n } else {\n resolved = true\n reject(new Error(`Timed out after ${timeout}ms with no bot response.`))\n }\n }\n }, timeout)\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- chat client event type is not statically typed\n listener.on('message_created', (event: any) => {\n if (resolved) return\n if (event.isBot) {\n const payload = event?.payload\n const text = typeof payload === 'string' ? payload : payload?.text || JSON.stringify(payload)\n responses.push({ text, raw: payload })\n resetIdle()\n }\n })\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- chat client event type is not statically typed\n listener.on('event_created', (event: any) => {\n if (event?.payload?.done) {\n done()\n }\n })\n\n trigger()\n .then(() => {\n resetIdle()\n })\n .catch((err: Error) => {\n clearTimeout(overallTimer)\n if (!resolved) {\n resolved = true\n reject(err)\n }\n })\n })\n }\n\n async sendMessage(\n message: string,\n options: { timeout?: number; idleTimeout?: number; expectSilence?: boolean } = {}\n ): Promise<TurnResult> {\n if (!this.client) {\n throw new Error('ChatSession not connected. Call connect() first.')\n }\n\n const conversationId = await this.ensureConversation()\n return this._awaitResponses(\n conversationId,\n () => this.client.createMessage({ conversationId, payload: { type: 'text', text: message } }),\n options\n )\n }\n\n async sendEvent(\n type: string,\n payload: Record<string, unknown>,\n options: { timeout?: number; idleTimeout?: number; expectSilence?: boolean } = {}\n ): Promise<TurnResult> {\n if (!this.client) {\n throw new Error('ChatSession not connected. Call connect() first.')\n }\n\n const conversationId = await this.ensureConversation()\n return this._awaitResponses(\n conversationId,\n () => this.client.createEvent({ type, payload, conversationId }),\n options\n )\n }\n}\n\n/**\n * Discover the chat integration's webhookId from a bot.\n */\nexport async function discoverWebhookId(botId: string, token: string, apiUrl: string): Promise<string> {\n const client = new BpClient({ token, botId, apiUrl })\n const { bot } = await client.getBot({ id: botId })\n const integrations = bot.integrations || {}\n\n const chat = Object.values(integrations).find((int) => (int as Record<string, unknown>).name === 'chat')\n const webhookId = (chat as Record<string, unknown> | undefined)?.webhookId\n\n if (!webhookId || typeof webhookId !== 'string') {\n throw new Error('No chat integration found on bot. Make sure the bot has the chat integration enabled.')\n }\n\n return webhookId\n}\n",
|
|
94
|
+
"/**\n * Trace data extraction for evals.\n * Uses the ADK dev server's HTTP API to fetch traces by conversationId.\n * This approach is used instead of direct TraceReader access because:\n * 1. The eval engine runs in the ADK package, not the CLI\n * 2. The dev server is always running when evals execute\n * 3. HTTP is the established interface for trace queries\n */\n\nimport type { Span } from '@botpress/runtime/internal'\nimport type { ToolCall, TraceData } from './types'\n\n/**\n * Fetch traces for a conversationId from the dev server.\n */\nasync function fetchSpans(conversationId: string, devServerUrl: string): Promise<Span[]> {\n const url = `${devServerUrl}/api/traces/query?attributeName=conversationId&attributeValue=${encodeURIComponent(conversationId)}&count=1000`\n const res = await fetch(url)\n\n if (!res.ok) {\n throw new Error(`Failed to fetch traces: ${res.status} ${res.statusText}`)\n }\n\n const data = await res.json()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- API response shape varies\n return Array.isArray(data) ? data : (data as any).spans || []\n}\n\n/**\n * Extract tool calls from trace spans.\n * Looks for completed `autonomous.tool` spans that have output + status.\n */\nfunction extractToolCalls(spans: Span[]): ToolCall[] {\n const data = (span: Span): Record<string, unknown> =>\n (span.data && typeof span.data === 'object' ? span.data : {}) as Record<string, unknown>\n\n const toolEndSpans = spans.filter(\n (span) =>\n span.name === 'autonomous.tool' &&\n (span.status === 'ok' || span.status === 'error') &&\n data(span)['autonomous.tool.name']\n )\n\n // Deduplicate by span id\n const seen = new Set<string>()\n const unique = toolEndSpans.filter((span) => {\n if (seen.has(span.id.span)) return false\n seen.add(span.id.span)\n return true\n })\n\n return unique\n .sort((a, b) => (a.timing.endedAt ?? 0) - (b.timing.endedAt ?? 0))\n .map((span) => {\n const d = data(span)\n let input: Record<string, unknown> = {}\n try {\n input = JSON.parse(d['autonomous.tool.input'] as string)\n } catch {}\n\n return {\n name: d['autonomous.tool.name'] as string,\n input,\n output: (d['autonomous.tool.output'] as string) || '',\n status: (d['autonomous.tool.status'] as string) || 'unknown',\n }\n })\n}\n\n/**\n * Fetch and extract structured trace data for a conversation.\n * If previousToolCallCount is provided, only returns tool calls after that index.\n * When expectNewCalls is true, retries fetching until new tool calls appear.\n */\nexport async function getTraceData(\n conversationId: string,\n devServerUrl: string,\n options: { previousToolCallCount?: number; expectNewCalls?: boolean } = {}\n): Promise<TraceData> {\n const previousCount = options.previousToolCallCount || 0\n const expectNew = options.expectNewCalls ?? false\n const maxRetries = expectNew ? 5 : 0\n const retryDelay = 500\n\n let allToolCalls: ToolCall[] = []\n let spans: Span[] = []\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n if (attempt > 0) {\n await new Promise((resolve) => setTimeout(resolve, retryDelay))\n }\n spans = await fetchSpans(conversationId, devServerUrl)\n allToolCalls = extractToolCalls(spans)\n if (!expectNew || allToolCalls.length > previousCount) {\n break\n }\n }\n\n const toolCalls = allToolCalls.slice(previousCount)\n return { toolCalls, totalToolCallCount: allToolCalls.length, raw: spans }\n}\n",
|
|
95
|
+
"/**\n * LLM judge grader using @botpress/cognitive.\n * Replaces the OpenAI-based implementation from the standalone project.\n */\n\nimport { Cognitive } from '@botpress/runtime'\nimport { Client } from '@botpress/client'\nimport type { EvalLogger, GraderResult } from '../types'\n\nconst DEFAULT_PASS_THRESHOLD = 3\n\nfunction buildJudgeSystemPrompt(passThreshold: number): string {\n return `You are an evaluation judge for a chatbot. You will be given:\n- The user's message\n- The bot's response\n- Grading criteria\n\nYour job is to determine if the bot's response meets the criteria.\n\nRespond with a JSON object:\n{\n \"pass\": true/false,\n \"score\": 1-5,\n \"reason\": \"brief explanation\"\n}\n\nScoring guide:\n- 5: Fully meets criteria, excellent response\n- 4: Mostly meets criteria, minor issues\n- 3: Partially meets criteria, notable gaps\n- 2: Barely meets criteria, significant issues\n- 1: Does not meet criteria\n\nA score of ${passThreshold} or above is a pass.`\n}\n\nconst MODEL_ALIASES = ['fast', 'best']\n\nlet _cognitive: Cognitive | null = null\nlet _availableModels: string[] = []\nlet _judgeModel: string = 'fast'\n\nfunction _isModelValid(model: string): boolean {\n if (MODEL_ALIASES.includes(model)) return true\n if (_availableModels.length === 0) return false\n\n return _availableModels.includes(model)\n}\n\n/**\n * Initialize the LLM judge with explicit credentials.\n * Call this before running evals so the judge doesn't need env vars.\n */\nexport async function initLLMJudge(\n credentials: { token: string; apiUrl: string; botId: string },\n options?: { model?: string; logger?: EvalLogger }\n) {\n const log = options?.logger ?? console\n\n const client = new Client({\n token: credentials.token,\n apiUrl: credentials.apiUrl,\n botId: credentials.botId,\n })\n _cognitive = new Cognitive({ client: client, __experimental_beta: true })\n\n try {\n _availableModels = Array.from((await _cognitive.fetchRemoteModels()).keys())\n } catch (err) {\n log.warn(`Failed to fetch available models: ${(err as Error).message}. LLM judge will be unavailable.`)\n _availableModels = []\n }\n\n _judgeModel = options?.model ?? 'fast'\n\n if (_availableModels.length === 0) {\n log.warn('No available Cognitive models: cannot validate judge model.')\n } else if (!_isModelValid(_judgeModel)) {\n log.warn(`Configured LLM judge model \"${_judgeModel}\" is invalid. Run \"adk models\" to list available models.`)\n }\n}\n\nexport async function gradeLLMJudge(\n botResponse: string,\n criteria: string,\n context: { userMessage: string; passThreshold?: number }\n): Promise<GraderResult> {\n const threshold = Math.max(1, Math.min(5, context.passThreshold ?? DEFAULT_PASS_THRESHOLD))\n\n try {\n if (!_cognitive) {\n return {\n assertion: `llm_judge: \"${criteria}\"`,\n pass: true,\n expected: criteria,\n actual: 'SKIPPED — LLM judge unavailable: no credentials configured',\n }\n }\n\n if (!_isModelValid(_judgeModel)) {\n return {\n assertion: `llm_judge: \"${criteria}\"`,\n pass: false,\n expected: criteria,\n actual: 'FAILED — invalid LLM judge model',\n }\n }\n\n const { output } = await _cognitive.generateContent({\n model: _judgeModel as Parameters<Cognitive['generateContent']>[0]['model'],\n temperature: 0,\n responseFormat: 'json_object',\n systemPrompt: buildJudgeSystemPrompt(threshold),\n messages: [\n {\n role: 'user',\n content: `User message: ${context.userMessage}\\n\\nBot response: ${botResponse}\\n\\nCriteria: ${criteria}`,\n },\n ],\n })\n\n const rawContent = output?.choices?.[0]?.content\n const content = typeof rawContent === 'string' ? rawContent : null\n if (!content) {\n return {\n assertion: `llm_judge: \"${criteria}\"`,\n pass: true,\n expected: criteria,\n actual: 'SKIPPED — LLM judge returned empty response',\n }\n }\n\n const verdict = JSON.parse(content) as {\n pass: boolean\n score: number\n reason: string\n }\n\n return {\n assertion: `llm_judge: \"${criteria}\"`,\n pass: verdict.score >= threshold,\n expected: criteria,\n actual: `Score ${verdict.score}/5 (threshold: ${threshold}) — ${verdict.reason}`,\n }\n } catch (err) {\n return {\n assertion: `llm_judge: \"${criteria}\"`,\n pass: true,\n expected: criteria,\n actual: `SKIPPED — LLM judge unavailable: ${(err as Error).message}`,\n }\n }\n}\n",
|
|
96
|
+
"/**\n * Response assertion graders.\n * Checks bot response text against expected assertions.\n */\n\nimport type { ResponseAssertion, GraderResult } from '../types'\nimport { gradeLLMJudge } from './llm'\n\nexport async function gradeResponse(\n botResponse: string,\n assertions: ResponseAssertion[],\n context: { userMessage: string; judgePassThreshold?: number }\n): Promise<GraderResult[]> {\n const results: GraderResult[] = []\n\n for (const assertion of assertions) {\n if ('contains' in assertion) {\n const pass = botResponse.toLowerCase().includes(assertion.contains.toLowerCase())\n results.push({\n assertion: `contains \"${assertion.contains}\"`,\n pass,\n expected: `Response contains \"${assertion.contains}\"`,\n actual: pass ? `Found in response` : `Not found in response`,\n })\n continue\n }\n\n if ('not_contains' in assertion) {\n const pass = !botResponse.toLowerCase().includes(assertion.not_contains.toLowerCase())\n results.push({\n assertion: `not_contains \"${assertion.not_contains}\"`,\n pass,\n expected: `Response does not contain \"${assertion.not_contains}\"`,\n actual: pass ? `Not found in response` : `Found in response`,\n })\n continue\n }\n\n if ('matches' in assertion) {\n const regex = new RegExp(assertion.matches, 'i')\n const pass = regex.test(botResponse)\n results.push({\n assertion: `matches ${assertion.matches}`,\n pass,\n expected: `Response matches /${assertion.matches}/`,\n actual: pass ? `Matched` : `No match`,\n })\n continue\n }\n\n if ('llm_judge' in assertion) {\n const result = await gradeLLMJudge(botResponse, assertion.llm_judge, {\n userMessage: context.userMessage,\n passThreshold: context.judgePassThreshold,\n })\n results.push(result)\n continue\n }\n\n if ('similar_to' in assertion) {\n results.push({\n assertion: `similar_to: \"${assertion.similar_to}\"`,\n pass: true,\n expected: assertion.similar_to,\n actual: 'SKIPPED — similar_to not yet implemented',\n })\n continue\n }\n\n results.push({\n assertion: 'unknown',\n pass: false,\n expected: 'known assertion type',\n actual: `Unknown assertion: ${JSON.stringify(assertion)}`,\n })\n }\n\n return results\n}\n",
|
|
97
97
|
"/**\n * Shared match utilities for assertion grading.\n * Used by tool, state, and table graders.\n */\n\nimport type { MatchOperator } from '../types'\n\n/**\n * Evaluate a single match operator against a value.\n */\nexport function matchValue(operator: MatchOperator, actual: unknown): boolean {\n // Shorthand: string means exact match\n if (typeof operator === 'string') {\n return String(actual) === operator\n }\n\n if ('equals' in operator) {\n return actual === operator.equals\n }\n\n if ('contains' in operator) {\n return String(actual).toLowerCase().includes(operator.contains.toLowerCase())\n }\n\n if ('not_contains' in operator) {\n return !String(actual).toLowerCase().includes(operator.not_contains.toLowerCase())\n }\n\n if ('matches' in operator) {\n return new RegExp(operator.matches, 'i').test(String(actual))\n }\n\n if ('in' in operator) {\n return operator.in.includes(actual)\n }\n\n if ('exists' in operator) {\n return operator.exists ? actual !== undefined && actual !== null : actual === undefined || actual === null\n }\n\n if ('gte' in operator) {\n return Number(actual) >= operator.gte\n }\n\n if ('lte' in operator) {\n return Number(actual) <= operator.lte\n }\n\n return false\n}\n\nexport function operatorToString(operator: MatchOperator): string {\n if (typeof operator === 'string') return `equals \"${operator}\"`\n if ('equals' in operator) return `equals ${JSON.stringify(operator.equals)}`\n if ('contains' in operator) return `contains \"${operator.contains}\"`\n if ('not_contains' in operator) return `not_contains \"${operator.not_contains}\"`\n if ('matches' in operator) return `matches /${operator.matches}/`\n if ('in' in operator) return `in [${operator.in.map((v) => JSON.stringify(v)).join(', ')}]`\n if ('exists' in operator) return operator.exists ? 'exists' : 'does not exist'\n if ('gte' in operator) return `>= ${operator.gte}`\n if ('lte' in operator) return `<= ${operator.lte}`\n return JSON.stringify(operator)\n}\n",
|
|
98
98
|
"/**\n * Tool assertion graders.\n * Checks tool calls from traces against expected assertions.\n */\n\nimport type { ToolAssertion, ToolCall, GraderResult } from '../types'\nimport { matchValue, operatorToString } from './match'\n\nexport function gradeTools(toolCalls: ToolCall[], assertions: ToolAssertion[]): GraderResult[] {\n return assertions.map((assertion) => {\n // --- called ---\n if ('called' in assertion && !('not_called' in assertion) && !('call_order' in assertion)) {\n const matches = toolCalls.filter((tc) => tc.name === assertion.called)\n const wasCalled = matches.length > 0\n\n if (!wasCalled) {\n return {\n assertion: `tool called: ${assertion.called}`,\n pass: false,\n expected: `${assertion.called} was called`,\n actual: `Not called. Tools called: [${toolCalls.map((tc) => tc.name).join(', ') || 'none'}]`,\n }\n }\n\n // Check params if specified\n if (assertion.params) {\n const paramResults: { key: string; pass: boolean; detail: string }[] = []\n\n for (const [key, operator] of Object.entries(assertion.params)) {\n // Check across all matching calls — pass if any call matches\n const anyMatch = matches.some((tc) => matchValue(operator, tc.input[key]))\n paramResults.push({\n key,\n pass: anyMatch,\n detail: anyMatch\n ? `matched`\n : `expected ${key} ${operatorToString(operator)}, got ${JSON.stringify(matches.map((tc) => tc.input[key]))}`,\n })\n }\n\n const allParamsPass = paramResults.every((p) => p.pass)\n const failedParams = paramResults.filter((p) => !p.pass)\n\n return {\n assertion: `tool called: ${assertion.called} with params`,\n pass: allParamsPass,\n expected: `${assertion.called} called with ${Object.entries(assertion.params)\n .map(([k, v]) => `${k} ${operatorToString(v)}`)\n .join(', ')}`,\n actual: allParamsPass ? `Matched` : failedParams.map((p) => p.detail).join('; '),\n }\n }\n\n return {\n assertion: `tool called: ${assertion.called}`,\n pass: true,\n expected: `${assertion.called} was called`,\n actual: `Called ${matches.length} time(s)`,\n }\n }\n\n // --- not_called ---\n if ('not_called' in assertion) {\n const wasCalled = toolCalls.some((tc) => tc.name === assertion.not_called)\n return {\n assertion: `tool not_called: ${assertion.not_called}`,\n pass: !wasCalled,\n expected: `${assertion.not_called} was NOT called`,\n actual: wasCalled ? `Was called` : `Not called`,\n }\n }\n\n // --- call_order ---\n if ('call_order' in assertion) {\n const calledNames = toolCalls.map((tc) => tc.name)\n const expectedOrder = assertion.call_order as string[]\n\n // Check that the expected sequence appears in order (not necessarily contiguous)\n let cursor = 0\n for (const name of calledNames) {\n if (cursor < expectedOrder.length && name === expectedOrder[cursor]) {\n cursor++\n }\n }\n const inOrder = cursor === expectedOrder.length\n\n return {\n assertion: `call_order: [${expectedOrder.join(' → ')}]`,\n pass: inOrder,\n expected: `Tools called in order: [${expectedOrder.join(' → ')}]`,\n actual: `Actual order: [${calledNames.join(' → ') || 'none'}]`,\n }\n }\n\n return {\n assertion: 'unknown tool assertion',\n pass: false,\n expected: 'known assertion type',\n actual: `Unknown: ${JSON.stringify(assertion)}`,\n }\n })\n}\n",
|
|
99
|
-
"/**\n * State assertion graders.\n * Checks bot/user/conversation state via Botpress Client API.\n */\n\nimport type { Client as BpClient } from '@botpress/client'\nimport type { StateAssertion, EvalContext, GraderResult } from '../types'\n\n/**\n * Parse a state path like \"conversation.lastCity\" into its components.\n * ADK state names:\n * bot.* → type: \"bot\", name:
|
|
100
|
-
"/**\n * Table assertion graders.\n * Checks table row existence and counts via Botpress Client API.\n */\n\nimport type { Client as BpClient } from '@botpress/client'\nimport type { MatchOperator, TableAssertion, GraderResult } from '../types'\nimport { matchValue, operatorToString } from './match'\n\nfunction buildFilter(conditions: Record<string, MatchOperator>): Record<string, unknown> {\n const filter: Record<string, unknown> = {}\n\n for (const [column, op] of Object.entries(conditions)) {\n if (typeof op === 'string') {\n filter[column] = op\n } else if ('equals' in op) {\n filter[column] = op.equals\n } else if ('contains' in op) {\n filter[column] = { $regex: op.contains }\n } else if ('matches' in op) {\n filter[column] = { $regex: op.matches }\n } else if ('gte' in op) {\n filter[column] = { $gte: op.gte }\n } else if ('lte' in op) {\n filter[column] = { $lte: op.lte }\n }\n // Other operators fall back to client-side matching\n }\n\n return filter\n}\n\nasync function gradeRowExists(\n client: BpClient,\n assertion: Extract<TableAssertion, { row_exists: unknown }>\n): Promise<GraderResult> {\n const conditionDesc = Object.entries(assertion.row_exists)\n .map(([k, v]) => `${k} ${operatorToString(v)}`)\n .join(', ')\n\n try {\n const filter = buildFilter(assertion.row_exists)\n const result = await client.findTableRows({\n table: assertion.table,\n filter,\n limit: 10,\n })\n\n const rows = (result as any).rows || []\n\n const matchingRows = rows.filter((row: any) => {\n for (const [column, op] of Object.entries(assertion.row_exists)) {\n if (!matchValue(op, row[column])) return false\n }\n return true\n })\n\n const pass = matchingRows.length > 0\n\n return {\n assertion: `table: ${assertion.table} row_exists`,\n pass,\n expected: `Row exists in ${assertion.table} where ${conditionDesc}`,\n actual: pass ? `Found ${matchingRows.length} matching row(s)` : `No matching rows found`,\n }\n } catch (err) {\n return {\n assertion: `table: ${assertion.table} row_exists`,\n pass: false,\n expected: `Row exists in ${assertion.table} where ${conditionDesc}`,\n actual: `Error querying table: ${(err as Error).message}`,\n }\n }\n}\n\nasync function gradeRowCount(\n client: BpClient,\n assertion: Extract<TableAssertion, { row_count: unknown }>\n): Promise<GraderResult> {\n const countDesc = operatorToString(assertion.row_count)\n const whereDesc = assertion.where\n ? ` where ${Object.entries(assertion.where)\n .map(([k, v]) => `${k} ${operatorToString(v)}`)\n .join(', ')}`\n : ''\n\n try {\n const filter = assertion.where ? buildFilter(assertion.where) : {}\n const result = await client.findTableRows({\n table: assertion.table,\n filter,\n limit: 1000,\n })\n\n const rows = (result as any).rows || []\n\n let count: number\n if (assertion.where) {\n count = rows.filter((row: any) => {\n for (const [column, op] of Object.entries(assertion.where!)) {\n if (!matchValue(op, row[column])) return false\n }\n return true\n }).length\n } else {\n count = rows.length\n }\n\n const pass = matchValue(assertion.row_count, count)\n\n return {\n assertion: `table: ${assertion.table} row_count`,\n pass,\n expected: `Row count in ${assertion.table}${whereDesc} ${countDesc}`,\n actual: `Count: ${count}`,\n }\n } catch (err) {\n return {\n assertion: `table: ${assertion.table} row_count`,\n pass: false,\n expected: `Row count in ${assertion.table}${whereDesc} ${countDesc}`,\n actual: `Error querying table: ${(err as Error).message}`,\n }\n }\n}\n\nexport async function gradeTables(client: BpClient, assertions: TableAssertion[]): Promise<GraderResult[]> {\n const results: GraderResult[] = []\n\n for (const assertion of assertions) {\n if ('row_exists' in assertion) {\n results.push(await gradeRowExists(client, assertion))\n } else if ('row_count' in assertion) {\n results.push(await gradeRowCount(client, assertion))\n }\n }\n\n return results\n}\n",
|
|
101
|
-
"/**\n * Workflow assertion graders.\n * Checks workflow execution via trace spans.\n */\n\nimport type { Span } from '@botpress/runtime/internal'\nimport type { WorkflowAssertion, GraderResult } from '../types'\n\nexport function gradeWorkflows(spans: Span[], assertions: WorkflowAssertion[]): GraderResult[] {\n const results: GraderResult[] = []\n\n const data = (span: Span): Record<string, unknown> =>\n (span.data && typeof span.data === 'object' ? span.data : {}) as Record<string, unknown>\n\n for (const assertion of assertions) {\n const workflowSpans = spans.filter((span) => {\n const d = data(span)\n const wfName = d['workflow.name'] || d['workflowName']\n return wfName === assertion.name\n })\n\n // entered — was the workflow triggered at all?\n if (assertion.entered !== undefined) {\n const wasEntered = workflowSpans.length > 0\n const pass = assertion.entered ? wasEntered : !wasEntered\n\n results.push({\n assertion: `workflow: ${assertion.name} ${assertion.entered ? 'entered' : 'not entered'}`,\n pass,\n expected: assertion.entered\n ? `Workflow \"${assertion.name}\" was entered`\n : `Workflow \"${assertion.name}\" was not entered`,\n actual: wasEntered ? `Found ${workflowSpans.length} workflow span(s)` : `No workflow spans found`,\n })\n }\n\n // completed — did the workflow complete?\n if (assertion.completed !== undefined) {\n const completedSpans = workflowSpans.filter((span) => {\n const d = data(span)\n const status = d['workflow.status.final']\n return status === 'completed'
|
|
99
|
+
"/**\n * State assertion graders.\n * Checks bot/user/conversation state via Botpress Client API.\n */\n\nimport type { Client as BpClient } from '@botpress/client'\nimport { BUILT_IN_STATES } from '@botpress/runtime/internal'\nimport type { StateAssertion, EvalContext, GraderResult } from '../types'\n\n/**\n * Parse a state path like \"conversation.lastCity\" into its components.\n * ADK state names:\n * bot.* → type: \"bot\", name: BUILT_IN_STATES.bot, id: botId\n * user.* → type: \"user\", name: BUILT_IN_STATES.user, id: userId\n * conversation.* → type: \"conversation\", name: BUILT_IN_STATES.conversation, id: conversationId\n */\nfunction parseStatePath(path: string): {\n type: 'bot' | 'user' | 'conversation'\n stateName: string\n stateId: (ctx: EvalContext) => string\n field: string\n} {\n const dot = path.indexOf('.')\n if (dot === -1) {\n throw new Error(`Invalid state path \"${path}\" — expected \"type.field\" format`)\n }\n\n const prefix = path.slice(0, dot)\n const field = path.slice(dot + 1)\n\n switch (prefix) {\n case 'bot':\n return { type: 'bot', stateName: BUILT_IN_STATES.bot, stateId: (ctx) => ctx.botId, field }\n case 'user':\n return { type: 'user', stateName: BUILT_IN_STATES.user, stateId: (ctx) => ctx.userId, field }\n case 'conversation':\n return {\n type: 'conversation',\n stateName: BUILT_IN_STATES.conversation,\n stateId: (ctx) => ctx.conversationId,\n field,\n }\n default:\n throw new Error(`Unknown state type \"${prefix}\" in path \"${path}\" — expected bot, user, or conversation`)\n }\n}\n\nasync function fetchState(\n client: BpClient,\n type: 'bot' | 'user' | 'conversation',\n id: string,\n name: string\n): Promise<Record<string, unknown> | null> {\n try {\n const result = await client.getState({ type, id, name })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK state response type incomplete\n const payload = (result as any).state?.payload\n return payload?.value ?? payload ?? null\n } catch (err: unknown) {\n const code = err != null && typeof err === 'object' && 'code' in err ? (err as { code: unknown }).code : undefined\n const message = err instanceof Error ? err.message : ''\n if (code === 404 || message.includes('404') || message.includes(\"doesn't exist\")) {\n return null\n }\n throw err\n }\n}\n\nasync function fetchStateWithRetry(\n client: BpClient,\n type: 'bot' | 'user' | 'conversation',\n id: string,\n name: string,\n field: string,\n maxRetries = 3,\n retryDelay = 1000\n): Promise<Record<string, unknown> | null> {\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const payload = await fetchState(client, type, id, name)\n if (payload && payload[field] !== undefined) {\n return payload\n }\n if (attempt < maxRetries) {\n await new Promise((resolve) => setTimeout(resolve, retryDelay))\n }\n }\n return null\n}\n\n/**\n * Snapshot pre-conversation state values for `changed` assertions.\n * Conversation state is only snapshotted when a conversation already exists.\n */\nexport async function snapshotState(\n client: BpClient,\n assertions: StateAssertion[],\n ctx: EvalContext\n): Promise<Map<string, unknown>> {\n const snapshots = new Map<string, unknown>()\n\n for (const assertion of assertions) {\n if (assertion.changed === undefined) continue\n\n const parsed = parseStatePath(assertion.path)\n if (parsed.type === 'conversation' && !ctx.conversationId) continue\n\n const payload = await fetchState(client, parsed.type, parsed.stateId(ctx), parsed.stateName)\n snapshots.set(assertion.path, payload ? payload[parsed.field] : undefined)\n }\n\n return snapshots\n}\n\n/**\n * Grade state assertions.\n */\nexport async function gradeState(\n client: BpClient,\n assertions: StateAssertion[],\n ctx: EvalContext,\n preSnapshots?: Map<string, unknown>\n): Promise<GraderResult[]> {\n const results: GraderResult[] = []\n\n for (const assertion of assertions) {\n const parsed = parseStatePath(assertion.path)\n const stateId = parsed.stateId(ctx)\n\n let payload: Record<string, unknown> | null\n try {\n payload = await fetchStateWithRetry(client, parsed.type, stateId, parsed.stateName, parsed.field)\n } catch (err) {\n results.push({\n assertion: `state: ${assertion.path}`,\n pass: false,\n expected: `Fetch state for ${assertion.path}`,\n actual: `Error fetching state: ${(err as Error).message}`,\n })\n continue\n }\n\n const actualValue = payload ? payload[parsed.field] : undefined\n\n if (assertion.equals !== undefined) {\n const pass = deepEqual(actualValue, assertion.equals)\n results.push({\n assertion: `state: ${assertion.path} equals`,\n pass,\n expected: JSON.stringify(assertion.equals),\n actual: JSON.stringify(actualValue),\n })\n }\n\n if (assertion.changed !== undefined) {\n const preValue = preSnapshots?.get(assertion.path)\n const didChange = !deepEqual(actualValue, preValue)\n const pass = assertion.changed ? didChange : !didChange\n\n results.push({\n assertion: `state: ${assertion.path} ${assertion.changed ? 'changed' : 'unchanged'}`,\n pass,\n expected: assertion.changed\n ? `Value changed from ${JSON.stringify(preValue)}`\n : `Value unchanged from ${JSON.stringify(preValue)}`,\n actual: didChange ? `Changed to ${JSON.stringify(actualValue)}` : `Unchanged: ${JSON.stringify(actualValue)}`,\n })\n }\n }\n\n return results\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (a === null || b === null) return false\n if (typeof a !== typeof b) return false\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((v, i) => deepEqual(v, b[i]))\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a as object)\n const keysB = Object.keys(b as object)\n if (keysA.length !== keysB.length) return false\n return keysA.every((k) => deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]))\n }\n\n return false\n}\n",
|
|
100
|
+
"/**\n * Table assertion graders.\n * Checks table row existence and counts via Botpress Client API.\n */\n\nimport type { Client as BpClient } from '@botpress/client'\nimport type { MatchOperator, TableAssertion, GraderResult } from '../types'\nimport { matchValue, operatorToString } from './match'\n\nfunction buildFilter(conditions: Record<string, MatchOperator>): Record<string, unknown> {\n const filter: Record<string, unknown> = {}\n\n for (const [column, op] of Object.entries(conditions)) {\n if (typeof op === 'string') {\n filter[column] = op\n } else if ('equals' in op) {\n filter[column] = op.equals\n } else if ('contains' in op) {\n filter[column] = { $regex: op.contains }\n } else if ('matches' in op) {\n filter[column] = { $regex: op.matches }\n } else if ('gte' in op) {\n filter[column] = { $gte: op.gte }\n } else if ('lte' in op) {\n filter[column] = { $lte: op.lte }\n }\n // Other operators fall back to client-side matching\n }\n\n return filter\n}\n\nasync function gradeRowExists(\n client: BpClient,\n assertion: Extract<TableAssertion, { row_exists: unknown }>\n): Promise<GraderResult> {\n const conditionDesc = Object.entries(assertion.row_exists)\n .map(([k, v]) => `${k} ${operatorToString(v)}`)\n .join(', ')\n\n try {\n const filter = buildFilter(assertion.row_exists)\n const result = await client.findTableRows({\n table: assertion.table,\n filter,\n limit: 10,\n })\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Botpress client API response shape not fully typed\n const rows = (result as any).rows || []\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- table row shape is dynamic\n const matchingRows = rows.filter((row: any) => {\n for (const [column, op] of Object.entries(assertion.row_exists)) {\n if (!matchValue(op, row[column])) return false\n }\n return true\n })\n\n const pass = matchingRows.length > 0\n\n return {\n assertion: `table: ${assertion.table} row_exists`,\n pass,\n expected: `Row exists in ${assertion.table} where ${conditionDesc}`,\n actual: pass ? `Found ${matchingRows.length} matching row(s)` : `No matching rows found`,\n }\n } catch (err) {\n return {\n assertion: `table: ${assertion.table} row_exists`,\n pass: false,\n expected: `Row exists in ${assertion.table} where ${conditionDesc}`,\n actual: `Error querying table: ${(err as Error).message}`,\n }\n }\n}\n\nasync function gradeRowCount(\n client: BpClient,\n assertion: Extract<TableAssertion, { row_count: unknown }>\n): Promise<GraderResult> {\n const countDesc = operatorToString(assertion.row_count)\n const whereDesc = assertion.where\n ? ` where ${Object.entries(assertion.where)\n .map(([k, v]) => `${k} ${operatorToString(v)}`)\n .join(', ')}`\n : ''\n\n try {\n const filter = assertion.where ? buildFilter(assertion.where) : {}\n const result = await client.findTableRows({\n table: assertion.table,\n filter,\n limit: 1000,\n })\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Botpress client API response shape not fully typed\n const rows = (result as any).rows || []\n\n let count: number\n if (assertion.where) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- table row shape is dynamic\n count = rows.filter((row: any) => {\n for (const [column, op] of Object.entries(assertion.where!)) {\n if (!matchValue(op, row[column])) return false\n }\n return true\n }).length\n } else {\n count = rows.length\n }\n\n const pass = matchValue(assertion.row_count, count)\n\n return {\n assertion: `table: ${assertion.table} row_count`,\n pass,\n expected: `Row count in ${assertion.table}${whereDesc} ${countDesc}`,\n actual: `Count: ${count}`,\n }\n } catch (err) {\n return {\n assertion: `table: ${assertion.table} row_count`,\n pass: false,\n expected: `Row count in ${assertion.table}${whereDesc} ${countDesc}`,\n actual: `Error querying table: ${(err as Error).message}`,\n }\n }\n}\n\nexport async function gradeTables(client: BpClient, assertions: TableAssertion[]): Promise<GraderResult[]> {\n const results: GraderResult[] = []\n\n for (const assertion of assertions) {\n if ('row_exists' in assertion) {\n results.push(await gradeRowExists(client, assertion))\n } else if ('row_count' in assertion) {\n results.push(await gradeRowCount(client, assertion))\n }\n }\n\n return results\n}\n",
|
|
101
|
+
"/**\n * Workflow assertion graders.\n * Checks workflow execution via trace spans.\n */\n\nimport type { Span } from '@botpress/runtime/internal'\nimport type { WorkflowAssertion, GraderResult } from '../types'\n\nexport function gradeWorkflows(spans: Span[], assertions: WorkflowAssertion[]): GraderResult[] {\n const results: GraderResult[] = []\n\n const data = (span: Span): Record<string, unknown> =>\n (span.data && typeof span.data === 'object' ? span.data : {}) as Record<string, unknown>\n\n for (const assertion of assertions) {\n const workflowSpans = spans.filter((span) => {\n const d = data(span)\n const wfName = d['workflow.name'] || d['workflowName']\n return wfName === assertion.name\n })\n\n // entered — was the workflow triggered at all?\n if (assertion.entered !== undefined) {\n const wasEntered = workflowSpans.length > 0\n const pass = assertion.entered ? wasEntered : !wasEntered\n\n results.push({\n assertion: `workflow: ${assertion.name} ${assertion.entered ? 'entered' : 'not entered'}`,\n pass,\n expected: assertion.entered\n ? `Workflow \"${assertion.name}\" was entered`\n : `Workflow \"${assertion.name}\" was not entered`,\n actual: wasEntered ? `Found ${workflowSpans.length} workflow span(s)` : `No workflow spans found`,\n })\n }\n\n // completed — did the workflow complete?\n if (assertion.completed !== undefined) {\n const completedSpans = workflowSpans.filter((span) => {\n const d = data(span)\n const status = d['workflow.status.final']\n return (\n status === 'completed' ||\n ((span.status === 'ok' || span.status === 'error') && span.name?.includes('workflow'))\n )\n })\n const didComplete = completedSpans.length > 0\n const pass = assertion.completed ? didComplete : !didComplete\n\n results.push({\n assertion: `workflow: ${assertion.name} ${assertion.completed ? 'completed' : 'not completed'}`,\n pass,\n expected: assertion.completed\n ? `Workflow \"${assertion.name}\" completed`\n : `Workflow \"${assertion.name}\" did not complete`,\n actual: didComplete ? `Completed` : `Not completed`,\n })\n }\n }\n\n return results\n}\n",
|
|
102
|
+
"/**\n * Timing assertion graders.\n * Checks bot response duration against expected thresholds.\n */\n\nimport type { TimingAssertion, GraderResult } from '../types'\nimport { matchValue, operatorToString } from './match'\n\nexport function gradeTiming(botDuration: number, assertions: TimingAssertion[]): GraderResult[] {\n const results: GraderResult[] = []\n\n for (const assertion of assertions) {\n const pass = matchValue(assertion.response_time, botDuration)\n const expected = operatorToString(assertion.response_time)\n\n results.push({\n assertion: `response_time ${expected}`,\n pass,\n expected: `Response time ${expected}`,\n actual: `${botDuration}ms`,\n })\n }\n\n return results\n}\n",
|
|
102
103
|
"/**\n * Outcome assertion orchestrator.\n * Runs state, table, and workflow graders after all conversation turns complete.\n */\n\nimport type { Client as BpClient } from '@botpress/client'\nimport type { Span } from '@botpress/runtime/internal'\nimport type { EvalDefinition, EvalContext, GraderResult } from '../types'\nimport { gradeState, snapshotState } from './state'\nimport { gradeTables } from './tables'\nimport { gradeWorkflows } from './workflow'\n\n/**\n * Snapshot pre-conversation state for `changed` assertions.\n * Call this BEFORE the conversation starts.\n */\nexport async function snapshotOutcomeState(\n client: BpClient,\n evalDef: EvalDefinition,\n ctx: EvalContext\n): Promise<Map<string, unknown>> {\n if (!evalDef.outcome?.state) {\n return new Map()\n }\n return snapshotState(client, evalDef.outcome.state, ctx)\n}\n\n/**\n * Grade all outcome assertions after the conversation completes.\n */\nexport async function gradeOutcome(\n client: BpClient,\n evalDef: EvalDefinition,\n ctx: EvalContext,\n traceSpans: Span[],\n preSnapshots?: Map<string, unknown>\n): Promise<GraderResult[]> {\n const outcome = evalDef.outcome\n if (!outcome) return []\n\n const results: GraderResult[] = []\n\n if (outcome.state && outcome.state.length > 0) {\n const stateResults = await gradeState(client, outcome.state, ctx, preSnapshots)\n results.push(...stateResults)\n }\n\n if (outcome.tables && outcome.tables.length > 0) {\n const tableResults = await gradeTables(client, outcome.tables)\n results.push(...tableResults)\n }\n\n if (outcome.workflow && outcome.workflow.length > 0) {\n const workflowResults = gradeWorkflows(traceSpans, outcome.workflow)\n results.push(...workflowResults)\n }\n\n return results\n}\n",
|
|
103
104
|
"/**\n * Eval results store.\n * Persists run results as JSON files in .adk/evals/runs/.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync } from 'fs'\nimport { join } from 'path'\nimport type { EvalRunReport } from './types'\n\nfunction getRunsDir(agentPath: string): string {\n const dir = join(agentPath, '.adk', 'evals', 'runs')\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n return dir\n}\n\nexport function saveRunResult(agentPath: string, report: EvalRunReport): string {\n const dir = getRunsDir(agentPath)\n const filename = `${report.timestamp.replace(/[:.]/g, '-')}-${report.id}.json`\n const filepath = join(dir, filename)\n writeFileSync(filepath, JSON.stringify(report, null, 2))\n return filepath\n}\n\nexport function loadRunResult(agentPath: string, runId: string): EvalRunReport | null {\n const dir = getRunsDir(agentPath)\n const files = readdirSync(dir).filter((f) => f.endsWith('.json'))\n\n for (const file of files) {\n if (file.includes(runId)) {\n const filepath = join(dir, file)\n return JSON.parse(readFileSync(filepath, 'utf-8')) as EvalRunReport\n }\n }\n\n return null\n}\n\nexport function listRunResults(agentPath: string, limit = 50): EvalRunReport[] {\n const dir = getRunsDir(agentPath)\n if (!existsSync(dir)) return []\n\n const files = readdirSync(dir)\n .filter((f) => f.endsWith('.json'))\n .sort()\n .reverse()\n .slice(0, limit)\n\n return files.map((file) => {\n const filepath = join(dir, file)\n return JSON.parse(readFileSync(filepath, 'utf-8')) as EvalRunReport\n })\n}\n\nexport function getLatestRun(agentPath: string): EvalRunReport | null {\n const runs = listRunResults(agentPath, 1)\n return runs[0] || null\n}\n"
|
|
104
105
|
],
|
|
105
|
-
"mappings": "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",
|
|
106
|
-
"debugId": "
|
|
106
|
+
"mappings": "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",
|
|
107
|
+
"debugId": "E3104143A79BCF1564756E2164756E21",
|
|
107
108
|
"names": []
|
|
108
109
|
}
|