@osolmaz/pi-workflows 0.1.0 → 0.2.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.
Files changed (62) hide show
  1. package/README.md +36 -21
  2. package/dist/extension/executor.d.ts +14 -1
  3. package/dist/extension/executor.js +11 -1
  4. package/dist/extension/executor.js.map +1 -1
  5. package/dist/extension/index.js +79 -7
  6. package/dist/extension/index.js.map +1 -1
  7. package/dist/extension/recorder.d.ts +85 -0
  8. package/dist/extension/recorder.js +525 -0
  9. package/dist/extension/recorder.js.map +1 -0
  10. package/dist/extension/session-events.d.ts +134 -0
  11. package/dist/extension/session-events.js +60 -0
  12. package/dist/extension/session-events.js.map +1 -0
  13. package/dist/extension/widget.js +25 -24
  14. package/dist/extension/widget.js.map +1 -1
  15. package/dist/render/canvas.d.ts +1 -1
  16. package/dist/render/canvas.js +5 -0
  17. package/dist/render/canvas.js.map +1 -1
  18. package/dist/render/graph-render.d.ts +5 -0
  19. package/dist/render/graph-render.js +211 -48
  20. package/dist/render/graph-render.js.map +1 -1
  21. package/dist/viewer/render.js +19 -3
  22. package/dist/viewer/render.js.map +1 -1
  23. package/dist/viewer/session-reducer.d.ts +45 -0
  24. package/dist/viewer/session-reducer.js +266 -0
  25. package/dist/viewer/session-reducer.js.map +1 -0
  26. package/dist/workflows/artifacts.d.ts +40 -0
  27. package/dist/workflows/artifacts.js +155 -0
  28. package/dist/workflows/artifacts.js.map +1 -0
  29. package/dist/workflows/engine.d.ts +2 -0
  30. package/dist/workflows/engine.js +38 -7
  31. package/dist/workflows/engine.js.map +1 -1
  32. package/dist/workflows/index.d.ts +3 -2
  33. package/dist/workflows/index.js +2 -1
  34. package/dist/workflows/index.js.map +1 -1
  35. package/dist/workflows/store.d.ts +53 -9
  36. package/dist/workflows/store.js +523 -43
  37. package/dist/workflows/store.js.map +1 -1
  38. package/dist/workflows/types.d.ts +126 -3
  39. package/docs/development.md +43 -19
  40. package/docs/live-replay-protocol.md +155 -0
  41. package/docs/plans/piw-viewer-experience-implementation-plan.md +674 -0
  42. package/docs/plans/replayable-run-bundles-implementation-plan.md +65 -0
  43. package/docs/plans/session-event-replay-implementation-plan.md +494 -0
  44. package/docs/plans/tui-viewer-implementation-plan.md +64 -0
  45. package/docs/run-bundles.md +320 -55
  46. package/docs/session-event-journal.md +470 -0
  47. package/docs/tui-viewer.md +218 -0
  48. package/package.json +2 -1
  49. package/src/extension/executor.ts +28 -1
  50. package/src/extension/index.ts +87 -7
  51. package/src/extension/recorder.ts +633 -0
  52. package/src/extension/session-events.ts +119 -0
  53. package/src/extension/widget.ts +26 -24
  54. package/src/render/canvas.ts +19 -1
  55. package/src/render/graph-render.ts +277 -44
  56. package/src/viewer/render.ts +21 -3
  57. package/src/viewer/session-reducer.ts +347 -0
  58. package/src/workflows/artifacts.ts +188 -0
  59. package/src/workflows/engine.ts +39 -7
  60. package/src/workflows/index.ts +15 -0
  61. package/src/workflows/store.ts +649 -49
  62. package/src/workflows/types.ts +141 -3
@@ -0,0 +1,525 @@
1
+ import { SESSION_BINDING_SCHEMA, SESSION_CAPTURE_SCHEMA, SESSION_EVENT_MAX_BYTES, SESSION_EVENT_SCHEMA, } from "../workflows/store.js";
2
+ import { messageRole, normalizeAssistantEvent, toolCallIdFromAssistantEvent, toolFinishedPayload, toolStartedPayload, turnFinishedPayload, } from "./session-events.js";
3
+ const FLUSH_INTERVAL_MS = 25;
4
+ const FINISH_TURN_TIMEOUT_MS = 30_000;
5
+ const FLUSH_MAX_RECORDS = 256;
6
+ const FLUSH_MAX_BYTES = 256 * 1024;
7
+ const QUEUE_MAX_RECORDS = 8_192;
8
+ const QUEUE_MAX_BYTES = 16 * 1024 * 1024;
9
+ function objectKey(value) {
10
+ return typeof value === "object" && value !== null ? value : null;
11
+ }
12
+ function stableMessageKey(value) {
13
+ if (typeof value !== "object" || value === null) {
14
+ return null;
15
+ }
16
+ const message = value;
17
+ if (typeof message.id === "string" && message.id.length > 0) {
18
+ return `id:${message.id}`;
19
+ }
20
+ if ((typeof message.timestamp === "number" || typeof message.timestamp === "string") &&
21
+ typeof message.role === "string") {
22
+ return `timestamp:${message.role}:${message.timestamp}`;
23
+ }
24
+ return null;
25
+ }
26
+ function entryRole(entry) {
27
+ const message = entry.message;
28
+ return messageRole(message);
29
+ }
30
+ function failureMessage(error) {
31
+ return error instanceof Error ? error.message : String(error);
32
+ }
33
+ /**
34
+ * Records both settled Pi entries and normalized temporal events into one run
35
+ * bundle. The hot event path only stamps and queues records; filesystem work
36
+ * runs on a separate ordered append chain.
37
+ */
38
+ export class SessionRecorder {
39
+ store;
40
+ runDir;
41
+ runId;
42
+ cursor = null;
43
+ recorded = [];
44
+ unclaimedEntries = [];
45
+ bound = false;
46
+ acceptingEntries = true;
47
+ acceptingEvents = true;
48
+ entryChain = Promise.resolve();
49
+ stopPromise = null;
50
+ nextEventSeq = 1;
51
+ nextTurnId = 1;
52
+ nextMessageId = 1;
53
+ currentAttempt = null;
54
+ currentTurn = null;
55
+ currentMessage = null;
56
+ lastFinishedAttempt = null;
57
+ finishPromise = null;
58
+ resolveFinish = null;
59
+ finishTimer = null;
60
+ messageOwners = new WeakMap();
61
+ stableMessageOwners = new Map();
62
+ toolOwners = new Map();
63
+ turnToolCallIds = new Map();
64
+ eventQueue = [];
65
+ pendingMessageEnds = [];
66
+ outstandingRecords = 0;
67
+ outstandingBytes = 0;
68
+ flushTimer = null;
69
+ flushPromise = null;
70
+ captureFailure = null;
71
+ constructor(store, runDir, runId) {
72
+ this.store = store;
73
+ this.runDir = runDir;
74
+ this.runId = runId;
75
+ }
76
+ async bind(ctx) {
77
+ if (this.bound) {
78
+ return;
79
+ }
80
+ this.bound = true;
81
+ this.cursor = ctx.sessionManager.getLeafId();
82
+ const sessionFile = ctx.sessionManager.getSessionFile();
83
+ await this.store.writeSessionBinding(this.runDir, {
84
+ schema: SESSION_BINDING_SCHEMA,
85
+ runId: this.runId,
86
+ piSessionId: ctx.sessionManager.getSessionId(),
87
+ ...(sessionFile !== undefined ? { piSessionFile: sessionFile } : {}),
88
+ cwd: ctx.cwd,
89
+ boundAt: new Date().toISOString(),
90
+ });
91
+ await this.store.writeSessionCapture(this.runDir, {
92
+ schema: SESSION_CAPTURE_SCHEMA,
93
+ eventSchema: SESSION_EVENT_SCHEMA,
94
+ status: "recording",
95
+ eventCount: 0,
96
+ entryCount: 0,
97
+ lastEventSeq: 0,
98
+ });
99
+ }
100
+ /** Fix the owner before the executor delivers an agent-step prompt. */
101
+ beginAttempt(contract) {
102
+ this.currentAttempt = { nodeId: contract.nodeId, attemptId: contract.attemptId };
103
+ }
104
+ /** Release ownership of the turn that Pi has fully settled. */
105
+ settleAttempt() {
106
+ const finished = this.lastFinishedAttempt;
107
+ this.lastFinishedAttempt = null;
108
+ if (this.currentTurn === null &&
109
+ (finished === null ||
110
+ (this.currentAttempt?.nodeId === finished.nodeId &&
111
+ this.currentAttempt.attemptId === finished.attemptId))) {
112
+ this.currentAttempt = null;
113
+ }
114
+ }
115
+ handleTurnStart(event) {
116
+ const owner = this.currentAttempt;
117
+ if (!owner) {
118
+ return;
119
+ }
120
+ const turn = {
121
+ ...owner,
122
+ turnId: `t${this.nextTurnId}`,
123
+ turnIndex: event.turnIndex,
124
+ };
125
+ this.nextTurnId += 1;
126
+ this.currentTurn = turn;
127
+ this.turnToolCallIds.set(turn.turnId, []);
128
+ this.enqueue(turn, "turn_started", { turnIndex: event.turnIndex });
129
+ }
130
+ async handleTurnEnd(event, ctx) {
131
+ const turn = this.currentTurn;
132
+ if (!turn) {
133
+ return;
134
+ }
135
+ const message = this.ownerForMessage(event.message);
136
+ try {
137
+ await this.synchronize(ctx);
138
+ this.enqueue(turn, "turn_finished", turnFinishedPayload(event, message?.messageId, this.turnToolCallIds.get(turn.turnId) ?? []));
139
+ }
140
+ catch (error) {
141
+ this.failCapture("entry_write_failed", failureMessage(error));
142
+ }
143
+ this.currentTurn = null;
144
+ this.currentMessage = null;
145
+ this.lastFinishedAttempt = { nodeId: turn.nodeId, attemptId: turn.attemptId };
146
+ if (this.finishPromise) {
147
+ await this.stop();
148
+ }
149
+ }
150
+ async handleMessageStart(event, ctx) {
151
+ const turn = this.currentTurn;
152
+ if (!turn) {
153
+ return;
154
+ }
155
+ await this.synchronize(ctx);
156
+ const owner = {
157
+ ...turn,
158
+ messageId: `m${this.nextMessageId}`,
159
+ role: messageRole(event.message),
160
+ };
161
+ this.nextMessageId += 1;
162
+ const key = objectKey(event.message);
163
+ if (key) {
164
+ this.messageOwners.set(key, owner);
165
+ }
166
+ const stableKey = stableMessageKey(event.message);
167
+ if (stableKey) {
168
+ this.stableMessageOwners.set(stableKey, owner);
169
+ }
170
+ this.currentMessage = owner;
171
+ this.enqueue(owner, "message_started", { role: owner.role });
172
+ }
173
+ handleMessageUpdate(event) {
174
+ const owner = this.ownerForMessage(event.message);
175
+ if (!owner) {
176
+ return;
177
+ }
178
+ const normalized = normalizeAssistantEvent(event.assistantMessageEvent);
179
+ const toolCallId = toolCallIdFromAssistantEvent(normalized);
180
+ if (toolCallId) {
181
+ this.toolOwners.set(toolCallId, owner);
182
+ const ids = this.turnToolCallIds.get(owner.turnId) ?? [];
183
+ if (!ids.includes(toolCallId)) {
184
+ ids.push(toolCallId);
185
+ this.turnToolCallIds.set(owner.turnId, ids);
186
+ }
187
+ }
188
+ this.enqueue(owner, "assistant_event", normalized);
189
+ }
190
+ handleMessageEnd(event) {
191
+ const owner = this.ownerForMessage(event.message);
192
+ if (!owner) {
193
+ return;
194
+ }
195
+ // Pi appends the final session entry after message_end handlers return.
196
+ // Keep this record and every later event queued until a documented hook
197
+ // with synchronized session state can attach the exact entry id.
198
+ this.clearFlushTimer();
199
+ const queued = this.enqueue(owner, "message_finished", { role: owner.role, settled: false }, undefined, {}, true);
200
+ if (queued) {
201
+ this.pendingMessageEnds.push({ queued, role: owner.role, message: event.message });
202
+ this.clearFlushTimer();
203
+ }
204
+ if (this.currentMessage?.messageId === owner.messageId) {
205
+ this.currentMessage = null;
206
+ }
207
+ }
208
+ handleToolStart(event) {
209
+ const owner = this.toolOwners.get(event.toolCallId) ?? this.currentMessage;
210
+ if (!owner) {
211
+ return;
212
+ }
213
+ this.toolOwners.set(event.toolCallId, owner);
214
+ this.enqueue(owner, "tool_execution_started", toolStartedPayload(event), undefined, {
215
+ toolCallId: event.toolCallId,
216
+ });
217
+ }
218
+ handleToolUpdate(event) {
219
+ const owner = this.toolOwners.get(event.toolCallId);
220
+ if (!owner) {
221
+ return;
222
+ }
223
+ this.enqueue(owner, "tool_execution_updated", {}, undefined, {
224
+ toolCallId: event.toolCallId,
225
+ });
226
+ }
227
+ handleToolEnd(event) {
228
+ const owner = this.toolOwners.get(event.toolCallId);
229
+ if (!owner) {
230
+ return;
231
+ }
232
+ this.enqueue(owner, "tool_execution_finished", toolFinishedPayload(event), undefined, {
233
+ toolCallId: event.toolCallId,
234
+ });
235
+ }
236
+ /** Flush new entries on the current branch into the bundle. */
237
+ record(ctx) {
238
+ if (!this.bound || !this.acceptingEntries) {
239
+ return Promise.resolve([]);
240
+ }
241
+ const task = this.entryChain.then(async () => {
242
+ const branch = ctx.sessionManager.getBranch();
243
+ let startIndex = 0;
244
+ if (this.cursor !== null) {
245
+ const cursorIndex = branch.findIndex((entry) => entry.id === this.cursor);
246
+ if (cursorIndex === -1) {
247
+ this.cursor = branch.at(-1)?.id ?? this.cursor;
248
+ return [];
249
+ }
250
+ startIndex = cursorIndex + 1;
251
+ }
252
+ const appended = [];
253
+ for (const entry of branch.slice(startIndex)) {
254
+ await this.store.appendSessionEntry(this.runDir, entry);
255
+ const recorded = { id: entry.id, entry, claimed: false };
256
+ appended.push(recorded);
257
+ this.unclaimedEntries.push(recorded);
258
+ this.recorded.push(entry.id);
259
+ this.cursor = entry.id;
260
+ }
261
+ return appended;
262
+ });
263
+ this.entryChain = task.catch((error) => {
264
+ this.failCapture("entry_write_failed", failureMessage(error));
265
+ });
266
+ return task;
267
+ }
268
+ /** Record durable entries, then release deferred message-end events in order. */
269
+ async synchronize(ctx) {
270
+ if (this.pendingMessageEnds.length === 0) {
271
+ return;
272
+ }
273
+ await this.record(ctx);
274
+ for (const pending of this.pendingMessageEnds.splice(0)) {
275
+ const entryId = this.claimEntry(pending.role, pending.message);
276
+ pending.queued.record.payload = entryId
277
+ ? { role: pending.role, settled: true, entryId }
278
+ : { role: pending.role, settled: false };
279
+ const bytes = Buffer.byteLength(JSON.stringify(pending.queued.record), "utf8") + 1;
280
+ this.outstandingBytes += bytes - pending.queued.bytes;
281
+ pending.queued.bytes = bytes;
282
+ }
283
+ if (this.eventQueue.length >= FLUSH_MAX_RECORDS || this.queuedBytes() >= FLUSH_MAX_BYTES) {
284
+ this.startFlush();
285
+ }
286
+ else {
287
+ this.scheduleFlush();
288
+ }
289
+ }
290
+ /**
291
+ * Finalize immediately when no Pi turn is active. Otherwise wait for
292
+ * `turn_end`, which is the last documented lifecycle boundary needed to
293
+ * include the workflow tool result and any following assistant output.
294
+ */
295
+ async finish() {
296
+ if (this.stopPromise || this.currentTurn === null) {
297
+ return await this.stop();
298
+ }
299
+ if (!this.finishPromise) {
300
+ this.finishPromise = new Promise((resolve) => {
301
+ this.resolveFinish = resolve;
302
+ });
303
+ this.finishTimer = setTimeout(() => {
304
+ this.failCapture("turn_settle_timeout", `active Pi turn did not finish within ${FINISH_TURN_TIMEOUT_MS}ms`);
305
+ void this.stop();
306
+ }, FINISH_TURN_TIMEOUT_MS);
307
+ this.finishTimer.unref?.();
308
+ }
309
+ return await this.finishPromise;
310
+ }
311
+ async stop() {
312
+ if (this.stopPromise) {
313
+ return await this.stopPromise;
314
+ }
315
+ if (this.currentTurn !== null) {
316
+ this.failCapture("turn_interrupted", "session capture stopped before the active Pi turn finished");
317
+ }
318
+ this.acceptingEntries = false;
319
+ this.acceptingEvents = false;
320
+ // If Pi closes before another synchronized hook, preserve the message-end
321
+ // receipts as explicitly unsettled rather than hanging finalization.
322
+ this.pendingMessageEnds.splice(0);
323
+ this.clearFlushTimer();
324
+ this.stopPromise = (async () => {
325
+ try {
326
+ await this.flushAllEvents();
327
+ await this.entryChain;
328
+ const counts = await this.store.sessionCounts(this.runDir);
329
+ await this.store.writeSessionCapture(this.runDir, {
330
+ schema: SESSION_CAPTURE_SCHEMA,
331
+ eventSchema: SESSION_EVENT_SCHEMA,
332
+ status: this.captureFailure ? "failed" : "complete",
333
+ ...counts,
334
+ ...(this.captureFailure ? { failure: this.captureFailure } : {}),
335
+ });
336
+ }
337
+ catch (error) {
338
+ // Capture is observational. A finalization failure must never reject
339
+ // the workflow's terminal persistence hook.
340
+ this.failCapture("capture_finalize_failed", failureMessage(error));
341
+ try {
342
+ const counts = await this.store.sessionCounts(this.runDir);
343
+ await this.store.writeSessionCapture(this.runDir, {
344
+ schema: SESSION_CAPTURE_SCHEMA,
345
+ eventSchema: SESSION_EVENT_SCHEMA,
346
+ status: "failed",
347
+ ...counts,
348
+ failure: this.captureFailure ?? {
349
+ failedAt: new Date().toISOString(),
350
+ code: "capture_finalize_failed",
351
+ message: failureMessage(error),
352
+ },
353
+ });
354
+ }
355
+ catch {
356
+ // The viewer will report the missing/invalid capture file.
357
+ }
358
+ }
359
+ finally {
360
+ if (this.finishTimer) {
361
+ clearTimeout(this.finishTimer);
362
+ this.finishTimer = null;
363
+ }
364
+ this.resolveFinish?.();
365
+ this.resolveFinish = null;
366
+ }
367
+ })();
368
+ return await this.stopPromise;
369
+ }
370
+ mark() {
371
+ return this.recorded.length;
372
+ }
373
+ rangeSince(mark) {
374
+ if (this.recorded.length <= mark) {
375
+ return undefined;
376
+ }
377
+ return {
378
+ firstEntryId: this.recorded[mark],
379
+ lastEntryId: this.recorded.at(-1),
380
+ };
381
+ }
382
+ ownerForMessage(message) {
383
+ const key = objectKey(message);
384
+ const stableKey = stableMessageKey(message);
385
+ return ((key ? this.messageOwners.get(key) : undefined) ??
386
+ (stableKey ? this.stableMessageOwners.get(stableKey) : undefined) ??
387
+ this.currentMessage);
388
+ }
389
+ claimEntry(role, message) {
390
+ const messageKey = stableMessageKey(message);
391
+ const entry = this.unclaimedEntries.find((candidate) => {
392
+ if (candidate.claimed || entryRole(candidate.entry) !== role) {
393
+ return false;
394
+ }
395
+ return messageKey === null || stableMessageKey(candidate.entry.message) === messageKey;
396
+ });
397
+ if (!entry) {
398
+ return undefined;
399
+ }
400
+ entry.claimed = true;
401
+ return entry.id;
402
+ }
403
+ enqueue(owner, type, payload, at = new Date().toISOString(), extra = {}, deferFlush = false) {
404
+ if (!this.bound || !this.acceptingEvents || this.captureFailure) {
405
+ return null;
406
+ }
407
+ const messageId = "messageId" in owner ? owner.messageId : undefined;
408
+ const record = {
409
+ seq: this.nextEventSeq,
410
+ at,
411
+ nodeId: owner.nodeId,
412
+ attemptId: owner.attemptId,
413
+ turnId: owner.turnId,
414
+ ...(messageId === undefined ? {} : { messageId }),
415
+ ...(extra.toolCallId === undefined ? {} : { toolCallId: extra.toolCallId }),
416
+ type,
417
+ payload,
418
+ };
419
+ const bytes = Buffer.byteLength(JSON.stringify(record), "utf8") + 1;
420
+ const externalizable = type === "tool_execution_started" ||
421
+ type === "tool_execution_finished" ||
422
+ (type === "assistant_event" && payload.type === "toolcall_end");
423
+ if (bytes > SESSION_EVENT_MAX_BYTES && !externalizable) {
424
+ this.failCapture("event_too_large", `session event exceeded ${SESSION_EVENT_MAX_BYTES} bytes`);
425
+ return null;
426
+ }
427
+ if (this.outstandingRecords + 1 > QUEUE_MAX_RECORDS ||
428
+ this.outstandingBytes + bytes > QUEUE_MAX_BYTES) {
429
+ this.failCapture("event_queue_overflow", "session event queue limit exceeded");
430
+ return null;
431
+ }
432
+ this.nextEventSeq += 1;
433
+ const queued = { record, bytes };
434
+ this.eventQueue.push(queued);
435
+ this.outstandingRecords += 1;
436
+ this.outstandingBytes += bytes;
437
+ if (!deferFlush) {
438
+ if (this.eventQueue.length >= FLUSH_MAX_RECORDS || this.queuedBytes() >= FLUSH_MAX_BYTES) {
439
+ this.startFlush();
440
+ }
441
+ else {
442
+ this.scheduleFlush();
443
+ }
444
+ }
445
+ return queued;
446
+ }
447
+ queuedBytes() {
448
+ return this.eventQueue.reduce((sum, queued) => sum + queued.bytes, 0);
449
+ }
450
+ scheduleFlush() {
451
+ if (this.pendingMessageEnds.length > 0 || this.flushTimer || this.flushPromise) {
452
+ return;
453
+ }
454
+ this.flushTimer = setTimeout(() => {
455
+ this.flushTimer = null;
456
+ this.startFlush();
457
+ }, FLUSH_INTERVAL_MS);
458
+ this.flushTimer.unref?.();
459
+ }
460
+ startFlush() {
461
+ if (this.pendingMessageEnds.length > 0 || this.flushPromise || this.eventQueue.length === 0) {
462
+ return;
463
+ }
464
+ this.clearFlushTimer();
465
+ const batch = [];
466
+ let bytes = 0;
467
+ while (this.eventQueue.length > 0 && batch.length < FLUSH_MAX_RECORDS) {
468
+ const next = this.eventQueue[0];
469
+ if (batch.length > 0 && bytes + next.bytes > FLUSH_MAX_BYTES) {
470
+ break;
471
+ }
472
+ batch.push(this.eventQueue.shift());
473
+ bytes += next.bytes;
474
+ }
475
+ this.flushPromise = this.store
476
+ .appendSessionEventBatch(this.runDir, batch.map((queued) => queued.record))
477
+ .catch((error) => {
478
+ const message = failureMessage(error);
479
+ this.failCapture(message.includes(`exceeded ${SESSION_EVENT_MAX_BYTES} bytes`)
480
+ ? "event_too_large"
481
+ : "event_write_failed", message);
482
+ for (const queued of this.eventQueue.splice(0)) {
483
+ this.outstandingRecords -= 1;
484
+ this.outstandingBytes -= queued.bytes;
485
+ }
486
+ })
487
+ .finally(() => {
488
+ for (const queued of batch) {
489
+ this.outstandingRecords -= 1;
490
+ this.outstandingBytes -= queued.bytes;
491
+ }
492
+ this.flushPromise = null;
493
+ if (this.eventQueue.length > 0 && this.captureFailure?.code !== "event_write_failed") {
494
+ this.startFlush();
495
+ }
496
+ });
497
+ }
498
+ async flushAllEvents() {
499
+ this.clearFlushTimer();
500
+ while (this.eventQueue.length > 0 || this.flushPromise) {
501
+ if (!this.flushPromise) {
502
+ this.startFlush();
503
+ }
504
+ await this.flushPromise;
505
+ }
506
+ }
507
+ clearFlushTimer() {
508
+ if (this.flushTimer) {
509
+ clearTimeout(this.flushTimer);
510
+ this.flushTimer = null;
511
+ }
512
+ }
513
+ failCapture(code, message) {
514
+ if (this.captureFailure) {
515
+ return;
516
+ }
517
+ this.captureFailure = {
518
+ failedAt: new Date().toISOString(),
519
+ code,
520
+ message,
521
+ };
522
+ this.acceptingEvents = false;
523
+ }
524
+ }
525
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../src/extension/recorder.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,GAErB,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,4BAA4B,EAC5B,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GASpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,sBAAsB,GAAG,MAAM,CAAC;AACtC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC;AACnC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AASzC,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,KAA8D,CAAC;IAC/E,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,OAAO,MAAM,OAAO,CAAC,EAAE,EAAE,CAAC;IAC5B,CAAC;IACD,IACE,CAAC,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC;QAChF,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAChC,CAAC;QACD,OAAO,aAAa,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAA8B;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,eAAe;IACT,KAAK,CAAmB;IACxB,MAAM,CAAS;IACf,KAAK,CAAS;IACvB,MAAM,GAAkB,IAAI,CAAC;IACpB,QAAQ,GAAa,EAAE,CAAC;IACxB,gBAAgB,GAAoB,EAAE,CAAC;IAChD,KAAK,GAAG,KAAK,CAAC;IACd,gBAAgB,GAAG,IAAI,CAAC;IACxB,eAAe,GAAG,IAAI,CAAC;IACvB,UAAU,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IACjD,WAAW,GAAyB,IAAI,CAAC;IAEzC,YAAY,GAAG,CAAC,CAAC;IACjB,UAAU,GAAG,CAAC,CAAC;IACf,aAAa,GAAG,CAAC,CAAC;IAClB,cAAc,GAAwB,IAAI,CAAC;IAC3C,WAAW,GAAqB,IAAI,CAAC;IACrC,cAAc,GAAwB,IAAI,CAAC;IAC3C,mBAAmB,GAAwB,IAAI,CAAC;IAChD,aAAa,GAAyB,IAAI,CAAC;IAC3C,aAAa,GAAwB,IAAI,CAAC;IAC1C,WAAW,GAA0B,IAAI,CAAC;IACjC,aAAa,GAAG,IAAI,OAAO,EAAwB,CAAC;IACpD,mBAAmB,GAAG,IAAI,GAAG,EAAwB,CAAC;IACtD,UAAU,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC7C,eAAe,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEvD,UAAU,GAAkB,EAAE,CAAC;IACtB,kBAAkB,GAAwB,EAAE,CAAC;IACtD,kBAAkB,GAAG,CAAC,CAAC;IACvB,gBAAgB,GAAG,CAAC,CAAC;IACrB,UAAU,GAA0B,IAAI,CAAC;IACzC,YAAY,GAAyB,IAAI,CAAC;IAC1C,cAAc,GAAyC,IAAI,CAAC;IAEpE,YAAY,KAAuB,EAAE,MAAc,EAAE,KAAa;QAChE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAqB;QAC9B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,GAAG,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QACxD,MAAM,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE;YAChD,MAAM,EAAE,sBAAsB;YAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE;YAC9C,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAClC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE;YAChD,MAAM,EAAE,sBAAsB;YAC9B,WAAW,EAAE,oBAAoB;YACjC,MAAM,EAAE,WAAW;YACnB,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,CAAC;SAChB,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,YAAY,CAAC,QAA2B;QACtC,IAAI,CAAC,cAAc,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;IACnF,CAAC;IAED,+DAA+D;IAC/D,aAAa;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAC1C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IACE,IAAI,CAAC,WAAW,KAAK,IAAI;YACzB,CAAC,QAAQ,KAAK,IAAI;gBAChB,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,KAAK,QAAQ,CAAC,MAAM;oBAC9C,IAAI,CAAC,cAAc,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,EAC1D,CAAC;YACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,eAAe,CAAC,KAAyB;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAc;YACtB,GAAG,KAAK;YACR,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;YAC7B,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;QACF,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAuB,EAAE,GAAqB;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CACV,IAAI,EACJ,eAAe,EACf,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAC5F,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,mBAAmB,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9E,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,KAA4B,EAAE,GAAqB;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAiB;YAC1B,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;YACnC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;SACjC,CAAC;QACF,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;QACxB,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,mBAAmB,CAAC,KAA6B;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,4BAA4B,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACzD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAgD,CAAC,CAAC;IAC3F,CAAC;IAED,gBAAgB,CAAC,KAA0B;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,wEAAwE;QACxE,wEAAwE;QACxE,iEAAiE;QACjE,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CACzB,KAAK,EACL,kBAAkB,EAClB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EACpC,SAAS,EACT,EAAE,EACF,IAAI,CACL,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACnF,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,eAAe,CAAC,KAAkC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC;QAC3E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE;YAClF,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,KAAmC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,wBAAwB,EAAE,EAAE,EAAE,SAAS,EAAE;YAC3D,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,KAAgC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,yBAAyB,EAAE,mBAAmB,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE;YACpF,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,MAAM,CAAC,GAAqB;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,SAAS,EAE1C,CAAC;YACF,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBACzB,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1E,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC;oBAC/C,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,UAAU,GAAG,WAAW,GAAG,CAAC,CAAC;YAC/B,CAAC;YACD,MAAM,QAAQ,GAAoB,EAAE,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBACzD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC7B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC;YACzB,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC9C,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,WAAW,CAAC,GAAqB;QACrC,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/D,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO;gBACrC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;gBAChD,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACnF,IAAI,CAAC,gBAAgB,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YACtD,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,iBAAiB,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,eAAe,EAAE,CAAC;YACzF,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACjD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC/B,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;gBACjC,IAAI,CAAC,WAAW,CACd,qBAAqB,EACrB,wCAAwC,sBAAsB,IAAI,CACnE,CAAC;gBACF,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,CAAC,EAAE,sBAAsB,CAAC,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC;QAChC,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,WAAW,CACd,kBAAkB,EAClB,4DAA4D,CAC7D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,0EAA0E;QAC1E,qEAAqE;QACrE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC5B,MAAM,IAAI,CAAC,UAAU,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3D,MAAM,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE;oBAChD,MAAM,EAAE,sBAAsB;oBAC9B,WAAW,EAAE,oBAAoB;oBACjC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;oBACnD,GAAG,MAAM;oBACT,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACjE,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,qEAAqE;gBACrE,4CAA4C;gBAC5C,IAAI,CAAC,WAAW,CAAC,yBAAyB,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnE,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC3D,MAAM,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE;wBAChD,MAAM,EAAE,sBAAsB;wBAC9B,WAAW,EAAE,oBAAoB;wBACjC,MAAM,EAAE,QAAQ;wBAChB,GAAG,MAAM;wBACT,OAAO,EAAE,IAAI,CAAC,cAAc,IAAI;4BAC9B,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BAClC,IAAI,EAAE,yBAAyB;4BAC/B,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC;yBAC/B;qBACF,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,2DAA2D;gBAC7D,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC1B,CAAC;gBACD,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC;IAChC,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YACjC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAW;YAC3C,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW;SAC5C,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,OAAgB;QACtC,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,CACL,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/C,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACjE,IAAI,CAAC,cAAc,CACpB,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,IAAY,EAAE,OAAgB;QAC/C,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YACrD,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC7D,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,UAAU,KAAK,IAAI,IAAI,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC;QACzF,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,OAAO,KAAK,CAAC,EAAE,CAAC;IAClB,CAAC;IAEO,OAAO,CACb,KAA+B,EAC/B,IAA8B,EAC9B,OAAgC,EAChC,EAAE,GAAW,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACrC,KAAK,GAA4B,EAAE,EACnC,UAAU,GAAG,KAAK;QAElB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,SAAS,GAAG,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,MAAM,MAAM,GAA+B;YACzC,GAAG,EAAE,IAAI,CAAC,YAAY;YACtB,EAAE;YACF,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;YACjD,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;YAC3E,IAAI;YACJ,OAAO;SACR,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,cAAc,GAClB,IAAI,KAAK,wBAAwB;YACjC,IAAI,KAAK,yBAAyB;YAClC,CAAC,IAAI,KAAK,iBAAiB,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QAClE,IAAI,KAAK,GAAG,uBAAuB,IAAI,CAAC,cAAc,EAAE,CAAC;YACvD,IAAI,CAAC,WAAW,CACd,iBAAiB,EACjB,0BAA0B,uBAAuB,QAAQ,CAC1D,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IACE,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,iBAAiB;YAC/C,IAAI,CAAC,gBAAgB,GAAG,KAAK,GAAG,eAAe,EAC/C,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,sBAAsB,EAAE,oCAAoC,CAAC,CAAC;YAC/E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,iBAAiB,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,eAAe,EAAE,CAAC;gBACzF,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,WAAW;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/E,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;IAC5B,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5F,OAAO;QACT,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAgB,CAAC;YAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,eAAe,EAAE,CAAC;gBAC7D,MAAM;YACR,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAiB,CAAC,CAAC;YACnD,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK;aAC3B,uBAAuB,CACtB,IAAI,CAAC,MAAM,EACX,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CACrC;aACA,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,CACd,OAAO,CAAC,QAAQ,CAAC,YAAY,uBAAuB,QAAQ,CAAC;gBAC3D,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,oBAAoB,EACxB,OAAO,CACR,CAAC;YACF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;gBAC7B,IAAI,CAAC,gBAAgB,IAAI,MAAM,CAAC,KAAK,CAAC;YACxC,CAAC;QACH,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;gBAC3B,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC;gBAC7B,IAAI,CAAC,gBAAgB,IAAI,MAAM,CAAC,KAAK,CAAC;YACxC,CAAC;YACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,KAAK,oBAAoB,EAAE,CAAC;gBACrF,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;QACH,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;YACD,MAAM,IAAI,CAAC,YAAY,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,IAAY,EAAE,OAAe;QAC/C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,cAAc,GAAG;YACpB,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAClC,IAAI;YACJ,OAAO;SACR,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;CACF"}