@aifabrix/builder 2.49.1 → 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/process/README.md +9 -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/jest.isolated-projects.js +31 -1
- package/jest.projects.js +87 -1
- package/lib/api/dev-server-https.js +1 -1
- package/lib/api/dev.api.js +1 -0
- 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/host-ops.api.js +69 -0
- 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-path-commands.js +24 -0
- package/lib/cli/setup-dev.js +115 -16
- 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 +64 -61
- 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 +252 -0
- 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 +242 -4
- 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,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel integration templates — copied from templates/channels/<target>/integration/.
|
|
3
|
+
* SSOT for slack: aifabrix-dataplane/integration/slack (make sync-json in dataplane).
|
|
4
|
+
*
|
|
5
|
+
* @fileoverview Template resolution and copy for channel scaffold (plan 152)
|
|
6
|
+
* @author AI Fabrix Team
|
|
7
|
+
* @version 2.0.0
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
const { nodeFs } = require('../internal/node-fs');
|
|
13
|
+
const fs = nodeFs();
|
|
14
|
+
const path = require('path');
|
|
15
|
+
const { getChannelTarget } = require('./channel-targets');
|
|
16
|
+
|
|
17
|
+
const BUILDER_ROOT = path.join(__dirname, '..', '..');
|
|
18
|
+
|
|
19
|
+
/** @type {RegExp[]} */
|
|
20
|
+
const SKIP_TEMPLATE_FILE = [
|
|
21
|
+
/^\./,
|
|
22
|
+
/-deploy\.json$/,
|
|
23
|
+
/^INTEGRATION_CHANGELOG\.md$/i
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @param {string} channelTarget
|
|
28
|
+
* @returns {string}
|
|
29
|
+
*/
|
|
30
|
+
function getChannelIntegrationTemplateDir(channelTarget) {
|
|
31
|
+
const target = getChannelTarget(channelTarget);
|
|
32
|
+
return path.join(BUILDER_ROOT, 'templates', 'channels', target.templateDir, 'integration');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param {string} name
|
|
37
|
+
* @returns {boolean}
|
|
38
|
+
*/
|
|
39
|
+
function shouldCopyTemplateFile(name) {
|
|
40
|
+
return !SKIP_TEMPLATE_FILE.some((pattern) => pattern.test(name));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @param {string} templateDir
|
|
45
|
+
* @returns {string[]}
|
|
46
|
+
*/
|
|
47
|
+
function listChannelIntegrationTemplateFiles(templateDir) {
|
|
48
|
+
if (!fs.existsSync(templateDir)) {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
return fs
|
|
52
|
+
.readdirSync(templateDir)
|
|
53
|
+
.filter((name) => {
|
|
54
|
+
const full = path.join(templateDir, name);
|
|
55
|
+
return fs.statSync(full).isFile() && shouldCopyTemplateFile(name);
|
|
56
|
+
})
|
|
57
|
+
.sort();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @param {string} channelTarget
|
|
62
|
+
* @param {string} integrationDir
|
|
63
|
+
* @returns {string[]} Copied file paths
|
|
64
|
+
*/
|
|
65
|
+
function copyChannelIntegrationTemplate(channelTarget, integrationDir) {
|
|
66
|
+
const templateDir = getChannelIntegrationTemplateDir(channelTarget);
|
|
67
|
+
const names = listChannelIntegrationTemplateFiles(templateDir);
|
|
68
|
+
if (names.length === 0) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`Channel integration template missing for "${channelTarget}" (${templateDir}). ` +
|
|
71
|
+
'For slack: edit aifabrix-dataplane/integration/slack and run make sync-json. ' +
|
|
72
|
+
'For other targets: add templates/channels/<target>/integration/ until dataplane SSOT exists.'
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
fs.mkdirSync(integrationDir, { recursive: true });
|
|
77
|
+
const copied = [];
|
|
78
|
+
for (const name of names) {
|
|
79
|
+
const src = path.join(templateDir, name);
|
|
80
|
+
const dest = path.join(integrationDir, name);
|
|
81
|
+
fs.copyFileSync(src, dest);
|
|
82
|
+
copied.push(dest);
|
|
83
|
+
}
|
|
84
|
+
return copied;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
module.exports = {
|
|
88
|
+
BUILDER_ROOT,
|
|
89
|
+
SKIP_TEMPLATE_FILE,
|
|
90
|
+
getChannelIntegrationTemplateDir,
|
|
91
|
+
shouldCopyTemplateFile,
|
|
92
|
+
listChannelIntegrationTemplateFiles,
|
|
93
|
+
copyChannelIntegrationTemplate
|
|
94
|
+
};
|
|
@@ -9,6 +9,10 @@
|
|
|
9
9
|
'use strict';
|
|
10
10
|
|
|
11
11
|
const { getChannelTarget } = require('./channel-targets');
|
|
12
|
+
const { normalizeSlackAppDescription } = require('./channel-description');
|
|
13
|
+
|
|
14
|
+
/** Default Slack slash prefix — matches dataplane `templates/slack/command_catalog.yaml`. */
|
|
15
|
+
const DEFAULT_SLACK_COMMAND_PREFIX = 'af';
|
|
12
16
|
|
|
13
17
|
/**
|
|
14
18
|
* Normalize dataplane base URL (no trailing slash).
|
|
@@ -50,7 +54,6 @@ function getEndpointPathSuffixes(channelTarget) {
|
|
|
50
54
|
slack: {
|
|
51
55
|
eventsUrl: '/events',
|
|
52
56
|
interactionUrl: '/interactive',
|
|
53
|
-
oauthCallbackUrl: '/oauth/callback',
|
|
54
57
|
commandUrl: '/commands'
|
|
55
58
|
},
|
|
56
59
|
'teams-bot': {
|
|
@@ -97,6 +100,26 @@ function getLegacyApiPaths(channelTarget) {
|
|
|
97
100
|
return legacy[channelTarget] || {};
|
|
98
101
|
}
|
|
99
102
|
|
|
103
|
+
/**
|
|
104
|
+
* Slack token rotation requires OAuth redirect URLs (api.slack.com app manifest).
|
|
105
|
+
* @param {string|undefined} oauthCallbackUrl
|
|
106
|
+
* @returns {{ oauthCallbackUrl?: string, slackRedirectUrlsJson: string, slackTokenRotationEnabled: boolean }}
|
|
107
|
+
*/
|
|
108
|
+
function resolveSlackOAuthManifestFields(oauthCallbackUrl) {
|
|
109
|
+
const url = typeof oauthCallbackUrl === 'string' ? oauthCallbackUrl.trim() : '';
|
|
110
|
+
if (!url) {
|
|
111
|
+
return {
|
|
112
|
+
slackRedirectUrlsJson: '[]',
|
|
113
|
+
slackTokenRotationEnabled: false
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
oauthCallbackUrl: url,
|
|
118
|
+
slackRedirectUrlsJson: JSON.stringify([url]),
|
|
119
|
+
slackTokenRotationEnabled: true
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
100
123
|
/**
|
|
101
124
|
* @param {Object} params
|
|
102
125
|
* @param {string} params.dataplaneBaseUrl
|
|
@@ -106,6 +129,7 @@ function getLegacyApiPaths(channelTarget) {
|
|
|
106
129
|
* @param {string} [params.environment]
|
|
107
130
|
* @param {string} params.appDescription
|
|
108
131
|
* @param {string} [params.icon]
|
|
132
|
+
* @param {string} [params.commandPrefix] Slack slash alias prefix (default `af`)
|
|
109
133
|
* @returns {Object}
|
|
110
134
|
*/
|
|
111
135
|
function resolveChannelRuntimeValues(params) {
|
|
@@ -123,9 +147,13 @@ function resolveChannelRuntimeValues(params) {
|
|
|
123
147
|
appName: params.appName,
|
|
124
148
|
baseName: params.baseName || params.appName,
|
|
125
149
|
environment: params.environment || 'dev',
|
|
126
|
-
appDescription:
|
|
150
|
+
appDescription:
|
|
151
|
+
params.channelTarget === 'slack'
|
|
152
|
+
? normalizeSlackAppDescription(params.appDescription)
|
|
153
|
+
: params.appDescription,
|
|
127
154
|
icon: params.icon || '',
|
|
128
155
|
credentialKey: target.credentialKey,
|
|
156
|
+
credentialPortalUrl: joinUrl(base, `/connected-systems/${params.channelTarget}?tab=authentication`),
|
|
129
157
|
assistantCatalogUrl: joinUrl(base, '/api/v1/workers/available'),
|
|
130
158
|
scopes: []
|
|
131
159
|
};
|
|
@@ -140,6 +168,16 @@ function resolveChannelRuntimeValues(params) {
|
|
|
140
168
|
}
|
|
141
169
|
}
|
|
142
170
|
|
|
171
|
+
if (params.channelTarget === 'slack') {
|
|
172
|
+
const oauthCallbackUrl = params.oauthCallbackUrl || resolved.oauthCallbackUrl;
|
|
173
|
+
Object.assign(resolved, resolveSlackOAuthManifestFields(oauthCallbackUrl));
|
|
174
|
+
const prefix =
|
|
175
|
+
typeof params.commandPrefix === 'string' && params.commandPrefix.trim()
|
|
176
|
+
? params.commandPrefix.trim()
|
|
177
|
+
: DEFAULT_SLACK_COMMAND_PREFIX;
|
|
178
|
+
resolved.commandPrefix = prefix;
|
|
179
|
+
}
|
|
180
|
+
|
|
143
181
|
return resolved;
|
|
144
182
|
}
|
|
145
183
|
|
|
@@ -148,5 +186,7 @@ module.exports = {
|
|
|
148
186
|
joinUrl,
|
|
149
187
|
externalSystemsPrefix,
|
|
150
188
|
getEndpointPathSuffixes,
|
|
151
|
-
|
|
189
|
+
resolveSlackOAuthManifestFields,
|
|
190
|
+
resolveChannelRuntimeValues,
|
|
191
|
+
DEFAULT_SLACK_COMMAND_PREFIX
|
|
152
192
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* TTY output for
|
|
2
|
+
* TTY output for channel add (plan 152).
|
|
3
3
|
*
|
|
4
4
|
* @fileoverview Channel install status display — customer language: Assistant
|
|
5
5
|
* @author AI Fabrix Team
|
|
@@ -26,32 +26,79 @@ function separatorLine() {
|
|
|
26
26
|
: '────────────────────────────────────────';
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
/**
|
|
30
|
+
* @param {Object|null} approvalGuide
|
|
31
|
+
*/
|
|
32
|
+
function displayApprovalGuideOptionalLinks(approvalGuide) {
|
|
33
|
+
if (approvalGuide.artifactPath) {
|
|
34
|
+
logger.log('');
|
|
35
|
+
logger.log(metadata('Manifest file:'));
|
|
36
|
+
logger.log(chalk.white(approvalGuide.artifactPath));
|
|
37
|
+
}
|
|
38
|
+
if (approvalGuide.credentialPortalUrl) {
|
|
39
|
+
logger.log('');
|
|
40
|
+
logger.log(metadata('AI Fabrix authentication:'));
|
|
41
|
+
logger.log(chalk.cyan(approvalGuide.credentialPortalUrl));
|
|
42
|
+
}
|
|
43
|
+
if (approvalGuide.installGuidePath) {
|
|
44
|
+
logger.log('');
|
|
45
|
+
logger.log(metadata(`Full guide: ${approvalGuide.installGuidePath}`));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @param {Object|null} approvalGuide
|
|
51
|
+
*/
|
|
52
|
+
function displayApprovalGuideSection(approvalGuide) {
|
|
53
|
+
if (!approvalGuide?.steps?.length) return;
|
|
54
|
+
logger.log('');
|
|
55
|
+
const heading =
|
|
56
|
+
approvalGuide.approvalRequired === false
|
|
57
|
+
? 'Go-live steps'
|
|
58
|
+
: 'Platform admin approval required';
|
|
59
|
+
logger.log(formatWarningLine(heading));
|
|
60
|
+
if (approvalGuide.portalUrl) {
|
|
61
|
+
logger.log(metadata('Admin console:'));
|
|
62
|
+
logger.log(chalk.cyan(approvalGuide.portalUrl));
|
|
63
|
+
}
|
|
64
|
+
logger.log('');
|
|
65
|
+
logger.log(metadata('Next steps:'));
|
|
66
|
+
approvalGuide.steps.forEach((step, index) => {
|
|
67
|
+
logger.log(chalk.white(` ${index + 1}. ${step}`));
|
|
68
|
+
});
|
|
69
|
+
displayApprovalGuideOptionalLinks(approvalGuide);
|
|
70
|
+
}
|
|
71
|
+
|
|
29
72
|
/**
|
|
30
73
|
* @param {Object} params
|
|
31
74
|
* @param {string} params.channelTarget
|
|
32
75
|
* @param {string} params.name
|
|
33
76
|
* @param {Object|null} params.channelExt
|
|
34
|
-
* @param {
|
|
77
|
+
* @param {Object|null} [params.approvalGuide]
|
|
35
78
|
*/
|
|
36
79
|
function displayExistingChannelStatus(params) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
80
|
+
const status = params.channelExt?.status || 'unknown';
|
|
81
|
+
displayChannelCoreFields({
|
|
82
|
+
channelTarget: params.channelTarget,
|
|
83
|
+
name: params.name,
|
|
84
|
+
statusLabel: status,
|
|
85
|
+
baseName: params.channelExt?.baseName,
|
|
86
|
+
credentialKey: params.channelExt?.credentialKey,
|
|
87
|
+
capabilities: params.channelExt?.capabilities
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
if (status === 'approvalRequired' && params.approvalGuide) {
|
|
91
|
+
displayApprovalGuideSection(params.approvalGuide);
|
|
92
|
+
logger.log(separatorLine());
|
|
93
|
+
return;
|
|
50
94
|
}
|
|
95
|
+
|
|
51
96
|
logger.log('');
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
logger.log(metadata(
|
|
97
|
+
if (status === 'installed' || status === 'validated') {
|
|
98
|
+
logger.log(formatSuccessLine('Channel install is complete.'));
|
|
99
|
+
logger.log(metadata('Use --force to regenerate artifacts and patch config.'));
|
|
100
|
+
} else {
|
|
101
|
+
logger.log(formatWarningLine('Channel install already configured. Use --force to regenerate artifacts.'));
|
|
55
102
|
}
|
|
56
103
|
logger.log(separatorLine());
|
|
57
104
|
}
|
|
@@ -107,14 +154,7 @@ function displayValidationSection(validation) {
|
|
|
107
154
|
* @param {Object} result
|
|
108
155
|
*/
|
|
109
156
|
function displayApprovalSection(result) {
|
|
110
|
-
|
|
111
|
-
logger.log('');
|
|
112
|
-
logger.log(formatWarningLine('Approval required'));
|
|
113
|
-
logger.log(metadata('Open this URL as platform admin:'));
|
|
114
|
-
logger.log(chalk.cyan(result.approvalUrl));
|
|
115
|
-
logger.log('');
|
|
116
|
-
logger.log(metadata('After approval, run:'));
|
|
117
|
-
logger.log(chalk.white(` aifabrix app add-channel ${result.channelTarget} --name "${result.name}"`));
|
|
157
|
+
displayApprovalGuideSection(result.approvalGuide);
|
|
118
158
|
}
|
|
119
159
|
|
|
120
160
|
/**
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
/** @typedef {'teams-bot'|'slack'|'microsoft-copilot'|'chatgpt'|'web-embed'} ChannelTargetKey */
|
|
12
12
|
|
|
13
|
-
const DEFAULT_CAPABILITIES = ['chat', 'notify'];
|
|
13
|
+
const DEFAULT_CAPABILITIES = ['chat', 'notify', 'documentApproval'];
|
|
14
14
|
|
|
15
15
|
const CHANNEL_TARGETS = {
|
|
16
16
|
'teams-bot': {
|
|
@@ -101,8 +101,8 @@ function getChannelTarget(channelTarget) {
|
|
|
101
101
|
*/
|
|
102
102
|
function getDefaultChannelDescription() {
|
|
103
103
|
return (
|
|
104
|
-
'Enterprise AI assistant for employees.
|
|
105
|
-
'
|
|
104
|
+
'Enterprise AI assistant for employees. Approved assistants, enterprise knowledge, ' +
|
|
105
|
+
'workflows, and governed actions via AI Fabrix.'
|
|
106
106
|
);
|
|
107
107
|
}
|
|
108
108
|
|
package/lib/cli/index.js
CHANGED
|
@@ -23,15 +23,19 @@ const { setupAppCommands: setupAppManagementCommands } = require('../commands/ap
|
|
|
23
23
|
const { setupDatasourceCommands } = require('../commands/datasource');
|
|
24
24
|
const { setupDimensionCommands } = require('../commands/dimension');
|
|
25
25
|
const { setupResourceTypeCommands } = require('../commands/resource-type');
|
|
26
|
+
const { setupEnterpriseKnowledgeCommands } = require('../commands/enterprise-knowledge');
|
|
26
27
|
const { setupIdentityCommands } = require('../commands/identity');
|
|
27
28
|
const { setupProtectionCommands } = require('../commands/protection');
|
|
29
|
+
const { setupEvidenceCommands } = require('../commands/evidence');
|
|
28
30
|
const { setupCredentialDeploymentCommands } = require('./setup-credential-deployment');
|
|
29
31
|
const { setupIntegrationClientCommands } = require('./setup-integration-client');
|
|
30
32
|
const { setupPlatformCommands } = require('./setup-platform');
|
|
31
33
|
const { setupCertificationCommands } = require('./setup-certification-commands');
|
|
32
34
|
const { setupGovernanceCommands } = require('../commands/governance');
|
|
33
35
|
const { setupChannelCommands } = require('../commands/channel');
|
|
36
|
+
const { setupManifestCommands } = require('../commands/manifest');
|
|
34
37
|
const { setupNpmCommands } = require('./setup-npm');
|
|
38
|
+
const { setupListCommand } = require('./setup-list');
|
|
35
39
|
|
|
36
40
|
/**
|
|
37
41
|
* Dev, secrets, parameters, and platform commands (keeps setupCommands under statement limit).
|
|
@@ -46,10 +50,10 @@ function setupDevAndPlatformCommands(program) {
|
|
|
46
50
|
}
|
|
47
51
|
|
|
48
52
|
/**
|
|
49
|
-
*
|
|
50
|
-
* @param {Command} program
|
|
53
|
+
* Core platform and integration CLI command groups.
|
|
54
|
+
* @param {import('commander').Command} program
|
|
51
55
|
*/
|
|
52
|
-
function
|
|
56
|
+
function setupCoreCliCommands(program) {
|
|
53
57
|
setupInfraCommands(program);
|
|
54
58
|
setupAuthCommands(program);
|
|
55
59
|
setupAppCommands(program);
|
|
@@ -59,14 +63,34 @@ function setupCommands(program) {
|
|
|
59
63
|
setupAppManagementCommands(program);
|
|
60
64
|
setupChannelCommands(program);
|
|
61
65
|
setupDatasourceCommands(program);
|
|
66
|
+
setupManifestCommands(program);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Extended catalog and policy CLI command groups.
|
|
71
|
+
* @param {import('commander').Command} program
|
|
72
|
+
*/
|
|
73
|
+
function setupExtendedCliCommands(program) {
|
|
62
74
|
setupDimensionCommands(program);
|
|
63
75
|
setupResourceTypeCommands(program);
|
|
76
|
+
setupEnterpriseKnowledgeCommands(program);
|
|
64
77
|
setupIdentityCommands(program);
|
|
65
78
|
setupProtectionCommands(program);
|
|
79
|
+
setupEvidenceCommands(program);
|
|
66
80
|
setupUtilityCommands(program);
|
|
81
|
+
setupListCommand(program);
|
|
67
82
|
setupCredentialDeploymentCommands(program);
|
|
68
83
|
setupIntegrationClientCommands(program);
|
|
69
84
|
setupExternalSystemCommands(program);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Sets up all CLI commands on the Commander program instance
|
|
89
|
+
* @param {Command} program - Commander program instance
|
|
90
|
+
*/
|
|
91
|
+
function setupCommands(program) {
|
|
92
|
+
setupCoreCliCommands(program);
|
|
93
|
+
setupExtendedCliCommands(program);
|
|
70
94
|
setupDevAndPlatformCommands(program);
|
|
71
95
|
}
|
|
72
96
|
|
package/lib/cli/infra-guided.js
CHANGED
|
@@ -15,6 +15,7 @@ const infra = require('../infrastructure');
|
|
|
15
15
|
const { execWithDockerEnv } = require('../utils/docker-exec');
|
|
16
16
|
const { getLogLevel, passesLevelFilter } = require('../commands/app-logs');
|
|
17
17
|
const { handleLogin } = require('../commands/login');
|
|
18
|
+
const { handleUpBuilderApi } = require('../commands/up-builder-api');
|
|
18
19
|
const {
|
|
19
20
|
resolveGuidedAuthControllerUrl,
|
|
20
21
|
runGuidedAuthStep,
|
|
@@ -309,7 +310,10 @@ async function runGuidedUpPlatform(options, handleUpMiso, handleUpDataplane, han
|
|
|
309
310
|
await runGuidedAuthStep(handleLogin, authOpts, { startSpinner, stopSpinnerSuccess });
|
|
310
311
|
const controllerUrl = await resolveGuidedAuthControllerUrl(authOpts);
|
|
311
312
|
await runGuidedDataplaneInstallPhase(options, handleUpDataplane, handleLogin, controllerUrl);
|
|
312
|
-
|
|
313
|
+
const baSpin = startSpinner('Starting builder-api...');
|
|
314
|
+
await withMutedLogger(() => handleUpBuilderApi({ ...options, platformInstall: true }));
|
|
315
|
+
stopSpinnerSuccess(baSpin, 'Builder API ready');
|
|
316
|
+
await validateAppErrorLogs(['miso-controller', 'dataplane', 'builder-api']);
|
|
313
317
|
await logPlatformReadyFooter();
|
|
314
318
|
}
|
|
315
319
|
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External-system create option normalization for setup-app.js.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Headless external create CLI helpers
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const VALID_ENTITY_TYPES = ['recordStorage', 'documentStorage', 'vectorStore', 'messageService', 'none'];
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Normalize options for external system creation
|
|
11
|
+
* @param {Object} options - Raw CLI options
|
|
12
|
+
* @returns {Object} Normalized options
|
|
13
|
+
*/
|
|
14
|
+
function normalizeExternalOptions(options) {
|
|
15
|
+
const normalized = { ...options };
|
|
16
|
+
if (options.displayName) normalized.systemDisplayName = options.displayName;
|
|
17
|
+
if (options.description) normalized.systemDescription = options.description;
|
|
18
|
+
if (options.systemType) normalized.systemType = options.systemType;
|
|
19
|
+
if (options.authType) normalized.authType = options.authType;
|
|
20
|
+
if (options.entityType) {
|
|
21
|
+
if (!VALID_ENTITY_TYPES.includes(options.entityType)) {
|
|
22
|
+
throw new Error(`Invalid --entity-type. Must be one of: ${VALID_ENTITY_TYPES.join(', ')}`);
|
|
23
|
+
}
|
|
24
|
+
normalized.entityType = options.entityType;
|
|
25
|
+
}
|
|
26
|
+
if (options.datasources !== undefined) {
|
|
27
|
+
const parsedCount = parseInt(options.datasources, 10);
|
|
28
|
+
if (Number.isNaN(parsedCount) || parsedCount < 1 || parsedCount > 10) {
|
|
29
|
+
throw new Error('Datasources count must be a number between 1 and 10');
|
|
30
|
+
}
|
|
31
|
+
normalized.datasourceCount = parsedCount;
|
|
32
|
+
}
|
|
33
|
+
if (options.controller) {
|
|
34
|
+
normalized.controller = true;
|
|
35
|
+
normalized.controllerUrl = options.controller;
|
|
36
|
+
}
|
|
37
|
+
return normalized;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Whether normalized options include all external CLI fields for headless create.
|
|
42
|
+
* @param {Object} normalized - Normalized external create options
|
|
43
|
+
* @returns {boolean}
|
|
44
|
+
*/
|
|
45
|
+
function hasFullExternalCliOptions(normalized) {
|
|
46
|
+
return Boolean(
|
|
47
|
+
normalized.systemKey &&
|
|
48
|
+
normalized.systemDisplayName &&
|
|
49
|
+
normalized.systemDescription &&
|
|
50
|
+
normalized.systemType &&
|
|
51
|
+
normalized.authType &&
|
|
52
|
+
normalized.entityType &&
|
|
53
|
+
normalized.datasourceCount
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Map positional systemKey and apply headless defaults for external create.
|
|
59
|
+
* @param {string} appName - Positional appKey or systemKey from CLI
|
|
60
|
+
* @param {Object} options - Raw CLI options
|
|
61
|
+
* @returns {Object} Normalized options ready for createApp
|
|
62
|
+
*/
|
|
63
|
+
function prepareExternalCreateOptions(appName, options) {
|
|
64
|
+
const normalized = normalizeExternalOptions(options);
|
|
65
|
+
const isExternalType = options.type === 'external' || !options.type;
|
|
66
|
+
|
|
67
|
+
if (isExternalType && appName) {
|
|
68
|
+
normalized.systemKey = appName;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (isExternalType && hasFullExternalCliOptions(normalized)) {
|
|
72
|
+
if (!Object.prototype.hasOwnProperty.call(normalized, 'github')) {
|
|
73
|
+
normalized.github = false;
|
|
74
|
+
}
|
|
75
|
+
if (!Object.prototype.hasOwnProperty.call(normalized, 'controller')) {
|
|
76
|
+
normalized.controller = false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return normalized;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Validate required options for non-interactive external creation
|
|
85
|
+
* @param {Object} normalizedOptions - Normalized options
|
|
86
|
+
* @throws {Error} If required options are missing
|
|
87
|
+
*/
|
|
88
|
+
function validateNonInteractiveExternalOptions(normalizedOptions) {
|
|
89
|
+
const missing = [];
|
|
90
|
+
if (!normalizedOptions.systemDisplayName) missing.push('--display-name');
|
|
91
|
+
if (!normalizedOptions.systemDescription) missing.push('--description');
|
|
92
|
+
if (!normalizedOptions.systemType) missing.push('--system-type');
|
|
93
|
+
if (!normalizedOptions.authType) missing.push('--auth-type');
|
|
94
|
+
if (!normalizedOptions.entityType) missing.push('--entity-type');
|
|
95
|
+
if (!normalizedOptions.datasourceCount) missing.push('--datasources');
|
|
96
|
+
if (missing.length > 0) {
|
|
97
|
+
throw new Error(`Missing required options for non-interactive external create: ${missing.join(', ')}`);
|
|
98
|
+
}
|
|
99
|
+
if (!Object.prototype.hasOwnProperty.call(normalizedOptions, 'github')) {
|
|
100
|
+
normalizedOptions.github = false;
|
|
101
|
+
}
|
|
102
|
+
if (!Object.prototype.hasOwnProperty.call(normalizedOptions, 'controller')) {
|
|
103
|
+
normalizedOptions.controller = false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
module.exports = {
|
|
108
|
+
normalizeExternalOptions,
|
|
109
|
+
prepareExternalCreateOptions,
|
|
110
|
+
validateNonInteractiveExternalOptions
|
|
111
|
+
};
|
|
@@ -56,7 +56,7 @@ Examples:
|
|
|
56
56
|
Notes:
|
|
57
57
|
- To run E2E for one datasource, use:
|
|
58
58
|
aifabrix datasource test-e2e <datasourceKey>
|
|
59
|
-
- External integration: local system and datasource files are published to the dataplane before E2E (same as upload). Use --no-
|
|
59
|
+
- External integration: local system and datasource files are published to the dataplane before E2E (same as upload). Use --no-publish to exercise only config already deployed.
|
|
60
60
|
`;
|
|
61
61
|
|
|
62
62
|
const IDENTITY_HELP_AFTER = `
|