@aifabrix/builder 2.49.2 → 2.51.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 (459) hide show
  1. package/.cursor/plans/157.1-security-quality-violations-by-type.csv +374 -0
  2. package/.cursor/rules/assistant-driven-integration-build.mdc +40 -0
  3. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  4. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  5. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  6. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  7. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  8. package/.cursor/skills/README.md +1 -0
  9. package/.dockerignore +52 -0
  10. package/.eslintignore +22 -0
  11. package/README.md +2 -0
  12. package/bin/builder-api-cleanup.js +26 -0
  13. package/bin/builder-api-nest.js +10 -0
  14. package/bin/builder-api-spike.js +19 -0
  15. package/enterprise-knowledge/README.md +50 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  20. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  21. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  22. package/integration/README.md +81 -0
  23. package/integration/github/README.md +53 -0
  24. package/integration/github/application.json +21 -0
  25. package/integration/github/deploy.js +72 -0
  26. package/integration/github/env.template +11 -0
  27. package/integration/github/github-datasource-issue-comments.json +239 -0
  28. package/integration/github/github-datasource-issues.json +399 -0
  29. package/integration/github/github-datasource-repository.json +354 -0
  30. package/integration/github/github-deploy.json +1202 -0
  31. package/integration/github/github-system.json +82 -0
  32. package/integration/hubspot-test/README.md +1 -1
  33. package/integration/hubspot-test/create-hubspot.js +1 -16
  34. package/jest.isolated-projects.js +31 -1
  35. package/jest.projects.js +87 -1
  36. package/lib/api/dev-server-https.js +1 -1
  37. package/lib/api/enterprise-knowledge.api.js +63 -0
  38. package/lib/api/evidence-kinds.api.js +128 -0
  39. package/lib/api/evidence.api.js +172 -0
  40. package/lib/api/external-systems.api.js +8 -2
  41. package/lib/api/pipeline.api.js +5 -1
  42. package/lib/api/resource-types.api.js +5 -4
  43. package/lib/api/roles.api.js +121 -0
  44. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  45. package/lib/api/types/evidence-kinds.types.js +42 -0
  46. package/lib/api/types/evidence.types.js +67 -0
  47. package/lib/api/types/resource-types.types.js +2 -0
  48. package/lib/api/types/roles.types.js +36 -0
  49. package/lib/app/certification-verify-rows.js +1 -1
  50. package/lib/app/controller-application-filter.js +36 -0
  51. package/lib/app/deploy.js +1 -1
  52. package/lib/app/list-external-systems.js +130 -0
  53. package/lib/app/list.js +20 -8
  54. package/lib/app/run.js +3 -1
  55. package/lib/app/show-display.js +8 -3
  56. package/lib/app/show-online.js +178 -0
  57. package/lib/app/show.js +39 -90
  58. package/lib/build/builder-api-docker-staging.js +47 -0
  59. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  60. package/lib/build/standard-docker-build.js +2 -0
  61. package/lib/certification/merge-certification-from-artifact.js +1 -1
  62. package/lib/certification/post-unified-cert-sync.js +4 -31
  63. package/lib/certification/sync-after-external-command.js +0 -1
  64. package/lib/certification/sync-system-certification.js +0 -3
  65. package/lib/channels/add-channel.js +40 -34
  66. package/lib/channels/approval-guides/chatgpt.js +33 -0
  67. package/lib/channels/approval-guides/credential-portal.js +38 -0
  68. package/lib/channels/approval-guides/index.js +110 -0
  69. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  70. package/lib/channels/approval-guides/slack.js +34 -0
  71. package/lib/channels/approval-guides/teams-bot.js +35 -0
  72. package/lib/channels/approval-guides/web-embed.js +32 -0
  73. package/lib/channels/channel-approval-guide.js +11 -0
  74. package/lib/channels/channel-artifact-generator.js +18 -5
  75. package/lib/channels/channel-audit.js +3 -0
  76. package/lib/channels/channel-auth-context.js +1 -1
  77. package/lib/channels/channel-description.js +59 -0
  78. package/lib/channels/channel-integration-generator.js +13 -230
  79. package/lib/channels/channel-integration-template.js +94 -0
  80. package/lib/channels/channel-runtime-resolver.js +43 -3
  81. package/lib/channels/channel-status-display.js +66 -26
  82. package/lib/channels/channel-targets.js +3 -3
  83. package/lib/cli/index.js +31 -3
  84. package/lib/cli/infra-guided.js +5 -1
  85. package/lib/cli/setup-app-external-create.js +111 -0
  86. package/lib/cli/setup-app.help.js +1 -1
  87. package/lib/cli/setup-app.js +60 -130
  88. package/lib/cli/setup-app.test-commands.js +26 -52
  89. package/lib/cli/setup-certification-commands.js +4 -4
  90. package/lib/cli/setup-certification.help.js +9 -9
  91. package/lib/cli/setup-dev.js +30 -9
  92. package/lib/cli/setup-external-system-help.js +4 -6
  93. package/lib/cli/setup-external-system.js +58 -52
  94. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  95. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  96. package/lib/cli/setup-infra.js +15 -0
  97. package/lib/cli/setup-list.js +43 -0
  98. package/lib/cli/setup-utility-help-after.js +12 -0
  99. package/lib/cli/setup-utility-repair.js +26 -7
  100. package/lib/cli/setup-utility-validate.js +41 -2
  101. package/lib/cli/setup-utility.js +5 -3
  102. package/lib/commands/app.js +15 -43
  103. package/lib/commands/channel-add-setup.js +110 -0
  104. package/lib/commands/channel.js +42 -8
  105. package/lib/commands/datasource-sync-display.js +96 -0
  106. package/lib/commands/datasource-sync-policy.js +210 -0
  107. package/lib/commands/datasource-test-trust-cli.js +6 -6
  108. package/lib/commands/datasource-unified-test-cli.js +2 -1
  109. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  110. package/lib/commands/deploy-gate-failure-details.js +184 -0
  111. package/lib/commands/deploy-gate-orchestrator.js +368 -0
  112. package/lib/commands/dev-cli-handlers.js +7 -62
  113. package/lib/commands/dev-host-ops-params.js +91 -0
  114. package/lib/commands/dev-host-ops-poll.js +111 -0
  115. package/lib/commands/dev-host-ops.js +107 -94
  116. package/lib/commands/dev-init.js +6 -106
  117. package/lib/commands/dev-refresh.js +197 -0
  118. package/lib/commands/enterprise-knowledge.js +284 -0
  119. package/lib/commands/evidence-cli-leaves.js +250 -0
  120. package/lib/commands/evidence-kind.js +428 -0
  121. package/lib/commands/evidence.js +51 -0
  122. package/lib/commands/governance-cli-shared.js +2 -2
  123. package/lib/commands/governance-command-action.js +5 -3
  124. package/lib/commands/governance-fixture-subjects.js +85 -0
  125. package/lib/commands/governance.js +1 -1
  126. package/lib/commands/lifecycle-command-action.js +2 -2
  127. package/lib/commands/lifecycle-external.js +3 -3
  128. package/lib/commands/manifest-cli-auth.js +29 -0
  129. package/lib/commands/manifest-cli-commands.js +170 -0
  130. package/lib/commands/manifest-cli-integration-path.js +63 -0
  131. package/lib/commands/manifest.js +21 -0
  132. package/lib/commands/protection-cli-leaves.js +3 -3
  133. package/lib/commands/repair-auth-apply.js +15 -1
  134. package/lib/commands/repair-authentications-454.js +169 -0
  135. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  136. package/lib/commands/repair-datasource-apply.js +135 -0
  137. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  138. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  139. package/lib/commands/repair-datasource-operation-security.js +180 -0
  140. package/lib/commands/repair-datasource-run.js +7 -2
  141. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  142. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  143. package/lib/commands/repair-datasource.js +12 -68
  144. package/lib/commands/repair-env-template.js +11 -1
  145. package/lib/commands/repair-external-run.js +121 -31
  146. package/lib/commands/repair-internal.js +1 -1
  147. package/lib/commands/repair-openapi-export.js +156 -0
  148. package/lib/commands/repair-openapi-sync.js +33 -8
  149. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  150. package/lib/commands/repair-persist.js +22 -1
  151. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  152. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  153. package/lib/commands/repair-rbac.js +163 -86
  154. package/lib/commands/repair-steps.js +83 -18
  155. package/lib/commands/repair-system-permissions.js +1 -0
  156. package/lib/commands/repair.js +1 -1
  157. package/lib/commands/resource-type.js +166 -44
  158. package/lib/commands/role.js +452 -0
  159. package/lib/commands/run-post-publish-data-sync.js +68 -0
  160. package/lib/commands/setup-modes.js +1 -1
  161. package/lib/commands/setup.js +1 -1
  162. package/lib/commands/test-e2e-external.js +21 -8
  163. package/lib/commands/test-governance-cli-options.js +2 -2
  164. package/lib/commands/test-trust-cli-options.js +2 -2
  165. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  166. package/lib/commands/up-builder-api-provision.js +241 -0
  167. package/lib/commands/up-builder-api.js +88 -0
  168. package/lib/commands/up-common.js +25 -1
  169. package/lib/commands/upload-credential-push-log.js +117 -0
  170. package/lib/commands/upload-data-sync-finalize.js +60 -0
  171. package/lib/commands/upload-probe.js +66 -0
  172. package/lib/commands/upload-publish-context.js +4 -1
  173. package/lib/commands/upload-sidecar-followups.js +55 -27
  174. package/lib/commands/upload.js +116 -157
  175. package/lib/commands/validate-json.js +230 -0
  176. package/lib/commands/verify-governance-combined-external.js +1 -1
  177. package/lib/commands/verify-governance-db.js +2 -2
  178. package/lib/commands/verify-operations-command-action.js +2 -2
  179. package/lib/commands/verify-operations-step-plan.js +79 -41
  180. package/lib/commands/verify-operations-steps.js +2 -2
  181. package/lib/commands/verify-trust-command-action.js +1 -1
  182. package/lib/commands/wizard-core.js +1 -1
  183. package/lib/commands/wizard-headless.js +2 -1
  184. package/lib/core/admin-secrets.js +2 -6
  185. package/lib/core/audit-logger.js +1 -1
  186. package/lib/core/secrets-env-content.js +10 -4
  187. package/lib/core/secrets-env-write.js +2 -13
  188. package/lib/core/secrets-load.js +1 -3
  189. package/lib/datasource/agent-trust-run.js +3 -3
  190. package/lib/datasource/capability/relate-operations.js +1 -1
  191. package/lib/datasource/deploy.js +3 -1
  192. package/lib/datasource/test-e2e.js +6 -1
  193. package/lib/datasource/unified-validation-run-body.js +4 -1
  194. package/lib/datasource/unified-validation-run.js +1 -1
  195. package/lib/deployment/deploy-poll-ui.js +73 -12
  196. package/lib/deployment/deployer-poll-run.js +113 -0
  197. package/lib/deployment/deployer.js +17 -87
  198. package/lib/evidence/dataplane-context.js +21 -0
  199. package/lib/evidence/evidence-display.js +78 -0
  200. package/lib/evidence/evidence-service.js +392 -0
  201. package/lib/external-system/deploy.js +290 -112
  202. package/lib/external-system/download.js +7 -3
  203. package/lib/external-system/test-execution.js +1 -1
  204. package/lib/external-system/test-system-level.js +8 -10
  205. package/lib/external-system/test.js +12 -6
  206. package/lib/generator/deploy-script.js +73 -0
  207. package/lib/generator/external.js +2 -1
  208. package/lib/generator/helpers.js +13 -5
  209. package/lib/generator/index.js +17 -2
  210. package/lib/generator/split-variables.js +9 -3
  211. package/lib/generator/wizard.js +3 -36
  212. package/lib/infrastructure/helpers-docker-check.js +6 -0
  213. package/lib/infrastructure/helpers.js +1 -1
  214. package/lib/internal/fs-real-sync.js +22 -1
  215. package/lib/internal/node-fs.js +2 -0
  216. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  217. package/lib/lifecycle/verify-step-progress.js +1 -1
  218. package/lib/programmatic/access-log.js +26 -0
  219. package/lib/programmatic/auth-config.js +45 -0
  220. package/lib/programmatic/bearer-auth.js +176 -0
  221. package/lib/programmatic/builder-api-request.js +175 -0
  222. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  223. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  224. package/lib/programmatic/builder-api-server.js +230 -0
  225. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  226. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  227. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  228. package/lib/programmatic/builder-help-envelope.js +36 -0
  229. package/lib/programmatic/builder-help-fixtures.js +200 -0
  230. package/lib/programmatic/builder-help-governance.js +172 -0
  231. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  232. package/lib/programmatic/builder-help.js +361 -0
  233. package/lib/programmatic/capability-registry.js +77 -0
  234. package/lib/programmatic/command-options.js +32 -0
  235. package/lib/programmatic/enterprise-mcp-client.js +114 -0
  236. package/lib/programmatic/http-problem-details.js +99 -0
  237. package/lib/programmatic/http-route-match.js +40 -0
  238. package/lib/programmatic/idempotency-cache.js +69 -0
  239. package/lib/programmatic/index.js +53 -0
  240. package/lib/programmatic/integration-path-scope.js +39 -0
  241. package/lib/programmatic/log-redaction.js +66 -0
  242. package/lib/programmatic/manifest-get-section.js +146 -0
  243. package/lib/programmatic/manifest-patch-section.js +252 -0
  244. package/lib/programmatic/manifest-repair.js +122 -0
  245. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  246. package/lib/programmatic/manifest-section-io.js +225 -0
  247. package/lib/programmatic/manifest-section-quality.js +171 -0
  248. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  249. package/lib/programmatic/manifest-section-registry.js +222 -0
  250. package/lib/programmatic/nest-http-bridge.js +34 -0
  251. package/lib/programmatic/openapi-component-schemas.js +68 -0
  252. package/lib/programmatic/openapi-description-enricher.js +117 -0
  253. package/lib/programmatic/openapi-descriptions.js +190 -0
  254. package/lib/programmatic/openapi-docs-serving.js +123 -0
  255. package/lib/programmatic/openapi-help-schemas.js +63 -0
  256. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  257. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  258. package/lib/programmatic/openapi-request-schemas.js +155 -0
  259. package/lib/programmatic/openapi-result-schemas.js +493 -0
  260. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  261. package/lib/programmatic/openapi-schema-descriptions-core.js +162 -0
  262. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  263. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  264. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  265. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  266. package/lib/programmatic/openapi-schema-helpers.js +108 -0
  267. package/lib/programmatic/openapi-spec.js +203 -0
  268. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  269. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  270. package/lib/programmatic/request-timeout.js +53 -0
  271. package/lib/programmatic/route-handler-map.js +143 -0
  272. package/lib/programmatic/route-handlers-context.js +29 -0
  273. package/lib/programmatic/route-handlers.js +33 -0
  274. package/lib/programmatic/run-certify.js +57 -0
  275. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  276. package/lib/programmatic/run-lifecycle.js +29 -0
  277. package/lib/programmatic/run-repair.js +41 -0
  278. package/lib/programmatic/run-repository-emcp.js +62 -0
  279. package/lib/programmatic/run-template-workspace.js +74 -0
  280. package/lib/programmatic/run-test.js +49 -0
  281. package/lib/programmatic/run-upload.js +63 -0
  282. package/lib/programmatic/run-validate.js +53 -0
  283. package/lib/programmatic/run-wizard.js +40 -0
  284. package/lib/programmatic/system-key.js +48 -0
  285. package/lib/programmatic/wizard-config-normalize.js +118 -0
  286. package/lib/programmatic/workspace-cleanup.js +128 -0
  287. package/lib/programmatic/workspace-context.js +145 -0
  288. package/lib/programmatic/workspace-lock.js +75 -0
  289. package/lib/programmatic/workspace-meta.js +64 -0
  290. package/lib/programmatic/workspace-ops.js +149 -0
  291. package/lib/protection/run-commands-upload-sync.js +35 -0
  292. package/lib/protection/run-commands.js +2 -20
  293. package/lib/protection/upload-batch.js +11 -7
  294. package/lib/resolvers/evidence-kind-file.js +230 -0
  295. package/lib/resolvers/resource-type-file.js +58 -1
  296. package/lib/resolvers/role-file.js +227 -0
  297. package/lib/schema/application-schema.json +22 -2
  298. package/lib/schema/external-datasource.schema.json +245 -2
  299. package/lib/schema/external-system.schema.json +259 -119
  300. package/lib/schema/flag-map-validation-run.json +3 -0
  301. package/lib/schema/infra.parameter.yaml +25 -1
  302. package/lib/schema/type/credential-field-registry.json +21 -5
  303. package/lib/schema/type/document-storage.json +9 -0
  304. package/lib/utils/agent-trust-run-display.js +1 -1
  305. package/lib/utils/api.js +8 -2
  306. package/lib/utils/app-path-resolve.js +168 -0
  307. package/lib/utils/app-register-config.js +4 -3
  308. package/lib/utils/authentication-env-template.js +222 -0
  309. package/lib/utils/cli-sync-options.js +62 -10
  310. package/lib/utils/cli-utils.js +15 -3
  311. package/lib/utils/cli-workspace-options.js +29 -0
  312. package/lib/utils/compose-generate-docker-compose.js +102 -0
  313. package/lib/utils/configuration-env-resolver.js +203 -27
  314. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  315. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  316. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  317. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  318. package/lib/utils/datasource-test-run-display.js +2 -1
  319. package/lib/utils/dev-ca-install.js +5 -6
  320. package/lib/utils/dev-config.js +2 -2
  321. package/lib/utils/dev-init-ssh-merge.js +165 -23
  322. package/lib/utils/dev-list-sort.js +145 -0
  323. package/lib/utils/dev-pin-share-instructions.js +110 -0
  324. package/lib/utils/dev-platform-tls.js +0 -63
  325. package/lib/utils/dev-ssh-config-helper.js +177 -33
  326. package/lib/utils/docker-build.js +46 -27
  327. package/lib/utils/docker-daemon-tls-ca.js +1 -1
  328. package/lib/utils/docker-exec.js +91 -6
  329. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  330. package/lib/utils/env-copy.js +3 -4
  331. package/lib/utils/env-dotenv-format.js +103 -0
  332. package/lib/utils/error-formatters/error-parser.js +0 -3
  333. package/lib/utils/external-env-template.js +5 -2
  334. package/lib/utils/external-system-display.js +5 -1
  335. package/lib/utils/external-system-readiness-compact-blocks.js +248 -0
  336. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  337. package/lib/utils/external-system-readiness-core.js +16 -0
  338. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  339. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  340. package/lib/utils/external-system-readiness-display.js +20 -30
  341. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  342. package/lib/utils/external-system-system-test-tty.js +5 -41
  343. package/lib/utils/health-check-request.js +2 -3
  344. package/lib/utils/help-builder.js +9 -1
  345. package/lib/utils/host-ops-job-labels.js +236 -0
  346. package/lib/utils/host-ops-job-result.js +61 -0
  347. package/lib/utils/host-ops-poll-ui.js +163 -0
  348. package/lib/utils/image-name.js +22 -4
  349. package/lib/utils/integration-path-resolve.js +112 -0
  350. package/lib/utils/logger.js +37 -4
  351. package/lib/utils/manifest-source-emit.js +1 -1
  352. package/lib/utils/paths-reload-source.js +148 -0
  353. package/lib/utils/paths-system-builder-keys.js +25 -0
  354. package/lib/utils/paths.js +183 -30
  355. package/lib/utils/pipeline-upload-auth-retry.js +4 -0
  356. package/lib/utils/postgres-platform-bootstrap.js +24 -17
  357. package/lib/utils/postgres-wipe.js +5 -2
  358. package/lib/utils/remote-dev-auth.js +39 -4
  359. package/lib/utils/resolve-docker-image-ref.js +36 -6
  360. package/lib/utils/runtime-configuration-values.js +64 -2
  361. package/lib/utils/secrets-helpers.js +5 -1
  362. package/lib/utils/ssh-known-hosts.js +130 -0
  363. package/lib/utils/test-target-cli-options.js +75 -0
  364. package/lib/utils/token-manager.js +16 -0
  365. package/lib/utils/upload-sync-options.js +20 -2
  366. package/lib/utils/validation-run-request.js +11 -2
  367. package/lib/validation/external-manifest-validator.js +11 -1
  368. package/lib/validation/openapi-contract-surface-validator.js +430 -0
  369. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  370. package/lib/validation/validate-external-file.js +160 -0
  371. package/lib/validation/validate.js +6 -117
  372. package/lib/validation/validator.js +6 -5
  373. package/package.json +76 -37
  374. package/packages/builder-api/README.md +120 -0
  375. package/packages/builder-api/package.json +30 -0
  376. package/packages/builder-api/src/app.module.ts +7 -0
  377. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  378. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  379. package/packages/builder-api/src/main.ts +16 -0
  380. package/packages/builder-api/tsconfig.json +15 -0
  381. package/scripts/check-builder-api-architecture-grep.js +79 -0
  382. package/scripts/docker_image_content_gate.js +47 -0
  383. package/scripts/docker_image_content_gate.sh +5 -0
  384. package/scripts/export-builder-api-evidence.js +262 -0
  385. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  386. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  387. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  388. package/scripts/lib/plan-actor.js +109 -0
  389. package/scripts/lib/plan-config.js +20 -0
  390. package/scripts/lib/plan-gates.js +154 -0
  391. package/scripts/lib/plan-meta.js +104 -0
  392. package/scripts/lib/plan-parse.js +162 -0
  393. package/scripts/lib/plan-prevalidate-gates.js +337 -0
  394. package/scripts/lib/plan-run-core.js +125 -0
  395. package/scripts/lib/plan-run-report.js +119 -0
  396. package/scripts/plan-approve.js +24 -0
  397. package/scripts/plan-archive.js +49 -0
  398. package/scripts/plan-run.js +13 -0
  399. package/scripts/plan-set-actor.js +21 -0
  400. package/scripts/plan-validate.js +80 -0
  401. package/scripts/pnpm/af.mjs +110 -0
  402. package/scripts/pnpm/check-quiet.mjs +32 -0
  403. package/scripts/pnpm/dev-install.mjs +29 -0
  404. package/scripts/pnpm/dev-reload.mjs +18 -0
  405. package/scripts/pnpm/help.mjs +55 -0
  406. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  407. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  408. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  409. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  410. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  411. package/scripts/pnpm/lib/spinner.mjs +42 -0
  412. package/scripts/stage_builder_api_for_docker.js +65 -0
  413. package/scripts/sync-builder-api-template.js +44 -0
  414. package/templates/README.md +3 -0
  415. package/templates/applications/builder-api/Dockerfile +38 -0
  416. package/templates/applications/builder-api/application.yaml +75 -0
  417. package/templates/applications/builder-api/env.template +48 -0
  418. package/templates/applications/dataplane/application.yaml +27 -5
  419. package/templates/applications/dataplane/env.template +38 -15
  420. package/templates/applications/dataplane/rbac.yaml +85 -3
  421. package/templates/applications/miso-controller/application.yaml +10 -1
  422. package/templates/applications/miso-controller/env.template +11 -10
  423. package/templates/applications/miso-controller/rbac.yaml +72 -0
  424. package/templates/channels/README.md +18 -0
  425. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  426. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  427. package/templates/channels/chatgpt/integration/README.md +11 -0
  428. package/templates/channels/chatgpt/integration/application.json +15 -0
  429. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  430. package/templates/channels/chatgpt/integration/env.template +4 -0
  431. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  432. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  433. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  434. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  435. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  436. package/templates/channels/slack/install.template.md.hbs +48 -18
  437. package/templates/channels/slack/integration/README.md +38 -0
  438. package/templates/channels/slack/integration/application.json +18 -0
  439. package/templates/channels/slack/integration/env.template +29 -0
  440. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  441. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  442. package/templates/channels/slack/integration/slack-system.json +144 -0
  443. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  444. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  445. package/templates/channels/teams-bot/integration/README.md +18 -0
  446. package/templates/channels/teams-bot/integration/application.json +17 -0
  447. package/templates/channels/teams-bot/integration/env.template +5 -0
  448. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  449. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  450. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  451. package/templates/channels/web-embed/integration/README.md +11 -0
  452. package/templates/channels/web-embed/integration/application.json +15 -0
  453. package/templates/channels/web-embed/integration/env.template +4 -0
  454. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  455. package/templates/openapi/redoc_page.html +86 -0
  456. package/templates/python/docker-compose.hbs +11 -0
  457. package/templates/python/requirements.txt +2 -2
  458. package/templates/typescript/docker-compose.hbs +11 -0
  459. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Headless builder-api bootstrap provisioning (plan 154.2 / 197 pattern).
3
+ *
4
+ * @fileoverview up-builder-api bootstrap path when Docker + ENCRYPTION_KEY available
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const chalk = require('chalk');
12
+ const logger = require('../utils/logger');
13
+ const { callBootstrapApi } = require('../utils/app-bootstrap-api');
14
+ const {
15
+ loadVariablesYaml,
16
+ extractAppConfiguration
17
+ } = require('../utils/app-register-config');
18
+ const { buildRegistrationData, saveLocalCredentials, applyLocalhostPortAdjustment } = require('../app/register');
19
+ const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
20
+ const { resolveBootstrapEncryptionKey } = require('./up-dataplane-bootstrap');
21
+
22
+ /**
23
+ * Register builder-api via bootstrap endpoint (idempotent).
24
+ * @async
25
+ * @param {Object} options - up-builder-api options
26
+ * @param {string} controllerUrl
27
+ * @param {string} environmentKey
28
+ * @param {Function} buildBuilderApiImageRefFn
29
+ * @returns {Promise<void>}
30
+ */
31
+ async function bootstrapBuilderApiApplication(options, controllerUrl, environmentKey, buildBuilderApiImageRefFn) {
32
+ const encryptionKey = await resolveBootstrapEncryptionKey();
33
+ if (!encryptionKey) {
34
+ throw new Error(
35
+ 'Bootstrap encryption key is not available. Ensure miso-controller-secrets-encryptionKeyVault ' +
36
+ 'exists in merged secrets after up-miso resolve.'
37
+ );
38
+ }
39
+
40
+ const { variables } = await loadVariablesYaml('builder-api');
41
+ const appConfig = await extractAppConfiguration(variables, 'builder-api', options);
42
+ await applyLocalhostPortAdjustment(appConfig, controllerUrl, options);
43
+
44
+ const imageOverride = options.image || buildBuilderApiImageRefFn(options);
45
+ const registerOpts = {
46
+ imageOverride,
47
+ image: imageOverride,
48
+ registryMode: options.registryMode,
49
+ envKey: environmentKey
50
+ };
51
+ const registrationData = buildRegistrationData(appConfig, registerOpts);
52
+
53
+ logger.log(chalk.blue('Provisioning builder-api via bootstrap (no device login)...'));
54
+ const responseData = await callBootstrapApi(
55
+ controllerUrl,
56
+ encryptionKey,
57
+ environmentKey,
58
+ registrationData
59
+ );
60
+
61
+ if (responseData.credentials && responseData.credentials.clientSecret) {
62
+ await saveLocalCredentials(responseData, controllerUrl);
63
+ logger.log(formatSuccessLine('Builder-api bootstrap credentials saved locally'));
64
+ } else if (responseData.status === 'already_provisioned') {
65
+ logger.log(formatSuccessLine('Builder-api already provisioned (bootstrap idempotent)'));
66
+ }
67
+ }
68
+
69
+ module.exports = {
70
+ bootstrapBuilderApiApplication
71
+ };
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Register, deploy, and env refresh for builder-api (plan 154.2).
3
+ *
4
+ * @fileoverview Shared provision helpers for up-builder-api
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const chalk = require('chalk');
12
+ const pathsUtil = require('../utils/paths');
13
+ const { loadConfigFile } = require('../utils/config-format');
14
+ const { resolveDockerImageRef, normalizeDockerRegistryPrefix } = require('../utils/resolve-docker-image-ref');
15
+ const logger = require('../utils/logger');
16
+ const config = require('../core/config');
17
+ const { checkAuthentication } = require('../utils/app-register-auth');
18
+ const { resolveControllerUrl } = require('../utils/controller-url');
19
+ const { resolveEnvironment } = require('../core/config');
20
+ const { registerApplication } = require('../app/register');
21
+ const { rotateSecret } = require('../app/rotate-secret');
22
+ const { checkApplicationExists } = require('../utils/app-existence');
23
+ const { checkHealthEndpoint } = require('../utils/health-check');
24
+ const app = require('../app');
25
+ const { assertDevInfraUp } = require('./dev-infra-gate');
26
+ const { publishedHostPort, parseDeveloperIdNum } = require('../utils/declarative-url-ports');
27
+ const { canUseBootstrapProvision } = require('./up-dataplane-bootstrap');
28
+ const { bootstrapBuilderApiApplication } = require('./up-builder-api-bootstrap');
29
+ const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
30
+ const { generateEnvFile } = require('../core/secrets');
31
+
32
+ const CONTROLLER_HEALTH_PATH = '/health';
33
+ const CONTROLLER_HEALTH_RETRY_ATTEMPTS = 30;
34
+ const CONTROLLER_HEALTH_RETRY_DELAY_MS = 2000;
35
+
36
+ /**
37
+ * @param {number} ms
38
+ * @returns {Promise<void>}
39
+ */
40
+ function sleep(ms) {
41
+ return new Promise((resolve) => setTimeout(resolve, ms));
42
+ }
43
+
44
+ /**
45
+ * @param {string} baseUrl
46
+ * @returns {Promise<boolean>}
47
+ */
48
+ async function isControllerHealthy(baseUrl) {
49
+ const healthUrl = `${baseUrl.replace(/\/+$/, '')}${CONTROLLER_HEALTH_PATH}`;
50
+ try {
51
+ return await checkHealthEndpoint(healthUrl, false);
52
+ } catch {
53
+ return false;
54
+ }
55
+ }
56
+
57
+ /**
58
+ * @param {string} baseUrl
59
+ * @param {{ attempts?: number, delayMs?: number }} [opts]
60
+ * @returns {Promise<boolean>}
61
+ */
62
+ async function waitForControllerHealthy(baseUrl, opts = {}) {
63
+ const attempts = opts.attempts ?? CONTROLLER_HEALTH_RETRY_ATTEMPTS;
64
+ const delayMs = opts.delayMs ?? CONTROLLER_HEALTH_RETRY_DELAY_MS;
65
+ const normalized = baseUrl.replace(/\/+$/, '');
66
+ for (let i = 0; i < attempts; i += 1) {
67
+ if (await isControllerHealthy(normalized)) {
68
+ return true;
69
+ }
70
+ if (i < attempts - 1) {
71
+ await sleep(delayMs);
72
+ }
73
+ }
74
+ return false;
75
+ }
76
+
77
+ /**
78
+ * @param {Object} [options]
79
+ * @returns {string|undefined}
80
+ */
81
+ function buildBuilderApiImageRef(options = {}) {
82
+ try {
83
+ const builderPath = pathsUtil.getBuilderPath('builder-api');
84
+ const configPath = pathsUtil.resolveApplicationConfigPath(builderPath);
85
+ const variables = loadConfigFile(configPath) || {};
86
+ const cli = normalizeDockerRegistryPrefix(options.registry);
87
+ const manifestReg = normalizeDockerRegistryPrefix(variables.image?.registry);
88
+ if (!cli && !manifestReg) {
89
+ return undefined;
90
+ }
91
+ const { imageName, imageTag } = resolveDockerImageRef('builder-api', variables, {
92
+ registry: options.registry || undefined
93
+ });
94
+ return `${imageName}:${imageTag}`;
95
+ } catch {
96
+ return undefined;
97
+ }
98
+ }
99
+
100
+ /**
101
+ * @param {Object} cfg
102
+ */
103
+ function assertDevEnvironmentForBuilderApi(cfg) {
104
+ const environment = cfg && cfg.environment ? cfg.environment : 'dev';
105
+ if (environment !== 'dev') {
106
+ throw new Error(
107
+ 'Builder-api is only supported in dev environment. Set with: aifabrix auth --set-environment dev.'
108
+ );
109
+ }
110
+ }
111
+
112
+ /**
113
+ * @async
114
+ * @param {Object} options
115
+ * @returns {Promise<string>}
116
+ */
117
+ async function prepareHealthyControllerUrl(options) {
118
+ if (options.skipInfraCheck !== true) {
119
+ await assertDevInfraUp();
120
+ }
121
+ let controllerUrl = await resolveControllerUrl();
122
+ controllerUrl = controllerUrl.replace(/\/+$/, '');
123
+ const healthy = await waitForControllerHealthy(controllerUrl);
124
+ if (!healthy) {
125
+ throw new Error(`Controller at ${controllerUrl} is not responding. Ensure miso-controller is running.`);
126
+ }
127
+ return controllerUrl;
128
+ }
129
+
130
+ /**
131
+ * @async
132
+ * @param {Object} options
133
+ * @param {string} environmentKey
134
+ * @returns {Promise<{ controllerUrl: string, authConfig: Object|null, useBootstrap: boolean }>}
135
+ */
136
+ async function resolveUpBuilderApiControllerContext(options, environmentKey) {
137
+ const useBootstrap = await canUseBootstrapProvision(options);
138
+ const controllerUrl = await prepareHealthyControllerUrl(options);
139
+ const cfg = await config.getConfig();
140
+ if (options.allowNonDev !== true) {
141
+ assertDevEnvironmentForBuilderApi(cfg);
142
+ }
143
+ if (useBootstrap) {
144
+ if (options.platformInstall !== true) {
145
+ logger.log(formatSuccessLine('Using bootstrap provision (no device login)'));
146
+ }
147
+ return { controllerUrl, authConfig: null, useBootstrap: true };
148
+ }
149
+ const authConfig = await checkAuthentication(controllerUrl, environmentKey, { throwOnFailure: true });
150
+ if (options.platformInstall !== true) {
151
+ logger.log(formatSuccessLine(`Logged in (environment: ${environmentKey})`));
152
+ }
153
+ return { controllerUrl, authConfig, useBootstrap: false };
154
+ }
155
+
156
+ /**
157
+ * @async
158
+ */
159
+ async function registerOrRotateBuilderApi(options, controllerUrl, environmentKey, authConfig) {
160
+ const appExists = await checkApplicationExists('builder-api', controllerUrl, environmentKey, authConfig);
161
+ if (appExists) {
162
+ logger.log(chalk.blue('Builder-api already registered; rotating secret...'));
163
+ await rotateSecret('builder-api', options);
164
+ return;
165
+ }
166
+ const imageOverride = options.image || buildBuilderApiImageRef(options);
167
+ await registerApplication('builder-api', {
168
+ imageOverride,
169
+ image: imageOverride,
170
+ registryMode: options.registryMode,
171
+ envKey: environmentKey
172
+ });
173
+ }
174
+
175
+ /**
176
+ * @async
177
+ */
178
+ async function deployBuilderApiToController(options) {
179
+ const imageOverride = options.image || buildBuilderApiImageRef(options);
180
+ await app.deployApp('builder-api', {
181
+ imageOverride,
182
+ image: imageOverride,
183
+ registryMode: options.registryMode,
184
+ envKey: options.envKey ? String(options.envKey).trim().toLowerCase() : undefined,
185
+ silentPoll: options.platformInstall === true
186
+ });
187
+ }
188
+
189
+ /**
190
+ * @async
191
+ */
192
+ async function provisionAndDeployBuilderApi(options, environmentKey, controllerUrl, useBootstrap, authConfig) {
193
+ if (useBootstrap) {
194
+ await bootstrapBuilderApiApplication(options, controllerUrl, environmentKey, buildBuilderApiImageRef);
195
+ } else {
196
+ await registerOrRotateBuilderApi(options, controllerUrl, environmentKey, authConfig);
197
+ }
198
+
199
+ await deployBuilderApiToController({
200
+ ...options,
201
+ envKey: environmentKey,
202
+ ...(useBootstrap ? { deploymentAuth: 'client-credentials' } : {})
203
+ });
204
+ logger.log('');
205
+ }
206
+
207
+ /**
208
+ * Materialize builder-api .env after bootstrap/register so run uses fresh MISO_* credentials.
209
+ * @async
210
+ */
211
+ async function refreshBuilderApiEnvAfterProvision() {
212
+ try {
213
+ await generateEnvFile('builder-api', null, 'local', true);
214
+ logger.log(formatSuccessLine('Refreshed builder-api .env from resolved secrets'));
215
+ } catch (error) {
216
+ logger.warn(chalk.yellow(`Could not refresh builder-api .env: ${error.message}`));
217
+ }
218
+ }
219
+
220
+ /**
221
+ * @async
222
+ */
223
+ async function computeBuilderApiRunOverrides(options) {
224
+ const runEnvKey = options.runEnvKey ? String(options.runEnvKey).trim().toLowerCase() : undefined;
225
+ const developerIdRaw = await config.getDeveloperId();
226
+ const developerIdNum = parseDeveloperIdNum(developerIdRaw);
227
+ if (runEnvKey && runEnvKey !== 'dev' && runEnvKey !== 'tst') {
228
+ return { runEnvKey, portOverride: undefined };
229
+ }
230
+ const portOverride = publishedHostPort(3005, developerIdNum);
231
+ return { runEnvKey, portOverride };
232
+ }
233
+
234
+ module.exports = {
235
+ buildBuilderApiImageRef,
236
+ resolveUpBuilderApiControllerContext,
237
+ provisionAndDeployBuilderApi,
238
+ refreshBuilderApiEnvAfterProvision,
239
+ computeBuilderApiRunOverrides,
240
+ resolveEnvironment
241
+ };
@@ -0,0 +1,88 @@
1
+ const { formatSuccessParagraph } = require('../utils/cli-test-layout-chalk');
2
+ /**
3
+ * AI Fabrix Builder - Up Builder API Command
4
+ *
5
+ * Materializes builder-api from template, registers via bootstrap or device login,
6
+ * deploys manifest to controller, and runs locally (plan 154.2).
7
+ *
8
+ * @fileoverview up-builder-api command implementation
9
+ * @author AI Fabrix Team
10
+ * @version 1.0.0
11
+ */
12
+
13
+ const chalk = require('chalk');
14
+ const logger = require('../utils/logger');
15
+ const app = require('../app');
16
+ const {
17
+ ensureBuilderApiAppsFromTemplate,
18
+ patchEnvOutputPathForDeployOnly,
19
+ validateEnvOutputPathFolderOrNull,
20
+ refreshUrlsLocalRegistryForCurrentProject
21
+ } = require('./up-common');
22
+ const {
23
+ resolveUpBuilderApiControllerContext,
24
+ provisionAndDeployBuilderApi,
25
+ refreshBuilderApiEnvAfterProvision,
26
+ computeBuilderApiRunOverrides,
27
+ resolveEnvironment
28
+ } = require('./up-builder-api-provision');
29
+
30
+ /**
31
+ * @async
32
+ * @param {Object} [options]
33
+ * @returns {Promise<void>}
34
+ */
35
+ async function handleUpBuilderApi(options = {}) {
36
+ if (options.platformInstall !== true) {
37
+ logger.log(
38
+ chalk.blue('Starting up-builder-api (bootstrap/register, deploy, then run builder-api locally)...\n')
39
+ );
40
+ }
41
+
42
+ const environmentKey =
43
+ options && options.envKey
44
+ ? String(options.envKey).trim().toLowerCase()
45
+ : await resolveEnvironment();
46
+
47
+ const { controllerUrl, authConfig, useBootstrap } = await resolveUpBuilderApiControllerContext(
48
+ options,
49
+ environmentKey
50
+ );
51
+
52
+ await ensureBuilderApiAppsFromTemplate({ silent: options.platformInstall === true });
53
+ validateEnvOutputPathFolderOrNull('builder-api');
54
+ patchEnvOutputPathForDeployOnly('builder-api');
55
+ refreshUrlsLocalRegistryForCurrentProject();
56
+
57
+ const { emitSystemBuilderAppManifestLineIfTTY } = require('../utils/manifest-source-emit');
58
+ emitSystemBuilderAppManifestLineIfTTY(logger, 'builder-api');
59
+
60
+ await provisionAndDeployBuilderApi(options, environmentKey, controllerUrl, useBootstrap, authConfig);
61
+ await refreshBuilderApiEnvAfterProvision();
62
+
63
+ const { portOverride } = await computeBuilderApiRunOverrides(options);
64
+
65
+ const runOpts = {
66
+ registry: options.registry,
67
+ registryMode: options.registryMode,
68
+ skipEnvOutputPath: true,
69
+ skipInfraCheck: true,
70
+ skipManifestMetadataLine: true,
71
+ ...(portOverride !== undefined ? { port: portOverride } : {}),
72
+ ...(options.platformInstall === true ? { silentPoll: true } : {})
73
+ };
74
+ if (options.image) {
75
+ runOpts.image = options.image;
76
+ }
77
+ await app.runApp('builder-api', runOpts);
78
+
79
+ if (options.platformInstall !== true) {
80
+ logger.log(
81
+ formatSuccessParagraph(
82
+ 'up-builder-api complete. Builder-api is registered, deployed in dev, and running locally.'
83
+ )
84
+ );
85
+ }
86
+ }
87
+
88
+ module.exports = { handleUpBuilderApi };
@@ -328,11 +328,15 @@ async function ensureAppFromTemplate(appName, opts = {}) {
328
328
  /** Dataplane app key materialized for dataplane install (worker/beat are compose sidecars). */
329
329
  const DATAPLANE_BUILDER_APP_KEYS = Object.freeze(['dataplane']);
330
330
 
331
+ /** Builder API platform app key (154.2). */
332
+ const BUILDER_API_APP_KEYS = Object.freeze(['builder-api']);
333
+
331
334
  /** Builder dirs removed on up-platform / setup force (includes Celery companions). */
332
335
  const PLATFORM_BUILDER_CLEAN_APP_KEYS = Object.freeze([
333
336
  'keycloak',
334
337
  'miso-controller',
335
- ...DATAPLANE_BUILDER_APP_KEYS
338
+ ...DATAPLANE_BUILDER_APP_KEYS,
339
+ ...BUILDER_API_APP_KEYS
336
340
  ]);
337
341
 
338
342
  /**
@@ -354,6 +358,23 @@ async function ensureDataplaneAppsFromTemplate(opts = {}) {
354
358
  return anyCopied;
355
359
  }
356
360
 
361
+ /**
362
+ * Ensure builder-api manifest exists under the system builder root.
363
+ *
364
+ * @param {object} [opts]
365
+ * @returns {Promise<boolean>}
366
+ */
367
+ async function ensureBuilderApiAppsFromTemplate(opts = {}) {
368
+ let anyCopied = false;
369
+ for (const appName of BUILDER_API_APP_KEYS) {
370
+ const copied = await ensureAppFromTemplate(appName, opts);
371
+ if (copied) {
372
+ anyCopied = true;
373
+ }
374
+ }
375
+ return anyCopied;
376
+ }
377
+
357
378
  /**
358
379
  * Merge builder/packages `application.yaml` into `~/.aifabrix/urls.local.yaml`.
359
380
  * Same scan as the end of {@link prepareUrlsLocalRegistryForUpPlatform}; call after platform app
@@ -381,15 +402,18 @@ async function prepareUrlsLocalRegistryForUpPlatform(opts = {}) {
381
402
  await ensureAppFromTemplate('keycloak', templateOpts);
382
403
  await ensureAppFromTemplate('miso-controller', templateOpts);
383
404
  await ensureDataplaneAppsFromTemplate(templateOpts);
405
+ await ensureBuilderApiAppsFromTemplate(templateOpts);
384
406
  refreshUrlsLocalRegistryForCurrentProject();
385
407
  }
386
408
 
387
409
  module.exports = {
388
410
  applyUpPlatformForceConfig,
389
411
  cleanBuilderAppDirs,
412
+ BUILDER_API_APP_KEYS,
390
413
  DATAPLANE_BUILDER_APP_KEYS,
391
414
  PLATFORM_BUILDER_CLEAN_APP_KEYS,
392
415
  ensureAppFromTemplate,
416
+ ensureBuilderApiAppsFromTemplate,
393
417
  ensureDataplaneAppsFromTemplate,
394
418
  patchEnvOutputPathForDeployOnly,
395
419
  validateEnvOutputPathFolderOrNull,
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Credential + runtime config push with compact/verbose logging for upload publish.
3
+ *
4
+ * @fileoverview Upload credential push helpers
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const path = require('path');
12
+ const chalk = require('chalk');
13
+ const logger = require('../utils/logger');
14
+ const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
15
+ const { resolveExternalSystemPath } = require('../utils/app-path-resolve');
16
+ const { pushCredentialSecrets } = require('../utils/credential-secrets-env');
17
+ const { runWithCredentialPushSpinner } = require('../utils/credential-push-ui');
18
+ const { collectResolvedVariableConfigurationNames } = require('../utils/configuration-env-resolver');
19
+ const { pushRuntimeConfigurationValues } = require('../utils/runtime-configuration-values');
20
+
21
+ /**
22
+ * @param {Object} pushResult
23
+ * @param {string[]} resolvedParamNames
24
+ * @param {boolean} quietLog
25
+ */
26
+ function logCredentialPushOutcome(pushResult, resolvedParamNames, quietLog) {
27
+ if (quietLog) {
28
+ return;
29
+ }
30
+ if (pushResult.pushed > 0) {
31
+ const keyList = pushResult.keys?.length ? ` (${pushResult.keys.join(', ')})` : '';
32
+ logger.log(
33
+ formatSuccessLine(`Pushed ${pushResult.pushed} credential secret(s) to dataplane${keyList}.`)
34
+ );
35
+ } else {
36
+ logger.log(chalk.yellow('Secret push skipped'));
37
+ }
38
+ if (resolvedParamNames.length > 0) {
39
+ const nameList = ` (${resolvedParamNames.join(', ')})`;
40
+ logger.log(
41
+ formatSuccessLine(
42
+ `Resolved ${resolvedParamNames.length} integration parameter(s) from .env for publish${nameList}.`
43
+ )
44
+ );
45
+ }
46
+ if (pushResult.warning) {
47
+ logger.log(chalk.yellow(`Warning: ${pushResult.warning}`));
48
+ }
49
+ }
50
+
51
+ /**
52
+ * @async
53
+ * @returns {Promise<{ pushed: number, names: string[] }>}
54
+ */
55
+ async function pushRuntimeConfigWithLog(dataplaneUrl, authConfig, systemKey, payload, quietLog) {
56
+ try {
57
+ const configPush = await pushRuntimeConfigurationValues(dataplaneUrl, authConfig, systemKey, payload);
58
+ if (configPush.pushed > 0 && !quietLog) {
59
+ const nameList = configPush.names.length ? ` (${configPush.names.join(', ')})` : '';
60
+ logger.log(
61
+ formatSuccessLine(
62
+ `Stored ${configPush.pushed} runtime configuration value(s) in dataplane${nameList}.`
63
+ )
64
+ );
65
+ }
66
+ return configPush;
67
+ } catch (err) {
68
+ if (!quietLog) {
69
+ logger.log(chalk.yellow(`Warning: runtime configuration store skipped: ${err.message}`));
70
+ }
71
+ return { pushed: 0, names: [] };
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Pushes credential secrets from .env and payload to dataplane; logs result or warning.
77
+ *
78
+ * @async
79
+ * @param {string} dataplaneUrl
80
+ * @param {Object} authConfig
81
+ * @param {string} systemKey
82
+ * @param {Object} payload
83
+ * @param {Object} [uiOpts]
84
+ * @returns {Promise<Object>}
85
+ */
86
+ async function pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload, uiOpts = {}) {
87
+ const pathOptions = uiOpts.pathOptions || {};
88
+ const envFilePath = path.join(resolveExternalSystemPath(systemKey, pathOptions), '.env');
89
+ const pushResult = await runWithCredentialPushSpinner(
90
+ () =>
91
+ pushCredentialSecrets(dataplaneUrl, authConfig, {
92
+ envFilePath,
93
+ appName: systemKey,
94
+ payload
95
+ }),
96
+ { systemKey, json: uiOpts.json === true }
97
+ );
98
+ const resolvedParamNames = collectResolvedVariableConfigurationNames(payload);
99
+ const quietLog = uiOpts.suppressCredentialLog === true;
100
+ logCredentialPushOutcome(pushResult, resolvedParamNames, quietLog);
101
+ const configPush = await pushRuntimeConfigWithLog(
102
+ dataplaneUrl,
103
+ authConfig,
104
+ systemKey,
105
+ payload,
106
+ quietLog
107
+ );
108
+ return {
109
+ credentialPush: { pushed: pushResult.pushed || 0, keys: pushResult.keys || [] },
110
+ configPush,
111
+ resolvedParamNames
112
+ };
113
+ }
114
+
115
+ module.exports = {
116
+ pushAndLogCredentialSecrets
117
+ };
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @fileoverview Finalize upload with optional datasource data sync.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { runPostPublishDataSync } = require('./run-post-publish-data-sync');
10
+ const { runUploadSidecarFollowups } = require('./upload-sidecar-followups');
11
+ const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
12
+ const logger = require('../utils/logger');
13
+ const { isQuietMinimalSync } = require('../utils/upload-sync-options');
14
+
15
+ /**
16
+ * @async
17
+ * @param {Object} ctx
18
+ * @param {Object} payload
19
+ * @param {Object} options
20
+ * @returns {Promise<Object>}
21
+ */
22
+ async function finalizeUploadPublishResult(ctx, payload, options) {
23
+ const dataSync = await runPostPublishDataSync({
24
+ dataplaneUrl: ctx.dataplaneUrl,
25
+ authConfig: ctx.authConfig,
26
+ payload,
27
+ options,
28
+ label: 'Upload data sync'
29
+ });
30
+ return { ...ctx, dataSync };
31
+ }
32
+
33
+ /**
34
+ * @async
35
+ * @param {Object} params
36
+ * @returns {Promise<Object>}
37
+ */
38
+ async function finishUnchangedUploadPublication(params) {
39
+ const { systemKey, options, payload, dataplaneUrl, authConfig, environment } = params;
40
+ if (!isQuietMinimalSync(options)) {
41
+ logger.log(formatSuccessLine('Config unchanged on dataplane — upload skipped.'));
42
+ }
43
+ await runUploadSidecarFollowups({
44
+ systemKey,
45
+ options,
46
+ payload,
47
+ dataplaneUrl,
48
+ authConfig
49
+ });
50
+ return finalizeUploadPublishResult(
51
+ { dataplaneUrl, authConfig, environment, uploadSkipped: true },
52
+ payload,
53
+ options
54
+ );
55
+ }
56
+
57
+ module.exports = {
58
+ finalizeUploadPublishResult,
59
+ finishUnchangedUploadPublication
60
+ };