ai-workflows 1.1.0 → 2.0.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 (55) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/.turbo/turbo-test.log +104 -0
  3. package/README.md +285 -24
  4. package/dist/context.d.ts +26 -0
  5. package/dist/context.d.ts.map +1 -0
  6. package/dist/context.js +84 -0
  7. package/dist/context.js.map +1 -0
  8. package/dist/every.d.ts +67 -0
  9. package/dist/every.d.ts.map +1 -0
  10. package/dist/every.js +268 -0
  11. package/dist/every.js.map +1 -0
  12. package/dist/index.d.ts +68 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +72 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/on.d.ts +49 -0
  17. package/dist/on.d.ts.map +1 -0
  18. package/dist/on.js +80 -0
  19. package/dist/on.js.map +1 -0
  20. package/dist/send.d.ts +59 -0
  21. package/dist/send.d.ts.map +1 -0
  22. package/dist/send.js +112 -0
  23. package/dist/send.js.map +1 -0
  24. package/dist/types.d.ts +229 -0
  25. package/dist/types.d.ts.map +1 -0
  26. package/dist/types.js +5 -0
  27. package/dist/types.js.map +1 -0
  28. package/dist/workflow.d.ts +79 -0
  29. package/dist/workflow.d.ts.map +1 -0
  30. package/dist/workflow.js +456 -0
  31. package/dist/workflow.js.map +1 -0
  32. package/package.json +25 -70
  33. package/src/context.ts +108 -0
  34. package/src/every.ts +299 -0
  35. package/src/index.ts +106 -0
  36. package/src/on.ts +100 -0
  37. package/src/send.ts +131 -0
  38. package/src/types.ts +244 -0
  39. package/src/workflow.ts +569 -0
  40. package/test/context.test.ts +151 -0
  41. package/test/every.test.ts +361 -0
  42. package/test/on.test.ts +100 -0
  43. package/test/send.test.ts +118 -0
  44. package/test/workflow.test.ts +288 -0
  45. package/tsconfig.json +9 -0
  46. package/vitest.config.ts +8 -0
  47. package/LICENSE +0 -21
  48. package/dist/scripts/generate-types.d.ts +0 -1
  49. package/dist/scripts/generate-types.js +0 -57
  50. package/dist/src/ai-proxy.d.ts +0 -5
  51. package/dist/src/ai-proxy.js +0 -94
  52. package/dist/src/index.d.ts +0 -9
  53. package/dist/src/index.js +0 -11
  54. package/dist/src/index.test.d.ts +0 -1
  55. package/dist/src/index.test.js +0 -35
@@ -0,0 +1,456 @@
1
+ /**
2
+ * Unified Workflow API
3
+ *
4
+ * Usage:
5
+ * Workflow($ => {
6
+ * $.on.Customer.created(async (customer, $) => {
7
+ * $.log('Customer created', customer)
8
+ * await $.send('Email.welcome', { to: customer.email })
9
+ * })
10
+ *
11
+ * $.every.Monday.at9am(async ($) => {
12
+ * $.log('Weekly standup reminder')
13
+ * })
14
+ * })
15
+ */
16
+ /**
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
73
+ */
74
+ 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 };
84
+ }
85
+ /**
86
+ * Create a workflow with the $ context
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * const workflow = Workflow($ => {
91
+ * $.on.Customer.created(async (customer, $) => {
92
+ * $.log('New customer:', customer.name)
93
+ * await $.send('Email.welcome', { to: customer.email })
94
+ * })
95
+ *
96
+ * $.every.hour(async ($) => {
97
+ * $.log('Hourly check')
98
+ * })
99
+ *
100
+ * $.every.Monday.at9am(async ($) => {
101
+ * $.log('Weekly standup')
102
+ * })
103
+ *
104
+ * $.every('first Monday of the month', async ($) => {
105
+ * $.log('Monthly report')
106
+ * })
107
+ * })
108
+ *
109
+ * await workflow.start()
110
+ * await workflow.send('Customer.created', { name: 'John', email: 'john@example.com' })
111
+ * ```
112
+ */
113
+ 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
123
+ let scheduleTimers = [];
124
+ /**
125
+ * Add to history
126
+ */
127
+ const addHistory = (entry) => {
128
+ state.history.push({
129
+ ...entry,
130
+ timestamp: Date.now(),
131
+ });
132
+ };
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 {
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
328
+ setup($);
329
+ /**
330
+ * Start schedule handlers
331
+ */
332
+ const startSchedules = async () => {
333
+ for (const schedule of scheduleRegistry) {
334
+ const { interval, handler } = schedule;
335
+ let ms = 0;
336
+ switch (interval.type) {
337
+ case 'second':
338
+ ms = (interval.value ?? 1) * 1000;
339
+ break;
340
+ case 'minute':
341
+ ms = (interval.value ?? 1) * 60 * 1000;
342
+ break;
343
+ case 'hour':
344
+ ms = (interval.value ?? 1) * 60 * 60 * 1000;
345
+ break;
346
+ case 'day':
347
+ ms = (interval.value ?? 1) * 24 * 60 * 60 * 1000;
348
+ break;
349
+ case 'week':
350
+ ms = (interval.value ?? 1) * 7 * 24 * 60 * 60 * 1000;
351
+ break;
352
+ case 'cron':
353
+ case 'natural':
354
+ // Cron/natural need special handling
355
+ console.log(`[workflow] Cron/natural scheduling not yet implemented: ${interval.type === 'cron' ? interval.expression : interval.description}`);
356
+ continue;
357
+ }
358
+ if (ms > 0) {
359
+ const timer = setInterval(async () => {
360
+ try {
361
+ addHistory({ type: 'schedule', name: interval.natural ?? interval.type });
362
+ await handler($);
363
+ }
364
+ catch (error) {
365
+ console.error('[workflow] Schedule handler error:', error);
366
+ }
367
+ }, ms);
368
+ scheduleTimers.push(timer);
369
+ }
370
+ }
371
+ };
372
+ const instance = {
373
+ definition: {
374
+ name: 'workflow',
375
+ events: eventRegistry,
376
+ schedules: scheduleRegistry,
377
+ initialContext: options.context,
378
+ },
379
+ get state() {
380
+ return state;
381
+ },
382
+ $,
383
+ async send(event, data) {
384
+ await $.send(event, data);
385
+ },
386
+ async start() {
387
+ console.log(`[workflow] Starting with ${eventRegistry.length} event handlers and ${scheduleRegistry.length} schedules`);
388
+ await startSchedules();
389
+ },
390
+ async stop() {
391
+ console.log('[workflow] Stopping');
392
+ for (const timer of scheduleTimers) {
393
+ clearInterval(timer);
394
+ }
395
+ scheduleTimers = [];
396
+ },
397
+ };
398
+ return instance;
399
+ }
400
+ /**
401
+ * Create an isolated $ context for testing
402
+ */
403
+ export function createTestContext() {
404
+ const emittedEvents = [];
405
+ const stateContext = {};
406
+ const history = [];
407
+ const $ = {
408
+ emittedEvents,
409
+ async send(event, data) {
410
+ emittedEvents.push({ event, data });
411
+ },
412
+ async do(_event, _data) {
413
+ throw new Error('$.do not implemented in test context - register handlers via Workflow()');
414
+ },
415
+ async try(_event, _data) {
416
+ throw new Error('$.try not implemented in test context - register handlers via Workflow()');
417
+ },
418
+ on: new Proxy({}, {
419
+ get() {
420
+ return new Proxy({}, {
421
+ get() {
422
+ return () => { }; // No-op for testing
423
+ }
424
+ });
425
+ }
426
+ }),
427
+ every: new Proxy(function () { }, {
428
+ get() {
429
+ return () => () => { }; // No-op for testing
430
+ },
431
+ apply() { }
432
+ }),
433
+ state: stateContext,
434
+ getState() {
435
+ return {
436
+ context: { ...stateContext },
437
+ history: [...history],
438
+ };
439
+ },
440
+ set(key, value) {
441
+ stateContext[key] = value;
442
+ },
443
+ get(key) {
444
+ return stateContext[key];
445
+ },
446
+ log(message, data) {
447
+ console.log(`[test] ${message}`, data ?? '');
448
+ },
449
+ };
450
+ return $;
451
+ }
452
+ // Also export standalone on/every for import { on, every } usage
453
+ export { on, registerEventHandler, getEventHandlers, clearEventHandlers } from './on.js';
454
+ export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, toCron, intervalToMs, formatInterval, setCronConverter } from './every.js';
455
+ export { send } from './send.js';
456
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,83 +1,38 @@
1
1
  {
2
2
  "name": "ai-workflows",
3
+ "version": "2.0.0",
4
+ "description": "Event-driven workflows with state machine support",
3
5
  "type": "module",
4
- "version": "1.1.0",
5
- "description": "Composable AI Workflows & Durable Execution Framework",
6
6
  "main": "dist/index.js",
7
- "module": "dist/index.js",
8
7
  "types": "dist/index.d.ts",
9
- "bin": {
10
- "ai-workflows": "bin/cli.js"
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
11
13
  },
12
- "files": [
13
- "dist",
14
- "bin"
15
- ],
16
14
  "scripts": {
17
- "build": "tsc && NODE_OPTIONS=\"--experimental-specifier-resolution=node --loader ts-node/esm\" ts-node scripts/generate-types.ts",
18
- "test": "jest",
19
- "test:watch": "jest --watch",
20
- "lint": "eslint src",
21
- "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx}\" \"*.{md,mdx}\"",
22
- "prepublishOnly": "pnpm run build",
23
- "generate-types": "NODE_OPTIONS=\"--experimental-specifier-resolution=node --loader ts-node/esm\" ts-node scripts/generate-types.ts"
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "test": "vitest",
18
+ "typecheck": "tsc --noEmit",
19
+ "lint": "eslint .",
20
+ "clean": "rm -rf dist"
21
+ },
22
+ "dependencies": {
23
+ "rpc.do": "^0.1.0",
24
+ "xstate": "^5.18.0"
25
+ },
26
+ "devDependencies": {
27
+ "vitest": "^2.1.0"
24
28
  },
25
29
  "keywords": [
26
30
  "ai",
27
31
  "workflows",
28
- "mdx",
29
- "durable-execution"
32
+ "events",
33
+ "state-machine",
34
+ "xstate",
35
+ "primitives"
30
36
  ],
31
- "author": "AI Primitives",
32
- "license": "MIT",
33
- "homepage": "https://mdx.org.ai",
34
- "repository": {
35
- "type": "git",
36
- "url": "git+https://github.com/ai-primitives/ai-workflows.git"
37
- },
38
- "bugs": {
39
- "url": "https://github.com/ai-primitives/ai-workflows/issues"
40
- },
41
- "devDependencies": {
42
- "@babel/core": "^7.26.0",
43
- "@babel/preset-env": "^7.26.0",
44
- "@eslint/js": "^9.17.0",
45
- "@jest/globals": "^29.7.0",
46
- "@semantic-release/commit-analyzer": "^13.0.0",
47
- "@semantic-release/github": "^11.0.1",
48
- "@semantic-release/npm": "^12.0.1",
49
- "@semantic-release/release-notes-generator": "^14.0.1",
50
- "@swc/core": "^1.10.1",
51
- "@testing-library/jest-dom": "^6.4.2",
52
- "@testing-library/react": "^16.1.0",
53
- "@types/jest": "^29.5.14",
54
- "@types/js-yaml": "^4.0.9",
55
- "@types/node": "^22.10.2",
56
- "@types/react": "^18.3.17",
57
- "@types/react-dom": "^18.2.0",
58
- "@typescript-eslint/eslint-plugin": "^8.18.0",
59
- "@typescript-eslint/parser": "^8.18.0",
60
- "babel-jest": "^29.7.0",
61
- "eslint": "^9.17.0",
62
- "identity-obj-proxy": "^3.0.0",
63
- "jest": "^29.7.0",
64
- "jest-environment-jsdom": "^29.7.0",
65
- "prettier": "^3.4.2",
66
- "semantic-release": "^24.2.0",
67
- "ts-jest": "^29.2.5",
68
- "ts-node": "^10.9.2",
69
- "typescript": "^5.7.2"
70
- },
71
- "dependencies": {
72
- "@ai-sdk/openai": "^1.0.8",
73
- "ai": "^4.0.18",
74
- "ai-functions": "^0.2.19",
75
- "gray-matter": "^4.0.3",
76
- "mdxld": "^0.1.1",
77
- "openai": "^4.77.0",
78
- "react": "^18.3.1",
79
- "react-dom": "^18.2.0",
80
- "yaml": "^2.6.1",
81
- "zod": "^3.24.1"
82
- }
37
+ "license": "MIT"
83
38
  }
package/src/context.ts ADDED
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Workflow context implementation
3
+ */
4
+
5
+ import type { WorkflowContext, WorkflowState, WorkflowHistoryEntry, OnProxy, EveryProxy } from './types.js'
6
+
7
+ /**
8
+ * Event bus interface (imported from send.ts to avoid circular dependency)
9
+ */
10
+ interface EventBusLike {
11
+ emit(event: string, data: unknown): Promise<void>
12
+ }
13
+
14
+ /**
15
+ * Create a workflow context
16
+ */
17
+ export function createWorkflowContext(eventBus: EventBusLike): WorkflowContext {
18
+ const workflowState: WorkflowState = {
19
+ context: {},
20
+ history: [],
21
+ }
22
+
23
+ const addHistory = (entry: Omit<WorkflowHistoryEntry, 'timestamp'>) => {
24
+ workflowState.history.push({
25
+ ...entry,
26
+ timestamp: Date.now(),
27
+ })
28
+ }
29
+
30
+ // Create no-op proxies for on/every (these are used in send context, not workflow setup)
31
+ const noOpOnProxy = new Proxy({} as OnProxy, {
32
+ get() {
33
+ return new Proxy({}, {
34
+ get() {
35
+ return () => {}
36
+ }
37
+ })
38
+ }
39
+ })
40
+
41
+ const noOpEveryProxy = new Proxy(function() {} as any, {
42
+ get() {
43
+ return () => () => {}
44
+ },
45
+ apply() {}
46
+ }) as EveryProxy
47
+
48
+ return {
49
+ async send<T = unknown>(event: string, data: T): Promise<void> {
50
+ addHistory({ type: 'event', name: event, data })
51
+ await eventBus.emit(event, data)
52
+ },
53
+
54
+ async do<TData = unknown, TResult = unknown>(_event: string, _data: TData): Promise<TResult> {
55
+ throw new Error('$.do not available in this context')
56
+ },
57
+
58
+ async try<TData = unknown, TResult = unknown>(_event: string, _data: TData): Promise<TResult> {
59
+ throw new Error('$.try not available in this context')
60
+ },
61
+
62
+ on: noOpOnProxy,
63
+ every: noOpEveryProxy,
64
+
65
+ state: workflowState.context,
66
+
67
+ getState(): WorkflowState {
68
+ // Return a deep copy to prevent mutation
69
+ return {
70
+ current: workflowState.current,
71
+ context: { ...workflowState.context },
72
+ history: [...workflowState.history],
73
+ }
74
+ },
75
+
76
+ set<T = unknown>(key: string, value: T): void {
77
+ workflowState.context[key] = value
78
+ },
79
+
80
+ get<T = unknown>(key: string): T | undefined {
81
+ return workflowState.context[key] as T | undefined
82
+ },
83
+
84
+ log(message: string, data?: unknown): void {
85
+ addHistory({ type: 'action', name: 'log', data: { message, data } })
86
+ console.log(`[workflow] ${message}`, data ?? '')
87
+ },
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Create an isolated workflow context (not connected to event bus)
93
+ * Useful for testing or standalone execution
94
+ */
95
+ export function createIsolatedContext(): WorkflowContext & { getEmittedEvents: () => Array<{ event: string; data: unknown }> } {
96
+ const emittedEvents: Array<{ event: string; data: unknown }> = []
97
+
98
+ const ctx = createWorkflowContext({
99
+ async emit(event: string, data: unknown): Promise<void> {
100
+ emittedEvents.push({ event, data })
101
+ },
102
+ })
103
+
104
+ return {
105
+ ...ctx,
106
+ getEmittedEvents: () => [...emittedEvents],
107
+ }
108
+ }