@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
@@ -11,33 +11,85 @@ const config = require('../core/config');
11
11
  const { getCertDir } = require('./dev-cert-helper');
12
12
  const { getConfigDirForPaths } = require('./paths');
13
13
 
14
+ function devTlsCertPaths(certDir) {
15
+ return {
16
+ certPath: path.join(certDir, 'cert.pem'),
17
+ keyPath: path.join(certDir, 'key.pem'),
18
+ caPath: path.join(certDir, 'ca.pem')
19
+ };
20
+ }
21
+
22
+ function missingClientTlsError(trimmed, certDir) {
23
+ return new Error(
24
+ `docker-endpoint is set (${trimmed}) but client TLS material is missing in ${certDir}. ` +
25
+ 'Place cert.pem and key.pem there (from Builder Server issue-cert or `AIFABRIX_DEV_ISSUE_PIN`), ' +
26
+ 'or enable TLS skip-verify (`docker-tls-skip-verify: true` or `AIFABRIX_DOCKER_TLS_SKIP_VERIFY=1`) ' +
27
+ 'if the daemon does not require client certificates. With skip-verify and no ca.pem, DOCKER_TLS_VERIFY=0. ' +
28
+ 'Clear docker-endpoint only if you intend to use the local Docker daemon.'
29
+ );
30
+ }
31
+
32
+ function missingCaError(trimmed, certDir) {
33
+ return new Error(
34
+ `docker-endpoint is set (${trimmed}) but ca.pem is missing in ${certDir} and docker-tls-skip-verify is not enabled. ` +
35
+ 'Add ca.pem (daemon/CA PEM), or for a self-signed Docker API set docker-tls-skip-verify: true in ~/.aifabrix/config.yaml ' +
36
+ '(or AIFABRIX_DOCKER_TLS_SKIP_VERIFY=1). Skip-verify uses TLS but does not verify the daemon certificate — use only on trusted networks.'
37
+ );
38
+ }
39
+
14
40
  /**
15
- * If remote Docker is configured (docker-endpoint + cert.pem, key.pem, and ca.pem present),
16
- * returns env vars for Docker CLI: DOCKER_HOST, DOCKER_TLS_VERIFY, DOCKER_CERT_PATH.
17
- * Docker requires ca.pem in DOCKER_CERT_PATH for TLS; if it is missing we return {} so
18
- * the CLI uses local Docker and avoids "open ca.pem: no such file or directory".
41
+ * If remote Docker is configured (docker-endpoint set), returns env vars for Docker CLI:
42
+ * DOCKER_HOST, DOCKER_TLS_VERIFY, and optionally DOCKER_CERT_PATH when client certs exist.
43
+ * When docker-endpoint is set, we do not fall back to the local daemon without that endpoint
44
+ * (avoids accidentally using Docker Desktop while the dev profile targets a remote engine).
45
+ *
46
+ * When **TLS skip-verify** is enabled (config or env) and **ca.pem is missing**, client cert/key are
47
+ * optional: Docker can use DOCKER_TLS_VERIFY=0 with no client certs if the daemon allows it.
48
+ * If **ca.pem is present** (e.g. from Builder Server issue-cert), the daemon certificate is always
49
+ * verified (DOCKER_TLS_VERIFY=1) even when skip-verify is set — better security once a trust anchor exists.
19
50
  *
20
- * @returns {Promise<Object>} Env overlay (may be empty)
51
+ * Without skip-verify, cert.pem, key.pem, and ca.pem are required in the dev cert directory.
52
+ *
53
+ * @returns {Promise<Object>} Env overlay (empty when docker-endpoint is not set)
54
+ * @throws {Error} When docker-endpoint is set but required TLS material is missing
21
55
  */
22
56
  async function getRemoteDockerEnv() {
23
57
  const endpoint = await config.getDockerEndpoint();
24
58
  if (!endpoint || typeof endpoint !== 'string' || !endpoint.trim()) {
25
59
  return {};
26
60
  }
27
- const devId = await config.getDeveloperId();
28
- const certDir = getCertDir(getConfigDirForPaths(), devId);
29
- const certPath = path.join(certDir, 'cert.pem');
30
- const keyPath = path.join(certDir, 'key.pem');
31
- const caPath = path.join(certDir, 'ca.pem');
61
+ const trimmed = endpoint.trim();
62
+ const certDir = getCertDir(getConfigDirForPaths(), await config.getDeveloperId());
63
+ const { certPath, keyPath, caPath } = devTlsCertPaths(certDir);
32
64
  const fs = require('fs');
33
- if (!fs.existsSync(certPath) || !fs.existsSync(keyPath) || !fs.existsSync(caPath)) {
34
- return {};
65
+ const skipVerify = await config.getDockerTlsSkipVerify();
66
+ const hasClient = fs.existsSync(certPath) && fs.existsSync(keyPath);
67
+ const hasCa = fs.existsSync(caPath);
68
+
69
+ if (!hasClient) {
70
+ if (!skipVerify) throw missingClientTlsError(trimmed, certDir);
71
+ return { DOCKER_HOST: trimmed, DOCKER_TLS_VERIFY: '0' };
35
72
  }
73
+ if (!hasCa && !skipVerify) throw missingCaError(trimmed, certDir);
74
+ const verifyDaemon = hasCa;
36
75
  return {
37
- DOCKER_HOST: endpoint.trim(),
38
- DOCKER_TLS_VERIFY: '1',
76
+ DOCKER_HOST: trimmed,
77
+ DOCKER_TLS_VERIFY: verifyDaemon ? '1' : '0',
39
78
  DOCKER_CERT_PATH: certDir
40
79
  };
41
80
  }
42
81
 
43
- module.exports = { getRemoteDockerEnv };
82
+ /**
83
+ * Full environment for child_process exec/spawn: process.env merged with remote Docker vars when configured.
84
+ * @returns {Promise<Object>}
85
+ */
86
+ async function getDockerExecEnv() {
87
+ const overlay = await getRemoteDockerEnv();
88
+ const merged = { ...process.env };
89
+ if (overlay.DOCKER_HOST && !Object.prototype.hasOwnProperty.call(overlay, 'DOCKER_CERT_PATH')) {
90
+ delete merged.DOCKER_CERT_PATH;
91
+ }
92
+ return { ...merged, ...overlay };
93
+ }
94
+
95
+ module.exports = { getRemoteDockerEnv, getDockerExecEnv };
@@ -14,16 +14,25 @@ const config = require('../core/config');
14
14
  * @returns {Promise<Object|null>} Key-value secrets from API or null
15
15
  */
16
16
  async function loadRemoteSharedSecrets() {
17
- const { isRemoteSecretsUrl, getRemoteDevAuth } = require('./remote-dev-auth');
17
+ const remoteDevAuth = require('./remote-dev-auth');
18
18
  const devApi = require('../api/dev.api');
19
19
  const configSecretsPath = await config.getSecretsPath();
20
- if (!configSecretsPath || !isRemoteSecretsUrl(configSecretsPath)) {
20
+ if (!configSecretsPath) {
21
21
  return null;
22
22
  }
23
- const auth = await getRemoteDevAuth();
23
+ const endpoint = await remoteDevAuth.resolveSharedSecretsEndpoint(configSecretsPath);
24
+ if (!remoteDevAuth.isRemoteSecretsUrl(endpoint)) {
25
+ return null;
26
+ }
27
+ const auth = await remoteDevAuth.getRemoteDevAuth();
24
28
  if (!auth) return null;
25
29
  try {
26
- const items = await devApi.listSecrets(auth.serverUrl, auth.clientCertPem);
30
+ const items = await devApi.listSecrets(
31
+ auth.serverUrl,
32
+ auth.clientCertPem,
33
+ auth.serverCaPem || undefined,
34
+ endpoint
35
+ );
27
36
  if (!Array.isArray(items)) return null;
28
37
  const obj = {};
29
38
  for (const item of items) {
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Resolve Docker repository path and tag from application config and optional CLI overrides.
3
+ * Precedence: --image (full ref), --registry CLI, image.registry in manifest, else unqualified name.
4
+ *
5
+ * For refs like localhost:5000/repo without an explicit tag, prefer --image with :tag (parse ambiguity).
6
+ *
7
+ * @fileoverview Shared Docker image reference resolution for run, compose, and version checks
8
+ * @author AI Fabrix Team
9
+ * @version 2.0.0
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ const { parseImageOverride } = require('./parse-image-ref');
15
+
16
+ /**
17
+ * Repository path without host (same rules as compose-generator getImageName).
18
+ * @param {Object} appConfig - Application configuration
19
+ * @param {string} appName - Application name fallback
20
+ * @returns {string}
21
+ */
22
+ function getRepositoryPathFromConfig(appConfig, appName) {
23
+ if (!appConfig || typeof appConfig !== 'object') {
24
+ return appName;
25
+ }
26
+ if (typeof appConfig.image === 'string') {
27
+ return appConfig.image.split(':')[0];
28
+ }
29
+ if (appConfig.image?.name) {
30
+ return appConfig.image.name;
31
+ }
32
+ if (appConfig.app?.key) {
33
+ return appConfig.app.key;
34
+ }
35
+ return appName;
36
+ }
37
+
38
+ /**
39
+ * @param {Object} [appConfig]
40
+ * @returns {string}
41
+ */
42
+ function imageTagFromConfig(appConfig) {
43
+ return (appConfig && appConfig.image && appConfig.image.tag) || 'latest';
44
+ }
45
+
46
+ /**
47
+ * Trim and strip trailing slashes from a registry host/prefix. Empty/whitespace → ''.
48
+ * @param {string|undefined|null|number} registry - Registry host or prefix
49
+ * @returns {string}
50
+ */
51
+ function normalizeDockerRegistryPrefix(registry) {
52
+ if (registry === null || registry === undefined) {
53
+ return '';
54
+ }
55
+ if (typeof registry !== 'string') {
56
+ return normalizeDockerRegistryPrefix(String(registry));
57
+ }
58
+ const t = registry.trim();
59
+ if (!t) {
60
+ return '';
61
+ }
62
+ return t.replace(/\/+$/, '');
63
+ }
64
+
65
+ /**
66
+ * Effective image repository (may include registry prefix) and tag for Docker.
67
+ * @param {string} appName - Application name
68
+ * @param {Object} appConfig - Loaded application manifest
69
+ * @param {Object} [runOptions] - Run/deploy options
70
+ * @param {string} [runOptions.image] - Full image ref override
71
+ * @param {string} [runOptions.registry] - CLI registry prefix (wins over manifest)
72
+ * @returns {{ imageName: string, imageTag: string }}
73
+ */
74
+ function resolveDockerImageRef(appName, appConfig, runOptions = {}) {
75
+ const opts = runOptions || {};
76
+ if (opts.image) {
77
+ const parsed = parseImageOverride(opts.image);
78
+ return {
79
+ imageName: parsed ? parsed.name : getRepositoryPathFromConfig(appConfig, appName),
80
+ imageTag: parsed ? parsed.tag : imageTagFromConfig(appConfig)
81
+ };
82
+ }
83
+
84
+ const baseRepo = getRepositoryPathFromConfig(appConfig, appName);
85
+ const imageTag = imageTagFromConfig(appConfig);
86
+ const prefix =
87
+ normalizeDockerRegistryPrefix(opts.registry) ||
88
+ normalizeDockerRegistryPrefix(appConfig?.image?.registry ?? '');
89
+ if (prefix) {
90
+ return { imageName: `${prefix}/${baseRepo}`, imageTag };
91
+ }
92
+ return { imageName: baseRepo, imageTag };
93
+ }
94
+
95
+ /**
96
+ * Full image string for compose when manifest/CLI registry applies; else null (use template defaults).
97
+ * @param {string} appName - Application name
98
+ * @param {Object} appConfig - Application configuration
99
+ * @param {Object} [options] - Run options (image, imageOverride, tag, registry)
100
+ * @returns {string|null}
101
+ */
102
+ function resolveComposeImageOverrideString(appName, appConfig, options = {}) {
103
+ if (options.image) return options.image;
104
+ if (options.imageOverride) return options.imageOverride;
105
+ const runOpts = { registry: options.registry, image: undefined };
106
+ if (options.tag) {
107
+ const { imageName } = resolveDockerImageRef(appName, appConfig, runOpts);
108
+ return `${imageName}:${options.tag}`;
109
+ }
110
+ const { imageName, imageTag } = resolveDockerImageRef(appName, appConfig, runOpts);
111
+ const shortName = getRepositoryPathFromConfig(appConfig, appName);
112
+ const shortTag = imageTagFromConfig(appConfig);
113
+ if (imageName === shortName && imageTag === shortTag) {
114
+ return null;
115
+ }
116
+ return `${imageName}:${imageTag}`;
117
+ }
118
+
119
+ module.exports = {
120
+ resolveDockerImageRef,
121
+ resolveComposeImageOverrideString,
122
+ normalizeDockerRegistryPrefix,
123
+ getRepositoryPathFromConfig
124
+ };
@@ -9,9 +9,10 @@
9
9
  * @version 2.0.0
10
10
  */
11
11
 
12
- const fs = require('fs');
12
+ const fsRealSync = require('../internal/fs-real-sync');
13
13
  const path = require('path');
14
14
  const Ajv = require('ajv');
15
+ const addFormats = require('ajv-formats');
15
16
 
16
17
  // Cache for compiled validators
17
18
  // These are reset when module is reloaded (for testing)
@@ -46,11 +47,14 @@ function loadExternalSystemSchema() {
46
47
 
47
48
  const schemaPath = path.join(__dirname, '..', 'schema', 'external-system.schema.json');
48
49
 
49
- if (!fs.existsSync(schemaPath)) {
50
- throw new Error(`External system schema not found: ${schemaPath}`);
50
+ if (!fsRealSync.existsSync(schemaPath)) {
51
+ throw new Error(
52
+ `External system schema not found: ${schemaPath}. ` +
53
+ 'Ensure the file exists (tracked under lib/schema/); run git checkout HEAD -- lib/schema/external-system.schema.json if your tree is incomplete.'
54
+ );
51
55
  }
52
56
 
53
- const schemaContent = fs.readFileSync(schemaPath, 'utf8');
57
+ const schemaContent = fsRealSync.readFileSync(schemaPath, 'utf8');
54
58
  let schema;
55
59
 
56
60
  try {
@@ -60,6 +64,7 @@ function loadExternalSystemSchema() {
60
64
  }
61
65
 
62
66
  const ajv = new Ajv({ allErrors: true, strict: false });
67
+ addFormats(ajv);
63
68
  externalSystemValidator = ajv.compile(schema);
64
69
 
65
70
  return externalSystemValidator;
@@ -84,11 +89,14 @@ function loadExternalDataSourceSchema() {
84
89
 
85
90
  const schemaPath = path.join(__dirname, '..', 'schema', 'external-datasource.schema.json');
86
91
 
87
- if (!fs.existsSync(schemaPath)) {
88
- throw new Error(`External datasource schema not found: ${schemaPath}`);
92
+ if (!fsRealSync.existsSync(schemaPath)) {
93
+ throw new Error(
94
+ `External datasource schema not found: ${schemaPath}. ` +
95
+ 'Ensure the file exists (tracked under lib/schema/); run git checkout HEAD -- lib/schema/external-datasource.schema.json if your tree is incomplete.'
96
+ );
89
97
  }
90
98
 
91
- const schemaContent = fs.readFileSync(schemaPath, 'utf8');
99
+ const schemaContent = fsRealSync.readFileSync(schemaPath, 'utf8');
92
100
  let schema;
93
101
 
94
102
  try {
@@ -106,6 +114,11 @@ function loadExternalDataSourceSchema() {
106
114
  }
107
115
 
108
116
  const ajv = new Ajv({ allErrors: true, strict: false, strictSchema: false });
117
+ addFormats(ajv);
118
+ // external-datasource.schema.json references these by $id (aifabrix://schema/type/*)
119
+ ajv.addSchema(require('../schema/type/document-storage.json'));
120
+ ajv.addSchema(require('../schema/type/message-service.json'));
121
+ ajv.addSchema(require('../schema/type/vector-store.json'));
109
122
  externalDataSourceValidator = ajv.compile(schemaToCompile);
110
123
 
111
124
  return externalDataSourceValidator;
@@ -250,10 +263,10 @@ function readAndParseFileContent(filePath, content) {
250
263
  let fileContent = content;
251
264
 
252
265
  if (!fileContent) {
253
- if (!fs.existsSync(filePath)) {
266
+ if (!fsRealSync.existsSync(filePath)) {
254
267
  throw new Error(`File not found: ${filePath}`);
255
268
  }
256
- fileContent = fs.readFileSync(filePath, 'utf8');
269
+ fileContent = fsRealSync.readFileSync(filePath, 'utf8');
257
270
  }
258
271
 
259
272
  try {
@@ -0,0 +1,25 @@
1
+ /**
2
+ * kv://BASH_<NAME> fallback: use process.env.<NAME>, then process.env.BASH_<NAME> (shared BASH_ keys).
3
+ * @fileoverview
4
+ */
5
+ 'use strict';
6
+
7
+ /**
8
+ * @param {string} pathStr - Flat kv path (no slashes)
9
+ * @returns {string|undefined}
10
+ */
11
+ function resolveBashKvFromProcessEnv(pathStr) {
12
+ if (!pathStr || typeof pathStr !== 'string' || pathStr.includes('/')) return undefined;
13
+ if (!pathStr.startsWith('BASH_')) return undefined;
14
+ const suffix = pathStr.slice(5);
15
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(suffix)) return undefined;
16
+ const pick = k => {
17
+ const raw = process.env[k];
18
+ if (raw === undefined || raw === null) return undefined;
19
+ const t = String(raw).trim();
20
+ return t.length > 0 ? t : undefined;
21
+ };
22
+ return pick(suffix) ?? pick(pathStr);
23
+ }
24
+
25
+ module.exports = { resolveBashKvFromProcessEnv };