@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.
- package/.cursor/rules/cli-layout.mdc +7 -3
- package/.cursor/rules/docs-rules.mdc +3 -1
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
- package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
- package/jest.projects.js +100 -1
- package/lib/api/agent-metadata-validation.api.js +93 -0
- package/lib/api/audit-api-helpers.js +68 -0
- package/lib/api/audit.api.js +119 -0
- package/lib/api/auth-cache.api.js +44 -0
- package/lib/api/certificates.api.js +4 -4
- package/lib/api/credential.api.js +2 -2
- package/lib/api/dataplane-health.api.js +137 -0
- package/lib/api/dataplane-sync.api.js +27 -0
- package/lib/api/datasources-core.api.js +21 -18
- package/lib/api/datasources-extended.api.js +22 -22
- package/lib/api/dimensions.api.js +3 -0
- package/lib/api/external-systems.api.js +13 -13
- package/lib/api/governance-scenarios.api.js +39 -0
- package/lib/api/groups.api.js +79 -0
- package/lib/api/index.js +45 -2
- package/lib/api/pipeline.api.js +4 -4
- package/lib/api/protection.api.js +157 -0
- package/lib/api/records-bulk.api.js +30 -0
- package/lib/api/records-search-parse.js +49 -0
- package/lib/api/records-search.api.js +29 -0
- package/lib/api/types/agent-metadata-validation.types.js +67 -0
- package/lib/api/types/audit.types.js +72 -0
- package/lib/api/types/dataplane-health.types.js +27 -0
- package/lib/api/types/dimensions.types.js +2 -0
- package/lib/api/types/governance-scenarios.types.js +39 -0
- package/lib/api/types/protection.types.js +69 -0
- package/lib/api/types/records-bulk.types.js +35 -0
- package/lib/api/types/records-search.types.js +28 -0
- package/lib/api/user-groups.api.js +50 -0
- package/lib/api/users.api.js +95 -0
- package/lib/api/validation-run.api.js +3 -3
- package/lib/api/validation-runner.js +3 -3
- package/lib/api/wizard-platform.api.js +3 -3
- package/lib/api/wizard.api.js +21 -21
- package/lib/app/deploy.js +34 -19
- package/lib/app/helpers.js +3 -3
- package/lib/app/index.js +3 -3
- package/lib/app/register.js +7 -6
- package/lib/app/restart-display.js +52 -21
- package/lib/app/rotate-secret.js +7 -6
- package/lib/app/run-helpers.js +15 -8
- package/lib/app/run.js +57 -9
- package/lib/app/show-display.js +7 -0
- package/lib/app/show.js +87 -5
- package/lib/build/index.js +9 -5
- package/lib/cli/index.js +4 -2
- package/lib/cli/infra-guided.js +62 -28
- package/lib/cli/installation-log-command.js +73 -0
- package/lib/cli/setup-app.help.js +50 -2
- package/lib/cli/setup-app.js +44 -25
- package/lib/cli/setup-app.test-commands.js +80 -21
- package/lib/cli/setup-auth.js +124 -52
- package/lib/cli/setup-external-system.js +37 -3
- package/lib/cli/setup-infra-up-dataplane-action.js +111 -0
- package/lib/cli/setup-infra-up-platform-action.js +131 -0
- package/lib/cli/setup-infra.js +60 -119
- package/lib/cli/setup-platform.js +1 -1
- package/lib/cli/setup-utility-help-after.js +45 -0
- package/lib/cli/setup-utility-resolve.js +132 -0
- package/lib/cli/setup-utility.js +148 -116
- package/lib/commands/app-logs.js +81 -33
- package/lib/commands/auth-config.js +116 -18
- package/lib/commands/auth-status-dataplane-version.js +231 -0
- package/lib/commands/auth-status-display.js +94 -0
- package/lib/commands/auth-status.js +70 -6
- package/lib/commands/credential-push.js +10 -5
- package/lib/commands/datasource-load-export-cli.js +178 -0
- package/lib/commands/datasource-test-trust-cli.js +114 -0
- package/lib/commands/datasource-unified-test-cli.js +25 -17
- package/lib/commands/datasource-unified-test-cli.options.js +18 -3
- package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
- package/lib/commands/datasource-verify-audit-cli.js +96 -0
- package/lib/commands/datasource.js +68 -1
- package/lib/commands/dimension-value.js +43 -13
- package/lib/commands/dimension.js +38 -7
- package/lib/commands/identity-apply-sync.js +131 -0
- package/lib/commands/identity-group-cli.js +146 -0
- package/lib/commands/identity-membership-role-cache.js +175 -0
- package/lib/commands/identity-shared.js +94 -0
- package/lib/commands/identity-user-cli.js +158 -0
- package/lib/commands/identity.js +43 -0
- package/lib/commands/login.js +46 -16
- package/lib/commands/protection-cli-leaves.js +286 -0
- package/lib/commands/protection.js +50 -0
- package/lib/commands/repair.js +13 -3
- package/lib/commands/setup-modes.js +19 -6
- package/lib/commands/setup-prompts.js +41 -8
- package/lib/commands/setup.js +114 -9
- package/lib/commands/teardown.js +54 -5
- package/lib/commands/test-e2e-external.js +40 -9
- package/lib/commands/test-governance-cli-options.js +47 -0
- package/lib/commands/test-governance-command-action.js +55 -0
- package/lib/commands/test-governance-external.js +88 -0
- package/lib/commands/test-trust-cli-options.js +32 -0
- package/lib/commands/test-trust-command-action.js +118 -0
- package/lib/commands/test-trust-external.js +127 -0
- package/lib/commands/up-common.js +48 -14
- package/lib/commands/up-dataplane.js +21 -18
- package/lib/commands/up-miso.js +12 -8
- package/lib/commands/upload.js +38 -15
- package/lib/commands/wizard-core.js +3 -0
- package/lib/core/audit-logger.js +1 -34
- package/lib/core/config-admin-email.js +56 -0
- package/lib/core/config-device-dataplane.js +185 -0
- package/lib/core/config-normalize.js +60 -0
- package/lib/core/config-registered-controller-urls.js +54 -0
- package/lib/core/config.js +33 -50
- package/lib/core/secrets-ensure-infra.js +1 -1
- package/lib/core/secrets-env-content.js +86 -90
- package/lib/core/secrets-env-declarative-expand.js +170 -0
- package/lib/core/secrets-env-write.js +2 -0
- package/lib/core/secrets-load.js +106 -102
- package/lib/datasource/agent-trust-debug-log.js +45 -0
- package/lib/datasource/agent-trust-fetch.js +115 -0
- package/lib/datasource/agent-trust-map.js +101 -0
- package/lib/datasource/agent-trust-mock.js +44 -0
- package/lib/datasource/agent-trust-run.js +93 -0
- package/lib/datasource/agent-trust-timeout.js +25 -0
- package/lib/datasource/audit-evidence-display.js +80 -0
- package/lib/datasource/audit-evidence-extract-debug.js +103 -0
- package/lib/datasource/audit-evidence-extract.js +177 -0
- package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
- package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
- package/lib/datasource/audit-evidence-poll.js +109 -0
- package/lib/datasource/audit-evidence-run.js +177 -0
- package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
- package/lib/datasource/audit-evidence-verify-matrix.js +177 -0
- package/lib/datasource/audit-evidence-verify.js +108 -0
- package/lib/datasource/bulk-loader-run-batches.js +88 -0
- package/lib/datasource/bulk-loader-service-retry.js +52 -0
- package/lib/datasource/bulk-loader-service.js +127 -0
- package/lib/datasource/capability/run-capability-dimension.js +2 -1
- package/lib/datasource/datasource-exporter-resolve.js +82 -0
- package/lib/datasource/datasource-exporter-service.js +144 -0
- package/lib/datasource/datasource-identifier.js +148 -0
- package/lib/datasource/datasource-load-export-context.js +92 -0
- package/lib/datasource/integration-context.js +6 -4
- package/lib/datasource/local-data-paths.js +145 -0
- package/lib/datasource/log-cleaner.js +241 -0
- package/lib/datasource/log-viewer.js +111 -6
- package/lib/datasource/record-file-parser.js +85 -0
- package/lib/datasource/record-mapper.js +129 -0
- package/lib/datasource/resolve-app.js +74 -55
- package/lib/datasource/test-e2e.js +26 -2
- package/lib/datasource/unified-validation-run-resolve.js +45 -12
- package/lib/datasource/unified-validation-run.js +43 -17
- package/lib/datasource/validate.js +37 -20
- package/lib/external-system/deploy.js +5 -1
- package/lib/external-system/test-system-level.js +25 -4
- package/lib/external-system/test.js +3 -1
- package/lib/governance/governance-pack-loader.js +70 -0
- package/lib/governance/governance-run-display.js +119 -0
- package/lib/identity/identity-apply-core.js +108 -0
- package/lib/identity/identity-apply-phases.js +244 -0
- package/lib/identity/identity-apply-service.js +77 -0
- package/lib/identity/identity-csv-parser.js +114 -0
- package/lib/internal/fs-real-sync.js +29 -1
- package/lib/internal/node-fs.js +2 -0
- package/lib/protection/auth-context.js +45 -0
- package/lib/protection/convert-batch.js +90 -0
- package/lib/protection/load.js +41 -0
- package/lib/protection/paths.js +158 -0
- package/lib/protection/preflight-datasource-ready.js +46 -0
- package/lib/protection/protection-create-probe-lines.js +142 -0
- package/lib/protection/protection-create-probes.js +95 -0
- package/lib/protection/protection-create-scaffold.js +281 -0
- package/lib/protection/protection-display-helpers.js +445 -0
- package/lib/protection/protection-display.js +215 -0
- package/lib/protection/protection-preset-registry.js +97 -0
- package/lib/protection/report-exit.js +62 -0
- package/lib/protection/resolve.js +202 -0
- package/lib/protection/run-commands-validate.js +130 -0
- package/lib/protection/run-commands.js +216 -0
- package/lib/protection/run-protection-create-helpers.js +134 -0
- package/lib/protection/run-protection-create-probes-flow.js +43 -0
- package/lib/protection/run-protection-create.js +191 -0
- package/lib/protection/scope.js +22 -0
- package/lib/protection/sync-after-upload.js +64 -0
- package/lib/protection/upload-batch.js +127 -0
- package/lib/protection/validate-batch.js +113 -0
- package/lib/protection/validate-local.js +65 -0
- package/lib/resolvers/dimension-file.js +29 -4
- package/lib/schema/application-schema.json +4 -0
- package/lib/schema/external-datasource.schema.json +47 -13
- package/lib/schema/flag-map-validation-run.json +2 -2
- package/lib/schema/infra.parameter.yaml +10 -0
- package/lib/schema/protection.schema.json +374 -0
- package/lib/schema/type/credential-field-registry.json +636 -0
- package/lib/schema/wizard-config.schema.json +1 -1
- package/lib/utils/agent-trust-run-display.js +231 -0
- package/lib/utils/agent-trust-run-exit.js +59 -0
- package/lib/utils/agent-trust-wait-ui.js +94 -0
- package/lib/utils/app-config-resolver.js +24 -1
- package/lib/utils/applications-config-defaults.js +206 -0
- package/lib/utils/auth-config-validator.js +2 -12
- package/lib/utils/bash-secret-env.js +1 -1
- package/lib/utils/cli-exit-codes.js +30 -0
- package/lib/utils/cli-sync-options.js +33 -0
- package/lib/utils/compose-generate-docker-compose.js +111 -6
- package/lib/utils/compose-generator.js +17 -8
- package/lib/utils/controller-url.js +50 -7
- package/lib/utils/credential-push-ui.js +90 -0
- package/lib/utils/dataplane-cli-version-gate.js +202 -0
- package/lib/utils/dataplane-cli-version-help.js +74 -0
- package/lib/utils/datasource-export-display.js +137 -0
- package/lib/utils/datasource-load-display.js +174 -0
- package/lib/utils/datasource-load-export-ui.js +120 -0
- package/lib/utils/datasource-test-run-capability-scope.js +3 -3
- package/lib/utils/datasource-test-run-display.js +3 -3
- package/lib/utils/datasource-test-run-tty-log.js +5 -1
- package/lib/utils/env-copy.js +99 -14
- package/lib/utils/env-template.js +5 -1
- package/lib/utils/health-check-url.js +18 -15
- package/lib/utils/health-check.js +7 -5
- package/lib/utils/help-builder.js +30 -24
- package/lib/utils/infra-optional-service-flags.js +69 -0
- package/lib/utils/installation-log-core.js +282 -0
- package/lib/utils/installation-log-record.js +237 -0
- package/lib/utils/installation-log.js +123 -0
- package/lib/utils/log-redaction.js +105 -0
- package/lib/utils/manifest-location.js +164 -0
- package/lib/utils/manifest-source-emit.js +184 -0
- package/lib/utils/paths.js +238 -89
- package/lib/utils/remote-secrets-loader.js +7 -1
- package/lib/utils/run-cli-flags.js +29 -0
- package/lib/utils/secrets-canonical.js +10 -3
- package/lib/utils/secrets-path.js +3 -4
- package/lib/utils/secrets-utils.js +20 -10
- package/lib/utils/semver-compare.js +127 -0
- package/lib/utils/system-builder-root.js +10 -2
- package/lib/utils/upload-pipeline-ui.js +91 -0
- package/lib/utils/url-declarative-public-base.js +80 -12
- package/lib/utils/url-declarative-resolve-build-urls.js +238 -0
- package/lib/utils/url-declarative-resolve-build.js +24 -393
- package/lib/utils/url-declarative-resolve-expand-token.js +189 -0
- package/lib/utils/url-declarative-resolve-load-doc.js +12 -3
- package/lib/utils/url-declarative-resolve-surface-state.js +102 -0
- package/lib/utils/url-declarative-resolve.js +47 -7
- package/lib/utils/url-declarative-runtime-base-path.js +21 -1
- package/lib/utils/urls-local-registry-scan.js +103 -0
- package/lib/utils/urls-local-registry.js +161 -90
- package/lib/utils/validation-poll-ui.js +14 -7
- package/lib/validation/wizard-config-validator.js +58 -19
- package/package.json +3 -1
- package/templates/applications/dataplane/application.yaml +4 -0
- package/templates/applications/dataplane/env.template +13 -1
- package/templates/applications/dataplane/rbac.yaml +4 -0
- package/templates/applications/miso-controller/application.yaml +2 -0
- package/templates/applications/miso-controller/env.template +27 -29
- package/templates/external-system/README.md.hbs +56 -8
- 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
|
|
package/lib/api/pipeline.api.js
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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 =
|
|
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 = {};
|