@aifabrix/builder 2.45.0 → 2.46.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/docs-rules.mdc +3 -1
- package/.cursor/rules/project-rules.mdc +1 -0
- package/README.md +43 -17
- package/integration/hubspot-test/wizard-hubspot-e2e.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 +130 -0
- package/jest.projects.js +69 -121
- package/lib/api/agent-metadata-validation.api.js +93 -0
- package/lib/api/api-response-errors.js +124 -0
- package/lib/api/audit-api-helpers.js +68 -0
- package/lib/api/audit.api.js +119 -0
- package/lib/api/auth-cache.api.js +44 -0
- package/lib/api/certificates.api.js +4 -4
- package/lib/api/credential.api.js +2 -2
- package/lib/api/dataplane-health.api.js +137 -0
- package/lib/api/dataplane-sync.api.js +27 -0
- package/lib/api/datasources-core.api.js +21 -18
- package/lib/api/datasources-extended.api.js +22 -22
- package/lib/api/dimensions.api.js +3 -0
- package/lib/api/external-systems.api.js +13 -13
- package/lib/api/governance-scenario-pack.api.js +159 -0
- package/lib/api/governance-scenarios.api.js +39 -0
- package/lib/api/groups.api.js +79 -0
- package/lib/api/index.js +88 -5
- package/lib/api/lifecycle.api.js +77 -0
- package/lib/api/pipeline.api.js +7 -5
- package/lib/api/protection.api.js +157 -0
- package/lib/api/records-bulk.api.js +43 -0
- package/lib/api/records-search-parse.js +49 -0
- package/lib/api/records-search.api.js +29 -0
- package/lib/api/types/agent-metadata-validation.types.js +67 -0
- package/lib/api/types/audit.types.js +72 -0
- package/lib/api/types/dataplane-health.types.js +27 -0
- package/lib/api/types/dimensions.types.js +2 -0
- package/lib/api/types/governance-scenarios.types.js +39 -0
- package/lib/api/types/protection.types.js +69 -0
- package/lib/api/types/records-bulk.types.js +35 -0
- package/lib/api/types/records-search.types.js +28 -0
- package/lib/api/user-groups.api.js +50 -0
- package/lib/api/users.api.js +95 -0
- package/lib/api/validation-run.api.js +3 -3
- package/lib/api/validation-runner.js +5 -3
- package/lib/api/wizard-platform.api.js +3 -3
- package/lib/api/wizard.api.js +21 -21
- package/lib/app/deploy-config.js +4 -1
- package/lib/app/deploy.js +34 -19
- package/lib/app/down.js +20 -1
- 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/build/index.js +5 -0
- package/lib/certification/sync-system-certification.js +13 -6
- package/lib/cli/index.js +8 -2
- package/lib/cli/infra-guided-auth.js +109 -0
- package/lib/cli/infra-guided.js +91 -69
- package/lib/cli/setup-app.help.js +19 -2
- package/lib/cli/setup-app.js +58 -23
- package/lib/cli/setup-app.test-commands.js +28 -21
- package/lib/cli/setup-auth.js +55 -3
- 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 +62 -6
- 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 +65 -0
- package/lib/cli/setup-utility-repair.js +198 -0
- package/lib/cli/setup-utility-resolve.js +42 -6
- package/lib/cli/setup-utility-validate.js +197 -0
- package/lib/cli/setup-utility.js +41 -258
- package/lib/commands/auth-status-client-tokens.js +214 -0
- package/lib/commands/auth-status-dataplane-version.js +269 -0
- package/lib/commands/auth-status-display.js +94 -0
- package/lib/commands/auth-status.js +111 -53
- package/lib/commands/credential-push.js +10 -5
- package/lib/commands/datasource-load-export-cli.js +178 -0
- package/lib/commands/datasource-test-trust-cli.js +118 -0
- package/lib/commands/datasource-unified-test-cli.js +31 -20
- package/lib/commands/datasource-unified-test-cli.options.js +22 -3
- package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
- package/lib/commands/datasource-verify-audit-cli.js +96 -0
- package/lib/commands/datasource.js +68 -1
- package/lib/commands/dev-show-display.js +8 -1
- package/lib/commands/dimension-value.js +43 -13
- package/lib/commands/dimension.js +38 -7
- 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 +131 -0
- package/lib/commands/identity-group-cli.js +146 -0
- package/lib/commands/identity-membership-role-cache.js +175 -0
- package/lib/commands/identity-shared.js +94 -0
- package/lib/commands/identity-user-cli.js +158 -0
- package/lib/commands/identity.js +43 -0
- package/lib/commands/lifecycle-command-action.js +123 -0
- package/lib/commands/lifecycle-external.js +268 -0
- package/lib/commands/login.js +56 -17
- package/lib/commands/protection-cli-leaves.js +286 -0
- package/lib/commands/protection.js +50 -0
- package/lib/commands/repair-auth-apply.js +127 -0
- package/lib/commands/repair-changed-files.js +41 -0
- package/lib/commands/repair-datasource-keys.js +4 -1
- package/lib/commands/repair-datasource-run.js +59 -0
- package/lib/commands/repair-datasource-test-payload.js +259 -0
- package/lib/commands/repair-datasource.js +1 -51
- package/lib/commands/repair-env-template.js +64 -13
- package/lib/commands/repair-external-run.js +216 -0
- package/lib/commands/repair-openapi-sync.js +23 -0
- package/lib/commands/repair-persist.js +4 -0
- package/lib/commands/repair-rbac.js +52 -1
- package/lib/commands/repair-steps.js +145 -0
- package/lib/commands/repair.js +29 -286
- 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 +67 -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 +61 -14
- package/lib/commands/test-governance-cli-options.js +47 -0
- package/lib/commands/test-governance-external.js +67 -0
- package/lib/commands/test-trust-cli-options.js +32 -0
- package/lib/commands/test-trust-external.js +126 -0
- package/lib/commands/up-common.js +25 -13
- package/lib/commands/up-dataplane.js +50 -13
- package/lib/commands/upload-publish-context.js +75 -0
- package/lib/commands/upload-sidecar-followups.js +89 -0
- package/lib/commands/upload.js +108 -105
- 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 +70 -0
- package/lib/commands/verify-trust-external.js +67 -0
- package/lib/commands/wizard-config-normalizer.js +43 -23
- package/lib/commands/wizard-core.js +5 -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-device-dataplane.js +185 -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 +55 -0
- package/lib/datasource/agent-trust-debug-log.js +45 -0
- package/lib/datasource/agent-trust-fetch.js +115 -0
- package/lib/datasource/agent-trust-map.js +101 -0
- package/lib/datasource/agent-trust-mock.js +44 -0
- package/lib/datasource/agent-trust-run.js +95 -0
- package/lib/datasource/agent-trust-timeout.js +25 -0
- package/lib/datasource/audit-evidence-display.js +80 -0
- package/lib/datasource/audit-evidence-extract-debug.js +115 -0
- package/lib/datasource/audit-evidence-extract.js +180 -0
- package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
- package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
- package/lib/datasource/audit-evidence-poll.js +109 -0
- package/lib/datasource/audit-evidence-run.js +177 -0
- package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
- package/lib/datasource/audit-evidence-verify-matrix.js +205 -0
- package/lib/datasource/audit-evidence-verify.js +108 -0
- package/lib/datasource/bulk-loader-run-batches.js +100 -0
- package/lib/datasource/bulk-loader-service-retry.js +52 -0
- package/lib/datasource/bulk-loader-service.js +127 -0
- package/lib/datasource/capability/run-capability-dimension.js +2 -1
- package/lib/datasource/datasource-exporter-resolve.js +82 -0
- package/lib/datasource/datasource-exporter-service.js +144 -0
- package/lib/datasource/datasource-identifier.js +148 -0
- package/lib/datasource/datasource-load-export-context.js +95 -0
- package/lib/datasource/integration-context.js +6 -4
- package/lib/datasource/local-data-paths.js +145 -0
- package/lib/datasource/log-cleaner.js +241 -0
- package/lib/datasource/log-viewer.js +111 -6
- package/lib/datasource/record-file-parser.js +85 -0
- package/lib/datasource/record-mapper.js +129 -0
- package/lib/datasource/resolve-app.js +74 -55
- package/lib/datasource/test-e2e.js +29 -2
- package/lib/datasource/unified-validation-run-body.js +3 -1
- package/lib/datasource/unified-validation-run-resolve.js +45 -12
- package/lib/datasource/unified-validation-run.js +47 -18
- package/lib/datasource/validate.js +37 -20
- package/lib/deployment/environment-poll-status.js +138 -0
- package/lib/deployment/environment.js +42 -34
- package/lib/external-system/download.js +21 -20
- package/lib/external-system/generator.js +5 -1
- package/lib/external-system/integration-auth-context.js +45 -0
- package/lib/external-system/test-auth.js +12 -5
- package/lib/external-system/test-system-level.js +25 -4
- package/lib/external-system/test.js +9 -7
- package/lib/generator/external-controller-manifest.js +15 -0
- package/lib/governance/governance-cli-errors.js +96 -0
- package/lib/governance/governance-download-display.js +38 -0
- package/lib/governance/governance-pack-loader.js +70 -0
- package/lib/governance/governance-run-display.js +309 -0
- package/lib/identity/identity-apply-core.js +108 -0
- package/lib/identity/identity-apply-phases.js +244 -0
- package/lib/identity/identity-apply-service.js +77 -0
- package/lib/identity/identity-csv-parser.js +114 -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/internal/fs-real-sync.js +29 -1
- 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.js +471 -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 +51 -0
- package/lib/protection/convert-batch.js +90 -0
- package/lib/protection/load.js +41 -0
- package/lib/protection/paths.js +158 -0
- package/lib/protection/preflight-datasource-ready.js +46 -0
- package/lib/protection/protection-create-probe-lines.js +142 -0
- package/lib/protection/protection-create-probes.js +95 -0
- package/lib/protection/protection-create-scaffold.js +281 -0
- package/lib/protection/protection-display-helpers.js +445 -0
- package/lib/protection/protection-display.js +215 -0
- package/lib/protection/protection-preset-registry.js +97 -0
- package/lib/protection/report-exit.js +62 -0
- package/lib/protection/resolve.js +202 -0
- package/lib/protection/run-commands-validate.js +130 -0
- package/lib/protection/run-commands.js +216 -0
- package/lib/protection/run-protection-create-helpers.js +134 -0
- package/lib/protection/run-protection-create-probes-flow.js +43 -0
- package/lib/protection/run-protection-create.js +191 -0
- package/lib/protection/scope.js +22 -0
- package/lib/protection/sync-after-upload.js +64 -0
- package/lib/protection/upload-batch.js +127 -0
- package/lib/protection/validate-batch.js +113 -0
- package/lib/protection/validate-local.js +65 -0
- package/lib/resolvers/dimension-file.js +29 -4
- package/lib/schema/application-schema.json +1 -1
- package/lib/schema/datasource-test-run.schema.json +89 -6
- package/lib/schema/external-datasource.schema.json +2636 -2588
- package/lib/schema/external-system.schema.json +1089 -761
- package/lib/schema/flag-map-validation-run.json +2 -2
- package/lib/schema/infra.parameter.yaml +45 -0
- package/lib/schema/protection.schema.json +374 -0
- package/lib/schema/type/credential-field-registry.json +642 -0
- package/lib/schema/wizard-config.schema.json +1 -1
- package/lib/utils/agent-trust-run-display.js +231 -0
- package/lib/utils/agent-trust-run-exit.js +59 -0
- package/lib/utils/agent-trust-wait-ui.js +94 -0
- 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/cli-exit-codes.js +30 -0
- package/lib/utils/cli-secrets-error-format.js +83 -21
- package/lib/utils/cli-sync-options.js +33 -0
- package/lib/utils/cli-utils.js +16 -4
- package/lib/utils/compose-generate-docker-compose.js +4 -0
- package/lib/utils/compose-traefik-ingress-base.js +16 -1
- package/lib/utils/config-secrets-path.js +46 -0
- package/lib/utils/controller-url.js +88 -1
- package/lib/utils/credential-push-ui.js +90 -0
- package/lib/utils/credential-secrets-env.js +137 -9
- package/lib/utils/dataplane-cli-version-gate.js +202 -0
- package/lib/utils/dataplane-cli-version-help.js +74 -0
- package/lib/utils/dataplane-resolver.js +129 -2
- package/lib/utils/datasource-export-display.js +137 -0
- package/lib/utils/datasource-load-display.js +174 -0
- package/lib/utils/datasource-load-export-ui.js +120 -0
- package/lib/utils/datasource-test-run-capability-scope.js +3 -3
- package/lib/utils/datasource-test-run-display.js +3 -3
- package/lib/utils/datasource-test-run-tty-log.js +5 -1
- package/lib/utils/declarative-url-ports.js +3 -3
- package/lib/utils/deployment-auth-mode.js +41 -0
- package/lib/utils/developer-volume-id.js +33 -0
- 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 +1 -0
- package/lib/utils/external-system-readiness-core.js +10 -0
- package/lib/utils/external-system-readiness-display.js +80 -23
- package/lib/utils/health-check.js +4 -1
- package/lib/utils/help-builder.js +35 -26
- 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 +24 -0
- package/lib/utils/pipeline-upload-auth-retry.js +82 -0
- package/lib/utils/platform-controller-url.js +156 -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/secrets-generator.js +31 -25
- package/lib/utils/secrets-missing-error.js +164 -0
- package/lib/utils/semver-compare.js +127 -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 +98 -0
- 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 +22 -7
- package/lib/utils/validation-run-stage.js +45 -0
- package/lib/validation/wizard-config-validator.js +58 -19
- package/package.json +1 -1
- package/templates/applications/dataplane/application.yaml +2 -1
- package/templates/applications/dataplane/env.template +36 -1
- package/templates/applications/dataplane/rbac.yaml +4 -0
- package/templates/applications/miso-controller/env.template +16 -0
- package/templates/external-system/README.md.hbs +116 -11
- package/templates/python/docker-compose.hbs +19 -18
- package/templates/typescript/docker-compose.hbs +18 -17
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
{ "cliFlag": "--no-run-scenarios", "requestField": "e2eOptions.runScenarios", "runType": "e2e" },
|
|
15
15
|
{ "cliFlag": "--no-cleanup", "requestField": "e2eOptions.cleanup", "runType": "e2e" },
|
|
16
16
|
{ "cliFlag": "--primary-key-value", "requestField": "e2eOptions.primaryKeyValue", "runType": "e2e" },
|
|
17
|
-
{ "cliFlag": "
|
|
18
|
-
{ "cliFlag": "--strict-capability-scope", "requestField": null, "runType": "e2e", "note": "Client-only: exit ≥1 when capabilities[] has >1 row while
|
|
17
|
+
{ "cliFlag": "[capabilityKey] (positional)", "requestField": "e2eOptions.capabilityKeys", "runType": "e2e", "note": "Single key forwarded as capabilityKeys array in request body when set" },
|
|
18
|
+
{ "cliFlag": "--strict-capability-scope", "requestField": null, "runType": "e2e", "note": "Client-only: exit ≥1 when capabilities[] has >1 row while [capabilityKey] is set (plan §2.3)" },
|
|
19
19
|
{ "cliFlag": "--require-cert", "requestField": null, "note": "Client-only exit code 2 gate" },
|
|
20
20
|
{ "cliFlag": "--warnings-as-errors", "requestField": null, "note": "Client-only exit code 1 on warn" },
|
|
21
21
|
{ "cliFlag": "--json", "requestField": null, "note": "Stdout prints raw DatasourceTestRun" },
|
|
@@ -28,6 +28,11 @@ standardUpInfraEnsureKeys:
|
|
|
28
28
|
- databases-dataplane-2-passwordKeyVault
|
|
29
29
|
- databases-dataplane-3-urlKeyVault
|
|
30
30
|
- databases-dataplane-3-passwordKeyVault
|
|
31
|
+
# Miso-controller Entra onboarding (vendor app); required for aifabrix resolve miso-controller
|
|
32
|
+
- entra-callback-state-secret
|
|
33
|
+
- entra-callback-uri
|
|
34
|
+
- entra-client-idKeyVault
|
|
35
|
+
- entra-client-secretKeyVault
|
|
31
36
|
parameters:
|
|
32
37
|
- key: postgres-passwordKeyVault
|
|
33
38
|
scope: infra
|
|
@@ -117,6 +122,46 @@ parameters:
|
|
|
117
122
|
vaultSecretName: keycloak-client-secretKeyVault
|
|
118
123
|
notes: Per-app OAuth client secret from Keycloak registration; generated on first ensure.
|
|
119
124
|
|
|
125
|
+
# Miso-controller Entra ID onboarding (vendor multi-tenant app). Empty client/callback values
|
|
126
|
+
# allow local resolve and start-dev; set real values before Entra admin-consent flows.
|
|
127
|
+
- key: entra-callback-state-secret
|
|
128
|
+
scope: shared-service
|
|
129
|
+
generator:
|
|
130
|
+
type: randomBytes32
|
|
131
|
+
ensureOn: [upInfra, resolveApp]
|
|
132
|
+
azure:
|
|
133
|
+
notes: >-
|
|
134
|
+
Shared HMAC secret (min 16 chars) for OAuth state between controller and Mori callback;
|
|
135
|
+
maps to ENTRA_CALLBACK_STATE_SECRET in miso-controller env.template.
|
|
136
|
+
|
|
137
|
+
- key: entra-callback-uri
|
|
138
|
+
scope: shared-service
|
|
139
|
+
generator:
|
|
140
|
+
type: emptyString
|
|
141
|
+
ensureOn: [upInfra, resolveApp]
|
|
142
|
+
azure:
|
|
143
|
+
notes: >-
|
|
144
|
+
ENTRA_ID_CENTRAL_CALLBACK_URI — Mori web redirect (e.g. …/entra-id-concent/callback);
|
|
145
|
+
empty locally until Mori URL is configured.
|
|
146
|
+
|
|
147
|
+
- key: entra-client-idKeyVault
|
|
148
|
+
scope: shared-service
|
|
149
|
+
generator:
|
|
150
|
+
type: emptyString
|
|
151
|
+
ensureOn: [upInfra, resolveApp]
|
|
152
|
+
azure:
|
|
153
|
+
notes: >-
|
|
154
|
+
Vendor Entra app client id (ENTRA_ID_CLIENT_ID); empty for local dev without Entra flows.
|
|
155
|
+
|
|
156
|
+
- key: entra-client-secretKeyVault
|
|
157
|
+
scope: shared-service
|
|
158
|
+
generator:
|
|
159
|
+
type: emptyString
|
|
160
|
+
ensureOn: [upInfra, resolveApp]
|
|
161
|
+
azure:
|
|
162
|
+
notes: >-
|
|
163
|
+
Vendor Entra app client secret (ENTRA_ID_CLIENT_SECRET); empty for local dev without Entra flows.
|
|
164
|
+
|
|
120
165
|
# Keycloak events: webhook signature secret used by miso-controller (KEYCLOAK_EVENTS_SECRET).
|
|
121
166
|
# This must exist on first boot because up-platform runs containers from templates (no prior resolve).
|
|
122
167
|
- key: keycloak-events-secretKeyVault
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "aifabrix://schema/protection.schema.json",
|
|
4
|
+
"title": "AI Fabrix Protection Manifest Schema",
|
|
5
|
+
"description": "Schema for Protection manifests deployed to the AI Fabrix Dataplane. A protection binds to exactly one deployed external datasource (spec.datasourceKey) and declares how synced records project principal-to-dimension-value grants during datasource sync. Distinct from datasource validation-rule 'when' in contracts/schemas/rule.schema.json: rules[].when here gates assignment and runtime using the local identity snapshot (User, Group, UserGroup) and subject dimension state only.",
|
|
6
|
+
"metadata": {
|
|
7
|
+
"key": "protection-schema",
|
|
8
|
+
"name": "Protection Manifest Schema",
|
|
9
|
+
"description": "JSON schema for validating Protection manifest documents (apiVersion/kind/metadata/spec envelope)",
|
|
10
|
+
"version": "1.0.0",
|
|
11
|
+
"type": "schema",
|
|
12
|
+
"category": "integration",
|
|
13
|
+
"author": "AI Fabrix Team",
|
|
14
|
+
"createdAt": "2026-05-18T00:00:00Z",
|
|
15
|
+
"updatedAt": "2026-05-18T00:00:00Z",
|
|
16
|
+
"compatibility": {
|
|
17
|
+
"minVersion": "1.0.0",
|
|
18
|
+
"maxVersion": "1.0.0",
|
|
19
|
+
"deprecated": false
|
|
20
|
+
},
|
|
21
|
+
"tags": [
|
|
22
|
+
"schema",
|
|
23
|
+
"protection",
|
|
24
|
+
"dataplane",
|
|
25
|
+
"integration",
|
|
26
|
+
"validation",
|
|
27
|
+
"abac",
|
|
28
|
+
"dimensions",
|
|
29
|
+
"projection"
|
|
30
|
+
],
|
|
31
|
+
"dependencies": [
|
|
32
|
+
"external-datasource.schema.json"
|
|
33
|
+
],
|
|
34
|
+
"changelog": [
|
|
35
|
+
{
|
|
36
|
+
"version": "1.0.0",
|
|
37
|
+
"date": "2026-05-18T00:00:00Z",
|
|
38
|
+
"changes": [
|
|
39
|
+
"Initial production schema for Protection manifests (401.1 dataplane baseline).",
|
|
40
|
+
"Envelope: apiVersion dataplane.aifabrix.ai/v1, kind Protection, metadata.key/displayName, spec.enabled/datasourceKey/mode/rules.",
|
|
41
|
+
"spec.datasourceKey scopes runtime projection to one deployed datasource; do not use legacy field name 'datasource'.",
|
|
42
|
+
"spec.mode: replaceForSource — per protection, per source record, replace prior projection outputs for that record.",
|
|
43
|
+
"rules[].principal: user (field) or group (field|expression); exactly one of field or expression per principal block.",
|
|
44
|
+
"rules[].grants: required dimensionKey and valueExpression; optional valueType only when Dimension.valueType is both (catalog resolved at validate/projection).",
|
|
45
|
+
"rules[].when: optional groups.requireAny (Group.key) and/or dimensions.requireAll (subject preconditions); additionalProperties false on when/groups/dimensions.",
|
|
46
|
+
"Expression roots (v1): metadata.*, fk.<name>.metadata.*, fk.<name>.dimension.* (one-hop FK only).",
|
|
47
|
+
"principalRef storage uses normalized User.id / Group.id after projection (401.3); not validated structurally in this schema."
|
|
48
|
+
],
|
|
49
|
+
"breaking": false
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"type": "object",
|
|
54
|
+
"additionalProperties": false,
|
|
55
|
+
"required": ["apiVersion", "kind", "metadata", "spec"],
|
|
56
|
+
"properties": {
|
|
57
|
+
"apiVersion": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"const": "dataplane.aifabrix.ai/v1",
|
|
60
|
+
"description": "API version of the Protection manifest envelope. Must be dataplane.aifabrix.ai/v1 for v1 tooling and upload APIs."
|
|
61
|
+
},
|
|
62
|
+
"kind": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"const": "Protection",
|
|
65
|
+
"description": "Resource kind discriminator. Must be Protection."
|
|
66
|
+
},
|
|
67
|
+
"metadata": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"additionalProperties": false,
|
|
70
|
+
"description": "Identity and display metadata for this protection. metadata.key is globally unique in v1 and is the protection key used in APIs, lineage tables, and builder CLI.",
|
|
71
|
+
"required": ["key", "displayName"],
|
|
72
|
+
"properties": {
|
|
73
|
+
"key": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"minLength": 1,
|
|
76
|
+
"maxLength": 128,
|
|
77
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
78
|
+
"description": "Unique protection key (globally unique in v1). Lowercase alphanumeric and hyphens; used as protectionKey in storage and APIs.",
|
|
79
|
+
"examples": ["hubspot-country-sales", "hr-persons-protection"]
|
|
80
|
+
},
|
|
81
|
+
"displayName": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"minLength": 1,
|
|
84
|
+
"maxLength": 255,
|
|
85
|
+
"description": "Human-readable name shown in builder and operator UIs.",
|
|
86
|
+
"examples": ["HubSpot Country Sales Access", "HR Persons Protection"]
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"spec": {
|
|
91
|
+
"type": "object",
|
|
92
|
+
"additionalProperties": false,
|
|
93
|
+
"description": "Protection specification. spec.enabled is the canonical enable flag; the dataplane denormalizes it to ProtectionManifest.enabled for indexed queries.",
|
|
94
|
+
"required": ["enabled", "datasourceKey", "mode", "rules"],
|
|
95
|
+
"properties": {
|
|
96
|
+
"enabled": {
|
|
97
|
+
"type": "boolean",
|
|
98
|
+
"description": "Canonical enable flag. When false, the protection is stored but not selected for projection during datasource sync (indexed enabled column mirrors this value on upload)."
|
|
99
|
+
},
|
|
100
|
+
"datasourceKey": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"minLength": 1,
|
|
103
|
+
"maxLength": 128,
|
|
104
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
105
|
+
"description": "Deployed external datasource key this protection applies to. Runtime projection runs only during sync of this datasource. Must match ExternalDataSource.key. Do not use the field name 'datasource'.",
|
|
106
|
+
"examples": ["hubspot-companies", "hubspot-deals", "hr-persons"]
|
|
107
|
+
},
|
|
108
|
+
"mode": {
|
|
109
|
+
"type": "string",
|
|
110
|
+
"enum": ["replaceForSource"],
|
|
111
|
+
"description": "Projection replacement mode (v1). replaceForSource: for each source record on datasourceKey, replace all dynamic values and grants previously emitted by this protection for that sourceRecordId (per protection, not global)."
|
|
112
|
+
},
|
|
113
|
+
"rules": {
|
|
114
|
+
"type": "array",
|
|
115
|
+
"minItems": 1,
|
|
116
|
+
"description": "Projection rules. rules[].key is unique within this protection only; storage identity is (protectionKey, projectionRuleKey).",
|
|
117
|
+
"items": {
|
|
118
|
+
"$ref": "#/$defs/protectionRule"
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"$defs": {
|
|
125
|
+
"protectionRule": {
|
|
126
|
+
"type": "object",
|
|
127
|
+
"additionalProperties": false,
|
|
128
|
+
"description": "One projection rule: resolve principals from synced records, optionally gate on subject when, emit dimension value grants.",
|
|
129
|
+
"required": ["key", "principal", "grants"],
|
|
130
|
+
"properties": {
|
|
131
|
+
"key": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"minLength": 1,
|
|
134
|
+
"maxLength": 128,
|
|
135
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
136
|
+
"description": "Rule key unique within this protection (projectionRuleKey in lineage).",
|
|
137
|
+
"examples": ["sales-country-users", "hr-manager-department", "europe-region-group"]
|
|
138
|
+
},
|
|
139
|
+
"when": {
|
|
140
|
+
"$ref": "#/$defs/ruleWhen",
|
|
141
|
+
"description": "Optional subject preconditions evaluated against local identity snapshot and subject dimensions. Omitted = rule always eligible (subject to principal resolution only). Not the same as datasource validation-rule when."
|
|
142
|
+
},
|
|
143
|
+
"principal": {
|
|
144
|
+
"$ref": "#/$defs/principal",
|
|
145
|
+
"description": "How to resolve the principal (user or group) from each synced record on datasourceKey."
|
|
146
|
+
},
|
|
147
|
+
"grants": {
|
|
148
|
+
"type": "array",
|
|
149
|
+
"minItems": 1,
|
|
150
|
+
"description": "Dimension value grants to attach to the resolved principal for each qualifying record.",
|
|
151
|
+
"items": {
|
|
152
|
+
"$ref": "#/$defs/grant"
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"ruleWhen": {
|
|
158
|
+
"type": "object",
|
|
159
|
+
"additionalProperties": false,
|
|
160
|
+
"minProperties": 1,
|
|
161
|
+
"description": "Optional rule-level gate. If both groups and dimensions are present, all blocks must pass (AND). Evaluated at projection (401.3) and re-checked at runtime (401.4).",
|
|
162
|
+
"properties": {
|
|
163
|
+
"groups": {
|
|
164
|
+
"type": "object",
|
|
165
|
+
"additionalProperties": false,
|
|
166
|
+
"description": "Group membership gate. For user principals: grants are not persisted unless the user is in at least one requireAny group (UserGroup). Group-target rules typically ignore when.groups unless product overrides.",
|
|
167
|
+
"required": ["requireAny"],
|
|
168
|
+
"properties": {
|
|
169
|
+
"requireAny": {
|
|
170
|
+
"type": "array",
|
|
171
|
+
"minItems": 1,
|
|
172
|
+
"uniqueItems": true,
|
|
173
|
+
"description": "Group.key values from the local identity snapshot; subject must be a member of at least one.",
|
|
174
|
+
"items": {
|
|
175
|
+
"type": "string",
|
|
176
|
+
"minLength": 1,
|
|
177
|
+
"maxLength": 128
|
|
178
|
+
},
|
|
179
|
+
"examples": [["Manager"], ["Sales", "SalesManager"]]
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
"dimensions": {
|
|
184
|
+
"type": "object",
|
|
185
|
+
"additionalProperties": false,
|
|
186
|
+
"description": "Subject dimension precondition: the subject must already hold all listed dimension values before grants from this rule are applied.",
|
|
187
|
+
"required": ["requireAll"],
|
|
188
|
+
"properties": {
|
|
189
|
+
"requireAll": {
|
|
190
|
+
"type": "array",
|
|
191
|
+
"minItems": 1,
|
|
192
|
+
"description": "All entries must be satisfied (AND). Gates subject state, not record fields.",
|
|
193
|
+
"items": {
|
|
194
|
+
"$ref": "#/$defs/whenDimensionRequireAll"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
"whenDimensionRequireAll": {
|
|
202
|
+
"type": "object",
|
|
203
|
+
"additionalProperties": false,
|
|
204
|
+
"required": ["dimensionKey", "values"],
|
|
205
|
+
"properties": {
|
|
206
|
+
"dimensionKey": {
|
|
207
|
+
"type": "string",
|
|
208
|
+
"minLength": 1,
|
|
209
|
+
"maxLength": 128,
|
|
210
|
+
"description": "Dimension catalog key (Dimension.key).",
|
|
211
|
+
"examples": ["department", "sensitivity", "country"]
|
|
212
|
+
},
|
|
213
|
+
"values": {
|
|
214
|
+
"type": "array",
|
|
215
|
+
"minItems": 1,
|
|
216
|
+
"uniqueItems": true,
|
|
217
|
+
"description": "Required dimension value strings for the subject at evaluation time.",
|
|
218
|
+
"items": {
|
|
219
|
+
"type": "string",
|
|
220
|
+
"minLength": 1,
|
|
221
|
+
"maxLength": 512
|
|
222
|
+
},
|
|
223
|
+
"examples": [["restricted"], ["FI", "SE"]]
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
"principal": {
|
|
228
|
+
"type": "object",
|
|
229
|
+
"additionalProperties": false,
|
|
230
|
+
"description": "Principal resolution from the syncing datasource record. Exactly one of field or expression must be set. Resolved principalRef at projection must be User.id or Group.id (never display name or raw email as canonical ref).",
|
|
231
|
+
"required": ["type"],
|
|
232
|
+
"properties": {
|
|
233
|
+
"type": {
|
|
234
|
+
"type": "string",
|
|
235
|
+
"enum": ["user", "group"],
|
|
236
|
+
"description": "Principal kind. user: resolve via field on the record to a User row. group: resolve via field or expression to a Group row (Group.key or Group.id)."
|
|
237
|
+
},
|
|
238
|
+
"field": {
|
|
239
|
+
"type": "string",
|
|
240
|
+
"minLength": 1,
|
|
241
|
+
"maxLength": 512,
|
|
242
|
+
"description": "Record field path (scalar or array path such as metadata.teamMembers[].email). Required for type=user. Allowed for type=group when resolving from record data.",
|
|
243
|
+
"examples": ["metadata.managerEmail", "metadata.teamMembers[].email"]
|
|
244
|
+
},
|
|
245
|
+
"expression": {
|
|
246
|
+
"type": "string",
|
|
247
|
+
"minLength": 1,
|
|
248
|
+
"maxLength": 512,
|
|
249
|
+
"description": "Template expression resolving to a group identifier (typically Group.key). Common for type=group. Allowed roots: metadata.*, fk.<name>.metadata.*, fk.<name>.dimension.* (one-hop FK only).",
|
|
250
|
+
"examples": [
|
|
251
|
+
"Sales {{fk.country.metadata.iso3}} Users",
|
|
252
|
+
"Sales Nordics Users"
|
|
253
|
+
]
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
"oneOf": [
|
|
257
|
+
{
|
|
258
|
+
"required": ["field"],
|
|
259
|
+
"not": {
|
|
260
|
+
"required": ["expression"]
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
"required": ["expression"],
|
|
265
|
+
"not": {
|
|
266
|
+
"required": ["field"]
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
]
|
|
270
|
+
},
|
|
271
|
+
"grant": {
|
|
272
|
+
"type": "object",
|
|
273
|
+
"additionalProperties": false,
|
|
274
|
+
"description": "Grant of one dimension value to the resolved principal. effective valueType is resolved from Dimension.valueType in the synced catalog when Dimension.valueType is static or dynamic; grant.valueType is required only when catalog valueType is both.",
|
|
275
|
+
"required": ["dimensionKey", "valueExpression"],
|
|
276
|
+
"properties": {
|
|
277
|
+
"dimensionKey": {
|
|
278
|
+
"type": "string",
|
|
279
|
+
"minLength": 1,
|
|
280
|
+
"maxLength": 128,
|
|
281
|
+
"description": "Dimension catalog key (Dimension.key). Must exist in the synced dimension catalog.",
|
|
282
|
+
"examples": ["country", "region", "department", "project"]
|
|
283
|
+
},
|
|
284
|
+
"valueExpression": {
|
|
285
|
+
"type": "string",
|
|
286
|
+
"minLength": 1,
|
|
287
|
+
"maxLength": 512,
|
|
288
|
+
"description": "Expression evaluated per record/FK context to produce the dimension value string. static dimensions: value must exist in DimensionValue catalog. dynamic dimensions: value may be upserted into dynamic_dimension_values at projection.",
|
|
289
|
+
"examples": [
|
|
290
|
+
"{{fk.country.metadata.iso2}}",
|
|
291
|
+
"europe",
|
|
292
|
+
"{{metadata.departmentCode}}",
|
|
293
|
+
"{{metadata.projectCode}}"
|
|
294
|
+
]
|
|
295
|
+
},
|
|
296
|
+
"labelExpression": {
|
|
297
|
+
"type": "string",
|
|
298
|
+
"minLength": 1,
|
|
299
|
+
"maxLength": 512,
|
|
300
|
+
"description": "Optional human-readable label for dynamic dimension values (projection stores label when valueType resolves to dynamic)."
|
|
301
|
+
},
|
|
302
|
+
"valueType": {
|
|
303
|
+
"type": "string",
|
|
304
|
+
"enum": ["static", "dynamic"],
|
|
305
|
+
"description": "Disambiguates static vs dynamic assignment when Dimension.valueType in the catalog is both. Omit when catalog valueType is static or dynamic."
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
"examples": [
|
|
311
|
+
{
|
|
312
|
+
"apiVersion": "dataplane.aifabrix.ai/v1",
|
|
313
|
+
"kind": "Protection",
|
|
314
|
+
"metadata": {
|
|
315
|
+
"key": "hubspot-country-sales",
|
|
316
|
+
"displayName": "HubSpot Country Sales Access"
|
|
317
|
+
},
|
|
318
|
+
"spec": {
|
|
319
|
+
"enabled": true,
|
|
320
|
+
"datasourceKey": "hubspot-companies",
|
|
321
|
+
"mode": "replaceForSource",
|
|
322
|
+
"rules": [
|
|
323
|
+
{
|
|
324
|
+
"key": "sales-country-users",
|
|
325
|
+
"principal": {
|
|
326
|
+
"type": "group",
|
|
327
|
+
"expression": "Sales {{fk.country.metadata.iso3}} Users"
|
|
328
|
+
},
|
|
329
|
+
"grants": [
|
|
330
|
+
{
|
|
331
|
+
"dimensionKey": "country",
|
|
332
|
+
"valueExpression": "{{fk.country.metadata.iso2}}",
|
|
333
|
+
"labelExpression": "{{fk.country.metadata.name}}"
|
|
334
|
+
}
|
|
335
|
+
]
|
|
336
|
+
}
|
|
337
|
+
]
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
"apiVersion": "dataplane.aifabrix.ai/v1",
|
|
342
|
+
"kind": "Protection",
|
|
343
|
+
"metadata": {
|
|
344
|
+
"key": "hr-persons-protection",
|
|
345
|
+
"displayName": "HR Persons Protection"
|
|
346
|
+
},
|
|
347
|
+
"spec": {
|
|
348
|
+
"enabled": true,
|
|
349
|
+
"datasourceKey": "hr-persons",
|
|
350
|
+
"mode": "replaceForSource",
|
|
351
|
+
"rules": [
|
|
352
|
+
{
|
|
353
|
+
"key": "hr-manager-department",
|
|
354
|
+
"when": {
|
|
355
|
+
"groups": {
|
|
356
|
+
"requireAny": ["Manager"]
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
"principal": {
|
|
360
|
+
"type": "user",
|
|
361
|
+
"field": "metadata.managerEmail"
|
|
362
|
+
},
|
|
363
|
+
"grants": [
|
|
364
|
+
{
|
|
365
|
+
"dimensionKey": "department",
|
|
366
|
+
"valueExpression": "{{metadata.departmentCode}}"
|
|
367
|
+
}
|
|
368
|
+
]
|
|
369
|
+
}
|
|
370
|
+
]
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
]
|
|
374
|
+
}
|