ai-workflows 2.1.1 → 2.3.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 (211) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +17 -1
  3. package/README.md +305 -184
  4. package/dist/barrier.d.ts +159 -0
  5. package/dist/barrier.d.ts.map +1 -0
  6. package/dist/barrier.js +377 -0
  7. package/dist/barrier.js.map +1 -0
  8. package/dist/cascade-context.d.ts +149 -0
  9. package/dist/cascade-context.d.ts.map +1 -0
  10. package/dist/cascade-context.js +324 -0
  11. package/dist/cascade-context.js.map +1 -0
  12. package/dist/cascade-executor.d.ts +196 -0
  13. package/dist/cascade-executor.d.ts.map +1 -0
  14. package/dist/cascade-executor.js +384 -0
  15. package/dist/cascade-executor.js.map +1 -0
  16. package/dist/context.d.ts.map +1 -1
  17. package/dist/context.js +27 -8
  18. package/dist/context.js.map +1 -1
  19. package/dist/cron-parser.d.ts +65 -0
  20. package/dist/cron-parser.d.ts.map +1 -0
  21. package/dist/cron-parser.js +294 -0
  22. package/dist/cron-parser.js.map +1 -0
  23. package/dist/cron-scheduler.d.ts +117 -0
  24. package/dist/cron-scheduler.d.ts.map +1 -0
  25. package/dist/cron-scheduler.js +176 -0
  26. package/dist/cron-scheduler.js.map +1 -0
  27. package/dist/database-context.d.ts +184 -0
  28. package/dist/database-context.d.ts.map +1 -0
  29. package/dist/database-context.js +428 -0
  30. package/dist/database-context.js.map +1 -0
  31. package/dist/dependency-graph.d.ts +157 -0
  32. package/dist/dependency-graph.d.ts.map +1 -0
  33. package/dist/dependency-graph.js +382 -0
  34. package/dist/dependency-graph.js.map +1 -0
  35. package/dist/digital-objects-adapter.d.ts +159 -0
  36. package/dist/digital-objects-adapter.d.ts.map +1 -0
  37. package/dist/digital-objects-adapter.js +229 -0
  38. package/dist/digital-objects-adapter.js.map +1 -0
  39. package/dist/durable-execution-cloudflare.d.ts +427 -0
  40. package/dist/durable-execution-cloudflare.d.ts.map +1 -0
  41. package/dist/durable-execution-cloudflare.js +510 -0
  42. package/dist/durable-execution-cloudflare.js.map +1 -0
  43. package/dist/durable-execution.d.ts +482 -0
  44. package/dist/durable-execution.d.ts.map +1 -0
  45. package/dist/durable-execution.js +594 -0
  46. package/dist/durable-execution.js.map +1 -0
  47. package/dist/durable-workflow.d.ts +176 -0
  48. package/dist/durable-workflow.d.ts.map +1 -0
  49. package/dist/durable-workflow.js +552 -0
  50. package/dist/durable-workflow.js.map +1 -0
  51. package/dist/every.d.ts +31 -2
  52. package/dist/every.d.ts.map +1 -1
  53. package/dist/every.js +63 -32
  54. package/dist/every.js.map +1 -1
  55. package/dist/graph/index.d.ts +8 -0
  56. package/dist/graph/index.d.ts.map +1 -0
  57. package/dist/graph/index.js +8 -0
  58. package/dist/graph/index.js.map +1 -0
  59. package/dist/graph/topological-sort.d.ts +121 -0
  60. package/dist/graph/topological-sort.d.ts.map +1 -0
  61. package/dist/graph/topological-sort.js +292 -0
  62. package/dist/graph/topological-sort.js.map +1 -0
  63. package/dist/index.d.ts +10 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +25 -0
  66. package/dist/index.js.map +1 -1
  67. package/dist/logger.d.ts +101 -0
  68. package/dist/logger.d.ts.map +1 -0
  69. package/dist/logger.js +115 -0
  70. package/dist/logger.js.map +1 -0
  71. package/dist/on.d.ts +35 -10
  72. package/dist/on.d.ts.map +1 -1
  73. package/dist/on.js +53 -19
  74. package/dist/on.js.map +1 -1
  75. package/dist/runtime.d.ts +169 -0
  76. package/dist/runtime.d.ts.map +1 -0
  77. package/dist/runtime.js +275 -0
  78. package/dist/runtime.js.map +1 -0
  79. package/dist/send.d.ts.map +1 -1
  80. package/dist/send.js +4 -3
  81. package/dist/send.js.map +1 -1
  82. package/dist/telemetry.d.ts +150 -0
  83. package/dist/telemetry.d.ts.map +1 -0
  84. package/dist/telemetry.js +388 -0
  85. package/dist/telemetry.js.map +1 -0
  86. package/dist/timer-registry.d.ts +77 -0
  87. package/dist/timer-registry.d.ts.map +1 -0
  88. package/dist/timer-registry.js +154 -0
  89. package/dist/timer-registry.js.map +1 -0
  90. package/dist/types.d.ts +105 -6
  91. package/dist/types.d.ts.map +1 -1
  92. package/dist/types.js +17 -1
  93. package/dist/types.js.map +1 -1
  94. package/dist/worker/durable-step.d.ts +481 -0
  95. package/dist/worker/durable-step.d.ts.map +1 -0
  96. package/dist/worker/durable-step.js +606 -0
  97. package/dist/worker/durable-step.js.map +1 -0
  98. package/dist/worker/index.d.ts +106 -0
  99. package/dist/worker/index.d.ts.map +1 -0
  100. package/dist/worker/index.js +124 -0
  101. package/dist/worker/index.js.map +1 -0
  102. package/dist/worker/state-adapter.d.ts +230 -0
  103. package/dist/worker/state-adapter.d.ts.map +1 -0
  104. package/dist/worker/state-adapter.js +409 -0
  105. package/dist/worker/state-adapter.js.map +1 -0
  106. package/dist/worker/topological-executor.d.ts +282 -0
  107. package/dist/worker/topological-executor.d.ts.map +1 -0
  108. package/dist/worker/topological-executor.js +396 -0
  109. package/dist/worker/topological-executor.js.map +1 -0
  110. package/dist/worker/workflow-builder.d.ts +286 -0
  111. package/dist/worker/workflow-builder.d.ts.map +1 -0
  112. package/dist/worker/workflow-builder.js +565 -0
  113. package/dist/worker/workflow-builder.js.map +1 -0
  114. package/dist/worker.d.ts +800 -0
  115. package/dist/worker.d.ts.map +1 -0
  116. package/dist/worker.js +2428 -0
  117. package/dist/worker.js.map +1 -0
  118. package/dist/workflow-builder.d.ts +287 -0
  119. package/dist/workflow-builder.d.ts.map +1 -0
  120. package/dist/workflow-builder.js +762 -0
  121. package/dist/workflow-builder.js.map +1 -0
  122. package/dist/workflow.d.ts +14 -30
  123. package/dist/workflow.d.ts.map +1 -1
  124. package/dist/workflow.js +136 -292
  125. package/dist/workflow.js.map +1 -1
  126. package/examples/01-ecommerce-order-pipeline.ts +358 -0
  127. package/examples/02-content-moderation-cascade.ts +454 -0
  128. package/examples/03-scheduled-reporting-dependencies.ts +479 -0
  129. package/examples/04-database-persistence.ts +518 -0
  130. package/examples/README.md +173 -0
  131. package/package.json +21 -4
  132. package/src/__tests__/digital-objects-adapter.test.ts +274 -0
  133. package/src/__tests__/durable-workflow.test.ts +297 -0
  134. package/src/barrier.ts +507 -0
  135. package/src/cascade-context.ts +495 -0
  136. package/src/cascade-executor.ts +588 -0
  137. package/src/context.ts +51 -17
  138. package/src/cron-parser.ts +347 -0
  139. package/src/cron-scheduler.ts +239 -0
  140. package/src/database-context.ts +658 -0
  141. package/src/dependency-graph.ts +518 -0
  142. package/src/digital-objects-adapter.ts +351 -0
  143. package/src/durable-execution-cloudflare.ts +855 -0
  144. package/src/durable-execution.ts +1042 -0
  145. package/src/durable-workflow.ts +717 -0
  146. package/src/every.ts +104 -35
  147. package/src/graph/index.ts +19 -0
  148. package/src/graph/topological-sort.ts +412 -0
  149. package/src/index.ts +147 -0
  150. package/src/logger.ts +148 -0
  151. package/src/on.ts +81 -26
  152. package/src/runtime.ts +436 -0
  153. package/src/send.ts +4 -5
  154. package/src/telemetry.ts +577 -0
  155. package/src/timer-registry.ts +179 -0
  156. package/src/types.ts +146 -10
  157. package/src/worker/durable-step.ts +976 -0
  158. package/src/worker/index.ts +216 -0
  159. package/src/worker/state-adapter.ts +589 -0
  160. package/src/worker/topological-executor.ts +625 -0
  161. package/src/worker/workflow-builder.ts +871 -0
  162. package/src/worker.ts +2906 -0
  163. package/src/workflow-builder.ts +1068 -0
  164. package/src/workflow.ts +199 -355
  165. package/test/barrier-join.test.ts +442 -0
  166. package/test/barrier-unhandled-rejections.test.ts +359 -0
  167. package/test/cascade-context.test.ts +390 -0
  168. package/test/cascade-executor.test.ts +852 -0
  169. package/test/cron-parser.test.ts +314 -0
  170. package/test/cron-scheduler.test.ts +291 -0
  171. package/test/database-context.test.ts +770 -0
  172. package/test/db-provider-adapter.test.ts +862 -0
  173. package/test/dependency-graph.test.ts +512 -0
  174. package/test/durable-execution-cloudflare.test.ts +606 -0
  175. package/test/durable-execution-in-process.test.ts +286 -0
  176. package/test/durable-execution.test.ts +247 -0
  177. package/test/e2e/workflow-scenarios.e2e.test.ts +1039 -0
  178. package/test/graph/topological-sort.test.ts +586 -0
  179. package/test/integration.test.ts +442 -0
  180. package/test/rpc-surface.test.ts +946 -0
  181. package/test/runtime.test.ts +262 -0
  182. package/test/schedule-timer-cleanup.test.ts +353 -0
  183. package/test/send-race-conditions.test.ts +400 -0
  184. package/test/type-safety-every.test.ts +303 -0
  185. package/test/worker/durable-cascade.test.ts +1117 -0
  186. package/test/worker/durable-step.test.ts +723 -0
  187. package/test/worker/topological-executor.test.ts +1240 -0
  188. package/test/worker/workflow-builder.test.ts +1067 -0
  189. package/test/worker.test.ts +608 -0
  190. package/test/workflow-builder.test.ts +1670 -0
  191. package/test/workflow-cron.test.ts +256 -0
  192. package/test/workflow-state-adapter.test.ts +923 -0
  193. package/test/workflow.test.ts +25 -22
  194. package/tsconfig.json +3 -1
  195. package/vitest.config.ts +38 -1
  196. package/vitest.workers.config.ts +44 -0
  197. package/wrangler.jsonc +22 -0
  198. package/.turbo/turbo-test.log +0 -7
  199. package/src/context.js +0 -83
  200. package/src/every.js +0 -267
  201. package/src/index.js +0 -71
  202. package/src/on.js +0 -79
  203. package/src/send.js +0 -111
  204. package/src/types.js +0 -4
  205. package/src/workflow.js +0 -455
  206. package/test/context.test.js +0 -116
  207. package/test/every.test.js +0 -282
  208. package/test/on.test.js +0 -80
  209. package/test/send.test.js +0 -89
  210. package/test/workflow.test.js +0 -224
  211. package/vitest.config.js +0 -7
@@ -0,0 +1,409 @@
1
+ /**
2
+ * WorkflowStateAdapter - Persistent workflow state using ai-database
3
+ *
4
+ * Provides durable storage for workflow state with:
5
+ * - Optimistic locking via version control
6
+ * - Step checkpoints for recovery
7
+ * - Query by status and IDs
8
+ * - Snapshots for point-in-time recovery
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { DB } from 'ai-database'
13
+ * import { WorkflowStateAdapter } from 'ai-workflows/worker'
14
+ *
15
+ * const { db } = DB({ WorkflowState: { status: 'string' } })
16
+ * const adapter = new WorkflowStateAdapter(db)
17
+ *
18
+ * await adapter.save('wf-123', {
19
+ * workflowId: 'wf-123',
20
+ * status: 'running',
21
+ * currentStep: 'process-payment',
22
+ * context: { orderId: 'order-1' },
23
+ * })
24
+ *
25
+ * const state = await adapter.load('wf-123')
26
+ * ```
27
+ *
28
+ * @packageDocumentation
29
+ */
30
+ /**
31
+ * WorkflowStateAdapter - Persists workflow state using ai-database
32
+ *
33
+ * Provides optimistic locking, checkpoints, and snapshot recovery.
34
+ */
35
+ export class WorkflowStateAdapter {
36
+ db;
37
+ STATE_TYPE = 'WorkflowState';
38
+ CHECKPOINT_TYPE = 'WorkflowCheckpoint';
39
+ SNAPSHOT_TYPE = 'WorkflowSnapshot';
40
+ /**
41
+ * Create a new WorkflowStateAdapter
42
+ *
43
+ * @param database - Database connection (from ai-database DB() or compatible provider)
44
+ * @throws Error if database connection is null/undefined
45
+ */
46
+ constructor(database) {
47
+ if (!database) {
48
+ throw new Error('Database connection is required');
49
+ }
50
+ this.db = database;
51
+ }
52
+ /**
53
+ * Save workflow state to database
54
+ *
55
+ * Creates a new record if not exists, updates existing if found.
56
+ * Automatically increments version and updates timestamps.
57
+ *
58
+ * @param workflowId - Unique workflow identifier
59
+ * @param state - Partial state to save (merged with existing)
60
+ */
61
+ async save(workflowId, state) {
62
+ const existing = await this.loadRaw(workflowId);
63
+ const now = new Date();
64
+ if (existing) {
65
+ // Update existing state
66
+ const updated = this.mergeState(existing, state);
67
+ updated.version = (existing.version || 0) + 1;
68
+ updated.updatedAt = now;
69
+ const serialized = this.serialize(updated);
70
+ await this.db.update(this.STATE_TYPE, workflowId, serialized);
71
+ // Emit state updated event
72
+ await this.emitEvent('WorkflowState.updated', {
73
+ workflowId,
74
+ version: updated.version,
75
+ status: updated.status,
76
+ });
77
+ }
78
+ else {
79
+ // Create new state
80
+ const newState = {
81
+ workflowId,
82
+ version: state.version ?? 1,
83
+ status: state.status ?? 'pending',
84
+ currentStep: state.currentStep ?? '',
85
+ context: state.context ?? {},
86
+ checkpoints: state.checkpoints ?? new Map(),
87
+ history: state.history ?? [],
88
+ ...(state.input !== undefined && { input: state.input }),
89
+ ...(state.output !== undefined && { output: state.output }),
90
+ ...(state.error !== undefined && { error: state.error }),
91
+ createdAt: now,
92
+ updatedAt: now,
93
+ };
94
+ const serialized = this.serialize(newState);
95
+ await this.db.create(this.STATE_TYPE, serialized, workflowId);
96
+ // Emit state created event
97
+ await this.emitEvent('WorkflowState.created', {
98
+ workflowId,
99
+ version: newState.version,
100
+ status: newState.status,
101
+ });
102
+ }
103
+ }
104
+ /**
105
+ * Load workflow state from database
106
+ *
107
+ * @param workflowId - Workflow identifier to load
108
+ * @returns The persisted state or null if not found
109
+ */
110
+ async load(workflowId) {
111
+ return this.loadRaw(workflowId);
112
+ }
113
+ /**
114
+ * Save a step checkpoint
115
+ *
116
+ * Checkpoints are stored as part of the workflow state.
117
+ *
118
+ * @param workflowId - Workflow identifier
119
+ * @param stepId - Step identifier
120
+ * @param checkpoint - Checkpoint data
121
+ */
122
+ async checkpoint(workflowId, stepId, checkpoint) {
123
+ const state = await this.loadRaw(workflowId);
124
+ if (!state) {
125
+ // Create minimal state with checkpoint
126
+ await this.save(workflowId, {
127
+ workflowId,
128
+ status: 'running',
129
+ checkpoints: new Map([[stepId, checkpoint]]),
130
+ });
131
+ return;
132
+ }
133
+ // Update checkpoint in existing state
134
+ const checkpoints = state.checkpoints ?? new Map();
135
+ checkpoints.set(stepId, checkpoint);
136
+ await this.save(workflowId, { checkpoints });
137
+ }
138
+ /**
139
+ * Get a step checkpoint
140
+ *
141
+ * @param workflowId - Workflow identifier
142
+ * @param stepId - Step identifier
143
+ * @returns The checkpoint or null if not found
144
+ */
145
+ async getCheckpoint(workflowId, stepId) {
146
+ const state = await this.loadRaw(workflowId);
147
+ if (!state || !state.checkpoints) {
148
+ return null;
149
+ }
150
+ return state.checkpoints.get(stepId) ?? null;
151
+ }
152
+ /**
153
+ * Update state with optimistic locking
154
+ *
155
+ * Only updates if the current version matches expectedVersion.
156
+ * Returns false if version mismatch (concurrent modification detected).
157
+ *
158
+ * @param workflowId - Workflow identifier
159
+ * @param expectedVersion - Expected current version
160
+ * @param state - State updates to apply
161
+ * @returns true if updated, false if version mismatch
162
+ */
163
+ async updateWithVersion(workflowId, expectedVersion, state) {
164
+ const existing = await this.loadRaw(workflowId);
165
+ if (!existing) {
166
+ return false;
167
+ }
168
+ if (existing.version !== expectedVersion) {
169
+ return false;
170
+ }
171
+ // Version matches, perform update
172
+ await this.save(workflowId, state);
173
+ return true;
174
+ }
175
+ /**
176
+ * Query workflows by status
177
+ *
178
+ * @param status - Status to filter by
179
+ * @returns Array of workflows matching the status
180
+ */
181
+ async queryByStatus(status) {
182
+ try {
183
+ const results = await this.db.list(this.STATE_TYPE, {
184
+ where: { status },
185
+ });
186
+ return results.map((r) => this.deserialize(r));
187
+ }
188
+ catch {
189
+ // Fallback: list all and filter
190
+ const all = await this.db.list(this.STATE_TYPE);
191
+ return all
192
+ .map((r) => this.deserialize(r))
193
+ .filter((s) => s.status === status);
194
+ }
195
+ }
196
+ /**
197
+ * Query workflows by IDs (batch query)
198
+ *
199
+ * @param workflowIds - Array of workflow IDs to query
200
+ * @returns Array of found workflows (non-existent IDs are excluded)
201
+ */
202
+ async queryByIds(workflowIds) {
203
+ const results = [];
204
+ for (const id of workflowIds) {
205
+ const state = await this.loadRaw(id);
206
+ if (state) {
207
+ results.push(state);
208
+ }
209
+ }
210
+ return results;
211
+ }
212
+ /**
213
+ * Delete a workflow and its checkpoints
214
+ *
215
+ * @param workflowId - Workflow identifier to delete
216
+ * @returns true if deleted, false if not found
217
+ */
218
+ async delete(workflowId) {
219
+ const existing = await this.loadRaw(workflowId);
220
+ if (!existing) {
221
+ return false;
222
+ }
223
+ await this.db.delete(this.STATE_TYPE, workflowId);
224
+ // Emit deletion event
225
+ await this.emitEvent('WorkflowState.deleted', { workflowId });
226
+ return true;
227
+ }
228
+ /**
229
+ * List all workflows with pagination
230
+ *
231
+ * @param options - Pagination options (limit, offset)
232
+ * @returns Array of workflows
233
+ */
234
+ async listAll(options) {
235
+ const results = await this.db.list(this.STATE_TYPE, {
236
+ ...(options?.limit !== undefined && { limit: options.limit }),
237
+ ...(options?.offset !== undefined && { offset: options.offset }),
238
+ });
239
+ return results.map((r) => this.deserialize(r));
240
+ }
241
+ /**
242
+ * Create a snapshot of current workflow state
243
+ *
244
+ * Snapshots allow point-in-time recovery of workflow state.
245
+ *
246
+ * @param workflowId - Workflow identifier
247
+ * @param label - Optional human-readable label
248
+ * @returns Snapshot ID
249
+ */
250
+ async createSnapshot(workflowId, label) {
251
+ const state = await this.loadRaw(workflowId);
252
+ if (!state) {
253
+ throw new Error(`Workflow "${workflowId}" not found`);
254
+ }
255
+ const snapshotId = `snap-${workflowId}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
256
+ const snapshot = {
257
+ snapshotId,
258
+ workflowId,
259
+ ...(label !== undefined && { label }),
260
+ state: JSON.stringify(this.serialize(state)),
261
+ createdAt: new Date().toISOString(),
262
+ };
263
+ await this.db.create(this.SNAPSHOT_TYPE, snapshot, snapshotId);
264
+ return snapshotId;
265
+ }
266
+ /**
267
+ * Restore workflow state from a snapshot
268
+ *
269
+ * @param workflowId - Workflow identifier
270
+ * @param snapshotId - Snapshot ID to restore from
271
+ */
272
+ async restoreSnapshot(workflowId, snapshotId) {
273
+ const snapshot = (await this.db.get(this.SNAPSHOT_TYPE, snapshotId));
274
+ if (!snapshot) {
275
+ throw new Error(`Snapshot "${snapshotId}" not found`);
276
+ }
277
+ if (snapshot.workflowId !== workflowId) {
278
+ throw new Error(`Snapshot "${snapshotId}" does not belong to workflow "${workflowId}"`);
279
+ }
280
+ const restoredState = JSON.parse(snapshot.state);
281
+ const state = this.deserialize(restoredState);
282
+ // Save restored state with incremented version
283
+ await this.db.update(this.STATE_TYPE, workflowId, this.serialize({
284
+ ...state,
285
+ version: state.version + 1,
286
+ updatedAt: new Date(),
287
+ }));
288
+ // Emit restoration event
289
+ await this.emitEvent('WorkflowState.restored', {
290
+ workflowId,
291
+ snapshotId,
292
+ });
293
+ }
294
+ /**
295
+ * Get all snapshots for a workflow
296
+ *
297
+ * @param workflowId - Workflow identifier
298
+ * @returns Array of snapshot metadata
299
+ */
300
+ async getSnapshots(workflowId) {
301
+ const all = await this.db.list(this.SNAPSHOT_TYPE);
302
+ return all
303
+ .map((r) => r)
304
+ .filter((s) => s.workflowId === workflowId)
305
+ .map((s) => ({
306
+ id: s.snapshotId,
307
+ ...(s.label !== undefined && { label: s.label }),
308
+ createdAt: new Date(s.createdAt),
309
+ }));
310
+ }
311
+ // ==========================================================================
312
+ // Private helpers
313
+ // ==========================================================================
314
+ /**
315
+ * Load raw state from database
316
+ */
317
+ async loadRaw(workflowId) {
318
+ const data = await this.db.get(this.STATE_TYPE, workflowId);
319
+ if (!data) {
320
+ return null;
321
+ }
322
+ return this.deserialize(data);
323
+ }
324
+ /**
325
+ * Merge partial state into existing state
326
+ */
327
+ mergeState(existing, updates) {
328
+ return {
329
+ ...existing,
330
+ ...updates,
331
+ // Deep merge context
332
+ context: {
333
+ ...existing.context,
334
+ ...(updates.context ?? {}),
335
+ },
336
+ // Merge checkpoints (updates override)
337
+ checkpoints: updates.checkpoints ?? existing.checkpoints,
338
+ // Append history if provided
339
+ history: updates.history ?? existing.history,
340
+ };
341
+ }
342
+ /**
343
+ * Serialize state for database storage
344
+ */
345
+ serialize(state) {
346
+ return {
347
+ workflowId: state.workflowId,
348
+ version: state.version,
349
+ status: state.status,
350
+ currentStep: state.currentStep,
351
+ context: JSON.stringify(state.context),
352
+ checkpoints: JSON.stringify(state.checkpoints ? Array.from(state.checkpoints.entries()) : []),
353
+ history: JSON.stringify(state.history),
354
+ ...(state.input !== undefined && { input: JSON.stringify(state.input) }),
355
+ ...(state.output !== undefined && { output: JSON.stringify(state.output) }),
356
+ ...(state.error !== undefined && { error: state.error }),
357
+ createdAt: state.createdAt.toISOString(),
358
+ updatedAt: state.updatedAt.toISOString(),
359
+ };
360
+ }
361
+ /**
362
+ * Deserialize state from database format
363
+ */
364
+ deserialize(data) {
365
+ let checkpointsMap;
366
+ try {
367
+ const entries = JSON.parse(data.checkpoints || '[]');
368
+ checkpointsMap = new Map(entries.map(([key, cp]) => [
369
+ key,
370
+ {
371
+ ...cp,
372
+ ...(cp.startedAt !== undefined && { startedAt: new Date(cp.startedAt) }),
373
+ ...(cp.completedAt !== undefined && { completedAt: new Date(cp.completedAt) }),
374
+ },
375
+ ]));
376
+ }
377
+ catch {
378
+ checkpointsMap = new Map();
379
+ }
380
+ return {
381
+ workflowId: data.workflowId,
382
+ version: data.version,
383
+ status: data.status,
384
+ currentStep: data.currentStep,
385
+ context: JSON.parse(data.context || '{}'),
386
+ checkpoints: checkpointsMap,
387
+ history: JSON.parse(data.history || '[]'),
388
+ ...(data.input !== undefined && { input: JSON.parse(data.input) }),
389
+ ...(data.output !== undefined && { output: JSON.parse(data.output) }),
390
+ ...(data.error !== undefined && { error: data.error }),
391
+ createdAt: new Date(data.createdAt),
392
+ updatedAt: new Date(data.updatedAt),
393
+ };
394
+ }
395
+ /**
396
+ * Emit an event to the database (if supported)
397
+ */
398
+ async emitEvent(event, data) {
399
+ if (this.db.emit) {
400
+ try {
401
+ await this.db.emit(event, data);
402
+ }
403
+ catch {
404
+ // Event emission is best-effort
405
+ }
406
+ }
407
+ }
408
+ }
409
+ //# sourceMappingURL=state-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-adapter.js","sourceRoot":"","sources":["../../src/worker/state-adapter.ts"],"names":[],"mappings":"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"}