@aifabrix/builder 2.42.1 → 2.44.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/anchor-docs.mdc +15 -0
- package/README.md +2 -2
- package/anchor-docs/README.md +10 -0
- package/anchor-docs/_TEMPLATE +24 -0
- package/bin/aifabrix.js +13 -4
- package/integration/hubspot-test/README.md +157 -0
- package/integration/{hubspot → hubspot-test}/application.json +6 -6
- package/integration/{hubspot → hubspot-test}/create-hubspot.js +10 -10
- package/integration/hubspot-test/env.template +4 -0
- package/integration/hubspot-test/hubspot-test-datasource-company.json +138 -0
- package/integration/hubspot-test/hubspot-test-datasource-contact.json +146 -0
- package/integration/hubspot-test/hubspot-test-datasource-deal.json +146 -0
- package/integration/hubspot-test/hubspot-test-datasource-users.json +76 -0
- package/integration/{hubspot/hubspot-deploy.json → hubspot-test/hubspot-test-deploy.json} +201 -24
- package/integration/{hubspot/hubspot-system.json → hubspot-test/hubspot-test-system.json} +8 -7
- package/integration/hubspot-test/rbac.json +166 -0
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-hubspot-credential-real.yaml +3 -3
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-hubspot-env-vars.yaml +2 -2
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-add-datasource.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-credential-create.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-credential-select.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-known-platform.yaml +1 -1
- package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-source.yaml +2 -0
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-mode.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-openapi-file.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-openapi-url.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-source.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-dimension-array-test.yaml +1 -1
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-key-test.yaml +5 -0
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-path-test.yaml +5 -0
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-dimension-test.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-rbac-test.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-rbac-yaml-test.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-dataplane-down-tests.js +1 -7
- package/integration/{hubspot → hubspot-test}/test-dataplane-down.js +3 -3
- package/integration/{hubspot → hubspot-test}/test.js +137 -102
- package/integration/{hubspot → hubspot-test}/wizard-hubspot-e2e.yaml +2 -2
- package/integration/{hubspot → hubspot-test}/wizard-hubspot-platform.yaml +1 -1
- package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +23 -0
- package/integration/roundtrip-test-local/README.md +144 -0
- package/integration/roundtrip-test-local/application.yaml +13 -0
- package/integration/roundtrip-test-local/env.template +15 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +14 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +61 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +25 -0
- package/integration/roundtrip-test-local2/README.md +144 -0
- package/integration/roundtrip-test-local2/application.yaml +13 -0
- package/integration/roundtrip-test-local2/env.template +15 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +31 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +86 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +25 -0
- package/integration/test/wizard.yaml +8 -0
- package/jest.config.default.js +10 -0
- package/jest.config.integration.fixtures.js +22 -0
- package/jest.config.integration.js +21 -18
- package/jest.config.isolated.js +10 -0
- package/jest.projects.js +288 -0
- package/lib/api/datasources-core.api.js +3 -3
- package/lib/api/dev-mtls-request.js +110 -0
- package/lib/api/dev-server-https.js +145 -0
- package/lib/api/dev.api.js +133 -144
- package/lib/api/index.js +0 -1
- package/lib/api/pipeline.api.js +67 -20
- package/lib/api/service-users.api.js +111 -2
- package/lib/api/types/dev.types.js +4 -3
- package/lib/api/types/pipeline.types.js +8 -5
- package/lib/api/types/service-users.types.js +41 -0
- package/lib/api/types/validation-run.types.js +56 -0
- package/lib/api/validation-run.api.js +99 -0
- package/lib/api/validation-runner.js +99 -0
- package/lib/app/config.js +1 -1
- package/lib/app/deploy-status-display.js +2 -2
- package/lib/app/deploy.js +7 -6
- package/lib/app/display.js +2 -1
- package/lib/app/dockerfile.js +3 -2
- package/lib/app/down.js +2 -1
- package/lib/app/helpers.js +6 -5
- package/lib/app/index.js +27 -8
- package/lib/app/list.js +7 -6
- package/lib/app/push.js +4 -3
- package/lib/app/register.js +19 -8
- package/lib/app/rotate-secret.js +17 -13
- package/lib/app/run-container-start.js +184 -0
- package/lib/app/run-docker-fallback.js +108 -0
- package/lib/app/run-env-compose.js +30 -42
- package/lib/app/run-helpers.js +49 -126
- package/lib/app/run-infra-requirements.js +30 -0
- package/lib/app/run-resolve-image.js +21 -0
- package/lib/app/run.js +74 -21
- package/lib/app/show-display.js +1 -1
- package/lib/app/show.js +1 -1
- package/lib/build/index.js +13 -10
- package/lib/cli/index.js +2 -0
- package/lib/cli/setup-app.help.js +67 -0
- package/lib/cli/setup-app.js +59 -123
- package/lib/cli/setup-app.test-commands.js +179 -0
- package/lib/cli/setup-auth.js +36 -14
- package/lib/cli/setup-credential-deployment.js +22 -8
- package/lib/cli/setup-dev-path-commands.js +124 -0
- package/lib/cli/setup-dev.js +190 -103
- package/lib/cli/setup-environment.js +11 -20
- package/lib/cli/setup-external-system.js +62 -22
- package/lib/cli/setup-infra.js +139 -47
- package/lib/cli/setup-parameters.js +32 -0
- package/lib/cli/setup-secrets.js +147 -10
- package/lib/cli/setup-service-user.js +146 -20
- package/lib/cli/setup-utility.js +47 -19
- package/lib/commands/app-down.js +5 -7
- package/lib/commands/app-install.js +14 -7
- package/lib/commands/app-logs.js +13 -10
- package/lib/commands/app-shell.js +4 -1
- package/lib/commands/app-test.js +25 -19
- package/lib/commands/app.js +22 -10
- package/lib/commands/auth-config.js +10 -14
- package/lib/commands/auth-status.js +4 -3
- package/lib/commands/credential-env.js +4 -3
- package/lib/commands/credential-list.js +5 -4
- package/lib/commands/credential-push.js +4 -3
- package/lib/commands/datasource-unified-test-cli.js +495 -0
- package/lib/commands/datasource-unified-test-cli.options.js +149 -0
- package/lib/commands/datasource-validation-cli.js +129 -0
- package/lib/commands/datasource.js +123 -71
- package/lib/commands/deployment-list.js +6 -5
- package/lib/commands/dev-cli-handlers.js +122 -18
- package/lib/commands/dev-down.js +4 -3
- package/lib/commands/dev-init.js +231 -116
- package/lib/commands/dev-show-display.js +473 -0
- package/lib/commands/login-credentials.js +3 -2
- package/lib/commands/login-device.js +4 -3
- package/lib/commands/login.js +5 -4
- package/lib/commands/logout.js +8 -7
- package/lib/commands/parameters-validate.js +54 -0
- package/lib/commands/repair-datasource.js +314 -68
- package/lib/commands/repair-env-template.js +16 -10
- package/lib/commands/repair-rbac.js +25 -19
- package/lib/commands/repair.js +116 -32
- package/lib/commands/secrets-list.js +23 -12
- package/lib/commands/secrets-remove-all.js +220 -0
- package/lib/commands/secrets-remove.js +22 -13
- package/lib/commands/secrets-set.js +21 -12
- package/lib/commands/secrets-validate.js +20 -7
- package/lib/commands/secure.js +10 -9
- package/lib/commands/service-user.js +243 -13
- package/lib/commands/test-e2e-external.js +27 -1
- package/lib/commands/up-common.js +28 -2
- package/lib/commands/up-dataplane.js +31 -18
- package/lib/commands/up-miso.js +19 -29
- package/lib/commands/upload.js +138 -39
- package/lib/commands/wizard-core-helpers.js +1 -1
- package/lib/commands/wizard-dataplane.js +4 -3
- package/lib/commands/wizard-helpers.js +3 -3
- package/lib/commands/wizard.js +2 -2
- package/lib/core/admin-secrets.js +16 -5
- package/lib/core/audit-logger.js +12 -4
- package/lib/core/config-attach-extensions.js +46 -0
- package/lib/core/config-runtime-paths.js +29 -0
- package/lib/core/config.js +59 -58
- package/lib/core/diff.js +3 -2
- package/lib/core/ensure-encryption-key.js +2 -4
- package/lib/core/secrets-ensure-infra.js +77 -0
- package/lib/core/secrets-ensure.js +120 -64
- package/lib/core/secrets-env-write.js +35 -7
- package/lib/core/secrets-infra-placeholder-sync.js +61 -0
- package/lib/core/secrets.js +228 -42
- package/lib/core/templates-env.js +4 -3
- package/lib/core/templates.js +1 -1
- package/lib/datasource/abac-validator.js +148 -0
- package/lib/datasource/deploy.js +75 -53
- package/lib/datasource/field-reference-validator.js +77 -36
- package/lib/datasource/integration-context.js +63 -0
- package/lib/datasource/list.js +8 -7
- package/lib/datasource/log-viewer.js +252 -0
- package/lib/datasource/resolve-app.js +109 -0
- package/lib/datasource/test-e2e.js +95 -155
- package/lib/datasource/test-integration.js +121 -109
- package/lib/datasource/unified-validation-run-body.js +65 -0
- package/lib/datasource/unified-validation-run-post.js +23 -0
- package/lib/datasource/unified-validation-run-resolve.js +43 -0
- package/lib/datasource/unified-validation-run.js +92 -0
- package/lib/datasource/validate.js +162 -15
- package/lib/deployment/deployer.js +4 -3
- package/lib/deployment/environment.js +7 -6
- package/lib/deployment/push.js +17 -8
- package/lib/external-system/delete.js +4 -3
- package/lib/external-system/deploy.js +131 -53
- package/lib/external-system/download-helpers.js +1 -1
- package/lib/external-system/download.js +7 -6
- package/lib/external-system/generator.js +104 -14
- package/lib/external-system/integration-test-dispatch.js +26 -0
- package/lib/external-system/test-execution.js +5 -1
- package/lib/external-system/test-helpers.js +0 -4
- package/lib/external-system/test-system-level-helpers.js +110 -0
- package/lib/external-system/test-system-level.js +83 -44
- package/lib/external-system/test.js +59 -8
- package/lib/generator/builders.js +23 -11
- package/lib/generator/deploy-manifest-azure-kv.js +81 -0
- package/lib/generator/external-controller-manifest.js +3 -3
- package/lib/generator/external.js +23 -11
- package/lib/generator/helpers.js +71 -12
- package/lib/generator/index.js +8 -4
- package/lib/generator/split-readme.js +12 -7
- package/lib/generator/split-variables.js +2 -1
- package/lib/generator/split.js +46 -11
- package/lib/generator/wizard-readme.js +3 -3
- package/lib/generator/wizard.js +16 -13
- package/lib/infrastructure/compose.js +60 -6
- package/lib/infrastructure/helpers.js +238 -51
- package/lib/infrastructure/index.js +64 -37
- package/lib/infrastructure/services.js +21 -15
- package/lib/internal/fs-real-sync.js +104 -0
- package/lib/internal/node-fs.js +98 -0
- package/lib/parameters/database-secret-values.js +173 -0
- package/lib/parameters/infra-kv-discovery.js +121 -0
- package/lib/parameters/infra-parameter-catalog.js +458 -0
- package/lib/parameters/infra-parameter-validate.js +64 -0
- package/lib/schema/application-schema.json +37 -17
- package/lib/schema/datasource-test-run.schema.json +493 -0
- package/lib/schema/deployment-rules.yaml +102 -63
- package/lib/schema/external-datasource.schema.json +1201 -433
- package/lib/schema/external-system.schema.json +181 -5
- package/lib/schema/flag-map-validation-run.json +31 -0
- package/lib/schema/infra-parameter.schema.json +106 -0
- package/lib/schema/infra.parameter.yaml +421 -0
- package/lib/schema/type/credential-auth-templates.json +40 -0
- package/lib/schema/type/document-storage.json +213 -0
- package/lib/schema/type/message-service.json +123 -0
- package/lib/schema/type/vector-store.json +88 -0
- package/lib/utils/aifabrix-runtime-config-dir.js +132 -0
- package/lib/utils/api-error-handler.js +2 -2
- package/lib/utils/api.js +49 -14
- package/lib/utils/app-config-resolver.js +23 -1
- package/lib/utils/app-register-api.js +3 -2
- package/lib/utils/app-register-auth.js +1 -1
- package/lib/utils/app-register-config.js +4 -4
- package/lib/utils/app-register-display.js +3 -2
- package/lib/utils/app-register-validator.js +3 -2
- package/lib/utils/app-run-containers.js +26 -22
- package/lib/utils/app-scoped-config.js +31 -0
- package/lib/utils/app-service-env-from-builder.js +164 -0
- package/lib/utils/build-copy.js +1 -1
- package/lib/utils/build-helpers.js +20 -20
- package/lib/utils/build-resolve-image.js +165 -0
- package/lib/utils/cli-layout-chalk.js +8 -0
- package/lib/utils/cli-test-layout-chalk.js +267 -0
- package/lib/utils/cli-utils.js +88 -11
- package/lib/utils/compose-db-passwords.js +138 -0
- package/lib/utils/compose-generate-docker-compose.js +216 -0
- package/lib/utils/compose-generator.js +197 -291
- package/lib/utils/compose-miso-env.js +18 -0
- package/lib/utils/compose-traefik-ingress-base.js +158 -0
- package/lib/utils/config-paths.js +209 -6
- package/lib/utils/config-scoped-resources-preference.js +41 -0
- package/lib/utils/controller-deployment-outcome.js +68 -0
- package/lib/utils/credential-display.js +2 -2
- package/lib/utils/credential-secrets-env.js +16 -1
- package/lib/utils/dataplane-pipeline-warning.js +4 -3
- package/lib/utils/datasource-test-run-capability-scope.js +43 -0
- package/lib/utils/datasource-test-run-debug-display.js +137 -0
- package/lib/utils/datasource-test-run-debug-slice.js +93 -0
- package/lib/utils/datasource-test-run-display.js +442 -0
- package/lib/utils/datasource-test-run-exit.js +58 -0
- package/lib/utils/datasource-test-run-legacy-adapter.js +93 -0
- package/lib/utils/datasource-test-run-report-version.js +51 -0
- package/lib/utils/datasource-test-run-schema-sync.js +59 -0
- package/lib/utils/datasource-test-run-tty-log.js +81 -0
- package/lib/utils/datasource-validation-watch.js +266 -0
- package/lib/utils/declarative-url-ports.js +47 -0
- package/lib/utils/derive-env-key-from-client-id.js +41 -0
- package/lib/utils/dev-ca-install.js +185 -23
- package/lib/utils/dev-cert-helper.js +266 -17
- package/lib/utils/dev-hosts-helper.js +307 -0
- package/lib/utils/dev-init-cert-hints.js +37 -0
- package/lib/utils/dev-init-health-messages.js +52 -0
- package/lib/utils/dev-init-resolve.js +86 -0
- package/lib/utils/dev-init-ssh-merge.js +65 -0
- package/lib/utils/dev-ssh-config-helper.js +196 -0
- package/lib/utils/dev-user-groups.js +93 -0
- package/lib/utils/docker-build.js +42 -17
- package/lib/utils/docker-exec.js +28 -0
- package/lib/utils/docker-manifest-public-port.js +116 -0
- package/lib/utils/docker-not-running-hint.js +52 -0
- package/lib/utils/docker.js +98 -11
- package/lib/utils/ensure-dev-certs-for-remote-docker.js +192 -0
- package/lib/utils/env-config-loader.js +10 -91
- package/lib/utils/env-copy.js +19 -10
- package/lib/utils/env-map.js +42 -11
- package/lib/utils/env-template.js +2 -2
- package/lib/utils/environment-scoped-resources.js +144 -0
- package/lib/utils/error-formatter.js +125 -9
- package/lib/utils/error-formatters/http-status-errors.js +6 -5
- package/lib/utils/error-formatters/network-errors.js +2 -1
- package/lib/utils/error-formatters/permission-errors.js +2 -1
- package/lib/utils/error-formatters/validation-errors.js +2 -1
- package/lib/utils/external-env-template.js +180 -0
- package/lib/utils/external-readme.js +8 -1
- package/lib/utils/external-system-display.js +277 -136
- package/lib/utils/external-system-local-test-tty.js +389 -0
- package/lib/utils/external-system-readiness-core.js +377 -0
- package/lib/utils/external-system-readiness-deploy-display.js +270 -0
- package/lib/utils/external-system-readiness-display-internals.js +150 -0
- package/lib/utils/external-system-readiness-display.js +186 -0
- package/lib/utils/external-system-test-helpers.js +24 -6
- package/lib/utils/external-system-validators.js +32 -14
- package/lib/utils/health-check-url.js +119 -0
- package/lib/utils/health-check.js +59 -25
- package/lib/utils/help-builder.js +14 -13
- package/lib/utils/image-version.js +4 -8
- package/lib/utils/infra-containers.js +4 -7
- package/lib/utils/infra-env-defaults.js +162 -0
- package/lib/utils/infra-status-display.js +167 -0
- package/lib/utils/infra-status.js +16 -8
- package/lib/utils/local-secrets.js +29 -7
- package/lib/utils/paths.js +136 -48
- package/lib/utils/port-resolver.js +10 -23
- package/lib/utils/redis-env-scope.js +62 -0
- package/lib/utils/register-aifabrix-shell-env.js +204 -0
- package/lib/utils/remote-builder-validation.js +99 -0
- package/lib/utils/remote-dev-auth.js +117 -21
- package/lib/utils/remote-docker-env.js +67 -15
- package/lib/utils/remote-secrets-loader.js +13 -4
- package/lib/utils/resolve-docker-image-ref.js +124 -0
- package/lib/utils/schema-loader.js +22 -9
- package/lib/utils/secrets-bash-kv.js +25 -0
- package/lib/utils/secrets-generator.js +171 -51
- package/lib/utils/secrets-helpers.js +70 -59
- package/lib/utils/secrets-kv-scope.js +60 -0
- package/lib/utils/secrets-utils.js +35 -37
- package/lib/utils/secrets-validation.js +3 -1
- package/lib/utils/secrets-yaml-preserve.js +109 -0
- package/lib/utils/secure-file-permissions.js +91 -0
- package/lib/utils/ssh-key-helper.js +4 -2
- package/lib/utils/template-helpers.js +2 -2
- package/lib/utils/test-log-writer.js +3 -3
- package/lib/utils/token-manager.js +37 -5
- package/lib/utils/url-declarative-public-base.js +188 -0
- package/lib/utils/url-declarative-resolve-build.js +493 -0
- package/lib/utils/url-declarative-resolve-load-doc.js +51 -0
- package/lib/utils/url-declarative-resolve.js +220 -0
- package/lib/utils/url-declarative-token-parse.js +74 -0
- package/lib/utils/url-declarative-url-flags.js +50 -0
- package/lib/utils/url-declarative-vdir-inactive-env.js +99 -0
- package/lib/utils/url-public-path-prefix.js +34 -0
- package/lib/utils/urls-local-registry.js +220 -0
- package/lib/utils/validation-report-tty-kit.js +77 -0
- package/lib/utils/validation-run-poll.js +89 -0
- package/lib/utils/validation-run-post-retry.js +73 -0
- package/lib/utils/validation-run-request.js +98 -0
- package/lib/utils/variable-transformer.js +21 -4
- package/lib/utils/yaml-preserve.js +78 -1
- package/lib/validation/datasource-warnings.js +56 -0
- package/lib/validation/env-template-auth.js +50 -2
- package/lib/validation/external-manifest-validator.js +35 -7
- package/lib/validation/validate-display.js +37 -31
- package/lib/validation/validate.js +9 -10
- package/lib/validation/validator-unresolved-placeholders.js +98 -0
- package/lib/validation/validator.js +32 -78
- package/lib/validation/wizard-config-validator.js +2 -1
- package/package.json +11 -3
- package/scripts/check-datasource-test-run-schema-sync.js +34 -0
- package/scripts/diagnose-cli.js +150 -0
- package/scripts/install-local.js +304 -55
- package/templates/README.md +15 -2
- package/templates/applications/dataplane/application.yaml +52 -2
- package/templates/applications/dataplane/env.template +80 -18
- package/templates/applications/dataplane/rbac.yaml +8 -0
- package/templates/applications/keycloak/application.yaml +9 -1
- package/templates/applications/keycloak/env.template +15 -6
- package/templates/applications/miso-controller/application.yaml +10 -2
- package/templates/applications/miso-controller/env.template +55 -14
- package/templates/applications/miso-controller/rbac.yaml +5 -0
- package/templates/external-system/README.md.hbs +20 -7
- package/templates/external-system/deploy.js.hbs +5 -5
- package/templates/external-system/env.template.hbs +22 -0
- package/templates/external-system/external-datasource.yaml.hbs +197 -118
- package/templates/infra/compose.yaml.hbs +20 -4
- package/templates/python/docker-compose.hbs +16 -0
- package/templates/typescript/docker-compose.hbs +16 -0
- package/integration/hubspot/README.md +0 -102
- package/integration/hubspot/env.template +0 -4
- package/integration/hubspot/hubspot-datasource-company.json +0 -541
- package/integration/hubspot/hubspot-datasource-contact.json +0 -639
- package/integration/hubspot/hubspot-datasource-deal.json +0 -588
- package/integration/hubspot/hubspot-datasource-users.json +0 -116
- package/integration/hubspot/test-artifacts/wizard-invalid-missing-source.yaml +0 -2
- package/integration/hubspot/test-artifacts/wizard-valid-for-dimension-key-test.yaml +0 -5
- package/integration/hubspot/test-artifacts/wizard-valid-for-dimension-path-test.yaml +0 -5
- package/lib/api/external-test.api.js +0 -111
- package/lib/schema/env-config.yaml +0 -43
- /package/integration/{hubspot → hubspot-test}/companies.json +0 -0
- /package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-app-name.yaml +0 -0
- /package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-missing-app.yaml +0 -0
- /package/integration/{hubspot → hubspot-test}/test-dataplane-down-helpers.js +0 -0
|
@@ -5,7 +5,7 @@ app:
|
|
|
5
5
|
description: "AI Fabrix Dataplane is a secure, in-tenant integration and automation layer that supplies governed, normalized, and explainable enterprise data to AI agents. Using CIP as a declarative standard, it enforces RBAC and ABAC, executes integrations, and exposes trusted data via MCP and OpenAPI."
|
|
6
6
|
type: webapp
|
|
7
7
|
language: python # Explicitly specify Python language
|
|
8
|
-
version: 1.
|
|
8
|
+
version: 1.9.5
|
|
9
9
|
|
|
10
10
|
# Image Configuration
|
|
11
11
|
# Set tag to match your build (e.g. aifabrix build dataplane -t v1.0.0 then tag: v1.0.0)
|
|
@@ -18,6 +18,16 @@ image:
|
|
|
18
18
|
|
|
19
19
|
# Port Configuration
|
|
20
20
|
port: 3001
|
|
21
|
+
environmentScopedResources: true
|
|
22
|
+
|
|
23
|
+
# Public path behind Azure Front Door / reverse proxy (used by url://public and urls.local.yaml).
|
|
24
|
+
# Traefik: host is expanded from developer-id + remote-server (hostname of `remote-server` in ~/.aifabrix/config.yaml).
|
|
25
|
+
# Path uses pattern below plus optional /dev|/tst prefix when env-scoped resources are effective (plan 117).
|
|
26
|
+
frontDoorRouting:
|
|
27
|
+
pattern: /data/*
|
|
28
|
+
enabled: true
|
|
29
|
+
host: ${DEV_USERNAME}.${REMOTE_HOST}
|
|
30
|
+
tls: ${TLS_ENABLED}
|
|
21
31
|
|
|
22
32
|
# Azure Requirements
|
|
23
33
|
requires:
|
|
@@ -51,7 +61,6 @@ build:
|
|
|
51
61
|
context: ../.. # Docker build context (relative to builder/dataplane/)
|
|
52
62
|
dockerfile: builder/dataplane/Dockerfile # Dockerfile path (relative to project root)
|
|
53
63
|
envOutputPath: ../../.env # Copy to repo root for local dev
|
|
54
|
-
localPort: 3011 # Port for local development (different from Docker port)
|
|
55
64
|
language: python # Runtime language for template selection (typescript or python)
|
|
56
65
|
reloadStart: uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-3001} --reload # PORT set from port above at run time; default 3001 must match port
|
|
57
66
|
|
|
@@ -98,6 +107,47 @@ configuration:
|
|
|
98
107
|
- detailed
|
|
99
108
|
- explain
|
|
100
109
|
|
|
110
|
+
- name: TRUST_CUSTOMER_POLICY_LEVEL
|
|
111
|
+
portalInput:
|
|
112
|
+
field: select
|
|
113
|
+
label: "Trust policy level (no-policy defaults)"
|
|
114
|
+
options:
|
|
115
|
+
- strict
|
|
116
|
+
- standard
|
|
117
|
+
- relaxed
|
|
118
|
+
|
|
119
|
+
- name: TRUST_PUBLISH_GATE_ENABLED
|
|
120
|
+
portalInput:
|
|
121
|
+
field: select
|
|
122
|
+
label: "Enforce trust gate on datasource publish"
|
|
123
|
+
options:
|
|
124
|
+
- "false"
|
|
125
|
+
- "true"
|
|
126
|
+
|
|
127
|
+
- name: TRUST_PROMOTE_GATE_ENABLED
|
|
128
|
+
portalInput:
|
|
129
|
+
field: select
|
|
130
|
+
label: "Enforce trust gate on external system publish (promote scope)"
|
|
131
|
+
options:
|
|
132
|
+
- "false"
|
|
133
|
+
- "true"
|
|
134
|
+
|
|
135
|
+
- name: TRUST_RUNTIME_GATE_ENABLED
|
|
136
|
+
portalInput:
|
|
137
|
+
field: select
|
|
138
|
+
label: "Enforce trust gate on CIP execution (runtime scope)"
|
|
139
|
+
options:
|
|
140
|
+
- "false"
|
|
141
|
+
- "true"
|
|
142
|
+
|
|
143
|
+
- name: TRUST_AI_EXPOSURE_GATE_ENABLED
|
|
144
|
+
portalInput:
|
|
145
|
+
field: select
|
|
146
|
+
label: "Enforce trust gate on AI document-storage prompt generation"
|
|
147
|
+
options:
|
|
148
|
+
- "false"
|
|
149
|
+
- "true"
|
|
150
|
+
|
|
101
151
|
# -------------------------------------------------------------------------
|
|
102
152
|
# CIP Execution - Resource Limits
|
|
103
153
|
# -------------------------------------------------------------------------
|
|
@@ -24,21 +24,23 @@ LOG_FILE_PATH=/mnt/data/logs/app.log
|
|
|
24
24
|
LOCAL_MODE=false
|
|
25
25
|
|
|
26
26
|
# When API_KEY is set, a matching Bearer token bypasses OAuth2 validation
|
|
27
|
-
|
|
27
|
+
# Same kv:// as miso-controller API_KEY so pipeline Bearer bypass uses one secrets.local entry
|
|
28
|
+
API_KEY=kv://miso-controller-secrets-apiKeyVault
|
|
28
29
|
|
|
29
30
|
# API Configuration
|
|
30
31
|
API_V1_STR=/api/v1
|
|
31
|
-
VERSION=1.
|
|
32
|
+
VERSION=1.9.5
|
|
32
33
|
# Base URL for the dataplane web server (used for default OAuth2 callback URL when redirectUri is omitted)
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
# url:// resolves after kv://; includes front-door path from application.yaml (e.g. /data)
|
|
35
|
+
DATAPLANE_WEB_SERVER_URL=url://public
|
|
36
|
+
DATAPLANE_INTERNAL_URL=url://internal
|
|
35
37
|
|
|
36
38
|
# CORS Configuration
|
|
37
|
-
ALLOWED_ORIGINS=http://localhost
|
|
39
|
+
ALLOWED_ORIGINS=http://localhost:*,url://host-public,url://host-private
|
|
38
40
|
IDE_CORS_ORIGINS=
|
|
39
41
|
|
|
40
42
|
# Encryption Configuration
|
|
41
|
-
ENCRYPTION_KEY=kv://secrets-encryptionKeyVault
|
|
43
|
+
ENCRYPTION_KEY=kv://miso-controller-secrets-encryptionKeyVault
|
|
42
44
|
|
|
43
45
|
# =============================================================================
|
|
44
46
|
# DATABASE CONFIGURATION
|
|
@@ -54,10 +56,14 @@ DATABASE_URL=kv://databases-dataplane-0-urlKeyVault
|
|
|
54
56
|
DB_0_PASSWORD=kv://databases-dataplane-0-passwordKeyVault
|
|
55
57
|
|
|
56
58
|
# Vector and document store DB: chunks, embeddings, vector indexes (pgvector).
|
|
57
|
-
# Binaries path: config.processing.fileStoragePath or /data/documents.
|
|
58
59
|
VECTOR_DATABASE_URL=kv://databases-dataplane-1-urlKeyVault
|
|
59
60
|
DB_1_PASSWORD=kv://databases-dataplane-1-passwordKeyVault
|
|
60
61
|
|
|
62
|
+
# Base path for document binary storage (used when datasource config has no processing.fileStoragePath).
|
|
63
|
+
# Dataplane creates subdirs per datasource key (e.g. DOCUMENT_STORAGE_BASE_PATH/test-e2e-sharepoint-documents).
|
|
64
|
+
# Production: use a writable path (e.g. /data/documents) and mount a volume. Local/Docker: use /tmp/documents or /app/data/documents.
|
|
65
|
+
DOCUMENT_STORAGE_BASE_PATH=/mnt/data/documents
|
|
66
|
+
|
|
61
67
|
# Logs Database Configuration (for execution, audit, ABAC traces)
|
|
62
68
|
LOGS_DATABASE_URL=kv://databases-dataplane-2-urlKeyVault
|
|
63
69
|
DB_2_PASSWORD=kv://databases-dataplane-2-passwordKeyVault
|
|
@@ -84,6 +90,14 @@ CACHE_CIP_EXECUTION_TTL=1800
|
|
|
84
90
|
# TTL in seconds for metadata filter cache
|
|
85
91
|
CACHE_METADATA_FILTER_TTL=3600
|
|
86
92
|
|
|
93
|
+
# ABAC policy parse cache (in-memory)
|
|
94
|
+
# Caches parsed PolicyLibrary.rules (Pydantic) by (policyKey, updatedAt)
|
|
95
|
+
ABAC_POLICY_PARSE_CACHE_ENABLED=true
|
|
96
|
+
# TTL in seconds for parsed policy entries
|
|
97
|
+
ABAC_POLICY_PARSE_CACHE_TTL_SECONDS=300
|
|
98
|
+
# Max entries before eviction (clears cache at capacity)
|
|
99
|
+
ABAC_POLICY_PARSE_CACHE_MAX_ENTRIES=2048
|
|
100
|
+
|
|
87
101
|
# =============================================================================
|
|
88
102
|
# AUTHENTICATION CONFIGURATION
|
|
89
103
|
# =============================================================================
|
|
@@ -93,22 +107,22 @@ MISO_CLIENTID=kv://dataplane-client-idKeyVault
|
|
|
93
107
|
MISO_CLIENTSECRET=kv://dataplane-client-secretKeyVault
|
|
94
108
|
|
|
95
109
|
# Keycloak Configuration (for OAuth2 endpoints)
|
|
96
|
-
# Public:
|
|
97
|
-
KEYCLOAK_SERVER_URL=
|
|
98
|
-
# Internal
|
|
99
|
-
KEYCLOAK_INTERNAL_SERVER_URL=
|
|
110
|
+
# Public: browser / issuer (includes /auth when Keycloak uses KC_HTTP_RELATIVE_PATH=/auth).
|
|
111
|
+
KEYCLOAK_SERVER_URL=url://keycloak-public
|
|
112
|
+
# Internal: server-to-Keycloak HTTP (docker: service:port + /auth from keycloak application.yaml)
|
|
113
|
+
KEYCLOAK_INTERNAL_SERVER_URL=url://keycloak-internal
|
|
100
114
|
KEYCLOAK_REALM=aifabrix
|
|
101
115
|
|
|
102
116
|
# =============================================================================
|
|
103
117
|
# MISO CONTROLLER CONFIGURATION
|
|
104
118
|
# =============================================================================
|
|
105
|
-
# Public: browser redirects and CORS
|
|
106
|
-
MISO_WEB_SERVER_URL=
|
|
107
|
-
# Internal: server-to-controller API calls (
|
|
108
|
-
MISO_CONTROLLER_URL=
|
|
119
|
+
# Public: browser redirects and CORS (includes /controller front-door path from miso-controller application.yaml).
|
|
120
|
+
MISO_WEB_SERVER_URL=url://miso-controller-public
|
|
121
|
+
# Internal: server-to-controller API calls (Docker: service:port; local: host:port — no front-door path).
|
|
122
|
+
MISO_CONTROLLER_URL=url://miso-controller-internal
|
|
109
123
|
|
|
110
|
-
#
|
|
111
|
-
# Set MISO_PIPELINE_ENV_KEY=dev when controller uses dev (e.g. MISO_CLIENTID=miso-controller-dev-dataplane).
|
|
124
|
+
# Environment key sent to miso-controller (e.g. environmentKey on RBAC/register) when not supplied in the payload.
|
|
125
|
+
# Set MISO_PIPELINE_ENV_KEY=dev when the controller installation uses dev (e.g. MISO_CLIENTID=miso-controller-dev-dataplane).
|
|
112
126
|
# If unset, derived from MISO_CLIENTID (e.g. dev from miso-controller-dev-dataplane).
|
|
113
127
|
MISO_PIPELINE_ENV_KEY=
|
|
114
128
|
|
|
@@ -120,7 +134,7 @@ MISO_PIPELINE_ENV_KEY=
|
|
|
120
134
|
OPENAI_API_KEY=kv://secrets-openaiApiKeyVault
|
|
121
135
|
|
|
122
136
|
# Azure OpenAI Configuration
|
|
123
|
-
AZURE_OPENAI_ENDPOINT=
|
|
137
|
+
AZURE_OPENAI_ENDPOINT=kv://azure-openaiapi-urlKeyVault
|
|
124
138
|
AZURE_OPENAI_API_KEY=kv://secrets-azureOpenaiApiKeyVault
|
|
125
139
|
AZURE_OPENAI_API_VERSION=2024-02-15-preview
|
|
126
140
|
AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o
|
|
@@ -147,6 +161,10 @@ RBAC_AUDIT_ENABLED=true
|
|
|
147
161
|
RBAC_AUDIT_DETAIL_LEVEL=summary
|
|
148
162
|
RBAC_EXPLAIN_MODE_ENABLED=false
|
|
149
163
|
|
|
164
|
+
# Async audit: after sync CIP writes, rebuild AuditEvent and enqueue; worker
|
|
165
|
+
# validates only (no second DB write). Default false.
|
|
166
|
+
AUDIT_ASYNC_SHADOW_ENQUEUE=false
|
|
167
|
+
|
|
150
168
|
# =============================================================================
|
|
151
169
|
# OBSERVABILITY CONFIGURATION
|
|
152
170
|
# =============================================================================
|
|
@@ -155,6 +173,18 @@ RBAC_EXPLAIN_MODE_ENABLED=false
|
|
|
155
173
|
OPENTELEMETRY_ENABLED=false
|
|
156
174
|
OPENTELEMETRY_ENDPOINT=
|
|
157
175
|
|
|
176
|
+
# =============================================================================
|
|
177
|
+
# INTEGRATION CERTIFICATE SIGNING (RS256 PEM)
|
|
178
|
+
# =============================================================================
|
|
179
|
+
# Read by PemRsaCertificateSigner.from_environment in app/validation/certificates/signer.py.
|
|
180
|
+
# When CERTIFICATE_PRIVATE_KEY and CERTIFICATE_PUBLIC_KEY are both set (non-empty PEM), the
|
|
181
|
+
# engine uses RS256; otherwise it falls back to local HS256 (see build_certificate_signer in engine).
|
|
182
|
+
# PEM values are often multi-line; resolve via secret store / deploy pipeline (kv://) or inject as env.
|
|
183
|
+
CERTIFICATE_PRIVATE_KEY=
|
|
184
|
+
CERTIFICATE_PUBLIC_KEY=
|
|
185
|
+
# Optional public key identifier for issued certificates; default if unset: dataplane-signing-key
|
|
186
|
+
CERTIFICATE_PUBLIC_KEY_ID=
|
|
187
|
+
|
|
158
188
|
# =============================================================================
|
|
159
189
|
# CIP EXECUTION CONFIGURATION
|
|
160
190
|
# =============================================================================
|
|
@@ -168,6 +198,10 @@ CIP_EXECUTION_MAX_RETRIES=3
|
|
|
168
198
|
CIP_EXECUTION_RETRY_BACKOFF_FACTOR=2.0
|
|
169
199
|
CIP_EXECUTION_RETRY_INITIAL_DELAY=1.0
|
|
170
200
|
|
|
201
|
+
# CIP performance instrumentation (off by default)
|
|
202
|
+
# When enabled, CipStepOrchestrator emits per-step timing aggregates in metrics.
|
|
203
|
+
CIP_STEP_TIMINGS_ENABLED=true
|
|
204
|
+
|
|
171
205
|
# Circuit Breaker Configuration
|
|
172
206
|
CIP_EXECUTION_CIRCUIT_BREAKER_FAILURE_THRESHOLD=5
|
|
173
207
|
CIP_EXECUTION_CIRCUIT_BREAKER_TIME_WINDOW=60
|
|
@@ -177,3 +211,31 @@ CIP_EXECUTION_CIRCUIT_BREAKER_HALF_OPEN_TIMEOUT=30
|
|
|
177
211
|
# Rate Limiting Configuration
|
|
178
212
|
CIP_EXECUTION_RATE_LIMIT_REQUESTS_PER_SECOND=10.0
|
|
179
213
|
CIP_EXECUTION_RATE_LIMIT_BURST_SIZE=20
|
|
214
|
+
|
|
215
|
+
# =============================================================================
|
|
216
|
+
# TRUST POLICY AND ENFORCEMENT GATES (optional)
|
|
217
|
+
# =============================================================================
|
|
218
|
+
# Policies resolve by deployment ENVIRONMENT (dev | tst | pro) and trust scope
|
|
219
|
+
# (publish | promote | runtime | aiExposure). When no registered policy matches,
|
|
220
|
+
# fallbacks use whenNoPolicyMatches[<level>] from configs/trust-policy-defaults.yaml;
|
|
221
|
+
# TRUST_CUSTOMER_POLICY_LEVEL picks that row and is orthogonal to ENVIRONMENT.
|
|
222
|
+
#
|
|
223
|
+
# Customer posture for no-match defaults (lowercase): strict | standard | relaxed
|
|
224
|
+
TRUST_CUSTOMER_POLICY_LEVEL=standard
|
|
225
|
+
#
|
|
226
|
+
# Opt-in gates (default false). When true, trust is evaluated at the call site;
|
|
227
|
+
# DENY/REVIEW can block the operation (e.g. datasource publish returns 403).
|
|
228
|
+
# Datasource publish — scope publish; runs before marking the datasource published
|
|
229
|
+
TRUST_PUBLISH_GATE_ENABLED=false
|
|
230
|
+
# External system publish — scope promote; evaluated per active datasource first
|
|
231
|
+
TRUST_PROMOTE_GATE_ENABLED=false
|
|
232
|
+
# CIP operation execution — scope runtime; evaluation uses live/runtime checks
|
|
233
|
+
TRUST_RUNTIME_GATE_ENABLED=false
|
|
234
|
+
# Document-storage AI system prompt generation — scope aiExposure; before LLM call
|
|
235
|
+
TRUST_AI_EXPOSURE_GATE_ENABLED=false
|
|
236
|
+
|
|
237
|
+
# Certification baseline (346.6 §12.1). Empty CERTIFICATION_DATASOURCE_SCHEMA_VERSION uses bundled
|
|
238
|
+
# app/schemas/json/external-datasource.schema.json metadata.version. Set CERTIFICATION_RULES_VERSION
|
|
239
|
+
# when 346.rules / §17 revisions must invalidate existing certificates without matching rulesVersion.
|
|
240
|
+
CERTIFICATION_DATASOURCE_SCHEMA_VERSION=
|
|
241
|
+
CERTIFICATION_RULES_VERSION=
|
|
@@ -184,6 +184,10 @@ permissions:
|
|
|
184
184
|
- name: "document-record:approve"
|
|
185
185
|
roles: ["aifabrix-platform-admin", "aifabrix-compliance-admin"]
|
|
186
186
|
description: "Approve document records"
|
|
187
|
+
|
|
188
|
+
- name: "document-record:triage-unowned"
|
|
189
|
+
roles: ["aifabrix-platform-admin", "aifabrix-compliance-admin"]
|
|
190
|
+
description: "Include unowned pending documents (createdBy null) in the pending validation queue"
|
|
187
191
|
|
|
188
192
|
# External record management
|
|
189
193
|
- name: "external-record:create"
|
|
@@ -250,6 +254,10 @@ permissions:
|
|
|
250
254
|
- name: "record-relation:create"
|
|
251
255
|
roles: ["aifabrix-platform-admin", "aifabrix-developer"]
|
|
252
256
|
description: "Create record relations"
|
|
257
|
+
|
|
258
|
+
- name: "record-relation:update"
|
|
259
|
+
roles: ["aifabrix-platform-admin", "aifabrix-developer"]
|
|
260
|
+
description: "Update mutable fields on record relations (direction, confidence, catalogId, createdBy)"
|
|
253
261
|
|
|
254
262
|
- name: "record-relation:read"
|
|
255
263
|
roles: ["aifabrix-platform-admin", "aifabrix-security-admin", "aifabrix-deployment-admin", "aifabrix-compliance-admin", "aifabrix-developer", "aifabrix-observer"]
|
|
@@ -16,6 +16,14 @@ image:
|
|
|
16
16
|
# Port Configuration (base for host; host port = 8082 + developer_id*100 from ~/.aifabrix/config.yaml)
|
|
17
17
|
port: 8082
|
|
18
18
|
|
|
19
|
+
# Public path behind Azure Front Door / reverse proxy (used by url://public and urls.local.yaml).
|
|
20
|
+
# Traefik: host is expanded from developer-id + remote-server (hostname of `remote-server` in ~/.aifabrix/config.yaml).
|
|
21
|
+
frontDoorRouting:
|
|
22
|
+
pattern: /auth/*
|
|
23
|
+
enabled: true
|
|
24
|
+
host: ${DEV_USERNAME}.${REMOTE_HOST}
|
|
25
|
+
tls: ${TLS_ENABLED}
|
|
26
|
+
|
|
19
27
|
# Azure Requirements
|
|
20
28
|
requires:
|
|
21
29
|
database: true
|
|
@@ -27,6 +35,7 @@ requires:
|
|
|
27
35
|
# Health Check
|
|
28
36
|
healthCheck:
|
|
29
37
|
path: /health/ready
|
|
38
|
+
bashProbe: true
|
|
30
39
|
interval: 30
|
|
31
40
|
probePath: /health/ready
|
|
32
41
|
probeRequestType: GET
|
|
@@ -41,6 +50,5 @@ authentication:
|
|
|
41
50
|
build:
|
|
42
51
|
context: .. # Docker build context (relative to builder/)
|
|
43
52
|
dockerfile: builder/Dockerfile # Dockerfile name (empty = use template)
|
|
44
|
-
localPort: 8082 # Port for local development (different from Docker port)
|
|
45
53
|
containerPort: 8080 # Container port (different from local port)
|
|
46
54
|
language: typescript # Runtime language for template selection
|
|
@@ -6,10 +6,14 @@
|
|
|
6
6
|
# APPLICATION ENVIRONMENT
|
|
7
7
|
# =============================================================================
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
KC_BOOTSTRAP_ADMIN_USERNAME=admin
|
|
10
|
+
KC_BOOTSTRAP_ADMIN_PASSWORD=kv://keycloak-admin-passwordKeyVault
|
|
11
11
|
KC_HOSTNAME_STRICT=false
|
|
12
|
-
KC_HTTP_ENABLED
|
|
12
|
+
KC_HTTP_ENABLED=${HTTP_ENABLED}
|
|
13
|
+
# When Traefik + frontDoorRouting.enabled are on, same vdir as url://public. If the front door is off, env generation
|
|
14
|
+
# rewrites url://vdir-public to "/" before expansion (empty path is invalid — Keycloak 26 SRCFG00040).
|
|
15
|
+
# Docker-only templates may use url://vdir-internal instead.
|
|
16
|
+
KC_HTTP_RELATIVE_PATH=url://vdir-public
|
|
13
17
|
|
|
14
18
|
# =============================================================================
|
|
15
19
|
# HOSTNAME / ISSUER (Docker vs localhost)
|
|
@@ -22,9 +26,14 @@ KC_HTTP_ENABLED=true
|
|
|
22
26
|
# - Server calls Keycloak at http://keycloak:8080 for token exchange and refresh
|
|
23
27
|
# - Controller sends Host: localhost:${KEYCLOAK_PUBLIC_PORT} so Keycloak validates issuer
|
|
24
28
|
# against public URL (requires KC_HOSTNAME_BACKCHANNEL_DYNAMIC=true)
|
|
25
|
-
# When KC_HOSTNAME_BACKCHANNEL_DYNAMIC=true, hostname must be a full URL
|
|
26
|
-
|
|
27
|
-
|
|
29
|
+
# When KC_HOSTNAME_BACKCHANNEL_DYNAMIC=true, hostname must be a full URL.
|
|
30
|
+
# Use host-only origin (no /auth); KC_HTTP_RELATIVE_PATH carries the front-door path (url://vdir-public).
|
|
31
|
+
# Hostname v2: port belongs in KC_HOSTNAME (url://host-public expands to e.g. http://localhost:8182 or
|
|
32
|
+
# https://devNN.example.com). Do not set KC_HOSTNAME_PORT (deprecated v1; triggers Quarkus warnings).
|
|
33
|
+
# KEYCLOAK_PUBLIC_PORT = application.yaml `port` (host-published) + dev×100; used by other apps / docs.
|
|
34
|
+
KC_HOSTNAME=url://host-public
|
|
35
|
+
# nginx / Traefik send X-Forwarded-*; required when using an edge proxy (Keycloak 26+).
|
|
36
|
+
KC_PROXY_HEADERS=xforwarded
|
|
28
37
|
# Required for Host header to work: Keycloak resolves backchannel URL from request headers
|
|
29
38
|
KC_HOSTNAME_BACKCHANNEL_DYNAMIC=true
|
|
30
39
|
|
|
@@ -4,17 +4,26 @@ app:
|
|
|
4
4
|
displayName: 'Miso Controller'
|
|
5
5
|
description: 'Miso is the AI Fabrix in-tenant controller and portal layer for securely operating enterprise AI apps inside a customer’s Azure tenant. It provides Entra ID SSO, RBAC, audit logs, environment/app configuration via schemas, and safe secret handling via Key Vault references—ensuring governance, traceability, and predictable UX across portal, SDK, and CLI.'
|
|
6
6
|
type: webapp
|
|
7
|
-
version: '1.
|
|
7
|
+
version: '1.9.5'
|
|
8
8
|
|
|
9
9
|
# Image Configuration
|
|
10
10
|
image:
|
|
11
11
|
name: aifabrix/miso-controller
|
|
12
|
+
tag: latest
|
|
12
13
|
registry: aifabrixdevacr.azurecr.io
|
|
13
14
|
registryMode: acr
|
|
14
15
|
|
|
15
16
|
# Port Configuration (container port; host port = 3000 + developer_id*100 from ~/.aifabrix/config.yaml)
|
|
16
17
|
port: 3000
|
|
17
18
|
|
|
19
|
+
# Public path behind Azure Front Door / reverse proxy (used by url://public and urls.local.yaml).
|
|
20
|
+
# Traefik: host is expanded from developer-id + remote-server (hostname of `remote-server` in ~/.aifabrix/config.yaml).
|
|
21
|
+
frontDoorRouting:
|
|
22
|
+
pattern: /miso/*
|
|
23
|
+
enabled: true
|
|
24
|
+
host: ${DEV_USERNAME}.${REMOTE_HOST}
|
|
25
|
+
tls: ${TLS_ENABLED}
|
|
26
|
+
|
|
18
27
|
# Azure Requirements
|
|
19
28
|
requires:
|
|
20
29
|
database: true
|
|
@@ -45,7 +54,6 @@ build:
|
|
|
45
54
|
context: ../.. # Docker build context (relative to builder/miso-controller/)
|
|
46
55
|
dockerfile: builder/miso-controller/Dockerfile # Dockerfile name (relative to project root)
|
|
47
56
|
envOutputPath: ../../packages/miso-controller/.env # Copy .env to repo root for local dev (relative to builder/) (if null, no .env file is copied) (if empty, .env file is copied to repo root)
|
|
48
|
-
localPort: 3010 # Port for local development (different from Docker port)
|
|
49
57
|
language: typescript # Runtime language for template selection (typescript or python)
|
|
50
58
|
reloadStart: pnpm run start:reload # When running with --reload
|
|
51
59
|
|
|
@@ -53,7 +53,7 @@ NODE_ENV=dev
|
|
|
53
53
|
PORT=${PORT}
|
|
54
54
|
AUTO_CREATE_TABLES=true
|
|
55
55
|
FAST_STARTUP=false
|
|
56
|
-
ALLOWED_ORIGINS=http://localhost
|
|
56
|
+
ALLOWED_ORIGINS=http://localhost:*,url://host-public,url://host-private,url://dataplane-host-public,url://dataplane-host-private
|
|
57
57
|
ENABLE_API_DOCS=true
|
|
58
58
|
|
|
59
59
|
# Rate Limiting Configuration (for local development)
|
|
@@ -109,9 +109,15 @@ REDIS_PERMISSIONS_TTL=900
|
|
|
109
109
|
# KEYCLOAK_SKIP_AZURE_ENTRA_SSO=false
|
|
110
110
|
|
|
111
111
|
KEYCLOAK_REALM=aifabrix
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
# Public issuer / browser URL (includes /auth when Keycloak uses KC_HTTP_RELATIVE_PATH=/auth).
|
|
113
|
+
KEYCLOAK_SERVER_URL=url://keycloak-public
|
|
114
|
+
# Internal token/JWKS calls: url://keycloak-internal (includes /auth when Keycloak uses KC_HTTP_RELATIVE_PATH).
|
|
115
|
+
KEYCLOAK_INTERNAL_SERVER_URL=url://keycloak-internal
|
|
116
|
+
# Docker/internal host and port: used when config from DB has localhost (getDockerKeycloakInternalUrl).
|
|
117
|
+
# Resolved from env-config (e.g. KEYCLOAK_HOST=keycloak, KEYCLOAK_PORT=8080 for docker).
|
|
118
|
+
KEYCLOAK_HOST=${KEYCLOAK_HOST}
|
|
119
|
+
KEYCLOAK_PORT=${KEYCLOAK_PORT}
|
|
120
|
+
KEYCLOAK_CLIENT_ID=kv://keycloak-client-idKeyVault
|
|
115
121
|
KEYCLOAK_CLIENT_SECRET=kv://keycloak-client-secretKeyVault
|
|
116
122
|
KEYCLOAK_ADMIN_USERNAME=admin
|
|
117
123
|
KEYCLOAK_ADMIN_PASSWORD=kv://keycloak-admin-passwordKeyVault
|
|
@@ -131,6 +137,19 @@ KEYCLOAK_EVENTS_SECRET=kv://keycloak-events-secretKeyVault
|
|
|
131
137
|
WAIT_FOR_KEYCLOAK=true
|
|
132
138
|
# KEYCLOAK_WAIT_TIMEOUT=60
|
|
133
139
|
|
|
140
|
+
# =============================================================================
|
|
141
|
+
# TENANT ACTIVATION (TA-3) — EXISTING LLM CATALOG
|
|
142
|
+
# =============================================================================
|
|
143
|
+
# Optional JSON array for GET /api/v1/tenant/existing-llm-configurations (and
|
|
144
|
+
# access-model.existingLlmConfigurations). Merge order: env entries first, then
|
|
145
|
+
# entries derived from saved activation LLM (same id in saved overrides).
|
|
146
|
+
# When unset and no saved LLM, the list can be empty — use this for real endpoints.
|
|
147
|
+
#
|
|
148
|
+
# Example (minify to one line in production):
|
|
149
|
+
# EXISTING_LLM_CONFIGURATIONS=[{"id":"prod","name":"Azure Prod","type":"azure-openai","endpoint":"https://my.openai.azure.com","deploymentName":"gpt-4o"}]
|
|
150
|
+
#
|
|
151
|
+
# EXISTING_LLM_CONFIGURATIONS=
|
|
152
|
+
|
|
134
153
|
# =============================================================================
|
|
135
154
|
# AZURE AD PROVIDER CONFIGURATION
|
|
136
155
|
# =============================================================================
|
|
@@ -265,7 +284,7 @@ DEPLOYMENT=database
|
|
|
265
284
|
# =============================================================================
|
|
266
285
|
|
|
267
286
|
# Encryption Key for Database Secrets
|
|
268
|
-
ENCRYPTION_KEY=kv://secrets-encryptionKeyVault
|
|
287
|
+
ENCRYPTION_KEY=kv://miso-controller-secrets-encryptionKeyVault
|
|
269
288
|
|
|
270
289
|
# Key Vault Integration (for security parameter encryption)
|
|
271
290
|
# Set to true to enable Azure Key Vault for storing security parameters
|
|
@@ -276,10 +295,10 @@ KEY_VAULT_ENABLED=false
|
|
|
276
295
|
JWT_SECRET=kv://miso-controller-jwt-secretKeyVault
|
|
277
296
|
|
|
278
297
|
# When API_KEY is set, a matching Bearer token bypasses OAuth2 validation
|
|
279
|
-
API_KEY=kv://miso-controller-
|
|
298
|
+
API_KEY=kv://miso-controller-secrets-apiKeyVault
|
|
280
299
|
|
|
281
300
|
# NPM token for private package (npmjs.org)
|
|
282
|
-
NPM_TOKEN=kv://
|
|
301
|
+
NPM_TOKEN=kv://BASH_NPM_TOKEN
|
|
283
302
|
|
|
284
303
|
# =============================================================================
|
|
285
304
|
# MISO CONTROLLER CONFIGURATION
|
|
@@ -289,8 +308,9 @@ NPM_TOKEN=kv://npm-token-secretKeyVault
|
|
|
289
308
|
# Used to generate correct server URLs in OpenAPI spec and Keycloak callback URLs
|
|
290
309
|
# For Docker: use localhost with mapped port (e.g., localhost:3100)
|
|
291
310
|
# For production: use public domain (e.g., https://miso.example.com)
|
|
292
|
-
|
|
293
|
-
|
|
311
|
+
# url://public includes front-door path from application.yaml (e.g. /controller).
|
|
312
|
+
MISO_WEB_SERVER_URL=url://public
|
|
313
|
+
MISO_CONTROLLER_URL=url://internal
|
|
294
314
|
|
|
295
315
|
# MISO Environment Configuration (miso, dev, tst, pro)
|
|
296
316
|
MISO_ENVIRONMENT=miso
|
|
@@ -301,20 +321,41 @@ MISO_CLIENTSECRET=kv://miso-controller-client-secretKeyVault
|
|
|
301
321
|
|
|
302
322
|
# Allowed origins for CORS validation (comma-separated)
|
|
303
323
|
# Use wildcards for ports: http://localhost:*
|
|
304
|
-
MISO_ALLOWED_ORIGINS=http://localhost
|
|
324
|
+
MISO_ALLOWED_ORIGINS=http://localhost:*,url://host-public,url://host-private,url://dataplane-host-public,url://dataplane-host-private
|
|
325
|
+
|
|
326
|
+
# Evaluation mode (optional .env override of DB controller.configuration.evaluation):
|
|
327
|
+
# When true (default if DB omits flag), infra deploy may coerce :envKey to `miso` — e2e poll on `dev` can 404.
|
|
328
|
+
# Set false locally to force path envKey to match deploy + GET .../deployments/:id.
|
|
329
|
+
# Unset = use DB only.
|
|
330
|
+
CONTROLLER_EVALUATION=
|
|
305
331
|
|
|
306
332
|
# =============================================================================
|
|
307
333
|
# LICENSE CONFIGURATION
|
|
308
334
|
# =============================================================================
|
|
309
|
-
#
|
|
310
|
-
#
|
|
335
|
+
# Offline JWT license (optional):
|
|
336
|
+
# - If set, controller validates license offline (RS256) without Mori subscription status call.
|
|
337
|
+
# - Value can be literal JWT or kv:// reference.
|
|
338
|
+
# - If not set, controller falls back to existing Mori subscription validation flow.
|
|
339
|
+
#
|
|
340
|
+
# Development: set to DEVELOPMENT to disable license validation (no Mori/JWT required):
|
|
341
|
+
# LICENSE_JWT=DEVELOPMENT
|
|
342
|
+
# - Use only for local development; do not use in production.
|
|
311
343
|
LICENSE_JWT=DEVELOPMENT
|
|
312
344
|
|
|
345
|
+
# =============================================================================
|
|
346
|
+
# ENTRA ID ONBOARDING (delegated Graph via Mori)
|
|
347
|
+
# =============================================================================
|
|
348
|
+
# Must match a Web redirect URI on the vendor multi-tenant app and Mori’s route
|
|
349
|
+
# …/entra-graph-delegated/callback. Example (001 dev Mori API):
|
|
350
|
+
# ENTRA_GRAPH_DELEGATED_REDIRECT_URI=https://aifabrix001-mori-web-we.azurewebsites.net/entra-graph-delegated/callback
|
|
351
|
+
ENTRA_GRAPH_DELEGATED_REDIRECT_URI=
|
|
352
|
+
|
|
313
353
|
# =============================================================================
|
|
314
354
|
# MORI SERVICE CONFIGURATION
|
|
315
355
|
# =============================================================================
|
|
316
356
|
|
|
317
|
-
MORI_BASE_URL=
|
|
357
|
+
MORI_BASE_URL=url://mori-controller-public
|
|
358
|
+
MORI_AUTH_METHOD=apiKey
|
|
318
359
|
MORI_API_KEY=kv://mori-controller-api-keyKeyVault
|
|
319
360
|
MORI_USERNAME=kv://mori-controller-basic-usernameKeyVault
|
|
320
361
|
MORI_PASSWORD=kv://mori-controller-basic-passwordKeyVault
|
|
@@ -335,7 +376,7 @@ LOG_FILE_PATH=./logs
|
|
|
335
376
|
# Azure Application Insights connection string (required for OpenTelemetry)
|
|
336
377
|
# If not set, OpenTelemetry will be disabled gracefully
|
|
337
378
|
# Get this from Azure Portal: Application Insights > Overview > Connection String
|
|
338
|
-
APPLICATIONINSIGHTS_CONNECTION_STRING=kv://
|
|
379
|
+
APPLICATIONINSIGHTS_CONNECTION_STRING=kv://appinsights-connectionStringKeyVault
|
|
339
380
|
|
|
340
381
|
# OpenTelemetry service name (optional, defaults to miso-controller)
|
|
341
382
|
OTEL_SERVICE_NAME=miso-controller
|
|
@@ -367,3 +367,8 @@ permissions:
|
|
|
367
367
|
- name: 'onboarding:config'
|
|
368
368
|
roles: ['aifabrix-platform-admin', 'aifabrix-infrastructure-admin']
|
|
369
369
|
description: 'Configure onboarding (license, Entra ID, subscription config)'
|
|
370
|
+
|
|
371
|
+
# Reserved for routes that use non-OAuth verification (e.g. future webhooks); keep for routes.csv compatibility
|
|
372
|
+
- name: 'system:callback'
|
|
373
|
+
roles: ['aifabrix-platform-admin', 'aifabrix-infrastructure-admin']
|
|
374
|
+
description: 'Routes.csv / OpenAPI marker for routes without standard OAuth scopes'
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
- `deploy.js` – Deploy script for the integration
|
|
21
21
|
- `wizard.yaml` – Wizard configuration (if created via wizard)
|
|
22
22
|
|
|
23
|
-
Optional: `
|
|
23
|
+
Optional: `{{rbacOptionalFile}}` – Roles and permissions merged into the system when present.
|
|
24
24
|
|
|
25
25
|
## Quick Start
|
|
26
26
|
|
|
@@ -43,7 +43,7 @@ aifabrix wizard --app {{appName}}
|
|
|
43
43
|
Edit files in `integration/{{appName}}/`:
|
|
44
44
|
|
|
45
45
|
- **Authentication**: `{{systemKey}}-system{{fileExt}}` (auth type, credentials placeholders)
|
|
46
|
-
- **Field mappings**: `{{systemKey}}-datasource
|
|
46
|
+
- **Field mappings**: `{{systemKey}}-datasource-*{{fileExt}}` (dimensions, attributes, operations)
|
|
47
47
|
- **Credential and configuration**: `env.template` (security settings and configuration variables)
|
|
48
48
|
|
|
49
49
|
{{#if secretPaths}}{{#if secretPaths.length}}
|
|
@@ -58,12 +58,16 @@ aifabrix secret set {{path}} <your value> # {{description}}
|
|
|
58
58
|
```
|
|
59
59
|
{{/if}}{{/if}}
|
|
60
60
|
|
|
61
|
-
### 3. Validate
|
|
61
|
+
### 3. Validate configuration (local only)
|
|
62
|
+
|
|
63
|
+
`aifabrix validate` runs **on your machine**: it loads files under `integration/{{appName}}/`, checks them against the application and external-system / external-datasource JSON schemas, and runs related manifest rules. It does **not** call the dataplane or any other remote API.
|
|
62
64
|
|
|
63
65
|
```bash
|
|
64
66
|
aifabrix validate {{appName}}
|
|
65
67
|
```
|
|
66
68
|
|
|
69
|
+
Use this before upload or deploy to catch structural and policy errors early.
|
|
70
|
+
|
|
67
71
|
### 4. Repair Deployment Manifest
|
|
68
72
|
|
|
69
73
|
**Run repair regularly.** It keeps naming conventions, filenames, and the deployment manifest aligned with AI Fabrix platform best practices. Use it after editing datasources, env.template, or system config—and run it often to catch drift early.
|
|
@@ -88,19 +92,28 @@ aifabrix upload {{appName}}
|
|
|
88
92
|
|
|
89
93
|
## Testing
|
|
90
94
|
|
|
91
|
-
|
|
95
|
+
| Command | Where it runs | Calls dataplane? |
|
|
96
|
+
|--------|----------------|------------------|
|
|
97
|
+
| `aifabrix validate {{appName}}` | Local (schemas / files) | No |
|
|
98
|
+
| `aifabrix test {{appName}}` | Local (manifest / payload checks) | No |
|
|
99
|
+
| `aifabrix test-integration {{appName}}`, `aifabrix test-e2e {{appName}}`, `aifabrix datasource test …`, `aifabrix datasource test-integration …`, `aifabrix datasource test-e2e …` | Through configured auth | Yes — unified validation / pipeline API |
|
|
100
|
+
|
|
101
|
+
So: **validate** (and **`test`**) stay offline; **all integration and E2E test commands** exercise the system **via the API** (after login and a reachable dataplane).
|
|
102
|
+
|
|
103
|
+
### Local checks (no API)
|
|
92
104
|
|
|
93
105
|
```bash
|
|
106
|
+
aifabrix validate {{appName}}
|
|
94
107
|
aifabrix test {{appName}}
|
|
95
108
|
```
|
|
96
109
|
|
|
97
|
-
### Integration
|
|
110
|
+
### Integration tests (dataplane API)
|
|
98
111
|
|
|
99
112
|
```bash
|
|
100
113
|
aifabrix test-integration {{appName}}
|
|
101
114
|
```
|
|
102
115
|
|
|
103
|
-
### End-to-end
|
|
116
|
+
### End-to-end tests (dataplane API)
|
|
104
117
|
|
|
105
118
|
```bash
|
|
106
119
|
aifabrix test-e2e {{appName}}
|
|
@@ -147,6 +160,6 @@ aifabrix deploy {{appName}}
|
|
|
147
160
|
|
|
148
161
|
## Troubleshooting
|
|
149
162
|
|
|
150
|
-
- **
|
|
163
|
+
- **Local validation errors**: Run `aifabrix validate {{appName}}` (and `aifabrix test {{appName}}`) — these only inspect files on disk, not the dataplane.
|
|
151
164
|
- **Deployment / auth**: Run `aifabrix auth config --set-controller <url> --set-environment <env>` and `aifabrix login` before `aifabrix deploy`.
|
|
152
165
|
- **File not found**: Run commands from the project root (where `package.json` and `integration/` live).
|
|
@@ -48,7 +48,7 @@ function isLoggedIn() {
|
|
|
48
48
|
|
|
49
49
|
console.log('🔍 Checking authentication...');
|
|
50
50
|
if (!isLoggedIn()) {
|
|
51
|
-
console.log('
|
|
51
|
+
console.log('⚠ Not logged in. Run login (e.g. aifabrix login --controller <url> --method device --environment ' + env + ').');
|
|
52
52
|
run('aifabrix login --environment ' + env);
|
|
53
53
|
}
|
|
54
54
|
|
|
@@ -56,16 +56,16 @@ console.log('🔍 Validating configuration...');
|
|
|
56
56
|
{{#each allJsonFiles}}
|
|
57
57
|
run('aifabrix validate "' + path.join(scriptDir, '{{this}}') + '"');
|
|
58
58
|
{{/each}}
|
|
59
|
-
console.log('
|
|
59
|
+
console.log('✔ Validation passed');
|
|
60
60
|
|
|
61
61
|
console.log('🚀 Deploying ' + appKey + '...');
|
|
62
62
|
run('aifabrix deploy ' + appKey, { cwd: projectRoot });
|
|
63
|
-
console.log('
|
|
63
|
+
console.log('✔ Deployment complete');
|
|
64
64
|
|
|
65
65
|
if (process.env.RUN_TESTS !== 'false') {
|
|
66
66
|
console.log('🧪 Running integration tests...');
|
|
67
67
|
run('aifabrix test-integration ' + appKey, { cwd: projectRoot });
|
|
68
|
-
console.log('
|
|
68
|
+
console.log('✔ Tests passed');
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
console.log('
|
|
71
|
+
console.log('✔ Done.');
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Environment variables for external system integration
|
|
2
|
+
# Use kv:// (or aifabrix secret set) for sensitive values; plain values for non-sensitive configuration.
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
{{#if authMethod}}
|
|
6
|
+
# Authentication
|
|
7
|
+
# Type: {{authMethod}}
|
|
8
|
+
{{#each authSecureVars}}
|
|
9
|
+
{{name}}={{value}}
|
|
10
|
+
{{/each}}
|
|
11
|
+
{{#if authNonSecureVarNames}}
|
|
12
|
+
# Non-secure (e.g. URLs): {{#each authNonSecureVarNames}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}
|
|
13
|
+
{{/if}}
|
|
14
|
+
|
|
15
|
+
{{/if}}
|
|
16
|
+
{{#if configuration.length}}
|
|
17
|
+
# Configuration
|
|
18
|
+
{{#each configuration}}
|
|
19
|
+
# {{comment}}
|
|
20
|
+
{{name}}={{value}}
|
|
21
|
+
{{/each}}
|
|
22
|
+
{{/if}}
|