@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
@@ -21,6 +21,7 @@ const { trackRepairWrite } = require('./repair-changed-files');
21
21
  const logger = require('../utils/logger');
22
22
  const generator = require('../generator');
23
23
  const { generateReadmeFromDeployJson } = require('../generator/split-readme');
24
+ const { regenerateDeployScriptFromIntegration } = require('../generator/deploy-script');
24
25
 
25
26
  /**
26
27
  * README "Files" section should match integration config format on disk (YAML vs JSON).
@@ -38,6 +39,25 @@ function inferExternalReadmeFileExt(appPath) {
38
39
  return '.json';
39
40
  }
40
41
 
42
+ async function regenerateDeployScript(appPath, systemKey, systemFiles, datasourceFiles, changes, backupCtx) {
43
+ try {
44
+ const deployPath = path.join(appPath, 'deploy.js');
45
+ trackRepairWrite(deployPath, backupCtx);
46
+ backupIntegrationFile(deployPath, backupCtx);
47
+ await regenerateDeployScriptFromIntegration({
48
+ appPath,
49
+ systemKey,
50
+ systemFiles,
51
+ datasourceFiles
52
+ });
53
+ changes.push('Regenerated deploy.js');
54
+ return true;
55
+ } catch (err) {
56
+ logger.log(chalk.yellow(`⚠ deploy.js regeneration skipped: ${err.message}`));
57
+ return false;
58
+ }
59
+ }
60
+
41
61
  async function regenerateManifest(appName, appPath, changes, backupCtx) {
42
62
  try {
43
63
  const deployPath = getDeployJsonPath(appName, 'external', true);
@@ -101,6 +121,7 @@ function persistChangesAndRegenerate(opts) {
101
121
 
102
122
  module.exports = {
103
123
  persistChangesAndRegenerate,
104
- regenerateReadmeIfRequested
124
+ regenerateReadmeIfRequested,
125
+ regenerateDeployScript
105
126
  };
106
127
 
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Platform RBAC preset for orchestration facade external systems (plan 154.7).
3
+ *
4
+ * @fileoverview Replace per-system admin/reader with dataplane platform roles
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, writeConfigFile } = require('../utils/config-format');
14
+ const { backupIntegrationFile } = require('../utils/integration-file-backup');
15
+ const { CAPABILITIES } = require('../programmatic/capability-registry');
16
+ const { listPlatformRoles, PLATFORM_ROLE_VALUES } = require('../programmatic/platform-rbac-catalog');
17
+
18
+ const READ_ROLES = Object.freeze([
19
+ 'aifabrix-observer',
20
+ 'aifabrix-external-system-discoverer',
21
+ 'aifabrix-developer',
22
+ 'aifabrix-deployment-admin',
23
+ 'aifabrix-platform-admin'
24
+ ]);
25
+
26
+ const WRITE_ROLES = Object.freeze([
27
+ 'aifabrix-developer',
28
+ 'aifabrix-deployment-admin',
29
+ 'aifabrix-platform-admin'
30
+ ]);
31
+
32
+ const APPLY_ROLES = Object.freeze(['aifabrix-deployment-admin', 'aifabrix-platform-admin']);
33
+
34
+ const CERTIFY_ROLES = Object.freeze([
35
+ 'aifabrix-security-admin',
36
+ 'aifabrix-compliance-admin',
37
+ 'aifabrix-ai-trust-operator',
38
+ 'aifabrix-platform-admin'
39
+ ]);
40
+
41
+ /** @type {ReadonlyMap<string, string>} */
42
+ const HANDLER_OPERATION_TYPE = (() => {
43
+ const map = new Map();
44
+ for (const cap of CAPABILITIES) {
45
+ map.set(_normalizeOpKey(cap.handlerId), cap.operationType);
46
+ }
47
+ return map;
48
+ })();
49
+
50
+ /**
51
+ * @param {string} opKey
52
+ * @returns {string}
53
+ */
54
+ function _normalizeOpKey(opKey) {
55
+ const s = String(opKey || '').trim();
56
+ if (!s) return '';
57
+ if (/^[a-z][a-zA-Z0-9]*$/.test(s)) return s.toLowerCase();
58
+ return s
59
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
60
+ .toLowerCase()
61
+ .replace(/[^a-z0-9-]+/g, '-')
62
+ .replace(/-+/g, '-')
63
+ .replace(/^-+|-+$/g, '');
64
+ }
65
+
66
+ /**
67
+ * @param {string} operationType
68
+ * @returns {string[]}
69
+ */
70
+ function rolesForOperationType(operationType) {
71
+ const t = String(operationType || '');
72
+ if (t.endsWith('.read') || t === 'help.read' || t === 'infra') return [...READ_ROLES];
73
+ if (t === 'apply.dev') return [...APPLY_ROLES];
74
+ if (t.startsWith('certify')) return [...CERTIFY_ROLES];
75
+ if (t === 'plan' || t === 'template' || t === 'repository') return [...WRITE_ROLES];
76
+ if (t === 'validate' || t === 'test') return [...WRITE_ROLES];
77
+ if (t.endsWith('.write')) return [...WRITE_ROLES];
78
+ return [...WRITE_ROLES];
79
+ }
80
+
81
+ /**
82
+ * @param {string} opKey
83
+ * @param {string} [httpMethod]
84
+ * @returns {string[]}
85
+ */
86
+ function rolesForOperationKey(opKey, httpMethod) {
87
+ const norm = _normalizeOpKey(opKey);
88
+ const fromRegistry = HANDLER_OPERATION_TYPE.get(norm);
89
+ if (fromRegistry) return rolesForOperationType(fromRegistry);
90
+ const method = String(httpMethod || '').toUpperCase();
91
+ if (method === 'GET' || norm.startsWith('list') || norm.startsWith('get')) return [...READ_ROLES];
92
+ return [...WRITE_ROLES];
93
+ }
94
+
95
+ /**
96
+ * @param {Object} rbac
97
+ * @param {string[]} changes
98
+ * @returns {boolean}
99
+ */
100
+ function ensurePlatformRolesOnRbac(rbac, changes) {
101
+ if (!rbac || typeof rbac !== 'object') return false;
102
+ const current = Array.isArray(rbac.roles) ? rbac.roles : [];
103
+ const onlySynthetic =
104
+ current.length > 0 &&
105
+ current.every((r) => {
106
+ const v = r && r.value;
107
+ return typeof v === 'string' && (v.endsWith('-admin') || v.endsWith('-reader'));
108
+ });
109
+ const missingPlatform = current.length === 0 || onlySynthetic;
110
+ if (!missingPlatform && current.every((r) => PLATFORM_ROLE_VALUES.includes(r.value))) {
111
+ return false;
112
+ }
113
+ rbac.roles = listPlatformRoles();
114
+ changes.push('Applied platform RBAC roles catalog (dataplane rbac.yaml SSOT)');
115
+ return true;
116
+ }
117
+
118
+ /**
119
+ * @param {string} appPath
120
+ * @param {string[]} datasourceFiles
121
+ * @returns {ReadonlyMap<string, string>}
122
+ */
123
+ function _loadOpHttpMethods(appPath, datasourceFiles) {
124
+ const methods = new Map();
125
+ for (const fileName of datasourceFiles || []) {
126
+ const filePath = path.join(appPath, fileName);
127
+ if (!fs.existsSync(filePath)) continue;
128
+ let parsed;
129
+ try {
130
+ parsed = loadConfigFile(filePath);
131
+ } catch {
132
+ continue;
133
+ }
134
+ const ops = parsed?.openapi?.operations;
135
+ if (!ops || typeof ops !== 'object') continue;
136
+ for (const [key, op] of Object.entries(ops)) {
137
+ const norm = _normalizeOpKey(key);
138
+ if (norm && op && op.method) methods.set(norm, String(op.method).toUpperCase());
139
+ }
140
+ }
141
+ return methods;
142
+ }
143
+
144
+ /**
145
+ * @param {Object} rbac
146
+ * @param {string} appPath
147
+ * @param {string[]} datasourceFiles
148
+ * @param {string[]} changes
149
+ * @returns {boolean}
150
+ */
151
+ function applyPlatformRolesToPermissions(rbac, appPath, datasourceFiles, changes) {
152
+ if (!rbac || !Array.isArray(rbac.permissions)) return false;
153
+ const opMethods = _loadOpHttpMethods(appPath, datasourceFiles);
154
+ let updated = false;
155
+ for (const perm of rbac.permissions) {
156
+ if (!perm || typeof perm.name !== 'string' || !perm.name.includes(':')) continue;
157
+ const opKey = perm.name.split(':')[1];
158
+ const roles = rolesForOperationKey(opKey, opMethods.get(_normalizeOpKey(opKey)));
159
+ const before = JSON.stringify(perm.roles || []);
160
+ perm.roles = [...roles];
161
+ if (JSON.stringify(perm.roles) !== before) updated = true;
162
+ }
163
+ if (updated) changes.push('Mapped permissions to platform roles by operation class');
164
+ return updated;
165
+ }
166
+
167
+ /**
168
+ * @param {string} appPath
169
+ * @param {string[]} datasourceFiles
170
+ * @param {string[]} changes
171
+ * @param {Object} [backupCtx]
172
+ * @returns {boolean}
173
+ */
174
+ function ensureOrchestrationResourceType(appPath, datasourceFiles, changes, backupCtx) {
175
+ let updated = false;
176
+ for (const fileName of datasourceFiles || []) {
177
+ const filePath = path.join(appPath, fileName);
178
+ if (!fs.existsSync(filePath)) continue;
179
+ let parsed;
180
+ try {
181
+ parsed = loadConfigFile(filePath);
182
+ } catch {
183
+ continue;
184
+ }
185
+ if (parsed?.entityType !== 'none') continue;
186
+ const dsKey = typeof parsed.key === 'string' ? parsed.key.trim() : '';
187
+ if (dsKey && !dsKey.endsWith('-operations')) continue;
188
+ if (parsed.resourceType === 'workspace') continue;
189
+ backupIntegrationFile(filePath, backupCtx);
190
+ parsed.resourceType = 'workspace';
191
+ writeConfigFile(filePath, parsed);
192
+ changes.push(`Set resourceType workspace on orchestration datasource ${fileName}`);
193
+ updated = true;
194
+ }
195
+ return updated;
196
+ }
197
+
198
+ module.exports = {
199
+ rolesForOperationKey,
200
+ rolesForOperationType,
201
+ ensurePlatformRolesOnRbac,
202
+ applyPlatformRolesToPermissions,
203
+ ensureOrchestrationResourceType
204
+ };
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Reader role assignment and permission role defaults for COM oauth scope lint.
3
+ *
4
+ * @fileoverview repair-rbac-reader-roles
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+ const { loadConfigFile } = require('../utils/config-format');
14
+
15
+ const READ_ONLY_HTTP_METHODS = new Set(['GET', 'HEAD']);
16
+
17
+ function roleValues(rbac) {
18
+ const roles = Array.isArray(rbac.roles) ? rbac.roles : [];
19
+ return roles.map((r) => r?.value).filter((v) => typeof v === 'string' && v.trim());
20
+ }
21
+
22
+ function pickAdminRoleValue(roleValuesList, systemKey) {
23
+ return (
24
+ roleValuesList.find((v) => v === `${systemKey}-admin`) ||
25
+ roleValuesList.find((v) => /-admin$/.test(v)) ||
26
+ roleValuesList[0] ||
27
+ null
28
+ );
29
+ }
30
+
31
+ function pickReaderRoleValue(roleValuesList, systemKey) {
32
+ return (
33
+ roleValuesList.find((v) => v === `${systemKey}-reader`) ||
34
+ roleValuesList.find((v) => /-reader$/.test(v)) ||
35
+ null
36
+ );
37
+ }
38
+
39
+ function capabilityFromPermissionName(name) {
40
+ if (typeof name !== 'string' || !name.includes(':')) return null;
41
+ return name.split(':')[1] || null;
42
+ }
43
+
44
+ function defaultRolesForCapability(cap, { adminValue, readerValue }) {
45
+ const roles = [];
46
+ if ((cap === 'list' || cap === 'get') && readerValue) roles.push(readerValue);
47
+ if (adminValue) roles.push(adminValue);
48
+ return roles;
49
+ }
50
+
51
+ /**
52
+ * @param {Object|null|undefined} opCfg
53
+ * @param {string} cap
54
+ * @returns {boolean}
55
+ */
56
+ function isReadOnlyOpenApiOperation(opCfg, cap) {
57
+ if (opCfg && typeof opCfg === 'object' && typeof opCfg.method === 'string') {
58
+ const method = opCfg.method.trim().toUpperCase();
59
+ if (READ_ONLY_HTTP_METHODS.has(method)) return true;
60
+ }
61
+ return cap === 'list' || cap === 'get';
62
+ }
63
+
64
+ /**
65
+ * @param {Object} rbac
66
+ * @param {string} systemKey
67
+ * @param {string[]} changes
68
+ * @returns {boolean}
69
+ */
70
+ function ensureNonEmptyPermissionRoles(rbac, systemKey, changes) {
71
+ const values = roleValues(rbac);
72
+ if (!Array.isArray(rbac.permissions) || values.length === 0) return false;
73
+
74
+ const adminValue = pickAdminRoleValue(values, systemKey);
75
+ const readerValue = pickReaderRoleValue(values, systemKey);
76
+ let updated = false;
77
+
78
+ for (const perm of rbac.permissions) {
79
+ if (!perm || typeof perm !== 'object') continue;
80
+ if (!Array.isArray(perm.roles)) perm.roles = [];
81
+ if (perm.roles.length > 0) continue;
82
+
83
+ const cap = capabilityFromPermissionName(perm.name);
84
+ const defaults = defaultRolesForCapability(cap, { adminValue, readerValue });
85
+ for (const rv of defaults) {
86
+ if (!perm.roles.includes(rv)) perm.roles.push(rv);
87
+ }
88
+ if (perm.roles.length > 0) {
89
+ changes.push(`RBAC: defaulted empty roles for ${perm.name}`);
90
+ updated = true;
91
+ }
92
+ }
93
+ return updated;
94
+ }
95
+
96
+ /**
97
+ * @param {Object} rbac
98
+ * @param {string} appPath
99
+ * @param {string[]} datasourceFiles
100
+ * @param {string} systemKey
101
+ * @param {string[]} changes
102
+ * @returns {boolean}
103
+ */
104
+ function ensureReaderRoleOnReadPermissions(rbac, appPath, datasourceFiles, systemKey, changes) {
105
+ const values = roleValues(rbac);
106
+ const readerValue = pickReaderRoleValue(values, systemKey);
107
+ const adminValue = pickAdminRoleValue(values, systemKey);
108
+ if (!readerValue || !adminValue) return false;
109
+ if (!Array.isArray(rbac.permissions) || rbac.permissions.length === 0) return false;
110
+
111
+ const permByName = new Map();
112
+ for (const perm of rbac.permissions) {
113
+ if (!perm || typeof perm.name !== 'string' || !perm.name.trim()) continue;
114
+ permByName.set(perm.name.trim(), perm);
115
+ permByName.set(perm.name.trim().toLowerCase(), perm);
116
+ }
117
+
118
+ let updated = false;
119
+ for (const fileName of datasourceFiles || []) {
120
+ updated = _applyReaderOnDatasourceFile(
121
+ appPath,
122
+ fileName,
123
+ permByName,
124
+ readerValue,
125
+ changes
126
+ ) || updated;
127
+ }
128
+ return updated;
129
+ }
130
+
131
+ /**
132
+ * @param {Map<string, Object>} permByName
133
+ * @param {string} permName
134
+ * @param {string} readerValue
135
+ * @param {string[]} changes
136
+ * @returns {boolean}
137
+ */
138
+ function addReaderRoleToPermission(permByName, permName, readerValue, changes) {
139
+ const perm = permByName.get(permName) || permByName.get(permName.toLowerCase());
140
+ if (!perm || !Array.isArray(perm.roles) || perm.roles.includes(readerValue)) {
141
+ return false;
142
+ }
143
+ perm.roles.push(readerValue);
144
+ changes.push(`RBAC: added reader role for read operation ${permName}`);
145
+ return true;
146
+ }
147
+
148
+ /**
149
+ * @param {string} appPath
150
+ * @param {string} fileName
151
+ * @param {Map<string, Object>} permByName
152
+ * @param {string} readerValue
153
+ * @param {string[]} changes
154
+ * @returns {boolean}
155
+ */
156
+ function _applyReaderOnDatasourceFile(appPath, fileName, permByName, readerValue, changes) {
157
+ const filePath = path.join(appPath, fileName);
158
+ if (!fs.existsSync(filePath)) {
159
+ return false;
160
+ }
161
+ let parsed;
162
+ try {
163
+ parsed = loadConfigFile(filePath);
164
+ } catch {
165
+ return false;
166
+ }
167
+ const openapi = parsed && parsed.openapi;
168
+ const ops = openapi && typeof openapi === 'object' ? openapi.operations : null;
169
+ if (!ops || typeof ops !== 'object' || Array.isArray(ops)) {
170
+ return false;
171
+ }
172
+ const resourceType =
173
+ (typeof parsed.resourceType === 'string' && parsed.resourceType.trim()) || 'document';
174
+
175
+ let updated = false;
176
+ for (const [cap, opCfg] of Object.entries(ops)) {
177
+ if (!isReadOnlyOpenApiOperation(opCfg, cap)) {
178
+ continue;
179
+ }
180
+ const permName = `${resourceType}:${cap}`;
181
+ updated = addReaderRoleToPermission(permByName, permName, readerValue, changes) || updated;
182
+ }
183
+ return updated;
184
+ }
185
+
186
+ module.exports = {
187
+ READ_ONLY_HTTP_METHODS,
188
+ isReadOnlyOpenApiOperation,
189
+ ensureNonEmptyPermissionRoles,
190
+ ensureReaderRoleOnReadPermissions
191
+ };