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
package/src/index.js DELETED
@@ -1,71 +0,0 @@
1
- /**
2
- * ai-workflows - Event-driven workflows with $ context
3
- *
4
- * @example
5
- * ```ts
6
- * import { Workflow } from 'ai-workflows'
7
- *
8
- * // Create a workflow with $ context
9
- * const workflow = Workflow($ => {
10
- * // Register event handlers
11
- * $.on.Customer.created(async (customer, $) => {
12
- * $.log('New customer:', customer.name)
13
- * await $.send('Email.welcome', { to: customer.email })
14
- * })
15
- *
16
- * $.on.Order.completed(async (order, $) => {
17
- * $.log('Order completed:', order.id)
18
- * })
19
- *
20
- * // Register scheduled tasks
21
- * $.every.hour(async ($) => {
22
- * $.log('Hourly check')
23
- * })
24
- *
25
- * $.every.Monday.at9am(async ($) => {
26
- * $.log('Weekly standup reminder')
27
- * })
28
- *
29
- * $.every.minutes(30)(async ($) => {
30
- * $.log('Every 30 minutes')
31
- * })
32
- *
33
- * // Natural language scheduling
34
- * $.every('first Monday of the month', async ($) => {
35
- * $.log('Monthly report')
36
- * })
37
- * })
38
- *
39
- * // Start the workflow
40
- * await workflow.start()
41
- *
42
- * // Emit events
43
- * await workflow.send('Customer.created', { name: 'John', email: 'john@example.com' })
44
- * ```
45
- *
46
- * @example
47
- * // Alternative: Use standalone on/every for global registration
48
- * ```ts
49
- * import { on, every, send } from 'ai-workflows'
50
- *
51
- * on.Customer.created(async (customer, $) => {
52
- * await $.send('Email.welcome', { to: customer.email })
53
- * })
54
- *
55
- * every.hour(async ($) => {
56
- * $.log('Hourly task')
57
- * })
58
- *
59
- * await send('Customer.created', { name: 'John' })
60
- * ```
61
- */
62
- // Main Workflow API
63
- export { Workflow, createTestContext, parseEvent } from './workflow.js';
64
- // Standalone event handling (for global registration)
65
- export { on, registerEventHandler, getEventHandlers, clearEventHandlers } from './on.js';
66
- // Standalone scheduling (for global registration)
67
- export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, setCronConverter, toCron, intervalToMs, formatInterval, } from './every.js';
68
- // Event emission
69
- export { send, getEventBus } from './send.js';
70
- // Context
71
- export { createWorkflowContext, createIsolatedContext } from './context.js';
package/src/on.js DELETED
@@ -1,79 +0,0 @@
1
- /**
2
- * Event handler registration using on.Noun.event syntax
3
- *
4
- * Usage:
5
- * on.Customer.created(customer => { ... })
6
- * on.Order.completed(order => { ... })
7
- * on.Payment.failed(payment => { ... })
8
- */
9
- /**
10
- * Registry of event handlers
11
- */
12
- const eventRegistry = [];
13
- /**
14
- * Get all registered event handlers
15
- */
16
- export function getEventHandlers() {
17
- return [...eventRegistry];
18
- }
19
- /**
20
- * Clear all registered event handlers
21
- */
22
- export function clearEventHandlers() {
23
- eventRegistry.length = 0;
24
- }
25
- /**
26
- * Register an event handler directly
27
- */
28
- export function registerEventHandler(noun, event, handler) {
29
- eventRegistry.push({
30
- noun,
31
- event,
32
- handler,
33
- source: handler.toString(),
34
- });
35
- }
36
- /**
37
- * Create the `on` proxy
38
- *
39
- * This creates a proxy that allows:
40
- * on.Customer.created(handler)
41
- * on.Order.shipped(handler)
42
- *
43
- * The first property access captures the noun (Customer, Order)
44
- * The second property access captures the event (created, shipped)
45
- * The function call registers the handler
46
- */
47
- function createOnProxy() {
48
- return new Proxy({}, {
49
- get(_target, noun) {
50
- // Return a proxy for the event level
51
- return new Proxy({}, {
52
- get(_eventTarget, event) {
53
- // Return a function that registers the handler
54
- return (handler) => {
55
- registerEventHandler(noun, event, handler);
56
- };
57
- }
58
- });
59
- }
60
- });
61
- }
62
- /**
63
- * The `on` object for registering event handlers
64
- *
65
- * @example
66
- * ```ts
67
- * import { on } from 'ai-workflows'
68
- *
69
- * on.Customer.created(async (customer, $) => {
70
- * $.log('Customer created:', customer.name)
71
- * await $.send('Email.welcome', { to: customer.email })
72
- * })
73
- *
74
- * on.Order.completed(async (order, $) => {
75
- * $.log('Order completed:', order.id)
76
- * })
77
- * ```
78
- */
79
- export const on = createOnProxy();
package/src/send.js DELETED
@@ -1,111 +0,0 @@
1
- /**
2
- * Event emission using send('Noun.event', data)
3
- *
4
- * Usage:
5
- * send('Customer.created', customer)
6
- * send('Order.completed', order)
7
- */
8
- import { getEventHandlers } from './on.js';
9
- import { createWorkflowContext } from './context.js';
10
- /**
11
- * Event bus for managing event delivery
12
- */
13
- class EventBus {
14
- pending = [];
15
- processing = false;
16
- /**
17
- * Emit an event
18
- */
19
- async emit(event, data) {
20
- this.pending.push({ event, data });
21
- if (!this.processing) {
22
- await this.process();
23
- }
24
- }
25
- /**
26
- * Process pending events
27
- */
28
- async process() {
29
- this.processing = true;
30
- while (this.pending.length > 0) {
31
- const item = this.pending.shift();
32
- await this.deliver(item.event, item.data);
33
- }
34
- this.processing = false;
35
- }
36
- /**
37
- * Deliver an event to matching handlers
38
- */
39
- async deliver(event, data) {
40
- const parsed = parseEvent(event);
41
- if (!parsed) {
42
- console.warn(`Invalid event format: ${event}. Expected Noun.event`);
43
- return;
44
- }
45
- const handlers = getEventHandlers();
46
- const matching = handlers.filter(h => h.noun === parsed.noun && h.event === parsed.event);
47
- if (matching.length === 0) {
48
- // No handlers registered - that's okay, event is just not handled
49
- return;
50
- }
51
- // Create workflow context for handlers
52
- const ctx = createWorkflowContext(this);
53
- // Execute all matching handlers
54
- await Promise.all(matching.map(async ({ handler }) => {
55
- try {
56
- await handler(data, ctx);
57
- }
58
- catch (error) {
59
- console.error(`Error in handler for ${event}:`, error);
60
- }
61
- }));
62
- }
63
- }
64
- /**
65
- * Parse event string into noun and event
66
- */
67
- export function parseEvent(event) {
68
- const parts = event.split('.');
69
- if (parts.length !== 2) {
70
- return null;
71
- }
72
- const [noun, eventName] = parts;
73
- if (!noun || !eventName) {
74
- return null;
75
- }
76
- return { noun, event: eventName };
77
- }
78
- /**
79
- * Global event bus instance
80
- */
81
- const globalEventBus = new EventBus();
82
- /**
83
- * Send an event
84
- *
85
- * @example
86
- * ```ts
87
- * import { send } from 'ai-workflows'
88
- *
89
- * // Emit a customer created event
90
- * await send('Customer.created', {
91
- * id: '123',
92
- * name: 'John Doe',
93
- * email: 'john@example.com'
94
- * })
95
- *
96
- * // Emit an order completed event
97
- * await send('Order.completed', {
98
- * id: 'order-456',
99
- * total: 99.99
100
- * })
101
- * ```
102
- */
103
- export async function send(event, data) {
104
- await globalEventBus.emit(event, data);
105
- }
106
- /**
107
- * Get the global event bus (for testing/internal use)
108
- */
109
- export function getEventBus() {
110
- return globalEventBus;
111
- }
package/src/types.js DELETED
@@ -1,4 +0,0 @@
1
- /**
2
- * Types for ai-workflows
3
- */
4
- export {};