@aifabrix/builder 2.49.2 → 2.51.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/plans/157.1-security-quality-violations-by-type.csv +374 -0
- package/.cursor/rules/assistant-driven-integration-build.mdc +40 -0
- 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/integration/hubspot-test/create-hubspot.js +1 -16
- 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-kinds.api.js +128 -0
- package/lib/api/evidence.api.js +172 -0
- package/lib/api/external-systems.api.js +8 -2
- package/lib/api/pipeline.api.js +5 -1
- package/lib/api/resource-types.api.js +5 -4
- package/lib/api/roles.api.js +121 -0
- package/lib/api/types/enterprise-knowledge.types.js +46 -0
- package/lib/api/types/evidence-kinds.types.js +42 -0
- package/lib/api/types/evidence.types.js +67 -0
- package/lib/api/types/resource-types.types.js +2 -0
- package/lib/api/types/roles.types.js +36 -0
- package/lib/app/certification-verify-rows.js +1 -1
- 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 +39 -90
- 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/merge-certification-from-artifact.js +1 -1
- 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 +18 -5
- 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 +31 -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 +60 -130
- 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 +30 -9
- 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-help-after.js +12 -0
- package/lib/cli/setup-utility-repair.js +26 -7
- package/lib/cli/setup-utility-validate.js +41 -2
- 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 +184 -0
- package/lib/commands/deploy-gate-orchestrator.js +368 -0
- package/lib/commands/dev-cli-handlers.js +7 -62
- 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 +6 -106
- package/lib/commands/dev-refresh.js +197 -0
- package/lib/commands/enterprise-knowledge.js +284 -0
- package/lib/commands/evidence-cli-leaves.js +250 -0
- package/lib/commands/evidence-kind.js +428 -0
- package/lib/commands/evidence.js +51 -0
- package/lib/commands/governance-cli-shared.js +2 -2
- package/lib/commands/governance-command-action.js +5 -3
- 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 +33 -8
- 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 +166 -44
- package/lib/commands/role.js +452 -0
- package/lib/commands/run-post-publish-data-sync.js +68 -0
- package/lib/commands/setup-modes.js +1 -1
- package/lib/commands/setup.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/validate-json.js +230 -0
- 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 +79 -41
- 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/audit-logger.js +1 -1
- package/lib/core/secrets-env-content.js +10 -4
- package/lib/core/secrets-env-write.js +2 -13
- package/lib/core/secrets-load.js +1 -3
- package/lib/datasource/agent-trust-run.js +3 -3
- package/lib/datasource/capability/relate-operations.js +1 -1
- 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/helpers.js +13 -5
- package/lib/generator/index.js +17 -2
- package/lib/generator/split-variables.js +9 -3
- package/lib/generator/wizard.js +3 -36
- package/lib/infrastructure/helpers-docker-check.js +6 -0
- package/lib/infrastructure/helpers.js +1 -1
- 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 +45 -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 +114 -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 +222 -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 +493 -0
- package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
- package/lib/programmatic/openapi-schema-descriptions-core.js +162 -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 +108 -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 +62 -0
- package/lib/programmatic/run-template-workspace.js +74 -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/evidence-kind-file.js +230 -0
- package/lib/resolvers/resource-type-file.js +58 -1
- package/lib/resolvers/role-file.js +227 -0
- package/lib/schema/application-schema.json +22 -2
- package/lib/schema/external-datasource.schema.json +245 -2
- package/lib/schema/external-system.schema.json +259 -119
- package/lib/schema/flag-map-validation-run.json +3 -0
- package/lib/schema/infra.parameter.yaml +25 -1
- package/lib/schema/type/credential-field-registry.json +21 -5
- package/lib/schema/type/document-storage.json +9 -0
- package/lib/utils/agent-trust-run-display.js +1 -1
- package/lib/utils/api.js +8 -2
- package/lib/utils/app-path-resolve.js +168 -0
- package/lib/utils/app-register-config.js +4 -3
- package/lib/utils/authentication-env-template.js +222 -0
- package/lib/utils/cli-sync-options.js +62 -10
- package/lib/utils/cli-utils.js +15 -3
- 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-ca-install.js +5 -6
- package/lib/utils/dev-config.js +2 -2
- package/lib/utils/dev-init-ssh-merge.js +165 -23
- package/lib/utils/dev-list-sort.js +145 -0
- package/lib/utils/dev-pin-share-instructions.js +110 -0
- package/lib/utils/dev-platform-tls.js +0 -63
- package/lib/utils/dev-ssh-config-helper.js +177 -33
- package/lib/utils/docker-build.js +46 -27
- package/lib/utils/docker-daemon-tls-ca.js +1 -1
- package/lib/utils/docker-exec.js +91 -6
- package/lib/utils/enterprise-knowledge-paths.js +142 -0
- package/lib/utils/env-copy.js +3 -4
- package/lib/utils/env-dotenv-format.js +103 -0
- package/lib/utils/error-formatters/error-parser.js +0 -3
- package/lib/utils/external-env-template.js +5 -2
- package/lib/utils/external-system-display.js +5 -1
- package/lib/utils/external-system-readiness-compact-blocks.js +248 -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/health-check-request.js +2 -3
- package/lib/utils/help-builder.js +9 -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/image-name.js +22 -4
- package/lib/utils/integration-path-resolve.js +112 -0
- package/lib/utils/logger.js +37 -4
- package/lib/utils/manifest-source-emit.js +1 -1
- package/lib/utils/paths-reload-source.js +148 -0
- package/lib/utils/paths-system-builder-keys.js +25 -0
- package/lib/utils/paths.js +183 -30
- package/lib/utils/pipeline-upload-auth-retry.js +4 -0
- package/lib/utils/postgres-platform-bootstrap.js +24 -17
- package/lib/utils/postgres-wipe.js +5 -2
- package/lib/utils/remote-dev-auth.js +39 -4
- package/lib/utils/resolve-docker-image-ref.js +36 -6
- 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/token-manager.js +16 -0
- package/lib/utils/upload-sync-options.js +20 -2
- 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 +430 -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/lib/validation/validator.js +6 -5
- package/package.json +76 -37
- 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 +337 -0
- package/scripts/lib/plan-run-core.js +125 -0
- package/scripts/lib/plan-run-report.js +119 -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 +27 -5
- package/templates/applications/dataplane/env.template +38 -15
- package/templates/applications/dataplane/rbac.yaml +85 -3
- package/templates/applications/miso-controller/application.yaml +10 -1
- package/templates/applications/miso-controller/env.template +11 -10
- package/templates/applications/miso-controller/rbac.yaml +72 -0
- 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 +144 -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 +2 -2
- package/templates/typescript/docker-compose.hbs +11 -0
- package/lib/certification/cli-cert-sync-skip.js +0 -21
|
@@ -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,
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential + runtime config push with compact/verbose logging for upload publish.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Upload credential push helpers
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const chalk = require('chalk');
|
|
13
|
+
const logger = require('../utils/logger');
|
|
14
|
+
const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
|
|
15
|
+
const { resolveExternalSystemPath } = require('../utils/app-path-resolve');
|
|
16
|
+
const { pushCredentialSecrets } = require('../utils/credential-secrets-env');
|
|
17
|
+
const { runWithCredentialPushSpinner } = require('../utils/credential-push-ui');
|
|
18
|
+
const { collectResolvedVariableConfigurationNames } = require('../utils/configuration-env-resolver');
|
|
19
|
+
const { pushRuntimeConfigurationValues } = require('../utils/runtime-configuration-values');
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param {Object} pushResult
|
|
23
|
+
* @param {string[]} resolvedParamNames
|
|
24
|
+
* @param {boolean} quietLog
|
|
25
|
+
*/
|
|
26
|
+
function logCredentialPushOutcome(pushResult, resolvedParamNames, quietLog) {
|
|
27
|
+
if (quietLog) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (pushResult.pushed > 0) {
|
|
31
|
+
const keyList = pushResult.keys?.length ? ` (${pushResult.keys.join(', ')})` : '';
|
|
32
|
+
logger.log(
|
|
33
|
+
formatSuccessLine(`Pushed ${pushResult.pushed} credential secret(s) to dataplane${keyList}.`)
|
|
34
|
+
);
|
|
35
|
+
} else {
|
|
36
|
+
logger.log(chalk.yellow('Secret push skipped'));
|
|
37
|
+
}
|
|
38
|
+
if (resolvedParamNames.length > 0) {
|
|
39
|
+
const nameList = ` (${resolvedParamNames.join(', ')})`;
|
|
40
|
+
logger.log(
|
|
41
|
+
formatSuccessLine(
|
|
42
|
+
`Resolved ${resolvedParamNames.length} integration parameter(s) from .env for publish${nameList}.`
|
|
43
|
+
)
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
if (pushResult.warning) {
|
|
47
|
+
logger.log(chalk.yellow(`Warning: ${pushResult.warning}`));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @async
|
|
53
|
+
* @returns {Promise<{ pushed: number, names: string[] }>}
|
|
54
|
+
*/
|
|
55
|
+
async function pushRuntimeConfigWithLog(dataplaneUrl, authConfig, systemKey, payload, quietLog) {
|
|
56
|
+
try {
|
|
57
|
+
const configPush = await pushRuntimeConfigurationValues(dataplaneUrl, authConfig, systemKey, payload);
|
|
58
|
+
if (configPush.pushed > 0 && !quietLog) {
|
|
59
|
+
const nameList = configPush.names.length ? ` (${configPush.names.join(', ')})` : '';
|
|
60
|
+
logger.log(
|
|
61
|
+
formatSuccessLine(
|
|
62
|
+
`Stored ${configPush.pushed} runtime configuration value(s) in dataplane${nameList}.`
|
|
63
|
+
)
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
return configPush;
|
|
67
|
+
} catch (err) {
|
|
68
|
+
if (!quietLog) {
|
|
69
|
+
logger.log(chalk.yellow(`Warning: runtime configuration store skipped: ${err.message}`));
|
|
70
|
+
}
|
|
71
|
+
return { pushed: 0, names: [] };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Pushes credential secrets from .env and payload to dataplane; logs result or warning.
|
|
77
|
+
*
|
|
78
|
+
* @async
|
|
79
|
+
* @param {string} dataplaneUrl
|
|
80
|
+
* @param {Object} authConfig
|
|
81
|
+
* @param {string} systemKey
|
|
82
|
+
* @param {Object} payload
|
|
83
|
+
* @param {Object} [uiOpts]
|
|
84
|
+
* @returns {Promise<Object>}
|
|
85
|
+
*/
|
|
86
|
+
async function pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload, uiOpts = {}) {
|
|
87
|
+
const pathOptions = uiOpts.pathOptions || {};
|
|
88
|
+
const envFilePath = path.join(resolveExternalSystemPath(systemKey, pathOptions), '.env');
|
|
89
|
+
const pushResult = await runWithCredentialPushSpinner(
|
|
90
|
+
() =>
|
|
91
|
+
pushCredentialSecrets(dataplaneUrl, authConfig, {
|
|
92
|
+
envFilePath,
|
|
93
|
+
appName: systemKey,
|
|
94
|
+
payload
|
|
95
|
+
}),
|
|
96
|
+
{ systemKey, json: uiOpts.json === true }
|
|
97
|
+
);
|
|
98
|
+
const resolvedParamNames = collectResolvedVariableConfigurationNames(payload);
|
|
99
|
+
const quietLog = uiOpts.suppressCredentialLog === true;
|
|
100
|
+
logCredentialPushOutcome(pushResult, resolvedParamNames, quietLog);
|
|
101
|
+
const configPush = await pushRuntimeConfigWithLog(
|
|
102
|
+
dataplaneUrl,
|
|
103
|
+
authConfig,
|
|
104
|
+
systemKey,
|
|
105
|
+
payload,
|
|
106
|
+
quietLog
|
|
107
|
+
);
|
|
108
|
+
return {
|
|
109
|
+
credentialPush: { pushed: pushResult.pushed || 0, keys: pushResult.keys || [] },
|
|
110
|
+
configPush,
|
|
111
|
+
resolvedParamNames
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
module.exports = {
|
|
116
|
+
pushAndLogCredentialSecrets
|
|
117
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Finalize upload with optional datasource data sync.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const { runPostPublishDataSync } = require('./run-post-publish-data-sync');
|
|
10
|
+
const { runUploadSidecarFollowups } = require('./upload-sidecar-followups');
|
|
11
|
+
const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
|
|
12
|
+
const logger = require('../utils/logger');
|
|
13
|
+
const { isQuietMinimalSync } = require('../utils/upload-sync-options');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @async
|
|
17
|
+
* @param {Object} ctx
|
|
18
|
+
* @param {Object} payload
|
|
19
|
+
* @param {Object} options
|
|
20
|
+
* @returns {Promise<Object>}
|
|
21
|
+
*/
|
|
22
|
+
async function finalizeUploadPublishResult(ctx, payload, options) {
|
|
23
|
+
const dataSync = await runPostPublishDataSync({
|
|
24
|
+
dataplaneUrl: ctx.dataplaneUrl,
|
|
25
|
+
authConfig: ctx.authConfig,
|
|
26
|
+
payload,
|
|
27
|
+
options,
|
|
28
|
+
label: 'Upload data sync'
|
|
29
|
+
});
|
|
30
|
+
return { ...ctx, dataSync };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @async
|
|
35
|
+
* @param {Object} params
|
|
36
|
+
* @returns {Promise<Object>}
|
|
37
|
+
*/
|
|
38
|
+
async function finishUnchangedUploadPublication(params) {
|
|
39
|
+
const { systemKey, options, payload, dataplaneUrl, authConfig, environment } = params;
|
|
40
|
+
if (!isQuietMinimalSync(options)) {
|
|
41
|
+
logger.log(formatSuccessLine('Config unchanged on dataplane — upload skipped.'));
|
|
42
|
+
}
|
|
43
|
+
await runUploadSidecarFollowups({
|
|
44
|
+
systemKey,
|
|
45
|
+
options,
|
|
46
|
+
payload,
|
|
47
|
+
dataplaneUrl,
|
|
48
|
+
authConfig
|
|
49
|
+
});
|
|
50
|
+
return finalizeUploadPublishResult(
|
|
51
|
+
{ dataplaneUrl, authConfig, environment, uploadSkipped: true },
|
|
52
|
+
payload,
|
|
53
|
+
options
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
module.exports = {
|
|
58
|
+
finalizeUploadPublishResult,
|
|
59
|
+
finishUnchangedUploadPublication
|
|
60
|
+
};
|