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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AAGH,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAG9F,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAGxF,OAAO,EACL,KAAK,EACL,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAG7C,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAG3E,YAAY,EACV,YAAY,EACZ,eAAe,EACf,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,OAAO,EACP,UAAU,EACV,eAAe,EACf,eAAe,EACf,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -61,6 +61,13 @@
61
61
  */
62
62
  // Main Workflow API
63
63
  export { Workflow, createTestContext, parseEvent } from './workflow.js';
64
+ // WorkflowRuntime - single owner of the `$` runtime contract
65
+ // (composes cascade-context, database-context, on/send/every internally).
66
+ // New callers should reach for createWorkflowRuntime() to understand exactly
67
+ // what `$` contains end-to-end. The Workflow() function wraps a runtime with
68
+ // schedule/timer lifecycle; for tests, runtime.dispatch() is the canonical
69
+ // surface.
70
+ export { createWorkflowRuntime, } from './runtime.js';
64
71
  // Standalone event handling (for global registration)
65
72
  export { on, registerEventHandler, getEventHandlers, clearEventHandlers } from './on.js';
66
73
  // Standalone scheduling (for global registration)
@@ -69,4 +76,22 @@ export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandl
69
76
  export { send, getEventBus } from './send.js';
70
77
  // Context
71
78
  export { createWorkflowContext, createIsolatedContext } from './context.js';
79
+ // Cascade Context - Correlation IDs and step metadata
80
+ export { createCascadeContext, recordStep, withCascadeContext, } from './cascade-context.js';
81
+ // Dependency Graph
82
+ export { DependencyGraph, CircularDependencyError, MissingDependencyError, } from './dependency-graph.js';
83
+ // Topological Sort - Execution ordering algorithms
84
+ export { topologicalSort, topologicalSortKahn, topologicalSortDFS, getExecutionLevels, CycleDetectedError, MissingNodeError, } from './graph/topological-sort.js';
85
+ // Barrier/Join Semantics - Parallel step coordination
86
+ export { Barrier, BarrierTimeoutError, createBarrier, waitForAll, waitForAny, withConcurrencyLimit, } from './barrier.js';
87
+ // Cascade Executor - code -> generative -> agentic -> human pattern
88
+ export { CascadeExecutor, CascadeTimeoutError, TierSkippedError, AllTiersFailedError, TIER_ORDER, DEFAULT_TIER_TIMEOUTS, } from './cascade-executor.js';
89
+ // DurableStep - Cloudflare Workflows step wrapper
90
+ export { DurableStep, StepContext as DurableStepContext,
91
+ // Cascade types
92
+ DurableCascadeStep, AllTiersFailed, CascadeTimeout, DEFAULT_CASCADE_TIMEOUTS, CASCADE_TIER_ORDER, } from './worker/durable-step.js';
93
+ // WorkflowBuilder DSL - Fluent API for building durable workflows
94
+ export { workflow, WorkflowBuilder, } from './workflow-builder.js';
95
+ // WorkflowStateAdapter - Persistent state storage
96
+ export { WorkflowStateAdapter, } from './worker/state-adapter.js';
72
97
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AAEH,oBAAoB;AACpB,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAyB,MAAM,eAAe,CAAA;AAE9F,sDAAsD;AACtD,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAExF,kDAAkD;AAClD,OAAO,EACL,KAAK,EACL,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAA;AAEnB,iBAAiB;AACjB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE7C,UAAU;AACV,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AAEH,oBAAoB;AACpB,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAyB,MAAM,eAAe,CAAA;AAE9F,6DAA6D;AAC7D,0EAA0E;AAC1E,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,WAAW;AACX,OAAO,EACL,qBAAqB,GAGtB,MAAM,cAAc,CAAA;AAErB,sDAAsD;AACtD,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAExF,kDAAkD;AAClD,OAAO,EACL,KAAK,EACL,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAA;AAEnB,iBAAiB;AACjB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE7C,UAAU;AACV,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAE3E,sDAAsD;AACtD,OAAO,EACL,oBAAoB,EACpB,UAAU,EACV,kBAAkB,GASnB,MAAM,sBAAsB,CAAA;AAE7B,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,sBAAsB,GAKvB,MAAM,uBAAuB,CAAA;AAE9B,mDAAmD;AACnD,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GAKjB,MAAM,6BAA6B,CAAA;AAEpC,sDAAsD;AACtD,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,aAAa,EACb,UAAU,EACV,UAAU,EACV,oBAAoB,GAQrB,MAAM,cAAc,CAAA;AAErB,oEAAoE;AACpE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,qBAAqB,GAUtB,MAAM,uBAAuB,CAAA;AAE9B,kDAAkD;AAClD,OAAO,EACL,WAAW,EACX,WAAW,IAAI,kBAAkB;AAMjC,gBAAgB;AAChB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,wBAAwB,EACxB,kBAAkB,GAanB,MAAM,0BAA0B,CAAA;AAEjC,kEAAkE;AAClE,OAAO,EACL,QAAQ,EACR,eAAe,GAahB,MAAM,uBAAuB,CAAA;AAE9B,kDAAkD;AAClD,OAAO,EACL,oBAAoB,GAMrB,MAAM,2BAA2B,CAAA"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Configurable Logger Interface
3
+ *
4
+ * Provides a pluggable logging abstraction for ai-workflows.
5
+ * By default uses console.log/warn/error, but can be replaced
6
+ * with any logging implementation.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { setLogger, getLogger } from 'ai-workflows'
11
+ *
12
+ * // Use default console logger
13
+ * const logger = getLogger()
14
+ * logger.log('[workflow] Starting', { workflowId: '123' })
15
+ *
16
+ * // Set a custom logger
17
+ * setLogger({
18
+ * log: (msg, data) => winston.info(msg, data),
19
+ * warn: (msg, data) => winston.warn(msg, data),
20
+ * error: (msg, error) => winston.error(msg, { error }),
21
+ * })
22
+ *
23
+ * // Disable logging
24
+ * setLogger({
25
+ * log: () => {},
26
+ * warn: () => {},
27
+ * error: () => {},
28
+ * })
29
+ * ```
30
+ */
31
+ /**
32
+ * Logger interface for ai-workflows
33
+ *
34
+ * Implementations must provide log, warn, and error methods.
35
+ * Data parameter is optional and can be any value for context.
36
+ */
37
+ export interface Logger {
38
+ /**
39
+ * Log informational messages
40
+ * @param msg - The log message
41
+ * @param data - Optional data for context
42
+ */
43
+ log(msg: string, data?: unknown): void;
44
+ /**
45
+ * Log warning messages
46
+ * @param msg - The warning message
47
+ * @param data - Optional data for context
48
+ */
49
+ warn(msg: string, data?: unknown): void;
50
+ /**
51
+ * Log error messages
52
+ * @param msg - The error message
53
+ * @param error - Optional error object or data
54
+ */
55
+ error(msg: string, error?: unknown): void;
56
+ }
57
+ /**
58
+ * Default console logger implementation
59
+ *
60
+ * Uses console.log, console.warn, and console.error.
61
+ */
62
+ export declare const consoleLogger: Logger;
63
+ /**
64
+ * No-op logger that discards all messages
65
+ *
66
+ * Useful for silencing logs in tests or production.
67
+ */
68
+ export declare const noopLogger: Logger;
69
+ /**
70
+ * Get the current logger instance
71
+ *
72
+ * @returns The current Logger implementation
73
+ */
74
+ export declare function getLogger(): Logger;
75
+ /**
76
+ * Set the logger implementation
77
+ *
78
+ * @param logger - The Logger implementation to use
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * // Use a custom logger
83
+ * setLogger({
84
+ * log: (msg, data) => myLogger.info(msg, data),
85
+ * warn: (msg, data) => myLogger.warn(msg, data),
86
+ * error: (msg, error) => myLogger.error(msg, { error }),
87
+ * })
88
+ *
89
+ * // Disable logging
90
+ * setLogger(noopLogger)
91
+ *
92
+ * // Reset to console
93
+ * setLogger(consoleLogger)
94
+ * ```
95
+ */
96
+ export declare function setLogger(logger: Logger): void;
97
+ /**
98
+ * Reset the logger to the default console logger
99
+ */
100
+ export declare function resetLogger(): void;
101
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAEtC;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAEvC;;;;OAIG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CAC1C;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAwB3B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAIxB,CAAA;AAQD;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
package/dist/logger.js ADDED
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Configurable Logger Interface
3
+ *
4
+ * Provides a pluggable logging abstraction for ai-workflows.
5
+ * By default uses console.log/warn/error, but can be replaced
6
+ * with any logging implementation.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { setLogger, getLogger } from 'ai-workflows'
11
+ *
12
+ * // Use default console logger
13
+ * const logger = getLogger()
14
+ * logger.log('[workflow] Starting', { workflowId: '123' })
15
+ *
16
+ * // Set a custom logger
17
+ * setLogger({
18
+ * log: (msg, data) => winston.info(msg, data),
19
+ * warn: (msg, data) => winston.warn(msg, data),
20
+ * error: (msg, error) => winston.error(msg, { error }),
21
+ * })
22
+ *
23
+ * // Disable logging
24
+ * setLogger({
25
+ * log: () => {},
26
+ * warn: () => {},
27
+ * error: () => {},
28
+ * })
29
+ * ```
30
+ */
31
+ /**
32
+ * Default console logger implementation
33
+ *
34
+ * Uses console.log, console.warn, and console.error.
35
+ */
36
+ export const consoleLogger = {
37
+ log(msg, data) {
38
+ if (data !== undefined) {
39
+ console.log(msg, data);
40
+ }
41
+ else {
42
+ console.log(msg);
43
+ }
44
+ },
45
+ warn(msg, data) {
46
+ if (data !== undefined) {
47
+ console.warn(msg, data);
48
+ }
49
+ else {
50
+ console.warn(msg);
51
+ }
52
+ },
53
+ error(msg, error) {
54
+ if (error !== undefined) {
55
+ console.error(msg, error);
56
+ }
57
+ else {
58
+ console.error(msg);
59
+ }
60
+ },
61
+ };
62
+ /**
63
+ * No-op logger that discards all messages
64
+ *
65
+ * Useful for silencing logs in tests or production.
66
+ */
67
+ export const noopLogger = {
68
+ log() { },
69
+ warn() { },
70
+ error() { },
71
+ };
72
+ /**
73
+ * Current logger instance
74
+ * Defaults to consoleLogger
75
+ */
76
+ let currentLogger = consoleLogger;
77
+ /**
78
+ * Get the current logger instance
79
+ *
80
+ * @returns The current Logger implementation
81
+ */
82
+ export function getLogger() {
83
+ return currentLogger;
84
+ }
85
+ /**
86
+ * Set the logger implementation
87
+ *
88
+ * @param logger - The Logger implementation to use
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * // Use a custom logger
93
+ * setLogger({
94
+ * log: (msg, data) => myLogger.info(msg, data),
95
+ * warn: (msg, data) => myLogger.warn(msg, data),
96
+ * error: (msg, error) => myLogger.error(msg, { error }),
97
+ * })
98
+ *
99
+ * // Disable logging
100
+ * setLogger(noopLogger)
101
+ *
102
+ * // Reset to console
103
+ * setLogger(consoleLogger)
104
+ * ```
105
+ */
106
+ export function setLogger(logger) {
107
+ currentLogger = logger;
108
+ }
109
+ /**
110
+ * Reset the logger to the default console logger
111
+ */
112
+ export function resetLogger() {
113
+ currentLogger = consoleLogger;
114
+ }
115
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AA+BH;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,GAAG,CAAC,GAAW,EAAE,IAAc;QAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,IAAc;QAC9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,KAAe;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC3B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;CACF,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAW;IAChC,GAAG,KAAU,CAAC;IACd,IAAI,KAAU,CAAC;IACf,KAAK,KAAU,CAAC;CACjB,CAAA;AAED;;;GAGG;AACH,IAAI,aAAa,GAAW,aAAa,CAAA;AAEzC;;;;GAIG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,aAAa,CAAA;AACtB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,aAAa,GAAG,MAAM,CAAA;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,aAAa,GAAG,aAAa,CAAA;AAC/B,CAAC"}
package/dist/on.d.ts CHANGED
@@ -5,8 +5,12 @@
5
5
  * on.Customer.created(customer => { ... })
6
6
  * on.Order.completed(order => { ... })
7
7
  * on.Payment.failed(payment => { ... })
8
+ *
9
+ * With dependencies:
10
+ * on.Step2.complete(handler, { dependsOn: 'Step1.complete' })
11
+ * on.Step3.complete(handler, { dependsOn: ['Step1.complete', 'Step2.complete'] })
8
12
  */
9
- import type { EventHandler, EventRegistration } from './types.js';
13
+ import type { EventHandler, EventRegistration, DependencyConfig, OnProxy } from './types.js';
10
14
  /**
11
15
  * Get all registered event handlers
12
16
  */
@@ -18,15 +22,37 @@ export declare function clearEventHandlers(): void;
18
22
  /**
19
23
  * Register an event handler directly
20
24
  */
21
- export declare function registerEventHandler(noun: string, event: string, handler: EventHandler): void;
25
+ export declare function registerEventHandler(noun: string, event: string, handler: EventHandler, dependencies?: DependencyConfig): void;
26
+ /**
27
+ * Handler registration callback type
28
+ * Used by createTypedOnProxy to customize handler registration
29
+ */
30
+ export type OnProxyRegistrationCallback = (noun: string, event: string, handler: EventHandler, dependencies?: DependencyConfig) => void;
22
31
  /**
23
- * Event proxy type for on.Noun.event pattern
32
+ * Create a typed OnProxy with proper TypeScript generics
33
+ *
34
+ * This factory function creates a two-level proxy that allows:
35
+ * proxy.Customer.created(handler)
36
+ * proxy.Order.shipped(handler)
37
+ *
38
+ * The first property access captures the noun (Customer, Order)
39
+ * The second property access captures the event (created, shipped)
40
+ * The function call invokes the registration callback
41
+ *
42
+ * @param registerCallback - Function called when a handler is registered
43
+ * @returns A properly typed OnProxy
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * // Create proxy with custom registration
48
+ * const myOn = createTypedOnProxy((noun, event, handler, deps) => {
49
+ * myRegistry.push({ noun, event, handler, deps })
50
+ * })
51
+ *
52
+ * myOn.Customer.created(handler) // Properly typed!
53
+ * ```
24
54
  */
25
- type EventProxy = {
26
- [noun: string]: {
27
- [event: string]: (handler: EventHandler) => void;
28
- };
29
- };
55
+ export declare function createTypedOnProxy(registerCallback: OnProxyRegistrationCallback): OnProxy;
30
56
  /**
31
57
  * The `on` object for registering event handlers
32
58
  *
@@ -44,6 +70,5 @@ type EventProxy = {
44
70
  * })
45
71
  * ```
46
72
  */
47
- export declare const on: EventProxy;
48
- export {};
73
+ export declare const on: OnProxy;
49
74
  //# sourceMappingURL=on.d.ts.map
package/dist/on.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"on.d.ts","sourceRoot":"","sources":["../src/on.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAOjE;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,iBAAiB,EAAE,CAEtD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,GACpB,IAAI,CAON;AAED;;GAEG;AACH,KAAK,UAAU,GAAG;IAChB,CAAC,IAAI,EAAE,MAAM,GAAG;QACd,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAA;KACjD,CAAA;CACF,CAAA;AA6BD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,EAAE,YAAkB,CAAA"}
1
+ {"version":3,"file":"on.d.ts","sourceRoot":"","sources":["../src/on.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,OAAO,EAIR,MAAM,YAAY,CAAA;AAOnB;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,iBAAiB,EAAE,CAEtD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,EACrB,YAAY,CAAC,EAAE,gBAAgB,GAC9B,IAAI,CAQN;AAED;;;GAGG;AACH,MAAM,MAAM,2BAA2B,GAAG,CACxC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,EACrB,YAAY,CAAC,EAAE,gBAAgB,KAC5B,IAAI,CAAA;AAET;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,2BAA2B,GAAG,OAAO,CA8BzF;AAYD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,EAAE,SAAkB,CAAA"}
package/dist/on.js CHANGED
@@ -5,6 +5,10 @@
5
5
  * on.Customer.created(customer => { ... })
6
6
  * on.Order.completed(order => { ... })
7
7
  * on.Payment.failed(payment => { ... })
8
+ *
9
+ * With dependencies:
10
+ * on.Step2.complete(handler, { dependsOn: 'Step1.complete' })
11
+ * on.Step3.complete(handler, { dependsOn: ['Step1.complete', 'Step2.complete'] })
8
12
  */
9
13
  /**
10
14
  * Registry of event handlers
@@ -25,39 +29,69 @@ export function clearEventHandlers() {
25
29
  /**
26
30
  * Register an event handler directly
27
31
  */
28
- export function registerEventHandler(noun, event, handler) {
32
+ export function registerEventHandler(noun, event, handler, dependencies) {
29
33
  eventRegistry.push({
30
34
  noun,
31
35
  event,
32
36
  handler,
33
37
  source: handler.toString(),
38
+ ...(dependencies !== undefined && { dependencies }),
34
39
  });
35
40
  }
36
41
  /**
37
- * Create the `on` proxy
42
+ * Create a typed OnProxy with proper TypeScript generics
38
43
  *
39
- * This creates a proxy that allows:
40
- * on.Customer.created(handler)
41
- * on.Order.shipped(handler)
44
+ * This factory function creates a two-level proxy that allows:
45
+ * proxy.Customer.created(handler)
46
+ * proxy.Order.shipped(handler)
42
47
  *
43
48
  * The first property access captures the noun (Customer, Order)
44
49
  * The second property access captures the event (created, shipped)
45
- * The function call registers the handler
50
+ * The function call invokes the registration callback
51
+ *
52
+ * @param registerCallback - Function called when a handler is registered
53
+ * @returns A properly typed OnProxy
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * // Create proxy with custom registration
58
+ * const myOn = createTypedOnProxy((noun, event, handler, deps) => {
59
+ * myRegistry.push({ noun, event, handler, deps })
60
+ * })
61
+ *
62
+ * myOn.Customer.created(handler) // Properly typed!
63
+ * ```
46
64
  */
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
- }
65
+ export function createTypedOnProxy(registerCallback) {
66
+ // Create typed handler for the noun level (event accessors)
67
+ const createNounHandler = (noun) => ({
68
+ get(_target, event, _receiver) {
69
+ // Return a function that registers the handler with optional dependencies
70
+ return (handler, dependencies) => {
71
+ registerCallback(noun, event, handler, dependencies);
72
+ };
73
+ },
60
74
  });
75
+ // Create typed handler for the top-level proxy (noun accessors)
76
+ const onHandler = {
77
+ get(_target, noun, _receiver) {
78
+ // Return a proxy for the event level with typed handler
79
+ const eventTarget = {};
80
+ return new Proxy(eventTarget, createNounHandler(noun));
81
+ },
82
+ };
83
+ // Create and return the typed OnProxy
84
+ const target = {};
85
+ return new Proxy(target, onHandler);
86
+ }
87
+ /**
88
+ * Create the `on` proxy using the global event registry
89
+ *
90
+ * This is the default implementation that uses registerEventHandler
91
+ * for backward compatibility with the standalone `on` export.
92
+ */
93
+ function createOnProxy() {
94
+ return createTypedOnProxy(registerEventHandler);
61
95
  }
62
96
  /**
63
97
  * The `on` object for registering event handlers
package/dist/on.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"on.js","sourceRoot":"","sources":["../src/on.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,MAAM,aAAa,GAAwB,EAAE,CAAA;AAE7C;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,GAAG,aAAa,CAAC,CAAA;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAA;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,KAAa,EACb,OAAqB;IAErB,aAAa,CAAC,IAAI,CAAC;QACjB,IAAI;QACJ,KAAK;QACL,OAAO;QACP,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE;KAC3B,CAAC,CAAA;AACJ,CAAC;AAWD;;;;;;;;;;GAUG;AACH,SAAS,aAAa;IACpB,OAAO,IAAI,KAAK,CAAC,EAAgB,EAAE;QACjC,GAAG,CAAC,OAAO,EAAE,IAAY;YACvB,qCAAqC;YACrC,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE;gBACnB,GAAG,CAAC,YAAY,EAAE,KAAa;oBAC7B,+CAA+C;oBAC/C,OAAO,CAAC,OAAqB,EAAE,EAAE;wBAC/B,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;oBAC5C,CAAC,CAAA;gBACH,CAAC;aACF,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA"}
1
+ {"version":3,"file":"on.js","sourceRoot":"","sources":["../src/on.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAYH;;GAEG;AACH,MAAM,aAAa,GAAwB,EAAE,CAAA;AAE7C;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,GAAG,aAAa,CAAC,CAAA;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAA;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,KAAa,EACb,OAAqB,EACrB,YAA+B;IAE/B,aAAa,CAAC,IAAI,CAAC;QACjB,IAAI;QACJ,KAAK;QACL,OAAO;QACP,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE;QAC1B,GAAG,CAAC,YAAY,KAAK,SAAS,IAAI,EAAE,YAAY,EAAE,CAAC;KACpD,CAAC,CAAA;AACJ,CAAC;AAaD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,kBAAkB,CAAC,gBAA6C;IAC9E,4DAA4D;IAC5D,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAyB,EAAE,CAAC,CAAC;QAClE,GAAG,CACD,OAAyF,EACzF,KAAa,EACb,SAAkB;YAElB,0EAA0E;YAC1E,OAAO,CAAC,OAAqB,EAAE,YAA+B,EAAE,EAAE;gBAChE,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;YACtD,CAAC,CAAA;QACH,CAAC;KACF,CAAC,CAAA;IAEF,gEAAgE;IAChE,MAAM,SAAS,GAAmB;QAChC,GAAG,CAAC,OAAuC,EAAE,IAAY,EAAE,SAAkB;YAC3E,wDAAwD;YACxD,MAAM,WAAW,GAGb,EAAE,CAAA;YACN,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAmB,CAAA;QAC1E,CAAC;KACF,CAAA;IAED,sCAAsC;IACtC,MAAM,MAAM,GAAmC,EAAE,CAAA;IACjD,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,SAAS,CAAY,CAAA;AAChD,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa;IACpB,OAAO,kBAAkB,CAAC,oBAAoB,CAAC,CAAA;AACjD,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * WorkflowRuntime - Owns the `$` runtime contract
3
+ *
4
+ * Purpose: Single module that owns end-to-end construction of the `$` context
5
+ * a workflow handler receives. Before this module existed the answer to
6
+ * "what does the handler see when it runs?" was stitched together from three
7
+ * separate modules:
8
+ *
9
+ * - cascade-context.ts (5W+H tracing)
10
+ * - database-context.ts (DB injection)
11
+ * - on.ts / send.ts / every.ts (event dispatch)
12
+ *
13
+ * Callers reading `$.on.Order.placed(...)` had no single place to discover
14
+ * what `$` contains. Tests had to assemble three contexts independently to
15
+ * exercise a handler.
16
+ *
17
+ * `WorkflowRuntime` collapses these into one port:
18
+ *
19
+ * - {@link createWorkflowRuntime} builds the runtime, owning the event/
20
+ * schedule registries, the optional `DatabaseContext` injection, and the
21
+ * optional cascade context.
22
+ * - The runtime exposes `$` (a {@link WorkflowContext}) and `dispatch()` —
23
+ * the latter is the test surface for exercising a handler against an
24
+ * event without spinning up a full {@link Workflow}.
25
+ *
26
+ * The cascade-context, database-context, and on/send/every modules continue
27
+ * to exist as **internal seams** — private adapters the runtime composes.
28
+ * `DatabaseContext` stays as an injected port so callers can wire either
29
+ * `ai-database`'s adapter or an in-memory adapter; this keeps `ai-workflows`
30
+ * Layer 0.
31
+ *
32
+ * @example Basic usage
33
+ * ```ts
34
+ * import { createWorkflowRuntime } from 'ai-workflows'
35
+ *
36
+ * const runtime = createWorkflowRuntime()
37
+ * runtime.register('Customer', 'created', async (customer, $) => {
38
+ * $.log('New customer:', customer)
39
+ * })
40
+ * await runtime.dispatch('Customer.created', { id: '123' })
41
+ * ```
42
+ *
43
+ * @example With injected DatabaseContext
44
+ * ```ts
45
+ * import { createWorkflowRuntime, createMemoryDatabaseContext } from 'ai-workflows'
46
+ *
47
+ * const runtime = createWorkflowRuntime({ db: createMemoryDatabaseContext() })
48
+ * ```
49
+ *
50
+ * @example Direct handler dispatch (test surface)
51
+ * ```ts
52
+ * const runtime = createWorkflowRuntime()
53
+ * const handler = vi.fn()
54
+ * runtime.register('Order', 'placed', handler)
55
+ * await runtime.dispatch('Order.placed', { id: 'o-1' })
56
+ * expect(handler).toHaveBeenCalled()
57
+ * ```
58
+ *
59
+ * @packageDocumentation
60
+ */
61
+ import type { DatabaseContext, EventHandler, EventRegistration, ParsedEvent, ScheduleHandler, ScheduleInterval, ScheduleRegistration, WorkflowContext, WorkflowState, DependencyConfig } from './types.js';
62
+ import { type CascadeContext } from './cascade-context.js';
63
+ /**
64
+ * Parse an event string in `Noun.event` form. Returns `null` for invalid
65
+ * input. Lives on the runtime because dispatch is the only thing that needs
66
+ * to crack event names; `workflow.ts` re-exports it for back-compat.
67
+ */
68
+ export declare function parseEvent(event: string): ParsedEvent | null;
69
+ /**
70
+ * Options for constructing a {@link WorkflowRuntime}.
71
+ *
72
+ * All options are optional — a runtime constructed with no arguments runs
73
+ * fully in-memory with no persistence and no parent trace.
74
+ */
75
+ export interface WorkflowRuntimeOptions {
76
+ /**
77
+ * Initial state context (key/value bag exposed as `$.state`).
78
+ * Cloned defensively at construction so the caller's object is not mutated.
79
+ */
80
+ context?: Record<string, unknown>;
81
+ /**
82
+ * Optional persistence port. When provided, `$.send` records events and
83
+ * `$.do` records actions through this adapter. When omitted, events and
84
+ * actions are still delivered in-memory but not persisted.
85
+ */
86
+ db?: DatabaseContext;
87
+ /**
88
+ * Optional cascade context for distributed tracing / 5W+H step recording.
89
+ * If omitted a fresh root cascade context is created.
90
+ */
91
+ cascade?: CascadeContext;
92
+ /**
93
+ * Optional name for the cascade context (used when cascade is auto-created).
94
+ */
95
+ name?: string;
96
+ }
97
+ /**
98
+ * Public surface of the workflow runtime.
99
+ *
100
+ * The runtime owns construction of `$` and provides a single dispatch port
101
+ * for delivering events. Internal modules (cascade-context, database-context,
102
+ * on/send/every) are composed here, not exposed.
103
+ */
104
+ export interface WorkflowRuntime {
105
+ /**
106
+ * The `$` context handed to event and schedule handlers. This is the
107
+ * single source of truth for "what does a handler see when it runs."
108
+ */
109
+ readonly $: WorkflowContext;
110
+ /**
111
+ * The cascade context owned by this runtime. Exposed for distributed
112
+ * tracing integration; not part of the handler-facing surface.
113
+ */
114
+ readonly cascade: CascadeContext;
115
+ /**
116
+ * Register an event handler under a noun/event pair.
117
+ *
118
+ * Equivalent to `$.on.<Noun>.<event>(handler)`; provided as a direct method
119
+ * for tests and callers that hold the runtime reference rather than `$`.
120
+ */
121
+ register(noun: string, event: string, handler: EventHandler, dependencies?: DependencyConfig): void;
122
+ /**
123
+ * Register a schedule handler under an interval.
124
+ * Schedule timers are not started by the runtime — the {@link Workflow}
125
+ * instance handles that. The runtime only tracks registrations.
126
+ */
127
+ registerSchedule(interval: ScheduleInterval, handler: ScheduleHandler): void;
128
+ /**
129
+ * Dispatch an event to all matching registered handlers.
130
+ *
131
+ * This is the canonical test surface — exercise a handler by registering
132
+ * it on the runtime and calling `dispatch`. Awaits all handlers; rethrows
133
+ * the first error if any handler throws.
134
+ */
135
+ dispatch(event: string, data: unknown): Promise<void>;
136
+ /**
137
+ * Dispatch an event and return the result of the first matching handler.
138
+ * Used by `$.do` and `$.try` semantics — `do` is the durable variant that
139
+ * also persists through the database adapter when one is configured.
140
+ */
141
+ execute<TResult = unknown>(event: string, data: unknown, durable: boolean): Promise<TResult>;
142
+ /**
143
+ * All event handlers registered on this runtime.
144
+ * Returns the live array (mutated as new handlers register) so callers
145
+ * such as the {@link Workflow} lifecycle wrapper can read it as a definition.
146
+ */
147
+ getEventRegistry(): EventRegistration[];
148
+ /**
149
+ * All schedule handlers registered on this runtime. See {@link getEventRegistry}
150
+ * for sharing semantics.
151
+ */
152
+ getScheduleRegistry(): ScheduleRegistration[];
153
+ /** Mutable workflow state (context bag + history). */
154
+ readonly state: WorkflowState;
155
+ }
156
+ /**
157
+ * Construct a {@link WorkflowRuntime}.
158
+ *
159
+ * The runtime is the single owner of the `$` contract — it composes:
160
+ *
161
+ * 1. Event/schedule registries (the dispatch half of on/send/every).
162
+ * 2. The optional injected `DatabaseContext` for durable record-keeping.
163
+ * 3. A cascade context for 5W+H tracing.
164
+ *
165
+ * The returned `runtime.$` is what handlers receive; `runtime.dispatch` is
166
+ * the canonical test surface.
167
+ */
168
+ export declare function createWorkflowRuntime(options?: WorkflowRuntimeOptions): WorkflowRuntime;
169
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EAEf,aAAa,EACb,gBAAgB,EAGjB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAGhF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAU5D;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAEjC;;;;OAIG;IACH,EAAE,CAAC,EAAE,eAAe,CAAA;IAEpB;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAA;IAExB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,eAAe,CAAA;IAE3B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAEhC;;;;;OAKG;IACH,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,EACrB,YAAY,CAAC,EAAE,gBAAgB,GAC9B,IAAI,CAAA;IAEP;;;;OAIG;IACH,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAAA;IAE5E;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAErD;;;;OAIG;IACH,OAAO,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAE5F;;;;OAIG;IACH,gBAAgB,IAAI,iBAAiB,EAAE,CAAA;IAEvC;;;OAGG;IACH,mBAAmB,IAAI,oBAAoB,EAAE,CAAA;IAE7C,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;CAC9B;AASD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,eAAe,CAqN3F"}