@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,159 @@
1
+ /**
2
+ * Orchestration OpenAPI governance metadata (plan 154.7).
3
+ *
4
+ * Maps builder-api OpenAPI tags → catalog resourceType, permission class, and
5
+ * per-operation x-aifabrix extensions for dataplane wizard / CIP manifest generation.
6
+ *
7
+ * @fileoverview Tag catalog and x-aifabrix operation extensions
8
+ * @author AI Fabrix Team
9
+ * @version 1.0.0
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ const { getOperationDescription } = require('./openapi-descriptions');
15
+ const { CAPABILITIES } = require('./capability-registry');
16
+
17
+ /** @type {Readonly<Record<string, { resourceType: string, permissionClass: string, displayName: string }>>} */
18
+ /** Catalog keys only — must exist in baseline-resourcetypes.json (active on dataplane). */
19
+ const ORCHESTRATION_TAG_CATALOG = Object.freeze({
20
+ workspace: {
21
+ resourceType: 'workspace',
22
+ permissionClass: 'workspace',
23
+ displayName: 'Workspace'
24
+ },
25
+ build: {
26
+ resourceType: 'template',
27
+ permissionClass: 'plan',
28
+ displayName: 'Build'
29
+ },
30
+ manifest: {
31
+ resourceType: 'policy',
32
+ permissionClass: 'workspace',
33
+ displayName: 'Manifest'
34
+ },
35
+ validate: {
36
+ resourceType: 'document',
37
+ permissionClass: 'validate',
38
+ displayName: 'Validate'
39
+ },
40
+ test: {
41
+ resourceType: 'task',
42
+ permissionClass: 'test',
43
+ displayName: 'Test'
44
+ },
45
+ certify: {
46
+ resourceType: 'approval',
47
+ permissionClass: 'certify',
48
+ displayName: 'Certify'
49
+ },
50
+ apply: {
51
+ resourceType: 'project',
52
+ permissionClass: 'apply',
53
+ displayName: 'Apply'
54
+ },
55
+ template: {
56
+ resourceType: 'product',
57
+ permissionClass: 'template',
58
+ displayName: 'Template'
59
+ },
60
+ repository: {
61
+ resourceType: 'repository',
62
+ permissionClass: 'repository',
63
+ displayName: 'Repository'
64
+ },
65
+ infra: {
66
+ resourceType: 'channel',
67
+ permissionClass: 'infra',
68
+ displayName: 'Infrastructure'
69
+ }
70
+ });
71
+
72
+ /**
73
+ * @param {string} tag
74
+ * @returns {{ resourceType: string, permissionClass: string, displayName: string }}
75
+ */
76
+ function resolveTagCatalogEntry(tag) {
77
+ const key = String(tag || '').trim().toLowerCase();
78
+ return (
79
+ ORCHESTRATION_TAG_CATALOG[key] || {
80
+ resourceType: 'document',
81
+ permissionClass: 'read',
82
+ displayName: key || 'operations'
83
+ }
84
+ );
85
+ }
86
+
87
+ /**
88
+ * @param {{ handlerId: string, operationType: string, mutating: boolean }} capability
89
+ * @returns {{ datasourceTag: string, resourceType: string, operationType: string, permissionClass: string, mutating: boolean }}
90
+ */
91
+ function buildOperationXAfabrix(capability) {
92
+ const meta = getOperationDescription(capability.handlerId);
93
+ const primaryTag = Array.isArray(meta.tags) && meta.tags.length > 0 ? meta.tags[0] : 'builder';
94
+ const catalog = resolveTagCatalogEntry(primaryTag);
95
+ return {
96
+ datasourceTag: primaryTag,
97
+ resourceType: catalog.resourceType,
98
+ operationType: capability.operationType,
99
+ permissionClass: catalog.permissionClass,
100
+ mutating: capability.mutating === true
101
+ };
102
+ }
103
+
104
+ /**
105
+ * @param {string} handlerId
106
+ * @returns {string}
107
+ */
108
+ function handlerDatasourceTag(handlerId) {
109
+ const meta = getOperationDescription(handlerId);
110
+ if (Array.isArray(meta.tags) && meta.tags.length > 0) {
111
+ return meta.tags[0];
112
+ }
113
+ return 'builder';
114
+ }
115
+
116
+ /**
117
+ * Group capability handlerIds by OpenAPI datasource tag.
118
+ *
119
+ * @returns {ReadonlyMap<string, string[]>}
120
+ */
121
+ function groupHandlerIdsByDatasourceTag() {
122
+ /** @type {Map<string, string[]>} */
123
+ const grouped = new Map();
124
+ for (const cap of CAPABILITIES) {
125
+ const tag = handlerDatasourceTag(cap.handlerId);
126
+ const list = grouped.get(tag) || [];
127
+ list.push(cap.handlerId);
128
+ grouped.set(tag, list);
129
+ }
130
+ return grouped;
131
+ }
132
+
133
+ /**
134
+ * @returns {ReadonlyArray<{ tag: string, resourceType: string, permissionClass: string, displayName: string, operationCount: number }>}
135
+ */
136
+ function listOrchestrationDatasourceTags() {
137
+ const grouped = groupHandlerIdsByDatasourceTag();
138
+ return [...grouped.entries()]
139
+ .sort(([a], [b]) => a.localeCompare(b))
140
+ .map(([tag, handlerIds]) => {
141
+ const catalog = resolveTagCatalogEntry(tag);
142
+ return {
143
+ tag,
144
+ resourceType: catalog.resourceType,
145
+ permissionClass: catalog.permissionClass,
146
+ displayName: catalog.displayName,
147
+ operationCount: handlerIds.length
148
+ };
149
+ });
150
+ }
151
+
152
+ module.exports = {
153
+ ORCHESTRATION_TAG_CATALOG,
154
+ resolveTagCatalogEntry,
155
+ buildOperationXAfabrix,
156
+ handlerDatasourceTag,
157
+ groupHandlerIdsByDatasourceTag,
158
+ listOrchestrationDatasourceTags
159
+ };
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Platform RBAC role catalog — mirrors dataplane builder/dataplane/rbac.yaml roles block.
3
+ *
4
+ * @fileoverview SSOT for facade/orchestration integrations using platform roles (plan 154.7)
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ /** @type {ReadonlyArray<{ name: string, value: string, description: string, groups: string[] }>} */
12
+ const PLATFORM_ROLES = Object.freeze([
13
+ {
14
+ name: 'AI Fabrix Platform Admin',
15
+ value: 'aifabrix-platform-admin',
16
+ description: 'Full platform infrastructure management and enterprise controller access',
17
+ groups: ['AI-Fabrix-Platform-Admins']
18
+ },
19
+ {
20
+ name: 'AI Fabrix Security Admin',
21
+ value: 'aifabrix-security-admin',
22
+ description: 'Security and compliance management for enterprise controller',
23
+ groups: ['AI-Fabrix-Security-Admins']
24
+ },
25
+ {
26
+ name: 'AI Fabrix Deployment Admin',
27
+ value: 'aifabrix-deployment-admin',
28
+ description: 'Application deployment orchestration and environment management',
29
+ groups: ['AI-Fabrix-Deployment-Admins']
30
+ },
31
+ {
32
+ name: 'AI Fabrix Compliance Admin',
33
+ value: 'aifabrix-compliance-admin',
34
+ description: 'ISO 27001 compliance monitoring and audit management',
35
+ groups: ['AI-Fabrix-Compliance-Admins']
36
+ },
37
+ {
38
+ name: 'AI Fabrix Developer',
39
+ value: 'aifabrix-developer',
40
+ description: 'Developer access to deploy applications via CI pipelines',
41
+ groups: ['AI-Fabrix-Developers']
42
+ },
43
+ {
44
+ name: 'AI Fabrix Observer',
45
+ value: 'aifabrix-observer',
46
+ description: 'Read-only access to monitoring, logs, and compliance reports',
47
+ groups: ['AI-Fabrix-Observers']
48
+ },
49
+ {
50
+ name: 'AI Fabrix AI Trust Operator',
51
+ value: 'aifabrix-ai-trust-operator',
52
+ description: 'Run AI Trust access evaluation and explain visibility for governed users',
53
+ groups: ['AI-Fabrix-AI-Trust-Operators']
54
+ },
55
+ {
56
+ name: 'AI Fabrix External System Discoverer',
57
+ value: 'aifabrix-external-system-discoverer',
58
+ description: 'Discover business context for external systems via REST and MCP',
59
+ groups: ['AI-Fabrix-External-System-Discoverers']
60
+ }
61
+ ]);
62
+
63
+ const PLATFORM_ROLE_VALUES = Object.freeze(PLATFORM_ROLES.map((r) => r.value));
64
+
65
+ /**
66
+ * @returns {Array<{ name: string, value: string, description: string, groups: string[] }>}
67
+ */
68
+ function listPlatformRoles() {
69
+ return PLATFORM_ROLES.map((r) => ({
70
+ name: r.name,
71
+ value: r.value,
72
+ description: r.description,
73
+ groups: [...r.groups]
74
+ }));
75
+ }
76
+
77
+ /**
78
+ * @param {string} value
79
+ * @returns {boolean}
80
+ */
81
+ function isPlatformRoleValue(value) {
82
+ return PLATFORM_ROLE_VALUES.includes(value);
83
+ }
84
+
85
+ module.exports = {
86
+ PLATFORM_ROLES,
87
+ PLATFORM_ROLE_VALUES,
88
+ listPlatformRoles,
89
+ isPlatformRoleValue
90
+ };
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Per-route request timeouts (plan 154.0 §3.2).
3
+ *
4
+ * @fileoverview Returns 408 when handler exceeds MAX_*_TIMEOUT_MS
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ /**
12
+ * @param {string} handlerId
13
+ * @returns {number}
14
+ */
15
+ function getTimeoutMsForHandler(handlerId) {
16
+ if (handlerId === 'runUpload') {
17
+ return Number(process.env.MAX_UPLOAD_TIMEOUT_MS || 300000);
18
+ }
19
+ if (handlerId === 'runTest') {
20
+ return Number(process.env.MAX_TEST_E2E_TIMEOUT_MS || 120000);
21
+ }
22
+ if (handlerId === 'runCertifyPillar') {
23
+ return Number(process.env.MAX_CERTIFY_TIMEOUT_MS || 120000);
24
+ }
25
+ return Number(process.env.MAX_REQUEST_TIMEOUT_MS || 120000);
26
+ }
27
+
28
+ /**
29
+ * @param {string} handlerId
30
+ * @param {() => Promise<*>} fn
31
+ * @returns {Promise<*>}
32
+ */
33
+ async function withRequestTimeout(handlerId, fn) {
34
+ const ms = getTimeoutMsForHandler(handlerId);
35
+ let timeoutId;
36
+ const timeoutPromise = new Promise((_, reject) => {
37
+ timeoutId = setTimeout(() => {
38
+ const err = new Error(`Request exceeded ${ms}ms timeout`);
39
+ err.statusCode = 408;
40
+ reject(err);
41
+ }, ms);
42
+ });
43
+ try {
44
+ return await Promise.race([fn(), timeoutPromise]);
45
+ } finally {
46
+ clearTimeout(timeoutId);
47
+ }
48
+ }
49
+
50
+ module.exports = {
51
+ getTimeoutMsForHandler,
52
+ withRequestTimeout
53
+ };
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Individual route handler implementations for builder-api dispatch map.
3
+ *
4
+ * @fileoverview Keeps dispatchHandler under max-lines-per-function
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { buildContext } = require('./route-handlers-context');
12
+ const { listSystems, createSystem, getSystemManifest, deleteSystem } = require('./workspace-ops');
13
+ const { runWizard } = require('./run-wizard');
14
+ const { runRepair } = require('./run-repair');
15
+ const { runValidate } = require('./run-validate');
16
+ const { runPreviewUpload, runUpload } = require('./run-upload');
17
+ const { runTest } = require('./run-test');
18
+ const { runCertifyPillar } = require('./run-certify');
19
+ const { getLifecycleReport } = require('./run-lifecycle');
20
+ const {
21
+ materializeTemplate,
22
+ getWorkspaceStatus,
23
+ runWorkspaceDiff,
24
+ resetWorkspaceFromTemplate
25
+ } = require('./run-template-workspace');
26
+ const {
27
+ runRepositorySync,
28
+ runRepositoryCreateReview,
29
+ getRepositoryStatus,
30
+ runRepositoryDispatchPipeline
31
+ } = require('./run-repository-emcp');
32
+ const { getManifestSection, listManifestSections } = require('./manifest-get-section');
33
+ const { patchManifestSection } = require('./manifest-patch-section');
34
+ const { runManifestRepair } = require('./manifest-repair');
35
+
36
+ /** @type {Record<string, Function>} */
37
+ const HANDLER_MAP = {
38
+ listSystems: (_params, auth) => listSystems(buildContext(auth, '_meta')),
39
+ createSystem: (_params, auth, body) => {
40
+ const key = body.systemKey;
41
+ if (!key || typeof key !== 'string') {
42
+ throw new Error('systemKey is required in request body');
43
+ }
44
+ return createSystem(buildContext(auth, key), key);
45
+ },
46
+ getSystemManifest: (params, auth) => getSystemManifest(buildContext(auth, params.systemKey)),
47
+ deleteSystem: (params, auth) => deleteSystem(buildContext(auth, params.systemKey)),
48
+ runWizard: (params, auth, body, query) =>
49
+ runWizard(buildContext(auth, params.systemKey), body, {
50
+ debug: query.debug === 'true' || body.debug === true
51
+ }),
52
+ runRepair: (params, auth, body, query) =>
53
+ runRepair(buildContext(auth, params.systemKey), {
54
+ dryRun: query.dryRun === 'true' || body.dryRun === true,
55
+ auth: body.auth,
56
+ rbac: body.rbac === true,
57
+ rbacPreset: body.rbacPreset,
58
+ expose: body.expose === true,
59
+ sync: body.sync === true,
60
+ test: body.test === true,
61
+ api: body.api === true,
62
+ operations: body.operations === true || body.rbac === true
63
+ }),
64
+ listManifestSections: (params, auth) => listManifestSections(buildContext(auth, params.systemKey)),
65
+ getManifestSection: (params, auth) =>
66
+ getManifestSection(buildContext(auth, params.systemKey), { sectionKey: params.sectionKey }),
67
+ patchManifestSection: (params, auth, body) =>
68
+ patchManifestSection(buildContext(auth, params.systemKey), {
69
+ sectionKey: params.sectionKey,
70
+ intent: body.intent,
71
+ patch: body.patch,
72
+ mode: body.mode,
73
+ sectionReadToken: body.sectionReadToken,
74
+ dryRun: body.dryRun === true
75
+ }),
76
+ getDatasourceManifestSection: (params, auth) =>
77
+ getManifestSection(buildContext(auth, params.systemKey), {
78
+ sectionKey: params.sectionKey,
79
+ datasourceKey: params.datasourceKey
80
+ }),
81
+ patchDatasourceManifestSection: (params, auth, body) =>
82
+ patchManifestSection(buildContext(auth, params.systemKey), {
83
+ sectionKey: params.sectionKey,
84
+ datasourceKey: params.datasourceKey,
85
+ intent: body.intent,
86
+ patch: body.patch,
87
+ mode: body.mode,
88
+ sectionReadToken: body.sectionReadToken,
89
+ dryRun: body.dryRun === true
90
+ }),
91
+ runManifestRepair: (params, auth, body, query) =>
92
+ runManifestRepair(buildContext(auth, params.systemKey), {
93
+ hooks: body.hooks,
94
+ sectionKey: body.sectionKey,
95
+ datasourceKey: body.datasourceKey,
96
+ dryRun: query.dryRun === 'true' || body.dryRun === true,
97
+ auth: body.auth
98
+ }),
99
+ runValidate: (params, auth, body, query) =>
100
+ runValidate(buildContext(auth, params.systemKey), {
101
+ pipelineValidate: query.pipelineValidate === 'true' || body.pipelineValidate === true
102
+ }),
103
+ runPreviewUpload: (params, auth, body) =>
104
+ runPreviewUpload(buildContext(auth, params.systemKey), { force: body.force === true }),
105
+ runUpload: (params, auth, body) =>
106
+ runUpload(buildContext(auth, params.systemKey), {
107
+ force: body.force === true,
108
+ probe: body.probe === true,
109
+ minimal: true
110
+ }),
111
+ runTest: (params, auth, body, query) =>
112
+ runTest(buildContext(auth, params.systemKey), {
113
+ runType: body.runType || query.runType || 'integration',
114
+ noPublish: body.noPublish === true
115
+ }),
116
+ runCertifyPillar: (params, auth, body) =>
117
+ runCertifyPillar(buildContext(auth, params.systemKey), params.pillar, {
118
+ noPublish: body.noPublish === true,
119
+ pack: body.pack,
120
+ body: body.lifecycleBody
121
+ }),
122
+ getLifecycleReport: (params, auth, _body, query) =>
123
+ getLifecycleReport(buildContext(auth, params.systemKey), {
124
+ details: query.details === 'true',
125
+ summary: query.summary === 'true'
126
+ }),
127
+ materializeTemplate: (params, auth, body) =>
128
+ materializeTemplate(buildContext(auth, params.systemKey), body),
129
+ getWorkspaceStatus: (params, auth) => getWorkspaceStatus(buildContext(auth, params.systemKey)),
130
+ runWorkspaceDiff: (params, auth, body) => runWorkspaceDiff(buildContext(auth, params.systemKey), body),
131
+ resetWorkspaceFromTemplate: (params, auth, body) =>
132
+ resetWorkspaceFromTemplate(buildContext(auth, params.systemKey), body),
133
+ runRepositorySync: (params, auth, body) => runRepositorySync(buildContext(auth, params.systemKey), body),
134
+ runRepositoryCreateReview: (params, auth, body) =>
135
+ runRepositoryCreateReview(buildContext(auth, params.systemKey), body),
136
+ getRepositoryStatus: (params, auth) => getRepositoryStatus(buildContext(auth, params.systemKey)),
137
+ runRepositoryDispatchPipeline: (params, auth, body) =>
138
+ runRepositoryDispatchPipeline(buildContext(auth, params.systemKey), body),
139
+ health: () => ({ status: 'ok' }),
140
+ ready: () => ({ status: 'ready', dataplaneUrl: process.env.DATAPLANE_URL || null })
141
+ };
142
+
143
+ module.exports = { HANDLER_MAP };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * WorkspaceContext factory for route handlers.
3
+ *
4
+ * @fileoverview Shared buildContext helper
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { createWorkspaceContext } = require('./workspace-context');
12
+
13
+ /**
14
+ * @param {Object} auth
15
+ * @param {string} systemKey
16
+ * @returns {import('./workspace-context').WorkspaceContext}
17
+ */
18
+ function buildContext(auth, systemKey) {
19
+ return createWorkspaceContext({
20
+ userId: auth.userId,
21
+ systemKey,
22
+ bearerToken: auth.bearerToken,
23
+ dataplaneUrl: process.env.DATAPLANE_URL,
24
+ controllerUrl: process.env.MISO_CONTROLLER_URL || process.env.CONTROLLER_URL,
25
+ environment: process.env.DEFAULT_ENVIRONMENT
26
+ });
27
+ }
28
+
29
+ module.exports = { buildContext };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Builder-api route handler dispatch by capability handlerId.
3
+ *
4
+ * @fileoverview Maps registry handlers to lib/programmatic operations
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { HANDLER_MAP } = require('./route-handler-map');
12
+
13
+ /**
14
+ * @param {string} handlerId
15
+ * @param {Object} params
16
+ * @param {Object} auth
17
+ * @param {Object} body
18
+ * @param {Object} query
19
+ * @returns {Promise<Object>}
20
+ */
21
+ async function dispatchHandler(handlerId, params, auth, body, query) {
22
+ const handler = HANDLER_MAP[handlerId];
23
+ if (!handler) {
24
+ const err = new Error('Handler not implemented');
25
+ err.statusCode = 404;
26
+ throw err;
27
+ }
28
+ return handler(params, auth, body, query);
29
+ }
30
+
31
+ module.exports = {
32
+ dispatchHandler
33
+ };
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Programmatic certify pillar wrappers.
3
+ *
4
+ * @fileoverview POST /certify/*
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { runVerifyOperationsForExternalSystem } = require('../commands/verify-operations-external');
12
+ const { runVerifyTrustForExternalSystem } = require('../commands/verify-trust-external');
13
+ const { runVerifyGovernanceForExternalSystem } = require('../commands/verify-governance-external');
14
+ const { runSystemLifecycle } = require('../api/lifecycle.api');
15
+ const { runWithWorkspaceContext } = require('./workspace-context');
16
+ const { mergeProgrammaticOptions } = require('./command-options');
17
+ const { touchWorkspaceMeta } = require('./workspace-meta');
18
+
19
+ const PILLARS = new Set(['operations', 'trust', 'governance', 'lifecycle-run']);
20
+
21
+ /**
22
+ * @param {string} pillar
23
+ */
24
+ function assertPillar(pillar) {
25
+ if (!PILLARS.has(pillar)) {
26
+ throw new Error(`Unknown certify pillar: ${pillar}`);
27
+ }
28
+ }
29
+
30
+ /**
31
+ * @param {import('./workspace-context').WorkspaceContext} ctx
32
+ * @param {string} pillar
33
+ * @param {Object} [options]
34
+ */
35
+ async function runCertifyPillar(ctx, pillar, options = {}) {
36
+ assertPillar(pillar);
37
+ const merged = mergeProgrammaticOptions(ctx, {
38
+ ...options,
39
+ noPublish: options.noPublish === true
40
+ });
41
+ return runWithWorkspaceContext(ctx, async() => {
42
+ let result;
43
+ if (pillar === 'operations') {
44
+ result = await runVerifyOperationsForExternalSystem(ctx.systemKey, merged);
45
+ } else if (pillar === 'trust') {
46
+ result = await runVerifyTrustForExternalSystem(ctx.systemKey, merged);
47
+ } else if (pillar === 'governance') {
48
+ result = await runVerifyGovernanceForExternalSystem(ctx.systemKey, merged);
49
+ } else {
50
+ result = await runSystemLifecycle(merged.dataplaneUrl, merged.authConfig, ctx.systemKey, options.body || {});
51
+ }
52
+ touchWorkspaceMeta(ctx, { lastOperation: `certify:${pillar}` });
53
+ return result;
54
+ });
55
+ }
56
+
57
+ module.exports = { runCertifyPillar, PILLARS };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Shared Enterprise MCP route runners for builder-api (154.1).
3
+ *
4
+ * @fileoverview Workspace context + metadata touch wrapper
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { runWithWorkspaceContext } = require('./workspace-context');
12
+ const { touchWorkspaceMeta } = require('./workspace-meta');
13
+ const { invokeEnterpriseMcpCapability } = require('./enterprise-mcp-client');
14
+
15
+ /**
16
+ * @param {import('./workspace-context').WorkspaceContext} ctx
17
+ * @param {string} capabilityKey
18
+ * @param {Object} [args]
19
+ * @param {Object} [options]
20
+ * @returns {Promise<Object>}
21
+ */
22
+ async function runEnterpriseMcpCapability(ctx, capabilityKey, args = {}, options = {}) {
23
+ return runWithWorkspaceContext(ctx, async() => {
24
+ const result = await invokeEnterpriseMcpCapability(ctx, capabilityKey, args, options);
25
+ touchWorkspaceMeta(ctx, { lastOperation: capabilityKey });
26
+ return { capabilityKey, result };
27
+ });
28
+ }
29
+
30
+ module.exports = {
31
+ runEnterpriseMcpCapability
32
+ };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Programmatic lifecycle report wrapper.
3
+ *
4
+ * @fileoverview GET /lifecycle
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { getSystemLifecycleReport } = require('../api/lifecycle.api');
12
+ const { runWithWorkspaceContext } = require('./workspace-context');
13
+ const { mergeProgrammaticOptions } = require('./command-options');
14
+
15
+ /**
16
+ * @param {import('./workspace-context').WorkspaceContext} ctx
17
+ * @param {Object} [options]
18
+ */
19
+ async function getLifecycleReport(ctx, options = {}) {
20
+ const merged = mergeProgrammaticOptions(ctx, options);
21
+ return runWithWorkspaceContext(ctx, async() =>
22
+ getSystemLifecycleReport(merged.dataplaneUrl, merged.authConfig, ctx.systemKey, {
23
+ details: options.details === true,
24
+ summary: options.summary === true
25
+ })
26
+ );
27
+ }
28
+
29
+ module.exports = { getLifecycleReport };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Programmatic repair wrapper.
3
+ *
4
+ * @fileoverview POST /repair → repairExternalIntegration
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { repairExternalIntegration } = require('../commands/repair');
12
+ const { runWithWorkspaceContext, WORKSPACE_INTEGRATION_FORMAT } = require('./workspace-context');
13
+ const { touchWorkspaceMeta } = require('./workspace-meta');
14
+
15
+ /**
16
+ * @param {import('./workspace-context').WorkspaceContext} ctx
17
+ * @param {Object} [options]
18
+ */
19
+ async function runRepair(ctx, options = {}) {
20
+ return runWithWorkspaceContext(ctx, async() => {
21
+ const result = await repairExternalIntegration(ctx.systemKey, {
22
+ dryRun: options.dryRun === true,
23
+ auth: options.auth,
24
+ rbac: options.rbac === true,
25
+ expose: options.expose === true,
26
+ sync: options.sync === true,
27
+ test: options.test === true,
28
+ api: options.api === true,
29
+ operations: options.operations === true || options.rbac === true,
30
+ splitDatasources: options.splitDatasources === true,
31
+ format: WORKSPACE_INTEGRATION_FORMAT,
32
+ rbacPreset: options.rbacPreset
33
+ });
34
+ if (options.dryRun !== true) {
35
+ touchWorkspaceMeta(ctx, { lastOperation: 'repair' });
36
+ }
37
+ return result;
38
+ });
39
+ }
40
+
41
+ module.exports = { runRepair };