@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
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Post-publish/deploy datasource data sync hook.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const { resolveSyncPlan, executeSyncPlan } = require('./datasource-sync-policy');
|
|
10
|
+
const { logDatasourceSyncSummary } = require('./datasource-sync-display');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param {string[]} datasourceKeys
|
|
14
|
+
* @param {Object|null|undefined} payload
|
|
15
|
+
* @returns {string[]}
|
|
16
|
+
*/
|
|
17
|
+
function extractDatasourceKeysFromPayload(payload, datasourceKeys) {
|
|
18
|
+
if (Array.isArray(datasourceKeys) && datasourceKeys.length > 0) {
|
|
19
|
+
return datasourceKeys;
|
|
20
|
+
}
|
|
21
|
+
const fromPayload = Array.isArray(payload?.dataSources)
|
|
22
|
+
? payload.dataSources.map((row) => row && row.key).filter(Boolean)
|
|
23
|
+
: [];
|
|
24
|
+
return fromPayload;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @async
|
|
29
|
+
* @param {Object} params
|
|
30
|
+
* @param {string[]} [params.datasourceKeys]
|
|
31
|
+
* @param {Object} [params.payload]
|
|
32
|
+
* @param {string} params.dataplaneUrl
|
|
33
|
+
* @param {Object} params.authConfig
|
|
34
|
+
* @param {Object} [params.options]
|
|
35
|
+
* @param {string} [params.label]
|
|
36
|
+
* @returns {Promise<Object|null>}
|
|
37
|
+
*/
|
|
38
|
+
async function runPostPublishDataSync(params) {
|
|
39
|
+
const { dataplaneUrl, authConfig, payload, options = {}, label } = params;
|
|
40
|
+
if (!dataplaneUrl || !authConfig || options.dryRun === true || options.skipDataSync === true) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const keys = extractDatasourceKeysFromPayload(payload, params.datasourceKeys);
|
|
45
|
+
if (keys.length === 0) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const plan = await resolveSyncPlan({
|
|
50
|
+
syncExplicit: options.sync === true,
|
|
51
|
+
skipSync: options.skipDataSync === true,
|
|
52
|
+
datasourceKeys: keys,
|
|
53
|
+
dataplaneUrl,
|
|
54
|
+
authConfig
|
|
55
|
+
});
|
|
56
|
+
const result = await executeSyncPlan(plan, dataplaneUrl, authConfig);
|
|
57
|
+
logDatasourceSyncSummary(result, {
|
|
58
|
+
json: options.json === true,
|
|
59
|
+
label,
|
|
60
|
+
syncExplicit: options.sync === true
|
|
61
|
+
});
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
module.exports = {
|
|
66
|
+
runPostPublishDataSync,
|
|
67
|
+
extractDatasourceKeysFromPayload
|
|
68
|
+
};
|
|
@@ -58,7 +58,7 @@ const {
|
|
|
58
58
|
} = require('../utils/infra-optional-service-flags');
|
|
59
59
|
|
|
60
60
|
/** Builder app keys touched by `up-platform --force`. */
|
|
61
|
-
const PLATFORM_APPS = ['keycloak', 'miso-controller', 'dataplane'];
|
|
61
|
+
const PLATFORM_APPS = ['keycloak', 'miso-controller', 'dataplane', 'builder-api'];
|
|
62
62
|
|
|
63
63
|
function formatBackupSuffix() {
|
|
64
64
|
const d = new Date();
|
|
@@ -13,12 +13,12 @@ const path = require('path');
|
|
|
13
13
|
const fs = require('fs');
|
|
14
14
|
const chalk = require('chalk');
|
|
15
15
|
const logger = require('../utils/logger');
|
|
16
|
-
const {
|
|
16
|
+
const { resolveExternalSystemPath } = require('../utils/app-path-resolve');
|
|
17
17
|
const { resolveApplicationConfigPath } = require('../utils/app-config-resolver');
|
|
18
18
|
const { loadConfigFile } = require('../utils/config-format');
|
|
19
19
|
const { discoverIntegrationFiles, buildEffectiveDatasourceFiles } = require('./repair-internal');
|
|
20
20
|
const { runDatasourceTestE2E } = require('../datasource/test-e2e');
|
|
21
|
-
const {
|
|
21
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
22
22
|
const { buildMinimalUploadSyncOptions, isQuietMinimalSync } = require('../utils/upload-sync-options');
|
|
23
23
|
const { getConfig } = require('../core/config');
|
|
24
24
|
const { setupIntegrationTestAuth } = require('../external-system/test-auth');
|
|
@@ -90,15 +90,26 @@ function getDatasourceKeys(appPath, configPath, variables, systemKey, systemPars
|
|
|
90
90
|
|
|
91
91
|
/**
|
|
92
92
|
* Publish local integration files to the dataplane before E2E (same path as `aifabrix upload <systemKey>`),
|
|
93
|
-
* unless ``options.
|
|
93
|
+
* unless ``options.noPublish`` is true.
|
|
94
94
|
* @param {string} systemKey
|
|
95
95
|
* @param {Object} options
|
|
96
96
|
* @returns {Promise<{ authConfig: Object, dataplaneUrl: string, environment?: string }|null>}
|
|
97
97
|
*/
|
|
98
98
|
async function syncLocalIfRequested(systemKey, options) {
|
|
99
|
-
if (
|
|
99
|
+
if (cliOptsSkipPublish(options)) return null;
|
|
100
100
|
const { uploadExternalSystem } = require('./upload');
|
|
101
|
-
const uploadOpts =
|
|
101
|
+
const uploadOpts = {
|
|
102
|
+
...buildMinimalUploadSyncOptions(options),
|
|
103
|
+
uploadStatus: options.uploadStatus === 'published' ? 'published' : 'draft',
|
|
104
|
+
pathOptions: {},
|
|
105
|
+
...(options.authConfig && options.dataplaneUrl
|
|
106
|
+
? {
|
|
107
|
+
authConfig: options.authConfig,
|
|
108
|
+
dataplaneUrl: options.dataplaneUrl,
|
|
109
|
+
environment: options.environment
|
|
110
|
+
}
|
|
111
|
+
: {})
|
|
112
|
+
};
|
|
102
113
|
const uploadCtx = await uploadExternalSystem(systemKey, uploadOpts);
|
|
103
114
|
if (uploadCtx?.uploadSkipped !== true && !isQuietMinimalSync(uploadOpts)) {
|
|
104
115
|
logger.log(formatSuccessLine('Sync complete'));
|
|
@@ -117,7 +128,7 @@ async function syncLocalIfRequested(systemKey, options) {
|
|
|
117
128
|
* @param {boolean} [options.debug] - Include debug, write log
|
|
118
129
|
* @param {boolean} [options.verbose] - Verbose output
|
|
119
130
|
* @param {boolean} [options.async] - If false, sync mode (default true)
|
|
120
|
-
* @param {boolean} [options.
|
|
131
|
+
* @param {boolean} [options.noPublish] - When true, skip upload (E2E uses dataplane config already deployed)
|
|
121
132
|
* @returns {Promise<{ success: boolean, results: Array<{ key: string, success: boolean, error?: string }> }>}
|
|
122
133
|
*/
|
|
123
134
|
/**
|
|
@@ -125,11 +136,11 @@ async function syncLocalIfRequested(systemKey, options) {
|
|
|
125
136
|
* @param {string} externalSystem
|
|
126
137
|
* @returns {{ systemKey: string, keys: string[] }}
|
|
127
138
|
*/
|
|
128
|
-
function resolveExternalIntegrationContext(externalSystem) {
|
|
139
|
+
function resolveExternalIntegrationContext(externalSystem, pathOptions = {}) {
|
|
129
140
|
if (!externalSystem || typeof externalSystem !== 'string') {
|
|
130
141
|
throw new Error('External system name is required');
|
|
131
142
|
}
|
|
132
|
-
const appPath =
|
|
143
|
+
const appPath = resolveExternalSystemPath(externalSystem, pathOptions);
|
|
133
144
|
if (!fs.existsSync(appPath)) {
|
|
134
145
|
throw new Error(`Integration path not found: ${appPath}`);
|
|
135
146
|
}
|
|
@@ -199,6 +210,8 @@ async function runTestE2EForExternalSystem(externalSystem, options = {}) {
|
|
|
199
210
|
debug: options.debug,
|
|
200
211
|
verbose: options.verbose,
|
|
201
212
|
async: options.async !== false,
|
|
213
|
+
version: options.version,
|
|
214
|
+
syncMode: options.syncMode,
|
|
202
215
|
authConfig,
|
|
203
216
|
dataplaneUrl,
|
|
204
217
|
quietPollUi: options.quietPollUi === true,
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
'use strict';
|
|
8
8
|
|
|
9
|
-
const {
|
|
9
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* @param {string[]} [raw]
|
|
@@ -34,7 +34,7 @@ function normalizeTestGovernanceCliOptions(options, cmd) {
|
|
|
34
34
|
env: options.env || 'dev',
|
|
35
35
|
verbose: options.verbose === true || has('-v') || has('--verbose'),
|
|
36
36
|
json: options.json === true || has('--json'),
|
|
37
|
-
|
|
37
|
+
noPublish: cliOptsSkipPublish(options, cmd),
|
|
38
38
|
pack: options.pack,
|
|
39
39
|
app: options.app,
|
|
40
40
|
scenarioIds: collectScenarioIds(options.scenario)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
'use strict';
|
|
6
6
|
|
|
7
|
-
const {
|
|
7
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* @param {Object} options - Commander-parsed options
|
|
@@ -19,7 +19,7 @@ function normalizeTestTrustCliOptions(options, cmd) {
|
|
|
19
19
|
debug: options.debug === true || has('-d') || has('--debug'),
|
|
20
20
|
verbose: options.verbose === true || has('-v') || has('--verbose'),
|
|
21
21
|
revalidate: options.revalidate === true || has('--revalidate'),
|
|
22
|
-
|
|
22
|
+
noPublish: cliOptsSkipPublish(options, cmd),
|
|
23
23
|
strict: options.strict === true || has('--strict'),
|
|
24
24
|
summary: options.summary === true || has('--summary'),
|
|
25
25
|
json: options.json === true || has('--json'),
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless builder-api bootstrap provisioning (plan 154.2 / 197 pattern).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview up-builder-api bootstrap path when Docker + ENCRYPTION_KEY available
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const chalk = require('chalk');
|
|
12
|
+
const logger = require('../utils/logger');
|
|
13
|
+
const { callBootstrapApi } = require('../utils/app-bootstrap-api');
|
|
14
|
+
const {
|
|
15
|
+
loadVariablesYaml,
|
|
16
|
+
extractAppConfiguration
|
|
17
|
+
} = require('../utils/app-register-config');
|
|
18
|
+
const { buildRegistrationData, saveLocalCredentials, applyLocalhostPortAdjustment } = require('../app/register');
|
|
19
|
+
const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
|
|
20
|
+
const { resolveBootstrapEncryptionKey } = require('./up-dataplane-bootstrap');
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Register builder-api via bootstrap endpoint (idempotent).
|
|
24
|
+
* @async
|
|
25
|
+
* @param {Object} options - up-builder-api options
|
|
26
|
+
* @param {string} controllerUrl
|
|
27
|
+
* @param {string} environmentKey
|
|
28
|
+
* @param {Function} buildBuilderApiImageRefFn
|
|
29
|
+
* @returns {Promise<void>}
|
|
30
|
+
*/
|
|
31
|
+
async function bootstrapBuilderApiApplication(options, controllerUrl, environmentKey, buildBuilderApiImageRefFn) {
|
|
32
|
+
const encryptionKey = await resolveBootstrapEncryptionKey();
|
|
33
|
+
if (!encryptionKey) {
|
|
34
|
+
throw new Error(
|
|
35
|
+
'Bootstrap encryption key is not available. Ensure miso-controller-secrets-encryptionKeyVault ' +
|
|
36
|
+
'exists in merged secrets after up-miso resolve.'
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const { variables } = await loadVariablesYaml('builder-api');
|
|
41
|
+
const appConfig = await extractAppConfiguration(variables, 'builder-api', options);
|
|
42
|
+
await applyLocalhostPortAdjustment(appConfig, controllerUrl, options);
|
|
43
|
+
|
|
44
|
+
const imageOverride = options.image || buildBuilderApiImageRefFn(options);
|
|
45
|
+
const registerOpts = {
|
|
46
|
+
imageOverride,
|
|
47
|
+
image: imageOverride,
|
|
48
|
+
registryMode: options.registryMode,
|
|
49
|
+
envKey: environmentKey
|
|
50
|
+
};
|
|
51
|
+
const registrationData = buildRegistrationData(appConfig, registerOpts);
|
|
52
|
+
|
|
53
|
+
logger.log(chalk.blue('Provisioning builder-api via bootstrap (no device login)...'));
|
|
54
|
+
const responseData = await callBootstrapApi(
|
|
55
|
+
controllerUrl,
|
|
56
|
+
encryptionKey,
|
|
57
|
+
environmentKey,
|
|
58
|
+
registrationData
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
if (responseData.credentials && responseData.credentials.clientSecret) {
|
|
62
|
+
await saveLocalCredentials(responseData, controllerUrl);
|
|
63
|
+
logger.log(formatSuccessLine('Builder-api bootstrap credentials saved locally'));
|
|
64
|
+
} else if (responseData.status === 'already_provisioned') {
|
|
65
|
+
logger.log(formatSuccessLine('Builder-api already provisioned (bootstrap idempotent)'));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
module.exports = {
|
|
70
|
+
bootstrapBuilderApiApplication
|
|
71
|
+
};
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register, deploy, and env refresh for builder-api (plan 154.2).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Shared provision helpers for up-builder-api
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const chalk = require('chalk');
|
|
12
|
+
const pathsUtil = require('../utils/paths');
|
|
13
|
+
const { loadConfigFile } = require('../utils/config-format');
|
|
14
|
+
const { resolveDockerImageRef, normalizeDockerRegistryPrefix } = require('../utils/resolve-docker-image-ref');
|
|
15
|
+
const logger = require('../utils/logger');
|
|
16
|
+
const config = require('../core/config');
|
|
17
|
+
const { checkAuthentication } = require('../utils/app-register-auth');
|
|
18
|
+
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
19
|
+
const { resolveEnvironment } = require('../core/config');
|
|
20
|
+
const { registerApplication } = require('../app/register');
|
|
21
|
+
const { rotateSecret } = require('../app/rotate-secret');
|
|
22
|
+
const { checkApplicationExists } = require('../utils/app-existence');
|
|
23
|
+
const { checkHealthEndpoint } = require('../utils/health-check');
|
|
24
|
+
const app = require('../app');
|
|
25
|
+
const { assertDevInfraUp } = require('./dev-infra-gate');
|
|
26
|
+
const { publishedHostPort, parseDeveloperIdNum } = require('../utils/declarative-url-ports');
|
|
27
|
+
const { canUseBootstrapProvision } = require('./up-dataplane-bootstrap');
|
|
28
|
+
const { bootstrapBuilderApiApplication } = require('./up-builder-api-bootstrap');
|
|
29
|
+
const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
|
|
30
|
+
const { generateEnvFile } = require('../core/secrets');
|
|
31
|
+
|
|
32
|
+
const CONTROLLER_HEALTH_PATH = '/health';
|
|
33
|
+
const CONTROLLER_HEALTH_RETRY_ATTEMPTS = 30;
|
|
34
|
+
const CONTROLLER_HEALTH_RETRY_DELAY_MS = 2000;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @param {number} ms
|
|
38
|
+
* @returns {Promise<void>}
|
|
39
|
+
*/
|
|
40
|
+
function sleep(ms) {
|
|
41
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @param {string} baseUrl
|
|
46
|
+
* @returns {Promise<boolean>}
|
|
47
|
+
*/
|
|
48
|
+
async function isControllerHealthy(baseUrl) {
|
|
49
|
+
const healthUrl = `${baseUrl.replace(/\/+$/, '')}${CONTROLLER_HEALTH_PATH}`;
|
|
50
|
+
try {
|
|
51
|
+
return await checkHealthEndpoint(healthUrl, false);
|
|
52
|
+
} catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @param {string} baseUrl
|
|
59
|
+
* @param {{ attempts?: number, delayMs?: number }} [opts]
|
|
60
|
+
* @returns {Promise<boolean>}
|
|
61
|
+
*/
|
|
62
|
+
async function waitForControllerHealthy(baseUrl, opts = {}) {
|
|
63
|
+
const attempts = opts.attempts ?? CONTROLLER_HEALTH_RETRY_ATTEMPTS;
|
|
64
|
+
const delayMs = opts.delayMs ?? CONTROLLER_HEALTH_RETRY_DELAY_MS;
|
|
65
|
+
const normalized = baseUrl.replace(/\/+$/, '');
|
|
66
|
+
for (let i = 0; i < attempts; i += 1) {
|
|
67
|
+
if (await isControllerHealthy(normalized)) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
if (i < attempts - 1) {
|
|
71
|
+
await sleep(delayMs);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @param {Object} [options]
|
|
79
|
+
* @returns {string|undefined}
|
|
80
|
+
*/
|
|
81
|
+
function buildBuilderApiImageRef(options = {}) {
|
|
82
|
+
try {
|
|
83
|
+
const builderPath = pathsUtil.getBuilderPath('builder-api');
|
|
84
|
+
const configPath = pathsUtil.resolveApplicationConfigPath(builderPath);
|
|
85
|
+
const variables = loadConfigFile(configPath) || {};
|
|
86
|
+
const cli = normalizeDockerRegistryPrefix(options.registry);
|
|
87
|
+
const manifestReg = normalizeDockerRegistryPrefix(variables.image?.registry);
|
|
88
|
+
if (!cli && !manifestReg) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
const { imageName, imageTag } = resolveDockerImageRef('builder-api', variables, {
|
|
92
|
+
registry: options.registry || undefined
|
|
93
|
+
});
|
|
94
|
+
return `${imageName}:${imageTag}`;
|
|
95
|
+
} catch {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* @param {Object} cfg
|
|
102
|
+
*/
|
|
103
|
+
function assertDevEnvironmentForBuilderApi(cfg) {
|
|
104
|
+
const environment = cfg && cfg.environment ? cfg.environment : 'dev';
|
|
105
|
+
if (environment !== 'dev') {
|
|
106
|
+
throw new Error(
|
|
107
|
+
'Builder-api is only supported in dev environment. Set with: aifabrix auth --set-environment dev.'
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @async
|
|
114
|
+
* @param {Object} options
|
|
115
|
+
* @returns {Promise<string>}
|
|
116
|
+
*/
|
|
117
|
+
async function prepareHealthyControllerUrl(options) {
|
|
118
|
+
if (options.skipInfraCheck !== true) {
|
|
119
|
+
await assertDevInfraUp();
|
|
120
|
+
}
|
|
121
|
+
let controllerUrl = await resolveControllerUrl();
|
|
122
|
+
controllerUrl = controllerUrl.replace(/\/+$/, '');
|
|
123
|
+
const healthy = await waitForControllerHealthy(controllerUrl);
|
|
124
|
+
if (!healthy) {
|
|
125
|
+
throw new Error(`Controller at ${controllerUrl} is not responding. Ensure miso-controller is running.`);
|
|
126
|
+
}
|
|
127
|
+
return controllerUrl;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* @async
|
|
132
|
+
* @param {Object} options
|
|
133
|
+
* @param {string} environmentKey
|
|
134
|
+
* @returns {Promise<{ controllerUrl: string, authConfig: Object|null, useBootstrap: boolean }>}
|
|
135
|
+
*/
|
|
136
|
+
async function resolveUpBuilderApiControllerContext(options, environmentKey) {
|
|
137
|
+
const useBootstrap = await canUseBootstrapProvision(options);
|
|
138
|
+
const controllerUrl = await prepareHealthyControllerUrl(options);
|
|
139
|
+
const cfg = await config.getConfig();
|
|
140
|
+
if (options.allowNonDev !== true) {
|
|
141
|
+
assertDevEnvironmentForBuilderApi(cfg);
|
|
142
|
+
}
|
|
143
|
+
if (useBootstrap) {
|
|
144
|
+
if (options.platformInstall !== true) {
|
|
145
|
+
logger.log(formatSuccessLine('Using bootstrap provision (no device login)'));
|
|
146
|
+
}
|
|
147
|
+
return { controllerUrl, authConfig: null, useBootstrap: true };
|
|
148
|
+
}
|
|
149
|
+
const authConfig = await checkAuthentication(controllerUrl, environmentKey, { throwOnFailure: true });
|
|
150
|
+
if (options.platformInstall !== true) {
|
|
151
|
+
logger.log(formatSuccessLine(`Logged in (environment: ${environmentKey})`));
|
|
152
|
+
}
|
|
153
|
+
return { controllerUrl, authConfig, useBootstrap: false };
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* @async
|
|
158
|
+
*/
|
|
159
|
+
async function registerOrRotateBuilderApi(options, controllerUrl, environmentKey, authConfig) {
|
|
160
|
+
const appExists = await checkApplicationExists('builder-api', controllerUrl, environmentKey, authConfig);
|
|
161
|
+
if (appExists) {
|
|
162
|
+
logger.log(chalk.blue('Builder-api already registered; rotating secret...'));
|
|
163
|
+
await rotateSecret('builder-api', options);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const imageOverride = options.image || buildBuilderApiImageRef(options);
|
|
167
|
+
await registerApplication('builder-api', {
|
|
168
|
+
imageOverride,
|
|
169
|
+
image: imageOverride,
|
|
170
|
+
registryMode: options.registryMode,
|
|
171
|
+
envKey: environmentKey
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* @async
|
|
177
|
+
*/
|
|
178
|
+
async function deployBuilderApiToController(options) {
|
|
179
|
+
const imageOverride = options.image || buildBuilderApiImageRef(options);
|
|
180
|
+
await app.deployApp('builder-api', {
|
|
181
|
+
imageOverride,
|
|
182
|
+
image: imageOverride,
|
|
183
|
+
registryMode: options.registryMode,
|
|
184
|
+
envKey: options.envKey ? String(options.envKey).trim().toLowerCase() : undefined,
|
|
185
|
+
silentPoll: options.platformInstall === true
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* @async
|
|
191
|
+
*/
|
|
192
|
+
async function provisionAndDeployBuilderApi(options, environmentKey, controllerUrl, useBootstrap, authConfig) {
|
|
193
|
+
if (useBootstrap) {
|
|
194
|
+
await bootstrapBuilderApiApplication(options, controllerUrl, environmentKey, buildBuilderApiImageRef);
|
|
195
|
+
} else {
|
|
196
|
+
await registerOrRotateBuilderApi(options, controllerUrl, environmentKey, authConfig);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
await deployBuilderApiToController({
|
|
200
|
+
...options,
|
|
201
|
+
envKey: environmentKey,
|
|
202
|
+
...(useBootstrap ? { deploymentAuth: 'client-credentials' } : {})
|
|
203
|
+
});
|
|
204
|
+
logger.log('');
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Materialize builder-api .env after bootstrap/register so run uses fresh MISO_* credentials.
|
|
209
|
+
* @async
|
|
210
|
+
*/
|
|
211
|
+
async function refreshBuilderApiEnvAfterProvision() {
|
|
212
|
+
try {
|
|
213
|
+
await generateEnvFile('builder-api', null, 'local', true);
|
|
214
|
+
logger.log(formatSuccessLine('Refreshed builder-api .env from resolved secrets'));
|
|
215
|
+
} catch (error) {
|
|
216
|
+
logger.warn(chalk.yellow(`Could not refresh builder-api .env: ${error.message}`));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* @async
|
|
222
|
+
*/
|
|
223
|
+
async function computeBuilderApiRunOverrides(options) {
|
|
224
|
+
const runEnvKey = options.runEnvKey ? String(options.runEnvKey).trim().toLowerCase() : undefined;
|
|
225
|
+
const developerIdRaw = await config.getDeveloperId();
|
|
226
|
+
const developerIdNum = parseDeveloperIdNum(developerIdRaw);
|
|
227
|
+
if (runEnvKey && runEnvKey !== 'dev' && runEnvKey !== 'tst') {
|
|
228
|
+
return { runEnvKey, portOverride: undefined };
|
|
229
|
+
}
|
|
230
|
+
const portOverride = publishedHostPort(3005, developerIdNum);
|
|
231
|
+
return { runEnvKey, portOverride };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
module.exports = {
|
|
235
|
+
buildBuilderApiImageRef,
|
|
236
|
+
resolveUpBuilderApiControllerContext,
|
|
237
|
+
provisionAndDeployBuilderApi,
|
|
238
|
+
refreshBuilderApiEnvAfterProvision,
|
|
239
|
+
computeBuilderApiRunOverrides,
|
|
240
|
+
resolveEnvironment
|
|
241
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
const { formatSuccessParagraph } = require('../utils/cli-test-layout-chalk');
|
|
2
|
+
/**
|
|
3
|
+
* AI Fabrix Builder - Up Builder API Command
|
|
4
|
+
*
|
|
5
|
+
* Materializes builder-api from template, registers via bootstrap or device login,
|
|
6
|
+
* deploys manifest to controller, and runs locally (plan 154.2).
|
|
7
|
+
*
|
|
8
|
+
* @fileoverview up-builder-api command implementation
|
|
9
|
+
* @author AI Fabrix Team
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const chalk = require('chalk');
|
|
14
|
+
const logger = require('../utils/logger');
|
|
15
|
+
const app = require('../app');
|
|
16
|
+
const {
|
|
17
|
+
ensureBuilderApiAppsFromTemplate,
|
|
18
|
+
patchEnvOutputPathForDeployOnly,
|
|
19
|
+
validateEnvOutputPathFolderOrNull,
|
|
20
|
+
refreshUrlsLocalRegistryForCurrentProject
|
|
21
|
+
} = require('./up-common');
|
|
22
|
+
const {
|
|
23
|
+
resolveUpBuilderApiControllerContext,
|
|
24
|
+
provisionAndDeployBuilderApi,
|
|
25
|
+
refreshBuilderApiEnvAfterProvision,
|
|
26
|
+
computeBuilderApiRunOverrides,
|
|
27
|
+
resolveEnvironment
|
|
28
|
+
} = require('./up-builder-api-provision');
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @async
|
|
32
|
+
* @param {Object} [options]
|
|
33
|
+
* @returns {Promise<void>}
|
|
34
|
+
*/
|
|
35
|
+
async function handleUpBuilderApi(options = {}) {
|
|
36
|
+
if (options.platformInstall !== true) {
|
|
37
|
+
logger.log(
|
|
38
|
+
chalk.blue('Starting up-builder-api (bootstrap/register, deploy, then run builder-api locally)...\n')
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const environmentKey =
|
|
43
|
+
options && options.envKey
|
|
44
|
+
? String(options.envKey).trim().toLowerCase()
|
|
45
|
+
: await resolveEnvironment();
|
|
46
|
+
|
|
47
|
+
const { controllerUrl, authConfig, useBootstrap } = await resolveUpBuilderApiControllerContext(
|
|
48
|
+
options,
|
|
49
|
+
environmentKey
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
await ensureBuilderApiAppsFromTemplate({ silent: options.platformInstall === true });
|
|
53
|
+
validateEnvOutputPathFolderOrNull('builder-api');
|
|
54
|
+
patchEnvOutputPathForDeployOnly('builder-api');
|
|
55
|
+
refreshUrlsLocalRegistryForCurrentProject();
|
|
56
|
+
|
|
57
|
+
const { emitSystemBuilderAppManifestLineIfTTY } = require('../utils/manifest-source-emit');
|
|
58
|
+
emitSystemBuilderAppManifestLineIfTTY(logger, 'builder-api');
|
|
59
|
+
|
|
60
|
+
await provisionAndDeployBuilderApi(options, environmentKey, controllerUrl, useBootstrap, authConfig);
|
|
61
|
+
await refreshBuilderApiEnvAfterProvision();
|
|
62
|
+
|
|
63
|
+
const { portOverride } = await computeBuilderApiRunOverrides(options);
|
|
64
|
+
|
|
65
|
+
const runOpts = {
|
|
66
|
+
registry: options.registry,
|
|
67
|
+
registryMode: options.registryMode,
|
|
68
|
+
skipEnvOutputPath: true,
|
|
69
|
+
skipInfraCheck: true,
|
|
70
|
+
skipManifestMetadataLine: true,
|
|
71
|
+
...(portOverride !== undefined ? { port: portOverride } : {}),
|
|
72
|
+
...(options.platformInstall === true ? { silentPoll: true } : {})
|
|
73
|
+
};
|
|
74
|
+
if (options.image) {
|
|
75
|
+
runOpts.image = options.image;
|
|
76
|
+
}
|
|
77
|
+
await app.runApp('builder-api', runOpts);
|
|
78
|
+
|
|
79
|
+
if (options.platformInstall !== true) {
|
|
80
|
+
logger.log(
|
|
81
|
+
formatSuccessParagraph(
|
|
82
|
+
'up-builder-api complete. Builder-api is registered, deployed in dev, and running locally.'
|
|
83
|
+
)
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
module.exports = { handleUpBuilderApi };
|
|
@@ -328,11 +328,15 @@ async function ensureAppFromTemplate(appName, opts = {}) {
|
|
|
328
328
|
/** Dataplane app key materialized for dataplane install (worker/beat are compose sidecars). */
|
|
329
329
|
const DATAPLANE_BUILDER_APP_KEYS = Object.freeze(['dataplane']);
|
|
330
330
|
|
|
331
|
+
/** Builder API platform app key (154.2). */
|
|
332
|
+
const BUILDER_API_APP_KEYS = Object.freeze(['builder-api']);
|
|
333
|
+
|
|
331
334
|
/** Builder dirs removed on up-platform / setup force (includes Celery companions). */
|
|
332
335
|
const PLATFORM_BUILDER_CLEAN_APP_KEYS = Object.freeze([
|
|
333
336
|
'keycloak',
|
|
334
337
|
'miso-controller',
|
|
335
|
-
...DATAPLANE_BUILDER_APP_KEYS
|
|
338
|
+
...DATAPLANE_BUILDER_APP_KEYS,
|
|
339
|
+
...BUILDER_API_APP_KEYS
|
|
336
340
|
]);
|
|
337
341
|
|
|
338
342
|
/**
|
|
@@ -354,6 +358,23 @@ async function ensureDataplaneAppsFromTemplate(opts = {}) {
|
|
|
354
358
|
return anyCopied;
|
|
355
359
|
}
|
|
356
360
|
|
|
361
|
+
/**
|
|
362
|
+
* Ensure builder-api manifest exists under the system builder root.
|
|
363
|
+
*
|
|
364
|
+
* @param {object} [opts]
|
|
365
|
+
* @returns {Promise<boolean>}
|
|
366
|
+
*/
|
|
367
|
+
async function ensureBuilderApiAppsFromTemplate(opts = {}) {
|
|
368
|
+
let anyCopied = false;
|
|
369
|
+
for (const appName of BUILDER_API_APP_KEYS) {
|
|
370
|
+
const copied = await ensureAppFromTemplate(appName, opts);
|
|
371
|
+
if (copied) {
|
|
372
|
+
anyCopied = true;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return anyCopied;
|
|
376
|
+
}
|
|
377
|
+
|
|
357
378
|
/**
|
|
358
379
|
* Merge builder/packages `application.yaml` into `~/.aifabrix/urls.local.yaml`.
|
|
359
380
|
* Same scan as the end of {@link prepareUrlsLocalRegistryForUpPlatform}; call after platform app
|
|
@@ -381,15 +402,18 @@ async function prepareUrlsLocalRegistryForUpPlatform(opts = {}) {
|
|
|
381
402
|
await ensureAppFromTemplate('keycloak', templateOpts);
|
|
382
403
|
await ensureAppFromTemplate('miso-controller', templateOpts);
|
|
383
404
|
await ensureDataplaneAppsFromTemplate(templateOpts);
|
|
405
|
+
await ensureBuilderApiAppsFromTemplate(templateOpts);
|
|
384
406
|
refreshUrlsLocalRegistryForCurrentProject();
|
|
385
407
|
}
|
|
386
408
|
|
|
387
409
|
module.exports = {
|
|
388
410
|
applyUpPlatformForceConfig,
|
|
389
411
|
cleanBuilderAppDirs,
|
|
412
|
+
BUILDER_API_APP_KEYS,
|
|
390
413
|
DATAPLANE_BUILDER_APP_KEYS,
|
|
391
414
|
PLATFORM_BUILDER_CLEAN_APP_KEYS,
|
|
392
415
|
ensureAppFromTemplate,
|
|
416
|
+
ensureBuilderApiAppsFromTemplate,
|
|
393
417
|
ensureDataplaneAppsFromTemplate,
|
|
394
418
|
patchEnvOutputPathForDeployOnly,
|
|
395
419
|
validateEnvOutputPathFolderOrNull,
|