@adonis-agora/durable 0.41.0 → 0.43.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 (71) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/assets/spa/assets/index-BkHCh-H3.js +16 -0
  3. package/dist/assets/spa/assets/index-BkHCh-H3.js.map +1 -0
  4. package/dist/assets/spa/index.html +1 -1
  5. package/dist/providers/durable_provider.d.ts.map +1 -1
  6. package/dist/providers/durable_provider.js +10 -0
  7. package/dist/providers/durable_provider.js.map +1 -1
  8. package/dist/src/codec-state-store.d.ts +13 -1
  9. package/dist/src/codec-state-store.d.ts.map +1 -1
  10. package/dist/src/codec-state-store.js +32 -0
  11. package/dist/src/codec-state-store.js.map +1 -1
  12. package/dist/src/commands/worker.d.ts.map +1 -1
  13. package/dist/src/commands/worker.js +4 -0
  14. package/dist/src/commands/worker.js.map +1 -1
  15. package/dist/src/concurrency.d.ts +55 -0
  16. package/dist/src/concurrency.d.ts.map +1 -0
  17. package/dist/src/concurrency.js +52 -0
  18. package/dist/src/concurrency.js.map +1 -0
  19. package/dist/src/dashboard/index.d.ts +1 -1
  20. package/dist/src/dashboard/index.js +1 -1
  21. package/dist/src/define_config.d.ts +17 -1
  22. package/dist/src/define_config.d.ts.map +1 -1
  23. package/dist/src/define_config.js.map +1 -1
  24. package/dist/src/engine.d.ts +73 -2
  25. package/dist/src/engine.d.ts.map +1 -1
  26. package/dist/src/engine.js +195 -26
  27. package/dist/src/engine.js.map +1 -1
  28. package/dist/src/errors.d.ts +13 -0
  29. package/dist/src/errors.d.ts.map +1 -1
  30. package/dist/src/errors.js +20 -0
  31. package/dist/src/errors.js.map +1 -1
  32. package/dist/src/index.d.ts +3 -1
  33. package/dist/src/index.d.ts.map +1 -1
  34. package/dist/src/index.js +3 -1
  35. package/dist/src/index.js.map +1 -1
  36. package/dist/src/interfaces.d.ts +111 -0
  37. package/dist/src/interfaces.d.ts.map +1 -1
  38. package/dist/src/interfaces.js +18 -1
  39. package/dist/src/interfaces.js.map +1 -1
  40. package/dist/src/run-value-facets.d.ts +1 -1
  41. package/dist/src/run-value-facets.d.ts.map +1 -1
  42. package/dist/src/run-value-facets.js +1 -1
  43. package/dist/src/run-value-facets.js.map +1 -1
  44. package/dist/src/schedules.d.ts +172 -0
  45. package/dist/src/schedules.d.ts.map +1 -0
  46. package/dist/src/schedules.js +362 -0
  47. package/dist/src/schedules.js.map +1 -0
  48. package/dist/src/stores/lucid-schema.d.ts +1 -0
  49. package/dist/src/stores/lucid-schema.d.ts.map +1 -1
  50. package/dist/src/stores/lucid-schema.js +21 -0
  51. package/dist/src/stores/lucid-schema.js.map +1 -1
  52. package/dist/src/stores/lucid.d.ts +9 -1
  53. package/dist/src/stores/lucid.d.ts.map +1 -1
  54. package/dist/src/stores/lucid.js +107 -0
  55. package/dist/src/stores/lucid.js.map +1 -1
  56. package/dist/src/testing/in-memory-state-store.d.ts +8 -1
  57. package/dist/src/testing/in-memory-state-store.d.ts.map +1 -1
  58. package/dist/src/testing/in-memory-state-store.js +38 -0
  59. package/dist/src/testing/in-memory-state-store.js.map +1 -1
  60. package/dist/src/testing-kit/state-store-conformance.d.ts.map +1 -1
  61. package/dist/src/testing-kit/state-store-conformance.js +101 -0
  62. package/dist/src/testing-kit/state-store-conformance.js.map +1 -1
  63. package/dist/src/workflow-discovery.d.ts.map +1 -1
  64. package/dist/src/workflow-discovery.js +1 -0
  65. package/dist/src/workflow-discovery.js.map +1 -1
  66. package/dist/src/workflow-ref.d.ts +9 -0
  67. package/dist/src/workflow-ref.d.ts.map +1 -1
  68. package/dist/src/workflow-ref.js.map +1 -1
  69. package/package.json +6 -6
  70. package/dist/assets/spa/assets/index-CeHc6GHq.js +0 -16
  71. package/dist/assets/spa/assets/index-CeHc6GHq.js.map +0 -1
@@ -1,9 +1,11 @@
1
1
  import { type AdmissionBackend } from './admission.js';
2
+ import { type ConcurrencyConfig, type ConcurrencyQuota } from './concurrency.js';
2
3
  import { type EntityConfig } from './entities.js';
3
4
  import { type EventBatchConfig } from './event-accumulators.js';
4
- import type { ControlPlane, EngineListener, GroupHealth, NamedTransport, RunDispatcher, RunFacetQuery, RunQuery, RunResult, RunStatus, RunValueAxis, RunValueFacetOptions, RunValueFacetRow, SearchAttributes, SignalWaiter, StateStore, StepCheckpoint, StepError, StepInterceptor, Transport, UpdateResult, UpdateValidator, WorkflowCtx, WorkflowExecutor, WorkflowRun } from './interfaces.js';
5
+ import type { ControlPlane, EngineListener, GroupHealth, NamedTransport, RunDispatcher, RunFacetQuery, RunQuery, RunResult, RunScope, RunStatus, RunValueAxis, RunValueFacetOptions, RunValueFacetRow, ScopedRetentionPolicy, SearchAttributes, SignalWaiter, StateStore, StepCheckpoint, StepError, StepInterceptor, Transport, UpdateResult, UpdateValidator, WorkflowCtx, WorkflowExecutor, WorkflowRun } from './interfaces.js';
5
6
  import type { QueueConfig } from './queue.js';
6
7
  import { type ScheduledWorkflow } from './scheduler.js';
8
+ import { ScheduleClient } from './schedules.js';
7
9
  import type { NormalizedEventTrigger } from './workflow-events.js';
8
10
  import { type WorkflowClass, type WorkflowInputOf, type WorkflowRef } from './workflow-ref.js';
9
11
  type WorkflowFn = (ctx: WorkflowCtx, input: unknown) => Promise<unknown>;
@@ -39,6 +41,12 @@ export interface StartOptions {
39
41
  * when one shared workflow is started on behalf of another package.
40
42
  */
41
43
  origin?: string | undefined;
44
+ /**
45
+ * A start-time concurrency quota for this start — at most `limit` runs sharing `key` in flight;
46
+ * over it, `start` throws {@link ConcurrencyLimitError} and creates nothing. Overrides the
47
+ * workflow's registered `concurrency`. See {@link ConcurrencyQuota}.
48
+ */
49
+ concurrency?: ConcurrencyQuota | undefined;
42
50
  }
43
51
  /** One row of {@link WorkflowEngine.listSchedules} — a schedule with its live control state. */
44
52
  export interface ScheduleInfo {
@@ -236,6 +244,13 @@ export interface WorkflowEngineDeps {
236
244
  * deletion (archival failure must never lose data).
237
245
  */
238
246
  retention?: Partial<Record<'completed' | 'failed' | 'cancelled' | 'dead', number>> | undefined;
247
+ /**
248
+ * Scoped retention rules, swept alongside {@link retention} by the same throttled
249
+ * `sweepRetention`: each deletes terminal runs in its `statuses` that match its `scope` (a tenant's
250
+ * `namespace`, `tags`, `workflows`, search `attributes`) once older than `maxAgeMs`. The strictest
251
+ * rule matching a run wins, since every rule is applied.
252
+ */
253
+ retentionPolicies?: ScopedRetentionPolicy[] | undefined;
239
254
  /**
240
255
  * How long an in-flight run must sit untouched — with the stranded signature (a wake-forever
241
256
  * suspension, or an old pending remote step whose worker heartbeat is silent) — before the
@@ -282,6 +297,12 @@ export interface WorkflowEngineDeps {
282
297
  * faster pickup.
283
298
  */
284
299
  blockedPollMs?: number | undefined;
300
+ /**
301
+ * Fire the PERSISTED schedules managed at runtime through {@link WorkflowEngine.schedules} on every
302
+ * worker tick (`durable:work` / the embedded worker). Off by default, so a deployment that never
303
+ * uses them doesn't need the `durable_schedules` table touched.
304
+ */
305
+ persistedSchedules?: boolean | undefined;
285
306
  }
286
307
  /** Thrown by {@link WorkflowEngine.resume} when the run belongs to a different namespace. */
287
308
  export declare class NamespaceMismatch extends Error {
@@ -307,6 +328,14 @@ export declare class WorkflowEngine {
307
328
  /** Worker-pool partition stamped on created runs and used to scope the poll/resume paths.
308
329
  * `undefined` is the OPERATOR: it scopes nothing and belongs to every namespace. */
309
330
  private readonly namespace;
331
+ /**
332
+ * Persisted, runtime-managed schedules: create/upsert/pause/resume/delete/list/trigger them, and
333
+ * `tick()` fires the due ones (the worker tick does it when `persistedSchedules` is on). Needs a
334
+ * store that persists schedules — the Lucid and in-memory stores do. See {@link ScheduleClient}.
335
+ */
336
+ readonly schedules: ScheduleClient;
337
+ /** Whether the worker tick fires {@link schedules} (the `persistedSchedules` option). */
338
+ readonly persistedSchedulesEnabled: boolean;
310
339
  private readonly leaseMs;
311
340
  private readonly maxRecoveryAttempts?;
312
341
  private readonly reconcileMs;
@@ -320,6 +349,7 @@ export declare class WorkflowEngine {
320
349
  private readonly compensationRetries;
321
350
  private readonly compensationTimeoutMs;
322
351
  private readonly retention;
352
+ private readonly retentionPolicies;
323
353
  /** Archival hooks run (awaited, in order) before a retention eviction deletes a run. */
324
354
  private readonly evictListeners;
325
355
  private readonly stalledAfterMs;
@@ -471,6 +501,8 @@ export declare class WorkflowEngine {
471
501
  register(name: string, version: string, fn: WorkflowFn, opts?: {
472
502
  tags?: string[] | undefined;
473
503
  singleton?: SingletonConfig | undefined;
504
+ /** Start-time concurrency quota — see {@link ConcurrencyConfig}. */
505
+ concurrency?: ConcurrencyConfig | undefined;
474
506
  executionTimeout?: string | number | undefined;
475
507
  validateInput?: ((input: unknown) => void | Promise<void>) | undefined;
476
508
  onEvent?: string[] | undefined;
@@ -490,6 +522,7 @@ export declare class WorkflowEngine {
490
522
  executor: WorkflowExecutor;
491
523
  tags?: string[];
492
524
  singleton?: SingletonConfig;
525
+ concurrency?: ConcurrencyConfig;
493
526
  executionTimeout?: string | number;
494
527
  validateInput?: (input: unknown) => void | Promise<void>;
495
528
  requires?: string[];
@@ -657,6 +690,43 @@ export declare class WorkflowEngine {
657
690
  */
658
691
  sweepRetention(now?: number): Promise<number>;
659
692
  deleteRun(runId: string): Promise<number>;
693
+ /**
694
+ * Sweep a deleted run's token-keyed buffered signals — they are not run-scoped rows, so the store's
695
+ * deleteRun can't cascade them. Without this every fire-and-forget child that was never joined leaks
696
+ * its buffered `child:<id>` completion FOREVER (one row per spawn), and a raced compensate-cancel
697
+ * can leave a `cancel:<id>` marker behind.
698
+ */
699
+ private sweepRunBufferedSignals;
700
+ /**
701
+ * Hard-delete EVERY run matching `scope` — plus, by default, each one's whole child subtree — in
702
+ * bounded batches: the "forget this tenant" / "drop this feature's history" operation. Where
703
+ * {@link deleteRun} removes one tree you know the id of, this drains everything a scope selects
704
+ * (`{ namespace: 'acme' }`, `{ tag: 'tenant:acme' }`, `{ workflows: [...] }`, attribute predicates…)
705
+ * through the store API.
706
+ *
707
+ * - **Live runs** in the scope are {@link cancel cancelled} first (plain cancel, no saga undo),
708
+ * which tells any worker holding one to stop, then deleted. `cancelLive: false` leaves live runs
709
+ * (and live descendants of finished ones) alone and deletes terminal history only.
710
+ * - **Children** go with their root even when they don't match the scope themselves (children
711
+ * inherit `namespace`, not `tags`); `children: false` deletes exactly the matching runs.
712
+ * - Each deletion sweeps the run's token-keyed buffered signals like {@link deleteRun}, and the
713
+ * {@link onEvict} archival hooks are NOT called (this is an explicit purge, not retention).
714
+ *
715
+ * An EMPTY scope is rejected — it would delete every run. Returns how many runs were deleted.
716
+ */
717
+ purgeRuns(scope: RunScope, opts?: {
718
+ batchSize?: number;
719
+ cancelLive?: boolean;
720
+ children?: boolean;
721
+ }): Promise<number>;
722
+ /**
723
+ * {@link purgeRuns} for one namespace — every run (and child) a tenant/partition owns. Children
724
+ * inherit their parent's namespace, so a namespace purge is complete by construction.
725
+ */
726
+ purgeNamespace(namespace: string, opts?: {
727
+ batchSize?: number;
728
+ cancelLive?: boolean;
729
+ }): Promise<number>;
660
730
  resume(runId: string): Promise<RunResult>;
661
731
  /**
662
732
  * Deferred re-drive after a suspended settle whose waited checkpoint(s) already settled — the
@@ -714,7 +784,8 @@ export declare class WorkflowEngine {
714
784
  /**
715
785
  * Per-recovery bookkeeping (called once the lease is held): count the attempt, or — past
716
786
  * `maxRecoveryAttempts` — move a poison pill to the `dead` dead-letter state. Returns a terminal
717
- * result to skip the resume, or `undefined` to proceed.
787
+ * result to skip the resume, `null` to skip it silently (the run is no longer `running`), or
788
+ * `undefined` to proceed.
718
789
  */
719
790
  private countRecovery;
720
791
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,gBAAgB,CAAC;AAYjF,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAO5D,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGnF,OAAO,KAAK,EACV,YAAY,EAEZ,cAAc,EACd,WAAW,EAGX,cAAc,EAEd,aAAa,EACb,aAAa,EACb,QAAQ,EACR,SAAS,EACT,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,cAAc,EAEd,SAAS,EAET,eAAe,EAIf,SAAS,EACT,YAAY,EACZ,eAAe,EAEf,WAAW,EAEX,gBAAgB,EAChB,WAAW,EAEZ,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,gBAAgB,CAAC;AAWxE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAC;AAE3B,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEzE,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,gGAAgG;IAChG,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAChD;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,gGAAgG;AAChG,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,mGAAmG;IACnG,MAAM,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,aAAa,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC;AAED,6GAA6G;AAC7G,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,WAAW,CAAC;IACjB,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,WAAW,EAAE,OAAO,CAAC;IACrB,mFAAmF;IACnF,YAAY,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,GAAG,IAAI,CAAC;CACV;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IAChC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA6HD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,UAAU,CAAC;IAClB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC;;;;OAIG;IACH,UAAU,CAAC,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IAC1C;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC,oEAAoE;IACpE,KAAK,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;IACnC,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;;OAIG;IACH,SAAS,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACzC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;;;;;;;;;;;OAaG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IACrD;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACrD;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IAClE;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9F;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IAC/F;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC1C;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAChD;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,SAAS,CAAC;IAChF;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,6FAA6F;AAC7F,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,cAGC;CACF;AAED;;;;;GAKG;AACH,qBAAa,cAAc;;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC;kFAC8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAwB;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAA2B;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC;yFACqF;IACrF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAqB;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAA0C;IACtE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAyC;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA0D;IACnF,4IAA4I;IAC5I,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsE;IAChG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAEZ;IAGd,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAE3B;IACJ,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,0EAA0E;IAC1E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6C;IAI9E,wHAAwH;IACxH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAChD;0GACsG;IACtG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,sGAAsG;IACtG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,kFAAkF;IAClF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAChE,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAGpC,oGAAoG;IACpG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiC;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;IACtE,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsC;IACxE,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;IACvE,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IAKrD,mFAAmF;IACnF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,iGAAiG;IACjG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAClE;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAC1D,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAAY,IAAI,EAAE,kBAAkB,EA0InC;IAED;;;;OAIG;IACH,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAE7D;IAED;;;;;;OAMG;IACH;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI,CAE5D;IAED;;;OAGG;IACH,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEtD;IAED;;;;OAIG;IACG,aAAa,CAAC,GAAG,GAAE,MAAqB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwBvE;IAED;;;;OAIG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAYvD;IAED;;;;OAIG;IACG,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAqB,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAOxF;IAED,iBAAiB,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI,CAY/D;IAED,uGAAuG;IACvG,IAAI,mBAAmB,IAAI,SAAS,iBAAiB,EAAE,CAEtD;IAED,uFAAuF;IACvF,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAgC;IAEvE,sFAAsF;IACtF,qBAAqB,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,GAAG,IAAI,CAEvE;IAED,6FAA6F;IAC7F,IAAI,uBAAuB,IAAI,SAAS,sBAAsB,EAAE,CAE/D;IAED,wFAAwF;IACxF,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhF;IAED,yGAAyG;IACzG,cAAc,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAE7E;IAED;;;;OAIG;IACH,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAGxD;IAED,mGAAmG;IACnG,OAAO,CAAC,eAAe;IAUvB;;;;OAIG;IACH,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,UAAU,EACd,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC5B,SAAS,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;QACxC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QAC/C,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;QACvE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC/B,UAAU,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;QAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAChC,8FAA8F;QAC9F,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC7B,GACA,IAAI,CAuBN;IAED;;;;;OAKG;IACH,cAAc,CACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,gBAAgB,CAAC;QAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,SAAS,CAAC,EAAE,eAAe,CAAC;QAC5B,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACnC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,GACA,IAAI,CAmBN;IAED;;;;;;;;OAQG;YACW,wBAAwB;IAYtC;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAEvC;IAED;oCACgC;IAChC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2D;IAE7F;;;;;;;;;OASG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;;;;;OAMG;IACH,cAAc,IAAI,IAAI,CAErB;IAED,sEAAsE;IACtE,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI,CAG9C;IAED;;;;;OAKG;IACH,GAAG,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,IAAI,CAM5C;IAED;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAarB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAGtD;IAED;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAGvD;IAED,OAAO,CAAC,UAAU;IAUlB;0FACsF;IACtF,OAAO,CAAC,IAAI;IAYZ;wGACoG;IACpG,OAAO,CAAC,OAAO;IAUT,KAAK,CAAC,CAAC,SAAS,aAAa,EACjC,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EACzB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,SAAS,CAAC,CAAC;IAChB,KAAK,CAAC,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,SAAS,CAAC,CAAC;IAatB;;;;;;OAMG;YACW,SAAS;IAkGvB;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,UAAU;IAmClB,mGAAmG;IACnG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAEjD;IAED;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAEhD;IAED;;;;;OAKG;IACH,cAAc,CACZ,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,aAAa,EACpB,IAAI,CAAC,EAAE,oBAAoB,GAC1B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAK7B;IAED,yGAAyG;IACzG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAExD;IAED;;;;;OAKG;IACH;;;;;;;OAOG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,CAG9D;IAED;;;OAGG;IACG,YAAY,CAAC,GAAG,GAAE,MAAqB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAuDxE;IAED;;;;;OAKG;IACH,OAAO,CACL,QAAQ,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClF,MAAM,IAAI,CAGZ;IAED;;;;;;;;;;OAUG;IACG,cAAc,CAAC,GAAG,GAAE,MAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgChE;IAEK,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB9C;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAsC9C;IAED;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAevB,qEAAqE;IACrE,OAAO,CAAC,KAAK;IAMb;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAMnB;;;;;;;;;;;;;;;;;;OAkBG;IACG,KAAK,CAAC,SAAS,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB7C;IAED;;;OAGG;YACW,oBAAoB;IAclC;;;;OAIG;IACG,aAAa,CAAC,GAAG,GAAE,MAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD7D;IAED;;;OAGG;IACG,iBAAiB,CAAC,KAAK,GAAE,MAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAmD1E;IAED;;;;OAIG;YACW,aAAa;IAwB3B;;;;;;OAMG;IACG,eAAe,CAAC,KAAK,GAAE,MAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAKxE;IAED;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAGrD;IAED;;;;;;OAMG;YACW,cAAc;IAiB5B;;;;;;OAMG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CA6E3E;IAED;;;;;;;;;OASG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,SAAS,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CA8B7F;IAED;;;;OAIG;IACG,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAQnC;IAED;;;;;OAKG;IACG,UAAU,CAAC,KAAK,GAAE,MAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAKnE;IAED;;;;;;;;;;OAUG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAoD/F;IAED;;;OAGG;YACW,YAAY;IAiC1B;;;OAGG;IACH;;;;;;;;;;;;;;;;;;OAkBG;IACG,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GACvC,OAAO,CAAC,MAAM,CAAC,CAsDjB;IAED;;;;OAIG;YACW,aAAa;IAkB3B;;;;;;;;;;;OAWG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAmBvE;IAED;;;;;;;OAOG;IACG,eAAe,CACnB,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,EAC5C,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAM5B;IAED;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAK1F;IAED,6FAA6F;IACvF,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAEpF;IAED;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA6BpB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CA+DtF;IAED;;;;;;;;OAQG;IACG,WAAW,CACf,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,EACvC,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9B,OAAO,CAAC,SAAS,EAAE,CAAC,CAQtB;IAED;;;;;OAKG;YACW,cAAc;IAS5B;;;;;;;;;;;OAWG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyB3D;IAED;;;;;;;OAOG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAEzD;IAED;;;;OAIG;IACG,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAOzE;IAED;;;yGAGqG;IACrG,WAAW,CAAC,KAAK,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAM1C;IAED;;;;gEAI4D;IACtD,YAAY,CAAC,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAM/D;IAED;;;;;;;;OAQG;YACW,gBAAgB;IAsD9B;;;;;;OAMG;YACW,SAAS;IA4BvB,oGAAoG;YACtF,YAAY;IA8B1B,oGAAoG;YACtF,QAAQ;YA8BR,OAAO;IA0DrB;;;;;OAKG;IACH;;;;;;OAMG;YACW,SAAS;IAmFvB;;;;;OAKG;YACW,iBAAiB;IAc/B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;YAKT,kBAAkB;IA2FhC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;YACW,eAAe;IA0E7B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAKvB;yFACqF;IACrF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;YACW,cAAc;IAS5B;uGACmG;YACrF,cAAc;IAmC5B,gGAAgG;YAClF,aAAa;IA0C3B;;;;;;yEAMqE;YACvD,aAAa;IAiP3B,6DAA6D;YAC/C,YAAY;IA+L1B;;;;;;;;;;;;;OAaG;YACW,eAAe;IAqE7B;;;;;;;;;;;;OAYG;YACW,oBAAoB;IAuElC;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IA6EhC;;wDAEoD;IACpD,OAAO,CAAC,UAAU;IAqDlB;;;;OAIG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAKvD;IAED;;;;OAIG;IACG,QAAQ,CAAC,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAcxF;IAED;;;;OAIG;IACH,uBAAuB,CAAC,IAAI,EAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,GAC9B,IAAI,CAEN;IAED;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAc7E;IAMD;;;0FAGsF;YACxE,kBAAkB;IAUhC;;;;;;OAMG;YACW,SAAS;IASvB;;;6EAGyE;YAC3D,cAAc;IAK5B;;;;;;;;OAQG;YACW,WAAW;IA2BzB;;qGAEiG;YACnF,cAAc;YAiBd,UAAU;IA8LxB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;;;;;;;;;;;;;;;;;;;OAoBG;YACW,oBAAoB;IAclC;;;;;OAKG;YACW,sBAAsB;IA2EpC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;;;;;OAMG;YACW,gBAAgB;IAO9B,mGAAmG;YACrF,kBAAkB;IAwDhC,+FAA+F;YACjF,0BAA0B;IA0GxC,gGAAgG;YAClF,mBAAmB;IAgCjC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;CAkD3B;AAED,8EAA8E;AAC9E,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC3C,YAAY,SAAS,CAAC,EAAE,SAAS,EAIhC;CACF"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,gBAAgB,CAAC;AAIjF,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAGtB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAO5D,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGnF,OAAO,KAAK,EACV,YAAY,EAEZ,cAAc,EACd,WAAW,EAGX,cAAc,EAEd,aAAa,EACb,aAAa,EACb,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,cAAc,EAEd,SAAS,EAET,eAAe,EAKf,SAAS,EACT,YAAY,EACZ,eAAe,EAEf,WAAW,EAEX,gBAAgB,EAChB,WAAW,EAEZ,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAWhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAC;AAE3B,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEzE,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,gGAAgG;IAChG,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAChD;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;;OAIG;IACH,WAAW,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC5C;AAED,gGAAgG;AAChG,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,mGAAmG;IACnG,MAAM,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,aAAa,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC;AAED,6GAA6G;AAC7G,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,WAAW,CAAC;IACjB,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,WAAW,EAAE,OAAO,CAAC;IACrB,mFAAmF;IACnF,YAAY,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,GAAG,IAAI,CAAC;CACV;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IAChC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA+HD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,UAAU,CAAC;IAClB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC;;;;OAIG;IACH,UAAU,CAAC,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IAC1C;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC,oEAAoE;IACpE,KAAK,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;IACnC,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;;OAIG;IACH,SAAS,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACzC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;;;;;;;;;;;OAaG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IACrD;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACrD;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IAClE;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9F;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IAC/F;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC;IACxD;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC1C;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAChD;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,SAAS,CAAC;IAChF;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1C;AAED,6FAA6F;AAC7F,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,cAGC;CACF;AAED;;;;;GAKG;AACH,qBAAa,cAAc;;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC;kFAC8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAwB;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAA2B;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC;yFACqF;IACrF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,yFAAyF;IACzF,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAqB;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAA0C;IACtE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAyC;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA0D;IACnF,4IAA4I;IAC5I,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsE;IAChG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAEZ;IACd,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA0B;IAG5D,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAE3B;IACJ,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,0EAA0E;IAC1E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6C;IAI9E,wHAAwH;IACxH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAChD;0GACsG;IACtG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,sGAAsG;IACtG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,kFAAkF;IAClF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAChE,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAGpC,oGAAoG;IACpG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiC;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;IACtE,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsC;IACxE,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;IACvE,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IAKrD,mFAAmF;IACnF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,iGAAiG;IACjG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAClE;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAC1D,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAAY,IAAI,EAAE,kBAAkB,EAoJnC;IAED;;;;OAIG;IACH,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAE7D;IAED;;;;;;OAMG;IACH;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI,CAE5D;IAED;;;OAGG;IACH,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEtD;IAED;;;;OAIG;IACG,aAAa,CAAC,GAAG,GAAE,MAAqB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwBvE;IAED;;;;OAIG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAYvD;IAED;;;;OAIG;IACG,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAqB,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAOxF;IAED,iBAAiB,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI,CAY/D;IAED,uGAAuG;IACvG,IAAI,mBAAmB,IAAI,SAAS,iBAAiB,EAAE,CAEtD;IAED,uFAAuF;IACvF,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAgC;IAEvE,sFAAsF;IACtF,qBAAqB,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,GAAG,IAAI,CAEvE;IAED,6FAA6F;IAC7F,IAAI,uBAAuB,IAAI,SAAS,sBAAsB,EAAE,CAE/D;IAED,wFAAwF;IACxF,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhF;IAED,yGAAyG;IACzG,cAAc,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAE7E;IAED;;;;OAIG;IACH,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAGxD;IAED,mGAAmG;IACnG,OAAO,CAAC,eAAe;IAUvB;;;;OAIG;IACH,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,UAAU,EACd,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC5B,SAAS,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;QACxC,oEAAoE;QACpE,WAAW,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;QAC5C,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QAC/C,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;QACvE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC/B,UAAU,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;QAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAChC,8FAA8F;QAC9F,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC7B,GACA,IAAI,CAwBN;IAED;;;;;OAKG;IACH,cAAc,CACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,gBAAgB,CAAC;QAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,SAAS,CAAC,EAAE,eAAe,CAAC;QAC5B,WAAW,CAAC,EAAE,iBAAiB,CAAC;QAChC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACnC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,GACA,IAAI,CAoBN;IAED;;;;;;;;OAQG;YACW,wBAAwB;IAYtC;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAEvC;IAED;oCACgC;IAChC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2D;IAE7F;;;;;;;;;OASG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;;;;;OAMG;IACH,cAAc,IAAI,IAAI,CAErB;IAED,sEAAsE;IACtE,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI,CAG9C;IAED;;;;;OAKG;IACH,GAAG,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,IAAI,CAM5C;IAED;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAarB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAGtD;IAED;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAGvD;IAED,OAAO,CAAC,UAAU;IAUlB;0FACsF;IACtF,OAAO,CAAC,IAAI;IAYZ;wGACoG;IACpG,OAAO,CAAC,OAAO;IAUT,KAAK,CAAC,CAAC,SAAS,aAAa,EACjC,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EACzB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,SAAS,CAAC,CAAC;IAChB,KAAK,CAAC,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,SAAS,CAAC,CAAC;IAatB;;;;;;OAMG;YACW,SAAS;IAyGvB;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,UAAU;IAmClB,mGAAmG;IACnG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAEjD;IAED;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAEhD;IAED;;;;;OAKG;IACH,cAAc,CACZ,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,aAAa,EACpB,IAAI,CAAC,EAAE,oBAAoB,GAC1B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAK7B;IAED,yGAAyG;IACzG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAExD;IAED;;;;;OAKG;IACH;;;;;;;OAOG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,CAG9D;IAED;;;OAGG;IACG,YAAY,CAAC,GAAG,GAAE,MAAqB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAuDxE;IAED;;;;;OAKG;IACH,OAAO,CACL,QAAQ,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClF,MAAM,IAAI,CAGZ;IAED;;;;;;;;;;OAUG;IACG,cAAc,CAAC,GAAG,GAAE,MAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDhE;IAEK,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW9C;IAED;;;;;OAKG;YACW,uBAAuB;IASrC;;;;;;;;;;;;;;;;OAgBG;IACG,SAAS,CACb,KAAK,EAAE,QAAQ,EACf,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GACtE,OAAO,CAAC,MAAM,CAAC,CA8CjB;IAED;;;OAGG;IACH,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAClD,OAAO,CAAC,MAAM,CAAC,CAEjB;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAsC9C;IAED;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAevB,qEAAqE;IACrE,OAAO,CAAC,KAAK;IAMb;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAMnB;;;;;;;;;;;;;;;;;;OAkBG;IACG,KAAK,CAAC,SAAS,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB7C;IAED;;;OAGG;YACW,oBAAoB;IAclC;;;;OAIG;IACG,aAAa,CAAC,GAAG,GAAE,MAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD7D;IAED;;;OAGG;IACG,iBAAiB,CAAC,KAAK,GAAE,MAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAkE1E;IAED;;;;;OAKG;YACW,aAAa;IAgC3B;;;;;;OAMG;IACG,eAAe,CAAC,KAAK,GAAE,MAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAKxE;IAED;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAGrD;IAED;;;;;;OAMG;YACW,cAAc;IAiB5B;;;;;;OAMG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CA6E3E;IAED;;;;;;;;;OASG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,SAAS,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CA8B7F;IAED;;;;OAIG;IACG,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAQnC;IAED;;;;;OAKG;IACG,UAAU,CAAC,KAAK,GAAE,MAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAKnE;IAED;;;;;;;;;;OAUG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAoD/F;IAED;;;OAGG;YACW,YAAY;IAiC1B;;;OAGG;IACH;;;;;;;;;;;;;;;;;;OAkBG;IACG,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GACvC,OAAO,CAAC,MAAM,CAAC,CAsDjB;IAED;;;;OAIG;YACW,aAAa;IAkB3B;;;;;;;;;;;OAWG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAmBvE;IAED;;;;;;;OAOG;IACG,eAAe,CACnB,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,EAC5C,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAM5B;IAED;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAK1F;IAED,6FAA6F;IACvF,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAEpF;IAED;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA6BpB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CA+DtF;IAED;;;;;;;;OAQG;IACG,WAAW,CACf,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,EACvC,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9B,OAAO,CAAC,SAAS,EAAE,CAAC,CAQtB;IAED;;;;;OAKG;YACW,cAAc;IAS5B;;;;;;;;;;;OAWG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyB3D;IAED;;;;;;;OAOG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAEzD;IAED;;;;OAIG;IACG,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAOzE;IAED;;;yGAGqG;IACrG,WAAW,CAAC,KAAK,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAM1C;IAED;;;;gEAI4D;IACtD,YAAY,CAAC,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAM/D;IAED;;;;;;;;OAQG;YACW,gBAAgB;IAsD9B;;;;;;OAMG;YACW,SAAS;IA4BvB,oGAAoG;YACtF,YAAY;IA8B1B,oGAAoG;YACtF,QAAQ;YA8BR,OAAO;IA0DrB;;;;;OAKG;IACH;;;;;;OAMG;YACW,SAAS;IAmFvB;;;;;OAKG;YACW,iBAAiB;IAc/B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;YAKT,kBAAkB;IA2FhC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;YACW,eAAe;IA0E7B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAKvB;yFACqF;IACrF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;YACW,cAAc;IAS5B;uGACmG;YACrF,cAAc;IAmC5B,gGAAgG;YAClF,aAAa;IA0C3B;;;;;;yEAMqE;YACvD,aAAa;IAiP3B,6DAA6D;YAC/C,YAAY;IAsM1B;;;;;;;;;;;;;OAaG;YACW,eAAe;IAqE7B;;;;;;;;;;;;OAYG;YACW,oBAAoB;IAuElC;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IA6EhC;;wDAEoD;IACpD,OAAO,CAAC,UAAU;IAqDlB;;;;OAIG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAKvD;IAED;;;;OAIG;IACG,QAAQ,CAAC,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAcxF;IAED;;;;OAIG;IACH,uBAAuB,CAAC,IAAI,EAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,GAC9B,IAAI,CAEN;IAED;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAc7E;IAMD;;;0FAGsF;YACxE,kBAAkB;IAUhC;;;;;;OAMG;YACW,SAAS;IASvB;;;6EAGyE;YAC3D,cAAc;IAK5B;;;;;;;;OAQG;YACW,WAAW;IA2BzB;;qGAEiG;YACnF,cAAc;YAiBd,UAAU;IAuMxB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;;;;;;;;;;;;;;;;;;;OAoBG;YACW,oBAAoB;IAclC;;;;;OAKG;YACW,sBAAsB;IA2EpC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;;;;;OAMG;YACW,gBAAgB;IAO9B,mGAAmG;YACrF,kBAAkB;IAwDhC,+FAA+F;YACjF,0BAA0B;IA0GxC,gGAAgG;YAClF,mBAAmB;IAgCjC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;CAkD3B;AAED,8EAA8E;AAC9E,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC3C,YAAY,SAAS,CAAC,EAAE,SAAS,EAIhC;CACF"}
@@ -1,17 +1,20 @@
1
1
  import { InMemoryAdmissionBackend } from './admission.js';
2
2
  import { backoffDelay, MAX_BACKOFF_MS } from './backoff.js';
3
3
  import { instantCheckpoint, lostStepEvent, stepCheckpoint } from './checkpoints.js';
4
+ import { assertConcurrency, concurrencyTag, resolveConcurrency, } from './concurrency.js';
4
5
  import { controlPlaneDescriptor, planDispatch, WorkflowBlocked, } from './dispatch-routing.js';
5
6
  import { parseDuration } from './duration.js';
6
7
  import { Entities } from './entities.js';
7
8
  import { ContinueAsNew, NonDeterminismError, RemoteStepTimeout, WorkflowSuspended, } from './errors.js';
8
9
  import { EventAccumulators } from './event-accumulators.js';
9
10
  import { eventMatches, eventMatchOf, eventPrefix } from './events.js';
11
+ import { isNonEmptyRunScope, TERMINAL_RUN_STATUSES } from './interfaces.js';
10
12
  import { asHeartbeat } from './observability-scope.js';
11
13
  import { breakpointToken, stepId } from './protocol.js';
12
14
  import { RemoteWorkflowExecutor } from './remote-workflow-executor.js';
13
15
  import { scanRunValueFacets } from './run-value-facets.js';
14
16
  import { scheduleWindow } from './scheduler.js';
17
+ import { ScheduleClient } from './schedules.js';
15
18
  import { SingletonGate } from './singleton-gate.js';
16
19
  import { sanitizeQueueToken, tenantGroup } from './tenant-group.js';
17
20
  import { TransportPool } from './transport-pool.js';
@@ -112,6 +115,14 @@ export class WorkflowEngine {
112
115
  /** Worker-pool partition stamped on created runs and used to scope the poll/resume paths.
113
116
  * `undefined` is the OPERATOR: it scopes nothing and belongs to every namespace. */
114
117
  namespace;
118
+ /**
119
+ * Persisted, runtime-managed schedules: create/upsert/pause/resume/delete/list/trigger them, and
120
+ * `tick()` fires the due ones (the worker tick does it when `persistedSchedules` is on). Needs a
121
+ * store that persists schedules — the Lucid and in-memory stores do. See {@link ScheduleClient}.
122
+ */
123
+ schedules;
124
+ /** Whether the worker tick fires {@link schedules} (the `persistedSchedules` option). */
125
+ persistedSchedulesEnabled;
115
126
  leaseMs;
116
127
  maxRecoveryAttempts;
117
128
  reconcileMs;
@@ -125,6 +136,7 @@ export class WorkflowEngine {
125
136
  compensationRetries;
126
137
  compensationTimeoutMs;
127
138
  retention;
139
+ retentionPolicies;
128
140
  // -Infinity so the FIRST sweep always runs (a fake/test clock may start near 0).
129
141
  #lastRetentionSweepAt = Number.NEGATIVE_INFINITY;
130
142
  /** Archival hooks run (awaited, in order) before a retention eviction deletes a run. */
@@ -263,6 +275,12 @@ export class WorkflowEngine {
263
275
  this.compensationRetries = Math.max(1, deps.compensationRetries ?? 1);
264
276
  this.compensationTimeoutMs = Math.max(1_000, deps.compensationTimeoutMs ?? 300_000);
265
277
  this.retention = deps.retention;
278
+ this.retentionPolicies = deps.retentionPolicies ?? [];
279
+ this.persistedSchedulesEnabled = deps.persistedSchedules ?? false;
280
+ this.schedules = new ScheduleClient(this.store, {
281
+ start: (workflow, input, runId, opts) => this.start(workflow, input, runId, opts),
282
+ getRun: (runId) => this.store.getRun(runId),
283
+ }, { namespace: this.namespace, clock: this.clock });
266
284
  this.stalledAfterMs = Math.max(60_000, deps.stalledAfterMs ?? 900_000);
267
285
  this.trackStepStart = deps.trackStepStart ?? true;
268
286
  // Default: execute the run on this instance, asynchronously, so `start` never blocks on the body.
@@ -515,6 +533,7 @@ export class WorkflowEngine {
515
533
  tags: opts?.tags,
516
534
  origin: opts?.origin,
517
535
  singleton: opts?.singleton,
536
+ concurrency: opts?.concurrency,
518
537
  executionTimeoutMs: opts?.executionTimeout != null ? parseDuration(opts.executionTimeout) : undefined,
519
538
  validateInput: opts?.validateInput,
520
539
  onEvent: opts?.onEvent,
@@ -547,6 +566,7 @@ export class WorkflowEngine {
547
566
  },
548
567
  tags: opts.tags,
549
568
  singleton: opts.singleton,
569
+ concurrency: opts.concurrency,
550
570
  executionTimeoutMs: opts.executionTimeout != null ? parseDuration(opts.executionTimeout) : undefined,
551
571
  validateInput: opts.validateInput,
552
572
  remote: { group: opts.group, executor: opts.executor },
@@ -756,12 +776,20 @@ export class WorkflowEngine {
756
776
  }
757
777
  return { runId, status: prior.status, output: prior.output, error: prior.error };
758
778
  }
779
+ // Start-time concurrency quota (per-start override, else the workflow's): reject BEFORE creating
780
+ // anything when the key's in-flight runs already reach the limit. See {@link ConcurrencyQuota}.
781
+ const quota = await resolveConcurrency(opts?.concurrency, registered.concurrency, input);
782
+ if (quota)
783
+ await assertConcurrency(this.store, name, quota);
759
784
  const now = new Date();
760
785
  // A singleton workflow stamps a `singleton:<key>` tag so the admission gate (in execute) can find
761
- // the other in-flight runs sharing the key via a tag+status query.
762
- const tags = mergeTags(registered.tags, registered.singleton
763
- ? [...(opts?.tags ?? []), this.singletons.tag(registered.singleton, input)]
764
- : opts?.tags);
786
+ // the other in-flight runs sharing the key via a tag+status query; a quota-bearing run stamps
787
+ // `concurrency:<key>` so the quota can count its siblings the same way.
788
+ const minted = [
789
+ ...(registered.singleton ? [this.singletons.tag(registered.singleton, input)] : []),
790
+ ...(quota ? [concurrencyTag(quota.key)] : []),
791
+ ];
792
+ const tags = mergeTags(registered.tags, minted.length ? [...(opts?.tags ?? []), ...minted] : opts?.tags);
765
793
  // Singleton back-pressure: reject a start that would grow the same-key backlog past
766
794
  // `limit + maxQueueDepth` (no-op when no maxQueueDepth is configured).
767
795
  if (registered.singleton) {
@@ -1006,22 +1034,39 @@ export class WorkflowEngine {
1006
1034
  * parents.
1007
1035
  */
1008
1036
  async sweepRetention(now = this.clock()) {
1009
- if (!this.retention || this.draining)
1037
+ if ((!this.retention && this.retentionPolicies.length === 0) || this.draining)
1010
1038
  return 0;
1011
1039
  if (now - this.#lastRetentionSweepAt < 60_000)
1012
1040
  return 0;
1013
1041
  this.#lastRetentionSweepAt = now;
1014
1042
  let evicted = 0;
1015
- for (const status of ['completed', 'failed', 'cancelled', 'dead']) {
1016
- const maxAgeMs = this.retention[status];
1043
+ const passes = [];
1044
+ for (const status of TERMINAL_RUN_STATUSES) {
1045
+ const maxAgeMs = this.retention?.[status];
1017
1046
  if (maxAgeMs == null || maxAgeMs <= 0)
1018
1047
  continue;
1019
- const candidates = await this.store.listRuns({
1020
- statuses: [status],
1021
- namespace: this.namespace,
1022
- updatedBefore: now - maxAgeMs,
1023
- size: 100,
1048
+ passes.push({ statuses: [status], namespace: this.namespace, updatedBefore: now - maxAgeMs });
1049
+ }
1050
+ for (const policy of this.retentionPolicies) {
1051
+ const statuses = policy.statuses.filter((s) => TERMINAL_RUN_STATUSES.includes(s));
1052
+ if (statuses.length === 0 || !(policy.maxAgeMs > 0))
1053
+ continue;
1054
+ // A namespaced worker only ever prunes its own partition: a scope naming another one is not its
1055
+ // to sweep (the operator, `namespace: undefined`, sweeps every partition).
1056
+ if (this.namespace !== undefined &&
1057
+ policy.scope.namespace !== undefined &&
1058
+ policy.scope.namespace !== this.namespace) {
1059
+ continue;
1060
+ }
1061
+ passes.push({
1062
+ ...policy.scope,
1063
+ namespace: policy.scope.namespace ?? this.namespace,
1064
+ statuses,
1065
+ updatedBefore: now - policy.maxAgeMs,
1024
1066
  });
1067
+ }
1068
+ for (const pass of passes) {
1069
+ const candidates = await this.store.listRuns({ ...pass, size: 100 });
1025
1070
  for (const run of candidates) {
1026
1071
  try {
1027
1072
  if (this.evictListeners.size > 0) {
@@ -1049,10 +1094,16 @@ export class WorkflowEngine {
1049
1094
  deleted += await this.deleteRun(childId);
1050
1095
  }
1051
1096
  await this.store.deleteRun(runId);
1052
- // Sweep this run's token-keyed buffered signals too — they are not run-scoped rows, so the
1053
- // store's deleteRun can't cascade them. Without this every fire-and-forget child that was never
1054
- // joined leaks its buffered `child:<id>` completion FOREVER (one row per spawn), and a raced
1055
- // compensate-cancel can leave a `cancel:<id>` marker behind.
1097
+ await this.sweepRunBufferedSignals(runId);
1098
+ return deleted + 1;
1099
+ }
1100
+ /**
1101
+ * Sweep a deleted run's token-keyed buffered signals — they are not run-scoped rows, so the store's
1102
+ * deleteRun can't cascade them. Without this every fire-and-forget child that was never joined leaks
1103
+ * its buffered `child:<id>` completion FOREVER (one row per spawn), and a raced compensate-cancel
1104
+ * can leave a `cancel:<id>` marker behind.
1105
+ */
1106
+ async sweepRunBufferedSignals(runId) {
1056
1107
  for (const token of [`child:${runId}`, `cancel:${runId}`]) {
1057
1108
  for (;;) {
1058
1109
  const buffered = await this.store.takeBufferedSignal(token).catch(() => null);
@@ -1060,7 +1111,83 @@ export class WorkflowEngine {
1060
1111
  break;
1061
1112
  }
1062
1113
  }
1063
- return deleted + 1;
1114
+ }
1115
+ /**
1116
+ * Hard-delete EVERY run matching `scope` — plus, by default, each one's whole child subtree — in
1117
+ * bounded batches: the "forget this tenant" / "drop this feature's history" operation. Where
1118
+ * {@link deleteRun} removes one tree you know the id of, this drains everything a scope selects
1119
+ * (`{ namespace: 'acme' }`, `{ tag: 'tenant:acme' }`, `{ workflows: [...] }`, attribute predicates…)
1120
+ * through the store API.
1121
+ *
1122
+ * - **Live runs** in the scope are {@link cancel cancelled} first (plain cancel, no saga undo),
1123
+ * which tells any worker holding one to stop, then deleted. `cancelLive: false` leaves live runs
1124
+ * (and live descendants of finished ones) alone and deletes terminal history only.
1125
+ * - **Children** go with their root even when they don't match the scope themselves (children
1126
+ * inherit `namespace`, not `tags`); `children: false` deletes exactly the matching runs.
1127
+ * - Each deletion sweeps the run's token-keyed buffered signals like {@link deleteRun}, and the
1128
+ * {@link onEvict} archival hooks are NOT called (this is an explicit purge, not retention).
1129
+ *
1130
+ * An EMPTY scope is rejected — it would delete every run. Returns how many runs were deleted.
1131
+ */
1132
+ async purgeRuns(scope, opts) {
1133
+ if (!isNonEmptyRunScope(scope)) {
1134
+ throw new Error('purgeRuns: refusing an empty scope (it would delete every run) — pass at least one predicate, e.g. { namespace }');
1135
+ }
1136
+ const size = Math.max(1, opts?.batchSize ?? 500);
1137
+ const cancelLive = opts?.cancelLive ?? true;
1138
+ const withChildren = opts?.children ?? true;
1139
+ const statuses = cancelLive ? undefined : [...TERMINAL_RUN_STATUSES];
1140
+ let deleted = 0;
1141
+ let previous = '';
1142
+ for (;;) {
1143
+ const batch = await this.store.listRuns({ ...scope, statuses, size });
1144
+ if (batch.length === 0)
1145
+ break;
1146
+ const fingerprint = batch.map((r) => r.id).join('\u0000');
1147
+ // Every listed run is deleted below, so the next page is new rows — the same page twice means
1148
+ // the store is not deleting; stop instead of spinning forever.
1149
+ if (fingerprint === previous) {
1150
+ throw new Error('purgeRuns: the store returned the same runs after deleting them');
1151
+ }
1152
+ previous = fingerprint;
1153
+ const known = new Map(batch.map((r) => [r.id, r.status]));
1154
+ const ids = [];
1155
+ const seen = new Set();
1156
+ const visit = async (id) => {
1157
+ if (seen.has(id))
1158
+ return;
1159
+ seen.add(id);
1160
+ if (withChildren)
1161
+ for (const child of await this.getRunChildren(id))
1162
+ await visit(child);
1163
+ ids.push(id); // post-order: children before their parent
1164
+ };
1165
+ for (const run of batch)
1166
+ await visit(run.id);
1167
+ for (const id of ids) {
1168
+ const status = known.has(id) ? known.get(id) : (await this.store.getRun(id))?.status;
1169
+ if (status === undefined)
1170
+ continue; // already gone
1171
+ if (!TERMINAL_RUN_STATUSES.includes(status)) {
1172
+ if (!cancelLive)
1173
+ continue;
1174
+ await this.cancel(id).catch(() => undefined);
1175
+ }
1176
+ await this.store.deleteRun(id);
1177
+ await this.sweepRunBufferedSignals(id);
1178
+ deleted += 1;
1179
+ }
1180
+ if (batch.length < size)
1181
+ break;
1182
+ }
1183
+ return deleted;
1184
+ }
1185
+ /**
1186
+ * {@link purgeRuns} for one namespace — every run (and child) a tenant/partition owns. Children
1187
+ * inherit their parent's namespace, so a namespace purge is complete by construction.
1188
+ */
1189
+ purgeNamespace(namespace, opts) {
1190
+ return this.purgeRuns({ namespace }, opts);
1064
1191
  }
1065
1192
  async resume(runId) {
1066
1193
  const run = await this.store.getRun(runId);
@@ -1277,14 +1404,30 @@ export class WorkflowEngine {
1277
1404
  }
1278
1405
  return (await this.store.listIncompleteRuns(this.namespace)).filter((r) => r.lockedUntil === undefined || r.lockedUntil <= nowMs);
1279
1406
  });
1280
- for (const run of incomplete) {
1407
+ for (const listed of incomplete) {
1281
1408
  // A live worker renews its lease, so an acquirable lease means the run is genuinely orphaned
1282
1409
  // (its worker crashed). Skip the ones still owned.
1283
- const acquired = await this.store.tryLockRun(run.id, this.instanceId, nowMs + this.leaseMs, nowMs);
1410
+ const acquired = await this.store.tryLockRun(listed.id, this.instanceId, nowMs + this.leaseMs, nowMs);
1284
1411
  if (!acquired)
1285
1412
  continue;
1413
+ // Decide on the run as it is NOW that the lease is held, never on the listing. The listing is a
1414
+ // snapshot taken before this loop reached the row, and a live run moves on in between: the turn
1415
+ // that was executing it settles and releases its lease, a fast step result resumes it, it may
1416
+ // even complete. Trusting the listed `running` reads that as a crashed turn — and the code below
1417
+ // counts a recovery attempt (or, past `maxRecoveryAttempts`, writes `dead` over a live or
1418
+ // finished run) and re-enqueues it for a second execution. Only a run that still reads
1419
+ // `running` under the lease is an orphan; release the lease taken just to look at anything else.
1420
+ const run = await this.store.getRun(listed.id);
1421
+ if (run?.status !== 'running') {
1422
+ await this.store.releaseRunLock(listed.id, this.instanceId);
1423
+ continue;
1424
+ }
1286
1425
  // Count the attempt / dead-letter a poison pill past maxRecoveryAttempts.
1287
1426
  const settled = await this.countRecovery(run);
1427
+ // `null`: the run left `running` between the re-read above and the dead-letter write (a
1428
+ // lease-free `cancel()`), so it is not ours to touch — countRecovery already released the lease.
1429
+ if (settled === null)
1430
+ continue;
1288
1431
  if (settled) {
1289
1432
  results.push(settled);
1290
1433
  continue;
@@ -1313,7 +1456,8 @@ export class WorkflowEngine {
1313
1456
  /**
1314
1457
  * Per-recovery bookkeeping (called once the lease is held): count the attempt, or — past
1315
1458
  * `maxRecoveryAttempts` — move a poison pill to the `dead` dead-letter state. Returns a terminal
1316
- * result to skip the resume, or `undefined` to proceed.
1459
+ * result to skip the resume, `null` to skip it silently (the run is no longer `running`), or
1460
+ * `undefined` to proceed.
1317
1461
  */
1318
1462
  async countRecovery(run) {
1319
1463
  const attempts = (run.recoveryAttempts ?? 0) + 1;
@@ -1322,8 +1466,17 @@ export class WorkflowEngine {
1322
1466
  message: `run exceeded maxRecoveryAttempts (${this.maxRecoveryAttempts}) — moved to dead-letter`,
1323
1467
  code: 'max_recovery_attempts',
1324
1468
  };
1325
- await this.store.updateRun(run.id, { status: 'dead', error, updatedAt: new Date() });
1469
+ // Conditional on still-`running`, like the `pending` flip in recoverIncomplete: the lease does
1470
+ // not fence `cancel()`, which writes `cancelled` without it, so a cancel landing after the
1471
+ // caller's re-read must not be overwritten with `dead`.
1472
+ const applied = await this.store.updateRunIf(run.id, ['running'], {
1473
+ status: 'dead',
1474
+ error,
1475
+ updatedAt: new Date(),
1476
+ });
1326
1477
  await this.store.releaseRunLock(run.id, this.instanceId);
1478
+ if (!applied)
1479
+ return null;
1327
1480
  this.emit({
1328
1481
  type: 'run.failed',
1329
1482
  runId: run.id,
@@ -2950,19 +3103,26 @@ export class WorkflowEngine {
2950
3103
  for (const cp of snapshot)
2951
3104
  replay.set(cp.seq, cp);
2952
3105
  const ctx = createWorkflowCtx(this.ctxHostFor(replay, run.namespace), run.id, compensations, run.workflow);
3106
+ // Every settle below is `return await`ed, never a bare `return this.settleRun(...)`: inside
3107
+ // `try … finally` a bare return runs the `finally` — which RELEASES THE LEASE — as soon as the
3108
+ // return expression is evaluated, while the settle's own write is still in flight. A first turn
3109
+ // (the one that flipped `pending` -> `running`) then sits unlocked but still reading `running`,
3110
+ // which is exactly the shape `listOrphanedRuns` returns for a crashed turn: the recovery sweep
3111
+ // counted an attempt (or dead-lettered it), flipped it to `pending` and re-enqueued a second
3112
+ // execution. The lease must outlive the state it protects.
2953
3113
  try {
2954
3114
  // Establish the ambient ctx for the duration of this body turn so context-aware statics
2955
3115
  // (`BaseWorkflow.start`/`dispatch`) reachable from `fn` route through this run's `ctx.child`/
2956
3116
  // `ctx.startChild`. Re-set on every replay turn (each is its own async scope) — correct.
2957
3117
  const output = await workflowAls.run(ctx, () => fn(ctx, run.input));
2958
- return this.settleRun(run, { kind: 'completed', output });
3118
+ return await this.settleRun(run, { kind: 'completed', output });
2959
3119
  }
2960
3120
  catch (err) {
2961
3121
  if (err instanceof ContinueAsNew) {
2962
3122
  // Hand off to a fresh execution with a clean history: persist the next run (`<id>~N`), then
2963
3123
  // complete this one. Zombie fence first — a fenced turn must not fork a continuation either.
2964
3124
  if (this.leaseLostRuns.has(run.id))
2965
- return this.echoCurrentStatus(run.id);
3125
+ return await this.echoCurrentStatus(run.id);
2966
3126
  const nextId = nextContinuationId(run.id);
2967
3127
  // Persist the continuation BEFORE the parent's terminal write — the durable ordering that
2968
3128
  // makes the chain crash-safe. The old order (complete parent, then create the continuation
@@ -2999,7 +3159,7 @@ export class WorkflowEngine {
2999
3159
  // No live worker can run the next dispatch (capability/protocol) — park `blocked` with the
3000
3160
  // structured reason + diagnostics instead of suspending on a timer that would re-drive into the
3001
3161
  // same void. The blocked-recovery poll re-drives it when a capable+compatible worker appears.
3002
- return this.parkBlocked(run, err.plan);
3162
+ return await this.parkBlocked(run, err.plan);
3003
3163
  }
3004
3164
  if (err instanceof WorkflowSuspended) {
3005
3165
  // A compensating cancel resumed this run to reach here: the replay re-registered the saga,
@@ -3069,7 +3229,7 @@ export class WorkflowEngine {
3069
3229
  continue;
3070
3230
  await this.runCompensation(run, comp, i);
3071
3231
  }
3072
- return this.settleRun(run, { kind: 'failed', error });
3232
+ return await this.settleRun(run, { kind: 'failed', error });
3073
3233
  }
3074
3234
  finally {
3075
3235
  // Release the recovery lease once the run reaches a terminal/suspended state, so the
@@ -3528,7 +3688,16 @@ export class WorkflowEngine {
3528
3688
  async callRemote(runId, seq, step, input, queue, transport, replay, admission, runNamespace) {
3529
3689
  // Read the prefix from the per-execution snapshot (avoids the O(N²) replay SELECTs); a seq absent
3530
3690
  // from the snapshot — not yet dispatched, or written after the snapshot — falls back to the store.
3531
- const existing = replay?.get(seq) ?? (await this.store.getCheckpoint(runId, seq));
3691
+ let existing = replay?.get(seq) ?? (await this.store.getCheckpoint(runId, seq));
3692
+ // A `pending` step in the SNAPSHOT may already have its result: the snapshot is taken when this
3693
+ // execution starts, and the result can land any time after. Every branch below that sees
3694
+ // `pending` either suspends on it or WRITES the checkpoint back (`{ ...existing, wakeAt }` stamping
3695
+ // the lost-dispatch lease, or a re-dispatch) — written from a stale row, that overwrites the landed
3696
+ // `completed` result with `pending` and parks the run on a lease an hour out. So a pending step is
3697
+ // re-read from the store before anything acts on it (one read, only at a suspension point).
3698
+ if (existing?.status === 'pending' && replay?.has(seq)) {
3699
+ existing = (await this.store.getCheckpoint(runId, seq)) ?? existing;
3700
+ }
3532
3701
  if (existing && existing.name !== step.name) {
3533
3702
  throw new NonDeterminismError(runId, seq, step.name, existing.name);
3534
3703
  }