@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,281 @@
1
+ /**
2
+ * OpenAPI schema descriptions — wizard, repair, validate, upload, test.
3
+ *
4
+ * @fileoverview Request/result models for build and validate routes
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ /** @type {Record<string, Object>} */
12
+ const OPERATIONS_SCHEMA_DESCRIPTIONS = {
13
+ WizardSourceType: {
14
+ _schema: 'Wizard input source: OpenAPI file/URL, MCP server, or known platform template.'
15
+ },
16
+ WizardSourceConfig: {
17
+ _schema: 'Wizard source descriptor; set path, url, or platform based on type.',
18
+ type: 'Source kind that determines which other fields are required.',
19
+ path: 'Local filesystem path to an OpenAPI or wizard config file.',
20
+ url: 'Remote URL to fetch an OpenAPI document.',
21
+ platform: 'Known platform key when type is knownPlatform.'
22
+ },
23
+ WizardCredentialOptions: {
24
+ _schema: 'Optional credential hints for wizard credential selection step.',
25
+ method: 'Auth method hint for wizard (e.g. apikey, oauth2).',
26
+ credentialKey: 'Existing credential key in Dataplane to reuse.'
27
+ },
28
+ WizardPreferences: {
29
+ _schema: 'Optional wizard generation preferences for expose, RBAC, and sync defaults.',
30
+ expose: 'When true, generate exposed datasource API surfaces.',
31
+ rbac: 'When true, generate rbac.yaml with default roles.',
32
+ sync: 'When true, include sync configuration on datasources.'
33
+ },
34
+ CreateSystemRequest: {
35
+ _schema: 'Request body to create an empty integration workspace folder.',
36
+ systemKey: 'Unique integration system key for the new workspace.'
37
+ },
38
+ WizardConfigRequest: {
39
+ _schema: 'Headless wizard configuration to generate system and datasource JSON.',
40
+ appName: 'Integration app folder name under the user workspace.',
41
+ mode: 'Optional wizard mode override (defaults to headless generation).',
42
+ systemIdOrKey: 'Existing system id or key when extending an integration.',
43
+ systemDisplayName: 'Human-readable display name for the external system.',
44
+ source: 'OpenAPI, MCP, or platform source descriptor.',
45
+ credential: 'Optional credential selection hints.',
46
+ preferences: 'Optional expose, RBAC, and sync generation flags.',
47
+ debug: 'When true, enable verbose wizard logging (also available as query param).'
48
+ },
49
+ RepairRequest: {
50
+ _schema: 'Optional flags for workspace repair aligning manifest files with on-disk JSON.',
51
+ dryRun: 'Preview repair actions without writing files.',
52
+ auth: 'Repair authentication blocks (e.g. switch to apikey).',
53
+ rbac: 'Regenerate or repair rbac.yaml.',
54
+ expose: 'Align expose flags on datasources.',
55
+ sync: 'Align sync configuration on datasources.',
56
+ test: 'Align test payload sections on datasources.',
57
+ api: 'Repair OpenAPI exposure metadata on the system.',
58
+ operations:
59
+ 'When true, sync capabilities[] → openapi.operations → execution.cip.operations for operationId-shaped keys.',
60
+ rbacPreset:
61
+ 'When platform, apply dataplane platform roles from rbac.yaml SSOT instead of per-system admin/reader.'
62
+ },
63
+ ValidateRequest: {
64
+ _schema: 'Optional validate flags; pipeline validate may also be passed as query param.',
65
+ pipelineValidate: 'When true, run Dataplane pipeline validate-only after local AJV passes.'
66
+ },
67
+ PreviewUploadRequest: {
68
+ _schema: 'Optional flags for preview-upload (no Dataplane mutation).',
69
+ force: 'When true, build preview even when local validation reports warnings.'
70
+ },
71
+ UploadRequest: {
72
+ _schema: 'Optional flags for dev Dataplane upload (requires external-system:publish).',
73
+ force: 'When true, upload even when validation reports non-blocking issues.',
74
+ probe: 'When true, perform connectivity probe before upload.'
75
+ },
76
+ TestRequest: {
77
+ _schema: 'Optional test ladder options; runType may also be passed as query param.',
78
+ runType: 'Test stage: unit, integration (default), or e2e.',
79
+ noPublish: 'When true, skip publishing local files before integration or e2e tests.'
80
+ },
81
+ WizardRunData: {
82
+ _schema: 'Result after headless wizard completes file generation.',
83
+ systemKey: 'Integration system key that was materialized.',
84
+ status: 'Wizard completion status (completed when successful).'
85
+ },
86
+ RepairResultData: {
87
+ _schema: 'Detailed repair outcome listing files changed and flags updated.',
88
+ updated: 'True when any file or manifest field was modified.',
89
+ actionsPerformed: 'True when repair executed at least one action (dry-run may be false).',
90
+ changes: 'Human-readable list of repair actions taken.',
91
+ warnings: 'Non-blocking repair warnings.',
92
+ changedFiles: 'Workspace-relative paths that were written.',
93
+ systemFiles: 'System JSON paths touched by repair.',
94
+ datasourceFiles: 'Datasource JSON paths touched by repair.',
95
+ backupPaths: 'Backup copies created before mutating files.',
96
+ appKeyFixed: 'True when application.yaml app key was corrected.',
97
+ datasourceKeysFixed: 'True when datasource systemKey references were corrected.',
98
+ rbacFileCreated: 'True when rbac.yaml was created.',
99
+ envTemplateRepaired: 'True when env.template auth vars were aligned.',
100
+ manifestRegenerated: 'True when deploy manifest JSON was regenerated.',
101
+ readmeRegenerated: 'True when README.md was regenerated.'
102
+ },
103
+ ValidationStepResult: {
104
+ _schema: 'Result of one validation step (application, components, or manifest).',
105
+ valid: 'True when this step passed with no errors.',
106
+ errors: 'Blocking validation error messages.',
107
+ warnings: 'Non-blocking validation warnings.',
108
+ files: 'Files validated in this step.',
109
+ skipped: 'True when the step was skipped (e.g. missing optional inputs).'
110
+ },
111
+ ValidationSteps: {
112
+ _schema: 'Per-layer validation breakdown for local AJV validate.',
113
+ application: 'application.yaml / variables validation result.',
114
+ components: 'External system and datasource JSON validation result.',
115
+ manifest: 'Deploy manifest and integration file list validation result.'
116
+ },
117
+ ValidationResultCore: {
118
+ _schema: 'Aggregate local validation result for the integration workspace.',
119
+ valid: 'True when all executed steps passed.',
120
+ errors: 'Combined blocking errors across steps.',
121
+ warnings: 'Combined warnings across steps.',
122
+ steps: 'Per-step validation results.',
123
+ appPath: 'Absolute or workspace-relative app path validated.'
124
+ },
125
+ PipelineValidationResult: {
126
+ _schema: 'Dataplane pipeline validate-only result (read-only toward Dataplane).',
127
+ valid: 'True when pipeline validation succeeded.',
128
+ isValid: 'Alias flag mirroring valid from Dataplane response.',
129
+ errors: 'Pipeline validation errors from Dataplane.',
130
+ warnings: 'Pipeline validation warnings from Dataplane.'
131
+ },
132
+ ValidateResultData: {
133
+ _schema: 'Combined local and optional pipeline validation payload.',
134
+ validationResult: 'Local AJV validation aggregate.',
135
+ pipelineValidation: 'Pipeline validate-only result when requested; null otherwise.'
136
+ },
137
+ UploadApplicationPreview: {
138
+ _schema: 'Application summary inside an upload payload preview.',
139
+ key: 'Application key in the deploy payload.',
140
+ displayName: 'Human-readable application name.',
141
+ type: 'Application type (external for integrations).'
142
+ },
143
+ UploadDatasourcePreview: {
144
+ _schema: 'Datasource key entry inside upload payload preview.',
145
+ key: 'Datasource key included in the deploy payload.'
146
+ },
147
+ UploadManifestPreview: {
148
+ _schema: 'Top-level manifest metadata in preview-upload response.',
149
+ key: 'External system key in the manifest.',
150
+ version: 'Manifest or integration version string.',
151
+ type: 'Manifest type discriminator.'
152
+ },
153
+ UploadPayloadPreview: {
154
+ _schema: 'Deploy payload body preview without credentials or Dataplane mutation.',
155
+ version: 'Payload schema version.',
156
+ application: 'Application object summary.',
157
+ dataSources: 'Datasource keys that would be uploaded.'
158
+ },
159
+ PreviewUploadData: {
160
+ _schema: 'Preview-upload result: manifest summary plus redacted payload preview.',
161
+ manifest: 'Manifest metadata that would be sent to Dataplane.',
162
+ payload: 'Structured deploy payload preview (no secrets).'
163
+ },
164
+ UploadResultData: {
165
+ _schema: 'Dev upload result after publish to Dataplane.',
166
+ dataplaneUrl: 'Dataplane base URL used for upload.',
167
+ environment: 'Target environment name (typically dev).',
168
+ uploadSkipped: 'True when upload was skipped (e.g. validate-only or no changes).'
169
+ },
170
+ TestSystemFileResult: {
171
+ _schema: 'Unit test result for one system-level JSON file.',
172
+ file: 'Validated file path.',
173
+ valid: 'True when structural validation passed.',
174
+ errors: 'Structural validation errors for this file.'
175
+ },
176
+ TestDatasourceResult: {
177
+ _schema: 'Unit or structural test result for one datasource file.',
178
+ key: 'Datasource key.',
179
+ file: 'Datasource JSON file path.',
180
+ valid: 'True when all checks for this datasource passed.',
181
+ errors: 'Validation or test errors.',
182
+ warnings: 'Non-blocking warnings.',
183
+ structuralValid: 'True when JSON schema validation passed.',
184
+ payloadTestsRan: 'True when test payload execution ran.',
185
+ payloadTestsOk: 'True when test payload execution succeeded.'
186
+ },
187
+ IntegrationDatasourceResult: {
188
+ _schema: 'Integration test result for one datasource via Dataplane pipeline.',
189
+ key: 'Datasource key tested.',
190
+ success: 'True when integration test passed.',
191
+ skipped: 'True when the datasource test was skipped.',
192
+ error: 'Error message when success is false.'
193
+ },
194
+ E2ETestRunItem: {
195
+ _schema: 'End-to-end test result for one datasource against live APIs.',
196
+ key: 'Datasource key tested.',
197
+ success: 'True when e2e test passed.',
198
+ error: 'Error message when success is false.',
199
+ datasourceTestRun: 'Dataplane datasource test run summary when available.'
200
+ },
201
+ DatasourceTestRunSummary: {
202
+ _schema: 'Summary of a Dataplane datasource test run record.',
203
+ id: 'Test run id in Dataplane.',
204
+ status: 'Test run status string from Dataplane.',
205
+ datasourceKey: 'Datasource key associated with the run.'
206
+ },
207
+ UnitTestResultData: {
208
+ _schema: 'Aggregate unit test result for local integration files.',
209
+ runType: 'Always unit for this variant.',
210
+ valid: 'True when all system and datasource unit checks passed.',
211
+ errors: 'Aggregate error messages.',
212
+ warnings: 'Aggregate warnings.',
213
+ systemResults: 'Per system-file validation results.',
214
+ datasourceResults: 'Per datasource validation results.',
215
+ systemKey: 'Integration system key tested.',
216
+ appName: 'Integration app folder name.'
217
+ },
218
+ IntegrationTestResultData: {
219
+ _schema: 'Aggregate integration test result via Dataplane pipeline.',
220
+ runType: 'Always integration for this variant.',
221
+ success: 'True when all datasource integration tests passed.',
222
+ datasourceResults: 'Per-datasource integration outcomes.',
223
+ systemKey: 'Integration system key tested.',
224
+ appName: 'Integration app folder name.'
225
+ },
226
+ E2ETestResultData: {
227
+ _schema: 'Aggregate e2e test result against live external APIs.',
228
+ runType: 'Always e2e for this variant.',
229
+ success: 'True when all datasource e2e tests passed.',
230
+ results: 'Per-datasource e2e outcomes.'
231
+ },
232
+ TestResultData: {
233
+ _schema: 'Discriminated union of unit, integration, or e2e test results (see runType).'
234
+ },
235
+ WizardRunResponse: {
236
+ _schema: '200 response envelope for runWizard.',
237
+ success: 'Always true for successful builder-api JSON responses.',
238
+ data: 'Typed payload; see WizardRunData.',
239
+ correlationId: 'UUID correlating logs for this request.',
240
+ requestId: 'Optional per-request UUID when emitted by the server.'
241
+ },
242
+ RepairResultResponse: {
243
+ _schema: '200 response envelope for runRepair.',
244
+ success: 'Always true for successful builder-api JSON responses.',
245
+ data: 'Typed payload; see RepairResultData.',
246
+ correlationId: 'UUID correlating logs for this request.',
247
+ requestId: 'Optional per-request UUID when emitted by the server.'
248
+ },
249
+ ValidateResultResponse: {
250
+ _schema: '200 response envelope for runValidate.',
251
+ success: 'Always true for successful builder-api JSON responses.',
252
+ data: 'Typed payload; see ValidateResultData.',
253
+ correlationId: 'UUID correlating logs for this request.',
254
+ requestId: 'Optional per-request UUID when emitted by the server.'
255
+ },
256
+ PreviewUploadResponse: {
257
+ _schema: '200 response envelope for runPreviewUpload.',
258
+ success: 'Always true for successful builder-api JSON responses.',
259
+ data: 'Typed payload; see PreviewUploadData.',
260
+ correlationId: 'UUID correlating logs for this request.',
261
+ requestId: 'Optional per-request UUID when emitted by the server.'
262
+ },
263
+ UploadResultResponse: {
264
+ _schema: '200 response envelope for runUpload.',
265
+ success: 'Always true for successful builder-api JSON responses.',
266
+ data: 'Typed payload; see UploadResultData.',
267
+ correlationId: 'UUID correlating logs for this request.',
268
+ requestId: 'Optional per-request UUID when emitted by the server.'
269
+ },
270
+ TestResultResponse: {
271
+ _schema: '200 response envelope for runTest.',
272
+ success: 'Always true for successful builder-api JSON responses.',
273
+ data: 'Typed payload; see TestResultData.',
274
+ correlationId: 'UUID correlating logs for this request.',
275
+ requestId: 'Optional per-request UUID when emitted by the server.'
276
+ }
277
+ };
278
+
279
+ module.exports = {
280
+ OPERATIONS_SCHEMA_DESCRIPTIONS
281
+ };
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Helpers for frozen OpenAPI component schemas (additionalProperties: false).
3
+ *
4
+ * @fileoverview Shared builders for builder-api OpenAPI models
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ /**
12
+ * @param {Record<string, Object>} properties
13
+ * @param {string[]} [required]
14
+ * @returns {Object}
15
+ */
16
+ function frozenObject(properties, required) {
17
+ const schema = { type: 'object', properties, additionalProperties: false };
18
+ if (required && required.length > 0) {
19
+ schema.required = required;
20
+ }
21
+ return schema;
22
+ }
23
+
24
+ /**
25
+ * @param {string} name
26
+ * @returns {{ $ref: string }}
27
+ */
28
+ function schemaRef(name) {
29
+ return { $ref: `#/components/schemas/${name}` };
30
+ }
31
+
32
+ /**
33
+ * @returns {Object}
34
+ */
35
+ function stringArraySchema() {
36
+ return { type: 'array', items: { type: 'string' } };
37
+ }
38
+
39
+ /**
40
+ * @param {string} dataSchemaName
41
+ * @returns {Object}
42
+ */
43
+ function buildSuccessEnvelopeSchema(dataSchemaName) {
44
+ return frozenObject(
45
+ {
46
+ success: { type: 'boolean', enum: [true] },
47
+ data: schemaRef(dataSchemaName),
48
+ correlationId: { type: 'string', format: 'uuid' },
49
+ requestId: { type: 'string', format: 'uuid' }
50
+ },
51
+ ['success', 'data', 'correlationId']
52
+ );
53
+ }
54
+
55
+ /**
56
+ * @param {Object} schema
57
+ * @param {string} [path]
58
+ * @returns {string[]}
59
+ */
60
+ function collectAdditionalPropertiesViolations(schema, path = '') {
61
+ if (!schema || typeof schema !== 'object') {
62
+ return [];
63
+ }
64
+ const violations = [];
65
+ const here = path || 'root';
66
+ if (schema.additionalProperties === true) {
67
+ violations.push(here);
68
+ }
69
+ if (schema.properties && typeof schema.properties === 'object') {
70
+ for (const [key, child] of Object.entries(schema.properties)) {
71
+ violations.push(...collectAdditionalPropertiesViolations(child, `${here}.properties.${key}`));
72
+ }
73
+ }
74
+ if (schema.items) {
75
+ violations.push(...collectAdditionalPropertiesViolations(schema.items, `${here}.items`));
76
+ }
77
+ for (const key of ['oneOf', 'anyOf', 'allOf']) {
78
+ if (Array.isArray(schema[key])) {
79
+ schema[key].forEach((child, index) => {
80
+ violations.push(...collectAdditionalPropertiesViolations(child, `${here}.${key}[${index}]`));
81
+ });
82
+ }
83
+ }
84
+ return violations;
85
+ }
86
+
87
+ module.exports = {
88
+ frozenObject,
89
+ schemaRef,
90
+ stringArraySchema,
91
+ buildSuccessEnvelopeSchema,
92
+ collectAdditionalPropertiesViolations
93
+ };
@@ -0,0 +1,203 @@
1
+ /**
2
+ * OpenAPI 3.0 document for builder-api workspace orchestration routes.
3
+ *
4
+ * @fileoverview Generated from capability-registry + typed component schemas
5
+ * @author AI Fabrix Team
6
+ * @version 1.1.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { CAPABILITIES } = require('./capability-registry');
12
+ const { BASE } = require('./http-route-match');
13
+ const { getOperationDescription } = require('./openapi-descriptions');
14
+ const { buildOpenApiComponentSchemas } = require('./openapi-component-schemas');
15
+ const { getOperationBinding, IDEMPOTENCY_HEADER } = require('./openapi-operation-bindings');
16
+ const { buildOperationXAfabrix, listOrchestrationDatasourceTags } = require('./orchestration-openapi-meta');
17
+
18
+ /**
19
+ * @param {string} routePattern
20
+ * @returns {string}
21
+ */
22
+ function toOpenApiPath(routePattern) {
23
+ return `${BASE}${routePattern}`.replace(/:([A-Za-z]+)/g, '{$1}');
24
+ }
25
+
26
+ /**
27
+ * @param {string} responseSchemaName
28
+ * @returns {Object}
29
+ */
30
+ function successResponseContent(responseSchemaName) {
31
+ return {
32
+ description: 'Successful builder-api envelope (success, data, correlationId, requestId).',
33
+ content: {
34
+ 'application/json': {
35
+ schema: { $ref: `#/components/schemas/${responseSchemaName}` }
36
+ }
37
+ }
38
+ };
39
+ }
40
+
41
+ /**
42
+ * @param {string} description
43
+ * @returns {Object}
44
+ */
45
+ function problemResponseContent(description) {
46
+ return {
47
+ description,
48
+ content: {
49
+ 'application/problem+json': {
50
+ schema: { $ref: '#/components/schemas/ProblemDetails' }
51
+ }
52
+ }
53
+ };
54
+ }
55
+
56
+ /**
57
+ * @returns {Record<string, Object>}
58
+ */
59
+ function buildStandardErrorResponses() {
60
+ return {
61
+ 400: problemResponseContent('Invalid request (validation, JSON parse, or missing required body field).'),
62
+ 401: problemResponseContent('Missing or invalid Bearer token.'),
63
+ 404: problemResponseContent('Workspace system not found or route handler not registered.'),
64
+ 408: problemResponseContent('Request exceeded capability timeout.'),
65
+ 409: problemResponseContent('Workspace lock held by another in-flight operation.'),
66
+ 413: problemResponseContent('Request body exceeds MAX_BODY_BYTES.'),
67
+ 500: problemResponseContent('Unexpected server error.')
68
+ };
69
+ }
70
+
71
+ /**
72
+ * @param {string} handlerId
73
+ * @returns {boolean}
74
+ */
75
+ function requiresBearerAuth(handlerId) {
76
+ return handlerId !== 'health' && handlerId !== 'ready';
77
+ }
78
+
79
+ /**
80
+ * @param {Object} capability
81
+ * @param {Object} operation
82
+ */
83
+ function applyOperationDurationHints(capability, operation) {
84
+ const durationByHandler = {
85
+ runUpload: Number(process.env.MAX_UPLOAD_TIMEOUT_MS || 300000),
86
+ runTest: Number(process.env.MAX_TEST_E2E_TIMEOUT_MS || 120000),
87
+ runCertifyPillar: Number(process.env.MAX_CERTIFY_TIMEOUT_MS || 120000)
88
+ };
89
+ const durationMs = durationByHandler[capability.handlerId];
90
+ if (durationMs !== undefined) {
91
+ operation['x-max-duration-ms'] = durationMs;
92
+ }
93
+ }
94
+
95
+ /**
96
+ * @param {Object} capability
97
+ * @returns {Object}
98
+ */
99
+ function buildOperationObject(capability) {
100
+ const meta = getOperationDescription(capability.handlerId);
101
+ const binding = getOperationBinding(capability.handlerId);
102
+ const operation = {
103
+ operationId: capability.handlerId,
104
+ summary: meta.summary,
105
+ description: meta.description,
106
+ tags: meta.tags,
107
+ responses: {
108
+ 200: successResponseContent(binding.successResponse),
109
+ ...buildStandardErrorResponses()
110
+ }
111
+ };
112
+
113
+ const parameters = [...(binding.parameters || []), ...(binding.queryParameters || [])];
114
+ if (capability.mutating) {
115
+ operation.description = `${meta.description} Requires Idempotency-Key header on mutating retries.`;
116
+ parameters.push(IDEMPOTENCY_HEADER);
117
+ }
118
+ if (parameters.length > 0) {
119
+ operation.parameters = parameters;
120
+ }
121
+
122
+ if (binding.requestBody) {
123
+ operation.requestBody = binding.requestBody;
124
+ }
125
+
126
+ if (requiresBearerAuth(capability.handlerId)) {
127
+ operation.security = [{ bearerAuth: [] }];
128
+ }
129
+
130
+ applyOperationDurationHints(capability, operation);
131
+ operation['x-aifabrix'] = buildOperationXAfabrix(capability);
132
+
133
+ return operation;
134
+ }
135
+
136
+ /**
137
+ * @param {Object} [options]
138
+ * @param {string} [options.publicBaseUrl]
139
+ * @returns {Object}
140
+ */
141
+ function buildOpenApiSpec(options = {}) {
142
+ const publicBaseUrl = (options.publicBaseUrl || '').replace(/\/$/, '');
143
+ const serverUrl = publicBaseUrl || '/';
144
+ /** @type {Record<string, Object>} */
145
+ const paths = {};
146
+ for (const capability of CAPABILITIES) {
147
+ const pathKey = toOpenApiPath(capability.route);
148
+ if (!paths[pathKey]) {
149
+ paths[pathKey] = {};
150
+ }
151
+ const method = capability.method.toLowerCase();
152
+ paths[pathKey][method] = buildOperationObject(capability);
153
+ }
154
+
155
+ return {
156
+ openapi: '3.0.3',
157
+ info: {
158
+ title: 'AI Fabrix Builder API',
159
+ version: '1.0.0',
160
+ description:
161
+ 'Workspace orchestration for external-system dev publish. Repository and template operations delegate to Enterprise MCP (154.1). Successful JSON responses use `{ success, data, correlationId, requestId? }` with `application/json`. Errors use RFC 7807 Problem Details (`application/problem+json`) aligned with miso-controller and dataplane.',
162
+ 'x-aifabrix': {
163
+ redocUrl: '/api/docs',
164
+ contractTier: 'public',
165
+ mcpGenerationReady: true,
166
+ rbacPreset: 'platform',
167
+ datasourceSplitMode: 'per-tag',
168
+ orchestrationDatasourceTags: listOrchestrationDatasourceTags()
169
+ }
170
+ },
171
+ servers: [{ url: serverUrl, description: 'Builder API public base URL' }],
172
+ tags: [
173
+ { name: 'workspace', description: 'Per-user integration workspaces (list, create, manifest, status, diff).' },
174
+ { name: 'build', description: 'Wizard generation and manifest repair.' },
175
+ { name: 'manifest', description: 'Governed section get/patch/repair for LLM and MCP workflows.' },
176
+ { name: 'validate', description: 'Local AJV validation and preview-upload (no Dataplane mutation).' },
177
+ { name: 'test', description: 'Unit, integration, and e2e test ladder.' },
178
+ { name: 'certify', description: 'Verify operations/trust/governance and lifecycle certification.' },
179
+ { name: 'apply', description: 'Dev Dataplane upload (requires external-system:publish).' },
180
+ { name: 'template', description: 'Enterprise MCP template.materializeWorkspace and workspace reset.' },
181
+ { name: 'repository', description: 'Enterprise MCP repository.sync, createReview, status, dispatchPipeline.' },
182
+ { name: 'infra', description: 'Liveness and readiness probes (no authentication).' }
183
+ ],
184
+ components: {
185
+ securitySchemes: {
186
+ bearerAuth: {
187
+ type: 'http',
188
+ scheme: 'bearer',
189
+ bearerFormat: 'JWT',
190
+ description:
191
+ 'User access token from aifabrix login. Forwarded to Dataplane; requires external-system:publish for dev upload.'
192
+ }
193
+ },
194
+ schemas: buildOpenApiComponentSchemas()
195
+ },
196
+ paths
197
+ };
198
+ }
199
+
200
+ module.exports = {
201
+ buildOpenApiSpec,
202
+ toOpenApiPath
203
+ };