@wundr.io/langgraph-orchestrator 1.0.3
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/README.md +842 -0
- package/dist/checkpointing.d.ts +265 -0
- package/dist/checkpointing.d.ts.map +1 -0
- package/dist/checkpointing.js +577 -0
- package/dist/checkpointing.js.map +1 -0
- package/dist/edges/conditional-edge.d.ts +230 -0
- package/dist/edges/conditional-edge.d.ts.map +1 -0
- package/dist/edges/conditional-edge.js +439 -0
- package/dist/edges/conditional-edge.js.map +1 -0
- package/dist/edges/loop-edge.d.ts +290 -0
- package/dist/edges/loop-edge.d.ts.map +1 -0
- package/dist/edges/loop-edge.js +503 -0
- package/dist/edges/loop-edge.js.map +1 -0
- package/dist/index.d.ts +125 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +269 -0
- package/dist/index.js.map +1 -0
- package/dist/nodes/decision-node.d.ts +276 -0
- package/dist/nodes/decision-node.d.ts.map +1 -0
- package/dist/nodes/decision-node.js +403 -0
- package/dist/nodes/decision-node.js.map +1 -0
- package/dist/nodes/human-node.d.ts +272 -0
- package/dist/nodes/human-node.d.ts.map +1 -0
- package/dist/nodes/human-node.js +394 -0
- package/dist/nodes/human-node.js.map +1 -0
- package/dist/nodes/llm-node.d.ts +173 -0
- package/dist/nodes/llm-node.d.ts.map +1 -0
- package/dist/nodes/llm-node.js +325 -0
- package/dist/nodes/llm-node.js.map +1 -0
- package/dist/nodes/tool-node.d.ts +151 -0
- package/dist/nodes/tool-node.d.ts.map +1 -0
- package/dist/nodes/tool-node.js +373 -0
- package/dist/nodes/tool-node.js.map +1 -0
- package/dist/prebuilt-graphs/plan-execute-refine.d.ts +149 -0
- package/dist/prebuilt-graphs/plan-execute-refine.d.ts.map +1 -0
- package/dist/prebuilt-graphs/plan-execute-refine.js +600 -0
- package/dist/prebuilt-graphs/plan-execute-refine.js.map +1 -0
- package/dist/state-graph.d.ts +158 -0
- package/dist/state-graph.d.ts.map +1 -0
- package/dist/state-graph.js +756 -0
- package/dist/state-graph.js.map +1 -0
- package/dist/types.d.ts +762 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +73 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
- package/src/checkpointing.ts +702 -0
- package/src/edges/conditional-edge.ts +518 -0
- package/src/edges/loop-edge.ts +623 -0
- package/src/index.ts +416 -0
- package/src/nodes/decision-node.ts +538 -0
- package/src/nodes/human-node.ts +572 -0
- package/src/nodes/llm-node.ts +448 -0
- package/src/nodes/tool-node.ts +525 -0
- package/src/prebuilt-graphs/plan-execute-refine.ts +769 -0
- package/src/state-graph.ts +990 -0
- package/src/types.ts +729 -0
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Checkpointing - State persistence and time-travel debugging
|
|
4
|
+
* @module @wundr.io/langgraph-orchestrator
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.CheckpointSchema = exports.TimeTravelDebugger = exports.FileCheckpointer = exports.MemoryCheckpointer = void 0;
|
|
41
|
+
exports.createCheckpoint = createCheckpoint;
|
|
42
|
+
exports.applyRetentionPolicy = applyRetentionPolicy;
|
|
43
|
+
exports.validateCheckpoint = validateCheckpoint;
|
|
44
|
+
const uuid_1 = require("uuid");
|
|
45
|
+
const zod_1 = require("zod");
|
|
46
|
+
/**
|
|
47
|
+
* In-memory checkpointer implementation
|
|
48
|
+
* Useful for development and testing
|
|
49
|
+
*/
|
|
50
|
+
class MemoryCheckpointer {
|
|
51
|
+
checkpoints = new Map();
|
|
52
|
+
executionIndex = new Map();
|
|
53
|
+
/**
|
|
54
|
+
* Save a checkpoint
|
|
55
|
+
*/
|
|
56
|
+
async save(checkpoint) {
|
|
57
|
+
this.checkpoints.set(checkpoint.id, checkpoint);
|
|
58
|
+
// Update execution index
|
|
59
|
+
const executionCheckpoints = this.executionIndex.get(checkpoint.executionId) ?? [];
|
|
60
|
+
executionCheckpoints.push(checkpoint.id);
|
|
61
|
+
this.executionIndex.set(checkpoint.executionId, executionCheckpoints);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Load a checkpoint by ID
|
|
65
|
+
*/
|
|
66
|
+
async load(checkpointId) {
|
|
67
|
+
return this.checkpoints.get(checkpointId) ?? null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* List checkpoints for an execution
|
|
71
|
+
*/
|
|
72
|
+
async list(executionId) {
|
|
73
|
+
const checkpointIds = this.executionIndex.get(executionId) ?? [];
|
|
74
|
+
return checkpointIds
|
|
75
|
+
.map(id => {
|
|
76
|
+
const cp = this.checkpoints.get(id);
|
|
77
|
+
if (!cp) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
id: cp.id,
|
|
82
|
+
executionId: cp.executionId,
|
|
83
|
+
stepNumber: cp.stepNumber,
|
|
84
|
+
nodeName: cp.nodeName,
|
|
85
|
+
timestamp: cp.timestamp,
|
|
86
|
+
};
|
|
87
|
+
})
|
|
88
|
+
.filter((cp) => cp !== null)
|
|
89
|
+
.sort((a, b) => a.stepNumber - b.stepNumber);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Delete a checkpoint
|
|
93
|
+
*/
|
|
94
|
+
async delete(checkpointId) {
|
|
95
|
+
const checkpoint = this.checkpoints.get(checkpointId);
|
|
96
|
+
if (checkpoint) {
|
|
97
|
+
this.checkpoints.delete(checkpointId);
|
|
98
|
+
// Update execution index
|
|
99
|
+
const executionCheckpoints = this.executionIndex.get(checkpoint.executionId) ?? [];
|
|
100
|
+
const index = executionCheckpoints.indexOf(checkpointId);
|
|
101
|
+
if (index > -1) {
|
|
102
|
+
executionCheckpoints.splice(index, 1);
|
|
103
|
+
this.executionIndex.set(checkpoint.executionId, executionCheckpoints);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get the latest checkpoint for an execution
|
|
109
|
+
*/
|
|
110
|
+
async getLatest(executionId) {
|
|
111
|
+
const checkpointIds = this.executionIndex.get(executionId) ?? [];
|
|
112
|
+
if (checkpointIds.length === 0) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
// Get the most recent checkpoint
|
|
116
|
+
let latest = null;
|
|
117
|
+
for (const id of checkpointIds) {
|
|
118
|
+
const cp = this.checkpoints.get(id);
|
|
119
|
+
if (cp && (!latest || cp.stepNumber > latest.stepNumber)) {
|
|
120
|
+
latest = cp;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return latest;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Clear all checkpoints
|
|
127
|
+
*/
|
|
128
|
+
clear() {
|
|
129
|
+
this.checkpoints.clear();
|
|
130
|
+
this.executionIndex.clear();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get statistics about stored checkpoints
|
|
134
|
+
*/
|
|
135
|
+
getStats() {
|
|
136
|
+
return {
|
|
137
|
+
totalCheckpoints: this.checkpoints.size,
|
|
138
|
+
totalExecutions: this.executionIndex.size,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.MemoryCheckpointer = MemoryCheckpointer;
|
|
143
|
+
/**
|
|
144
|
+
* File-based checkpointer implementation
|
|
145
|
+
* Persists checkpoints to the filesystem
|
|
146
|
+
*/
|
|
147
|
+
class FileCheckpointer {
|
|
148
|
+
basePath;
|
|
149
|
+
fs;
|
|
150
|
+
/**
|
|
151
|
+
* Create a file-based checkpointer
|
|
152
|
+
* @param basePath - Directory to store checkpoints
|
|
153
|
+
* @param fs - FileSystem interface (allows for mocking)
|
|
154
|
+
*/
|
|
155
|
+
constructor(basePath, fs) {
|
|
156
|
+
this.basePath = basePath;
|
|
157
|
+
this.fs = fs ?? createNodeFileSystem();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Save a checkpoint
|
|
161
|
+
*/
|
|
162
|
+
async save(checkpoint) {
|
|
163
|
+
const executionDir = `${this.basePath}/${checkpoint.executionId}`;
|
|
164
|
+
await this.fs.mkdir(executionDir, { recursive: true });
|
|
165
|
+
const filePath = `${executionDir}/${checkpoint.id}.json`;
|
|
166
|
+
await this.fs.writeFile(filePath, JSON.stringify(checkpoint, null, 2));
|
|
167
|
+
// Update index
|
|
168
|
+
const indexPath = `${executionDir}/index.json`;
|
|
169
|
+
const index = await this.loadIndex(indexPath);
|
|
170
|
+
index.push({
|
|
171
|
+
id: checkpoint.id,
|
|
172
|
+
stepNumber: checkpoint.stepNumber,
|
|
173
|
+
nodeName: checkpoint.nodeName,
|
|
174
|
+
timestamp: checkpoint.timestamp.toISOString(),
|
|
175
|
+
});
|
|
176
|
+
await this.fs.writeFile(indexPath, JSON.stringify(index, null, 2));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Load a checkpoint by ID
|
|
180
|
+
*/
|
|
181
|
+
async load(checkpointId) {
|
|
182
|
+
// Search all execution directories
|
|
183
|
+
const executions = await this.fs.readdir(this.basePath).catch(() => []);
|
|
184
|
+
for (const executionId of executions) {
|
|
185
|
+
const filePath = `${this.basePath}/${executionId}/${checkpointId}.json`;
|
|
186
|
+
try {
|
|
187
|
+
const content = await this.fs.readFile(filePath, 'utf-8');
|
|
188
|
+
const data = JSON.parse(content);
|
|
189
|
+
return {
|
|
190
|
+
...data,
|
|
191
|
+
timestamp: new Date(data.timestamp),
|
|
192
|
+
state: {
|
|
193
|
+
...data.state,
|
|
194
|
+
createdAt: new Date(data.state.createdAt),
|
|
195
|
+
updatedAt: new Date(data.state.updatedAt),
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// Continue searching
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* List checkpoints for an execution
|
|
207
|
+
*/
|
|
208
|
+
async list(executionId) {
|
|
209
|
+
const indexPath = `${this.basePath}/${executionId}/index.json`;
|
|
210
|
+
const index = await this.loadIndex(indexPath);
|
|
211
|
+
return index.map(item => ({
|
|
212
|
+
id: item.id,
|
|
213
|
+
executionId,
|
|
214
|
+
stepNumber: item.stepNumber,
|
|
215
|
+
nodeName: item.nodeName,
|
|
216
|
+
timestamp: new Date(item.timestamp),
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Delete a checkpoint
|
|
221
|
+
*/
|
|
222
|
+
async delete(checkpointId) {
|
|
223
|
+
const checkpoint = await this.load(checkpointId);
|
|
224
|
+
if (!checkpoint) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const filePath = `${this.basePath}/${checkpoint.executionId}/${checkpointId}.json`;
|
|
228
|
+
await this.fs.unlink(filePath).catch(() => { });
|
|
229
|
+
// Update index
|
|
230
|
+
const indexPath = `${this.basePath}/${checkpoint.executionId}/index.json`;
|
|
231
|
+
const index = await this.loadIndex(indexPath);
|
|
232
|
+
const filtered = index.filter(item => item.id !== checkpointId);
|
|
233
|
+
await this.fs.writeFile(indexPath, JSON.stringify(filtered, null, 2));
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get the latest checkpoint for an execution
|
|
237
|
+
*/
|
|
238
|
+
async getLatest(executionId) {
|
|
239
|
+
const summaries = await this.list(executionId);
|
|
240
|
+
if (summaries.length === 0) {
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
const latest = summaries.reduce((a, b) => a.stepNumber > b.stepNumber ? a : b);
|
|
244
|
+
return this.load(latest.id);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Load index file
|
|
248
|
+
*/
|
|
249
|
+
async loadIndex(path) {
|
|
250
|
+
try {
|
|
251
|
+
const content = await this.fs.readFile(path, 'utf-8');
|
|
252
|
+
return JSON.parse(content);
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
return [];
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.FileCheckpointer = FileCheckpointer;
|
|
260
|
+
/**
|
|
261
|
+
* Create a Node.js filesystem implementation
|
|
262
|
+
*/
|
|
263
|
+
function createNodeFileSystem() {
|
|
264
|
+
// Lazy import to avoid issues in browser environments
|
|
265
|
+
return {
|
|
266
|
+
async readFile(path, encoding) {
|
|
267
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs'))).then(m => m.promises);
|
|
268
|
+
return fs.readFile(path, encoding);
|
|
269
|
+
},
|
|
270
|
+
async writeFile(path, data) {
|
|
271
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs'))).then(m => m.promises);
|
|
272
|
+
await fs.writeFile(path, data);
|
|
273
|
+
},
|
|
274
|
+
async mkdir(path, options) {
|
|
275
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs'))).then(m => m.promises);
|
|
276
|
+
await fs.mkdir(path, options);
|
|
277
|
+
},
|
|
278
|
+
async readdir(path) {
|
|
279
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs'))).then(m => m.promises);
|
|
280
|
+
return fs.readdir(path);
|
|
281
|
+
},
|
|
282
|
+
async unlink(path) {
|
|
283
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs'))).then(m => m.promises);
|
|
284
|
+
await fs.unlink(path);
|
|
285
|
+
},
|
|
286
|
+
async exists(path) {
|
|
287
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs'))).then(m => m.promises);
|
|
288
|
+
try {
|
|
289
|
+
await fs.access(path);
|
|
290
|
+
return true;
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Time-travel debugger for workflow state
|
|
300
|
+
*/
|
|
301
|
+
class TimeTravelDebugger {
|
|
302
|
+
checkpointer;
|
|
303
|
+
/**
|
|
304
|
+
* Create a time-travel debugger
|
|
305
|
+
* @param checkpointer - Checkpointer to use for state access
|
|
306
|
+
*/
|
|
307
|
+
constructor(checkpointer) {
|
|
308
|
+
this.checkpointer = checkpointer;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Get the execution timeline
|
|
312
|
+
* @param executionId - Execution to get timeline for
|
|
313
|
+
* @returns Array of checkpoint summaries
|
|
314
|
+
*/
|
|
315
|
+
async getTimeline(executionId) {
|
|
316
|
+
return this.checkpointer.list(executionId);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Travel to a specific checkpoint
|
|
320
|
+
* @param checkpointId - Checkpoint to travel to
|
|
321
|
+
* @returns The state at that checkpoint
|
|
322
|
+
*/
|
|
323
|
+
async travelTo(checkpointId) {
|
|
324
|
+
const checkpoint = await this.checkpointer.load(checkpointId);
|
|
325
|
+
return checkpoint?.state ?? null;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Get state at a specific step number
|
|
329
|
+
* @param executionId - Execution ID
|
|
330
|
+
* @param stepNumber - Step number to travel to
|
|
331
|
+
* @returns The state at that step
|
|
332
|
+
*/
|
|
333
|
+
async travelToStep(executionId, stepNumber) {
|
|
334
|
+
const summaries = await this.checkpointer.list(executionId);
|
|
335
|
+
const summary = summaries.find(s => s.stepNumber === stepNumber);
|
|
336
|
+
if (!summary) {
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
return this.travelTo(summary.id);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Compare two checkpoints
|
|
343
|
+
* @param checkpointId1 - First checkpoint
|
|
344
|
+
* @param checkpointId2 - Second checkpoint
|
|
345
|
+
* @returns Differences between the checkpoints
|
|
346
|
+
*/
|
|
347
|
+
async compare(checkpointId1, checkpointId2) {
|
|
348
|
+
const [cp1, cp2] = await Promise.all([
|
|
349
|
+
this.checkpointer.load(checkpointId1),
|
|
350
|
+
this.checkpointer.load(checkpointId2),
|
|
351
|
+
]);
|
|
352
|
+
if (!cp1 || !cp2) {
|
|
353
|
+
throw new Error('One or both checkpoints not found');
|
|
354
|
+
}
|
|
355
|
+
return this.diffStates(cp1.state, cp2.state);
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Get the state history (changes over time)
|
|
359
|
+
* @param executionId - Execution ID
|
|
360
|
+
* @returns Array of state changes
|
|
361
|
+
*/
|
|
362
|
+
async getStateHistory(executionId) {
|
|
363
|
+
const summaries = await this.checkpointer.list(executionId);
|
|
364
|
+
const history = [];
|
|
365
|
+
let previousState = null;
|
|
366
|
+
for (const summary of summaries) {
|
|
367
|
+
const checkpoint = await this.checkpointer.load(summary.id);
|
|
368
|
+
if (!checkpoint) {
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
const changes = previousState
|
|
372
|
+
? this.diffStates(previousState, checkpoint.state)
|
|
373
|
+
: [];
|
|
374
|
+
history.push({
|
|
375
|
+
checkpoint: summary,
|
|
376
|
+
state: checkpoint.state,
|
|
377
|
+
changes,
|
|
378
|
+
});
|
|
379
|
+
previousState = checkpoint.state;
|
|
380
|
+
}
|
|
381
|
+
return history;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Find checkpoints where a condition became true
|
|
385
|
+
* @param executionId - Execution ID
|
|
386
|
+
* @param condition - Condition to check
|
|
387
|
+
* @returns Checkpoints where condition became true
|
|
388
|
+
*/
|
|
389
|
+
async findTransitions(executionId, condition) {
|
|
390
|
+
const summaries = await this.checkpointer.list(executionId);
|
|
391
|
+
const transitions = [];
|
|
392
|
+
let previousResult = false;
|
|
393
|
+
for (const summary of summaries) {
|
|
394
|
+
const checkpoint = await this.checkpointer.load(summary.id);
|
|
395
|
+
if (!checkpoint) {
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
const currentResult = condition(checkpoint.state);
|
|
399
|
+
if (currentResult && !previousResult) {
|
|
400
|
+
transitions.push(summary);
|
|
401
|
+
}
|
|
402
|
+
previousResult = currentResult;
|
|
403
|
+
}
|
|
404
|
+
return transitions;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Compute differences between two states
|
|
408
|
+
*/
|
|
409
|
+
diffStates(state1, state2) {
|
|
410
|
+
const diffs = [];
|
|
411
|
+
// Compare data fields
|
|
412
|
+
const allKeys = new Set([
|
|
413
|
+
...Object.keys(state1.data),
|
|
414
|
+
...Object.keys(state2.data),
|
|
415
|
+
]);
|
|
416
|
+
for (const key of allKeys) {
|
|
417
|
+
const val1 = state1.data[key];
|
|
418
|
+
const val2 = state2.data[key];
|
|
419
|
+
if (JSON.stringify(val1) !== JSON.stringify(val2)) {
|
|
420
|
+
diffs.push({
|
|
421
|
+
path: `data.${key}`,
|
|
422
|
+
type: val1 === undefined
|
|
423
|
+
? 'added'
|
|
424
|
+
: val2 === undefined
|
|
425
|
+
? 'removed'
|
|
426
|
+
: 'changed',
|
|
427
|
+
oldValue: val1,
|
|
428
|
+
newValue: val2,
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
// Compare message counts
|
|
433
|
+
if (state1.messages.length !== state2.messages.length) {
|
|
434
|
+
diffs.push({
|
|
435
|
+
path: 'messages.length',
|
|
436
|
+
type: 'changed',
|
|
437
|
+
oldValue: state1.messages.length,
|
|
438
|
+
newValue: state2.messages.length,
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
// Compare current step
|
|
442
|
+
if (state1.currentStep !== state2.currentStep) {
|
|
443
|
+
diffs.push({
|
|
444
|
+
path: 'currentStep',
|
|
445
|
+
type: 'changed',
|
|
446
|
+
oldValue: state1.currentStep,
|
|
447
|
+
newValue: state2.currentStep,
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
return diffs;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
exports.TimeTravelDebugger = TimeTravelDebugger;
|
|
454
|
+
/**
|
|
455
|
+
* Create a checkpoint
|
|
456
|
+
*
|
|
457
|
+
* @example
|
|
458
|
+
* ```typescript
|
|
459
|
+
* const checkpoint = createCheckpoint({
|
|
460
|
+
* executionId: 'exec-123',
|
|
461
|
+
* stepNumber: 5,
|
|
462
|
+
* nodeName: 'process-node',
|
|
463
|
+
* state: currentState
|
|
464
|
+
* });
|
|
465
|
+
*
|
|
466
|
+
* await checkpointer.save(checkpoint);
|
|
467
|
+
* ```
|
|
468
|
+
*
|
|
469
|
+
* @param options - Checkpoint options
|
|
470
|
+
* @returns Checkpoint object
|
|
471
|
+
*/
|
|
472
|
+
function createCheckpoint(options) {
|
|
473
|
+
return {
|
|
474
|
+
id: (0, uuid_1.v4)(),
|
|
475
|
+
executionId: options.executionId,
|
|
476
|
+
stepNumber: options.stepNumber,
|
|
477
|
+
nodeName: options.nodeName,
|
|
478
|
+
state: options.state,
|
|
479
|
+
timestamp: new Date(),
|
|
480
|
+
parentId: options.parentId,
|
|
481
|
+
metadata: options.metadata,
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Apply retention policy to checkpoints
|
|
486
|
+
*
|
|
487
|
+
* @example
|
|
488
|
+
* ```typescript
|
|
489
|
+
* await applyRetentionPolicy(checkpointer, 'exec-123', {
|
|
490
|
+
* maxCheckpointsPerExecution: 100,
|
|
491
|
+
* maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days
|
|
492
|
+
* keepEveryN: 10,
|
|
493
|
+
* alwaysKeepNodes: ['decision', 'error-handler']
|
|
494
|
+
* });
|
|
495
|
+
* ```
|
|
496
|
+
*
|
|
497
|
+
* @param checkpointer - Checkpointer to clean up
|
|
498
|
+
* @param executionId - Execution to apply policy to
|
|
499
|
+
* @param policy - Retention policy
|
|
500
|
+
* @returns Number of checkpoints deleted
|
|
501
|
+
*/
|
|
502
|
+
async function applyRetentionPolicy(checkpointer, executionId, policy) {
|
|
503
|
+
const summaries = await checkpointer.list(executionId);
|
|
504
|
+
let deleted = 0;
|
|
505
|
+
const toDelete = [];
|
|
506
|
+
const now = Date.now();
|
|
507
|
+
for (let i = 0; i < summaries.length; i++) {
|
|
508
|
+
const summary = summaries[i];
|
|
509
|
+
if (!summary) {
|
|
510
|
+
continue;
|
|
511
|
+
}
|
|
512
|
+
// Check if node is in always-keep list
|
|
513
|
+
if (policy.alwaysKeepNodes?.includes(summary.nodeName)) {
|
|
514
|
+
continue;
|
|
515
|
+
}
|
|
516
|
+
// Check age
|
|
517
|
+
if (policy.maxAge) {
|
|
518
|
+
const age = now - summary.timestamp.getTime();
|
|
519
|
+
if (age > policy.maxAge) {
|
|
520
|
+
toDelete.push(summary.id);
|
|
521
|
+
continue;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
// Check keepEveryN
|
|
525
|
+
if (policy.keepEveryN && (i + 1) % policy.keepEveryN !== 0) {
|
|
526
|
+
// Don't delete the latest few checkpoints
|
|
527
|
+
if (i < summaries.length - 5) {
|
|
528
|
+
toDelete.push(summary.id);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
// Apply maxCheckpointsPerExecution
|
|
533
|
+
if (policy.maxCheckpointsPerExecution) {
|
|
534
|
+
const remaining = summaries.filter(s => !toDelete.includes(s.id));
|
|
535
|
+
if (remaining.length > policy.maxCheckpointsPerExecution) {
|
|
536
|
+
const excess = remaining.length - policy.maxCheckpointsPerExecution;
|
|
537
|
+
// Delete oldest checkpoints first (but not those in toDelete already)
|
|
538
|
+
for (let i = 0; i < excess && i < remaining.length; i++) {
|
|
539
|
+
const item = remaining[i];
|
|
540
|
+
if (item && !toDelete.includes(item.id)) {
|
|
541
|
+
toDelete.push(item.id);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
// Delete marked checkpoints
|
|
547
|
+
for (const id of toDelete) {
|
|
548
|
+
await checkpointer.delete(id);
|
|
549
|
+
deleted++;
|
|
550
|
+
}
|
|
551
|
+
return deleted;
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* Schema for checkpoint validation
|
|
555
|
+
*/
|
|
556
|
+
exports.CheckpointSchema = zod_1.z.object({
|
|
557
|
+
id: zod_1.z.string().uuid(),
|
|
558
|
+
executionId: zod_1.z.string(),
|
|
559
|
+
stepNumber: zod_1.z.number().int().min(0),
|
|
560
|
+
nodeName: zod_1.z.string(),
|
|
561
|
+
timestamp: zod_1.z.date(),
|
|
562
|
+
parentId: zod_1.z.string().uuid().optional(),
|
|
563
|
+
metadata: zod_1.z.record(zod_1.z.unknown()).optional(),
|
|
564
|
+
});
|
|
565
|
+
/**
|
|
566
|
+
* Validate a checkpoint
|
|
567
|
+
*/
|
|
568
|
+
function validateCheckpoint(checkpoint) {
|
|
569
|
+
try {
|
|
570
|
+
exports.CheckpointSchema.parse(checkpoint);
|
|
571
|
+
return true;
|
|
572
|
+
}
|
|
573
|
+
catch {
|
|
574
|
+
return false;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
//# sourceMappingURL=checkpointing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpointing.js","sourceRoot":"","sources":["../src/checkpointing.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2iBH,4CAoBC;AAkCD,oDA8DC;AAkBD,gDASC;AAxrBD,+BAAoC;AACpC,6BAAwB;AASxB;;;GAGG;AACH,MAAa,kBAAkB;IACrB,WAAW,GAA4B,IAAI,GAAG,EAAE,CAAC;IACjD,cAAc,GAA0B,IAAI,GAAG,EAAE,CAAC;IAE1D;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,UAAsB;QAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEhD,yBAAyB;QACzB,MAAM,oBAAoB,GACxB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACxD,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,YAAoB;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB;QAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACjE,OAAO,aAAa;aACjB,GAAG,CAAC,EAAE,CAAC,EAAE;YACR,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,EAAE,CAAC,EAAE;gBACT,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,UAAU,EAAE,EAAE,CAAC,UAAU;gBACzB,QAAQ,EAAE,EAAE,CAAC,QAAQ;gBACrB,SAAS,EAAE,EAAE,CAAC,SAAS;aACxB,CAAC;QACJ,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,EAAE,EAA2B,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;aACpD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,YAAoB;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAEtC,yBAAyB;YACzB,MAAM,oBAAoB,GACxB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACzD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACf,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,WAAmB;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACjE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iCAAiC;QACjC,IAAI,MAAM,GAAsB,IAAI,CAAC;QACrC,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzD,MAAM,GAAG,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO;YACL,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;YACvC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI;SAC1C,CAAC;IACJ,CAAC;CACF;AAxGD,gDAwGC;AAED;;;GAGG;AACH,MAAa,gBAAgB;IACV,QAAQ,CAAS;IACjB,EAAE,CAAa;IAEhC;;;;OAIG;IACH,YAAY,QAAgB,EAAE,EAAe;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,oBAAoB,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,UAAsB;QAC/B,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;QAClE,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,MAAM,QAAQ,GAAG,GAAG,YAAY,IAAI,UAAU,CAAC,EAAE,OAAO,CAAC;QACzD,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvE,eAAe;QACf,MAAM,SAAS,GAAG,GAAG,YAAY,aAAa,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE;SAC9C,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,YAAoB;QAC7B,mCAAmC;QACnC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAExE,KAAK,MAAM,WAAW,IAAI,UAAU,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,IAAI,YAAY,OAAO,CAAC;YACxE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,OAAO;oBACL,GAAG,IAAI;oBACP,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;oBACnC,KAAK,EAAE;wBACL,GAAG,IAAI,CAAC,KAAK;wBACb,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;wBACzC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;qBAC1C;iBACF,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB;QAC5B,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,aAAa,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE9C,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,WAAW;YACX,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;SACpC,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,YAAoB;QAC/B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,WAAW,IAAI,YAAY,OAAO,CAAC;QACnF,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE/C,eAAe;QACf,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,WAAW,aAAa,CAAC;QAC1E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,CAAC;QAChE,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,WAAmB;QACjC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACpC,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS,CAAC,IAAY;QAQlC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF;AAtID,4CAsIC;AAcD;;GAEG;AACH,SAAS,oBAAoB;IAC3B,sDAAsD;IACtD,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,QAAgB;YAC3C,MAAM,EAAE,GAAG,MAAM,kDAAO,IAAI,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACpD,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAA0B,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,IAAY;YACxC,MAAM,EAAE,GAAG,MAAM,kDAAO,IAAI,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,KAAK,CACT,IAAY,EACZ,OAAiC;YAEjC,MAAM,EAAE,GAAG,MAAM,kDAAO,IAAI,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,IAAY;YACxB,MAAM,EAAE,GAAG,MAAM,kDAAO,IAAI,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACpD,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,IAAY;YACvB,MAAM,EAAE,GAAG,MAAM,kDAAO,IAAI,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,IAAY;YACvB,MAAM,EAAE,GAAG,MAAM,kDAAO,IAAI,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAa,kBAAkB;IACZ,YAAY,CAAoB;IAEjD;;;OAGG;IACH,YAAY,YAA+B;QACzC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,WAAmB;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,YAAoB;QACjC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9D,OAAQ,UAAU,EAAE,KAAgB,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAChB,WAAmB,EACnB,UAAkB;QAElB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CACX,aAAqB,EACrB,aAAqB;QAErB,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;YACrC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CACnB,WAAmB;QAEnB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,MAAM,OAAO,GAA+B,EAAE,CAAC;QAE/C,IAAI,aAAa,GAAsB,IAAI,CAAC;QAE5C,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YAED,MAAM,OAAO,GAAG,aAAa;gBAC3B,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,KAAK,CAAC;gBAClD,CAAC,CAAC,EAAE,CAAC;YAEP,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,OAAO;gBACnB,KAAK,EAAE,UAAU,CAAC,KAAe;gBACjC,OAAO;aACR,CAAC,CAAC;YAEH,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;QACnC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CACnB,WAAmB,EACnB,SAAqC;QAErC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAwB,EAAE,CAAC;QAE5C,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YAED,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,KAAe,CAAC,CAAC;YAE5D,IAAI,aAAa,IAAI,CAAC,cAAc,EAAE,CAAC;gBACrC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;YAED,cAAc,GAAG,aAAa,CAAC;QACjC,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,MAAkB,EAAE,MAAkB;QACvD,MAAM,KAAK,GAAgB,EAAE,CAAC;QAE9B,sBAAsB;QACtB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;YACtB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAC3B,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;SAC5B,CAAC,CAAC;QAEH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE9B,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,QAAQ,GAAG,EAAE;oBACnB,IAAI,EACF,IAAI,KAAK,SAAS;wBAChB,CAAC,CAAC,OAAO;wBACT,CAAC,CAAC,IAAI,KAAK,SAAS;4BAClB,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,SAAS;oBACjB,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;gBAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;aACjC,CAAC,CAAC;QACL,CAAC;QAED,uBAAuB;QACvB,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,MAAM,CAAC,WAAW;gBAC5B,QAAQ,EAAE,MAAM,CAAC,WAAW;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA/LD,gDA+LC;AA4BD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,gBAAgB,CAE9B,OAOD;IACC,OAAO;QACL,EAAE,EAAE,IAAA,SAAM,GAAE;QACZ,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAgBD;;;;;;;;;;;;;;;;;GAiBG;AACI,KAAK,UAAU,oBAAoB,CACxC,YAA+B,EAC/B,WAAmB,EACnB,MAAuB;IAEvB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvD,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,uCAAuC;QACvC,IAAI,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,SAAS;QACX,CAAC;QAED,YAAY;QACZ,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAC9C,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC1B,SAAS;YACX,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC3D,0CAA0C;YAC1C,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,IAAI,MAAM,CAAC,0BAA0B,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,IAAI,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,0BAA0B,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,0BAA0B,CAAC;YACpE,sEAAsE;YACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBACxC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACU,QAAA,gBAAgB,GAAG,OAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACrB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;IACvB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,SAAS,EAAE,OAAC,CAAC,IAAI,EAAE;IACnB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACtC,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC;AAEH;;GAEG;AACH,SAAgB,kBAAkB,CAChC,UAAmB;IAEnB,IAAI,CAAC;QACH,wBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|