@aifabrix/builder 2.49.2 → 2.50.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 (409) hide show
  1. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  2. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  3. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  4. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  5. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  6. package/.cursor/skills/README.md +1 -0
  7. package/.dockerignore +52 -0
  8. package/.eslintignore +22 -0
  9. package/README.md +2 -0
  10. package/bin/builder-api-cleanup.js +26 -0
  11. package/bin/builder-api-nest.js +10 -0
  12. package/bin/builder-api-spike.js +19 -0
  13. package/enterprise-knowledge/README.md +50 -0
  14. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  15. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  20. package/integration/README.md +81 -0
  21. package/integration/github/README.md +53 -0
  22. package/integration/github/application.json +21 -0
  23. package/integration/github/deploy.js +72 -0
  24. package/integration/github/env.template +11 -0
  25. package/integration/github/github-datasource-issue-comments.json +239 -0
  26. package/integration/github/github-datasource-issues.json +399 -0
  27. package/integration/github/github-datasource-repository.json +354 -0
  28. package/integration/github/github-deploy.json +1202 -0
  29. package/integration/github/github-system.json +82 -0
  30. package/integration/hubspot-test/README.md +1 -1
  31. package/jest.isolated-projects.js +31 -1
  32. package/jest.projects.js +87 -1
  33. package/lib/api/dev-server-https.js +1 -1
  34. package/lib/api/enterprise-knowledge.api.js +63 -0
  35. package/lib/api/evidence.api.js +172 -0
  36. package/lib/api/external-systems.api.js +8 -2
  37. package/lib/api/resource-types.api.js +1 -0
  38. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  39. package/lib/api/types/evidence.types.js +67 -0
  40. package/lib/api/types/resource-types.types.js +2 -0
  41. package/lib/app/controller-application-filter.js +36 -0
  42. package/lib/app/deploy.js +1 -1
  43. package/lib/app/list-external-systems.js +130 -0
  44. package/lib/app/list.js +20 -8
  45. package/lib/app/run.js +3 -1
  46. package/lib/app/show-display.js +8 -3
  47. package/lib/app/show-online.js +178 -0
  48. package/lib/app/show.js +37 -88
  49. package/lib/build/builder-api-docker-staging.js +47 -0
  50. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  51. package/lib/build/standard-docker-build.js +2 -0
  52. package/lib/certification/post-unified-cert-sync.js +4 -31
  53. package/lib/certification/sync-after-external-command.js +0 -1
  54. package/lib/certification/sync-system-certification.js +0 -3
  55. package/lib/channels/add-channel.js +40 -34
  56. package/lib/channels/approval-guides/chatgpt.js +33 -0
  57. package/lib/channels/approval-guides/credential-portal.js +38 -0
  58. package/lib/channels/approval-guides/index.js +110 -0
  59. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  60. package/lib/channels/approval-guides/slack.js +34 -0
  61. package/lib/channels/approval-guides/teams-bot.js +35 -0
  62. package/lib/channels/approval-guides/web-embed.js +32 -0
  63. package/lib/channels/channel-approval-guide.js +11 -0
  64. package/lib/channels/channel-artifact-generator.js +16 -4
  65. package/lib/channels/channel-audit.js +3 -0
  66. package/lib/channels/channel-auth-context.js +1 -1
  67. package/lib/channels/channel-description.js +59 -0
  68. package/lib/channels/channel-integration-generator.js +13 -230
  69. package/lib/channels/channel-integration-template.js +94 -0
  70. package/lib/channels/channel-runtime-resolver.js +43 -3
  71. package/lib/channels/channel-status-display.js +66 -26
  72. package/lib/channels/channel-targets.js +3 -3
  73. package/lib/cli/index.js +27 -3
  74. package/lib/cli/infra-guided.js +5 -1
  75. package/lib/cli/setup-app-external-create.js +111 -0
  76. package/lib/cli/setup-app.help.js +1 -1
  77. package/lib/cli/setup-app.js +38 -125
  78. package/lib/cli/setup-app.test-commands.js +26 -52
  79. package/lib/cli/setup-certification-commands.js +4 -4
  80. package/lib/cli/setup-certification.help.js +9 -9
  81. package/lib/cli/setup-dev.js +7 -2
  82. package/lib/cli/setup-external-system-help.js +4 -6
  83. package/lib/cli/setup-external-system.js +58 -52
  84. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  85. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  86. package/lib/cli/setup-infra.js +15 -0
  87. package/lib/cli/setup-list.js +43 -0
  88. package/lib/cli/setup-utility-repair.js +26 -7
  89. package/lib/cli/setup-utility.js +5 -3
  90. package/lib/commands/app.js +15 -43
  91. package/lib/commands/channel-add-setup.js +110 -0
  92. package/lib/commands/channel.js +42 -8
  93. package/lib/commands/datasource-sync-display.js +96 -0
  94. package/lib/commands/datasource-sync-policy.js +210 -0
  95. package/lib/commands/datasource-test-trust-cli.js +6 -6
  96. package/lib/commands/datasource-unified-test-cli.js +2 -1
  97. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  98. package/lib/commands/deploy-gate-failure-details.js +163 -0
  99. package/lib/commands/deploy-gate-orchestrator.js +322 -0
  100. package/lib/commands/dev-cli-handlers.js +1 -59
  101. package/lib/commands/dev-host-ops-params.js +91 -0
  102. package/lib/commands/dev-host-ops-poll.js +111 -0
  103. package/lib/commands/dev-host-ops.js +107 -94
  104. package/lib/commands/dev-init.js +3 -1
  105. package/lib/commands/enterprise-knowledge.js +284 -0
  106. package/lib/commands/evidence-cli-leaves.js +250 -0
  107. package/lib/commands/evidence.js +51 -0
  108. package/lib/commands/governance-cli-shared.js +2 -2
  109. package/lib/commands/governance-command-action.js +2 -2
  110. package/lib/commands/governance-fixture-subjects.js +85 -0
  111. package/lib/commands/governance.js +1 -1
  112. package/lib/commands/lifecycle-command-action.js +2 -2
  113. package/lib/commands/lifecycle-external.js +3 -3
  114. package/lib/commands/manifest-cli-auth.js +29 -0
  115. package/lib/commands/manifest-cli-commands.js +170 -0
  116. package/lib/commands/manifest-cli-integration-path.js +63 -0
  117. package/lib/commands/manifest.js +21 -0
  118. package/lib/commands/protection-cli-leaves.js +3 -3
  119. package/lib/commands/repair-auth-apply.js +15 -1
  120. package/lib/commands/repair-authentications-454.js +169 -0
  121. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  122. package/lib/commands/repair-datasource-apply.js +135 -0
  123. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  124. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  125. package/lib/commands/repair-datasource-operation-security.js +180 -0
  126. package/lib/commands/repair-datasource-run.js +7 -2
  127. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  128. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  129. package/lib/commands/repair-datasource.js +12 -68
  130. package/lib/commands/repair-env-template.js +11 -1
  131. package/lib/commands/repair-external-run.js +121 -31
  132. package/lib/commands/repair-internal.js +1 -1
  133. package/lib/commands/repair-openapi-export.js +156 -0
  134. package/lib/commands/repair-openapi-sync.js +19 -2
  135. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  136. package/lib/commands/repair-persist.js +22 -1
  137. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  138. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  139. package/lib/commands/repair-rbac.js +163 -86
  140. package/lib/commands/repair-steps.js +83 -18
  141. package/lib/commands/repair-system-permissions.js +1 -0
  142. package/lib/commands/repair.js +1 -1
  143. package/lib/commands/resource-type.js +65 -26
  144. package/lib/commands/run-post-publish-data-sync.js +68 -0
  145. package/lib/commands/setup-modes.js +1 -1
  146. package/lib/commands/test-e2e-external.js +21 -8
  147. package/lib/commands/test-governance-cli-options.js +2 -2
  148. package/lib/commands/test-trust-cli-options.js +2 -2
  149. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  150. package/lib/commands/up-builder-api-provision.js +241 -0
  151. package/lib/commands/up-builder-api.js +88 -0
  152. package/lib/commands/up-common.js +25 -1
  153. package/lib/commands/upload-credential-push-log.js +117 -0
  154. package/lib/commands/upload-data-sync-finalize.js +60 -0
  155. package/lib/commands/upload-probe.js +66 -0
  156. package/lib/commands/upload-publish-context.js +4 -1
  157. package/lib/commands/upload-sidecar-followups.js +55 -27
  158. package/lib/commands/upload.js +116 -157
  159. package/lib/commands/verify-governance-combined-external.js +1 -1
  160. package/lib/commands/verify-governance-db.js +2 -2
  161. package/lib/commands/verify-operations-command-action.js +2 -2
  162. package/lib/commands/verify-operations-step-plan.js +2 -2
  163. package/lib/commands/verify-operations-steps.js +2 -2
  164. package/lib/commands/verify-trust-command-action.js +1 -1
  165. package/lib/commands/wizard-core.js +1 -1
  166. package/lib/commands/wizard-headless.js +2 -1
  167. package/lib/core/admin-secrets.js +2 -6
  168. package/lib/core/secrets-env-content.js +10 -4
  169. package/lib/core/secrets-env-write.js +2 -13
  170. package/lib/datasource/agent-trust-run.js +3 -3
  171. package/lib/datasource/deploy.js +3 -1
  172. package/lib/datasource/test-e2e.js +6 -1
  173. package/lib/datasource/unified-validation-run-body.js +4 -1
  174. package/lib/datasource/unified-validation-run.js +1 -1
  175. package/lib/deployment/deploy-poll-ui.js +73 -12
  176. package/lib/deployment/deployer-poll-run.js +113 -0
  177. package/lib/deployment/deployer.js +17 -87
  178. package/lib/evidence/dataplane-context.js +21 -0
  179. package/lib/evidence/evidence-display.js +78 -0
  180. package/lib/evidence/evidence-service.js +392 -0
  181. package/lib/external-system/deploy.js +290 -112
  182. package/lib/external-system/download.js +7 -3
  183. package/lib/external-system/test-execution.js +1 -1
  184. package/lib/external-system/test-system-level.js +8 -10
  185. package/lib/external-system/test.js +12 -6
  186. package/lib/generator/deploy-script.js +73 -0
  187. package/lib/generator/external.js +2 -1
  188. package/lib/generator/index.js +17 -2
  189. package/lib/generator/wizard.js +3 -36
  190. package/lib/internal/fs-real-sync.js +22 -1
  191. package/lib/internal/node-fs.js +2 -0
  192. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  193. package/lib/lifecycle/verify-step-progress.js +1 -1
  194. package/lib/programmatic/access-log.js +26 -0
  195. package/lib/programmatic/auth-config.js +44 -0
  196. package/lib/programmatic/bearer-auth.js +176 -0
  197. package/lib/programmatic/builder-api-request.js +175 -0
  198. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  199. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  200. package/lib/programmatic/builder-api-server.js +230 -0
  201. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  202. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  203. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  204. package/lib/programmatic/builder-help-envelope.js +36 -0
  205. package/lib/programmatic/builder-help-fixtures.js +200 -0
  206. package/lib/programmatic/builder-help-governance.js +172 -0
  207. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  208. package/lib/programmatic/builder-help.js +361 -0
  209. package/lib/programmatic/capability-registry.js +77 -0
  210. package/lib/programmatic/command-options.js +32 -0
  211. package/lib/programmatic/enterprise-mcp-client.js +98 -0
  212. package/lib/programmatic/http-problem-details.js +99 -0
  213. package/lib/programmatic/http-route-match.js +40 -0
  214. package/lib/programmatic/idempotency-cache.js +69 -0
  215. package/lib/programmatic/index.js +53 -0
  216. package/lib/programmatic/integration-path-scope.js +39 -0
  217. package/lib/programmatic/log-redaction.js +66 -0
  218. package/lib/programmatic/manifest-get-section.js +146 -0
  219. package/lib/programmatic/manifest-patch-section.js +252 -0
  220. package/lib/programmatic/manifest-repair.js +122 -0
  221. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  222. package/lib/programmatic/manifest-section-io.js +225 -0
  223. package/lib/programmatic/manifest-section-quality.js +171 -0
  224. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  225. package/lib/programmatic/manifest-section-registry.js +205 -0
  226. package/lib/programmatic/nest-http-bridge.js +34 -0
  227. package/lib/programmatic/openapi-component-schemas.js +68 -0
  228. package/lib/programmatic/openapi-description-enricher.js +117 -0
  229. package/lib/programmatic/openapi-descriptions.js +190 -0
  230. package/lib/programmatic/openapi-docs-serving.js +123 -0
  231. package/lib/programmatic/openapi-help-schemas.js +63 -0
  232. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  233. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  234. package/lib/programmatic/openapi-request-schemas.js +155 -0
  235. package/lib/programmatic/openapi-result-schemas.js +476 -0
  236. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  237. package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
  238. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  239. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  240. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  241. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  242. package/lib/programmatic/openapi-schema-helpers.js +93 -0
  243. package/lib/programmatic/openapi-spec.js +203 -0
  244. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  245. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  246. package/lib/programmatic/request-timeout.js +53 -0
  247. package/lib/programmatic/route-handler-map.js +143 -0
  248. package/lib/programmatic/route-handlers-context.js +29 -0
  249. package/lib/programmatic/route-handlers.js +33 -0
  250. package/lib/programmatic/run-certify.js +57 -0
  251. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  252. package/lib/programmatic/run-lifecycle.js +29 -0
  253. package/lib/programmatic/run-repair.js +41 -0
  254. package/lib/programmatic/run-repository-emcp.js +54 -0
  255. package/lib/programmatic/run-template-workspace.js +61 -0
  256. package/lib/programmatic/run-test.js +49 -0
  257. package/lib/programmatic/run-upload.js +63 -0
  258. package/lib/programmatic/run-validate.js +53 -0
  259. package/lib/programmatic/run-wizard.js +40 -0
  260. package/lib/programmatic/system-key.js +48 -0
  261. package/lib/programmatic/wizard-config-normalize.js +118 -0
  262. package/lib/programmatic/workspace-cleanup.js +128 -0
  263. package/lib/programmatic/workspace-context.js +145 -0
  264. package/lib/programmatic/workspace-lock.js +75 -0
  265. package/lib/programmatic/workspace-meta.js +64 -0
  266. package/lib/programmatic/workspace-ops.js +149 -0
  267. package/lib/protection/run-commands-upload-sync.js +35 -0
  268. package/lib/protection/run-commands.js +2 -20
  269. package/lib/protection/upload-batch.js +11 -7
  270. package/lib/resolvers/resource-type-file.js +22 -0
  271. package/lib/schema/external-datasource.schema.json +161 -1
  272. package/lib/schema/external-system.schema.json +244 -118
  273. package/lib/schema/flag-map-validation-run.json +3 -0
  274. package/lib/schema/type/credential-field-registry.json +2 -2
  275. package/lib/schema/type/document-storage.json +9 -0
  276. package/lib/utils/agent-trust-run-display.js +1 -1
  277. package/lib/utils/app-path-resolve.js +168 -0
  278. package/lib/utils/authentication-env-template.js +222 -0
  279. package/lib/utils/cli-sync-options.js +7 -11
  280. package/lib/utils/cli-utils.js +4 -0
  281. package/lib/utils/cli-workspace-options.js +29 -0
  282. package/lib/utils/compose-generate-docker-compose.js +102 -0
  283. package/lib/utils/configuration-env-resolver.js +203 -27
  284. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  285. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  286. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  287. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  288. package/lib/utils/datasource-test-run-display.js +2 -1
  289. package/lib/utils/dev-init-ssh-merge.js +165 -23
  290. package/lib/utils/dev-pin-share-instructions.js +110 -0
  291. package/lib/utils/dev-ssh-config-helper.js +177 -33
  292. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  293. package/lib/utils/env-copy.js +2 -1
  294. package/lib/utils/env-dotenv-format.js +103 -0
  295. package/lib/utils/external-env-template.js +4 -1
  296. package/lib/utils/external-system-display.js +5 -1
  297. package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
  298. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  299. package/lib/utils/external-system-readiness-core.js +16 -0
  300. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  301. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  302. package/lib/utils/external-system-readiness-display.js +20 -30
  303. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  304. package/lib/utils/external-system-system-test-tty.js +5 -41
  305. package/lib/utils/help-builder.js +6 -1
  306. package/lib/utils/host-ops-job-labels.js +236 -0
  307. package/lib/utils/host-ops-job-result.js +61 -0
  308. package/lib/utils/host-ops-poll-ui.js +163 -0
  309. package/lib/utils/integration-path-resolve.js +112 -0
  310. package/lib/utils/paths-reload-source.js +148 -0
  311. package/lib/utils/paths-system-builder-keys.js +25 -0
  312. package/lib/utils/paths.js +151 -26
  313. package/lib/utils/runtime-configuration-values.js +64 -2
  314. package/lib/utils/secrets-helpers.js +5 -1
  315. package/lib/utils/ssh-known-hosts.js +130 -0
  316. package/lib/utils/test-target-cli-options.js +75 -0
  317. package/lib/utils/upload-sync-options.js +4 -0
  318. package/lib/utils/validation-run-request.js +11 -2
  319. package/lib/validation/external-manifest-validator.js +11 -1
  320. package/lib/validation/openapi-contract-surface-validator.js +426 -0
  321. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  322. package/lib/validation/validate-external-file.js +160 -0
  323. package/lib/validation/validate.js +6 -117
  324. package/package.json +46 -29
  325. package/packages/builder-api/README.md +120 -0
  326. package/packages/builder-api/package.json +30 -0
  327. package/packages/builder-api/src/app.module.ts +7 -0
  328. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  329. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  330. package/packages/builder-api/src/main.ts +16 -0
  331. package/packages/builder-api/tsconfig.json +15 -0
  332. package/scripts/check-builder-api-architecture-grep.js +79 -0
  333. package/scripts/docker_image_content_gate.js +47 -0
  334. package/scripts/docker_image_content_gate.sh +5 -0
  335. package/scripts/export-builder-api-evidence.js +262 -0
  336. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  337. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  338. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  339. package/scripts/lib/plan-actor.js +109 -0
  340. package/scripts/lib/plan-config.js +20 -0
  341. package/scripts/lib/plan-gates.js +154 -0
  342. package/scripts/lib/plan-meta.js +104 -0
  343. package/scripts/lib/plan-parse.js +162 -0
  344. package/scripts/lib/plan-prevalidate-gates.js +326 -0
  345. package/scripts/lib/plan-run-core.js +125 -0
  346. package/scripts/lib/plan-run-report.js +108 -0
  347. package/scripts/plan-approve.js +24 -0
  348. package/scripts/plan-archive.js +49 -0
  349. package/scripts/plan-run.js +13 -0
  350. package/scripts/plan-set-actor.js +21 -0
  351. package/scripts/plan-validate.js +80 -0
  352. package/scripts/pnpm/af.mjs +110 -0
  353. package/scripts/pnpm/check-quiet.mjs +32 -0
  354. package/scripts/pnpm/dev-install.mjs +29 -0
  355. package/scripts/pnpm/dev-reload.mjs +18 -0
  356. package/scripts/pnpm/help.mjs +55 -0
  357. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  358. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  359. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  360. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  361. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  362. package/scripts/pnpm/lib/spinner.mjs +42 -0
  363. package/scripts/stage_builder_api_for_docker.js +65 -0
  364. package/scripts/sync-builder-api-template.js +44 -0
  365. package/templates/README.md +3 -0
  366. package/templates/applications/builder-api/Dockerfile +38 -0
  367. package/templates/applications/builder-api/application.yaml +75 -0
  368. package/templates/applications/builder-api/env.template +48 -0
  369. package/templates/applications/dataplane/application.yaml +1 -1
  370. package/templates/applications/dataplane/env.template +10 -6
  371. package/templates/applications/dataplane/rbac.yaml +21 -1
  372. package/templates/applications/miso-controller/application.yaml +1 -1
  373. package/templates/applications/miso-controller/env.template +1 -3
  374. package/templates/channels/README.md +18 -0
  375. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  376. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  377. package/templates/channels/chatgpt/integration/README.md +11 -0
  378. package/templates/channels/chatgpt/integration/application.json +15 -0
  379. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  380. package/templates/channels/chatgpt/integration/env.template +4 -0
  381. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  382. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  383. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  384. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  385. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  386. package/templates/channels/slack/install.template.md.hbs +48 -18
  387. package/templates/channels/slack/integration/README.md +38 -0
  388. package/templates/channels/slack/integration/application.json +18 -0
  389. package/templates/channels/slack/integration/env.template +29 -0
  390. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  391. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  392. package/templates/channels/slack/integration/slack-system.json +86 -0
  393. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  394. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  395. package/templates/channels/teams-bot/integration/README.md +18 -0
  396. package/templates/channels/teams-bot/integration/application.json +17 -0
  397. package/templates/channels/teams-bot/integration/env.template +5 -0
  398. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  399. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  400. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  401. package/templates/channels/web-embed/integration/README.md +11 -0
  402. package/templates/channels/web-embed/integration/application.json +15 -0
  403. package/templates/channels/web-embed/integration/env.template +4 -0
  404. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  405. package/templates/openapi/redoc_page.html +86 -0
  406. package/templates/python/docker-compose.hbs +11 -0
  407. package/templates/python/requirements.txt +1 -1
  408. package/templates/typescript/docker-compose.hbs +11 -0
  409. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @fileoverview Post-publish/deploy datasource data sync hook.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { resolveSyncPlan, executeSyncPlan } = require('./datasource-sync-policy');
10
+ const { logDatasourceSyncSummary } = require('./datasource-sync-display');
11
+
12
+ /**
13
+ * @param {string[]} datasourceKeys
14
+ * @param {Object|null|undefined} payload
15
+ * @returns {string[]}
16
+ */
17
+ function extractDatasourceKeysFromPayload(payload, datasourceKeys) {
18
+ if (Array.isArray(datasourceKeys) && datasourceKeys.length > 0) {
19
+ return datasourceKeys;
20
+ }
21
+ const fromPayload = Array.isArray(payload?.dataSources)
22
+ ? payload.dataSources.map((row) => row && row.key).filter(Boolean)
23
+ : [];
24
+ return fromPayload;
25
+ }
26
+
27
+ /**
28
+ * @async
29
+ * @param {Object} params
30
+ * @param {string[]} [params.datasourceKeys]
31
+ * @param {Object} [params.payload]
32
+ * @param {string} params.dataplaneUrl
33
+ * @param {Object} params.authConfig
34
+ * @param {Object} [params.options]
35
+ * @param {string} [params.label]
36
+ * @returns {Promise<Object|null>}
37
+ */
38
+ async function runPostPublishDataSync(params) {
39
+ const { dataplaneUrl, authConfig, payload, options = {}, label } = params;
40
+ if (!dataplaneUrl || !authConfig || options.dryRun === true || options.skipDataSync === true) {
41
+ return null;
42
+ }
43
+
44
+ const keys = extractDatasourceKeysFromPayload(payload, params.datasourceKeys);
45
+ if (keys.length === 0) {
46
+ return null;
47
+ }
48
+
49
+ const plan = await resolveSyncPlan({
50
+ syncExplicit: options.sync === true,
51
+ skipSync: options.skipDataSync === true,
52
+ datasourceKeys: keys,
53
+ dataplaneUrl,
54
+ authConfig
55
+ });
56
+ const result = await executeSyncPlan(plan, dataplaneUrl, authConfig);
57
+ logDatasourceSyncSummary(result, {
58
+ json: options.json === true,
59
+ label,
60
+ syncExplicit: options.sync === true
61
+ });
62
+ return result;
63
+ }
64
+
65
+ module.exports = {
66
+ runPostPublishDataSync,
67
+ extractDatasourceKeysFromPayload
68
+ };
@@ -58,7 +58,7 @@ const {
58
58
  } = require('../utils/infra-optional-service-flags');
59
59
 
60
60
  /** Builder app keys touched by `up-platform --force`. */
61
- const PLATFORM_APPS = ['keycloak', 'miso-controller', 'dataplane'];
61
+ const PLATFORM_APPS = ['keycloak', 'miso-controller', 'dataplane', 'builder-api'];
62
62
 
63
63
  function formatBackupSuffix() {
64
64
  const d = new Date();
@@ -13,12 +13,12 @@ const path = require('path');
13
13
  const fs = require('fs');
14
14
  const chalk = require('chalk');
15
15
  const logger = require('../utils/logger');
16
- const { getIntegrationPath } = require('../utils/paths');
16
+ const { resolveExternalSystemPath } = require('../utils/app-path-resolve');
17
17
  const { resolveApplicationConfigPath } = require('../utils/app-config-resolver');
18
18
  const { loadConfigFile } = require('../utils/config-format');
19
19
  const { discoverIntegrationFiles, buildEffectiveDatasourceFiles } = require('./repair-internal');
20
20
  const { runDatasourceTestE2E } = require('../datasource/test-e2e');
21
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
21
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
22
22
  const { buildMinimalUploadSyncOptions, isQuietMinimalSync } = require('../utils/upload-sync-options');
23
23
  const { getConfig } = require('../core/config');
24
24
  const { setupIntegrationTestAuth } = require('../external-system/test-auth');
@@ -90,15 +90,26 @@ function getDatasourceKeys(appPath, configPath, variables, systemKey, systemPars
90
90
 
91
91
  /**
92
92
  * Publish local integration files to the dataplane before E2E (same path as `aifabrix upload <systemKey>`),
93
- * unless ``options.noSync`` is true.
93
+ * unless ``options.noPublish`` is true.
94
94
  * @param {string} systemKey
95
95
  * @param {Object} options
96
96
  * @returns {Promise<{ authConfig: Object, dataplaneUrl: string, environment?: string }|null>}
97
97
  */
98
98
  async function syncLocalIfRequested(systemKey, options) {
99
- if (cliOptsSkipSync(options)) return null;
99
+ if (cliOptsSkipPublish(options)) return null;
100
100
  const { uploadExternalSystem } = require('./upload');
101
- const uploadOpts = buildMinimalUploadSyncOptions(options);
101
+ const uploadOpts = {
102
+ ...buildMinimalUploadSyncOptions(options),
103
+ uploadStatus: options.uploadStatus === 'published' ? 'published' : 'draft',
104
+ pathOptions: {},
105
+ ...(options.authConfig && options.dataplaneUrl
106
+ ? {
107
+ authConfig: options.authConfig,
108
+ dataplaneUrl: options.dataplaneUrl,
109
+ environment: options.environment
110
+ }
111
+ : {})
112
+ };
102
113
  const uploadCtx = await uploadExternalSystem(systemKey, uploadOpts);
103
114
  if (uploadCtx?.uploadSkipped !== true && !isQuietMinimalSync(uploadOpts)) {
104
115
  logger.log(formatSuccessLine('Sync complete'));
@@ -117,7 +128,7 @@ async function syncLocalIfRequested(systemKey, options) {
117
128
  * @param {boolean} [options.debug] - Include debug, write log
118
129
  * @param {boolean} [options.verbose] - Verbose output
119
130
  * @param {boolean} [options.async] - If false, sync mode (default true)
120
- * @param {boolean} [options.noSync] - When true, skip upload (E2E uses dataplane config already deployed)
131
+ * @param {boolean} [options.noPublish] - When true, skip upload (E2E uses dataplane config already deployed)
121
132
  * @returns {Promise<{ success: boolean, results: Array<{ key: string, success: boolean, error?: string }> }>}
122
133
  */
123
134
  /**
@@ -125,11 +136,11 @@ async function syncLocalIfRequested(systemKey, options) {
125
136
  * @param {string} externalSystem
126
137
  * @returns {{ systemKey: string, keys: string[] }}
127
138
  */
128
- function resolveExternalIntegrationContext(externalSystem) {
139
+ function resolveExternalIntegrationContext(externalSystem, pathOptions = {}) {
129
140
  if (!externalSystem || typeof externalSystem !== 'string') {
130
141
  throw new Error('External system name is required');
131
142
  }
132
- const appPath = getIntegrationPath(externalSystem);
143
+ const appPath = resolveExternalSystemPath(externalSystem, pathOptions);
133
144
  if (!fs.existsSync(appPath)) {
134
145
  throw new Error(`Integration path not found: ${appPath}`);
135
146
  }
@@ -199,6 +210,8 @@ async function runTestE2EForExternalSystem(externalSystem, options = {}) {
199
210
  debug: options.debug,
200
211
  verbose: options.verbose,
201
212
  async: options.async !== false,
213
+ version: options.version,
214
+ syncMode: options.syncMode,
202
215
  authConfig,
203
216
  dataplaneUrl,
204
217
  quietPollUi: options.quietPollUi === true,
@@ -6,7 +6,7 @@
6
6
 
7
7
  'use strict';
8
8
 
9
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
9
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
10
10
 
11
11
  /**
12
12
  * @param {string[]} [raw]
@@ -34,7 +34,7 @@ function normalizeTestGovernanceCliOptions(options, cmd) {
34
34
  env: options.env || 'dev',
35
35
  verbose: options.verbose === true || has('-v') || has('--verbose'),
36
36
  json: options.json === true || has('--json'),
37
- noSync: cliOptsSkipSync(options, cmd),
37
+ noPublish: cliOptsSkipPublish(options, cmd),
38
38
  pack: options.pack,
39
39
  app: options.app,
40
40
  scenarioIds: collectScenarioIds(options.scenario)
@@ -4,7 +4,7 @@
4
4
 
5
5
  'use strict';
6
6
 
7
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
7
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
8
8
 
9
9
  /**
10
10
  * @param {Object} options - Commander-parsed options
@@ -19,7 +19,7 @@ function normalizeTestTrustCliOptions(options, cmd) {
19
19
  debug: options.debug === true || has('-d') || has('--debug'),
20
20
  verbose: options.verbose === true || has('-v') || has('--verbose'),
21
21
  revalidate: options.revalidate === true || has('--revalidate'),
22
- noSync: cliOptsSkipSync(options, cmd),
22
+ noPublish: cliOptsSkipPublish(options, cmd),
23
23
  strict: options.strict === true || has('--strict'),
24
24
  summary: options.summary === true || has('--summary'),
25
25
  json: options.json === true || has('--json'),
@@ -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,