ai-workflows 2.1.3 → 2.4.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 +14 -1
- package/README.md +2 -0
- package/dist/barrier.d.ts +6 -0
- package/dist/barrier.d.ts.map +1 -1
- package/dist/barrier.js +45 -7
- package/dist/barrier.js.map +1 -1
- package/dist/cascade-context.d.ts.map +1 -1
- package/dist/cascade-context.js +25 -25
- package/dist/cascade-context.js.map +1 -1
- package/dist/cascade-executor.d.ts.map +1 -1
- package/dist/cascade-executor.js +1 -1
- package/dist/cascade-executor.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +23 -7
- 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/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/graph/topological-sort.d.ts.map +1 -1
- package/dist/graph/topological-sort.js +5 -5
- package/dist/graph/topological-sort.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -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.map +1 -1
- package/dist/on.js +3 -3
- 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 +25 -0
- package/dist/timer-registry.d.ts.map +1 -1
- package/dist/timer-registry.js +42 -8
- package/dist/timer-registry.js.map +1 -1
- package/dist/types.d.ts +17 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -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 +132 -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 +30 -13
- package/src/__tests__/digital-objects-adapter.test.ts +274 -0
- package/src/__tests__/durable-workflow.test.ts +297 -0
- package/src/barrier.ts +48 -7
- package/src/cascade-context.ts +36 -29
- package/src/cascade-executor.ts +3 -2
- package/src/context.ts +41 -12
- package/src/cron-parser.ts +347 -0
- package/src/cron-scheduler.ts +239 -0
- package/src/database-context.ts +658 -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/graph/topological-sort.ts +6 -8
- package/src/index.ts +69 -0
- package/src/logger.ts +148 -0
- package/src/on.ts +8 -9
- package/src/runtime.ts +436 -0
- package/src/send.ts +4 -5
- package/src/telemetry.ts +577 -0
- package/src/timer-registry.ts +44 -10
- package/src/types.ts +32 -17
- 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 +188 -351
- package/test/barrier-join.test.ts +32 -24
- package/test/cascade-executor.test.ts +9 -16
- 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/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/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 +30 -21
- package/test/send-race-conditions.test.ts +30 -40
- 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 -169
- package/LICENSE +0 -21
- 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,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DatabaseContext Implementation - Persistence layer for ai-workflows using ai-database
|
|
3
|
+
*
|
|
4
|
+
* Provides durable storage for workflow events, actions, and artifacts with:
|
|
5
|
+
* - Event sourcing (immutable event log)
|
|
6
|
+
* - State snapshots and restoration
|
|
7
|
+
* - Event replay capabilities
|
|
8
|
+
* - Action tracking with status management
|
|
9
|
+
* - Artifact caching for compiled content
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { DB } from 'ai-database'
|
|
14
|
+
* import { createDatabaseContext } from 'ai-workflows'
|
|
15
|
+
*
|
|
16
|
+
* const { db, events } = DB({
|
|
17
|
+
* WorkflowEvent: { type: 'string', data: 'string' },
|
|
18
|
+
* WorkflowAction: { actor: 'string', status: 'string' },
|
|
19
|
+
* WorkflowArtifact: { key: 'string', type: 'string' },
|
|
20
|
+
* WorkflowSnapshot: { workflowId: 'string', state: 'string' },
|
|
21
|
+
* })
|
|
22
|
+
*
|
|
23
|
+
* const dbContext = createDatabaseContext({ db, events })
|
|
24
|
+
*
|
|
25
|
+
* // Use with Workflow
|
|
26
|
+
* const workflow = Workflow($ => {
|
|
27
|
+
* $.on.Customer.created(async (customer, $) => {
|
|
28
|
+
* // Events are now persisted durably
|
|
29
|
+
* $.send('Email.welcome', { to: customer.email })
|
|
30
|
+
* })
|
|
31
|
+
* }, { db: dbContext })
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @packageDocumentation
|
|
35
|
+
*/
|
|
36
|
+
import type { DatabaseContext } from './types.js';
|
|
37
|
+
/**
|
|
38
|
+
* Event stored in the database
|
|
39
|
+
*/
|
|
40
|
+
export interface StoredEvent {
|
|
41
|
+
$id: string;
|
|
42
|
+
$type: string;
|
|
43
|
+
eventType: string;
|
|
44
|
+
data: string;
|
|
45
|
+
timestamp: number;
|
|
46
|
+
correlationId?: string;
|
|
47
|
+
causationId?: string;
|
|
48
|
+
workflowId?: string;
|
|
49
|
+
source?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Action stored in the database
|
|
53
|
+
*/
|
|
54
|
+
export interface StoredAction {
|
|
55
|
+
$id: string;
|
|
56
|
+
$type: string;
|
|
57
|
+
actor: string;
|
|
58
|
+
object: string;
|
|
59
|
+
action: string;
|
|
60
|
+
status: 'pending' | 'active' | 'completed' | 'failed';
|
|
61
|
+
metadata: string;
|
|
62
|
+
result?: string;
|
|
63
|
+
createdAt: number;
|
|
64
|
+
updatedAt: number;
|
|
65
|
+
completedAt?: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Artifact stored in the database
|
|
69
|
+
*/
|
|
70
|
+
export interface StoredArtifact {
|
|
71
|
+
$id: string;
|
|
72
|
+
$type: string;
|
|
73
|
+
key: string;
|
|
74
|
+
artifactType: string;
|
|
75
|
+
sourceHash: string;
|
|
76
|
+
content: string;
|
|
77
|
+
metadata?: string;
|
|
78
|
+
createdAt: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Snapshot stored in the database
|
|
82
|
+
*/
|
|
83
|
+
export interface StoredSnapshot {
|
|
84
|
+
$id: string;
|
|
85
|
+
$type: string;
|
|
86
|
+
workflowId: string;
|
|
87
|
+
label?: string;
|
|
88
|
+
state: string;
|
|
89
|
+
eventSequence: number;
|
|
90
|
+
createdAt: number;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Database provider interface for persistence operations
|
|
94
|
+
* Compatible with ai-database DB() result or any similar provider
|
|
95
|
+
*/
|
|
96
|
+
export interface DatabaseProvider {
|
|
97
|
+
get: (type: string, id: string) => Promise<Record<string, unknown> | null>;
|
|
98
|
+
create: (type: string, data: Record<string, unknown>, id?: string) => Promise<Record<string, unknown>>;
|
|
99
|
+
update: (type: string, id: string, data: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
100
|
+
delete: (type: string, id: string) => Promise<boolean>;
|
|
101
|
+
list: (type: string, options?: {
|
|
102
|
+
limit?: number;
|
|
103
|
+
offset?: number;
|
|
104
|
+
where?: Record<string, unknown>;
|
|
105
|
+
}) => Promise<Record<string, unknown>[]>;
|
|
106
|
+
emit?: (event: string, data: unknown) => Promise<{
|
|
107
|
+
id: string;
|
|
108
|
+
}>;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Events API interface for event subscription
|
|
112
|
+
*/
|
|
113
|
+
export interface EventsAPI {
|
|
114
|
+
on: (event: string, handler: (data: unknown) => void) => () => void;
|
|
115
|
+
emit: (event: string | {
|
|
116
|
+
event: string;
|
|
117
|
+
[key: string]: unknown;
|
|
118
|
+
}, data?: unknown) => Promise<{
|
|
119
|
+
id: string;
|
|
120
|
+
}>;
|
|
121
|
+
list?: (options?: {
|
|
122
|
+
event?: string;
|
|
123
|
+
since?: Date;
|
|
124
|
+
limit?: number;
|
|
125
|
+
}) => Promise<unknown[]>;
|
|
126
|
+
replay?: (options: {
|
|
127
|
+
event?: string;
|
|
128
|
+
since?: Date;
|
|
129
|
+
handler: (event: unknown) => Promise<void>;
|
|
130
|
+
}) => Promise<void>;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Options for creating a DatabaseContext
|
|
134
|
+
*/
|
|
135
|
+
export interface DatabaseContextOptions {
|
|
136
|
+
/** Database provider (from ai-database DB() or compatible) */
|
|
137
|
+
db: DatabaseProvider;
|
|
138
|
+
/** Events API (optional, for event sourcing) */
|
|
139
|
+
events?: EventsAPI;
|
|
140
|
+
/** Workflow ID for scoping events */
|
|
141
|
+
workflowId?: string;
|
|
142
|
+
/** Source identifier for events */
|
|
143
|
+
source?: string;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Extended DatabaseContext with event sourcing capabilities
|
|
147
|
+
*/
|
|
148
|
+
export interface EventSourcingContext extends DatabaseContext {
|
|
149
|
+
/** Get all events for a workflow */
|
|
150
|
+
getEvents: (options?: {
|
|
151
|
+
since?: Date;
|
|
152
|
+
limit?: number;
|
|
153
|
+
}) => Promise<StoredEvent[]>;
|
|
154
|
+
/** Replay events through a handler */
|
|
155
|
+
replay: (handler: (event: string, data: unknown) => Promise<void>, options?: {
|
|
156
|
+
since?: Date;
|
|
157
|
+
}) => Promise<void>;
|
|
158
|
+
/** Create a snapshot of current state */
|
|
159
|
+
createSnapshot: (state: unknown, label?: string) => Promise<string>;
|
|
160
|
+
/** Restore state from a snapshot */
|
|
161
|
+
restoreSnapshot: (snapshotId: string) => Promise<unknown>;
|
|
162
|
+
/** Get available snapshots */
|
|
163
|
+
getSnapshots: () => Promise<Array<{
|
|
164
|
+
id: string;
|
|
165
|
+
label?: string;
|
|
166
|
+
createdAt: Date;
|
|
167
|
+
}>>;
|
|
168
|
+
/** Get the event sequence number */
|
|
169
|
+
getEventSequence: () => number;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Create a DatabaseContext implementation backed by ai-database
|
|
173
|
+
*
|
|
174
|
+
* @param options - Configuration options
|
|
175
|
+
* @returns DatabaseContext implementation with event sourcing capabilities
|
|
176
|
+
*/
|
|
177
|
+
export declare function createDatabaseContext(options: DatabaseContextOptions): EventSourcingContext;
|
|
178
|
+
/**
|
|
179
|
+
* Create a simple in-memory DatabaseContext for testing
|
|
180
|
+
*
|
|
181
|
+
* @returns DatabaseContext implementation backed by in-memory storage
|
|
182
|
+
*/
|
|
183
|
+
export declare function createMemoryDatabaseContext(): EventSourcingContext;
|
|
184
|
+
//# sourceMappingURL=database-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-context.d.ts","sourceRoot":"","sources":["../src/database-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DatabaseContext Implementation - Persistence layer for ai-workflows using ai-database
|
|
3
|
+
*
|
|
4
|
+
* Provides durable storage for workflow events, actions, and artifacts with:
|
|
5
|
+
* - Event sourcing (immutable event log)
|
|
6
|
+
* - State snapshots and restoration
|
|
7
|
+
* - Event replay capabilities
|
|
8
|
+
* - Action tracking with status management
|
|
9
|
+
* - Artifact caching for compiled content
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { DB } from 'ai-database'
|
|
14
|
+
* import { createDatabaseContext } from 'ai-workflows'
|
|
15
|
+
*
|
|
16
|
+
* const { db, events } = DB({
|
|
17
|
+
* WorkflowEvent: { type: 'string', data: 'string' },
|
|
18
|
+
* WorkflowAction: { actor: 'string', status: 'string' },
|
|
19
|
+
* WorkflowArtifact: { key: 'string', type: 'string' },
|
|
20
|
+
* WorkflowSnapshot: { workflowId: 'string', state: 'string' },
|
|
21
|
+
* })
|
|
22
|
+
*
|
|
23
|
+
* const dbContext = createDatabaseContext({ db, events })
|
|
24
|
+
*
|
|
25
|
+
* // Use with Workflow
|
|
26
|
+
* const workflow = Workflow($ => {
|
|
27
|
+
* $.on.Customer.created(async (customer, $) => {
|
|
28
|
+
* // Events are now persisted durably
|
|
29
|
+
* $.send('Email.welcome', { to: customer.email })
|
|
30
|
+
* })
|
|
31
|
+
* }, { db: dbContext })
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @packageDocumentation
|
|
35
|
+
*/
|
|
36
|
+
import { getLogger } from './logger.js';
|
|
37
|
+
/**
|
|
38
|
+
* Entity type names for database storage
|
|
39
|
+
*/
|
|
40
|
+
const ENTITY_TYPES = {
|
|
41
|
+
EVENT: 'WorkflowEvent',
|
|
42
|
+
ACTION: 'WorkflowAction',
|
|
43
|
+
ARTIFACT: 'WorkflowArtifact',
|
|
44
|
+
SNAPSHOT: 'WorkflowSnapshot',
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Generate a unique ID
|
|
48
|
+
*/
|
|
49
|
+
function generateId() {
|
|
50
|
+
if (typeof crypto !== 'undefined' && crypto.randomUUID) {
|
|
51
|
+
return crypto.randomUUID();
|
|
52
|
+
}
|
|
53
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create a DatabaseContext implementation backed by ai-database
|
|
57
|
+
*
|
|
58
|
+
* @param options - Configuration options
|
|
59
|
+
* @returns DatabaseContext implementation with event sourcing capabilities
|
|
60
|
+
*/
|
|
61
|
+
export function createDatabaseContext(options) {
|
|
62
|
+
const { db, events, workflowId, source = 'workflow' } = options;
|
|
63
|
+
// Track event sequence for ordering
|
|
64
|
+
let eventSequence = 0;
|
|
65
|
+
// Event handlers for live subscriptions
|
|
66
|
+
const eventHandlers = new Map();
|
|
67
|
+
/**
|
|
68
|
+
* Subscribe to live events from ai-database
|
|
69
|
+
*/
|
|
70
|
+
if (events?.on) {
|
|
71
|
+
// Subscribe to workflow events
|
|
72
|
+
events.on('WorkflowEvent.created', (data) => {
|
|
73
|
+
const event = data;
|
|
74
|
+
const handlers = eventHandlers.get(event.eventType);
|
|
75
|
+
if (handlers) {
|
|
76
|
+
const parsedData = JSON.parse(event.data);
|
|
77
|
+
for (const handler of handlers) {
|
|
78
|
+
try {
|
|
79
|
+
handler(parsedData);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
getLogger().error(`[database-context] Error in event handler for ${event.eventType}:`, error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
/**
|
|
90
|
+
* Record an event (immutable)
|
|
91
|
+
*/
|
|
92
|
+
async recordEvent(eventType, data) {
|
|
93
|
+
eventSequence++;
|
|
94
|
+
const eventId = generateId();
|
|
95
|
+
const timestamp = Date.now();
|
|
96
|
+
const storedEvent = {
|
|
97
|
+
eventType,
|
|
98
|
+
data: JSON.stringify(data),
|
|
99
|
+
timestamp,
|
|
100
|
+
source,
|
|
101
|
+
...(workflowId && { workflowId }),
|
|
102
|
+
};
|
|
103
|
+
// Store in database
|
|
104
|
+
await db.create(ENTITY_TYPES.EVENT, storedEvent, eventId);
|
|
105
|
+
// Emit to events API if available
|
|
106
|
+
if (events?.emit) {
|
|
107
|
+
await events.emit({
|
|
108
|
+
event: 'WorkflowEvent.created',
|
|
109
|
+
actor: source,
|
|
110
|
+
object: `${ENTITY_TYPES.EVENT}/${eventId}`,
|
|
111
|
+
objectData: storedEvent,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
/**
|
|
116
|
+
* Create an action (pending work)
|
|
117
|
+
*/
|
|
118
|
+
async createAction(action) {
|
|
119
|
+
const actionId = generateId();
|
|
120
|
+
const now = Date.now();
|
|
121
|
+
const storedAction = {
|
|
122
|
+
actor: action.actor,
|
|
123
|
+
object: action.object,
|
|
124
|
+
action: action.action,
|
|
125
|
+
status: action.status ?? 'pending',
|
|
126
|
+
metadata: JSON.stringify(action.metadata ?? {}),
|
|
127
|
+
createdAt: now,
|
|
128
|
+
updatedAt: now,
|
|
129
|
+
};
|
|
130
|
+
await db.create(ENTITY_TYPES.ACTION, storedAction, actionId);
|
|
131
|
+
if (events?.emit) {
|
|
132
|
+
await events.emit({
|
|
133
|
+
event: 'WorkflowAction.created',
|
|
134
|
+
actor: action.actor,
|
|
135
|
+
object: `${ENTITY_TYPES.ACTION}/${actionId}`,
|
|
136
|
+
objectData: storedAction,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
/**
|
|
141
|
+
* Complete an action
|
|
142
|
+
*/
|
|
143
|
+
async completeAction(id, result) {
|
|
144
|
+
const existing = await db.get(ENTITY_TYPES.ACTION, id);
|
|
145
|
+
if (!existing) {
|
|
146
|
+
throw new Error(`Action not found: ${id}`);
|
|
147
|
+
}
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
await db.update(ENTITY_TYPES.ACTION, id, {
|
|
150
|
+
status: 'completed',
|
|
151
|
+
result: JSON.stringify(result),
|
|
152
|
+
updatedAt: now,
|
|
153
|
+
completedAt: now,
|
|
154
|
+
});
|
|
155
|
+
if (events?.emit) {
|
|
156
|
+
// Cast is safe - we validated existing is not null above
|
|
157
|
+
const existingAction = existing;
|
|
158
|
+
await events.emit({
|
|
159
|
+
event: 'WorkflowAction.completed',
|
|
160
|
+
actor: existingAction.actor,
|
|
161
|
+
object: `${ENTITY_TYPES.ACTION}/${id}`,
|
|
162
|
+
result: result,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
/**
|
|
167
|
+
* Store an artifact
|
|
168
|
+
*/
|
|
169
|
+
async storeArtifact(artifact) {
|
|
170
|
+
const storedArtifact = {
|
|
171
|
+
key: artifact.key,
|
|
172
|
+
artifactType: artifact.type,
|
|
173
|
+
sourceHash: artifact.sourceHash,
|
|
174
|
+
content: JSON.stringify(artifact.content),
|
|
175
|
+
...(artifact.metadata && { metadata: JSON.stringify(artifact.metadata) }),
|
|
176
|
+
createdAt: Date.now(),
|
|
177
|
+
};
|
|
178
|
+
// Use key as ID for easy lookup
|
|
179
|
+
await db.create(ENTITY_TYPES.ARTIFACT, storedArtifact, artifact.key);
|
|
180
|
+
},
|
|
181
|
+
/**
|
|
182
|
+
* Get an artifact
|
|
183
|
+
*/
|
|
184
|
+
async getArtifact(key) {
|
|
185
|
+
const stored = await db.get(ENTITY_TYPES.ARTIFACT, key);
|
|
186
|
+
if (!stored) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
const artifact = stored;
|
|
190
|
+
return JSON.parse(artifact.content);
|
|
191
|
+
},
|
|
192
|
+
/**
|
|
193
|
+
* Get all events for a workflow
|
|
194
|
+
*/
|
|
195
|
+
async getEvents(queryOptions) {
|
|
196
|
+
const where = {};
|
|
197
|
+
if (workflowId) {
|
|
198
|
+
where['workflowId'] = workflowId;
|
|
199
|
+
}
|
|
200
|
+
const listOptions = {};
|
|
201
|
+
if (Object.keys(where).length > 0) {
|
|
202
|
+
listOptions.where = where;
|
|
203
|
+
}
|
|
204
|
+
if (queryOptions?.limit !== undefined) {
|
|
205
|
+
listOptions.limit = queryOptions.limit;
|
|
206
|
+
}
|
|
207
|
+
const results = await db.list(ENTITY_TYPES.EVENT, listOptions);
|
|
208
|
+
// Filter by timestamp if since is provided
|
|
209
|
+
let events = results;
|
|
210
|
+
if (queryOptions?.since) {
|
|
211
|
+
const sinceTimestamp = queryOptions.since.getTime();
|
|
212
|
+
events = events.filter((e) => e.timestamp >= sinceTimestamp);
|
|
213
|
+
}
|
|
214
|
+
// Sort by timestamp
|
|
215
|
+
events.sort((a, b) => a.timestamp - b.timestamp);
|
|
216
|
+
return events;
|
|
217
|
+
},
|
|
218
|
+
/**
|
|
219
|
+
* Replay events through a handler
|
|
220
|
+
*/
|
|
221
|
+
async replay(handler, replayOptions) {
|
|
222
|
+
const storedEvents = await this.getEvents(replayOptions);
|
|
223
|
+
for (const event of storedEvents) {
|
|
224
|
+
const data = JSON.parse(event.data);
|
|
225
|
+
await handler(event.eventType, data);
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
/**
|
|
229
|
+
* Create a snapshot of current state
|
|
230
|
+
*/
|
|
231
|
+
async createSnapshot(state, label) {
|
|
232
|
+
const snapshotId = `snap-${workflowId ?? 'global'}-${Date.now()}-${Math.random()
|
|
233
|
+
.toString(36)
|
|
234
|
+
.slice(2, 8)}`;
|
|
235
|
+
const storedSnapshot = {
|
|
236
|
+
workflowId: workflowId ?? 'global',
|
|
237
|
+
...(label && { label }),
|
|
238
|
+
state: JSON.stringify(state),
|
|
239
|
+
eventSequence,
|
|
240
|
+
createdAt: Date.now(),
|
|
241
|
+
};
|
|
242
|
+
await db.create(ENTITY_TYPES.SNAPSHOT, storedSnapshot, snapshotId);
|
|
243
|
+
if (events?.emit) {
|
|
244
|
+
await events.emit({
|
|
245
|
+
event: 'WorkflowSnapshot.created',
|
|
246
|
+
actor: source,
|
|
247
|
+
object: `${ENTITY_TYPES.SNAPSHOT}/${snapshotId}`,
|
|
248
|
+
objectData: { workflowId, label, eventSequence },
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
return snapshotId;
|
|
252
|
+
},
|
|
253
|
+
/**
|
|
254
|
+
* Restore state from a snapshot
|
|
255
|
+
*/
|
|
256
|
+
async restoreSnapshot(snapshotId) {
|
|
257
|
+
const stored = await db.get(ENTITY_TYPES.SNAPSHOT, snapshotId);
|
|
258
|
+
if (!stored) {
|
|
259
|
+
throw new Error(`Snapshot not found: ${snapshotId}`);
|
|
260
|
+
}
|
|
261
|
+
const snapshot = stored;
|
|
262
|
+
// Verify workflow ownership
|
|
263
|
+
if (workflowId && snapshot.workflowId !== workflowId) {
|
|
264
|
+
throw new Error(`Snapshot "${snapshotId}" does not belong to workflow "${workflowId}"`);
|
|
265
|
+
}
|
|
266
|
+
// Update event sequence to match snapshot
|
|
267
|
+
eventSequence = snapshot.eventSequence;
|
|
268
|
+
if (events?.emit) {
|
|
269
|
+
await events.emit({
|
|
270
|
+
event: 'WorkflowSnapshot.restored',
|
|
271
|
+
actor: source,
|
|
272
|
+
object: `${ENTITY_TYPES.SNAPSHOT}/${snapshotId}`,
|
|
273
|
+
result: { workflowId, eventSequence },
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
return JSON.parse(snapshot.state);
|
|
277
|
+
},
|
|
278
|
+
/**
|
|
279
|
+
* Get available snapshots
|
|
280
|
+
*/
|
|
281
|
+
async getSnapshots() {
|
|
282
|
+
const where = {};
|
|
283
|
+
if (workflowId) {
|
|
284
|
+
where['workflowId'] = workflowId;
|
|
285
|
+
}
|
|
286
|
+
const listOptions = {};
|
|
287
|
+
if (Object.keys(where).length > 0) {
|
|
288
|
+
listOptions.where = where;
|
|
289
|
+
}
|
|
290
|
+
const results = await db.list(ENTITY_TYPES.SNAPSHOT, listOptions);
|
|
291
|
+
return results
|
|
292
|
+
.map((s) => ({
|
|
293
|
+
id: s.$id,
|
|
294
|
+
...(s.label && { label: s.label }),
|
|
295
|
+
createdAt: new Date(s.createdAt),
|
|
296
|
+
}))
|
|
297
|
+
.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
|
|
298
|
+
},
|
|
299
|
+
/**
|
|
300
|
+
* Get the current event sequence number
|
|
301
|
+
*/
|
|
302
|
+
getEventSequence() {
|
|
303
|
+
return eventSequence;
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Create a simple in-memory DatabaseContext for testing
|
|
309
|
+
*
|
|
310
|
+
* @returns DatabaseContext implementation backed by in-memory storage
|
|
311
|
+
*/
|
|
312
|
+
export function createMemoryDatabaseContext() {
|
|
313
|
+
const events = [];
|
|
314
|
+
const actions = new Map();
|
|
315
|
+
const artifacts = new Map();
|
|
316
|
+
const snapshots = new Map();
|
|
317
|
+
let eventSequence = 0;
|
|
318
|
+
return {
|
|
319
|
+
async recordEvent(eventType, data) {
|
|
320
|
+
eventSequence++;
|
|
321
|
+
events.push({
|
|
322
|
+
$id: generateId(),
|
|
323
|
+
$type: ENTITY_TYPES.EVENT,
|
|
324
|
+
eventType,
|
|
325
|
+
data: JSON.stringify(data),
|
|
326
|
+
timestamp: Date.now(),
|
|
327
|
+
source: 'memory',
|
|
328
|
+
});
|
|
329
|
+
},
|
|
330
|
+
async createAction(action) {
|
|
331
|
+
const actionId = generateId();
|
|
332
|
+
const now = Date.now();
|
|
333
|
+
actions.set(actionId, {
|
|
334
|
+
$id: actionId,
|
|
335
|
+
$type: ENTITY_TYPES.ACTION,
|
|
336
|
+
actor: action.actor,
|
|
337
|
+
object: action.object,
|
|
338
|
+
action: action.action,
|
|
339
|
+
status: action.status ?? 'pending',
|
|
340
|
+
metadata: JSON.stringify(action.metadata ?? {}),
|
|
341
|
+
createdAt: now,
|
|
342
|
+
updatedAt: now,
|
|
343
|
+
});
|
|
344
|
+
},
|
|
345
|
+
async completeAction(id, result) {
|
|
346
|
+
const existing = actions.get(id);
|
|
347
|
+
if (!existing) {
|
|
348
|
+
throw new Error(`Action not found: ${id}`);
|
|
349
|
+
}
|
|
350
|
+
existing.status = 'completed';
|
|
351
|
+
existing.result = JSON.stringify(result);
|
|
352
|
+
existing.updatedAt = Date.now();
|
|
353
|
+
existing.completedAt = Date.now();
|
|
354
|
+
},
|
|
355
|
+
async storeArtifact(artifact) {
|
|
356
|
+
artifacts.set(artifact.key, {
|
|
357
|
+
$id: artifact.key,
|
|
358
|
+
$type: ENTITY_TYPES.ARTIFACT,
|
|
359
|
+
key: artifact.key,
|
|
360
|
+
artifactType: artifact.type,
|
|
361
|
+
sourceHash: artifact.sourceHash,
|
|
362
|
+
content: JSON.stringify(artifact.content),
|
|
363
|
+
...(artifact.metadata && { metadata: JSON.stringify(artifact.metadata) }),
|
|
364
|
+
createdAt: Date.now(),
|
|
365
|
+
});
|
|
366
|
+
},
|
|
367
|
+
async getArtifact(key) {
|
|
368
|
+
const stored = artifacts.get(key);
|
|
369
|
+
if (!stored) {
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
return JSON.parse(stored.content);
|
|
373
|
+
},
|
|
374
|
+
async getEvents(queryOptions) {
|
|
375
|
+
let result = [...events];
|
|
376
|
+
if (queryOptions?.since) {
|
|
377
|
+
const sinceTimestamp = queryOptions.since.getTime();
|
|
378
|
+
result = result.filter((e) => e.timestamp >= sinceTimestamp);
|
|
379
|
+
}
|
|
380
|
+
result.sort((a, b) => a.timestamp - b.timestamp);
|
|
381
|
+
if (queryOptions?.limit) {
|
|
382
|
+
result = result.slice(0, queryOptions.limit);
|
|
383
|
+
}
|
|
384
|
+
return result;
|
|
385
|
+
},
|
|
386
|
+
async replay(handler, replayOptions) {
|
|
387
|
+
const storedEvents = await this.getEvents(replayOptions);
|
|
388
|
+
for (const event of storedEvents) {
|
|
389
|
+
const data = JSON.parse(event.data);
|
|
390
|
+
await handler(event.eventType, data);
|
|
391
|
+
}
|
|
392
|
+
},
|
|
393
|
+
async createSnapshot(state, label) {
|
|
394
|
+
const snapshotId = `snap-memory-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
395
|
+
snapshots.set(snapshotId, {
|
|
396
|
+
$id: snapshotId,
|
|
397
|
+
$type: ENTITY_TYPES.SNAPSHOT,
|
|
398
|
+
workflowId: 'memory',
|
|
399
|
+
...(label && { label }),
|
|
400
|
+
state: JSON.stringify(state),
|
|
401
|
+
eventSequence,
|
|
402
|
+
createdAt: Date.now(),
|
|
403
|
+
});
|
|
404
|
+
return snapshotId;
|
|
405
|
+
},
|
|
406
|
+
async restoreSnapshot(snapshotId) {
|
|
407
|
+
const snapshot = snapshots.get(snapshotId);
|
|
408
|
+
if (!snapshot) {
|
|
409
|
+
throw new Error(`Snapshot not found: ${snapshotId}`);
|
|
410
|
+
}
|
|
411
|
+
eventSequence = snapshot.eventSequence;
|
|
412
|
+
return JSON.parse(snapshot.state);
|
|
413
|
+
},
|
|
414
|
+
async getSnapshots() {
|
|
415
|
+
return Array.from(snapshots.values())
|
|
416
|
+
.map((s) => ({
|
|
417
|
+
id: s.$id,
|
|
418
|
+
...(s.label && { label: s.label }),
|
|
419
|
+
createdAt: new Date(s.createdAt),
|
|
420
|
+
}))
|
|
421
|
+
.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
|
|
422
|
+
},
|
|
423
|
+
getEventSequence() {
|
|
424
|
+
return eventSequence;
|
|
425
|
+
},
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=database-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-context.js","sourceRoot":"","sources":["../src/database-context.ts"],"names":[],"mappings":"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"}
|