@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,29 @@
1
+ /**
2
+ * Resolve bearer context for manifest CLI commands.
3
+ *
4
+ * @fileoverview Uses aifabrix auth token + developer workspace root
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const path = require('path');
12
+ const os = require('os');
13
+ const { getValidatedAuthContext } = require('./auth-status');
14
+
15
+ /**
16
+ * @returns {Promise<{ userId: string, bearerToken: string, workspaceRoot: string }>}
17
+ */
18
+ async function resolveActorBearerContext() {
19
+ const ctx = await getValidatedAuthContext();
20
+ const userId = ctx.authConfig?.userId || 'cli-user';
21
+ const workspaceRoot = process.env.WORKSPACE_ROOT || path.join(os.homedir(), '.aifabrix', 'builder-workspaces');
22
+ return {
23
+ userId: String(userId),
24
+ bearerToken: ctx.authConfig.token,
25
+ workspaceRoot
26
+ };
27
+ }
28
+
29
+ module.exports = { resolveActorBearerContext };
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Register manifest CLI subcommands (plan 154.4).
3
+ *
4
+ * @fileoverview Keeps setupManifestCommands under max-lines-per-function
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('fs');
12
+ const chalk = require('chalk');
13
+ const { getManifestSection, listManifestSections } = require('../programmatic/manifest-get-section');
14
+ const { patchManifestSection } = require('../programmatic/manifest-patch-section');
15
+ const { runManifestRepair } = require('../programmatic/manifest-repair');
16
+ const { resolveActorBearerContext } = require('./manifest-cli-auth');
17
+ const { resolveManifestCliIntegrationPath } = require('./manifest-cli-integration-path');
18
+ const { createWorkspaceContext, runWithWorkspaceContext } = require('../programmatic/workspace-context');
19
+
20
+ /**
21
+ * @param {import('commander').Command} manifest
22
+ */
23
+ function registerManifestSubcommands(manifest) {
24
+ registerManifestReadCommands(manifest);
25
+ registerManifestWriteCommands(manifest);
26
+ }
27
+
28
+ /**
29
+ * @param {import('commander').Command} manifest
30
+ */
31
+ function registerManifestReadCommands(manifest) {
32
+ manifest
33
+ .command('get-section <systemKey> <sectionKey>')
34
+ .description('Read one governed manifest section with quality and read token')
35
+ .option('--datasource <key>', 'Datasource key for datasource sections')
36
+ .option('--json', 'Print JSON result')
37
+ .action(async(systemKey, sectionKey, options) => {
38
+ await runManifestCliAction(options, async(ctx) => {
39
+ printManifestResult(
40
+ await getManifestSection(ctx, { sectionKey, datasourceKey: options.datasource }),
41
+ options
42
+ );
43
+ }, systemKey);
44
+ });
45
+
46
+ manifest
47
+ .command('list-sections <systemKey>')
48
+ .description('List governed section keys for a workspace system')
49
+ .option('--json', 'Print JSON result')
50
+ .action(async(systemKey, options) => {
51
+ await runManifestCliAction(options, async(ctx) => {
52
+ printManifestResult(await listManifestSections(ctx), options);
53
+ }, systemKey);
54
+ });
55
+ }
56
+
57
+ /**
58
+ * @param {import('commander').Command} manifest
59
+ */
60
+ function registerManifestWriteCommands(manifest) {
61
+ manifest
62
+ .command('patch-section <systemKey> <sectionKey>')
63
+ .description('Patch one governed manifest section (requires prior get-section token)')
64
+ .requiredOption('--intent <text>', 'Why this patch is made (audit)')
65
+ .option('--datasource <key>', 'Datasource key for datasource sections')
66
+ .option('--file <path>', 'JSON file with patch payload object')
67
+ .option('--mode <mode>', 'merge or replace', 'merge')
68
+ .option('--token <token>', 'sectionReadToken from get-section')
69
+ .option('--dry-run', 'Validate without writing')
70
+ .option('--json', 'Print JSON result')
71
+ .action(async(systemKey, sectionKey, options) => {
72
+ await runManifestCliAction(options, async(ctx) => {
73
+ printManifestResult(await patchFromCli(ctx, sectionKey, options), options);
74
+ }, systemKey);
75
+ });
76
+
77
+ manifest
78
+ .command('repair <systemKey>')
79
+ .description('Run explicit manifest repair hooks after section patches')
80
+ .requiredOption('--hooks <list>', 'Comma-separated hooks (fieldMappings,expose,rbac,...)')
81
+ .option('--section-key <key>', 'Section key for graph-derived ordering metadata')
82
+ .option('--datasource <key>', 'Datasource key for post-repair quality snapshot')
83
+ .option('--dry-run', 'Preview repair')
84
+ .option('--json', 'Print JSON result')
85
+ .action(async(systemKey, options) => {
86
+ await runManifestCliAction(options, async(ctx) => {
87
+ const hooks = String(options.hooks)
88
+ .split(',')
89
+ .map((h) => h.trim())
90
+ .filter(Boolean);
91
+ printManifestResult(
92
+ await runManifestRepair(ctx, {
93
+ hooks,
94
+ sectionKey: options.sectionKey,
95
+ datasourceKey: options.datasource,
96
+ dryRun: options.dryRun === true
97
+ }),
98
+ options
99
+ );
100
+ }, systemKey);
101
+ });
102
+ }
103
+
104
+ /**
105
+ * @param {import('./workspace-context').WorkspaceContext} ctx
106
+ * @param {string} sectionKey
107
+ * @param {Object} options
108
+ */
109
+ async function patchFromCli(ctx, sectionKey, options) {
110
+ const patch = options.file ? JSON.parse(fs.readFileSync(options.file, 'utf8')) : {};
111
+ let token = options.token;
112
+ if (!token) {
113
+ const view = await getManifestSection(ctx, { sectionKey, datasourceKey: options.datasource });
114
+ token = view.sectionReadToken;
115
+ }
116
+ return patchManifestSection(ctx, {
117
+ sectionKey,
118
+ datasourceKey: options.datasource,
119
+ intent: options.intent,
120
+ patch,
121
+ mode: options.mode,
122
+ sectionReadToken: token,
123
+ dryRun: options.dryRun === true
124
+ });
125
+ }
126
+
127
+ /**
128
+ * @param {Object} result
129
+ * @param {Object} options
130
+ */
131
+ function printManifestResult(result, options) {
132
+ if (options.json) {
133
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
134
+ return;
135
+ }
136
+ process.stdout.write(`${chalk.green('✓ Manifest operation completed')}\n`);
137
+ if (result.sectionKey) {
138
+ process.stdout.write(`${chalk.cyan(` section: ${result.sectionKey}`)}\n`);
139
+ }
140
+ if (result.quality) {
141
+ process.stdout.write(`${chalk.cyan(` quality.score: ${result.quality.score}`)}\n`);
142
+ }
143
+ if (result.nextActions) {
144
+ process.stdout.write(`${chalk.cyan(` nextActions: ${result.nextActions.join(' → ')}`)}\n`);
145
+ }
146
+ }
147
+
148
+ /**
149
+ * @param {Object} options
150
+ * @param {Function} fn
151
+ * @param {string} systemKey
152
+ */
153
+ async function runManifestCliAction(options, fn, systemKey) {
154
+ const auth = await resolveActorBearerContext();
155
+ const { integrationPath } = resolveManifestCliIntegrationPath(systemKey);
156
+ const ctx = createWorkspaceContext({
157
+ userId: auth.userId,
158
+ systemKey,
159
+ bearerToken: auth.bearerToken,
160
+ workspaceRoot: auth.workspaceRoot,
161
+ integrationPath
162
+ });
163
+ await runWithWorkspaceContext(ctx, () => fn(ctx));
164
+ }
165
+
166
+ module.exports = {
167
+ registerManifestSubcommands,
168
+ printManifestResult,
169
+ runManifestCliAction
170
+ };
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Resolve on-disk integration path for manifest CLI (plan 141).
3
+ *
4
+ * @fileoverview cwd/integration → cwd/builder → ~/.aifabrix materialization
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('../internal/fs-real-sync');
12
+ const path = require('path');
13
+ const { resolveApplicationManifestPathSync } = require('../utils/manifest-location');
14
+ const { getIntegrationPath } = require('../utils/paths');
15
+ const { findIntegrationPathAcrossWorkTree } = require('../utils/integration-path-resolve');
16
+ const { discoverIntegrationFiles } = require('./repair-internal');
17
+
18
+ /**
19
+ * @param {string} systemKey
20
+ * @returns {{ integrationPath: string, tier: string }}
21
+ */
22
+ function resolveManifestCliIntegrationPath(systemKey) {
23
+ const manifestHit = resolveApplicationManifestPathSync({ targetKey: systemKey, mode: 'auto' });
24
+ if (manifestHit) {
25
+ return { integrationPath: manifestHit.absolutePath, tier: manifestHit.tier };
26
+ }
27
+
28
+ const fallback = getIntegrationPath(systemKey);
29
+ if (fs.existsSync(fallback)) {
30
+ const { systemFiles, datasourceFiles } = discoverIntegrationFiles(fallback);
31
+ if (systemFiles.length > 0 || datasourceFiles.length > 0) {
32
+ return { integrationPath: fallback, tier: 'paths-fallback' };
33
+ }
34
+ }
35
+
36
+ const workHit = findIntegrationPathAcrossWorkTree(systemKey);
37
+ if (workHit) {
38
+ return workHit;
39
+ }
40
+
41
+ const err = new Error(
42
+ `Integration "${systemKey}" not found. Looked under cwd/integration/${systemKey}/, ` +
43
+ 'aifabrix-work sibling repos (*/integration/), and materialized ~/.aifabrix/.../integration/. ' +
44
+ 'Run from the repo that contains the integration, set aifabrix-work, or set WORKSPACE_ROOT for builder-api workspaces.'
45
+ );
46
+ err.statusCode = 404;
47
+ throw err;
48
+ }
49
+
50
+ /**
51
+ * @param {string} integrationPath
52
+ * @param {string} systemKey
53
+ */
54
+ function assertIntegrationPathMatchesSystemKey(integrationPath, systemKey) {
55
+ if (path.basename(path.resolve(integrationPath)) !== systemKey) {
56
+ throw new Error(`integrationPath must end with systemKey "${systemKey}"`);
57
+ }
58
+ }
59
+
60
+ module.exports = {
61
+ resolveManifestCliIntegrationPath,
62
+ assertIntegrationPathMatchesSystemKey
63
+ };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * CLI manifest command group (plan 154.4).
3
+ *
4
+ * @fileoverview Thin wrapper registering manifest subcommands
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { registerManifestSubcommands } = require('./manifest-cli-commands');
12
+
13
+ /**
14
+ * @param {import('commander').Command} program
15
+ */
16
+ function setupManifestCommands(program) {
17
+ const manifest = program.command('manifest').description('Governed manifest section editing (get, patch, repair)');
18
+ registerManifestSubcommands(manifest);
19
+ }
20
+
21
+ module.exports = { setupManifestCommands };
@@ -47,7 +47,7 @@ const PROTECTION_UPLOAD_HELP_AFTER = `
47
47
  Examples:
48
48
  $ aifabrix protection upload hubspot-companies
49
49
  $ aifabrix protection upload hubspot-companies --dry-run
50
- $ aifabrix protection upload hubspot-companies --no-sync
50
+ $ aifabrix protection upload hubspot-companies --sync
51
51
  `;
52
52
 
53
53
  const PROTECTION_LIST_HELP_AFTER = `
@@ -194,13 +194,13 @@ function registerProtectionUpload(protection) {
194
194
  manifestPath: resolved.manifestPath,
195
195
  warningsAsErrors: options.warningsAsErrors === true,
196
196
  dryRun: options.dryRun === true,
197
- noSync: options.noSync === true,
197
+ sync: options.sync === true,
198
198
  verbose: options.verbose === true
199
199
  }, logger);
200
200
  },
201
201
  [
202
202
  ['--dry-run', 'Validate only; no upload or sync'],
203
- ['--no-sync', 'Skip datasource sync after upload']
203
+ ['--sync', 'Force full datasource data sync after upload (default: bootstrap-if-empty)']
204
204
  ],
205
205
  PROTECTION_UPLOAD_HELP_AFTER
206
206
  );
@@ -27,7 +27,8 @@ const ALLOWED_REPAIR_AUTH = [
27
27
  'queryparam',
28
28
  'oidc',
29
29
  'hmac',
30
- 'none'
30
+ 'none',
31
+ 'bearerforward'
31
32
  ];
32
33
 
33
34
  const PRESERVED_VARIABLE_KEYS = ['baseUrl', 'testEndpoint'];
@@ -56,6 +57,9 @@ function isAllowedRepairAuth(authOption) {
56
57
  */
57
58
  function buildAuthenticationForRepair(systemKey, authOption) {
58
59
  const normalized = normalizeRepairAuthOption(authOption);
60
+ if (normalized === 'bearerforward') {
61
+ return buildBearerForwardAuthentication();
62
+ }
59
63
  const schemaMethod =
60
64
  normalized === 'queryparam'
61
65
  ? 'queryParam'
@@ -65,6 +69,14 @@ function buildAuthenticationForRepair(systemKey, authOption) {
65
69
  return buildAuthenticationFromMethod(systemKey, schemaMethod);
66
70
  }
67
71
 
72
+ /**
73
+ * Facade APIs that forward the caller Bearer token — no workspace kv secret.
74
+ * @returns {{ authType: 'none' }}
75
+ */
76
+ function buildBearerForwardAuthentication() {
77
+ return { authType: 'none' };
78
+ }
79
+
68
80
  /**
69
81
  * Merges preserved connectivity fields from existing auth into template variables.
70
82
  * @param {Object} mergedVariables - Target variables object (mutated)
@@ -87,6 +99,7 @@ function mergePreservedAuthVariables(mergedVariables, existingVars) {
87
99
  function repairAuthChangeLabel(authOption) {
88
100
  const normalized = normalizeRepairAuthOption(authOption);
89
101
  if (normalized === 'bearertoken' || normalized === 'bearerkey') return 'bearerToken';
102
+ if (normalized === 'bearerforward') return 'bearerForward';
90
103
  return normalized;
91
104
  }
92
105
 
@@ -144,6 +157,7 @@ module.exports = {
144
157
  normalizeRepairAuthOption,
145
158
  isAllowedRepairAuth,
146
159
  buildAuthenticationForRepair,
160
+ buildBearerForwardAuthentication,
147
161
  mergePreservedAuthVariables,
148
162
  repairAuthChangeLabel,
149
163
  appendTestEndpointWarningIfMissing,
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Repair authentications[] normalization for 454.0 webhooks/syncBridge.
3
+ *
4
+ * @fileoverview Normalize legacy authentication to authentications[] slots
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { migrateAuthenticationToNestedSchema } = require('../utils/authentication-shape');
10
+
11
+ const AUTH_USAGE_API = 'api';
12
+ const AUTH_USAGE_WEBHOOK_INBOUND = 'webhookInbound';
13
+ const AUTH_USAGE_SYNC_EXECUTION = 'syncExecution';
14
+
15
+ /**
16
+ * @param {string} systemKey
17
+ * @returns {object}
18
+ */
19
+ function buildWebhookInboundAuthSlot(systemKey) {
20
+ const key = systemKey || 'system';
21
+ return {
22
+ key: 'webhookInbound',
23
+ usage: AUTH_USAGE_WEBHOOK_INBOUND,
24
+ authType: 'credential',
25
+ credential: {
26
+ credentialKey: `${key}-webhook-inbound`,
27
+ method: 'hmac',
28
+ variables: {
29
+ algorithm: 'sha256',
30
+ signatureHeader: 'X-Webhook-Signature',
31
+ timestampHeader: 'X-Webhook-Timestamp',
32
+ signaturePrefix: 'v0='
33
+ },
34
+ security: {
35
+ signingSecret: `kv://${key}/webhookInbound/signingSecret`
36
+ }
37
+ }
38
+ };
39
+ }
40
+
41
+ /**
42
+ * @param {string} systemKey
43
+ * @returns {object}
44
+ */
45
+ function buildSyncExecutionAuthSlot(systemKey) {
46
+ const key = systemKey || 'system';
47
+ return {
48
+ key: 'syncExecution',
49
+ usage: AUTH_USAGE_SYNC_EXECUTION,
50
+ authType: 'credential',
51
+ credential: {
52
+ credentialKey: `${key}-sync-execution`,
53
+ method: 'apikey',
54
+ variables: {
55
+ baseUrl: 'https://api.example.com',
56
+ headerName: 'X-API-Key',
57
+ testEndpoint: '/health'
58
+ },
59
+ security: {
60
+ apiKey: `kv://${key}/syncExecution/apiKey`
61
+ }
62
+ }
63
+ };
64
+ }
65
+
66
+ /**
67
+ * Normalize legacy authentication to authentications[] when missing.
68
+ * @param {object} systemJson - Parsed external system manifest
69
+ * @returns {{ changed: boolean, warnings: string[] }}
70
+ */
71
+ function repairAuthenticationsArray(systemJson) {
72
+ const warnings = [];
73
+ if (!systemJson || typeof systemJson !== 'object') {
74
+ return { changed: false, warnings };
75
+ }
76
+
77
+ migrateAuthenticationToNestedSchema(systemJson);
78
+
79
+ const existing = systemJson.authentications;
80
+ if (Array.isArray(existing) && existing.length > 0) {
81
+ return { changed: false, warnings };
82
+ }
83
+
84
+ const legacy = systemJson.authentication;
85
+ if (!legacy || typeof legacy !== 'object') {
86
+ return { changed: false, warnings };
87
+ }
88
+
89
+ systemJson.authentications = [
90
+ {
91
+ key: 'default',
92
+ usage: AUTH_USAGE_API,
93
+ ...legacy
94
+ }
95
+ ];
96
+ warnings.push(
97
+ 'Normalized legacy authentication to authentications[{key:default, usage:api}].'
98
+ );
99
+ return { changed: true, warnings };
100
+ }
101
+
102
+ /**
103
+ * Ensure webhook/sync auth slots exist when repair flags request them.
104
+ * @param {object} systemJson
105
+ * @param {{ authWebhook?: boolean, authSync?: boolean, systemKey: string, authMethod?: string }} options
106
+ * @returns {{ changed: boolean, warnings: string[] }}
107
+ */
108
+ function ensureAuthUsageSlots(systemJson, options) {
109
+ const warnings = [];
110
+ const { repairAuthenticationsArray: normalize } = { repairAuthenticationsArray };
111
+ const base = normalize(systemJson);
112
+ warnings.push(...base.warnings);
113
+ let changed = base.changed;
114
+
115
+ if (!Array.isArray(systemJson.authentications)) {
116
+ systemJson.authentications = [];
117
+ }
118
+
119
+ const ensureSlot = (usage, slotKey, slotFactory) => {
120
+ const found = systemJson.authentications.some(
121
+ (row) => row && row.usage === usage
122
+ );
123
+ if (found) {
124
+ return;
125
+ }
126
+ if (typeof slotFactory === 'function') {
127
+ systemJson.authentications.push(slotFactory(options.systemKey));
128
+ warnings.push(`Added authentications slot usage=${usage} key=${slotKey}.`);
129
+ changed = true;
130
+ return;
131
+ }
132
+ const template = systemJson.authentications[0] || systemJson.authentication;
133
+ if (!template || typeof template !== 'object') {
134
+ warnings.push(`Cannot add ${usage} slot — no authentication template available.`);
135
+ return;
136
+ }
137
+ const { key: _ignored, usage: _u, ...rest } = template;
138
+ systemJson.authentications.push({ key: slotKey, usage, ...rest });
139
+ warnings.push(`Added authentications slot usage=${usage} key=${slotKey}.`);
140
+ changed = true;
141
+ };
142
+
143
+ if (options.authWebhook) {
144
+ ensureSlot(
145
+ AUTH_USAGE_WEBHOOK_INBOUND,
146
+ 'webhookInbound',
147
+ buildWebhookInboundAuthSlot
148
+ );
149
+ }
150
+ if (options.authSync) {
151
+ ensureSlot(
152
+ AUTH_USAGE_SYNC_EXECUTION,
153
+ 'syncExecution',
154
+ buildSyncExecutionAuthSlot
155
+ );
156
+ }
157
+
158
+ return { changed, warnings };
159
+ }
160
+
161
+ module.exports = {
162
+ repairAuthenticationsArray,
163
+ ensureAuthUsageSlots,
164
+ buildWebhookInboundAuthSlot,
165
+ buildSyncExecutionAuthSlot,
166
+ AUTH_USAGE_API,
167
+ AUTH_USAGE_WEBHOOK_INBOUND,
168
+ AUTH_USAGE_SYNC_EXECUTION
169
+ };
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Warn when datasource capabilities lack matching openapi.operations (autoRbac).
3
+ *
4
+ * @fileoverview repair-capability-openapi-warnings
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const path = require('path');
12
+ const fs = require('fs');
13
+ const { loadConfigFile } = require('../utils/config-format');
14
+ const { capabilityKeysFromManifest } = require('./repair-datasource-sync-operations');
15
+
16
+ /**
17
+ * @param {string} opKey
18
+ * @returns {string}
19
+ */
20
+ function normalizeRbacOperationKey(opKey) {
21
+ const s = typeof opKey === 'string' ? opKey.trim() : '';
22
+ if (!s) return '';
23
+ if (/^[a-z][a-zA-Z0-9]*$/.test(s)) return s.toLowerCase();
24
+ const withHyphens = s.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
25
+ const cleaned = withHyphens.replace(/[^a-z0-9-]+/g, '-');
26
+ return cleaned.replace(/-+/g, '-').replace(/^-+|-+$/g, '');
27
+ }
28
+
29
+ /**
30
+ * @param {Object} parsed
31
+ * @returns {boolean}
32
+ */
33
+ function hasAutoRbacOpenApi(parsed) {
34
+ const openapi = parsed?.openapi;
35
+ return (
36
+ openapi &&
37
+ typeof openapi === 'object' &&
38
+ openapi.autoRbac === true &&
39
+ openapi.operations &&
40
+ typeof openapi.operations === 'object' &&
41
+ !Array.isArray(openapi.operations)
42
+ );
43
+ }
44
+
45
+ /**
46
+ * @param {Object} parsed
47
+ * @returns {Set<string>}
48
+ */
49
+ function normalizedOpenApiOperationKeys(parsed) {
50
+ const ops = parsed?.openapi?.operations;
51
+ const out = new Set();
52
+ if (!ops || typeof ops !== 'object') {
53
+ return out;
54
+ }
55
+ for (const key of Object.keys(ops)) {
56
+ const norm = normalizeRbacOperationKey(key) || key;
57
+ if (norm) out.add(norm);
58
+ }
59
+ return out;
60
+ }
61
+
62
+ /**
63
+ * @param {Object} parsed
64
+ * @returns {string[]}
65
+ */
66
+ function findCapabilityKeysMissingFromOpenApi(parsed) {
67
+ if (!hasAutoRbacOpenApi(parsed)) {
68
+ return [];
69
+ }
70
+ const capKeys = capabilityKeysFromManifest(parsed?.capabilities);
71
+ if (capKeys.length === 0) {
72
+ return [];
73
+ }
74
+ const openApiKeys = normalizedOpenApiOperationKeys(parsed);
75
+ return capKeys.filter((key) => !openApiKeys.has(normalizeRbacOperationKey(key) || key));
76
+ }
77
+
78
+ /**
79
+ * @param {string} fileName
80
+ * @param {Object} parsed
81
+ * @param {string[]} missingKeys
82
+ * @returns {string}
83
+ */
84
+ function formatCapabilityOpenApiDriftWarning(fileName, parsed, missingKeys) {
85
+ const dsKey = typeof parsed?.key === 'string' && parsed.key.trim() ? parsed.key.trim() : fileName;
86
+ return (
87
+ `${dsKey}: capabilities declare ${missingKeys.join(', ')} but openapi.operations is missing them — ` +
88
+ 'RBAC repair may omit matching permissions; operations sync runs automatically with --rbac'
89
+ );
90
+ }
91
+
92
+ /**
93
+ * @param {string} appPath
94
+ * @param {string[]} datasourceFiles
95
+ * @param {string[]} warnings
96
+ * @returns {number}
97
+ */
98
+ function collectCapabilityOpenApiDriftWarnings(appPath, datasourceFiles, warnings) {
99
+ if (!Array.isArray(warnings) || !Array.isArray(datasourceFiles)) {
100
+ return 0;
101
+ }
102
+ let count = 0;
103
+ for (const fileName of datasourceFiles) {
104
+ const filePath = path.join(appPath, fileName);
105
+ if (!fs.existsSync(filePath)) continue;
106
+ let parsed;
107
+ try {
108
+ parsed = loadConfigFile(filePath);
109
+ } catch {
110
+ continue;
111
+ }
112
+ const missingKeys = findCapabilityKeysMissingFromOpenApi(parsed);
113
+ if (missingKeys.length === 0) continue;
114
+ warnings.push(formatCapabilityOpenApiDriftWarning(fileName, parsed, missingKeys));
115
+ count += 1;
116
+ }
117
+ return count;
118
+ }
119
+
120
+ module.exports = {
121
+ normalizeRbacOperationKey,
122
+ hasAutoRbacOpenApi,
123
+ findCapabilityKeysMissingFromOpenApi,
124
+ collectCapabilityOpenApiDriftWarnings,
125
+ formatCapabilityOpenApiDriftWarning
126
+ };