@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,177 @@
1
+ /**
2
+ * Sync capabilities[] → openapi.operations → execution.cip.operations (plan 154.7).
3
+ *
4
+ * @fileoverview repair-datasource-sync-operations
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { listCapabilityKeys } = require('../datasource/capability/capability-manifest');
12
+
13
+ const MANIFEST_KEY_PATTERN = /^[a-z][a-zA-Z0-9]*$/;
14
+
15
+ /**
16
+ * @param {string} key
17
+ * @returns {boolean}
18
+ */
19
+ function isManifestOperationKey(key) {
20
+ return typeof key === 'string' && MANIFEST_KEY_PATTERN.test(key.trim());
21
+ }
22
+
23
+ /**
24
+ * @param {unknown} capabilities
25
+ * @returns {string[]}
26
+ */
27
+ function capabilityKeysFromManifest(capabilities) {
28
+ return listCapabilityKeys(capabilities).filter(isManifestOperationKey);
29
+ }
30
+
31
+ /**
32
+ * @param {Object} parsed
33
+ * @param {string} key
34
+ * @returns {Object|undefined}
35
+ */
36
+ function openapiOperationEntry(parsed, key) {
37
+ const ops = parsed?.openapi?.operations;
38
+ if (!ops || typeof ops !== 'object') {
39
+ return undefined;
40
+ }
41
+ const entry = ops[key];
42
+ return entry && typeof entry === 'object' ? entry : undefined;
43
+ }
44
+
45
+ /**
46
+ * @param {Object} parsed
47
+ * @param {string} key
48
+ * @returns {Object|undefined}
49
+ */
50
+ function cipOperationEntry(parsed, key) {
51
+ const ops = parsed?.execution?.cip?.operations;
52
+ if (!ops || typeof ops !== 'object') {
53
+ return undefined;
54
+ }
55
+ const entry = ops[key];
56
+ return entry && typeof entry === 'object' ? entry : undefined;
57
+ }
58
+
59
+ /**
60
+ * @param {string} key
61
+ * @param {Object|undefined} openapiEntry
62
+ * @returns {Object}
63
+ */
64
+ function buildOpenapiOperationStub(key, openapiEntry) {
65
+ if (openapiEntry && typeof openapiEntry.operationId === 'string' && openapiEntry.operationId.trim()) {
66
+ return { operationId: openapiEntry.operationId.trim() };
67
+ }
68
+ return { operationId: key };
69
+ }
70
+
71
+ /**
72
+ * @param {string} key
73
+ * @param {Object|undefined} openapiEntry
74
+ * @returns {Object}
75
+ */
76
+ function buildCipOperationStub(key, openapiEntry) {
77
+ const description =
78
+ (openapiEntry && typeof openapiEntry.summary === 'string' && openapiEntry.summary.trim()) ||
79
+ `Execute ${key} via OpenAPI passthrough`;
80
+ return {
81
+ enabled: true,
82
+ description,
83
+ steps: [
84
+ {
85
+ fetch: {
86
+ source: 'openapi',
87
+ openapiRef: key,
88
+ query: {}
89
+ }
90
+ },
91
+ { output: { mode: 'records' } }
92
+ ]
93
+ };
94
+ }
95
+
96
+ /**
97
+ * @param {Object} parsed
98
+ * @returns {void}
99
+ */
100
+ function ensureSyncOperationScaffold(parsed) {
101
+ if (!parsed.openapi || typeof parsed.openapi !== 'object') {
102
+ parsed.openapi = {};
103
+ }
104
+ if (!parsed.openapi.operations || typeof parsed.openapi.operations !== 'object') {
105
+ parsed.openapi.operations = {};
106
+ }
107
+ if (!parsed.execution || typeof parsed.execution !== 'object') {
108
+ parsed.execution = { engine: 'cip' };
109
+ }
110
+ if (!parsed.execution.cip || typeof parsed.execution.cip !== 'object') {
111
+ parsed.execution.cip = { operations: {} };
112
+ }
113
+ if (!parsed.execution.cip.operations || typeof parsed.execution.cip.operations !== 'object') {
114
+ parsed.execution.cip.operations = {};
115
+ }
116
+ }
117
+
118
+ /**
119
+ * @param {Object} parsed
120
+ * @param {string} key
121
+ * @param {string[]} changes
122
+ * @returns {boolean}
123
+ */
124
+ function syncCapabilityOperationKey(parsed, key, changes) {
125
+ let updated = false;
126
+ const openapiEntry = openapiOperationEntry(parsed, key);
127
+ if (!openapiEntry) {
128
+ parsed.openapi.operations[key] = buildOpenapiOperationStub(key, openapiEntry);
129
+ changes.push(`Added openapi.operations.${key}`);
130
+ updated = true;
131
+ } else if (!openapiEntry.operationId) {
132
+ parsed.openapi.operations[key] = buildOpenapiOperationStub(key, openapiEntry);
133
+ changes.push(`Set openapi.operations.${key}.operationId`);
134
+ updated = true;
135
+ }
136
+
137
+ if (!cipOperationEntry(parsed, key)) {
138
+ parsed.execution.cip.operations[key] = buildCipOperationStub(key, parsed.openapi.operations[key]);
139
+ changes.push(`Added execution.cip.operations.${key}`);
140
+ updated = true;
141
+ }
142
+ return updated;
143
+ }
144
+
145
+ /**
146
+ * Ensure openapi.operations and execution.cip.operations mirror capabilities[] keys.
147
+ *
148
+ * @param {Object} parsed - Parsed datasource (mutated)
149
+ * @param {string[]} changes - Change log
150
+ * @returns {boolean}
151
+ */
152
+ function repairSyncOperationsFromCapabilities(parsed, changes) {
153
+ const keys = capabilityKeysFromManifest(parsed?.capabilities);
154
+ if (keys.length === 0) {
155
+ return false;
156
+ }
157
+
158
+ ensureSyncOperationScaffold(parsed);
159
+
160
+ let updated = false;
161
+ for (const key of keys) {
162
+ updated = syncCapabilityOperationKey(parsed, key, changes) || updated;
163
+ }
164
+
165
+ if (updated && parsed.openapi.enabled !== true) {
166
+ parsed.openapi.enabled = true;
167
+ changes.push('Set openapi.enabled=true (capabilities synced)');
168
+ }
169
+
170
+ return updated;
171
+ }
172
+
173
+ module.exports = {
174
+ repairSyncOperationsFromCapabilities,
175
+ capabilityKeysFromManifest,
176
+ isManifestOperationKey
177
+ };
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Datasource repair helpers for webhook and syncBridge manifest sections.
3
+ *
4
+ * @fileoverview Align webhook defaults and syncBridge metadata warnings (454.11)
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const AUTH_USAGE_WEBHOOK_INBOUND = 'webhookInbound';
10
+
11
+ /**
12
+ * @param {object|null|undefined} systemParsed
13
+ * @returns {boolean}
14
+ */
15
+ function systemHasWebhookInboundAuth(systemParsed) {
16
+ if (!systemParsed || typeof systemParsed !== 'object') {
17
+ return false;
18
+ }
19
+ const rows = systemParsed.authentications;
20
+ if (Array.isArray(rows)) {
21
+ return rows.some((row) => row && row.usage === AUTH_USAGE_WEBHOOK_INBOUND);
22
+ }
23
+ return false;
24
+ }
25
+
26
+ /**
27
+ * @param {object} parsed
28
+ * @param {string[]} changes
29
+ * @param {string[]} warnings
30
+ * @returns {boolean}
31
+ */
32
+ function repairWebhookSection(parsed, changes, warnings) {
33
+ if (!parsed?.webhook || typeof parsed.webhook !== 'object') {
34
+ return false;
35
+ }
36
+ const webhook = parsed.webhook;
37
+ let updated = false;
38
+
39
+ if (webhook.enabled === true) {
40
+ if (!webhook.idPath || !String(webhook.idPath).trim()) {
41
+ warnings.push(
42
+ 'webhook.enabled is true but idPath is missing — set idPath (for example $.objectId) before upload.'
43
+ );
44
+ }
45
+ if (!Array.isArray(webhook.events) || webhook.events.length === 0) {
46
+ warnings.push('webhook.enabled is true but events[] is empty — add vendor event names.');
47
+ }
48
+ }
49
+
50
+ if (webhook.enabled === true && !webhook.endpointMode) {
51
+ webhook.endpointMode = 'datasource';
52
+ changes.push('Set webhook.endpointMode default datasource');
53
+ updated = true;
54
+ }
55
+
56
+ return updated;
57
+ }
58
+
59
+ /**
60
+ * @param {object} parsed
61
+ * @param {string[]} changes
62
+ * @param {string[]} warnings
63
+ * @returns {boolean}
64
+ */
65
+ function ensureSyncBridgeExternalIdMetadata(parsed, changes) {
66
+ const mode = parsed?.syncBridge || 'disabled';
67
+ if (mode === 'disabled') {
68
+ return false;
69
+ }
70
+ if (!parsed.metadataSchema || typeof parsed.metadataSchema !== 'object') {
71
+ parsed.metadataSchema = { type: 'object', additionalProperties: true, properties: {} };
72
+ }
73
+ if (!parsed.metadataSchema.properties || typeof parsed.metadataSchema.properties !== 'object') {
74
+ parsed.metadataSchema.properties = {};
75
+ }
76
+ const ext = parsed.metadataSchema.properties.externalId;
77
+ const ok =
78
+ ext && typeof ext === 'object' && ext.type === 'string' && ext.index === true;
79
+ if (ok) {
80
+ return false;
81
+ }
82
+ parsed.metadataSchema.properties.externalId = {
83
+ ...(typeof ext === 'object' && ext !== null ? ext : {}),
84
+ type: 'string',
85
+ index: true
86
+ };
87
+ changes.push('Ensured metadataSchema.properties.externalId for syncBridge participation');
88
+ return true;
89
+ }
90
+
91
+ /**
92
+ * @param {object} parsed
93
+ * @param {string[]} changes
94
+ * @param {string[]} warnings
95
+ * @returns {boolean}
96
+ */
97
+ function repairSyncBridgeSection(parsed, changes, warnings) {
98
+ const mode = parsed?.syncBridge || 'disabled';
99
+ if (mode === 'disabled') {
100
+ return false;
101
+ }
102
+ if (mode === 'master' && !parsed.resourceType) {
103
+ warnings.push('syncBridge=master requires resourceType for propagation grouping.');
104
+ }
105
+ return ensureSyncBridgeExternalIdMetadata(parsed, changes);
106
+ }
107
+
108
+ /**
109
+ * @param {object} parsed
110
+ * @param {object|null|undefined} systemParsed
111
+ * @param {string[]} warnings
112
+ * @returns {void}
113
+ */
114
+ function collectWebhookSyncBridgeSystemWarnings(parsed, systemParsed, warnings) {
115
+ if (!parsed?.webhook?.enabled) {
116
+ return;
117
+ }
118
+ if (systemHasWebhookInboundAuth(systemParsed)) {
119
+ return;
120
+ }
121
+ const dsKey = parsed.key || parsed.datasourceKey || 'datasource';
122
+ warnings.push(
123
+ `${dsKey}: webhook.enabled but system lacks authentications[usage=webhookInbound]. ` +
124
+ 'Run: aifabrix repair <systemKey> --auth-webhook'
125
+ );
126
+ }
127
+
128
+ module.exports = {
129
+ repairWebhookSection,
130
+ repairSyncBridgeSection,
131
+ collectWebhookSyncBridgeSystemWarnings,
132
+ systemHasWebhookInboundAuth
133
+ };
@@ -10,9 +10,7 @@
10
10
  'use strict';
11
11
 
12
12
  const { repairOpenapiSection } = require('./repair-datasource-openapi');
13
- const { normalizeAutoRbacOperationKeys } = require('./repair-datasource-auto-rbac');
14
13
  const { repairTestPayload } = require('./repair-datasource-test-payload');
15
- const { repairComV2Manifest } = require('./repair-datasource-com-v2');
16
14
  const {
17
15
  isDeprecatedNoneLlmManifest,
18
16
  repairNoneLlmToServiceContract,
@@ -386,80 +384,26 @@ function sanitizeTestPayloadTopLevel(parsed, changes) {
386
384
  return true;
387
385
  }
388
386
 
389
- /**
390
- * @param {Object} parsed
391
- * @param {Object} options
392
- * @returns {boolean}
393
- */
394
- function shouldApplyServiceContractRepair(parsed, options) {
395
- return (
396
- isDeprecatedNoneLlmManifest(parsed) ||
397
- (options.serviceContract && parsed?.resourceType === 'llm')
398
- );
399
- }
400
-
401
- /**
402
- * @param {Object} parsed
403
- * @param {Object} options
404
- * @param {boolean} none
405
- * @param {string[]} changes
406
- * @returns {boolean}
407
- */
408
- function applyOptionalDatasourceRepairs(parsed, options, none, changes) {
409
- let updated = false;
410
- if (options.expose) {
411
- updated = repairExposeFromAttributes(parsed, changes) || updated;
412
- }
413
- if (!none && options.sync) {
414
- updated = repairSyncSection(parsed, changes) || updated;
415
- }
416
- if (options.test) {
417
- sanitizeTestPayloadTopLevel(parsed, changes);
418
- updated = repairTestPayload(parsed, changes) || updated;
419
- updated = sanitizeTestPayloadTopLevel(parsed, changes) || updated;
420
- }
421
- return updated;
422
- }
423
-
424
387
  /**
425
388
  * Runs all requested datasource repairs.
426
389
  *
427
390
  * @param {Object} parsed - Parsed datasource object (mutated)
428
- * @param {Object} options - { expose?: boolean, sync?: boolean, test?: boolean }
391
+ * @param {Object} options - { expose?: boolean, sync?: boolean, test?: boolean, operations?: boolean }
429
392
  * @param {string[]} [changes] - Optional array to append change descriptions to
430
393
  * @returns {{ updated: boolean, changes: string[] }}
431
394
  */
432
395
  function repairDatasourceFile(parsed, options = {}, changes = []) {
433
- const out = Array.isArray(changes) ? changes : [];
434
- let updated = stripDeprecatedServiceCategory(parsed, out);
435
-
436
- if (shouldApplyServiceContractRepair(parsed, options)) {
437
- updated = repairNoneLlmToServiceContract(parsed, out) || updated;
438
- }
439
-
440
- const none = isNoneEntityType(parsed?.entityType);
441
-
442
- updated = applyBaseDatasourceRepairs(parsed, none, out) || updated;
443
- updated = applyOpenapiDatasourceRepairs(parsed, out) || updated;
444
- updated = applyOptionalDatasourceRepairs(parsed, options, none, out) || updated;
445
-
446
- return { updated, changes: out };
447
- }
448
-
449
- function applyBaseDatasourceRepairs(parsed, none, changes) {
450
- let updated = repairComV2Manifest(parsed, changes);
451
- if (none) return updated;
452
- updated = repairDimensionBindingShape(parsed, changes) || updated;
453
- updated = repairRootDimensionsFromAttributes(parsed, changes) || updated;
454
- updated = repairMetadataSchemaFromAttributes(parsed, changes) || updated;
455
- return updated;
456
- }
457
-
458
- function applyOpenapiDatasourceRepairs(parsed, changes) {
459
- let updated = false;
460
- updated = repairOpenapiSection(parsed, changes) || updated;
461
- updated = normalizeAutoRbacOperationKeys(parsed, changes) || updated;
462
- return updated;
396
+ const { runRepairDatasourceFile } = require('./repair-datasource-apply');
397
+ return runRepairDatasourceFile(parsed, options, changes, {
398
+ stripDeprecatedServiceCategory,
399
+ isNoneEntityType,
400
+ repairDimensionBindingShape,
401
+ repairRootDimensionsFromAttributes,
402
+ repairMetadataSchemaFromAttributes,
403
+ repairExposeFromAttributes,
404
+ repairSyncSection,
405
+ sanitizeTestPayloadTopLevel
406
+ });
463
407
  }
464
408
 
465
409
  module.exports = {
@@ -15,6 +15,10 @@ const { systemKeyToKvPrefix, kvEnvKeyToPath, securityKeyToVar } = require('../ut
15
15
  const { extractEnvTemplate } = require('../generator/split');
16
16
  const { generateExternalEnvTemplateContent } = require('../utils/external-env-template');
17
17
  const { commentOrphanKvEnvLines } = require('../utils/env-kv-orphan-lines');
18
+ const {
19
+ addFromAuthenticationsArray,
20
+ normalizeAuthenticationsSecurity
21
+ } = require('../utils/authentication-env-template');
18
22
 
19
23
  /**
20
24
  * Normalizes a keyvault config entry to canonical KV_* name and path-style value.
@@ -114,7 +118,12 @@ function buildEffectiveConfiguration(systemParsed, systemKey) {
114
118
  const seenNames = new Set();
115
119
  const config = Array.isArray(systemParsed.configuration) ? systemParsed.configuration : [];
116
120
  addFromConfiguration(effective, config, prefix, seenNames, systemKey);
117
- addFromAuthSecurity(effective, systemParsed, prefix, seenNames, systemKey);
121
+ addFromAuthenticationsArray(effective, systemParsed, prefix, seenNames, systemKey);
122
+ const hasAuthSlots =
123
+ Array.isArray(systemParsed.authentications) && systemParsed.authentications.length > 0;
124
+ if (!hasAuthSlots) {
125
+ addFromAuthSecurity(effective, systemParsed, prefix, seenNames, systemKey);
126
+ }
118
127
  return effective;
119
128
  }
120
129
 
@@ -394,6 +403,7 @@ function normalizeSystemFileAuthAndConfig(systemParsed, systemKey, changes) {
394
403
  const credential = getAuthCredentialTemplate(systemParsed.authentication);
395
404
  const security = credential?.security ?? systemParsed.authentication?.security;
396
405
  let updated = (security && typeof security === 'object' && normalizeSecuritySection(security, prefix, systemKey, changes));
406
+ updated = normalizeAuthenticationsSecurity(systemParsed, systemKey, changes) || updated;
397
407
  const config = systemParsed.configuration;
398
408
  if (Array.isArray(config)) {
399
409
  updated = normalizeConfigurationSection(config, prefix, systemKey, changes) || updated;
@@ -9,12 +9,21 @@
9
9
  'use strict';
10
10
 
11
11
  const { normalizeDatasourceKeysAndFilenames } = require('./repair-datasource-keys');
12
- const { resolveSystemContext } = require('./repair-system-alignment');
13
- const { persistChangesAndRegenerate, regenerateReadmeIfRequested } = require('./repair-persist');
12
+ const {
13
+ resolveSystemContext,
14
+ alignSystemFileDataSources,
15
+ ensureExternalIntegrationBlock
16
+ } = require('./repair-system-alignment');
17
+ const { persistChangesAndRegenerate, regenerateReadmeIfRequested, regenerateDeployScript } = require('./repair-persist');
14
18
  const { runRepairSteps } = require('./repair-steps');
15
19
  const { runDatasourceRepairs } = require('./repair-datasource-run');
20
+ const { repairSplitOrchestrationDatasources } = require('./repair-orchestration-datasource-split');
16
21
  const { maybeRepairRbac } = require('./repair-rbac');
22
+ const { collectCapabilityOpenApiDriftWarnings } = require('./repair-capability-openapi-warnings');
17
23
  const { maybeRunOpenApiSyncForMcp } = require('./repair-openapi-sync');
24
+ const { writeConfigFile } = require('../utils/config-format');
25
+ const { backupIntegrationFile } = require('../utils/integration-file-backup');
26
+ const { trackRepairWrite } = require('./repair-changed-files');
18
27
 
19
28
  /**
20
29
  * @param {Object} steps
@@ -95,25 +104,48 @@ function prepareRepairWorkspace(params) {
95
104
 
96
105
  /**
97
106
  * @param {Object} ws
98
- * @returns {Promise<Object>}
107
+ * @returns {boolean}
99
108
  */
100
- async function runRepairIntegrationFileSteps(ws) {
101
- const steps = runRepairSteps({
102
- appPath: ws.appPath,
103
- configPath: ws.configPath,
104
- variables: ws.variables,
105
- systemFilePath: ws.systemFilePath,
106
- systemParsed: ws.systemParsed,
107
- systemKey: ws.systemKey,
108
- systemFiles: ws.systemFiles,
109
- datasourceFiles: ws.datasourceFiles,
110
- dryRun: ws.dryRun,
111
- changes: ws.changes,
112
- warnings: ws.warnings,
113
- auth: ws.authOption,
114
- format: ws.rbacFmt,
115
- backupCtx: ws.backupCtx
116
- });
109
+ function reconcileManifestsAfterDatasourceSplit(ws) {
110
+ const dataSourcesAligned = alignSystemFileDataSources(
111
+ ws.appPath,
112
+ ws.systemParsed,
113
+ ws.datasourceFiles,
114
+ ws.systemKey,
115
+ ws.dryRun,
116
+ ws.changes
117
+ );
118
+ const extAligned = ensureExternalIntegrationBlock(
119
+ ws.variables,
120
+ ws.systemFiles,
121
+ ws.datasourceFiles,
122
+ ws.changes
123
+ );
124
+ if ((dataSourcesAligned || extAligned) && !ws.dryRun) {
125
+ backupIntegrationFile(ws.systemFilePath, ws.backupCtx);
126
+ writeConfigFile(ws.systemFilePath, ws.systemParsed);
127
+ trackRepairWrite(ws.systemFilePath, ws.backupCtx);
128
+ }
129
+ return dataSourcesAligned || extAligned;
130
+ }
131
+
132
+ /**
133
+ * @param {Object} ws
134
+ * @returns {Promise<{ datasourceRepairUpdated: boolean, openapiActionsPerformed: boolean }>}
135
+ */
136
+ async function runDatasourceOpenApiRepairs(ws) {
137
+ const splitResult = repairSplitOrchestrationDatasources(
138
+ ws.appPath,
139
+ ws.systemKey,
140
+ ws.datasourceFiles,
141
+ ws.options,
142
+ ws.dryRun,
143
+ ws.changes
144
+ );
145
+ if (splitResult.updated) {
146
+ ws.datasourceFiles = splitResult.datasourceFiles;
147
+ reconcileManifestsAfterDatasourceSplit(ws);
148
+ }
117
149
  const datasourceRepairUpdated = runDatasourceRepairs(
118
150
  ws.appPath,
119
151
  ws.datasourceFiles,
@@ -121,10 +153,12 @@ async function runRepairIntegrationFileSteps(ws) {
121
153
  expose: Boolean(ws.options.expose),
122
154
  sync: Boolean(ws.options.sync),
123
155
  test: Boolean(ws.options.test),
156
+ operations: Boolean(ws.options.operations) || Boolean(ws.options.rbac),
124
157
  backupCtx: ws.backupCtx
125
158
  },
126
159
  ws.dryRun,
127
- ws.changes
160
+ ws.changes,
161
+ { systemParsed: ws.systemParsed, warnings: ws.warnings }
128
162
  );
129
163
  const openapiActionsPerformed = await maybeRunOpenApiSyncForMcp({
130
164
  options: ws.options,
@@ -132,23 +166,68 @@ async function runRepairIntegrationFileSteps(ws) {
132
166
  appPath: ws.appPath,
133
167
  systemKey: ws.systemKey,
134
168
  datasourceFiles: ws.datasourceFiles,
135
- changes: ws.changes
169
+ changes: ws.changes,
170
+ backupCtx: ws.backupCtx
136
171
  });
137
- const { rbacMigratedFromSystem, rbacMergeUpdated } = maybeRepairRbac(
138
- ws.appPath,
139
- ws.systemFilePath,
140
- ws.systemParsed,
141
- ws.datasourceFiles,
142
- { rbac: Boolean(ws.options.rbac), rbacFmt: ws.rbacFmt, dryRun: ws.dryRun, changes: ws.changes, backupCtx: ws.backupCtx }
143
- );
172
+ return { datasourceRepairUpdated: datasourceRepairUpdated || splitResult.updated, openapiActionsPerformed };
173
+ }
174
+
175
+ /**
176
+ * @param {Object} ws
177
+ * @returns {Promise<Object>}
178
+ */
179
+ async function runRepairIntegrationFileSteps(ws) {
180
+ const steps = runRepairSteps({
181
+ appPath: ws.appPath,
182
+ configPath: ws.configPath,
183
+ variables: ws.variables,
184
+ systemFilePath: ws.systemFilePath,
185
+ systemParsed: ws.systemParsed,
186
+ systemKey: ws.systemKey,
187
+ systemFiles: ws.systemFiles,
188
+ datasourceFiles: ws.datasourceFiles,
189
+ dryRun: ws.dryRun,
190
+ changes: ws.changes,
191
+ warnings: ws.warnings,
192
+ auth: ws.authOption,
193
+ format: ws.rbacFmt,
194
+ backupCtx: ws.backupCtx,
195
+ options: ws.options
196
+ });
197
+ if (ws.options.rbac) {
198
+ collectCapabilityOpenApiDriftWarnings(ws.appPath, ws.datasourceFiles, ws.warnings);
199
+ }
200
+ const { datasourceRepairUpdated, openapiActionsPerformed } = await runDatasourceOpenApiRepairs(ws);
201
+ const { rbacMigratedFromSystem, rbacMergeUpdated, rbacSyncedIntoSystem, rbacSecurityBound } =
202
+ maybeRepairRbac(
203
+ ws.appPath,
204
+ ws.systemFilePath,
205
+ ws.systemParsed,
206
+ ws.datasourceFiles,
207
+ {
208
+ rbac: Boolean(ws.options.rbac),
209
+ rbacFmt: ws.rbacFmt,
210
+ rbacPreset: ws.options.rbacPreset,
211
+ dryRun: ws.dryRun,
212
+ changes: ws.changes,
213
+ backupCtx: ws.backupCtx
214
+ }
215
+ );
144
216
  const anyLocalUpdated =
145
- ws.keysNormalized || steps.updated || datasourceRepairUpdated || rbacMigratedFromSystem || rbacMergeUpdated;
217
+ ws.keysNormalized ||
218
+ steps.updated ||
219
+ datasourceRepairUpdated ||
220
+ rbacMigratedFromSystem ||
221
+ rbacMergeUpdated ||
222
+ rbacSyncedIntoSystem ||
223
+ rbacSecurityBound;
146
224
  return {
147
225
  steps,
148
226
  anyLocalUpdated,
149
227
  changes: ws.changes,
150
228
  warnings: ws.warnings,
151
229
  openapiActionsPerformed,
230
+ systemKey: ws.systemKey,
152
231
  systemFiles: ws.systemFiles,
153
232
  datasourceFiles: ws.datasourceFiles
154
233
  };
@@ -171,7 +250,8 @@ async function runRepairLocalUpdates(params) {
171
250
  async function finalizeRepairIntegration(params, local) {
172
251
  const { appName, options, appPath, configPath, dryRun, backupPaths, backupCtx, variables, originalYamlContent } =
173
252
  params;
174
- const { steps, anyLocalUpdated, changes, warnings, openapiActionsPerformed, systemFiles, datasourceFiles } = local;
253
+ const { steps, anyLocalUpdated, changes, warnings, openapiActionsPerformed, systemKey, systemFiles, datasourceFiles } =
254
+ local;
175
255
  let manifestRegenerated = false;
176
256
  if (anyLocalUpdated && !dryRun) {
177
257
  manifestRegenerated = await persistChangesAndRegenerate({
@@ -190,6 +270,16 @@ async function finalizeRepairIntegration(params, local) {
190
270
  { ...options, backupCtx },
191
271
  changes
192
272
  );
273
+ if (!dryRun) {
274
+ await regenerateDeployScript(
275
+ appPath,
276
+ systemKey || appName,
277
+ systemFiles,
278
+ datasourceFiles,
279
+ changes,
280
+ backupCtx
281
+ );
282
+ }
193
283
  const changedFiles = dryRun ? backupCtx.wouldChangeFiles : backupCtx.changedFiles;
194
284
  return buildRepairResult(steps, anyLocalUpdated, manifestRegenerated, readmeRegenerated, {
195
285
  actionsPerformed: openapiActionsPerformed,
@@ -9,7 +9,7 @@
9
9
  'use strict';
10
10
 
11
11
  const path = require('path');
12
- const fs = require('fs');
12
+ const fs = require('../internal/fs-real-sync');
13
13
  const chalk = require('chalk');
14
14
  const logger = require('../utils/logger');
15
15