@aifabrix/builder 2.60.0 → 2.62.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/README.md +14 -11
- package/docs/README.md +80 -0
- package/docs/builder-help/evidence-patterns.json +155 -0
- package/docs/builder-help/golden-examples/crm-company.json +30 -0
- package/docs/builder-help/golden-examples/crm-deal.json +29 -0
- package/docs/builder-help/golden-examples/document-storage-keyed-get.json +85 -0
- package/docs/builder-help/golden-examples/document-storage.json +30 -0
- package/docs/builder-help/golden-examples/meeting-transcript.json +29 -0
- package/docs/builder-help/golden-examples/repository-template.json +29 -0
- package/docs/builder-help/golden-examples/service-ticket.json +29 -0
- package/docs/builder-help/platform-roles.json +98 -0
- package/docs/builder-help/resource-type-catalog.json +402 -0
- package/lib/api/applications.api.js +22 -2
- package/lib/api/bootstrap-snapshot.api.js +115 -0
- package/lib/api/configuration.api.js +131 -0
- package/lib/api/system-secrets.api.js +72 -0
- package/lib/app/deploy.js +14 -5
- package/lib/app/run-docker-fallback.js +6 -1
- package/lib/app/run-env-compose.js +5 -6
- package/lib/app/run-helpers.js +2 -1
- package/lib/app/run-parameter-sync.js +142 -0
- package/lib/app/run.js +6 -4
- package/lib/build/docker-build-args.js +5 -2
- package/lib/build/index.js +3 -2
- package/lib/build/standard-docker-build.js +6 -2
- package/lib/channels/channel-artifact-generator.js +13 -3
- package/lib/cli/infra-guided-footers.js +10 -8
- package/lib/cli/infra-guided.js +30 -10
- package/lib/cli/setup-app.js +5 -0
- package/lib/cli/setup-environment.js +156 -0
- package/lib/cli/setup-infra-up-platform-action.js +14 -1
- package/lib/cli/setup-platform.js +2 -0
- package/lib/commands/auth-config.js +2 -0
- package/lib/commands/datasource-capability-upsert-cli.js +112 -0
- package/lib/commands/datasource-capability.js +4 -2
- package/lib/commands/env-secret-context.js +113 -0
- package/lib/commands/env-secret-list.js +200 -0
- package/lib/commands/env-secret-push-confirm.js +54 -0
- package/lib/commands/env-secret-push-run.js +227 -0
- package/lib/commands/env-secret-push.js +168 -0
- package/lib/commands/login.js +4 -0
- package/lib/commands/repair-datasource-apply.js +5 -1
- package/lib/commands/repair-datasource-keyed-document.js +122 -0
- package/lib/commands/repair-datasource-legacy.js +94 -0
- package/lib/commands/repair-datasource-run.js +1 -0
- package/lib/commands/setup-image-refresh.js +26 -0
- package/lib/commands/setup-modes.js +8 -9
- package/lib/commands/setup-prompts-platform-mode.js +34 -0
- package/lib/commands/setup-prompts.js +2 -180
- package/lib/commands/setup.js +3 -0
- package/lib/commands/up-builder-api.js +24 -8
- package/lib/commands/up-common.js +16 -1
- package/lib/commands/up-dataplane-bootstrap.js +70 -14
- package/lib/commands/up-dataplane-credentials.js +21 -0
- package/lib/commands/up-dataplane.js +37 -18
- package/lib/commands/up-integration-server.js +112 -0
- package/lib/commands/verify-operations-skip-e2e.js +25 -1
- package/lib/commands/verify-operations-steps.js +13 -1
- package/lib/commands/wizard-config-normalizer.js +12 -5
- package/lib/commands/wizard-core.js +5 -157
- package/lib/commands/wizard-file-saving.js +163 -0
- package/lib/core/admin-secrets-env-overlay.js +8 -3
- package/lib/core/env-platform-expand.js +5 -1
- package/lib/core/environment-access-policy.js +121 -0
- package/lib/core/environment-mode-policy.js +177 -0
- package/lib/core/local-env-overrides.js +149 -0
- package/lib/core/secrets-ensure.js +4 -2
- package/lib/core/secrets-env-content.js +17 -10
- package/lib/core/secrets-env-write.js +11 -4
- package/lib/core/secrets-load.js +4 -2
- package/lib/datasource/binary-documents-validator.js +190 -0
- package/lib/datasource/capability/capability-manifest.js +1 -0
- package/lib/datasource/capability/run-capability-upsert.js +202 -0
- package/lib/datasource/capability/upsert-ingredients.js +291 -0
- package/lib/datasource/capability/upsert-operations.js +138 -0
- package/lib/datasource/capability/upsert-test-scaffold.js +189 -0
- package/lib/datasource/validate.js +12 -5
- package/lib/deployment/installation/index.js +14 -1
- package/lib/deployment/installation/infra-catalog.js +3 -0
- package/lib/deployment/installation/local-environment-stage.js +285 -0
- package/lib/deployment/installation/local-installation.js +76 -0
- package/lib/deployment/installation/stage-input.js +5 -1
- package/lib/generator/builders.js +3 -1
- package/lib/generator/index.js +3 -0
- package/lib/generator/split-variables.js +2 -2
- package/lib/lifecycle/product-model.js +4 -3
- package/lib/lifecycle/report-display.js +3 -2
- package/lib/parameters/database-adoption.js +125 -0
- package/lib/parameters/infra-parameter-catalog.js +1 -1
- package/lib/parameters/physical-database-naming.js +136 -0
- package/lib/parameters/physical-secret-name.js +194 -0
- package/lib/parameters/rsa-secret-values.js +165 -0
- package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +1 -1
- package/lib/programmatic/builder-help-governance.js +1 -1
- package/lib/programmatic/builder-help.js +1 -1
- package/lib/programmatic/run-channel-install-artifacts.js +28 -2
- package/lib/programmatic/run-channel-package.js +3 -1
- package/lib/programmatic/workspace-context.js +37 -2
- package/lib/role-assistant/test-runner-workhub-answers.js +4 -1
- package/lib/role-assistant/test-runner-workhub-missing-fields.js +42 -0
- package/lib/role-assistant/test-runner-workhub-wait-stop.js +94 -0
- package/lib/role-assistant/test-runner-workhub.js +28 -19
- package/lib/schema/application-schema.json +14 -2
- package/lib/schema/external-datasource.schema.json +23 -3
- package/lib/schema/infra.parameter.yaml +440 -56
- package/lib/schema/infrastructure-schema.json +213 -120
- package/lib/utils/compose-generate-docker-compose.js +9 -14
- package/lib/utils/compose-generator.js +4 -7
- package/lib/utils/compose-miso-env.js +2 -2
- package/lib/utils/compose-traefik-ingress-base.js +3 -4
- package/lib/utils/datasource-binary-evidence.js +92 -0
- package/lib/utils/datasource-test-run-capability-scope.js +44 -1
- package/lib/utils/datasource-test-run-debug-display.js +2 -0
- package/lib/utils/datasource-test-run-display.js +8 -2
- package/lib/utils/datasource-test-run-issue-guidance.js +176 -0
- package/lib/utils/datasource-test-run-tty-log.js +2 -0
- package/lib/utils/declarative-url-ports.js +3 -0
- package/lib/utils/env-copy.js +11 -10
- package/lib/utils/env-environment-file-paths.js +105 -0
- package/lib/utils/environment-scoped-resources.js +48 -14
- package/lib/utils/external-system-system-test-tty.js +3 -2
- package/lib/utils/image-tags.js +2 -2
- package/lib/utils/paths-system-builder-keys.js +7 -1
- package/lib/utils/paths.js +7 -2
- package/lib/utils/platform-kv-ref.js +1 -1
- package/lib/utils/postgres-platform-bootstrap.js +35 -1
- package/lib/utils/prepare-local-data-mount.js +58 -0
- package/lib/utils/redis-env-scope.js +21 -1
- package/lib/utils/registry-auth-sources.js +154 -0
- package/lib/utils/registry-credentials.js +131 -14
- package/lib/utils/secrets-generator.js +30 -21
- package/lib/utils/secrets-helpers.js +5 -8
- package/lib/utils/secrets-kv-scope.js +127 -28
- package/lib/utils/secrets-materialize-local.js +9 -0
- package/lib/utils/secrets-missing-error.js +35 -1
- package/lib/utils/system-secret-mapping.js +125 -0
- package/lib/utils/test-log-writer.js +2 -1
- package/lib/utils/token-manager.js +14 -8
- package/lib/utils/url-public-path-prefix.js +6 -10
- package/lib/validation/external-manifest-validator.js +5 -0
- package/lib/validation/openapi-contract-surface-validator.js +3 -1
- package/lib/validation/validate-external-file.js +5 -1
- package/package.json +6 -4
- package/templates/agent-kit/agent-kit.yaml +1 -1
- package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +2 -1
- package/templates/agent-kit/skills/aifabrix-connected-system/references/delivery-gates.md +15 -0
- package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +3 -2
- package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +6 -2
- package/templates/agent-kit/skills/aifabrix-prove/references/evidence-lifecycle.md +22 -0
- package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +7 -1
- package/templates/agent-kit/skills/aifabrix-role-assistant/references/testing-playbook.md +117 -0
- package/templates/agent-kit/skills/shared/interaction.md +83 -0
- package/templates/agent-kit/skills/shared/status.md +3 -12
- package/templates/applications/builder-api/application.yaml +1 -1
- package/templates/applications/builder-api/env.template +5 -1
- package/templates/applications/dataplane/application.yaml +2 -2
- package/templates/applications/dataplane/env.template +10 -12
- package/templates/applications/integration-server/application.yaml +91 -0
- package/templates/applications/integration-server/env.template +215 -0
- package/templates/applications/keycloak/application.yaml +6 -1
- package/templates/applications/mirrored-templates.json +52 -0
- package/templates/applications/miso-controller/application.yaml +116 -2
- package/templates/applications/miso-controller/env.template +62 -17
- package/templates/applications/miso-controller/rbac.yaml +17 -0
- package/templates/external-system/external-datasource.yaml.hbs +7 -1
- package/templates/marketplace/createUiDefinition.json +52 -4
- package/templates/marketplace/main.json +88 -10
- package/templates/python/docker-compose.hbs +1 -1
- package/templates/agent-kit/skills/aifabrix-plan/references/interaction.md +0 -41
- /package/{lib/programmatic/help-content → docs/builder-help/content}/channel-onboarding.md +0 -0
- /package/{lib/programmatic/help-content → docs/builder-help/content}/cip-overview.md +0 -0
- /package/{lib/programmatic/help-content → docs/builder-help/content}/connected-system-ui.md +0 -0
- /package/{lib/programmatic/help-content → docs/builder-help/content}/dimensions-guide.md +0 -0
- /package/{lib/programmatic/help-content → docs/builder-help/content}/enterprise-sync-fabrix.md +0 -0
- /package/{lib/programmatic/help-content → docs/builder-help/content}/overview.md +0 -0
- /package/{lib/programmatic/help-content → docs/builder-help/content}/subscription-guide.md +0 -0
- /package/{lib/programmatic/help-content → docs/builder-help/content}/workflow.md +0 -0
|
@@ -4,7 +4,7 @@ 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: '2.0.
|
|
7
|
+
version: '2.0.91'
|
|
8
8
|
# Image Configuration
|
|
9
9
|
# Set tag to match your build (e.g. aifabrix build miso-controller -t 1.0.0 then tag: 1.0.0)
|
|
10
10
|
# Registry is required so the controller can pull the image (avoids "docker: not found" on the controller host).
|
|
@@ -84,12 +84,108 @@ repository:
|
|
|
84
84
|
# are stack-level, not per environment: there is no `environments:` section.
|
|
85
85
|
# env.template consumes these names as {NAME}.
|
|
86
86
|
platforms:
|
|
87
|
+
# Production is matched first and by its literal name, because its host is not the suffixed
|
|
88
|
+
# pattern the other platforms follow: `platform.aifabrix.dev`, not `platform-pro.aifabrix.dev`.
|
|
89
|
+
- resource: aifabrix-int-pro
|
|
90
|
+
name: aifabrix
|
|
91
|
+
platform: pro
|
|
92
|
+
configuration:
|
|
93
|
+
- name: LOCATION
|
|
94
|
+
value: 'swedencentral'
|
|
95
|
+
- name: CLOUD_VENDOR
|
|
96
|
+
value: 'azure'
|
|
97
|
+
- name: MORI_BASE_URL
|
|
98
|
+
value: 'https://platform.aifabrix.dev/mori'
|
|
99
|
+
|
|
100
|
+
# Local Docker runs. No resource group is supplied, so `matchLocalPlatform` takes the FIRST entry
|
|
101
|
+
# declaring the local platform (`dev`) -- this one -- and the literal `aifabrix-local` can never
|
|
102
|
+
# match a real group, so Azure deployments fall through to the entries below.
|
|
103
|
+
#
|
|
104
|
+
# It MUST sit above `aifabrix-int-{platform}`: that entry also resolves to `dev`, so without this
|
|
105
|
+
# one a local stack took `https://platform-dev.aifabrix.dev/mori` -- a host that does not exist on
|
|
106
|
+
# a developer machine. Measured on dev01 2026-09-28: every Mori call failed with `socket hang up`,
|
|
107
|
+
# and `LicenseValidationService.pickupLicenseFromMori` maps that transport failure to
|
|
108
|
+
# `LicenseInvalidError`, which surfaces as **HTTP 403** on
|
|
109
|
+
# `POST /api/ide/onboarding/license/pickup`. A connection failure reported as Forbidden sent the
|
|
110
|
+
# investigation after api-key permissions for days (mori 48.0 `reproduce-license-pickup-403`).
|
|
111
|
+
#
|
|
112
|
+
# Service-to-service traffic has no reason to leave the cluster through the public edge, and the
|
|
113
|
+
# public host is not even resolvable from inside the container. Verified from the miso-controller
|
|
114
|
+
# container: `http://mori-controller:3004/api/v1/health` answers 200 while both
|
|
115
|
+
# `platform-dev.aifabrix.dev` and `dev01.aifabrix.dev` fail to connect.
|
|
116
|
+
#
|
|
117
|
+
# The value is the declarative `url://` form rather than a literal host, so the Builder resolves
|
|
118
|
+
# it from the platform topology the same way Mori's own env.template resolves
|
|
119
|
+
# `url://miso-controller-internal`. A literal would be a second place to edit whenever the local
|
|
120
|
+
# service address changes, and the whole point of `url://` is that there is one.
|
|
121
|
+
#
|
|
122
|
+
# Verified on dev01 that this is the reachable address and that the `/mori` prefix it carries is
|
|
123
|
+
# served: from the miso-controller container both `http://mori-controller:3004/api/v1/health` and
|
|
124
|
+
# `http://mori-controller:3004/mori/api/v1/health` answer 200. `moriApiBase()` appends `/api/v1`.
|
|
125
|
+
#
|
|
126
|
+
# NOT `kv://mori-controller-web-server-url`, which is what the entries below deliberately moved
|
|
127
|
+
# away from: that reads the application RECORD, and on aifabrix-ce-16 the record still held
|
|
128
|
+
# `http://localhost:3004`. `url://` is resolved from the topology at resolve time, not from a
|
|
129
|
+
# record an Azure deployment never overwrites.
|
|
130
|
+
- resource: aifabrix-local
|
|
131
|
+
name: aifabrix
|
|
132
|
+
platform: dev
|
|
133
|
+
configuration:
|
|
134
|
+
- name: LOCATION
|
|
135
|
+
value: 'swedencentral'
|
|
136
|
+
- name: MORI_BASE_URL
|
|
137
|
+
value: 'url://mori-controller-internal'
|
|
138
|
+
# Declared, because the fallback infers it and infers it wrongly here:
|
|
139
|
+
# `resolveCloudVendor` returns 'azure' whenever AZURE_SUBSCRIPTION_ID is set, and every
|
|
140
|
+
# developer box has it from the shared development service principal. A local stack was
|
|
141
|
+
# therefore treated as an Azure installation, `verifyInstallationBinding` took
|
|
142
|
+
# `verifyAzureBinding`, and that demands a directory tenant AND a resource group. A
|
|
143
|
+
# developer box has no resource group, so the binding refused with
|
|
144
|
+
# "Azure licence binding requires the tenant ID and resource group." The licence guard
|
|
145
|
+
# turns that into HTTP 403 on every guarded operation — including
|
|
146
|
+
# `app rotate-secret`, which is the one command that recovers a re-minted credential.
|
|
147
|
+
#
|
|
148
|
+
# Measured on dev01 2026-10-04: the dataplane could not start (its client secret had been
|
|
149
|
+
# re-minted, plan 264.0) and the recovery command was itself refused. The two defects
|
|
150
|
+
# compose into a dead end that no developer can get out of.
|
|
151
|
+
- name: CLOUD_VENDOR
|
|
152
|
+
value: 'docker'
|
|
153
|
+
# The one installation name the licence binds to (plan 266.0). Sent to Mori as
|
|
154
|
+
# `resourceGroupName`; docker requires exactly `local-dev{NN}` or registration refuses.
|
|
155
|
+
# Only on this entry — the Azure platforms below must not be `local-*` and keep SERVICE_NAME.
|
|
156
|
+
- name: MISO_INSTALLATION_NAME
|
|
157
|
+
value: 'local-${DEV_USERNAME}'
|
|
158
|
+
# Plan 262.0: a local stack onboards as SaaS, so the full activation cycle is reachable here.
|
|
159
|
+
#
|
|
160
|
+
# `requiresTenantActivationWizard()` is `isAzureDeployment() || isAzureMockDeployment() ||
|
|
161
|
+
# isSaasDirectOnboarding()`. With `customerOwned` all three are false on a dev box, so the
|
|
162
|
+
# wizard never ran — and the wizard is what collects the customer directory tenant and
|
|
163
|
+
# records consent. Without it the tenant is only ever read from the environment, which is the
|
|
164
|
+
# in-tenant assumption and wrong for SaaS.
|
|
165
|
+
#
|
|
166
|
+
# This is the ONBOARDING axis, deliberately not the DEPLOYMENT axis. `DEPLOYMENT` stays
|
|
167
|
+
# `database` (DB-only; no Docker, no Azure), which `isLocalOnboardingDeployment()` already
|
|
168
|
+
# treats as local. `DEPLOYMENT=local` means Miso orchestrating Docker itself, which is not
|
|
169
|
+
# ready and is not what a dev box runs — keying this on it would never fire.
|
|
170
|
+
#
|
|
171
|
+
# Only on this entry: the Azure platforms below stay `customerOwned`.
|
|
172
|
+
- name: ONBOARDING_MODE
|
|
173
|
+
value: 'saasDirect'
|
|
174
|
+
|
|
87
175
|
- resource: aifabrix-int-{platform}
|
|
88
176
|
name: aifabrix
|
|
89
|
-
options: [dev, tst
|
|
177
|
+
options: [dev, tst]
|
|
90
178
|
configuration:
|
|
91
179
|
- name: LOCATION
|
|
92
180
|
value: 'swedencentral'
|
|
181
|
+
- name: CLOUD_VENDOR
|
|
182
|
+
value: 'azure'
|
|
183
|
+
# Mori the installation talks to. Previously `kv://mori-controller-web-server-url`, which
|
|
184
|
+
# resolved to whatever the *application record* held — on aifabrix-ce-16 that was
|
|
185
|
+
# `http://localhost:3004`, because an Azure deployment never overwrites a stale URL, so every
|
|
186
|
+
# consumer of it was pointed at a loopback address that does not exist in the cluster.
|
|
187
|
+
- name: MORI_BASE_URL
|
|
188
|
+
value: 'https://platform-{platform}.aifabrix.dev/mori'
|
|
93
189
|
|
|
94
190
|
- resource: aifabrix-ce-*
|
|
95
191
|
name: '*'
|
|
@@ -98,6 +194,24 @@ platforms:
|
|
|
98
194
|
configuration:
|
|
99
195
|
- name: LOCATION
|
|
100
196
|
value: 'swedencentral'
|
|
197
|
+
- name: CLOUD_VENDOR
|
|
198
|
+
value: 'azure'
|
|
199
|
+
# The App Service hostname, not the Front Door one, because only this is derivable.
|
|
200
|
+
#
|
|
201
|
+
# The Front Door endpoint carries an Azure-generated suffix (`fzahchbachcfbgaj`) that no
|
|
202
|
+
# template can spell: `{platform}`, `{platform.name}` and `{resourceGroup}` are the only
|
|
203
|
+
# tokens, and none of them yields it. The previous literal was aifabrix-ce-16's endpoint and
|
|
204
|
+
# was therefore wrong for every other `aifabrix-ce-*` installation -- the next one built would
|
|
205
|
+
# have pointed its Miso at ce-16's Mori.
|
|
206
|
+
#
|
|
207
|
+
# The web app is named `{resourceGroup}-miso-mori-controller` by the installer, so its default
|
|
208
|
+
# hostname IS derivable and is correct for every installation in the group. Verified on
|
|
209
|
+
# aifabrix-ce-16 2026-09-27: that host answers /mori/health with 200. This is also the better
|
|
210
|
+
# address for Miso->Mori traffic, which is service-to-service and has no reason to leave the
|
|
211
|
+
# cluster through the public edge. When the named platform hosts exist
|
|
212
|
+
# (`platform-dev.aifabrix.dev/mori`) this entry can follow the pattern used above.
|
|
213
|
+
- name: MORI_BASE_URL
|
|
214
|
+
value: 'https://{resourceGroup}-miso-mori-controller.azurewebsites.net/mori'
|
|
101
215
|
|
|
102
216
|
configuration:
|
|
103
217
|
# -------------------------------------------------------------------------
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
# [saasDirect] eSystems-hosted SaaS activation (four-step wizard)
|
|
12
12
|
# [customerOwned] Azure-in-tenant activation (existing TA wizard)
|
|
13
13
|
#
|
|
14
|
-
# ONBOARDING_MODE selects the onboarding step list.
|
|
14
|
+
# ONBOARDING_MODE selects the onboarding step list. saasDirect also enables the local wizard.
|
|
15
|
+
# It is orthogonal to DEPLOYMENT,
|
|
15
16
|
# which selects Azure SDK vs local execution. There is NO fifth DEPLOYMENT value:
|
|
16
17
|
# eSystems-hosted SaaS still runs DEPLOYMENT=azure. See the DEPLOYMENT TYPE and
|
|
17
18
|
# ONBOARDING MODE sections below.
|
|
@@ -40,14 +41,28 @@
|
|
|
40
41
|
# Optional custom controller key for onboarding (default: miso-controller)
|
|
41
42
|
ONBOARDING_CONTROLLER_KEY=miso-controller
|
|
42
43
|
|
|
43
|
-
# Infrastructure/service name used by controller/onboarding flows
|
|
44
|
-
INFRASTRUCTURE_NAME=${DEV_USERNAME}.${DEV_ROOT_DOMAIN}
|
|
45
|
-
|
|
46
44
|
# Azure region (required for first-time onboarding: controller record / provisioning metadata).
|
|
47
45
|
# Use the region you deploy to (e.g. westeurope, eastus, northeurope). Single env name: LOCATION.
|
|
48
46
|
# Resolved from the platform match; see `platforms` in application.yaml.
|
|
49
47
|
LOCATION={LOCATION}
|
|
50
48
|
|
|
49
|
+
# Which kind of installation this is, for licence binding. Declared, never inferred.
|
|
50
|
+
#
|
|
51
|
+
# `resolveCloudVendor` falls back to "AZURE_SUBSCRIPTION_ID is set, therefore Azure", and every
|
|
52
|
+
# developer box has that variable from the shared development service principal. A local stack was
|
|
53
|
+
# then bound as an Azure installation, which requires a directory tenant AND a resource group; a
|
|
54
|
+
# developer box has no resource group, so licence binding refused and the licence guard returned
|
|
55
|
+
# HTTP 403 for every guarded operation — `app rotate-secret` included, which is precisely the
|
|
56
|
+
# command needed to recover a credential the controller had re-minted.
|
|
57
|
+
#
|
|
58
|
+
# Resolved from the platform match: `docker` locally, `azure` for every real resource group.
|
|
59
|
+
CLOUD_VENDOR={CLOUD_VENDOR}
|
|
60
|
+
|
|
61
|
+
# The one installation name the licence binds to (plan 266.0). Not a label: Miso sends it to Mori
|
|
62
|
+
# as `resourceGroupName`, and docker requires exactly `local-dev{NN}` or registration refuses.
|
|
63
|
+
# `${DEV_USERNAME}` yields `local-dev03`. It is the only name a local install declares.
|
|
64
|
+
MISO_INSTALLATION_NAME=local-${DEV_USERNAME}
|
|
65
|
+
|
|
51
66
|
# Required for admin user creation during onboarding
|
|
52
67
|
# Password for the initial administrator user (username: admin)
|
|
53
68
|
ONBOARDING_ADMIN_PASSWORD=kv://miso-controller-admin-passwordKeyVault
|
|
@@ -151,7 +166,6 @@ KEYCLOAK_CLIENT_ID=kv://keycloak-client-idKeyVault
|
|
|
151
166
|
KEYCLOAK_CLIENT_SECRET=kv://keycloak-client-secretKeyVault
|
|
152
167
|
KEYCLOAK_ADMIN_USERNAME=admin
|
|
153
168
|
KEYCLOAK_ADMIN_PASSWORD=kv://keycloak-admin-passwordKeyVault
|
|
154
|
-
KEYCLOAK_PUBLIC_KEY=
|
|
155
169
|
KEYCLOAK_VERIFY_AUDIENCE=false
|
|
156
170
|
KEYCLOAK_TOKEN_TIMEOUT=5000
|
|
157
171
|
KEYCLOAK_DEFAULT_PASSWORD=kv://keycloak-default-passwordKeyVault
|
|
@@ -193,16 +207,21 @@ WAIT_FOR_KEYCLOAK=true
|
|
|
193
207
|
# For production: use public domain (e.g., https://miso.example.com)
|
|
194
208
|
# url://public includes front-door path from application.yaml (e.g. /controller).
|
|
195
209
|
MISO_WEB_SERVER_URL=url://public
|
|
210
|
+
# Private service-to-service controller origin; public/browser traffic uses MISO_WEB_SERVER_URL.
|
|
196
211
|
MISO_CONTROLLER_URL=url://internal
|
|
197
212
|
MISO_RELATIVE_PATH=url://vdir-public
|
|
198
|
-
ALLOWED_ORIGINS=http://localhost:*,url://host-public,url://host-private,url://dataplane-host-public,url://dataplane-host-private
|
|
213
|
+
ALLOWED_ORIGINS=http://localhost:*,url://host-public,url://host-private,url://dataplane-host-public,url://dataplane-host-private,url://mori-controller-host-public
|
|
199
214
|
# Opt-in: broker/entry/referer under /data keep …/data/auth/callback (do not append /miso). Default off.
|
|
200
215
|
# AUTH_PRESERVE_DATAPLANE_VDIR=true
|
|
201
216
|
|
|
202
217
|
# MISO Environment Configuration (miso, dev, tst, pro)
|
|
203
218
|
MISO_ENVIRONMENT=miso
|
|
204
219
|
|
|
205
|
-
#
|
|
220
|
+
# Governed configuration uses per-application client credentials by default. The SDK loads
|
|
221
|
+
# its bootstrap snapshot and refreshes it automatically within two minutes; consumers decide
|
|
222
|
+
# whether a changed key also requires an internal client or resource to be recreated.
|
|
223
|
+
MISO_AUTH_MODE=client-credentials
|
|
224
|
+
# MISO Application Client Credentials (per application; never expose the secret to the browser)
|
|
206
225
|
MISO_CLIENTID=kv://miso-controller-client-idKeyVault
|
|
207
226
|
MISO_CLIENTSECRET=kv://miso-controller-client-secretKeyVault
|
|
208
227
|
|
|
@@ -286,12 +305,12 @@ DEPLOYMENT=database
|
|
|
286
305
|
#
|
|
287
306
|
# customerOwned = Azure-in-tenant wizard
|
|
288
307
|
# consent → identity → size → access-model → endpoint → validation
|
|
289
|
-
# saasDirect =
|
|
290
|
-
# consent →
|
|
308
|
+
# saasDirect = hosted or local Docker guided activation
|
|
309
|
+
# consent → endpoint (local browser URL or optional domain) → identity → review
|
|
291
310
|
# Omits size, access-model, customer deploy and platform-apps.
|
|
292
311
|
#
|
|
293
312
|
# Unset defaults to customerOwned. An unknown value fails closed with HTTP 400.
|
|
294
|
-
ONBOARDING_MODE=
|
|
313
|
+
ONBOARDING_MODE=saasDirect
|
|
295
314
|
|
|
296
315
|
# Dev/test: show TA Entra "Completing setup" countdown (120s cap). Default false.
|
|
297
316
|
# Exposed to UI via GET /api/v1/tenant/status → showTaCountdown (restart controller after change).
|
|
@@ -306,9 +325,10 @@ SHOW_TA_COUNT_DOWN=false
|
|
|
306
325
|
ENCRYPTION_KEY=kv://miso-controller-secrets-encryptionKeyVault
|
|
307
326
|
|
|
308
327
|
# Comma-separated application keys allowed for POST .../applications/bootstrap (install-time only).
|
|
309
|
-
# Environment placement is a separate controller rule: workloads (dataplane,
|
|
310
|
-
# dev/tst/pro but never `miso`; miso-controller
|
|
311
|
-
|
|
328
|
+
# Environment placement is a separate controller rule: workloads (dataplane, customer apps) install
|
|
329
|
+
# into dev/tst/pro but never `miso`; miso-controller, keycloak, builder-api, and integration-server
|
|
330
|
+
# only into `miso`; mori-controller anywhere.
|
|
331
|
+
BOOTSTRAP_APPKEYS=dataplane,builder-api,integration-server,mori-controller
|
|
312
332
|
|
|
313
333
|
# Key Vault Integration (for security parameter encryption)
|
|
314
334
|
# Set to true to enable Azure Key Vault for storing security parameters
|
|
@@ -378,8 +398,36 @@ ENTRA_GRAPH_DELEGATED_REDIRECT_URI=url://mori-controller-public/entra-graph-dele
|
|
|
378
398
|
# registered and running for this developer.
|
|
379
399
|
# MORI_API_KEY is per-installation and is minted by POST /marketplace/bootstrap; it is written
|
|
380
400
|
# here by the controller after registration, not provisioned ahead of it.
|
|
381
|
-
MORI_BASE_URL=
|
|
401
|
+
MORI_BASE_URL={MORI_BASE_URL}
|
|
402
|
+
|
|
403
|
+
# Mori's policy signing ANCHOR, public half. Verifies the signed enforcement bundle.
|
|
404
|
+
#
|
|
405
|
+
# Mori holds the private half and signs with it; this is the key the bundle is checked against, so
|
|
406
|
+
# an installation that could write it could trust a bundle it signed itself. It is supplied, never
|
|
407
|
+
# generated: on Azure the deployment template writes `mori-policy-public-keyKeyVault` into the
|
|
408
|
+
# installation vault. Locally it is per developer, because each box's Mori holds its own pair.
|
|
409
|
+
#
|
|
410
|
+
# `pnpm license:sign:local` reads it from here so the command needs no arguments. Export the public
|
|
411
|
+
# half from the local Mori once:
|
|
412
|
+
#
|
|
413
|
+
# docker exec aifabrix-dev${NN}-mori-controller node -e "const {createPublicKey}=require('crypto');\
|
|
414
|
+
# process.stdout.write(createPublicKey(process.env.MORI_POLICY_PRIVATE_KEY.replace(/\\n/g,'\n'))\
|
|
415
|
+
# .export({type:'spki',format:'pem'}).toString())"
|
|
416
|
+
#
|
|
417
|
+
# Empty is valid: an installation with no anchor cannot verify a bundle and says so, rather than
|
|
418
|
+
# accepting one signed by any key.
|
|
419
|
+
MORI_POLICY_PUBLIC_KEY=
|
|
420
|
+
MORI_POLICY_KEY_ID={POLICY_KEY_ID}
|
|
382
421
|
MORI_API_KEY=kv://mori-controller-api-keyKeyVault
|
|
422
|
+
# Ask Mori for a container-registry credential when the installation was given none.
|
|
423
|
+
# Off by default: the call has a 30s timeout inside credential resolution, so enabling it on an
|
|
424
|
+
# installation whose Mori cannot issue would stall every deployment that reaches that point.
|
|
425
|
+
# Declared here because it was previously read from process.env and set nowhere, so there was no
|
|
426
|
+
# supported way to turn the path on — an installation that pulls vendor images through a
|
|
427
|
+
# Mori-issued token had to have an app setting added by hand. Cross-tenant managed identity
|
|
428
|
+
# cannot grant registry access, so this is the only mechanism that works for a customer
|
|
429
|
+
# installation pulling from the vendor registry.
|
|
430
|
+
MORI_REGISTRY_CREDENTIALS=false
|
|
383
431
|
|
|
384
432
|
# =============================================================================
|
|
385
433
|
# LOGGING CONFIGURATION
|
|
@@ -403,9 +451,6 @@ APPLICATIONINSIGHTS_CONNECTION_STRING=kv://appinsights-connectionStringKeyVault
|
|
|
403
451
|
# OpenTelemetry service name (optional, defaults to miso-controller)
|
|
404
452
|
OTEL_SERVICE_NAME=miso-controller
|
|
405
453
|
|
|
406
|
-
# OpenTelemetry service version (optional, defaults to npm_package_version or 1.0.0)
|
|
407
|
-
OTEL_SERVICE_VERSION=
|
|
408
|
-
|
|
409
454
|
# =============================================================================
|
|
410
455
|
# STORAGE CONFIGURATION
|
|
411
456
|
# =============================================================================
|
|
@@ -176,6 +176,23 @@ permissions:
|
|
|
176
176
|
roles: ['aifabrix-platform-admin', 'aifabrix-deployment-admin']
|
|
177
177
|
description: 'Remove applications from environments'
|
|
178
178
|
|
|
179
|
+
# External-system catalog (aligned with src/examples/permissions.csv)
|
|
180
|
+
- name: 'external-system:read'
|
|
181
|
+
roles:
|
|
182
|
+
[
|
|
183
|
+
'aifabrix-platform-admin',
|
|
184
|
+
'aifabrix-security-admin',
|
|
185
|
+
'aifabrix-deployment-admin',
|
|
186
|
+
'aifabrix-compliance-admin',
|
|
187
|
+
'aifabrix-developer',
|
|
188
|
+
'aifabrix-observer'
|
|
189
|
+
]
|
|
190
|
+
description: 'Read external systems'
|
|
191
|
+
|
|
192
|
+
- name: 'external-systems:domain-manager'
|
|
193
|
+
roles: ['aifabrix-platform-admin', 'aifabrix-security-admin']
|
|
194
|
+
description: 'Manage external-system catalog promotion and role-derived dimension governance'
|
|
195
|
+
|
|
179
196
|
# Pipeline & Deployment
|
|
180
197
|
- name: 'applications:deploy'
|
|
181
198
|
roles: ['aifabrix-platform-admin', 'aifabrix-deployment-admin', 'aifabrix-developer']
|
|
@@ -122,7 +122,13 @@ openapi:
|
|
|
122
122
|
# documentStorage:
|
|
123
123
|
# enabled: true
|
|
124
124
|
# binaryOperationRef: get
|
|
125
|
-
#
|
|
125
|
+
# responseType: binary
|
|
126
|
+
# ingestAfterSync: true
|
|
127
|
+
# Keyed retrieval (no list): for a vendor PDF, image or octet-stream response,
|
|
128
|
+
# keep only get in capabilities and end its CIP steps with output.mode: documents.
|
|
129
|
+
# Fetch: { source: openapi, openapiRef: get, responseType: binary }
|
|
130
|
+
# Map response metadata from raw.headers.FileName and raw.params.DocumentId.
|
|
131
|
+
# The wizard and repair infer this shape from the vendor OpenAPI response media type.
|
|
126
132
|
{{/if}}
|
|
127
133
|
{{#if (eq schemaEntityType "vectorStore")}}
|
|
128
134
|
# vectorStore: vector index settings (model id, dimensions, etc. per schema). Uncomment and set to match your embedding deployment.
|
|
@@ -5,19 +5,44 @@
|
|
|
5
5
|
"parameters": {
|
|
6
6
|
"config": {
|
|
7
7
|
"basics": {
|
|
8
|
-
"description": "Choose subscription, resource group, and region above. Under **Application resources Resource group name**, enter your install id (for example `aifabrixpoc02`). That managed resource group name is the naming prefix: resources become `{rg}-miso-asp`, `{rg}-miso-miso`, and so on. Set the Azure **Application name** to the same id when the portal asks. Enter the initial platform administrator password and choose the license below. Container images are pulled with the web apps' managed identities; no registry credential is needed."
|
|
8
|
+
"description": "Choose subscription, resource group, and region above. Under **Application resources Resource group name**, enter your install id (for example `aifabrixpoc02`), using at most 16 lowercase characters. That managed resource group name is the naming prefix: resources become `{rg}-miso-asp`, `{rg}-miso-miso`, and so on. Set the Azure **Application name** to the same id when the portal asks. Enter the initial platform administrator password and choose the license below. Container images are pulled with the web apps' managed identities; no registry credential is needed.",
|
|
9
|
+
"resourceGroup": {
|
|
10
|
+
"constraints": {
|
|
11
|
+
"validations": [
|
|
12
|
+
{
|
|
13
|
+
"regex": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
|
|
14
|
+
"message": "Use lowercase letters, digits and single hyphens, starting with a letter. The name becomes the prefix for every resource, and the Key Vault created as {name}-miso-kv must start with a letter and cannot contain consecutive or trailing hyphens."
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"regex": "^.{1,16}$",
|
|
18
|
+
"message": "Use at most 16 characters. The name becomes the prefix for every resource: the Key Vault is created as {name}-miso-kv, and Azure limits a Key Vault name to 24 characters."
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
}
|
|
9
23
|
}
|
|
10
24
|
},
|
|
11
25
|
"basics": [
|
|
26
|
+
{
|
|
27
|
+
"name": "adminEmail",
|
|
28
|
+
"type": "Microsoft.Common.TextBox",
|
|
29
|
+
"label": "Administrator email",
|
|
30
|
+
"toolTip": "Email for the initial platform administrator and installation welcome.",
|
|
31
|
+
"constraints": {
|
|
32
|
+
"required": true,
|
|
33
|
+
"regex": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$",
|
|
34
|
+
"validationMessage": "Enter a valid email address."
|
|
35
|
+
}
|
|
36
|
+
},
|
|
12
37
|
{
|
|
13
38
|
"name": "adminPassword",
|
|
14
39
|
"type": "Microsoft.Common.PasswordBox",
|
|
15
40
|
"label": "Administrator password",
|
|
16
|
-
"toolTip": "Password for the initial AI Fabrix platform administrator (user admin). PostgreSQL, Keycloak, and encryption secrets are generated automatically and stored in Key Vault
|
|
41
|
+
"toolTip": "Password for the initial AI Fabrix platform administrator (user admin). PostgreSQL, Keycloak, and encryption secrets are generated automatically and stored in Key Vault \u2014 do not reuse this password for infrastructure.",
|
|
17
42
|
"constraints": {
|
|
18
43
|
"required": true,
|
|
19
44
|
"regex": "^.{8,128}$",
|
|
20
|
-
"validationMessage": "Password must be 8
|
|
45
|
+
"validationMessage": "Password must be 8\u2013128 characters."
|
|
21
46
|
},
|
|
22
47
|
"options": {
|
|
23
48
|
"hideConfirmation": false
|
|
@@ -63,6 +88,27 @@
|
|
|
63
88
|
"regex": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
|
|
64
89
|
"validationMessage": "Enter the Marketplace subscription ID as a GUID (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)."
|
|
65
90
|
}
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "installationResourceModel",
|
|
94
|
+
"type": "Microsoft.Common.DropDown",
|
|
95
|
+
"label": "Initial infrastructure",
|
|
96
|
+
"toolTip": "Choose Shared for Community or Standard. Choose Dedicated DEV for Enterprise. This provisions infrastructure before licence issuance; it does not grant licence entitlements.",
|
|
97
|
+
"defaultValue": "Shared (Community / Standard)",
|
|
98
|
+
"constraints": {
|
|
99
|
+
"required": "[equals(basics('licenseChoice'), 'SUBSCRIPTION_ID')]",
|
|
100
|
+
"allowedValues": [
|
|
101
|
+
{
|
|
102
|
+
"label": "Shared (Community / Standard)",
|
|
103
|
+
"value": "shared"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"label": "Dedicated DEV (Enterprise)",
|
|
107
|
+
"value": "dedicated"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
"visible": "[equals(basics('licenseChoice'), 'SUBSCRIPTION_ID')]"
|
|
66
112
|
}
|
|
67
113
|
],
|
|
68
114
|
"steps": [],
|
|
@@ -71,7 +117,9 @@
|
|
|
71
117
|
"deploymentEnvironment": "evaluation",
|
|
72
118
|
"adminPassword": "[basics('adminPassword')]",
|
|
73
119
|
"licenseEdition": "[if(equals(basics('licenseChoice'), 'SUBSCRIPTION_ID'), basics('licenseSubscriptionKey'), basics('licenseChoice'))]",
|
|
74
|
-
"acrResourceId": "__MARKETPLACE_ACR_RESOURCE_ID__"
|
|
120
|
+
"acrResourceId": "__MARKETPLACE_ACR_RESOURCE_ID__",
|
|
121
|
+
"installationResourceModel": "[if(equals(basics('licenseChoice'), 'SUBSCRIPTION_ID'), basics('installationResourceModel'), if(equals(basics('licenseChoice'), 'ENTERPRISE'), 'dedicated', 'shared'))]",
|
|
122
|
+
"adminEmail": "[basics('adminEmail')]"
|
|
75
123
|
}
|
|
76
124
|
}
|
|
77
125
|
}
|