@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,124 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+
7
+ const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../..');
8
+
9
+ /** application.yaml / platform apps need manifest-aware builder (not variables.yaml-only CLIs). */
10
+ const MIN_AIFABRIX_VERSION = '2.45.0';
11
+
12
+ /**
13
+ * @param {string} version - Semver string.
14
+ * @returns {number[]} Parsed numeric semver segments.
15
+ */
16
+ function parseSemver(version) {
17
+ return String(version)
18
+ .trim()
19
+ .split('.')
20
+ .map((part) => parseInt(part, 10) || 0);
21
+ }
22
+
23
+ /**
24
+ * @param {string} left - Left semver.
25
+ * @param {string} right - Right semver.
26
+ * @returns {number} Compare result (1, 0, -1).
27
+ */
28
+ function compareSemver(left, right) {
29
+ const a = parseSemver(left);
30
+ const b = parseSemver(right);
31
+ for (let i = 0; i < Math.max(a.length, b.length); i += 1) {
32
+ const av = a[i] || 0;
33
+ const bv = b[i] || 0;
34
+ if (av > bv) return 1;
35
+ if (av < bv) return -1;
36
+ }
37
+ return 0;
38
+ }
39
+
40
+ /**
41
+ * @param {string} bin - Candidate executable path.
42
+ * @returns {string|null} CLI version output or null.
43
+ */
44
+ function readAifabrixVersion(bin) {
45
+ try {
46
+ return execFileSync(bin, ['--version'], { encoding: 'utf8' }).trim();
47
+ } catch {
48
+ return null;
49
+ }
50
+ }
51
+
52
+ /**
53
+ * @returns {string[]} Candidate aifabrix binary paths.
54
+ */
55
+ function collectAifabrixCandidates() {
56
+ const candidates = [];
57
+ const seen = new Set();
58
+
59
+ const push = (candidate) => {
60
+ if (!candidate || seen.has(candidate)) {
61
+ return;
62
+ }
63
+ seen.add(candidate);
64
+ candidates.push(candidate);
65
+ };
66
+
67
+ push(path.join(repoRoot, 'bin', 'aifabrix.js'));
68
+
69
+ if (process.env.AIFABRIX_CLI) {
70
+ push(process.env.AIFABRIX_CLI);
71
+ }
72
+
73
+ const home = os.homedir();
74
+ push(path.join(home, '.npm-global', 'bin', 'aifabrix'));
75
+ push(path.join(home, '.local', 'bin', 'aifabrix'));
76
+
77
+ for (const dir of (process.env.PATH || '').split(path.delimiter)) {
78
+ if (!dir) continue;
79
+ push(path.join(dir, 'aifabrix'));
80
+ }
81
+
82
+ return candidates;
83
+ }
84
+
85
+ /**
86
+ * Prefer this repo's bin/aifabrix.js when developing the builder package locally.
87
+ *
88
+ * @returns {string} Resolved aifabrix executable path.
89
+ */
90
+ export function resolveAifabrixBin() {
91
+ let bestBin = null;
92
+ let bestVersion = null;
93
+
94
+ for (const candidate of collectAifabrixCandidates()) {
95
+ let resolved;
96
+ try {
97
+ if (fs.existsSync(candidate)) {
98
+ resolved = fs.realpathSync(candidate);
99
+ } else {
100
+ continue;
101
+ }
102
+ } catch {
103
+ continue;
104
+ }
105
+
106
+ const version = readAifabrixVersion(resolved);
107
+ if (!version) {
108
+ continue;
109
+ }
110
+ if (!bestVersion || compareSemver(version, bestVersion) > 0) {
111
+ bestBin = resolved;
112
+ bestVersion = version;
113
+ }
114
+ }
115
+
116
+ if (!bestBin || !bestVersion || compareSemver(bestVersion, MIN_AIFABRIX_VERSION) < 0) {
117
+ throw new Error(
118
+ `@aifabrix/builder >= ${MIN_AIFABRIX_VERSION} is required (found ${bestVersion || 'none'}). ` +
119
+ 'Install: npm run install:local — or set AIFABRIX_CLI to a newer aifabrix binary.'
120
+ );
121
+ }
122
+
123
+ return bestBin;
124
+ }
@@ -0,0 +1,183 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+
6
+ /**
7
+ * @typedef {Object} AppUrlProfile
8
+ * @property {string} appKey
9
+ * @property {number} portBase
10
+ * @property {string} [webServerUrlEnvKey]
11
+ * @property {string} [healthPath]
12
+ */
13
+
14
+ /**
15
+ * @returns {string}
16
+ */
17
+ function readDeveloperIdRaw() {
18
+ const configPath = path.join(os.homedir(), '.aifabrix', 'config.yaml');
19
+ if (!fs.existsSync(configPath)) {
20
+ return '0';
21
+ }
22
+ const match = fs.readFileSync(configPath, 'utf8').match(/^developer-id:\s*['"]?(\d+)['"]?\s*$/m);
23
+ return match ? match[1] : '0';
24
+ }
25
+
26
+ /**
27
+ * @param {string} appKey
28
+ * @param {string} developerIdRaw
29
+ * @returns {string}
30
+ */
31
+ function buildContainerName(appKey, developerIdRaw) {
32
+ const idNum = Number.parseInt(developerIdRaw, 10) || 0;
33
+ if (idNum === 0) {
34
+ return `aifabrix-${appKey}`;
35
+ }
36
+ return `aifabrix-dev${developerIdRaw}-${appKey}`;
37
+ }
38
+
39
+ /**
40
+ * @param {string} filePath
41
+ * @returns {Record<string, string>}
42
+ */
43
+ function parseEnvFile(filePath) {
44
+ const values = {};
45
+ for (const line of fs.readFileSync(filePath, 'utf8').split('\n')) {
46
+ const trimmed = line.trim();
47
+ if (!trimmed || trimmed.startsWith('#')) {
48
+ continue;
49
+ }
50
+ const eq = trimmed.indexOf('=');
51
+ if (eq === -1) {
52
+ continue;
53
+ }
54
+ const key = trimmed.slice(0, eq).trim();
55
+ let value = trimmed.slice(eq + 1).trim();
56
+ if (
57
+ (value.startsWith('"') && value.endsWith('"')) ||
58
+ (value.startsWith("'") && value.endsWith("'"))
59
+ ) {
60
+ value = value.slice(1, -1);
61
+ }
62
+ values[key] = value;
63
+ }
64
+ return values;
65
+ }
66
+
67
+ /**
68
+ * @param {string} raw
69
+ * @returns {string|null}
70
+ */
71
+ function normalizeHttpUrl(raw) {
72
+ const trimmed = raw?.trim();
73
+ if (!trimmed || trimmed.startsWith('kv://')) {
74
+ return null;
75
+ }
76
+ try {
77
+ const parsed = new URL(trimmed);
78
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
79
+ return null;
80
+ }
81
+ return parsed.toString().replace(/\/+$/, '');
82
+ } catch {
83
+ return null;
84
+ }
85
+ }
86
+
87
+ /**
88
+ * @param {string} repoRoot
89
+ * @param {string} appKey
90
+ * @param {string} envKey
91
+ * @returns {string|null}
92
+ */
93
+ function readBuilderEnvUrl(repoRoot, appKey, envKey) {
94
+ const envPath = path.join(repoRoot, 'builder', appKey, '.env');
95
+ if (!fs.existsSync(envPath)) {
96
+ return null;
97
+ }
98
+ return normalizeHttpUrl(parseEnvFile(envPath)[envKey]);
99
+ }
100
+
101
+ /**
102
+ * @param {string} containerName
103
+ * @param {string} envKey
104
+ * @returns {string|null}
105
+ */
106
+ function readContainerEnvUrl(containerName, envKey) {
107
+ const result = spawnSync('docker', ['exec', containerName, 'env'], {
108
+ encoding: 'utf8',
109
+ timeout: 8000
110
+ });
111
+ if (result.status !== 0) {
112
+ return null;
113
+ }
114
+ for (const line of result.stdout.split('\n')) {
115
+ if (!line.startsWith(`${envKey}=`)) {
116
+ continue;
117
+ }
118
+ return normalizeHttpUrl(line.slice(envKey.length + 1));
119
+ }
120
+ return null;
121
+ }
122
+
123
+ /**
124
+ * @param {string} containerName
125
+ * @returns {string|null}
126
+ */
127
+ function readDockerPublishedUrl(containerName) {
128
+ const result = spawnSync(
129
+ 'docker',
130
+ ['ps', '--filter', `name=^/${containerName}$`, '--format', '{{.Ports}}'],
131
+ { encoding: 'utf8', timeout: 8000 }
132
+ );
133
+ if (result.status !== 0) {
134
+ return null;
135
+ }
136
+ const portMatch = result.stdout.match(/:(\d+)->\d+\//);
137
+ if (!portMatch) {
138
+ return null;
139
+ }
140
+ return `http://localhost:${portMatch[1]}`;
141
+ }
142
+
143
+ /**
144
+ * @param {number} portBase
145
+ * @returns {number}
146
+ */
147
+ function resolveHostPort(portBase) {
148
+ const devId = Number.parseInt(readDeveloperIdRaw(), 10) || 0;
149
+ return devId === 0 ? portBase : portBase + devId * 100;
150
+ }
151
+
152
+ /**
153
+ * @param {AppUrlProfile} profile
154
+ * @param {{ repoRoot: string }} options
155
+ * @returns {string}
156
+ */
157
+ export function resolveAppUrl(profile, options) {
158
+ const { repoRoot } = options;
159
+ const envKey = profile.webServerUrlEnvKey;
160
+ const containerName = buildContainerName(profile.appKey, readDeveloperIdRaw());
161
+
162
+ if (envKey) {
163
+ const fromContainer = readContainerEnvUrl(containerName, envKey);
164
+ if (fromContainer) {
165
+ return `${fromContainer}/`;
166
+ }
167
+ }
168
+
169
+ const fromDockerPort = readDockerPublishedUrl(containerName);
170
+ if (fromDockerPort) {
171
+ return `${fromDockerPort}/`;
172
+ }
173
+
174
+ if (envKey) {
175
+ const fromBuilderEnv = readBuilderEnvUrl(repoRoot, profile.appKey, envKey);
176
+ if (fromBuilderEnv) {
177
+ return `${fromBuilderEnv}/`;
178
+ }
179
+ }
180
+
181
+ const port = resolveHostPort(profile.portBase);
182
+ return `http://localhost:${port}/`;
183
+ }
@@ -0,0 +1,42 @@
1
+ /** Minimal TTY spinner (no extra dependencies). */
2
+
3
+ const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
4
+
5
+ /**
6
+ * @param {string} label
7
+ * @returns {{ start: () => void, stop: (finalLine?: string) => void }}
8
+ */
9
+ export function createSpinner(label) {
10
+ let frameIndex = 0;
11
+ /** @type {NodeJS.Timeout | null} */
12
+ let timer = null;
13
+ const enabled = process.stdout.isTTY && process.env.CI !== 'true';
14
+
15
+ function clearLine() {
16
+ if (enabled) {
17
+ process.stdout.write('\r\x1b[K');
18
+ }
19
+ }
20
+
21
+ return {
22
+ start() {
23
+ if (!enabled) {
24
+ console.log(label);
25
+ return;
26
+ }
27
+ timer = setInterval(() => {
28
+ process.stdout.write(`\r${FRAMES[frameIndex++ % FRAMES.length]} ${label}`);
29
+ }, 80);
30
+ },
31
+ stop(finalLine) {
32
+ if (timer) {
33
+ clearInterval(timer);
34
+ timer = null;
35
+ }
36
+ clearLine();
37
+ if (finalLine) {
38
+ console.log(finalLine);
39
+ }
40
+ }
41
+ };
42
+ }
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Stage builder-api runtime files for Docker image build (plan 154.3).
4
+ *
5
+ * @fileoverview Host-side staging before `docker build`
6
+ * @author AI Fabrix Team
7
+ * @version 1.0.0
8
+ */
9
+
10
+ 'use strict';
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const {
15
+ discoverRuntimeFiles,
16
+ findManifestViolations
17
+ } = require('./lib/builder-api-docker-staging-core');
18
+ const { stageFiles } = require('./lib/builder-api-docker-staging-copy');
19
+
20
+ const REPO_ROOT = path.resolve(__dirname, '..');
21
+
22
+ /**
23
+ * @param {string[]} argv
24
+ * @returns {number}
25
+ */
26
+ function main(argv) {
27
+ const args = argv.slice(2);
28
+ let destination = path.join(REPO_ROOT, 'docker-builder-api-staging');
29
+ let manifestPath = '';
30
+
31
+ for (let i = 0; i < args.length; i += 1) {
32
+ if (args[i] === '--destination' && args[i + 1]) {
33
+ destination = path.resolve(args[i + 1]);
34
+ i += 1;
35
+ } else if (args[i] === '--manifest' && args[i + 1]) {
36
+ manifestPath = path.resolve(args[i + 1]);
37
+ i += 1;
38
+ }
39
+ }
40
+
41
+ const manifest = discoverRuntimeFiles(REPO_ROOT);
42
+ const violations = findManifestViolations(manifest);
43
+ if (violations.length > 0) {
44
+ console.error('Staging manifest contains forbidden paths:');
45
+ for (const item of violations) {
46
+ console.error(` - ${item}`);
47
+ }
48
+ return 1;
49
+ }
50
+
51
+ const staged = stageFiles(REPO_ROOT, destination, manifest);
52
+ if (manifestPath) {
53
+ fs.mkdirSync(path.dirname(manifestPath), { recursive: true });
54
+ fs.writeFileSync(manifestPath, `${JSON.stringify(staged, null, 2)}\n`, 'utf8');
55
+ }
56
+
57
+ console.log(`OK: staged ${staged.length} files → ${destination}`);
58
+ return 0;
59
+ }
60
+
61
+ if (require.main === module) {
62
+ process.exit(main(process.argv));
63
+ }
64
+
65
+ module.exports = { main };
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Publish builder/builder-api/ SSOT → templates/applications/builder-api/
4
+ * (manifest files only — no README; use builder/builder-api/README.md and packages/builder-api/README.md)
5
+ *
6
+ * @fileoverview sync-json for builder-api platform app (plan 154.2)
7
+ * @author AI Fabrix Team
8
+ * @version 1.0.0
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+
16
+ const REPO_ROOT = path.resolve(__dirname, '..');
17
+ const SSOT_DIR = path.join(REPO_ROOT, 'builder', 'builder-api');
18
+ const TEMPLATE_DIR = path.join(REPO_ROOT, 'templates', 'applications', 'builder-api');
19
+
20
+ const SYNC_FILES = ['application.yaml', 'Dockerfile', 'env.template'];
21
+
22
+ /**
23
+ * Publish builder/builder-api/ SSOT → templates/applications/builder-api/
24
+ * @returns {void}
25
+ */
26
+ function main() {
27
+ if (!fs.existsSync(SSOT_DIR)) {
28
+ console.error(`Missing SSOT directory: ${SSOT_DIR}`);
29
+ process.exit(1);
30
+ }
31
+ fs.mkdirSync(TEMPLATE_DIR, { recursive: true });
32
+ for (const name of SYNC_FILES) {
33
+ const src = path.join(SSOT_DIR, name);
34
+ const dest = path.join(TEMPLATE_DIR, name);
35
+ if (!fs.existsSync(src)) {
36
+ console.error(`Missing SSOT file: ${src}`);
37
+ process.exit(1);
38
+ }
39
+ fs.copyFileSync(src, dest);
40
+ console.log(`sync-json: ${path.relative(REPO_ROOT, src)} → ${path.relative(REPO_ROOT, dest)}`);
41
+ }
42
+ }
43
+
44
+ main();
@@ -13,6 +13,9 @@ Application templates are folder-based and located under `templates/applications
13
13
  **Example:**
14
14
  - `templates/applications/miso-controller/` - Miso Controller application template
15
15
  - `templates/applications/keycloak/` - Keycloak application template
16
+ - `templates/applications/builder-api/` - Builder API platform webapp (published from `builder/builder-api/` via `npm run sync-json`)
17
+
18
+ **Platform SSOT (builder-api, plan 154.2):** Edit `builder/builder-api/` in the aifabrix-builder repo, then run `npm run sync-json` to publish `application.yaml`, `Dockerfile`, and `env.template` into `templates/applications/builder-api/`. Install with `aifabrix up-platform` or `aifabrix up-builder-api` — not hand-editing the template copy.
16
19
 
17
20
  **Template Validation:**
18
21
  - Template folder must exist in `templates/applications/<name>/`
@@ -0,0 +1,38 @@
1
+ # Builder API production image — explicit runtime COPY only (plan 154.3).
2
+ # SSOT: builder/builder-api/Dockerfile — publish with `npm run sync-json`
3
+ # Staging: node scripts/stage_builder_api_for_docker.js (also runs via `aifabrix build builder-api`)
4
+ # Build context: repo root (application.yaml build.context ../..). .dockerignore is second line of defense.
5
+ # Never ship: .cursor/, integration/, tests/, templates/applications|github|infra|*, bin/aifabrix.js, packages/.
6
+ # Allowed templates in image: templates/openapi/, templates/external-system/ (via staging manifest only).
7
+
8
+ FROM node:20-bookworm-slim
9
+
10
+ ENV NODE_ENV=production \
11
+ PORT=3005
12
+
13
+ WORKDIR /app
14
+
15
+ RUN apt-get update \
16
+ && apt-get install -y --no-install-recommends dumb-init \
17
+ && rm -rf /var/lib/apt/lists/*
18
+
19
+ COPY package.json package-lock.json ./
20
+ RUN npm ci --omit=dev && npm cache clean --force
21
+
22
+ COPY docker-builder-api-staging/lib ./lib
23
+ COPY docker-builder-api-staging/bin/builder-api-spike.js ./bin/builder-api-spike.js
24
+ COPY docker-builder-api-staging/bin/builder-api-cleanup.js ./bin/builder-api-cleanup.js
25
+ COPY docker-builder-api-staging/templates ./templates
26
+
27
+ RUN addgroup --system appgroup \
28
+ && adduser --system --ingroup appgroup --home /app appuser \
29
+ && chown -R appuser:appgroup /app
30
+ USER appuser
31
+
32
+ EXPOSE 3005
33
+
34
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \
35
+ CMD node -e "require('http').get('http://127.0.0.1:'+(process.env.PORT||3005)+'/api/v1/builder/health',(r)=>process.exit(r.statusCode===200?0:1)).on('error',()=>process.exit(1))"
36
+
37
+ ENTRYPOINT ["dumb-init", "--"]
38
+ CMD ["node", "bin/builder-api-spike.js"]
@@ -0,0 +1,75 @@
1
+ # Application Metadata
2
+ app:
3
+ key: builder-api
4
+ displayName: 'AI Fabrix Builder API'
5
+ description: 'Stateless HTTP orchestration for external-system workspace lifecycle. Provider-neutral integration flows via Dataplane Enterprise MCP and governance APIs (154.0 / 154.1).'
6
+ type: webapp
7
+ language: typescript
8
+ version: 1.0.0
9
+
10
+ # Image Configuration
11
+ image:
12
+ name: aifabrix/builder-api
13
+ tag: latest
14
+ registry: aifabrixdevacr.azurecr.io
15
+ registryMode: acr
16
+
17
+ # Port Configuration (container port; host port = port + developer_id * 100)
18
+ port: 3005
19
+
20
+ frontDoorRouting:
21
+ enabled: false
22
+
23
+ requires:
24
+ database: false
25
+ redis: false
26
+ storage: true
27
+
28
+ healthCheck:
29
+ path: /api/v1/builder/health
30
+ interval: 30
31
+ bashProbe: true
32
+ probePath: /api/v1/builder/health
33
+ probeRequestType: GET
34
+ probeProtocol: Https
35
+ probeIntervalInSeconds: 120
36
+
37
+ authentication:
38
+ enableSSO: false
39
+
40
+ build:
41
+ context: ../..
42
+ dockerfile: builder/builder-api/Dockerfile
43
+ # Image policy (154.3): host staging → docker-builder-api-staging/; explicit COPY in Dockerfile;
44
+ # .dockerignore deny-by-default; verify with scripts/docker_image_content_gate.js builder-api.
45
+ envOutputPath: ../../.env
46
+ language: typescript
47
+ reloadStart: node bin/builder-api-spike.js
48
+ imageRun: exec node bin/builder-api-spike.js
49
+
50
+ repository:
51
+ enabled: true
52
+ repositoryUrl: https://github.com/esystemsdev/aifabrix-builder
53
+
54
+ configuration:
55
+ - name: LOG_LEVEL
56
+ portalInput:
57
+ field: select
58
+ label: 'Log Level'
59
+ options:
60
+ - debug
61
+ - info
62
+ - warn
63
+ - error
64
+
65
+ - name: WORKSPACE_DRAFT_TTL_DAYS
66
+ portalInput:
67
+ field: text
68
+ label: 'Draft workspace TTL (days)'
69
+ placeholder: '30'
70
+
71
+ - name: WORKSPACE_INACTIVE_MAX_DAYS
72
+ portalInput:
73
+ field: text
74
+ label: 'Inactive workspace purge threshold (days)'
75
+ placeholder: '90'
@@ -0,0 +1,48 @@
1
+ # Environment Variables Template — builder-api
2
+ # SSOT: builder/builder-api/env.template — publish with `npm run sync-json`
3
+
4
+ # =============================================================================
5
+ # APPLICATION
6
+ # =============================================================================
7
+
8
+ PORT=${PORT}
9
+ NODE_ENV=production
10
+ LOG_LEVEL=info
11
+
12
+ # Multi-user workspace root (persist via /mnt/data volume in Docker)
13
+ WORKSPACE_ROOT=/mnt/data/builder-workspaces
14
+
15
+ WORKSPACE_DRAFT_TTL_DAYS=30
16
+ WORKSPACE_INACTIVE_MAX_DAYS=90
17
+
18
+ MAX_BODY_BYTES=10485760
19
+ MAX_UPLOAD_TIMEOUT_MS=300000
20
+
21
+ # =============================================================================
22
+ # PLATFORM URLS
23
+ # =============================================================================
24
+ # url:// resolves after kv:// at resolve time (see docs/configuration/resolve-running-urls.md)
25
+
26
+ # Registered OAuth client (populated by aifabrix app register / bootstrap — same as dataplane)
27
+ MISO_CLIENTID=kv://builder-api-client-idKeyVault
28
+ MISO_CLIENTSECRET=kv://builder-api-client-secretKeyVault
29
+
30
+ # Internal: controller API for token validation (supports all miso-controller auth modes)
31
+ MISO_CONTROLLER_URL=url://miso-controller-internal
32
+
33
+ # Internal: server-to-dataplane API (MCP execute, upload, governance)
34
+ DATAPLANE_URL=url://dataplane-internal
35
+
36
+ DEFAULT_ENVIRONMENT=dev
37
+
38
+ # COM-generated Enterprise MCP owner system (normal MCP execute — no dataplane adapter)
39
+ ENTERPRISE_MCP_SYSTEM_KEY=enterprise-integration-lifecycle
40
+
41
+ # =============================================================================
42
+ # RUNTIME CONFIG (Docker dev-reload)
43
+ # =============================================================================
44
+ # Resolves kv:// for workspace upload/validate. On the host, symlink or copy under
45
+ # mount/aifabrix/ (bind-mounted at /mnt/data): config.yaml, secrets.local.yaml, certs/
46
+ # from ~/.aifabrix. Symlinks to host paths work because the kernel resolves them on the host.
47
+
48
+ AIFABRIX_CONFIG=/mnt/data/aifabrix/config.yaml