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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +17 -1
- package/README.md +305 -184
- package/dist/barrier.d.ts +159 -0
- package/dist/barrier.d.ts.map +1 -0
- package/dist/barrier.js +377 -0
- package/dist/barrier.js.map +1 -0
- package/dist/cascade-context.d.ts +149 -0
- package/dist/cascade-context.d.ts.map +1 -0
- package/dist/cascade-context.js +324 -0
- package/dist/cascade-context.js.map +1 -0
- package/dist/cascade-executor.d.ts +196 -0
- package/dist/cascade-executor.d.ts.map +1 -0
- package/dist/cascade-executor.js +384 -0
- package/dist/cascade-executor.js.map +1 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -8
- package/dist/context.js.map +1 -1
- package/dist/cron-parser.d.ts +65 -0
- package/dist/cron-parser.d.ts.map +1 -0
- package/dist/cron-parser.js +294 -0
- package/dist/cron-parser.js.map +1 -0
- package/dist/cron-scheduler.d.ts +117 -0
- package/dist/cron-scheduler.d.ts.map +1 -0
- package/dist/cron-scheduler.js +176 -0
- package/dist/cron-scheduler.js.map +1 -0
- package/dist/database-context.d.ts +184 -0
- package/dist/database-context.d.ts.map +1 -0
- package/dist/database-context.js +428 -0
- package/dist/database-context.js.map +1 -0
- package/dist/dependency-graph.d.ts +157 -0
- package/dist/dependency-graph.d.ts.map +1 -0
- package/dist/dependency-graph.js +382 -0
- package/dist/dependency-graph.js.map +1 -0
- package/dist/digital-objects-adapter.d.ts +159 -0
- package/dist/digital-objects-adapter.d.ts.map +1 -0
- package/dist/digital-objects-adapter.js +229 -0
- package/dist/digital-objects-adapter.js.map +1 -0
- package/dist/durable-execution-cloudflare.d.ts +427 -0
- package/dist/durable-execution-cloudflare.d.ts.map +1 -0
- package/dist/durable-execution-cloudflare.js +510 -0
- package/dist/durable-execution-cloudflare.js.map +1 -0
- package/dist/durable-execution.d.ts +482 -0
- package/dist/durable-execution.d.ts.map +1 -0
- package/dist/durable-execution.js +594 -0
- package/dist/durable-execution.js.map +1 -0
- package/dist/durable-workflow.d.ts +176 -0
- package/dist/durable-workflow.d.ts.map +1 -0
- package/dist/durable-workflow.js +552 -0
- package/dist/durable-workflow.js.map +1 -0
- package/dist/every.d.ts +31 -2
- package/dist/every.d.ts.map +1 -1
- package/dist/every.js +63 -32
- package/dist/every.js.map +1 -1
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +8 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/topological-sort.d.ts +121 -0
- package/dist/graph/topological-sort.d.ts.map +1 -0
- package/dist/graph/topological-sort.js +292 -0
- package/dist/graph/topological-sort.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +101 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +115 -0
- package/dist/logger.js.map +1 -0
- package/dist/on.d.ts +35 -10
- package/dist/on.d.ts.map +1 -1
- package/dist/on.js +53 -19
- package/dist/on.js.map +1 -1
- package/dist/runtime.d.ts +169 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +275 -0
- package/dist/runtime.js.map +1 -0
- package/dist/send.d.ts.map +1 -1
- package/dist/send.js +4 -3
- package/dist/send.js.map +1 -1
- package/dist/telemetry.d.ts +150 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +388 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/timer-registry.d.ts +77 -0
- package/dist/timer-registry.d.ts.map +1 -0
- package/dist/timer-registry.js +154 -0
- package/dist/timer-registry.js.map +1 -0
- package/dist/types.d.ts +105 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -1
- package/dist/types.js.map +1 -1
- package/dist/worker/durable-step.d.ts +481 -0
- package/dist/worker/durable-step.d.ts.map +1 -0
- package/dist/worker/durable-step.js +606 -0
- package/dist/worker/durable-step.js.map +1 -0
- package/dist/worker/index.d.ts +106 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +124 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/state-adapter.d.ts +230 -0
- package/dist/worker/state-adapter.d.ts.map +1 -0
- package/dist/worker/state-adapter.js +409 -0
- package/dist/worker/state-adapter.js.map +1 -0
- package/dist/worker/topological-executor.d.ts +282 -0
- package/dist/worker/topological-executor.d.ts.map +1 -0
- package/dist/worker/topological-executor.js +396 -0
- package/dist/worker/topological-executor.js.map +1 -0
- package/dist/worker/workflow-builder.d.ts +286 -0
- package/dist/worker/workflow-builder.d.ts.map +1 -0
- package/dist/worker/workflow-builder.js +565 -0
- package/dist/worker/workflow-builder.js.map +1 -0
- package/dist/worker.d.ts +800 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +2428 -0
- package/dist/worker.js.map +1 -0
- package/dist/workflow-builder.d.ts +287 -0
- package/dist/workflow-builder.d.ts.map +1 -0
- package/dist/workflow-builder.js +762 -0
- package/dist/workflow-builder.js.map +1 -0
- package/dist/workflow.d.ts +14 -30
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +136 -292
- package/dist/workflow.js.map +1 -1
- package/examples/01-ecommerce-order-pipeline.ts +358 -0
- package/examples/02-content-moderation-cascade.ts +454 -0
- package/examples/03-scheduled-reporting-dependencies.ts +479 -0
- package/examples/04-database-persistence.ts +518 -0
- package/examples/README.md +173 -0
- package/package.json +21 -4
- package/src/__tests__/digital-objects-adapter.test.ts +274 -0
- package/src/__tests__/durable-workflow.test.ts +297 -0
- package/src/barrier.ts +507 -0
- package/src/cascade-context.ts +495 -0
- package/src/cascade-executor.ts +588 -0
- package/src/context.ts +51 -17
- package/src/cron-parser.ts +347 -0
- package/src/cron-scheduler.ts +239 -0
- package/src/database-context.ts +658 -0
- package/src/dependency-graph.ts +518 -0
- package/src/digital-objects-adapter.ts +351 -0
- package/src/durable-execution-cloudflare.ts +855 -0
- package/src/durable-execution.ts +1042 -0
- package/src/durable-workflow.ts +717 -0
- package/src/every.ts +104 -35
- package/src/graph/index.ts +19 -0
- package/src/graph/topological-sort.ts +412 -0
- package/src/index.ts +147 -0
- package/src/logger.ts +148 -0
- package/src/on.ts +81 -26
- package/src/runtime.ts +436 -0
- package/src/send.ts +4 -5
- package/src/telemetry.ts +577 -0
- package/src/timer-registry.ts +179 -0
- package/src/types.ts +146 -10
- package/src/worker/durable-step.ts +976 -0
- package/src/worker/index.ts +216 -0
- package/src/worker/state-adapter.ts +589 -0
- package/src/worker/topological-executor.ts +625 -0
- package/src/worker/workflow-builder.ts +871 -0
- package/src/worker.ts +2906 -0
- package/src/workflow-builder.ts +1068 -0
- package/src/workflow.ts +199 -355
- package/test/barrier-join.test.ts +442 -0
- package/test/barrier-unhandled-rejections.test.ts +359 -0
- package/test/cascade-context.test.ts +390 -0
- package/test/cascade-executor.test.ts +852 -0
- package/test/cron-parser.test.ts +314 -0
- package/test/cron-scheduler.test.ts +291 -0
- package/test/database-context.test.ts +770 -0
- package/test/db-provider-adapter.test.ts +862 -0
- package/test/dependency-graph.test.ts +512 -0
- package/test/durable-execution-cloudflare.test.ts +606 -0
- package/test/durable-execution-in-process.test.ts +286 -0
- package/test/durable-execution.test.ts +247 -0
- package/test/e2e/workflow-scenarios.e2e.test.ts +1039 -0
- package/test/graph/topological-sort.test.ts +586 -0
- package/test/integration.test.ts +442 -0
- package/test/rpc-surface.test.ts +946 -0
- package/test/runtime.test.ts +262 -0
- package/test/schedule-timer-cleanup.test.ts +353 -0
- package/test/send-race-conditions.test.ts +400 -0
- package/test/type-safety-every.test.ts +303 -0
- package/test/worker/durable-cascade.test.ts +1117 -0
- package/test/worker/durable-step.test.ts +723 -0
- package/test/worker/topological-executor.test.ts +1240 -0
- package/test/worker/workflow-builder.test.ts +1067 -0
- package/test/worker.test.ts +608 -0
- package/test/workflow-builder.test.ts +1670 -0
- package/test/workflow-cron.test.ts +256 -0
- package/test/workflow-state-adapter.test.ts +923 -0
- package/test/workflow.test.ts +25 -22
- package/tsconfig.json +3 -1
- package/vitest.config.ts +38 -1
- package/vitest.workers.config.ts +44 -0
- package/wrangler.jsonc +22 -0
- package/.turbo/turbo-test.log +0 -7
- package/src/context.js +0 -83
- package/src/every.js +0 -267
- package/src/index.js +0 -71
- package/src/on.js +0 -79
- package/src/send.js +0 -111
- package/src/types.js +0 -4
- package/src/workflow.js +0 -455
- package/test/context.test.js +0 -116
- package/test/every.test.js +0 -282
- package/test/on.test.js +0 -80
- package/test/send.test.js +0 -89
- package/test/workflow.test.js +0 -224
- package/vitest.config.js +0 -7
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -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
|
-
*
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
42
|
+
* Create a typed OnProxy with proper TypeScript generics
|
|
38
43
|
*
|
|
39
|
-
* This creates a proxy that allows:
|
|
40
|
-
*
|
|
41
|
-
*
|
|
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
|
|
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
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
|
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"}
|