@aifabrix/builder 2.45.0 → 2.45.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/.cursor/rules/docs-rules.mdc +3 -1
  2. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
  3. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
  4. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
  5. package/jest.projects.js +44 -1
  6. package/lib/api/agent-metadata-validation.api.js +93 -0
  7. package/lib/api/audit-api-helpers.js +68 -0
  8. package/lib/api/audit.api.js +119 -0
  9. package/lib/api/auth-cache.api.js +44 -0
  10. package/lib/api/certificates.api.js +4 -4
  11. package/lib/api/credential.api.js +2 -2
  12. package/lib/api/dataplane-health.api.js +137 -0
  13. package/lib/api/dataplane-sync.api.js +27 -0
  14. package/lib/api/datasources-core.api.js +21 -18
  15. package/lib/api/datasources-extended.api.js +22 -22
  16. package/lib/api/dimensions.api.js +3 -0
  17. package/lib/api/external-systems.api.js +13 -13
  18. package/lib/api/governance-scenarios.api.js +39 -0
  19. package/lib/api/groups.api.js +79 -0
  20. package/lib/api/index.js +45 -2
  21. package/lib/api/pipeline.api.js +4 -4
  22. package/lib/api/protection.api.js +157 -0
  23. package/lib/api/records-bulk.api.js +30 -0
  24. package/lib/api/records-search-parse.js +49 -0
  25. package/lib/api/records-search.api.js +29 -0
  26. package/lib/api/types/agent-metadata-validation.types.js +67 -0
  27. package/lib/api/types/audit.types.js +72 -0
  28. package/lib/api/types/dataplane-health.types.js +27 -0
  29. package/lib/api/types/dimensions.types.js +2 -0
  30. package/lib/api/types/governance-scenarios.types.js +39 -0
  31. package/lib/api/types/protection.types.js +69 -0
  32. package/lib/api/types/records-bulk.types.js +35 -0
  33. package/lib/api/types/records-search.types.js +28 -0
  34. package/lib/api/user-groups.api.js +50 -0
  35. package/lib/api/users.api.js +95 -0
  36. package/lib/api/validation-run.api.js +3 -3
  37. package/lib/api/validation-runner.js +3 -3
  38. package/lib/api/wizard-platform.api.js +3 -3
  39. package/lib/api/wizard.api.js +21 -21
  40. package/lib/app/deploy.js +34 -19
  41. package/lib/cli/index.js +4 -2
  42. package/lib/cli/infra-guided.js +22 -3
  43. package/lib/cli/setup-app.help.js +50 -2
  44. package/lib/cli/setup-app.js +33 -24
  45. package/lib/cli/setup-app.test-commands.js +80 -21
  46. package/lib/cli/setup-auth.js +30 -3
  47. package/lib/cli/setup-external-system.js +37 -3
  48. package/lib/cli/setup-utility-help-after.js +45 -0
  49. package/lib/cli/setup-utility-resolve.js +2 -2
  50. package/lib/cli/setup-utility.js +99 -81
  51. package/lib/commands/auth-status-dataplane-version.js +231 -0
  52. package/lib/commands/auth-status-display.js +94 -0
  53. package/lib/commands/auth-status.js +70 -6
  54. package/lib/commands/credential-push.js +10 -5
  55. package/lib/commands/datasource-load-export-cli.js +178 -0
  56. package/lib/commands/datasource-test-trust-cli.js +114 -0
  57. package/lib/commands/datasource-unified-test-cli.js +25 -17
  58. package/lib/commands/datasource-unified-test-cli.options.js +18 -3
  59. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
  60. package/lib/commands/datasource-verify-audit-cli.js +96 -0
  61. package/lib/commands/datasource.js +68 -1
  62. package/lib/commands/dimension-value.js +43 -13
  63. package/lib/commands/dimension.js +38 -7
  64. package/lib/commands/identity-apply-sync.js +131 -0
  65. package/lib/commands/identity-group-cli.js +146 -0
  66. package/lib/commands/identity-membership-role-cache.js +175 -0
  67. package/lib/commands/identity-shared.js +94 -0
  68. package/lib/commands/identity-user-cli.js +158 -0
  69. package/lib/commands/identity.js +43 -0
  70. package/lib/commands/login.js +46 -16
  71. package/lib/commands/protection-cli-leaves.js +286 -0
  72. package/lib/commands/protection.js +50 -0
  73. package/lib/commands/repair.js +13 -3
  74. package/lib/commands/test-e2e-external.js +40 -9
  75. package/lib/commands/test-governance-cli-options.js +47 -0
  76. package/lib/commands/test-governance-command-action.js +55 -0
  77. package/lib/commands/test-governance-external.js +88 -0
  78. package/lib/commands/test-trust-cli-options.js +32 -0
  79. package/lib/commands/test-trust-command-action.js +118 -0
  80. package/lib/commands/test-trust-external.js +127 -0
  81. package/lib/commands/upload.js +34 -13
  82. package/lib/commands/wizard-core.js +3 -0
  83. package/lib/core/config-device-dataplane.js +185 -0
  84. package/lib/datasource/agent-trust-debug-log.js +45 -0
  85. package/lib/datasource/agent-trust-fetch.js +115 -0
  86. package/lib/datasource/agent-trust-map.js +101 -0
  87. package/lib/datasource/agent-trust-mock.js +44 -0
  88. package/lib/datasource/agent-trust-run.js +93 -0
  89. package/lib/datasource/agent-trust-timeout.js +25 -0
  90. package/lib/datasource/audit-evidence-display.js +80 -0
  91. package/lib/datasource/audit-evidence-extract-debug.js +103 -0
  92. package/lib/datasource/audit-evidence-extract.js +177 -0
  93. package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
  94. package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
  95. package/lib/datasource/audit-evidence-poll.js +109 -0
  96. package/lib/datasource/audit-evidence-run.js +177 -0
  97. package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
  98. package/lib/datasource/audit-evidence-verify-matrix.js +177 -0
  99. package/lib/datasource/audit-evidence-verify.js +108 -0
  100. package/lib/datasource/bulk-loader-run-batches.js +88 -0
  101. package/lib/datasource/bulk-loader-service-retry.js +52 -0
  102. package/lib/datasource/bulk-loader-service.js +127 -0
  103. package/lib/datasource/capability/run-capability-dimension.js +2 -1
  104. package/lib/datasource/datasource-exporter-resolve.js +82 -0
  105. package/lib/datasource/datasource-exporter-service.js +144 -0
  106. package/lib/datasource/datasource-identifier.js +148 -0
  107. package/lib/datasource/datasource-load-export-context.js +92 -0
  108. package/lib/datasource/integration-context.js +6 -4
  109. package/lib/datasource/local-data-paths.js +145 -0
  110. package/lib/datasource/log-cleaner.js +241 -0
  111. package/lib/datasource/log-viewer.js +111 -6
  112. package/lib/datasource/record-file-parser.js +85 -0
  113. package/lib/datasource/record-mapper.js +129 -0
  114. package/lib/datasource/resolve-app.js +74 -55
  115. package/lib/datasource/test-e2e.js +26 -2
  116. package/lib/datasource/unified-validation-run-resolve.js +45 -12
  117. package/lib/datasource/unified-validation-run.js +43 -17
  118. package/lib/datasource/validate.js +37 -20
  119. package/lib/external-system/test-system-level.js +25 -4
  120. package/lib/external-system/test.js +3 -1
  121. package/lib/governance/governance-pack-loader.js +70 -0
  122. package/lib/governance/governance-run-display.js +119 -0
  123. package/lib/identity/identity-apply-core.js +108 -0
  124. package/lib/identity/identity-apply-phases.js +244 -0
  125. package/lib/identity/identity-apply-service.js +77 -0
  126. package/lib/identity/identity-csv-parser.js +114 -0
  127. package/lib/internal/fs-real-sync.js +29 -1
  128. package/lib/protection/auth-context.js +45 -0
  129. package/lib/protection/convert-batch.js +90 -0
  130. package/lib/protection/load.js +41 -0
  131. package/lib/protection/paths.js +158 -0
  132. package/lib/protection/preflight-datasource-ready.js +46 -0
  133. package/lib/protection/protection-create-probe-lines.js +142 -0
  134. package/lib/protection/protection-create-probes.js +95 -0
  135. package/lib/protection/protection-create-scaffold.js +281 -0
  136. package/lib/protection/protection-display-helpers.js +445 -0
  137. package/lib/protection/protection-display.js +215 -0
  138. package/lib/protection/protection-preset-registry.js +97 -0
  139. package/lib/protection/report-exit.js +62 -0
  140. package/lib/protection/resolve.js +202 -0
  141. package/lib/protection/run-commands-validate.js +130 -0
  142. package/lib/protection/run-commands.js +216 -0
  143. package/lib/protection/run-protection-create-helpers.js +134 -0
  144. package/lib/protection/run-protection-create-probes-flow.js +43 -0
  145. package/lib/protection/run-protection-create.js +191 -0
  146. package/lib/protection/scope.js +22 -0
  147. package/lib/protection/sync-after-upload.js +64 -0
  148. package/lib/protection/upload-batch.js +127 -0
  149. package/lib/protection/validate-batch.js +113 -0
  150. package/lib/protection/validate-local.js +65 -0
  151. package/lib/resolvers/dimension-file.js +29 -4
  152. package/lib/schema/external-datasource.schema.json +47 -13
  153. package/lib/schema/flag-map-validation-run.json +2 -2
  154. package/lib/schema/protection.schema.json +374 -0
  155. package/lib/schema/type/credential-field-registry.json +636 -0
  156. package/lib/schema/wizard-config.schema.json +1 -1
  157. package/lib/utils/agent-trust-run-display.js +231 -0
  158. package/lib/utils/agent-trust-run-exit.js +59 -0
  159. package/lib/utils/agent-trust-wait-ui.js +94 -0
  160. package/lib/utils/cli-exit-codes.js +30 -0
  161. package/lib/utils/cli-sync-options.js +33 -0
  162. package/lib/utils/credential-push-ui.js +90 -0
  163. package/lib/utils/dataplane-cli-version-gate.js +202 -0
  164. package/lib/utils/dataplane-cli-version-help.js +74 -0
  165. package/lib/utils/datasource-export-display.js +137 -0
  166. package/lib/utils/datasource-load-display.js +174 -0
  167. package/lib/utils/datasource-load-export-ui.js +120 -0
  168. package/lib/utils/datasource-test-run-capability-scope.js +3 -3
  169. package/lib/utils/datasource-test-run-display.js +3 -3
  170. package/lib/utils/datasource-test-run-tty-log.js +5 -1
  171. package/lib/utils/help-builder.js +30 -24
  172. package/lib/utils/manifest-source-emit.js +22 -0
  173. package/lib/utils/semver-compare.js +127 -0
  174. package/lib/utils/upload-pipeline-ui.js +91 -0
  175. package/lib/utils/validation-poll-ui.js +14 -7
  176. package/lib/validation/wizard-config-validator.js +58 -19
  177. package/package.json +1 -1
  178. package/templates/applications/dataplane/env.template +13 -1
  179. package/templates/applications/dataplane/rbac.yaml +4 -0
  180. package/templates/external-system/README.md.hbs +56 -8
@@ -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
+ };