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":"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,EAGf,WAAW,EAEZ,MAAM,YAAY,CAAA;AA4DnB;;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,CA4DhH;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,74 +13,18 @@
13
13
  * })
14
14
  * })
15
15
  */
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';
16
21
  /**
17
- * Well-known cron patterns for common schedules
18
- */
19
- const KNOWN_PATTERNS = {
20
- second: '* * * * * *',
21
- minute: '* * * * *',
22
- hour: '0 * * * *',
23
- day: '0 0 * * *',
24
- week: '0 0 * * 0',
25
- month: '0 0 1 * *',
26
- year: '0 0 1 1 *',
27
- Monday: '0 0 * * 1',
28
- Tuesday: '0 0 * * 2',
29
- Wednesday: '0 0 * * 3',
30
- Thursday: '0 0 * * 4',
31
- Friday: '0 0 * * 5',
32
- Saturday: '0 0 * * 6',
33
- Sunday: '0 0 * * 0',
34
- weekday: '0 0 * * 1-5',
35
- weekend: '0 0 * * 0,6',
36
- midnight: '0 0 * * *',
37
- noon: '0 12 * * *',
38
- };
39
- /**
40
- * Time suffixes for day-based schedules
41
- */
42
- const TIME_PATTERNS = {
43
- at6am: { hour: 6, minute: 0 },
44
- at7am: { hour: 7, minute: 0 },
45
- at8am: { hour: 8, minute: 0 },
46
- at9am: { hour: 9, minute: 0 },
47
- at10am: { hour: 10, minute: 0 },
48
- at11am: { hour: 11, minute: 0 },
49
- at12pm: { hour: 12, minute: 0 },
50
- atnoon: { hour: 12, minute: 0 },
51
- at1pm: { hour: 13, minute: 0 },
52
- at2pm: { hour: 14, minute: 0 },
53
- at3pm: { hour: 15, minute: 0 },
54
- at4pm: { hour: 16, minute: 0 },
55
- at5pm: { hour: 17, minute: 0 },
56
- at6pm: { hour: 18, minute: 0 },
57
- at7pm: { hour: 19, minute: 0 },
58
- at8pm: { hour: 20, minute: 0 },
59
- at9pm: { hour: 21, minute: 0 },
60
- atmidnight: { hour: 0, minute: 0 },
61
- };
62
- /**
63
- * Combine a day pattern with a time pattern
64
- */
65
- function combineWithTime(baseCron, time) {
66
- const parts = baseCron.split(' ');
67
- parts[0] = String(time.minute);
68
- parts[1] = String(time.hour);
69
- return parts.join(' ');
70
- }
71
- /**
72
- * 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.
73
25
  */
74
26
  export function parseEvent(event) {
75
- const parts = event.split('.');
76
- if (parts.length !== 2) {
77
- return null;
78
- }
79
- const [noun, eventName] = parts;
80
- if (!noun || !eventName) {
81
- return null;
82
- }
83
- return { noun, event: eventName };
27
+ return runtimeParseEvent(event);
84
28
  }
85
29
  /**
86
30
  * Create a workflow with the $ context
@@ -110,19 +54,30 @@ export function parseEvent(event) {
110
54
  * await workflow.send('Customer.created', { name: 'John', email: 'john@example.com' })
111
55
  * ```
112
56
  */
57
+ // Counter for generating unique workflow IDs
58
+ let workflowCounter = 0;
113
59
  export function Workflow(setup, options = {}) {
114
- // Registries for handlers captured during setup
115
- const eventRegistry = [];
116
- const scheduleRegistry = [];
117
- // State
118
- const state = {
119
- context: { ...options.context },
120
- history: [],
121
- };
122
- // 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)
123
76
  let scheduleTimers = [];
77
+ // Cron jobs for cron/natural schedules
78
+ const cronJobs = [];
124
79
  /**
125
- * Add to history
80
+ * Append to workflow history (used by schedule firing below).
126
81
  */
127
82
  const addHistory = (entry) => {
128
83
  state.history.push({
@@ -130,206 +85,14 @@ export function Workflow(setup, options = {}) {
130
85
  timestamp: Date.now(),
131
86
  });
132
87
  };
133
- /**
134
- * Register an event handler
135
- */
136
- const registerEventHandler = (noun, event, handler) => {
137
- eventRegistry.push({
138
- noun,
139
- event,
140
- handler,
141
- source: handler.toString(),
142
- });
143
- };
144
- /**
145
- * Register a schedule handler
146
- */
147
- const registerScheduleHandler = (interval, handler) => {
148
- scheduleRegistry.push({
149
- interval,
150
- handler,
151
- source: handler.toString(),
152
- });
153
- };
154
- /**
155
- * Create the $.on proxy
156
- */
157
- const createOnProxy = () => {
158
- return new Proxy({}, {
159
- get(_target, noun) {
160
- return new Proxy({}, {
161
- get(_eventTarget, event) {
162
- return (handler) => {
163
- registerEventHandler(noun, event, handler);
164
- };
165
- }
166
- });
167
- }
168
- });
169
- };
170
- /**
171
- * Create the $.every proxy
172
- */
173
- const createEveryProxy = () => {
174
- const handler = {
175
- get(_target, prop) {
176
- const pattern = KNOWN_PATTERNS[prop];
177
- if (pattern) {
178
- const result = (handlerFn) => {
179
- registerScheduleHandler({ type: 'cron', expression: pattern, natural: prop }, handlerFn);
180
- };
181
- return new Proxy(result, {
182
- get(_t, timeKey) {
183
- const time = TIME_PATTERNS[timeKey];
184
- if (time) {
185
- const cron = combineWithTime(pattern, time);
186
- return (handlerFn) => {
187
- registerScheduleHandler({ type: 'cron', expression: cron, natural: `${prop}.${timeKey}` }, handlerFn);
188
- };
189
- }
190
- return undefined;
191
- },
192
- apply(_t, _thisArg, args) {
193
- registerScheduleHandler({ type: 'cron', expression: pattern, natural: prop }, args[0]);
194
- }
195
- });
196
- }
197
- // Plural units (seconds, minutes, hours, days, weeks)
198
- const pluralUnits = {
199
- seconds: 'second',
200
- minutes: 'minute',
201
- hours: 'hour',
202
- days: 'day',
203
- weeks: 'week',
204
- };
205
- if (pluralUnits[prop]) {
206
- return (value) => (handlerFn) => {
207
- registerScheduleHandler({ type: pluralUnits[prop], value, natural: `${value} ${prop}` }, handlerFn);
208
- };
209
- }
210
- return undefined;
211
- },
212
- apply(_target, _thisArg, args) {
213
- const [description, handler] = args;
214
- if (typeof description === 'string' && typeof handler === 'function') {
215
- registerScheduleHandler({ type: 'natural', description }, handler);
216
- }
217
- }
218
- };
219
- return new Proxy(function () { }, handler);
220
- };
221
- /**
222
- * Deliver an event to matching handlers (fire and forget)
223
- */
224
- const deliverEvent = async (event, data) => {
225
- const parsed = parseEvent(event);
226
- if (!parsed) {
227
- console.warn(`Invalid event format: ${event}. Expected Noun.event`);
228
- return;
229
- }
230
- const matching = eventRegistry.filter(h => h.noun === parsed.noun && h.event === parsed.event);
231
- if (matching.length === 0) {
232
- return;
233
- }
234
- await Promise.all(matching.map(async ({ handler }) => {
235
- try {
236
- await handler(data, $);
237
- }
238
- catch (error) {
239
- console.error(`Error in handler for ${event}:`, error);
240
- }
241
- }));
242
- };
243
- /**
244
- * Execute an event and wait for result from first matching handler
245
- */
246
- const executeEvent = async (event, data, durable) => {
247
- const parsed = parseEvent(event);
248
- if (!parsed) {
249
- throw new Error(`Invalid event format: ${event}. Expected Noun.event`);
250
- }
251
- const matching = eventRegistry.filter(h => h.noun === parsed.noun && h.event === parsed.event);
252
- if (matching.length === 0) {
253
- throw new Error(`No handler registered for ${event}`);
254
- }
255
- // Use first matching handler for result
256
- const { handler } = matching[0];
257
- if (durable && options.db) {
258
- // Create action for durability tracking
259
- await options.db.createAction({
260
- actor: 'workflow',
261
- object: event,
262
- action: 'execute',
263
- metadata: { data },
264
- });
265
- }
266
- try {
267
- const result = await handler(data, $);
268
- return result;
269
- }
270
- catch (error) {
271
- if (durable) {
272
- // Could implement retry logic here
273
- console.error(`[workflow] Durable action failed for ${event}:`, error);
274
- }
275
- throw error;
276
- }
277
- };
278
- /**
279
- * Create the $ context
280
- */
281
- const $ = {
282
- async send(event, data) {
283
- addHistory({ type: 'event', name: event, data });
284
- // Record to database if connected (durable)
285
- if (options.db) {
286
- await options.db.recordEvent(event, data);
287
- }
288
- await deliverEvent(event, data);
289
- },
290
- async do(event, data) {
291
- addHistory({ type: 'action', name: `do:${event}`, data });
292
- // Record to database (durable)
293
- if (options.db) {
294
- await options.db.recordEvent(event, data);
295
- }
296
- return executeEvent(event, data, true);
297
- },
298
- async try(event, data) {
299
- addHistory({ type: 'action', name: `try:${event}`, data });
300
- // Non-durable - no database recording
301
- return executeEvent(event, data, false);
302
- },
303
- on: createOnProxy(),
304
- every: createEveryProxy(),
305
- // Direct access to state context
306
- state: state.context,
307
- getState() {
308
- // Return a deep copy to prevent mutation
309
- return structuredClone({
310
- current: state.current,
311
- context: state.context,
312
- history: state.history,
313
- });
314
- },
315
- set(key, value) {
316
- state.context[key] = value;
317
- },
318
- get(key) {
319
- return state.context[key];
320
- },
321
- log(message, data) {
322
- addHistory({ type: 'action', name: 'log', data: { message, data } });
323
- console.log(`[workflow] ${message}`, data ?? '');
324
- },
325
- db: options.db,
326
- };
327
- // Run setup to capture handlers
88
+ // Run setup to capture handlers via $.on / $.every (which delegate to the runtime).
328
89
  setup($);
329
90
  /**
330
91
  * Start schedule handlers
331
92
  */
332
93
  const startSchedules = async () => {
94
+ // Register process cleanup on first schedule start
95
+ registerProcessCleanup();
333
96
  for (const schedule of scheduleRegistry) {
334
97
  const { interval, handler } = schedule;
335
98
  let ms = 0;
@@ -349,32 +112,92 @@ export function Workflow(setup, options = {}) {
349
112
  case 'week':
350
113
  ms = (interval.value ?? 1) * 7 * 24 * 60 * 60 * 1000;
351
114
  break;
352
- case 'cron':
353
- case 'natural':
354
- // Cron/natural need special handling - throw error to avoid silent failures
355
- throw new Error(`Cron scheduling not yet implemented: "${interval.type === 'cron' ? interval.expression : interval.description}". ` +
356
- `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
+ }
357
162
  }
358
163
  if (ms > 0) {
164
+ // Get schedule name based on interval type
165
+ const scheduleName = 'natural' in interval && interval.natural ? interval.natural : interval.type;
359
166
  const timer = setInterval(async () => {
360
167
  try {
361
- addHistory({ type: 'schedule', name: interval.natural ?? interval.type });
168
+ addHistory({ type: 'schedule', name: scheduleName });
362
169
  await handler($);
363
170
  }
364
171
  catch (error) {
365
- console.error('[workflow] Schedule handler error:', error);
172
+ getLogger().error('[workflow] Schedule handler error:', error);
366
173
  }
367
174
  }, ms);
368
175
  scheduleTimers.push(timer);
176
+ // Register timer with global registry for cleanup tracking
177
+ registerTimer(workflowId, timer);
369
178
  }
370
179
  }
371
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
+ };
372
195
  const instance = {
373
196
  definition: {
374
197
  name: 'workflow',
375
198
  events: eventRegistry,
376
199
  schedules: scheduleRegistry,
377
- initialContext: options.context,
200
+ ...(options.context !== undefined && { initialContext: options.context }),
378
201
  },
379
202
  get state() {
380
203
  return state;
@@ -384,15 +207,27 @@ export function Workflow(setup, options = {}) {
384
207
  await $.send(event, data);
385
208
  },
386
209
  async start() {
387
- 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`);
388
211
  await startSchedules();
389
212
  },
390
213
  async stop() {
391
- console.log('[workflow] Stopping');
392
- for (const timer of scheduleTimers) {
393
- clearInterval(timer);
394
- }
395
- 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);
396
231
  },
397
232
  };
398
233
  return instance;
@@ -406,8 +241,14 @@ export function createTestContext() {
406
241
  const history = [];
407
242
  const $ = {
408
243
  emittedEvents,
409
- async send(event, data) {
410
- 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;
411
252
  },
412
253
  async do(_event, _data) {
413
254
  throw new Error('$.do not implemented in test context - register handlers via Workflow()');
@@ -420,15 +261,18 @@ export function createTestContext() {
420
261
  return new Proxy({}, {
421
262
  get() {
422
263
  return () => { }; // No-op for testing
423
- }
264
+ },
424
265
  });
425
- }
266
+ },
426
267
  }),
427
- every: new Proxy(function () { }, {
268
+ // Cast to EveryProxy is safe: Proxy handler implements all EveryProxy behaviors dynamically
269
+ every: new Proxy(
270
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
271
+ ((_description, _handler) => { }), {
428
272
  get() {
429
273
  return () => () => { }; // No-op for testing
430
274
  },
431
- apply() { }
275
+ apply() { },
432
276
  }),
433
277
  state: stateContext,
434
278
  getState() {
@@ -444,13 +288,13 @@ export function createTestContext() {
444
288
  return stateContext[key];
445
289
  },
446
290
  log(message, data) {
447
- console.log(`[test] ${message}`, data ?? '');
291
+ getLogger().log(`[test] ${message}`, data ?? '');
448
292
  },
449
293
  };
450
294
  return $;
451
295
  }
452
296
  // Also export standalone on/every for import { on, every } usage
453
297
  export { on, registerEventHandler, getEventHandlers, clearEventHandlers } from './on.js';
454
- 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';
455
299
  export { send } from './send.js';
456
300
  //# sourceMappingURL=workflow.js.map