@aifabrix/builder 2.45.0 → 2.45.5

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 (180) hide show
  1. package/.cursor/rules/docs-rules.mdc +3 -1
  2. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
  3. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
  4. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
  5. package/jest.projects.js +44 -1
  6. package/lib/api/agent-metadata-validation.api.js +93 -0
  7. package/lib/api/audit-api-helpers.js +68 -0
  8. package/lib/api/audit.api.js +119 -0
  9. package/lib/api/auth-cache.api.js +44 -0
  10. package/lib/api/certificates.api.js +4 -4
  11. package/lib/api/credential.api.js +2 -2
  12. package/lib/api/dataplane-health.api.js +137 -0
  13. package/lib/api/dataplane-sync.api.js +27 -0
  14. package/lib/api/datasources-core.api.js +21 -18
  15. package/lib/api/datasources-extended.api.js +22 -22
  16. package/lib/api/dimensions.api.js +3 -0
  17. package/lib/api/external-systems.api.js +13 -13
  18. package/lib/api/governance-scenarios.api.js +39 -0
  19. package/lib/api/groups.api.js +79 -0
  20. package/lib/api/index.js +45 -2
  21. package/lib/api/pipeline.api.js +4 -4
  22. package/lib/api/protection.api.js +157 -0
  23. package/lib/api/records-bulk.api.js +30 -0
  24. package/lib/api/records-search-parse.js +49 -0
  25. package/lib/api/records-search.api.js +29 -0
  26. package/lib/api/types/agent-metadata-validation.types.js +67 -0
  27. package/lib/api/types/audit.types.js +72 -0
  28. package/lib/api/types/dataplane-health.types.js +27 -0
  29. package/lib/api/types/dimensions.types.js +2 -0
  30. package/lib/api/types/governance-scenarios.types.js +39 -0
  31. package/lib/api/types/protection.types.js +69 -0
  32. package/lib/api/types/records-bulk.types.js +35 -0
  33. package/lib/api/types/records-search.types.js +28 -0
  34. package/lib/api/user-groups.api.js +50 -0
  35. package/lib/api/users.api.js +95 -0
  36. package/lib/api/validation-run.api.js +3 -3
  37. package/lib/api/validation-runner.js +3 -3
  38. package/lib/api/wizard-platform.api.js +3 -3
  39. package/lib/api/wizard.api.js +21 -21
  40. package/lib/app/deploy.js +34 -19
  41. package/lib/cli/index.js +4 -2
  42. package/lib/cli/infra-guided.js +22 -3
  43. package/lib/cli/setup-app.help.js +50 -2
  44. package/lib/cli/setup-app.js +33 -24
  45. package/lib/cli/setup-app.test-commands.js +80 -21
  46. package/lib/cli/setup-auth.js +30 -3
  47. package/lib/cli/setup-external-system.js +37 -3
  48. package/lib/cli/setup-utility-help-after.js +45 -0
  49. package/lib/cli/setup-utility-resolve.js +2 -2
  50. package/lib/cli/setup-utility.js +99 -81
  51. package/lib/commands/auth-status-dataplane-version.js +231 -0
  52. package/lib/commands/auth-status-display.js +94 -0
  53. package/lib/commands/auth-status.js +70 -6
  54. package/lib/commands/credential-push.js +10 -5
  55. package/lib/commands/datasource-load-export-cli.js +178 -0
  56. package/lib/commands/datasource-test-trust-cli.js +114 -0
  57. package/lib/commands/datasource-unified-test-cli.js +25 -17
  58. package/lib/commands/datasource-unified-test-cli.options.js +18 -3
  59. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
  60. package/lib/commands/datasource-verify-audit-cli.js +96 -0
  61. package/lib/commands/datasource.js +68 -1
  62. package/lib/commands/dimension-value.js +43 -13
  63. package/lib/commands/dimension.js +38 -7
  64. package/lib/commands/identity-apply-sync.js +131 -0
  65. package/lib/commands/identity-group-cli.js +146 -0
  66. package/lib/commands/identity-membership-role-cache.js +175 -0
  67. package/lib/commands/identity-shared.js +94 -0
  68. package/lib/commands/identity-user-cli.js +158 -0
  69. package/lib/commands/identity.js +43 -0
  70. package/lib/commands/login.js +46 -16
  71. package/lib/commands/protection-cli-leaves.js +286 -0
  72. package/lib/commands/protection.js +50 -0
  73. package/lib/commands/repair.js +13 -3
  74. package/lib/commands/test-e2e-external.js +40 -9
  75. package/lib/commands/test-governance-cli-options.js +47 -0
  76. package/lib/commands/test-governance-command-action.js +55 -0
  77. package/lib/commands/test-governance-external.js +88 -0
  78. package/lib/commands/test-trust-cli-options.js +32 -0
  79. package/lib/commands/test-trust-command-action.js +118 -0
  80. package/lib/commands/test-trust-external.js +127 -0
  81. package/lib/commands/upload.js +34 -13
  82. package/lib/commands/wizard-core.js +3 -0
  83. package/lib/core/config-device-dataplane.js +185 -0
  84. package/lib/datasource/agent-trust-debug-log.js +45 -0
  85. package/lib/datasource/agent-trust-fetch.js +115 -0
  86. package/lib/datasource/agent-trust-map.js +101 -0
  87. package/lib/datasource/agent-trust-mock.js +44 -0
  88. package/lib/datasource/agent-trust-run.js +93 -0
  89. package/lib/datasource/agent-trust-timeout.js +25 -0
  90. package/lib/datasource/audit-evidence-display.js +80 -0
  91. package/lib/datasource/audit-evidence-extract-debug.js +103 -0
  92. package/lib/datasource/audit-evidence-extract.js +177 -0
  93. package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
  94. package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
  95. package/lib/datasource/audit-evidence-poll.js +109 -0
  96. package/lib/datasource/audit-evidence-run.js +177 -0
  97. package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
  98. package/lib/datasource/audit-evidence-verify-matrix.js +177 -0
  99. package/lib/datasource/audit-evidence-verify.js +108 -0
  100. package/lib/datasource/bulk-loader-run-batches.js +88 -0
  101. package/lib/datasource/bulk-loader-service-retry.js +52 -0
  102. package/lib/datasource/bulk-loader-service.js +127 -0
  103. package/lib/datasource/capability/run-capability-dimension.js +2 -1
  104. package/lib/datasource/datasource-exporter-resolve.js +82 -0
  105. package/lib/datasource/datasource-exporter-service.js +144 -0
  106. package/lib/datasource/datasource-identifier.js +148 -0
  107. package/lib/datasource/datasource-load-export-context.js +92 -0
  108. package/lib/datasource/integration-context.js +6 -4
  109. package/lib/datasource/local-data-paths.js +145 -0
  110. package/lib/datasource/log-cleaner.js +241 -0
  111. package/lib/datasource/log-viewer.js +111 -6
  112. package/lib/datasource/record-file-parser.js +85 -0
  113. package/lib/datasource/record-mapper.js +129 -0
  114. package/lib/datasource/resolve-app.js +74 -55
  115. package/lib/datasource/test-e2e.js +26 -2
  116. package/lib/datasource/unified-validation-run-resolve.js +45 -12
  117. package/lib/datasource/unified-validation-run.js +43 -17
  118. package/lib/datasource/validate.js +37 -20
  119. package/lib/external-system/test-system-level.js +25 -4
  120. package/lib/external-system/test.js +3 -1
  121. package/lib/governance/governance-pack-loader.js +70 -0
  122. package/lib/governance/governance-run-display.js +119 -0
  123. package/lib/identity/identity-apply-core.js +108 -0
  124. package/lib/identity/identity-apply-phases.js +244 -0
  125. package/lib/identity/identity-apply-service.js +77 -0
  126. package/lib/identity/identity-csv-parser.js +114 -0
  127. package/lib/internal/fs-real-sync.js +29 -1
  128. package/lib/protection/auth-context.js +45 -0
  129. package/lib/protection/convert-batch.js +90 -0
  130. package/lib/protection/load.js +41 -0
  131. package/lib/protection/paths.js +158 -0
  132. package/lib/protection/preflight-datasource-ready.js +46 -0
  133. package/lib/protection/protection-create-probe-lines.js +142 -0
  134. package/lib/protection/protection-create-probes.js +95 -0
  135. package/lib/protection/protection-create-scaffold.js +281 -0
  136. package/lib/protection/protection-display-helpers.js +445 -0
  137. package/lib/protection/protection-display.js +215 -0
  138. package/lib/protection/protection-preset-registry.js +97 -0
  139. package/lib/protection/report-exit.js +62 -0
  140. package/lib/protection/resolve.js +202 -0
  141. package/lib/protection/run-commands-validate.js +130 -0
  142. package/lib/protection/run-commands.js +216 -0
  143. package/lib/protection/run-protection-create-helpers.js +134 -0
  144. package/lib/protection/run-protection-create-probes-flow.js +43 -0
  145. package/lib/protection/run-protection-create.js +191 -0
  146. package/lib/protection/scope.js +22 -0
  147. package/lib/protection/sync-after-upload.js +64 -0
  148. package/lib/protection/upload-batch.js +127 -0
  149. package/lib/protection/validate-batch.js +113 -0
  150. package/lib/protection/validate-local.js +65 -0
  151. package/lib/resolvers/dimension-file.js +29 -4
  152. package/lib/schema/external-datasource.schema.json +47 -13
  153. package/lib/schema/flag-map-validation-run.json +2 -2
  154. package/lib/schema/protection.schema.json +374 -0
  155. package/lib/schema/type/credential-field-registry.json +636 -0
  156. package/lib/schema/wizard-config.schema.json +1 -1
  157. package/lib/utils/agent-trust-run-display.js +231 -0
  158. package/lib/utils/agent-trust-run-exit.js +59 -0
  159. package/lib/utils/agent-trust-wait-ui.js +94 -0
  160. package/lib/utils/cli-exit-codes.js +30 -0
  161. package/lib/utils/cli-sync-options.js +33 -0
  162. package/lib/utils/credential-push-ui.js +90 -0
  163. package/lib/utils/dataplane-cli-version-gate.js +202 -0
  164. package/lib/utils/dataplane-cli-version-help.js +74 -0
  165. package/lib/utils/datasource-export-display.js +137 -0
  166. package/lib/utils/datasource-load-display.js +174 -0
  167. package/lib/utils/datasource-load-export-ui.js +120 -0
  168. package/lib/utils/datasource-test-run-capability-scope.js +3 -3
  169. package/lib/utils/datasource-test-run-display.js +3 -3
  170. package/lib/utils/datasource-test-run-tty-log.js +5 -1
  171. package/lib/utils/help-builder.js +30 -24
  172. package/lib/utils/manifest-source-emit.js +22 -0
  173. package/lib/utils/semver-compare.js +127 -0
  174. package/lib/utils/upload-pipeline-ui.js +91 -0
  175. package/lib/utils/validation-poll-ui.js +14 -7
  176. package/lib/validation/wizard-config-validator.js +58 -19
  177. package/package.json +1 -1
  178. package/templates/applications/dataplane/env.template +13 -1
  179. package/templates/applications/dataplane/rbac.yaml +4 -0
  180. package/templates/external-system/README.md.hbs +56 -8
@@ -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,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
+ };
package/lib/api/index.js CHANGED
@@ -20,7 +20,7 @@ class ApiClient {
20
20
  * @param {string} [authConfig.type] - Auth type ('bearer' | 'client-token')
21
21
  * @param {string} [authConfig.token] - Bearer token
22
22
  */
23
- constructor(baseUrl, authConfig = {}) {
23
+ constructor(baseUrl, authConfig = {}, clientOptions = {}) {
24
24
  if (baseUrl === null || baseUrl === undefined || typeof baseUrl !== 'string') {
25
25
  throw new Error('baseUrl is required and must be a string');
26
26
  }
@@ -30,6 +30,25 @@ class ApiClient {
30
30
  }
31
31
  this.baseUrl = trimmedUrl;
32
32
  this.authConfig = authConfig;
33
+ const opts = clientOptions && typeof clientOptions === 'object' ? clientOptions : {};
34
+ this.enforceCliVersion = Boolean(opts.enforceCliVersion);
35
+ this.controllerUrlForGate = opts.controllerUrl || null;
36
+ }
37
+
38
+ /**
39
+ * Plan 142.0: block dataplane mutations when Builder CLI is below minimum.
40
+ * @private
41
+ * @async
42
+ * @returns {Promise<void>}
43
+ */
44
+ async _ensureDataplaneCliVersionGate() {
45
+ if (!this.enforceCliVersion) {
46
+ return;
47
+ }
48
+ const { assertDataplaneCliVersionCompatible } = require('../utils/dataplane-cli-version-gate');
49
+ await assertDataplaneCliVersionCompatible(this.baseUrl, {
50
+ controllerUrl: this.controllerUrlForGate
51
+ });
33
52
  }
34
53
 
35
54
  /**
@@ -78,6 +97,7 @@ class ApiClient {
78
97
  * @returns {Promise<Object>} API response
79
98
  */
80
99
  async get(endpoint, options = {}) {
100
+ await this._ensureDataplaneCliVersionGate();
81
101
  let url = this._buildUrl(endpoint);
82
102
  const headers = this._buildHeaders(options.headers);
83
103
 
@@ -119,6 +139,7 @@ class ApiClient {
119
139
  * @returns {Promise<Object>} API response
120
140
  */
121
141
  async post(endpoint, options = {}) {
142
+ await this._ensureDataplaneCliVersionGate();
122
143
  let url = this._buildUrl(endpoint);
123
144
  const headers = this._buildHeaders(options.headers);
124
145
 
@@ -167,6 +188,7 @@ class ApiClient {
167
188
  * @returns {Promise<Object>} API response
168
189
  */
169
190
  async postFormData(endpoint, formData, options = {}) {
191
+ await this._ensureDataplaneCliVersionGate();
170
192
  const url = this._buildUrl(endpoint);
171
193
  const headers = this._buildHeaders(options.headers || {}, { skipContentType: true });
172
194
 
@@ -194,6 +216,7 @@ class ApiClient {
194
216
  * @returns {Promise<Object>} API response
195
217
  */
196
218
  async patch(endpoint, options = {}) {
219
+ await this._ensureDataplaneCliVersionGate();
197
220
  const url = this._buildUrl(endpoint);
198
221
  const headers = this._buildHeaders(options.headers);
199
222
 
@@ -224,6 +247,7 @@ class ApiClient {
224
247
  * @returns {Promise<Object>} API response
225
248
  */
226
249
  async put(endpoint, options = {}) {
250
+ await this._ensureDataplaneCliVersionGate();
227
251
  const url = this._buildUrl(endpoint);
228
252
  const headers = this._buildHeaders(options.headers);
229
253
 
@@ -253,6 +277,7 @@ class ApiClient {
253
277
  * @returns {Promise<Object>} API response
254
278
  */
255
279
  async delete(endpoint, options = {}) {
280
+ await this._ensureDataplaneCliVersionGate();
256
281
  const url = this._buildUrl(endpoint);
257
282
  const headers = this._buildHeaders(options.headers);
258
283
 
@@ -270,7 +295,25 @@ class ApiClient {
270
295
  }
271
296
  }
272
297
 
298
+ /**
299
+ * Dataplane-scoped client — enforces Builder CLI version gate before each request.
300
+ * Do not use for `fetchDataplaneGeneralHealth` (health must stay ungated).
301
+ *
302
+ * @param {string} dataplaneUrl - Dataplane base URL
303
+ * @param {Object} authConfig - Authentication configuration
304
+ * @param {Object} [options]
305
+ * @param {string} [options.controllerUrl] - Controller URL for device cache lookup
306
+ * @returns {ApiClient}
307
+ */
308
+ function createDataplaneApiClient(dataplaneUrl, authConfig, options = {}) {
309
+ return new ApiClient(dataplaneUrl, authConfig, {
310
+ enforceCliVersion: true,
311
+ controllerUrl: options.controllerUrl
312
+ });
313
+ }
314
+
273
315
  module.exports = {
274
- ApiClient
316
+ ApiClient,
317
+ createDataplaneApiClient
275
318
  };
276
319
 
@@ -4,7 +4,7 @@
4
4
  * @version 2.0.0
5
5
  */
6
6
 
7
- const { ApiClient } = require('./index');
7
+ const { ApiClient, createDataplaneApiClient } = require('./index');
8
8
  const { postValidationRunAndOptionalPoll } = require('./validation-runner');
9
9
 
10
10
  /**
@@ -127,7 +127,7 @@ async function getPipelineHealth(controllerUrl, envKey) {
127
127
  * @throws {Error} If publish fails
128
128
  */
129
129
  async function publishDatasourceViaPipeline(dataplaneUrl, systemKey, authConfig, datasourceConfig) {
130
- const client = new ApiClient(dataplaneUrl, authConfig);
130
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
131
131
  return await client.post(`/api/v1/pipeline/${systemKey}/upload`, {
132
132
  body: datasourceConfig
133
133
  });
@@ -147,7 +147,7 @@ async function publishDatasourceViaPipeline(dataplaneUrl, systemKey, authConfig,
147
147
  * @throws {Error} If request fails
148
148
  */
149
149
  async function validatePipelineConfig(dataplaneUrl, authConfig, { config }) {
150
- const client = new ApiClient(dataplaneUrl, authConfig);
150
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
151
151
  return await client.post('/api/v1/pipeline/validate', {
152
152
  body: { config }
153
153
  });
@@ -247,7 +247,7 @@ async function testDatasourceViaPipeline({ dataplaneUrl, systemKey, datasourceKe
247
247
  */
248
248
  async function uploadApplicationViaPipeline(dataplaneUrl, authConfig, payload) {
249
249
  const body = { ...payload, status: payload.status ?? 'draft' };
250
- const client = new ApiClient(dataplaneUrl, authConfig);
250
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
251
251
  return await client.post('/api/v1/pipeline/upload', {
252
252
  body
253
253
  });