@aifabrix/builder 2.45.5 → 2.47.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 (355) 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/project-rules.mdc +1 -0
  4. package/.npmrc.token +1 -0
  5. package/.temp/jest-protection-convert/run-IFN2nv/.protection/hubspot-companies.json +1 -0
  6. package/.temp/jest-protection-convert/run-IvmKLO/.protection/hubspot-companies.yaml +17 -0
  7. package/.temp/jest-protection-convert/run-SdvblF/.protection/hubspot-companies.json +1 -0
  8. package/.temp/jest-protection-convert/run-b51TsW/.protection/hubspot-companies.json +1 -0
  9. package/.temp/jest-protection-convert/run-fiLmb1/.protection/hubspot-companies.json +1 -0
  10. package/.temp/jest-protection-convert/run-qYGHMU/.protection/hubspot-companies.yaml +17 -0
  11. package/.temp/jest-protection-fixtures/hubspot-Mq5re8/hubspot-companies.yaml +17 -0
  12. package/.temp/jest-protection-fixtures/hubspot-f3u4YL/hubspot-companies.yaml +17 -0
  13. package/.temp/jest-protection-fixtures/hubspot-iQtd1O/hubspot-companies.yaml +17 -0
  14. package/.temp/jest-protection-fixtures/hubspot-mdmz5M/hubspot-companies.yaml +17 -0
  15. package/.temp/jest-protection-fixtures/hubspot-qbKYxQ/hubspot-companies.yaml +17 -0
  16. package/.temp/jest-protection-fixtures/hubspot-yzlJy6/hubspot-companies.yaml +17 -0
  17. package/.temp/validation/summary.txt +5 -0
  18. package/README.md +43 -17
  19. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
  20. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
  21. package/jest.config.default.js +2 -1
  22. package/jest.config.isolated.js +2 -1
  23. package/jest.global-live-fabrix-hooks.js +36 -0
  24. package/jest.isolated-projects.js +146 -0
  25. package/jest.projects.js +65 -136
  26. package/lib/api/api-response-errors.js +124 -0
  27. package/lib/api/dataplane-health.api.js +19 -7
  28. package/lib/api/governance-scenario-pack.api.js +159 -0
  29. package/lib/api/index.js +43 -3
  30. package/lib/api/lifecycle.api.js +98 -0
  31. package/lib/api/pipeline.api.js +3 -1
  32. package/lib/api/records-bulk.api.js +14 -1
  33. package/lib/api/resource-types.api.js +107 -0
  34. package/lib/api/runtime-configuration.api.js +72 -0
  35. package/lib/api/types/resource-types.types.js +45 -0
  36. package/lib/api/user-groups.api.js +9 -9
  37. package/lib/api/users.api.js +8 -8
  38. package/lib/api/validation-runner.js +3 -1
  39. package/lib/api/wizard.api.js +10 -2
  40. package/lib/app/deploy-config.js +4 -1
  41. package/lib/app/down.js +78 -27
  42. package/lib/app/index.js +2 -2
  43. package/lib/app/push.js +4 -5
  44. package/lib/app/register.js +7 -4
  45. package/lib/app/run-env-compose.js +84 -30
  46. package/lib/app/run-resolve-image.js +2 -1
  47. package/lib/app/run-stop-containers.js +113 -0
  48. package/lib/app/run.js +1 -31
  49. package/lib/app/show-display.js +35 -0
  50. package/lib/app/show.js +32 -1
  51. package/lib/build/index.js +22 -5
  52. package/lib/build/miso-controller-npm-sdk-guard.js +25 -0
  53. package/lib/certification/sync-system-certification.js +13 -6
  54. package/lib/channels/add-channel.js +348 -0
  55. package/lib/channels/channel-artifact-generator.js +141 -0
  56. package/lib/channels/channel-audit.js +101 -0
  57. package/lib/channels/channel-auth-context.js +37 -0
  58. package/lib/channels/channel-credential.js +200 -0
  59. package/lib/channels/channel-display-name.js +64 -0
  60. package/lib/channels/channel-external-system.js +106 -0
  61. package/lib/channels/channel-integration-generator.js +274 -0
  62. package/lib/channels/channel-probe.js +89 -0
  63. package/lib/channels/channel-runtime-resolver.js +152 -0
  64. package/lib/channels/channel-status-display.js +141 -0
  65. package/lib/channels/channel-targets.js +115 -0
  66. package/lib/cli/index.js +20 -4
  67. package/lib/cli/infra-guided-auth.js +109 -0
  68. package/lib/cli/infra-guided.js +84 -81
  69. package/lib/cli/setup-app.help.js +0 -31
  70. package/lib/cli/setup-app.js +82 -5
  71. package/lib/cli/setup-app.test-commands.js +5 -57
  72. package/lib/cli/setup-auth.js +25 -0
  73. package/lib/cli/setup-certification-commands.js +147 -0
  74. package/lib/cli/setup-certification.help.js +141 -0
  75. package/lib/cli/setup-environment.js +19 -2
  76. package/lib/cli/setup-external-system-help.js +62 -0
  77. package/lib/cli/setup-external-system.js +25 -3
  78. package/lib/cli/setup-infra-up-dataplane-action.js +2 -2
  79. package/lib/cli/setup-infra-up-platform-action.js +2 -1
  80. package/lib/cli/setup-infra.js +9 -1
  81. package/lib/cli/setup-platform.js +6 -1
  82. package/lib/cli/setup-secrets.js +33 -1
  83. package/lib/cli/setup-utility-help-after.js +25 -2
  84. package/lib/cli/setup-utility-repair.js +198 -0
  85. package/lib/cli/setup-utility-resolve.js +44 -5
  86. package/lib/cli/setup-utility-validate.js +197 -0
  87. package/lib/cli/setup-utility.js +4 -239
  88. package/lib/commands/app-logs.js +54 -26
  89. package/lib/commands/app.js +41 -0
  90. package/lib/commands/auth-status-client-tokens.js +214 -0
  91. package/lib/commands/auth-status-dataplane-version.js +142 -68
  92. package/lib/commands/auth-status.js +43 -54
  93. package/lib/commands/channel.js +58 -0
  94. package/lib/commands/datasource-test-trust-cli.js +27 -23
  95. package/lib/commands/datasource-unified-test-cli.js +6 -3
  96. package/lib/commands/datasource-unified-test-cli.options.js +5 -1
  97. package/lib/commands/datasource.js +8 -8
  98. package/lib/commands/dev-show-display.js +8 -1
  99. package/lib/commands/governance-cli-shared.js +94 -0
  100. package/lib/commands/governance-command-action.js +132 -0
  101. package/lib/commands/governance-download-external.js +34 -0
  102. package/lib/commands/governance-generate-external.js +71 -0
  103. package/lib/commands/governance-upload-external.js +36 -0
  104. package/lib/commands/governance-verify-external.js +64 -0
  105. package/lib/commands/governance.js +144 -0
  106. package/lib/commands/identity-apply-sync.js +49 -8
  107. package/lib/commands/identity-group-cli.js +66 -26
  108. package/lib/commands/identity-membership-role-cache.js +58 -37
  109. package/lib/commands/identity-shared.js +22 -1
  110. package/lib/commands/identity-user-cli.js +80 -34
  111. package/lib/commands/lifecycle-command-action.js +123 -0
  112. package/lib/commands/lifecycle-external.js +268 -0
  113. package/lib/commands/login.js +11 -2
  114. package/lib/commands/repair-auth-apply.js +153 -0
  115. package/lib/commands/repair-auth-config.js +8 -13
  116. package/lib/commands/repair-changed-files.js +41 -0
  117. package/lib/commands/repair-datasource-com-v2.js +15 -0
  118. package/lib/commands/repair-datasource-keys.js +4 -1
  119. package/lib/commands/repair-datasource-run.js +59 -0
  120. package/lib/commands/repair-datasource-service-contract.js +206 -0
  121. package/lib/commands/repair-datasource-test-payload.js +259 -0
  122. package/lib/commands/repair-datasource.js +49 -64
  123. package/lib/commands/repair-env-template.js +76 -25
  124. package/lib/commands/repair-external-run.js +216 -0
  125. package/lib/commands/repair-openapi-sync.js +49 -4
  126. package/lib/commands/repair-persist.js +4 -0
  127. package/lib/commands/repair-rbac.js +52 -1
  128. package/lib/commands/repair-steps.js +160 -0
  129. package/lib/commands/repair-system-alignment.js +7 -4
  130. package/lib/commands/repair.js +29 -296
  131. package/lib/commands/resource-type.js +371 -0
  132. package/lib/commands/secrets-get.js +184 -0
  133. package/lib/commands/secrets-remove-all.js +3 -1
  134. package/lib/commands/setup-image-refresh.js +146 -0
  135. package/lib/commands/setup-modes.js +158 -162
  136. package/lib/commands/setup-platform-auth.js +76 -0
  137. package/lib/commands/setup-prompts-admin.js +244 -0
  138. package/lib/commands/setup-prompts-platform-mode.js +70 -0
  139. package/lib/commands/setup-prompts-validators.js +36 -0
  140. package/lib/commands/setup-prompts.js +24 -76
  141. package/lib/commands/setup-run-context.js +45 -0
  142. package/lib/commands/setup-spinners.js +39 -0
  143. package/lib/commands/setup.js +27 -5
  144. package/lib/commands/teardown.js +39 -0
  145. package/lib/commands/test-e2e-external.js +24 -8
  146. package/lib/commands/test-governance-external.js +3 -24
  147. package/lib/commands/test-trust-external.js +48 -100
  148. package/lib/commands/up-common.js +57 -13
  149. package/lib/commands/up-dataplane.js +56 -15
  150. package/lib/commands/upload-publish-context.js +75 -0
  151. package/lib/commands/upload-sidecar-followups.js +89 -0
  152. package/lib/commands/upload.js +113 -110
  153. package/lib/commands/verify-governance-combined-external.js +61 -0
  154. package/lib/commands/verify-governance-command-action.js +64 -0
  155. package/lib/commands/verify-governance-db.js +102 -0
  156. package/lib/commands/verify-governance-external.js +77 -0
  157. package/lib/commands/verify-governance-result-builders.js +71 -0
  158. package/lib/commands/verify-operations-command-action.js +68 -0
  159. package/lib/commands/verify-operations-external.js +268 -0
  160. package/lib/commands/verify-operations-persist.js +75 -0
  161. package/lib/commands/verify-operations-step-plan.js +68 -0
  162. package/lib/commands/verify-operations-steps.js +111 -0
  163. package/lib/commands/verify-trust-command-action.js +73 -0
  164. package/lib/commands/verify-trust-external.js +59 -0
  165. package/lib/commands/wizard-config-normalizer.js +43 -23
  166. package/lib/commands/wizard-core.js +2 -0
  167. package/lib/core/admin-password-generator.js +38 -0
  168. package/lib/core/admin-secrets-bundle.js +111 -0
  169. package/lib/core/admin-secrets-env-overlay.js +62 -0
  170. package/lib/core/admin-secrets.js +32 -4
  171. package/lib/core/config-attach-extensions.js +3 -0
  172. package/lib/core/config-platform-controller.js +44 -0
  173. package/lib/core/config-setup-installation-profile.js +42 -0
  174. package/lib/core/config-setup-platform-mode.js +46 -0
  175. package/lib/core/config.js +46 -36
  176. package/lib/core/secrets-admin-env.js +6 -2
  177. package/lib/core/secrets-ensure.js +4 -0
  178. package/lib/core/secrets-env-content.js +54 -48
  179. package/lib/core/secrets-env-write.js +10 -1
  180. package/lib/core/secrets-infra-placeholder-sync.js +2 -0
  181. package/lib/core/setup-installation-profile.js +43 -0
  182. package/lib/core/setup-platform-mode.js +90 -0
  183. package/lib/datasource/agent-trust-debug-log.js +1 -1
  184. package/lib/datasource/agent-trust-run.js +5 -3
  185. package/lib/datasource/audit-evidence-extract-debug.js +30 -18
  186. package/lib/datasource/audit-evidence-extract.js +7 -4
  187. package/lib/datasource/audit-evidence-verify-matrix.js +54 -26
  188. package/lib/datasource/bulk-loader-run-batches.js +15 -3
  189. package/lib/datasource/capability/capability-diff-slice.js +2 -2
  190. package/lib/datasource/capability/capability-manifest.js +254 -0
  191. package/lib/datasource/capability/capability-resolve.js +3 -4
  192. package/lib/datasource/capability/copy-operations.js +5 -3
  193. package/lib/datasource/capability/remove-operations.js +2 -1
  194. package/lib/datasource/capability/run-capability-copy.js +32 -4
  195. package/lib/datasource/capability/run-capability-diff.js +3 -3
  196. package/lib/datasource/capability/run-capability-dimension.js +2 -4
  197. package/lib/datasource/capability/run-capability-edit.js +4 -7
  198. package/lib/datasource/capability/run-capability-relate.js +2 -4
  199. package/lib/datasource/capability/run-capability-remove.js +2 -4
  200. package/lib/datasource/capability/validate-capability-slice.js +2 -1
  201. package/lib/datasource/datasource-identifier.js +2 -1
  202. package/lib/datasource/datasource-load-export-context.js +3 -0
  203. package/lib/datasource/datasource-validate-display.js +1 -1
  204. package/lib/datasource/field-reference-validator.js +24 -3
  205. package/lib/datasource/log-cleaner.js +2 -2
  206. package/lib/datasource/log-viewer.js +8 -8
  207. package/lib/datasource/orphan-profiles-validator.js +98 -0
  208. package/lib/datasource/test-e2e.js +4 -1
  209. package/lib/datasource/unified-validation-run-body.js +3 -1
  210. package/lib/datasource/unified-validation-run.js +5 -2
  211. package/lib/datasource/validate.js +41 -23
  212. package/lib/deployment/environment-poll-status.js +138 -0
  213. package/lib/deployment/environment.js +42 -34
  214. package/lib/external-system/download-helpers.js +87 -0
  215. package/lib/external-system/download.js +78 -138
  216. package/lib/external-system/generator.js +1 -55
  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.js +16 -21
  220. package/lib/generator/builders.js +11 -1
  221. package/lib/generator/external-controller-manifest.js +18 -0
  222. package/lib/generator/split.js +3 -1
  223. package/lib/generator/wizard.js +1 -28
  224. package/lib/governance/governance-cli-errors.js +96 -0
  225. package/lib/governance/governance-download-display.js +38 -0
  226. package/lib/governance/governance-run-display.js +215 -25
  227. package/lib/identity/fk-reference.js +65 -0
  228. package/lib/identity/identity-apply-core.js +13 -58
  229. package/lib/identity/identity-apply-phases.js +5 -1
  230. package/lib/identity/identity-display.js +243 -0
  231. package/lib/identity/identity-response-helpers.js +52 -0
  232. package/lib/identity/identity-sync-errors.js +62 -0
  233. package/lib/identity/resolve-user-id.js +129 -0
  234. package/lib/identity/username-default.js +31 -0
  235. package/lib/infrastructure/admin-secrets-apply.js +84 -0
  236. package/lib/infrastructure/admin-secrets-ensure.js +130 -0
  237. package/lib/infrastructure/admin-secrets-resolve.js +95 -0
  238. package/lib/infrastructure/admin-secrets-sync.js +91 -0
  239. package/lib/infrastructure/helpers.js +23 -129
  240. package/lib/infrastructure/index.js +5 -6
  241. package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
  242. package/lib/lifecycle/certification-progress.js +231 -0
  243. package/lib/lifecycle/dataplane-ui-url.js +145 -0
  244. package/lib/lifecycle/exit-codes.js +24 -0
  245. package/lib/lifecycle/json-envelope.js +25 -0
  246. package/lib/lifecycle/lifecycle-governance-options.js +51 -0
  247. package/lib/lifecycle/logger-quiet.js +29 -0
  248. package/lib/lifecycle/open-api-published.js +59 -0
  249. package/lib/lifecycle/operations-readiness-metrics.js +101 -0
  250. package/lib/lifecycle/product-model.js +196 -0
  251. package/lib/lifecycle/report-display-trust.js +70 -0
  252. package/lib/lifecycle/report-display.js +472 -0
  253. package/lib/lifecycle/scenario-upload.js +191 -0
  254. package/lib/lifecycle/verify-step-progress.js +87 -0
  255. package/lib/parameters/infra-kv-discovery.js +27 -2
  256. package/lib/protection/auth-context.js +10 -4
  257. package/lib/resolvers/datasource-resolver.js +2 -3
  258. package/lib/resolvers/resource-type-file.js +159 -0
  259. package/lib/schema/application-schema.json +17 -1
  260. package/lib/schema/datasource-test-run.schema.json +89 -6
  261. package/lib/schema/deployment-rules.yaml +2 -1
  262. package/lib/schema/external-datasource.schema.json +2947 -2619
  263. package/lib/schema/external-system.schema.json +1418 -761
  264. package/lib/schema/infra.parameter.yaml +45 -0
  265. package/lib/schema/type/credential-field-registry.json +103 -97
  266. package/lib/schema/type/document-storage.json +9 -5
  267. package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
  268. package/lib/utils/api.js +55 -31
  269. package/lib/utils/app-relative-path-env.js +112 -0
  270. package/lib/utils/app-run-containers.js +25 -2
  271. package/lib/utils/authentication-shape.js +224 -0
  272. package/lib/utils/build-copy.js +36 -5
  273. package/lib/utils/build-resolve-image.js +66 -12
  274. package/lib/utils/celery-companion-apps.js +53 -0
  275. package/lib/utils/cli-secrets-error-format.js +83 -21
  276. package/lib/utils/cli-utils.js +20 -4
  277. package/lib/utils/compose-celery-worker.js +23 -0
  278. package/lib/utils/compose-generate-docker-compose.js +13 -1
  279. package/lib/utils/compose-traefik-ingress-base.js +16 -1
  280. package/lib/utils/config-secrets-path.js +46 -0
  281. package/lib/utils/configuration-env-resolver.js +36 -0
  282. package/lib/utils/controller-url.js +88 -1
  283. package/lib/utils/credential-secrets-env-kv.js +216 -0
  284. package/lib/utils/credential-secrets-env.js +175 -257
  285. package/lib/utils/dataplane-resolver.js +18 -2
  286. package/lib/utils/declarative-url-ports.js +27 -4
  287. package/lib/utils/deployment-auth-mode.js +41 -0
  288. package/lib/utils/developer-volume-id.js +33 -0
  289. package/lib/utils/docker-build.js +1 -4
  290. package/lib/utils/env-copy.js +14 -9
  291. package/lib/utils/env-kv-orphan-lines.js +43 -0
  292. package/lib/utils/error-formatters/network-errors.js +13 -4
  293. package/lib/utils/external-env-template.js +11 -3
  294. package/lib/utils/external-system-readiness-core.js +10 -0
  295. package/lib/utils/external-system-readiness-display.js +80 -23
  296. package/lib/utils/external-system-validators.js +8 -2
  297. package/lib/utils/health-check.js +4 -1
  298. package/lib/utils/help-builder.js +13 -8
  299. package/lib/utils/keycloak-realm-ready.js +101 -0
  300. package/lib/utils/load-cip-capacity-display-config.js +61 -15
  301. package/lib/utils/manifest-source-emit.js +2 -0
  302. package/lib/utils/paths.js +25 -0
  303. package/lib/utils/pipeline-upload-auth-retry.js +82 -0
  304. package/lib/utils/platform-controller-url.js +157 -0
  305. package/lib/utils/platform-kv-ref.js +57 -0
  306. package/lib/utils/postgres-platform-bootstrap.js +199 -0
  307. package/lib/utils/postgres-wipe.js +9 -2
  308. package/lib/utils/resolve-env-mode.js +47 -0
  309. package/lib/utils/runtime-configuration-download.js +189 -0
  310. package/lib/utils/runtime-configuration-values.js +119 -0
  311. package/lib/utils/schema-loader.js +19 -4
  312. package/lib/utils/secrets-generator.js +31 -25
  313. package/lib/utils/secrets-missing-error.js +164 -0
  314. package/lib/utils/service-url-label.js +81 -0
  315. package/lib/utils/setup-quiet-output.js +25 -0
  316. package/lib/utils/template-helpers.js +15 -0
  317. package/lib/utils/token-manager-client-credentials.js +201 -0
  318. package/lib/utils/token-manager-messages.js +8 -0
  319. package/lib/utils/token-manager-refresh.js +12 -2
  320. package/lib/utils/token-manager.js +86 -105
  321. package/lib/utils/upload-pipeline-ui.js +12 -5
  322. package/lib/utils/upload-sync-options.js +42 -0
  323. package/lib/utils/url-declarative-public-base.js +21 -3
  324. package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
  325. package/lib/utils/validation-poll-ui.js +8 -0
  326. package/lib/utils/validation-run-stage.js +45 -0
  327. package/lib/utils/worker-sidecars.js +142 -0
  328. package/lib/validation/external-manifest-validator.js +2 -0
  329. package/lib/validation/runtime-configuration-rules.js +98 -0
  330. package/lib/validation/validate-display-dimensions.js +154 -0
  331. package/lib/validation/validate-display-sections.js +276 -0
  332. package/lib/validation/validate-display-steps.js +67 -0
  333. package/lib/validation/validate-display.js +24 -402
  334. package/package.json +1 -1
  335. package/templates/applications/dataplane/application.yaml +7 -1
  336. package/templates/applications/dataplane/env.template +50 -14
  337. package/templates/applications/dataplane/rbac.yaml +108 -1
  338. package/templates/applications/miso-controller/application.yaml +2 -2
  339. package/templates/applications/miso-controller/env.template +53 -122
  340. package/templates/applications/miso-controller/rbac.yaml +28 -13
  341. package/templates/channels/chatgpt/install.template.md.hbs +49 -0
  342. package/templates/channels/chatgpt/manifest.template.json.hbs +9 -0
  343. package/templates/channels/microsoft-copilot/install.template.md.hbs +49 -0
  344. package/templates/channels/microsoft-copilot/manifest.template.json.hbs +8 -0
  345. package/templates/channels/slack/install.template.md.hbs +49 -0
  346. package/templates/channels/slack/manifest.template.json.hbs +66 -0
  347. package/templates/channels/teams-bot/install.template.md.hbs +49 -0
  348. package/templates/channels/teams-bot/manifest.template.json.hbs +13 -0
  349. package/templates/channels/web-embed/install.template.md.hbs +49 -0
  350. package/templates/channels/web-embed/manifest.template.json.hbs +8 -0
  351. package/templates/external-system/README.md.hbs +74 -17
  352. package/templates/python/docker-compose.hbs +75 -18
  353. package/templates/typescript/docker-compose.hbs +70 -17
  354. package/lib/commands/test-governance-command-action.js +0 -55
  355. package/lib/commands/test-trust-command-action.js +0 -118
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @fileoverview Dataplane Enterprise AI Certification lifecycle API client (419.0).
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { createDataplaneApiClient } = require('./index');
10
+ const { unwrapApiData } = require('../utils/external-system-readiness-core');
11
+
12
+ /**
13
+ * GET /api/v1/external/systems/{systemKey}/lifecycle
14
+ * @requiresPermission {Dataplane} external-system:read
15
+ * @async
16
+ * @param {string} dataplaneUrl
17
+ * @param {Object} authConfig
18
+ * @param {string} systemKey
19
+ * @param {{ details?: boolean, summary?: boolean }} [opts]
20
+ * @returns {Promise<Object>}
21
+ */
22
+ async function getSystemLifecycleReport(dataplaneUrl, authConfig, systemKey, opts = {}) {
23
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
24
+ const params = {};
25
+ if (opts.details === true) params.details = true;
26
+ if (opts.summary === true) params.summary = true;
27
+ const res = await client.get(`/api/v1/external/systems/${encodeURIComponent(systemKey)}/lifecycle`, {
28
+ params
29
+ });
30
+ if (res && res.success === false) {
31
+ const msg =
32
+ (res.error && (res.error.formattedError || res.error.error || res.error.message)) ||
33
+ res.formattedError ||
34
+ 'Lifecycle report request failed';
35
+ throw new Error(msg);
36
+ }
37
+ const unwrapped = unwrapApiData(res);
38
+ if (!unwrapped || !unwrapped.systemKey) {
39
+ throw new Error('Lifecycle report returned an unexpected response shape');
40
+ }
41
+ return unwrapped;
42
+ }
43
+
44
+ /**
45
+ * POST /api/v1/external/systems/{systemKey}/lifecycle/run
46
+ * @requiresPermission {Dataplane} external-system:update
47
+ * @async
48
+ * @param {string} dataplaneUrl
49
+ * @param {Object} authConfig
50
+ * @param {string} systemKey
51
+ * @param {Object} [body]
52
+ * @returns {Promise<Object>}
53
+ */
54
+ async function runSystemLifecycle(dataplaneUrl, authConfig, systemKey, body = {}) {
55
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
56
+ const res = await client.post(
57
+ `/api/v1/external/systems/${encodeURIComponent(systemKey)}/lifecycle/run`,
58
+ { body }
59
+ );
60
+ if (res && res.success === false) {
61
+ const msg =
62
+ (res.error && (res.error.formattedError || res.error.error || res.error.message)) ||
63
+ res.formattedError ||
64
+ 'Lifecycle run request failed';
65
+ throw new Error(msg);
66
+ }
67
+ const unwrapped = unwrapApiData(res);
68
+ if (!unwrapped || !unwrapped.report) {
69
+ throw new Error('Lifecycle run returned an unexpected response shape');
70
+ }
71
+ return unwrapped;
72
+ }
73
+
74
+ async function runSystemVerifyTrust(dataplaneUrl, authConfig, systemKey, body = {}) {
75
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
76
+ const res = await client.post(
77
+ `/api/v1/external/systems/${encodeURIComponent(systemKey)}/verify-trust`,
78
+ { body }
79
+ );
80
+ if (res && res.success === false) {
81
+ const msg =
82
+ (res.error && (res.error.formattedError || res.error.error || res.error.message)) ||
83
+ res.formattedError ||
84
+ 'verify-trust request failed';
85
+ throw new Error(msg);
86
+ }
87
+ const unwrapped = unwrapApiData(res);
88
+ if (!unwrapped || !unwrapped.systemKey) {
89
+ throw new Error('verify-trust returned an unexpected response shape');
90
+ }
91
+ return unwrapped;
92
+ }
93
+
94
+ module.exports = {
95
+ getSystemLifecycleReport,
96
+ runSystemLifecycle,
97
+ runSystemVerifyTrust
98
+ };
@@ -6,6 +6,7 @@
6
6
 
7
7
  const { ApiClient, createDataplaneApiClient } = require('./index');
8
8
  const { postValidationRunAndOptionalPoll } = require('./validation-runner');
9
+ const { withStageOnValidationRunBody } = require('../utils/validation-run-stage');
9
10
 
10
11
  /**
11
12
  * @param {Object} opts
@@ -30,7 +31,7 @@ function buildValidationRunPayloadTestBody({ validationScope, systemKey, datasou
30
31
  if (validationScope === 'externalDataSource') {
31
32
  body.datasourceKey = datasourceKey;
32
33
  }
33
- return body;
34
+ return withStageOnValidationRunBody(body, body.runType);
34
35
  }
35
36
 
36
37
  /**
@@ -242,6 +243,7 @@ async function testDatasourceViaPipeline({ dataplaneUrl, systemKey, datasourceKe
242
243
  * @param {Object} authConfig - Authentication configuration (must include token for Bearer; client id/secret rejected)
243
244
  * @param {Object} payload - { version, application, dataSources }; optional status (default "draft")
244
245
  * @param {string} [payload.status="draft"] - "draft" or "published"; Builder uses "draft"
246
+ * @param {boolean} [payload.force=false] - When true, bypass guards on active datasource publish
245
247
  * @returns {Promise<Object>} API envelope `{ success, data }` where `data` is PublicationResult (uploadId, system, datasources, generateMcpContract, …)
246
248
  * @throws {Error} If upload fails
247
249
  */
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  const { createDataplaneApiClient } = require('./index');
8
+ const { unwrapApiData } = require('../utils/external-system-readiness-core');
8
9
 
9
10
  /**
10
11
  * Bulk sync external records for a datasource.
@@ -19,10 +20,22 @@ const { createDataplaneApiClient } = require('./index');
19
20
  */
20
21
  async function bulkSyncRecords(dataplaneUrl, sourceIdOrKey, authConfig, body) {
21
22
  const client = createDataplaneApiClient(dataplaneUrl, authConfig);
22
- return await client.post(
23
+ const res = await client.post(
23
24
  `/api/v1/data-storage/${encodeURIComponent(sourceIdOrKey)}/records/bulk`,
24
25
  { body }
25
26
  );
27
+ if (res && res.success === false) {
28
+ const msg =
29
+ res.formattedError ||
30
+ res.error ||
31
+ `Bulk sync failed (HTTP ${res.status || 0})`;
32
+ throw new Error(msg);
33
+ }
34
+ const payload = unwrapApiData(res);
35
+ if (!payload || typeof payload !== 'object') {
36
+ throw new Error('Bulk sync returned an unexpected response shape');
37
+ }
38
+ return payload;
26
39
  }
27
40
 
28
41
  module.exports = {
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @fileoverview Resource types API (Controller /api/v1/resource-types)
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { ApiClient } = require('./index');
10
+
11
+ const BASE = '/api/v1/resource-types';
12
+
13
+ /**
14
+ * List resource types (paginated)
15
+ * @requiresPermission {Controller} resourceTypes:read
16
+ * @async
17
+ * @function listResourceTypes
18
+ * @param {string} controllerUrl
19
+ * @param {Object} authConfig
20
+ * @param {Object} [options]
21
+ * @param {number} [options.page]
22
+ * @param {number} [options.pageSize]
23
+ * @param {string} [options.sort]
24
+ * @param {string} [options.filter]
25
+ * @param {string} [options.search]
26
+ * @param {string} [options.category]
27
+ * @param {string} [options.status]
28
+ * @returns {Promise<Object>}
29
+ */
30
+ async function listResourceTypes(controllerUrl, authConfig, options = {}) {
31
+ const client = new ApiClient(controllerUrl, authConfig);
32
+ return await client.get(BASE, { params: options });
33
+ }
34
+
35
+ /**
36
+ * Get a resource type by id or key
37
+ * @requiresPermission {Controller} resourceTypes:read
38
+ * @async
39
+ * @function getResourceType
40
+ * @param {string} controllerUrl
41
+ * @param {Object} authConfig
42
+ * @param {string} resourceTypeIdOrKey
43
+ * @returns {Promise<Object>}
44
+ */
45
+ async function getResourceType(controllerUrl, authConfig, resourceTypeIdOrKey) {
46
+ const client = new ApiClient(controllerUrl, authConfig);
47
+ return await client.get(`${BASE}/${encodeURIComponent(resourceTypeIdOrKey)}`);
48
+ }
49
+
50
+ /**
51
+ * Create a resource type
52
+ * @requiresPermission {Controller} resourceTypes:create
53
+ * @async
54
+ * @function createResourceType
55
+ * @param {string} controllerUrl
56
+ * @param {Object} authConfig
57
+ * @param {import('./types/resource-types.types').CreateResourceTypeRequest} body
58
+ * @returns {Promise<Object>}
59
+ */
60
+ async function createResourceType(controllerUrl, authConfig, body) {
61
+ const client = new ApiClient(controllerUrl, authConfig);
62
+ const payload = {
63
+ key: body.key,
64
+ displayName: body.displayName
65
+ };
66
+ if (body.description !== undefined && body.description !== null && body.description !== '') {
67
+ payload.description = body.description;
68
+ }
69
+ if (body.category) payload.category = body.category;
70
+ if (body.defaultRiskLevel) payload.defaultRiskLevel = body.defaultRiskLevel;
71
+ if (body.status) payload.status = body.status;
72
+ return await client.post(BASE, { body: payload });
73
+ }
74
+
75
+ /**
76
+ * Create-if-missing (idempotent): if a resource type already exists for the key, return success.
77
+ * @requiresPermission {Controller} resourceTypes:read + resourceTypes:create
78
+ * @async
79
+ * @function createResourceTypeIdempotent
80
+ * @param {string} controllerUrl
81
+ * @param {Object} authConfig
82
+ * @param {import('./types/resource-types.types').CreateResourceTypeRequest} body
83
+ * @returns {Promise<{ created: boolean, response: Object }>}
84
+ */
85
+ async function createResourceTypeIdempotent(controllerUrl, authConfig, body) {
86
+ const key = String(body?.key || '').trim();
87
+ if (!key) {
88
+ throw new Error('Resource type key is required');
89
+ }
90
+ const getRes = await getResourceType(controllerUrl, authConfig, key);
91
+ if (getRes && getRes.success === true) {
92
+ return { created: false, response: getRes };
93
+ }
94
+ const createRes = await createResourceType(controllerUrl, authConfig, body);
95
+ if (createRes && createRes.success === true) {
96
+ return { created: true, response: createRes };
97
+ }
98
+ const msg = createRes?.error || createRes?.formattedError || 'Failed to create resource type';
99
+ throw new Error(msg);
100
+ }
101
+
102
+ module.exports = {
103
+ listResourceTypes,
104
+ getResourceType,
105
+ createResourceType,
106
+ createResourceTypeIdempotent
107
+ };
@@ -0,0 +1,72 @@
1
+ /**
2
+ * @fileoverview Runtime configuration variable API (dataplane configuration_values)
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ const { createDataplaneApiClient } = require('./index');
8
+
9
+ /**
10
+ * GET /api/v1/external/systems/{systemIdOrKey}/configuration
11
+ * @requiresPermission {Dataplane} external-system:read
12
+ */
13
+ async function getExternalSystemConfiguration(dataplaneUrl, systemIdOrKey, authConfig) {
14
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
15
+ return await client.get(`/api/v1/external/systems/${systemIdOrKey}/configuration`);
16
+ }
17
+
18
+ /**
19
+ * PUT /api/v1/external/systems/{systemIdOrKey}/configuration
20
+ * @requiresPermission {Dataplane} external-system:update
21
+ * @param {{ name: string, value?: string|null, kvKey?: string|null }} body
22
+ */
23
+ async function putExternalSystemConfiguration(dataplaneUrl, systemIdOrKey, authConfig, body) {
24
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
25
+ return await client.put(`/api/v1/external/systems/${systemIdOrKey}/configuration`, { body });
26
+ }
27
+
28
+ /**
29
+ * GET /api/v1/external/{sourceIdOrKey}/configuration
30
+ * @requiresPermission {Dataplane} external-data-source:read
31
+ */
32
+ async function getExternalDataSourceConfiguration(dataplaneUrl, sourceIdOrKey, authConfig) {
33
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
34
+ return await client.get(`/api/v1/external/${sourceIdOrKey}/configuration`);
35
+ }
36
+
37
+ /**
38
+ * GET /api/v1/external/systems/{systemIdOrKey}/configuration/resolved
39
+ * @requiresPermission {Dataplane} external-system:configuration:resolve
40
+ */
41
+ async function getExternalSystemConfigurationResolved(dataplaneUrl, systemIdOrKey, authConfig) {
42
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
43
+ return await client.get(`/api/v1/external/systems/${systemIdOrKey}/configuration/resolved`);
44
+ }
45
+
46
+ /**
47
+ * GET /api/v1/external/{sourceIdOrKey}/configuration/resolved
48
+ * @requiresPermission {Dataplane} external-data-source:configuration:resolve
49
+ */
50
+ async function getExternalDataSourceConfigurationResolved(dataplaneUrl, sourceIdOrKey, authConfig) {
51
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
52
+ return await client.get(`/api/v1/external/${sourceIdOrKey}/configuration/resolved`);
53
+ }
54
+
55
+ /**
56
+ * PUT /api/v1/external/{sourceIdOrKey}/configuration
57
+ * @requiresPermission {Dataplane} external-data-source:update
58
+ * @param {{ name: string, value?: string|null, kvKey?: string|null }} body
59
+ */
60
+ async function putExternalDataSourceConfiguration(dataplaneUrl, sourceIdOrKey, authConfig, body) {
61
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
62
+ return await client.put(`/api/v1/external/${sourceIdOrKey}/configuration`, { body });
63
+ }
64
+
65
+ module.exports = {
66
+ getExternalSystemConfiguration,
67
+ getExternalSystemConfigurationResolved,
68
+ putExternalSystemConfiguration,
69
+ getExternalDataSourceConfiguration,
70
+ getExternalDataSourceConfigurationResolved,
71
+ putExternalDataSourceConfiguration
72
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @fileoverview Resource type catalog API type definitions
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ /**
8
+ * Resource type category
9
+ * @typedef {'business'|'collaboration'|'governance'|'content'|'communication'|'people'} ResourceTypeCategory
10
+ */
11
+
12
+ /**
13
+ * Resource type risk level
14
+ * @typedef {'low'|'medium'|'high'|'critical'} ResourceTypeRiskLevel
15
+ */
16
+
17
+ /**
18
+ * Resource type lifecycle status
19
+ * @typedef {'draft'|'active'|'deprecated'|'retired'} ResourceTypeStatus
20
+ */
21
+
22
+ /**
23
+ * Create resource type request body
24
+ * @typedef {Object} CreateResourceTypeRequest
25
+ * @property {string} key - Catalog key (lowercase, hyphens)
26
+ * @property {string} displayName - Human-readable name
27
+ * @property {string} [description] - Optional description
28
+ * @property {ResourceTypeCategory} [category] - Catalog category
29
+ * @property {ResourceTypeRiskLevel} [defaultRiskLevel] - Default risk level
30
+ * @property {ResourceTypeStatus} [status] - Lifecycle status
31
+ */
32
+
33
+ /**
34
+ * Resource type record
35
+ * @typedef {Object} ResourceTypeRecord
36
+ * @property {string} id - Controller id
37
+ * @property {string} key - Catalog key
38
+ * @property {string} displayName - Display name
39
+ * @property {string} [description] - Description
40
+ * @property {ResourceTypeCategory} category - Category
41
+ * @property {ResourceTypeRiskLevel} defaultRiskLevel - Default risk
42
+ * @property {ResourceTypeStatus} status - Status
43
+ */
44
+
45
+ module.exports = {};
@@ -9,20 +9,20 @@
9
9
  const { ApiClient } = require('./index');
10
10
 
11
11
  /**
12
- * Add user to group
12
+ * Add user to group (flexible path segments per plan 194)
13
13
  * @requiresPermission {Controller} users:update
14
14
  * @async
15
15
  * @param {string} controllerUrl
16
16
  * @param {Object} authConfig
17
- * @param {string} userId
18
- * @param {string} groupId
17
+ * @param {string} userIdOrEmail - UUID, email, or username
18
+ * @param {string} groupIdOrName - UUID or group name
19
19
  * @param {Object} [body]
20
20
  * @returns {Promise<Object>}
21
21
  */
22
- async function addUserToGroup(controllerUrl, authConfig, userId, groupId, body = {}) {
22
+ async function addUserToGroup(controllerUrl, authConfig, userIdOrEmail, groupIdOrName, body = {}) {
23
23
  const client = new ApiClient(controllerUrl, authConfig);
24
24
  return await client.post(
25
- `/api/v1/users/${encodeURIComponent(userId)}/groups/${encodeURIComponent(groupId)}`,
25
+ `/api/v1/users/${encodeURIComponent(userIdOrEmail)}/groups/${encodeURIComponent(groupIdOrName)}`,
26
26
  { body }
27
27
  );
28
28
  }
@@ -33,14 +33,14 @@ async function addUserToGroup(controllerUrl, authConfig, userId, groupId, body =
33
33
  * @async
34
34
  * @param {string} controllerUrl
35
35
  * @param {Object} authConfig
36
- * @param {string} userId
37
- * @param {string} groupId
36
+ * @param {string} userIdOrEmail - UUID, email, or username
37
+ * @param {string} groupIdOrName - UUID or group name
38
38
  * @returns {Promise<Object>}
39
39
  */
40
- async function removeUserFromGroup(controllerUrl, authConfig, userId, groupId) {
40
+ async function removeUserFromGroup(controllerUrl, authConfig, userIdOrEmail, groupIdOrName) {
41
41
  const client = new ApiClient(controllerUrl, authConfig);
42
42
  return await client.delete(
43
- `/api/v1/users/${encodeURIComponent(userId)}/groups/${encodeURIComponent(groupId)}`
43
+ `/api/v1/users/${encodeURIComponent(userIdOrEmail)}/groups/${encodeURIComponent(groupIdOrName)}`
44
44
  );
45
45
  }
46
46
 
@@ -25,22 +25,22 @@ async function listUsers(controllerUrl, authConfig, options = {}) {
25
25
  }
26
26
 
27
27
  /**
28
- * Get user by id
28
+ * Get user by id, email, or username (controller path: userIdOrEmail)
29
29
  * @requiresPermission {Controller} users:read
30
30
  * @async
31
31
  * @param {string} controllerUrl
32
32
  * @param {Object} authConfig
33
- * @param {string} userId
33
+ * @param {string} userIdOrEmail - UUID, email, or username
34
34
  * @param {Object} [options]
35
35
  * @returns {Promise<Object>}
36
36
  */
37
- async function getUser(controllerUrl, authConfig, userId, options = {}) {
37
+ async function getUser(controllerUrl, authConfig, userIdOrEmail, options = {}) {
38
38
  const client = new ApiClient(controllerUrl, authConfig);
39
39
  const params = {};
40
40
  if (options.includeGroups) {
41
41
  params.includeGroups = 'true';
42
42
  }
43
- return await client.get(`${BASE}/${encodeURIComponent(userId)}`, { params });
43
+ return await client.get(`${BASE}/${encodeURIComponent(userIdOrEmail)}`, { params });
44
44
  }
45
45
 
46
46
  /**
@@ -73,17 +73,17 @@ async function updateUser(controllerUrl, authConfig, userId, body) {
73
73
  }
74
74
 
75
75
  /**
76
- * List groups for a user
76
+ * List groups for a user (controller path: userIdOrEmail)
77
77
  * @requiresPermission {Controller} users:read
78
78
  * @async
79
79
  * @param {string} controllerUrl
80
80
  * @param {Object} authConfig
81
- * @param {string} userId
81
+ * @param {string} userIdOrEmail - UUID, email, or username
82
82
  * @returns {Promise<Object>}
83
83
  */
84
- async function listUserGroups(controllerUrl, authConfig, userId) {
84
+ async function listUserGroups(controllerUrl, authConfig, userIdOrEmail) {
85
85
  const client = new ApiClient(controllerUrl, authConfig);
86
- return await client.get(`${BASE}/${encodeURIComponent(userId)}/groups`);
86
+ return await client.get(`${BASE}/${encodeURIComponent(userIdOrEmail)}/groups`);
87
87
  }
88
88
 
89
89
  module.exports = {
@@ -22,6 +22,7 @@ const { createValidationPollHandlers } = require('../utils/validation-poll-ui');
22
22
  * @param {boolean} opts.useAsync
23
23
  * @param {boolean} opts.noAsync
24
24
  * @param {boolean} [opts.verbosePoll] - Throttled poll lines when no TTY poll UI (see validation-run-poll)
25
+ * @param {boolean} [opts.quietPollUi] - Suppress poll spinner/lines (orchestrated verify-* owns progress)
25
26
  * @param {Function} [opts.onPollProgress] - Extra hook: `(envelope, attemptIndex, meta)` during poll
26
27
  * @returns {Promise<{ envelope: Object|null, apiError: Object|null, pollTimedOut: boolean, incompleteNoAsync: boolean }>}
27
28
  */
@@ -60,7 +61,8 @@ async function postValidationRunAndOptionalPoll(opts) {
60
61
  const deadlineMs = Date.now() + remaining;
61
62
 
62
63
  const pollUi = createValidationPollHandlers(deadlineMs, {
63
- subject: opts.pollSubject
64
+ subject: opts.pollSubject,
65
+ quiet: opts.quietPollUi === true
64
66
  });
65
67
  const mergeOnPollProgress =
66
68
  typeof opts.onPollProgress === 'function'
@@ -205,6 +205,12 @@ async function getPlatformConfig(dataplaneUrl, authConfig, platformKey, config)
205
205
  });
206
206
  }
207
207
 
208
+ /**
209
+ * Wizard AI generation can exceed the default 30s HTTP timeout (OpenAPI + LLM).
210
+ * @constant {number}
211
+ */
212
+ const WIZARD_GENERATE_CONFIG_TIMEOUT_MS = 120000;
213
+
208
214
  /**
209
215
  * Generate configuration via AI (OpenAPI-based)
210
216
  * POST /api/v1/wizard/generate-config
@@ -235,7 +241,8 @@ async function getPlatformConfig(dataplaneUrl, authConfig, platformKey, config)
235
241
  async function generateConfig(dataplaneUrl, authConfig, config) {
236
242
  const client = createDataplaneApiClient(dataplaneUrl, authConfig);
237
243
  return await client.post('/api/v1/wizard/generate-config', {
238
- body: config
244
+ body: config,
245
+ timeoutMs: WIZARD_GENERATE_CONFIG_TIMEOUT_MS
239
246
  });
240
247
  }
241
248
 
@@ -254,7 +261,8 @@ async function generateConfig(dataplaneUrl, authConfig, config) {
254
261
  async function generateConfigStream(dataplaneUrl, authConfig, config) {
255
262
  const client = createDataplaneApiClient(dataplaneUrl, authConfig);
256
263
  return await client.post('/api/v1/wizard/generate-config-stream', {
257
- body: config
264
+ body: config,
265
+ timeoutMs: WIZARD_GENERATE_CONFIG_TIMEOUT_MS
258
266
  });
259
267
  }
260
268
 
@@ -60,7 +60,10 @@ async function extractDeploymentConfig(options, _variables) {
60
60
  const { resolveEnvironment } = require('../core/config');
61
61
 
62
62
  const controllerUrl = await resolveControllerUrl();
63
- const envKey = await resolveEnvironment();
63
+ const envKey =
64
+ options && options.envKey
65
+ ? String(options.envKey).trim().toLowerCase()
66
+ : await resolveEnvironment();
64
67
 
65
68
  const pollIntervalExplicit =
66
69
  options.pollInterval !== undefined && options.pollInterval !== null