@aifabrix/builder 2.44.6 → 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 (257) hide show
  1. package/.cursor/rules/cli-layout.mdc +7 -3
  2. package/.cursor/rules/docs-rules.mdc +3 -1
  3. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
  4. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
  5. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
  6. package/jest.projects.js +100 -1
  7. package/lib/api/agent-metadata-validation.api.js +93 -0
  8. package/lib/api/audit-api-helpers.js +68 -0
  9. package/lib/api/audit.api.js +119 -0
  10. package/lib/api/auth-cache.api.js +44 -0
  11. package/lib/api/certificates.api.js +4 -4
  12. package/lib/api/credential.api.js +2 -2
  13. package/lib/api/dataplane-health.api.js +137 -0
  14. package/lib/api/dataplane-sync.api.js +27 -0
  15. package/lib/api/datasources-core.api.js +21 -18
  16. package/lib/api/datasources-extended.api.js +22 -22
  17. package/lib/api/dimensions.api.js +3 -0
  18. package/lib/api/external-systems.api.js +13 -13
  19. package/lib/api/governance-scenarios.api.js +39 -0
  20. package/lib/api/groups.api.js +79 -0
  21. package/lib/api/index.js +45 -2
  22. package/lib/api/pipeline.api.js +4 -4
  23. package/lib/api/protection.api.js +157 -0
  24. package/lib/api/records-bulk.api.js +30 -0
  25. package/lib/api/records-search-parse.js +49 -0
  26. package/lib/api/records-search.api.js +29 -0
  27. package/lib/api/types/agent-metadata-validation.types.js +67 -0
  28. package/lib/api/types/audit.types.js +72 -0
  29. package/lib/api/types/dataplane-health.types.js +27 -0
  30. package/lib/api/types/dimensions.types.js +2 -0
  31. package/lib/api/types/governance-scenarios.types.js +39 -0
  32. package/lib/api/types/protection.types.js +69 -0
  33. package/lib/api/types/records-bulk.types.js +35 -0
  34. package/lib/api/types/records-search.types.js +28 -0
  35. package/lib/api/user-groups.api.js +50 -0
  36. package/lib/api/users.api.js +95 -0
  37. package/lib/api/validation-run.api.js +3 -3
  38. package/lib/api/validation-runner.js +3 -3
  39. package/lib/api/wizard-platform.api.js +3 -3
  40. package/lib/api/wizard.api.js +21 -21
  41. package/lib/app/deploy.js +34 -19
  42. package/lib/app/helpers.js +3 -3
  43. package/lib/app/index.js +3 -3
  44. package/lib/app/register.js +7 -6
  45. package/lib/app/restart-display.js +52 -21
  46. package/lib/app/rotate-secret.js +7 -6
  47. package/lib/app/run-helpers.js +15 -8
  48. package/lib/app/run.js +57 -9
  49. package/lib/app/show-display.js +7 -0
  50. package/lib/app/show.js +87 -5
  51. package/lib/build/index.js +9 -5
  52. package/lib/cli/index.js +4 -2
  53. package/lib/cli/infra-guided.js +62 -28
  54. package/lib/cli/installation-log-command.js +73 -0
  55. package/lib/cli/setup-app.help.js +50 -2
  56. package/lib/cli/setup-app.js +44 -25
  57. package/lib/cli/setup-app.test-commands.js +80 -21
  58. package/lib/cli/setup-auth.js +124 -52
  59. package/lib/cli/setup-external-system.js +37 -3
  60. package/lib/cli/setup-infra-up-dataplane-action.js +111 -0
  61. package/lib/cli/setup-infra-up-platform-action.js +131 -0
  62. package/lib/cli/setup-infra.js +60 -119
  63. package/lib/cli/setup-platform.js +1 -1
  64. package/lib/cli/setup-utility-help-after.js +45 -0
  65. package/lib/cli/setup-utility-resolve.js +132 -0
  66. package/lib/cli/setup-utility.js +148 -116
  67. package/lib/commands/app-logs.js +81 -33
  68. package/lib/commands/auth-config.js +116 -18
  69. package/lib/commands/auth-status-dataplane-version.js +231 -0
  70. package/lib/commands/auth-status-display.js +94 -0
  71. package/lib/commands/auth-status.js +70 -6
  72. package/lib/commands/credential-push.js +10 -5
  73. package/lib/commands/datasource-load-export-cli.js +178 -0
  74. package/lib/commands/datasource-test-trust-cli.js +114 -0
  75. package/lib/commands/datasource-unified-test-cli.js +25 -17
  76. package/lib/commands/datasource-unified-test-cli.options.js +18 -3
  77. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
  78. package/lib/commands/datasource-verify-audit-cli.js +96 -0
  79. package/lib/commands/datasource.js +68 -1
  80. package/lib/commands/dimension-value.js +43 -13
  81. package/lib/commands/dimension.js +38 -7
  82. package/lib/commands/identity-apply-sync.js +131 -0
  83. package/lib/commands/identity-group-cli.js +146 -0
  84. package/lib/commands/identity-membership-role-cache.js +175 -0
  85. package/lib/commands/identity-shared.js +94 -0
  86. package/lib/commands/identity-user-cli.js +158 -0
  87. package/lib/commands/identity.js +43 -0
  88. package/lib/commands/login.js +46 -16
  89. package/lib/commands/protection-cli-leaves.js +286 -0
  90. package/lib/commands/protection.js +50 -0
  91. package/lib/commands/repair.js +13 -3
  92. package/lib/commands/setup-modes.js +19 -6
  93. package/lib/commands/setup-prompts.js +41 -8
  94. package/lib/commands/setup.js +114 -9
  95. package/lib/commands/teardown.js +54 -5
  96. package/lib/commands/test-e2e-external.js +40 -9
  97. package/lib/commands/test-governance-cli-options.js +47 -0
  98. package/lib/commands/test-governance-command-action.js +55 -0
  99. package/lib/commands/test-governance-external.js +88 -0
  100. package/lib/commands/test-trust-cli-options.js +32 -0
  101. package/lib/commands/test-trust-command-action.js +118 -0
  102. package/lib/commands/test-trust-external.js +127 -0
  103. package/lib/commands/up-common.js +48 -14
  104. package/lib/commands/up-dataplane.js +21 -18
  105. package/lib/commands/up-miso.js +12 -8
  106. package/lib/commands/upload.js +38 -15
  107. package/lib/commands/wizard-core.js +3 -0
  108. package/lib/core/audit-logger.js +1 -34
  109. package/lib/core/config-admin-email.js +56 -0
  110. package/lib/core/config-device-dataplane.js +185 -0
  111. package/lib/core/config-normalize.js +60 -0
  112. package/lib/core/config-registered-controller-urls.js +54 -0
  113. package/lib/core/config.js +33 -50
  114. package/lib/core/secrets-ensure-infra.js +1 -1
  115. package/lib/core/secrets-env-content.js +86 -90
  116. package/lib/core/secrets-env-declarative-expand.js +170 -0
  117. package/lib/core/secrets-env-write.js +2 -0
  118. package/lib/core/secrets-load.js +106 -102
  119. package/lib/datasource/agent-trust-debug-log.js +45 -0
  120. package/lib/datasource/agent-trust-fetch.js +115 -0
  121. package/lib/datasource/agent-trust-map.js +101 -0
  122. package/lib/datasource/agent-trust-mock.js +44 -0
  123. package/lib/datasource/agent-trust-run.js +93 -0
  124. package/lib/datasource/agent-trust-timeout.js +25 -0
  125. package/lib/datasource/audit-evidence-display.js +80 -0
  126. package/lib/datasource/audit-evidence-extract-debug.js +103 -0
  127. package/lib/datasource/audit-evidence-extract.js +177 -0
  128. package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
  129. package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
  130. package/lib/datasource/audit-evidence-poll.js +109 -0
  131. package/lib/datasource/audit-evidence-run.js +177 -0
  132. package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
  133. package/lib/datasource/audit-evidence-verify-matrix.js +177 -0
  134. package/lib/datasource/audit-evidence-verify.js +108 -0
  135. package/lib/datasource/bulk-loader-run-batches.js +88 -0
  136. package/lib/datasource/bulk-loader-service-retry.js +52 -0
  137. package/lib/datasource/bulk-loader-service.js +127 -0
  138. package/lib/datasource/capability/run-capability-dimension.js +2 -1
  139. package/lib/datasource/datasource-exporter-resolve.js +82 -0
  140. package/lib/datasource/datasource-exporter-service.js +144 -0
  141. package/lib/datasource/datasource-identifier.js +148 -0
  142. package/lib/datasource/datasource-load-export-context.js +92 -0
  143. package/lib/datasource/integration-context.js +6 -4
  144. package/lib/datasource/local-data-paths.js +145 -0
  145. package/lib/datasource/log-cleaner.js +241 -0
  146. package/lib/datasource/log-viewer.js +111 -6
  147. package/lib/datasource/record-file-parser.js +85 -0
  148. package/lib/datasource/record-mapper.js +129 -0
  149. package/lib/datasource/resolve-app.js +74 -55
  150. package/lib/datasource/test-e2e.js +26 -2
  151. package/lib/datasource/unified-validation-run-resolve.js +45 -12
  152. package/lib/datasource/unified-validation-run.js +43 -17
  153. package/lib/datasource/validate.js +37 -20
  154. package/lib/external-system/deploy.js +5 -1
  155. package/lib/external-system/test-system-level.js +25 -4
  156. package/lib/external-system/test.js +3 -1
  157. package/lib/governance/governance-pack-loader.js +70 -0
  158. package/lib/governance/governance-run-display.js +119 -0
  159. package/lib/identity/identity-apply-core.js +108 -0
  160. package/lib/identity/identity-apply-phases.js +244 -0
  161. package/lib/identity/identity-apply-service.js +77 -0
  162. package/lib/identity/identity-csv-parser.js +114 -0
  163. package/lib/internal/fs-real-sync.js +29 -1
  164. package/lib/internal/node-fs.js +2 -0
  165. package/lib/protection/auth-context.js +45 -0
  166. package/lib/protection/convert-batch.js +90 -0
  167. package/lib/protection/load.js +41 -0
  168. package/lib/protection/paths.js +158 -0
  169. package/lib/protection/preflight-datasource-ready.js +46 -0
  170. package/lib/protection/protection-create-probe-lines.js +142 -0
  171. package/lib/protection/protection-create-probes.js +95 -0
  172. package/lib/protection/protection-create-scaffold.js +281 -0
  173. package/lib/protection/protection-display-helpers.js +445 -0
  174. package/lib/protection/protection-display.js +215 -0
  175. package/lib/protection/protection-preset-registry.js +97 -0
  176. package/lib/protection/report-exit.js +62 -0
  177. package/lib/protection/resolve.js +202 -0
  178. package/lib/protection/run-commands-validate.js +130 -0
  179. package/lib/protection/run-commands.js +216 -0
  180. package/lib/protection/run-protection-create-helpers.js +134 -0
  181. package/lib/protection/run-protection-create-probes-flow.js +43 -0
  182. package/lib/protection/run-protection-create.js +191 -0
  183. package/lib/protection/scope.js +22 -0
  184. package/lib/protection/sync-after-upload.js +64 -0
  185. package/lib/protection/upload-batch.js +127 -0
  186. package/lib/protection/validate-batch.js +113 -0
  187. package/lib/protection/validate-local.js +65 -0
  188. package/lib/resolvers/dimension-file.js +29 -4
  189. package/lib/schema/application-schema.json +4 -0
  190. package/lib/schema/external-datasource.schema.json +47 -13
  191. package/lib/schema/flag-map-validation-run.json +2 -2
  192. package/lib/schema/infra.parameter.yaml +10 -0
  193. package/lib/schema/protection.schema.json +374 -0
  194. package/lib/schema/type/credential-field-registry.json +636 -0
  195. package/lib/schema/wizard-config.schema.json +1 -1
  196. package/lib/utils/agent-trust-run-display.js +231 -0
  197. package/lib/utils/agent-trust-run-exit.js +59 -0
  198. package/lib/utils/agent-trust-wait-ui.js +94 -0
  199. package/lib/utils/app-config-resolver.js +24 -1
  200. package/lib/utils/applications-config-defaults.js +206 -0
  201. package/lib/utils/auth-config-validator.js +2 -12
  202. package/lib/utils/bash-secret-env.js +1 -1
  203. package/lib/utils/cli-exit-codes.js +30 -0
  204. package/lib/utils/cli-sync-options.js +33 -0
  205. package/lib/utils/compose-generate-docker-compose.js +111 -6
  206. package/lib/utils/compose-generator.js +17 -8
  207. package/lib/utils/controller-url.js +50 -7
  208. package/lib/utils/credential-push-ui.js +90 -0
  209. package/lib/utils/dataplane-cli-version-gate.js +202 -0
  210. package/lib/utils/dataplane-cli-version-help.js +74 -0
  211. package/lib/utils/datasource-export-display.js +137 -0
  212. package/lib/utils/datasource-load-display.js +174 -0
  213. package/lib/utils/datasource-load-export-ui.js +120 -0
  214. package/lib/utils/datasource-test-run-capability-scope.js +3 -3
  215. package/lib/utils/datasource-test-run-display.js +3 -3
  216. package/lib/utils/datasource-test-run-tty-log.js +5 -1
  217. package/lib/utils/env-copy.js +99 -14
  218. package/lib/utils/env-template.js +5 -1
  219. package/lib/utils/health-check-url.js +18 -15
  220. package/lib/utils/health-check.js +7 -5
  221. package/lib/utils/help-builder.js +30 -24
  222. package/lib/utils/infra-optional-service-flags.js +69 -0
  223. package/lib/utils/installation-log-core.js +282 -0
  224. package/lib/utils/installation-log-record.js +237 -0
  225. package/lib/utils/installation-log.js +123 -0
  226. package/lib/utils/log-redaction.js +105 -0
  227. package/lib/utils/manifest-location.js +164 -0
  228. package/lib/utils/manifest-source-emit.js +184 -0
  229. package/lib/utils/paths.js +238 -89
  230. package/lib/utils/remote-secrets-loader.js +7 -1
  231. package/lib/utils/run-cli-flags.js +29 -0
  232. package/lib/utils/secrets-canonical.js +10 -3
  233. package/lib/utils/secrets-path.js +3 -4
  234. package/lib/utils/secrets-utils.js +20 -10
  235. package/lib/utils/semver-compare.js +127 -0
  236. package/lib/utils/system-builder-root.js +10 -2
  237. package/lib/utils/upload-pipeline-ui.js +91 -0
  238. package/lib/utils/url-declarative-public-base.js +80 -12
  239. package/lib/utils/url-declarative-resolve-build-urls.js +238 -0
  240. package/lib/utils/url-declarative-resolve-build.js +24 -393
  241. package/lib/utils/url-declarative-resolve-expand-token.js +189 -0
  242. package/lib/utils/url-declarative-resolve-load-doc.js +12 -3
  243. package/lib/utils/url-declarative-resolve-surface-state.js +102 -0
  244. package/lib/utils/url-declarative-resolve.js +47 -7
  245. package/lib/utils/url-declarative-runtime-base-path.js +21 -1
  246. package/lib/utils/urls-local-registry-scan.js +103 -0
  247. package/lib/utils/urls-local-registry.js +161 -90
  248. package/lib/utils/validation-poll-ui.js +14 -7
  249. package/lib/validation/wizard-config-validator.js +58 -19
  250. package/package.json +3 -1
  251. package/templates/applications/dataplane/application.yaml +4 -0
  252. package/templates/applications/dataplane/env.template +13 -1
  253. package/templates/applications/dataplane/rbac.yaml +4 -0
  254. package/templates/applications/miso-controller/application.yaml +2 -0
  255. package/templates/applications/miso-controller/env.template +27 -29
  256. package/templates/external-system/README.md.hbs +56 -8
  257. package/.npmrc.token +0 -1
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
  });
@@ -0,0 +1,157 @@
1
+ /**
2
+ * @fileoverview Protection manifest API (dataplane /api/v1/protection/*).
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { createDataplaneApiClient } = require('./index');
10
+ const { unwrapApiData } = require('../utils/external-system-readiness-core');
11
+
12
+ const BASE = '/api/v1/protection';
13
+
14
+ /**
15
+ * @param {*} res
16
+ * @returns {*}
17
+ */
18
+ function unwrapBody(res) {
19
+ return unwrapApiData(res) ?? res;
20
+ }
21
+
22
+ /**
23
+ * POST /api/v1/protection/validate
24
+ * @requiresPermission {Dataplane} external-system:read
25
+ */
26
+ async function validateProtection(dataplaneUrl, authConfig, manifest, opts = {}) {
27
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
28
+ const params = {};
29
+ if (opts.strict === true) params.strict = true;
30
+ if (opts.explain === true) params.explain = true;
31
+ const res = await client.post(`${BASE}/validate`, {
32
+ body: { manifest },
33
+ params
34
+ });
35
+ return unwrapBody(res);
36
+ }
37
+
38
+ /**
39
+ * POST /api/v1/protection/simulate
40
+ * @requiresPermission {Dataplane} external-system:read
41
+ */
42
+ async function simulateProtection(dataplaneUrl, authConfig, manifest, opts = {}) {
43
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
44
+ const params = {};
45
+ if (opts.strict === true) params.strict = true;
46
+ if (opts.explain === true) params.explain = true;
47
+ if (opts.sampleSize !== undefined && opts.sampleSize !== null) {
48
+ params.sampleSize = opts.sampleSize;
49
+ }
50
+ const res = await client.post(`${BASE}/simulate`, {
51
+ body: { manifest },
52
+ params
53
+ });
54
+ return unwrapBody(res);
55
+ }
56
+
57
+ /**
58
+ * POST /api/v1/protection/upload
59
+ * @requiresPermission {Dataplane} external-system:publish
60
+ */
61
+ async function uploadProtection(dataplaneUrl, authConfig, manifest) {
62
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
63
+ const res = await client.post(`${BASE}/upload`, { body: { manifest } });
64
+ return unwrapBody(res);
65
+ }
66
+
67
+ /**
68
+ * GET /api/v1/protection/{key}
69
+ * @requiresPermission {Dataplane} external-system:read
70
+ */
71
+ async function getProtection(dataplaneUrl, authConfig, key) {
72
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
73
+ const res = await client.get(`${BASE}/${encodeURIComponent(key)}`);
74
+ return unwrapBody(res);
75
+ }
76
+
77
+ /**
78
+ * GET /api/v1/protection/{key}/status
79
+ * @requiresPermission {Dataplane} external-system:read
80
+ */
81
+ async function getProtectionStatus(dataplaneUrl, authConfig, key) {
82
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
83
+ const res = await client.get(`${BASE}/${encodeURIComponent(key)}/status`);
84
+ return unwrapBody(res);
85
+ }
86
+
87
+ /**
88
+ * @param {*} body
89
+ * @returns {Object[]}
90
+ */
91
+ function extractProtectionListItems(body) {
92
+ if (!body || typeof body !== 'object') {
93
+ return [];
94
+ }
95
+ if (Array.isArray(body.data)) {
96
+ return body.data;
97
+ }
98
+ if (Array.isArray(body.items)) {
99
+ return body.items;
100
+ }
101
+ if (Array.isArray(body)) {
102
+ return body;
103
+ }
104
+ return [];
105
+ }
106
+
107
+ /**
108
+ * GET /api/v1/protection
109
+ * @requiresPermission {Dataplane} external-system:read
110
+ * @returns {Promise<{ items: Object[], meta: Object|null, raw: * }>}
111
+ */
112
+ async function listProtectionManifests(dataplaneUrl, authConfig, options = {}) {
113
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
114
+ const res = await client.get(BASE, { params: options });
115
+ const body = unwrapBody(res);
116
+ return {
117
+ items: extractProtectionListItems(body),
118
+ meta: body && typeof body === 'object' && body.meta ? body.meta : null,
119
+ raw: body
120
+ };
121
+ }
122
+
123
+ /**
124
+ * DELETE /api/v1/protection/{key}
125
+ * @requiresPermission {Dataplane} external-system:delete
126
+ */
127
+ async function deleteProtection(dataplaneUrl, authConfig, key) {
128
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
129
+ return await client.delete(`${BASE}/${encodeURIComponent(key)}`);
130
+ }
131
+
132
+ /**
133
+ * Find deployed protection key by datasource key (client-side scan).
134
+ * @param {string} dataplaneUrl
135
+ * @param {Object} authConfig
136
+ * @param {string} datasourceKey
137
+ * @returns {Promise<string|null>}
138
+ */
139
+ async function findProtectionKeyByDatasource(dataplaneUrl, authConfig, datasourceKey) {
140
+ const { items } = await listProtectionManifests(dataplaneUrl, authConfig, {
141
+ page: 1,
142
+ pageSize: 100
143
+ });
144
+ const match = items.find((row) => String(row?.datasourceKey || '').trim() === datasourceKey);
145
+ return match?.key ? String(match.key) : null;
146
+ }
147
+
148
+ module.exports = {
149
+ validateProtection,
150
+ simulateProtection,
151
+ uploadProtection,
152
+ getProtection,
153
+ getProtectionStatus,
154
+ listProtectionManifests,
155
+ deleteProtection,
156
+ findProtectionKeyByDatasource
157
+ };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @fileoverview Dataplane bulk record sync API (data-storage records/bulk)
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ const { createDataplaneApiClient } = require('./index');
8
+
9
+ /**
10
+ * Bulk sync external records for a datasource.
11
+ * POST /api/v1/data-storage/{sourceIdOrKey}/records/bulk
12
+ * @requiresPermission {Dataplane} external-data-source:sync
13
+ * @async
14
+ * @param {string} dataplaneUrl
15
+ * @param {string} sourceIdOrKey
16
+ * @param {Object} authConfig
17
+ * @param {import('./types/records-bulk.types').ExternalRecordBulkRequest} body
18
+ * @returns {Promise<import('./types/records-bulk.types').ExternalRecordBulkResponse>}
19
+ */
20
+ async function bulkSyncRecords(dataplaneUrl, sourceIdOrKey, authConfig, body) {
21
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
22
+ return await client.post(
23
+ `/api/v1/data-storage/${encodeURIComponent(sourceIdOrKey)}/records/bulk`,
24
+ { body }
25
+ );
26
+ }
27
+
28
+ module.exports = {
29
+ bulkSyncRecords
30
+ };
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @fileoverview Normalize dataplane Records Search client responses
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ /**
10
+ * Unwrap ApiClient `{ success, data: { data, meta, links } }` to a flat search result.
11
+ * @param {Object} response - Raw client.post result
12
+ * @returns {{ success: boolean, data: Array, meta: Object, links?: Object, status?: number, error?: string, formattedError?: string }}
13
+ */
14
+ function normalizeRecordsSearchClientResponse(response) {
15
+ if (!response || response.success !== true) {
16
+ return response || { success: false, data: [], meta: {} };
17
+ }
18
+
19
+ const body = response.data;
20
+ if (body && typeof body === 'object' && Array.isArray(body.data)) {
21
+ return {
22
+ success: true,
23
+ data: body.data,
24
+ meta: body.meta && typeof body.meta === 'object' ? body.meta : {},
25
+ links: body.links,
26
+ status: response.status
27
+ };
28
+ }
29
+
30
+ if (Array.isArray(body)) {
31
+ return {
32
+ success: true,
33
+ data: body,
34
+ meta: response.meta && typeof response.meta === 'object' ? response.meta : {},
35
+ status: response.status
36
+ };
37
+ }
38
+
39
+ return {
40
+ success: true,
41
+ data: [],
42
+ meta: body && typeof body === 'object' && body.meta ? body.meta : {},
43
+ status: response.status
44
+ };
45
+ }
46
+
47
+ module.exports = {
48
+ normalizeRecordsSearchClientResponse
49
+ };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @fileoverview Dataplane Records Search API
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ const { createDataplaneApiClient } = require('./index');
8
+ const { normalizeRecordsSearchClientResponse } = require('./records-search-parse');
9
+
10
+ /**
11
+ * Search records across datasources (governed read path).
12
+ * POST /api/v1/records/search
13
+ * @requiresPermission {Dataplane} record:search
14
+ * @async
15
+ * @param {string} dataplaneUrl
16
+ * @param {Object} authConfig
17
+ * @param {import('./types/records-search.types').RecordsSearchRequest} body
18
+ * @returns {Promise<{ success: boolean, data: Array, meta: Object, links?: Object, status?: number }>}
19
+ */
20
+ async function searchRecords(dataplaneUrl, authConfig, body) {
21
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
22
+ const raw = await client.post('/api/v1/records/search', { body });
23
+ return normalizeRecordsSearchClientResponse(raw);
24
+ }
25
+
26
+ module.exports = {
27
+ searchRecords,
28
+ normalizeRecordsSearchClientResponse
29
+ };
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @fileoverview Agent metadata validation API types (dataplane 404.5)
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ /**
8
+ * @typedef {'info' | 'warning' | 'error'} AgentValidationFindingSeverity
9
+ */
10
+
11
+ /**
12
+ * @typedef {Object} AgentValidationFinding
13
+ * @property {AgentValidationFindingSeverity} severity
14
+ * @property {string} code
15
+ * @property {string} message
16
+ * @property {string} [field]
17
+ * @property {string} [recommendation]
18
+ */
19
+
20
+ /**
21
+ * @typedef {'pending' | 'passed' | 'warning' | 'failed'} AgentValidationStatus
22
+ */
23
+
24
+ /**
25
+ * @typedef {'trusted' | 'usableWithWarnings' | 'notTrusted' | 'pending'} AgentTrustDecision
26
+ */
27
+
28
+ /**
29
+ * @typedef {Object} AgentMetadataValidationResult
30
+ * @property {AgentValidationStatus} status
31
+ * @property {AgentTrustDecision} trustDecision
32
+ * @property {number} confidence
33
+ * @property {string} summary
34
+ * @property {AgentValidationFinding[]} findings
35
+ * @property {string} validatedAt - ISO 8601
36
+ * @property {string} inputHash
37
+ * @property {string} contractVersion
38
+ */
39
+
40
+ /**
41
+ * @typedef {Object} AgentMetadataValidationRunRequest
42
+ * @property {boolean} [forceRevalidate]
43
+ * @property {Object<string, Object>} [peerDatasourceConfigs]
44
+ */
45
+
46
+ /**
47
+ * @typedef {Object} AgentMetadataValidationRunResponse
48
+ * @property {string} id
49
+ * @property {string} externalDataSourceId
50
+ * @property {string} datasourceKey
51
+ * @property {AgentMetadataValidationResult} result
52
+ * @property {boolean} [reused]
53
+ */
54
+
55
+ /**
56
+ * @typedef {Object} AgentMetadataValidationHistoryItem
57
+ * @property {string} id
58
+ * @property {string} inputHash
59
+ * @property {string} contractVersion
60
+ * @property {AgentTrustDecision} trustDecision
61
+ * @property {AgentValidationStatus} validationStatus
62
+ * @property {number} confidence
63
+ * @property {string} validatedAt
64
+ * @property {boolean} isLatest
65
+ */
66
+
67
+ module.exports = {};
@@ -0,0 +1,72 @@
1
+ /**
2
+ * @fileoverview Audit API type definitions (dataplane read-only audit queries)
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ /**
8
+ * Paginated list meta (miso-client shape).
9
+ * @typedef {Object} AuditListMeta
10
+ * @property {number} totalItems
11
+ * @property {number} [currentPage]
12
+ * @property {number} [pageSize]
13
+ */
14
+
15
+ /**
16
+ * CIP execution list item (abbreviated).
17
+ * @typedef {Object} AuditExecutionListItem
18
+ * @property {string} id
19
+ * @property {string} [datasourceKey]
20
+ * @property {string} [operation]
21
+ * @property {string} [correlationId]
22
+ * @property {'captured'|'disabled'} rbacAuditStatus
23
+ * @property {'captured'|'disabled'} abacAuditStatus
24
+ * @property {import('./audit.types').ForeignKeyReference} [rbacDecision]
25
+ * @property {import('./audit.types').ForeignKeyReference} [abacTrace]
26
+ */
27
+
28
+ /**
29
+ * @typedef {Object} ForeignKeyReference
30
+ * @property {string} [id]
31
+ * @property {string} [key]
32
+ * @property {string} [name]
33
+ */
34
+
35
+ /**
36
+ * RBAC decision list item.
37
+ * @typedef {Object} AuditRbacDecisionListItem
38
+ * @property {string} id
39
+ * @property {import('./audit.types').ForeignKeyReference} [executionId]
40
+ * @property {string} [reason]
41
+ * @property {string} [decision]
42
+ */
43
+
44
+ /**
45
+ * ABAC trace list item.
46
+ * @typedef {Object} AuditAbacTraceListItem
47
+ * @property {string} id
48
+ * @property {import('./audit.types').ForeignKeyReference} [executionId]
49
+ * @property {string} [decision]
50
+ * @property {string} [reason]
51
+ */
52
+
53
+ /**
54
+ * One matrix row result.
55
+ * @typedef {Object} AuditEvidenceMatrixRow
56
+ * @property {number} row
57
+ * @property {'passed'|'failed'} status
58
+ * @property {string} detail
59
+ * @property {string} [code]
60
+ */
61
+
62
+ /**
63
+ * Verifier output (407.3).
64
+ * @typedef {Object} AuditEvidenceVerification
65
+ * @property {'passed'|'failed'} status
66
+ * @property {string} datasourceKey
67
+ * @property {string|null} correlationId
68
+ * @property {string[]} executionIds
69
+ * @property {AuditEvidenceMatrixRow[]} matrix
70
+ */
71
+
72
+ module.exports = {};
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @fileoverview Dataplane health API type definitions
3
+ * @author AI Fabrix Team
4
+ * @version 2.0.0
5
+ */
6
+
7
+ /**
8
+ * Dataplane health JSON payload (public, no auth — `security: []` on dataplane).
9
+ * Matches `app/schemas/common.py` `HealthResponse` in aifabrix-dataplane (plan 403.0).
10
+ * @typedef {Object} DataplaneHealthPayload
11
+ * @property {string} status - 'healthy' or 'unhealthy'
12
+ * @property {string} service - Service name (e.g. 'dataplane')
13
+ * @property {string} version - Dataplane semver (always present)
14
+ * @property {string} [message] - Optional probe message (e.g. 'pong')
15
+ * @property {string} [minBuilderCliVersion] - Minimum supported Builder CLI semver; omitted when not enforced
16
+ */
17
+
18
+ /**
19
+ * Parsed health snapshot used by Builder CLI cache + UX.
20
+ * @typedef {Object} DataplaneHealthSnapshot
21
+ * @property {string} status - 'healthy' / 'unhealthy' / 'unknown'
22
+ * @property {string} [version] - Dataplane version (undefined when probe failed)
23
+ * @property {string} [minBuilderCliVersion] - Trimmed minimum required Builder CLI semver (undefined when not enforced)
24
+ * @property {string|null} [endpoint] - Dataplane endpoint path that answered (e.g. '/api/v1/health' or '/health')
25
+ */
26
+
27
+ module.exports = {};
@@ -11,6 +11,7 @@
11
11
  * @property {string} displayName
12
12
  * @property {string} [description]
13
13
  * @property {'string'|'number'|'boolean'} dataType
14
+ * @property {'static'|'dynamic'|'both'} [valueType]
14
15
  * @property {boolean} [isRequired]
15
16
  */
16
17
 
@@ -22,6 +23,7 @@
22
23
  * @property {string} displayName
23
24
  * @property {string|null} [description]
24
25
  * @property {'string'|'number'|'boolean'} dataType
26
+ * @property {'static'|'dynamic'|'both'} [valueType]
25
27
  * @property {boolean} isRequired
26
28
  * @property {string|null} [createdBy]
27
29
  * @property {string|null} [updatedBy]
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @fileoverview Governance scenario acceptance API types
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ /**
8
+ * @typedef {Object} GovernanceScenariosRunRequest
9
+ * @property {string} systemKey
10
+ * @property {Object} pack - Inline governance scenario pack document
11
+ * @property {string[]} [scenarios] - Optional subset of scenario ids
12
+ */
13
+
14
+ /**
15
+ * @typedef {Object} GovernanceScenarioResult
16
+ * @property {string} id
17
+ * @property {'pass'|'fail'} status
18
+ * @property {string} verdict
19
+ * @property {string} subjectUserId
20
+ * @property {string} subjectDisplayName
21
+ * @property {string[]} subjectGroups
22
+ * @property {number} visibleKeyCount
23
+ * @property {string[]} unexpectedVisibleKeys
24
+ * @property {string[]} missingRequiredKeys
25
+ * @property {number} excludedAbac
26
+ * @property {number} excludedFilter
27
+ * @property {string} [failureReason]
28
+ * @property {string} [fixHint]
29
+ * @property {string} [auditRef]
30
+ */
31
+
32
+ /**
33
+ * @typedef {Object} GovernanceScenariosRunResponse
34
+ * @property {string} packKey
35
+ * @property {{ total: number, passed: number, failed: number }} summary
36
+ * @property {GovernanceScenarioResult[]} scenarios
37
+ */
38
+
39
+ module.exports = {};