@aifabrix/builder 2.45.5 → 2.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/cli-layout.mdc +2 -0
- package/.cursor/rules/cli-product-neutral.mdc +43 -0
- package/.cursor/rules/project-rules.mdc +1 -0
- package/.npmrc.token +1 -0
- package/.temp/jest-protection-convert/run-IFN2nv/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-IvmKLO/.protection/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-convert/run-SdvblF/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-b51TsW/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-fiLmb1/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-qYGHMU/.protection/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-Mq5re8/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-f3u4YL/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-iQtd1O/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-mdmz5M/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-qbKYxQ/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-yzlJy6/hubspot-companies.yaml +17 -0
- package/.temp/validation/summary.txt +5 -0
- package/README.md +43 -17
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
- package/jest.config.default.js +2 -1
- package/jest.config.isolated.js +2 -1
- package/jest.global-live-fabrix-hooks.js +36 -0
- package/jest.isolated-projects.js +146 -0
- package/jest.projects.js +65 -136
- package/lib/api/api-response-errors.js +124 -0
- package/lib/api/dataplane-health.api.js +19 -7
- package/lib/api/governance-scenario-pack.api.js +159 -0
- package/lib/api/index.js +43 -3
- package/lib/api/lifecycle.api.js +98 -0
- package/lib/api/pipeline.api.js +3 -1
- package/lib/api/records-bulk.api.js +14 -1
- package/lib/api/resource-types.api.js +107 -0
- package/lib/api/runtime-configuration.api.js +72 -0
- package/lib/api/types/resource-types.types.js +45 -0
- package/lib/api/user-groups.api.js +9 -9
- package/lib/api/users.api.js +8 -8
- package/lib/api/validation-runner.js +3 -1
- package/lib/api/wizard.api.js +10 -2
- package/lib/app/deploy-config.js +4 -1
- package/lib/app/down.js +78 -27
- package/lib/app/index.js +2 -2
- package/lib/app/push.js +4 -5
- package/lib/app/register.js +7 -4
- package/lib/app/run-env-compose.js +84 -30
- package/lib/app/run-resolve-image.js +2 -1
- package/lib/app/run-stop-containers.js +113 -0
- package/lib/app/run.js +1 -31
- package/lib/app/show-display.js +35 -0
- package/lib/app/show.js +32 -1
- package/lib/build/index.js +22 -5
- package/lib/build/miso-controller-npm-sdk-guard.js +25 -0
- package/lib/certification/sync-system-certification.js +13 -6
- package/lib/channels/add-channel.js +348 -0
- package/lib/channels/channel-artifact-generator.js +141 -0
- package/lib/channels/channel-audit.js +101 -0
- package/lib/channels/channel-auth-context.js +37 -0
- package/lib/channels/channel-credential.js +200 -0
- package/lib/channels/channel-display-name.js +64 -0
- package/lib/channels/channel-external-system.js +106 -0
- package/lib/channels/channel-integration-generator.js +274 -0
- package/lib/channels/channel-probe.js +89 -0
- package/lib/channels/channel-runtime-resolver.js +152 -0
- package/lib/channels/channel-status-display.js +141 -0
- package/lib/channels/channel-targets.js +115 -0
- package/lib/cli/index.js +20 -4
- package/lib/cli/infra-guided-auth.js +109 -0
- package/lib/cli/infra-guided.js +84 -81
- package/lib/cli/setup-app.help.js +0 -31
- package/lib/cli/setup-app.js +82 -5
- package/lib/cli/setup-app.test-commands.js +5 -57
- package/lib/cli/setup-auth.js +25 -0
- package/lib/cli/setup-certification-commands.js +147 -0
- package/lib/cli/setup-certification.help.js +141 -0
- package/lib/cli/setup-environment.js +19 -2
- package/lib/cli/setup-external-system-help.js +62 -0
- package/lib/cli/setup-external-system.js +25 -3
- package/lib/cli/setup-infra-up-dataplane-action.js +2 -2
- package/lib/cli/setup-infra-up-platform-action.js +2 -1
- package/lib/cli/setup-infra.js +9 -1
- package/lib/cli/setup-platform.js +6 -1
- package/lib/cli/setup-secrets.js +33 -1
- package/lib/cli/setup-utility-help-after.js +25 -2
- package/lib/cli/setup-utility-repair.js +198 -0
- package/lib/cli/setup-utility-resolve.js +44 -5
- package/lib/cli/setup-utility-validate.js +197 -0
- package/lib/cli/setup-utility.js +4 -239
- package/lib/commands/app-logs.js +54 -26
- package/lib/commands/app.js +41 -0
- package/lib/commands/auth-status-client-tokens.js +214 -0
- package/lib/commands/auth-status-dataplane-version.js +142 -68
- package/lib/commands/auth-status.js +43 -54
- package/lib/commands/channel.js +58 -0
- package/lib/commands/datasource-test-trust-cli.js +27 -23
- package/lib/commands/datasource-unified-test-cli.js +6 -3
- package/lib/commands/datasource-unified-test-cli.options.js +5 -1
- package/lib/commands/datasource.js +8 -8
- package/lib/commands/dev-show-display.js +8 -1
- package/lib/commands/governance-cli-shared.js +94 -0
- package/lib/commands/governance-command-action.js +132 -0
- package/lib/commands/governance-download-external.js +34 -0
- package/lib/commands/governance-generate-external.js +71 -0
- package/lib/commands/governance-upload-external.js +36 -0
- package/lib/commands/governance-verify-external.js +64 -0
- package/lib/commands/governance.js +144 -0
- package/lib/commands/identity-apply-sync.js +49 -8
- package/lib/commands/identity-group-cli.js +66 -26
- package/lib/commands/identity-membership-role-cache.js +58 -37
- package/lib/commands/identity-shared.js +22 -1
- package/lib/commands/identity-user-cli.js +80 -34
- package/lib/commands/lifecycle-command-action.js +123 -0
- package/lib/commands/lifecycle-external.js +268 -0
- package/lib/commands/login.js +11 -2
- package/lib/commands/repair-auth-apply.js +153 -0
- package/lib/commands/repair-auth-config.js +8 -13
- package/lib/commands/repair-changed-files.js +41 -0
- package/lib/commands/repair-datasource-com-v2.js +15 -0
- package/lib/commands/repair-datasource-keys.js +4 -1
- package/lib/commands/repair-datasource-run.js +59 -0
- package/lib/commands/repair-datasource-service-contract.js +206 -0
- package/lib/commands/repair-datasource-test-payload.js +259 -0
- package/lib/commands/repair-datasource.js +49 -64
- package/lib/commands/repair-env-template.js +76 -25
- package/lib/commands/repair-external-run.js +216 -0
- package/lib/commands/repair-openapi-sync.js +49 -4
- package/lib/commands/repair-persist.js +4 -0
- package/lib/commands/repair-rbac.js +52 -1
- package/lib/commands/repair-steps.js +160 -0
- package/lib/commands/repair-system-alignment.js +7 -4
- package/lib/commands/repair.js +29 -296
- package/lib/commands/resource-type.js +371 -0
- package/lib/commands/secrets-get.js +184 -0
- package/lib/commands/secrets-remove-all.js +3 -1
- package/lib/commands/setup-image-refresh.js +146 -0
- package/lib/commands/setup-modes.js +158 -162
- package/lib/commands/setup-platform-auth.js +76 -0
- package/lib/commands/setup-prompts-admin.js +244 -0
- package/lib/commands/setup-prompts-platform-mode.js +70 -0
- package/lib/commands/setup-prompts-validators.js +36 -0
- package/lib/commands/setup-prompts.js +24 -76
- package/lib/commands/setup-run-context.js +45 -0
- package/lib/commands/setup-spinners.js +39 -0
- package/lib/commands/setup.js +27 -5
- package/lib/commands/teardown.js +39 -0
- package/lib/commands/test-e2e-external.js +24 -8
- package/lib/commands/test-governance-external.js +3 -24
- package/lib/commands/test-trust-external.js +48 -100
- package/lib/commands/up-common.js +57 -13
- package/lib/commands/up-dataplane.js +56 -15
- package/lib/commands/upload-publish-context.js +75 -0
- package/lib/commands/upload-sidecar-followups.js +89 -0
- package/lib/commands/upload.js +113 -110
- package/lib/commands/verify-governance-combined-external.js +61 -0
- package/lib/commands/verify-governance-command-action.js +64 -0
- package/lib/commands/verify-governance-db.js +102 -0
- package/lib/commands/verify-governance-external.js +77 -0
- package/lib/commands/verify-governance-result-builders.js +71 -0
- package/lib/commands/verify-operations-command-action.js +68 -0
- package/lib/commands/verify-operations-external.js +268 -0
- package/lib/commands/verify-operations-persist.js +75 -0
- package/lib/commands/verify-operations-step-plan.js +68 -0
- package/lib/commands/verify-operations-steps.js +111 -0
- package/lib/commands/verify-trust-command-action.js +73 -0
- package/lib/commands/verify-trust-external.js +59 -0
- package/lib/commands/wizard-config-normalizer.js +43 -23
- package/lib/commands/wizard-core.js +2 -0
- package/lib/core/admin-password-generator.js +38 -0
- package/lib/core/admin-secrets-bundle.js +111 -0
- package/lib/core/admin-secrets-env-overlay.js +62 -0
- package/lib/core/admin-secrets.js +32 -4
- package/lib/core/config-attach-extensions.js +3 -0
- package/lib/core/config-platform-controller.js +44 -0
- package/lib/core/config-setup-installation-profile.js +42 -0
- package/lib/core/config-setup-platform-mode.js +46 -0
- package/lib/core/config.js +46 -36
- package/lib/core/secrets-admin-env.js +6 -2
- package/lib/core/secrets-ensure.js +4 -0
- package/lib/core/secrets-env-content.js +54 -48
- package/lib/core/secrets-env-write.js +10 -1
- package/lib/core/secrets-infra-placeholder-sync.js +2 -0
- package/lib/core/setup-installation-profile.js +43 -0
- package/lib/core/setup-platform-mode.js +90 -0
- package/lib/datasource/agent-trust-debug-log.js +1 -1
- package/lib/datasource/agent-trust-run.js +5 -3
- package/lib/datasource/audit-evidence-extract-debug.js +30 -18
- package/lib/datasource/audit-evidence-extract.js +7 -4
- package/lib/datasource/audit-evidence-verify-matrix.js +54 -26
- package/lib/datasource/bulk-loader-run-batches.js +15 -3
- package/lib/datasource/capability/capability-diff-slice.js +2 -2
- package/lib/datasource/capability/capability-manifest.js +254 -0
- package/lib/datasource/capability/capability-resolve.js +3 -4
- package/lib/datasource/capability/copy-operations.js +5 -3
- package/lib/datasource/capability/remove-operations.js +2 -1
- package/lib/datasource/capability/run-capability-copy.js +32 -4
- package/lib/datasource/capability/run-capability-diff.js +3 -3
- package/lib/datasource/capability/run-capability-dimension.js +2 -4
- package/lib/datasource/capability/run-capability-edit.js +4 -7
- package/lib/datasource/capability/run-capability-relate.js +2 -4
- package/lib/datasource/capability/run-capability-remove.js +2 -4
- package/lib/datasource/capability/validate-capability-slice.js +2 -1
- package/lib/datasource/datasource-identifier.js +2 -1
- package/lib/datasource/datasource-load-export-context.js +3 -0
- package/lib/datasource/datasource-validate-display.js +1 -1
- package/lib/datasource/field-reference-validator.js +24 -3
- package/lib/datasource/log-cleaner.js +2 -2
- package/lib/datasource/log-viewer.js +8 -8
- package/lib/datasource/orphan-profiles-validator.js +98 -0
- package/lib/datasource/test-e2e.js +4 -1
- package/lib/datasource/unified-validation-run-body.js +3 -1
- package/lib/datasource/unified-validation-run.js +5 -2
- package/lib/datasource/validate.js +41 -23
- package/lib/deployment/environment-poll-status.js +138 -0
- package/lib/deployment/environment.js +42 -34
- package/lib/external-system/download-helpers.js +87 -0
- package/lib/external-system/download.js +78 -138
- package/lib/external-system/generator.js +1 -55
- package/lib/external-system/integration-auth-context.js +45 -0
- package/lib/external-system/test-auth.js +12 -5
- package/lib/external-system/test.js +16 -21
- package/lib/generator/builders.js +11 -1
- package/lib/generator/external-controller-manifest.js +18 -0
- package/lib/generator/split.js +3 -1
- package/lib/generator/wizard.js +1 -28
- package/lib/governance/governance-cli-errors.js +96 -0
- package/lib/governance/governance-download-display.js +38 -0
- package/lib/governance/governance-run-display.js +215 -25
- package/lib/identity/fk-reference.js +65 -0
- package/lib/identity/identity-apply-core.js +13 -58
- package/lib/identity/identity-apply-phases.js +5 -1
- package/lib/identity/identity-display.js +243 -0
- package/lib/identity/identity-response-helpers.js +52 -0
- package/lib/identity/identity-sync-errors.js +62 -0
- package/lib/identity/resolve-user-id.js +129 -0
- package/lib/identity/username-default.js +31 -0
- package/lib/infrastructure/admin-secrets-apply.js +84 -0
- package/lib/infrastructure/admin-secrets-ensure.js +130 -0
- package/lib/infrastructure/admin-secrets-resolve.js +95 -0
- package/lib/infrastructure/admin-secrets-sync.js +91 -0
- package/lib/infrastructure/helpers.js +23 -129
- package/lib/infrastructure/index.js +5 -6
- package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
- package/lib/lifecycle/certification-progress.js +231 -0
- package/lib/lifecycle/dataplane-ui-url.js +145 -0
- package/lib/lifecycle/exit-codes.js +24 -0
- package/lib/lifecycle/json-envelope.js +25 -0
- package/lib/lifecycle/lifecycle-governance-options.js +51 -0
- package/lib/lifecycle/logger-quiet.js +29 -0
- package/lib/lifecycle/open-api-published.js +59 -0
- package/lib/lifecycle/operations-readiness-metrics.js +101 -0
- package/lib/lifecycle/product-model.js +196 -0
- package/lib/lifecycle/report-display-trust.js +70 -0
- package/lib/lifecycle/report-display.js +472 -0
- package/lib/lifecycle/scenario-upload.js +191 -0
- package/lib/lifecycle/verify-step-progress.js +87 -0
- package/lib/parameters/infra-kv-discovery.js +27 -2
- package/lib/protection/auth-context.js +10 -4
- package/lib/resolvers/datasource-resolver.js +2 -3
- package/lib/resolvers/resource-type-file.js +159 -0
- package/lib/schema/application-schema.json +17 -1
- package/lib/schema/datasource-test-run.schema.json +89 -6
- package/lib/schema/deployment-rules.yaml +2 -1
- package/lib/schema/external-datasource.schema.json +2947 -2619
- package/lib/schema/external-system.schema.json +1418 -761
- package/lib/schema/infra.parameter.yaml +45 -0
- package/lib/schema/type/credential-field-registry.json +103 -97
- package/lib/schema/type/document-storage.json +9 -5
- package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
- package/lib/utils/api.js +55 -31
- package/lib/utils/app-relative-path-env.js +112 -0
- package/lib/utils/app-run-containers.js +25 -2
- package/lib/utils/authentication-shape.js +224 -0
- package/lib/utils/build-copy.js +36 -5
- package/lib/utils/build-resolve-image.js +66 -12
- package/lib/utils/celery-companion-apps.js +53 -0
- package/lib/utils/cli-secrets-error-format.js +83 -21
- package/lib/utils/cli-utils.js +20 -4
- package/lib/utils/compose-celery-worker.js +23 -0
- package/lib/utils/compose-generate-docker-compose.js +13 -1
- package/lib/utils/compose-traefik-ingress-base.js +16 -1
- package/lib/utils/config-secrets-path.js +46 -0
- package/lib/utils/configuration-env-resolver.js +36 -0
- package/lib/utils/controller-url.js +88 -1
- package/lib/utils/credential-secrets-env-kv.js +216 -0
- package/lib/utils/credential-secrets-env.js +175 -257
- package/lib/utils/dataplane-resolver.js +18 -2
- package/lib/utils/declarative-url-ports.js +27 -4
- package/lib/utils/deployment-auth-mode.js +41 -0
- package/lib/utils/developer-volume-id.js +33 -0
- package/lib/utils/docker-build.js +1 -4
- package/lib/utils/env-copy.js +14 -9
- package/lib/utils/env-kv-orphan-lines.js +43 -0
- package/lib/utils/error-formatters/network-errors.js +13 -4
- package/lib/utils/external-env-template.js +11 -3
- package/lib/utils/external-system-readiness-core.js +10 -0
- package/lib/utils/external-system-readiness-display.js +80 -23
- package/lib/utils/external-system-validators.js +8 -2
- package/lib/utils/health-check.js +4 -1
- package/lib/utils/help-builder.js +13 -8
- package/lib/utils/keycloak-realm-ready.js +101 -0
- package/lib/utils/load-cip-capacity-display-config.js +61 -15
- package/lib/utils/manifest-source-emit.js +2 -0
- package/lib/utils/paths.js +25 -0
- package/lib/utils/pipeline-upload-auth-retry.js +82 -0
- package/lib/utils/platform-controller-url.js +157 -0
- package/lib/utils/platform-kv-ref.js +57 -0
- package/lib/utils/postgres-platform-bootstrap.js +199 -0
- package/lib/utils/postgres-wipe.js +9 -2
- package/lib/utils/resolve-env-mode.js +47 -0
- package/lib/utils/runtime-configuration-download.js +189 -0
- package/lib/utils/runtime-configuration-values.js +119 -0
- package/lib/utils/schema-loader.js +19 -4
- package/lib/utils/secrets-generator.js +31 -25
- package/lib/utils/secrets-missing-error.js +164 -0
- package/lib/utils/service-url-label.js +81 -0
- package/lib/utils/setup-quiet-output.js +25 -0
- package/lib/utils/template-helpers.js +15 -0
- package/lib/utils/token-manager-client-credentials.js +201 -0
- package/lib/utils/token-manager-messages.js +8 -0
- package/lib/utils/token-manager-refresh.js +12 -2
- package/lib/utils/token-manager.js +86 -105
- package/lib/utils/upload-pipeline-ui.js +12 -5
- package/lib/utils/upload-sync-options.js +42 -0
- package/lib/utils/url-declarative-public-base.js +21 -3
- package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
- package/lib/utils/validation-poll-ui.js +8 -0
- package/lib/utils/validation-run-stage.js +45 -0
- package/lib/utils/worker-sidecars.js +142 -0
- package/lib/validation/external-manifest-validator.js +2 -0
- package/lib/validation/runtime-configuration-rules.js +98 -0
- package/lib/validation/validate-display-dimensions.js +154 -0
- package/lib/validation/validate-display-sections.js +276 -0
- package/lib/validation/validate-display-steps.js +67 -0
- package/lib/validation/validate-display.js +24 -402
- package/package.json +1 -1
- package/templates/applications/dataplane/application.yaml +7 -1
- package/templates/applications/dataplane/env.template +50 -14
- package/templates/applications/dataplane/rbac.yaml +108 -1
- package/templates/applications/miso-controller/application.yaml +2 -2
- package/templates/applications/miso-controller/env.template +53 -122
- package/templates/applications/miso-controller/rbac.yaml +28 -13
- package/templates/channels/chatgpt/install.template.md.hbs +49 -0
- package/templates/channels/chatgpt/manifest.template.json.hbs +9 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +49 -0
- package/templates/channels/microsoft-copilot/manifest.template.json.hbs +8 -0
- package/templates/channels/slack/install.template.md.hbs +49 -0
- package/templates/channels/slack/manifest.template.json.hbs +66 -0
- package/templates/channels/teams-bot/install.template.md.hbs +49 -0
- package/templates/channels/teams-bot/manifest.template.json.hbs +13 -0
- package/templates/channels/web-embed/install.template.md.hbs +49 -0
- package/templates/channels/web-embed/manifest.template.json.hbs +8 -0
- package/templates/external-system/README.md.hbs +74 -17
- package/templates/python/docker-compose.hbs +75 -18
- package/templates/typescript/docker-compose.hbs +70 -17
- package/lib/commands/test-governance-command-action.js +0 -55
- package/lib/commands/test-trust-command-action.js +0 -118
|
@@ -1,389 +1,35 @@
|
|
|
1
|
-
const {
|
|
2
|
-
headerKeyValue,
|
|
3
|
-
metadata,
|
|
4
|
-
formatDatasourceListRow,
|
|
5
|
-
formatBlockingError,
|
|
6
|
-
formatSuccessLine,
|
|
7
|
-
formatSuccessParagraph,
|
|
8
|
-
successGlyph,
|
|
9
|
-
failureGlyph
|
|
10
|
-
} = require('../utils/cli-test-layout-chalk');
|
|
11
1
|
/**
|
|
12
2
|
* @fileoverview Validation display for `aifabrix validate` (tty-summary: cli-layout.mdc, layout.md).
|
|
13
3
|
* @author AI Fabrix Team
|
|
14
4
|
*/
|
|
15
5
|
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
16
8
|
const path = require('path');
|
|
17
9
|
const chalk = require('chalk');
|
|
18
10
|
const logger = require('../utils/logger');
|
|
19
|
-
const { loadConfigFile } = require('../utils/config-format');
|
|
20
|
-
const { flattenRootDimensionsForDisplay } = require('./dimension-display-helpers');
|
|
21
11
|
const {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
logger.log(` ${failureGlyph()} ${chalk.red('Application configuration has errors:')}`);
|
|
44
|
-
if (application.errors && application.errors.length > 0) {
|
|
45
|
-
application.errors.forEach(error => {
|
|
46
|
-
logErrorDetail(error);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
if (application.warnings && application.warnings.length > 0) {
|
|
51
|
-
application.warnings.forEach(warning => {
|
|
52
|
-
logger.log(` ${chalk.yellow('⚠')} ${chalk.white(warning)}`);
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Extracts dimensions from a datasource file for CLI display.
|
|
59
|
-
* Local bindings become `metadata.<field>`; FK bindings become `fk:<fk>→<dimension>...` plus optional `(actor: ...)`.
|
|
60
|
-
* @function extractDimensionsFromDatasource
|
|
61
|
-
* @param {string} filePath - Path to datasource file
|
|
62
|
-
* @returns {Object} Dimensions info { dimensions: Object, dimensionKeys: string[], hasDimensions: boolean }
|
|
63
|
-
*/
|
|
64
|
-
function extractDimensionsFromDatasource(filePath) {
|
|
65
|
-
try {
|
|
66
|
-
const parsed = loadConfigFile(filePath);
|
|
67
|
-
|
|
68
|
-
const rootFlat = flattenRootDimensionsForDisplay(parsed.dimensions);
|
|
69
|
-
const abacDimensions = parsed.abac?.dimensions || {};
|
|
70
|
-
const allDimensions = { ...rootFlat, ...abacDimensions };
|
|
71
|
-
const dimensionKeys = Object.keys(allDimensions);
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
dimensions: allDimensions,
|
|
75
|
-
dimensionKeys,
|
|
76
|
-
hasDimensions: dimensionKeys.length > 0
|
|
77
|
-
};
|
|
78
|
-
} catch {
|
|
79
|
-
return { dimensions: {}, dimensionKeys: [], hasDimensions: false };
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Displays external files validation results
|
|
85
|
-
* @function displayExternalFilesValidation
|
|
86
|
-
* @param {Array} externalFiles - External files validation results
|
|
87
|
-
*/
|
|
88
|
-
function displayExternalFilesValidation(externalFiles) {
|
|
89
|
-
if (!externalFiles || externalFiles.length === 0) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
logSectionTitle('External integration files');
|
|
94
|
-
externalFiles.forEach(file => {
|
|
95
|
-
if (file.valid) {
|
|
96
|
-
logger.log(formatDatasourceListRow('ok', file.file, file.type));
|
|
97
|
-
} else {
|
|
98
|
-
logger.log(formatDatasourceListRow('fail', file.file, file.type));
|
|
99
|
-
file.errors.forEach(error => {
|
|
100
|
-
logErrorDetail(error);
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
if (file.warnings && file.warnings.length > 0) {
|
|
104
|
-
file.warnings.forEach(warning => {
|
|
105
|
-
logger.log(` ${chalk.yellow('⚠')} ${chalk.white(warning)}`);
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Displays Dimensions (ABAC) validation results for datasources
|
|
113
|
-
* @function displayDimensionsValidation
|
|
114
|
-
* @param {Array} externalFiles - External files validation results
|
|
115
|
-
* @returns {Array} Warnings to add to aggregated warnings
|
|
116
|
-
*/
|
|
117
|
-
function displayDimensionsValidation(externalFiles) {
|
|
118
|
-
if (!externalFiles || externalFiles.length === 0) {
|
|
119
|
-
return [];
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const datasourceFiles = externalFiles.filter(f =>
|
|
123
|
-
f.type === 'datasource' || f.type === 'external-datasource'
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
if (datasourceFiles.length === 0) {
|
|
127
|
-
return [];
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
logSectionTitle('Dimensions (ABAC)');
|
|
131
|
-
|
|
132
|
-
const warnings = [];
|
|
133
|
-
let anyDatasourceHasDimensions = false;
|
|
134
|
-
|
|
135
|
-
datasourceFiles.forEach(file => {
|
|
136
|
-
const dimensionsInfo = extractDimensionsFromDatasource(file.path);
|
|
137
|
-
|
|
138
|
-
if (dimensionsInfo.hasDimensions) {
|
|
139
|
-
anyDatasourceHasDimensions = true;
|
|
140
|
-
logger.log(formatDatasourceListRow('ok', file.file, file.type));
|
|
141
|
-
dimensionsInfo.dimensionKeys.forEach(key => {
|
|
142
|
-
const mapping = dimensionsInfo.dimensions[key];
|
|
143
|
-
logDimLine(`${key} → ${mapping}`);
|
|
144
|
-
});
|
|
145
|
-
} else {
|
|
146
|
-
logWarnRow(`${file.file} — no dimensions configured`);
|
|
147
|
-
warnings.push(`${file.file} - no dimensions configured, ABAC filtering disabled`);
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
if (!anyDatasourceHasDimensions) {
|
|
152
|
-
logWarnRow('No dimensions configured — ABAC filtering disabled for all datasources');
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
return warnings;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Displays RBAC validation results
|
|
160
|
-
* @function displayRbacValidation
|
|
161
|
-
* @param {Object} rbac - RBAC validation result
|
|
162
|
-
*/
|
|
163
|
-
function displayRbacValidation(rbac) {
|
|
164
|
-
if (!rbac) {
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
logSectionTitle('RBAC configuration');
|
|
169
|
-
if (rbac.valid) {
|
|
170
|
-
logOkRowRest('RBAC configuration is valid');
|
|
171
|
-
} else {
|
|
172
|
-
logger.log(` ${failureGlyph()} ${chalk.red('RBAC configuration has errors:')}`);
|
|
173
|
-
rbac.errors.forEach(error => {
|
|
174
|
-
logErrorDetail(error);
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
if (rbac.warnings && rbac.warnings.length > 0) {
|
|
178
|
-
rbac.warnings.forEach(warning => {
|
|
179
|
-
logger.log(` ${chalk.yellow('⚠')} ${chalk.white(warning)}`);
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Displays file validation results (for direct file validation)
|
|
186
|
-
* @function displayFileValidation
|
|
187
|
-
* @param {Object} result - Validation result
|
|
188
|
-
*/
|
|
189
|
-
function displayFileValidation(result) {
|
|
190
|
-
if (!result.file) {
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
logSectionTitle('File');
|
|
195
|
-
logger.log(` ${headerKeyValue('Path:', result.file)}`);
|
|
196
|
-
logger.log(` ${headerKeyValue('Type:', String(result.type))}`);
|
|
197
|
-
if (result.valid) {
|
|
198
|
-
logOkRowRest('File is valid');
|
|
199
|
-
} else {
|
|
200
|
-
logger.log(` ${failureGlyph()} ${chalk.red('File has errors:')}`);
|
|
201
|
-
result.errors.forEach(error => {
|
|
202
|
-
logErrorDetail(error);
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
if (result.warnings && result.warnings.length > 0) {
|
|
206
|
-
result.warnings.forEach(warning => {
|
|
207
|
-
logger.log(` ${chalk.yellow('⚠')} ${chalk.white(warning)}`);
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Displays aggregated warnings
|
|
214
|
-
* @function displayAggregatedWarnings
|
|
215
|
-
* @param {Array} warnings - Array of warning messages
|
|
216
|
-
*/
|
|
217
|
-
function displayAggregatedWarnings(warnings) {
|
|
218
|
-
if (!warnings || warnings.length === 0) {
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
logSectionTitle('Warnings');
|
|
223
|
-
warnings.forEach(warning => {
|
|
224
|
-
logger.log(` ${chalk.yellow('⚠')} ${chalk.white(warning)}`);
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Displays application validation step
|
|
230
|
-
* @function displayApplicationStep
|
|
231
|
-
* @param {Object} application - Application validation result
|
|
232
|
-
* @returns {void}
|
|
233
|
-
*/
|
|
234
|
-
function displayApplicationStep(application) {
|
|
235
|
-
logSectionTitle('Application');
|
|
236
|
-
if (application.valid) {
|
|
237
|
-
logOkRowRest('Application configuration is valid');
|
|
238
|
-
} else {
|
|
239
|
-
logger.log(` ${failureGlyph()} ${chalk.red('Application configuration has errors:')}`);
|
|
240
|
-
application.errors.forEach(error => {
|
|
241
|
-
logErrorDetail(error);
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
if (application.warnings && application.warnings.length > 0) {
|
|
245
|
-
application.warnings.forEach(warning => {
|
|
246
|
-
logger.log(` ${chalk.yellow('⚠')} ${chalk.white(warning)}`);
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Displays external integration files step
|
|
253
|
-
* @function displayComponentsStep
|
|
254
|
-
* @param {Object} components - Components validation result
|
|
255
|
-
* @returns {void}
|
|
256
|
-
*/
|
|
257
|
-
function displayComponentsStep(components) {
|
|
258
|
-
const hasFiles = components.files && components.files.length > 0;
|
|
259
|
-
const hasErrors = components.errors && components.errors.length > 0;
|
|
260
|
-
if (!hasFiles && !hasErrors) {
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
logSectionTitle('External integration files');
|
|
265
|
-
if (hasFiles) {
|
|
266
|
-
components.files.forEach(file => {
|
|
267
|
-
if (file.valid) {
|
|
268
|
-
logger.log(formatDatasourceListRow('ok', file.file, file.type));
|
|
269
|
-
} else {
|
|
270
|
-
logger.log(formatDatasourceListRow('fail', file.file, file.type));
|
|
271
|
-
}
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
if (hasErrors) {
|
|
275
|
-
components.errors.forEach(error => {
|
|
276
|
-
logger.log(formatBlockingError(error));
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* Displays dimensions validation for datasources
|
|
283
|
-
* @function displayDimensionsStep
|
|
284
|
-
* @param {Array} datasourceFiles - Datasource files
|
|
285
|
-
* @returns {void}
|
|
286
|
-
*/
|
|
287
|
-
function displayDimensionsStep(datasourceFiles) {
|
|
288
|
-
if (datasourceFiles.length === 0) {
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
logSectionTitle('Dimensions (ABAC)');
|
|
293
|
-
datasourceFiles.forEach(file => {
|
|
294
|
-
try {
|
|
295
|
-
const dimensionsInfo = extractDimensionsFromDatasource(file.path || file.file);
|
|
296
|
-
if (dimensionsInfo.hasDimensions) {
|
|
297
|
-
logger.log(formatDatasourceListRow('ok', file.file, file.type));
|
|
298
|
-
dimensionsInfo.dimensionKeys.forEach(key => {
|
|
299
|
-
const mapping = dimensionsInfo.dimensions[key];
|
|
300
|
-
logDimLine(`${key} → ${mapping}`);
|
|
301
|
-
});
|
|
302
|
-
} else {
|
|
303
|
-
logWarnRow(`${file.file} — no dimensions configured`);
|
|
304
|
-
}
|
|
305
|
-
} catch {
|
|
306
|
-
// Skip if file path not available
|
|
307
|
-
}
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* Displays deployment manifest step
|
|
313
|
-
* @function displayManifestStep
|
|
314
|
-
* @param {Object} manifest - Manifest validation result
|
|
315
|
-
* @param {Array} componentFiles - Component files
|
|
316
|
-
* @returns {void}
|
|
317
|
-
*/
|
|
318
|
-
function displayManifestStep(manifest, componentFiles) {
|
|
319
|
-
logSectionTitle('Deployment manifest');
|
|
320
|
-
if (manifest.skipped) {
|
|
321
|
-
logger.log(` ${chalk.gray('⏭')} ${chalk.white('Skipped (fix errors above first)')}`);
|
|
322
|
-
} else if (manifest.valid) {
|
|
323
|
-
logOkRowRest('Full deployment manifest is valid');
|
|
324
|
-
if (componentFiles) {
|
|
325
|
-
const datasourceFiles = componentFiles.filter(f => f.type === 'datasource' || f.type === 'external-datasource');
|
|
326
|
-
logger.log(` ${successGlyph()} ${chalk.white('System configuration valid')}`);
|
|
327
|
-
logger.log(` ${successGlyph()} ${chalk.white(`${datasourceFiles.length} datasource(s) valid`)}`);
|
|
328
|
-
logger.log(` ${successGlyph()} ${chalk.white('Schema validation passed')}`);
|
|
329
|
-
}
|
|
330
|
-
} else {
|
|
331
|
-
logger.log(` ${failureGlyph()} ${chalk.red('Full deployment manifest validation failed:')}`);
|
|
332
|
-
const errs = manifest.errors && manifest.errors.length > 0 ? manifest.errors : [];
|
|
333
|
-
if (errs.length > 0) {
|
|
334
|
-
errs.forEach(error => {
|
|
335
|
-
const msg = typeof error === 'string' ? error : String(error);
|
|
336
|
-
logErrorDetail(msg);
|
|
337
|
-
});
|
|
338
|
-
} else {
|
|
339
|
-
logErrorDetail('No error details available (check schema and manifest structure).');
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
if (manifest.warnings && manifest.warnings.length > 0) {
|
|
343
|
-
manifest.warnings.forEach(warning => {
|
|
344
|
-
logger.log(` ${chalk.yellow('⚠')} ${chalk.white(warning)}`);
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
/**
|
|
350
|
-
* Displays step-by-step validation results for external systems
|
|
351
|
-
* @function displayStepByStepValidation
|
|
352
|
-
* @param {Object} result - Validation result with steps
|
|
353
|
-
*/
|
|
354
|
-
function displayStepByStepValidation(result) {
|
|
355
|
-
if (result.valid) {
|
|
356
|
-
logger.log(formatSuccessParagraph('Validation passed!'));
|
|
357
|
-
} else {
|
|
358
|
-
logger.log(`\n${formatBlockingError('Validation failed!')}`);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
displayApplicationStep(result.steps.application);
|
|
362
|
-
|
|
363
|
-
if (!result.steps.components.valid || (result.steps.components.files && result.steps.components.files.length > 0)) {
|
|
364
|
-
displayComponentsStep(result.steps.components);
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
const datasourceFiles = result.steps.components.files?.filter(f =>
|
|
368
|
-
f.type === 'datasource' || f.type === 'external-datasource'
|
|
369
|
-
) || [];
|
|
370
|
-
displayDimensionsStep(datasourceFiles);
|
|
371
|
-
|
|
372
|
-
if (result.rbac) {
|
|
373
|
-
displayRbacValidation(result.rbac);
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
displayManifestStep(result.steps.manifest, result.steps.components.files);
|
|
377
|
-
|
|
378
|
-
if (result.warnings && result.warnings.length > 0) {
|
|
379
|
-
displayAggregatedWarnings(result.warnings);
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
displayOverallStatus(result);
|
|
383
|
-
if (result.appPath) {
|
|
384
|
-
logger.log(`\n${metadata(path.resolve(result.appPath))}`);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
12
|
+
headerKeyValue,
|
|
13
|
+
metadata,
|
|
14
|
+
formatBlockingError,
|
|
15
|
+
formatSuccessLine,
|
|
16
|
+
formatSuccessParagraph,
|
|
17
|
+
failureGlyph
|
|
18
|
+
} = require('../utils/cli-test-layout-chalk');
|
|
19
|
+
const { logSectionTitle } = require('./validate-display-log-helpers');
|
|
20
|
+
const {
|
|
21
|
+
displayApplicationValidation,
|
|
22
|
+
displayExternalFilesValidation,
|
|
23
|
+
displayRbacValidation,
|
|
24
|
+
displayFileValidation,
|
|
25
|
+
displayAggregatedWarnings,
|
|
26
|
+
displayOverallStatus
|
|
27
|
+
} = require('./validate-display-sections');
|
|
28
|
+
const {
|
|
29
|
+
displayDimensionsValidation,
|
|
30
|
+
extractDimensionsFromDatasource
|
|
31
|
+
} = require('./validate-display-dimensions');
|
|
32
|
+
const { displayStepByStepValidation } = require('./validate-display-steps');
|
|
387
33
|
|
|
388
34
|
/**
|
|
389
35
|
* Displays batch validation results (per-app blocks then summary).
|
|
@@ -418,31 +64,6 @@ function displayBatchValidationResults(batchResult) {
|
|
|
418
64
|
}
|
|
419
65
|
}
|
|
420
66
|
|
|
421
|
-
/**
|
|
422
|
-
* Displays overall validation status
|
|
423
|
-
* @param {Object} result - Validation result
|
|
424
|
-
*/
|
|
425
|
-
function displayOverallStatus(result) {
|
|
426
|
-
let hasErrors = result.errors && result.errors.length > 0;
|
|
427
|
-
if (!hasErrors && result.steps) {
|
|
428
|
-
const stepErrors = [result.steps.application, result.steps.components, result.steps.manifest]
|
|
429
|
-
.filter(Boolean)
|
|
430
|
-
.some(s => s.errors && s.errors.length > 0);
|
|
431
|
-
if (stepErrors) {
|
|
432
|
-
hasErrors = true;
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
const hasWarnings = result.warnings && result.warnings.length > 0;
|
|
436
|
-
logger.log('');
|
|
437
|
-
if (hasErrors) {
|
|
438
|
-
logger.log(headerKeyValue('Overall:', chalk.red('Failed')));
|
|
439
|
-
} else if (hasWarnings) {
|
|
440
|
-
logger.log(headerKeyValue('Overall:', chalk.yellow('Passed with warnings')));
|
|
441
|
-
} else {
|
|
442
|
-
logger.log(headerKeyValue('Overall:', chalk.green('Passed')));
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
|
|
446
67
|
/**
|
|
447
68
|
* Displays validation results in a user-friendly format
|
|
448
69
|
*
|
|
@@ -481,6 +102,7 @@ function displayValidationResults(result) {
|
|
|
481
102
|
logger.log(`\n${metadata(path.resolve(result.appPath))}`);
|
|
482
103
|
}
|
|
483
104
|
}
|
|
105
|
+
|
|
484
106
|
module.exports = {
|
|
485
107
|
displayValidationResults,
|
|
486
108
|
displayBatchValidationResults,
|
package/package.json
CHANGED
|
@@ -64,9 +64,15 @@ build:
|
|
|
64
64
|
dockerfile: builder/dataplane/Dockerfile # Dockerfile path (relative to project root)
|
|
65
65
|
envOutputPath: ../../.env # Copy to repo root for local dev
|
|
66
66
|
language: python # Runtime language for template selection (typescript or python)
|
|
67
|
-
|
|
67
|
+
# Dev reload: polling + watch /app/app only (avoids EMFILE on full repo bind-mount). See run_local.py, make af-reload.
|
|
68
|
+
reloadStart: WATCHFILES_FORCE_POLLING=1 uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-3001} --reload --reload-dir /app/app
|
|
68
69
|
# Pulled-image local compose (no bind-mount): drives `command` in generated docker-compose. Override for non-standard images (e.g. stub ACR tags).
|
|
69
70
|
imageRun: exec python -m uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-3001}
|
|
71
|
+
# Image policy (442.0): explicit Dockerfile COPY; worker/beat via python -m app.core.*
|
|
72
|
+
# integration/ in image: <systemKey>-deploy.json + application.json|yaml only (no test-*, wizard-configs).
|
|
73
|
+
worker: true
|
|
74
|
+
imageRunWorker: exec python -m app.core.celery_worker_main
|
|
75
|
+
imageRunBeat: exec python -m app.core.celery_beat_main
|
|
70
76
|
|
|
71
77
|
# =============================================================================
|
|
72
78
|
# Portal Input Configuration (Deployment Wizard)
|
|
@@ -20,22 +20,33 @@ LOG_FORMAT=json
|
|
|
20
20
|
# Docker default (no volume): use LOG_FILE_PATH=/app/logs/app.log (directory created in image).
|
|
21
21
|
# Production with persistent logs: use /mnt/data/logs/app.log and mount a volume at /mnt/data.
|
|
22
22
|
LOG_FILE_PATH=/mnt/data/logs/app.log
|
|
23
|
-
# If true, run without Redis/Celery (single process)
|
|
23
|
+
# If true, run without Redis/Celery (single process). Set false on API/worker/beat in production.
|
|
24
24
|
LOCAL_MODE=true
|
|
25
25
|
|
|
26
|
+
# Celery worker process tuning (dataplane-worker container; optional overrides)
|
|
27
|
+
# CELERY_WORKER_QUEUES=external_data,document_sync,document_processing,audit
|
|
28
|
+
# CELERY_WORKER_CONCURRENCY=2
|
|
29
|
+
# CELERY_LOG_LEVEL=info
|
|
30
|
+
|
|
26
31
|
# When API_KEY is set, a matching Bearer token bypasses OAuth2 validation
|
|
27
32
|
# Same kv:// as miso-controller API_KEY so pipeline Bearer bypass uses one secrets.local entry
|
|
28
33
|
API_KEY=kv://miso-controller-secrets-apiKeyVault
|
|
34
|
+
# Comma-separated realm roles attached to API_KEY bypass (JWT realm_access.roles). Default: operator.
|
|
35
|
+
# Add integration RBAC role keys from published manifests when manual tests need selector/MCP access, e.g.:
|
|
36
|
+
# API_KEY_BYPASS_ROLES=operator,<role-from-manifest-rbac>
|
|
37
|
+
# API_KEY_BYPASS_ROLES=operator
|
|
29
38
|
|
|
30
39
|
# API Configuration
|
|
31
40
|
API_V1_STR=/api/v1
|
|
32
41
|
VERSION=1.9.5
|
|
33
42
|
# Minimum supported aifabrix-builder CLI semver (advertised on /health and /api/v1/health; empty = no gate)
|
|
34
43
|
# MIN_BUILDER_CLI_VERSION=2.45.0
|
|
35
|
-
MIN_BUILDER_CLI_VERSION=2.45.
|
|
44
|
+
MIN_BUILDER_CLI_VERSION=2.45.5
|
|
36
45
|
# Base URL for the dataplane web server (used for default OAuth2 callback URL when redirectUri is omitted)
|
|
37
46
|
# url:// resolves after kv://; includes front-door path from application.yaml (e.g. /data)
|
|
38
47
|
DATAPLANE_WEB_SERVER_URL=url://public
|
|
48
|
+
# Relative URL path where dataplane is served by reverse proxy (for prefixed deployments, e.g. /data).
|
|
49
|
+
DATAPLANE_RELATIVE_PATH=url://vdir-public
|
|
39
50
|
DATAPLANE_INTERNAL_URL=url://internal
|
|
40
51
|
|
|
41
52
|
# CORS Configuration
|
|
@@ -106,6 +117,7 @@ ABAC_POLICY_PARSE_CACHE_MAX_ENTRIES=2048
|
|
|
106
117
|
# =============================================================================
|
|
107
118
|
|
|
108
119
|
# MISO Application Client Credentials (per application)
|
|
120
|
+
# Backend-only: never expose MISO_CLIENTSECRET to the Vite frontend (use VITE_* in app-ui).
|
|
109
121
|
MISO_CLIENTID=kv://dataplane-client-idKeyVault
|
|
110
122
|
MISO_CLIENTSECRET=kv://dataplane-client-secretKeyVault
|
|
111
123
|
|
|
@@ -123,24 +135,17 @@ KEYCLOAK_REALM=aifabrix
|
|
|
123
135
|
MISO_WEB_SERVER_URL=url://miso-controller-public
|
|
124
136
|
# Internal: server-to-controller API calls (Docker: service:port; local: host:port — no front-door path).
|
|
125
137
|
MISO_CONTROLLER_URL=url://miso-controller-internal
|
|
138
|
+
# Browser logout page on miso-controller (path relative to MISO_WEB_SERVER_URL; not dataplane /login).
|
|
139
|
+
MISO_LOGOUT_URL=/logout
|
|
126
140
|
|
|
127
141
|
# Environment key sent to miso-controller (e.g. environmentKey on RBAC/register) when not supplied in the payload.
|
|
128
142
|
# Set MISO_PIPELINE_ENV_KEY=dev when the controller installation uses dev (e.g. MISO_CLIENTID=miso-controller-dev-dataplane).
|
|
129
143
|
# If unset, derived from MISO_CLIENTID (e.g. dev from miso-controller-dev-dataplane).
|
|
130
144
|
MISO_PIPELINE_ENV_KEY=
|
|
131
145
|
|
|
132
|
-
#
|
|
133
|
-
#
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
# OpenAI Configuration
|
|
137
|
-
OPENAI_API_KEY=kv://secrets-openaiApiKeyVault
|
|
138
|
-
|
|
139
|
-
# Azure OpenAI Configuration
|
|
140
|
-
AZURE_OPENAI_ENDPOINT=kv://azure-openaiapi-urlKeyVault
|
|
141
|
-
AZURE_OPENAI_API_KEY=kv://secrets-azureOpenaiApiKeyVault
|
|
142
|
-
AZURE_OPENAI_API_VERSION=2024-02-15-preview
|
|
143
|
-
AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o
|
|
146
|
+
# LLM: chat/embed route through governed enterprise-llm only. Provider credentials
|
|
147
|
+
# live on LLM provider external systems (integration/openai, azure-openai, ollama).
|
|
148
|
+
AI_VALIDATION_LLM_MODEL=gpt-4o-mini
|
|
144
149
|
|
|
145
150
|
# =============================================================================
|
|
146
151
|
# AUDIT CONFIGURATION
|
|
@@ -177,6 +182,19 @@ AUDIT_ASYNC_SHADOW_ENQUEUE=false
|
|
|
177
182
|
# Set true for local dev policy CRUD; pair with VITE_POLICY_MANAGEMENT_ENABLED=true in app-ui.
|
|
178
183
|
POLICY_MANAGEMENT_API_ENABLED=false
|
|
179
184
|
|
|
185
|
+
# Developer Access tab help links (optional; empty hides banner links in UI).
|
|
186
|
+
# VITE_DEVELOPER_GUIDE_URL=
|
|
187
|
+
# VITE_API_EXAMPLES_URL=
|
|
188
|
+
# VITE_MCP_INTEGRATION_GUIDE_URL=
|
|
189
|
+
|
|
190
|
+
# First-party HTTP internal SpecFile (398.2 / plan 397). When true, lifespan upserts
|
|
191
|
+
# internal:dataplane-first-party-http from the live COM-merged OpenAPI schema.
|
|
192
|
+
FIRST_PARTY_HTTP_INTERNAL_SPEC_SYNC_ON_STARTUP=false
|
|
193
|
+
# Upsert internal:dataplane-first-party-http after pipeline external-system publish.
|
|
194
|
+
FIRST_PARTY_HTTP_INTERNAL_SPEC_SYNC_ON_PUBLISH=false
|
|
195
|
+
# Optional external_systems.id for spec_files FK; empty uses first row when startup sync is on.
|
|
196
|
+
FIRST_PARTY_HTTP_INTERNAL_SPEC_EXTERNAL_SYSTEM_ID=
|
|
197
|
+
|
|
180
198
|
# =============================================================================
|
|
181
199
|
# OBSERVABILITY CONFIGURATION
|
|
182
200
|
# =============================================================================
|
|
@@ -189,6 +207,11 @@ OPENTELEMETRY_ENDPOINT=
|
|
|
189
207
|
# INTEGRATION CERTIFICATE SIGNING (RS256 PEM)
|
|
190
208
|
# =============================================================================
|
|
191
209
|
# Read by PemRsaCertificateSigner.from_environment in app/validation/certificates/signer.py.
|
|
210
|
+
# Workforce execute signing (437.4). Falls back to CERTIFICATE_* keys, then ephemeral dev RSA.
|
|
211
|
+
DATAPLANE_PRIVATE_KEY=
|
|
212
|
+
DATAPLANE_PUBLIC_KEY=
|
|
213
|
+
DATAPLANE_PUBLIC_KEY_ID=
|
|
214
|
+
|
|
192
215
|
# When CERTIFICATE_PRIVATE_KEY and CERTIFICATE_PUBLIC_KEY are both set (non-empty PEM), the
|
|
193
216
|
# engine uses RS256. When unset and LOCAL_MODE=true, a process-local ephemeral RSA keypair is used
|
|
194
217
|
# (still RS256, with publicKey + publicKeyFingerprint on issued certs). Non-local requires PEM keys.
|
|
@@ -198,6 +221,19 @@ CERTIFICATE_PUBLIC_KEY=
|
|
|
198
221
|
# Optional public key identifier for issued certificates; default if unset: dataplane-signing-key
|
|
199
222
|
CERTIFICATE_PUBLIC_KEY_ID=
|
|
200
223
|
|
|
224
|
+
# =============================================================================
|
|
225
|
+
# VALIDATION ENGINE — YAML CONTRACTS
|
|
226
|
+
# =============================================================================
|
|
227
|
+
# Load rules from repo contracts/ and schedule hybrid YAML tasks (see docs/adr/0001-validation-engine-yaml-contracts.md).
|
|
228
|
+
# Code defaults when unset: VALIDATION_CONTRACTS_ENABLED=false, VALIDATION_RULESET=legacy.
|
|
229
|
+
# hybrid = legacy Python categories + YAML rules; yaml = YAML/hybrid only (requires contracts enabled).
|
|
230
|
+
# Optional override for contract bundle root (default: <dataplane-repo>/contracts):
|
|
231
|
+
# VALIDATION_CONTRACTS_ROOT=
|
|
232
|
+
VALIDATION_CONTRACTS_ENABLED=true
|
|
233
|
+
VALIDATION_RULESET=hybrid
|
|
234
|
+
# Attach advisory yamlSuggestedLevel + contract metadata on certification details (does not change ICC/PDS level selection).
|
|
235
|
+
VALIDATION_CERTIFICATION_YAML_ENABLED=true
|
|
236
|
+
|
|
201
237
|
# After a successful POST /api/v1/validation/run (validation engine with certification passed, or E2E success),
|
|
202
238
|
# persist an active integration certificate without a separate issue call. Set false to require explicit issue only.
|
|
203
239
|
VALIDATION_AUTO_ISSUE_INTEGRATION_CERTIFICATE=true
|