@fabricorg/platform 1.10.0 → 1.10.1
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/CHANGELOG.md +46 -0
- package/README.md +31 -2
- package/dist/actions/index.cjs +45 -26
- package/dist/actions/index.cjs.map +1 -1
- package/dist/actions/index.d.cts +225 -226
- package/dist/actions/index.d.ts +225 -226
- package/dist/actions/index.js +41 -2
- package/dist/actions/index.js.map +1 -1
- package/dist/adapters/index.cjs +696 -66
- package/dist/adapters/index.cjs.map +1 -1
- package/dist/adapters/index.d.cts +367 -365
- package/dist/adapters/index.d.ts +367 -365
- package/dist/adapters/index.js +682 -2
- package/dist/adapters/index.js.map +1 -1
- package/dist/agent-hitl/index.cjs +21 -10
- package/dist/agent-hitl/index.cjs.map +1 -1
- package/dist/agent-hitl/index.d.cts +30 -30
- package/dist/agent-hitl/index.d.ts +30 -30
- package/dist/agent-hitl/index.js +21 -2
- package/dist/agent-hitl/index.js.map +1 -1
- package/dist/certification/index.cjs +109 -24
- package/dist/certification/index.cjs.map +1 -1
- package/dist/certification/index.d.cts +33 -39
- package/dist/certification/index.d.ts +33 -39
- package/dist/certification/index.js +107 -8
- package/dist/certification/index.js.map +1 -1
- package/dist/discovery/index.cjs +12 -10
- package/dist/discovery/index.cjs.map +1 -1
- package/dist/discovery/index.d.cts +2 -10
- package/dist/discovery/index.d.ts +2 -10
- package/dist/discovery/index.js +12 -2
- package/dist/discovery/index.js.map +1 -1
- package/dist/engine-B4csEOEc.js +223 -0
- package/dist/engine-B4csEOEc.js.map +1 -0
- package/dist/engine-BqScuhrT.cjs +246 -0
- package/dist/engine-BqScuhrT.cjs.map +1 -0
- package/dist/events/index.cjs +39 -10
- package/dist/events/index.cjs.map +1 -1
- package/dist/events/index.d.cts +43 -43
- package/dist/events/index.d.ts +43 -43
- package/dist/events/index.js +39 -2
- package/dist/events/index.js.map +1 -1
- package/dist/evidence/index.cjs +12 -50
- package/dist/evidence/index.d.cts +2 -229
- package/dist/evidence/index.d.ts +2 -229
- package/dist/evidence/index.js +1 -5
- package/dist/evidence-BuCICb0c.js +516 -0
- package/dist/evidence-BuCICb0c.js.map +1 -0
- package/dist/evidence-Cq48eDvA.cjs +575 -0
- package/dist/evidence-Cq48eDvA.cjs.map +1 -0
- package/dist/governance/index.cjs +24 -18
- package/dist/governance/index.cjs.map +1 -1
- package/dist/governance/index.d.cts +80 -83
- package/dist/governance/index.d.ts +80 -83
- package/dist/governance/index.js +22 -2
- package/dist/governance/index.js.map +1 -1
- package/dist/ids/index.cjs +52 -22
- package/dist/ids/index.cjs.map +1 -1
- package/dist/ids/index.d.cts +17 -17
- package/dist/ids/index.d.ts +17 -17
- package/dist/ids/index.js +49 -2
- package/dist/ids/index.js.map +1 -1
- package/dist/index-9jasmw76.d.cts +124 -0
- package/dist/index-BXpeFdk2.d.cts +190 -0
- package/dist/index-BXpeFdk2.d.ts +190 -0
- package/dist/index-BnbsKZsT.d.cts +231 -0
- package/dist/index-CIl1rYRv.d.cts +11 -0
- package/dist/index-CIl1rYRv.d.ts +11 -0
- package/dist/index-CVHA1ypT.d.cts +262 -0
- package/dist/index-DZ4mnNb7.d.cts +78 -0
- package/dist/index-DZ4mnNb7.d.ts +78 -0
- package/dist/index-IqcDvl69.d.ts +124 -0
- package/dist/index-fmUiRBXu.d.cts +57 -0
- package/dist/index-fmUiRBXu.d.ts +57 -0
- package/dist/index-sPUPs8pr.d.ts +262 -0
- package/dist/index-z9-CYOIo.d.ts +231 -0
- package/dist/index.cjs +111 -393
- package/dist/index.d.cts +18 -17
- package/dist/index.d.ts +18 -17
- package/dist/index.js +19 -20
- package/dist/manifest/index.cjs +224 -35
- package/dist/manifest/index.cjs.map +1 -1
- package/dist/manifest/index.d.cts +130 -131
- package/dist/manifest/index.d.ts +130 -131
- package/dist/manifest/index.js +219 -7
- package/dist/manifest/index.js.map +1 -1
- package/dist/modules/index.cjs +281 -42
- package/dist/modules/index.cjs.map +1 -1
- package/dist/modules/index.d.cts +157 -159
- package/dist/modules/index.d.ts +157 -159
- package/dist/modules/index.js +274 -6
- package/dist/modules/index.js.map +1 -1
- package/dist/objects/index.cjs +355 -22
- package/dist/objects/index.cjs.map +1 -1
- package/dist/objects/index.d.cts +2 -77
- package/dist/objects/index.d.ts +2 -77
- package/dist/objects/index.js +352 -2
- package/dist/objects/index.js.map +1 -1
- package/dist/policies/index.cjs +14 -56
- package/dist/policies/index.d.cts +2 -261
- package/dist/policies/index.d.ts +2 -261
- package/dist/policies/index.js +1 -3
- package/dist/policies-DH_GCXQ-.js +627 -0
- package/dist/policies-DH_GCXQ-.js.map +1 -0
- package/dist/policies-Nxbp1CH8.cjs +698 -0
- package/dist/policies-Nxbp1CH8.cjs.map +1 -0
- package/dist/privacy/index.cjs +26 -43
- package/dist/privacy/index.cjs.map +1 -1
- package/dist/privacy/index.d.cts +2 -189
- package/dist/privacy/index.d.ts +2 -189
- package/dist/privacy/index.js +18 -3
- package/dist/privacy/index.js.map +1 -1
- package/dist/projections/index.cjs +241 -23
- package/dist/projections/index.cjs.map +1 -1
- package/dist/projections/index.d.cts +2 -125
- package/dist/projections/index.d.ts +2 -125
- package/dist/projections/index.js +238 -3
- package/dist/projections/index.js.map +1 -1
- package/dist/state-machines/index.cjs +76 -18
- package/dist/state-machines/index.cjs.map +1 -1
- package/dist/state-machines/index.d.cts +2 -55
- package/dist/state-machines/index.d.ts +2 -55
- package/dist/state-machines/index.js +74 -2
- package/dist/state-machines/index.js.map +1 -1
- package/dist/testing/index.cjs +27 -19
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +17 -19
- package/dist/testing/index.d.ts +17 -19
- package/dist/testing/index.js +25 -3
- package/dist/testing/index.js.map +1 -1
- package/package.json +6 -5
- package/dist/chunk-2AE6TMAX.cjs +0 -44
- package/dist/chunk-2AE6TMAX.cjs.map +0 -1
- package/dist/chunk-6HY35TKB.cjs +0 -491
- package/dist/chunk-6HY35TKB.cjs.map +0 -1
- package/dist/chunk-6UGEIDLC.cjs +0 -26
- package/dist/chunk-6UGEIDLC.cjs.map +0 -1
- package/dist/chunk-7GAWSUOG.js +0 -64
- package/dist/chunk-7GAWSUOG.js.map +0 -1
- package/dist/chunk-A42JJIPL.cjs +0 -699
- package/dist/chunk-A42JJIPL.cjs.map +0 -1
- package/dist/chunk-AFXKSIVI.cjs +0 -540
- package/dist/chunk-AFXKSIVI.cjs.map +0 -1
- package/dist/chunk-B5DOGDPG.js +0 -42
- package/dist/chunk-B5DOGDPG.js.map +0 -1
- package/dist/chunk-BJGZE3GE.js +0 -20
- package/dist/chunk-BJGZE3GE.js.map +0 -1
- package/dist/chunk-CRZXTZ36.cjs +0 -258
- package/dist/chunk-CRZXTZ36.cjs.map +0 -1
- package/dist/chunk-D4SWRBUH.cjs +0 -22
- package/dist/chunk-D4SWRBUH.cjs.map +0 -1
- package/dist/chunk-DBTAUI6C.cjs +0 -395
- package/dist/chunk-DBTAUI6C.cjs.map +0 -1
- package/dist/chunk-EMSAFNPX.js +0 -98
- package/dist/chunk-EMSAFNPX.js.map +0 -1
- package/dist/chunk-F3E5SXPN.cjs +0 -28
- package/dist/chunk-F3E5SXPN.cjs.map +0 -1
- package/dist/chunk-HEYMMVDP.js +0 -480
- package/dist/chunk-HEYMMVDP.js.map +0 -1
- package/dist/chunk-IFW43ELT.cjs +0 -331
- package/dist/chunk-IFW43ELT.cjs.map +0 -1
- package/dist/chunk-LFE74IJX.js +0 -20
- package/dist/chunk-LFE74IJX.js.map +0 -1
- package/dist/chunk-LZSE6QGQ.cjs +0 -60
- package/dist/chunk-LZSE6QGQ.cjs.map +0 -1
- package/dist/chunk-MCWSUGB3.cjs +0 -102
- package/dist/chunk-MCWSUGB3.cjs.map +0 -1
- package/dist/chunk-MLBALEUR.js +0 -290
- package/dist/chunk-MLBALEUR.js.map +0 -1
- package/dist/chunk-NNXQZPB3.cjs +0 -31
- package/dist/chunk-NNXQZPB3.cjs.map +0 -1
- package/dist/chunk-OFCCZ27Z.js +0 -26
- package/dist/chunk-OFCCZ27Z.js.map +0 -1
- package/dist/chunk-PDN5DOLQ.js +0 -242
- package/dist/chunk-PDN5DOLQ.js.map +0 -1
- package/dist/chunk-PIDZQAEL.js +0 -50
- package/dist/chunk-PIDZQAEL.js.map +0 -1
- package/dist/chunk-PXD7NG6X.js +0 -686
- package/dist/chunk-PXD7NG6X.js.map +0 -1
- package/dist/chunk-Q4Q4JPR3.js +0 -524
- package/dist/chunk-Q4Q4JPR3.js.map +0 -1
- package/dist/chunk-RALMUSOX.js +0 -55
- package/dist/chunk-RALMUSOX.js.map +0 -1
- package/dist/chunk-SNTV45LH.cjs +0 -295
- package/dist/chunk-SNTV45LH.cjs.map +0 -1
- package/dist/chunk-TBS2S5AX.cjs +0 -40
- package/dist/chunk-TBS2S5AX.cjs.map +0 -1
- package/dist/chunk-TYNIFC7J.js +0 -253
- package/dist/chunk-TYNIFC7J.js.map +0 -1
- package/dist/chunk-UGWGHTNC.cjs +0 -56
- package/dist/chunk-UGWGHTNC.cjs.map +0 -1
- package/dist/chunk-WI7CWNYI.cjs +0 -68
- package/dist/chunk-WI7CWNYI.cjs.map +0 -1
- package/dist/chunk-WNZP53GI.js +0 -386
- package/dist/chunk-WNZP53GI.js.map +0 -1
- package/dist/chunk-WQ3BYI7T.cjs +0 -249
- package/dist/chunk-WQ3BYI7T.cjs.map +0 -1
- package/dist/chunk-Y2PJLRIY.js +0 -36
- package/dist/chunk-Y2PJLRIY.js.map +0 -1
- package/dist/chunk-ZAEVQSB5.js +0 -326
- package/dist/chunk-ZAEVQSB5.js.map +0 -1
- package/dist/chunk-ZMQTV5OJ.js +0 -27
- package/dist/chunk-ZMQTV5OJ.js.map +0 -1
- package/dist/evidence/index.cjs.map +0 -1
- package/dist/evidence/index.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/policies/index.cjs.map +0 -1
- package/dist/policies/index.js.map +0 -1
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
let crypto = require("crypto");
|
|
2
|
+
//#region privacy/engine.ts
|
|
3
|
+
const ANONYMIZATION_POLICY_VERSION = "adr-026-platform-anonymization-v1";
|
|
4
|
+
function normalizeKey(key) {
|
|
5
|
+
return key.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
|
|
6
|
+
}
|
|
7
|
+
function stableChecksum(value) {
|
|
8
|
+
return (0, crypto.createHash)("sha256").update(JSON.stringify(value)).digest("hex");
|
|
9
|
+
}
|
|
10
|
+
function stableScopedToken(value, context, fieldPath) {
|
|
11
|
+
const scope = `${context.tenantId}:${context.spaceId ?? "global"}:${fieldPath}`;
|
|
12
|
+
return `tok_${(0, crypto.createHash)("sha256").update(`${context.policyVersion ?? "adr-026-platform-anonymization-v1"}:${scope}:${String(value)}`).digest("hex").slice(0, 24)}`;
|
|
13
|
+
}
|
|
14
|
+
function maskValue(value) {
|
|
15
|
+
if (value === null || value === void 0) return null;
|
|
16
|
+
const stringValue = String(value);
|
|
17
|
+
if (stringValue.length <= 4) return "****";
|
|
18
|
+
return `${"*".repeat(Math.max(stringValue.length - 4, 4))}${stringValue.slice(-4)}`;
|
|
19
|
+
}
|
|
20
|
+
function generalizeValue(value) {
|
|
21
|
+
if (typeof value === "number") return Math.round(value / 1e3) * 1e3;
|
|
22
|
+
if (typeof value === "string" && /^\d{5}(?:-\d{4})?$/.test(value)) return `${value.slice(0, 3)}**`;
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
function applyMethod(value, method, context, path) {
|
|
26
|
+
switch (method) {
|
|
27
|
+
case "drop": return;
|
|
28
|
+
case "nullify": return null;
|
|
29
|
+
case "mask": return maskValue(value);
|
|
30
|
+
case "hash": return `sha256_${stableChecksum(value)}`;
|
|
31
|
+
case "tokenize": return stableScopedToken(value, context, path);
|
|
32
|
+
case "generalize": return generalizeValue(value);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function policyForPath(policies, path, key) {
|
|
36
|
+
const normalizedPath = normalizeKey(path);
|
|
37
|
+
const normalizedKey = key ? normalizeKey(key) : void 0;
|
|
38
|
+
return policies.find((policy) => {
|
|
39
|
+
const normalizedValue = normalizeKey(policy.value);
|
|
40
|
+
if (policy.match === "key") return normalizedValue === normalizedKey;
|
|
41
|
+
return normalizedValue === normalizedPath;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function isPlainObject(value) {
|
|
45
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value) && !(value instanceof Date);
|
|
46
|
+
}
|
|
47
|
+
function anonymizeRecursive(value, context, dataClass, path, redactedFields, policies, key) {
|
|
48
|
+
const fieldPolicy = policyForPath(policies, path, key);
|
|
49
|
+
if (fieldPolicy && value !== null && value !== void 0) {
|
|
50
|
+
redactedFields.push({
|
|
51
|
+
fieldPath: path,
|
|
52
|
+
method: fieldPolicy.method,
|
|
53
|
+
policyVersion: context.policyVersion ?? "adr-026-platform-anonymization-v1",
|
|
54
|
+
jobId: context.jobId,
|
|
55
|
+
redactedAt: (context.redactedAt ?? /* @__PURE__ */ new Date()).toISOString(),
|
|
56
|
+
reason: context.reason,
|
|
57
|
+
dataClass,
|
|
58
|
+
beforeChecksum: stableChecksum(value)
|
|
59
|
+
});
|
|
60
|
+
return applyMethod(value, fieldPolicy.method, context, path);
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(value)) return value.map((item, index) => anonymizeRecursive(item, context, dataClass, `${path}[${index}]`, redactedFields, policies));
|
|
63
|
+
if (!isPlainObject(value)) return value;
|
|
64
|
+
const result = {};
|
|
65
|
+
for (const [childKey, childValue] of Object.entries(value)) {
|
|
66
|
+
if (childKey === "_privacy") {
|
|
67
|
+
result[childKey] = childValue;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const anonymized = anonymizeRecursive(childValue, context, dataClass, `${path}.${childKey}`, redactedFields, policies, childKey);
|
|
71
|
+
if (anonymized !== void 0) result[childKey] = anonymized;
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
function buildMetadata(context, dataClass, redactedFields, preservedSemantics) {
|
|
76
|
+
return {
|
|
77
|
+
redactionState: "anonymized",
|
|
78
|
+
policyVersion: context.policyVersion ?? "adr-026-platform-anonymization-v1",
|
|
79
|
+
jobId: context.jobId,
|
|
80
|
+
redactedAt: (context.redactedAt ?? /* @__PURE__ */ new Date()).toISOString(),
|
|
81
|
+
reason: context.reason,
|
|
82
|
+
dataClass,
|
|
83
|
+
redactedFields,
|
|
84
|
+
preservedSemantics: [...preservedSemantics]
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
var FieldRedactor = class {
|
|
88
|
+
redactField(value, method, context, path) {
|
|
89
|
+
return applyMethod(value, method, context, path);
|
|
90
|
+
}
|
|
91
|
+
mask(value) {
|
|
92
|
+
return maskValue(value);
|
|
93
|
+
}
|
|
94
|
+
hash(value) {
|
|
95
|
+
return `sha256_${stableChecksum(value)}`;
|
|
96
|
+
}
|
|
97
|
+
tokenize(value, context, path) {
|
|
98
|
+
return stableScopedToken(value, context, path);
|
|
99
|
+
}
|
|
100
|
+
generalize(value) {
|
|
101
|
+
return generalizeValue(value);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
var AnonymizationEngine = class {
|
|
105
|
+
#policy;
|
|
106
|
+
constructor(policy) {
|
|
107
|
+
this.#policy = {
|
|
108
|
+
fields: policy.fields.map((field) => ({ ...field })),
|
|
109
|
+
preservedSemantics: [...policy.preservedSemantics ?? []]
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
anonymizeJsonValue(value, context, dataClass) {
|
|
113
|
+
return this.anonymizeJsonValueAtPath(value, context, dataClass, "$");
|
|
114
|
+
}
|
|
115
|
+
anonymizeJsonValueAtPath(value, context, dataClass, basePath) {
|
|
116
|
+
const redactedFields = [];
|
|
117
|
+
return {
|
|
118
|
+
value: anonymizeRecursive(value, context, dataClass, basePath, redactedFields, this.#policy.fields),
|
|
119
|
+
metadata: buildMetadata(context, dataClass, redactedFields, this.#policy.preservedSemantics ?? [])
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
anonymizeAssetEventPayload(event, context) {
|
|
123
|
+
const result = this.anonymizeJsonValue(event.payload, context, "asset_event");
|
|
124
|
+
return {
|
|
125
|
+
value: isPlainObject(result.value) ? {
|
|
126
|
+
...result.value,
|
|
127
|
+
_privacy: result.metadata
|
|
128
|
+
} : {
|
|
129
|
+
value: result.value,
|
|
130
|
+
_privacy: result.metadata
|
|
131
|
+
},
|
|
132
|
+
metadata: result.metadata
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
anonymizeEvidencePacket(packet, context) {
|
|
136
|
+
const result = this.anonymizeJsonValue(packet.packet, context, "evidence_packet");
|
|
137
|
+
const redactionMetadata = {
|
|
138
|
+
...isPlainObject(packet.redactionMetadata) ? packet.redactionMetadata : {},
|
|
139
|
+
lifecycleAnonymization: result.metadata
|
|
140
|
+
};
|
|
141
|
+
const anonymizedPacket = isPlainObject(result.value) ? {
|
|
142
|
+
...result.value,
|
|
143
|
+
_privacy: result.metadata
|
|
144
|
+
} : {
|
|
145
|
+
value: result.value,
|
|
146
|
+
_privacy: result.metadata
|
|
147
|
+
};
|
|
148
|
+
return {
|
|
149
|
+
value: {
|
|
150
|
+
packet: anonymizedPacket,
|
|
151
|
+
redactionMetadata,
|
|
152
|
+
checksum: stableChecksum({
|
|
153
|
+
packet: anonymizedPacket,
|
|
154
|
+
redactionMetadata
|
|
155
|
+
})
|
|
156
|
+
},
|
|
157
|
+
metadata: result.metadata
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
buildAnonymizationLifecycleEvidence(input) {
|
|
161
|
+
const assetEvents = input.assetEvents ?? [];
|
|
162
|
+
const readModels = input.readModels ?? [];
|
|
163
|
+
const evidencePackets = input.evidencePackets ?? [];
|
|
164
|
+
const redactedFields = [
|
|
165
|
+
...assetEvents.flatMap((item) => item.metadata.redactedFields),
|
|
166
|
+
...readModels.flatMap((item) => item.metadata.redactedFields),
|
|
167
|
+
...evidencePackets.flatMap((item) => item.metadata.redactedFields)
|
|
168
|
+
];
|
|
169
|
+
return {
|
|
170
|
+
eventType: "AnonymizationApplied",
|
|
171
|
+
policyVersion: input.context.policyVersion ?? "adr-026-platform-anonymization-v1",
|
|
172
|
+
jobId: input.context.jobId,
|
|
173
|
+
reason: input.context.reason,
|
|
174
|
+
appliedAt: (input.context.redactedAt ?? /* @__PURE__ */ new Date()).toISOString(),
|
|
175
|
+
tenantId: input.context.tenantId,
|
|
176
|
+
spaceId: input.context.spaceId ?? null,
|
|
177
|
+
counts: {
|
|
178
|
+
assetEvents: assetEvents.length,
|
|
179
|
+
readModels: readModels.length,
|
|
180
|
+
evidencePackets: evidencePackets.length,
|
|
181
|
+
redactedFields: redactedFields.length
|
|
182
|
+
},
|
|
183
|
+
records: [
|
|
184
|
+
...assetEvents.map((item) => ({
|
|
185
|
+
recordClass: "asset_event",
|
|
186
|
+
recordId: item.event.id,
|
|
187
|
+
subjectType: item.event.subjectType,
|
|
188
|
+
subjectId: item.event.subjectId,
|
|
189
|
+
fieldManifest: item.metadata.redactedFields.map(({ fieldPath, method, beforeChecksum }) => ({
|
|
190
|
+
fieldPath,
|
|
191
|
+
method,
|
|
192
|
+
beforeChecksum
|
|
193
|
+
}))
|
|
194
|
+
})),
|
|
195
|
+
...readModels.map((item) => ({
|
|
196
|
+
recordClass: "read_model",
|
|
197
|
+
recordId: item.record.id,
|
|
198
|
+
subjectType: item.modelKind,
|
|
199
|
+
subjectId: item.record.id,
|
|
200
|
+
fieldManifest: item.metadata.redactedFields.map(({ fieldPath, method, beforeChecksum }) => ({
|
|
201
|
+
fieldPath,
|
|
202
|
+
method,
|
|
203
|
+
beforeChecksum
|
|
204
|
+
}))
|
|
205
|
+
})),
|
|
206
|
+
...evidencePackets.map((item) => ({
|
|
207
|
+
recordClass: "evidence_packet",
|
|
208
|
+
recordId: item.packet.id,
|
|
209
|
+
fieldManifest: item.metadata.redactedFields.map(({ fieldPath, method, beforeChecksum }) => ({
|
|
210
|
+
fieldPath,
|
|
211
|
+
method,
|
|
212
|
+
beforeChecksum
|
|
213
|
+
}))
|
|
214
|
+
}))
|
|
215
|
+
],
|
|
216
|
+
preservedSemantics: [...this.#policy.preservedSemantics ?? []]
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
//#endregion
|
|
221
|
+
Object.defineProperty(exports, "ANONYMIZATION_POLICY_VERSION", {
|
|
222
|
+
enumerable: true,
|
|
223
|
+
get: function() {
|
|
224
|
+
return ANONYMIZATION_POLICY_VERSION;
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
Object.defineProperty(exports, "AnonymizationEngine", {
|
|
228
|
+
enumerable: true,
|
|
229
|
+
get: function() {
|
|
230
|
+
return AnonymizationEngine;
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
Object.defineProperty(exports, "FieldRedactor", {
|
|
234
|
+
enumerable: true,
|
|
235
|
+
get: function() {
|
|
236
|
+
return FieldRedactor;
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
Object.defineProperty(exports, "stableChecksum", {
|
|
240
|
+
enumerable: true,
|
|
241
|
+
get: function() {
|
|
242
|
+
return stableChecksum;
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
//# sourceMappingURL=engine-BqScuhrT.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-BqScuhrT.cjs","names":["createHash"],"sources":["../privacy/engine.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport type {\n\tAnonymizationContext,\n\tAnonymizationFieldMetadata,\n\tAnonymizationMetadata,\n\tAnonymizationResult,\n\tPlatformDataClass,\n\tRedactionMethod,\n} from \"./index\";\n\nexport const ANONYMIZATION_POLICY_VERSION = \"adr-026-platform-anonymization-v1\";\n\ntype JsonObject = Record<string, unknown>;\n\nexport interface AnonymizationFieldPolicy {\n\tmethod: RedactionMethod;\n\tmatch: \"key\" | \"path\";\n\tvalue: string;\n}\n\nexport interface AnonymizationPolicy {\n\tfields: readonly AnonymizationFieldPolicy[];\n\tpreservedSemantics?: readonly string[];\n}\n\nexport interface AssetEventLike {\n\tid: string;\n\ttenantId: string;\n\tspaceId: string;\n\teventType: string;\n\tsubjectType: string;\n\tsubjectId: string;\n\tactionInvocationId: string;\n\tpayload: unknown;\n\tsequence: number;\n\toccurredAt: Date;\n\trecordedAt: Date;\n\tcorrelationId: string;\n\tcausationId?: string | null;\n}\n\nexport interface EvidencePacketLike {\n\tid: string;\n\tpacket: unknown;\n\tredactionMetadata: unknown;\n\tchecksum: string;\n}\n\nexport interface AnonymizationLifecycleEvidence {\n\teventType: \"AnonymizationApplied\";\n\tpolicyVersion: string;\n\tjobId: string;\n\treason: string;\n\tappliedAt: string;\n\ttenantId: string;\n\tspaceId: string | null;\n\tcounts: {\n\t\tassetEvents: number;\n\t\treadModels: number;\n\t\tevidencePackets: number;\n\t\tredactedFields: number;\n\t};\n\trecords: Array<{\n\t\trecordClass: PlatformDataClass;\n\t\trecordId: string;\n\t\tsubjectType?: string;\n\t\tsubjectId?: string;\n\t\tfieldManifest: Array<\n\t\t\tPick<AnonymizationFieldMetadata, \"fieldPath\" | \"method\" | \"beforeChecksum\">\n\t\t>;\n\t}>;\n\tpreservedSemantics: string[];\n}\n\nfunction normalizeKey(key: string): string {\n\treturn key.replace(/[^a-zA-Z0-9]/g, \"\").toLowerCase();\n}\n\nexport function stableChecksum(value: unknown): string {\n\treturn createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\");\n}\n\nfunction stableScopedToken(\n\tvalue: unknown,\n\tcontext: AnonymizationContext,\n\tfieldPath: string,\n): string {\n\tconst scope = `${context.tenantId}:${context.spaceId ?? \"global\"}:${fieldPath}`;\n\treturn `tok_${createHash(\"sha256\")\n\t\t.update(`${context.policyVersion ?? ANONYMIZATION_POLICY_VERSION}:${scope}:${String(value)}`)\n\t\t.digest(\"hex\")\n\t\t.slice(0, 24)}`;\n}\n\nfunction maskValue(value: unknown): string | null {\n\tif (value === null || value === undefined) {\n\t\treturn null;\n\t}\n\n\tconst stringValue = String(value);\n\tif (stringValue.length <= 4) {\n\t\treturn \"****\";\n\t}\n\n\treturn `${\"*\".repeat(Math.max(stringValue.length - 4, 4))}${stringValue.slice(-4)}`;\n}\n\nfunction generalizeValue(value: unknown): unknown {\n\tif (typeof value === \"number\") {\n\t\treturn Math.round(value / 1000) * 1000;\n\t}\n\n\tif (typeof value === \"string\" && /^\\d{5}(?:-\\d{4})?$/.test(value)) {\n\t\treturn `${value.slice(0, 3)}**`;\n\t}\n\n\treturn null;\n}\n\nfunction applyMethod(\n\tvalue: unknown,\n\tmethod: RedactionMethod,\n\tcontext: AnonymizationContext,\n\tpath: string,\n): unknown {\n\tswitch (method) {\n\t\tcase \"drop\":\n\t\t\treturn undefined;\n\t\tcase \"nullify\":\n\t\t\treturn null;\n\t\tcase \"mask\":\n\t\t\treturn maskValue(value);\n\t\tcase \"hash\":\n\t\t\treturn `sha256_${stableChecksum(value)}`;\n\t\tcase \"tokenize\":\n\t\t\treturn stableScopedToken(value, context, path);\n\t\tcase \"generalize\":\n\t\t\treturn generalizeValue(value);\n\t}\n}\n\nfunction policyForPath(policies: readonly AnonymizationFieldPolicy[], path: string, key?: string): AnonymizationFieldPolicy | undefined {\n\tconst normalizedPath = normalizeKey(path);\n\tconst normalizedKey = key ? normalizeKey(key) : undefined;\n\n\treturn policies.find((policy) => {\n\t\tconst normalizedValue = normalizeKey(policy.value);\n\t\tif (policy.match === \"key\") {\n\t\t\treturn normalizedValue === normalizedKey;\n\t\t}\n\n\t\treturn normalizedValue === normalizedPath;\n\t});\n}\n\nfunction isPlainObject(value: unknown): value is JsonObject {\n\treturn (\n\t\tBoolean(value) && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof Date)\n\t);\n}\n\nfunction anonymizeRecursive(\n\tvalue: unknown,\n\tcontext: AnonymizationContext,\n\tdataClass: PlatformDataClass,\n\tpath: string,\n\tredactedFields: AnonymizationFieldMetadata[],\n\tpolicies: readonly AnonymizationFieldPolicy[],\n\tkey?: string,\n): unknown {\n\tconst fieldPolicy = policyForPath(policies, path, key);\n\tif (fieldPolicy && value !== null && value !== undefined) {\n\t\tredactedFields.push({\n\t\t\tfieldPath: path,\n\t\t\tmethod: fieldPolicy.method,\n\t\t\tpolicyVersion: context.policyVersion ?? ANONYMIZATION_POLICY_VERSION,\n\t\t\tjobId: context.jobId,\n\t\t\tredactedAt: (context.redactedAt ?? new Date()).toISOString(),\n\t\t\treason: context.reason,\n\t\t\tdataClass,\n\t\t\tbeforeChecksum: stableChecksum(value),\n\t\t});\n\n\t\treturn applyMethod(value, fieldPolicy.method, context, path);\n\t}\n\n\tif (Array.isArray(value)) {\n\t\treturn value.map((item, index) =>\n\t\t\tanonymizeRecursive(item, context, dataClass, `${path}[${index}]`, redactedFields, policies),\n\t\t);\n\t}\n\n\tif (!isPlainObject(value)) {\n\t\treturn value;\n\t}\n\n\tconst result: JsonObject = {};\n\tfor (const [childKey, childValue] of Object.entries(value)) {\n\t\tif (childKey === \"_privacy\") {\n\t\t\tresult[childKey] = childValue;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst anonymized = anonymizeRecursive(\n\t\t\tchildValue,\n\t\t\tcontext,\n\t\t\tdataClass,\n\t\t\t`${path}.${childKey}`,\n\t\t\tredactedFields,\n\t\t\tpolicies,\n\t\t\tchildKey,\n\t\t);\n\n\t\tif (anonymized !== undefined) {\n\t\t\tresult[childKey] = anonymized;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction buildMetadata(\n\tcontext: AnonymizationContext,\n\tdataClass: PlatformDataClass,\n\tredactedFields: AnonymizationFieldMetadata[],\n\tpreservedSemantics: readonly string[],\n): AnonymizationMetadata {\n\treturn {\n\t\tredactionState: \"anonymized\",\n\t\tpolicyVersion: context.policyVersion ?? ANONYMIZATION_POLICY_VERSION,\n\t\tjobId: context.jobId,\n\t\tredactedAt: (context.redactedAt ?? new Date()).toISOString(),\n\t\treason: context.reason,\n\t\tdataClass,\n\t\tredactedFields,\n\t\tpreservedSemantics: [...preservedSemantics],\n\t};\n}\n\nexport class FieldRedactor {\n\tredactField(value: unknown, method: RedactionMethod, context: AnonymizationContext, path: string): unknown {\n\t\treturn applyMethod(value, method, context, path);\n\t}\n\n\tmask(value: unknown): string | null {\n\t\treturn maskValue(value);\n\t}\n\n\thash(value: unknown): string {\n\t\treturn `sha256_${stableChecksum(value)}`;\n\t}\n\n\ttokenize(value: unknown, context: AnonymizationContext, path: string): string {\n\t\treturn stableScopedToken(value, context, path);\n\t}\n\n\tgeneralize(value: unknown): unknown {\n\t\treturn generalizeValue(value);\n\t}\n}\n\nexport class AnonymizationEngine {\n\treadonly #policy: AnonymizationPolicy;\n\n\tconstructor(policy: AnonymizationPolicy) {\n\t\tthis.#policy = {\n\t\t\tfields: policy.fields.map((field) => ({ ...field })),\n\t\t\tpreservedSemantics: [...(policy.preservedSemantics ?? [])],\n\t\t};\n\t}\n\n\tanonymizeJsonValue<TValue>(\n\t\tvalue: TValue,\n\t\tcontext: AnonymizationContext,\n\t\tdataClass: PlatformDataClass,\n\t): AnonymizationResult<TValue> {\n\t\treturn this.anonymizeJsonValueAtPath(value, context, dataClass, \"$\");\n\t}\n\n\tanonymizeJsonValueAtPath<TValue>(\n\t\tvalue: TValue,\n\t\tcontext: AnonymizationContext,\n\t\tdataClass: PlatformDataClass,\n\t\tbasePath: string,\n\t): AnonymizationResult<TValue> {\n\t\tconst redactedFields: AnonymizationFieldMetadata[] = [];\n\t\tconst anonymizedValue = anonymizeRecursive(\n\t\t\tvalue,\n\t\t\tcontext,\n\t\t\tdataClass,\n\t\t\tbasePath,\n\t\t\tredactedFields,\n\t\t\tthis.#policy.fields,\n\t\t) as TValue;\n\n\t\treturn {\n\t\t\tvalue: anonymizedValue,\n\t\t\tmetadata: buildMetadata(context, dataClass, redactedFields, this.#policy.preservedSemantics ?? []),\n\t\t};\n\t}\n\n\tanonymizeAssetEventPayload(\n\t\tevent: AssetEventLike,\n\t\tcontext: AnonymizationContext,\n\t): AnonymizationResult<unknown> {\n\t\tconst result = this.anonymizeJsonValue(event.payload, context, \"asset_event\");\n\t\tconst payload = isPlainObject(result.value)\n\t\t\t? { ...result.value, _privacy: result.metadata }\n\t\t\t: { value: result.value, _privacy: result.metadata };\n\n\t\treturn { value: payload, metadata: result.metadata };\n\t}\n\n\tanonymizeEvidencePacket(\n\t\tpacket: EvidencePacketLike,\n\t\tcontext: AnonymizationContext,\n\t): AnonymizationResult<Pick<EvidencePacketLike, \"packet\" | \"redactionMetadata\" | \"checksum\">> {\n\t\tconst result = this.anonymizeJsonValue(packet.packet, context, \"evidence_packet\");\n\t\tconst redactionMetadata = {\n\t\t\t...(isPlainObject(packet.redactionMetadata) ? packet.redactionMetadata : {}),\n\t\t\tlifecycleAnonymization: result.metadata,\n\t\t};\n\t\tconst anonymizedPacket = isPlainObject(result.value)\n\t\t\t? { ...result.value, _privacy: result.metadata }\n\t\t\t: { value: result.value, _privacy: result.metadata };\n\n\t\treturn {\n\t\t\tvalue: {\n\t\t\t\tpacket: anonymizedPacket,\n\t\t\t\tredactionMetadata,\n\t\t\t\tchecksum: stableChecksum({ packet: anonymizedPacket, redactionMetadata }),\n\t\t\t},\n\t\t\tmetadata: result.metadata,\n\t\t};\n\t}\n\n\tbuildAnonymizationLifecycleEvidence(input: {\n\t\tcontext: AnonymizationContext;\n\t\tassetEvents?: Array<{ event: AssetEventLike; metadata: AnonymizationMetadata }>;\n\t\treadModels?: Array<{\n\t\t\tmodelKind: string;\n\t\t\trecord: JsonObject & { id: string };\n\t\t\tmetadata: AnonymizationMetadata;\n\t\t}>;\n\t\tevidencePackets?: Array<{ packet: EvidencePacketLike; metadata: AnonymizationMetadata }>;\n\t}): AnonymizationLifecycleEvidence {\n\t\tconst assetEvents = input.assetEvents ?? [];\n\t\tconst readModels = input.readModels ?? [];\n\t\tconst evidencePackets = input.evidencePackets ?? [];\n\t\tconst redactedFields = [\n\t\t\t...assetEvents.flatMap((item) => item.metadata.redactedFields),\n\t\t\t...readModels.flatMap((item) => item.metadata.redactedFields),\n\t\t\t...evidencePackets.flatMap((item) => item.metadata.redactedFields),\n\t\t];\n\n\t\treturn {\n\t\t\teventType: \"AnonymizationApplied\",\n\t\t\tpolicyVersion: input.context.policyVersion ?? ANONYMIZATION_POLICY_VERSION,\n\t\t\tjobId: input.context.jobId,\n\t\t\treason: input.context.reason,\n\t\t\tappliedAt: (input.context.redactedAt ?? new Date()).toISOString(),\n\t\t\ttenantId: input.context.tenantId,\n\t\t\tspaceId: input.context.spaceId ?? null,\n\t\t\tcounts: {\n\t\t\t\tassetEvents: assetEvents.length,\n\t\t\t\treadModels: readModels.length,\n\t\t\t\tevidencePackets: evidencePackets.length,\n\t\t\t\tredactedFields: redactedFields.length,\n\t\t\t},\n\t\t\trecords: [\n\t\t\t\t...assetEvents.map((item) => ({\n\t\t\t\t\trecordClass: \"asset_event\" as PlatformDataClass,\n\t\t\t\t\trecordId: item.event.id,\n\t\t\t\t\tsubjectType: item.event.subjectType,\n\t\t\t\t\tsubjectId: item.event.subjectId,\n\t\t\t\t\tfieldManifest: item.metadata.redactedFields.map(\n\t\t\t\t\t\t({ fieldPath, method, beforeChecksum }) => ({\n\t\t\t\t\t\t\tfieldPath,\n\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\tbeforeChecksum,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t})),\n\t\t\t\t...readModels.map((item) => ({\n\t\t\t\t\trecordClass: \"read_model\" as PlatformDataClass,\n\t\t\t\t\trecordId: item.record.id,\n\t\t\t\t\tsubjectType: item.modelKind,\n\t\t\t\t\tsubjectId: item.record.id,\n\t\t\t\t\tfieldManifest: item.metadata.redactedFields.map(\n\t\t\t\t\t\t({ fieldPath, method, beforeChecksum }) => ({\n\t\t\t\t\t\t\tfieldPath,\n\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\tbeforeChecksum,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t})),\n\t\t\t\t...evidencePackets.map((item) => ({\n\t\t\t\t\trecordClass: \"evidence_packet\" as PlatformDataClass,\n\t\t\t\t\trecordId: item.packet.id,\n\t\t\t\t\tfieldManifest: item.metadata.redactedFields.map(\n\t\t\t\t\t\t({ fieldPath, method, beforeChecksum }) => ({\n\t\t\t\t\t\t\tfieldPath,\n\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\tbeforeChecksum,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t})),\n\t\t\t],\n\t\t\tpreservedSemantics: [...(this.#policy.preservedSemantics ?? [])],\n\t\t};\n\t}\n}\n"],"mappings":"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"}
|
package/dist/events/index.cjs
CHANGED
|
@@ -1,12 +1,41 @@
|
|
|
1
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region events/index.ts
|
|
3
|
+
const BUILT_IN_SUBJECT_TYPES = Object.freeze([
|
|
4
|
+
"ActionInvocation",
|
|
5
|
+
"PolicyEvaluation",
|
|
6
|
+
"AdapterInvocation"
|
|
7
|
+
]);
|
|
8
|
+
const BUILT_IN_EVENT_TYPES = Object.freeze([
|
|
9
|
+
"ComplianceBlocked",
|
|
10
|
+
"StateTransitioned",
|
|
11
|
+
"AdapterInvocationStarted",
|
|
12
|
+
"AdapterInvocationSucceeded",
|
|
13
|
+
"AdapterInvocationFailed",
|
|
14
|
+
"ExternalOperationAccepted",
|
|
15
|
+
"ExternalOperationCompleted",
|
|
16
|
+
"ExternalOperationFailed",
|
|
17
|
+
"ExternalOperationContradicted",
|
|
18
|
+
"WebhookReceived"
|
|
19
|
+
]);
|
|
20
|
+
function createEventContractRegistry(input = {}) {
|
|
21
|
+
const eventTypes = /* @__PURE__ */ new Set([...BUILT_IN_EVENT_TYPES, ...input.eventTypes ?? []]);
|
|
22
|
+
const subjectTypes = /* @__PURE__ */ new Set([...BUILT_IN_SUBJECT_TYPES, ...input.subjectTypes ?? []]);
|
|
23
|
+
return {
|
|
24
|
+
registerEventType(eventType) {
|
|
25
|
+
if (!eventType) throw new Error("Event type cannot be empty");
|
|
26
|
+
eventTypes.add(eventType);
|
|
27
|
+
},
|
|
28
|
+
registerSubjectType(subjectType) {
|
|
29
|
+
if (!subjectType) throw new Error("Subject type cannot be empty");
|
|
30
|
+
subjectTypes.add(subjectType);
|
|
31
|
+
},
|
|
32
|
+
hasEventType: (eventType) => eventTypes.has(eventType),
|
|
33
|
+
hasSubjectType: (subjectType) => subjectTypes.has(subjectType),
|
|
34
|
+
eventTypes: () => Array.from(eventTypes).sort(),
|
|
35
|
+
subjectTypes: () => Array.from(subjectTypes).sort()
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
exports.createEventContractRegistry = createEventContractRegistry;
|
|
2
40
|
|
|
3
|
-
var chunk2AE6TMAX_cjs = require('../chunk-2AE6TMAX.cjs');
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Object.defineProperty(exports, "createEventContractRegistry", {
|
|
8
|
-
enumerable: true,
|
|
9
|
-
get: function () { return chunk2AE6TMAX_cjs.createEventContractRegistry; }
|
|
10
|
-
});
|
|
11
|
-
//# sourceMappingURL=index.cjs.map
|
|
12
41
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../events/index.ts"],"sourcesContent":["export interface AssetEventEnvelope<TPayload = unknown> {\n\tid: string;\n\ttenantId: string;\n\tspaceId: string;\n\teventType: string;\n\teventSchemaVersion: number;\n\tsubjectType: string;\n\tsubjectId: string;\n\tactorId: string;\n\tactorType: string;\n\tactionInvocationId?: string;\n\tpayload: TPayload;\n\tsequence: number;\n\toccurredAt: Date;\n\trecordedAt: Date;\n\tcorrelationId: string;\n\tcausationId?: string;\n\tprovenance?: EventProvenance;\n\t/**\n\t * Mirrors the emitting action's declared consistency. Present only when the\n\t * action declares `provisional-until-reconciled`, so a consumer can tell a\n\t * settled fact from one still awaiting reconciliation without a lookup.\n\t * Additive and optional: tolerant consumers that ignore it stay correct.\n\t */\n\tconsistency?: \"authoritative-now\" | \"provisional-until-reconciled\";\n}\n\nexport interface EventProvenance {\n\tsource: \"ui\" | \"api\" | \"agent\" | \"worker\" | \"system\" | (string & {});\n\tauditAttributes?: Record<string, string>;\n}\n\nconst BUILT_IN_SUBJECT_TYPES = Object.freeze([\n\t\"ActionInvocation\",\n\t\"PolicyEvaluation\",\n\t\"AdapterInvocation\",\n]);\n\nconst BUILT_IN_EVENT_TYPES = Object.freeze([\n\t\"ComplianceBlocked\",\n\t\"StateTransitioned\",\n\t\"AdapterInvocationStarted\",\n\t\"AdapterInvocationSucceeded\",\n\t\"AdapterInvocationFailed\",\n\t\"ExternalOperationAccepted\",\n\t\"ExternalOperationCompleted\",\n\t\"ExternalOperationFailed\",\n\t\"ExternalOperationContradicted\",\n\t\"WebhookReceived\",\n]);\n\nexport type AssetEventSubjectType = string;\nexport type AssetEventType = string;\nexport type AssetEventActorType = \"natural_person\" | \"agent\" | \"adapter\" | \"system\" | \"service_account\" | \"external_system\" | \"integration\";\n\nexport interface EventContractRegistry {\n\tregisterEventType(eventType: string): void;\n\tregisterSubjectType(subjectType: string): void;\n\thasEventType(eventType: string): boolean;\n\thasSubjectType(subjectType: string): boolean;\n\teventTypes(): string[];\n\tsubjectTypes(): string[];\n}\n\nexport function createEventContractRegistry(input: { eventTypes?: readonly string[]; subjectTypes?: readonly string[] } = {}): EventContractRegistry {\n\tconst eventTypes = new Set([...BUILT_IN_EVENT_TYPES, ...(input.eventTypes ?? [])]);\n\tconst subjectTypes = new Set([...BUILT_IN_SUBJECT_TYPES, ...(input.subjectTypes ?? [])]);\n\treturn {\n\t\tregisterEventType(eventType) {\n\t\t\tif (!eventType) {\n\t\t\t\tthrow new Error(\"Event type cannot be empty\");\n\t\t\t}\n\t\t\teventTypes.add(eventType);\n\t\t},\n\t\tregisterSubjectType(subjectType) {\n\t\t\tif (!subjectType) throw new Error(\"Subject type cannot be empty\");\n\t\t\tsubjectTypes.add(subjectType);\n\t\t},\n\t\thasEventType: (eventType) => eventTypes.has(eventType),\n\t\thasSubjectType: (subjectType) => subjectTypes.has(subjectType),\n\t\teventTypes: () => Array.from(eventTypes).sort(),\n\t\tsubjectTypes: () => Array.from(subjectTypes).sort(),\n\t};\n}\n"],"mappings":";;AAgCA,MAAM,yBAAyB,OAAO,OAAO;CAC5C;CACA;CACA;AACD,CAAC;AAED,MAAM,uBAAuB,OAAO,OAAO;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAeD,SAAgB,4BAA4B,QAA8E,CAAC,GAA0B;CACpJ,MAAM,6BAAa,IAAI,IAAI,CAAC,GAAG,sBAAsB,GAAI,MAAM,cAAc,CAAC,CAAE,CAAC;CACjF,MAAM,+BAAe,IAAI,IAAI,CAAC,GAAG,wBAAwB,GAAI,MAAM,gBAAgB,CAAC,CAAE,CAAC;CACvF,OAAO;EACN,kBAAkB,WAAW;GAC5B,IAAI,CAAC,WACJ,MAAM,IAAI,MAAM,4BAA4B;GAE7C,WAAW,IAAI,SAAS;EACzB;EACA,oBAAoB,aAAa;GAChC,IAAI,CAAC,aAAa,MAAM,IAAI,MAAM,8BAA8B;GAChE,aAAa,IAAI,WAAW;EAC7B;EACA,eAAe,cAAc,WAAW,IAAI,SAAS;EACrD,iBAAiB,gBAAgB,aAAa,IAAI,WAAW;EAC7D,kBAAkB,MAAM,KAAK,UAAU,CAAC,CAAC,KAAK;EAC9C,oBAAoB,MAAM,KAAK,YAAY,CAAC,CAAC,KAAK;CACnD;AACD"}
|
package/dist/events/index.d.cts
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
//#region events/index.d.ts
|
|
2
|
+
export interface AssetEventEnvelope<TPayload = unknown> {
|
|
3
|
+
id: string;
|
|
4
|
+
tenantId: string;
|
|
5
|
+
spaceId: string;
|
|
6
|
+
eventType: string;
|
|
7
|
+
eventSchemaVersion: number;
|
|
8
|
+
subjectType: string;
|
|
9
|
+
subjectId: string;
|
|
10
|
+
actorId: string;
|
|
11
|
+
actorType: string;
|
|
12
|
+
actionInvocationId?: string;
|
|
13
|
+
payload: TPayload;
|
|
14
|
+
sequence: number;
|
|
15
|
+
occurredAt: Date;
|
|
16
|
+
recordedAt: Date;
|
|
17
|
+
correlationId: string;
|
|
18
|
+
causationId?: string;
|
|
19
|
+
provenance?: EventProvenance;
|
|
20
|
+
/**
|
|
21
|
+
* Mirrors the emitting action's declared consistency. Present only when the
|
|
22
|
+
* action declares `provisional-until-reconciled`, so a consumer can tell a
|
|
23
|
+
* settled fact from one still awaiting reconciliation without a lookup.
|
|
24
|
+
* Additive and optional: tolerant consumers that ignore it stay correct.
|
|
25
|
+
*/
|
|
26
|
+
consistency?: "authoritative-now" | "provisional-until-reconciled";
|
|
26
27
|
}
|
|
27
|
-
interface EventProvenance {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
export interface EventProvenance {
|
|
29
|
+
source: "ui" | "api" | "agent" | "worker" | "system" | (string & {});
|
|
30
|
+
auditAttributes?: Record<string, string>;
|
|
30
31
|
}
|
|
31
|
-
type AssetEventSubjectType = string;
|
|
32
|
-
type AssetEventType = string;
|
|
33
|
-
type AssetEventActorType = "natural_person" | "agent" | "adapter" | "system" | "service_account" | "external_system" | "integration";
|
|
34
|
-
interface EventContractRegistry {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
export type AssetEventSubjectType = string;
|
|
33
|
+
export type AssetEventType = string;
|
|
34
|
+
export type AssetEventActorType = "natural_person" | "agent" | "adapter" | "system" | "service_account" | "external_system" | "integration";
|
|
35
|
+
export interface EventContractRegistry {
|
|
36
|
+
registerEventType(eventType: string): void;
|
|
37
|
+
registerSubjectType(subjectType: string): void;
|
|
38
|
+
hasEventType(eventType: string): boolean;
|
|
39
|
+
hasSubjectType(subjectType: string): boolean;
|
|
40
|
+
eventTypes(): string[];
|
|
41
|
+
subjectTypes(): string[];
|
|
41
42
|
}
|
|
42
|
-
declare function createEventContractRegistry(input?: {
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
export declare function createEventContractRegistry(input?: {
|
|
44
|
+
eventTypes?: readonly string[];
|
|
45
|
+
subjectTypes?: readonly string[];
|
|
45
46
|
}): EventContractRegistry;
|
|
46
|
-
|
|
47
|
-
export { type AssetEventActorType, type AssetEventEnvelope, type AssetEventSubjectType, type AssetEventType, type EventContractRegistry, type EventProvenance, createEventContractRegistry };
|
|
47
|
+
//#endregion
|
package/dist/events/index.d.ts
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
//#region events/index.d.ts
|
|
2
|
+
export interface AssetEventEnvelope<TPayload = unknown> {
|
|
3
|
+
id: string;
|
|
4
|
+
tenantId: string;
|
|
5
|
+
spaceId: string;
|
|
6
|
+
eventType: string;
|
|
7
|
+
eventSchemaVersion: number;
|
|
8
|
+
subjectType: string;
|
|
9
|
+
subjectId: string;
|
|
10
|
+
actorId: string;
|
|
11
|
+
actorType: string;
|
|
12
|
+
actionInvocationId?: string;
|
|
13
|
+
payload: TPayload;
|
|
14
|
+
sequence: number;
|
|
15
|
+
occurredAt: Date;
|
|
16
|
+
recordedAt: Date;
|
|
17
|
+
correlationId: string;
|
|
18
|
+
causationId?: string;
|
|
19
|
+
provenance?: EventProvenance;
|
|
20
|
+
/**
|
|
21
|
+
* Mirrors the emitting action's declared consistency. Present only when the
|
|
22
|
+
* action declares `provisional-until-reconciled`, so a consumer can tell a
|
|
23
|
+
* settled fact from one still awaiting reconciliation without a lookup.
|
|
24
|
+
* Additive and optional: tolerant consumers that ignore it stay correct.
|
|
25
|
+
*/
|
|
26
|
+
consistency?: "authoritative-now" | "provisional-until-reconciled";
|
|
26
27
|
}
|
|
27
|
-
interface EventProvenance {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
export interface EventProvenance {
|
|
29
|
+
source: "ui" | "api" | "agent" | "worker" | "system" | (string & {});
|
|
30
|
+
auditAttributes?: Record<string, string>;
|
|
30
31
|
}
|
|
31
|
-
type AssetEventSubjectType = string;
|
|
32
|
-
type AssetEventType = string;
|
|
33
|
-
type AssetEventActorType = "natural_person" | "agent" | "adapter" | "system" | "service_account" | "external_system" | "integration";
|
|
34
|
-
interface EventContractRegistry {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
export type AssetEventSubjectType = string;
|
|
33
|
+
export type AssetEventType = string;
|
|
34
|
+
export type AssetEventActorType = "natural_person" | "agent" | "adapter" | "system" | "service_account" | "external_system" | "integration";
|
|
35
|
+
export interface EventContractRegistry {
|
|
36
|
+
registerEventType(eventType: string): void;
|
|
37
|
+
registerSubjectType(subjectType: string): void;
|
|
38
|
+
hasEventType(eventType: string): boolean;
|
|
39
|
+
hasSubjectType(subjectType: string): boolean;
|
|
40
|
+
eventTypes(): string[];
|
|
41
|
+
subjectTypes(): string[];
|
|
41
42
|
}
|
|
42
|
-
declare function createEventContractRegistry(input?: {
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
export declare function createEventContractRegistry(input?: {
|
|
44
|
+
eventTypes?: readonly string[];
|
|
45
|
+
subjectTypes?: readonly string[];
|
|
45
46
|
}): EventContractRegistry;
|
|
46
|
-
|
|
47
|
-
export { type AssetEventActorType, type AssetEventEnvelope, type AssetEventSubjectType, type AssetEventType, type EventContractRegistry, type EventProvenance, createEventContractRegistry };
|
|
47
|
+
//#endregion
|
package/dist/events/index.js
CHANGED
|
@@ -1,3 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//#region events/index.ts
|
|
2
|
+
const BUILT_IN_SUBJECT_TYPES = Object.freeze([
|
|
3
|
+
"ActionInvocation",
|
|
4
|
+
"PolicyEvaluation",
|
|
5
|
+
"AdapterInvocation"
|
|
6
|
+
]);
|
|
7
|
+
const BUILT_IN_EVENT_TYPES = Object.freeze([
|
|
8
|
+
"ComplianceBlocked",
|
|
9
|
+
"StateTransitioned",
|
|
10
|
+
"AdapterInvocationStarted",
|
|
11
|
+
"AdapterInvocationSucceeded",
|
|
12
|
+
"AdapterInvocationFailed",
|
|
13
|
+
"ExternalOperationAccepted",
|
|
14
|
+
"ExternalOperationCompleted",
|
|
15
|
+
"ExternalOperationFailed",
|
|
16
|
+
"ExternalOperationContradicted",
|
|
17
|
+
"WebhookReceived"
|
|
18
|
+
]);
|
|
19
|
+
function createEventContractRegistry(input = {}) {
|
|
20
|
+
const eventTypes = /* @__PURE__ */ new Set([...BUILT_IN_EVENT_TYPES, ...input.eventTypes ?? []]);
|
|
21
|
+
const subjectTypes = /* @__PURE__ */ new Set([...BUILT_IN_SUBJECT_TYPES, ...input.subjectTypes ?? []]);
|
|
22
|
+
return {
|
|
23
|
+
registerEventType(eventType) {
|
|
24
|
+
if (!eventType) throw new Error("Event type cannot be empty");
|
|
25
|
+
eventTypes.add(eventType);
|
|
26
|
+
},
|
|
27
|
+
registerSubjectType(subjectType) {
|
|
28
|
+
if (!subjectType) throw new Error("Subject type cannot be empty");
|
|
29
|
+
subjectTypes.add(subjectType);
|
|
30
|
+
},
|
|
31
|
+
hasEventType: (eventType) => eventTypes.has(eventType),
|
|
32
|
+
hasSubjectType: (subjectType) => subjectTypes.has(subjectType),
|
|
33
|
+
eventTypes: () => Array.from(eventTypes).sort(),
|
|
34
|
+
subjectTypes: () => Array.from(subjectTypes).sort()
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
export { createEventContractRegistry };
|
|
39
|
+
|
|
3
40
|
//# sourceMappingURL=index.js.map
|
package/dist/events/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../events/index.ts"],"sourcesContent":["export interface AssetEventEnvelope<TPayload = unknown> {\n\tid: string;\n\ttenantId: string;\n\tspaceId: string;\n\teventType: string;\n\teventSchemaVersion: number;\n\tsubjectType: string;\n\tsubjectId: string;\n\tactorId: string;\n\tactorType: string;\n\tactionInvocationId?: string;\n\tpayload: TPayload;\n\tsequence: number;\n\toccurredAt: Date;\n\trecordedAt: Date;\n\tcorrelationId: string;\n\tcausationId?: string;\n\tprovenance?: EventProvenance;\n\t/**\n\t * Mirrors the emitting action's declared consistency. Present only when the\n\t * action declares `provisional-until-reconciled`, so a consumer can tell a\n\t * settled fact from one still awaiting reconciliation without a lookup.\n\t * Additive and optional: tolerant consumers that ignore it stay correct.\n\t */\n\tconsistency?: \"authoritative-now\" | \"provisional-until-reconciled\";\n}\n\nexport interface EventProvenance {\n\tsource: \"ui\" | \"api\" | \"agent\" | \"worker\" | \"system\" | (string & {});\n\tauditAttributes?: Record<string, string>;\n}\n\nconst BUILT_IN_SUBJECT_TYPES = Object.freeze([\n\t\"ActionInvocation\",\n\t\"PolicyEvaluation\",\n\t\"AdapterInvocation\",\n]);\n\nconst BUILT_IN_EVENT_TYPES = Object.freeze([\n\t\"ComplianceBlocked\",\n\t\"StateTransitioned\",\n\t\"AdapterInvocationStarted\",\n\t\"AdapterInvocationSucceeded\",\n\t\"AdapterInvocationFailed\",\n\t\"ExternalOperationAccepted\",\n\t\"ExternalOperationCompleted\",\n\t\"ExternalOperationFailed\",\n\t\"ExternalOperationContradicted\",\n\t\"WebhookReceived\",\n]);\n\nexport type AssetEventSubjectType = string;\nexport type AssetEventType = string;\nexport type AssetEventActorType = \"natural_person\" | \"agent\" | \"adapter\" | \"system\" | \"service_account\" | \"external_system\" | \"integration\";\n\nexport interface EventContractRegistry {\n\tregisterEventType(eventType: string): void;\n\tregisterSubjectType(subjectType: string): void;\n\thasEventType(eventType: string): boolean;\n\thasSubjectType(subjectType: string): boolean;\n\teventTypes(): string[];\n\tsubjectTypes(): string[];\n}\n\nexport function createEventContractRegistry(input: { eventTypes?: readonly string[]; subjectTypes?: readonly string[] } = {}): EventContractRegistry {\n\tconst eventTypes = new Set([...BUILT_IN_EVENT_TYPES, ...(input.eventTypes ?? [])]);\n\tconst subjectTypes = new Set([...BUILT_IN_SUBJECT_TYPES, ...(input.subjectTypes ?? [])]);\n\treturn {\n\t\tregisterEventType(eventType) {\n\t\t\tif (!eventType) {\n\t\t\t\tthrow new Error(\"Event type cannot be empty\");\n\t\t\t}\n\t\t\teventTypes.add(eventType);\n\t\t},\n\t\tregisterSubjectType(subjectType) {\n\t\t\tif (!subjectType) throw new Error(\"Subject type cannot be empty\");\n\t\t\tsubjectTypes.add(subjectType);\n\t\t},\n\t\thasEventType: (eventType) => eventTypes.has(eventType),\n\t\thasSubjectType: (subjectType) => subjectTypes.has(subjectType),\n\t\teventTypes: () => Array.from(eventTypes).sort(),\n\t\tsubjectTypes: () => Array.from(subjectTypes).sort(),\n\t};\n}\n"],"mappings":";AAgCA,MAAM,yBAAyB,OAAO,OAAO;CAC5C;CACA;CACA;AACD,CAAC;AAED,MAAM,uBAAuB,OAAO,OAAO;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAeD,SAAgB,4BAA4B,QAA8E,CAAC,GAA0B;CACpJ,MAAM,6BAAa,IAAI,IAAI,CAAC,GAAG,sBAAsB,GAAI,MAAM,cAAc,CAAC,CAAE,CAAC;CACjF,MAAM,+BAAe,IAAI,IAAI,CAAC,GAAG,wBAAwB,GAAI,MAAM,gBAAgB,CAAC,CAAE,CAAC;CACvF,OAAO;EACN,kBAAkB,WAAW;GAC5B,IAAI,CAAC,WACJ,MAAM,IAAI,MAAM,4BAA4B;GAE7C,WAAW,IAAI,SAAS;EACzB;EACA,oBAAoB,aAAa;GAChC,IAAI,CAAC,aAAa,MAAM,IAAI,MAAM,8BAA8B;GAChE,aAAa,IAAI,WAAW;EAC7B;EACA,eAAe,cAAc,WAAW,IAAI,SAAS;EACrD,iBAAiB,gBAAgB,aAAa,IAAI,WAAW;EAC7D,kBAAkB,MAAM,KAAK,UAAU,CAAC,CAAC,KAAK;EAC9C,oBAAoB,MAAM,KAAK,YAAY,CAAC,CAAC,KAAK;CACnD;AACD"}
|
package/dist/evidence/index.cjs
CHANGED
|
@@ -1,50 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Object.defineProperty(exports, "DEFAULT_EVIDENCE_REDACTION_REASON", {
|
|
14
|
-
enumerable: true,
|
|
15
|
-
get: function () { return chunk6HY35TKB_cjs.DEFAULT_EVIDENCE_REDACTION_REASON; }
|
|
16
|
-
});
|
|
17
|
-
Object.defineProperty(exports, "EVIDENCE_PACKET_CHECKSUM_ALGORITHM", {
|
|
18
|
-
enumerable: true,
|
|
19
|
-
get: function () { return chunk6HY35TKB_cjs.EVIDENCE_PACKET_CHECKSUM_ALGORITHM; }
|
|
20
|
-
});
|
|
21
|
-
Object.defineProperty(exports, "EVIDENCE_PACKET_SCHEMA_VERSION", {
|
|
22
|
-
enumerable: true,
|
|
23
|
-
get: function () { return chunk6HY35TKB_cjs.EVIDENCE_PACKET_SCHEMA_VERSION; }
|
|
24
|
-
});
|
|
25
|
-
Object.defineProperty(exports, "EvidencePacketGenerationError", {
|
|
26
|
-
enumerable: true,
|
|
27
|
-
get: function () { return chunk6HY35TKB_cjs.EvidencePacketGenerationError; }
|
|
28
|
-
});
|
|
29
|
-
Object.defineProperty(exports, "canonicalJson", {
|
|
30
|
-
enumerable: true,
|
|
31
|
-
get: function () { return chunk6HY35TKB_cjs.canonicalJson; }
|
|
32
|
-
});
|
|
33
|
-
Object.defineProperty(exports, "computeEvidencePacketChecksum", {
|
|
34
|
-
enumerable: true,
|
|
35
|
-
get: function () { return chunk6HY35TKB_cjs.computeEvidencePacketChecksum; }
|
|
36
|
-
});
|
|
37
|
-
Object.defineProperty(exports, "createEvidencePacketRenderer", {
|
|
38
|
-
enumerable: true,
|
|
39
|
-
get: function () { return chunk6HY35TKB_cjs.createEvidencePacketRenderer; }
|
|
40
|
-
});
|
|
41
|
-
Object.defineProperty(exports, "generateEvidencePacket", {
|
|
42
|
-
enumerable: true,
|
|
43
|
-
get: function () { return chunk6HY35TKB_cjs.generateEvidencePacket; }
|
|
44
|
-
});
|
|
45
|
-
Object.defineProperty(exports, "verifyEvidencePacketChecksum", {
|
|
46
|
-
enumerable: true,
|
|
47
|
-
get: function () { return chunk6HY35TKB_cjs.verifyEvidencePacketChecksum; }
|
|
48
|
-
});
|
|
49
|
-
//# sourceMappingURL=index.cjs.map
|
|
50
|
-
//# sourceMappingURL=index.cjs.map
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_evidence = require("../evidence-Cq48eDvA.cjs");
|
|
3
|
+
exports.DEFAULT_EVIDENCE_PACKET_TYPE = require_evidence.DEFAULT_EVIDENCE_PACKET_TYPE;
|
|
4
|
+
exports.DEFAULT_EVIDENCE_REDACTION_REASON = require_evidence.DEFAULT_EVIDENCE_REDACTION_REASON;
|
|
5
|
+
exports.EVIDENCE_PACKET_CHECKSUM_ALGORITHM = require_evidence.EVIDENCE_PACKET_CHECKSUM_ALGORITHM;
|
|
6
|
+
exports.EVIDENCE_PACKET_SCHEMA_VERSION = require_evidence.EVIDENCE_PACKET_SCHEMA_VERSION;
|
|
7
|
+
exports.EvidencePacketGenerationError = require_evidence.EvidencePacketGenerationError;
|
|
8
|
+
exports.canonicalJson = require_evidence.canonicalJson;
|
|
9
|
+
exports.computeEvidencePacketChecksum = require_evidence.computeEvidencePacketChecksum;
|
|
10
|
+
exports.createEvidencePacketRenderer = require_evidence.createEvidencePacketRenderer;
|
|
11
|
+
exports.generateEvidencePacket = require_evidence.generateEvidencePacket;
|
|
12
|
+
exports.verifyEvidencePacketChecksum = require_evidence.verifyEvidencePacketChecksum;
|