effect-jobs 0.1.0-alpha.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 (157) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +22 -0
  3. package/README.md +142 -0
  4. package/dist/Job.d.ts +33 -0
  5. package/dist/Job.d.ts.map +1 -0
  6. package/dist/Job.js +66 -0
  7. package/dist/Job.js.map +1 -0
  8. package/dist/JobConsumer.d.ts +34 -0
  9. package/dist/JobConsumer.d.ts.map +1 -0
  10. package/dist/JobConsumer.js +28 -0
  11. package/dist/JobConsumer.js.map +1 -0
  12. package/dist/JobContract.d.ts +128 -0
  13. package/dist/JobContract.d.ts.map +1 -0
  14. package/dist/JobContract.js +15 -0
  15. package/dist/JobContract.js.map +1 -0
  16. package/dist/JobFailure.d.ts +51 -0
  17. package/dist/JobFailure.d.ts.map +1 -0
  18. package/dist/JobFailure.js +34 -0
  19. package/dist/JobFailure.js.map +1 -0
  20. package/dist/JobId.d.ts +5 -0
  21. package/dist/JobId.d.ts.map +1 -0
  22. package/dist/JobId.js +4 -0
  23. package/dist/JobId.js.map +1 -0
  24. package/dist/JobIdentity.d.ts +54 -0
  25. package/dist/JobIdentity.d.ts.map +1 -0
  26. package/dist/JobIdentity.js +82 -0
  27. package/dist/JobIdentity.js.map +1 -0
  28. package/dist/JobLifecycle.d.ts +173 -0
  29. package/dist/JobLifecycle.d.ts.map +1 -0
  30. package/dist/JobLifecycle.js +234 -0
  31. package/dist/JobLifecycle.js.map +1 -0
  32. package/dist/JobPayload.d.ts +18 -0
  33. package/dist/JobPayload.d.ts.map +1 -0
  34. package/dist/JobPayload.js +10 -0
  35. package/dist/JobPayload.js.map +1 -0
  36. package/dist/JobPayloadCodec.d.ts +14 -0
  37. package/dist/JobPayloadCodec.d.ts.map +1 -0
  38. package/dist/JobPayloadCodec.js +78 -0
  39. package/dist/JobPayloadCodec.js.map +1 -0
  40. package/dist/JobPolicy.d.ts +50 -0
  41. package/dist/JobPolicy.d.ts.map +1 -0
  42. package/dist/JobPolicy.js +85 -0
  43. package/dist/JobPolicy.js.map +1 -0
  44. package/dist/JobProducer.d.ts +14 -0
  45. package/dist/JobProducer.d.ts.map +1 -0
  46. package/dist/JobProducer.js +23 -0
  47. package/dist/JobProducer.js.map +1 -0
  48. package/dist/JobQueue.d.ts +16 -0
  49. package/dist/JobQueue.d.ts.map +1 -0
  50. package/dist/JobQueue.js +16 -0
  51. package/dist/JobQueue.js.map +1 -0
  52. package/dist/JobRegistry.d.ts +37 -0
  53. package/dist/JobRegistry.d.ts.map +1 -0
  54. package/dist/JobRegistry.js +47 -0
  55. package/dist/JobRegistry.js.map +1 -0
  56. package/dist/JobStore.d.ts +348 -0
  57. package/dist/JobStore.d.ts.map +1 -0
  58. package/dist/JobStore.js +19 -0
  59. package/dist/JobStore.js.map +1 -0
  60. package/dist/JobTelemetry.d.ts +7 -0
  61. package/dist/JobTelemetry.d.ts.map +1 -0
  62. package/dist/JobTelemetry.js +61 -0
  63. package/dist/JobTelemetry.js.map +1 -0
  64. package/dist/JobTransaction.d.ts +24 -0
  65. package/dist/JobTransaction.d.ts.map +1 -0
  66. package/dist/JobTransaction.js +7 -0
  67. package/dist/JobTransaction.js.map +1 -0
  68. package/dist/JobWorker.d.ts +24 -0
  69. package/dist/JobWorker.d.ts.map +1 -0
  70. package/dist/JobWorker.js +155 -0
  71. package/dist/JobWorker.js.map +1 -0
  72. package/dist/JobWorkerRuntime.d.ts +18 -0
  73. package/dist/JobWorkerRuntime.d.ts.map +1 -0
  74. package/dist/JobWorkerRuntime.js +5 -0
  75. package/dist/JobWorkerRuntime.js.map +1 -0
  76. package/dist/PollingJobWorker.d.ts +9 -0
  77. package/dist/PollingJobWorker.d.ts.map +1 -0
  78. package/dist/PollingJobWorker.js +54 -0
  79. package/dist/PollingJobWorker.js.map +1 -0
  80. package/dist/PostgreSqlDrizzleSchema.d.ts +432 -0
  81. package/dist/PostgreSqlDrizzleSchema.d.ts.map +1 -0
  82. package/dist/PostgreSqlDrizzleSchema.js +72 -0
  83. package/dist/PostgreSqlDrizzleSchema.js.map +1 -0
  84. package/dist/PostgreSqlJobs.d.ts +25 -0
  85. package/dist/PostgreSqlJobs.d.ts.map +1 -0
  86. package/dist/PostgreSqlJobs.js +38 -0
  87. package/dist/PostgreSqlJobs.js.map +1 -0
  88. package/dist/PostgreSqlSchema.d.ts +30 -0
  89. package/dist/PostgreSqlSchema.d.ts.map +1 -0
  90. package/dist/PostgreSqlSchema.js +63 -0
  91. package/dist/PostgreSqlSchema.js.map +1 -0
  92. package/dist/PostgreSqlTransaction.d.ts +42 -0
  93. package/dist/PostgreSqlTransaction.d.ts.map +1 -0
  94. package/dist/PostgreSqlTransaction.js +9 -0
  95. package/dist/PostgreSqlTransaction.js.map +1 -0
  96. package/dist/index.d.ts +7 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +7 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/internal/JobTransaction.d.ts +16 -0
  101. package/dist/internal/JobTransaction.d.ts.map +1 -0
  102. package/dist/internal/JobTransaction.js +21 -0
  103. package/dist/internal/JobTransaction.js.map +1 -0
  104. package/dist/internal/codec/CanonicalJson.d.ts +9 -0
  105. package/dist/internal/codec/CanonicalJson.d.ts.map +1 -0
  106. package/dist/internal/codec/CanonicalJson.js +184 -0
  107. package/dist/internal/codec/CanonicalJson.js.map +1 -0
  108. package/dist/internal/codec/ProtectedProjection.d.ts +12 -0
  109. package/dist/internal/codec/ProtectedProjection.d.ts.map +1 -0
  110. package/dist/internal/codec/ProtectedProjection.js +121 -0
  111. package/dist/internal/codec/ProtectedProjection.js.map +1 -0
  112. package/dist/internal/lifecycle/Artifacts.d.ts +6 -0
  113. package/dist/internal/lifecycle/Artifacts.d.ts.map +1 -0
  114. package/dist/internal/lifecycle/Artifacts.js +49 -0
  115. package/dist/internal/lifecycle/Artifacts.js.map +1 -0
  116. package/dist/internal/lifecycle/Reconciliation.d.ts +82 -0
  117. package/dist/internal/lifecycle/Reconciliation.d.ts.map +1 -0
  118. package/dist/internal/lifecycle/Reconciliation.js +98 -0
  119. package/dist/internal/lifecycle/Reconciliation.js.map +1 -0
  120. package/dist/internal/postgresql/Producer.d.ts +14 -0
  121. package/dist/internal/postgresql/Producer.d.ts.map +1 -0
  122. package/dist/internal/postgresql/Producer.js +55 -0
  123. package/dist/internal/postgresql/Producer.js.map +1 -0
  124. package/dist/internal/postgresql/Readiness.d.ts +5 -0
  125. package/dist/internal/postgresql/Readiness.d.ts.map +1 -0
  126. package/dist/internal/postgresql/Readiness.js +53 -0
  127. package/dist/internal/postgresql/Readiness.js.map +1 -0
  128. package/dist/internal/postgresql/Rows.d.ts +45 -0
  129. package/dist/internal/postgresql/Rows.d.ts.map +1 -0
  130. package/dist/internal/postgresql/Rows.js +75 -0
  131. package/dist/internal/postgresql/Rows.js.map +1 -0
  132. package/dist/internal/postgresql/Store.d.ts +5 -0
  133. package/dist/internal/postgresql/Store.d.ts.map +1 -0
  134. package/dist/internal/postgresql/Store.js +211 -0
  135. package/dist/internal/postgresql/Store.js.map +1 -0
  136. package/dist/internal/worker/Capability.d.ts +106 -0
  137. package/dist/internal/worker/Capability.d.ts.map +1 -0
  138. package/dist/internal/worker/Capability.js +11 -0
  139. package/dist/internal/worker/Capability.js.map +1 -0
  140. package/dist/internal/worker/Drain.d.ts +22 -0
  141. package/dist/internal/worker/Drain.d.ts.map +1 -0
  142. package/dist/internal/worker/Drain.js +59 -0
  143. package/dist/internal/worker/Drain.js.map +1 -0
  144. package/dist/internal/worker/Execution.d.ts +7 -0
  145. package/dist/internal/worker/Execution.d.ts.map +1 -0
  146. package/dist/internal/worker/Execution.js +125 -0
  147. package/dist/internal/worker/Execution.js.map +1 -0
  148. package/dist/internal/worker/Results.d.ts +108 -0
  149. package/dist/internal/worker/Results.d.ts.map +1 -0
  150. package/dist/internal/worker/Results.js +3 -0
  151. package/dist/internal/worker/Results.js.map +1 -0
  152. package/package.json +169 -0
  153. package/specs/architecture-decisions.md +841 -0
  154. package/specs/core-contract.md +323 -0
  155. package/specs/drizzle-compatibility.md +167 -0
  156. package/specs/postgresql-backend.md +291 -0
  157. package/specs/release-qualification.md +107 -0
@@ -0,0 +1,432 @@
1
+ /** Optional migration-only entrypoint. Never imported by core or the PostgreSQL runtime. */
2
+ import { Buffer } from "node:buffer";
3
+ import { type TableOptions } from "./PostgreSqlSchema.js";
4
+ /** Fixed column contract, configurable namespace/relation names, application-owned migrations. */
5
+ export declare const makeJobTables: (options?: TableOptions) => Readonly<{
6
+ mapping: import("./PostgreSqlSchema.js").Tables;
7
+ jobs: import("drizzle-orm/pg-core").PgTableWithColumns<{
8
+ name: string;
9
+ schema: string | undefined;
10
+ columns: {
11
+ id: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
12
+ name: string;
13
+ tableName: string;
14
+ dataType: "string";
15
+ data: string;
16
+ driverParam: string;
17
+ notNull: true;
18
+ hasDefault: false;
19
+ isPrimaryKey: false;
20
+ isAutoincrement: false;
21
+ hasRuntimeDefault: false;
22
+ enumValues: undefined;
23
+ identity: undefined;
24
+ generated: undefined;
25
+ }>;
26
+ operation: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
27
+ name: string;
28
+ tableName: string;
29
+ dataType: "string";
30
+ data: string;
31
+ driverParam: string;
32
+ notNull: true;
33
+ hasDefault: false;
34
+ isPrimaryKey: false;
35
+ isAutoincrement: false;
36
+ hasRuntimeDefault: false;
37
+ enumValues: undefined;
38
+ identity: undefined;
39
+ generated: undefined;
40
+ }>;
41
+ operationId: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
42
+ name: string;
43
+ tableName: string;
44
+ dataType: "string";
45
+ data: string;
46
+ driverParam: string;
47
+ notNull: true;
48
+ hasDefault: false;
49
+ isPrimaryKey: false;
50
+ isAutoincrement: false;
51
+ hasRuntimeDefault: false;
52
+ enumValues: undefined;
53
+ identity: undefined;
54
+ generated: undefined;
55
+ }>;
56
+ slot: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
57
+ name: string;
58
+ tableName: string;
59
+ dataType: "string";
60
+ data: string;
61
+ driverParam: string;
62
+ notNull: true;
63
+ hasDefault: false;
64
+ isPrimaryKey: false;
65
+ isAutoincrement: false;
66
+ hasRuntimeDefault: false;
67
+ enumValues: undefined;
68
+ identity: undefined;
69
+ generated: undefined;
70
+ }>;
71
+ queue: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
72
+ name: string;
73
+ tableName: string;
74
+ dataType: "string";
75
+ data: string;
76
+ driverParam: string;
77
+ notNull: true;
78
+ hasDefault: false;
79
+ isPrimaryKey: false;
80
+ isAutoincrement: false;
81
+ hasRuntimeDefault: false;
82
+ enumValues: undefined;
83
+ identity: undefined;
84
+ generated: undefined;
85
+ }>;
86
+ kind: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
87
+ name: string;
88
+ tableName: string;
89
+ dataType: "string";
90
+ data: string;
91
+ driverParam: string;
92
+ notNull: true;
93
+ hasDefault: false;
94
+ isPrimaryKey: false;
95
+ isAutoincrement: false;
96
+ hasRuntimeDefault: false;
97
+ enumValues: undefined;
98
+ identity: undefined;
99
+ generated: undefined;
100
+ }>;
101
+ version: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>, {
102
+ name: string;
103
+ tableName: string;
104
+ dataType: "number int32";
105
+ data: number;
106
+ driverParam: string | number;
107
+ notNull: true;
108
+ hasDefault: false;
109
+ isPrimaryKey: false;
110
+ isAutoincrement: false;
111
+ hasRuntimeDefault: false;
112
+ enumValues: undefined;
113
+ identity: undefined;
114
+ generated: undefined;
115
+ }>;
116
+ policy: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").Set$Type<import("drizzle-orm/pg-core").PgJsonbBuilder, {
117
+ readonly leaseDurationMillis: number;
118
+ readonly attemptTimeoutMillis: number;
119
+ readonly maxAttempts: number;
120
+ readonly maxStalledCount: number;
121
+ readonly retrySchedule: {
122
+ readonly _tag: "FixedDelayV1";
123
+ readonly delayMillis: number;
124
+ };
125
+ readonly completedRetention: {
126
+ readonly _tag: "Forever";
127
+ } | {
128
+ readonly _tag: "Duration";
129
+ readonly millis: number;
130
+ };
131
+ readonly deadRetention: {
132
+ readonly _tag: "Forever";
133
+ } | {
134
+ readonly _tag: "Duration";
135
+ readonly millis: number;
136
+ };
137
+ }>>, {
138
+ name: string;
139
+ tableName: string;
140
+ dataType: "object json";
141
+ data: {
142
+ readonly leaseDurationMillis: number;
143
+ readonly attemptTimeoutMillis: number;
144
+ readonly maxAttempts: number;
145
+ readonly maxStalledCount: number;
146
+ readonly retrySchedule: {
147
+ readonly _tag: "FixedDelayV1";
148
+ readonly delayMillis: number;
149
+ };
150
+ readonly completedRetention: {
151
+ readonly _tag: "Forever";
152
+ } | {
153
+ readonly _tag: "Duration";
154
+ readonly millis: number;
155
+ };
156
+ readonly deadRetention: {
157
+ readonly _tag: "Forever";
158
+ } | {
159
+ readonly _tag: "Duration";
160
+ readonly millis: number;
161
+ };
162
+ };
163
+ driverParam: unknown;
164
+ notNull: true;
165
+ hasDefault: false;
166
+ isPrimaryKey: false;
167
+ isAutoincrement: false;
168
+ hasRuntimeDefault: false;
169
+ enumValues: undefined;
170
+ identity: undefined;
171
+ generated: undefined;
172
+ }>;
173
+ initialAvailableAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgBigInt53Builder, {
174
+ name: string;
175
+ tableName: string;
176
+ dataType: "number int53";
177
+ data: number;
178
+ driverParam: string | number;
179
+ notNull: false;
180
+ hasDefault: false;
181
+ isPrimaryKey: false;
182
+ isAutoincrement: false;
183
+ hasRuntimeDefault: false;
184
+ enumValues: undefined;
185
+ identity: undefined;
186
+ generated: undefined;
187
+ }>;
188
+ state: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
189
+ name: string;
190
+ tableName: string;
191
+ dataType: "string";
192
+ data: string;
193
+ driverParam: string;
194
+ notNull: true;
195
+ hasDefault: false;
196
+ isPrimaryKey: false;
197
+ isAutoincrement: false;
198
+ hasRuntimeDefault: false;
199
+ enumValues: undefined;
200
+ identity: undefined;
201
+ generated: undefined;
202
+ }>;
203
+ availableAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBigInt53Builder>, {
204
+ name: string;
205
+ tableName: string;
206
+ dataType: "number int53";
207
+ data: number;
208
+ driverParam: string | number;
209
+ notNull: true;
210
+ hasDefault: false;
211
+ isPrimaryKey: false;
212
+ isAutoincrement: false;
213
+ hasRuntimeDefault: false;
214
+ enumValues: undefined;
215
+ identity: undefined;
216
+ generated: undefined;
217
+ }>;
218
+ updatedAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBigInt53Builder>, {
219
+ name: string;
220
+ tableName: string;
221
+ dataType: "number int53";
222
+ data: number;
223
+ driverParam: string | number;
224
+ notNull: true;
225
+ hasDefault: false;
226
+ isPrimaryKey: false;
227
+ isAutoincrement: false;
228
+ hasRuntimeDefault: false;
229
+ enumValues: undefined;
230
+ identity: undefined;
231
+ generated: undefined;
232
+ }>;
233
+ attemptsMade: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBigInt53Builder>>, {
234
+ name: string;
235
+ tableName: string;
236
+ dataType: "number int53";
237
+ data: number;
238
+ driverParam: string | number;
239
+ notNull: true;
240
+ hasDefault: true;
241
+ isPrimaryKey: false;
242
+ isAutoincrement: false;
243
+ hasRuntimeDefault: false;
244
+ enumValues: undefined;
245
+ identity: undefined;
246
+ generated: undefined;
247
+ }>;
248
+ stalledCount: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBigInt53Builder>>, {
249
+ name: string;
250
+ tableName: string;
251
+ dataType: "number int53";
252
+ data: number;
253
+ driverParam: string | number;
254
+ notNull: true;
255
+ hasDefault: true;
256
+ isPrimaryKey: false;
257
+ isAutoincrement: false;
258
+ hasRuntimeDefault: false;
259
+ enumValues: undefined;
260
+ identity: undefined;
261
+ generated: undefined;
262
+ }>;
263
+ lifecycleVersion: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetHasDefault<import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgBigInt53Builder>>, {
264
+ name: string;
265
+ tableName: string;
266
+ dataType: "number int53";
267
+ data: number;
268
+ driverParam: string | number;
269
+ notNull: true;
270
+ hasDefault: true;
271
+ isPrimaryKey: false;
272
+ isAutoincrement: false;
273
+ hasRuntimeDefault: false;
274
+ enumValues: undefined;
275
+ identity: undefined;
276
+ generated: undefined;
277
+ }>;
278
+ leaseToken: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, {
279
+ name: string;
280
+ tableName: string;
281
+ dataType: "string";
282
+ data: string;
283
+ driverParam: string;
284
+ notNull: false;
285
+ hasDefault: false;
286
+ isPrimaryKey: false;
287
+ isAutoincrement: false;
288
+ hasRuntimeDefault: false;
289
+ enumValues: undefined;
290
+ identity: undefined;
291
+ generated: undefined;
292
+ }>;
293
+ leaseExpiresAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgBigInt53Builder, {
294
+ name: string;
295
+ tableName: string;
296
+ dataType: "number int53";
297
+ data: number;
298
+ driverParam: string | number;
299
+ notNull: false;
300
+ hasDefault: false;
301
+ isPrimaryKey: false;
302
+ isAutoincrement: false;
303
+ hasRuntimeDefault: false;
304
+ enumValues: undefined;
305
+ identity: undefined;
306
+ generated: undefined;
307
+ }>;
308
+ completedAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgBigInt53Builder, {
309
+ name: string;
310
+ tableName: string;
311
+ dataType: "number int53";
312
+ data: number;
313
+ driverParam: string | number;
314
+ notNull: false;
315
+ hasDefault: false;
316
+ isPrimaryKey: false;
317
+ isAutoincrement: false;
318
+ hasRuntimeDefault: false;
319
+ enumValues: undefined;
320
+ identity: undefined;
321
+ generated: undefined;
322
+ }>;
323
+ lastFailureCode: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>, {
324
+ name: string;
325
+ tableName: string;
326
+ dataType: "string";
327
+ data: string;
328
+ driverParam: string;
329
+ notNull: false;
330
+ hasDefault: false;
331
+ isPrimaryKey: false;
332
+ isAutoincrement: false;
333
+ hasRuntimeDefault: false;
334
+ enumValues: undefined;
335
+ identity: undefined;
336
+ generated: undefined;
337
+ }>;
338
+ cleanupAt: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").PgBigInt53Builder, {
339
+ name: string;
340
+ tableName: string;
341
+ dataType: "number int53";
342
+ data: number;
343
+ driverParam: string | number;
344
+ notNull: false;
345
+ hasDefault: false;
346
+ isPrimaryKey: false;
347
+ isAutoincrement: false;
348
+ hasRuntimeDefault: false;
349
+ enumValues: undefined;
350
+ identity: undefined;
351
+ generated: undefined;
352
+ }>;
353
+ };
354
+ dialect: 'pg';
355
+ }>;
356
+ payloads: import("drizzle-orm/pg-core").PgTableWithColumns<{
357
+ name: string;
358
+ schema: string | undefined;
359
+ columns: {
360
+ jobId: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetIsPrimaryKey<import("drizzle-orm/pg-core").PgTextBuilder<[string, ...string[]]>>, {
361
+ name: string;
362
+ tableName: string;
363
+ dataType: "string";
364
+ data: string;
365
+ driverParam: string;
366
+ notNull: true;
367
+ hasDefault: false;
368
+ isPrimaryKey: false;
369
+ isAutoincrement: false;
370
+ hasRuntimeDefault: false;
371
+ enumValues: undefined;
372
+ identity: undefined;
373
+ generated: undefined;
374
+ }>;
375
+ formatVersion: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgIntegerBuilder>, {
376
+ name: string;
377
+ tableName: string;
378
+ dataType: "number int32";
379
+ data: number;
380
+ driverParam: string | number;
381
+ notNull: true;
382
+ hasDefault: false;
383
+ isPrimaryKey: false;
384
+ isAutoincrement: false;
385
+ hasRuntimeDefault: false;
386
+ enumValues: undefined;
387
+ identity: undefined;
388
+ generated: undefined;
389
+ }>;
390
+ payload: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
391
+ dataType: 'custom';
392
+ data: Uint8Array<ArrayBufferLike>;
393
+ driverParam: Buffer<ArrayBufferLike>;
394
+ }>>, {
395
+ name: string;
396
+ tableName: string;
397
+ dataType: "custom";
398
+ data: Uint8Array<ArrayBufferLike>;
399
+ driverParam: Buffer<ArrayBufferLike>;
400
+ notNull: true;
401
+ hasDefault: false;
402
+ isPrimaryKey: false;
403
+ isAutoincrement: false;
404
+ hasRuntimeDefault: false;
405
+ enumValues: undefined;
406
+ identity: undefined;
407
+ generated: undefined;
408
+ }>;
409
+ projection: import("drizzle-orm/pg-core").PgBuildColumn<string, import("drizzle-orm/pg-core").SetNotNull<import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
410
+ dataType: 'custom';
411
+ data: Uint8Array<ArrayBufferLike>;
412
+ driverParam: Buffer<ArrayBufferLike>;
413
+ }>>, {
414
+ name: string;
415
+ tableName: string;
416
+ dataType: "custom";
417
+ data: Uint8Array<ArrayBufferLike>;
418
+ driverParam: Buffer<ArrayBufferLike>;
419
+ notNull: true;
420
+ hasDefault: false;
421
+ isPrimaryKey: false;
422
+ isAutoincrement: false;
423
+ hasRuntimeDefault: false;
424
+ enumValues: undefined;
425
+ identity: undefined;
426
+ generated: undefined;
427
+ }>;
428
+ };
429
+ dialect: 'pg';
430
+ }>;
431
+ }>;
432
+ //# sourceMappingURL=PostgreSqlDrizzleSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgreSqlDrizzleSchema.d.ts","sourceRoot":"","sources":["../src/PostgreSqlDrizzleSchema.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAepC,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAQ9E,kGAAkG;AAClG,eAAO,MAAM,aAAa,aAAa,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsFlD,CAAA"}
@@ -0,0 +1,72 @@
1
+ /** Optional migration-only entrypoint. Never imported by core or the PostgreSQL runtime. */
2
+ import { Buffer } from "node:buffer";
3
+ import { sql } from "drizzle-orm";
4
+ import { bigint, check, customType, index, integer, jsonb, pgSchema, pgTable, text, unique } from "drizzle-orm/pg-core";
5
+ import { indexPrefix, tables } from "./PostgreSqlSchema.js";
6
+ const bytes = customType({
7
+ dataType: () => "bytea",
8
+ toDriver: (value) => Buffer.from(value),
9
+ fromDriver: (value) => new Uint8Array(value)
10
+ });
11
+ /** Fixed column contract, configurable namespace/relation names, application-owned migrations. */
12
+ export const makeJobTables = (options = {}) => {
13
+ const mapping = tables(options);
14
+ const table = mapping.schema === "public" ? pgTable : pgSchema(mapping.schema).table;
15
+ const prefix = indexPrefix(mapping);
16
+ const jobs = table(mapping.jobsTable, {
17
+ id: text("id").primaryKey(),
18
+ operation: text("operation").notNull(),
19
+ operationId: text("operation_id").notNull(),
20
+ slot: text("slot").notNull(),
21
+ queue: text("queue").notNull(),
22
+ kind: text("kind").notNull(),
23
+ version: integer("version").notNull(),
24
+ policy: jsonb("policy").$type().notNull(),
25
+ initialAvailableAt: bigint("initial_available_at", { mode: "number" }),
26
+ state: text("state").notNull(),
27
+ availableAt: bigint("available_at", { mode: "number" }).notNull(),
28
+ updatedAt: bigint("updated_at", { mode: "number" }).notNull(),
29
+ attemptsMade: bigint("attempts_made", { mode: "number" }).notNull().default(0),
30
+ stalledCount: bigint("stalled_count", { mode: "number" }).notNull().default(0),
31
+ lifecycleVersion: bigint("lifecycle_version", { mode: "number" })
32
+ .notNull()
33
+ .default(0),
34
+ leaseToken: text("lease_token"),
35
+ leaseExpiresAt: bigint("lease_expires_at", { mode: "number" }),
36
+ completedAt: bigint("completed_at", { mode: "number" }),
37
+ lastFailureCode: text("last_failure_code"),
38
+ cleanupAt: bigint("cleanup_at", { mode: "number" })
39
+ }, (j) => [
40
+ unique().on(j.operation, j.operationId, j.slot),
41
+ unique().on(j.leaseToken),
42
+ check(`${prefix}_state`, sql `${j.state} IN ('Pending','Active','RetryScheduled','Completed','Dead','Isolated')`),
43
+ check(`${prefix}_attempts`, sql `${j.attemptsMade} >= 0`),
44
+ check(`${prefix}_stalls`, sql `${j.stalledCount} >= 0`),
45
+ check(`${prefix}_version`, sql `${j.lifecycleVersion} >= 0`),
46
+ check(`${prefix}_active`, sql `(${j.state} = 'Active') = (${j.leaseToken} IS NOT NULL AND ${j.leaseExpiresAt} IS NOT NULL)`),
47
+ check(`${prefix}_unowned`, sql `${j.state} = 'Active' OR (${j.leaseToken} IS NULL AND ${j.leaseExpiresAt} IS NULL)`),
48
+ check(`${prefix}_completed`, sql `(${j.state} IN ('Completed','Dead')) = (${j.completedAt} IS NOT NULL)`),
49
+ index(`${prefix}_due`)
50
+ .on(j.queue, j.kind, j.version, j.availableAt, j.id)
51
+ .where(sql `${j.state} IN ('Pending','RetryScheduled')`),
52
+ index(`${prefix}_expired`)
53
+ .on(j.leaseExpiresAt, j.id)
54
+ .where(sql `${j.state} = 'Active'`),
55
+ index(`${prefix}_terminal`)
56
+ .on(j.cleanupAt, j.id)
57
+ .where(sql `${j.state} IN ('Completed','Dead')`)
58
+ ]);
59
+ const payloads = table(mapping.payloadsTable, {
60
+ jobId: text("job_id")
61
+ .primaryKey()
62
+ .references(() => jobs.id, { onDelete: "cascade" }),
63
+ formatVersion: integer("format_version").notNull(),
64
+ payload: bytes("payload").notNull(),
65
+ projection: bytes("projection").notNull()
66
+ }, (p) => [
67
+ check(`${mapping.payloadsTable.slice(0, 45)}_payload`, sql `octet_length(${p.payload}) BETWEEN 1 AND 65536`),
68
+ check(`${mapping.payloadsTable.slice(0, 45)}_projection`, sql `octet_length(${p.projection}) BETWEEN 1 AND 65536`)
69
+ ]);
70
+ return Object.freeze({ mapping, jobs, payloads });
71
+ };
72
+ //# sourceMappingURL=PostgreSqlDrizzleSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgreSqlDrizzleSchema.js","sourceRoot":"","sources":["../src/PostgreSqlDrizzleSchema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import type { JobsTransaction } from "./JobTransaction.js";
3
+ import { PostgreSqlApplication, type PostgreSqlError } from "./PostgreSqlTransaction.js";
4
+ import { PostgreSqlConfigurationError, type TableOptions, type Tables } from "./PostgreSqlSchema.js";
5
+ import type { JobCleanupService, JobStoreService } from "./JobStore.js";
6
+ export interface Options extends TableOptions {
7
+ readonly operationResponseBudgetMillis: number;
8
+ }
9
+ export interface Backend {
10
+ readonly ready: Effect.Effect<void, PostgreSqlError>;
11
+ readonly tables: Tables;
12
+ readonly store: JobStoreService<PostgreSqlError>;
13
+ /** Optional, separately selected. Never installed implicitly or run by imports. */
14
+ readonly cleanup: JobCleanupService<PostgreSqlError>;
15
+ readonly joinTransaction: <A, E, R>(handle: unknown, body: (tx: JobsTransaction<PostgreSqlError>) => Effect.Effect<A, E, R>) => Effect.Effect<A, E | PostgreSqlError, R>;
16
+ readonly withTransaction: <A, E, R>(body: (tx: JobsTransaction<PostgreSqlError>) => Effect.Effect<A, E, R>) => Effect.Effect<A, E | PostgreSqlError, R>;
17
+ }
18
+ declare const PostgreSqlJobs_base: Context.ServiceClass<PostgreSqlJobs, "effect-jobs/PostgreSqlJobs", Backend>;
19
+ export declare class PostgreSqlJobs extends PostgreSqlJobs_base {
20
+ }
21
+ /** Pure construction: no borrow, transaction, readiness SQL, DDL, worker or pool shutdown. */
22
+ export declare const make: (options: Options) => Effect.Effect<Backend, PostgreSqlConfigurationError, PostgreSqlApplication>;
23
+ export declare const layerNoDeps: (options: Options) => Layer.Layer<PostgreSqlJobs, PostgreSqlConfigurationError, PostgreSqlApplication>;
24
+ export {};
25
+ //# sourceMappingURL=PostgreSqlJobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgreSqlJobs.d.ts","sourceRoot":"","sources":["../src/PostgreSqlJobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,QAAQ,CAAA;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACxF,OAAO,EACL,4BAA4B,EAG5B,KAAK,YAAY,EACjB,KAAK,MAAM,EACZ,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAMvE,MAAM,WAAW,OAAQ,SAAQ,YAAY;IAC3C,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAA;CAC/C;AACD,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC,eAAe,CAAC,CAAA;IAChD,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAA;IACpD,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAChC,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACnE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,CAAC,CAAA;IAC7C,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAChC,IAAI,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACnE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,CAAC,CAAA;CAC9C;;AACD,qBAAa,cAAe,SAAQ,mBAEnC;CAAG;AAEJ,8FAA8F;AAC9F,eAAO,MAAM,IAAI,YAAa,OAAO,gFAkCjC,CAAA;AACJ,eAAO,MAAM,WAAW,YAAa,OAAO,qFACC,CAAA"}
@@ -0,0 +1,38 @@
1
+ import { Context, Effect, Layer, Schema } from "effect";
2
+ import { EpochMillis } from "./JobPolicy.js";
3
+ import { PostgreSqlApplication } from "./PostgreSqlTransaction.js";
4
+ import { PostgreSqlConfigurationError, relations, tables } from "./PostgreSqlSchema.js";
5
+ import { withJoinedTransaction } from "./internal/JobTransaction.js";
6
+ import { insertOrCompare } from "./internal/postgresql/Producer.js";
7
+ import { makeCleanup, makeStore } from "./internal/postgresql/Store.js";
8
+ import { ready } from "./internal/postgresql/Readiness.js";
9
+ export class PostgreSqlJobs extends Context.Service()("effect-jobs/PostgreSqlJobs") {
10
+ }
11
+ /** Pure construction: no borrow, transaction, readiness SQL, DDL, worker or pool shutdown. */
12
+ export const make = (options) => Effect.gen(function* () {
13
+ const adapter = yield* PostgreSqlApplication;
14
+ const mapping = yield* Effect.try({
15
+ try: () => tables(options),
16
+ catch: (error) => error
17
+ });
18
+ const budget = options.operationResponseBudgetMillis;
19
+ if (!Schema.is(EpochMillis)(budget) || budget === 0) {
20
+ return yield* new PostgreSqlConfigurationError({
21
+ field: "operationResponseBudgetMillis"
22
+ });
23
+ }
24
+ const { jobs, payloads } = relations(mapping);
25
+ const joinTransaction = (handle, body) => adapter
26
+ .validate(handle)
27
+ .pipe(Effect.flatMap((query) => withJoinedTransaction((prepared) => insertOrCompare(query, jobs, payloads, prepared), body)));
28
+ return PostgreSqlJobs.of({
29
+ ready: ready(adapter, jobs, payloads),
30
+ tables: mapping,
31
+ store: makeStore(adapter, jobs, payloads, budget),
32
+ cleanup: makeCleanup(adapter, jobs),
33
+ joinTransaction,
34
+ withTransaction: (body) => adapter.withTransaction((handle) => joinTransaction(handle, body))
35
+ });
36
+ });
37
+ export const layerNoDeps = (options) => Layer.effect(PostgreSqlJobs, make(options));
38
+ //# sourceMappingURL=PostgreSqlJobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgreSqlJobs.js","sourceRoot":"","sources":["../src/PostgreSqlJobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,EAAE,qBAAqB,EAAwB,MAAM,4BAA4B,CAAA;AACxF,OAAO,EACL,4BAA4B,EAC5B,SAAS,EACT,MAAM,EAGP,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,oCAAoC,CAAA;AAmB1D,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,OAAO,EAA2B,CAC5E,4BAA4B,CAC7B;CAAG;AAEJ,8FAA8F;AAC9F,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,OAAgB,EAAE,EAAE,CACvC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,qBAAqB,CAAA;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAChC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;QAC1B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAqC;KACxD,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,6BAA6B,CAAA;IACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC,CAAC,IAAI,4BAA4B,CAAC;YAC7C,KAAK,EAAE,+BAA+B;SACvC,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,eAAe,GAA+B,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACnE,OAAO;SACJ,QAAQ,CAAC,MAAM,CAAC;SAChB,IAAI,CACH,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACvB,qBAAqB,CACnB,CAAC,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAC9D,IAAI,CACL,CACF,CACF,CAAA;IACL,OAAO,cAAc,CAAC,EAAE,CAAC;QACvB,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;QACrC,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;QACjD,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC;QACnC,eAAe;QACf,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CACxB,OAAO,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;KACrE,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AACJ,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAE,EAAE,CAC9C,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA"}
@@ -0,0 +1,30 @@
1
+ declare const PostgreSqlConfigurationError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
2
+ readonly _tag: "PostgreSqlConfigurationError";
3
+ } & Readonly<A>;
4
+ export declare class PostgreSqlConfigurationError extends PostgreSqlConfigurationError_base<{
5
+ readonly field: "schema" | "jobsTable" | "payloadsTable" | "operationResponseBudgetMillis";
6
+ }> {
7
+ }
8
+ export interface TableOptions {
9
+ readonly schema?: string;
10
+ readonly jobsTable?: string;
11
+ readonly payloadsTable?: string;
12
+ }
13
+ export interface Tables {
14
+ readonly schema: string;
15
+ readonly jobsTable: string;
16
+ readonly payloadsTable: string;
17
+ }
18
+ /** Configuration only; no database access. Names are PostgreSQL identifiers, not SQL. */
19
+ export declare const tables: (options?: TableOptions) => Tables;
20
+ /** Quote only validated names; never interpolate producer/catalog values. */
21
+ export declare const relations: (mapping: Tables) => {
22
+ jobs: string;
23
+ payloads: string;
24
+ };
25
+ /** Schema-wide index names remain bounded without truncating away table identity. */
26
+ export declare const indexPrefix: (mapping: Tables) => string;
27
+ /** Application migration input. Runtime never invokes this DDL. Schema must already exist. */
28
+ export declare const migration: (mapping?: Tables) => string;
29
+ export {};
30
+ //# sourceMappingURL=PostgreSqlSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgreSqlSchema.d.ts","sourceRoot":"","sources":["../src/PostgreSqlSchema.ts"],"names":[],"mappings":";;;AAGA,qBAAa,4BAA6B,SAAQ,kCAEhD;IACA,QAAQ,CAAC,KAAK,EACV,QAAQ,GACR,WAAW,GACX,eAAe,GACf,+BAA+B,CAAA;CACpC,CAAC;CAAG;AACL,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC;AACD,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAOD,yFAAyF;AACzF,eAAO,MAAM,MAAM,aAAa,YAAY,KAAQ,MAWnD,CAAA;AACD,6EAA6E;AAC7E,eAAO,MAAM,SAAS,YAAa,MAAM;IAGrC,IAAI;IACJ,QAAQ;CAEX,CAAA;AACD,qFAAqF;AACrF,eAAO,MAAM,WAAW,YAAa,MAAM,KAAG,MACoE,CAAA;AAClH,8FAA8F;AAC9F,eAAO,MAAM,SAAS,aAAa,MAAM,KAAc,MA8BtD,CAAA"}