@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
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Attach token, path, format, and scoped-resources helpers to config exports.
3
+ *
4
+ * @fileoverview Keeps lib/core/config.js under max-lines
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ /**
12
+ * @param {object} exportsObj - Module exports object to mutate
13
+ * @param {object} deps
14
+ * @param {Function} deps.getConfig
15
+ * @param {Function} deps.saveConfig
16
+ * @param {Function} deps.getSecretsEncryptionKey
17
+ * @param {Function} deps.encryptTokenValue
18
+ * @param {Function} deps.decryptTokenValue
19
+ */
20
+ function attachConfigExtensions(exportsObj, deps) {
21
+ const { getConfig, saveConfig, getSecretsEncryptionKey, encryptTokenValue, decryptTokenValue } = deps;
22
+
23
+ const { createTokenManagementFunctions } = require('../utils/config-tokens');
24
+ Object.assign(
25
+ exportsObj,
26
+ createTokenManagementFunctions({
27
+ getConfigFn: getConfig,
28
+ saveConfigFn: saveConfig,
29
+ getSecretsEncryptionKeyFn: getSecretsEncryptionKey,
30
+ encryptTokenValueFn: encryptTokenValue,
31
+ decryptTokenValueFn: decryptTokenValue,
32
+ isTokenEncryptedFn: require('../utils/token-encryption').isTokenEncrypted
33
+ })
34
+ );
35
+
36
+ const { createPathConfigFunctions } = require('../utils/config-paths');
37
+ Object.assign(exportsObj, createPathConfigFunctions(getConfig, saveConfig));
38
+
39
+ const { createFormatFunctions } = require('../utils/config-format-preference');
40
+ Object.assign(exportsObj, createFormatFunctions(getConfig, saveConfig));
41
+
42
+ const { createScopedResourcesPreferenceFunctions } = require('../utils/config-scoped-resources-preference');
43
+ Object.assign(exportsObj, createScopedResourcesPreferenceFunctions(getConfig, saveConfig));
44
+ }
45
+
46
+ module.exports = { attachConfigExtensions };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Resolves config.yaml directory/file on each access (aligned with paths.getConfigDirForPaths).
3
+ * Split from config.js for max-lines compliance.
4
+ *
5
+ * @fileoverview Dynamic CONFIG_DIR / CONFIG_FILE for lib/core/config.js
6
+ * @author AI Fabrix Team
7
+ * @version 2.0.0
8
+ */
9
+
10
+ 'use strict';
11
+
12
+ const path = require('path');
13
+ const { getAifabrixRuntimeConfigDir } = require('../utils/aifabrix-runtime-config-dir');
14
+
15
+ /**
16
+ * @returns {string}
17
+ */
18
+ function getRuntimeConfigDir() {
19
+ return getAifabrixRuntimeConfigDir();
20
+ }
21
+
22
+ /**
23
+ * @returns {string}
24
+ */
25
+ function getRuntimeConfigFile() {
26
+ return path.join(getRuntimeConfigDir(), 'config.yaml');
27
+ }
28
+
29
+ module.exports = { getRuntimeConfigDir, getRuntimeConfigFile };
@@ -13,31 +13,10 @@ const path = require('path');
13
13
  const yaml = require('js-yaml');
14
14
  const os = require('os');
15
15
  const { encryptToken, decryptToken, isTokenEncrypted } = require('../utils/token-encryption');
16
- // Avoid importing paths here to prevent circular dependency.
17
- // Config location (first match wins):
18
- // 1. AIFABRIX_CONFIG env = full path to config.yaml
19
- // 2. AIFABRIX_HOME env = directory containing config.yaml
20
- // 3. ~/.aifabrix
21
- // Set AIFABRIX_HOME=/workspace/.aifabrix or AIFABRIX_CONFIG=/workspace/.aifabrix/config.yaml when config is not in default home.
22
-
23
- function getConfigDir() {
24
- const configFile = process.env.AIFABRIX_CONFIG && typeof process.env.AIFABRIX_CONFIG === 'string';
25
- if (configFile) {
26
- return path.dirname(path.resolve(process.env.AIFABRIX_CONFIG.trim()));
27
- }
28
- if (process.env.AIFABRIX_HOME && typeof process.env.AIFABRIX_HOME === 'string') {
29
- return path.resolve(process.env.AIFABRIX_HOME.trim());
30
- }
31
- return path.join(os.homedir(), '.aifabrix');
32
- }
33
-
34
- // Runtime config directory and file (respect AIFABRIX_HOME)
35
- const RUNTIME_CONFIG_DIR = getConfigDir();
36
- const RUNTIME_CONFIG_FILE = path.join(RUNTIME_CONFIG_DIR, 'config.yaml');
37
-
38
- // Legacy exports (same as runtime when module loads)
39
- const CONFIG_DIR = RUNTIME_CONFIG_DIR;
40
- const CONFIG_FILE = RUNTIME_CONFIG_FILE;
16
+ const { ensureSecureFilePermissions, ensureSecureDirPermissions } = require('../utils/secure-file-permissions');
17
+ const { getRuntimeConfigDir, getRuntimeConfigFile } = require('./config-runtime-paths');
18
+ // Avoid importing paths.js here to prevent circular dependency; use shared runtime config dir helper.
19
+ // Config location: AIFABRIX_CONFIG dirname → AIFABRIX_HOME (with ~/.aifabrix fallback when config lives there) → ~/.aifabrix
41
20
 
42
21
  // Cache for developer ID - loaded when getConfig() is first called
43
22
  let cachedDeveloperId = null;
@@ -110,8 +89,11 @@ function applyConfigDefaults(config) {
110
89
  if (typeof config.device !== 'object' || config.device === null) {
111
90
  config.device = {};
112
91
  }
92
+ if (typeof config.useEnvironmentScopedResources === 'undefined') {
93
+ config.useEnvironmentScopedResources = false;
94
+ }
113
95
  // Ensure controller field exists (but don't set defaults)
114
- // It will be set by login or auth config commands
96
+ // It will be set by login or auth --set-controller
115
97
  return config;
116
98
  }
117
99
 
@@ -127,13 +109,18 @@ function getDefaultConfig() {
127
109
  controller: undefined,
128
110
  environments: {},
129
111
  device: {},
130
- format: undefined
112
+ format: undefined,
113
+ useEnvironmentScopedResources: false
131
114
  };
132
115
  }
133
116
 
134
117
  async function getConfig() {
135
118
  try {
136
- const configContent = await fs.readFile(RUNTIME_CONFIG_FILE, 'utf8');
119
+ const dir = getRuntimeConfigDir();
120
+ const file = getRuntimeConfigFile();
121
+ ensureSecureDirPermissions(dir);
122
+ ensureSecureFilePermissions(file);
123
+ const configContent = await fs.readFile(file, 'utf8');
137
124
  let config = yaml.load(configContent);
138
125
 
139
126
  // Handle empty file or null/undefined result from yaml.load
@@ -165,20 +152,22 @@ async function getConfig() {
165
152
  */
166
153
  async function saveConfig(data) {
167
154
  try {
155
+ const dir = getRuntimeConfigDir();
156
+ const file = getRuntimeConfigFile();
168
157
  // Create directory if it doesn't exist
169
- await fs.mkdir(RUNTIME_CONFIG_DIR, { recursive: true });
158
+ await fs.mkdir(dir, { recursive: true });
170
159
 
171
160
  // Set secure permissions
172
161
  // Force quotes to ensure numeric-like strings (e.g., "01") remain strings in YAML
173
162
  const configContent = yaml.dump(data, { forceQuotes: true });
174
163
  // Write file first
175
- await fs.writeFile(RUNTIME_CONFIG_FILE, configContent, {
164
+ await fs.writeFile(file, configContent, {
176
165
  mode: 0o600,
177
166
  flag: 'w'
178
167
  });
179
168
  // Open file descriptor and fsync to ensure write is flushed to disk
180
169
  // This is critical on Windows where file writes may be cached
181
- const fd = await fs.open(RUNTIME_CONFIG_FILE, 'r+');
170
+ const fd = await fs.open(file, 'r+');
182
171
  try {
183
172
  await fd.sync();
184
173
  } finally {
@@ -195,7 +184,7 @@ async function saveConfig(data) {
195
184
  */
196
185
  async function clearConfig() {
197
186
  try {
198
- await fs.unlink(RUNTIME_CONFIG_FILE);
187
+ await fs.unlink(getRuntimeConfigFile());
199
188
  } catch (error) {
200
189
  if (error.code !== 'ENOENT') {
201
190
  throw new Error(`Failed to clear config: ${error.message}`);
@@ -233,7 +222,9 @@ async function getDeveloperId() {
233
222
  */
234
223
  async function verifyDeveloperIdSaved(devIdString) {
235
224
  await new Promise(resolve => setTimeout(resolve, 100));
236
- const savedContent = await fs.readFile(RUNTIME_CONFIG_FILE, 'utf8');
225
+ const file = getRuntimeConfigFile();
226
+ ensureSecureFilePermissions(file);
227
+ const savedContent = await fs.readFile(file, 'utf8');
237
228
  const savedConfig = yaml.load(savedContent);
238
229
  const savedDevIdString = String(savedConfig['developer-id']);
239
230
  if (savedDevIdString !== devIdString) {
@@ -258,6 +249,24 @@ async function getCurrentEnvironment() {
258
249
  return config.environment || 'dev';
259
250
  }
260
251
 
252
+ /**
253
+ * Whether infra TLS mode is enabled (`tlsEnabled: true` in config.yaml; e.g. after `up-infra --tls`).
254
+ * @returns {Promise<boolean>}
255
+ */
256
+ async function getTlsEnabled() {
257
+ const cfg = await getConfig();
258
+ return cfg.tlsEnabled === true;
259
+ }
260
+
261
+ /**
262
+ * Whether Traefik is enabled (`traefik: true` in config; infra compose includes the proxy).
263
+ * @returns {Promise<boolean>}
264
+ */
265
+ async function getTraefikEnabled() {
266
+ const cfg = await getConfig();
267
+ return cfg.traefik === true;
268
+ }
269
+
261
270
  /**
262
271
  * Resolve environment from configuration
263
272
  * Uses config.environment, defaults to 'dev'
@@ -427,11 +436,11 @@ async function getSecretsPath() {
427
436
  }
428
437
 
429
438
  async function setSecretsPath(secretsPath) {
430
- if (!secretsPath || typeof secretsPath !== 'string') {
439
+ if (typeof secretsPath !== 'string') {
431
440
  throw new Error('Secrets path is required and must be a string');
432
441
  }
433
442
  const config = await getConfig();
434
- config['aifabrix-secrets'] = secretsPath;
443
+ config['aifabrix-secrets'] = secretsPath.trim() || undefined;
435
444
  await saveConfig(config);
436
445
  }
437
446
 
@@ -444,6 +453,8 @@ const exportsObj = {
444
453
  setDeveloperId,
445
454
  loadDeveloperId,
446
455
  getCurrentEnvironment,
456
+ getTlsEnabled,
457
+ getTraefikEnabled,
447
458
  setCurrentEnvironment,
448
459
  resolveEnvironment,
449
460
  isTokenExpired,
@@ -458,8 +469,12 @@ const exportsObj = {
458
469
  normalizeControllerUrl,
459
470
  setControllerUrl,
460
471
  getControllerUrl,
461
- CONFIG_DIR,
462
- CONFIG_FILE
472
+ get CONFIG_DIR() {
473
+ return getRuntimeConfigDir();
474
+ },
475
+ get CONFIG_FILE() {
476
+ return getRuntimeConfigFile();
477
+ }
463
478
  };
464
479
 
465
480
  // Add developerId as a property getter for direct access
@@ -473,26 +488,12 @@ Object.defineProperty(exportsObj, 'developerId', {
473
488
  configurable: true
474
489
  });
475
490
 
476
- // Token management functions - created after dependencies are defined
477
- const { createTokenManagementFunctions } = require('../utils/config-tokens');
478
- const tokenFunctions = createTokenManagementFunctions({
479
- getConfigFn: getConfig,
480
- saveConfigFn: saveConfig,
481
- getSecretsEncryptionKeyFn: getSecretsEncryptionKey,
482
- encryptTokenValueFn: encryptTokenValue,
483
- decryptTokenValueFn: decryptTokenValue,
484
- isTokenEncryptedFn: require('../utils/token-encryption').isTokenEncrypted
491
+ const { attachConfigExtensions } = require('./config-attach-extensions');
492
+ attachConfigExtensions(exportsObj, {
493
+ getConfig,
494
+ saveConfig,
495
+ getSecretsEncryptionKey,
496
+ encryptTokenValue,
497
+ decryptTokenValue
485
498
  });
486
- Object.assign(exportsObj, tokenFunctions);
487
-
488
- // Path configuration functions - created after getConfig/saveConfig are defined
489
- const { createPathConfigFunctions } = require('../utils/config-paths');
490
- const pathConfigFunctions = createPathConfigFunctions(getConfig, saveConfig);
491
- Object.assign(exportsObj, pathConfigFunctions);
492
-
493
- // Format preference functions
494
- const { createFormatFunctions } = require('../utils/config-format-preference');
495
- const formatFunctions = createFormatFunctions(getConfig, saveConfig);
496
- Object.assign(exportsObj, formatFunctions);
497
-
498
499
  module.exports = exportsObj;
package/lib/core/diff.js CHANGED
@@ -1,3 +1,4 @@
1
+ const { formatSuccessParagraph } = require('../utils/cli-test-layout-chalk');
1
2
  /**
2
3
  * File Comparison Utilities
3
4
  *
@@ -377,7 +378,7 @@ function displayVersionInfo(diffResult) {
377
378
  */
378
379
  function displayBreakingChanges(breakingChanges) {
379
380
  if (breakingChanges.length > 0) {
380
- logger.log(chalk.red('\n⚠️ Breaking Changes:'));
381
+ logger.log(chalk.red('\n Breaking Changes:'));
381
382
  breakingChanges.forEach(change => {
382
383
  logger.log(chalk.red(` • ${change.description}`));
383
384
  });
@@ -445,7 +446,7 @@ function formatDiffOutput(diffResult) {
445
446
  logger.log(chalk.blue(`\nComparing: ${diffResult.file1} ↔ ${diffResult.file2}`));
446
447
 
447
448
  if (diffResult.identical) {
448
- logger.log(chalk.green('\n✓ Files are identical'));
449
+ logger.log(formatSuccessParagraph('Files are identical'));
449
450
  return;
450
451
  }
451
452
 
@@ -12,7 +12,6 @@ const fs = require('fs');
12
12
  const yaml = require('js-yaml');
13
13
  const crypto = require('crypto');
14
14
  const pathsUtil = require('../utils/paths');
15
- const { saveLocalSecret } = require('../utils/local-secrets');
16
15
 
17
16
  const ENCRYPTION_KEY = 'secrets-encryptionKeyVault';
18
17
 
@@ -30,7 +29,7 @@ function readKeyFromFile(filePath) {
30
29
 
31
30
  /**
32
31
  * Ensure secrets encryption key exists. If config already has it, do nothing.
33
- * If key exists in user or project secrets file, set config. Otherwise generate, write to user secrets, set config.
32
+ * If key exists in user or project secrets file, set config. Otherwise generate and store only in config (not in secrets file).
34
33
  * @param {Object} config - Config module (getSecretsEncryptionKey, setSecretsEncryptionKey, getSecretsPath)
35
34
  * @returns {Promise<void>}
36
35
  */
@@ -38,7 +37,7 @@ async function ensureSecretsEncryptionKey(config) {
38
37
  const existing = await config.getSecretsEncryptionKey();
39
38
  if (existing) return;
40
39
 
41
- const userSecretsPath = path.join(pathsUtil.getAifabrixHome(), 'secrets.local.yaml');
40
+ const userSecretsPath = pathsUtil.getPrimaryUserSecretsLocalPath();
42
41
  const projectSecretsPath = await config.getSecretsPath();
43
42
 
44
43
  let key = readKeyFromFile(userSecretsPath);
@@ -49,7 +48,6 @@ async function ensureSecretsEncryptionKey(config) {
49
48
  }
50
49
 
51
50
  const newKey = crypto.randomBytes(32).toString('hex');
52
- await saveLocalSecret(ENCRYPTION_KEY, newKey);
53
51
  await config.setSecretsEncryptionKey(newKey);
54
52
  }
55
53
 
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Infra catalog helpers for secrets-ensure (placeholder context, empty-allowed keys, up-infra key list).
3
+ * @fileoverview Split from secrets-ensure.js for max-lines compliance
4
+ */
5
+ 'use strict';
6
+
7
+ const path = require('path');
8
+ const logger = require('../utils/logger');
9
+ const pathsUtil = require('../utils/paths');
10
+ const { getAllInfraEnsureKeys } = require('../parameters/infra-kv-discovery');
11
+
12
+ /** Shipped infra.parameter.yaml (matches infra-parameter-catalog DEFAULT_CATALOG_PATH). Local join so partial Jest mocks cannot omit DEFAULT_CATALOG_PATH. */
13
+ const BUNDLED_INFRA_PARAMETER_YAML = path.join(__dirname, '..', 'schema', 'infra.parameter.yaml');
14
+
15
+ /**
16
+ * Lazy require so Jest mocks of infra-parameter-catalog apply when this module loads after mocks.
17
+ * @returns {typeof import('../parameters/infra-parameter-catalog')}
18
+ */
19
+ function infraParameterCatalogModule() {
20
+ return require('../parameters/infra-parameter-catalog');
21
+ }
22
+
23
+ /**
24
+ * Merge infra.parameter.yaml defaults with up-infra CLI options for {{placeholder}} expansion.
25
+ * @param {Object} [options]
26
+ * @returns {Record<string, string>}
27
+ */
28
+ function buildInfraPlaceholderContext(options) {
29
+ const cat = infraParameterCatalogModule();
30
+ try {
31
+ return cat.mergeInfraParameterDefaultsForCli(cat.getInfraParameterCatalog().data, options || {});
32
+ } catch {
33
+ return cat.mergeInfraParameterDefaultsForCli({}, options || {});
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Keys that may stay empty without backfill (catalog generator emptyAllowed).
39
+ * @param {string} key - Secret key
40
+ * @returns {boolean}
41
+ */
42
+ function isSecretKeyAllowedEmpty(key) {
43
+ const cat = infraParameterCatalogModule();
44
+ try {
45
+ return cat.getInfraParameterCatalog().isKeyAllowedEmpty(key);
46
+ } catch {
47
+ const emptyAllowed = cat.readRelaxedEmptyAllowedKeySet(BUNDLED_INFRA_PARAMETER_YAML);
48
+ return Boolean(emptyAllowed && emptyAllowed.has(key));
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Infra secret keys for up-infra: catalog (ensureOn upInfra) + workspace DB/template discovery
54
+ * + standard miso-controller multi-DB keys.
55
+ * @returns {string[]}
56
+ */
57
+ function getInfraSecretKeysForUpInfra() {
58
+ const cat = infraParameterCatalogModule();
59
+ try {
60
+ const catalog = cat.getInfraParameterCatalog();
61
+ return getAllInfraEnsureKeys(catalog, pathsUtil);
62
+ } catch (err) {
63
+ logger.warn(`Could not build infra secret key list from catalog (${err.message}); using relaxed YAML read.`);
64
+ const relaxed = cat.readRelaxedUpInfraEnsureKeyList(BUNDLED_INFRA_PARAMETER_YAML);
65
+ if (relaxed && relaxed.length > 0) {
66
+ return relaxed;
67
+ }
68
+ logger.warn('Relaxed read of infra.parameter.yaml produced no keys; up-infra may skip secret backfill.');
69
+ return [];
70
+ }
71
+ }
72
+
73
+ module.exports = {
74
+ buildInfraPlaceholderContext,
75
+ isSecretKeyAllowedEmpty,
76
+ getInfraSecretKeysForUpInfra
77
+ };