@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.
- 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 +44 -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/cli/index.js +4 -2
- package/lib/cli/infra-guided.js +22 -3
- package/lib/cli/setup-app.help.js +50 -2
- package/lib/cli/setup-app.js +33 -24
- package/lib/cli/setup-app.test-commands.js +80 -21
- package/lib/cli/setup-auth.js +30 -3
- package/lib/cli/setup-external-system.js +37 -3
- package/lib/cli/setup-utility-help-after.js +45 -0
- package/lib/cli/setup-utility-resolve.js +2 -2
- package/lib/cli/setup-utility.js +99 -81
- 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/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/upload.js +34 -13
- package/lib/commands/wizard-core.js +3 -0
- package/lib/core/config-device-dataplane.js +185 -0
- 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/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/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/external-datasource.schema.json +47 -13
- package/lib/schema/flag-map-validation-run.json +2 -2
- 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/cli-exit-codes.js +30 -0
- package/lib/utils/cli-sync-options.js +33 -0
- 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/help-builder.js +30 -24
- package/lib/utils/manifest-source-emit.js +22 -0
- package/lib/utils/semver-compare.js +127 -0
- package/lib/utils/upload-pipeline-ui.js +91 -0
- package/lib/utils/validation-poll-ui.js +14 -7
- package/lib/validation/wizard-config-validator.js +58 -19
- package/package.json +1 -1
- package/templates/applications/dataplane/env.template +13 -1
- package/templates/applications/dataplane/rbac.yaml +4 -0
- package/templates/external-system/README.md.hbs +56 -8
|
@@ -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 = {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Protection API type definitions (dataplane /api/v1/protection/*).
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {Object} ProtectionUploadRequest
|
|
9
|
+
* @property {Object} manifest - Full protection manifest document
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {Object} ProtectionValidateOptions
|
|
14
|
+
* @property {boolean} [strict] - Promote WARN to FAIL
|
|
15
|
+
* @property {boolean} [explain]
|
|
16
|
+
* @property {number} [sampleSize] - For simulate
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @typedef {Object} ProtectionDeployResponse
|
|
21
|
+
* @property {string} protectionKey
|
|
22
|
+
* @property {string} deploymentId
|
|
23
|
+
* @property {number} revision
|
|
24
|
+
* @property {string} configHash
|
|
25
|
+
* @property {string} deployedAt
|
|
26
|
+
* @property {Object} manifest
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @typedef {Object} ProtectionManifestResponse
|
|
31
|
+
* @property {string} key
|
|
32
|
+
* @property {string} displayName
|
|
33
|
+
* @property {Object} spec
|
|
34
|
+
* @property {boolean} enabled
|
|
35
|
+
* @property {string} datasourceKey
|
|
36
|
+
* @property {number} [currentRevision]
|
|
37
|
+
* @property {string} [lastDeployedAt]
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @typedef {Object} ProtectionListResult
|
|
42
|
+
* @property {ProtectionManifestResponse[]} items
|
|
43
|
+
* @property {Object|null} meta
|
|
44
|
+
* @property {*} raw
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @typedef {Object} ProtectionGrantStatusSummary
|
|
49
|
+
* @property {string} dimensionKey
|
|
50
|
+
* @property {string} effectiveValueType
|
|
51
|
+
* @property {string} projectionRuleKey
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @typedef {Object} ProtectionStatusResponse
|
|
56
|
+
* @property {string} protectionKey
|
|
57
|
+
* @property {boolean} enabled
|
|
58
|
+
* @property {string} datasourceKey
|
|
59
|
+
* @property {number} [currentRevision]
|
|
60
|
+
* @property {string} [configHash]
|
|
61
|
+
* @property {string} [lastDeployedAt]
|
|
62
|
+
* @property {string} [lastProjectionRunAt]
|
|
63
|
+
* @property {string} [lastSuccessfulProjectionRunAt]
|
|
64
|
+
* @property {number} [dynamicValueCount]
|
|
65
|
+
* @property {number} [grantCount]
|
|
66
|
+
* @property {ProtectionGrantStatusSummary[]} [grants]
|
|
67
|
+
*/
|
|
68
|
+
|
|
69
|
+
module.exports = {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Types for dataplane bulk record sync API
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Single record in a bulk sync request
|
|
9
|
+
* @typedef {Object} ExternalBulkRecord
|
|
10
|
+
* @property {string} key - External record key
|
|
11
|
+
* @property {string} displayName - Human-readable label
|
|
12
|
+
* @property {string} recordType - Resource type from datasource manifest
|
|
13
|
+
* @property {Object} metadata - Record metadata payload
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Bulk sync request body
|
|
18
|
+
* @typedef {Object} ExternalRecordBulkRequest
|
|
19
|
+
* @property {'incremental'|'bulk'|'validate'} syncType - Sync mode
|
|
20
|
+
* @property {boolean} [sync] - Create linked sync job when true
|
|
21
|
+
* @property {ExternalBulkRecord[]} records - Records to process
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Bulk sync response
|
|
26
|
+
* @typedef {Object} ExternalRecordBulkResponse
|
|
27
|
+
* @property {number} insertedCount
|
|
28
|
+
* @property {number} updatedCount
|
|
29
|
+
* @property {number} deletedCount
|
|
30
|
+
* @property {number} totalProcessed
|
|
31
|
+
* @property {number} [skippedCount]
|
|
32
|
+
* @property {Object} [recordSkipSummary]
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
module.exports = {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Types for dataplane Records Search API
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Records search request
|
|
9
|
+
* @typedef {Object} RecordsSearchRequest
|
|
10
|
+
* @property {'retrieval'|'grounding'|'analytics'|'validation'} intent
|
|
11
|
+
* @property {string[]} [datasourceKeys]
|
|
12
|
+
* @property {string[]} [resourceTypes]
|
|
13
|
+
* @property {string|Object} [filters]
|
|
14
|
+
* @property {string|Object} [exclude]
|
|
15
|
+
* @property {'ids'|'full'} [searchMode]
|
|
16
|
+
* @property {number} [limit]
|
|
17
|
+
* @property {boolean} [dryRun]
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Records search response
|
|
22
|
+
* @typedef {Object} RecordsSearchResponse
|
|
23
|
+
* @property {Array<string|Object>} data
|
|
24
|
+
* @property {Object} meta
|
|
25
|
+
* @property {Object} [links]
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
module.exports = {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview User–group membership API (Controller)
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const { ApiClient } = require('./index');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Add user to group
|
|
13
|
+
* @requiresPermission {Controller} users:update
|
|
14
|
+
* @async
|
|
15
|
+
* @param {string} controllerUrl
|
|
16
|
+
* @param {Object} authConfig
|
|
17
|
+
* @param {string} userId
|
|
18
|
+
* @param {string} groupId
|
|
19
|
+
* @param {Object} [body]
|
|
20
|
+
* @returns {Promise<Object>}
|
|
21
|
+
*/
|
|
22
|
+
async function addUserToGroup(controllerUrl, authConfig, userId, groupId, body = {}) {
|
|
23
|
+
const client = new ApiClient(controllerUrl, authConfig);
|
|
24
|
+
return await client.post(
|
|
25
|
+
`/api/v1/users/${encodeURIComponent(userId)}/groups/${encodeURIComponent(groupId)}`,
|
|
26
|
+
{ body }
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Remove user from group
|
|
32
|
+
* @requiresPermission {Controller} users:update
|
|
33
|
+
* @async
|
|
34
|
+
* @param {string} controllerUrl
|
|
35
|
+
* @param {Object} authConfig
|
|
36
|
+
* @param {string} userId
|
|
37
|
+
* @param {string} groupId
|
|
38
|
+
* @returns {Promise<Object>}
|
|
39
|
+
*/
|
|
40
|
+
async function removeUserFromGroup(controllerUrl, authConfig, userId, groupId) {
|
|
41
|
+
const client = new ApiClient(controllerUrl, authConfig);
|
|
42
|
+
return await client.delete(
|
|
43
|
+
`/api/v1/users/${encodeURIComponent(userId)}/groups/${encodeURIComponent(groupId)}`
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
module.exports = {
|
|
48
|
+
addUserToGroup,
|
|
49
|
+
removeUserFromGroup
|
|
50
|
+
};
|