@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
@@ -4,81 +4,84 @@
4
4
  * @version 2.0.0
5
5
  */
6
6
 
7
- const { ApiClient } = require('./index');
7
+ const { createDataplaneApiClient } = require('./index');
8
8
 
9
9
  /** @requiresPermission {Dataplane} external-system:read (datasource list) */
10
10
  async function listDatasources(dataplaneUrl, authConfig, options = {}) {
11
- const client = new ApiClient(dataplaneUrl, authConfig);
11
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
12
12
  return await client.get('/api/v1/external', { params: options });
13
13
  }
14
14
  /** @requiresPermission {Dataplane} external-system:create */
15
15
  async function createDatasource(dataplaneUrl, authConfig, datasourceData) {
16
- const client = new ApiClient(dataplaneUrl, authConfig);
16
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
17
17
  return await client.post('/api/v1/external', { body: datasourceData });
18
18
  }
19
19
  /** @requiresPermission {Dataplane} external-system:read */
20
20
  async function getDatasource(dataplaneUrl, sourceIdOrKey, authConfig) {
21
- const client = new ApiClient(dataplaneUrl, authConfig);
21
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
22
22
  return await client.get(`/api/v1/external/${sourceIdOrKey}`);
23
23
  }
24
24
  /** @requiresPermission {Dataplane} external-system:update */
25
25
  async function updateDatasource(dataplaneUrl, sourceIdOrKey, authConfig, updateData) {
26
- const client = new ApiClient(dataplaneUrl, authConfig);
26
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
27
27
  return await client.put(`/api/v1/external/${sourceIdOrKey}`, { body: updateData });
28
28
  }
29
29
  /** @requiresPermission {Dataplane} external-system:delete */
30
30
  async function deleteDatasource(dataplaneUrl, sourceIdOrKey, authConfig) {
31
- const client = new ApiClient(dataplaneUrl, authConfig);
31
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
32
32
  return await client.delete(`/api/v1/external/${sourceIdOrKey}`);
33
33
  }
34
34
  /** @requiresPermission {Dataplane} external-system:read */
35
35
  async function getDatasourceConfig(dataplaneUrl, sourceIdOrKey, authConfig) {
36
- const client = new ApiClient(dataplaneUrl, authConfig);
36
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
37
37
  return await client.get(`/api/v1/external/${sourceIdOrKey}/config`);
38
38
  }
39
39
  /** @requiresPermission {Dataplane} external-system:update */
40
40
  async function publishDatasource(dataplaneUrl, sourceIdOrKey, authConfig, publishData = {}) {
41
- const client = new ApiClient(dataplaneUrl, authConfig);
41
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
42
42
  return await client.post(`/api/v1/external/${sourceIdOrKey}/publish`, { body: publishData });
43
43
  }
44
44
  /** @requiresPermission {Dataplane} external-system:update */
45
45
  async function rollbackDatasource(dataplaneUrl, sourceIdOrKey, authConfig, rollbackData) {
46
- const client = new ApiClient(dataplaneUrl, authConfig);
46
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
47
47
  return await client.post(`/api/v1/external/${sourceIdOrKey}/rollback`, { body: rollbackData });
48
48
  }
49
49
  /** @requiresPermission {Dataplane} external-system:read */
50
50
  async function testDatasource(dataplaneUrl, sourceIdOrKey, authConfig, testData = {}) {
51
- const client = new ApiClient(dataplaneUrl, authConfig);
51
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
52
52
  return await client.post(`/api/v1/external/${sourceIdOrKey}/test`, { body: testData });
53
53
  }
54
54
  /** @requiresPermission {Dataplane} external-system:read */
55
55
  async function listDatasourceOpenAPIEndpoints(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
56
- const client = new ApiClient(dataplaneUrl, authConfig);
56
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
57
57
  return await client.get(`/api/v1/external/${sourceIdOrKey}/openapi-endpoints`, { params: options });
58
58
  }
59
59
  /** @requiresPermission {Dataplane} audit:read or external-system:read */
60
60
  async function listExecutionLogs(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
61
- const client = new ApiClient(dataplaneUrl, authConfig);
61
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
62
62
  return await client.get(`/api/v1/external/${sourceIdOrKey}/executions`, { params: options });
63
63
  }
64
64
  /** @requiresPermission {Dataplane} audit:read or external-system:read */
65
65
  async function getExecutionLog(dataplaneUrl, sourceIdOrKey, executionId, authConfig) {
66
- const client = new ApiClient(dataplaneUrl, authConfig);
66
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
67
67
  return await client.get(`/api/v1/external/${sourceIdOrKey}/executions/${executionId}`);
68
68
  }
69
69
  /** @requiresPermission {Dataplane} audit:read */
70
70
  async function listAllExecutionLogs(dataplaneUrl, authConfig, options = {}) {
71
- const client = new ApiClient(dataplaneUrl, authConfig);
71
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
72
72
  return await client.get('/api/v1/external/executions', { params: options });
73
73
  }
74
- /** @requiresPermission {Dataplane} external-system:update */
74
+ /**
75
+ * @deprecated Prefer {@link module:lib/api/records-bulk.api.bulkSyncRecords}.
76
+ * @requiresPermission {Dataplane} external-data-source:sync
77
+ */
75
78
  async function bulkOperation(dataplaneUrl, sourceIdOrKey, authConfig, bulkData) {
76
- const client = new ApiClient(dataplaneUrl, authConfig);
77
- return await client.post(`/api/v1/external/${sourceIdOrKey}/bulk`, { body: bulkData });
79
+ const { bulkSyncRecords } = require('./records-bulk.api');
80
+ return await bulkSyncRecords(dataplaneUrl, sourceIdOrKey, authConfig, bulkData);
78
81
  }
79
82
  /** @requiresPermission {Dataplane} external-system:read */
80
83
  async function getDatasourceStatus(dataplaneUrl, sourceIdOrKey, authConfig) {
81
- const client = new ApiClient(dataplaneUrl, authConfig);
84
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
82
85
  return await client.get(`/api/v1/external/${sourceIdOrKey}/status`);
83
86
  }
84
87
 
@@ -4,107 +4,107 @@
4
4
  * @version 2.0.0
5
5
  */
6
6
 
7
- const { ApiClient } = require('./index');
7
+ const { createDataplaneApiClient } = require('./index');
8
8
 
9
9
  /** @requiresPermission {Dataplane} external-system:read (records) */
10
10
  async function listRecords(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
11
- const client = new ApiClient(dataplaneUrl, authConfig);
11
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
12
12
  return await client.get(`/api/v1/external/${sourceIdOrKey}/records`, { params: options });
13
13
  }
14
14
  /** @requiresPermission {Dataplane} external-system:create */
15
15
  async function createRecord(dataplaneUrl, sourceIdOrKey, authConfig, recordData) {
16
- const client = new ApiClient(dataplaneUrl, authConfig);
16
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
17
17
  return await client.post(`/api/v1/external/${sourceIdOrKey}/records`, { body: recordData });
18
18
  }
19
19
  /** @requiresPermission {Dataplane} external-system:read */
20
20
  async function getRecord(dataplaneUrl, sourceIdOrKey, recordIdOrKey, authConfig) {
21
- const client = new ApiClient(dataplaneUrl, authConfig);
21
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
22
22
  return await client.get(`/api/v1/external/${sourceIdOrKey}/records/${recordIdOrKey}`);
23
23
  }
24
24
  /** @requiresPermission {Dataplane} external-system:update */
25
25
  async function updateRecord(dataplaneUrl, sourceIdOrKey, recordIdOrKey, authConfig, updateData) {
26
- const client = new ApiClient(dataplaneUrl, authConfig);
26
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
27
27
  return await client.put(`/api/v1/external/${sourceIdOrKey}/records/${recordIdOrKey}`, { body: updateData });
28
28
  }
29
29
  /** @requiresPermission {Dataplane} external-system:delete */
30
30
  async function deleteRecord(dataplaneUrl, sourceIdOrKey, recordIdOrKey, authConfig) {
31
- const client = new ApiClient(dataplaneUrl, authConfig);
31
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
32
32
  return await client.delete(`/api/v1/external/${sourceIdOrKey}/records/${recordIdOrKey}`);
33
33
  }
34
34
  /** @requiresPermission {Dataplane} external-system:read (grants) */
35
35
  async function listGrants(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
36
- const client = new ApiClient(dataplaneUrl, authConfig);
36
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
37
37
  return await client.get(`/api/v1/external/${sourceIdOrKey}/grants`, { params: options });
38
38
  }
39
39
  /** @requiresPermission {Dataplane} external-system:update */
40
40
  async function createGrant(dataplaneUrl, sourceIdOrKey, authConfig, grantData) {
41
- const client = new ApiClient(dataplaneUrl, authConfig);
41
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
42
42
  return await client.post(`/api/v1/external/${sourceIdOrKey}/grants`, { body: grantData });
43
43
  }
44
44
  /** @requiresPermission {Dataplane} external-system:read */
45
45
  async function getGrant(dataplaneUrl, sourceIdOrKey, grantIdOrKey, authConfig) {
46
- const client = new ApiClient(dataplaneUrl, authConfig);
46
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
47
47
  return await client.get(`/api/v1/external/${sourceIdOrKey}/grants/${grantIdOrKey}`);
48
48
  }
49
49
  /** @requiresPermission {Dataplane} external-system:update */
50
50
  async function updateGrant(dataplaneUrl, sourceIdOrKey, grantIdOrKey, authConfig, updateData) {
51
- const client = new ApiClient(dataplaneUrl, authConfig);
51
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
52
52
  return await client.put(`/api/v1/external/${sourceIdOrKey}/grants/${grantIdOrKey}`, { body: updateData });
53
53
  }
54
54
  async function deleteGrant(dataplaneUrl, sourceIdOrKey, grantIdOrKey, authConfig) {
55
- const client = new ApiClient(dataplaneUrl, authConfig);
55
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
56
56
  return await client.delete(`/api/v1/external/${sourceIdOrKey}/grants/${grantIdOrKey}`);
57
57
  }
58
58
  /** @requiresPermission {Dataplane} external-system:read (policies) */
59
59
  async function listPolicies(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
60
- const client = new ApiClient(dataplaneUrl, authConfig);
60
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
61
61
  return await client.get(`/api/v1/external/${sourceIdOrKey}/policies`, { params: options });
62
62
  }
63
63
  /** @requiresPermission {Dataplane} external-system:update */
64
64
  async function attachPolicy(dataplaneUrl, sourceIdOrKey, authConfig, policyData) {
65
- const client = new ApiClient(dataplaneUrl, authConfig);
65
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
66
66
  return await client.post(`/api/v1/external/${sourceIdOrKey}/policies`, { body: policyData });
67
67
  }
68
68
  async function detachPolicy(dataplaneUrl, sourceIdOrKey, policyIdOrKey, authConfig) {
69
- const client = new ApiClient(dataplaneUrl, authConfig);
69
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
70
70
  return await client.delete(`/api/v1/external/${sourceIdOrKey}/policies/${policyIdOrKey}`);
71
71
  }
72
72
  /** @requiresPermission {Dataplane} external-system:read (sync) */
73
73
  async function listSyncJobs(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
74
- const client = new ApiClient(dataplaneUrl, authConfig);
74
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
75
75
  return await client.get(`/api/v1/external/${sourceIdOrKey}/sync`, { params: options });
76
76
  }
77
77
  async function createSyncJob(dataplaneUrl, sourceIdOrKey, authConfig, syncData) {
78
- const client = new ApiClient(dataplaneUrl, authConfig);
78
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
79
79
  return await client.post(`/api/v1/external/${sourceIdOrKey}/sync`, { body: syncData });
80
80
  }
81
81
  /** @requiresPermission {Dataplane} external-system:read */
82
82
  async function getSyncJob(dataplaneUrl, sourceIdOrKey, syncJobId, authConfig) {
83
- const client = new ApiClient(dataplaneUrl, authConfig);
83
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
84
84
  return await client.get(`/api/v1/external/${sourceIdOrKey}/sync/${syncJobId}`);
85
85
  }
86
86
  /** @requiresPermission {Dataplane} external-system:update */
87
87
  async function updateSyncJob(dataplaneUrl, sourceIdOrKey, syncJobId, authConfig, updateData) {
88
- const client = new ApiClient(dataplaneUrl, authConfig);
88
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
89
89
  return await client.put(`/api/v1/external/${sourceIdOrKey}/sync/${syncJobId}`, { body: updateData });
90
90
  }
91
91
  async function executeSyncJob(dataplaneUrl, sourceIdOrKey, syncJobId, authConfig) {
92
- const client = new ApiClient(dataplaneUrl, authConfig);
92
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
93
93
  return await client.post(`/api/v1/external/${sourceIdOrKey}/sync/${syncJobId}/execute`);
94
94
  }
95
95
  /** @requiresPermission {Dataplane} document-record or external-system scope */
96
96
  async function validateDocuments(dataplaneUrl, sourceIdOrKey, authConfig, validateData) {
97
- const client = new ApiClient(dataplaneUrl, authConfig);
97
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
98
98
  return await client.post(`/api/v1/external/data-sources/${sourceIdOrKey}/documents/validate`, { body: validateData });
99
99
  }
100
100
  /** @requiresPermission {Dataplane} document-record or external-system scope */
101
101
  async function bulkDocuments(dataplaneUrl, sourceIdOrKey, authConfig, bulkData) {
102
- const client = new ApiClient(dataplaneUrl, authConfig);
102
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
103
103
  return await client.post(`/api/v1/external/data-sources/${sourceIdOrKey}/documents/bulk`, { body: bulkData });
104
104
  }
105
105
  /** @requiresPermission {Dataplane} document-record:read or external-system:read */
106
106
  async function listDocuments(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
107
- const client = new ApiClient(dataplaneUrl, authConfig);
107
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
108
108
  return await client.get(`/api/v1/external/data-sources/${sourceIdOrKey}/documents`, { params: options });
109
109
  }
110
110
 
@@ -68,6 +68,9 @@ async function createDimension(controllerUrl, authConfig, body) {
68
68
  displayName: body.displayName,
69
69
  dataType: body.dataType
70
70
  };
71
+ if (body.valueType !== undefined && body.valueType !== null && body.valueType !== '') {
72
+ payload.valueType = body.valueType;
73
+ }
71
74
  if (body.description !== undefined && body.description !== null && body.description !== '') {
72
75
  payload.description = body.description;
73
76
  }
@@ -4,7 +4,7 @@
4
4
  * @version 2.0.0
5
5
  */
6
6
 
7
- const { ApiClient } = require('./index');
7
+ const { createDataplaneApiClient } = require('./index');
8
8
 
9
9
  /**
10
10
  * List external systems
@@ -24,7 +24,7 @@ const { ApiClient } = require('./index');
24
24
  * @throws {Error} If request fails
25
25
  */
26
26
  async function listExternalSystems(dataplaneUrl, authConfig, options = {}) {
27
- const client = new ApiClient(dataplaneUrl, authConfig);
27
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
28
28
  return await client.get('/api/v1/external/systems', {
29
29
  params: options
30
30
  });
@@ -43,7 +43,7 @@ async function listExternalSystems(dataplaneUrl, authConfig, options = {}) {
43
43
  * @throws {Error} If creation fails
44
44
  */
45
45
  async function createExternalSystem(dataplaneUrl, authConfig, systemData) {
46
- const client = new ApiClient(dataplaneUrl, authConfig);
46
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
47
47
  return await client.post('/api/v1/external/systems', {
48
48
  body: systemData
49
49
  });
@@ -66,7 +66,7 @@ async function createExternalSystem(dataplaneUrl, authConfig, systemData) {
66
66
  * @throws {Error} If request fails
67
67
  */
68
68
  async function getExternalSystem(dataplaneUrl, systemIdOrKey, authConfig) {
69
- const client = new ApiClient(dataplaneUrl, authConfig);
69
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
70
70
  return await client.get(`/api/v1/external/systems/${systemIdOrKey}`);
71
71
  }
72
72
 
@@ -84,7 +84,7 @@ async function getExternalSystem(dataplaneUrl, systemIdOrKey, authConfig) {
84
84
  * @throws {Error} If update fails
85
85
  */
86
86
  async function updateExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, updateData) {
87
- const client = new ApiClient(dataplaneUrl, authConfig);
87
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
88
88
  return await client.put(`/api/v1/external/systems/${systemIdOrKey}`, {
89
89
  body: updateData
90
90
  });
@@ -103,7 +103,7 @@ async function updateExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, upd
103
103
  * @throws {Error} If deletion fails
104
104
  */
105
105
  async function deleteExternalSystem(dataplaneUrl, systemIdOrKey, authConfig) {
106
- const client = new ApiClient(dataplaneUrl, authConfig);
106
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
107
107
  return await client.delete(`/api/v1/external/systems/${systemIdOrKey}`);
108
108
  }
109
109
 
@@ -120,7 +120,7 @@ async function deleteExternalSystem(dataplaneUrl, systemIdOrKey, authConfig) {
120
120
  * @throws {Error} If request fails
121
121
  */
122
122
  async function getExternalSystemConfig(dataplaneUrl, systemIdOrKey, authConfig) {
123
- const client = new ApiClient(dataplaneUrl, authConfig);
123
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
124
124
  return await client.get(`/api/v1/external/systems/${systemIdOrKey}/config`);
125
125
  }
126
126
 
@@ -140,7 +140,7 @@ async function getExternalSystemConfig(dataplaneUrl, systemIdOrKey, authConfig)
140
140
  * @throws {Error} If creation fails
141
141
  */
142
142
  async function createFromTemplate(dataplaneUrl, authConfig, templateData) {
143
- const client = new ApiClient(dataplaneUrl, authConfig);
143
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
144
144
  return await client.post('/api/v1/external/systems/from-template', {
145
145
  body: templateData
146
146
  });
@@ -160,7 +160,7 @@ async function createFromTemplate(dataplaneUrl, authConfig, templateData) {
160
160
  * @throws {Error} If request fails
161
161
  */
162
162
  async function listOpenAPIFiles(dataplaneUrl, systemIdOrKey, authConfig, options = {}) {
163
- const client = new ApiClient(dataplaneUrl, authConfig);
163
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
164
164
  return await client.get(`/api/v1/external/systems/${systemIdOrKey}/openapi-files`, {
165
165
  params: options
166
166
  });
@@ -180,7 +180,7 @@ async function listOpenAPIFiles(dataplaneUrl, systemIdOrKey, authConfig, options
180
180
  * @throws {Error} If request fails
181
181
  */
182
182
  async function listOpenAPIEndpoints(dataplaneUrl, systemIdOrKey, authConfig, options = {}) {
183
- const client = new ApiClient(dataplaneUrl, authConfig);
183
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
184
184
  return await client.get(`/api/v1/external/systems/${systemIdOrKey}/openapi-endpoints`, {
185
185
  params: options
186
186
  });
@@ -201,7 +201,7 @@ async function listOpenAPIEndpoints(dataplaneUrl, systemIdOrKey, authConfig, opt
201
201
  * @throws {Error} If publish fails
202
202
  */
203
203
  async function publishExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, publishData = {}) {
204
- const client = new ApiClient(dataplaneUrl, authConfig);
204
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
205
205
  return await client.post(`/api/v1/external/systems/${systemIdOrKey}/publish`, {
206
206
  body: publishData
207
207
  });
@@ -222,7 +222,7 @@ async function publishExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, pu
222
222
  * @throws {Error} If rollback fails
223
223
  */
224
224
  async function rollbackExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, rollbackData) {
225
- const client = new ApiClient(dataplaneUrl, authConfig);
225
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
226
226
  return await client.post(`/api/v1/external/systems/${systemIdOrKey}/rollback`, {
227
227
  body: rollbackData
228
228
  });
@@ -244,7 +244,7 @@ async function rollbackExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, r
244
244
  * @throws {Error} If save fails
245
245
  */
246
246
  async function saveAsTemplate(dataplaneUrl, systemIdOrKey, authConfig, templateData) {
247
- const client = new ApiClient(dataplaneUrl, authConfig);
247
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
248
248
  return await client.post(`/api/v1/external/systems/${systemIdOrKey}/save-template`, {
249
249
  body: templateData
250
250
  });
@@ -0,0 +1,159 @@
1
+ /**
2
+ * @fileoverview Dataplane governance scenario pack CRUD + run API (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 { throwIfApiFailed } = require('./api-response-errors');
11
+ const { unwrapApiData } = require('../utils/external-system-readiness-core');
12
+ const {
13
+ governanceUploadSchemaHint,
14
+ isGovernanceCoverageSchemaError
15
+ } = require('../governance/governance-cli-errors');
16
+
17
+ /**
18
+ * @param {string} dataplaneUrl
19
+ * @param {string} datasourceKey
20
+ * @param {string} suffix
21
+ * @returns {string}
22
+ */
23
+ function governanceScenarioEndpoint(dataplaneUrl, datasourceKey, suffix) {
24
+ const base = String(dataplaneUrl || '').replace(/\/$/, '');
25
+ return `${base}/api/v1/external/${encodeURIComponent(datasourceKey)}${suffix}`;
26
+ }
27
+
28
+ /**
29
+ * PUT /api/v1/external/{datasourceKey}/governance-scenarios
30
+ * @requiresPermission {Dataplane} external-data-source:update
31
+ * @async
32
+ */
33
+ async function upsertDatasourceGovernancePack(dataplaneUrl, authConfig, datasourceKey, pack) {
34
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
35
+ const res = await client.put(
36
+ `/api/v1/external/${encodeURIComponent(datasourceKey)}/governance-scenarios`,
37
+ { body: { pack } }
38
+ );
39
+ if (res && res.success === false) {
40
+ try {
41
+ throwIfApiFailed(res, {
42
+ endpointUrl: governanceScenarioEndpoint(
43
+ dataplaneUrl,
44
+ datasourceKey,
45
+ '/governance-scenarios'
46
+ )
47
+ });
48
+ } catch (err) {
49
+ if (isGovernanceCoverageSchemaError(err)) {
50
+ err.friendlyHint = governanceUploadSchemaHint(
51
+ (pack && pack.spec && pack.spec.systemKey) || datasourceKey
52
+ );
53
+ }
54
+ throw err;
55
+ }
56
+ }
57
+ return unwrapApiData(res);
58
+ }
59
+
60
+ /**
61
+ * GET /api/v1/external/{datasourceKey}/governance-scenarios
62
+ * @requiresPermission {Dataplane} external-data-source:read
63
+ * @async
64
+ */
65
+ async function getDatasourceGovernancePack(dataplaneUrl, authConfig, datasourceKey) {
66
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
67
+ const res = await client.get(
68
+ `/api/v1/external/${encodeURIComponent(datasourceKey)}/governance-scenarios`
69
+ );
70
+ throwIfApiFailed(res, {
71
+ endpointUrl: governanceScenarioEndpoint(dataplaneUrl, datasourceKey, '/governance-scenarios')
72
+ });
73
+ return unwrapApiData(res);
74
+ }
75
+
76
+ /**
77
+ * POST /api/v1/external/{datasourceKey}/governance-scenarios/run
78
+ * @requiresPermission {Dataplane} governance:evaluate
79
+ * @async
80
+ */
81
+ async function runDatasourceGovernanceScenarios(dataplaneUrl, authConfig, datasourceKey) {
82
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
83
+ const res = await client.post(
84
+ `/api/v1/external/${encodeURIComponent(datasourceKey)}/governance-scenarios/run`,
85
+ { body: {} }
86
+ );
87
+ throwIfApiFailed(res, {
88
+ endpointUrl: governanceScenarioEndpoint(
89
+ dataplaneUrl,
90
+ datasourceKey,
91
+ '/governance-scenarios/run'
92
+ )
93
+ });
94
+ const unwrapped = unwrapApiData(res);
95
+ if (!unwrapped || !unwrapped.summary) {
96
+ throw new Error('Governance scenario run returned an unexpected response shape');
97
+ }
98
+ return unwrapped;
99
+ }
100
+
101
+ /**
102
+ * POST /api/v1/external/{datasourceKey}/governance-scenarios/generate
103
+ * @requiresPermission {Dataplane} external-data-source:update
104
+ * @async
105
+ */
106
+ async function generateDatasourceGovernancePack(
107
+ dataplaneUrl,
108
+ authConfig,
109
+ datasourceKey,
110
+ body
111
+ ) {
112
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
113
+ const res = await client.post(
114
+ `/api/v1/external/${encodeURIComponent(datasourceKey)}/governance-scenarios/generate`,
115
+ { body }
116
+ );
117
+ const subjectEmails = Array.isArray(body.subjects)
118
+ ? body.subjects
119
+ .map(entry => entry && entry.subjectEmail)
120
+ .filter(email => typeof email === 'string' && email.trim())
121
+ : [];
122
+ throwIfApiFailed(res, {
123
+ endpointUrl: governanceScenarioEndpoint(
124
+ dataplaneUrl,
125
+ datasourceKey,
126
+ '/governance-scenarios/generate'
127
+ ),
128
+ subjectEmails
129
+ });
130
+ return unwrapApiData(res);
131
+ }
132
+
133
+ /**
134
+ * GET /api/v1/external/{datasourceKey}/governance-scenarios/versions
135
+ * @requiresPermission {Dataplane} external-data-source:read
136
+ * @async
137
+ */
138
+ async function listDatasourceGovernancePackVersions(dataplaneUrl, authConfig, datasourceKey) {
139
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
140
+ const res = await client.get(
141
+ `/api/v1/external/${encodeURIComponent(datasourceKey)}/governance-scenarios/versions`
142
+ );
143
+ throwIfApiFailed(res, {
144
+ endpointUrl: governanceScenarioEndpoint(
145
+ dataplaneUrl,
146
+ datasourceKey,
147
+ '/governance-scenarios/versions'
148
+ )
149
+ });
150
+ return unwrapApiData(res);
151
+ }
152
+
153
+ module.exports = {
154
+ upsertDatasourceGovernancePack,
155
+ getDatasourceGovernancePack,
156
+ runDatasourceGovernanceScenarios,
157
+ generateDatasourceGovernancePack,
158
+ listDatasourceGovernancePackVersions
159
+ };
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @fileoverview Dataplane governance scenario acceptance API
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ const { createDataplaneApiClient } = require('./index');
8
+ const { unwrapApiData } = require('../utils/external-system-readiness-core');
9
+
10
+ /**
11
+ * Run governance scenario pack (ABAC visibility proof).
12
+ * POST /api/v1/governance/scenarios/run
13
+ * @requiresPermission {Dataplane} governance:evaluate
14
+ * @async
15
+ * @param {string} dataplaneUrl
16
+ * @param {Object} authConfig
17
+ * @param {import('./types/governance-scenarios.types').GovernanceScenariosRunRequest} body
18
+ * @returns {Promise<import('./types/governance-scenarios.types').GovernanceScenariosRunResponse>}
19
+ */
20
+ async function runGovernanceScenarios(dataplaneUrl, authConfig, body) {
21
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
22
+ const res = await client.post('/api/v1/governance/scenarios/run', { body });
23
+ if (res && res.success === false) {
24
+ const msg =
25
+ (res.error && (res.error.formattedError || res.error.error || res.error.message)) ||
26
+ res.formattedError ||
27
+ 'Governance scenario run failed';
28
+ throw new Error(msg);
29
+ }
30
+ const unwrapped = unwrapApiData(res);
31
+ if (!unwrapped || !unwrapped.summary) {
32
+ throw new Error('Governance scenario run returned an unexpected response shape');
33
+ }
34
+ return unwrapped;
35
+ }
36
+
37
+ module.exports = {
38
+ runGovernanceScenarios
39
+ };
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @fileoverview Groups API (Controller /api/v1/groups)
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/groups';
12
+
13
+ /**
14
+ * List groups (paginated)
15
+ * @requiresPermission {Controller} groups:read
16
+ * @async
17
+ * @param {string} controllerUrl
18
+ * @param {Object} authConfig
19
+ * @param {Object} [options]
20
+ * @returns {Promise<Object>}
21
+ */
22
+ async function listGroups(controllerUrl, authConfig, options = {}) {
23
+ const client = new ApiClient(controllerUrl, authConfig);
24
+ return await client.get(BASE, { params: options });
25
+ }
26
+
27
+ /**
28
+ * Get group by id or name
29
+ * @requiresPermission {Controller} groups:read
30
+ * @async
31
+ * @param {string} controllerUrl
32
+ * @param {Object} authConfig
33
+ * @param {string} groupIdOrName
34
+ * @param {Object} [options]
35
+ * @returns {Promise<Object>}
36
+ */
37
+ async function getGroup(controllerUrl, authConfig, groupIdOrName, options = {}) {
38
+ const client = new ApiClient(controllerUrl, authConfig);
39
+ const params = {};
40
+ if (options.includeMembers) {
41
+ params.includeMembers = 'true';
42
+ }
43
+ return await client.get(`${BASE}/${encodeURIComponent(groupIdOrName)}`, { params });
44
+ }
45
+
46
+ /**
47
+ * Create group
48
+ * @requiresPermission {Controller} groups:create
49
+ * @async
50
+ * @param {string} controllerUrl
51
+ * @param {Object} authConfig
52
+ * @param {Object} body
53
+ * @returns {Promise<Object>}
54
+ */
55
+ async function createGroup(controllerUrl, authConfig, body) {
56
+ const client = new ApiClient(controllerUrl, authConfig);
57
+ return await client.post(BASE, { body });
58
+ }
59
+
60
+ /**
61
+ * List group members
62
+ * @requiresPermission {Controller} groups:read
63
+ * @async
64
+ * @param {string} controllerUrl
65
+ * @param {Object} authConfig
66
+ * @param {string} groupIdOrName
67
+ * @returns {Promise<Object>}
68
+ */
69
+ async function listGroupMembers(controllerUrl, authConfig, groupIdOrName) {
70
+ const client = new ApiClient(controllerUrl, authConfig);
71
+ return await client.get(`${BASE}/${encodeURIComponent(groupIdOrName)}/members`);
72
+ }
73
+
74
+ module.exports = {
75
+ listGroups,
76
+ getGroup,
77
+ createGroup,
78
+ listGroupMembers
79
+ };