@polpo-ai/node 0.15.44 → 0.15.46

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,412 @@
1
+ import { nanoid } from "nanoid";
2
+ import { ScheduleConflictError, ScheduleInvalidStateError, listScheduleOccurrences, nextScheduleOccurrence, previousScheduleOccurrence, scheduleOccurrenceIdentity, } from "@polpo-ai/core/scheduling";
3
+ const DEFAULT_LEASE_DURATION_MS = 30_000;
4
+ const DEFAULT_POLL_INTERVAL_MS = 1_000;
5
+ const DEFAULT_MAX_OCCURRENCES_PER_TICK = 100;
6
+ const DEFAULT_MAX_RUNS_PER_TICK = 250;
7
+ export class LocalScheduleDriver {
8
+ nowProvider;
9
+ constructor(options = {}) {
10
+ this.nowProvider = options.now ?? (() => new Date());
11
+ }
12
+ async register(schedule) {
13
+ return this.registration(schedule);
14
+ }
15
+ async update(schedule) {
16
+ return this.registration(schedule);
17
+ }
18
+ async pause(_schedule) { }
19
+ async resume(_schedule) { }
20
+ async delete(_schedule) { }
21
+ registration(schedule) {
22
+ const now = validClock(this.nowProvider(), "Local schedule driver");
23
+ if (!schedule.id) {
24
+ throw new ScheduleInvalidStateError("Local schedule driver requires an id");
25
+ }
26
+ return {
27
+ kind: "local",
28
+ status: "registered",
29
+ providerId: `local:${schedule.id}`,
30
+ updatedAt: now.toISOString(),
31
+ };
32
+ }
33
+ }
34
+ export class LocalScheduleWorker {
35
+ store;
36
+ handler;
37
+ workerId;
38
+ nowProvider;
39
+ createLeaseToken;
40
+ leaseDurationMs;
41
+ pollIntervalMs;
42
+ maxOccurrencesPerSchedulePerTick;
43
+ maxRunsPerTick;
44
+ onError;
45
+ tickInProgress = false;
46
+ timer;
47
+ polling = false;
48
+ constructor(options) {
49
+ if (!options?.store)
50
+ throw new Error("Local schedule worker requires a store");
51
+ if (typeof options.handler !== "function") {
52
+ throw new Error("Local schedule worker requires a handler");
53
+ }
54
+ this.store = options.store;
55
+ this.handler = options.handler;
56
+ this.workerId = nonEmpty(options.workerId ?? `local-worker-${nanoid()}`, "workerId");
57
+ this.nowProvider = options.now ?? (() => new Date());
58
+ this.createLeaseToken = options.createLeaseToken ?? (() => nanoid());
59
+ this.leaseDurationMs = boundedInteger(options.leaseDurationMs ?? DEFAULT_LEASE_DURATION_MS, "leaseDurationMs", 1_000, 60 * 60 * 1_000);
60
+ this.pollIntervalMs = boundedInteger(options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS, "pollIntervalMs", 100, 60_000);
61
+ this.maxOccurrencesPerSchedulePerTick = boundedInteger(options.maxOccurrencesPerSchedulePerTick
62
+ ?? DEFAULT_MAX_OCCURRENCES_PER_TICK, "maxOccurrencesPerSchedulePerTick", 1, 1_000);
63
+ this.maxRunsPerTick = boundedInteger(options.maxRunsPerTick ?? DEFAULT_MAX_RUNS_PER_TICK, "maxRunsPerTick", 1, 1_000);
64
+ this.onError = options.onError;
65
+ }
66
+ start() {
67
+ if (this.polling)
68
+ return;
69
+ this.polling = true;
70
+ this.scheduleNextPoll(0);
71
+ }
72
+ stop() {
73
+ this.polling = false;
74
+ if (this.timer)
75
+ clearTimeout(this.timer);
76
+ this.timer = undefined;
77
+ }
78
+ async tick() {
79
+ if (this.tickInProgress)
80
+ return createTickResult(true);
81
+ const now = validClock(this.nowProvider(), "Local schedule worker");
82
+ const result = createTickResult(false);
83
+ this.tickInProgress = true;
84
+ try {
85
+ const schedules = await this.store.list({ status: "active" });
86
+ for (const schedule of schedules) {
87
+ try {
88
+ await this.materialize(schedule, now, result);
89
+ }
90
+ catch (error) {
91
+ if (error instanceof ScheduleConflictError)
92
+ result.conflicts += 1;
93
+ else
94
+ result.failed += 1;
95
+ this.report(error, {
96
+ phase: "materialize",
97
+ scheduleId: schedule.id,
98
+ });
99
+ }
100
+ }
101
+ await this.processRuns(now, result);
102
+ return result;
103
+ }
104
+ finally {
105
+ this.tickInProgress = false;
106
+ }
107
+ }
108
+ async materialize(initialSchedule, now, result) {
109
+ let schedule = initialSchedule;
110
+ if (!schedule.nextOccurrenceAt) {
111
+ const baseline = new Date(schedule.createdAt);
112
+ const next = nextScheduleOccurrence(schedule, baseline);
113
+ schedule = await this.store.updateOperationalState(schedule.id, { nextOccurrenceAt: next?.occurrenceAt ?? null }, { expectedRevision: schedule.revision });
114
+ }
115
+ if (!schedule.nextOccurrenceAt
116
+ || Date.parse(schedule.nextOccurrenceAt) > now.getTime()) {
117
+ return;
118
+ }
119
+ let due = this.dueOccurrences(schedule, now);
120
+ if (due.length === 0)
121
+ return;
122
+ if (schedule.policy.catchUp === "latest") {
123
+ const last = due[due.length - 1];
124
+ const following = nextScheduleOccurrence(schedule, last.occurrenceAt);
125
+ if (due.length === this.maxOccurrencesPerSchedulePerTick
126
+ && following
127
+ && Date.parse(following.occurrenceAt) <= now.getTime()) {
128
+ const latest = previousScheduleOccurrence(schedule, now);
129
+ due = latest ? [latest] : [];
130
+ }
131
+ }
132
+ if (due.length === 0)
133
+ return;
134
+ const existing = new Set((await this.store.listRuns({ scheduleId: schedule.id, limit: 1_000 }))
135
+ .map((run) => run.idempotencyKey));
136
+ for (const occurrence of due) {
137
+ await this.store.createRun({
138
+ scheduleId: schedule.id,
139
+ occurrenceAt: occurrence.occurrenceAt,
140
+ triggerId: occurrence.triggerId,
141
+ idempotencyKey: occurrence.idempotencyKey,
142
+ });
143
+ if (!existing.has(occurrence.idempotencyKey)) {
144
+ existing.add(occurrence.idempotencyKey);
145
+ result.materialized += 1;
146
+ }
147
+ }
148
+ const last = due[due.length - 1];
149
+ const next = nextScheduleOccurrence(schedule, last.occurrenceAt);
150
+ await this.store.updateOperationalState(schedule.id, {
151
+ lastOccurrenceAt: last.occurrenceAt,
152
+ nextOccurrenceAt: next?.occurrenceAt ?? null,
153
+ }, { expectedRevision: schedule.revision });
154
+ }
155
+ dueOccurrences(schedule, now) {
156
+ const first = scheduleOccurrenceIdentity(schedule, schedule.nextOccurrenceAt);
157
+ if (Date.parse(first.occurrenceAt) > now.getTime())
158
+ return [];
159
+ if (this.maxOccurrencesPerSchedulePerTick === 1)
160
+ return [first];
161
+ return [
162
+ first,
163
+ ...listScheduleOccurrences(schedule, {
164
+ after: first.occurrenceAt,
165
+ through: now,
166
+ limit: this.maxOccurrencesPerSchedulePerTick - 1,
167
+ }),
168
+ ];
169
+ }
170
+ async processRuns(now, result) {
171
+ const candidates = (await this.store.listRuns({
172
+ status: ["pending", "claimed", "running"],
173
+ limit: this.maxRunsPerTick,
174
+ order: "asc",
175
+ }));
176
+ const latestRunBySchedule = new Map();
177
+ for (const candidate of candidates) {
178
+ if ((candidate.status === "claimed" || candidate.status === "running")
179
+ && candidate.lease
180
+ && Date.parse(candidate.lease.expiresAt) > now.getTime()) {
181
+ continue;
182
+ }
183
+ const schedule = await this.store.get(candidate.scheduleId);
184
+ if (!schedule || schedule.status !== "active") {
185
+ result.deferred += 1;
186
+ continue;
187
+ }
188
+ const expired = now.getTime() - Date.parse(candidate.occurrenceAt)
189
+ > schedule.policy.misfireGraceSeconds * 1_000;
190
+ let superseded = false;
191
+ if (schedule.policy.catchUp === "latest") {
192
+ if (!latestRunBySchedule.has(schedule.id)) {
193
+ const [latest] = await this.store.listRuns({
194
+ scheduleId: schedule.id,
195
+ limit: 1,
196
+ order: "desc",
197
+ });
198
+ latestRunBySchedule.set(schedule.id, latest?.id);
199
+ }
200
+ superseded = latestRunBySchedule.get(schedule.id) !== candidate.id;
201
+ }
202
+ if (expired || superseded) {
203
+ await this.skipRun(candidate, schedule, now, expired ? "misfire_grace_exceeded" : "superseded_by_latest", result);
204
+ continue;
205
+ }
206
+ if (await this.store.countActiveRuns(schedule.id)
207
+ >= schedule.policy.maxConcurrency) {
208
+ result.deferred += 1;
209
+ continue;
210
+ }
211
+ const lease = this.createLease(now);
212
+ const claimed = await this.store.claimRun(candidate.id, lease);
213
+ if (!claimed)
214
+ continue;
215
+ let running;
216
+ try {
217
+ running = await this.store.startRun(candidate.id, lease);
218
+ }
219
+ catch (error) {
220
+ try {
221
+ await this.store.releaseRun(candidate.id, lease);
222
+ }
223
+ catch {
224
+ // A stale lease is recoverable by the next worker tick.
225
+ }
226
+ result.deferred += 1;
227
+ this.report(error, {
228
+ phase: "dispatch",
229
+ scheduleId: schedule.id,
230
+ runId: candidate.id,
231
+ });
232
+ continue;
233
+ }
234
+ result.dispatched += 1;
235
+ const controller = new AbortController();
236
+ const stopHeartbeat = this.startHeartbeat(running, lease, controller);
237
+ try {
238
+ const completion = await this.handler({
239
+ schedule,
240
+ run: running,
241
+ lease,
242
+ signal: controller.signal,
243
+ });
244
+ stopHeartbeat();
245
+ const completed = await this.store.completeRun(candidate.id, {
246
+ lease,
247
+ ...completion,
248
+ });
249
+ incrementTerminalResult(result, completed.status);
250
+ if (schedule.timing.kind === "once") {
251
+ await this.completeOnceSchedule(schedule.id, result);
252
+ }
253
+ }
254
+ catch (error) {
255
+ stopHeartbeat();
256
+ controller.abort(error);
257
+ try {
258
+ await this.store.releaseRun(candidate.id, lease);
259
+ }
260
+ catch {
261
+ // Expired ownership is intentionally left for lease reclamation.
262
+ }
263
+ result.failed += 1;
264
+ this.report(error, {
265
+ phase: "dispatch",
266
+ scheduleId: schedule.id,
267
+ runId: candidate.id,
268
+ });
269
+ }
270
+ }
271
+ }
272
+ async skipRun(candidate, schedule, now, reason, result) {
273
+ const lease = this.createLease(now);
274
+ const claimed = await this.store.claimRun(candidate.id, lease);
275
+ if (!claimed) {
276
+ result.deferred += 1;
277
+ return;
278
+ }
279
+ await this.store.completeRun(candidate.id, {
280
+ lease,
281
+ status: "skipped",
282
+ references: {},
283
+ result: { reason },
284
+ });
285
+ result.skipped += 1;
286
+ if (schedule.timing.kind === "once") {
287
+ await this.completeOnceSchedule(schedule.id, result);
288
+ }
289
+ }
290
+ async completeOnceSchedule(scheduleId, result) {
291
+ const latest = await this.store.get(scheduleId);
292
+ if (!latest || latest.status !== "active")
293
+ return;
294
+ try {
295
+ await this.store.update(scheduleId, { status: "completed" }, { expectedRevision: latest.revision });
296
+ }
297
+ catch (error) {
298
+ if (error instanceof ScheduleConflictError)
299
+ result.conflicts += 1;
300
+ else
301
+ throw error;
302
+ }
303
+ }
304
+ createLease(now) {
305
+ const token = nonEmpty(this.createLeaseToken(), "lease token");
306
+ return {
307
+ owner: this.workerId,
308
+ token,
309
+ expiresAt: new Date(now.getTime() + this.leaseDurationMs).toISOString(),
310
+ };
311
+ }
312
+ startHeartbeat(run, lease, controller) {
313
+ let stopped = false;
314
+ let renewing = false;
315
+ const interval = setInterval(async () => {
316
+ if (stopped || renewing)
317
+ return;
318
+ renewing = true;
319
+ try {
320
+ const now = validClock(this.nowProvider(), "Local schedule worker");
321
+ const renewed = {
322
+ ...lease,
323
+ expiresAt: new Date(now.getTime() + this.leaseDurationMs).toISOString(),
324
+ };
325
+ if (!await this.store.renewLease(run.id, renewed)) {
326
+ controller.abort(new ScheduleConflictError(`Schedule run "${run.id}" lease ownership was lost`));
327
+ stopped = true;
328
+ clearInterval(interval);
329
+ }
330
+ }
331
+ catch (error) {
332
+ controller.abort(error);
333
+ this.report(error, {
334
+ phase: "heartbeat",
335
+ scheduleId: run.scheduleId,
336
+ runId: run.id,
337
+ });
338
+ stopped = true;
339
+ clearInterval(interval);
340
+ }
341
+ finally {
342
+ renewing = false;
343
+ }
344
+ }, Math.max(100, Math.floor(this.leaseDurationMs / 3)));
345
+ interval.unref?.();
346
+ return () => {
347
+ stopped = true;
348
+ clearInterval(interval);
349
+ };
350
+ }
351
+ scheduleNextPoll(delay) {
352
+ if (!this.polling)
353
+ return;
354
+ this.timer = setTimeout(async () => {
355
+ try {
356
+ await this.tick();
357
+ }
358
+ catch (error) {
359
+ this.report(error, { phase: "poll" });
360
+ }
361
+ finally {
362
+ this.scheduleNextPoll(this.pollIntervalMs);
363
+ }
364
+ }, delay);
365
+ this.timer.unref?.();
366
+ }
367
+ report(error, context) {
368
+ this.onError?.(error, context);
369
+ }
370
+ }
371
+ function createTickResult(alreadyRunning) {
372
+ return {
373
+ alreadyRunning,
374
+ materialized: 0,
375
+ dispatched: 0,
376
+ succeeded: 0,
377
+ skipped: 0,
378
+ cancelled: 0,
379
+ failed: 0,
380
+ deferred: 0,
381
+ conflicts: 0,
382
+ };
383
+ }
384
+ function incrementTerminalResult(result, status) {
385
+ if (status === "succeeded")
386
+ result.succeeded += 1;
387
+ else if (status === "skipped")
388
+ result.skipped += 1;
389
+ else if (status === "cancelled")
390
+ result.cancelled += 1;
391
+ else if (status === "failed")
392
+ result.failed += 1;
393
+ }
394
+ function validClock(value, label) {
395
+ const date = new Date(value);
396
+ if (!Number.isFinite(date.getTime())) {
397
+ throw new ScheduleInvalidStateError(`${label} clock returned an invalid date`);
398
+ }
399
+ return date;
400
+ }
401
+ function boundedInteger(value, label, min, max) {
402
+ if (!Number.isInteger(value) || value < min || value > max) {
403
+ throw new Error(`${label} must be an integer between ${min} and ${max}`);
404
+ }
405
+ return value;
406
+ }
407
+ function nonEmpty(value, label) {
408
+ if (!value.trim())
409
+ throw new Error(`${label} must be a non-empty string`);
410
+ return value.trim();
411
+ }
412
+ //# sourceMappingURL=local-schedule-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-schedule-driver.js","sourceRoot":"","sources":["../../src/scheduling/local-schedule-driver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,0BAA0B,GAU3B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AACzC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,gCAAgC,GAAG,GAAG,CAAC;AAC7C,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAMtC,MAAM,OAAO,mBAAmB;IACb,WAAW,CAAsB;IAElD,YAAY,UAAsC,EAAE;QAClD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAkB;QAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAkB;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAmB,IAAkB,CAAC;IAElD,KAAK,CAAC,MAAM,CAAC,SAAmB,IAAkB,CAAC;IAEnD,KAAK,CAAC,MAAM,CAAC,SAAmB,IAAkB,CAAC;IAE3C,YAAY,CAAC,QAAkB;QACrC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,yBAAyB,CAAC,sCAAsC,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO;YACL,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,SAAS,QAAQ,CAAC,EAAE,EAAE;YAClC,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;SAC7B,CAAC;IACJ,CAAC;CACF;AAyDD,MAAM,OAAO,mBAAmB;IACb,KAAK,CAAgB;IACrB,OAAO,CAA0B;IACjC,QAAQ,CAAS;IACjB,WAAW,CAAsB;IACjC,gBAAgB,CAAe;IAC/B,eAAe,CAAS;IACxB,cAAc,CAAS;IACvB,gCAAgC,CAAS;IACzC,cAAc,CAAS;IACvB,OAAO,CAAyC;IACzD,cAAc,GAAG,KAAK,CAAC;IACvB,KAAK,CAAiC;IACtC,OAAO,GAAG,KAAK,CAAC;IAExB,YAAY,OAAmC;QAC7C,IAAI,CAAC,OAAO,EAAE,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC/E,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,gBAAgB,MAAM,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;QACrF,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,eAAe,GAAG,cAAc,CACnC,OAAO,CAAC,eAAe,IAAI,yBAAyB,EACpD,iBAAiB,EACjB,KAAK,EACL,EAAE,GAAG,EAAE,GAAG,KAAK,CAChB,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,cAAc,CAClC,OAAO,CAAC,cAAc,IAAI,wBAAwB,EAClD,gBAAgB,EAChB,GAAG,EACH,MAAM,CACP,CAAC;QACF,IAAI,CAAC,gCAAgC,GAAG,cAAc,CACpD,OAAO,CAAC,gCAAgC;eACnC,gCAAgC,EACrC,kCAAkC,EAClC,CAAC,EACD,KAAK,CACN,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,cAAc,CAClC,OAAO,CAAC,cAAc,IAAI,yBAAyB,EACnD,gBAAgB,EAChB,CAAC,EACD,KAAK,CACN,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,CAAC,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBAChD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,qBAAqB;wBAAE,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;;wBAC7D,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;oBACxB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;wBACjB,KAAK,EAAE,aAAa;wBACpB,UAAU,EAAE,QAAQ,CAAC,EAAE;qBACxB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACpC,OAAO,MAAM,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,eAAyB,EACzB,GAAS,EACT,MAA+B;QAE/B,IAAI,QAAQ,GAAG,eAAe,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACxD,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAChD,QAAQ,CAAC,EAAE,EACX,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,IAAI,IAAI,EAAE,EAChD,EAAE,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,EAAE,CACxC,CAAC;QACJ,CAAC;QAED,IACE,CAAC,QAAQ,CAAC,gBAAgB;eACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,EACxD,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE7B,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjC,MAAM,SAAS,GAAG,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACtE,IACE,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,gCAAgC;mBACjD,SAAS;mBACT,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,EACtD,CAAC;gBACD,MAAM,MAAM,GAAG,0BAA0B,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBACzD,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE7B,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;aACnE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CACpC,CAAC;QACF,KAAK,MAAM,UAAU,IAAI,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;gBACzB,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,YAAY,EAAE,UAAU,CAAC,YAAY;gBACrC,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,cAAc,EAAE,UAAU,CAAC,cAAc;aAC1C,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC7C,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;gBACxC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACjE,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CACrC,QAAQ,CAAC,EAAE,EACX;YACE,gBAAgB,EAAE,IAAI,CAAC,YAAY;YACnC,gBAAgB,EAAE,IAAI,EAAE,YAAY,IAAI,IAAI;SAC7C,EACD,EAAE,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,EAAE,CACxC,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,QAAkB,EAAE,GAAS;QAClD,MAAM,KAAK,GAAG,0BAA0B,CACtC,QAAQ,EACR,QAAQ,CAAC,gBAAiB,CAC3B,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,CAAC;QAC9D,IAAI,IAAI,CAAC,gCAAgC,KAAK,CAAC;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAChE,OAAO;YACL,KAAK;YACL,GAAG,uBAAuB,CAAC,QAAQ,EAAE;gBACnC,KAAK,EAAE,KAAK,CAAC,YAAY;gBACzB,OAAO,EAAE,GAAG;gBACZ,KAAK,EAAE,IAAI,CAAC,gCAAgC,GAAG,CAAC;aACjD,CAAC;SACH,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,GAAS,EACT,MAA+B;QAE/B,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC5C,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;YACzC,KAAK,EAAE,IAAI,CAAC,cAAc;YAC1B,KAAK,EAAE,KAAK;SACb,CAAC,CAAC,CAAC;QACJ,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAA8B,CAAC;QAElE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IACE,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC;mBAC/D,SAAS,CAAC,KAAK;mBACf,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,EACxD,CAAC;gBACD,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC5D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC9C,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;gBACrB,SAAS;YACX,CAAC;YAED,MAAM,OAAO,GACX,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC;kBAC9C,QAAQ,CAAC,MAAM,CAAC,mBAAmB,GAAG,KAAK,CAAC;YAClD,IAAI,UAAU,GAAG,KAAK,CAAC;YACvB,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACzC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;wBACzC,UAAU,EAAE,QAAQ,CAAC,EAAE;wBACvB,KAAK,EAAE,CAAC;wBACR,KAAK,EAAE,MAAM;qBACd,CAAC,CAAC;oBACH,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;gBACnD,CAAC;gBACD,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;YACrE,CAAC;YACD,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,OAAO,CAChB,SAAS,EACT,QAAQ,EACR,GAAG,EACH,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,sBAAsB,EAC3D,MAAM,CACP,CAAC;gBACF,SAAS;YACX,CAAC;YAED,IACE,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;mBACxC,QAAQ,CAAC,MAAM,CAAC,cAAc,EACnC,CAAC;gBACD,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;gBACrB,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC/D,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,IAAI,OAAoB,CAAC;YACzB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACnD,CAAC;gBAAC,MAAM,CAAC;oBACP,wDAAwD;gBAC1D,CAAC;gBACD,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;gBACrB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;oBACjB,KAAK,EAAE,UAAU;oBACjB,UAAU,EAAE,QAAQ,CAAC,EAAE;oBACvB,KAAK,EAAE,SAAS,CAAC,EAAE;iBACpB,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;YACvB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YACtE,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;oBACpC,QAAQ;oBACR,GAAG,EAAE,OAAO;oBACZ,KAAK;oBACL,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBACH,aAAa,EAAE,CAAC;gBAChB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE;oBAC3D,KAAK;oBACL,GAAG,UAAU;iBACd,CAAC,CAAC;gBACH,uBAAuB,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBAClD,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACpC,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,aAAa,EAAE,CAAC;gBAChB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACnD,CAAC;gBAAC,MAAM,CAAC;oBACP,iEAAiE;gBACnE,CAAC;gBACD,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;oBACjB,KAAK,EAAE,UAAU;oBACjB,UAAU,EAAE,QAAQ,CAAC,EAAE;oBACvB,KAAK,EAAE,SAAS,CAAC,EAAE;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,SAAsB,EACtB,QAAkB,EAClB,GAAS,EACT,MAAc,EACd,MAA+B;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE;YACzC,KAAK;YACL,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,EAAE,MAAM,EAAE;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACpB,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,UAAkB,EAClB,MAA+B;QAE/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CACrB,UAAU,EACV,EAAE,MAAM,EAAE,WAAW,EAAE,EACvB,EAAE,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE,CACtC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,qBAAqB;gBAAE,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;;gBAC7D,MAAM,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,GAAS;QAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,CAAC;QAC/D,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,QAAQ;YACpB,KAAK;YACL,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE;SACxE,CAAC;IACJ,CAAC;IAEO,cAAc,CACpB,GAAgB,EAChB,KAAoB,EACpB,UAA2B;QAE3B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACtC,IAAI,OAAO,IAAI,QAAQ;gBAAE,OAAO;YAChC,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,uBAAuB,CAAC,CAAC;gBACpE,MAAM,OAAO,GAAG;oBACd,GAAG,KAAK;oBACR,SAAS,EAAE,IAAI,IAAI,CACjB,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,eAAe,CACrC,CAAC,WAAW,EAAE;iBAChB,CAAC;gBACF,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;oBAClD,UAAU,CAAC,KAAK,CACd,IAAI,qBAAqB,CACvB,iBAAiB,GAAG,CAAC,EAAE,4BAA4B,CACpD,CACF,CAAC;oBACF,OAAO,GAAG,IAAI,CAAC;oBACf,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;oBACjB,KAAK,EAAE,WAAW;oBAClB,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,KAAK,EAAE,GAAG,CAAC,EAAE;iBACd,CAAC,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC;gBACf,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;oBAAS,CAAC;gBACT,QAAQ,GAAG,KAAK,CAAC;YACnB,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;QACnB,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,KAAa;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACjC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACxC,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IAEO,MAAM,CACZ,KAAc,EACd,OAAwC;QAExC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,cAAuB;IAC/C,OAAO;QACL,cAAc;QACd,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,CAAC;KACb,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAA+B,EAC/B,MAA6B;IAE7B,IAAI,MAAM,KAAK,WAAW;QAAE,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;SAC7C,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;SAC9C,IAAI,MAAM,KAAK,WAAW;QAAE,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;SAClD,IAAI,MAAM,KAAK,QAAQ;QAAE,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,KAAoB,EAAE,KAAa;IACrD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,yBAAyB,CAAC,GAAG,KAAK,iCAAiC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CACrB,KAAa,EACb,KAAa,EACb,GAAW,EACX,GAAW;IAEX,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+BAA+B,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,6BAA6B,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ScheduleDispatcher } from "@polpo-ai/core/scheduling";
2
+ import type { LocalScheduleRunHandler } from "./local-schedule-driver.js";
3
+ /**
4
+ * Connects the generic schedule dispatcher to the durable local worker.
5
+ */
6
+ export declare function createLocalScheduleRunHandler(dispatcher: ScheduleDispatcher): LocalScheduleRunHandler;
7
+ //# sourceMappingURL=schedule-dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-dispatcher.d.ts","sourceRoot":"","sources":["../../src/scheduling/schedule-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,kBAAkB,GAC7B,uBAAuB,CAMzB"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Connects the generic schedule dispatcher to the durable local worker.
3
+ */
4
+ export function createLocalScheduleRunHandler(dispatcher) {
5
+ if (!dispatcher || typeof dispatcher.dispatch !== "function") {
6
+ throw new Error("Local schedule run handler requires a dispatcher");
7
+ }
8
+ return ({ run, schedule, signal }) => dispatcher.dispatch(run, schedule, { signal });
9
+ }
10
+ //# sourceMappingURL=schedule-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-dispatcher.js","sourceRoot":"","sources":["../../src/scheduling/schedule-dispatcher.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,UAA8B;IAE9B,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CACnC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { type CompleteScheduleRunInput, type CreateScheduleInput, type CreateScheduleRunInput, type Schedule, type ScheduleFilter, type ScheduleLease, type ScheduleMutationOptions, type ScheduleOperationalStatePatch, type ScheduleRun, type ScheduleRunFilter, type ScheduleStore, type UpdateScheduleInput } from "@polpo-ai/core/scheduling";
2
+ interface SQLiteScheduleStoreOptions {
3
+ now?: () => Date | string;
4
+ createId?: (kind: "schedule" | "schedule-run") => string;
5
+ }
6
+ /**
7
+ * Durable local ScheduleStore backed by SQLite.
8
+ *
9
+ * The optional native dependency is loaded only by `open()`, so importing the
10
+ * rest of @polpo-ai/node remains safe in environments without better-sqlite3.
11
+ */
12
+ export declare class SQLiteScheduleStore implements ScheduleStore {
13
+ private readonly db;
14
+ private readonly nowProvider;
15
+ private readonly createId;
16
+ private constructor();
17
+ static open(path: string, options?: SQLiteScheduleStoreOptions): Promise<SQLiteScheduleStore>;
18
+ create(input: CreateScheduleInput): Promise<Schedule>;
19
+ list(filter?: ScheduleFilter): Promise<Schedule[]>;
20
+ get(id: string): Promise<Schedule | null>;
21
+ update(id: string, patch: UpdateScheduleInput, options?: ScheduleMutationOptions): Promise<Schedule>;
22
+ markDeleted(id: string, options?: ScheduleMutationOptions): Promise<void>;
23
+ updateOperationalState(id: string, patch: ScheduleOperationalStatePatch, options?: ScheduleMutationOptions): Promise<Schedule>;
24
+ createRun(input: CreateScheduleRunInput): Promise<ScheduleRun>;
25
+ getRun(id: string): Promise<ScheduleRun | null>;
26
+ listRuns(filter?: ScheduleRunFilter): Promise<ScheduleRun[]>;
27
+ claimRun(id: string, lease: ScheduleLease): Promise<ScheduleRun | null>;
28
+ renewLease(id: string, lease: ScheduleLease): Promise<boolean>;
29
+ startRun(id: string, lease: ScheduleLease): Promise<ScheduleRun>;
30
+ releaseRun(id: string, lease: ScheduleLease): Promise<ScheduleRun>;
31
+ completeRun(id: string, input: CompleteScheduleRunInput): Promise<ScheduleRun>;
32
+ countActiveRuns(scheduleId: string): Promise<number>;
33
+ close(): void;
34
+ private insertSchedule;
35
+ private insertRun;
36
+ private casRun;
37
+ private casClaimRun;
38
+ private requireSchedule;
39
+ private requireRun;
40
+ private getRunByIdempotencyKey;
41
+ private requireOwnedRun;
42
+ private now;
43
+ }
44
+ export {};
45
+ //# sourceMappingURL=sqlite-schedule-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-schedule-store.d.ts","sourceRoot":"","sources":["../../src/scheduling/sqlite-schedule-store.ts"],"names":[],"mappings":"AAIA,OAAO,EAcL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EAClC,KAAK,WAAW,EAChB,KAAK,iBAAiB,EAGtB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACzB,MAAM,2BAA2B,CAAC;AAEnC,UAAU,0BAA0B;IAClC,GAAG,CAAC,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,KAAK,MAAM,CAAC;CAC1D;AAoED;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAKrD,OAAO,CAAC,QAAQ,CAAC,EAAE;IAJrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgD;IAEzE,OAAO;WAQM,IAAI,CACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,mBAAmB,CAAC;IAyBzB,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA+BrD,IAAI,CAAC,MAAM,GAAE,cAAmB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IActD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAOzC,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,QAAQ,CAAC;IAqDd,WAAW,CACf,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC;IAkCV,sBAAsB,CAC1B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,6BAA6B,EACpC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,QAAQ,CAAC;IAuCd,SAAS,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC;IA4C9D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAO/C,QAAQ,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAiBhE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAsCvE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB9D,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IA8BhE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IAkBlE,WAAW,CACf,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,WAAW,CAAC;IA+BjB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW1D,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,SAAS;IAsBjB,OAAO,CAAC,MAAM;IA4Bd,OAAO,CAAC,WAAW;IA6CnB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,GAAG;CASZ"}