@aifabrix/builder 2.45.5 → 2.47.0

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