ai-workflows 2.1.3 → 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 (188) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +8 -1
  3. package/README.md +2 -0
  4. package/dist/barrier.d.ts +6 -0
  5. package/dist/barrier.d.ts.map +1 -1
  6. package/dist/barrier.js +45 -7
  7. package/dist/barrier.js.map +1 -1
  8. package/dist/cascade-context.d.ts.map +1 -1
  9. package/dist/cascade-context.js +25 -25
  10. package/dist/cascade-context.js.map +1 -1
  11. package/dist/cascade-executor.d.ts.map +1 -1
  12. package/dist/cascade-executor.js +1 -1
  13. package/dist/cascade-executor.js.map +1 -1
  14. package/dist/context.d.ts.map +1 -1
  15. package/dist/context.js +23 -7
  16. package/dist/context.js.map +1 -1
  17. package/dist/cron-parser.d.ts +65 -0
  18. package/dist/cron-parser.d.ts.map +1 -0
  19. package/dist/cron-parser.js +294 -0
  20. package/dist/cron-parser.js.map +1 -0
  21. package/dist/cron-scheduler.d.ts +117 -0
  22. package/dist/cron-scheduler.d.ts.map +1 -0
  23. package/dist/cron-scheduler.js +176 -0
  24. package/dist/cron-scheduler.js.map +1 -0
  25. package/dist/database-context.d.ts +184 -0
  26. package/dist/database-context.d.ts.map +1 -0
  27. package/dist/database-context.js +428 -0
  28. package/dist/database-context.js.map +1 -0
  29. package/dist/digital-objects-adapter.d.ts +159 -0
  30. package/dist/digital-objects-adapter.d.ts.map +1 -0
  31. package/dist/digital-objects-adapter.js +229 -0
  32. package/dist/digital-objects-adapter.js.map +1 -0
  33. package/dist/durable-execution-cloudflare.d.ts +427 -0
  34. package/dist/durable-execution-cloudflare.d.ts.map +1 -0
  35. package/dist/durable-execution-cloudflare.js +510 -0
  36. package/dist/durable-execution-cloudflare.js.map +1 -0
  37. package/dist/durable-execution.d.ts +482 -0
  38. package/dist/durable-execution.d.ts.map +1 -0
  39. package/dist/durable-execution.js +594 -0
  40. package/dist/durable-execution.js.map +1 -0
  41. package/dist/durable-workflow.d.ts +176 -0
  42. package/dist/durable-workflow.d.ts.map +1 -0
  43. package/dist/durable-workflow.js +552 -0
  44. package/dist/durable-workflow.js.map +1 -0
  45. package/dist/graph/topological-sort.d.ts.map +1 -1
  46. package/dist/graph/topological-sort.js +5 -5
  47. package/dist/graph/topological-sort.js.map +1 -1
  48. package/dist/index.d.ts +4 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +15 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/logger.d.ts +101 -0
  53. package/dist/logger.d.ts.map +1 -0
  54. package/dist/logger.js +115 -0
  55. package/dist/logger.js.map +1 -0
  56. package/dist/on.d.ts.map +1 -1
  57. package/dist/on.js +3 -3
  58. package/dist/on.js.map +1 -1
  59. package/dist/runtime.d.ts +169 -0
  60. package/dist/runtime.d.ts.map +1 -0
  61. package/dist/runtime.js +275 -0
  62. package/dist/runtime.js.map +1 -0
  63. package/dist/send.d.ts.map +1 -1
  64. package/dist/send.js +4 -3
  65. package/dist/send.js.map +1 -1
  66. package/dist/telemetry.d.ts +150 -0
  67. package/dist/telemetry.d.ts.map +1 -0
  68. package/dist/telemetry.js +388 -0
  69. package/dist/telemetry.js.map +1 -0
  70. package/dist/timer-registry.d.ts +25 -0
  71. package/dist/timer-registry.d.ts.map +1 -1
  72. package/dist/timer-registry.js +42 -8
  73. package/dist/timer-registry.js.map +1 -1
  74. package/dist/types.d.ts +17 -6
  75. package/dist/types.d.ts.map +1 -1
  76. package/dist/types.js +1 -1
  77. package/dist/types.js.map +1 -1
  78. package/dist/worker/durable-step.d.ts +481 -0
  79. package/dist/worker/durable-step.d.ts.map +1 -0
  80. package/dist/worker/durable-step.js +606 -0
  81. package/dist/worker/durable-step.js.map +1 -0
  82. package/dist/worker/index.d.ts +106 -0
  83. package/dist/worker/index.d.ts.map +1 -0
  84. package/dist/worker/index.js +124 -0
  85. package/dist/worker/index.js.map +1 -0
  86. package/dist/worker/state-adapter.d.ts +230 -0
  87. package/dist/worker/state-adapter.d.ts.map +1 -0
  88. package/dist/worker/state-adapter.js +409 -0
  89. package/dist/worker/state-adapter.js.map +1 -0
  90. package/dist/worker/topological-executor.d.ts +282 -0
  91. package/dist/worker/topological-executor.d.ts.map +1 -0
  92. package/dist/worker/topological-executor.js +396 -0
  93. package/dist/worker/topological-executor.js.map +1 -0
  94. package/dist/worker/workflow-builder.d.ts +286 -0
  95. package/dist/worker/workflow-builder.d.ts.map +1 -0
  96. package/dist/worker/workflow-builder.js +565 -0
  97. package/dist/worker/workflow-builder.js.map +1 -0
  98. package/dist/worker.d.ts +800 -0
  99. package/dist/worker.d.ts.map +1 -0
  100. package/dist/worker.js +2428 -0
  101. package/dist/worker.js.map +1 -0
  102. package/dist/workflow-builder.d.ts +287 -0
  103. package/dist/workflow-builder.d.ts.map +1 -0
  104. package/dist/workflow-builder.js +762 -0
  105. package/dist/workflow-builder.js.map +1 -0
  106. package/dist/workflow.d.ts +14 -30
  107. package/dist/workflow.d.ts.map +1 -1
  108. package/dist/workflow.js +132 -292
  109. package/dist/workflow.js.map +1 -1
  110. package/examples/01-ecommerce-order-pipeline.ts +358 -0
  111. package/examples/02-content-moderation-cascade.ts +454 -0
  112. package/examples/03-scheduled-reporting-dependencies.ts +479 -0
  113. package/examples/04-database-persistence.ts +518 -0
  114. package/examples/README.md +173 -0
  115. package/package.json +30 -13
  116. package/src/__tests__/digital-objects-adapter.test.ts +274 -0
  117. package/src/__tests__/durable-workflow.test.ts +297 -0
  118. package/src/barrier.ts +48 -7
  119. package/src/cascade-context.ts +36 -29
  120. package/src/cascade-executor.ts +3 -2
  121. package/src/context.ts +41 -12
  122. package/src/cron-parser.ts +347 -0
  123. package/src/cron-scheduler.ts +239 -0
  124. package/src/database-context.ts +658 -0
  125. package/src/digital-objects-adapter.ts +351 -0
  126. package/src/durable-execution-cloudflare.ts +855 -0
  127. package/src/durable-execution.ts +1042 -0
  128. package/src/durable-workflow.ts +717 -0
  129. package/src/graph/topological-sort.ts +6 -8
  130. package/src/index.ts +69 -0
  131. package/src/logger.ts +148 -0
  132. package/src/on.ts +8 -9
  133. package/src/runtime.ts +436 -0
  134. package/src/send.ts +4 -5
  135. package/src/telemetry.ts +577 -0
  136. package/src/timer-registry.ts +44 -10
  137. package/src/types.ts +32 -17
  138. package/src/worker/durable-step.ts +976 -0
  139. package/src/worker/index.ts +216 -0
  140. package/src/worker/state-adapter.ts +589 -0
  141. package/src/worker/topological-executor.ts +625 -0
  142. package/src/worker/workflow-builder.ts +871 -0
  143. package/src/worker.ts +2906 -0
  144. package/src/workflow-builder.ts +1068 -0
  145. package/src/workflow.ts +188 -351
  146. package/test/barrier-join.test.ts +32 -24
  147. package/test/cascade-executor.test.ts +9 -16
  148. package/test/cron-parser.test.ts +314 -0
  149. package/test/cron-scheduler.test.ts +291 -0
  150. package/test/database-context.test.ts +770 -0
  151. package/test/db-provider-adapter.test.ts +862 -0
  152. package/test/durable-execution-cloudflare.test.ts +606 -0
  153. package/test/durable-execution-in-process.test.ts +286 -0
  154. package/test/durable-execution.test.ts +247 -0
  155. package/test/e2e/workflow-scenarios.e2e.test.ts +1039 -0
  156. package/test/integration.test.ts +442 -0
  157. package/test/rpc-surface.test.ts +946 -0
  158. package/test/runtime.test.ts +262 -0
  159. package/test/schedule-timer-cleanup.test.ts +30 -21
  160. package/test/send-race-conditions.test.ts +30 -40
  161. package/test/worker/durable-cascade.test.ts +1117 -0
  162. package/test/worker/durable-step.test.ts +723 -0
  163. package/test/worker/topological-executor.test.ts +1240 -0
  164. package/test/worker/workflow-builder.test.ts +1067 -0
  165. package/test/worker.test.ts +608 -0
  166. package/test/workflow-builder.test.ts +1670 -0
  167. package/test/workflow-cron.test.ts +256 -0
  168. package/test/workflow-state-adapter.test.ts +923 -0
  169. package/test/workflow.test.ts +25 -22
  170. package/tsconfig.json +3 -1
  171. package/vitest.config.ts +38 -1
  172. package/vitest.workers.config.ts +44 -0
  173. package/wrangler.jsonc +22 -0
  174. package/.turbo/turbo-test.log +0 -169
  175. package/LICENSE +0 -21
  176. package/src/context.js +0 -83
  177. package/src/every.js +0 -267
  178. package/src/index.js +0 -71
  179. package/src/on.js +0 -79
  180. package/src/send.js +0 -111
  181. package/src/types.js +0 -4
  182. package/src/workflow.js +0 -455
  183. package/test/context.test.js +0 -116
  184. package/test/every.test.js +0 -282
  185. package/test/on.test.js +0 -80
  186. package/test/send.test.js +0 -89
  187. package/test/workflow.test.js +0 -224
  188. package/vitest.config.js +0 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-builder.js","sourceRoot":"","sources":["../src/workflow-builder.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,9 @@
15
15
  */
16
16
  import type { WorkflowContext, WorkflowState, WorkflowDefinition, WorkflowOptions, ParsedEvent } from './types.js';
17
17
  /**
18
- * Parse event string into noun and event
18
+ * Parse event string into noun and event.
19
+ * Re-exported from runtime.ts for backward compatibility — the canonical
20
+ * implementation lives there because dispatch owns event-name parsing.
19
21
  */
20
22
  export declare function parseEvent(event: string): ParsedEvent | null;
21
23
  /**
@@ -34,35 +36,17 @@ export interface WorkflowInstance {
34
36
  start: () => Promise<void>;
35
37
  /** Stop the workflow */
36
38
  stop: () => Promise<void>;
39
+ /** Destroy the workflow and clean up all resources */
40
+ destroy: () => Promise<void>;
41
+ /** Dispose pattern for cleanup */
42
+ dispose: () => void;
43
+ /** Symbol.dispose for using declaration support */
44
+ [Symbol.dispose]: () => void;
45
+ /** Number of active timers */
46
+ timerCount: number;
47
+ /** Get timer IDs for this workflow */
48
+ getTimerIds: () => string[];
37
49
  }
38
- /**
39
- * Create a workflow with the $ context
40
- *
41
- * @example
42
- * ```ts
43
- * const workflow = Workflow($ => {
44
- * $.on.Customer.created(async (customer, $) => {
45
- * $.log('New customer:', customer.name)
46
- * await $.send('Email.welcome', { to: customer.email })
47
- * })
48
- *
49
- * $.every.hour(async ($) => {
50
- * $.log('Hourly check')
51
- * })
52
- *
53
- * $.every.Monday.at9am(async ($) => {
54
- * $.log('Weekly standup')
55
- * })
56
- *
57
- * $.every('first Monday of the month', async ($) => {
58
- * $.log('Monthly report')
59
- * })
60
- * })
61
- *
62
- * await workflow.start()
63
- * await workflow.send('Customer.created', { name: 'John', email: 'john@example.com' })
64
- * ```
65
- */
66
50
  export declare function Workflow(setup: ($: WorkflowContext) => void, options?: WorkflowOptions): WorkflowInstance;
67
51
  /**
68
52
  * Create an isolated $ context for testing
@@ -74,6 +58,6 @@ export declare function createTestContext(): WorkflowContext & {
74
58
  }>;
75
59
  };
76
60
  export { on, registerEventHandler, getEventHandlers, clearEventHandlers } from './on.js';
77
- export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, toCron, intervalToMs, formatInterval, setCronConverter } from './every.js';
61
+ export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, toCron, intervalToMs, formatInterval, setCronConverter, } from './every.js';
78
62
  export { send } from './send.js';
79
63
  //# sourceMappingURL=workflow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EAOb,kBAAkB,EAClB,eAAe,EAIf,WAAW,EAEZ,MAAM,YAAY,CAAA;AA6DnB;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAU5D;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,UAAU,EAAE,kBAAkB,CAAA;IAC9B,oBAAoB;IACpB,KAAK,EAAE,aAAa,CAAA;IACpB,oBAAoB;IACpB,CAAC,EAAE,eAAe,CAAA;IAClB,oBAAoB;IACpB,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,sDAAsD;IACtD,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,wBAAwB;IACxB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,EACnC,OAAO,GAAE,eAAoB,GAC5B,gBAAgB,CAyVlB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,eAAe,GAAG;IAAE,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAAE,CAiEhH;AAGD,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AACxF,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC/J,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EAGb,kBAAkB,EAClB,eAAe,EAIf,WAAW,EACZ,MAAM,YAAY,CAAA;AAYnB;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,UAAU,EAAE,kBAAkB,CAAA;IAC9B,oBAAoB;IACpB,KAAK,EAAE,aAAa,CAAA;IACpB,oBAAoB;IACpB,CAAC,EAAE,eAAe,CAAA;IAClB,oBAAoB;IACpB,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,sDAAsD;IACtD,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,wBAAwB;IACxB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,sDAAsD;IACtD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,kCAAkC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,mDAAmD;IACnD,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,sCAAsC;IACtC,WAAW,EAAE,MAAM,MAAM,EAAE,CAAA;CAC5B;AAiCD,wBAAgB,QAAQ,CACtB,KAAK,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,EACnC,OAAO,GAAE,eAAoB,GAC5B,gBAAgB,CAgNlB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,eAAe,GAAG;IACrD,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CACvD,CA2EA;AAGD,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AACxF,OAAO,EACL,KAAK,EACL,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,MAAM,EACN,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA"}
package/dist/workflow.js CHANGED
@@ -13,75 +13,18 @@
13
13
  * })
14
14
  * })
15
15
  */
16
- import { PLURAL_UNITS, isPluralUnitKey } from './types.js';
16
+ import { registerTimer, clearTimersForWorkflow, getTimerIdsForWorkflow, registerProcessCleanup, } from './timer-registry.js';
17
+ import { createCronJob, stopCronJob } from './cron-scheduler.js';
18
+ import { toCron } from './every.js';
19
+ import { getLogger } from './logger.js';
20
+ import { createWorkflowRuntime, parseEvent as runtimeParseEvent } from './runtime.js';
17
21
  /**
18
- * Well-known cron patterns for common schedules
19
- */
20
- const KNOWN_PATTERNS = {
21
- second: '* * * * * *',
22
- minute: '* * * * *',
23
- hour: '0 * * * *',
24
- day: '0 0 * * *',
25
- week: '0 0 * * 0',
26
- month: '0 0 1 * *',
27
- year: '0 0 1 1 *',
28
- Monday: '0 0 * * 1',
29
- Tuesday: '0 0 * * 2',
30
- Wednesday: '0 0 * * 3',
31
- Thursday: '0 0 * * 4',
32
- Friday: '0 0 * * 5',
33
- Saturday: '0 0 * * 6',
34
- Sunday: '0 0 * * 0',
35
- weekday: '0 0 * * 1-5',
36
- weekend: '0 0 * * 0,6',
37
- midnight: '0 0 * * *',
38
- noon: '0 12 * * *',
39
- };
40
- /**
41
- * Time suffixes for day-based schedules
42
- */
43
- const TIME_PATTERNS = {
44
- at6am: { hour: 6, minute: 0 },
45
- at7am: { hour: 7, minute: 0 },
46
- at8am: { hour: 8, minute: 0 },
47
- at9am: { hour: 9, minute: 0 },
48
- at10am: { hour: 10, minute: 0 },
49
- at11am: { hour: 11, minute: 0 },
50
- at12pm: { hour: 12, minute: 0 },
51
- atnoon: { hour: 12, minute: 0 },
52
- at1pm: { hour: 13, minute: 0 },
53
- at2pm: { hour: 14, minute: 0 },
54
- at3pm: { hour: 15, minute: 0 },
55
- at4pm: { hour: 16, minute: 0 },
56
- at5pm: { hour: 17, minute: 0 },
57
- at6pm: { hour: 18, minute: 0 },
58
- at7pm: { hour: 19, minute: 0 },
59
- at8pm: { hour: 20, minute: 0 },
60
- at9pm: { hour: 21, minute: 0 },
61
- atmidnight: { hour: 0, minute: 0 },
62
- };
63
- /**
64
- * Combine a day pattern with a time pattern
65
- */
66
- function combineWithTime(baseCron, time) {
67
- const parts = baseCron.split(' ');
68
- parts[0] = String(time.minute);
69
- parts[1] = String(time.hour);
70
- return parts.join(' ');
71
- }
72
- /**
73
- * Parse event string into noun and event
22
+ * Parse event string into noun and event.
23
+ * Re-exported from runtime.ts for backward compatibility — the canonical
24
+ * implementation lives there because dispatch owns event-name parsing.
74
25
  */
75
26
  export function parseEvent(event) {
76
- const parts = event.split('.');
77
- if (parts.length !== 2) {
78
- return null;
79
- }
80
- const [noun, eventName] = parts;
81
- if (!noun || !eventName) {
82
- return null;
83
- }
84
- return { noun, event: eventName };
27
+ return runtimeParseEvent(event);
85
28
  }
86
29
  /**
87
30
  * Create a workflow with the $ context
@@ -111,19 +54,30 @@ export function parseEvent(event) {
111
54
  * await workflow.send('Customer.created', { name: 'John', email: 'john@example.com' })
112
55
  * ```
113
56
  */
57
+ // Counter for generating unique workflow IDs
58
+ let workflowCounter = 0;
114
59
  export function Workflow(setup, options = {}) {
115
- // Registries for handlers captured during setup
116
- const eventRegistry = [];
117
- const scheduleRegistry = [];
118
- // State
119
- const state = {
120
- context: { ...options.context },
121
- history: [],
122
- };
123
- // Schedule timers
60
+ // Generate unique workflow ID
61
+ const workflowId = `workflow-${++workflowCounter}-${Date.now()}`;
62
+ // Construct the runtime — it owns the $ contract end-to-end:
63
+ // event registry, schedule registry, dispatch, history, and state. The
64
+ // Workflow wrapper here is just a lifecycle shell around the runtime
65
+ // (timers, cron jobs, dispose pattern).
66
+ const runtime = createWorkflowRuntime({
67
+ ...(options.context !== undefined && { context: options.context }),
68
+ ...(options.db !== undefined && { db: options.db }),
69
+ name: 'workflow',
70
+ });
71
+ const $ = runtime.$;
72
+ const state = runtime.state;
73
+ const eventRegistry = runtime.getEventRegistry();
74
+ const scheduleRegistry = runtime.getScheduleRegistry();
75
+ // Schedule timers (local reference, actual timers are in registry)
124
76
  let scheduleTimers = [];
77
+ // Cron jobs for cron/natural schedules
78
+ const cronJobs = [];
125
79
  /**
126
- * Add to history
80
+ * Append to workflow history (used by schedule firing below).
127
81
  */
128
82
  const addHistory = (entry) => {
129
83
  state.history.push({
@@ -131,206 +85,14 @@ export function Workflow(setup, options = {}) {
131
85
  timestamp: Date.now(),
132
86
  });
133
87
  };
134
- /**
135
- * Register an event handler
136
- */
137
- const registerEventHandler = (noun, event, handler) => {
138
- eventRegistry.push({
139
- noun,
140
- event,
141
- handler,
142
- source: handler.toString(),
143
- });
144
- };
145
- /**
146
- * Register a schedule handler
147
- */
148
- const registerScheduleHandler = (interval, handler) => {
149
- scheduleRegistry.push({
150
- interval,
151
- handler,
152
- source: handler.toString(),
153
- });
154
- };
155
- /**
156
- * Create the $.on proxy
157
- */
158
- const createOnProxy = () => {
159
- return new Proxy({}, {
160
- get(_target, noun) {
161
- return new Proxy({}, {
162
- get(_eventTarget, event) {
163
- return (handler) => {
164
- registerEventHandler(noun, event, handler);
165
- };
166
- }
167
- });
168
- }
169
- });
170
- };
171
- /**
172
- * Create the $.every proxy
173
- */
174
- const createEveryProxy = () => {
175
- const handler = {
176
- get(_target, prop) {
177
- const pattern = KNOWN_PATTERNS[prop];
178
- if (pattern) {
179
- const result = (handlerFn) => {
180
- registerScheduleHandler({ type: 'cron', expression: pattern, natural: prop }, handlerFn);
181
- };
182
- return new Proxy(result, {
183
- get(_t, timeKey) {
184
- const time = TIME_PATTERNS[timeKey];
185
- if (time) {
186
- const cron = combineWithTime(pattern, time);
187
- return (handlerFn) => {
188
- registerScheduleHandler({ type: 'cron', expression: cron, natural: `${prop}.${timeKey}` }, handlerFn);
189
- };
190
- }
191
- return undefined;
192
- },
193
- apply(_t, _thisArg, args) {
194
- registerScheduleHandler({ type: 'cron', expression: pattern, natural: prop }, args[0]);
195
- }
196
- });
197
- }
198
- // Plural units (seconds, minutes, hours, days, weeks)
199
- // Using type guard and typed constant for type-safe interval creation
200
- if (isPluralUnitKey(prop)) {
201
- const intervalType = PLURAL_UNITS[prop];
202
- return (value) => (handlerFn) => {
203
- registerScheduleHandler({ type: intervalType, value, natural: `${value} ${prop}` }, handlerFn);
204
- };
205
- }
206
- return undefined;
207
- },
208
- apply(_target, _thisArg, args) {
209
- const [description, handler] = args;
210
- if (typeof description === 'string' && typeof handler === 'function') {
211
- registerScheduleHandler({ type: 'natural', description }, handler);
212
- }
213
- }
214
- };
215
- // Create callable target with proper typing
216
- // The function serves as the Proxy target - actual behavior is in the handler's apply trap
217
- // Cast to EveryProxy is safe: Proxy handler implements all EveryProxy behaviors dynamically
218
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
219
- const target = function (_description, _handler) { };
220
- return new Proxy(target, handler);
221
- };
222
- /**
223
- * Deliver an event to matching handlers (fire and forget)
224
- */
225
- const deliverEvent = async (event, data) => {
226
- const parsed = parseEvent(event);
227
- if (!parsed) {
228
- console.warn(`Invalid event format: ${event}. Expected Noun.event`);
229
- return;
230
- }
231
- const matching = eventRegistry.filter(h => h.noun === parsed.noun && h.event === parsed.event);
232
- if (matching.length === 0) {
233
- return;
234
- }
235
- await Promise.all(matching.map(async ({ handler }) => {
236
- try {
237
- await handler(data, $);
238
- }
239
- catch (error) {
240
- console.error(`Error in handler for ${event}:`, error);
241
- }
242
- }));
243
- };
244
- /**
245
- * Execute an event and wait for result from first matching handler
246
- */
247
- const executeEvent = async (event, data, durable) => {
248
- const parsed = parseEvent(event);
249
- if (!parsed) {
250
- throw new Error(`Invalid event format: ${event}. Expected Noun.event`);
251
- }
252
- const matching = eventRegistry.filter(h => h.noun === parsed.noun && h.event === parsed.event);
253
- if (matching.length === 0) {
254
- throw new Error(`No handler registered for ${event}`);
255
- }
256
- // Use first matching handler for result
257
- const { handler } = matching[0];
258
- if (durable && options.db) {
259
- // Create action for durability tracking
260
- await options.db.createAction({
261
- actor: 'workflow',
262
- object: event,
263
- action: 'execute',
264
- metadata: { data },
265
- });
266
- }
267
- try {
268
- const result = await handler(data, $);
269
- return result;
270
- }
271
- catch (error) {
272
- if (durable) {
273
- // Could implement retry logic here
274
- console.error(`[workflow] Durable action failed for ${event}:`, error);
275
- }
276
- throw error;
277
- }
278
- };
279
- /**
280
- * Create the $ context
281
- */
282
- const $ = {
283
- async send(event, data) {
284
- addHistory({ type: 'event', name: event, data });
285
- // Record to database if connected (durable)
286
- if (options.db) {
287
- await options.db.recordEvent(event, data);
288
- }
289
- await deliverEvent(event, data);
290
- },
291
- async do(event, data) {
292
- addHistory({ type: 'action', name: `do:${event}`, data });
293
- // Record to database (durable)
294
- if (options.db) {
295
- await options.db.recordEvent(event, data);
296
- }
297
- return executeEvent(event, data, true);
298
- },
299
- async try(event, data) {
300
- addHistory({ type: 'action', name: `try:${event}`, data });
301
- // Non-durable - no database recording
302
- return executeEvent(event, data, false);
303
- },
304
- on: createOnProxy(),
305
- every: createEveryProxy(),
306
- // Direct access to state context
307
- state: state.context,
308
- getState() {
309
- // Return a deep copy to prevent mutation
310
- return structuredClone({
311
- current: state.current,
312
- context: state.context,
313
- history: state.history,
314
- });
315
- },
316
- set(key, value) {
317
- state.context[key] = value;
318
- },
319
- get(key) {
320
- return state.context[key];
321
- },
322
- log(message, data) {
323
- addHistory({ type: 'action', name: 'log', data: { message, data } });
324
- console.log(`[workflow] ${message}`, data ?? '');
325
- },
326
- db: options.db,
327
- };
328
- // Run setup to capture handlers
88
+ // Run setup to capture handlers via $.on / $.every (which delegate to the runtime).
329
89
  setup($);
330
90
  /**
331
91
  * Start schedule handlers
332
92
  */
333
93
  const startSchedules = async () => {
94
+ // Register process cleanup on first schedule start
95
+ registerProcessCleanup();
334
96
  for (const schedule of scheduleRegistry) {
335
97
  const { interval, handler } = schedule;
336
98
  let ms = 0;
@@ -350,32 +112,92 @@ export function Workflow(setup, options = {}) {
350
112
  case 'week':
351
113
  ms = (interval.value ?? 1) * 7 * 24 * 60 * 60 * 1000;
352
114
  break;
353
- case 'cron':
354
- case 'natural':
355
- // Cron/natural need special handling - throw error to avoid silent failures
356
- throw new Error(`Cron scheduling not yet implemented: "${interval.type === 'cron' ? interval.expression : interval.description}". ` +
357
- `Use interval-based patterns like $.every.seconds(30), $.every.minutes(5), or $.every.hours(1) instead.`);
115
+ case 'cron': {
116
+ // Schedule using cron expression
117
+ const cronExpression = interval.expression;
118
+ const job = createCronJob(cronExpression, async () => {
119
+ try {
120
+ addHistory({ type: 'schedule', name: interval.natural ?? `cron:${cronExpression}` });
121
+ await handler($);
122
+ }
123
+ catch (error) {
124
+ getLogger().error('[workflow] Cron schedule handler error:', error);
125
+ }
126
+ }, {
127
+ id: `${workflowId}-cron-${scheduleRegistry.indexOf(schedule)}`,
128
+ onError: (error) => {
129
+ getLogger().error('[workflow] Cron job error:', error);
130
+ },
131
+ });
132
+ cronJobs.push(job);
133
+ break;
134
+ }
135
+ case 'natural': {
136
+ // Convert natural language to cron using toCron()
137
+ // This may be async if AI converter is set
138
+ const naturalDesc = interval.description;
139
+ toCron(naturalDesc)
140
+ .then((cronExpression) => {
141
+ const job = createCronJob(cronExpression, async () => {
142
+ try {
143
+ addHistory({ type: 'schedule', name: naturalDesc });
144
+ await handler($);
145
+ }
146
+ catch (error) {
147
+ getLogger().error('[workflow] Natural schedule handler error:', error);
148
+ }
149
+ }, {
150
+ id: `${workflowId}-natural-${scheduleRegistry.indexOf(schedule)}`,
151
+ onError: (error) => {
152
+ getLogger().error('[workflow] Natural schedule job error:', error);
153
+ },
154
+ });
155
+ cronJobs.push(job);
156
+ })
157
+ .catch((error) => {
158
+ getLogger().error(`[workflow] Failed to parse natural schedule "${naturalDesc}":`, error);
159
+ });
160
+ break;
161
+ }
358
162
  }
359
163
  if (ms > 0) {
164
+ // Get schedule name based on interval type
165
+ const scheduleName = 'natural' in interval && interval.natural ? interval.natural : interval.type;
360
166
  const timer = setInterval(async () => {
361
167
  try {
362
- addHistory({ type: 'schedule', name: interval.natural ?? interval.type });
168
+ addHistory({ type: 'schedule', name: scheduleName });
363
169
  await handler($);
364
170
  }
365
171
  catch (error) {
366
- console.error('[workflow] Schedule handler error:', error);
172
+ getLogger().error('[workflow] Schedule handler error:', error);
367
173
  }
368
174
  }, ms);
369
175
  scheduleTimers.push(timer);
176
+ // Register timer with global registry for cleanup tracking
177
+ registerTimer(workflowId, timer);
370
178
  }
371
179
  }
372
180
  };
181
+ /**
182
+ * Clean up all timers and resources
183
+ */
184
+ const cleanup = () => {
185
+ // Clear via global registry (this also clears the intervals)
186
+ clearTimersForWorkflow(workflowId);
187
+ // Clear local references
188
+ scheduleTimers = [];
189
+ // Stop all cron jobs
190
+ for (const job of cronJobs) {
191
+ stopCronJob(job);
192
+ }
193
+ cronJobs.length = 0;
194
+ };
373
195
  const instance = {
374
196
  definition: {
375
197
  name: 'workflow',
376
198
  events: eventRegistry,
377
199
  schedules: scheduleRegistry,
378
- initialContext: options.context,
200
+ ...(options.context !== undefined && { initialContext: options.context }),
379
201
  },
380
202
  get state() {
381
203
  return state;
@@ -385,15 +207,27 @@ export function Workflow(setup, options = {}) {
385
207
  await $.send(event, data);
386
208
  },
387
209
  async start() {
388
- console.log(`[workflow] Starting with ${eventRegistry.length} event handlers and ${scheduleRegistry.length} schedules`);
210
+ getLogger().log(`[workflow] Starting with ${eventRegistry.length} event handlers and ${scheduleRegistry.length} schedules`);
389
211
  await startSchedules();
390
212
  },
391
213
  async stop() {
392
- console.log('[workflow] Stopping');
393
- for (const timer of scheduleTimers) {
394
- clearInterval(timer);
395
- }
396
- scheduleTimers = [];
214
+ getLogger().log('[workflow] Stopping');
215
+ cleanup();
216
+ },
217
+ async destroy() {
218
+ cleanup();
219
+ },
220
+ dispose() {
221
+ cleanup();
222
+ },
223
+ [Symbol.dispose]() {
224
+ cleanup();
225
+ },
226
+ get timerCount() {
227
+ return getTimerIdsForWorkflow(workflowId).length + cronJobs.filter((j) => !j.stopped).length;
228
+ },
229
+ getTimerIds() {
230
+ return getTimerIdsForWorkflow(workflowId);
397
231
  },
398
232
  };
399
233
  return instance;
@@ -407,8 +241,14 @@ export function createTestContext() {
407
241
  const history = [];
408
242
  const $ = {
409
243
  emittedEvents,
410
- async send(event, data) {
411
- emittedEvents.push({ event, data });
244
+ track(event, data) {
245
+ // Fire and forget for testing - just record it
246
+ emittedEvents.push({ event: `track:${event}`, data });
247
+ },
248
+ send(event, data) {
249
+ const eventId = crypto.randomUUID();
250
+ emittedEvents.push({ event, data: { ...data, _eventId: eventId } });
251
+ return eventId;
412
252
  },
413
253
  async do(_event, _data) {
414
254
  throw new Error('$.do not implemented in test context - register handlers via Workflow()');
@@ -421,9 +261,9 @@ export function createTestContext() {
421
261
  return new Proxy({}, {
422
262
  get() {
423
263
  return () => { }; // No-op for testing
424
- }
264
+ },
425
265
  });
426
- }
266
+ },
427
267
  }),
428
268
  // Cast to EveryProxy is safe: Proxy handler implements all EveryProxy behaviors dynamically
429
269
  every: new Proxy(
@@ -432,7 +272,7 @@ export function createTestContext() {
432
272
  get() {
433
273
  return () => () => { }; // No-op for testing
434
274
  },
435
- apply() { }
275
+ apply() { },
436
276
  }),
437
277
  state: stateContext,
438
278
  getState() {
@@ -448,13 +288,13 @@ export function createTestContext() {
448
288
  return stateContext[key];
449
289
  },
450
290
  log(message, data) {
451
- console.log(`[test] ${message}`, data ?? '');
291
+ getLogger().log(`[test] ${message}`, data ?? '');
452
292
  },
453
293
  };
454
294
  return $;
455
295
  }
456
296
  // Also export standalone on/every for import { on, every } usage
457
297
  export { on, registerEventHandler, getEventHandlers, clearEventHandlers } from './on.js';
458
- export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, toCron, intervalToMs, formatInterval, setCronConverter } from './every.js';
298
+ export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, toCron, intervalToMs, formatInterval, setCronConverter, } from './every.js';
459
299
  export { send } from './send.js';
460
300
  //# sourceMappingURL=workflow.js.map