@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.
@@ -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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"}