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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +17 -1
- package/README.md +305 -184
- package/dist/barrier.d.ts +159 -0
- package/dist/barrier.d.ts.map +1 -0
- package/dist/barrier.js +377 -0
- package/dist/barrier.js.map +1 -0
- package/dist/cascade-context.d.ts +149 -0
- package/dist/cascade-context.d.ts.map +1 -0
- package/dist/cascade-context.js +324 -0
- package/dist/cascade-context.js.map +1 -0
- package/dist/cascade-executor.d.ts +196 -0
- package/dist/cascade-executor.d.ts.map +1 -0
- package/dist/cascade-executor.js +384 -0
- package/dist/cascade-executor.js.map +1 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -8
- package/dist/context.js.map +1 -1
- package/dist/cron-parser.d.ts +65 -0
- package/dist/cron-parser.d.ts.map +1 -0
- package/dist/cron-parser.js +294 -0
- package/dist/cron-parser.js.map +1 -0
- package/dist/cron-scheduler.d.ts +117 -0
- package/dist/cron-scheduler.d.ts.map +1 -0
- package/dist/cron-scheduler.js +176 -0
- package/dist/cron-scheduler.js.map +1 -0
- package/dist/database-context.d.ts +184 -0
- package/dist/database-context.d.ts.map +1 -0
- package/dist/database-context.js +428 -0
- package/dist/database-context.js.map +1 -0
- package/dist/dependency-graph.d.ts +157 -0
- package/dist/dependency-graph.d.ts.map +1 -0
- package/dist/dependency-graph.js +382 -0
- package/dist/dependency-graph.js.map +1 -0
- package/dist/digital-objects-adapter.d.ts +159 -0
- package/dist/digital-objects-adapter.d.ts.map +1 -0
- package/dist/digital-objects-adapter.js +229 -0
- package/dist/digital-objects-adapter.js.map +1 -0
- package/dist/durable-execution-cloudflare.d.ts +427 -0
- package/dist/durable-execution-cloudflare.d.ts.map +1 -0
- package/dist/durable-execution-cloudflare.js +510 -0
- package/dist/durable-execution-cloudflare.js.map +1 -0
- package/dist/durable-execution.d.ts +482 -0
- package/dist/durable-execution.d.ts.map +1 -0
- package/dist/durable-execution.js +594 -0
- package/dist/durable-execution.js.map +1 -0
- package/dist/durable-workflow.d.ts +176 -0
- package/dist/durable-workflow.d.ts.map +1 -0
- package/dist/durable-workflow.js +552 -0
- package/dist/durable-workflow.js.map +1 -0
- package/dist/every.d.ts +31 -2
- package/dist/every.d.ts.map +1 -1
- package/dist/every.js +63 -32
- package/dist/every.js.map +1 -1
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +8 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/topological-sort.d.ts +121 -0
- package/dist/graph/topological-sort.d.ts.map +1 -0
- package/dist/graph/topological-sort.js +292 -0
- package/dist/graph/topological-sort.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +101 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +115 -0
- package/dist/logger.js.map +1 -0
- package/dist/on.d.ts +35 -10
- package/dist/on.d.ts.map +1 -1
- package/dist/on.js +53 -19
- package/dist/on.js.map +1 -1
- package/dist/runtime.d.ts +169 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +275 -0
- package/dist/runtime.js.map +1 -0
- package/dist/send.d.ts.map +1 -1
- package/dist/send.js +4 -3
- package/dist/send.js.map +1 -1
- package/dist/telemetry.d.ts +150 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +388 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/timer-registry.d.ts +77 -0
- package/dist/timer-registry.d.ts.map +1 -0
- package/dist/timer-registry.js +154 -0
- package/dist/timer-registry.js.map +1 -0
- package/dist/types.d.ts +105 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -1
- package/dist/types.js.map +1 -1
- package/dist/worker/durable-step.d.ts +481 -0
- package/dist/worker/durable-step.d.ts.map +1 -0
- package/dist/worker/durable-step.js +606 -0
- package/dist/worker/durable-step.js.map +1 -0
- package/dist/worker/index.d.ts +106 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +124 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/state-adapter.d.ts +230 -0
- package/dist/worker/state-adapter.d.ts.map +1 -0
- package/dist/worker/state-adapter.js +409 -0
- package/dist/worker/state-adapter.js.map +1 -0
- package/dist/worker/topological-executor.d.ts +282 -0
- package/dist/worker/topological-executor.d.ts.map +1 -0
- package/dist/worker/topological-executor.js +396 -0
- package/dist/worker/topological-executor.js.map +1 -0
- package/dist/worker/workflow-builder.d.ts +286 -0
- package/dist/worker/workflow-builder.d.ts.map +1 -0
- package/dist/worker/workflow-builder.js +565 -0
- package/dist/worker/workflow-builder.js.map +1 -0
- package/dist/worker.d.ts +800 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +2428 -0
- package/dist/worker.js.map +1 -0
- package/dist/workflow-builder.d.ts +287 -0
- package/dist/workflow-builder.d.ts.map +1 -0
- package/dist/workflow-builder.js +762 -0
- package/dist/workflow-builder.js.map +1 -0
- package/dist/workflow.d.ts +14 -30
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +136 -292
- package/dist/workflow.js.map +1 -1
- package/examples/01-ecommerce-order-pipeline.ts +358 -0
- package/examples/02-content-moderation-cascade.ts +454 -0
- package/examples/03-scheduled-reporting-dependencies.ts +479 -0
- package/examples/04-database-persistence.ts +518 -0
- package/examples/README.md +173 -0
- package/package.json +21 -4
- package/src/__tests__/digital-objects-adapter.test.ts +274 -0
- package/src/__tests__/durable-workflow.test.ts +297 -0
- package/src/barrier.ts +507 -0
- package/src/cascade-context.ts +495 -0
- package/src/cascade-executor.ts +588 -0
- package/src/context.ts +51 -17
- package/src/cron-parser.ts +347 -0
- package/src/cron-scheduler.ts +239 -0
- package/src/database-context.ts +658 -0
- package/src/dependency-graph.ts +518 -0
- package/src/digital-objects-adapter.ts +351 -0
- package/src/durable-execution-cloudflare.ts +855 -0
- package/src/durable-execution.ts +1042 -0
- package/src/durable-workflow.ts +717 -0
- package/src/every.ts +104 -35
- package/src/graph/index.ts +19 -0
- package/src/graph/topological-sort.ts +412 -0
- package/src/index.ts +147 -0
- package/src/logger.ts +148 -0
- package/src/on.ts +81 -26
- package/src/runtime.ts +436 -0
- package/src/send.ts +4 -5
- package/src/telemetry.ts +577 -0
- package/src/timer-registry.ts +179 -0
- package/src/types.ts +146 -10
- package/src/worker/durable-step.ts +976 -0
- package/src/worker/index.ts +216 -0
- package/src/worker/state-adapter.ts +589 -0
- package/src/worker/topological-executor.ts +625 -0
- package/src/worker/workflow-builder.ts +871 -0
- package/src/worker.ts +2906 -0
- package/src/workflow-builder.ts +1068 -0
- package/src/workflow.ts +199 -355
- package/test/barrier-join.test.ts +442 -0
- package/test/barrier-unhandled-rejections.test.ts +359 -0
- package/test/cascade-context.test.ts +390 -0
- package/test/cascade-executor.test.ts +852 -0
- package/test/cron-parser.test.ts +314 -0
- package/test/cron-scheduler.test.ts +291 -0
- package/test/database-context.test.ts +770 -0
- package/test/db-provider-adapter.test.ts +862 -0
- package/test/dependency-graph.test.ts +512 -0
- package/test/durable-execution-cloudflare.test.ts +606 -0
- package/test/durable-execution-in-process.test.ts +286 -0
- package/test/durable-execution.test.ts +247 -0
- package/test/e2e/workflow-scenarios.e2e.test.ts +1039 -0
- package/test/graph/topological-sort.test.ts +586 -0
- package/test/integration.test.ts +442 -0
- package/test/rpc-surface.test.ts +946 -0
- package/test/runtime.test.ts +262 -0
- package/test/schedule-timer-cleanup.test.ts +353 -0
- package/test/send-race-conditions.test.ts +400 -0
- package/test/type-safety-every.test.ts +303 -0
- package/test/worker/durable-cascade.test.ts +1117 -0
- package/test/worker/durable-step.test.ts +723 -0
- package/test/worker/topological-executor.test.ts +1240 -0
- package/test/worker/workflow-builder.test.ts +1067 -0
- package/test/worker.test.ts +608 -0
- package/test/workflow-builder.test.ts +1670 -0
- package/test/workflow-cron.test.ts +256 -0
- package/test/workflow-state-adapter.test.ts +923 -0
- package/test/workflow.test.ts +25 -22
- package/tsconfig.json +3 -1
- package/vitest.config.ts +38 -1
- package/vitest.workers.config.ts +44 -0
- package/wrangler.jsonc +22 -0
- package/.turbo/turbo-test.log +0 -7
- package/src/context.js +0 -83
- package/src/every.js +0 -267
- package/src/index.js +0 -71
- package/src/on.js +0 -79
- package/src/send.js +0 -111
- package/src/types.js +0 -4
- package/src/workflow.js +0 -455
- package/test/context.test.js +0 -116
- package/test/every.test.js +0 -282
- package/test/on.test.js +0 -80
- package/test/send.test.js +0 -89
- package/test/workflow.test.js +0 -224
- 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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"}
|