@aifabrix/builder 2.45.0 → 2.46.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 (352) hide show
  1. package/.cursor/rules/cli-layout.mdc +2 -0
  2. package/.cursor/rules/cli-product-neutral.mdc +43 -0
  3. package/.cursor/rules/docs-rules.mdc +3 -1
  4. package/.cursor/rules/project-rules.mdc +1 -0
  5. package/README.md +43 -17
  6. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
  7. package/jest.config.default.js +2 -1
  8. package/jest.config.isolated.js +2 -1
  9. package/jest.global-live-fabrix-hooks.js +36 -0
  10. package/jest.isolated-projects.js +130 -0
  11. package/jest.projects.js +69 -121
  12. package/lib/api/agent-metadata-validation.api.js +93 -0
  13. package/lib/api/api-response-errors.js +124 -0
  14. package/lib/api/audit-api-helpers.js +68 -0
  15. package/lib/api/audit.api.js +119 -0
  16. package/lib/api/auth-cache.api.js +44 -0
  17. package/lib/api/certificates.api.js +4 -4
  18. package/lib/api/credential.api.js +2 -2
  19. package/lib/api/dataplane-health.api.js +137 -0
  20. package/lib/api/dataplane-sync.api.js +27 -0
  21. package/lib/api/datasources-core.api.js +21 -18
  22. package/lib/api/datasources-extended.api.js +22 -22
  23. package/lib/api/dimensions.api.js +3 -0
  24. package/lib/api/external-systems.api.js +13 -13
  25. package/lib/api/governance-scenario-pack.api.js +159 -0
  26. package/lib/api/governance-scenarios.api.js +39 -0
  27. package/lib/api/groups.api.js +79 -0
  28. package/lib/api/index.js +88 -5
  29. package/lib/api/lifecycle.api.js +77 -0
  30. package/lib/api/pipeline.api.js +7 -5
  31. package/lib/api/protection.api.js +157 -0
  32. package/lib/api/records-bulk.api.js +43 -0
  33. package/lib/api/records-search-parse.js +49 -0
  34. package/lib/api/records-search.api.js +29 -0
  35. package/lib/api/types/agent-metadata-validation.types.js +67 -0
  36. package/lib/api/types/audit.types.js +72 -0
  37. package/lib/api/types/dataplane-health.types.js +27 -0
  38. package/lib/api/types/dimensions.types.js +2 -0
  39. package/lib/api/types/governance-scenarios.types.js +39 -0
  40. package/lib/api/types/protection.types.js +69 -0
  41. package/lib/api/types/records-bulk.types.js +35 -0
  42. package/lib/api/types/records-search.types.js +28 -0
  43. package/lib/api/user-groups.api.js +50 -0
  44. package/lib/api/users.api.js +95 -0
  45. package/lib/api/validation-run.api.js +3 -3
  46. package/lib/api/validation-runner.js +5 -3
  47. package/lib/api/wizard-platform.api.js +3 -3
  48. package/lib/api/wizard.api.js +21 -21
  49. package/lib/app/deploy-config.js +4 -1
  50. package/lib/app/deploy.js +34 -19
  51. package/lib/app/down.js +20 -1
  52. package/lib/app/push.js +4 -5
  53. package/lib/app/register.js +7 -4
  54. package/lib/app/run-env-compose.js +84 -30
  55. package/lib/build/index.js +5 -0
  56. package/lib/certification/sync-system-certification.js +13 -6
  57. package/lib/cli/index.js +8 -2
  58. package/lib/cli/infra-guided-auth.js +109 -0
  59. package/lib/cli/infra-guided.js +91 -69
  60. package/lib/cli/setup-app.help.js +19 -2
  61. package/lib/cli/setup-app.js +58 -23
  62. package/lib/cli/setup-app.test-commands.js +28 -21
  63. package/lib/cli/setup-auth.js +55 -3
  64. package/lib/cli/setup-certification-commands.js +147 -0
  65. package/lib/cli/setup-certification.help.js +141 -0
  66. package/lib/cli/setup-environment.js +19 -2
  67. package/lib/cli/setup-external-system-help.js +62 -0
  68. package/lib/cli/setup-external-system.js +62 -6
  69. package/lib/cli/setup-infra.js +9 -1
  70. package/lib/cli/setup-platform.js +6 -1
  71. package/lib/cli/setup-secrets.js +33 -1
  72. package/lib/cli/setup-utility-help-after.js +65 -0
  73. package/lib/cli/setup-utility-repair.js +198 -0
  74. package/lib/cli/setup-utility-resolve.js +42 -6
  75. package/lib/cli/setup-utility-validate.js +197 -0
  76. package/lib/cli/setup-utility.js +41 -258
  77. package/lib/commands/auth-status-client-tokens.js +214 -0
  78. package/lib/commands/auth-status-dataplane-version.js +269 -0
  79. package/lib/commands/auth-status-display.js +94 -0
  80. package/lib/commands/auth-status.js +111 -53
  81. package/lib/commands/credential-push.js +10 -5
  82. package/lib/commands/datasource-load-export-cli.js +178 -0
  83. package/lib/commands/datasource-test-trust-cli.js +118 -0
  84. package/lib/commands/datasource-unified-test-cli.js +31 -20
  85. package/lib/commands/datasource-unified-test-cli.options.js +22 -3
  86. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
  87. package/lib/commands/datasource-verify-audit-cli.js +96 -0
  88. package/lib/commands/datasource.js +68 -1
  89. package/lib/commands/dev-show-display.js +8 -1
  90. package/lib/commands/dimension-value.js +43 -13
  91. package/lib/commands/dimension.js +38 -7
  92. package/lib/commands/governance-cli-shared.js +94 -0
  93. package/lib/commands/governance-command-action.js +132 -0
  94. package/lib/commands/governance-download-external.js +34 -0
  95. package/lib/commands/governance-generate-external.js +71 -0
  96. package/lib/commands/governance-upload-external.js +36 -0
  97. package/lib/commands/governance-verify-external.js +64 -0
  98. package/lib/commands/governance.js +144 -0
  99. package/lib/commands/identity-apply-sync.js +131 -0
  100. package/lib/commands/identity-group-cli.js +146 -0
  101. package/lib/commands/identity-membership-role-cache.js +175 -0
  102. package/lib/commands/identity-shared.js +94 -0
  103. package/lib/commands/identity-user-cli.js +158 -0
  104. package/lib/commands/identity.js +43 -0
  105. package/lib/commands/lifecycle-command-action.js +123 -0
  106. package/lib/commands/lifecycle-external.js +268 -0
  107. package/lib/commands/login.js +56 -17
  108. package/lib/commands/protection-cli-leaves.js +286 -0
  109. package/lib/commands/protection.js +50 -0
  110. package/lib/commands/repair-auth-apply.js +127 -0
  111. package/lib/commands/repair-changed-files.js +41 -0
  112. package/lib/commands/repair-datasource-keys.js +4 -1
  113. package/lib/commands/repair-datasource-run.js +59 -0
  114. package/lib/commands/repair-datasource-test-payload.js +259 -0
  115. package/lib/commands/repair-datasource.js +1 -51
  116. package/lib/commands/repair-env-template.js +64 -13
  117. package/lib/commands/repair-external-run.js +216 -0
  118. package/lib/commands/repair-openapi-sync.js +23 -0
  119. package/lib/commands/repair-persist.js +4 -0
  120. package/lib/commands/repair-rbac.js +52 -1
  121. package/lib/commands/repair-steps.js +145 -0
  122. package/lib/commands/repair.js +29 -286
  123. package/lib/commands/secrets-get.js +184 -0
  124. package/lib/commands/secrets-remove-all.js +3 -1
  125. package/lib/commands/setup-image-refresh.js +146 -0
  126. package/lib/commands/setup-modes.js +158 -162
  127. package/lib/commands/setup-platform-auth.js +76 -0
  128. package/lib/commands/setup-prompts-admin.js +244 -0
  129. package/lib/commands/setup-prompts-platform-mode.js +67 -0
  130. package/lib/commands/setup-prompts-validators.js +36 -0
  131. package/lib/commands/setup-prompts.js +24 -76
  132. package/lib/commands/setup-run-context.js +45 -0
  133. package/lib/commands/setup-spinners.js +39 -0
  134. package/lib/commands/setup.js +27 -5
  135. package/lib/commands/teardown.js +39 -0
  136. package/lib/commands/test-e2e-external.js +61 -14
  137. package/lib/commands/test-governance-cli-options.js +47 -0
  138. package/lib/commands/test-governance-external.js +67 -0
  139. package/lib/commands/test-trust-cli-options.js +32 -0
  140. package/lib/commands/test-trust-external.js +126 -0
  141. package/lib/commands/up-common.js +25 -13
  142. package/lib/commands/up-dataplane.js +50 -13
  143. package/lib/commands/upload-publish-context.js +75 -0
  144. package/lib/commands/upload-sidecar-followups.js +89 -0
  145. package/lib/commands/upload.js +108 -105
  146. package/lib/commands/verify-governance-combined-external.js +61 -0
  147. package/lib/commands/verify-governance-command-action.js +64 -0
  148. package/lib/commands/verify-governance-db.js +102 -0
  149. package/lib/commands/verify-governance-external.js +77 -0
  150. package/lib/commands/verify-governance-result-builders.js +71 -0
  151. package/lib/commands/verify-operations-command-action.js +68 -0
  152. package/lib/commands/verify-operations-external.js +268 -0
  153. package/lib/commands/verify-operations-persist.js +75 -0
  154. package/lib/commands/verify-operations-step-plan.js +68 -0
  155. package/lib/commands/verify-operations-steps.js +111 -0
  156. package/lib/commands/verify-trust-command-action.js +70 -0
  157. package/lib/commands/verify-trust-external.js +67 -0
  158. package/lib/commands/wizard-config-normalizer.js +43 -23
  159. package/lib/commands/wizard-core.js +5 -0
  160. package/lib/core/admin-password-generator.js +38 -0
  161. package/lib/core/admin-secrets-bundle.js +111 -0
  162. package/lib/core/admin-secrets-env-overlay.js +62 -0
  163. package/lib/core/admin-secrets.js +32 -4
  164. package/lib/core/config-attach-extensions.js +3 -0
  165. package/lib/core/config-device-dataplane.js +185 -0
  166. package/lib/core/config-platform-controller.js +44 -0
  167. package/lib/core/config-setup-installation-profile.js +42 -0
  168. package/lib/core/config-setup-platform-mode.js +46 -0
  169. package/lib/core/config.js +46 -36
  170. package/lib/core/secrets-admin-env.js +6 -2
  171. package/lib/core/secrets-ensure.js +4 -0
  172. package/lib/core/secrets-env-content.js +54 -48
  173. package/lib/core/secrets-env-write.js +10 -1
  174. package/lib/core/secrets-infra-placeholder-sync.js +2 -0
  175. package/lib/core/setup-installation-profile.js +43 -0
  176. package/lib/core/setup-platform-mode.js +55 -0
  177. package/lib/datasource/agent-trust-debug-log.js +45 -0
  178. package/lib/datasource/agent-trust-fetch.js +115 -0
  179. package/lib/datasource/agent-trust-map.js +101 -0
  180. package/lib/datasource/agent-trust-mock.js +44 -0
  181. package/lib/datasource/agent-trust-run.js +95 -0
  182. package/lib/datasource/agent-trust-timeout.js +25 -0
  183. package/lib/datasource/audit-evidence-display.js +80 -0
  184. package/lib/datasource/audit-evidence-extract-debug.js +115 -0
  185. package/lib/datasource/audit-evidence-extract.js +180 -0
  186. package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
  187. package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
  188. package/lib/datasource/audit-evidence-poll.js +109 -0
  189. package/lib/datasource/audit-evidence-run.js +177 -0
  190. package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
  191. package/lib/datasource/audit-evidence-verify-matrix.js +205 -0
  192. package/lib/datasource/audit-evidence-verify.js +108 -0
  193. package/lib/datasource/bulk-loader-run-batches.js +100 -0
  194. package/lib/datasource/bulk-loader-service-retry.js +52 -0
  195. package/lib/datasource/bulk-loader-service.js +127 -0
  196. package/lib/datasource/capability/run-capability-dimension.js +2 -1
  197. package/lib/datasource/datasource-exporter-resolve.js +82 -0
  198. package/lib/datasource/datasource-exporter-service.js +144 -0
  199. package/lib/datasource/datasource-identifier.js +148 -0
  200. package/lib/datasource/datasource-load-export-context.js +95 -0
  201. package/lib/datasource/integration-context.js +6 -4
  202. package/lib/datasource/local-data-paths.js +145 -0
  203. package/lib/datasource/log-cleaner.js +241 -0
  204. package/lib/datasource/log-viewer.js +111 -6
  205. package/lib/datasource/record-file-parser.js +85 -0
  206. package/lib/datasource/record-mapper.js +129 -0
  207. package/lib/datasource/resolve-app.js +74 -55
  208. package/lib/datasource/test-e2e.js +29 -2
  209. package/lib/datasource/unified-validation-run-body.js +3 -1
  210. package/lib/datasource/unified-validation-run-resolve.js +45 -12
  211. package/lib/datasource/unified-validation-run.js +47 -18
  212. package/lib/datasource/validate.js +37 -20
  213. package/lib/deployment/environment-poll-status.js +138 -0
  214. package/lib/deployment/environment.js +42 -34
  215. package/lib/external-system/download.js +21 -20
  216. package/lib/external-system/generator.js +5 -1
  217. package/lib/external-system/integration-auth-context.js +45 -0
  218. package/lib/external-system/test-auth.js +12 -5
  219. package/lib/external-system/test-system-level.js +25 -4
  220. package/lib/external-system/test.js +9 -7
  221. package/lib/generator/external-controller-manifest.js +15 -0
  222. package/lib/governance/governance-cli-errors.js +96 -0
  223. package/lib/governance/governance-download-display.js +38 -0
  224. package/lib/governance/governance-pack-loader.js +70 -0
  225. package/lib/governance/governance-run-display.js +309 -0
  226. package/lib/identity/identity-apply-core.js +108 -0
  227. package/lib/identity/identity-apply-phases.js +244 -0
  228. package/lib/identity/identity-apply-service.js +77 -0
  229. package/lib/identity/identity-csv-parser.js +114 -0
  230. package/lib/infrastructure/admin-secrets-apply.js +84 -0
  231. package/lib/infrastructure/admin-secrets-ensure.js +130 -0
  232. package/lib/infrastructure/admin-secrets-resolve.js +95 -0
  233. package/lib/infrastructure/admin-secrets-sync.js +91 -0
  234. package/lib/infrastructure/helpers.js +23 -129
  235. package/lib/infrastructure/index.js +5 -6
  236. package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
  237. package/lib/internal/fs-real-sync.js +29 -1
  238. package/lib/lifecycle/certification-progress.js +231 -0
  239. package/lib/lifecycle/dataplane-ui-url.js +145 -0
  240. package/lib/lifecycle/exit-codes.js +24 -0
  241. package/lib/lifecycle/json-envelope.js +25 -0
  242. package/lib/lifecycle/lifecycle-governance-options.js +51 -0
  243. package/lib/lifecycle/logger-quiet.js +29 -0
  244. package/lib/lifecycle/open-api-published.js +59 -0
  245. package/lib/lifecycle/operations-readiness-metrics.js +101 -0
  246. package/lib/lifecycle/product-model.js +196 -0
  247. package/lib/lifecycle/report-display.js +471 -0
  248. package/lib/lifecycle/scenario-upload.js +191 -0
  249. package/lib/lifecycle/verify-step-progress.js +87 -0
  250. package/lib/parameters/infra-kv-discovery.js +27 -2
  251. package/lib/protection/auth-context.js +51 -0
  252. package/lib/protection/convert-batch.js +90 -0
  253. package/lib/protection/load.js +41 -0
  254. package/lib/protection/paths.js +158 -0
  255. package/lib/protection/preflight-datasource-ready.js +46 -0
  256. package/lib/protection/protection-create-probe-lines.js +142 -0
  257. package/lib/protection/protection-create-probes.js +95 -0
  258. package/lib/protection/protection-create-scaffold.js +281 -0
  259. package/lib/protection/protection-display-helpers.js +445 -0
  260. package/lib/protection/protection-display.js +215 -0
  261. package/lib/protection/protection-preset-registry.js +97 -0
  262. package/lib/protection/report-exit.js +62 -0
  263. package/lib/protection/resolve.js +202 -0
  264. package/lib/protection/run-commands-validate.js +130 -0
  265. package/lib/protection/run-commands.js +216 -0
  266. package/lib/protection/run-protection-create-helpers.js +134 -0
  267. package/lib/protection/run-protection-create-probes-flow.js +43 -0
  268. package/lib/protection/run-protection-create.js +191 -0
  269. package/lib/protection/scope.js +22 -0
  270. package/lib/protection/sync-after-upload.js +64 -0
  271. package/lib/protection/upload-batch.js +127 -0
  272. package/lib/protection/validate-batch.js +113 -0
  273. package/lib/protection/validate-local.js +65 -0
  274. package/lib/resolvers/dimension-file.js +29 -4
  275. package/lib/schema/application-schema.json +1 -1
  276. package/lib/schema/datasource-test-run.schema.json +89 -6
  277. package/lib/schema/external-datasource.schema.json +2636 -2588
  278. package/lib/schema/external-system.schema.json +1089 -761
  279. package/lib/schema/flag-map-validation-run.json +2 -2
  280. package/lib/schema/infra.parameter.yaml +45 -0
  281. package/lib/schema/protection.schema.json +374 -0
  282. package/lib/schema/type/credential-field-registry.json +642 -0
  283. package/lib/schema/wizard-config.schema.json +1 -1
  284. package/lib/utils/agent-trust-run-display.js +231 -0
  285. package/lib/utils/agent-trust-run-exit.js +59 -0
  286. package/lib/utils/agent-trust-wait-ui.js +94 -0
  287. package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
  288. package/lib/utils/api.js +55 -31
  289. package/lib/utils/app-relative-path-env.js +112 -0
  290. package/lib/utils/cli-exit-codes.js +30 -0
  291. package/lib/utils/cli-secrets-error-format.js +83 -21
  292. package/lib/utils/cli-sync-options.js +33 -0
  293. package/lib/utils/cli-utils.js +16 -4
  294. package/lib/utils/compose-generate-docker-compose.js +4 -0
  295. package/lib/utils/compose-traefik-ingress-base.js +16 -1
  296. package/lib/utils/config-secrets-path.js +46 -0
  297. package/lib/utils/controller-url.js +88 -1
  298. package/lib/utils/credential-push-ui.js +90 -0
  299. package/lib/utils/credential-secrets-env.js +137 -9
  300. package/lib/utils/dataplane-cli-version-gate.js +202 -0
  301. package/lib/utils/dataplane-cli-version-help.js +74 -0
  302. package/lib/utils/dataplane-resolver.js +129 -2
  303. package/lib/utils/datasource-export-display.js +137 -0
  304. package/lib/utils/datasource-load-display.js +174 -0
  305. package/lib/utils/datasource-load-export-ui.js +120 -0
  306. package/lib/utils/datasource-test-run-capability-scope.js +3 -3
  307. package/lib/utils/datasource-test-run-display.js +3 -3
  308. package/lib/utils/datasource-test-run-tty-log.js +5 -1
  309. package/lib/utils/declarative-url-ports.js +3 -3
  310. package/lib/utils/deployment-auth-mode.js +41 -0
  311. package/lib/utils/developer-volume-id.js +33 -0
  312. package/lib/utils/env-copy.js +14 -9
  313. package/lib/utils/env-kv-orphan-lines.js +43 -0
  314. package/lib/utils/error-formatters/network-errors.js +13 -4
  315. package/lib/utils/external-env-template.js +1 -0
  316. package/lib/utils/external-system-readiness-core.js +10 -0
  317. package/lib/utils/external-system-readiness-display.js +80 -23
  318. package/lib/utils/health-check.js +4 -1
  319. package/lib/utils/help-builder.js +35 -26
  320. package/lib/utils/keycloak-realm-ready.js +101 -0
  321. package/lib/utils/load-cip-capacity-display-config.js +61 -15
  322. package/lib/utils/manifest-source-emit.js +24 -0
  323. package/lib/utils/pipeline-upload-auth-retry.js +82 -0
  324. package/lib/utils/platform-controller-url.js +156 -0
  325. package/lib/utils/postgres-platform-bootstrap.js +199 -0
  326. package/lib/utils/postgres-wipe.js +9 -2
  327. package/lib/utils/resolve-env-mode.js +47 -0
  328. package/lib/utils/secrets-generator.js +31 -25
  329. package/lib/utils/secrets-missing-error.js +164 -0
  330. package/lib/utils/semver-compare.js +127 -0
  331. package/lib/utils/service-url-label.js +81 -0
  332. package/lib/utils/setup-quiet-output.js +25 -0
  333. package/lib/utils/template-helpers.js +15 -0
  334. package/lib/utils/token-manager-client-credentials.js +201 -0
  335. package/lib/utils/token-manager-messages.js +8 -0
  336. package/lib/utils/token-manager-refresh.js +12 -2
  337. package/lib/utils/token-manager.js +86 -105
  338. package/lib/utils/upload-pipeline-ui.js +98 -0
  339. package/lib/utils/upload-sync-options.js +42 -0
  340. package/lib/utils/url-declarative-public-base.js +21 -3
  341. package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
  342. package/lib/utils/validation-poll-ui.js +22 -7
  343. package/lib/utils/validation-run-stage.js +45 -0
  344. package/lib/validation/wizard-config-validator.js +58 -19
  345. package/package.json +1 -1
  346. package/templates/applications/dataplane/application.yaml +2 -1
  347. package/templates/applications/dataplane/env.template +36 -1
  348. package/templates/applications/dataplane/rbac.yaml +4 -0
  349. package/templates/applications/miso-controller/env.template +16 -0
  350. package/templates/external-system/README.md.hbs +116 -11
  351. package/templates/python/docker-compose.hbs +19 -18
  352. package/templates/typescript/docker-compose.hbs +18 -17
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @fileoverview Upload publish preflight: auth resolve, CLI gate, target logging.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const chalk = require('chalk');
10
+ const logger = require('../utils/logger');
11
+ const { sectionTitle, headerKeyValue } = require('../utils/cli-test-layout-chalk');
12
+ const { resolveControllerUrl } = require('../utils/controller-url');
13
+ const { requireBearerForDataplanePipeline } = require('../utils/token-manager');
14
+ const { logDataplanePipelineWarning } = require('../utils/dataplane-pipeline-warning');
15
+ const { assertDataplaneCliVersionCompatible } = require('../utils/dataplane-cli-version-gate');
16
+
17
+ const SEP = chalk.gray('────────────────────────────────────────');
18
+
19
+ function logForcePublishWarning() {
20
+ logger.log(
21
+ chalk.yellow(
22
+ 'Warning: --force bypasses active-datasource schema replacement guards on publish. '
23
+ + 'Existing records and ABAC may be inconsistent; run validation/sync after upload.'
24
+ )
25
+ );
26
+ }
27
+
28
+ function logUploadTargetSection(environment, dataplaneUrl) {
29
+ logger.log('');
30
+ logger.log(sectionTitle('Target'));
31
+ logger.log(SEP);
32
+ logger.log(headerKeyValue('Environment:', environment));
33
+ logger.log(headerKeyValue('Dataplane:', dataplaneUrl));
34
+ logDataplanePipelineWarning();
35
+ }
36
+
37
+ /**
38
+ * Resolve dataplane auth and run upload preflight checks.
39
+ * @param {Function} resolveDataplaneAndAuth
40
+ * @param {Function} maybeRunVerboseServerValidation
41
+ * @param {string} systemKey
42
+ * @param {Object} options
43
+ * @param {Object} payload
44
+ * @returns {Promise<{ dataplaneUrl: string, authConfig: Object, environment: string }>}
45
+ */
46
+ async function resolveUploadPublishContext(
47
+ resolveDataplaneAndAuth,
48
+ maybeRunVerboseServerValidation,
49
+ systemKey,
50
+ options,
51
+ payload
52
+ ) {
53
+ const resolved = await resolveDataplaneAndAuth(systemKey, {
54
+ silent: options.silentResolve === true
55
+ });
56
+ requireBearerForDataplanePipeline(resolved.authConfig);
57
+ if (options.force === true) {
58
+ logForcePublishWarning();
59
+ }
60
+ const controllerUrl = await resolveControllerUrl();
61
+ await assertDataplaneCliVersionCompatible(resolved.dataplaneUrl, { controllerUrl });
62
+ if (options.minimal !== true) {
63
+ logUploadTargetSection(resolved.environment, resolved.dataplaneUrl);
64
+ }
65
+ if (options.verbose) {
66
+ await maybeRunVerboseServerValidation(resolved.dataplaneUrl, resolved.authConfig, payload);
67
+ }
68
+ return resolved;
69
+ }
70
+
71
+ module.exports = {
72
+ logForcePublishWarning,
73
+ logUploadTargetSection,
74
+ resolveUploadPublishContext
75
+ };
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @fileoverview Upload sidecar follow-ups (governance packs, certification sync).
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const logger = require('../utils/logger');
10
+ const { formatWarningLine } = require('../utils/cli-test-layout-chalk');
11
+ const { unwrapPublicationResult, isPublicationUnchanged } = require('../utils/external-system-readiness-core');
12
+ const { logUploadReadinessSummary } = require('../utils/external-system-readiness-display');
13
+ const { maybeSyncSystemCertificationFromDataplane } = require('../certification/sync-system-certification');
14
+ const { cliOptsSkipCertSync } = require('../certification/cli-cert-sync-skip');
15
+ const { isQuietMinimalSync } = require('../utils/upload-sync-options');
16
+
17
+ /**
18
+ * Sidecar follow-ups that are independent of pipeline publish hash (scenario packs, cert sync).
19
+ * @param {Object} ctx
20
+ * @returns {Promise<void>}
21
+ */
22
+ async function runUploadSidecarFollowups(ctx) {
23
+ const { systemKey, options, payload, dataplaneUrl, authConfig } = ctx;
24
+ const quietSidecar = isQuietMinimalSync(options);
25
+ const dsKeys = (payload.dataSources || []).map((ds) => ds && ds.key).filter(Boolean);
26
+ try {
27
+ const { uploadGovernanceScenarioPacks } = require('../lifecycle/scenario-upload');
28
+ await uploadGovernanceScenarioPacks(systemKey, dataplaneUrl, authConfig, { silent: quietSidecar });
29
+ } catch (err) {
30
+ if (!quietSidecar) {
31
+ logger.log(formatWarningLine(`Governance scenario upload skipped: ${err.message}`));
32
+ }
33
+ }
34
+ await maybeSyncSystemCertificationFromDataplane({
35
+ label: 'upload',
36
+ noCertSync: cliOptsSkipCertSync(options),
37
+ systemKey,
38
+ dataplaneUrl,
39
+ authConfig,
40
+ datasourceKeys: dsKeys,
41
+ silent: quietSidecar
42
+ });
43
+ }
44
+
45
+ /**
46
+ * @param {Object} ctx
47
+ * @param {Function} maybeRunUploadProbe
48
+ * @returns {Promise<void>}
49
+ */
50
+ async function handlePublicationAndFollowups(ctx, maybeRunUploadProbe) {
51
+ const {
52
+ systemKey,
53
+ options,
54
+ manifest,
55
+ payload,
56
+ environment,
57
+ dataplaneUrl,
58
+ authConfig,
59
+ rawRes
60
+ } = ctx;
61
+ const publication = unwrapPublicationResult(rawRes);
62
+ if (!publication) {
63
+ throw new Error(
64
+ 'Unexpected response from dataplane upload: missing publication result (uploadId/system/datasources).'
65
+ );
66
+ }
67
+ if (isPublicationUnchanged(publication)) {
68
+ await runUploadSidecarFollowups({ systemKey, options, payload, dataplaneUrl, authConfig });
69
+ return;
70
+ }
71
+ logUploadReadinessSummary({
72
+ environment,
73
+ dataplaneUrl,
74
+ systemKey,
75
+ publication,
76
+ manifest,
77
+ minimal: !!options.minimal,
78
+ willProbe: !!options.probe
79
+ });
80
+ if (options.probe) {
81
+ await maybeRunUploadProbe(dataplaneUrl, systemKey, authConfig, options.probeTimeout);
82
+ }
83
+ await runUploadSidecarFollowups({ systemKey, options, payload, dataplaneUrl, authConfig });
84
+ }
85
+
86
+ module.exports = {
87
+ runUploadSidecarFollowups,
88
+ handlePublicationAndFollowups
89
+ };
@@ -21,10 +21,12 @@ const logger = require('../utils/logger');
21
21
 
22
22
  const SEP = chalk.gray('────────────────────────────────────────');
23
23
  const { resolveControllerUrl } = require('../utils/controller-url');
24
- const { getDeploymentAuth, requireBearerForDataplanePipeline } = require('../utils/token-manager');
24
+ const { getDeploymentAuth } = require('../utils/token-manager');
25
25
  const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
26
26
  const { getIntegrationPath } = require('../utils/paths');
27
27
  const { pushCredentialSecrets } = require('../utils/credential-secrets-env');
28
+ const { runWithCredentialPushSpinner } = require('../utils/credential-push-ui');
29
+ const { runWithUploadPipelineSpinner } = require('../utils/upload-pipeline-ui');
28
30
  const {
29
31
  buildResolvedEnvMapForIntegration,
30
32
  resolveConfigurationValues,
@@ -34,21 +36,24 @@ const { validateExternalSystemComplete } = require('../validation/validate');
34
36
  const { displayValidationResults } = require('../validation/validate-display');
35
37
  const { generateControllerManifest } = require('../generator/external-controller-manifest');
36
38
  const {
37
- uploadApplicationViaPipeline,
38
39
  validatePipelineConfig,
39
40
  testSystemViaPipeline
40
41
  } = require('../api/pipeline.api');
42
+ const { uploadApplicationViaPipelineWithAuthRetry } = require('../utils/pipeline-upload-auth-retry');
41
43
  const { formatApiError } = require('../utils/api-error-handler');
42
- const { logDataplanePipelineWarning } = require('../utils/dataplane-pipeline-warning');
43
- const { unwrapPublicationResult, unwrapApiData } = require('../utils/external-system-readiness-core');
44
+ const { unwrapPublicationResult, unwrapApiData, isPublicationUnchanged } = require('../utils/external-system-readiness-core');
44
45
  const {
45
- logUploadReadinessSummary,
46
46
  logServerValidationWarnings,
47
47
  logProbeRuntimeBlock
48
48
  } = require('../utils/external-system-readiness-display');
49
- const { maybeSyncSystemCertificationFromDataplane } = require('../certification/sync-system-certification');
50
- const { cliOptsSkipCertSync } = require('../certification/cli-cert-sync-skip');
51
49
  const { maybeSyncOpenApiFilesForMcp } = require('./repair-openapi-sync');
50
+ const { resolveUploadPublishContext } = require('./upload-publish-context');
51
+ const { syncDeployJsonFromSources } = require('../external-system/sync-deploy-manifest');
52
+ const { isQuietMinimalSync } = require('../utils/upload-sync-options');
53
+ const {
54
+ runUploadSidecarFollowups,
55
+ handlePublicationAndFollowups
56
+ } = require('./upload-sidecar-followups');
52
57
 
53
58
  /**
54
59
  * Validates system-key format (same as download).
@@ -70,13 +75,22 @@ function validateSystemKeyFormat(systemKey) {
70
75
  * @param {Object} manifest - Controller manifest from generateControllerManifest
71
76
  * @returns {Object} { version, application, dataSources, status: "draft" }
72
77
  */
73
- function buildUploadPayload(manifest) {
74
- return {
78
+ /**
79
+ * @param {Object} manifest - Controller manifest from generateControllerManifest
80
+ * @param {{ force?: boolean }} [opts]
81
+ * @returns {Object}
82
+ */
83
+ function buildUploadPayload(manifest, opts = {}) {
84
+ const payload = {
75
85
  version: manifest.version || '1.0.0',
76
86
  application: manifest.system,
77
87
  dataSources: manifest.dataSources || [],
78
88
  status: 'draft'
79
89
  };
90
+ if (opts.force === true) {
91
+ payload.force = true;
92
+ }
93
+ return payload;
80
94
  }
81
95
 
82
96
  /**
@@ -110,11 +124,15 @@ async function resolveDataplaneAndAuth(systemKey, opts = {}) {
110
124
  * @param {Object} payload - { version, application, dataSources, status: "draft" }
111
125
  * @returns {Promise<Object>} Raw API response envelope
112
126
  */
113
- async function runUploadValidatePublish(dataplaneUrl, authConfig, payload) {
114
- const res = await uploadApplicationViaPipeline(dataplaneUrl, authConfig, payload);
127
+ async function runUploadValidatePublish(dataplaneUrl, authConfig, payload, systemKey) {
128
+ const res = await uploadApplicationViaPipelineWithAuthRetry(
129
+ dataplaneUrl,
130
+ authConfig,
131
+ payload,
132
+ systemKey
133
+ );
115
134
  if (res?.success === false) {
116
- const msg = formatApiError(res, dataplaneUrl);
117
- throw new Error(msg);
135
+ throw new Error(formatApiError(res, dataplaneUrl));
118
136
  }
119
137
  return res;
120
138
  }
@@ -170,13 +188,17 @@ async function resolvePayloadConfiguration(systemKey, payload) {
170
188
  * @param {string} systemKey - System key
171
189
  * @param {Object} payload - Upload payload
172
190
  */
173
- async function pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload) {
191
+ async function pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload, uiOpts = {}) {
174
192
  const envFilePath = path.join(getIntegrationPath(systemKey), '.env');
175
- const pushResult = await pushCredentialSecrets(dataplaneUrl, authConfig, {
176
- envFilePath,
177
- appName: systemKey,
178
- payload
179
- });
193
+ const pushResult = await runWithCredentialPushSpinner(
194
+ () =>
195
+ pushCredentialSecrets(dataplaneUrl, authConfig, {
196
+ envFilePath,
197
+ appName: systemKey,
198
+ payload
199
+ }),
200
+ { systemKey, json: uiOpts.json === true }
201
+ );
180
202
  if (pushResult.pushed > 0) {
181
203
  const keyList = pushResult.keys?.length ? ` (${pushResult.keys.join(', ')})` : '';
182
204
  logger.log(
@@ -262,18 +284,22 @@ async function maybeRunUploadProbe(dataplaneUrl, systemKey, authConfig, probeTim
262
284
 
263
285
  /**
264
286
  * Local validation, manifest, payload, and configuration resolution.
265
- * Does not write *-deploy.json; run `aifabrix json <systemKey>` to regenerate the deployment manifest from sources.
287
+ * Regenerates integration/<systemKey>/<systemKey>-deploy.json from sources (same as `aifabrix json`).
266
288
  *
267
289
  * @param {string} systemKey
268
290
  * @param {{ dryRun?: boolean }} [_opts] - Reserved for callers (e.g. dry-run); manifest is always built from current disk files
269
291
  * @returns {Promise<{ manifest: Object, payload: Object }>}
270
292
  */
271
- async function buildValidatedUploadManifestPayload(systemKey, _opts = {}) {
293
+ async function buildValidatedUploadManifestPayload(systemKey, opts = {}) {
294
+ const quiet = opts.minimal === true || opts.quiet === true;
272
295
  const validationResult = await validateExternalSystemComplete(systemKey, { type: 'external' });
273
296
  throwIfValidationFailed(validationResult);
274
- logger.log(formatSuccessLine('Local validation passed'));
297
+ if (!quiet) {
298
+ logger.log(formatSuccessLine('Local validation passed'));
299
+ }
300
+ await syncDeployJsonFromSources(systemKey, { quiet });
275
301
  const manifest = await generateControllerManifest(systemKey, { type: 'external' });
276
- const payload = buildUploadPayload(manifest);
302
+ const payload = buildUploadPayload(manifest, { force: opts.force === true });
277
303
  await resolvePayloadConfiguration(systemKey, payload);
278
304
  return { manifest, payload };
279
305
  }
@@ -304,58 +330,6 @@ async function logAndSyncLocalOpenApiForUpload(systemKey, manifest) {
304
330
  }
305
331
  }
306
332
 
307
- /**
308
- * @param {Object} ctx
309
- * @param {string} ctx.systemKey
310
- * @param {Object} ctx.options
311
- * @param {Object} ctx.manifest
312
- * @param {Object} ctx.payload
313
- * @param {string} ctx.environment
314
- * @param {string} ctx.dataplaneUrl
315
- * @param {Object} ctx.authConfig
316
- * @param {Object} ctx.rawRes
317
- * @returns {Promise<void>}
318
- */
319
- async function handlePublicationAndFollowups(ctx) {
320
- const {
321
- systemKey,
322
- options,
323
- manifest,
324
- payload,
325
- environment,
326
- dataplaneUrl,
327
- authConfig,
328
- rawRes
329
- } = ctx;
330
- const publication = unwrapPublicationResult(rawRes);
331
- if (!publication) {
332
- throw new Error(
333
- 'Unexpected response from dataplane upload: missing publication result (uploadId/system/datasources).'
334
- );
335
- }
336
- logUploadReadinessSummary({
337
- environment,
338
- dataplaneUrl,
339
- systemKey,
340
- publication,
341
- manifest,
342
- minimal: !!options.minimal,
343
- willProbe: !!options.probe
344
- });
345
- if (options.probe) {
346
- await maybeRunUploadProbe(dataplaneUrl, systemKey, authConfig, options.probeTimeout);
347
- }
348
- const dsKeys = (payload.dataSources || []).map((ds) => ds && ds.key).filter(Boolean);
349
- await maybeSyncSystemCertificationFromDataplane({
350
- label: 'upload',
351
- noCertSync: cliOptsSkipCertSync(options),
352
- systemKey,
353
- dataplaneUrl,
354
- authConfig,
355
- datasourceKeys: dsKeys
356
- });
357
- }
358
-
359
333
  /**
360
334
  * Upload path after dry-run check.
361
335
  * @param {string} systemKey
@@ -364,31 +338,55 @@ async function handlePublicationAndFollowups(ctx) {
364
338
  * @param {Object} payload
365
339
  */
366
340
  async function runUploadPublishAndSummary(systemKey, options, manifest, payload) {
367
- const { dataplaneUrl, authConfig, environment } = await resolveDataplaneAndAuth(systemKey);
368
- requireBearerForDataplanePipeline(authConfig);
369
- logger.log('');
370
- logger.log(sectionTitle('Target'));
371
- logger.log(SEP);
372
- logger.log(headerKeyValue('Environment:', environment));
373
- logger.log(headerKeyValue('Dataplane:', dataplaneUrl));
374
- logDataplanePipelineWarning();
375
- if (options.verbose) {
376
- await maybeRunVerboseServerValidation(dataplaneUrl, authConfig, payload);
377
- }
378
- await pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload);
379
-
380
- const rawRes = await runUploadValidatePublish(dataplaneUrl, authConfig, payload);
381
- await logAndSyncLocalOpenApiForUpload(systemKey, manifest);
382
- await handlePublicationAndFollowups({
341
+ const { dataplaneUrl, authConfig, environment } = await resolveUploadPublishContext(
342
+ resolveDataplaneAndAuth,
343
+ maybeRunVerboseServerValidation,
383
344
  systemKey,
384
345
  options,
385
- manifest,
386
- payload,
387
- environment,
388
- dataplaneUrl,
389
- authConfig,
390
- rawRes
346
+ payload
347
+ );
348
+ const rawRes = await runWithUploadPipelineSpinner(
349
+ async() => runUploadValidatePublish(dataplaneUrl, authConfig, payload, systemKey),
350
+ {
351
+ systemKey,
352
+ json: options.json === true,
353
+ syncMode: options.syncMode === true,
354
+ suppressPipelineSpinner: options.suppressPipelineSpinner === true
355
+ }
356
+ );
357
+ const publication = unwrapPublicationResult(rawRes);
358
+ if (isPublicationUnchanged(publication)) {
359
+ if (!isQuietMinimalSync(options)) {
360
+ logger.log(formatSuccessLine('Config unchanged on dataplane — upload skipped.'));
361
+ }
362
+ await runUploadSidecarFollowups({
363
+ systemKey,
364
+ options,
365
+ payload,
366
+ dataplaneUrl,
367
+ authConfig
368
+ });
369
+ return { dataplaneUrl, authConfig, environment, uploadSkipped: true };
370
+ }
371
+
372
+ await pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload, {
373
+ json: options.json === true
391
374
  });
375
+ await logAndSyncLocalOpenApiForUpload(systemKey, manifest);
376
+ await handlePublicationAndFollowups(
377
+ {
378
+ systemKey,
379
+ options,
380
+ manifest,
381
+ payload,
382
+ environment,
383
+ dataplaneUrl,
384
+ authConfig,
385
+ rawRes
386
+ },
387
+ maybeRunUploadProbe
388
+ );
389
+ return { dataplaneUrl, authConfig, environment, uploadSkipped: false };
392
390
  }
393
391
 
394
392
  /**
@@ -400,26 +398,31 @@ async function runUploadPublishAndSummary(systemKey, options, manifest, payload)
400
398
  * @param {boolean} [options.probe] - POST validation/run after publish
401
399
  * @param {number} [options.probeTimeout] - Probe timeout ms (default 120000)
402
400
  * @param {boolean} [options.minimal] - Short summary only
403
- * @returns {Promise<void>}
401
+ * @returns {Promise<{ dataplaneUrl: string, authConfig: Object, environment: string }|void>}
404
402
  * @throws {Error} If validation or API calls fail
405
403
  */
406
404
  async function uploadExternalSystem(systemKey, options = {}) {
407
405
  validateSystemKeyFormat(systemKey);
408
- logger.log('');
409
- logger.log(sectionTitle('Upload external system'));
410
- logger.log(SEP);
411
- logger.log(headerKeyValue('System:', systemKey));
406
+ const minimal = options.minimal === true;
407
+ if (!minimal) {
408
+ logger.log('');
409
+ logger.log(sectionTitle('Upload external system'));
410
+ logger.log(SEP);
411
+ logger.log(headerKeyValue('System:', systemKey));
412
+ }
412
413
  const { manifest, payload } = await buildValidatedUploadManifestPayload(systemKey, {
413
- dryRun: !!options.dryRun
414
+ dryRun: !!options.dryRun,
415
+ force: options.force === true,
416
+ minimal
414
417
  });
415
418
  if (options.dryRun) {
416
419
  logger.log(chalk.yellow('Dry run: would upload payload (no API calls).'));
417
420
  logger.log(
418
421
  chalk.gray(` System: ${manifest.key}, version: ${payload.version}, datasources: ${payload.dataSources.length}`)
419
422
  );
420
- return;
423
+ return undefined;
421
424
  }
422
- await runUploadPublishAndSummary(systemKey, options, manifest, payload);
425
+ return runUploadPublishAndSummary(systemKey, options, manifest, payload);
423
426
  }
424
427
 
425
428
  module.exports = {
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @fileoverview verify-governance — sync, generate, verify (424.0 dataplane-first).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const { runGovernanceGenerateForExternalSystem } = require('./governance-generate-external');
8
+ const { runVerifyGovernanceForExternalSystem } = require('./verify-governance-external');
9
+ const {
10
+ buildSubjectsFromOptions,
11
+ resolveGovernanceIntegrationContext
12
+ } = require('./governance-cli-shared');
13
+
14
+ /**
15
+ * @async
16
+ * @param {string} systemKey
17
+ * @param {Object} options
18
+ * @returns {Promise<Object>}
19
+ */
20
+ async function runVerifyGovernanceCombined(systemKey, options = {}) {
21
+ if (options.pack) {
22
+ return runVerifyGovernanceForExternalSystem(systemKey, options);
23
+ }
24
+
25
+ const subjects = buildSubjectsFromOptions(options);
26
+ if (subjects.length === 0) {
27
+ throw new Error(
28
+ 'At least one --subject-user-id or --subject-email is required for verify-governance'
29
+ );
30
+ }
31
+
32
+ const { resolvedKey, authConfig, dataplaneUrl } = await resolveGovernanceIntegrationContext(
33
+ systemKey,
34
+ options
35
+ );
36
+
37
+ const pipelineOpts = {
38
+ ...options,
39
+ noSync: true,
40
+ authConfig,
41
+ dataplaneUrl
42
+ };
43
+
44
+ const generateResult = await runGovernanceGenerateForExternalSystem(
45
+ resolvedKey,
46
+ pipelineOpts
47
+ );
48
+
49
+ const verifyResult = await runVerifyGovernanceForExternalSystem(resolvedKey, pipelineOpts);
50
+
51
+ return {
52
+ ...verifyResult,
53
+ command: 'verify-governance',
54
+ generated: generateResult.generated,
55
+ generateResults: generateResult.results
56
+ };
57
+ }
58
+
59
+ module.exports = {
60
+ runVerifyGovernanceCombined
61
+ };
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @fileoverview CLI action for `aifabrix verify-governance` (plan 150.0 / 424.0).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const logger = require('../utils/logger');
8
+ const { handleCommandError } = require('../utils/cli-utils');
9
+ const { runVerifyGovernanceCombined } = require('./verify-governance-combined-external');
10
+ const { normalizeTestGovernanceCliOptions } = require('./test-governance-cli-options');
11
+ const { displayVerifyGovernanceTTY } = require('../lifecycle/report-display');
12
+ const { exitCodeFromVerdict } = require('../lifecycle/exit-codes');
13
+ const { buildJsonEnvelope } = require('../lifecycle/json-envelope');
14
+ const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
15
+
16
+ /**
17
+ * @param {Object} options
18
+ * @param {import('commander').Command} [cmd]
19
+ * @returns {Object}
20
+ */
21
+ function normalizeVerifyGovernanceCliOptions(options, cmd) {
22
+ const base = normalizeTestGovernanceCliOptions(options, cmd);
23
+ return {
24
+ ...base,
25
+ certificationProfile: options.certificationProfile || 'bronze',
26
+ subjectUserIds: options.subjectUserId || [],
27
+ subjectEmails: options.subjectEmail || [],
28
+ maxSamplesPerPartition: options.maxSamplesPerPartition
29
+ };
30
+ }
31
+
32
+ async function runVerifyGovernanceCommandAction(appName, options, cmd) {
33
+ const opts = normalizeVerifyGovernanceCliOptions(options, cmd);
34
+ const result = await runVerifyGovernanceCombined(appName, opts);
35
+
36
+ if (opts.json) {
37
+ logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
38
+ } else {
39
+ if (opts.verbose && !opts.pack && typeof result.generated === 'number' && result.generated > 0) {
40
+ logger.log(formatSuccessLine(`Generated packs for ${result.generated} datasource(s)`));
41
+ }
42
+ displayVerifyGovernanceTTY(result.systemKey, result, { details: opts.verbose });
43
+ }
44
+
45
+ const exitCode = exitCodeFromVerdict(result.verdict);
46
+ if (exitCode !== 0) {
47
+ process.exit(exitCode);
48
+ }
49
+ }
50
+
51
+ async function verifyGovernanceCommandHandler(appName, options, cmd) {
52
+ try {
53
+ await runVerifyGovernanceCommandAction(appName, options, cmd);
54
+ } catch (error) {
55
+ handleCommandError(error, 'verify-governance');
56
+ process.exit(3);
57
+ }
58
+ }
59
+
60
+ module.exports = {
61
+ runVerifyGovernanceCommandAction,
62
+ verifyGovernanceCommandHandler,
63
+ normalizeVerifyGovernanceCliOptions
64
+ };