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 @@
1
+ {"version":3,"file":"cron-scheduler.js","sourceRoot":"","sources":["../src/cron-scheduler.ts"],"names":[],"mappings":"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"}
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AA8IvC;;GAEG;AACH,MAAM,YAAY,GAAG;IACnB,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,kBAAkB;IAC5B,QAAQ,EAAE,kBAAkB;CACpB,CAAA;AAEV;;GAEG;AACH,SAAS,UAAU;IACjB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACvD,OAAO,MAAM,CAAC,UAAU,EAAE,CAAA;IAC5B,CAAC;IACD,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACnE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,GAAG,OAAO,CAAA;IAE/D,oCAAoC;IACpC,IAAI,aAAa,GAAG,CAAC,CAAA;IAErB,wCAAwC;IACxC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwC,CAAA;IAErE;;OAEG;IACH,IAAI,MAAM,EAAE,EAAE,EAAE,CAAC;QACf,+BAA+B;QAC/B,MAAM,CAAC,EAAE,CAAC,uBAAuB,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,IAAmB,CAAA;YACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACnD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,IAAI,CAAC;wBACH,OAAO,CAAC,UAAU,CAAC,CAAA;oBACrB,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,SAAS,EAAE,CAAC,KAAK,CACf,iDAAiD,KAAK,CAAC,SAAS,GAAG,EACnE,KAAK,CACN,CAAA;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL;;WAEG;QACH,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,IAAa;YAChD,aAAa,EAAE,CAAA;YACf,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAE5B,MAAM,WAAW,GAAuC;gBACtD,SAAS;gBACT,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,SAAS;gBACT,MAAM;gBACN,GAAG,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,CAAC;aAClC,CAAA;YAED,oBAAoB;YACpB,MAAM,EAAE,CAAC,MAAM,CACb,YAAY,CAAC,KAAK,EAClB,WAAiD,EACjD,OAAO,CACR,CAAA;YAED,kCAAkC;YAClC,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;gBACjB,MAAM,MAAM,CAAC,IAAI,CAAC;oBAChB,KAAK,EAAE,uBAAuB;oBAC9B,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,IAAI,OAAO,EAAE;oBAC1C,UAAU,EAAE,WAAW;iBACxB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,YAAY,CAAC,MAAkB;YACnC,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAA;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAEtB,MAAM,YAAY,GAAwC;gBACxD,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;gBAClC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;gBAC/C,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf,CAAA;YAED,MAAM,EAAE,CAAC,MAAM,CACb,YAAY,CAAC,MAAM,EACnB,YAAkD,EAClD,QAAQ,CACT,CAAA;YAED,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;gBACjB,MAAM,MAAM,CAAC,IAAI,CAAC;oBAChB,KAAK,EAAE,wBAAwB;oBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,IAAI,QAAQ,EAAE;oBAC5C,UAAU,EAAE,YAAY;iBACzB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,cAAc,CAAC,EAAU,EAAE,MAAe;YAC9C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAA;YAC5C,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACtB,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,EAAE;gBACvC,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC9B,SAAS,EAAE,GAAG;gBACd,WAAW,EAAE,GAAG;aACjB,CAAC,CAAA;YAEF,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;gBACjB,yDAAyD;gBACzD,MAAM,cAAc,GAAG,QAAmC,CAAA;gBAC1D,MAAM,MAAM,CAAC,IAAI,CAAC;oBAChB,KAAK,EAAE,0BAA0B;oBACjC,KAAK,EAAE,cAAc,CAAC,KAAK;oBAC3B,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,IAAI,EAAE,EAAE;oBACtC,MAAM,EAAE,MAAM;iBACf,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,aAAa,CAAC,QAAsB;YACxC,MAAM,cAAc,GAA0C;gBAC5D,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACzC,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAA;YAED,gCAAgC;YAChC,MAAM,EAAE,CAAC,MAAM,CACb,YAAY,CAAC,QAAQ,EACrB,cAAoD,EACpD,QAAQ,CAAC,GAAG,CACb,CAAA;QACH,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,WAAW,CAAC,GAAW;YAC3B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YACvD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAA;YACb,CAAC;YAED,MAAM,QAAQ,GAAG,MAAmC,CAAA;YACpD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACrC,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,SAAS,CAAC,YAA+C;YAC7D,MAAM,KAAK,GAA4B,EAAE,CAAA;YACzC,IAAI,UAAU,EAAE,CAAC;gBACf,KAAK,CAAC,YAAY,CAAC,GAAG,UAAU,CAAA;YAClC,CAAC;YAED,MAAM,WAAW,GAAwD,EAAE,CAAA;YAC3E,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,WAAW,CAAC,KAAK,GAAG,KAAK,CAAA;YAC3B,CAAC;YACD,IAAI,YAAY,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtC,WAAW,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAA;YACxC,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;YAE9D,2CAA2C;YAC3C,IAAI,MAAM,GAAG,OAAmC,CAAA;YAChD,IAAI,YAAY,EAAE,KAAK,EAAE,CAAC;gBACxB,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;gBACnD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,cAAc,CAAC,CAAA;YAC9D,CAAC;YAED,oBAAoB;YACpB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;YAEhD,OAAO,MAAM,CAAA;QACf,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,MAAM,CACV,OAAwD,EACxD,aAAgC;YAEhC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;YAExD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACnC,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,cAAc,CAAC,KAAc,EAAE,KAAc;YACjD,MAAM,UAAU,GAAG,QAAQ,UAAU,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;iBAC7E,QAAQ,CAAC,EAAE,CAAC;iBACZ,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;YAEhB,MAAM,cAAc,GAA0C;gBAC5D,UAAU,EAAE,UAAU,IAAI,QAAQ;gBAClC,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC;gBACvB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC5B,aAAa;gBACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAA;YAED,MAAM,EAAE,CAAC,MAAM,CACb,YAAY,CAAC,QAAQ,EACrB,cAAoD,EACpD,UAAU,CACX,CAAA;YAED,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;gBACjB,MAAM,MAAM,CAAC,IAAI,CAAC;oBAChB,KAAK,EAAE,0BAA0B;oBACjC,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,IAAI,UAAU,EAAE;oBAChD,UAAU,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE;iBACjD,CAAC,CAAA;YACJ,CAAC;YAED,OAAO,UAAU,CAAA;QACnB,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,eAAe,CAAC,UAAkB;YACtC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;YAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAA;YACtD,CAAC;YAED,MAAM,QAAQ,GAAG,MAAmC,CAAA;YAEpD,4BAA4B;YAC5B,IAAI,UAAU,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,aAAa,UAAU,kCAAkC,UAAU,GAAG,CAAC,CAAA;YACzF,CAAC;YAED,0CAA0C;YAC1C,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAA;YAEtC,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;gBACjB,MAAM,MAAM,CAAC,IAAI,CAAC;oBAChB,KAAK,EAAE,2BAA2B;oBAClC,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,IAAI,UAAU,EAAE;oBAChD,MAAM,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE;iBACtC,CAAC,CAAA;YACJ,CAAC;YAED,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACnC,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,YAAY;YAChB,MAAM,KAAK,GAA4B,EAAE,CAAA;YACzC,IAAI,UAAU,EAAE,CAAC;gBACf,KAAK,CAAC,YAAY,CAAC,GAAG,UAAU,CAAA;YAClC,CAAC;YAED,MAAM,WAAW,GAAwC,EAAE,CAAA;YAC3D,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,WAAW,CAAC,KAAK,GAAG,KAAK,CAAA;YAC3B,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;YAEjE,OAAQ,OAAuC;iBAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACX,EAAE,EAAE,CAAC,CAAC,GAAG;gBACT,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;gBAClC,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;aACjC,CAAC,CAAC;iBACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;QAClE,CAAC;QAED;;WAEG;QACH,gBAAgB;YACd,OAAO,aAAa,CAAA;QACtB,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B;IACzC,MAAM,MAAM,GAAkB,EAAE,CAAA;IAChC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAA;IAC/C,MAAM,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAA;IACnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAA;IACnD,IAAI,aAAa,GAAG,CAAC,CAAA;IAErB,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,IAAa;YAChD,aAAa,EAAE,CAAA;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,UAAU,EAAE;gBACjB,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,SAAS;gBACT,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,MAAkB;YACnC,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAA;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACtB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;gBACpB,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,YAAY,CAAC,MAAM;gBAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;gBAClC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;gBAC/C,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,EAAU,EAAE,MAAe;YAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAA;YAC5C,CAAC;YACD,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAA;YAC7B,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YACxC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAC/B,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACnC,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,QAAsB;YACxC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;gBAC1B,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,KAAK,EAAE,YAAY,CAAC,QAAQ;gBAC5B,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACzC,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,GAAW;YAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACjC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,YAA+C;YAC7D,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;YAExB,IAAI,YAAY,EAAE,KAAK,EAAE,CAAC;gBACxB,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;gBACnD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,cAAc,CAAC,CAAA;YAC9D,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;YAEhD,IAAI,YAAY,EAAE,KAAK,EAAE,CAAC;gBACxB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;YAC9C,CAAC;YAED,OAAO,MAAM,CAAA;QACf,CAAC;QAED,KAAK,CAAC,MAAM,CACV,OAAwD,EACxD,aAAgC;YAEhC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;YAExD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACnC,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,KAAc,EAAE,KAAc;YACjD,MAAM,UAAU,GAAG,eAAe,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;YAExF,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE;gBACxB,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,YAAY,CAAC,QAAQ;gBAC5B,UAAU,EAAE,QAAQ;gBACpB,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC;gBACvB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC5B,aAAa;gBACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAA;YAEF,OAAO,UAAU,CAAA;QACnB,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,UAAkB;YACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAA;YACtD,CAAC;YAED,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAA;YACtC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACnC,CAAC;QAED,KAAK,CAAC,YAAY;YAChB,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;iBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACX,EAAE,EAAE,CAAC,CAAC,GAAG;gBACT,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;gBAClC,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;aACjC,CAAC,CAAC;iBACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;QAClE,CAAC;QAED,gBAAgB;YACd,OAAO,aAAa,CAAA;QACtB,CAAC;KACF,CAAA;AACH,CAAC"}