@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
@@ -40,6 +40,8 @@ function buildUnifiedE2eRunOptions(options, timeoutMs, pk) {
40
40
  minProcessed: options.minProcessed,
41
41
  minRecordCount: options.minRecordCount,
42
42
  capabilityKey: options.capabilityKey,
43
+ version: options.version,
44
+ syncMode: options.syncMode,
43
45
  timeout: timeoutMs,
44
46
  sync: options.sync === true,
45
47
  force: options.force === true,
@@ -114,10 +116,13 @@ function resolveE2ePollTimeoutMs(options) {
114
116
  * @returns {Object}
115
117
  */
116
118
  function buildE2eRequestMeta(datasourceKey, options, pk) {
119
+ const includeDebug = includeDebugForRequest(options.debug);
117
120
  return {
118
121
  datasourceKey,
119
122
  runType: 'e2e',
120
- includeDebug: includeDebugForRequest(options.debug),
123
+ includeDebug,
124
+ explainCertification: includeDebug,
125
+ explainMetrics: includeDebug,
121
126
  cleanup: options.cleanup,
122
127
  runScenarios: options.runScenarios,
123
128
  primaryKeyValue: pk !== undefined && pk !== null,
@@ -53,14 +53,17 @@ async function buildUnifiedValidationBody(params) {
53
53
  })
54
54
  : undefined;
55
55
 
56
+ const includeDebug = includeDebugForRequest(options.debug);
56
57
  const body = buildExternalDataSourceValidationRequest({
57
58
  systemKey,
58
59
  datasourceKey,
59
60
  runType,
60
61
  payloadTemplate,
61
62
  asyncRun: runType === 'e2e' && useAsync === true,
62
- includeDebug: includeDebugForRequest(options.debug),
63
+ includeDebug,
63
64
  explain: options.verbose === true,
65
+ explainCertification: includeDebug,
66
+ explainMetrics: includeDebug,
64
67
  e2eOptions: e2eOptions && Object.keys(e2eOptions).length > 0 ? e2eOptions : undefined
65
68
  });
66
69
  return withStageOnValidationRunBody(body, runType);
@@ -121,7 +121,7 @@ async function runUnifiedDatasourceValidation(datasourceKey, options) {
121
121
 
122
122
  const ctx = await prepareValidationRunContext(datasourceKey, options);
123
123
  const useAsync = options.noAsync ? false : options.async !== false;
124
- const timeoutMs = parseInt(String(options.timeout || '30000'), 10) || 30000;
124
+ const timeoutMs = parseInt(String(options.timeout || '60000'), 10) || 60000;
125
125
  const body = await buildUnifiedValidationBody({
126
126
  systemKey: ctx.systemKey,
127
127
  datasourceKey,
@@ -24,37 +24,98 @@ function shouldUseDeployPollSpinner() {
24
24
  */
25
25
  function createDeployPollHandlers(maxAttempts, options = {}) {
26
26
  const silent = options && options.silent === true;
27
+ const noop = () => {};
27
28
  if (silent) {
28
29
  return {
29
- onPollProgress: () => {},
30
- finish: () => {}
30
+ setText: noop,
31
+ onPollProgress: noop,
32
+ onPollWait: noop,
33
+ finish: noop
31
34
  };
32
35
  }
33
36
  if (shouldUseDeployPollSpinner()) {
34
- const spinner = ora({
35
- text: buildDeployPollSpinnerText(null, 0, maxAttempts),
36
- spinner: 'dots'
37
- }).start();
37
+ let spinner = null;
38
+ const ensureSpinner = (text) => {
39
+ if (!spinner) {
40
+ spinner = ora({
41
+ text,
42
+ spinner: 'dots'
43
+ }).start();
44
+ return;
45
+ }
46
+ spinner.text = text;
47
+ };
38
48
  return {
49
+ setText(text) {
50
+ ensureSpinner(text);
51
+ },
39
52
  onPollProgress: (deploymentData, attempt, maxA) => {
40
- spinner.text = buildDeployPollSpinnerText(deploymentData, attempt, maxA);
53
+ ensureSpinner(buildDeployPollSpinnerText(deploymentData, attempt, maxA));
54
+ },
55
+ onPollWait: (attempt, maxA) => {
56
+ ensureSpinner(buildDeployPollWaitText(attempt, maxA));
41
57
  },
42
58
  finish: () => {
43
- spinner.stop();
59
+ if (spinner) {
60
+ spinner.stop();
61
+ }
44
62
  }
45
63
  };
46
64
  }
47
65
  return {
66
+ setText: noop,
48
67
  onPollProgress: (deploymentData, attempt, maxA) => {
49
- const status = deploymentData.status ?? 'pending';
50
- const progress = deploymentData.progress ?? 0;
68
+ const status = deploymentData?.status ?? 'pending';
69
+ const progress =
70
+ deploymentData && Number.isFinite(Number(deploymentData.progress))
71
+ ? Number(deploymentData.progress)
72
+ : 0;
51
73
  logger.log(chalk.gray(`Status: ${status} (${progress}%) (attempt ${attempt + 1}/${maxA})`));
52
74
  },
53
- finish: () => {}
75
+ onPollWait: noop,
76
+ finish: noop
54
77
  };
55
78
  }
56
79
 
80
+ /**
81
+ * Plain progress while awaiting the next status poll (HTTP in flight).
82
+ * @param {number} attempt
83
+ * @param {number} maxAttempts
84
+ * @returns {string}
85
+ */
86
+ function buildDeployPollWaitText(attempt, maxAttempts) {
87
+ return `Deploying application... Checking status (attempt ${attempt + 1}/${maxAttempts})`;
88
+ }
89
+
90
+ /**
91
+ * Run async deploy follow-up work with ora on TTY (post-controller finalize, etc.).
92
+ *
93
+ * @async
94
+ * @param {string} label
95
+ * @param {Function} work
96
+ * @param {{ silent?: boolean }} [opts]
97
+ * @returns {Promise<*>}
98
+ */
99
+ async function runWithDeployPollSpinner(label, work, opts = {}) {
100
+ if (opts.silent === true) {
101
+ return work();
102
+ }
103
+ if (!shouldUseDeployPollSpinner()) {
104
+ logger.log(chalk.blue(`⏳ ${label}`));
105
+ return work();
106
+ }
107
+ const handlers = createDeployPollHandlers(1, { silent: false });
108
+ handlers.setText(label);
109
+ try {
110
+ return await work();
111
+ } finally {
112
+ handlers.finish();
113
+ }
114
+ }
115
+
57
116
  module.exports = {
58
117
  createDeployPollHandlers,
59
- shouldUseDeployPollSpinner
118
+ shouldUseDeployPollSpinner,
119
+ buildDeployPollWaitText,
120
+ runWithDeployPollSpinner
60
121
  };
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Controller deployment status polling (extracted from deployer.js for file size limits).
3
+ *
4
+ * @fileoverview Deploy pipeline poll loop
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const logger = require('../utils/logger');
12
+ const { validateEnvironmentKey } = require('../utils/deployment-validation');
13
+ const { getPipelineDeployment } = require('../api/pipeline.api');
14
+ const {
15
+ convertToPipelineAuthConfig,
16
+ processDeploymentStatusResponse
17
+ } = require('./deployer-status');
18
+ const { resolvePollIntervalFromController } = require('./poll-interval');
19
+ const { createDeployPollHandlers } = require('./deploy-poll-ui');
20
+
21
+ /**
22
+ * Polls deployment status from controller.
23
+ *
24
+ * @async
25
+ * @param {string} deploymentId
26
+ * @param {string} controllerUrl
27
+ * @param {string} envKey
28
+ * @param {Object} authConfig
29
+ * @param {Object} [options]
30
+ * @returns {Promise<Object>}
31
+ */
32
+ async function pollDeploymentStatus(deploymentId, controllerUrl, envKey, authConfig, options = {}) {
33
+ const interval = options.interval || 5000;
34
+ const maxAttempts = options.maxAttempts || 60;
35
+
36
+ const validatedEnvKey = validateEnvironmentKey(envKey);
37
+ const pipelineAuthConfig = convertToPipelineAuthConfig(authConfig);
38
+
39
+ const onPollProgress = typeof options.onPollProgress === 'function' ? options.onPollProgress : null;
40
+ const onPollWait = typeof options.onPollWait === 'function' ? options.onPollWait : null;
41
+
42
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
43
+ try {
44
+ if (onPollWait) {
45
+ onPollWait(attempt, maxAttempts);
46
+ }
47
+ const response = await getPipelineDeployment(controllerUrl, validatedEnvKey, deploymentId, pipelineAuthConfig);
48
+ const deploymentData = await processDeploymentStatusResponse(
49
+ response,
50
+ attempt,
51
+ maxAttempts,
52
+ interval,
53
+ deploymentId,
54
+ onPollProgress
55
+ );
56
+ if (deploymentData) {
57
+ return deploymentData;
58
+ }
59
+ } catch (error) {
60
+ if (error.message && error.message.includes('not found')) {
61
+ throw error;
62
+ }
63
+ throw error;
64
+ }
65
+ }
66
+
67
+ throw new Error('Deployment timeout: Maximum polling attempts reached');
68
+ }
69
+
70
+ /** Poll pipeline deployment to terminal status (TTY: ora spinner). */
71
+ async function pollDeployment(result, url, validatedEnvKey, authConfig, options) {
72
+ if (!options.poll || !result.deploymentId) {
73
+ return result;
74
+ }
75
+
76
+ const resolvedInterval = await resolvePollIntervalFromController(url, options.pollInterval);
77
+ const maxAttempts = options.pollMaxAttempts || 60;
78
+ const ownsPollUi = !options.pollUi;
79
+ const pollUi =
80
+ options.pollUi ||
81
+ createDeployPollHandlers(maxAttempts, { silent: options.silentPoll === true });
82
+
83
+ if (ownsPollUi) {
84
+ logger.log('');
85
+ }
86
+
87
+ try {
88
+ const status = await pollDeploymentStatus(
89
+ result.deploymentId,
90
+ url,
91
+ validatedEnvKey,
92
+ authConfig,
93
+ {
94
+ interval: resolvedInterval,
95
+ maxAttempts,
96
+ onPollProgress: pollUi.onPollProgress,
97
+ onPollWait: pollUi.onPollWait
98
+ }
99
+ );
100
+
101
+ result.status = status;
102
+ return result;
103
+ } finally {
104
+ if (ownsPollUi) {
105
+ pollUi.finish();
106
+ }
107
+ }
108
+ }
109
+
110
+ module.exports = {
111
+ pollDeployment,
112
+ pollDeploymentStatus
113
+ };
@@ -15,16 +15,15 @@ const auditLogger = require('../core/audit-logger');
15
15
  const logger = require('../utils/logger');
16
16
  const { validateControllerUrl, validateEnvironmentKey } = require('../utils/deployment-validation');
17
17
  const { handleDeploymentError, handleDeploymentErrors } = require('../utils/deployment-errors');
18
- const { validatePipeline, deployPipeline, getPipelineDeployment } = require('../api/pipeline.api');
18
+ const { validatePipeline, deployPipeline } = require('../api/pipeline.api');
19
19
  const { getAuthUser } = require('../api/auth.api');
20
20
  const { handleValidationResponse } = require('../utils/deployment-validation-helpers');
21
21
  const {
22
22
  convertToPipelineAuthConfig,
23
- processDeploymentStatusResponse,
24
23
  isTokenOnlyPipelineAuth
25
24
  } = require('./deployer-status');
26
- const { resolvePollIntervalFromController } = require('./poll-interval');
27
25
  const { createDeployPollHandlers } = require('./deploy-poll-ui');
26
+ const { pollDeployment, pollDeploymentStatus } = require('./deployer-poll-run');
28
27
 
29
28
  /**
30
29
  * For external systems, send full manifest (application + inline system + full dataSources).
@@ -274,52 +273,6 @@ async function sendDeploymentRequest(url, envKey, validateToken, authConfig, opt
274
273
  throwDeploymentError(lastError, maxRetries);
275
274
  }
276
275
 
277
- /**
278
- * Polls deployment status from controller
279
- * Uses pipeline endpoint for CI/CD monitoring with minimal deployment info
280
- *
281
- * @async
282
- * @param {string} deploymentId - Deployment ID to poll
283
- * @param {string} controllerUrl - Controller URL
284
- * @param {string} envKey - Environment key
285
- * @param {Object} authConfig - Authentication configuration
286
- * @param {Object} options - Polling options (interval, maxAttempts, etc.)
287
- * @returns {Promise<Object>} Deployment status
288
- */
289
- async function pollDeploymentStatus(deploymentId, controllerUrl, envKey, authConfig, options = {}) {
290
- const interval = options.interval || 5000;
291
- const maxAttempts = options.maxAttempts || 60;
292
-
293
- const validatedEnvKey = validateEnvironmentKey(envKey);
294
- const pipelineAuthConfig = convertToPipelineAuthConfig(authConfig);
295
-
296
- const onPollProgress = typeof options.onPollProgress === 'function' ? options.onPollProgress : null;
297
-
298
- for (let attempt = 0; attempt < maxAttempts; attempt++) {
299
- try {
300
- const response = await getPipelineDeployment(controllerUrl, validatedEnvKey, deploymentId, pipelineAuthConfig);
301
- const deploymentData = await processDeploymentStatusResponse(
302
- response,
303
- attempt,
304
- maxAttempts,
305
- interval,
306
- deploymentId,
307
- onPollProgress
308
- );
309
- if (deploymentData) {
310
- return deploymentData;
311
- }
312
- } catch (error) {
313
- if (error.message && error.message.includes('not found')) {
314
- throw error;
315
- }
316
- throw error;
317
- }
318
- }
319
-
320
- throw new Error('Deployment timeout: Maximum polling attempts reached');
321
- }
322
-
323
276
  /**
324
277
  * When using bearer token only (no client credentials), verify token is valid before deploy.
325
278
  * @async
@@ -378,8 +331,9 @@ async function sendDeployment(url, validatedEnvKey, manifest, authConfig, option
378
331
  logger.log(metadata(`Draft Deployment ID: ${validateResult.draftDeploymentId}`));
379
332
  }
380
333
 
381
- // Step 2: Deploy using validateToken (when not polling, show a clear line; otherwise poll phase uses ora)
382
- if (options.poll === false) {
334
+ if (options.pollUi && typeof options.pollUi.setText === 'function') {
335
+ options.pollUi.setText('Submitting deployment to controller...');
336
+ } else if (options.poll === false) {
383
337
  logger.log(formatProgress('Deploying application...'));
384
338
  }
385
339
  const result = await sendDeploymentRequest(url, validatedEnvKey, validateResult.validateToken, authConfig, {
@@ -395,39 +349,6 @@ async function sendDeployment(url, validatedEnvKey, manifest, authConfig, option
395
349
  return result;
396
350
  }
397
351
 
398
- /** Poll pipeline deployment to terminal status (TTY: ora spinner). */
399
- async function pollDeployment(result, url, validatedEnvKey, authConfig, options) {
400
- if (!options.poll || !result.deploymentId) {
401
- return result;
402
- }
403
-
404
- // Separate validation/draft block from deploy polling (matches guided CLI spacing)
405
- logger.log('');
406
-
407
- const resolvedInterval = await resolvePollIntervalFromController(url, options.pollInterval);
408
- const maxAttempts = options.pollMaxAttempts || 60;
409
- const pollUi = createDeployPollHandlers(maxAttempts, { silent: options.silentPoll === true });
410
-
411
- try {
412
- const status = await pollDeploymentStatus(
413
- result.deploymentId,
414
- url,
415
- validatedEnvKey,
416
- authConfig,
417
- {
418
- interval: resolvedInterval,
419
- maxAttempts,
420
- onPollProgress: pollUi.onPollProgress
421
- }
422
- );
423
-
424
- result.status = status;
425
- return result;
426
- } finally {
427
- pollUi.finish();
428
- }
429
- }
430
-
431
352
  /**
432
353
  * Deploys application to Miso Controller with authentication
433
354
  * Supports both Bearer token and client credentials authentication
@@ -464,16 +385,25 @@ async function deployToController(manifest, controllerUrl, envKey, authConfig, o
464
385
 
465
386
  const pipelineManifest = transformExternalManifestForPipeline(manifest);
466
387
 
388
+ const usePollUi = options.poll !== false && options.silentPoll !== true;
389
+ const pollUi = usePollUi
390
+ ? createDeployPollHandlers(options.pollMaxAttempts || 60, { silent: false })
391
+ : null;
392
+ const deployOpts = pollUi ? { ...options, pollUi } : options;
393
+
467
394
  try {
468
395
  // Send deployment request
469
- const result = await sendDeployment(url, validatedEnvKey, pipelineManifest, authConfig, options);
396
+ const result = await sendDeployment(url, validatedEnvKey, pipelineManifest, authConfig, deployOpts);
470
397
 
471
398
  // Poll for deployment status if enabled
472
- return await pollDeployment(result, url, validatedEnvKey, authConfig, options);
473
-
399
+ return await pollDeployment(result, url, validatedEnvKey, authConfig, deployOpts);
474
400
  } catch (error) {
475
401
  // Use unified error handler (already logged in deployToController, so pass alreadyLogged=true)
476
402
  await handleDeploymentErrors(error, manifest.key, url, false);
403
+ } finally {
404
+ if (pollUi) {
405
+ pollUi.finish();
406
+ }
477
407
  }
478
408
  }
479
409
 
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @fileoverview Dataplane auth/url resolution for evidence commands.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { resolveProtectionDataplaneContext } = require('../protection/auth-context');
10
+
11
+ /**
12
+ * @param {Object} [options]
13
+ * @returns {Promise<{ environment: string, controllerUrl: string, dataplaneUrl: string, authConfig: Object }>}
14
+ */
15
+ async function resolveEvidenceDataplaneContext(options = {}) {
16
+ return resolveProtectionDataplaneContext(options);
17
+ }
18
+
19
+ module.exports = {
20
+ resolveEvidenceDataplaneContext
21
+ };
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @fileoverview TTY display helpers for evidence commands.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const chalk = require('chalk');
10
+ const { formatSuccessLine, headerKeyValue } = require('../utils/cli-layout-chalk');
11
+
12
+ /**
13
+ * @param {string|null|undefined} roleKey
14
+ * @returns {string}
15
+ */
16
+ function formatScopeLabel(roleKey) {
17
+ return roleKey && String(roleKey).trim() ? String(roleKey).trim() : 'Generic';
18
+ }
19
+
20
+ /**
21
+ * @param {Object[]} rows
22
+ * @returns {string}
23
+ */
24
+ function formatEvidenceListTTY(rows) {
25
+ if (!rows.length) {
26
+ return chalk.gray('No evidence rows matched the filters.');
27
+ }
28
+ const lines = rows.map((row) => {
29
+ const scope = formatScopeLabel(row.roleKey);
30
+ return `${chalk.cyan(row.id)} ${row.title} ${chalk.gray(
31
+ `[${row.resourceType} · ${scope} · order ${row.order} · ${row.status}]`
32
+ )}`;
33
+ });
34
+ return `${headerKeyValue('Evidence rows', String(rows.length))}\n${lines.join('\n')}`;
35
+ }
36
+
37
+ /**
38
+ * @param {Object} row
39
+ * @returns {string}
40
+ */
41
+ function formatEvidenceGetTTY(row) {
42
+ return [
43
+ headerKeyValue('Evidence', row.title),
44
+ ` id: ${row.id}`,
45
+ ` resourceType: ${row.resourceType}`,
46
+ ` scope: ${formatScopeLabel(row.roleKey)}`,
47
+ ` order: ${row.order}`,
48
+ ` status: ${row.status}`,
49
+ ` when: ${row.when}`,
50
+ ` expectedBehavior: ${row.expectedBehavior}`
51
+ ].join('\n');
52
+ }
53
+
54
+ /**
55
+ * @param {Object} summary
56
+ * @returns {string}
57
+ */
58
+ function formatEvidenceLoadSummaryTTY(summary) {
59
+ return formatSuccessLine(
60
+ `Load complete — inserted ${summary.inserted}, updated ${summary.updated}, skipped ${summary.skipped}`
61
+ );
62
+ }
63
+
64
+ /**
65
+ * @param {Object} summary
66
+ * @returns {string}
67
+ */
68
+ function formatEvidenceExportSummaryTTY(summary) {
69
+ return formatSuccessLine(`Exported ${summary.count} row(s) to ${summary.file}`);
70
+ }
71
+
72
+ module.exports = {
73
+ formatEvidenceListTTY,
74
+ formatEvidenceGetTTY,
75
+ formatEvidenceLoadSummaryTTY,
76
+ formatEvidenceExportSummaryTTY,
77
+ formatScopeLabel
78
+ };