@aifabrix/builder 2.49.2 → 2.51.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 (459) hide show
  1. package/.cursor/plans/157.1-security-quality-violations-by-type.csv +374 -0
  2. package/.cursor/rules/assistant-driven-integration-build.mdc +40 -0
  3. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  4. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  5. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  6. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  7. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  8. package/.cursor/skills/README.md +1 -0
  9. package/.dockerignore +52 -0
  10. package/.eslintignore +22 -0
  11. package/README.md +2 -0
  12. package/bin/builder-api-cleanup.js +26 -0
  13. package/bin/builder-api-nest.js +10 -0
  14. package/bin/builder-api-spike.js +19 -0
  15. package/enterprise-knowledge/README.md +50 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  20. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  21. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  22. package/integration/README.md +81 -0
  23. package/integration/github/README.md +53 -0
  24. package/integration/github/application.json +21 -0
  25. package/integration/github/deploy.js +72 -0
  26. package/integration/github/env.template +11 -0
  27. package/integration/github/github-datasource-issue-comments.json +239 -0
  28. package/integration/github/github-datasource-issues.json +399 -0
  29. package/integration/github/github-datasource-repository.json +354 -0
  30. package/integration/github/github-deploy.json +1202 -0
  31. package/integration/github/github-system.json +82 -0
  32. package/integration/hubspot-test/README.md +1 -1
  33. package/integration/hubspot-test/create-hubspot.js +1 -16
  34. package/jest.isolated-projects.js +31 -1
  35. package/jest.projects.js +87 -1
  36. package/lib/api/dev-server-https.js +1 -1
  37. package/lib/api/enterprise-knowledge.api.js +63 -0
  38. package/lib/api/evidence-kinds.api.js +128 -0
  39. package/lib/api/evidence.api.js +172 -0
  40. package/lib/api/external-systems.api.js +8 -2
  41. package/lib/api/pipeline.api.js +5 -1
  42. package/lib/api/resource-types.api.js +5 -4
  43. package/lib/api/roles.api.js +121 -0
  44. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  45. package/lib/api/types/evidence-kinds.types.js +42 -0
  46. package/lib/api/types/evidence.types.js +67 -0
  47. package/lib/api/types/resource-types.types.js +2 -0
  48. package/lib/api/types/roles.types.js +36 -0
  49. package/lib/app/certification-verify-rows.js +1 -1
  50. package/lib/app/controller-application-filter.js +36 -0
  51. package/lib/app/deploy.js +1 -1
  52. package/lib/app/list-external-systems.js +130 -0
  53. package/lib/app/list.js +20 -8
  54. package/lib/app/run.js +3 -1
  55. package/lib/app/show-display.js +8 -3
  56. package/lib/app/show-online.js +178 -0
  57. package/lib/app/show.js +39 -90
  58. package/lib/build/builder-api-docker-staging.js +47 -0
  59. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  60. package/lib/build/standard-docker-build.js +2 -0
  61. package/lib/certification/merge-certification-from-artifact.js +1 -1
  62. package/lib/certification/post-unified-cert-sync.js +4 -31
  63. package/lib/certification/sync-after-external-command.js +0 -1
  64. package/lib/certification/sync-system-certification.js +0 -3
  65. package/lib/channels/add-channel.js +40 -34
  66. package/lib/channels/approval-guides/chatgpt.js +33 -0
  67. package/lib/channels/approval-guides/credential-portal.js +38 -0
  68. package/lib/channels/approval-guides/index.js +110 -0
  69. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  70. package/lib/channels/approval-guides/slack.js +34 -0
  71. package/lib/channels/approval-guides/teams-bot.js +35 -0
  72. package/lib/channels/approval-guides/web-embed.js +32 -0
  73. package/lib/channels/channel-approval-guide.js +11 -0
  74. package/lib/channels/channel-artifact-generator.js +18 -5
  75. package/lib/channels/channel-audit.js +3 -0
  76. package/lib/channels/channel-auth-context.js +1 -1
  77. package/lib/channels/channel-description.js +59 -0
  78. package/lib/channels/channel-integration-generator.js +13 -230
  79. package/lib/channels/channel-integration-template.js +94 -0
  80. package/lib/channels/channel-runtime-resolver.js +43 -3
  81. package/lib/channels/channel-status-display.js +66 -26
  82. package/lib/channels/channel-targets.js +3 -3
  83. package/lib/cli/index.js +31 -3
  84. package/lib/cli/infra-guided.js +5 -1
  85. package/lib/cli/setup-app-external-create.js +111 -0
  86. package/lib/cli/setup-app.help.js +1 -1
  87. package/lib/cli/setup-app.js +60 -130
  88. package/lib/cli/setup-app.test-commands.js +26 -52
  89. package/lib/cli/setup-certification-commands.js +4 -4
  90. package/lib/cli/setup-certification.help.js +9 -9
  91. package/lib/cli/setup-dev.js +30 -9
  92. package/lib/cli/setup-external-system-help.js +4 -6
  93. package/lib/cli/setup-external-system.js +58 -52
  94. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  95. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  96. package/lib/cli/setup-infra.js +15 -0
  97. package/lib/cli/setup-list.js +43 -0
  98. package/lib/cli/setup-utility-help-after.js +12 -0
  99. package/lib/cli/setup-utility-repair.js +26 -7
  100. package/lib/cli/setup-utility-validate.js +41 -2
  101. package/lib/cli/setup-utility.js +5 -3
  102. package/lib/commands/app.js +15 -43
  103. package/lib/commands/channel-add-setup.js +110 -0
  104. package/lib/commands/channel.js +42 -8
  105. package/lib/commands/datasource-sync-display.js +96 -0
  106. package/lib/commands/datasource-sync-policy.js +210 -0
  107. package/lib/commands/datasource-test-trust-cli.js +6 -6
  108. package/lib/commands/datasource-unified-test-cli.js +2 -1
  109. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  110. package/lib/commands/deploy-gate-failure-details.js +184 -0
  111. package/lib/commands/deploy-gate-orchestrator.js +368 -0
  112. package/lib/commands/dev-cli-handlers.js +7 -62
  113. package/lib/commands/dev-host-ops-params.js +91 -0
  114. package/lib/commands/dev-host-ops-poll.js +111 -0
  115. package/lib/commands/dev-host-ops.js +107 -94
  116. package/lib/commands/dev-init.js +6 -106
  117. package/lib/commands/dev-refresh.js +197 -0
  118. package/lib/commands/enterprise-knowledge.js +284 -0
  119. package/lib/commands/evidence-cli-leaves.js +250 -0
  120. package/lib/commands/evidence-kind.js +428 -0
  121. package/lib/commands/evidence.js +51 -0
  122. package/lib/commands/governance-cli-shared.js +2 -2
  123. package/lib/commands/governance-command-action.js +5 -3
  124. package/lib/commands/governance-fixture-subjects.js +85 -0
  125. package/lib/commands/governance.js +1 -1
  126. package/lib/commands/lifecycle-command-action.js +2 -2
  127. package/lib/commands/lifecycle-external.js +3 -3
  128. package/lib/commands/manifest-cli-auth.js +29 -0
  129. package/lib/commands/manifest-cli-commands.js +170 -0
  130. package/lib/commands/manifest-cli-integration-path.js +63 -0
  131. package/lib/commands/manifest.js +21 -0
  132. package/lib/commands/protection-cli-leaves.js +3 -3
  133. package/lib/commands/repair-auth-apply.js +15 -1
  134. package/lib/commands/repair-authentications-454.js +169 -0
  135. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  136. package/lib/commands/repair-datasource-apply.js +135 -0
  137. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  138. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  139. package/lib/commands/repair-datasource-operation-security.js +180 -0
  140. package/lib/commands/repair-datasource-run.js +7 -2
  141. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  142. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  143. package/lib/commands/repair-datasource.js +12 -68
  144. package/lib/commands/repair-env-template.js +11 -1
  145. package/lib/commands/repair-external-run.js +121 -31
  146. package/lib/commands/repair-internal.js +1 -1
  147. package/lib/commands/repair-openapi-export.js +156 -0
  148. package/lib/commands/repair-openapi-sync.js +33 -8
  149. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  150. package/lib/commands/repair-persist.js +22 -1
  151. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  152. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  153. package/lib/commands/repair-rbac.js +163 -86
  154. package/lib/commands/repair-steps.js +83 -18
  155. package/lib/commands/repair-system-permissions.js +1 -0
  156. package/lib/commands/repair.js +1 -1
  157. package/lib/commands/resource-type.js +166 -44
  158. package/lib/commands/role.js +452 -0
  159. package/lib/commands/run-post-publish-data-sync.js +68 -0
  160. package/lib/commands/setup-modes.js +1 -1
  161. package/lib/commands/setup.js +1 -1
  162. package/lib/commands/test-e2e-external.js +21 -8
  163. package/lib/commands/test-governance-cli-options.js +2 -2
  164. package/lib/commands/test-trust-cli-options.js +2 -2
  165. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  166. package/lib/commands/up-builder-api-provision.js +241 -0
  167. package/lib/commands/up-builder-api.js +88 -0
  168. package/lib/commands/up-common.js +25 -1
  169. package/lib/commands/upload-credential-push-log.js +117 -0
  170. package/lib/commands/upload-data-sync-finalize.js +60 -0
  171. package/lib/commands/upload-probe.js +66 -0
  172. package/lib/commands/upload-publish-context.js +4 -1
  173. package/lib/commands/upload-sidecar-followups.js +55 -27
  174. package/lib/commands/upload.js +116 -157
  175. package/lib/commands/validate-json.js +230 -0
  176. package/lib/commands/verify-governance-combined-external.js +1 -1
  177. package/lib/commands/verify-governance-db.js +2 -2
  178. package/lib/commands/verify-operations-command-action.js +2 -2
  179. package/lib/commands/verify-operations-step-plan.js +79 -41
  180. package/lib/commands/verify-operations-steps.js +2 -2
  181. package/lib/commands/verify-trust-command-action.js +1 -1
  182. package/lib/commands/wizard-core.js +1 -1
  183. package/lib/commands/wizard-headless.js +2 -1
  184. package/lib/core/admin-secrets.js +2 -6
  185. package/lib/core/audit-logger.js +1 -1
  186. package/lib/core/secrets-env-content.js +10 -4
  187. package/lib/core/secrets-env-write.js +2 -13
  188. package/lib/core/secrets-load.js +1 -3
  189. package/lib/datasource/agent-trust-run.js +3 -3
  190. package/lib/datasource/capability/relate-operations.js +1 -1
  191. package/lib/datasource/deploy.js +3 -1
  192. package/lib/datasource/test-e2e.js +6 -1
  193. package/lib/datasource/unified-validation-run-body.js +4 -1
  194. package/lib/datasource/unified-validation-run.js +1 -1
  195. package/lib/deployment/deploy-poll-ui.js +73 -12
  196. package/lib/deployment/deployer-poll-run.js +113 -0
  197. package/lib/deployment/deployer.js +17 -87
  198. package/lib/evidence/dataplane-context.js +21 -0
  199. package/lib/evidence/evidence-display.js +78 -0
  200. package/lib/evidence/evidence-service.js +392 -0
  201. package/lib/external-system/deploy.js +290 -112
  202. package/lib/external-system/download.js +7 -3
  203. package/lib/external-system/test-execution.js +1 -1
  204. package/lib/external-system/test-system-level.js +8 -10
  205. package/lib/external-system/test.js +12 -6
  206. package/lib/generator/deploy-script.js +73 -0
  207. package/lib/generator/external.js +2 -1
  208. package/lib/generator/helpers.js +13 -5
  209. package/lib/generator/index.js +17 -2
  210. package/lib/generator/split-variables.js +9 -3
  211. package/lib/generator/wizard.js +3 -36
  212. package/lib/infrastructure/helpers-docker-check.js +6 -0
  213. package/lib/infrastructure/helpers.js +1 -1
  214. package/lib/internal/fs-real-sync.js +22 -1
  215. package/lib/internal/node-fs.js +2 -0
  216. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  217. package/lib/lifecycle/verify-step-progress.js +1 -1
  218. package/lib/programmatic/access-log.js +26 -0
  219. package/lib/programmatic/auth-config.js +45 -0
  220. package/lib/programmatic/bearer-auth.js +176 -0
  221. package/lib/programmatic/builder-api-request.js +175 -0
  222. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  223. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  224. package/lib/programmatic/builder-api-server.js +230 -0
  225. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  226. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  227. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  228. package/lib/programmatic/builder-help-envelope.js +36 -0
  229. package/lib/programmatic/builder-help-fixtures.js +200 -0
  230. package/lib/programmatic/builder-help-governance.js +172 -0
  231. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  232. package/lib/programmatic/builder-help.js +361 -0
  233. package/lib/programmatic/capability-registry.js +77 -0
  234. package/lib/programmatic/command-options.js +32 -0
  235. package/lib/programmatic/enterprise-mcp-client.js +114 -0
  236. package/lib/programmatic/http-problem-details.js +99 -0
  237. package/lib/programmatic/http-route-match.js +40 -0
  238. package/lib/programmatic/idempotency-cache.js +69 -0
  239. package/lib/programmatic/index.js +53 -0
  240. package/lib/programmatic/integration-path-scope.js +39 -0
  241. package/lib/programmatic/log-redaction.js +66 -0
  242. package/lib/programmatic/manifest-get-section.js +146 -0
  243. package/lib/programmatic/manifest-patch-section.js +252 -0
  244. package/lib/programmatic/manifest-repair.js +122 -0
  245. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  246. package/lib/programmatic/manifest-section-io.js +225 -0
  247. package/lib/programmatic/manifest-section-quality.js +171 -0
  248. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  249. package/lib/programmatic/manifest-section-registry.js +222 -0
  250. package/lib/programmatic/nest-http-bridge.js +34 -0
  251. package/lib/programmatic/openapi-component-schemas.js +68 -0
  252. package/lib/programmatic/openapi-description-enricher.js +117 -0
  253. package/lib/programmatic/openapi-descriptions.js +190 -0
  254. package/lib/programmatic/openapi-docs-serving.js +123 -0
  255. package/lib/programmatic/openapi-help-schemas.js +63 -0
  256. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  257. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  258. package/lib/programmatic/openapi-request-schemas.js +155 -0
  259. package/lib/programmatic/openapi-result-schemas.js +493 -0
  260. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  261. package/lib/programmatic/openapi-schema-descriptions-core.js +162 -0
  262. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  263. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  264. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  265. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  266. package/lib/programmatic/openapi-schema-helpers.js +108 -0
  267. package/lib/programmatic/openapi-spec.js +203 -0
  268. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  269. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  270. package/lib/programmatic/request-timeout.js +53 -0
  271. package/lib/programmatic/route-handler-map.js +143 -0
  272. package/lib/programmatic/route-handlers-context.js +29 -0
  273. package/lib/programmatic/route-handlers.js +33 -0
  274. package/lib/programmatic/run-certify.js +57 -0
  275. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  276. package/lib/programmatic/run-lifecycle.js +29 -0
  277. package/lib/programmatic/run-repair.js +41 -0
  278. package/lib/programmatic/run-repository-emcp.js +62 -0
  279. package/lib/programmatic/run-template-workspace.js +74 -0
  280. package/lib/programmatic/run-test.js +49 -0
  281. package/lib/programmatic/run-upload.js +63 -0
  282. package/lib/programmatic/run-validate.js +53 -0
  283. package/lib/programmatic/run-wizard.js +40 -0
  284. package/lib/programmatic/system-key.js +48 -0
  285. package/lib/programmatic/wizard-config-normalize.js +118 -0
  286. package/lib/programmatic/workspace-cleanup.js +128 -0
  287. package/lib/programmatic/workspace-context.js +145 -0
  288. package/lib/programmatic/workspace-lock.js +75 -0
  289. package/lib/programmatic/workspace-meta.js +64 -0
  290. package/lib/programmatic/workspace-ops.js +149 -0
  291. package/lib/protection/run-commands-upload-sync.js +35 -0
  292. package/lib/protection/run-commands.js +2 -20
  293. package/lib/protection/upload-batch.js +11 -7
  294. package/lib/resolvers/evidence-kind-file.js +230 -0
  295. package/lib/resolvers/resource-type-file.js +58 -1
  296. package/lib/resolvers/role-file.js +227 -0
  297. package/lib/schema/application-schema.json +22 -2
  298. package/lib/schema/external-datasource.schema.json +245 -2
  299. package/lib/schema/external-system.schema.json +259 -119
  300. package/lib/schema/flag-map-validation-run.json +3 -0
  301. package/lib/schema/infra.parameter.yaml +25 -1
  302. package/lib/schema/type/credential-field-registry.json +21 -5
  303. package/lib/schema/type/document-storage.json +9 -0
  304. package/lib/utils/agent-trust-run-display.js +1 -1
  305. package/lib/utils/api.js +8 -2
  306. package/lib/utils/app-path-resolve.js +168 -0
  307. package/lib/utils/app-register-config.js +4 -3
  308. package/lib/utils/authentication-env-template.js +222 -0
  309. package/lib/utils/cli-sync-options.js +62 -10
  310. package/lib/utils/cli-utils.js +15 -3
  311. package/lib/utils/cli-workspace-options.js +29 -0
  312. package/lib/utils/compose-generate-docker-compose.js +102 -0
  313. package/lib/utils/configuration-env-resolver.js +203 -27
  314. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  315. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  316. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  317. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  318. package/lib/utils/datasource-test-run-display.js +2 -1
  319. package/lib/utils/dev-ca-install.js +5 -6
  320. package/lib/utils/dev-config.js +2 -2
  321. package/lib/utils/dev-init-ssh-merge.js +165 -23
  322. package/lib/utils/dev-list-sort.js +145 -0
  323. package/lib/utils/dev-pin-share-instructions.js +110 -0
  324. package/lib/utils/dev-platform-tls.js +0 -63
  325. package/lib/utils/dev-ssh-config-helper.js +177 -33
  326. package/lib/utils/docker-build.js +46 -27
  327. package/lib/utils/docker-daemon-tls-ca.js +1 -1
  328. package/lib/utils/docker-exec.js +91 -6
  329. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  330. package/lib/utils/env-copy.js +3 -4
  331. package/lib/utils/env-dotenv-format.js +103 -0
  332. package/lib/utils/error-formatters/error-parser.js +0 -3
  333. package/lib/utils/external-env-template.js +5 -2
  334. package/lib/utils/external-system-display.js +5 -1
  335. package/lib/utils/external-system-readiness-compact-blocks.js +248 -0
  336. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  337. package/lib/utils/external-system-readiness-core.js +16 -0
  338. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  339. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  340. package/lib/utils/external-system-readiness-display.js +20 -30
  341. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  342. package/lib/utils/external-system-system-test-tty.js +5 -41
  343. package/lib/utils/health-check-request.js +2 -3
  344. package/lib/utils/help-builder.js +9 -1
  345. package/lib/utils/host-ops-job-labels.js +236 -0
  346. package/lib/utils/host-ops-job-result.js +61 -0
  347. package/lib/utils/host-ops-poll-ui.js +163 -0
  348. package/lib/utils/image-name.js +22 -4
  349. package/lib/utils/integration-path-resolve.js +112 -0
  350. package/lib/utils/logger.js +37 -4
  351. package/lib/utils/manifest-source-emit.js +1 -1
  352. package/lib/utils/paths-reload-source.js +148 -0
  353. package/lib/utils/paths-system-builder-keys.js +25 -0
  354. package/lib/utils/paths.js +183 -30
  355. package/lib/utils/pipeline-upload-auth-retry.js +4 -0
  356. package/lib/utils/postgres-platform-bootstrap.js +24 -17
  357. package/lib/utils/postgres-wipe.js +5 -2
  358. package/lib/utils/remote-dev-auth.js +39 -4
  359. package/lib/utils/resolve-docker-image-ref.js +36 -6
  360. package/lib/utils/runtime-configuration-values.js +64 -2
  361. package/lib/utils/secrets-helpers.js +5 -1
  362. package/lib/utils/ssh-known-hosts.js +130 -0
  363. package/lib/utils/test-target-cli-options.js +75 -0
  364. package/lib/utils/token-manager.js +16 -0
  365. package/lib/utils/upload-sync-options.js +20 -2
  366. package/lib/utils/validation-run-request.js +11 -2
  367. package/lib/validation/external-manifest-validator.js +11 -1
  368. package/lib/validation/openapi-contract-surface-validator.js +430 -0
  369. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  370. package/lib/validation/validate-external-file.js +160 -0
  371. package/lib/validation/validate.js +6 -117
  372. package/lib/validation/validator.js +6 -5
  373. package/package.json +76 -37
  374. package/packages/builder-api/README.md +120 -0
  375. package/packages/builder-api/package.json +30 -0
  376. package/packages/builder-api/src/app.module.ts +7 -0
  377. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  378. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  379. package/packages/builder-api/src/main.ts +16 -0
  380. package/packages/builder-api/tsconfig.json +15 -0
  381. package/scripts/check-builder-api-architecture-grep.js +79 -0
  382. package/scripts/docker_image_content_gate.js +47 -0
  383. package/scripts/docker_image_content_gate.sh +5 -0
  384. package/scripts/export-builder-api-evidence.js +262 -0
  385. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  386. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  387. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  388. package/scripts/lib/plan-actor.js +109 -0
  389. package/scripts/lib/plan-config.js +20 -0
  390. package/scripts/lib/plan-gates.js +154 -0
  391. package/scripts/lib/plan-meta.js +104 -0
  392. package/scripts/lib/plan-parse.js +162 -0
  393. package/scripts/lib/plan-prevalidate-gates.js +337 -0
  394. package/scripts/lib/plan-run-core.js +125 -0
  395. package/scripts/lib/plan-run-report.js +119 -0
  396. package/scripts/plan-approve.js +24 -0
  397. package/scripts/plan-archive.js +49 -0
  398. package/scripts/plan-run.js +13 -0
  399. package/scripts/plan-set-actor.js +21 -0
  400. package/scripts/plan-validate.js +80 -0
  401. package/scripts/pnpm/af.mjs +110 -0
  402. package/scripts/pnpm/check-quiet.mjs +32 -0
  403. package/scripts/pnpm/dev-install.mjs +29 -0
  404. package/scripts/pnpm/dev-reload.mjs +18 -0
  405. package/scripts/pnpm/help.mjs +55 -0
  406. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  407. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  408. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  409. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  410. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  411. package/scripts/pnpm/lib/spinner.mjs +42 -0
  412. package/scripts/stage_builder_api_for_docker.js +65 -0
  413. package/scripts/sync-builder-api-template.js +44 -0
  414. package/templates/README.md +3 -0
  415. package/templates/applications/builder-api/Dockerfile +38 -0
  416. package/templates/applications/builder-api/application.yaml +75 -0
  417. package/templates/applications/builder-api/env.template +48 -0
  418. package/templates/applications/dataplane/application.yaml +27 -5
  419. package/templates/applications/dataplane/env.template +38 -15
  420. package/templates/applications/dataplane/rbac.yaml +85 -3
  421. package/templates/applications/miso-controller/application.yaml +10 -1
  422. package/templates/applications/miso-controller/env.template +11 -10
  423. package/templates/applications/miso-controller/rbac.yaml +72 -0
  424. package/templates/channels/README.md +18 -0
  425. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  426. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  427. package/templates/channels/chatgpt/integration/README.md +11 -0
  428. package/templates/channels/chatgpt/integration/application.json +15 -0
  429. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  430. package/templates/channels/chatgpt/integration/env.template +4 -0
  431. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  432. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  433. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  434. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  435. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  436. package/templates/channels/slack/install.template.md.hbs +48 -18
  437. package/templates/channels/slack/integration/README.md +38 -0
  438. package/templates/channels/slack/integration/application.json +18 -0
  439. package/templates/channels/slack/integration/env.template +29 -0
  440. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  441. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  442. package/templates/channels/slack/integration/slack-system.json +144 -0
  443. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  444. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  445. package/templates/channels/teams-bot/integration/README.md +18 -0
  446. package/templates/channels/teams-bot/integration/application.json +17 -0
  447. package/templates/channels/teams-bot/integration/env.template +5 -0
  448. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  449. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  450. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  451. package/templates/channels/web-embed/integration/README.md +11 -0
  452. package/templates/channels/web-embed/integration/application.json +15 -0
  453. package/templates/channels/web-embed/integration/env.template +4 -0
  454. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  455. package/templates/openapi/redoc_page.html +86 -0
  456. package/templates/python/docker-compose.hbs +11 -0
  457. package/templates/python/requirements.txt +2 -2
  458. package/templates/typescript/docker-compose.hbs +11 -0
  459. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Offline validate then write *-deploy.json (same quality as validate + same write as json).
3
+ *
4
+ * @fileoverview aifabrix validate-json command
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('fs');
12
+ const chalk = require('chalk');
13
+ const logger = require('../utils/logger');
14
+ const validate = require('../validation/validate');
15
+ const generator = require('../generator');
16
+ const { listIntegrationAppNames, listBuilderAppNames } = require('../utils/paths');
17
+ const {
18
+ formatSuccessLine,
19
+ formatBlockingError,
20
+ formatWarningLine
21
+ } = require('../utils/cli-test-layout-chalk');
22
+
23
+ /**
24
+ * @param {string} appKey
25
+ * @returns {boolean}
26
+ */
27
+ function looksLikeExistingFilePath(appKey) {
28
+ try {
29
+ return Boolean(appKey && fs.existsSync(appKey) && fs.statSync(appKey).isFile());
30
+ } catch {
31
+ return false;
32
+ }
33
+ }
34
+
35
+ /**
36
+ * @param {object} opts
37
+ * @returns {string[]}
38
+ */
39
+ function collectBatchAppNames(opts) {
40
+ const names = [];
41
+ if (opts.integration === true) {
42
+ names.push(...listIntegrationAppNames());
43
+ }
44
+ if (opts.builder === true) {
45
+ names.push(...listBuilderAppNames());
46
+ }
47
+ return [...new Set(names)];
48
+ }
49
+
50
+ /**
51
+ * @param {string} appKey
52
+ * @param {object} result
53
+ * @param {string} outFormat
54
+ */
55
+ function emitManifestLine(appKey, result, outFormat) {
56
+ if (outFormat === 'json' || !result?.appPath) {
57
+ return;
58
+ }
59
+ try {
60
+ const { emitManifestMetadataLineIfTTY } = require('../utils/manifest-source-emit');
61
+ emitManifestMetadataLineIfTTY(logger, {
62
+ appKey,
63
+ appPath: result.appPath,
64
+ envOnly: false,
65
+ json: false
66
+ });
67
+ } catch {
68
+ /* ignore */
69
+ }
70
+ }
71
+
72
+ /**
73
+ * Validate one app/systemKey; write deploy JSON only when local validate succeeds.
74
+ * @param {string} appKey
75
+ * @param {object} [options]
76
+ * @returns {Promise<{ appKey: string, valid: boolean, validation: object, deploy?: object|null, error?: string }>}
77
+ */
78
+ async function validateThenWriteDeploy(appKey, options = {}) {
79
+ let validation;
80
+ try {
81
+ validation = await validate.validateAppOrFile(appKey, { ...options, certSync: false });
82
+ } catch (err) {
83
+ return {
84
+ appKey,
85
+ valid: false,
86
+ validation: { valid: false, errors: [err.message || String(err)] },
87
+ deploy: null,
88
+ error: err.message || String(err)
89
+ };
90
+ }
91
+ if (!validation.valid) {
92
+ return { appKey, valid: false, validation, deploy: null };
93
+ }
94
+ const deploy = await generator.generateDeployJsonWithValidation(appKey, options);
95
+ const ok = deploy.success === true;
96
+ return {
97
+ appKey,
98
+ valid: ok,
99
+ validation,
100
+ deploy,
101
+ error: ok ? undefined : (deploy.validation?.errors || []).join('; ') || 'deploy JSON validation failed'
102
+ };
103
+ }
104
+
105
+ /**
106
+ * @param {object} item
107
+ * @param {string} outFormat
108
+ */
109
+ function displayOneHumanResult(item, outFormat) {
110
+ emitManifestLine(item.appKey, item.validation, outFormat);
111
+ if (outFormat === 'json') {
112
+ return;
113
+ }
114
+ validate.displayValidationResults(item.validation);
115
+ if (!item.validation.valid) {
116
+ logger.log(formatBlockingError(`Skipped deploy JSON for ${item.appKey} (validation failed)`));
117
+ return;
118
+ }
119
+ if (item.deploy?.success && item.deploy.path) {
120
+ logger.log(formatSuccessLine(`Generated deployment JSON: ${item.deploy.path}`));
121
+ const warnings = item.deploy.validation?.warnings || [];
122
+ if (warnings.length > 0) {
123
+ warnings.forEach((w) => logger.log(formatWarningLine(w)));
124
+ }
125
+ return;
126
+ }
127
+ logger.log(formatBlockingError(`Deploy JSON write failed for ${item.appKey}`));
128
+ (item.deploy?.validation?.errors || []).forEach((e) => logger.log(` • ${e}`));
129
+ }
130
+
131
+ /**
132
+ * @param {Array<object>} items
133
+ * @param {string} outFormat
134
+ */
135
+ function displayBatchSummary(items, outFormat) {
136
+ if (outFormat === 'json') {
137
+ logger.log(JSON.stringify({
138
+ batch: true,
139
+ valid: items.every((i) => i.valid),
140
+ results: items.map((i) => ({
141
+ appKey: i.appKey,
142
+ valid: i.valid,
143
+ path: i.deploy?.path || null,
144
+ error: i.error || null
145
+ }))
146
+ }, null, 2));
147
+ return;
148
+ }
149
+ const passed = items.filter((i) => i.valid);
150
+ const failed = items.filter((i) => !i.valid);
151
+ logger.log('');
152
+ logger.log(chalk.bold('validate-json summary'));
153
+ logger.log(` Passed: ${passed.length}`);
154
+ logger.log(` Failed: ${failed.length}`);
155
+ failed.forEach((i) => {
156
+ logger.log(formatBlockingError(`${i.appKey}${i.error ? `: ${i.error}` : ''}`));
157
+ });
158
+ }
159
+
160
+ /**
161
+ * @param {object} opts
162
+ * @param {string} outFormat
163
+ * @returns {Promise<{ exitCode: number }>}
164
+ */
165
+ async function runValidateJsonBatch(opts, outFormat) {
166
+ const names = collectBatchAppNames(opts);
167
+ const items = [];
168
+ for (const name of names) {
169
+ const item = await validateThenWriteDeploy(name, opts);
170
+ displayOneHumanResult(item, outFormat);
171
+ items.push(item);
172
+ }
173
+ displayBatchSummary(items, outFormat);
174
+ return { exitCode: items.every((i) => i.valid) ? 0 : 1 };
175
+ }
176
+
177
+ /**
178
+ * @param {string} appKey
179
+ * @param {object} opts
180
+ * @param {string} outFormat
181
+ * @returns {Promise<{ exitCode: number }>}
182
+ */
183
+ async function runValidateJsonSingle(appKey, opts, outFormat) {
184
+ if (looksLikeExistingFilePath(appKey)) {
185
+ logger.log(
186
+ chalk.red(
187
+ 'validate-json requires an appKey or systemKey (not a file path). Use aifabrix validate <file> for files.'
188
+ )
189
+ );
190
+ return { exitCode: 1 };
191
+ }
192
+ const item = await validateThenWriteDeploy(appKey, opts);
193
+ if (outFormat === 'json') {
194
+ logger.log(JSON.stringify({
195
+ appKey: item.appKey,
196
+ valid: item.valid,
197
+ path: item.deploy?.path || null,
198
+ validation: item.validation,
199
+ error: item.error || null
200
+ }, null, 2));
201
+ } else {
202
+ displayOneHumanResult(item, outFormat);
203
+ }
204
+ return { exitCode: item.valid ? 0 : 1 };
205
+ }
206
+
207
+ /**
208
+ * @param {string|undefined} appKey
209
+ * @param {object} options - Commander options or opts()
210
+ * @returns {Promise<{ exitCode: number }>}
211
+ */
212
+ async function runValidateJsonCommand(appKey, options) {
213
+ const opts = options.opts ? options.opts() : options;
214
+ const outFormat = (opts.format || 'default').toLowerCase();
215
+ if (opts.integration === true || opts.builder === true) {
216
+ return runValidateJsonBatch(opts, outFormat);
217
+ }
218
+ if (!appKey || typeof appKey !== 'string') {
219
+ logger.log(chalk.red('App or system key is required, or use --integration / --builder'));
220
+ return { exitCode: 1 };
221
+ }
222
+ return runValidateJsonSingle(appKey, opts, outFormat);
223
+ }
224
+
225
+ module.exports = {
226
+ runValidateJsonCommand,
227
+ validateThenWriteDeploy,
228
+ collectBatchAppNames,
229
+ looksLikeExistingFilePath
230
+ };
@@ -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
  };
@@ -8,58 +8,96 @@ const { validateExternalSystemComplete } = require('../validation/validate');
8
8
  const { testExternalSystem, testExternalSystemIntegration } = require('../external-system/test');
9
9
  const { runTestE2EForExternalSystem } = require('./test-e2e-external');
10
10
 
11
+ /**
12
+ * @param {string} systemKey
13
+ * @returns {Array}
14
+ */
15
+ function buildBeforeSyncSteps(systemKey) {
16
+ return [
17
+ {
18
+ key: 'validation',
19
+ run: () => validateExternalSystemComplete(systemKey, { type: 'external' }),
20
+ ok: (result) => result.valid === true
21
+ },
22
+ {
23
+ key: 'unit',
24
+ run: () => testExternalSystem(systemKey, { verbose: false }),
25
+ ok: (result) => result.valid === true
26
+ }
27
+ ];
28
+ }
29
+
11
30
  /**
12
31
  * @param {string} systemKey
13
32
  * @param {Object} options
14
- * @returns {{ beforeSync: Array, afterSync: Array, e2e: Object }}
33
+ * @returns {Array}
15
34
  */
16
- function buildOperationsVerifyStepPlan(systemKey, options) {
17
- return {
18
- beforeSync: [
19
- {
20
- key: 'validation',
21
- run: () => validateExternalSystemComplete(systemKey, { type: 'external' }),
22
- ok: (result) => result.valid === true
23
- },
24
- {
25
- key: 'unit',
26
- run: () => testExternalSystem(systemKey, { verbose: false }),
27
- ok: (result) => result.valid === true
28
- }
29
- ],
30
- afterSync: [
31
- {
32
- key: 'integration',
33
- run: () =>
34
- testExternalSystemIntegration(systemKey, {
35
- environment: options.env,
36
- noSync: true,
37
- verbose: false,
38
- debug: options.debug === true
39
- }),
40
- ok: (result) => result.success === true
41
- }
42
- ],
43
- e2e: {
44
- key: 'e2e',
45
- run: (progress) =>
46
- runTestE2EForExternalSystem(systemKey, {
47
- env: options.env,
48
- noSync: true,
35
+ function buildAfterSyncSteps(systemKey, options) {
36
+ return [
37
+ {
38
+ key: 'integration',
39
+ run: () =>
40
+ testExternalSystemIntegration(systemKey, {
41
+ environment: options.env || options.environment,
42
+ noPublish: true,
49
43
  verbose: false,
50
44
  debug: options.debug === true,
51
- async: options.async !== false,
45
+ // Token-forward (builder-api certify): same auth as E2E step — do not
46
+ // fall back to getDeploymentAuth inside the container.
52
47
  authConfig: options.authConfig,
53
48
  dataplaneUrl: options.dataplaneUrl,
54
- silentResolve: options.silentResolve === true,
55
- quietPollUi: true,
56
- onDatasourceProgress: progress?.setLabel
57
- ? ({ key, index, total }) =>
58
- progress.setLabel(`Running E2E: ${key} (${index + 1}/${total})`)
59
- : undefined
49
+ silentResolve: options.silentResolve === true
60
50
  }),
61
51
  ok: (result) => result.success === true
62
52
  }
53
+ ];
54
+ }
55
+
56
+ /**
57
+ * @param {string} systemKey
58
+ * @param {Object} options
59
+ * @returns {Object}
60
+ */
61
+ function buildE2eStep(systemKey, options) {
62
+ if (options.skipE2e === true || options.minimal === true) {
63
+ return {
64
+ key: 'e2e',
65
+ run: async() => ({ success: true, skipped: true, reason: 'minimal' }),
66
+ ok: () => true
67
+ };
68
+ }
69
+ return {
70
+ key: 'e2e',
71
+ run: (progress) =>
72
+ runTestE2EForExternalSystem(systemKey, {
73
+ env: options.env,
74
+ noPublish: true,
75
+ verbose: false,
76
+ debug: options.debug === true,
77
+ async: options.async !== false,
78
+ authConfig: options.authConfig,
79
+ dataplaneUrl: options.dataplaneUrl,
80
+ silentResolve: options.silentResolve === true,
81
+ quietPollUi: true,
82
+ onDatasourceProgress: progress?.setLabel
83
+ ? ({ key, index, total }) =>
84
+ progress.setLabel(`Running E2E: ${key} (${index + 1}/${total})`)
85
+ : undefined
86
+ }),
87
+ ok: (result) => result.success === true
88
+ };
89
+ }
90
+
91
+ /**
92
+ * @param {string} systemKey
93
+ * @param {Object} options
94
+ * @returns {{ beforeSync: Array, afterSync: Array, e2e: Object }}
95
+ */
96
+ function buildOperationsVerifyStepPlan(systemKey, options) {
97
+ return {
98
+ beforeSync: buildBeforeSyncSteps(systemKey),
99
+ afterSync: buildAfterSyncSteps(systemKey, options),
100
+ e2e: buildE2eStep(systemKey, options)
63
101
  };
64
102
  }
65
103
 
@@ -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
  /**
@@ -238,7 +238,7 @@ async function logApiCall({ url, options, statusCode, duration, success, errorIn
238
238
  const path = extractPathFromUrl(url);
239
239
 
240
240
  // Extract controller URL from full URL
241
- let controllerUrl = 'unknown';
241
+ let controllerUrl;
242
242
  try {
243
243
  const urlObj = new URL(url);
244
244
  controllerUrl = `${urlObj.protocol}//${urlObj.host}`;
@@ -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
  /**
@@ -133,9 +133,7 @@ function mergeUserWithConfigFile(userSecrets, resolvedConfigPath, keySources) {
133
133
  for (const key of Object.keys(configSecrets)) {
134
134
  if (!(key in merged) || merged[key] === undefined || merged[key] === null || merged[key] === '') {
135
135
  merged[key] = configSecrets[key];
136
- if (keySources) {
137
- keySources[key] = resolvedConfigPath;
138
- }
136
+ keySources[key] = resolvedConfigPath;
139
137
  }
140
138
  }
141
139
  return merged;
@@ -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
@@ -23,7 +23,7 @@ function _asObject(x) {
23
23
  function _uniqStrings(list) {
24
24
  const out = [];
25
25
  const seen = new Set();
26
- for (const x of list || []) {
26
+ for (const x of list) {
27
27
  const s = String(x || '').trim();
28
28
  if (!s || seen.has(s)) continue;
29
29
  seen.add(s);
@@ -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
 
@@ -40,6 +40,8 @@ function buildUnifiedE2eRunOptions(options, timeoutMs, pk) {
40
40
  minProcessed: options.minProcessed,
41
41
  minRecordCount: options.minRecordCount,
42
42
  capabilityKey: options.capabilityKey,
43
+ version: options.version,
44
+ syncMode: options.syncMode,
43
45
  timeout: timeoutMs,
44
46
  sync: options.sync === true,
45
47
  force: options.force === true,
@@ -114,10 +116,13 @@ function resolveE2ePollTimeoutMs(options) {
114
116
  * @returns {Object}
115
117
  */
116
118
  function buildE2eRequestMeta(datasourceKey, options, pk) {
119
+ const includeDebug = includeDebugForRequest(options.debug);
117
120
  return {
118
121
  datasourceKey,
119
122
  runType: 'e2e',
120
- includeDebug: includeDebugForRequest(options.debug),
123
+ includeDebug,
124
+ explainCertification: includeDebug,
125
+ explainMetrics: includeDebug,
121
126
  cleanup: options.cleanup,
122
127
  runScenarios: options.runScenarios,
123
128
  primaryKeyValue: pk !== undefined && pk !== null,
@@ -53,14 +53,17 @@ async function buildUnifiedValidationBody(params) {
53
53
  })
54
54
  : undefined;
55
55
 
56
+ const includeDebug = includeDebugForRequest(options.debug);
56
57
  const body = buildExternalDataSourceValidationRequest({
57
58
  systemKey,
58
59
  datasourceKey,
59
60
  runType,
60
61
  payloadTemplate,
61
62
  asyncRun: runType === 'e2e' && useAsync === true,
62
- includeDebug: includeDebugForRequest(options.debug),
63
+ includeDebug,
63
64
  explain: options.verbose === true,
65
+ explainCertification: includeDebug,
66
+ explainMetrics: includeDebug,
64
67
  e2eOptions: e2eOptions && Object.keys(e2eOptions).length > 0 ? e2eOptions : undefined
65
68
  });
66
69
  return withStageOnValidationRunBody(body, runType);
@@ -121,7 +121,7 @@ async function runUnifiedDatasourceValidation(datasourceKey, options) {
121
121
 
122
122
  const ctx = await prepareValidationRunContext(datasourceKey, options);
123
123
  const useAsync = options.noAsync ? false : options.async !== false;
124
- const timeoutMs = parseInt(String(options.timeout || '30000'), 10) || 30000;
124
+ const timeoutMs = parseInt(String(options.timeout || '60000'), 10) || 60000;
125
125
  const body = await buildUnifiedValidationBody({
126
126
  systemKey: ctx.systemKey,
127
127
  datasourceKey,