ai-workflows 1.0.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 (49) 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 +66 -5
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +70 -7
  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 +24 -65
  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/index.test.d.ts +0 -1
  49. package/dist/index.test.js +0 -9
package/dist/send.js ADDED
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Event emission using send('Noun.event', data)
3
+ *
4
+ * Usage:
5
+ * send('Customer.created', customer)
6
+ * send('Order.completed', order)
7
+ */
8
+ import { getEventHandlers } from './on.js';
9
+ import { createWorkflowContext } from './context.js';
10
+ /**
11
+ * Event bus for managing event delivery
12
+ */
13
+ class EventBus {
14
+ pending = [];
15
+ processing = false;
16
+ /**
17
+ * Emit an event
18
+ */
19
+ async emit(event, data) {
20
+ this.pending.push({ event, data });
21
+ if (!this.processing) {
22
+ await this.process();
23
+ }
24
+ }
25
+ /**
26
+ * Process pending events
27
+ */
28
+ async process() {
29
+ this.processing = true;
30
+ while (this.pending.length > 0) {
31
+ const item = this.pending.shift();
32
+ await this.deliver(item.event, item.data);
33
+ }
34
+ this.processing = false;
35
+ }
36
+ /**
37
+ * Deliver an event to matching handlers
38
+ */
39
+ async deliver(event, data) {
40
+ const parsed = parseEvent(event);
41
+ if (!parsed) {
42
+ console.warn(`Invalid event format: ${event}. Expected Noun.event`);
43
+ return;
44
+ }
45
+ const handlers = getEventHandlers();
46
+ const matching = handlers.filter(h => h.noun === parsed.noun && h.event === parsed.event);
47
+ if (matching.length === 0) {
48
+ // No handlers registered - that's okay, event is just not handled
49
+ return;
50
+ }
51
+ // Create workflow context for handlers
52
+ const ctx = createWorkflowContext(this);
53
+ // Execute all matching handlers
54
+ await Promise.all(matching.map(async ({ handler }) => {
55
+ try {
56
+ await handler(data, ctx);
57
+ }
58
+ catch (error) {
59
+ console.error(`Error in handler for ${event}:`, error);
60
+ }
61
+ }));
62
+ }
63
+ }
64
+ /**
65
+ * Parse event string into noun and event
66
+ */
67
+ export function parseEvent(event) {
68
+ const parts = event.split('.');
69
+ if (parts.length !== 2) {
70
+ return null;
71
+ }
72
+ const [noun, eventName] = parts;
73
+ if (!noun || !eventName) {
74
+ return null;
75
+ }
76
+ return { noun, event: eventName };
77
+ }
78
+ /**
79
+ * Global event bus instance
80
+ */
81
+ const globalEventBus = new EventBus();
82
+ /**
83
+ * Send an event
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * import { send } from 'ai-workflows'
88
+ *
89
+ * // Emit a customer created event
90
+ * await send('Customer.created', {
91
+ * id: '123',
92
+ * name: 'John Doe',
93
+ * email: 'john@example.com'
94
+ * })
95
+ *
96
+ * // Emit an order completed event
97
+ * await send('Order.completed', {
98
+ * id: 'order-456',
99
+ * total: 99.99
100
+ * })
101
+ * ```
102
+ */
103
+ export async function send(event, data) {
104
+ await globalEventBus.emit(event, data);
105
+ }
106
+ /**
107
+ * Get the global event bus (for testing/internal use)
108
+ */
109
+ export function getEventBus() {
110
+ return globalEventBus;
111
+ }
112
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../src/send.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Types for ai-workflows
3
+ */
4
+ /**
5
+ * Handler function with source code for remote execution
6
+ */
7
+ export interface HandlerFunction<T = unknown> {
8
+ /** The actual function */
9
+ fn: (...args: any[]) => void | Promise<void>;
10
+ /** Source code string for remote execution */
11
+ source: string;
12
+ /** Handler name (for debugging) */
13
+ name?: string;
14
+ }
15
+ /**
16
+ * Event handler function type
17
+ * Can return void (for send) or a result (for do/try)
18
+ */
19
+ export type EventHandler<T = unknown, R = unknown> = (data: T, $: WorkflowContext) => R | void | Promise<R | void>;
20
+ /**
21
+ * Schedule handler function type
22
+ */
23
+ export type ScheduleHandler = ($: WorkflowContext) => void | Promise<void>;
24
+ /**
25
+ * Workflow context ($) passed to handlers
26
+ */
27
+ export interface WorkflowContext {
28
+ /**
29
+ * Send an event (fire and forget, durable)
30
+ * Confirms receipt but doesn't wait for result
31
+ */
32
+ send: <T = unknown>(event: string, data: T) => Promise<void>;
33
+ /**
34
+ * Do an action (durable, waits for result)
35
+ * Retries on failure, stores result durably
36
+ */
37
+ do: <TData = unknown, TResult = unknown>(event: string, data: TData) => Promise<TResult>;
38
+ /**
39
+ * Try an action (non-durable, waits for result)
40
+ * Simple execution without durability guarantees
41
+ */
42
+ try: <TData = unknown, TResult = unknown>(event: string, data: TData) => Promise<TResult>;
43
+ /** Register event handler ($.on.Noun.event) */
44
+ on: OnProxy;
45
+ /** Register schedule handler ($.every.hour, $.every.Monday.at9am) */
46
+ every: EveryProxy;
47
+ /**
48
+ * Workflow state - read/write context data
49
+ * $.state.userId = '123'
50
+ * const id = $.state.userId
51
+ */
52
+ state: Record<string, unknown>;
53
+ /**
54
+ * Get the full workflow state (context + history)
55
+ * Returns a copy to prevent mutation
56
+ */
57
+ getState: () => WorkflowState;
58
+ /**
59
+ * Set a value in the context
60
+ * Alternative to $.state.key = value
61
+ */
62
+ set: <T = unknown>(key: string, value: T) => void;
63
+ /**
64
+ * Get a value from the context
65
+ * Alternative to $.state.key
66
+ */
67
+ get: <T = unknown>(key: string) => T | undefined;
68
+ /** Log message */
69
+ log: (message: string, data?: unknown) => void;
70
+ /** Access to database (if connected) */
71
+ db?: DatabaseContext;
72
+ }
73
+ /**
74
+ * Database context for workflows
75
+ */
76
+ export interface DatabaseContext {
77
+ /** Record an event (immutable) */
78
+ recordEvent: (event: string, data: unknown) => Promise<void>;
79
+ /** Create an action (pending work) */
80
+ createAction: (action: ActionData) => Promise<void>;
81
+ /** Complete an action */
82
+ completeAction: (id: string, result: unknown) => Promise<void>;
83
+ /** Store an artifact */
84
+ storeArtifact: (artifact: ArtifactData) => Promise<void>;
85
+ /** Get an artifact */
86
+ getArtifact: (key: string) => Promise<unknown | null>;
87
+ }
88
+ /**
89
+ * Action data for pending/active work
90
+ */
91
+ export interface ActionData {
92
+ /** Actor performing the action (user, agent, system) */
93
+ actor: string;
94
+ /** Object being acted upon */
95
+ object: string;
96
+ /** Action being performed */
97
+ action: string;
98
+ /** Current status */
99
+ status?: 'pending' | 'active' | 'completed' | 'failed';
100
+ /** Optional metadata */
101
+ metadata?: Record<string, unknown>;
102
+ }
103
+ /**
104
+ * Artifact data for cached compiled/parsed content
105
+ */
106
+ export interface ArtifactData {
107
+ /** Unique key for the artifact */
108
+ key: string;
109
+ /** Type of artifact (ast, types, esm, worker, html, markdown) */
110
+ type: 'ast' | 'types' | 'esm' | 'worker' | 'html' | 'markdown' | 'bundle' | string;
111
+ /** Source hash (for cache invalidation) */
112
+ sourceHash: string;
113
+ /** The artifact content */
114
+ content: unknown;
115
+ /** Optional metadata */
116
+ metadata?: Record<string, unknown>;
117
+ }
118
+ /**
119
+ * Event proxy type for $.on.Noun.event pattern
120
+ */
121
+ export type OnProxy = {
122
+ [noun: string]: {
123
+ [event: string]: (handler: EventHandler) => void;
124
+ };
125
+ };
126
+ /**
127
+ * Every proxy type for $.every patterns
128
+ */
129
+ export type EveryProxy = {
130
+ (description: string, handler: ScheduleHandler): void;
131
+ } & {
132
+ [key: string]: ((handler: ScheduleHandler) => void) | ((value: number) => (handler: ScheduleHandler) => void) | {
133
+ [timeKey: string]: (handler: ScheduleHandler) => void;
134
+ };
135
+ };
136
+ /**
137
+ * Workflow state
138
+ */
139
+ export interface WorkflowState {
140
+ /** Current state name (for state machines) */
141
+ current?: string;
142
+ /** Context data */
143
+ context: Record<string, unknown>;
144
+ /** Execution history */
145
+ history: WorkflowHistoryEntry[];
146
+ }
147
+ /**
148
+ * History entry for workflow execution
149
+ */
150
+ export interface WorkflowHistoryEntry {
151
+ timestamp: number;
152
+ type: 'event' | 'schedule' | 'transition' | 'action';
153
+ name: string;
154
+ data?: unknown;
155
+ }
156
+ /**
157
+ * Event registration with source
158
+ */
159
+ export interface EventRegistration {
160
+ noun: string;
161
+ event: string;
162
+ handler: EventHandler;
163
+ source: string;
164
+ }
165
+ /**
166
+ * Schedule registration with source
167
+ */
168
+ export interface ScheduleRegistration {
169
+ interval: ScheduleInterval;
170
+ handler: ScheduleHandler;
171
+ source: string;
172
+ }
173
+ /**
174
+ * Schedule intervals
175
+ */
176
+ export type ScheduleInterval = {
177
+ type: 'second';
178
+ value?: number;
179
+ natural?: string;
180
+ } | {
181
+ type: 'minute';
182
+ value?: number;
183
+ natural?: string;
184
+ } | {
185
+ type: 'hour';
186
+ value?: number;
187
+ natural?: string;
188
+ } | {
189
+ type: 'day';
190
+ value?: number;
191
+ natural?: string;
192
+ } | {
193
+ type: 'week';
194
+ value?: number;
195
+ natural?: string;
196
+ } | {
197
+ type: 'cron';
198
+ expression: string;
199
+ natural?: string;
200
+ } | {
201
+ type: 'natural';
202
+ description: string;
203
+ };
204
+ /**
205
+ * Workflow definition
206
+ */
207
+ export interface WorkflowDefinition {
208
+ name: string;
209
+ events: EventRegistration[];
210
+ schedules: ScheduleRegistration[];
211
+ initialContext?: Record<string, unknown>;
212
+ }
213
+ /**
214
+ * Parsed event name (Noun.event format)
215
+ */
216
+ export interface ParsedEvent {
217
+ noun: string;
218
+ event: string;
219
+ }
220
+ /**
221
+ * Workflow options
222
+ */
223
+ export interface WorkflowOptions {
224
+ /** Initial context data */
225
+ context?: Record<string, unknown>;
226
+ /** Database connection for persistence */
227
+ db?: DatabaseContext;
228
+ }
229
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Types for ai-workflows
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,79 @@
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
+ import type { WorkflowContext, WorkflowState, WorkflowDefinition, WorkflowOptions, ParsedEvent } from './types.js';
17
+ /**
18
+ * Parse event string into noun and event
19
+ */
20
+ export declare function parseEvent(event: string): ParsedEvent | null;
21
+ /**
22
+ * Workflow instance returned by Workflow()
23
+ */
24
+ export interface WorkflowInstance {
25
+ /** Workflow definition with captured handlers */
26
+ definition: WorkflowDefinition;
27
+ /** Current state */
28
+ state: WorkflowState;
29
+ /** The $ context */
30
+ $: WorkflowContext;
31
+ /** Send an event */
32
+ send: <T = unknown>(event: string, data: T) => Promise<void>;
33
+ /** Start the workflow (begin processing schedules) */
34
+ start: () => Promise<void>;
35
+ /** Stop the workflow */
36
+ stop: () => Promise<void>;
37
+ }
38
+ /**
39
+ * Create a workflow with the $ context
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * const workflow = Workflow($ => {
44
+ * $.on.Customer.created(async (customer, $) => {
45
+ * $.log('New customer:', customer.name)
46
+ * await $.send('Email.welcome', { to: customer.email })
47
+ * })
48
+ *
49
+ * $.every.hour(async ($) => {
50
+ * $.log('Hourly check')
51
+ * })
52
+ *
53
+ * $.every.Monday.at9am(async ($) => {
54
+ * $.log('Weekly standup')
55
+ * })
56
+ *
57
+ * $.every('first Monday of the month', async ($) => {
58
+ * $.log('Monthly report')
59
+ * })
60
+ * })
61
+ *
62
+ * await workflow.start()
63
+ * await workflow.send('Customer.created', { name: 'John', email: 'john@example.com' })
64
+ * ```
65
+ */
66
+ export declare function Workflow(setup: ($: WorkflowContext) => void, options?: WorkflowOptions): WorkflowInstance;
67
+ /**
68
+ * Create an isolated $ context for testing
69
+ */
70
+ export declare function createTestContext(): WorkflowContext & {
71
+ emittedEvents: Array<{
72
+ event: string;
73
+ data: unknown;
74
+ }>;
75
+ };
76
+ export { on, registerEventHandler, getEventHandlers, clearEventHandlers } from './on.js';
77
+ export { every, registerScheduleHandler, getScheduleHandlers, clearScheduleHandlers, toCron, intervalToMs, formatInterval, setCronConverter } from './every.js';
78
+ export { send } from './send.js';
79
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EAOb,kBAAkB,EAClB,eAAe,EAGf,WAAW,EAEZ,MAAM,YAAY,CAAA;AA4DnB;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAU5D;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,UAAU,EAAE,kBAAkB,CAAA;IAC9B,oBAAoB;IACpB,KAAK,EAAE,aAAa,CAAA;IACpB,oBAAoB;IACpB,CAAC,EAAE,eAAe,CAAA;IAClB,oBAAoB;IACpB,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,sDAAsD;IACtD,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,wBAAwB;IACxB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,EACnC,OAAO,GAAE,eAAoB,GAC5B,gBAAgB,CAuVlB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,eAAe,GAAG;IAAE,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAAE,CA4DhH;AAGD,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AACxF,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC/J,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA"}