@aifabrix/builder 2.49.2 → 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 (409) hide show
  1. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  2. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  3. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  4. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  5. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  6. package/.cursor/skills/README.md +1 -0
  7. package/.dockerignore +52 -0
  8. package/.eslintignore +22 -0
  9. package/README.md +2 -0
  10. package/bin/builder-api-cleanup.js +26 -0
  11. package/bin/builder-api-nest.js +10 -0
  12. package/bin/builder-api-spike.js +19 -0
  13. package/enterprise-knowledge/README.md +50 -0
  14. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  15. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  20. package/integration/README.md +81 -0
  21. package/integration/github/README.md +53 -0
  22. package/integration/github/application.json +21 -0
  23. package/integration/github/deploy.js +72 -0
  24. package/integration/github/env.template +11 -0
  25. package/integration/github/github-datasource-issue-comments.json +239 -0
  26. package/integration/github/github-datasource-issues.json +399 -0
  27. package/integration/github/github-datasource-repository.json +354 -0
  28. package/integration/github/github-deploy.json +1202 -0
  29. package/integration/github/github-system.json +82 -0
  30. package/integration/hubspot-test/README.md +1 -1
  31. package/jest.isolated-projects.js +31 -1
  32. package/jest.projects.js +87 -1
  33. package/lib/api/dev-server-https.js +1 -1
  34. package/lib/api/enterprise-knowledge.api.js +63 -0
  35. package/lib/api/evidence.api.js +172 -0
  36. package/lib/api/external-systems.api.js +8 -2
  37. package/lib/api/resource-types.api.js +1 -0
  38. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  39. package/lib/api/types/evidence.types.js +67 -0
  40. package/lib/api/types/resource-types.types.js +2 -0
  41. package/lib/app/controller-application-filter.js +36 -0
  42. package/lib/app/deploy.js +1 -1
  43. package/lib/app/list-external-systems.js +130 -0
  44. package/lib/app/list.js +20 -8
  45. package/lib/app/run.js +3 -1
  46. package/lib/app/show-display.js +8 -3
  47. package/lib/app/show-online.js +178 -0
  48. package/lib/app/show.js +37 -88
  49. package/lib/build/builder-api-docker-staging.js +47 -0
  50. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  51. package/lib/build/standard-docker-build.js +2 -0
  52. package/lib/certification/post-unified-cert-sync.js +4 -31
  53. package/lib/certification/sync-after-external-command.js +0 -1
  54. package/lib/certification/sync-system-certification.js +0 -3
  55. package/lib/channels/add-channel.js +40 -34
  56. package/lib/channels/approval-guides/chatgpt.js +33 -0
  57. package/lib/channels/approval-guides/credential-portal.js +38 -0
  58. package/lib/channels/approval-guides/index.js +110 -0
  59. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  60. package/lib/channels/approval-guides/slack.js +34 -0
  61. package/lib/channels/approval-guides/teams-bot.js +35 -0
  62. package/lib/channels/approval-guides/web-embed.js +32 -0
  63. package/lib/channels/channel-approval-guide.js +11 -0
  64. package/lib/channels/channel-artifact-generator.js +16 -4
  65. package/lib/channels/channel-audit.js +3 -0
  66. package/lib/channels/channel-auth-context.js +1 -1
  67. package/lib/channels/channel-description.js +59 -0
  68. package/lib/channels/channel-integration-generator.js +13 -230
  69. package/lib/channels/channel-integration-template.js +94 -0
  70. package/lib/channels/channel-runtime-resolver.js +43 -3
  71. package/lib/channels/channel-status-display.js +66 -26
  72. package/lib/channels/channel-targets.js +3 -3
  73. package/lib/cli/index.js +27 -3
  74. package/lib/cli/infra-guided.js +5 -1
  75. package/lib/cli/setup-app-external-create.js +111 -0
  76. package/lib/cli/setup-app.help.js +1 -1
  77. package/lib/cli/setup-app.js +38 -125
  78. package/lib/cli/setup-app.test-commands.js +26 -52
  79. package/lib/cli/setup-certification-commands.js +4 -4
  80. package/lib/cli/setup-certification.help.js +9 -9
  81. package/lib/cli/setup-dev.js +7 -2
  82. package/lib/cli/setup-external-system-help.js +4 -6
  83. package/lib/cli/setup-external-system.js +58 -52
  84. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  85. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  86. package/lib/cli/setup-infra.js +15 -0
  87. package/lib/cli/setup-list.js +43 -0
  88. package/lib/cli/setup-utility-repair.js +26 -7
  89. package/lib/cli/setup-utility.js +5 -3
  90. package/lib/commands/app.js +15 -43
  91. package/lib/commands/channel-add-setup.js +110 -0
  92. package/lib/commands/channel.js +42 -8
  93. package/lib/commands/datasource-sync-display.js +96 -0
  94. package/lib/commands/datasource-sync-policy.js +210 -0
  95. package/lib/commands/datasource-test-trust-cli.js +6 -6
  96. package/lib/commands/datasource-unified-test-cli.js +2 -1
  97. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  98. package/lib/commands/deploy-gate-failure-details.js +163 -0
  99. package/lib/commands/deploy-gate-orchestrator.js +322 -0
  100. package/lib/commands/dev-cli-handlers.js +1 -59
  101. package/lib/commands/dev-host-ops-params.js +91 -0
  102. package/lib/commands/dev-host-ops-poll.js +111 -0
  103. package/lib/commands/dev-host-ops.js +107 -94
  104. package/lib/commands/dev-init.js +3 -1
  105. package/lib/commands/enterprise-knowledge.js +284 -0
  106. package/lib/commands/evidence-cli-leaves.js +250 -0
  107. package/lib/commands/evidence.js +51 -0
  108. package/lib/commands/governance-cli-shared.js +2 -2
  109. package/lib/commands/governance-command-action.js +2 -2
  110. package/lib/commands/governance-fixture-subjects.js +85 -0
  111. package/lib/commands/governance.js +1 -1
  112. package/lib/commands/lifecycle-command-action.js +2 -2
  113. package/lib/commands/lifecycle-external.js +3 -3
  114. package/lib/commands/manifest-cli-auth.js +29 -0
  115. package/lib/commands/manifest-cli-commands.js +170 -0
  116. package/lib/commands/manifest-cli-integration-path.js +63 -0
  117. package/lib/commands/manifest.js +21 -0
  118. package/lib/commands/protection-cli-leaves.js +3 -3
  119. package/lib/commands/repair-auth-apply.js +15 -1
  120. package/lib/commands/repair-authentications-454.js +169 -0
  121. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  122. package/lib/commands/repair-datasource-apply.js +135 -0
  123. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  124. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  125. package/lib/commands/repair-datasource-operation-security.js +180 -0
  126. package/lib/commands/repair-datasource-run.js +7 -2
  127. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  128. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  129. package/lib/commands/repair-datasource.js +12 -68
  130. package/lib/commands/repair-env-template.js +11 -1
  131. package/lib/commands/repair-external-run.js +121 -31
  132. package/lib/commands/repair-internal.js +1 -1
  133. package/lib/commands/repair-openapi-export.js +156 -0
  134. package/lib/commands/repair-openapi-sync.js +19 -2
  135. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  136. package/lib/commands/repair-persist.js +22 -1
  137. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  138. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  139. package/lib/commands/repair-rbac.js +163 -86
  140. package/lib/commands/repair-steps.js +83 -18
  141. package/lib/commands/repair-system-permissions.js +1 -0
  142. package/lib/commands/repair.js +1 -1
  143. package/lib/commands/resource-type.js +65 -26
  144. package/lib/commands/run-post-publish-data-sync.js +68 -0
  145. package/lib/commands/setup-modes.js +1 -1
  146. package/lib/commands/test-e2e-external.js +21 -8
  147. package/lib/commands/test-governance-cli-options.js +2 -2
  148. package/lib/commands/test-trust-cli-options.js +2 -2
  149. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  150. package/lib/commands/up-builder-api-provision.js +241 -0
  151. package/lib/commands/up-builder-api.js +88 -0
  152. package/lib/commands/up-common.js +25 -1
  153. package/lib/commands/upload-credential-push-log.js +117 -0
  154. package/lib/commands/upload-data-sync-finalize.js +60 -0
  155. package/lib/commands/upload-probe.js +66 -0
  156. package/lib/commands/upload-publish-context.js +4 -1
  157. package/lib/commands/upload-sidecar-followups.js +55 -27
  158. package/lib/commands/upload.js +116 -157
  159. package/lib/commands/verify-governance-combined-external.js +1 -1
  160. package/lib/commands/verify-governance-db.js +2 -2
  161. package/lib/commands/verify-operations-command-action.js +2 -2
  162. package/lib/commands/verify-operations-step-plan.js +2 -2
  163. package/lib/commands/verify-operations-steps.js +2 -2
  164. package/lib/commands/verify-trust-command-action.js +1 -1
  165. package/lib/commands/wizard-core.js +1 -1
  166. package/lib/commands/wizard-headless.js +2 -1
  167. package/lib/core/admin-secrets.js +2 -6
  168. package/lib/core/secrets-env-content.js +10 -4
  169. package/lib/core/secrets-env-write.js +2 -13
  170. package/lib/datasource/agent-trust-run.js +3 -3
  171. package/lib/datasource/deploy.js +3 -1
  172. package/lib/datasource/test-e2e.js +6 -1
  173. package/lib/datasource/unified-validation-run-body.js +4 -1
  174. package/lib/datasource/unified-validation-run.js +1 -1
  175. package/lib/deployment/deploy-poll-ui.js +73 -12
  176. package/lib/deployment/deployer-poll-run.js +113 -0
  177. package/lib/deployment/deployer.js +17 -87
  178. package/lib/evidence/dataplane-context.js +21 -0
  179. package/lib/evidence/evidence-display.js +78 -0
  180. package/lib/evidence/evidence-service.js +392 -0
  181. package/lib/external-system/deploy.js +290 -112
  182. package/lib/external-system/download.js +7 -3
  183. package/lib/external-system/test-execution.js +1 -1
  184. package/lib/external-system/test-system-level.js +8 -10
  185. package/lib/external-system/test.js +12 -6
  186. package/lib/generator/deploy-script.js +73 -0
  187. package/lib/generator/external.js +2 -1
  188. package/lib/generator/index.js +17 -2
  189. package/lib/generator/wizard.js +3 -36
  190. package/lib/internal/fs-real-sync.js +22 -1
  191. package/lib/internal/node-fs.js +2 -0
  192. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  193. package/lib/lifecycle/verify-step-progress.js +1 -1
  194. package/lib/programmatic/access-log.js +26 -0
  195. package/lib/programmatic/auth-config.js +44 -0
  196. package/lib/programmatic/bearer-auth.js +176 -0
  197. package/lib/programmatic/builder-api-request.js +175 -0
  198. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  199. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  200. package/lib/programmatic/builder-api-server.js +230 -0
  201. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  202. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  203. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  204. package/lib/programmatic/builder-help-envelope.js +36 -0
  205. package/lib/programmatic/builder-help-fixtures.js +200 -0
  206. package/lib/programmatic/builder-help-governance.js +172 -0
  207. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  208. package/lib/programmatic/builder-help.js +361 -0
  209. package/lib/programmatic/capability-registry.js +77 -0
  210. package/lib/programmatic/command-options.js +32 -0
  211. package/lib/programmatic/enterprise-mcp-client.js +98 -0
  212. package/lib/programmatic/http-problem-details.js +99 -0
  213. package/lib/programmatic/http-route-match.js +40 -0
  214. package/lib/programmatic/idempotency-cache.js +69 -0
  215. package/lib/programmatic/index.js +53 -0
  216. package/lib/programmatic/integration-path-scope.js +39 -0
  217. package/lib/programmatic/log-redaction.js +66 -0
  218. package/lib/programmatic/manifest-get-section.js +146 -0
  219. package/lib/programmatic/manifest-patch-section.js +252 -0
  220. package/lib/programmatic/manifest-repair.js +122 -0
  221. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  222. package/lib/programmatic/manifest-section-io.js +225 -0
  223. package/lib/programmatic/manifest-section-quality.js +171 -0
  224. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  225. package/lib/programmatic/manifest-section-registry.js +205 -0
  226. package/lib/programmatic/nest-http-bridge.js +34 -0
  227. package/lib/programmatic/openapi-component-schemas.js +68 -0
  228. package/lib/programmatic/openapi-description-enricher.js +117 -0
  229. package/lib/programmatic/openapi-descriptions.js +190 -0
  230. package/lib/programmatic/openapi-docs-serving.js +123 -0
  231. package/lib/programmatic/openapi-help-schemas.js +63 -0
  232. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  233. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  234. package/lib/programmatic/openapi-request-schemas.js +155 -0
  235. package/lib/programmatic/openapi-result-schemas.js +476 -0
  236. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  237. package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
  238. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  239. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  240. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  241. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  242. package/lib/programmatic/openapi-schema-helpers.js +93 -0
  243. package/lib/programmatic/openapi-spec.js +203 -0
  244. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  245. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  246. package/lib/programmatic/request-timeout.js +53 -0
  247. package/lib/programmatic/route-handler-map.js +143 -0
  248. package/lib/programmatic/route-handlers-context.js +29 -0
  249. package/lib/programmatic/route-handlers.js +33 -0
  250. package/lib/programmatic/run-certify.js +57 -0
  251. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  252. package/lib/programmatic/run-lifecycle.js +29 -0
  253. package/lib/programmatic/run-repair.js +41 -0
  254. package/lib/programmatic/run-repository-emcp.js +54 -0
  255. package/lib/programmatic/run-template-workspace.js +61 -0
  256. package/lib/programmatic/run-test.js +49 -0
  257. package/lib/programmatic/run-upload.js +63 -0
  258. package/lib/programmatic/run-validate.js +53 -0
  259. package/lib/programmatic/run-wizard.js +40 -0
  260. package/lib/programmatic/system-key.js +48 -0
  261. package/lib/programmatic/wizard-config-normalize.js +118 -0
  262. package/lib/programmatic/workspace-cleanup.js +128 -0
  263. package/lib/programmatic/workspace-context.js +145 -0
  264. package/lib/programmatic/workspace-lock.js +75 -0
  265. package/lib/programmatic/workspace-meta.js +64 -0
  266. package/lib/programmatic/workspace-ops.js +149 -0
  267. package/lib/protection/run-commands-upload-sync.js +35 -0
  268. package/lib/protection/run-commands.js +2 -20
  269. package/lib/protection/upload-batch.js +11 -7
  270. package/lib/resolvers/resource-type-file.js +22 -0
  271. package/lib/schema/external-datasource.schema.json +161 -1
  272. package/lib/schema/external-system.schema.json +244 -118
  273. package/lib/schema/flag-map-validation-run.json +3 -0
  274. package/lib/schema/type/credential-field-registry.json +2 -2
  275. package/lib/schema/type/document-storage.json +9 -0
  276. package/lib/utils/agent-trust-run-display.js +1 -1
  277. package/lib/utils/app-path-resolve.js +168 -0
  278. package/lib/utils/authentication-env-template.js +222 -0
  279. package/lib/utils/cli-sync-options.js +7 -11
  280. package/lib/utils/cli-utils.js +4 -0
  281. package/lib/utils/cli-workspace-options.js +29 -0
  282. package/lib/utils/compose-generate-docker-compose.js +102 -0
  283. package/lib/utils/configuration-env-resolver.js +203 -27
  284. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  285. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  286. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  287. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  288. package/lib/utils/datasource-test-run-display.js +2 -1
  289. package/lib/utils/dev-init-ssh-merge.js +165 -23
  290. package/lib/utils/dev-pin-share-instructions.js +110 -0
  291. package/lib/utils/dev-ssh-config-helper.js +177 -33
  292. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  293. package/lib/utils/env-copy.js +2 -1
  294. package/lib/utils/env-dotenv-format.js +103 -0
  295. package/lib/utils/external-env-template.js +4 -1
  296. package/lib/utils/external-system-display.js +5 -1
  297. package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
  298. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  299. package/lib/utils/external-system-readiness-core.js +16 -0
  300. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  301. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  302. package/lib/utils/external-system-readiness-display.js +20 -30
  303. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  304. package/lib/utils/external-system-system-test-tty.js +5 -41
  305. package/lib/utils/help-builder.js +6 -1
  306. package/lib/utils/host-ops-job-labels.js +236 -0
  307. package/lib/utils/host-ops-job-result.js +61 -0
  308. package/lib/utils/host-ops-poll-ui.js +163 -0
  309. package/lib/utils/integration-path-resolve.js +112 -0
  310. package/lib/utils/paths-reload-source.js +148 -0
  311. package/lib/utils/paths-system-builder-keys.js +25 -0
  312. package/lib/utils/paths.js +151 -26
  313. package/lib/utils/runtime-configuration-values.js +64 -2
  314. package/lib/utils/secrets-helpers.js +5 -1
  315. package/lib/utils/ssh-known-hosts.js +130 -0
  316. package/lib/utils/test-target-cli-options.js +75 -0
  317. package/lib/utils/upload-sync-options.js +4 -0
  318. package/lib/utils/validation-run-request.js +11 -2
  319. package/lib/validation/external-manifest-validator.js +11 -1
  320. package/lib/validation/openapi-contract-surface-validator.js +426 -0
  321. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  322. package/lib/validation/validate-external-file.js +160 -0
  323. package/lib/validation/validate.js +6 -117
  324. package/package.json +46 -29
  325. package/packages/builder-api/README.md +120 -0
  326. package/packages/builder-api/package.json +30 -0
  327. package/packages/builder-api/src/app.module.ts +7 -0
  328. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  329. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  330. package/packages/builder-api/src/main.ts +16 -0
  331. package/packages/builder-api/tsconfig.json +15 -0
  332. package/scripts/check-builder-api-architecture-grep.js +79 -0
  333. package/scripts/docker_image_content_gate.js +47 -0
  334. package/scripts/docker_image_content_gate.sh +5 -0
  335. package/scripts/export-builder-api-evidence.js +262 -0
  336. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  337. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  338. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  339. package/scripts/lib/plan-actor.js +109 -0
  340. package/scripts/lib/plan-config.js +20 -0
  341. package/scripts/lib/plan-gates.js +154 -0
  342. package/scripts/lib/plan-meta.js +104 -0
  343. package/scripts/lib/plan-parse.js +162 -0
  344. package/scripts/lib/plan-prevalidate-gates.js +326 -0
  345. package/scripts/lib/plan-run-core.js +125 -0
  346. package/scripts/lib/plan-run-report.js +108 -0
  347. package/scripts/plan-approve.js +24 -0
  348. package/scripts/plan-archive.js +49 -0
  349. package/scripts/plan-run.js +13 -0
  350. package/scripts/plan-set-actor.js +21 -0
  351. package/scripts/plan-validate.js +80 -0
  352. package/scripts/pnpm/af.mjs +110 -0
  353. package/scripts/pnpm/check-quiet.mjs +32 -0
  354. package/scripts/pnpm/dev-install.mjs +29 -0
  355. package/scripts/pnpm/dev-reload.mjs +18 -0
  356. package/scripts/pnpm/help.mjs +55 -0
  357. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  358. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  359. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  360. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  361. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  362. package/scripts/pnpm/lib/spinner.mjs +42 -0
  363. package/scripts/stage_builder_api_for_docker.js +65 -0
  364. package/scripts/sync-builder-api-template.js +44 -0
  365. package/templates/README.md +3 -0
  366. package/templates/applications/builder-api/Dockerfile +38 -0
  367. package/templates/applications/builder-api/application.yaml +75 -0
  368. package/templates/applications/builder-api/env.template +48 -0
  369. package/templates/applications/dataplane/application.yaml +1 -1
  370. package/templates/applications/dataplane/env.template +10 -6
  371. package/templates/applications/dataplane/rbac.yaml +21 -1
  372. package/templates/applications/miso-controller/application.yaml +1 -1
  373. package/templates/applications/miso-controller/env.template +1 -3
  374. package/templates/channels/README.md +18 -0
  375. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  376. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  377. package/templates/channels/chatgpt/integration/README.md +11 -0
  378. package/templates/channels/chatgpt/integration/application.json +15 -0
  379. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  380. package/templates/channels/chatgpt/integration/env.template +4 -0
  381. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  382. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  383. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  384. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  385. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  386. package/templates/channels/slack/install.template.md.hbs +48 -18
  387. package/templates/channels/slack/integration/README.md +38 -0
  388. package/templates/channels/slack/integration/application.json +18 -0
  389. package/templates/channels/slack/integration/env.template +29 -0
  390. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  391. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  392. package/templates/channels/slack/integration/slack-system.json +86 -0
  393. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  394. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  395. package/templates/channels/teams-bot/integration/README.md +18 -0
  396. package/templates/channels/teams-bot/integration/application.json +17 -0
  397. package/templates/channels/teams-bot/integration/env.template +5 -0
  398. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  399. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  400. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  401. package/templates/channels/web-embed/integration/README.md +11 -0
  402. package/templates/channels/web-embed/integration/application.json +15 -0
  403. package/templates/channels/web-embed/integration/env.template +4 -0
  404. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  405. package/templates/openapi/redoc_page.html +86 -0
  406. package/templates/python/docker-compose.hbs +11 -0
  407. package/templates/python/requirements.txt +1 -1
  408. package/templates/typescript/docker-compose.hbs +11 -0
  409. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -19,7 +19,7 @@ const { logOfflinePathWhenType } = require('../utils/cli-utils');
19
19
  const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
20
20
  const { getExternalSystem } = require('../api/external-systems.api');
21
21
  const { listDatasources } = require('../api/datasources-core.api');
22
- const { testSystemViaPipeline } = require('../api/pipeline.api');
22
+ const { testSystemViaPipeline, validatePipelineConfig } = require('../api/pipeline.api');
23
23
  const { extractDatasources } = require('../datasource/list');
24
24
  const { unwrapApiData } = require('../utils/external-system-readiness-core');
25
25
  const { logDeployReadinessSummary } = require('../utils/external-system-readiness-deploy-display');
@@ -27,48 +27,91 @@ const { parseControllerDeploymentOutcome } = require('../utils/controller-deploy
27
27
  const { generateControllerManifest } = require('../generator/external-controller-manifest');
28
28
  const { validateExternalSystemComplete } = require('../validation/validate');
29
29
  const { displayValidationResults } = require('../validation/validate-display');
30
- const { maybeSyncSystemCertificationFromDataplane } = require('../certification/sync-system-certification');
31
- const { cliOptsSkipCertSync } = require('../certification/cli-cert-sync-skip');
32
30
  const { syncDeployJsonFromSources } = require('./sync-deploy-manifest');
31
+ const { runDeployGateOrchestrator } = require('../commands/deploy-gate-orchestrator');
32
+ const { runPostPublishDataSync } = require('../commands/run-post-publish-data-sync');
33
33
 
34
34
  /**
35
- * Lists datasources for a system and loads system record for docs URLs.
35
+ * Validates manifest on dataplane (dry-run) before controller deploy.
36
36
  * @async
37
- * @param {string} controllerUrl - Controller base URL
38
- * @param {string} environment - Environment key
39
- * @param {Object} authConfig - Auth config
40
- * @param {string} systemKey - System key
41
- * @returns {Promise<{ dataplaneUrl: string, datasources: Object[], system: Object|null, error: Error|null }>}
37
+ * @param {Object} manifest
38
+ * @param {Object} authConfig
39
+ * @param {string} dataplaneUrl
42
40
  */
43
- async function fetchDataplaneDeployReadiness(controllerUrl, environment, authConfig, systemKey) {
44
- let dataplaneUrl;
45
- try {
46
- dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig);
47
- } catch (err) {
48
- return { dataplaneUrl: null, datasources: [], system: null, error: err };
41
+ async function validateManifestOnDataplane(manifest, authConfig, dataplaneUrl) {
42
+ const config = {
43
+ version: manifest.version || '1.0.0',
44
+ application: manifest.system,
45
+ dataSources: manifest.dataSources || []
46
+ };
47
+ const res = await validatePipelineConfig(dataplaneUrl, authConfig, { config });
48
+ if (res?.success === false) {
49
+ throw new Error(res.formattedError || res.error || 'Dataplane pipeline validation failed');
50
+ }
51
+ const data = res?.data && typeof res.data === 'object' ? res.data : res;
52
+ if (data?.isValid === false) {
53
+ const errors = Array.isArray(data.errors) ? data.errors : [];
54
+ const summary = errors.slice(0, 3).map((e) => (typeof e === 'string' ? e : e.message || String(e))).join('; ');
55
+ throw new Error(
56
+ summary ? `Dataplane validation failed: ${summary}` : 'Dataplane pipeline validation failed'
57
+ );
49
58
  }
59
+ }
50
60
 
51
- let datasources = [];
61
+ /**
62
+ * @async
63
+ * @returns {Promise<{ datasources: Object[], error: Error|null }>}
64
+ */
65
+ async function listDeployReadinessDatasources(dataplaneUrl, authConfig, systemKey) {
52
66
  try {
53
67
  const listRes = await listDatasources(dataplaneUrl, authConfig, {
54
68
  sourceSystemIdOrKey: systemKey,
55
69
  pageSize: 100
56
70
  });
57
- if (listRes.success && listRes.data) {
58
- try {
59
- datasources = extractDatasources(listRes);
60
- } catch (e) {
61
- logger.log(
62
- chalk.yellow(
63
- `⚠ Unable to parse datasources list from dataplane response: ${e && e.message ? e.message : 'unknown error'}`
64
- )
65
- );
66
- datasources = [];
67
- }
71
+ if (!listRes.success || !listRes.data) {
72
+ return { datasources: [], error: null };
73
+ }
74
+ try {
75
+ return { datasources: extractDatasources(listRes), error: null };
76
+ } catch (e) {
77
+ logger.log(
78
+ chalk.yellow(
79
+ `⚠ Unable to parse datasources list from dataplane response: ${e && e.message ? e.message : 'unknown error'}`
80
+ )
81
+ );
82
+ return { datasources: [], error: null };
68
83
  }
69
84
  } catch (err) {
70
- return { dataplaneUrl, datasources: [], system: null, error: err };
85
+ return { datasources: [], error: err };
71
86
  }
87
+ }
88
+
89
+ /**
90
+ * @async
91
+ * @param {string} controllerUrl - Controller base URL
92
+ * @param {string} environment - Environment key
93
+ * @param {Object} authConfig - Auth config
94
+ * @param {string} systemKey - System key
95
+ * @returns {Promise<{ dataplaneUrl: string, datasources: Object[], system: Object|null, error: Error|null }>}
96
+ */
97
+ async function fetchDataplaneDeployReadiness(controllerUrl, environment, authConfig, systemKey, opts = {}) {
98
+ let dataplaneUrl = opts.dataplaneUrl;
99
+ if (!dataplaneUrl) {
100
+ try {
101
+ dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig, {
102
+ silent: opts.silent === true
103
+ });
104
+ } catch (err) {
105
+ return { dataplaneUrl: null, datasources: [], system: null, error: err };
106
+ }
107
+ }
108
+
109
+ let datasources = [];
110
+ const dsResult = await listDeployReadinessDatasources(dataplaneUrl, authConfig, systemKey);
111
+ if (dsResult.error) {
112
+ return { dataplaneUrl, datasources: [], system: null, error: dsResult.error };
113
+ }
114
+ datasources = dsResult.datasources;
72
115
 
73
116
  try {
74
117
  const getRes = await getExternalSystem(dataplaneUrl, systemKey, authConfig);
@@ -111,43 +154,29 @@ async function fetchDataplaneDeployReadiness(controllerUrl, environment, authCon
111
154
  */
112
155
  async function runOptionalExternalDeployProbe(ctx, systemKey, authConfig, options) {
113
156
  if (!options.probe || !ctx.dataplaneUrl || ctx.error) return null;
114
- logger.log(chalk.blue('\nRunning runtime checks (--probe)...'));
157
+ const compact = options.verbose !== true;
158
+ if (!compact) {
159
+ logger.log(chalk.blue('\nRunning runtime checks (--probe)...'));
160
+ }
115
161
  try {
116
162
  const pr = await testSystemViaPipeline(ctx.dataplaneUrl, systemKey, authConfig, {}, {
117
163
  timeout: options.probeTimeout || 120000
118
164
  });
119
165
  if (pr.success === false) {
120
- logger.log(chalk.yellow(`⚠ Probe request failed: ${pr.formattedError || pr.error || 'unknown error'}`));
166
+ if (!compact) {
167
+ logger.log(chalk.yellow(`⚠ Probe request failed: ${pr.formattedError || pr.error || 'unknown error'}`));
168
+ }
121
169
  return null;
122
170
  }
123
171
  return unwrapApiData(pr);
124
172
  } catch (e) {
125
- logger.log(chalk.yellow(`⚠ Probe failed: ${e.message}`));
173
+ if (!compact) {
174
+ logger.log(chalk.yellow(`⚠ Probe failed: ${e.message}`));
175
+ }
126
176
  return null;
127
177
  }
128
178
  }
129
179
 
130
- /**
131
- * @param {Object} deploymentOutcome
132
- * @param {{ dataplaneUrl: string|null, error: Error|null }} ctx
133
- * @param {Object} manifest
134
- * @param {Object} options
135
- * @param {Object} authConfig
136
- * @returns {Promise<void>}
137
- */
138
- async function maybeSyncCertificationAfterExternalDeploy(deploymentOutcome, ctx, manifest, options, authConfig) {
139
- if (!deploymentOutcome.ok || !ctx.dataplaneUrl || ctx.error) return;
140
- const dsKeys = (manifest.dataSources || []).map((ds) => ds && ds.key).filter(Boolean);
141
- await maybeSyncSystemCertificationFromDataplane({
142
- label: 'deploy',
143
- noCertSync: cliOptsSkipCertSync(options),
144
- systemKey: manifest.key,
145
- dataplaneUrl: ctx.dataplaneUrl,
146
- authConfig,
147
- datasourceKeys: dsKeys
148
- });
149
- }
150
-
151
180
  function logImmediateControllerDeploymentOutcome(deploymentOutcome) {
152
181
  if (deploymentOutcome.ok) {
153
182
  logger.log(formatSuccessParagraph('Controller deployment OK'));
@@ -172,52 +201,136 @@ function logImmediateControllerDeploymentOutcome(deploymentOutcome) {
172
201
  logger.log(chalk.gray(' Check the controller deployment job or logs for details.'));
173
202
  }
174
203
 
175
- async function executeDeployAndDisplay(manifest, controllerUrl, environment, authConfig, options) {
176
- const deployer = require('../deployment/deployer');
177
- const pollOpts = {
178
- poll: options.poll,
204
+ function buildExternalDeployPollOpts(options) {
205
+ return {
206
+ ...options,
207
+ poll: true,
179
208
  pollInterval: options.pollInterval !== undefined ? options.pollInterval : 500,
180
- // External-system deploy only: ~10s poll window (matches controller→dataplane publish timeout). Not used for Azure/webapp deploy polling.
181
209
  pollMaxAttempts: options.pollMaxAttempts !== undefined ? options.pollMaxAttempts : 22,
182
- ...options
210
+ silentPoll: options.silentPoll === true
183
211
  };
184
- const result = await deployer.deployToController(
185
- manifest,
186
- controllerUrl,
187
- environment,
212
+ }
213
+
214
+ async function promoteExternalSystemLifecycleAfterDeploy(manifest, dataplaneUrl, authConfig) {
215
+ const { buildUploadPayload } = require('../commands/upload');
216
+ const { uploadApplicationViaPipelineWithAuthRetry } = require('../utils/pipeline-upload-auth-retry');
217
+ const payload = buildUploadPayload(manifest, { status: 'published' });
218
+ const res = await uploadApplicationViaPipelineWithAuthRetry(
219
+ dataplaneUrl,
188
220
  authConfig,
189
- pollOpts
221
+ payload,
222
+ manifest.key
190
223
  );
191
-
192
- const deploymentOutcome = parseControllerDeploymentOutcome(result);
193
- logImmediateControllerDeploymentOutcome(deploymentOutcome);
194
-
195
- if (!deploymentOutcome.ok) {
196
- return result;
224
+ if (res?.success === false) {
225
+ throw new Error(
226
+ res.formattedError || res.error || 'Failed to promote external system lifecycle after deploy'
227
+ );
197
228
  }
229
+ return res;
230
+ }
198
231
 
232
+ async function finalizeExternalDeployDataplaneWork(manifest, controllerUrl, environment, authConfig, options) {
233
+ const compact = options.verbose !== true;
234
+ const silent = compact;
199
235
  const ctx = await fetchDataplaneDeployReadiness(
200
236
  controllerUrl,
201
237
  environment,
202
238
  authConfig,
203
- manifest.key
239
+ manifest.key,
240
+ { dataplaneUrl: options.knownDataplaneUrl, silent }
204
241
  );
205
242
 
206
- const probeData = await runOptionalExternalDeployProbe(ctx, manifest.key, authConfig, options);
243
+ if (ctx.dataplaneUrl && !ctx.error) {
244
+ await promoteExternalSystemLifecycleAfterDeploy(manifest, ctx.dataplaneUrl, authConfig);
245
+ }
246
+
247
+ const refreshedCtx =
248
+ ctx.dataplaneUrl && !ctx.error
249
+ ? await fetchDataplaneDeployReadiness(
250
+ controllerUrl,
251
+ environment,
252
+ authConfig,
253
+ manifest.key,
254
+ { dataplaneUrl: ctx.dataplaneUrl, silent: true }
255
+ )
256
+ : ctx;
257
+
258
+ const probeData = await runOptionalExternalDeployProbe(refreshedCtx, manifest.key, authConfig, options);
259
+ return { refreshedCtx, probeData };
260
+ }
261
+
262
+ async function runPostDeployExternalSystemSteps(manifest, controllerUrl, environment, authConfig, options) {
263
+ const { runWithDeployPollSpinner } = require('../deployment/deploy-poll-ui');
264
+
265
+ const { refreshedCtx, probeData } = await runWithDeployPollSpinner(
266
+ 'Finalizing deployment on dataplane…',
267
+ () => finalizeExternalDeployDataplaneWork(manifest, controllerUrl, environment, authConfig, options),
268
+ { silent: options.silentPoll === true }
269
+ );
207
270
 
208
271
  logDeployReadinessSummary({
209
272
  environment,
210
- dataplaneUrl: ctx.dataplaneUrl,
273
+ dataplaneUrl: refreshedCtx.dataplaneUrl,
211
274
  manifest,
212
- datasources: ctx.datasources,
213
- systemFromDataplane: ctx.system,
214
- fetchError: ctx.error,
215
- deploymentOk: deploymentOutcome.ok,
216
- deploymentDetail: deploymentOutcome.ok ? null : deploymentOutcome,
217
- probeData
275
+ datasources: refreshedCtx.datasources,
276
+ systemFromDataplane: refreshedCtx.system,
277
+ fetchError: refreshedCtx.error,
278
+ deploymentOk: true,
279
+ deploymentDetail: null,
280
+ probeData,
281
+ verbose: options.verbose === true,
282
+ gateOutcomes: options.gateOutcomes || null,
283
+ draftDeploymentId: options.draftDeploymentId || null
218
284
  });
219
285
 
220
- await maybeSyncCertificationAfterExternalDeploy(deploymentOutcome, ctx, manifest, options, authConfig);
286
+ const { trySyncCertificationFromDataplaneForExternalApp } = require('../certification/sync-after-external-command');
287
+ await trySyncCertificationFromDataplaneForExternalApp(manifest.key, 'deploy');
288
+
289
+ await runPostPublishDataSync({
290
+ dataplaneUrl: refreshedCtx.dataplaneUrl,
291
+ authConfig,
292
+ datasourceKeys: (manifest.dataSources || []).map((ds) => ds && ds.key).filter(Boolean),
293
+ options,
294
+ label: 'Deploy data sync'
295
+ });
296
+ }
297
+
298
+ async function executeDeployAndDisplay(manifest, controllerUrl, environment, authConfig, options) {
299
+ const compact = options.verbose !== true;
300
+ const deployer = require('../deployment/deployer');
301
+ const result = await deployer.deployToController(
302
+ manifest,
303
+ controllerUrl,
304
+ environment,
305
+ authConfig,
306
+ buildExternalDeployPollOpts(options)
307
+ );
308
+
309
+ const deploymentOutcome = parseControllerDeploymentOutcome(result);
310
+ if (!compact) {
311
+ logImmediateControllerDeploymentOutcome(deploymentOutcome);
312
+ }
313
+
314
+ if (!deploymentOutcome.ok) {
315
+ if (compact) {
316
+ logDeployReadinessSummary({
317
+ environment,
318
+ dataplaneUrl: null,
319
+ manifest,
320
+ deploymentOk: false,
321
+ deploymentDetail: deploymentOutcome,
322
+ verbose: false,
323
+ gateOutcomes: options.gateOutcomes || null,
324
+ draftDeploymentId: result?.deploymentId || null
325
+ });
326
+ }
327
+ return result;
328
+ }
329
+
330
+ await runPostDeployExternalSystemSteps(manifest, controllerUrl, environment, authConfig, {
331
+ ...options,
332
+ draftDeploymentId: result?.deploymentId || null
333
+ });
221
334
 
222
335
  return result;
223
336
  }
@@ -242,6 +355,100 @@ async function prepareDeploymentConfig(appName, _options) {
242
355
  return { environment, controllerUrl, authConfig };
243
356
  }
244
357
 
358
+ /**
359
+ * @param {Error} error
360
+ * @param {string} appName
361
+ * @returns {Error}
362
+ */
363
+ function wrapDeployExternalSystemError(error, appName) {
364
+ let message = `Failed to deploy external system: ${error.message}`;
365
+ if (error.message && error.message.includes('Application not found')) {
366
+ message += `\n\n💡 Register the app in the controller first: aifabrix app register ${appName}`;
367
+ }
368
+ return new Error(message);
369
+ }
370
+
371
+ /**
372
+ * @async
373
+ * @param {string} appName
374
+ * @param {Object} options
375
+ * @returns {Promise<Object>}
376
+ */
377
+ /**
378
+ * @param {string} appName
379
+ * @param {Object} options
380
+ * @param {boolean} compact
381
+ */
382
+ async function validateExternalSystemForDeploy(appName, options, compact) {
383
+ if (!compact) {
384
+ logger.log(chalk.blue('🔍 Validating external system before deployment...'));
385
+ }
386
+ const validationResult = await validateExternalSystemComplete(appName, options);
387
+ if (!validationResult.valid) {
388
+ displayValidationResults(validationResult);
389
+ throw new Error('Validation failed. Fix errors before deploying.');
390
+ }
391
+ if (!compact) {
392
+ logger.log(formatSuccessLine('Local validation passed, proceeding with deployment...'));
393
+ }
394
+ }
395
+
396
+ /**
397
+ * @param {Object} manifest
398
+ * @param {Object} authConfig
399
+ * @param {string} dataplaneUrl
400
+ * @param {boolean} compact
401
+ */
402
+ async function validateDataplaneManifestForDeploy(manifest, authConfig, dataplaneUrl, compact) {
403
+ if (!compact) {
404
+ logger.log(chalk.blue('🔍 Validating manifest on dataplane...'));
405
+ }
406
+ await validateManifestOnDataplane(manifest, authConfig, dataplaneUrl);
407
+ if (!compact) {
408
+ logger.log(formatSuccessLine('Dataplane validation passed'));
409
+ }
410
+ }
411
+
412
+ async function runExternalSystemDeployFlow(appName, options) {
413
+ const compact = options.verbose !== true;
414
+ const { appPath } = await detectAppType(appName);
415
+ logOfflinePathWhenType(appPath);
416
+
417
+ if (!compact) {
418
+ logger.log(chalk.blue(`\n🚀 Deploying external system: ${appName}`));
419
+ }
420
+
421
+ await validateExternalSystemForDeploy(appName, options, compact);
422
+
423
+ const gateOutcomes = await runDeployGateOrchestrator(appName, {
424
+ ...options,
425
+ quietDeployUi: compact
426
+ });
427
+
428
+ await syncDeployJsonFromSources(appName);
429
+
430
+ const manifest = await generateControllerManifest(appName, options);
431
+
432
+ const { environment, controllerUrl, authConfig } = await prepareDeploymentConfig(appName, options);
433
+
434
+ let dataplaneUrl;
435
+ try {
436
+ dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig, {
437
+ silent: compact
438
+ });
439
+ } catch (err) {
440
+ throw new Error(`Failed to resolve dataplane URL before deploy: ${err.message}`);
441
+ }
442
+
443
+ await validateDataplaneManifestForDeploy(manifest, authConfig, dataplaneUrl, compact);
444
+
445
+ return executeDeployAndDisplay(manifest, controllerUrl, environment, authConfig, {
446
+ ...options,
447
+ gateOutcomes,
448
+ knownDataplaneUrl: dataplaneUrl
449
+ });
450
+ }
451
+
245
452
  /**
246
453
  * Deploys external system via controller pipeline (same as regular apps)
247
454
  *
@@ -255,41 +462,12 @@ async function prepareDeploymentConfig(appName, _options) {
255
462
  */
256
463
  async function deployExternalSystem(appName, options = {}) {
257
464
  try {
258
- const { appPath } = await detectAppType(appName);
259
- logOfflinePathWhenType(appPath);
260
-
261
- logger.log(chalk.blue(`\n🚀 Deploying external system: ${appName}`));
262
-
263
- logger.log(chalk.blue('🔍 Validating external system before deployment...'));
264
- const validationResult = await validateExternalSystemComplete(appName, options);
265
-
266
- if (!validationResult.valid) {
267
- displayValidationResults(validationResult);
268
- throw new Error('Validation failed. Fix errors before deploying.');
269
- }
270
-
271
- logger.log(formatSuccessLine('Local validation passed, proceeding with deployment...'));
272
-
273
- await syncDeployJsonFromSources(appName);
274
-
275
- const manifest = await generateControllerManifest(appName, options);
276
-
277
- const { environment, controllerUrl, authConfig } = await prepareDeploymentConfig(appName, options);
278
-
279
- const result = await executeDeployAndDisplay(
280
- manifest,
281
- controllerUrl,
282
- environment,
283
- authConfig,
284
- options
285
- );
286
- return result;
465
+ return await runExternalSystemDeployFlow(appName, options);
287
466
  } catch (error) {
288
- let message = `Failed to deploy external system: ${error.message}`;
289
- if (error.message && error.message.includes('Application not found')) {
290
- message += `\n\n💡 Register the app in the controller first: aifabrix app register ${appName}`;
467
+ if (error && error.gateFailure === true) {
468
+ throw error;
291
469
  }
292
- throw new Error(message);
470
+ throw wrapDeployExternalSystemError(error, appName);
293
471
  }
294
472
  }
295
473
 
@@ -86,9 +86,13 @@ async function setupAuthenticationAndDataplane(systemKey, _options, _config) {
86
86
  * @returns {Promise<{application: Object, dataSources: Array, version?: string}>} Full manifest
87
87
  * @throws {Error} If download fails
88
88
  */
89
- async function downloadFullManifest(dataplaneUrl, systemKey, authConfig) {
89
+ async function downloadFullManifest(dataplaneUrl, systemKey, authConfig, options = {}) {
90
90
  logger.log(formatProgress(`Downloading manifest for ${systemKey}…`));
91
- const response = await getExternalSystemConfig(dataplaneUrl, systemKey, authConfig);
91
+ const { normalizeVersionTarget } = require('../utils/test-target-cli-options');
92
+ const versionTarget = normalizeVersionTarget(options.version, 'running');
93
+ const response = await getExternalSystemConfig(dataplaneUrl, systemKey, authConfig, {
94
+ versionTarget: versionTarget === 'running' ? undefined : versionTarget
95
+ });
92
96
 
93
97
  if (!response.success || !response.data) {
94
98
  throw new Error(`Failed to download system configuration: ${response.error || response.formattedError || 'Unknown error'}`);
@@ -402,7 +406,7 @@ async function downloadExternalSystem(systemKey, options = {}) {
402
406
  return;
403
407
  }
404
408
 
405
- const manifest = await downloadFullManifest(dataplaneUrl, systemKey, authConfig);
409
+ const manifest = await downloadFullManifest(dataplaneUrl, systemKey, authConfig, options);
406
410
  validateAndLogDownloadedData(manifest.application, manifest.dataSources);
407
411
  const finalPath = getIntegrationPath(systemKey);
408
412
  await processDownloadedSystem(
@@ -33,7 +33,7 @@ async function executeDatasourceTest(systemKey, datasourceKey, payloadTemplate,
33
33
  payloadTemplate,
34
34
  dataplaneUrl,
35
35
  authConfig,
36
- timeout: parseInt(options.timeout, 10) || 30000,
36
+ timeout: parseInt(options.timeout, 10) || 60000,
37
37
  includeDebug: !!options.debug
38
38
  });
39
39
  return datasourceResult;
@@ -25,6 +25,8 @@ async function runOneDatasourceKey(appName, datasourceKey, opts) {
25
25
  debug,
26
26
  verbose: false,
27
27
  timeout: timeoutMs,
28
+ version: opts.version,
29
+ syncMode: opts.syncMode,
28
30
  async: true,
29
31
  noAsync: false,
30
32
  authConfig,
@@ -72,7 +74,7 @@ async function maybeWriteSystemRunLog(appName, systemKey, datasourceKeys, runTyp
72
74
  const integrationDir = path.dirname(appPath);
73
75
  const logPath = await writeTestLog(
74
76
  appName,
75
- { request: { systemKey, datasourceKeys, runType, includeDebug: true }, response: payload },
77
+ { request: { systemKey, datasourceKeys, runType, includeDebug: true, explainCertification: true }, response: payload },
76
78
  runType === 'e2e' ? 'test-e2e' : 'test-integration',
77
79
  integrationDir
78
80
  );
@@ -99,13 +101,16 @@ async function runSystemLevelTest({
99
101
  runType,
100
102
  debug,
101
103
  timeout,
104
+ version,
105
+ syncMode,
102
106
  authConfig,
103
107
  dataplaneUrl
104
108
  }) {
105
109
  if (!Array.isArray(datasourceKeys) || datasourceKeys.length === 0) {
106
110
  return { success: true, datasourceResults: [] };
107
111
  }
108
- const timeoutMs = Number.isFinite(timeout) ? timeout : 30000;
112
+ const timeoutMs = Number.isFinite(timeout) ? timeout : 60000;
113
+ const runOpts = { environment, runType, debug, timeoutMs, version, syncMode, authConfig, dataplaneUrl };
109
114
 
110
115
  const results = [];
111
116
  for (const key of datasourceKeys) {
@@ -113,14 +118,7 @@ async function runSystemLevelTest({
113
118
  // (Plan allows parallel later, but UX needs stable logs first.)
114
119
  // eslint-disable-next-line no-await-in-loop -- intentional sequential execution
115
120
  results.push(
116
- await runOneDatasourceKey(appName, key, {
117
- environment,
118
- runType,
119
- debug,
120
- timeoutMs,
121
- authConfig,
122
- dataplaneUrl
123
- })
121
+ await runOneDatasourceKey(appName, key, runOpts)
124
122
  );
125
123
  }
126
124
 
@@ -37,7 +37,7 @@ const {
37
37
  } = require('./test-execution');
38
38
  const { runSystemLevelTest } = require('./test-system-level');
39
39
  const { shouldUseSystemLevelIntegrationCall } = require('./integration-test-dispatch');
40
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
40
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
41
41
 
42
42
  /**
43
43
  * Loads and parses application config file
@@ -408,8 +408,8 @@ function determineDatasourcesToTest(datasourceFiles, datasourceFilter) {
408
408
  * @param {string} [options.controller] - Controller URL
409
409
  * @param {boolean} [options.verbose] - Show detailed test output
410
410
  * @param {number} [options.timeout] - Request timeout in milliseconds
411
- * @param {boolean} [options.noSync] - When true, skip publish (exercise dataplane config already deployed)
412
- * @param {boolean} [options.sync] - Legacy explicit sync; ignored when `noSync` / `--no-sync` is set
411
+ * @param {boolean} [options.noPublish] - When true, skip publish (exercise dataplane config already deployed)
412
+ * @param {boolean} [options.sync] - Explicit sync; ignored when `noPublish` / `--no-publish` is set
413
413
  * @returns {Promise<Object>} Integration test results
414
414
  * @throws {Error} If testing fails
415
415
  */
@@ -454,11 +454,15 @@ async function testExternalSystemIntegration(appName, options = {}) {
454
454
 
455
455
  const { systemKey, authConfig, dataplaneUrl, datasourcesToTest, customPayload } = await prepareIntegrationTestEnvironment(appName, options);
456
456
 
457
- if (!cliOptsSkipSync(options)) {
457
+ if (!cliOptsSkipPublish(options)) {
458
458
  logger.log(chalk.cyan('Syncing local config to dataplane…'));
459
459
  const { uploadExternalSystem } = require('../commands/upload');
460
460
  const { buildMinimalUploadSyncOptions } = require('../utils/upload-sync-options');
461
- await uploadExternalSystem(systemKey, buildMinimalUploadSyncOptions(options));
461
+ const uploadOpts = buildMinimalUploadSyncOptions(options);
462
+ if (options.uploadStatus === 'published') {
463
+ uploadOpts.uploadStatus = 'published';
464
+ }
465
+ await uploadExternalSystem(systemKey, uploadOpts);
462
466
  logger.log(formatSuccessLine('Sync complete'));
463
467
  }
464
468
 
@@ -468,7 +472,7 @@ async function testExternalSystemIntegration(appName, options = {}) {
468
472
  datasourceResults: []
469
473
  };
470
474
 
471
- const timeout = parseInt(options.timeout, 10) || 30000;
475
+ const timeout = parseInt(options.timeout, 10) || 60000;
472
476
  const useSystemLevel = shouldUseSystemLevelIntegrationCall(options, datasourcesToTest, customPayload);
473
477
 
474
478
  if (useSystemLevel) {
@@ -482,6 +486,8 @@ async function testExternalSystemIntegration(appName, options = {}) {
482
486
  runType: 'integration',
483
487
  debug: options.debug,
484
488
  timeout,
489
+ version: options.version,
490
+ syncMode: options.syncMode,
485
491
  authConfig,
486
492
  dataplaneUrl
487
493
  });