@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
@@ -1,7 +1,6 @@
1
1
  const {
2
2
  formatSuccessLine,
3
3
  formatWarningLine,
4
- formatProgress,
5
4
  sectionTitle,
6
5
  headerKeyValue,
7
6
  metadata
@@ -15,7 +14,6 @@ const {
15
14
  * @version 2.0.0
16
15
  */
17
16
 
18
- const path = require('path');
19
17
  const chalk = require('chalk');
20
18
  const logger = require('../utils/logger');
21
19
 
@@ -23,38 +21,32 @@ const SEP = chalk.gray('──────────────────
23
21
  const { resolveControllerUrl } = require('../utils/controller-url');
24
22
  const { getDeploymentAuth } = require('../utils/token-manager');
25
23
  const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
26
- const { getIntegrationPath } = require('../utils/paths');
27
- const { pushCredentialSecrets } = require('../utils/credential-secrets-env');
28
- const { runWithCredentialPushSpinner } = require('../utils/credential-push-ui');
24
+ const { resolveExternalSystemPath } = require('../utils/app-path-resolve');
29
25
  const { runWithUploadPipelineSpinner } = require('../utils/upload-pipeline-ui');
30
26
  const {
31
27
  buildResolvedEnvMapForIntegration,
32
- resolveConfigurationValues,
33
- collectResolvedVariableConfigurationNames
28
+ resolveConfigurationValues
34
29
  } = require('../utils/configuration-env-resolver');
35
- const { pushRuntimeConfigurationValues } = require('../utils/runtime-configuration-values');
36
30
  const { validateExternalSystemComplete } = require('../validation/validate');
37
31
  const { displayValidationResults } = require('../validation/validate-display');
38
32
  const { generateControllerManifest } = require('../generator/external-controller-manifest');
39
33
  const {
40
- validatePipelineConfig,
41
- testSystemViaPipeline
34
+ validatePipelineConfig
42
35
  } = require('../api/pipeline.api');
43
36
  const { uploadApplicationViaPipelineWithAuthRetry } = require('../utils/pipeline-upload-auth-retry');
44
37
  const { formatApiError } = require('../utils/api-error-handler');
45
38
  const { unwrapPublicationResult, unwrapApiData, isPublicationUnchanged } = require('../utils/external-system-readiness-core');
46
39
  const {
47
- logServerValidationWarnings,
48
- logProbeRuntimeBlock
40
+ logServerValidationWarnings
49
41
  } = require('../utils/external-system-readiness-display');
42
+ const { maybeRunUploadProbe } = require('./upload-probe');
50
43
  const { maybeSyncOpenApiFilesForMcp } = require('./repair-openapi-sync');
44
+ const { exportProgrammaticOpenApiForRepair } = require('./repair-openapi-export');
51
45
  const { resolveUploadPublishContext } = require('./upload-publish-context');
52
46
  const { syncDeployJsonFromSources } = require('../external-system/sync-deploy-manifest');
53
- const { isQuietMinimalSync } = require('../utils/upload-sync-options');
54
- const {
55
- runUploadSidecarFollowups,
56
- handlePublicationAndFollowups
57
- } = require('./upload-sidecar-followups');
47
+ const { handlePublicationAndFollowups } = require('./upload-sidecar-followups');
48
+ const { finalizeUploadPublishResult, finishUnchangedUploadPublication } = require('./upload-data-sync-finalize');
49
+ const { pushAndLogCredentialSecrets } = require('./upload-credential-push-log');
58
50
 
59
51
  /**
60
52
  * Validates system-key format (same as download).
@@ -72,21 +64,22 @@ function validateSystemKeyFormat(systemKey) {
72
64
 
73
65
  /**
74
66
  * Builds pipeline upload payload from controller manifest.
75
- * Payload: { version, application, dataSources, status }; Builder always uses status "draft".
67
+ * Payload: { version, application, dataSources, status }; upload uses "draft", deploy preflight uses "published".
76
68
  * @param {Object} manifest - Controller manifest from generateControllerManifest
77
- * @returns {Object} { version, application, dataSources, status: "draft" }
69
+ * @returns {Object} { version, application, dataSources, status }
78
70
  */
79
71
  /**
80
72
  * @param {Object} manifest - Controller manifest from generateControllerManifest
81
- * @param {{ force?: boolean }} [opts]
73
+ * @param {{ force?: boolean, status?: 'draft'|'published' }} [opts]
82
74
  * @returns {Object}
83
75
  */
84
76
  function buildUploadPayload(manifest, opts = {}) {
77
+ const lifecycleStatus = opts.status === 'published' ? 'published' : 'draft';
85
78
  const payload = {
86
79
  version: manifest.version || '1.0.0',
87
80
  application: manifest.system,
88
81
  dataSources: manifest.dataSources || [],
89
- status: 'draft'
82
+ status: lifecycleStatus
90
83
  };
91
84
  if (opts.force === true) {
92
85
  payload.force = true;
@@ -101,6 +94,13 @@ function buildUploadPayload(manifest, opts = {}) {
101
94
  * @returns {Promise<{ dataplaneUrl: string, authConfig: Object, environment: string }>}
102
95
  */
103
96
  async function resolveDataplaneAndAuth(systemKey, opts = {}) {
97
+ if (opts.authConfig && opts.dataplaneUrl && opts.environment) {
98
+ return {
99
+ dataplaneUrl: opts.dataplaneUrl,
100
+ authConfig: opts.authConfig,
101
+ environment: opts.environment
102
+ };
103
+ }
104
104
  const silent = opts.silent === true;
105
105
  const { resolveEnvironment } = require('../core/config');
106
106
  const environment = await resolveEnvironment();
@@ -170,8 +170,11 @@ function throwIfValidationFailed(validationResult) {
170
170
  * @param {string} systemKey - System key
171
171
  * @param {Object} payload - Upload payload (mutated)
172
172
  */
173
- async function resolvePayloadConfiguration(systemKey, payload) {
174
- const { envMap, secrets } = await buildResolvedEnvMapForIntegration(systemKey);
173
+ async function resolvePayloadConfiguration(systemKey, payload, pathOptions = {}) {
174
+ const { envMap, secrets } = await buildResolvedEnvMapForIntegration(systemKey, {
175
+ dataplaneRuntime: true,
176
+ ...pathOptions
177
+ });
175
178
  if (Array.isArray(payload.application?.configuration) && payload.application.configuration.length > 0) {
176
179
  resolveConfigurationValues(payload.application.configuration, envMap, secrets, systemKey);
177
180
  }
@@ -182,64 +185,6 @@ async function resolvePayloadConfiguration(systemKey, payload) {
182
185
  }
183
186
  }
184
187
 
185
- /**
186
- * Pushes credential secrets from .env and payload to dataplane; logs result or warning.
187
- * @param {string} dataplaneUrl - Dataplane URL
188
- * @param {Object} authConfig - Auth config
189
- * @param {string} systemKey - System key
190
- * @param {Object} payload - Upload payload
191
- */
192
- async function pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload, uiOpts = {}) {
193
- const envFilePath = path.join(getIntegrationPath(systemKey), '.env');
194
- const pushResult = await runWithCredentialPushSpinner(
195
- () =>
196
- pushCredentialSecrets(dataplaneUrl, authConfig, {
197
- envFilePath,
198
- appName: systemKey,
199
- payload
200
- }),
201
- { systemKey, json: uiOpts.json === true }
202
- );
203
- if (pushResult.pushed > 0) {
204
- const keyList = pushResult.keys?.length ? ` (${pushResult.keys.join(', ')})` : '';
205
- logger.log(
206
- formatSuccessLine(`Pushed ${pushResult.pushed} credential secret(s) to dataplane${keyList}.`)
207
- );
208
- } else {
209
- logger.log(chalk.yellow('Secret push skipped'));
210
- }
211
- const resolvedParamNames = collectResolvedVariableConfigurationNames(payload);
212
- if (resolvedParamNames.length > 0) {
213
- const nameList = ` (${resolvedParamNames.join(', ')})`;
214
- logger.log(
215
- formatSuccessLine(
216
- `Resolved ${resolvedParamNames.length} integration parameter(s) from .env for publish${nameList}.`
217
- )
218
- );
219
- }
220
- if (pushResult.warning) {
221
- logger.log(chalk.yellow(`Warning: ${pushResult.warning}`));
222
- }
223
- try {
224
- const configPush = await pushRuntimeConfigurationValues(
225
- dataplaneUrl,
226
- authConfig,
227
- systemKey,
228
- payload
229
- );
230
- if (configPush.pushed > 0) {
231
- const nameList = configPush.names.length ? ` (${configPush.names.join(', ')})` : '';
232
- logger.log(
233
- formatSuccessLine(
234
- `Stored ${configPush.pushed} runtime configuration value(s) in dataplane${nameList}.`
235
- )
236
- );
237
- }
238
- } catch (err) {
239
- logger.log(chalk.yellow(`Warning: runtime configuration store skipped: ${err.message}`));
240
- }
241
- }
242
-
243
188
  /**
244
189
  * Optional server-side pipeline validate when --verbose.
245
190
  * @param {string} dataplaneUrl
@@ -261,46 +206,6 @@ async function maybeRunVerboseServerValidation(dataplaneUrl, authConfig, payload
261
206
  logServerValidationWarnings(body);
262
207
  }
263
208
 
264
- /**
265
- * Omit payloadTemplate so POST /validation/run uses the **validation-engine** path
266
- * (same as deploy --probe). Needed for certification and dataplane auto-issue of integration
267
- * certificates after a successful run. If RBAC/live checks fail right after upload until the
268
- * controller syncs permissions, skip --probe or retry once permissions are visible.
269
- */
270
- const UPLOAD_PROBE_TEST_DATA = {};
271
-
272
- /**
273
- * Optional POST validation/run after successful upload.
274
- * @param {string} dataplaneUrl
275
- * @param {string} systemKey
276
- * @param {Object} authConfig
277
- * @param {number|undefined} probeTimeoutMs
278
- */
279
- async function maybeRunUploadProbe(dataplaneUrl, systemKey, authConfig, probeTimeoutMs) {
280
- logger.log('');
281
- logger.log(sectionTitle('Runtime checks (--probe)'));
282
- logger.log(SEP);
283
- logger.log(formatProgress('Running runtime checks...'));
284
- const timeoutMs = probeTimeoutMs === undefined || probeTimeoutMs === null ? 120000 : probeTimeoutMs;
285
- try {
286
- const pr = await testSystemViaPipeline(
287
- dataplaneUrl,
288
- systemKey,
289
- authConfig,
290
- UPLOAD_PROBE_TEST_DATA,
291
- { timeout: timeoutMs }
292
- );
293
- if (pr.success === false) {
294
- logger.log(chalk.yellow(`⚠ Probe request failed: ${pr.formattedError || pr.error || 'unknown error'}`));
295
- return;
296
- }
297
- const probeData = unwrapApiData(pr);
298
- logProbeRuntimeBlock(probeData, systemKey);
299
- } catch (e) {
300
- logger.log(chalk.yellow(`⚠ Probe failed: ${e.message}`));
301
- }
302
- }
303
-
304
209
  /**
305
210
  * Local validation, manifest, payload, and configuration resolution.
306
211
  * Regenerates integration/<systemKey>/<systemKey>-deploy.json from sources (same as `aifabrix json`).
@@ -311,15 +216,22 @@ async function maybeRunUploadProbe(dataplaneUrl, systemKey, authConfig, probeTim
311
216
  */
312
217
  async function buildValidatedUploadManifestPayload(systemKey, opts = {}) {
313
218
  const quiet = opts.minimal === true || opts.quiet === true;
314
- const validationResult = await validateExternalSystemComplete(systemKey, { type: 'external' });
219
+ const pathOptions = opts.pathOptions || {};
220
+ const validationResult = await validateExternalSystemComplete(systemKey, {
221
+ type: 'external',
222
+ ...pathOptions
223
+ });
315
224
  throwIfValidationFailed(validationResult);
316
225
  if (!quiet) {
317
226
  logger.log(formatSuccessLine('Local validation passed'));
318
227
  }
319
- await syncDeployJsonFromSources(systemKey, { quiet });
320
- const manifest = await generateControllerManifest(systemKey, { type: 'external' });
321
- const payload = buildUploadPayload(manifest, { force: opts.force === true });
322
- await resolvePayloadConfiguration(systemKey, payload);
228
+ await syncDeployJsonFromSources(systemKey, { quiet, ...pathOptions });
229
+ const manifest = await generateControllerManifest(systemKey, { type: 'external', ...pathOptions });
230
+ const payload = buildUploadPayload(manifest, {
231
+ force: opts.force === true,
232
+ status: opts.uploadStatus === 'published' ? 'published' : 'draft'
233
+ });
234
+ await resolvePayloadConfiguration(systemKey, payload, pathOptions);
323
235
  return { manifest, payload };
324
236
  }
325
237
 
@@ -334,9 +246,17 @@ async function buildValidatedUploadManifestPayload(systemKey, opts = {}) {
334
246
  * @returns {Promise<void>}
335
247
  */
336
248
  async function logAndSyncLocalOpenApiForUpload(systemKey, manifest, uploadContext = {}) {
337
- const appPath = getIntegrationPath(systemKey);
249
+ const pathOptions = uploadContext.pathOptions || {};
250
+ const appPath = resolveExternalSystemPath(systemKey, pathOptions);
338
251
  const ei = manifest && manifest.externalIntegration;
339
252
  const datasourceFiles = ei && Array.isArray(ei.dataSources) ? ei.dataSources : [];
253
+ await exportProgrammaticOpenApiForRepair({
254
+ appPath,
255
+ systemKey,
256
+ datasourceFiles,
257
+ dryRun: false,
258
+ backupCtx: { dryRun: false, changedFiles: [] }
259
+ });
340
260
  const openapiSyncLines = await maybeSyncOpenApiFilesForMcp({
341
261
  enabled: true,
342
262
  dryRun: false,
@@ -346,11 +266,55 @@ async function logAndSyncLocalOpenApiForUpload(systemKey, manifest, uploadContex
346
266
  dataplaneUrl: uploadContext.dataplaneUrl,
347
267
  authConfig: uploadContext.authConfig
348
268
  });
349
- for (const line of openapiSyncLines) {
350
- logger.log(line.startsWith('Skipped') ? formatWarningLine(line) : formatSuccessLine(line));
269
+ if (!uploadContext.quiet) {
270
+ for (const line of openapiSyncLines) {
271
+ logger.log(line.startsWith('Skipped') ? formatWarningLine(line) : formatSuccessLine(line));
272
+ }
351
273
  }
352
274
  }
353
275
 
276
+ /**
277
+ * @param {string} systemKey
278
+ * @param {Object} options
279
+ * @param {Object} manifest
280
+ * @param {Object} payload
281
+ * @param {{ dataplaneUrl: string, authConfig: Object, environment: string, rawRes: Object }} ctx
282
+ */
283
+ async function completeUploadAfterPublish(systemKey, options, manifest, payload, ctx) {
284
+ const quietCompact = options.minimal === true && options.verbose !== true;
285
+ const pushMeta = await pushAndLogCredentialSecrets(ctx.dataplaneUrl, ctx.authConfig, systemKey, payload, {
286
+ json: options.json === true,
287
+ pathOptions: options.pathOptions,
288
+ suppressCredentialLog: quietCompact
289
+ });
290
+ await logAndSyncLocalOpenApiForUpload(systemKey, manifest, {
291
+ dataplaneUrl: ctx.dataplaneUrl,
292
+ authConfig: ctx.authConfig,
293
+ pathOptions: options.pathOptions,
294
+ quiet: quietCompact
295
+ });
296
+ await handlePublicationAndFollowups(
297
+ {
298
+ systemKey,
299
+ options,
300
+ manifest,
301
+ payload,
302
+ environment: ctx.environment,
303
+ dataplaneUrl: ctx.dataplaneUrl,
304
+ authConfig: ctx.authConfig,
305
+ rawRes: ctx.rawRes,
306
+ credentialPush: pushMeta.credentialPush,
307
+ configPush: pushMeta.configPush
308
+ },
309
+ maybeRunUploadProbe
310
+ );
311
+ return finalizeUploadPublishResult(
312
+ { dataplaneUrl: ctx.dataplaneUrl, authConfig: ctx.authConfig, environment: ctx.environment, uploadSkipped: false },
313
+ payload,
314
+ options
315
+ );
316
+ }
317
+
354
318
  /**
355
319
  * Upload path after dry-run check.
356
320
  * @param {string} systemKey
@@ -377,37 +341,22 @@ async function runUploadPublishAndSummary(systemKey, options, manifest, payload)
377
341
  );
378
342
  const publication = unwrapPublicationResult(rawRes);
379
343
  if (isPublicationUnchanged(publication)) {
380
- if (!isQuietMinimalSync(options)) {
381
- logger.log(formatSuccessLine('Config unchanged on dataplane — upload skipped.'));
382
- }
383
- await runUploadSidecarFollowups({
344
+ return finishUnchangedUploadPublication({
384
345
  systemKey,
385
346
  options,
386
347
  payload,
387
348
  dataplaneUrl,
388
- authConfig
349
+ authConfig,
350
+ environment
389
351
  });
390
- return { dataplaneUrl, authConfig, environment, uploadSkipped: true };
391
352
  }
392
353
 
393
- await pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload, {
394
- json: options.json === true
354
+ return completeUploadAfterPublish(systemKey, options, manifest, payload, {
355
+ dataplaneUrl,
356
+ authConfig,
357
+ environment,
358
+ rawRes
395
359
  });
396
- await logAndSyncLocalOpenApiForUpload(systemKey, manifest, { dataplaneUrl, authConfig });
397
- await handlePublicationAndFollowups(
398
- {
399
- systemKey,
400
- options,
401
- manifest,
402
- payload,
403
- environment,
404
- dataplaneUrl,
405
- authConfig,
406
- rawRes
407
- },
408
- maybeRunUploadProbe
409
- );
410
- return { dataplaneUrl, authConfig, environment, uploadSkipped: false };
411
360
  }
412
361
 
413
362
  /**
@@ -415,16 +364,23 @@ async function runUploadPublishAndSummary(systemKey, options, manifest, payload)
415
364
  * @param {string} systemKey - External system key (integration/<systemKey>/)
416
365
  * @param {Object} [options] - Options
417
366
  * @param {boolean} [options.dryRun] - Validate and build payload only; no API calls
418
- * @param {boolean} [options.verbose] - POST pipeline/validate for server warnings
367
+ * @param {boolean} [options.verbose] - Expanded summary and server-side pipeline validate warnings
419
368
  * @param {boolean} [options.probe] - POST validation/run after publish
420
369
  * @param {number} [options.probeTimeout] - Probe timeout ms (default 120000)
421
- * @param {boolean} [options.minimal] - Short summary only
370
+ * @param {boolean} [options.minimal] - Short summary (default: compact unless --verbose)
422
371
  * @returns {Promise<{ dataplaneUrl: string, authConfig: Object, environment: string }|void>}
423
372
  * @throws {Error} If validation or API calls fail
424
373
  */
425
374
  async function uploadExternalSystem(systemKey, options = {}) {
426
375
  validateSystemKeyFormat(systemKey);
427
- const minimal = options.minimal === true;
376
+ const pathOptions = options.pathOptions || {};
377
+ const minimal =
378
+ options.minimal === true
379
+ ? true
380
+ : options.minimal === false
381
+ ? false
382
+ : options.verbose !== true;
383
+ const uploadOptions = { ...options, minimal };
428
384
  if (!minimal) {
429
385
  logger.log('');
430
386
  logger.log(sectionTitle('Upload external system'));
@@ -434,7 +390,9 @@ async function uploadExternalSystem(systemKey, options = {}) {
434
390
  const { manifest, payload } = await buildValidatedUploadManifestPayload(systemKey, {
435
391
  dryRun: !!options.dryRun,
436
392
  force: options.force === true,
437
- minimal
393
+ minimal,
394
+ pathOptions,
395
+ uploadStatus: options.uploadStatus
438
396
  });
439
397
  if (options.dryRun) {
440
398
  logger.log(chalk.yellow('Dry run: would upload payload (no API calls).'));
@@ -443,11 +401,12 @@ async function uploadExternalSystem(systemKey, options = {}) {
443
401
  );
444
402
  return undefined;
445
403
  }
446
- return runUploadPublishAndSummary(systemKey, options, manifest, payload);
404
+ return runUploadPublishAndSummary(systemKey, uploadOptions, manifest, payload);
447
405
  }
448
406
 
449
407
  module.exports = {
450
408
  uploadExternalSystem,
409
+ buildValidatedUploadManifestPayload,
451
410
  buildUploadPayload,
452
411
  resolveDataplaneAndAuth,
453
412
  runUploadValidatePublish,
@@ -36,7 +36,7 @@ async function runVerifyGovernanceCombined(systemKey, options = {}) {
36
36
 
37
37
  const pipelineOpts = {
38
38
  ...options,
39
- noSync: true,
39
+ noPublish: true,
40
40
  authConfig,
41
41
  dataplaneUrl
42
42
  };
@@ -10,7 +10,7 @@ const {
10
10
  } = require('./test-e2e-external');
11
11
  const { runDatasourceGovernanceScenarios, getDatasourceGovernancePack } = require('../api/governance-scenario-pack.api');
12
12
  const { resolveIntegrationAuth } = require('../external-system/integration-auth-context');
13
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
13
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
14
14
  const { VERDICT } = require('../lifecycle/product-model');
15
15
  const { runWithVerifyStepProgress } = require('../lifecycle/verify-step-progress');
16
16
 
@@ -81,7 +81,7 @@ async function runVerifyGovernanceFromDbPacks(systemKey, options) {
81
81
  return { resolvedKey, datasourceRows: [] };
82
82
  }
83
83
 
84
- if (!cliOptsSkipSync(options)) {
84
+ if (!cliOptsSkipPublish(options)) {
85
85
  const uploadCtx = await syncLocalIfRequested(resolvedKey, options);
86
86
  attachUploadAuthToOptions(options, uploadCtx);
87
87
  }
@@ -8,7 +8,7 @@
8
8
 
9
9
  const logger = require('../utils/logger');
10
10
  const { handleCommandError } = require('../utils/cli-utils');
11
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
11
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
12
12
  const { runVerifyOperationsForExternalSystem } = require('./verify-operations-external');
13
13
  const { displayVerifyOperationsTTY } = require('../lifecycle/report-display');
14
14
  const { exitCodeFromVerdict } = require('../lifecycle/exit-codes');
@@ -27,7 +27,7 @@ function normalizeVerifyOperationsCliOptions(options, cmd) {
27
27
  verbose: options.verbose === true || has('-v') || has('--verbose'),
28
28
  debug: options.debug === true || has('-d') || has('--debug'),
29
29
  json: options.json === true || has('--json'),
30
- noSync: cliOptsSkipSync(options, cmd),
30
+ noPublish: cliOptsSkipPublish(options, cmd),
31
31
  continue: options.continue === true || has('--continue'),
32
32
  async: options.async !== false
33
33
  };
@@ -33,7 +33,7 @@ function buildOperationsVerifyStepPlan(systemKey, options) {
33
33
  run: () =>
34
34
  testExternalSystemIntegration(systemKey, {
35
35
  environment: options.env,
36
- noSync: true,
36
+ noPublish: true,
37
37
  verbose: false,
38
38
  debug: options.debug === true
39
39
  }),
@@ -45,7 +45,7 @@ function buildOperationsVerifyStepPlan(systemKey, options) {
45
45
  run: (progress) =>
46
46
  runTestE2EForExternalSystem(systemKey, {
47
47
  env: options.env,
48
- noSync: true,
48
+ noPublish: true,
49
49
  verbose: false,
50
50
  debug: options.debug === true,
51
51
  async: options.async !== false,
@@ -5,7 +5,7 @@
5
5
  'use strict';
6
6
 
7
7
  const { syncLocalIfRequested } = require('./test-e2e-external');
8
- const { cliOptsSkipSync } = require('../utils/cli-sync-options');
8
+ const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
9
9
  const { buildOperationsVerifyStepPlan } = require('./verify-operations-step-plan');
10
10
  const { runWithVerifyStepProgress } = require('../lifecycle/verify-step-progress');
11
11
 
@@ -86,7 +86,7 @@ async function runOperationsVerifySteps(systemKey, options) {
86
86
  }
87
87
  }
88
88
 
89
- if (!cliOptsSkipSync(options)) {
89
+ if (!cliOptsSkipPublish(options)) {
90
90
  const uploadCtx = await syncLocalIfRequested(systemKey, options);
91
91
  attachUploadAuthToOptions(options, uploadCtx);
92
92
  }
@@ -28,7 +28,7 @@ async function runVerifyTrustCommandAction(appName, options, cmd) {
28
28
  env: opts.env,
29
29
  verbose: opts.verbose,
30
30
  debug: opts.debug,
31
- noSync: opts.noSync === true,
31
+ noPublish: opts.noPublish === true,
32
32
  revalidate: opts.revalidate === true,
33
33
  timeout: opts.timeout
34
34
  });
@@ -468,7 +468,7 @@ async function handleFileSaving(appName, systemConfig, datasourceConfigs, system
468
468
  const spinner = ora('Saving files...').start();
469
469
  try {
470
470
  const config = require('../core/config');
471
- const format = (await config.getFormat()) || 'yaml';
471
+ const format = ctx?.format || (await config.getFormat()) || 'yaml';
472
472
  const generatedFiles = await generateWizardFiles(appName, systemConfig, datasourceConfigs, systemKey, { aiGeneratedReadme: null, format });
473
473
  if (enableRBAC && generatedFiles.appPath && generatedFiles.systemFilePath) {
474
474
  try {
@@ -115,7 +115,8 @@ async function executeWizardFromConfig(wizardConfig, dataplaneUrl, authConfig, o
115
115
  {
116
116
  dataplaneUrl,
117
117
  authConfig,
118
- enableRBAC: Boolean(preferences?.enableRBAC)
118
+ enableRBAC: Boolean(preferences?.enableRBAC),
119
+ format: opts.format
119
120
  }
120
121
  );
121
122
  }
@@ -33,12 +33,8 @@ function needsAdminEnvQuoting(value) {
33
33
  * @returns {string}
34
34
  */
35
35
  function formatAdminEnvLine(key, value) {
36
- const safe = String(value ?? '').replace(/\n/g, ' ').trim();
37
- if (!needsAdminEnvQuoting(safe)) {
38
- return `${key}=${safe}`;
39
- }
40
- const escaped = safe.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
41
- return `${key}="${escaped}"`;
36
+ const { formatDotenvLine } = require('../utils/env-dotenv-format');
37
+ return formatDotenvLine(key, value);
42
38
  }
43
39
 
44
40
  /**
@@ -236,6 +236,7 @@ function parseEnvContentToMap(content) {
236
236
  if (!content || typeof content !== 'string') {
237
237
  return {};
238
238
  }
239
+ const { parseDotenvRawValue } = require('../utils/env-dotenv-format');
239
240
  const map = {};
240
241
  const lines = content.split(/\r?\n/);
241
242
  for (const line of lines) {
@@ -246,8 +247,7 @@ function parseEnvContentToMap(content) {
246
247
  const eq = trimmed.indexOf('=');
247
248
  if (eq > 0) {
248
249
  const key = trimmed.substring(0, eq).trim();
249
- const value = trimmed.substring(eq + 1);
250
- map[key] = value;
250
+ map[key] = parseDotenvRawValue(trimmed.substring(eq + 1));
251
251
  }
252
252
  }
253
253
  return map;
@@ -279,7 +279,12 @@ function collectSeenKeysAndMergeEnvLines(lines, newMap) {
279
279
  if (eq > 0) {
280
280
  const key = trimmed.substring(0, eq).trim();
281
281
  seen.add(key);
282
- out.push(Object.prototype.hasOwnProperty.call(newMap, key) ? `${key}=${newMap[key]}` : line);
282
+ if (Object.prototype.hasOwnProperty.call(newMap, key)) {
283
+ const { formatDotenvLine } = require('../utils/env-dotenv-format');
284
+ out.push(formatDotenvLine(key, newMap[key]));
285
+ } else {
286
+ out.push(line);
287
+ }
283
288
  continue;
284
289
  }
285
290
  out.push(line);
@@ -288,9 +293,10 @@ function collectSeenKeysAndMergeEnvLines(lines, newMap) {
288
293
  }
289
294
 
290
295
  function appendMissingEnvKeysFromMap(out, seen, newMap) {
296
+ const { formatDotenvLine } = require('../utils/env-dotenv-format');
291
297
  for (const key of Object.keys(newMap)) {
292
298
  if (!seen.has(key)) {
293
- out.push(`${key}=${newMap[key]}`);
299
+ out.push(formatDotenvLine(key, newMap[key]));
294
300
  }
295
301
  }
296
302
  }
@@ -130,19 +130,8 @@ async function injectBashPrefixedExportLines(content, secretsPath, appName) {
130
130
  * @returns {Object.<string, string>} Map of variable name to value
131
131
  */
132
132
  function parseEnvContentToMap(content) {
133
- const map = {};
134
- if (!content || typeof content !== 'string') return map;
135
- const lines = content.split(/\r?\n/);
136
- for (const line of lines) {
137
- const trimmed = line.trim();
138
- if (!trimmed || trimmed.startsWith('#')) continue;
139
- const eq = trimmed.indexOf('=');
140
- if (eq > 0) {
141
- const key = trimmed.substring(0, eq).trim();
142
- map[key] = trimmed.substring(eq + 1);
143
- }
144
- }
145
- return map;
133
+ const { parseEnvContentToMap: parseMap } = require('./secrets-env-content');
134
+ return parseMap(content);
146
135
  }
147
136
 
148
137
  /**
@@ -17,8 +17,8 @@ const { requireBearerForDataplanePipeline } = require('../utils/token-manager');
17
17
  const { buildMinimalUploadSyncOptions } = require('../utils/upload-sync-options');
18
18
  const { fetchTrustRunFromDataplane } = require('./agent-trust-fetch');
19
19
 
20
- async function maybeSyncBeforeTrust({ noSync, authConfig, systemKey, options = {} }) {
21
- if (noSync === true) return;
20
+ async function maybeSyncBeforeTrust({ noPublish, authConfig, systemKey, options = {} }) {
21
+ if (noPublish === true) return;
22
22
  requireBearerForDataplanePipeline(authConfig);
23
23
  logger.log(chalk.cyan('Syncing local config to dataplane…'));
24
24
  const { uploadExternalSystem } = require('../commands/upload');
@@ -66,7 +66,7 @@ async function runDatasourceAgentTrust(datasourceKey, options = {}) {
66
66
  }
67
67
 
68
68
  await maybeSyncBeforeTrust({
69
- noSync: options.noSync === true,
69
+ noPublish: options.noPublish === true,
70
70
  authConfig,
71
71
  systemKey,
72
72
  options
@@ -255,7 +255,9 @@ async function deployDatasource(fileOrKey, _options) {
255
255
  }
256
256
 
257
257
  if (Array.isArray(datasourceConfig.configuration) && datasourceConfig.configuration.length > 0) {
258
- const { envMap, secrets } = await buildResolvedEnvMapForIntegration(systemKey);
258
+ const { envMap, secrets } = await buildResolvedEnvMapForIntegration(systemKey, {
259
+ dataplaneRuntime: true
260
+ });
259
261
  resolveConfigurationValues(datasourceConfig.configuration, envMap, secrets, systemKey);
260
262
  }
261
263