@mondaydotcomorg/atp-provenance 0.19.21 → 0.21.0
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/dist/checkpoint-integration.d.ts +97 -0
- package/dist/checkpoint-integration.d.ts.map +1 -0
- package/dist/checkpoint-integration.js +253 -0
- package/dist/checkpoint-integration.js.map +1 -0
- package/dist/index.cjs +291 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +285 -2
- package/dist/index.js.map +1 -1
- package/dist/registry.d.ts +19 -13
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +92 -73
- package/dist/registry.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkpoint Integration Module
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for integrating provenance tracking with checkpoint recovery.
|
|
5
|
+
* This ensures security policies are enforced even after checkpoint restoration.
|
|
6
|
+
*/
|
|
7
|
+
import type { ProvenanceMetadata } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Provenance entry with path information for nested object tracking
|
|
10
|
+
* Used to re-attach provenance to the correct nested object on restore
|
|
11
|
+
*/
|
|
12
|
+
export interface ProvenanceEntry {
|
|
13
|
+
/** JSON path to the value (e.g., "", "[0]", "[1].nested.field") */
|
|
14
|
+
path: string;
|
|
15
|
+
/** Provenance metadata for this value */
|
|
16
|
+
metadata: ProvenanceMetadata;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Provenance snapshot for checkpoint storage
|
|
20
|
+
* Supports both simple and complex provenance scenarios:
|
|
21
|
+
* - Simple: Single-source result (metadata field for convenience)
|
|
22
|
+
* - Complex: Aggregated results with multiple sources (entries array with paths)
|
|
23
|
+
*
|
|
24
|
+
* Example: Promise.all([getUser('alice'), getUser('bob')]) produces:
|
|
25
|
+
* - metadata: undefined (or root-level container provenance if exists)
|
|
26
|
+
* - entries: [
|
|
27
|
+
* { path: "[0]", metadata: { readers: ['alice'] } },
|
|
28
|
+
* { path: "[1]", metadata: { readers: ['bob'] } }
|
|
29
|
+
* ]
|
|
30
|
+
*/
|
|
31
|
+
export interface CheckpointProvenanceSnapshot {
|
|
32
|
+
/**
|
|
33
|
+
* Root-level provenance metadata for convenient access
|
|
34
|
+
* Populated when the result itself has provenance (path="")
|
|
35
|
+
* Also present in entries[] but duplicated here for ease of use
|
|
36
|
+
*/
|
|
37
|
+
metadata?: ProvenanceMetadata;
|
|
38
|
+
/**
|
|
39
|
+
* All provenance entries with explicit paths
|
|
40
|
+
* Includes root-level (path="") and all nested objects with provenance
|
|
41
|
+
* Used for path-based restoration of aggregated/nested results
|
|
42
|
+
*/
|
|
43
|
+
entries?: ProvenanceEntry[];
|
|
44
|
+
/** Primitive values with their provenance (for taint tracking) */
|
|
45
|
+
primitives?: Array<[string, ProvenanceMetadata]>;
|
|
46
|
+
/**
|
|
47
|
+
* Whether this checkpoint contains any restricted data
|
|
48
|
+
* Computed from all entries - if ANY entry has restricted readers, this is true
|
|
49
|
+
*/
|
|
50
|
+
hasRestrictedData?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Result of recursive provenance extraction
|
|
54
|
+
*/
|
|
55
|
+
interface RecursiveProvenanceResult {
|
|
56
|
+
entries: ProvenanceEntry[];
|
|
57
|
+
primitives: Array<[string, ProvenanceMetadata]>;
|
|
58
|
+
hasRestrictedData: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Function type for extracting provenance from a value
|
|
62
|
+
*/
|
|
63
|
+
export type ProvenanceExtractor = (value: unknown) => ProvenanceMetadata | null;
|
|
64
|
+
/**
|
|
65
|
+
* Function type for re-attaching provenance to a restored value
|
|
66
|
+
*/
|
|
67
|
+
export type ProvenanceAttacher = (value: unknown, metadata: ProvenanceMetadata, primitives?: Array<[string, ProvenanceMetadata]>) => unknown;
|
|
68
|
+
/**
|
|
69
|
+
* Recursively extract provenance from nested objects/arrays
|
|
70
|
+
* Handles: Promise.all results, loop aggregations, nested objects
|
|
71
|
+
*
|
|
72
|
+
* Example paths:
|
|
73
|
+
* - "" (root)
|
|
74
|
+
* - "[0]", "[1]" (array elements)
|
|
75
|
+
* - ".user", ".data.items[0]" (object properties)
|
|
76
|
+
*/
|
|
77
|
+
export declare function extractProvenanceRecursive(value: unknown, extractor: ProvenanceExtractor, path?: string, visited?: WeakSet<object>): RecursiveProvenanceResult;
|
|
78
|
+
/**
|
|
79
|
+
* Restore provenance to values using snapshot
|
|
80
|
+
* Handles both simple and complex restoration scenarios
|
|
81
|
+
*/
|
|
82
|
+
export declare function restoreProvenanceFromSnapshot(value: unknown, snapshot: CheckpointProvenanceSnapshot, attacher: ProvenanceAttacher): unknown;
|
|
83
|
+
/**
|
|
84
|
+
* Parse a path string into segments
|
|
85
|
+
* "[0].user.name" → ["0", "user", "name"]
|
|
86
|
+
*/
|
|
87
|
+
export declare function parsePath(path: string): string[];
|
|
88
|
+
/**
|
|
89
|
+
* Deep clone a value (simple JSON-based clone)
|
|
90
|
+
*/
|
|
91
|
+
export declare function deepClone<T>(value: T): T;
|
|
92
|
+
/**
|
|
93
|
+
* Check if a provenance snapshot has restricted data
|
|
94
|
+
*/
|
|
95
|
+
export declare function hasRestrictedProvenance(snapshot?: CheckpointProvenanceSnapshot): boolean;
|
|
96
|
+
export {};
|
|
97
|
+
//# sourceMappingURL=checkpoint-integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-integration.d.ts","sourceRoot":"","sources":["../src/checkpoint-integration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGrD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,QAAQ,EAAE,kBAAkB,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,4BAA4B;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAE9B;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAE5B,kEAAkE;IAClE,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEjD;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,UAAU,yBAAyB;IAClC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAChD,iBAAiB,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,kBAAkB,GAAG,IAAI,CAAC;AAEhF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAChC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,kBAAkB,EAC5B,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,KAC5C,OAAO,CAAC;AAEb;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACzC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,mBAAmB,EAC9B,IAAI,GAAE,MAAW,EACjB,OAAO,GAAE,OAAO,CAAC,MAAM,CAAiB,GACtC,yBAAyB,CA2E3B;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,4BAA4B,EACtC,QAAQ,EAAE,kBAAkB,GAC1B,OAAO,CAwBT;AA+ED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiChD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAaxC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,CAAC,EAAE,4BAA4B,GAAG,OAAO,CAkCxF"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkpoint Integration Module
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for integrating provenance tracking with checkpoint recovery.
|
|
5
|
+
* This ensures security policies are enforced even after checkpoint restoration.
|
|
6
|
+
*/
|
|
7
|
+
import { PROVENANCE_PROPERTY_NAMES } from './registry.js';
|
|
8
|
+
/**
|
|
9
|
+
* Recursively extract provenance from nested objects/arrays
|
|
10
|
+
* Handles: Promise.all results, loop aggregations, nested objects
|
|
11
|
+
*
|
|
12
|
+
* Example paths:
|
|
13
|
+
* - "" (root)
|
|
14
|
+
* - "[0]", "[1]" (array elements)
|
|
15
|
+
* - ".user", ".data.items[0]" (object properties)
|
|
16
|
+
*/
|
|
17
|
+
export function extractProvenanceRecursive(value, extractor, path = '', visited = new WeakSet()) {
|
|
18
|
+
const entries = [];
|
|
19
|
+
const primitives = [];
|
|
20
|
+
let hasRestrictedData = false;
|
|
21
|
+
if (value === null || value === undefined) {
|
|
22
|
+
return { entries, primitives, hasRestrictedData };
|
|
23
|
+
}
|
|
24
|
+
// Handle primitives
|
|
25
|
+
if (typeof value !== 'object') {
|
|
26
|
+
// Check if primitive has taint
|
|
27
|
+
const primMeta = extractor(value);
|
|
28
|
+
if (primMeta) {
|
|
29
|
+
primitives.push([`${path}:${String(value)}`, primMeta]);
|
|
30
|
+
if (primMeta.readers?.type === 'restricted') {
|
|
31
|
+
hasRestrictedData = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { entries, primitives, hasRestrictedData };
|
|
35
|
+
}
|
|
36
|
+
// Prevent circular references
|
|
37
|
+
if (visited.has(value)) {
|
|
38
|
+
return { entries, primitives, hasRestrictedData };
|
|
39
|
+
}
|
|
40
|
+
visited.add(value);
|
|
41
|
+
// Check if this value has provenance
|
|
42
|
+
const metadata = extractor(value);
|
|
43
|
+
if (metadata) {
|
|
44
|
+
entries.push({ path, metadata });
|
|
45
|
+
if (metadata.readers?.type === 'restricted') {
|
|
46
|
+
hasRestrictedData = true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Recursively process arrays
|
|
50
|
+
if (Array.isArray(value)) {
|
|
51
|
+
for (let i = 0; i < value.length; i++) {
|
|
52
|
+
const itemPath = `${path}[${i}]`;
|
|
53
|
+
const itemResult = extractProvenanceRecursive(value[i], extractor, itemPath, visited);
|
|
54
|
+
entries.push(...itemResult.entries);
|
|
55
|
+
primitives.push(...itemResult.primitives);
|
|
56
|
+
if (itemResult.hasRestrictedData) {
|
|
57
|
+
hasRestrictedData = true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// Recursively process object properties
|
|
63
|
+
for (const key of Object.keys(value)) {
|
|
64
|
+
// Skip provenance metadata properties
|
|
65
|
+
if (key === PROVENANCE_PROPERTY_NAMES.PROVENANCE_ID ||
|
|
66
|
+
key === PROVENANCE_PROPERTY_NAMES.PROVENANCE ||
|
|
67
|
+
key === PROVENANCE_PROPERTY_NAMES.PROVENANCE_META) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const propPath = path ? `${path}.${key}` : `.${key}`;
|
|
71
|
+
const propResult = extractProvenanceRecursive(value[key], extractor, propPath, visited);
|
|
72
|
+
entries.push(...propResult.entries);
|
|
73
|
+
primitives.push(...propResult.primitives);
|
|
74
|
+
if (propResult.hasRestrictedData) {
|
|
75
|
+
hasRestrictedData = true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return { entries, primitives, hasRestrictedData };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Restore provenance to values using snapshot
|
|
83
|
+
* Handles both simple and complex restoration scenarios
|
|
84
|
+
*/
|
|
85
|
+
export function restoreProvenanceFromSnapshot(value, snapshot, attacher) {
|
|
86
|
+
if (!attacher) {
|
|
87
|
+
return value;
|
|
88
|
+
}
|
|
89
|
+
// Re-register primitive taints
|
|
90
|
+
if (snapshot.primitives) {
|
|
91
|
+
for (const [key, primMeta] of snapshot.primitives) {
|
|
92
|
+
// The attacher should handle primitive registration
|
|
93
|
+
attacher(null, primMeta, [[key, primMeta]]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Prefer entries if available (handles nested/aggregated provenance)
|
|
97
|
+
if (snapshot.entries && snapshot.entries.length > 0) {
|
|
98
|
+
return restoreProvenanceByPath(value, snapshot.entries, attacher);
|
|
99
|
+
}
|
|
100
|
+
// Fallback to metadata for simple cases (single root-level provenance)
|
|
101
|
+
if (snapshot.metadata) {
|
|
102
|
+
return attacher(value, snapshot.metadata, snapshot.primitives);
|
|
103
|
+
}
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Restore provenance to values at specific paths
|
|
108
|
+
*
|
|
109
|
+
* Path examples:
|
|
110
|
+
* - "" → root value
|
|
111
|
+
* - "[0]" → array[0]
|
|
112
|
+
* - "[1].data" → array[1].data
|
|
113
|
+
* - ".user.name" → obj.user.name
|
|
114
|
+
*/
|
|
115
|
+
function restoreProvenanceByPath(value, entries, attacher) {
|
|
116
|
+
if (!entries || entries.length === 0) {
|
|
117
|
+
return value;
|
|
118
|
+
}
|
|
119
|
+
// Sort entries by path length (deepest first) to handle nested objects correctly
|
|
120
|
+
const sortedEntries = [...entries].sort((a, b) => b.path.length - a.path.length);
|
|
121
|
+
// Clone the value to avoid mutating the original
|
|
122
|
+
let result = deepClone(value);
|
|
123
|
+
// Apply provenance to each path
|
|
124
|
+
for (const entry of sortedEntries) {
|
|
125
|
+
if (entry.path === '') {
|
|
126
|
+
// Root level
|
|
127
|
+
result = attacher(result, entry.metadata, undefined);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// Navigate to the nested value and attach provenance
|
|
131
|
+
result = attachProvenanceAtPath(result, entry.path, entry.metadata, attacher);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Navigate to a path and attach provenance to the value there
|
|
138
|
+
*/
|
|
139
|
+
function attachProvenanceAtPath(root, path, metadata, attacher) {
|
|
140
|
+
// Parse path into segments
|
|
141
|
+
const segments = parsePath(path);
|
|
142
|
+
if (segments.length === 0) {
|
|
143
|
+
return attacher(root, metadata, undefined);
|
|
144
|
+
}
|
|
145
|
+
// Navigate to parent and get the target value
|
|
146
|
+
let current = root;
|
|
147
|
+
const parentSegments = segments.slice(0, -1);
|
|
148
|
+
const lastSegment = segments[segments.length - 1];
|
|
149
|
+
for (const segment of parentSegments) {
|
|
150
|
+
if (current === null || current === undefined) {
|
|
151
|
+
return root; // Path doesn't exist
|
|
152
|
+
}
|
|
153
|
+
current = current[segment];
|
|
154
|
+
}
|
|
155
|
+
if (current === null || current === undefined || lastSegment === undefined) {
|
|
156
|
+
return root; // Path doesn't exist
|
|
157
|
+
}
|
|
158
|
+
// Attach provenance to the value at this path
|
|
159
|
+
const targetValue = current[lastSegment];
|
|
160
|
+
const wrappedValue = attacher(targetValue, metadata, undefined);
|
|
161
|
+
current[lastSegment] = wrappedValue;
|
|
162
|
+
return root;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Parse a path string into segments
|
|
166
|
+
* "[0].user.name" → ["0", "user", "name"]
|
|
167
|
+
*/
|
|
168
|
+
export function parsePath(path) {
|
|
169
|
+
const segments = [];
|
|
170
|
+
let current = '';
|
|
171
|
+
let inBracket = false;
|
|
172
|
+
for (const char of path) {
|
|
173
|
+
if (char === '[') {
|
|
174
|
+
if (current) {
|
|
175
|
+
segments.push(current);
|
|
176
|
+
current = '';
|
|
177
|
+
}
|
|
178
|
+
inBracket = true;
|
|
179
|
+
}
|
|
180
|
+
else if (char === ']') {
|
|
181
|
+
if (current) {
|
|
182
|
+
segments.push(current);
|
|
183
|
+
current = '';
|
|
184
|
+
}
|
|
185
|
+
inBracket = false;
|
|
186
|
+
}
|
|
187
|
+
else if (char === '.' && !inBracket) {
|
|
188
|
+
if (current) {
|
|
189
|
+
segments.push(current);
|
|
190
|
+
current = '';
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
current += char;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (current) {
|
|
198
|
+
segments.push(current);
|
|
199
|
+
}
|
|
200
|
+
return segments;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Deep clone a value (simple JSON-based clone)
|
|
204
|
+
*/
|
|
205
|
+
export function deepClone(value) {
|
|
206
|
+
if (value === null || value === undefined) {
|
|
207
|
+
return value;
|
|
208
|
+
}
|
|
209
|
+
if (typeof value !== 'object') {
|
|
210
|
+
return value;
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
return JSON.parse(JSON.stringify(value));
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// Fallback for non-serializable values
|
|
217
|
+
return value;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Check if a provenance snapshot has restricted data
|
|
222
|
+
*/
|
|
223
|
+
export function hasRestrictedProvenance(snapshot) {
|
|
224
|
+
if (!snapshot) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
// Fast path: check pre-computed flag
|
|
228
|
+
if (snapshot.hasRestrictedData) {
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
// Check top-level metadata (backwards compatibility)
|
|
232
|
+
if (snapshot.metadata?.readers?.type === 'restricted') {
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
// Check all entries for nested restricted data
|
|
236
|
+
if (snapshot.entries) {
|
|
237
|
+
for (const entry of snapshot.entries) {
|
|
238
|
+
if (entry.metadata?.readers?.type === 'restricted') {
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Check primitive provenance
|
|
244
|
+
if (snapshot.primitives) {
|
|
245
|
+
for (const [, primMeta] of snapshot.primitives) {
|
|
246
|
+
if (primMeta.readers?.type === 'restricted') {
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=checkpoint-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-integration.js","sourceRoot":"","sources":["../src/checkpoint-integration.ts"],"names":[],"mappings":"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"}
|