@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,8 +1,5 @@
1
1
  const {
2
2
  formatSuccessLine,
3
- formatSuccessParagraph,
4
- sectionTitle,
5
- headerKeyValue,
6
3
  metadata,
7
4
  formatProgress,
8
5
  formatWarningLine
@@ -36,83 +33,18 @@ const { getExternalSystemConfig } = require('../api/external-systems.api');
36
33
  const { getDeploymentAuth, requireBearerForDataplanePipeline } = require('../utils/token-manager');
37
34
  const { getConfig } = require('../core/config');
38
35
  const { getIntegrationPath } = require('../utils/paths');
39
- const { retemplateConfigurationForDownload } = require('../utils/configuration-env-resolver');
36
+ const { retemplateConfigurationForDownload, retemplateAllVariableDefinitions } = require('../utils/configuration-env-resolver');
37
+ const { syncRuntimeConfigurationFromDataplane } = require('../utils/runtime-configuration-download');
40
38
  const logger = require('../utils/logger');
41
39
  const { resolveControllerUrl } = require('../utils/controller-url');
42
40
  const generator = require('../generator');
43
-
44
- /**
45
- * Validates system type from downloaded application
46
- * @param {Object} application - External system configuration
47
- * @returns {string} System type (openapi, mcp, custom)
48
- * @throws {Error} If system type is invalid
49
- */
50
- function validateSystemType(application) {
51
- if (!application || typeof application !== 'object') {
52
- throw new Error('Application configuration is required');
53
- }
54
-
55
- const validTypes = ['openapi', 'mcp', 'custom'];
56
- const systemType = application.type;
57
-
58
- if (!systemType || !validTypes.includes(systemType)) {
59
- throw new Error(`Invalid system type: ${systemType}. Must be one of: ${validTypes.join(', ')}`);
60
- }
61
-
62
- return systemType;
63
- }
64
-
65
- /**
66
- * Validates downloaded data structure before writing files
67
- * @param {Object} application - External system configuration
68
- * @param {Array} dataSources - Array of datasource configurations
69
- * @throws {Error} If validation fails
70
- */
71
- /**
72
- * Validates application configuration
73
- * @function validateApplicationConfig
74
- * @param {Object} application - Application configuration
75
- * @throws {Error} If validation fails
76
- */
77
- function validateApplicationConfig(application) {
78
- if (!application || typeof application !== 'object') {
79
- throw new Error('Application configuration is required');
80
- }
81
- if (!application.key || typeof application.key !== 'string') {
82
- throw new Error('Application key is required');
83
- }
84
- }
85
-
86
- /**
87
- * Validates datasource configuration
88
- * @function validateDatasourceConfig
89
- * @param {Object} datasource - Datasource configuration
90
- * @param {string} applicationKey - Application key
91
- * @throws {Error} If validation fails
92
- */
93
- function validateDatasourceConfig(datasource, applicationKey) {
94
- if (!datasource.key || typeof datasource.key !== 'string') {
95
- throw new Error('Datasource key is required for all datasources');
96
- }
97
- if (!datasource.systemKey || typeof datasource.systemKey !== 'string') {
98
- throw new Error('Datasource systemKey is required for all datasources');
99
- }
100
- if (datasource.systemKey !== applicationKey) {
101
- throw new Error(`Datasource systemKey (${datasource.systemKey}) does not match application key (${applicationKey})`);
102
- }
103
- }
104
-
105
- function validateDownloadedData(application, dataSources) {
106
- validateApplicationConfig(application);
107
-
108
- if (!Array.isArray(dataSources)) {
109
- throw new Error('DataSources must be an array');
110
- }
111
-
112
- for (const datasource of dataSources) {
113
- validateDatasourceConfig(datasource, application.key);
114
- }
115
- }
41
+ const {
42
+ validateSystemType,
43
+ validateDownloadedData,
44
+ logDownloadCommandHeader,
45
+ displayDownloadSuccess,
46
+ runConvertToJsonIfRequested
47
+ } = require('./download-helpers');
116
48
 
117
49
  /**
118
50
  * Setup authentication and get dataplane URL
@@ -354,10 +286,9 @@ async function applyRetemplateToSystemFile(systemKey, systemFilePath) {
354
286
  const systemContent = await fs.readFile(systemFilePath, 'utf8');
355
287
  const systemObj = yaml.load(systemContent);
356
288
  if (!Array.isArray(systemObj?.configuration)) return;
357
- const applied = await retemplateConfigurationForDownload(systemKey, systemObj.configuration);
358
- if (applied) {
359
- await fs.writeFile(systemFilePath, yaml.dump(systemObj, { indent: 2, lineWidth: -1 }), 'utf8');
360
- }
289
+ retemplateAllVariableDefinitions(systemObj.configuration);
290
+ await retemplateConfigurationForDownload(systemKey, systemObj.configuration);
291
+ await fs.writeFile(systemFilePath, yaml.dump(systemObj, { indent: 2, lineWidth: -1 }), 'utf8');
361
292
  }
362
293
 
363
294
  /**
@@ -397,70 +328,75 @@ async function processDownloadedSystem(systemKey, manifest, splitOptions = {}) {
397
328
  }
398
329
 
399
330
  /**
400
- * Display download success message
401
- * @param {string} systemKey - System key
402
- * @param {string} finalPath - Final destination path
403
- * @param {number} datasourceCount - Number of datasources
404
- */
405
- function displayDownloadSuccess(systemKey, finalPath, datasourceCount) {
406
- logger.log(
407
- formatSuccessParagraph(
408
- `Downloaded ${systemKey} (${datasourceCount} datasource${datasourceCount === 1 ? '' : 's'})`
409
- )
410
- );
411
- logger.log(headerKeyValue('Location:', finalPath));
412
- }
413
-
414
- /**
415
- * After YAML split, convert integration files to JSON when --format json.
416
- * @async
417
- * @param {string} systemKey
331
+ * Post-split download steps: governance packs, optional JSON convert, runtime config sync.
332
+ * @param {Object} params
333
+ * @param {string} params.systemKey
334
+ * @param {Object} params.manifest
335
+ * @param {string} params.finalPath
336
+ * @param {string} params.dataplaneUrl
337
+ * @param {Object} params.authConfig
338
+ * @param {string} params.format
418
339
  * @returns {Promise<void>}
419
340
  */
420
- async function runConvertToJsonIfRequested(systemKey) {
421
- const { runConvert } = require('../commands/convert');
341
+ async function finalizeDownloadArtifacts({
342
+ systemKey,
343
+ manifest,
344
+ finalPath,
345
+ dataplaneUrl,
346
+ authConfig,
347
+ format
348
+ }) {
349
+ const { downloadGovernanceScenarioPacksFromManifest } = require('../lifecycle/scenario-upload');
350
+ await downloadGovernanceScenarioPacksFromManifest(
351
+ systemKey,
352
+ manifest,
353
+ dataplaneUrl,
354
+ authConfig
355
+ );
356
+ if (format === 'json') {
357
+ await runConvertToJsonIfRequested(systemKey);
358
+ }
422
359
  try {
423
- await runConvert(systemKey, { format: 'json', force: true });
424
- logger.log(formatSuccessLine('Converted component files to JSON'));
425
- } catch (convertErr) {
426
- throw new Error(`Download succeeded but convert to JSON failed: ${convertErr.message}`);
360
+ const configSync = await syncRuntimeConfigurationFromDataplane({
361
+ dataplaneUrl,
362
+ authConfig,
363
+ systemKey,
364
+ integrationPath: finalPath,
365
+ dataSources: manifest.dataSources
366
+ });
367
+ if (configSync.merged > 0) {
368
+ const nameList = configSync.names.length ? ` (${configSync.names.join(', ')})` : '';
369
+ logger.log(
370
+ formatSuccessLine(
371
+ `Merged ${configSync.merged} runtime configuration variable(s) into env.template${nameList}.`
372
+ )
373
+ );
374
+ }
375
+ } catch (syncErr) {
376
+ logger.log(formatWarningLine(`Runtime configuration sync skipped: ${syncErr.message}`));
427
377
  }
378
+ displayDownloadSuccess(systemKey, finalPath, manifest.dataSources.length);
428
379
  }
429
380
 
430
381
  /**
431
- * @param {string} systemKey
432
- */
433
- function logDownloadCommandHeader(systemKey) {
434
- logger.log('');
435
- logger.log(sectionTitle('Download'));
436
- logger.log(headerKeyValue('System:', systemKey));
437
- }
438
-
439
- /**
440
- * Downloads external system from dataplane to local development structure
382
+ * Downloads external system from dataplane to local development structure.
441
383
  * @async
442
- * @function downloadExternalSystem
443
- * @param {string} systemKey - System key or ID
444
- * @param {Object} options - Download options
445
- * @param {string} [options.format] - Output format: 'yaml' (default) or 'json' (runs convert after split)
446
- * @param {string} [options.environment] - Environment (dev, tst, pro)
447
- * @param {string} [options.controller] - Controller URL
448
- * @param {boolean} [options.dryRun] - Show what would be downloaded without actually downloading
449
- * @param {boolean} [options.force] - Overwrite existing README.md without prompting
450
- * @returns {Promise<void>} Resolves when download completes
451
- * @throws {Error} If download fails
384
+ * @param {string} systemKey
385
+ * @param {Object} [options]
386
+ * @returns {Promise<void>}
452
387
  */
453
388
  async function downloadExternalSystem(systemKey, options = {}) {
454
389
  validateSystemKeyFormat(systemKey);
455
-
456
390
  const format = (options.format || 'yaml').toLowerCase();
457
391
 
458
392
  try {
459
393
  logDownloadCommandHeader(systemKey);
460
-
461
394
  const config = await getConfig();
462
- const { authConfig, dataplaneUrl } = await setupAuthenticationAndDataplane(systemKey, options, config);
463
-
395
+ const { authConfig, dataplaneUrl } = await setupAuthenticationAndDataplane(
396
+ systemKey,
397
+ options,
398
+ config
399
+ );
464
400
  if (options.dryRun) {
465
401
  handleDryRun(systemKey, dataplaneUrl);
466
402
  return;
@@ -468,16 +404,20 @@ async function downloadExternalSystem(systemKey, options = {}) {
468
404
 
469
405
  const manifest = await downloadFullManifest(dataplaneUrl, systemKey, authConfig);
470
406
  validateAndLogDownloadedData(manifest.application, manifest.dataSources);
471
-
472
407
  const finalPath = getIntegrationPath(systemKey);
473
- const splitOptions = await resolveDownloadSplitOptions(finalPath, options);
474
- await processDownloadedSystem(systemKey, manifest, splitOptions);
475
-
476
- if (format === 'json') {
477
- await runConvertToJsonIfRequested(systemKey);
478
- }
479
-
480
- displayDownloadSuccess(systemKey, finalPath, manifest.dataSources.length);
408
+ await processDownloadedSystem(
409
+ systemKey,
410
+ manifest,
411
+ await resolveDownloadSplitOptions(finalPath, options)
412
+ );
413
+ await finalizeDownloadArtifacts({
414
+ systemKey,
415
+ manifest,
416
+ finalPath,
417
+ dataplaneUrl,
418
+ authConfig,
419
+ format
420
+ });
481
421
  } catch (error) {
482
422
  throw new Error(`Failed to download external system: ${error.message}`);
483
423
  }
@@ -16,66 +16,12 @@ const handlebars = require('handlebars');
16
16
  const logger = require('../utils/logger');
17
17
  const { resolveApplicationConfigPath } = require('../utils/app-config-resolver');
18
18
  const { loadConfigFile, writeConfigFile } = require('../utils/config-format');
19
- const { getKvPathSegmentForSecurityKey } = require('../utils/credential-secrets-env');
19
+ const { buildAuthenticationFromMethod } = require('../utils/authentication-shape');
20
20
 
21
21
  // Register Handlebars helper for equality check
22
22
  handlebars.registerHelper('eq', (a, b) => a === b);
23
23
  handlebars.registerHelper('json', (obj) => JSON.stringify(obj));
24
24
 
25
- /**
26
- * Build authentication object per schema authenticationVariablesByMethod.
27
- * Security values use canonical kv://<systemKey>/<segment> paths (segment from getKvPathSegmentForSecurityKey).
28
- * @param {string} systemKey - External system key
29
- * @param {string} authType - Auth method (oauth2, aad, apikey, basic, queryParam, oidc, hmac, none)
30
- * @returns {{ method: string, variables: Object, security: Object }} Authentication object
31
- */
32
- function buildAuthenticationFromMethod(systemKey, authType) {
33
- const kvPath = (securityKey) => {
34
- const segment = getKvPathSegmentForSecurityKey(securityKey);
35
- return segment ? `kv://${systemKey}/${segment}` : null;
36
- };
37
- const method = authType || 'apikey';
38
- const base = 'https://api.example.com';
39
-
40
- const authMap = {
41
- oauth2: {
42
- variables: { baseUrl: base, tokenUrl: `${base}/oauth/token`, authorizationUrl: `${base}/oauth/authorize` },
43
- security: { clientId: kvPath('clientId'), clientSecret: kvPath('clientSecret') }
44
- },
45
- aad: {
46
- variables: { baseUrl: base, tokenUrl: 'https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token', tenantId: '{tenant-id}' },
47
- security: { clientId: kvPath('clientId'), clientSecret: kvPath('clientSecret') }
48
- },
49
- apikey: {
50
- variables: { baseUrl: base, headerName: 'X-API-Key' },
51
- security: { apiKey: kvPath('apiKey') }
52
- },
53
- basic: {
54
- variables: { baseUrl: base },
55
- security: { username: kvPath('username'), password: kvPath('password') }
56
- },
57
- queryParam: {
58
- variables: { baseUrl: base, paramName: 'api_key' },
59
- security: { paramValue: kvPath('paramValue') }
60
- },
61
- oidc: {
62
- variables: { openIdConfigUrl: 'https://example.com/.well-known/openid-configuration', clientId: 'app-id' },
63
- security: {}
64
- },
65
- hmac: {
66
- variables: { baseUrl: base, algorithm: 'sha256', signatureHeader: 'X-Signature' },
67
- security: { signingSecret: kvPath('signingSecret') }
68
- },
69
- none: {
70
- variables: {},
71
- security: {}
72
- }
73
- };
74
-
75
- const auth = authMap[method] || authMap.apikey;
76
- return { method, variables: auth.variables, security: auth.security };
77
- }
78
-
79
25
  /** Target extension for format */
80
26
  const FORMAT_EXT = { yaml: '.yaml', json: '.json' };
81
27
 
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Reuse dataplane auth resolved during sync/upload across verify and test commands.
3
+ *
4
+ * @fileoverview Integration auth context helpers
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { setupIntegrationTestAuth } = require('./test-auth');
12
+ const { getConfig } = require('../core/config');
13
+
14
+ /**
15
+ * @param {Object} options
16
+ * @returns {Object}
17
+ */
18
+ function integrationAuthOptions(options) {
19
+ const base = {
20
+ environment: options.env,
21
+ silentResolve: options.silentResolve === true
22
+ };
23
+ if (options.authConfig && options.dataplaneUrl) {
24
+ return { ...base, authConfig: options.authConfig, dataplaneUrl: options.dataplaneUrl };
25
+ }
26
+ return base;
27
+ }
28
+
29
+ /**
30
+ * @param {string} systemKey
31
+ * @param {Object} options
32
+ * @returns {Promise<{ authConfig: Object, dataplaneUrl: string }>}
33
+ */
34
+ async function resolveIntegrationAuth(systemKey, options) {
35
+ if (options.authConfig && options.dataplaneUrl) {
36
+ return { authConfig: options.authConfig, dataplaneUrl: options.dataplaneUrl };
37
+ }
38
+ const configObj = await getConfig();
39
+ return setupIntegrationTestAuth(systemKey, integrationAuthOptions(options), configObj);
40
+ }
41
+
42
+ module.exports = {
43
+ integrationAuthOptions,
44
+ resolveIntegrationAuth
45
+ };
@@ -26,9 +26,14 @@ const { resolveControllerUrl } = require('../utils/controller-url');
26
26
  * @throws {Error} If authentication fails
27
27
  */
28
28
  async function setupIntegrationTestAuth(appName, options, _config) {
29
+ const opts = options && typeof options === 'object' ? options : {};
30
+ if (opts.authConfig && opts.dataplaneUrl) {
31
+ return { authConfig: opts.authConfig, dataplaneUrl: opts.dataplaneUrl };
32
+ }
33
+
29
34
  const { resolveEnvironment } = require('../core/config');
30
- const environment = (options && options.environment && typeof options.environment === 'string' && options.environment.trim())
31
- ? options.environment.trim()
35
+ const environment = (opts.environment && typeof opts.environment === 'string' && opts.environment.trim())
36
+ ? opts.environment.trim()
32
37
  : await resolveEnvironment();
33
38
  const controllerUrl = await resolveControllerUrl();
34
39
  const authConfig = await getDeploymentAuth(controllerUrl, environment, appName);
@@ -38,10 +43,12 @@ async function setupIntegrationTestAuth(appName, options, _config) {
38
43
  }
39
44
 
40
45
  let dataplaneUrl;
41
- if (options && options.dataplane && typeof options.dataplane === 'string' && options.dataplane.trim()) {
42
- dataplaneUrl = options.dataplane.trim();
46
+ if (opts.dataplane && typeof opts.dataplane === 'string' && opts.dataplane.trim()) {
47
+ dataplaneUrl = opts.dataplane.trim();
43
48
  } else {
44
- dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig);
49
+ dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig, {
50
+ silent: opts.silentResolve === true
51
+ });
45
52
  }
46
53
 
47
54
  return { authConfig, dataplaneUrl };
@@ -7,7 +7,6 @@
7
7
  */
8
8
  /* eslint-disable max-lines,max-lines-per-function,max-statements,complexity,max-depth -- Integration test flow with system-level and per-datasource paths */
9
9
 
10
- const fs = require('fs').promises;
11
10
  const fsSync = require('fs');
12
11
  const path = require('path');
13
12
  const chalk = require('chalk');
@@ -38,6 +37,7 @@ const {
38
37
  } = require('./test-execution');
39
38
  const { runSystemLevelTest } = require('./test-system-level');
40
39
  const { shouldUseSystemLevelIntegrationCall } = require('./integration-test-dispatch');
40
+ const { cliOptsSkipSync } = require('../utils/cli-sync-options');
41
41
 
42
42
  /**
43
43
  * Loads and parses application config file
@@ -68,15 +68,15 @@ async function loadVariablesYamlFile(variablesPath) {
68
68
  }
69
69
 
70
70
  /**
71
- * Loads a single JSON file
71
+ * Loads a single integration config file (JSON, YAML, or YML).
72
72
  * @async
73
- * @function loadJsonFile
74
- * @param {string} filePath - Path to JSON file
73
+ * @function loadIntegrationConfigFile
74
+ * @param {string} filePath - Path to config file
75
75
  * @param {string} fileName - File name for error messages
76
- * @returns {Promise<Object>} Parsed JSON data
77
- * @throws {Error} If file not found or invalid JSON
76
+ * @returns {Promise<Object>} Parsed config object
77
+ * @throws {Error} If file not found or invalid format
78
78
  */
79
- async function loadJsonFile(filePath, fileName) {
79
+ async function loadIntegrationConfigFile(filePath, fileName) {
80
80
  if (!fsSync.existsSync(filePath)) {
81
81
  // Use "System file not found" for system files to match test expectations
82
82
  if (fileName.includes('system') || fileName.includes('deploy')) {
@@ -85,12 +85,8 @@ async function loadJsonFile(filePath, fileName) {
85
85
  throw new Error(`${fileName} not found: ${filePath}`);
86
86
  }
87
87
 
88
- const content = await fs.readFile(filePath, 'utf8');
89
- try {
90
- return JSON.parse(content);
91
- } catch (error) {
92
- throw new Error(`Invalid JSON syntax in ${fileName}: ${error.message}`);
93
- }
88
+ const { loadConfigFile } = require('../utils/config-format');
89
+ return loadConfigFile(filePath);
94
90
  }
95
91
 
96
92
  /**
@@ -120,7 +116,7 @@ async function loadSystemFiles(systemFiles, schemaBasePath, appPath) {
120
116
  const systemJsonFiles = [];
121
117
  for (const systemFile of systemFiles) {
122
118
  const systemPath = resolveFilePath(schemaBasePath, appPath, systemFile);
123
- const systemJson = await loadJsonFile(systemPath, systemFile);
119
+ const systemJson = await loadIntegrationConfigFile(systemPath, systemFile);
124
120
  systemJsonFiles.push({ path: systemPath, data: systemJson });
125
121
  }
126
122
  return systemJsonFiles;
@@ -139,7 +135,7 @@ async function loadDatasourceFiles(datasourceFiles, schemaBasePath, appPath) {
139
135
  const datasourceJsonFiles = [];
140
136
  for (const datasourceFile of datasourceFiles) {
141
137
  const datasourcePath = resolveFilePath(schemaBasePath, appPath, datasourceFile);
142
- const datasourceJson = await loadJsonFile(datasourcePath, datasourceFile);
138
+ const datasourceJson = await loadIntegrationConfigFile(datasourcePath, datasourceFile);
143
139
  datasourceJsonFiles.push({ path: datasourcePath, data: datasourceJson });
144
140
  }
145
141
  return datasourceJsonFiles;
@@ -412,7 +408,8 @@ function determineDatasourcesToTest(datasourceFiles, datasourceFilter) {
412
408
  * @param {string} [options.controller] - Controller URL
413
409
  * @param {boolean} [options.verbose] - Show detailed test output
414
410
  * @param {number} [options.timeout] - Request timeout in milliseconds
415
- * @param {boolean} [options.sync] - When true, run full `aifabrix upload`-equivalent publish before tests
411
+ * @param {boolean} [options.noSync] - When true, skip publish (exercise dataplane config already deployed)
412
+ * @param {boolean} [options.sync] - Legacy explicit sync; ignored when `noSync` / `--no-sync` is set
416
413
  * @returns {Promise<Object>} Integration test results
417
414
  * @throws {Error} If testing fails
418
415
  */
@@ -457,13 +454,11 @@ async function testExternalSystemIntegration(appName, options = {}) {
457
454
 
458
455
  const { systemKey, authConfig, dataplaneUrl, datasourcesToTest, customPayload } = await prepareIntegrationTestEnvironment(appName, options);
459
456
 
460
- if (options.sync === true) {
457
+ if (!cliOptsSkipSync(options)) {
461
458
  logger.log(chalk.cyan('Syncing local config to dataplane…'));
462
459
  const { uploadExternalSystem } = require('../commands/upload');
463
- await uploadExternalSystem(systemKey, {
464
- verbose: !!options.verbose,
465
- minimal: true
466
- });
460
+ const { buildMinimalUploadSyncOptions } = require('../utils/upload-sync-options');
461
+ await uploadExternalSystem(systemKey, buildMinimalUploadSyncOptions(options));
467
462
  logger.log(formatSuccessLine('Sync complete'));
468
463
  }
469
464
 
@@ -267,6 +267,15 @@ function validateBuildFields(build) {
267
267
  if (build.dockerfile && build.dockerfile.trim()) {
268
268
  buildConfig.dockerfile = build.dockerfile;
269
269
  }
270
+ if (build.worker === true) {
271
+ buildConfig.worker = true;
272
+ }
273
+ if (typeof build.imageRunWorker === 'string' && build.imageRunWorker.trim()) {
274
+ buildConfig.imageRunWorker = build.imageRunWorker.trim();
275
+ }
276
+ if (typeof build.imageRunBeat === 'string' && build.imageRunBeat.trim()) {
277
+ buildConfig.imageRunBeat = build.imageRunBeat.trim();
278
+ }
270
279
 
271
280
  return Object.keys(buildConfig).length > 0 ? buildConfig : null;
272
281
  }
@@ -390,6 +399,7 @@ module.exports = {
390
399
  buildOptionalFields,
391
400
  buildManifestStructure,
392
401
  filterConfigurationByRegistryMode,
393
- sanitizeAuthType
402
+ sanitizeAuthType,
403
+ validateBuildFields
394
404
  };
395
405
 
@@ -22,6 +22,22 @@ const { loadVariables, loadRbac } = require('./helpers');
22
22
  * @param {Object} systemJson - System JSON object
23
23
  * @param {Object|null} rbac - RBAC configuration
24
24
  */
25
+ /**
26
+ * Maps legacy integration auth method names to schema 1.3.0 values before upload/deploy.
27
+ * @param {Object} systemJson - System JSON object (mutated in place)
28
+ */
29
+ function normalizeLegacyAuthMethod(systemJson) {
30
+ const { getAuthCredentialTemplate } = require('../utils/authentication-shape');
31
+ const auth = systemJson && systemJson.authentication;
32
+ if (!auth || typeof auth !== 'object') return;
33
+ const credential = getAuthCredentialTemplate(auth);
34
+ if (!credential) return;
35
+ const method = String(credential.method || '').trim().toLowerCase();
36
+ if (method === 'bearerkey') {
37
+ credential.method = 'bearerToken';
38
+ }
39
+ }
40
+
25
41
  function mergeRbacIntoSystemJson(systemJson, rbac) {
26
42
  if (!rbac) {
27
43
  return;
@@ -78,6 +94,7 @@ function extractAppMetadata(variables, appName) {
78
94
  */
79
95
  async function loadSystemWithRbac(appPath, schemaBasePath, systemFile) {
80
96
  const systemJson = await loadSystemFile(appPath, schemaBasePath, systemFile);
97
+ normalizeLegacyAuthMethod(systemJson);
81
98
  const rbacPath = resolveRbacPath(appPath);
82
99
  const rbac = rbacPath ? loadRbac(rbacPath) : null;
83
100
  mergeRbacIntoSystemJson(systemJson, rbac);
@@ -187,6 +204,7 @@ function toDeployJsonShape(manifest) {
187
204
  }
188
205
 
189
206
  module.exports = {
207
+ normalizeLegacyAuthMethod,
190
208
  generateControllerManifest,
191
209
  toDeployJsonShape
192
210
  };
@@ -453,6 +453,8 @@ module.exports = {
453
453
  extractVariablesYaml,
454
454
  extractRbacYaml,
455
455
  parseImageReference,
456
- generateReadmeFromDeployJson
456
+ generateReadmeFromDeployJson,
457
+ mergeEnvTemplateWithExisting,
458
+ buildEnvTemplateExpectedByKey
457
459
  };
458
460
 
@@ -32,34 +32,7 @@ function toKeySegment(str) {
32
32
  return sanitized || 'default';
33
33
  }
34
34
 
35
- /**
36
- * Align authentication.security kv:// namespaces and credentialKey with the final system key.
37
- * Dataplane normalizes this before respond; when appName overrides a spec-derived key (e.g.
38
- * OpenAPI title "Companies"), the builder still must rewrite nested auth so it matches env.template.
39
- *
40
- * @param {Object|null|undefined} authentication - authentication block from dataplane
41
- * @param {string} systemKey - Final external system key (integration app name)
42
- * @param {string} [authDisplayName] - Credential display name (typically title-cased app name)
43
- */
44
- function normalizeAuthenticationToSystemKey(authentication, systemKey, authDisplayName) {
45
- if (!authentication || typeof authentication !== 'object') return;
46
- authentication.credentialKey = `${systemKey}-cred`;
47
- const security = authentication.security;
48
- if (security && typeof security === 'object') {
49
- for (const k of Object.keys(security)) {
50
- const v = security[k];
51
- if (typeof v === 'string' && v.startsWith('kv://')) {
52
- const rest = v.slice(5);
53
- const idx = rest.indexOf('/');
54
- const suffix = idx >= 0 ? rest.slice(idx + 1) : '';
55
- security[k] = suffix ? `kv://${systemKey}/${suffix}` : `kv://${systemKey}`;
56
- }
57
- }
58
- }
59
- if (authDisplayName) {
60
- authentication.displayName = authDisplayName;
61
- }
62
- }
35
+ const { normalizeAuthenticationToSystemKey } = require('../utils/authentication-shape');
63
36
 
64
37
  /**
65
38
  * Generate files from dataplane-generated wizard configurations