@aifabrix/builder 2.42.1 → 2.44.0

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