@aifabrix/builder 2.49.2 → 2.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
- package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
- package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
- package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
- package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
- package/.cursor/skills/README.md +1 -0
- package/.dockerignore +52 -0
- package/.eslintignore +22 -0
- package/README.md +2 -0
- package/bin/builder-api-cleanup.js +26 -0
- package/bin/builder-api-nest.js +10 -0
- package/bin/builder-api-spike.js +19 -0
- package/enterprise-knowledge/README.md +50 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
- package/integration/README.md +81 -0
- package/integration/github/README.md +53 -0
- package/integration/github/application.json +21 -0
- package/integration/github/deploy.js +72 -0
- package/integration/github/env.template +11 -0
- package/integration/github/github-datasource-issue-comments.json +239 -0
- package/integration/github/github-datasource-issues.json +399 -0
- package/integration/github/github-datasource-repository.json +354 -0
- package/integration/github/github-deploy.json +1202 -0
- package/integration/github/github-system.json +82 -0
- package/integration/hubspot-test/README.md +1 -1
- package/jest.isolated-projects.js +31 -1
- package/jest.projects.js +87 -1
- package/lib/api/dev-server-https.js +1 -1
- package/lib/api/enterprise-knowledge.api.js +63 -0
- package/lib/api/evidence.api.js +172 -0
- package/lib/api/external-systems.api.js +8 -2
- package/lib/api/resource-types.api.js +1 -0
- package/lib/api/types/enterprise-knowledge.types.js +46 -0
- package/lib/api/types/evidence.types.js +67 -0
- package/lib/api/types/resource-types.types.js +2 -0
- package/lib/app/controller-application-filter.js +36 -0
- package/lib/app/deploy.js +1 -1
- package/lib/app/list-external-systems.js +130 -0
- package/lib/app/list.js +20 -8
- package/lib/app/run.js +3 -1
- package/lib/app/show-display.js +8 -3
- package/lib/app/show-online.js +178 -0
- package/lib/app/show.js +37 -88
- package/lib/build/builder-api-docker-staging.js +47 -0
- package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
- package/lib/build/standard-docker-build.js +2 -0
- package/lib/certification/post-unified-cert-sync.js +4 -31
- package/lib/certification/sync-after-external-command.js +0 -1
- package/lib/certification/sync-system-certification.js +0 -3
- package/lib/channels/add-channel.js +40 -34
- package/lib/channels/approval-guides/chatgpt.js +33 -0
- package/lib/channels/approval-guides/credential-portal.js +38 -0
- package/lib/channels/approval-guides/index.js +110 -0
- package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
- package/lib/channels/approval-guides/slack.js +34 -0
- package/lib/channels/approval-guides/teams-bot.js +35 -0
- package/lib/channels/approval-guides/web-embed.js +32 -0
- package/lib/channels/channel-approval-guide.js +11 -0
- package/lib/channels/channel-artifact-generator.js +16 -4
- package/lib/channels/channel-audit.js +3 -0
- package/lib/channels/channel-auth-context.js +1 -1
- package/lib/channels/channel-description.js +59 -0
- package/lib/channels/channel-integration-generator.js +13 -230
- package/lib/channels/channel-integration-template.js +94 -0
- package/lib/channels/channel-runtime-resolver.js +43 -3
- package/lib/channels/channel-status-display.js +66 -26
- package/lib/channels/channel-targets.js +3 -3
- package/lib/cli/index.js +27 -3
- package/lib/cli/infra-guided.js +5 -1
- package/lib/cli/setup-app-external-create.js +111 -0
- package/lib/cli/setup-app.help.js +1 -1
- package/lib/cli/setup-app.js +38 -125
- package/lib/cli/setup-app.test-commands.js +26 -52
- package/lib/cli/setup-certification-commands.js +4 -4
- package/lib/cli/setup-certification.help.js +9 -9
- package/lib/cli/setup-dev.js +7 -2
- package/lib/cli/setup-external-system-help.js +4 -6
- package/lib/cli/setup-external-system.js +58 -52
- package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
- package/lib/cli/setup-infra-up-platform-action.js +3 -1
- package/lib/cli/setup-infra.js +15 -0
- package/lib/cli/setup-list.js +43 -0
- package/lib/cli/setup-utility-repair.js +26 -7
- package/lib/cli/setup-utility.js +5 -3
- package/lib/commands/app.js +15 -43
- package/lib/commands/channel-add-setup.js +110 -0
- package/lib/commands/channel.js +42 -8
- package/lib/commands/datasource-sync-display.js +96 -0
- package/lib/commands/datasource-sync-policy.js +210 -0
- package/lib/commands/datasource-test-trust-cli.js +6 -6
- package/lib/commands/datasource-unified-test-cli.js +2 -1
- package/lib/commands/datasource-unified-test-cli.options.js +33 -23
- package/lib/commands/deploy-gate-failure-details.js +163 -0
- package/lib/commands/deploy-gate-orchestrator.js +322 -0
- package/lib/commands/dev-cli-handlers.js +1 -59
- package/lib/commands/dev-host-ops-params.js +91 -0
- package/lib/commands/dev-host-ops-poll.js +111 -0
- package/lib/commands/dev-host-ops.js +107 -94
- package/lib/commands/dev-init.js +3 -1
- package/lib/commands/enterprise-knowledge.js +284 -0
- package/lib/commands/evidence-cli-leaves.js +250 -0
- package/lib/commands/evidence.js +51 -0
- package/lib/commands/governance-cli-shared.js +2 -2
- package/lib/commands/governance-command-action.js +2 -2
- package/lib/commands/governance-fixture-subjects.js +85 -0
- package/lib/commands/governance.js +1 -1
- package/lib/commands/lifecycle-command-action.js +2 -2
- package/lib/commands/lifecycle-external.js +3 -3
- package/lib/commands/manifest-cli-auth.js +29 -0
- package/lib/commands/manifest-cli-commands.js +170 -0
- package/lib/commands/manifest-cli-integration-path.js +63 -0
- package/lib/commands/manifest.js +21 -0
- package/lib/commands/protection-cli-leaves.js +3 -3
- package/lib/commands/repair-auth-apply.js +15 -1
- package/lib/commands/repair-authentications-454.js +169 -0
- package/lib/commands/repair-capability-openapi-warnings.js +126 -0
- package/lib/commands/repair-datasource-apply.js +135 -0
- package/lib/commands/repair-datasource-auto-rbac.js +62 -1
- package/lib/commands/repair-datasource-http-service-contract.js +239 -0
- package/lib/commands/repair-datasource-operation-security.js +180 -0
- package/lib/commands/repair-datasource-run.js +7 -2
- package/lib/commands/repair-datasource-sync-operations.js +177 -0
- package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
- package/lib/commands/repair-datasource.js +12 -68
- package/lib/commands/repair-env-template.js +11 -1
- package/lib/commands/repair-external-run.js +121 -31
- package/lib/commands/repair-internal.js +1 -1
- package/lib/commands/repair-openapi-export.js +156 -0
- package/lib/commands/repair-openapi-sync.js +19 -2
- package/lib/commands/repair-orchestration-datasource-split.js +259 -0
- package/lib/commands/repair-persist.js +22 -1
- package/lib/commands/repair-rbac-platform-preset.js +204 -0
- package/lib/commands/repair-rbac-reader-roles.js +191 -0
- package/lib/commands/repair-rbac.js +163 -86
- package/lib/commands/repair-steps.js +83 -18
- package/lib/commands/repair-system-permissions.js +1 -0
- package/lib/commands/repair.js +1 -1
- package/lib/commands/resource-type.js +65 -26
- package/lib/commands/run-post-publish-data-sync.js +68 -0
- package/lib/commands/setup-modes.js +1 -1
- package/lib/commands/test-e2e-external.js +21 -8
- package/lib/commands/test-governance-cli-options.js +2 -2
- package/lib/commands/test-trust-cli-options.js +2 -2
- package/lib/commands/up-builder-api-bootstrap.js +71 -0
- package/lib/commands/up-builder-api-provision.js +241 -0
- package/lib/commands/up-builder-api.js +88 -0
- package/lib/commands/up-common.js +25 -1
- package/lib/commands/upload-credential-push-log.js +117 -0
- package/lib/commands/upload-data-sync-finalize.js +60 -0
- package/lib/commands/upload-probe.js +66 -0
- package/lib/commands/upload-publish-context.js +4 -1
- package/lib/commands/upload-sidecar-followups.js +55 -27
- package/lib/commands/upload.js +116 -157
- package/lib/commands/verify-governance-combined-external.js +1 -1
- package/lib/commands/verify-governance-db.js +2 -2
- package/lib/commands/verify-operations-command-action.js +2 -2
- package/lib/commands/verify-operations-step-plan.js +2 -2
- package/lib/commands/verify-operations-steps.js +2 -2
- package/lib/commands/verify-trust-command-action.js +1 -1
- package/lib/commands/wizard-core.js +1 -1
- package/lib/commands/wizard-headless.js +2 -1
- package/lib/core/admin-secrets.js +2 -6
- package/lib/core/secrets-env-content.js +10 -4
- package/lib/core/secrets-env-write.js +2 -13
- package/lib/datasource/agent-trust-run.js +3 -3
- package/lib/datasource/deploy.js +3 -1
- package/lib/datasource/test-e2e.js +6 -1
- package/lib/datasource/unified-validation-run-body.js +4 -1
- package/lib/datasource/unified-validation-run.js +1 -1
- package/lib/deployment/deploy-poll-ui.js +73 -12
- package/lib/deployment/deployer-poll-run.js +113 -0
- package/lib/deployment/deployer.js +17 -87
- package/lib/evidence/dataplane-context.js +21 -0
- package/lib/evidence/evidence-display.js +78 -0
- package/lib/evidence/evidence-service.js +392 -0
- package/lib/external-system/deploy.js +290 -112
- package/lib/external-system/download.js +7 -3
- package/lib/external-system/test-execution.js +1 -1
- package/lib/external-system/test-system-level.js +8 -10
- package/lib/external-system/test.js +12 -6
- package/lib/generator/deploy-script.js +73 -0
- package/lib/generator/external.js +2 -1
- package/lib/generator/index.js +17 -2
- package/lib/generator/wizard.js +3 -36
- package/lib/internal/fs-real-sync.js +22 -1
- package/lib/internal/node-fs.js +2 -0
- package/lib/lifecycle/lifecycle-governance-options.js +1 -1
- package/lib/lifecycle/verify-step-progress.js +1 -1
- package/lib/programmatic/access-log.js +26 -0
- package/lib/programmatic/auth-config.js +44 -0
- package/lib/programmatic/bearer-auth.js +176 -0
- package/lib/programmatic/builder-api-request.js +175 -0
- package/lib/programmatic/builder-api-route-dispatch.js +82 -0
- package/lib/programmatic/builder-api-runtime-config.js +42 -0
- package/lib/programmatic/builder-api-server.js +230 -0
- package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
- package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
- package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
- package/lib/programmatic/builder-help-envelope.js +36 -0
- package/lib/programmatic/builder-help-fixtures.js +200 -0
- package/lib/programmatic/builder-help-governance.js +172 -0
- package/lib/programmatic/builder-help-schema-catalog.js +92 -0
- package/lib/programmatic/builder-help.js +361 -0
- package/lib/programmatic/capability-registry.js +77 -0
- package/lib/programmatic/command-options.js +32 -0
- package/lib/programmatic/enterprise-mcp-client.js +98 -0
- package/lib/programmatic/http-problem-details.js +99 -0
- package/lib/programmatic/http-route-match.js +40 -0
- package/lib/programmatic/idempotency-cache.js +69 -0
- package/lib/programmatic/index.js +53 -0
- package/lib/programmatic/integration-path-scope.js +39 -0
- package/lib/programmatic/log-redaction.js +66 -0
- package/lib/programmatic/manifest-get-section.js +146 -0
- package/lib/programmatic/manifest-patch-section.js +252 -0
- package/lib/programmatic/manifest-repair.js +122 -0
- package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
- package/lib/programmatic/manifest-section-io.js +225 -0
- package/lib/programmatic/manifest-section-quality.js +171 -0
- package/lib/programmatic/manifest-section-registry-data.js +269 -0
- package/lib/programmatic/manifest-section-registry.js +205 -0
- package/lib/programmatic/nest-http-bridge.js +34 -0
- package/lib/programmatic/openapi-component-schemas.js +68 -0
- package/lib/programmatic/openapi-description-enricher.js +117 -0
- package/lib/programmatic/openapi-descriptions.js +190 -0
- package/lib/programmatic/openapi-docs-serving.js +123 -0
- package/lib/programmatic/openapi-help-schemas.js +63 -0
- package/lib/programmatic/openapi-manifest-schemas.js +141 -0
- package/lib/programmatic/openapi-operation-bindings.js +274 -0
- package/lib/programmatic/openapi-request-schemas.js +155 -0
- package/lib/programmatic/openapi-result-schemas.js +476 -0
- package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
- package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
- package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
- package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
- package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
- package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
- package/lib/programmatic/openapi-schema-helpers.js +93 -0
- package/lib/programmatic/openapi-spec.js +203 -0
- package/lib/programmatic/orchestration-openapi-meta.js +159 -0
- package/lib/programmatic/platform-rbac-catalog.js +90 -0
- package/lib/programmatic/request-timeout.js +53 -0
- package/lib/programmatic/route-handler-map.js +143 -0
- package/lib/programmatic/route-handlers-context.js +29 -0
- package/lib/programmatic/route-handlers.js +33 -0
- package/lib/programmatic/run-certify.js +57 -0
- package/lib/programmatic/run-enterprise-mcp.js +32 -0
- package/lib/programmatic/run-lifecycle.js +29 -0
- package/lib/programmatic/run-repair.js +41 -0
- package/lib/programmatic/run-repository-emcp.js +54 -0
- package/lib/programmatic/run-template-workspace.js +61 -0
- package/lib/programmatic/run-test.js +49 -0
- package/lib/programmatic/run-upload.js +63 -0
- package/lib/programmatic/run-validate.js +53 -0
- package/lib/programmatic/run-wizard.js +40 -0
- package/lib/programmatic/system-key.js +48 -0
- package/lib/programmatic/wizard-config-normalize.js +118 -0
- package/lib/programmatic/workspace-cleanup.js +128 -0
- package/lib/programmatic/workspace-context.js +145 -0
- package/lib/programmatic/workspace-lock.js +75 -0
- package/lib/programmatic/workspace-meta.js +64 -0
- package/lib/programmatic/workspace-ops.js +149 -0
- package/lib/protection/run-commands-upload-sync.js +35 -0
- package/lib/protection/run-commands.js +2 -20
- package/lib/protection/upload-batch.js +11 -7
- package/lib/resolvers/resource-type-file.js +22 -0
- package/lib/schema/external-datasource.schema.json +161 -1
- package/lib/schema/external-system.schema.json +244 -118
- package/lib/schema/flag-map-validation-run.json +3 -0
- package/lib/schema/type/credential-field-registry.json +2 -2
- package/lib/schema/type/document-storage.json +9 -0
- package/lib/utils/agent-trust-run-display.js +1 -1
- package/lib/utils/app-path-resolve.js +168 -0
- package/lib/utils/authentication-env-template.js +222 -0
- package/lib/utils/cli-sync-options.js +7 -11
- package/lib/utils/cli-utils.js +4 -0
- package/lib/utils/cli-workspace-options.js +29 -0
- package/lib/utils/compose-generate-docker-compose.js +102 -0
- package/lib/utils/configuration-env-resolver.js +203 -27
- package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
- package/lib/utils/datasource-test-run-certification-debug.js +130 -0
- package/lib/utils/datasource-test-run-debug-display.js +2 -0
- package/lib/utils/datasource-test-run-debug-slice.js +7 -0
- package/lib/utils/datasource-test-run-display.js +2 -1
- package/lib/utils/dev-init-ssh-merge.js +165 -23
- package/lib/utils/dev-pin-share-instructions.js +110 -0
- package/lib/utils/dev-ssh-config-helper.js +177 -33
- package/lib/utils/enterprise-knowledge-paths.js +142 -0
- package/lib/utils/env-copy.js +2 -1
- package/lib/utils/env-dotenv-format.js +103 -0
- package/lib/utils/external-env-template.js +4 -1
- package/lib/utils/external-system-display.js +5 -1
- package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
- package/lib/utils/external-system-readiness-compact-display.js +324 -0
- package/lib/utils/external-system-readiness-core.js +16 -0
- package/lib/utils/external-system-readiness-deploy-display.js +29 -11
- package/lib/utils/external-system-readiness-display-internals.js +3 -1
- package/lib/utils/external-system-readiness-display.js +20 -30
- package/lib/utils/external-system-system-test-tty-certification.js +135 -0
- package/lib/utils/external-system-system-test-tty.js +5 -41
- package/lib/utils/help-builder.js +6 -1
- package/lib/utils/host-ops-job-labels.js +236 -0
- package/lib/utils/host-ops-job-result.js +61 -0
- package/lib/utils/host-ops-poll-ui.js +163 -0
- package/lib/utils/integration-path-resolve.js +112 -0
- package/lib/utils/paths-reload-source.js +148 -0
- package/lib/utils/paths-system-builder-keys.js +25 -0
- package/lib/utils/paths.js +151 -26
- package/lib/utils/runtime-configuration-values.js +64 -2
- package/lib/utils/secrets-helpers.js +5 -1
- package/lib/utils/ssh-known-hosts.js +130 -0
- package/lib/utils/test-target-cli-options.js +75 -0
- package/lib/utils/upload-sync-options.js +4 -0
- package/lib/utils/validation-run-request.js +11 -2
- package/lib/validation/external-manifest-validator.js +11 -1
- package/lib/validation/openapi-contract-surface-validator.js +426 -0
- package/lib/validation/openapi-contract-vendor-validation.js +238 -0
- package/lib/validation/validate-external-file.js +160 -0
- package/lib/validation/validate.js +6 -117
- package/package.json +46 -29
- package/packages/builder-api/README.md +120 -0
- package/packages/builder-api/package.json +30 -0
- package/packages/builder-api/src/app.module.ts +7 -0
- package/packages/builder-api/src/auth/auth.module.ts +5 -0
- package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
- package/packages/builder-api/src/main.ts +16 -0
- package/packages/builder-api/tsconfig.json +15 -0
- package/scripts/check-builder-api-architecture-grep.js +79 -0
- package/scripts/docker_image_content_gate.js +47 -0
- package/scripts/docker_image_content_gate.sh +5 -0
- package/scripts/export-builder-api-evidence.js +262 -0
- package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
- package/scripts/lib/builder-api-docker-staging-core.js +183 -0
- package/scripts/lib/docker-image-content-gate-core.js +166 -0
- package/scripts/lib/plan-actor.js +109 -0
- package/scripts/lib/plan-config.js +20 -0
- package/scripts/lib/plan-gates.js +154 -0
- package/scripts/lib/plan-meta.js +104 -0
- package/scripts/lib/plan-parse.js +162 -0
- package/scripts/lib/plan-prevalidate-gates.js +326 -0
- package/scripts/lib/plan-run-core.js +125 -0
- package/scripts/lib/plan-run-report.js +108 -0
- package/scripts/plan-approve.js +24 -0
- package/scripts/plan-archive.js +49 -0
- package/scripts/plan-run.js +13 -0
- package/scripts/plan-set-actor.js +21 -0
- package/scripts/plan-validate.js +80 -0
- package/scripts/pnpm/af.mjs +110 -0
- package/scripts/pnpm/check-quiet.mjs +32 -0
- package/scripts/pnpm/dev-install.mjs +29 -0
- package/scripts/pnpm/dev-reload.mjs +18 -0
- package/scripts/pnpm/help.mjs +55 -0
- package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
- package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
- package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
- package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
- package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
- package/scripts/pnpm/lib/spinner.mjs +42 -0
- package/scripts/stage_builder_api_for_docker.js +65 -0
- package/scripts/sync-builder-api-template.js +44 -0
- package/templates/README.md +3 -0
- package/templates/applications/builder-api/Dockerfile +38 -0
- package/templates/applications/builder-api/application.yaml +75 -0
- package/templates/applications/builder-api/env.template +48 -0
- package/templates/applications/dataplane/application.yaml +1 -1
- package/templates/applications/dataplane/env.template +10 -6
- package/templates/applications/dataplane/rbac.yaml +21 -1
- package/templates/applications/miso-controller/application.yaml +1 -1
- package/templates/applications/miso-controller/env.template +1 -3
- package/templates/channels/README.md +18 -0
- package/templates/channels/ai-fabrix-icon.jpg +0 -0
- package/templates/channels/chatgpt/install.template.md.hbs +21 -24
- package/templates/channels/chatgpt/integration/README.md +11 -0
- package/templates/channels/chatgpt/integration/application.json +15 -0
- package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
- package/templates/channels/chatgpt/integration/env.template +4 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
- package/templates/channels/microsoft-copilot/integration/README.md +11 -0
- package/templates/channels/microsoft-copilot/integration/application.json +15 -0
- package/templates/channels/microsoft-copilot/integration/env.template +6 -0
- package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
- package/templates/channels/slack/install.template.md.hbs +48 -18
- package/templates/channels/slack/integration/README.md +38 -0
- package/templates/channels/slack/integration/application.json +18 -0
- package/templates/channels/slack/integration/env.template +29 -0
- package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
- package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
- package/templates/channels/slack/integration/slack-system.json +86 -0
- package/templates/channels/slack/manifest.template.json.hbs +20 -10
- package/templates/channels/teams-bot/install.template.md.hbs +31 -17
- package/templates/channels/teams-bot/integration/README.md +18 -0
- package/templates/channels/teams-bot/integration/application.json +17 -0
- package/templates/channels/teams-bot/integration/env.template +5 -0
- package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
- package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
- package/templates/channels/web-embed/install.template.md.hbs +16 -26
- package/templates/channels/web-embed/integration/README.md +11 -0
- package/templates/channels/web-embed/integration/application.json +15 -0
- package/templates/channels/web-embed/integration/env.template +4 -0
- package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
- package/templates/openapi/redoc_page.html +86 -0
- package/templates/python/docker-compose.hbs +11 -0
- package/templates/python/requirements.txt +1 -1
- package/templates/typescript/docker-compose.hbs +11 -0
- package/lib/certification/cli-cert-sync-skip.js +0 -21
|
@@ -19,7 +19,7 @@ const { logOfflinePathWhenType } = require('../utils/cli-utils');
|
|
|
19
19
|
const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
|
|
20
20
|
const { getExternalSystem } = require('../api/external-systems.api');
|
|
21
21
|
const { listDatasources } = require('../api/datasources-core.api');
|
|
22
|
-
const { testSystemViaPipeline } = require('../api/pipeline.api');
|
|
22
|
+
const { testSystemViaPipeline, validatePipelineConfig } = require('../api/pipeline.api');
|
|
23
23
|
const { extractDatasources } = require('../datasource/list');
|
|
24
24
|
const { unwrapApiData } = require('../utils/external-system-readiness-core');
|
|
25
25
|
const { logDeployReadinessSummary } = require('../utils/external-system-readiness-deploy-display');
|
|
@@ -27,48 +27,91 @@ const { parseControllerDeploymentOutcome } = require('../utils/controller-deploy
|
|
|
27
27
|
const { generateControllerManifest } = require('../generator/external-controller-manifest');
|
|
28
28
|
const { validateExternalSystemComplete } = require('../validation/validate');
|
|
29
29
|
const { displayValidationResults } = require('../validation/validate-display');
|
|
30
|
-
const { maybeSyncSystemCertificationFromDataplane } = require('../certification/sync-system-certification');
|
|
31
|
-
const { cliOptsSkipCertSync } = require('../certification/cli-cert-sync-skip');
|
|
32
30
|
const { syncDeployJsonFromSources } = require('./sync-deploy-manifest');
|
|
31
|
+
const { runDeployGateOrchestrator } = require('../commands/deploy-gate-orchestrator');
|
|
32
|
+
const { runPostPublishDataSync } = require('../commands/run-post-publish-data-sync');
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
|
-
*
|
|
35
|
+
* Validates manifest on dataplane (dry-run) before controller deploy.
|
|
36
36
|
* @async
|
|
37
|
-
* @param {
|
|
38
|
-
* @param {
|
|
39
|
-
* @param {
|
|
40
|
-
* @param {string} systemKey - System key
|
|
41
|
-
* @returns {Promise<{ dataplaneUrl: string, datasources: Object[], system: Object|null, error: Error|null }>}
|
|
37
|
+
* @param {Object} manifest
|
|
38
|
+
* @param {Object} authConfig
|
|
39
|
+
* @param {string} dataplaneUrl
|
|
42
40
|
*/
|
|
43
|
-
async function
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
41
|
+
async function validateManifestOnDataplane(manifest, authConfig, dataplaneUrl) {
|
|
42
|
+
const config = {
|
|
43
|
+
version: manifest.version || '1.0.0',
|
|
44
|
+
application: manifest.system,
|
|
45
|
+
dataSources: manifest.dataSources || []
|
|
46
|
+
};
|
|
47
|
+
const res = await validatePipelineConfig(dataplaneUrl, authConfig, { config });
|
|
48
|
+
if (res?.success === false) {
|
|
49
|
+
throw new Error(res.formattedError || res.error || 'Dataplane pipeline validation failed');
|
|
50
|
+
}
|
|
51
|
+
const data = res?.data && typeof res.data === 'object' ? res.data : res;
|
|
52
|
+
if (data?.isValid === false) {
|
|
53
|
+
const errors = Array.isArray(data.errors) ? data.errors : [];
|
|
54
|
+
const summary = errors.slice(0, 3).map((e) => (typeof e === 'string' ? e : e.message || String(e))).join('; ');
|
|
55
|
+
throw new Error(
|
|
56
|
+
summary ? `Dataplane validation failed: ${summary}` : 'Dataplane pipeline validation failed'
|
|
57
|
+
);
|
|
49
58
|
}
|
|
59
|
+
}
|
|
50
60
|
|
|
51
|
-
|
|
61
|
+
/**
|
|
62
|
+
* @async
|
|
63
|
+
* @returns {Promise<{ datasources: Object[], error: Error|null }>}
|
|
64
|
+
*/
|
|
65
|
+
async function listDeployReadinessDatasources(dataplaneUrl, authConfig, systemKey) {
|
|
52
66
|
try {
|
|
53
67
|
const listRes = await listDatasources(dataplaneUrl, authConfig, {
|
|
54
68
|
sourceSystemIdOrKey: systemKey,
|
|
55
69
|
pageSize: 100
|
|
56
70
|
});
|
|
57
|
-
if (listRes.success
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
71
|
+
if (!listRes.success || !listRes.data) {
|
|
72
|
+
return { datasources: [], error: null };
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
return { datasources: extractDatasources(listRes), error: null };
|
|
76
|
+
} catch (e) {
|
|
77
|
+
logger.log(
|
|
78
|
+
chalk.yellow(
|
|
79
|
+
`⚠ Unable to parse datasources list from dataplane response: ${e && e.message ? e.message : 'unknown error'}`
|
|
80
|
+
)
|
|
81
|
+
);
|
|
82
|
+
return { datasources: [], error: null };
|
|
68
83
|
}
|
|
69
84
|
} catch (err) {
|
|
70
|
-
return {
|
|
85
|
+
return { datasources: [], error: err };
|
|
71
86
|
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* @async
|
|
91
|
+
* @param {string} controllerUrl - Controller base URL
|
|
92
|
+
* @param {string} environment - Environment key
|
|
93
|
+
* @param {Object} authConfig - Auth config
|
|
94
|
+
* @param {string} systemKey - System key
|
|
95
|
+
* @returns {Promise<{ dataplaneUrl: string, datasources: Object[], system: Object|null, error: Error|null }>}
|
|
96
|
+
*/
|
|
97
|
+
async function fetchDataplaneDeployReadiness(controllerUrl, environment, authConfig, systemKey, opts = {}) {
|
|
98
|
+
let dataplaneUrl = opts.dataplaneUrl;
|
|
99
|
+
if (!dataplaneUrl) {
|
|
100
|
+
try {
|
|
101
|
+
dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig, {
|
|
102
|
+
silent: opts.silent === true
|
|
103
|
+
});
|
|
104
|
+
} catch (err) {
|
|
105
|
+
return { dataplaneUrl: null, datasources: [], system: null, error: err };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
let datasources = [];
|
|
110
|
+
const dsResult = await listDeployReadinessDatasources(dataplaneUrl, authConfig, systemKey);
|
|
111
|
+
if (dsResult.error) {
|
|
112
|
+
return { dataplaneUrl, datasources: [], system: null, error: dsResult.error };
|
|
113
|
+
}
|
|
114
|
+
datasources = dsResult.datasources;
|
|
72
115
|
|
|
73
116
|
try {
|
|
74
117
|
const getRes = await getExternalSystem(dataplaneUrl, systemKey, authConfig);
|
|
@@ -111,43 +154,29 @@ async function fetchDataplaneDeployReadiness(controllerUrl, environment, authCon
|
|
|
111
154
|
*/
|
|
112
155
|
async function runOptionalExternalDeployProbe(ctx, systemKey, authConfig, options) {
|
|
113
156
|
if (!options.probe || !ctx.dataplaneUrl || ctx.error) return null;
|
|
114
|
-
|
|
157
|
+
const compact = options.verbose !== true;
|
|
158
|
+
if (!compact) {
|
|
159
|
+
logger.log(chalk.blue('\nRunning runtime checks (--probe)...'));
|
|
160
|
+
}
|
|
115
161
|
try {
|
|
116
162
|
const pr = await testSystemViaPipeline(ctx.dataplaneUrl, systemKey, authConfig, {}, {
|
|
117
163
|
timeout: options.probeTimeout || 120000
|
|
118
164
|
});
|
|
119
165
|
if (pr.success === false) {
|
|
120
|
-
|
|
166
|
+
if (!compact) {
|
|
167
|
+
logger.log(chalk.yellow(`⚠ Probe request failed: ${pr.formattedError || pr.error || 'unknown error'}`));
|
|
168
|
+
}
|
|
121
169
|
return null;
|
|
122
170
|
}
|
|
123
171
|
return unwrapApiData(pr);
|
|
124
172
|
} catch (e) {
|
|
125
|
-
|
|
173
|
+
if (!compact) {
|
|
174
|
+
logger.log(chalk.yellow(`⚠ Probe failed: ${e.message}`));
|
|
175
|
+
}
|
|
126
176
|
return null;
|
|
127
177
|
}
|
|
128
178
|
}
|
|
129
179
|
|
|
130
|
-
/**
|
|
131
|
-
* @param {Object} deploymentOutcome
|
|
132
|
-
* @param {{ dataplaneUrl: string|null, error: Error|null }} ctx
|
|
133
|
-
* @param {Object} manifest
|
|
134
|
-
* @param {Object} options
|
|
135
|
-
* @param {Object} authConfig
|
|
136
|
-
* @returns {Promise<void>}
|
|
137
|
-
*/
|
|
138
|
-
async function maybeSyncCertificationAfterExternalDeploy(deploymentOutcome, ctx, manifest, options, authConfig) {
|
|
139
|
-
if (!deploymentOutcome.ok || !ctx.dataplaneUrl || ctx.error) return;
|
|
140
|
-
const dsKeys = (manifest.dataSources || []).map((ds) => ds && ds.key).filter(Boolean);
|
|
141
|
-
await maybeSyncSystemCertificationFromDataplane({
|
|
142
|
-
label: 'deploy',
|
|
143
|
-
noCertSync: cliOptsSkipCertSync(options),
|
|
144
|
-
systemKey: manifest.key,
|
|
145
|
-
dataplaneUrl: ctx.dataplaneUrl,
|
|
146
|
-
authConfig,
|
|
147
|
-
datasourceKeys: dsKeys
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
|
|
151
180
|
function logImmediateControllerDeploymentOutcome(deploymentOutcome) {
|
|
152
181
|
if (deploymentOutcome.ok) {
|
|
153
182
|
logger.log(formatSuccessParagraph('Controller deployment OK'));
|
|
@@ -172,52 +201,136 @@ function logImmediateControllerDeploymentOutcome(deploymentOutcome) {
|
|
|
172
201
|
logger.log(chalk.gray(' Check the controller deployment job or logs for details.'));
|
|
173
202
|
}
|
|
174
203
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
poll:
|
|
204
|
+
function buildExternalDeployPollOpts(options) {
|
|
205
|
+
return {
|
|
206
|
+
...options,
|
|
207
|
+
poll: true,
|
|
179
208
|
pollInterval: options.pollInterval !== undefined ? options.pollInterval : 500,
|
|
180
|
-
// External-system deploy only: ~10s poll window (matches controller→dataplane publish timeout). Not used for Azure/webapp deploy polling.
|
|
181
209
|
pollMaxAttempts: options.pollMaxAttempts !== undefined ? options.pollMaxAttempts : 22,
|
|
182
|
-
|
|
210
|
+
silentPoll: options.silentPoll === true
|
|
183
211
|
};
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async function promoteExternalSystemLifecycleAfterDeploy(manifest, dataplaneUrl, authConfig) {
|
|
215
|
+
const { buildUploadPayload } = require('../commands/upload');
|
|
216
|
+
const { uploadApplicationViaPipelineWithAuthRetry } = require('../utils/pipeline-upload-auth-retry');
|
|
217
|
+
const payload = buildUploadPayload(manifest, { status: 'published' });
|
|
218
|
+
const res = await uploadApplicationViaPipelineWithAuthRetry(
|
|
219
|
+
dataplaneUrl,
|
|
188
220
|
authConfig,
|
|
189
|
-
|
|
221
|
+
payload,
|
|
222
|
+
manifest.key
|
|
190
223
|
);
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
if (!deploymentOutcome.ok) {
|
|
196
|
-
return result;
|
|
224
|
+
if (res?.success === false) {
|
|
225
|
+
throw new Error(
|
|
226
|
+
res.formattedError || res.error || 'Failed to promote external system lifecycle after deploy'
|
|
227
|
+
);
|
|
197
228
|
}
|
|
229
|
+
return res;
|
|
230
|
+
}
|
|
198
231
|
|
|
232
|
+
async function finalizeExternalDeployDataplaneWork(manifest, controllerUrl, environment, authConfig, options) {
|
|
233
|
+
const compact = options.verbose !== true;
|
|
234
|
+
const silent = compact;
|
|
199
235
|
const ctx = await fetchDataplaneDeployReadiness(
|
|
200
236
|
controllerUrl,
|
|
201
237
|
environment,
|
|
202
238
|
authConfig,
|
|
203
|
-
manifest.key
|
|
239
|
+
manifest.key,
|
|
240
|
+
{ dataplaneUrl: options.knownDataplaneUrl, silent }
|
|
204
241
|
);
|
|
205
242
|
|
|
206
|
-
|
|
243
|
+
if (ctx.dataplaneUrl && !ctx.error) {
|
|
244
|
+
await promoteExternalSystemLifecycleAfterDeploy(manifest, ctx.dataplaneUrl, authConfig);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const refreshedCtx =
|
|
248
|
+
ctx.dataplaneUrl && !ctx.error
|
|
249
|
+
? await fetchDataplaneDeployReadiness(
|
|
250
|
+
controllerUrl,
|
|
251
|
+
environment,
|
|
252
|
+
authConfig,
|
|
253
|
+
manifest.key,
|
|
254
|
+
{ dataplaneUrl: ctx.dataplaneUrl, silent: true }
|
|
255
|
+
)
|
|
256
|
+
: ctx;
|
|
257
|
+
|
|
258
|
+
const probeData = await runOptionalExternalDeployProbe(refreshedCtx, manifest.key, authConfig, options);
|
|
259
|
+
return { refreshedCtx, probeData };
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
async function runPostDeployExternalSystemSteps(manifest, controllerUrl, environment, authConfig, options) {
|
|
263
|
+
const { runWithDeployPollSpinner } = require('../deployment/deploy-poll-ui');
|
|
264
|
+
|
|
265
|
+
const { refreshedCtx, probeData } = await runWithDeployPollSpinner(
|
|
266
|
+
'Finalizing deployment on dataplane…',
|
|
267
|
+
() => finalizeExternalDeployDataplaneWork(manifest, controllerUrl, environment, authConfig, options),
|
|
268
|
+
{ silent: options.silentPoll === true }
|
|
269
|
+
);
|
|
207
270
|
|
|
208
271
|
logDeployReadinessSummary({
|
|
209
272
|
environment,
|
|
210
|
-
dataplaneUrl:
|
|
273
|
+
dataplaneUrl: refreshedCtx.dataplaneUrl,
|
|
211
274
|
manifest,
|
|
212
|
-
datasources:
|
|
213
|
-
systemFromDataplane:
|
|
214
|
-
fetchError:
|
|
215
|
-
deploymentOk:
|
|
216
|
-
deploymentDetail:
|
|
217
|
-
probeData
|
|
275
|
+
datasources: refreshedCtx.datasources,
|
|
276
|
+
systemFromDataplane: refreshedCtx.system,
|
|
277
|
+
fetchError: refreshedCtx.error,
|
|
278
|
+
deploymentOk: true,
|
|
279
|
+
deploymentDetail: null,
|
|
280
|
+
probeData,
|
|
281
|
+
verbose: options.verbose === true,
|
|
282
|
+
gateOutcomes: options.gateOutcomes || null,
|
|
283
|
+
draftDeploymentId: options.draftDeploymentId || null
|
|
218
284
|
});
|
|
219
285
|
|
|
220
|
-
|
|
286
|
+
const { trySyncCertificationFromDataplaneForExternalApp } = require('../certification/sync-after-external-command');
|
|
287
|
+
await trySyncCertificationFromDataplaneForExternalApp(manifest.key, 'deploy');
|
|
288
|
+
|
|
289
|
+
await runPostPublishDataSync({
|
|
290
|
+
dataplaneUrl: refreshedCtx.dataplaneUrl,
|
|
291
|
+
authConfig,
|
|
292
|
+
datasourceKeys: (manifest.dataSources || []).map((ds) => ds && ds.key).filter(Boolean),
|
|
293
|
+
options,
|
|
294
|
+
label: 'Deploy data sync'
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
async function executeDeployAndDisplay(manifest, controllerUrl, environment, authConfig, options) {
|
|
299
|
+
const compact = options.verbose !== true;
|
|
300
|
+
const deployer = require('../deployment/deployer');
|
|
301
|
+
const result = await deployer.deployToController(
|
|
302
|
+
manifest,
|
|
303
|
+
controllerUrl,
|
|
304
|
+
environment,
|
|
305
|
+
authConfig,
|
|
306
|
+
buildExternalDeployPollOpts(options)
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
const deploymentOutcome = parseControllerDeploymentOutcome(result);
|
|
310
|
+
if (!compact) {
|
|
311
|
+
logImmediateControllerDeploymentOutcome(deploymentOutcome);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (!deploymentOutcome.ok) {
|
|
315
|
+
if (compact) {
|
|
316
|
+
logDeployReadinessSummary({
|
|
317
|
+
environment,
|
|
318
|
+
dataplaneUrl: null,
|
|
319
|
+
manifest,
|
|
320
|
+
deploymentOk: false,
|
|
321
|
+
deploymentDetail: deploymentOutcome,
|
|
322
|
+
verbose: false,
|
|
323
|
+
gateOutcomes: options.gateOutcomes || null,
|
|
324
|
+
draftDeploymentId: result?.deploymentId || null
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
return result;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
await runPostDeployExternalSystemSteps(manifest, controllerUrl, environment, authConfig, {
|
|
331
|
+
...options,
|
|
332
|
+
draftDeploymentId: result?.deploymentId || null
|
|
333
|
+
});
|
|
221
334
|
|
|
222
335
|
return result;
|
|
223
336
|
}
|
|
@@ -242,6 +355,100 @@ async function prepareDeploymentConfig(appName, _options) {
|
|
|
242
355
|
return { environment, controllerUrl, authConfig };
|
|
243
356
|
}
|
|
244
357
|
|
|
358
|
+
/**
|
|
359
|
+
* @param {Error} error
|
|
360
|
+
* @param {string} appName
|
|
361
|
+
* @returns {Error}
|
|
362
|
+
*/
|
|
363
|
+
function wrapDeployExternalSystemError(error, appName) {
|
|
364
|
+
let message = `Failed to deploy external system: ${error.message}`;
|
|
365
|
+
if (error.message && error.message.includes('Application not found')) {
|
|
366
|
+
message += `\n\n💡 Register the app in the controller first: aifabrix app register ${appName}`;
|
|
367
|
+
}
|
|
368
|
+
return new Error(message);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* @async
|
|
373
|
+
* @param {string} appName
|
|
374
|
+
* @param {Object} options
|
|
375
|
+
* @returns {Promise<Object>}
|
|
376
|
+
*/
|
|
377
|
+
/**
|
|
378
|
+
* @param {string} appName
|
|
379
|
+
* @param {Object} options
|
|
380
|
+
* @param {boolean} compact
|
|
381
|
+
*/
|
|
382
|
+
async function validateExternalSystemForDeploy(appName, options, compact) {
|
|
383
|
+
if (!compact) {
|
|
384
|
+
logger.log(chalk.blue('🔍 Validating external system before deployment...'));
|
|
385
|
+
}
|
|
386
|
+
const validationResult = await validateExternalSystemComplete(appName, options);
|
|
387
|
+
if (!validationResult.valid) {
|
|
388
|
+
displayValidationResults(validationResult);
|
|
389
|
+
throw new Error('Validation failed. Fix errors before deploying.');
|
|
390
|
+
}
|
|
391
|
+
if (!compact) {
|
|
392
|
+
logger.log(formatSuccessLine('Local validation passed, proceeding with deployment...'));
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* @param {Object} manifest
|
|
398
|
+
* @param {Object} authConfig
|
|
399
|
+
* @param {string} dataplaneUrl
|
|
400
|
+
* @param {boolean} compact
|
|
401
|
+
*/
|
|
402
|
+
async function validateDataplaneManifestForDeploy(manifest, authConfig, dataplaneUrl, compact) {
|
|
403
|
+
if (!compact) {
|
|
404
|
+
logger.log(chalk.blue('🔍 Validating manifest on dataplane...'));
|
|
405
|
+
}
|
|
406
|
+
await validateManifestOnDataplane(manifest, authConfig, dataplaneUrl);
|
|
407
|
+
if (!compact) {
|
|
408
|
+
logger.log(formatSuccessLine('Dataplane validation passed'));
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
async function runExternalSystemDeployFlow(appName, options) {
|
|
413
|
+
const compact = options.verbose !== true;
|
|
414
|
+
const { appPath } = await detectAppType(appName);
|
|
415
|
+
logOfflinePathWhenType(appPath);
|
|
416
|
+
|
|
417
|
+
if (!compact) {
|
|
418
|
+
logger.log(chalk.blue(`\n🚀 Deploying external system: ${appName}`));
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
await validateExternalSystemForDeploy(appName, options, compact);
|
|
422
|
+
|
|
423
|
+
const gateOutcomes = await runDeployGateOrchestrator(appName, {
|
|
424
|
+
...options,
|
|
425
|
+
quietDeployUi: compact
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
await syncDeployJsonFromSources(appName);
|
|
429
|
+
|
|
430
|
+
const manifest = await generateControllerManifest(appName, options);
|
|
431
|
+
|
|
432
|
+
const { environment, controllerUrl, authConfig } = await prepareDeploymentConfig(appName, options);
|
|
433
|
+
|
|
434
|
+
let dataplaneUrl;
|
|
435
|
+
try {
|
|
436
|
+
dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig, {
|
|
437
|
+
silent: compact
|
|
438
|
+
});
|
|
439
|
+
} catch (err) {
|
|
440
|
+
throw new Error(`Failed to resolve dataplane URL before deploy: ${err.message}`);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
await validateDataplaneManifestForDeploy(manifest, authConfig, dataplaneUrl, compact);
|
|
444
|
+
|
|
445
|
+
return executeDeployAndDisplay(manifest, controllerUrl, environment, authConfig, {
|
|
446
|
+
...options,
|
|
447
|
+
gateOutcomes,
|
|
448
|
+
knownDataplaneUrl: dataplaneUrl
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
|
|
245
452
|
/**
|
|
246
453
|
* Deploys external system via controller pipeline (same as regular apps)
|
|
247
454
|
*
|
|
@@ -255,41 +462,12 @@ async function prepareDeploymentConfig(appName, _options) {
|
|
|
255
462
|
*/
|
|
256
463
|
async function deployExternalSystem(appName, options = {}) {
|
|
257
464
|
try {
|
|
258
|
-
|
|
259
|
-
logOfflinePathWhenType(appPath);
|
|
260
|
-
|
|
261
|
-
logger.log(chalk.blue(`\n🚀 Deploying external system: ${appName}`));
|
|
262
|
-
|
|
263
|
-
logger.log(chalk.blue('🔍 Validating external system before deployment...'));
|
|
264
|
-
const validationResult = await validateExternalSystemComplete(appName, options);
|
|
265
|
-
|
|
266
|
-
if (!validationResult.valid) {
|
|
267
|
-
displayValidationResults(validationResult);
|
|
268
|
-
throw new Error('Validation failed. Fix errors before deploying.');
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
logger.log(formatSuccessLine('Local validation passed, proceeding with deployment...'));
|
|
272
|
-
|
|
273
|
-
await syncDeployJsonFromSources(appName);
|
|
274
|
-
|
|
275
|
-
const manifest = await generateControllerManifest(appName, options);
|
|
276
|
-
|
|
277
|
-
const { environment, controllerUrl, authConfig } = await prepareDeploymentConfig(appName, options);
|
|
278
|
-
|
|
279
|
-
const result = await executeDeployAndDisplay(
|
|
280
|
-
manifest,
|
|
281
|
-
controllerUrl,
|
|
282
|
-
environment,
|
|
283
|
-
authConfig,
|
|
284
|
-
options
|
|
285
|
-
);
|
|
286
|
-
return result;
|
|
465
|
+
return await runExternalSystemDeployFlow(appName, options);
|
|
287
466
|
} catch (error) {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
message += `\n\n💡 Register the app in the controller first: aifabrix app register ${appName}`;
|
|
467
|
+
if (error && error.gateFailure === true) {
|
|
468
|
+
throw error;
|
|
291
469
|
}
|
|
292
|
-
throw
|
|
470
|
+
throw wrapDeployExternalSystemError(error, appName);
|
|
293
471
|
}
|
|
294
472
|
}
|
|
295
473
|
|
|
@@ -86,9 +86,13 @@ async function setupAuthenticationAndDataplane(systemKey, _options, _config) {
|
|
|
86
86
|
* @returns {Promise<{application: Object, dataSources: Array, version?: string}>} Full manifest
|
|
87
87
|
* @throws {Error} If download fails
|
|
88
88
|
*/
|
|
89
|
-
async function downloadFullManifest(dataplaneUrl, systemKey, authConfig) {
|
|
89
|
+
async function downloadFullManifest(dataplaneUrl, systemKey, authConfig, options = {}) {
|
|
90
90
|
logger.log(formatProgress(`Downloading manifest for ${systemKey}…`));
|
|
91
|
-
const
|
|
91
|
+
const { normalizeVersionTarget } = require('../utils/test-target-cli-options');
|
|
92
|
+
const versionTarget = normalizeVersionTarget(options.version, 'running');
|
|
93
|
+
const response = await getExternalSystemConfig(dataplaneUrl, systemKey, authConfig, {
|
|
94
|
+
versionTarget: versionTarget === 'running' ? undefined : versionTarget
|
|
95
|
+
});
|
|
92
96
|
|
|
93
97
|
if (!response.success || !response.data) {
|
|
94
98
|
throw new Error(`Failed to download system configuration: ${response.error || response.formattedError || 'Unknown error'}`);
|
|
@@ -402,7 +406,7 @@ async function downloadExternalSystem(systemKey, options = {}) {
|
|
|
402
406
|
return;
|
|
403
407
|
}
|
|
404
408
|
|
|
405
|
-
const manifest = await downloadFullManifest(dataplaneUrl, systemKey, authConfig);
|
|
409
|
+
const manifest = await downloadFullManifest(dataplaneUrl, systemKey, authConfig, options);
|
|
406
410
|
validateAndLogDownloadedData(manifest.application, manifest.dataSources);
|
|
407
411
|
const finalPath = getIntegrationPath(systemKey);
|
|
408
412
|
await processDownloadedSystem(
|
|
@@ -33,7 +33,7 @@ async function executeDatasourceTest(systemKey, datasourceKey, payloadTemplate,
|
|
|
33
33
|
payloadTemplate,
|
|
34
34
|
dataplaneUrl,
|
|
35
35
|
authConfig,
|
|
36
|
-
timeout: parseInt(options.timeout, 10) ||
|
|
36
|
+
timeout: parseInt(options.timeout, 10) || 60000,
|
|
37
37
|
includeDebug: !!options.debug
|
|
38
38
|
});
|
|
39
39
|
return datasourceResult;
|
|
@@ -25,6 +25,8 @@ async function runOneDatasourceKey(appName, datasourceKey, opts) {
|
|
|
25
25
|
debug,
|
|
26
26
|
verbose: false,
|
|
27
27
|
timeout: timeoutMs,
|
|
28
|
+
version: opts.version,
|
|
29
|
+
syncMode: opts.syncMode,
|
|
28
30
|
async: true,
|
|
29
31
|
noAsync: false,
|
|
30
32
|
authConfig,
|
|
@@ -72,7 +74,7 @@ async function maybeWriteSystemRunLog(appName, systemKey, datasourceKeys, runTyp
|
|
|
72
74
|
const integrationDir = path.dirname(appPath);
|
|
73
75
|
const logPath = await writeTestLog(
|
|
74
76
|
appName,
|
|
75
|
-
{ request: { systemKey, datasourceKeys, runType, includeDebug: true }, response: payload },
|
|
77
|
+
{ request: { systemKey, datasourceKeys, runType, includeDebug: true, explainCertification: true }, response: payload },
|
|
76
78
|
runType === 'e2e' ? 'test-e2e' : 'test-integration',
|
|
77
79
|
integrationDir
|
|
78
80
|
);
|
|
@@ -99,13 +101,16 @@ async function runSystemLevelTest({
|
|
|
99
101
|
runType,
|
|
100
102
|
debug,
|
|
101
103
|
timeout,
|
|
104
|
+
version,
|
|
105
|
+
syncMode,
|
|
102
106
|
authConfig,
|
|
103
107
|
dataplaneUrl
|
|
104
108
|
}) {
|
|
105
109
|
if (!Array.isArray(datasourceKeys) || datasourceKeys.length === 0) {
|
|
106
110
|
return { success: true, datasourceResults: [] };
|
|
107
111
|
}
|
|
108
|
-
const timeoutMs = Number.isFinite(timeout) ? timeout :
|
|
112
|
+
const timeoutMs = Number.isFinite(timeout) ? timeout : 60000;
|
|
113
|
+
const runOpts = { environment, runType, debug, timeoutMs, version, syncMode, authConfig, dataplaneUrl };
|
|
109
114
|
|
|
110
115
|
const results = [];
|
|
111
116
|
for (const key of datasourceKeys) {
|
|
@@ -113,14 +118,7 @@ async function runSystemLevelTest({
|
|
|
113
118
|
// (Plan allows parallel later, but UX needs stable logs first.)
|
|
114
119
|
// eslint-disable-next-line no-await-in-loop -- intentional sequential execution
|
|
115
120
|
results.push(
|
|
116
|
-
await runOneDatasourceKey(appName, key,
|
|
117
|
-
environment,
|
|
118
|
-
runType,
|
|
119
|
-
debug,
|
|
120
|
-
timeoutMs,
|
|
121
|
-
authConfig,
|
|
122
|
-
dataplaneUrl
|
|
123
|
-
})
|
|
121
|
+
await runOneDatasourceKey(appName, key, runOpts)
|
|
124
122
|
);
|
|
125
123
|
}
|
|
126
124
|
|
|
@@ -37,7 +37,7 @@ const {
|
|
|
37
37
|
} = require('./test-execution');
|
|
38
38
|
const { runSystemLevelTest } = require('./test-system-level');
|
|
39
39
|
const { shouldUseSystemLevelIntegrationCall } = require('./integration-test-dispatch');
|
|
40
|
-
const {
|
|
40
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
43
|
* Loads and parses application config file
|
|
@@ -408,8 +408,8 @@ function determineDatasourcesToTest(datasourceFiles, datasourceFilter) {
|
|
|
408
408
|
* @param {string} [options.controller] - Controller URL
|
|
409
409
|
* @param {boolean} [options.verbose] - Show detailed test output
|
|
410
410
|
* @param {number} [options.timeout] - Request timeout in milliseconds
|
|
411
|
-
* @param {boolean} [options.
|
|
412
|
-
* @param {boolean} [options.sync] -
|
|
411
|
+
* @param {boolean} [options.noPublish] - When true, skip publish (exercise dataplane config already deployed)
|
|
412
|
+
* @param {boolean} [options.sync] - Explicit sync; ignored when `noPublish` / `--no-publish` is set
|
|
413
413
|
* @returns {Promise<Object>} Integration test results
|
|
414
414
|
* @throws {Error} If testing fails
|
|
415
415
|
*/
|
|
@@ -454,11 +454,15 @@ async function testExternalSystemIntegration(appName, options = {}) {
|
|
|
454
454
|
|
|
455
455
|
const { systemKey, authConfig, dataplaneUrl, datasourcesToTest, customPayload } = await prepareIntegrationTestEnvironment(appName, options);
|
|
456
456
|
|
|
457
|
-
if (!
|
|
457
|
+
if (!cliOptsSkipPublish(options)) {
|
|
458
458
|
logger.log(chalk.cyan('Syncing local config to dataplane…'));
|
|
459
459
|
const { uploadExternalSystem } = require('../commands/upload');
|
|
460
460
|
const { buildMinimalUploadSyncOptions } = require('../utils/upload-sync-options');
|
|
461
|
-
|
|
461
|
+
const uploadOpts = buildMinimalUploadSyncOptions(options);
|
|
462
|
+
if (options.uploadStatus === 'published') {
|
|
463
|
+
uploadOpts.uploadStatus = 'published';
|
|
464
|
+
}
|
|
465
|
+
await uploadExternalSystem(systemKey, uploadOpts);
|
|
462
466
|
logger.log(formatSuccessLine('Sync complete'));
|
|
463
467
|
}
|
|
464
468
|
|
|
@@ -468,7 +472,7 @@ async function testExternalSystemIntegration(appName, options = {}) {
|
|
|
468
472
|
datasourceResults: []
|
|
469
473
|
};
|
|
470
474
|
|
|
471
|
-
const timeout = parseInt(options.timeout, 10) ||
|
|
475
|
+
const timeout = parseInt(options.timeout, 10) || 60000;
|
|
472
476
|
const useSystemLevel = shouldUseSystemLevelIntegrationCall(options, datasourcesToTest, customPayload);
|
|
473
477
|
|
|
474
478
|
if (useSystemLevel) {
|
|
@@ -482,6 +486,8 @@ async function testExternalSystemIntegration(appName, options = {}) {
|
|
|
482
486
|
runType: 'integration',
|
|
483
487
|
debug: options.debug,
|
|
484
488
|
timeout,
|
|
489
|
+
version: options.version,
|
|
490
|
+
syncMode: options.syncMode,
|
|
485
491
|
authConfig,
|
|
486
492
|
dataplaneUrl
|
|
487
493
|
});
|