openworkflow 0.4.1 → 0.5.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 (193) hide show
  1. package/README.md +53 -48
  2. package/dist/backend-postgres/index.d.ts +44 -0
  3. package/dist/backend-postgres/index.d.ts.map +1 -0
  4. package/dist/backend-postgres/index.js +535 -0
  5. package/dist/backend-postgres/index.js.map +1 -0
  6. package/dist/backend-postgres/postgres.d.ts +42 -0
  7. package/dist/backend-postgres/postgres.d.ts.map +1 -0
  8. package/dist/backend-postgres/postgres.js +234 -0
  9. package/dist/backend-postgres/postgres.js.map +1 -0
  10. package/dist/backend-sqlite/index.d.ts +41 -1
  11. package/dist/backend-sqlite/index.d.ts.map +1 -1
  12. package/dist/backend-sqlite/index.js +654 -1
  13. package/dist/backend-sqlite/index.js.map +1 -1
  14. package/dist/backend-sqlite/sqlite.d.ts +18 -2
  15. package/dist/backend-sqlite/sqlite.d.ts.map +1 -1
  16. package/dist/backend-sqlite/sqlite.js +20 -2
  17. package/dist/backend-sqlite/sqlite.js.map +1 -1
  18. package/dist/{core/backend.d.ts → backend.d.ts} +7 -5
  19. package/dist/backend.d.ts.map +1 -0
  20. package/dist/backend.js.map +1 -0
  21. package/dist/bin/openworkflow.d.ts +3 -0
  22. package/dist/bin/openworkflow.d.ts.map +1 -0
  23. package/dist/bin/openworkflow.js +44 -0
  24. package/dist/bin/openworkflow.js.map +1 -0
  25. package/dist/client.d.ts +141 -0
  26. package/dist/client.d.ts.map +1 -0
  27. package/dist/{sdk/sdk.js → client.js} +44 -71
  28. package/dist/client.js.map +1 -0
  29. package/dist/config.d.ts +27 -21
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +44 -36
  32. package/dist/config.js.map +1 -1
  33. package/dist/core/duration.d.ts +4 -2
  34. package/dist/core/duration.d.ts.map +1 -1
  35. package/dist/core/duration.js +3 -1
  36. package/dist/core/duration.js.map +1 -1
  37. package/dist/core/error.d.ts +14 -0
  38. package/dist/core/error.d.ts.map +1 -0
  39. package/dist/core/error.js +18 -0
  40. package/dist/core/error.js.map +1 -0
  41. package/dist/core/result.d.ts +14 -4
  42. package/dist/core/result.d.ts.map +1 -1
  43. package/dist/core/result.js +10 -0
  44. package/dist/core/result.js.map +1 -1
  45. package/dist/core/retry.d.ts +0 -9
  46. package/dist/core/retry.d.ts.map +1 -1
  47. package/dist/core/retry.js +0 -14
  48. package/dist/core/retry.js.map +1 -1
  49. package/dist/core/step.d.ts +1 -32
  50. package/dist/core/step.d.ts.map +1 -1
  51. package/dist/core/step.js +0 -35
  52. package/dist/core/step.js.map +1 -1
  53. package/dist/core/workflow.d.ts +2 -47
  54. package/dist/core/workflow.d.ts.map +1 -1
  55. package/dist/core/workflow.js +0 -44
  56. package/dist/core/workflow.js.map +1 -1
  57. package/dist/{execution/execution.d.ts → execution.d.ts} +4 -26
  58. package/dist/execution.d.ts.map +1 -0
  59. package/dist/{execution/execution.js → execution.js} +4 -4
  60. package/dist/execution.js.map +1 -0
  61. package/dist/index.d.ts +6 -9
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +4 -4
  64. package/dist/index.js.map +1 -1
  65. package/dist/internal.d.ts +8 -0
  66. package/dist/internal.d.ts.map +1 -0
  67. package/dist/internal.js +5 -0
  68. package/dist/internal.js.map +1 -0
  69. package/dist/pg/backend.d.ts +42 -0
  70. package/dist/pg/backend.d.ts.map +1 -0
  71. package/dist/pg/backend.js +534 -0
  72. package/dist/pg/backend.js.map +1 -0
  73. package/dist/pg/index.d.ts +3 -0
  74. package/dist/pg/index.d.ts.map +1 -0
  75. package/dist/pg/index.js +3 -0
  76. package/dist/pg/index.js.map +1 -0
  77. package/dist/pg/postgres.d.ts +42 -0
  78. package/dist/pg/postgres.d.ts.map +1 -0
  79. package/dist/pg/postgres.js +234 -0
  80. package/dist/pg/postgres.js.map +1 -0
  81. package/dist/pg/scripts/db-migrate.d.ts +2 -0
  82. package/dist/pg/scripts/db-migrate.d.ts.map +1 -0
  83. package/dist/pg/scripts/db-migrate.js +5 -0
  84. package/dist/pg/scripts/db-migrate.js.map +1 -0
  85. package/dist/pg/scripts/db-reset.d.ts +2 -0
  86. package/dist/pg/scripts/db-reset.d.ts.map +1 -0
  87. package/dist/pg/scripts/db-reset.js +6 -0
  88. package/dist/pg/scripts/db-reset.js.map +1 -0
  89. package/dist/pg/scripts/squawk.d.ts +2 -0
  90. package/dist/pg/scripts/squawk.d.ts.map +1 -0
  91. package/dist/pg/scripts/squawk.js +17 -0
  92. package/dist/pg/scripts/squawk.js.map +1 -0
  93. package/dist/pg/vitest.global-setup.d.ts +3 -0
  94. package/dist/pg/vitest.global-setup.d.ts.map +1 -0
  95. package/dist/pg/vitest.global-setup.js +8 -0
  96. package/dist/pg/vitest.global-setup.js.map +1 -0
  97. package/dist/registry.d.ts +27 -0
  98. package/dist/registry.d.ts.map +1 -0
  99. package/dist/registry.js +49 -0
  100. package/dist/registry.js.map +1 -0
  101. package/dist/{backend-sqlite → sqlite}/backend.d.ts +6 -4
  102. package/dist/sqlite/backend.d.ts.map +1 -0
  103. package/dist/{backend-sqlite → sqlite}/backend.js +31 -5
  104. package/dist/sqlite/backend.js.map +1 -0
  105. package/dist/sqlite/index.d.ts +3 -0
  106. package/dist/sqlite/index.d.ts.map +1 -0
  107. package/dist/sqlite/index.js +3 -0
  108. package/dist/sqlite/index.js.map +1 -0
  109. package/dist/sqlite/sqlite.d.ts +61 -0
  110. package/dist/sqlite/sqlite.d.ts.map +1 -0
  111. package/dist/sqlite/sqlite.js +247 -0
  112. package/dist/sqlite/sqlite.js.map +1 -0
  113. package/dist/testing/backend.testsuite.d.ts +20 -0
  114. package/dist/testing/backend.testsuite.d.ts.map +1 -0
  115. package/dist/{core → testing}/backend.testsuite.js +186 -53
  116. package/dist/testing/backend.testsuite.js.map +1 -0
  117. package/dist/testing/index.d.ts +2 -0
  118. package/dist/testing/index.d.ts.map +1 -0
  119. package/dist/testing/index.js +2 -0
  120. package/dist/testing/index.js.map +1 -0
  121. package/dist/tsconfig.tsbuildinfo +1 -1
  122. package/dist/{worker/worker.d.ts → worker.d.ts} +11 -4
  123. package/dist/worker.d.ts.map +1 -0
  124. package/dist/{worker/worker.js → worker.js} +20 -10
  125. package/dist/worker.js.map +1 -0
  126. package/dist/workflow.d.ts +60 -0
  127. package/dist/workflow.d.ts.map +1 -0
  128. package/dist/workflow.js +49 -0
  129. package/dist/workflow.js.map +1 -0
  130. package/package.json +13 -3
  131. package/dist/backend-sqlite/backend.d.ts.map +0 -1
  132. package/dist/backend-sqlite/backend.js.map +0 -1
  133. package/dist/config/config.d.ts +0 -102
  134. package/dist/config/config.d.ts.map +0 -1
  135. package/dist/config/config.js +0 -29
  136. package/dist/config/config.js.map +0 -1
  137. package/dist/config/index.d.ts +0 -3
  138. package/dist/config/index.d.ts.map +0 -1
  139. package/dist/config/index.js +0 -2
  140. package/dist/config/index.js.map +0 -1
  141. package/dist/core/backend-test-suite.d.ts +0 -22
  142. package/dist/core/backend-test-suite.d.ts.map +0 -1
  143. package/dist/core/backend-test-suite.js +0 -960
  144. package/dist/core/backend-test-suite.js.map +0 -1
  145. package/dist/core/backend.d.ts.map +0 -1
  146. package/dist/core/backend.js.map +0 -1
  147. package/dist/core/backend.testsuite.d.ts +0 -21
  148. package/dist/core/backend.testsuite.d.ts.map +0 -1
  149. package/dist/core/backend.testsuite.js.map +0 -1
  150. package/dist/core/duration.test.d.ts +0 -2
  151. package/dist/core/duration.test.d.ts.map +0 -1
  152. package/dist/core/duration.test.js +0 -264
  153. package/dist/core/duration.test.js.map +0 -1
  154. package/dist/core/result.test.d.ts +0 -2
  155. package/dist/core/result.test.d.ts.map +0 -1
  156. package/dist/core/result.test.js +0 -11
  157. package/dist/core/result.test.js.map +0 -1
  158. package/dist/core/retry.test.d.ts +0 -2
  159. package/dist/core/retry.test.d.ts.map +0 -1
  160. package/dist/core/retry.test.js +0 -36
  161. package/dist/core/retry.test.js.map +0 -1
  162. package/dist/core/step.test.d.ts +0 -2
  163. package/dist/core/step.test.d.ts.map +0 -1
  164. package/dist/core/step.test.js +0 -340
  165. package/dist/core/step.test.js.map +0 -1
  166. package/dist/core/workflow.test.d.ts +0 -2
  167. package/dist/core/workflow.test.d.ts.map +0 -1
  168. package/dist/core/workflow.test.js +0 -216
  169. package/dist/core/workflow.test.js.map +0 -1
  170. package/dist/execution/execution.d.ts.map +0 -1
  171. package/dist/execution/execution.js.map +0 -1
  172. package/dist/execution/execution.test.d.ts +0 -2
  173. package/dist/execution/execution.test.d.ts.map +0 -1
  174. package/dist/execution/execution.test.js +0 -382
  175. package/dist/execution/execution.test.js.map +0 -1
  176. package/dist/global.d.ts +0 -62
  177. package/dist/global.d.ts.map +0 -1
  178. package/dist/global.js +0 -78
  179. package/dist/global.js.map +0 -1
  180. package/dist/sdk/sdk.d.ts +0 -182
  181. package/dist/sdk/sdk.d.ts.map +0 -1
  182. package/dist/sdk/sdk.js.map +0 -1
  183. package/dist/sdk/sdk.test.d.ts +0 -2
  184. package/dist/sdk/sdk.test.d.ts.map +0 -1
  185. package/dist/sdk/sdk.test.js +0 -195
  186. package/dist/sdk/sdk.test.js.map +0 -1
  187. package/dist/worker/worker.d.ts.map +0 -1
  188. package/dist/worker/worker.js.map +0 -1
  189. package/dist/worker/worker.test.d.ts +0 -2
  190. package/dist/worker/worker.test.d.ts.map +0 -1
  191. package/dist/worker/worker.test.js +0 -786
  192. package/dist/worker/worker.test.js.map +0 -1
  193. /package/dist/{core/backend.js → backend.js} +0 -0
package/README.md CHANGED
@@ -8,37 +8,13 @@ OpenWorkflow is a TypeScript framework for building durable, resumable workflows
8
8
  that can pause for seconds or months, survive crashes and deploys, and resume
9
9
  exactly where they left off - all without extra servers to manage.
10
10
 
11
- > OpenWorkflow is in active development and moving quickly. Check out the
12
- > [Roadmap](#roadmap) for what’s coming next.
13
-
14
- ## Quick Start
15
-
16
- Prerequisites:
17
-
18
- - Node.js
19
- - PostgreSQL (and/or SQLite)
20
-
21
- ### 1. Install
22
-
23
- ```bash
24
- npm install openworkflow @openworkflow/backend-postgres @openworkflow/backend-sqlite
25
- ```
26
-
27
- You only need to install the backend package(s) for the database you plan to
28
- use.
29
-
30
- ### 2. Define a workflow
11
+ Define a workflow in a few lines:
31
12
 
32
13
  ```ts
33
- import { BackendPostgres } from "@openworkflow/backend-postgres";
34
14
  import { BackendSqlite } from "@openworkflow/backend-sqlite";
35
15
  import { OpenWorkflow } from "openworkflow";
36
16
 
37
- // use Postgres if DATABASE_URL is set, otherwise use SQLite
38
- const backend = process.env["DATABASE_URL"]
39
- ? await BackendPostgres.connect(process.env["DATABASE_URL"])
40
- : BackendSqlite.connect(); // optionally provide SQLite file path
41
-
17
+ const backend = BackendSqlite.connect("openworkflow/backend.db");
42
18
  const ow = new OpenWorkflow({ backend });
43
19
 
44
20
  const sendWelcomeEmail = ow.defineWorkflow(
@@ -67,29 +43,44 @@ const sendWelcomeEmail = ow.defineWorkflow(
67
43
  );
68
44
  ```
69
45
 
70
- ### 3. Start a worker
46
+ > OpenWorkflow is in active development and moving quickly. Check out the
47
+ > [Roadmap](#roadmap) for what’s coming next.
71
48
 
72
- Workers are background processes that execute your workflows. Start one in a
73
- separate process or the same one as your app:
49
+ ## Quick Start
74
50
 
75
- ```ts
76
- const worker = ow.newWorker();
77
- await worker.start();
51
+ Prerequisites:
52
+
53
+ - Node.js
54
+ - PostgreSQL (and/or SQLite)
55
+
56
+ ### 1. Install
57
+
58
+ Install and set up OpenWorkflow with:
59
+
60
+ ```bash
61
+ npx @openworkflow/cli init
78
62
  ```
79
63
 
80
- ### 4. Run workflows from your app
64
+ The CLI will prompt for your backend, installs dependencies, and generates:
65
+ `openworkflow.config.ts`, `openworkflow/hello-world.ts`, `.env`, `.gitignore`,
66
+ and a `worker` script.
81
67
 
82
- Trigger workflows from your web server, API, or any application code:
68
+ ### 2. Start a worker
83
69
 
84
- ```ts
85
- // In your API route handler
86
- app.post("/users/:id/welcome", async (req, res) => {
87
- // Run the workflow async and do not wait for the result
88
- const runHandle = await sendWelcomeEmail.run({ userId: req.params.id });
89
- res.json({ runId: runHandle.workflowRun.id });
90
- });
70
+ ```bash
71
+ npm run worker
72
+ # or
73
+ npx @openworkflow/cli worker start
91
74
  ```
92
75
 
76
+ This runs the worker using `openworkflow.config.ts` and auto-loads workflows
77
+ from the configured directories (default: `openworkflow/`).
78
+
79
+ ### 3. Run workflows from your app
80
+
81
+ Edit the generated workflow file and run it from your application code using the
82
+ OpenWorkflow client APIs (see examples below).
83
+
93
84
  That's it. Your workflow is now durable, resumable, and fault-tolerant.
94
85
 
95
86
  ## Core Concepts
@@ -133,9 +124,24 @@ the email.
133
124
  ### Workers
134
125
 
135
126
  Workers are long-running processes that poll your database for pending workflows
136
- and execute them. You can run multiple workers for high availability and scale.
127
+ and execute them. Run workers via the CLI so workflow discovery stays in sync
128
+ with your `openworkflow.config.ts`:
129
+
130
+ ```bash
131
+ npm run worker
132
+ # or
133
+ npx @openworkflow/cli worker start
134
+ ```
135
+
136
+ Or, for more control, you can write your own workers:
137
137
 
138
138
  ```ts
139
+ import { BackendSqlite } from "@openworkflow/backend-sqlite";
140
+ import { OpenWorkflow } from "openworkflow";
141
+
142
+ const backend = BackendSqlite.connect("openworkflow/backend.db");
143
+ const ow = new OpenWorkflow({ backend });
144
+
139
145
  const worker = ow.newWorker({ concurrency: 20 });
140
146
  await worker.start();
141
147
 
@@ -367,6 +373,7 @@ and Yup.
367
373
  **Live in current `npm` release:**
368
374
 
369
375
  - ✅ PostgreSQL and SQLite backends
376
+ - ✅ CLI (`npx @openworkflow/cli`)
370
377
  - ✅ Worker with concurrency control
371
378
  - ✅ Step memoization & retries
372
379
  - ✅ Graceful shutdown
@@ -377,13 +384,11 @@ and Yup.
377
384
 
378
385
  **Coming Soon:**
379
386
 
380
- > These releases don't yet include a dashboard UI or CLI. For now, you can
381
- > inspect workflow and step state directly in PostgreSQL or SQLite
382
- > (workflow_runs and step_runs tables). A CLI and dashboard are planned for an
383
- > upcoming release to make debugging and monitoring much easier.
387
+ > These releases don't yet include a dashboard UI. For now, you can inspect
388
+ > workflow and step state directly in PostgreSQL or SQLite (workflow_runs and
389
+ > step_attempts tables). A dashboard is planned for an upcoming release to make
390
+ > debugging and monitoring much easier.
384
391
 
385
- - Improved local dev experience (coming in v0.5)
386
- - CLI (coming in v0.5)
387
392
  - Dashboard UI
388
393
  - Idempotency keys
389
394
  - Rollback / compensation functions
@@ -0,0 +1,44 @@
1
+ import type { Backend, CancelWorkflowRunParams, ClaimWorkflowRunParams, CompleteStepAttemptParams, CompleteWorkflowRunParams, CreateStepAttemptParams, CreateWorkflowRunParams, ExtendWorkflowRunLeaseParams, FailStepAttemptParams, FailWorkflowRunParams, GetStepAttemptParams, GetWorkflowRunParams, ListStepAttemptsParams, ListWorkflowRunsParams, PaginatedResponse, SleepWorkflowRunParams } from "../backend.js";
2
+ import type { StepAttempt } from "../core/step.js";
3
+ import type { WorkflowRun } from "../core/workflow.js";
4
+ interface BackendPostgresOptions {
5
+ namespaceId?: string;
6
+ runMigrations?: boolean;
7
+ }
8
+ /**
9
+ * Manages a connection to a Postgres database for workflow operations.
10
+ */
11
+ export declare class BackendPostgres implements Backend {
12
+ private pg;
13
+ private namespaceId;
14
+ private constructor();
15
+ /**
16
+ * Create and initialize a new BackendPostgres instance. This will
17
+ * automatically run migrations on startup unless `runMigrations` is set to
18
+ * false.
19
+ * @param url - Postgres connection URL
20
+ * @param options - Backend options
21
+ * @returns A connected backend instance
22
+ */
23
+ static connect(url: string, options?: BackendPostgresOptions): Promise<BackendPostgres>;
24
+ stop(): Promise<void>;
25
+ createWorkflowRun(params: CreateWorkflowRunParams): Promise<WorkflowRun>;
26
+ getWorkflowRun(params: GetWorkflowRunParams): Promise<WorkflowRun | null>;
27
+ listWorkflowRuns(params: ListWorkflowRunsParams): Promise<PaginatedResponse<WorkflowRun>>;
28
+ private buildListWorkflowRunsWhere;
29
+ claimWorkflowRun(params: ClaimWorkflowRunParams): Promise<WorkflowRun | null>;
30
+ extendWorkflowRunLease(params: ExtendWorkflowRunLeaseParams): Promise<WorkflowRun>;
31
+ sleepWorkflowRun(params: SleepWorkflowRunParams): Promise<WorkflowRun>;
32
+ completeWorkflowRun(params: CompleteWorkflowRunParams): Promise<WorkflowRun>;
33
+ failWorkflowRun(params: FailWorkflowRunParams): Promise<WorkflowRun>;
34
+ cancelWorkflowRun(params: CancelWorkflowRunParams): Promise<WorkflowRun>;
35
+ createStepAttempt(params: CreateStepAttemptParams): Promise<StepAttempt>;
36
+ getStepAttempt(params: GetStepAttemptParams): Promise<StepAttempt | null>;
37
+ listStepAttempts(params: ListStepAttemptsParams): Promise<PaginatedResponse<StepAttempt>>;
38
+ private buildListStepAttemptsWhere;
39
+ private processPaginationResults;
40
+ completeStepAttempt(params: CompleteStepAttemptParams): Promise<StepAttempt>;
41
+ failStepAttempt(params: FailStepAttemptParams): Promise<StepAttempt>;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend-postgres/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAWvD,UAAU,sBAAsB;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,OAAO;IAC7C,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO;IAKP;;;;;;;OAOG;WACU,OAAO,CAClB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,eAAe,CAAC;IAiBrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,iBAAiB,CACrB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,WAAW,CAAC;IA0CjB,cAAc,CAClB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAYxB,gBAAgB,CACpB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IA2B1C,OAAO,CAAC,0BAA0B;IA0B5B,gBAAgB,CACpB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAmDxB,sBAAsB,CAC1B,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,WAAW,CAAC;IAkBjB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBtE,mBAAmB,CACvB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,WAAW,CAAC;IAuBjB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;IAgEpE,iBAAiB,CACrB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,WAAW,CAAC;IA2CjB,iBAAiB,CACrB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,WAAW,CAAC;IAoCjB,cAAc,CAClB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAWxB,gBAAgB,CACpB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IA2B1C,OAAO,CAAC,0BAA0B;IA6BlC,OAAO,CAAC,wBAAwB;IAyC1B,mBAAmB,CACvB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,WAAW,CAAC;IA0BjB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;CAyB3E"}