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