@aifabrix/builder 2.45.0 → 2.46.0

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