@cogitator-ai/workflows 0.1.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/LICENSE +21 -0
- package/README.md +97 -0
- package/dist/builder.d.ts +39 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +224 -0
- package/dist/builder.js.map +1 -0
- package/dist/checkpoint.d.ts +33 -0
- package/dist/checkpoint.d.ts.map +1 -0
- package/dist/checkpoint.js +108 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/executor.d.ts +24 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +207 -0
- package/dist/executor.js.map +1 -0
- package/dist/human/approval-store.d.ts +95 -0
- package/dist/human/approval-store.d.ts.map +1 -0
- package/dist/human/approval-store.js +377 -0
- package/dist/human/approval-store.js.map +1 -0
- package/dist/human/human-node.d.ts +104 -0
- package/dist/human/human-node.d.ts.map +1 -0
- package/dist/human/human-node.js +342 -0
- package/dist/human/human-node.js.map +1 -0
- package/dist/human/index.d.ts +17 -0
- package/dist/human/index.d.ts.map +1 -0
- package/dist/human/index.js +17 -0
- package/dist/human/index.js.map +1 -0
- package/dist/human/notifiers.d.ts +85 -0
- package/dist/human/notifiers.d.ts.map +1 -0
- package/dist/human/notifiers.js +289 -0
- package/dist/human/notifiers.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/manager/index.d.ts +19 -0
- package/dist/manager/index.d.ts.map +1 -0
- package/dist/manager/index.js +17 -0
- package/dist/manager/index.js.map +1 -0
- package/dist/manager/run-store.d.ts +78 -0
- package/dist/manager/run-store.d.ts.map +1 -0
- package/dist/manager/run-store.js +390 -0
- package/dist/manager/run-store.js.map +1 -0
- package/dist/manager/scheduler.d.ts +159 -0
- package/dist/manager/scheduler.d.ts.map +1 -0
- package/dist/manager/scheduler.js +355 -0
- package/dist/manager/scheduler.js.map +1 -0
- package/dist/manager/workflow-manager.d.ts +114 -0
- package/dist/manager/workflow-manager.d.ts.map +1 -0
- package/dist/manager/workflow-manager.js +460 -0
- package/dist/manager/workflow-manager.js.map +1 -0
- package/dist/nodes/agent.d.ts +24 -0
- package/dist/nodes/agent.d.ts.map +1 -0
- package/dist/nodes/agent.js +37 -0
- package/dist/nodes/agent.js.map +1 -0
- package/dist/nodes/base.d.ts +12 -0
- package/dist/nodes/base.d.ts.map +1 -0
- package/dist/nodes/base.js +5 -0
- package/dist/nodes/base.js.map +1 -0
- package/dist/nodes/function.d.ts +27 -0
- package/dist/nodes/function.d.ts.map +1 -0
- package/dist/nodes/function.js +29 -0
- package/dist/nodes/function.js.map +1 -0
- package/dist/nodes/index.d.ts +8 -0
- package/dist/nodes/index.d.ts.map +1 -0
- package/dist/nodes/index.js +8 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/nodes/tool.d.ts +19 -0
- package/dist/nodes/tool.d.ts.map +1 -0
- package/dist/nodes/tool.js +26 -0
- package/dist/nodes/tool.js.map +1 -0
- package/dist/observability/exporters.d.ts +93 -0
- package/dist/observability/exporters.d.ts.map +1 -0
- package/dist/observability/exporters.js +330 -0
- package/dist/observability/exporters.js.map +1 -0
- package/dist/observability/index.d.ts +17 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +17 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/metrics.d.ts +114 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +435 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/span-attributes.d.ts +95 -0
- package/dist/observability/span-attributes.d.ts.map +1 -0
- package/dist/observability/span-attributes.js +142 -0
- package/dist/observability/span-attributes.js.map +1 -0
- package/dist/observability/tracer.d.ts +110 -0
- package/dist/observability/tracer.d.ts.map +1 -0
- package/dist/observability/tracer.js +409 -0
- package/dist/observability/tracer.js.map +1 -0
- package/dist/patterns/index.d.ts +15 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +15 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/map-reduce.d.ts +223 -0
- package/dist/patterns/map-reduce.d.ts.map +1 -0
- package/dist/patterns/map-reduce.js +378 -0
- package/dist/patterns/map-reduce.js.map +1 -0
- package/dist/saga/circuit-breaker.d.ts +153 -0
- package/dist/saga/circuit-breaker.d.ts.map +1 -0
- package/dist/saga/circuit-breaker.js +306 -0
- package/dist/saga/circuit-breaker.js.map +1 -0
- package/dist/saga/compensation.d.ts +134 -0
- package/dist/saga/compensation.d.ts.map +1 -0
- package/dist/saga/compensation.js +240 -0
- package/dist/saga/compensation.js.map +1 -0
- package/dist/saga/dead-letter.d.ts +113 -0
- package/dist/saga/dead-letter.d.ts.map +1 -0
- package/dist/saga/dead-letter.js +307 -0
- package/dist/saga/dead-letter.js.map +1 -0
- package/dist/saga/idempotency.d.ts +95 -0
- package/dist/saga/idempotency.d.ts.map +1 -0
- package/dist/saga/idempotency.js +266 -0
- package/dist/saga/idempotency.js.map +1 -0
- package/dist/saga/index.d.ts +16 -0
- package/dist/saga/index.d.ts.map +1 -0
- package/dist/saga/index.js +16 -0
- package/dist/saga/index.js.map +1 -0
- package/dist/saga/retry.d.ts +59 -0
- package/dist/saga/retry.d.ts.map +1 -0
- package/dist/saga/retry.js +222 -0
- package/dist/saga/retry.js.map +1 -0
- package/dist/scheduler.d.ts +37 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +151 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/subworkflows/index.d.ts +16 -0
- package/dist/subworkflows/index.d.ts.map +1 -0
- package/dist/subworkflows/index.js +16 -0
- package/dist/subworkflows/index.js.map +1 -0
- package/dist/subworkflows/parallel-subworkflows.d.ts +139 -0
- package/dist/subworkflows/parallel-subworkflows.d.ts.map +1 -0
- package/dist/subworkflows/parallel-subworkflows.js +270 -0
- package/dist/subworkflows/parallel-subworkflows.js.map +1 -0
- package/dist/subworkflows/subworkflow-node.d.ts +136 -0
- package/dist/subworkflows/subworkflow-node.d.ts.map +1 -0
- package/dist/subworkflows/subworkflow-node.js +164 -0
- package/dist/subworkflows/subworkflow-node.js.map +1 -0
- package/dist/timers/cron-parser.d.ts +110 -0
- package/dist/timers/cron-parser.d.ts.map +1 -0
- package/dist/timers/cron-parser.js +412 -0
- package/dist/timers/cron-parser.js.map +1 -0
- package/dist/timers/index.d.ts +18 -0
- package/dist/timers/index.d.ts.map +1 -0
- package/dist/timers/index.js +18 -0
- package/dist/timers/index.js.map +1 -0
- package/dist/timers/timer-manager.d.ts +219 -0
- package/dist/timers/timer-manager.d.ts.map +1 -0
- package/dist/timers/timer-manager.js +351 -0
- package/dist/timers/timer-manager.js.map +1 -0
- package/dist/timers/timer-node.d.ts +144 -0
- package/dist/timers/timer-node.d.ts.map +1 -0
- package/dist/timers/timer-node.js +246 -0
- package/dist/timers/timer-node.js.map +1 -0
- package/dist/timers/timer-store.d.ts +90 -0
- package/dist/timers/timer-store.d.ts.map +1 -0
- package/dist/timers/timer-store.js +357 -0
- package/dist/timers/timer-store.js.map +1 -0
- package/dist/triggers/cron-trigger.d.ts +102 -0
- package/dist/triggers/cron-trigger.d.ts.map +1 -0
- package/dist/triggers/cron-trigger.js +309 -0
- package/dist/triggers/cron-trigger.js.map +1 -0
- package/dist/triggers/index.d.ts +14 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +10 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/rate-limiter.d.ts +130 -0
- package/dist/triggers/rate-limiter.d.ts.map +1 -0
- package/dist/triggers/rate-limiter.js +294 -0
- package/dist/triggers/rate-limiter.js.map +1 -0
- package/dist/triggers/trigger-manager.d.ts +166 -0
- package/dist/triggers/trigger-manager.d.ts.map +1 -0
- package/dist/triggers/trigger-manager.js +436 -0
- package/dist/triggers/trigger-manager.js.map +1 -0
- package/dist/triggers/webhook-trigger.d.ts +150 -0
- package/dist/triggers/webhook-trigger.d.ts.map +1 -0
- package/dist/triggers/webhook-trigger.js +452 -0
- package/dist/triggers/webhook-trigger.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timer node factories for workflow delays
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Fixed delay nodes
|
|
6
|
+
* - Dynamic delay from state
|
|
7
|
+
* - Cron-based wait nodes
|
|
8
|
+
* - Cancellation support
|
|
9
|
+
* - Integration with timer store
|
|
10
|
+
*/
|
|
11
|
+
import type { TimerEntry, TimerStore } from '@cogitator-ai/types';
|
|
12
|
+
/**
|
|
13
|
+
* Timer node type
|
|
14
|
+
*/
|
|
15
|
+
export type TimerNodeType = 'fixed' | 'dynamic' | 'cron' | 'until';
|
|
16
|
+
/**
|
|
17
|
+
* Base timer node config
|
|
18
|
+
*/
|
|
19
|
+
export interface TimerNodeConfig<S> {
|
|
20
|
+
name: string;
|
|
21
|
+
type: TimerNodeType;
|
|
22
|
+
persist?: boolean;
|
|
23
|
+
onScheduled?: (entry: TimerEntry) => void;
|
|
24
|
+
onFired?: (entry: TimerEntry) => void;
|
|
25
|
+
onCancelled?: (entry: TimerEntry) => void;
|
|
26
|
+
/** Phantom type for state */
|
|
27
|
+
_state?: S;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Fixed delay node config
|
|
31
|
+
*/
|
|
32
|
+
export interface FixedDelayConfig<S> extends TimerNodeConfig<S> {
|
|
33
|
+
type: 'fixed';
|
|
34
|
+
delay: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Dynamic delay node config
|
|
38
|
+
*/
|
|
39
|
+
export interface DynamicDelayConfig<S> extends TimerNodeConfig<S> {
|
|
40
|
+
type: 'dynamic';
|
|
41
|
+
getDelay: (state: S) => number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Cron wait node config
|
|
45
|
+
*/
|
|
46
|
+
export interface CronWaitConfig<S> extends TimerNodeConfig<S> {
|
|
47
|
+
type: 'cron';
|
|
48
|
+
expression: string;
|
|
49
|
+
timezone?: string;
|
|
50
|
+
waitForNext?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Until date node config
|
|
54
|
+
*/
|
|
55
|
+
export interface UntilDateConfig<S> extends TimerNodeConfig<S> {
|
|
56
|
+
type: 'until';
|
|
57
|
+
getDate: (state: S) => Date | number;
|
|
58
|
+
skipIfPast?: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Union of all timer node configs
|
|
62
|
+
*/
|
|
63
|
+
export type AnyTimerNodeConfig<S> = FixedDelayConfig<S> | DynamicDelayConfig<S> | CronWaitConfig<S> | UntilDateConfig<S>;
|
|
64
|
+
/**
|
|
65
|
+
* Timer node result
|
|
66
|
+
*/
|
|
67
|
+
export interface TimerNodeResult {
|
|
68
|
+
timerId: string;
|
|
69
|
+
scheduledAt: number;
|
|
70
|
+
firesAt: number;
|
|
71
|
+
waited: number;
|
|
72
|
+
cancelled: boolean;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Timer execution context
|
|
76
|
+
*/
|
|
77
|
+
export interface TimerExecutionContext {
|
|
78
|
+
workflowId: string;
|
|
79
|
+
runId: string;
|
|
80
|
+
nodeId: string;
|
|
81
|
+
timerStore?: TimerStore;
|
|
82
|
+
signal?: AbortSignal;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Create a fixed delay node
|
|
86
|
+
*/
|
|
87
|
+
export declare function delayNode<S>(name: string, delay: number, options?: Partial<Omit<FixedDelayConfig<S>, 'type' | 'delay'>>): FixedDelayConfig<S>;
|
|
88
|
+
/**
|
|
89
|
+
* Create a dynamic delay node
|
|
90
|
+
*/
|
|
91
|
+
export declare function dynamicDelayNode<S>(name: string, getDelay: (state: S) => number, options?: Partial<Omit<DynamicDelayConfig<S>, 'type' | 'getDelay'>>): DynamicDelayConfig<S>;
|
|
92
|
+
/**
|
|
93
|
+
* Create a cron wait node
|
|
94
|
+
*/
|
|
95
|
+
export declare function cronWaitNode<S>(name: string, expression: string, options?: Partial<Omit<CronWaitConfig<S>, 'type' | 'expression'>>): CronWaitConfig<S>;
|
|
96
|
+
/**
|
|
97
|
+
* Create an until-date node
|
|
98
|
+
*/
|
|
99
|
+
export declare function untilNode<S>(name: string, getDate: (state: S) => Date | number, options?: Partial<Omit<UntilDateConfig<S>, 'type' | 'getDate'>>): UntilDateConfig<S>;
|
|
100
|
+
/**
|
|
101
|
+
* Calculate the delay for a timer node
|
|
102
|
+
*/
|
|
103
|
+
export declare function calculateTimerDelay<S>(config: AnyTimerNodeConfig<S>, state: S): number;
|
|
104
|
+
/**
|
|
105
|
+
* Execute a timer node
|
|
106
|
+
*/
|
|
107
|
+
export declare function executeTimerNode<S>(config: AnyTimerNodeConfig<S>, state: S, context: TimerExecutionContext): Promise<TimerNodeResult>;
|
|
108
|
+
/**
|
|
109
|
+
* Abort error for timer cancellation
|
|
110
|
+
*/
|
|
111
|
+
export declare class AbortError extends Error {
|
|
112
|
+
constructor(message?: string);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Create timer node helpers with bound store
|
|
116
|
+
*/
|
|
117
|
+
export declare function createTimerNodeHelpers(timerStore: TimerStore): {
|
|
118
|
+
delayNode: <S>(name: string, delay: number, options?: Partial<Omit<FixedDelayConfig<S>, "type" | "delay">>) => FixedDelayConfig<S>;
|
|
119
|
+
dynamicDelayNode: <S>(name: string, getDelay: (state: S) => number, options?: Partial<Omit<DynamicDelayConfig<S>, "type" | "getDelay">>) => DynamicDelayConfig<S>;
|
|
120
|
+
cronWaitNode: <S>(name: string, expression: string, options?: Partial<Omit<CronWaitConfig<S>, "type" | "expression">>) => CronWaitConfig<S>;
|
|
121
|
+
untilNode: <S>(name: string, getDate: (state: S) => Date | number, options?: Partial<Omit<UntilDateConfig<S>, "type" | "getDate">>) => UntilDateConfig<S>;
|
|
122
|
+
executeTimerNode: <S>(config: AnyTimerNodeConfig<S>, state: S, context: Omit<TimerExecutionContext, "timerStore">) => Promise<TimerNodeResult>;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Duration helpers for readable delays
|
|
126
|
+
*/
|
|
127
|
+
export declare const Duration: {
|
|
128
|
+
readonly milliseconds: (n: number) => number;
|
|
129
|
+
readonly seconds: (n: number) => number;
|
|
130
|
+
readonly minutes: (n: number) => number;
|
|
131
|
+
readonly hours: (n: number) => number;
|
|
132
|
+
readonly days: (n: number) => number;
|
|
133
|
+
readonly weeks: (n: number) => number;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Parse duration string to milliseconds
|
|
137
|
+
* Supports: "1s", "5m", "2h", "1d", "1w"
|
|
138
|
+
*/
|
|
139
|
+
export declare function parseDuration(duration: string): number;
|
|
140
|
+
/**
|
|
141
|
+
* Format duration to human-readable string
|
|
142
|
+
*/
|
|
143
|
+
export declare function formatDuration(ms: number): string;
|
|
144
|
+
//# sourceMappingURL=timer-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer-node.d.ts","sourceRoot":"","sources":["../../src/timers/timer-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACX,MAAM,qBAAqB,CAAC;AAG7B;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,6BAA6B;IAC7B,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;IAC7D,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;IAC/D,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;IAC5D,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAC5B,gBAAgB,CAAC,CAAC,CAAC,GACnB,kBAAkB,CAAC,CAAC,CAAC,GACrB,cAAc,CAAC,CAAC,CAAC,GACjB,eAAe,CAAC,CAAC,CAAC,CAAC;AAEvB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAM,GACjE,gBAAgB,CAAC,CAAC,CAAC,CAOrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,EAC9B,OAAO,GAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,CAAM,GACtE,kBAAkB,CAAC,CAAC,CAAC,CAOvB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,CAAM,GACpE,cAAc,CAAC,CAAC,CAAC,CAWnB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,EACpC,OAAO,GAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAM,GAClE,eAAe,CAAC,CAAC,CAAC,CAOpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,GACP,MAAM,CA8BR;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CA+D1B;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,SAAkB;CAItC;AA2BD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,UAAU;gBAE7C,CAAC,QACL,MAAM,SACL,MAAM,YACJ,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;uBAG5C,CAAC,QACZ,MAAM,YACF,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,YACrB,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC;mBAGrD,CAAC,QACR,MAAM,cACA,MAAM,YACT,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC;gBAGtD,CAAC,QACL,MAAM,WACH,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,YAC3B,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;uBAG7C,CAAC,UACV,kBAAkB,CAAC,CAAC,CAAC,SACtB,CAAC,WACC,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC;EAGvD;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ;+BACD,MAAM;0BACX,MAAM;0BACN,MAAM;wBACR,MAAM;uBACP,MAAM;wBACL,MAAM;CACT,CAAC;AAEX;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAyBtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAkBjD"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timer node factories for workflow delays
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Fixed delay nodes
|
|
6
|
+
* - Dynamic delay from state
|
|
7
|
+
* - Cron-based wait nodes
|
|
8
|
+
* - Cancellation support
|
|
9
|
+
* - Integration with timer store
|
|
10
|
+
*/
|
|
11
|
+
import { getNextCronOccurrence, isValidCronExpression } from './cron-parser';
|
|
12
|
+
/**
|
|
13
|
+
* Create a fixed delay node
|
|
14
|
+
*/
|
|
15
|
+
export function delayNode(name, delay, options = {}) {
|
|
16
|
+
return {
|
|
17
|
+
name,
|
|
18
|
+
type: 'fixed',
|
|
19
|
+
delay,
|
|
20
|
+
...options,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a dynamic delay node
|
|
25
|
+
*/
|
|
26
|
+
export function dynamicDelayNode(name, getDelay, options = {}) {
|
|
27
|
+
return {
|
|
28
|
+
name,
|
|
29
|
+
type: 'dynamic',
|
|
30
|
+
getDelay,
|
|
31
|
+
...options,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a cron wait node
|
|
36
|
+
*/
|
|
37
|
+
export function cronWaitNode(name, expression, options = {}) {
|
|
38
|
+
if (!isValidCronExpression(expression)) {
|
|
39
|
+
throw new Error(`Invalid cron expression: ${expression}`);
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
name,
|
|
43
|
+
type: 'cron',
|
|
44
|
+
expression,
|
|
45
|
+
...options,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create an until-date node
|
|
50
|
+
*/
|
|
51
|
+
export function untilNode(name, getDate, options = {}) {
|
|
52
|
+
return {
|
|
53
|
+
name,
|
|
54
|
+
type: 'until',
|
|
55
|
+
getDate,
|
|
56
|
+
...options,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Calculate the delay for a timer node
|
|
61
|
+
*/
|
|
62
|
+
export function calculateTimerDelay(config, state) {
|
|
63
|
+
const now = Date.now();
|
|
64
|
+
switch (config.type) {
|
|
65
|
+
case 'fixed':
|
|
66
|
+
return config.delay;
|
|
67
|
+
case 'dynamic':
|
|
68
|
+
return config.getDelay(state);
|
|
69
|
+
case 'cron': {
|
|
70
|
+
const next = getNextCronOccurrence(config.expression, {
|
|
71
|
+
currentDate: config.waitForNext ? new Date(now + 1000) : new Date(now),
|
|
72
|
+
timezone: config.timezone,
|
|
73
|
+
});
|
|
74
|
+
return Math.max(0, next.getTime() - now);
|
|
75
|
+
}
|
|
76
|
+
case 'until': {
|
|
77
|
+
const target = config.getDate(state);
|
|
78
|
+
const targetTime = target instanceof Date ? target.getTime() : target;
|
|
79
|
+
const delay = targetTime - now;
|
|
80
|
+
if (delay < 0 && config.skipIfPast) {
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
return Math.max(0, delay);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Execute a timer node
|
|
89
|
+
*/
|
|
90
|
+
export async function executeTimerNode(config, state, context) {
|
|
91
|
+
const now = Date.now();
|
|
92
|
+
const delay = calculateTimerDelay(config, state);
|
|
93
|
+
const firesAt = now + delay;
|
|
94
|
+
let timerId;
|
|
95
|
+
if (config.persist && context.timerStore) {
|
|
96
|
+
timerId = await context.timerStore.schedule({
|
|
97
|
+
workflowId: context.workflowId,
|
|
98
|
+
runId: context.runId,
|
|
99
|
+
nodeId: context.nodeId,
|
|
100
|
+
firesAt,
|
|
101
|
+
type: config.type === 'cron' ? 'cron' : config.type === 'dynamic' ? 'dynamic' : 'fixed',
|
|
102
|
+
metadata: { nodeType: config.type, delay },
|
|
103
|
+
});
|
|
104
|
+
const entry = await context.timerStore.get(timerId);
|
|
105
|
+
if (entry) {
|
|
106
|
+
config.onScheduled?.(entry);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
timerId = `timer_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
111
|
+
}
|
|
112
|
+
const startWait = Date.now();
|
|
113
|
+
let cancelled = false;
|
|
114
|
+
try {
|
|
115
|
+
await waitWithAbort(delay, context.signal);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
if (error instanceof AbortError) {
|
|
119
|
+
cancelled = true;
|
|
120
|
+
if (config.persist && context.timerStore && timerId) {
|
|
121
|
+
await context.timerStore.cancel(timerId);
|
|
122
|
+
const entry = await context.timerStore.get(timerId);
|
|
123
|
+
if (entry) {
|
|
124
|
+
config.onCancelled?.(entry);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const waited = Date.now() - startWait;
|
|
133
|
+
if (!cancelled && config.persist && context.timerStore && timerId) {
|
|
134
|
+
await context.timerStore.markFired(timerId);
|
|
135
|
+
const entry = await context.timerStore.get(timerId);
|
|
136
|
+
if (entry) {
|
|
137
|
+
config.onFired?.(entry);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
timerId,
|
|
142
|
+
scheduledAt: now,
|
|
143
|
+
firesAt,
|
|
144
|
+
waited,
|
|
145
|
+
cancelled,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Abort error for timer cancellation
|
|
150
|
+
*/
|
|
151
|
+
export class AbortError extends Error {
|
|
152
|
+
constructor(message = 'Timer aborted') {
|
|
153
|
+
super(message);
|
|
154
|
+
this.name = 'AbortError';
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Wait with abort signal support
|
|
159
|
+
*/
|
|
160
|
+
function waitWithAbort(delay, signal) {
|
|
161
|
+
if (delay <= 0) {
|
|
162
|
+
return Promise.resolve();
|
|
163
|
+
}
|
|
164
|
+
return new Promise((resolve, reject) => {
|
|
165
|
+
if (signal?.aborted) {
|
|
166
|
+
reject(new AbortError());
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const timeout = setTimeout(resolve, delay);
|
|
170
|
+
const onAbort = () => {
|
|
171
|
+
clearTimeout(timeout);
|
|
172
|
+
reject(new AbortError());
|
|
173
|
+
};
|
|
174
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Create timer node helpers with bound store
|
|
179
|
+
*/
|
|
180
|
+
export function createTimerNodeHelpers(timerStore) {
|
|
181
|
+
return {
|
|
182
|
+
delayNode: (name, delay, options = {}) => delayNode(name, delay, { ...options, persist: true }),
|
|
183
|
+
dynamicDelayNode: (name, getDelay, options = {}) => dynamicDelayNode(name, getDelay, { ...options, persist: true }),
|
|
184
|
+
cronWaitNode: (name, expression, options = {}) => cronWaitNode(name, expression, { ...options, persist: true }),
|
|
185
|
+
untilNode: (name, getDate, options = {}) => untilNode(name, getDate, { ...options, persist: true }),
|
|
186
|
+
executeTimerNode: (config, state, context) => executeTimerNode(config, state, { ...context, timerStore }),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Duration helpers for readable delays
|
|
191
|
+
*/
|
|
192
|
+
export const Duration = {
|
|
193
|
+
milliseconds: (n) => n,
|
|
194
|
+
seconds: (n) => n * 1000,
|
|
195
|
+
minutes: (n) => n * 60 * 1000,
|
|
196
|
+
hours: (n) => n * 60 * 60 * 1000,
|
|
197
|
+
days: (n) => n * 24 * 60 * 60 * 1000,
|
|
198
|
+
weeks: (n) => n * 7 * 24 * 60 * 60 * 1000,
|
|
199
|
+
};
|
|
200
|
+
/**
|
|
201
|
+
* Parse duration string to milliseconds
|
|
202
|
+
* Supports: "1s", "5m", "2h", "1d", "1w"
|
|
203
|
+
*/
|
|
204
|
+
export function parseDuration(duration) {
|
|
205
|
+
const match = /^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d|w)$/i.exec(duration);
|
|
206
|
+
if (!match) {
|
|
207
|
+
throw new Error(`Invalid duration format: ${duration}`);
|
|
208
|
+
}
|
|
209
|
+
const value = parseFloat(match[1]);
|
|
210
|
+
const unit = match[2].toLowerCase();
|
|
211
|
+
switch (unit) {
|
|
212
|
+
case 'ms':
|
|
213
|
+
return Duration.milliseconds(value);
|
|
214
|
+
case 's':
|
|
215
|
+
return Duration.seconds(value);
|
|
216
|
+
case 'm':
|
|
217
|
+
return Duration.minutes(value);
|
|
218
|
+
case 'h':
|
|
219
|
+
return Duration.hours(value);
|
|
220
|
+
case 'd':
|
|
221
|
+
return Duration.days(value);
|
|
222
|
+
case 'w':
|
|
223
|
+
return Duration.weeks(value);
|
|
224
|
+
default:
|
|
225
|
+
throw new Error(`Unknown duration unit: ${unit}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Format duration to human-readable string
|
|
230
|
+
*/
|
|
231
|
+
export function formatDuration(ms) {
|
|
232
|
+
if (ms < 1000) {
|
|
233
|
+
return `${ms}ms`;
|
|
234
|
+
}
|
|
235
|
+
if (ms < 60000) {
|
|
236
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
237
|
+
}
|
|
238
|
+
if (ms < 3600000) {
|
|
239
|
+
return `${(ms / 60000).toFixed(1)}m`;
|
|
240
|
+
}
|
|
241
|
+
if (ms < 86400000) {
|
|
242
|
+
return `${(ms / 3600000).toFixed(1)}h`;
|
|
243
|
+
}
|
|
244
|
+
return `${(ms / 86400000).toFixed(1)}d`;
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=timer-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer-node.js","sourceRoot":"","sources":["../../src/timers/timer-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timer Store implementations for workflow timers
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - In-memory and file-based storage
|
|
6
|
+
* - Timer persistence across restarts
|
|
7
|
+
* - Efficient lookup by due time
|
|
8
|
+
* - Cancellation support
|
|
9
|
+
* - Fire event callbacks
|
|
10
|
+
*/
|
|
11
|
+
import type { TimerEntry, TimerStore } from '@cogitator-ai/types';
|
|
12
|
+
/**
|
|
13
|
+
* Timer query options
|
|
14
|
+
*/
|
|
15
|
+
export interface TimerQueryOptions {
|
|
16
|
+
workflowId?: string;
|
|
17
|
+
runId?: string;
|
|
18
|
+
nodeId?: string;
|
|
19
|
+
status?: 'pending' | 'fired' | 'cancelled';
|
|
20
|
+
firesBefore?: number;
|
|
21
|
+
firesAfter?: number;
|
|
22
|
+
limit?: number;
|
|
23
|
+
offset?: number;
|
|
24
|
+
}
|
|
25
|
+
type FireCallback = (entry: TimerEntry) => void;
|
|
26
|
+
/**
|
|
27
|
+
* In-memory timer store
|
|
28
|
+
*/
|
|
29
|
+
export declare class InMemoryTimerStore implements TimerStore {
|
|
30
|
+
private timers;
|
|
31
|
+
private fireCallbacks;
|
|
32
|
+
schedule(entry: Omit<TimerEntry, 'id' | 'cancelled' | 'fired' | 'createdAt'>): Promise<string>;
|
|
33
|
+
get(id: string): Promise<TimerEntry | null>;
|
|
34
|
+
cancel(id: string): Promise<void>;
|
|
35
|
+
getByWorkflow(workflowId: string): Promise<TimerEntry[]>;
|
|
36
|
+
getByRun(runId: string): Promise<TimerEntry[]>;
|
|
37
|
+
getPending(): Promise<TimerEntry[]>;
|
|
38
|
+
getOverdue(): Promise<TimerEntry[]>;
|
|
39
|
+
markFired(id: string): Promise<void>;
|
|
40
|
+
cleanup(olderThan: number): Promise<number>;
|
|
41
|
+
onFire(callback: FireCallback): () => void;
|
|
42
|
+
/**
|
|
43
|
+
* List timers with filtering
|
|
44
|
+
*/
|
|
45
|
+
list(options?: TimerQueryOptions): Promise<TimerEntry[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Count timers matching options
|
|
48
|
+
*/
|
|
49
|
+
count(options?: TimerQueryOptions): Promise<number>;
|
|
50
|
+
/**
|
|
51
|
+
* Clear all timers
|
|
52
|
+
*/
|
|
53
|
+
clear(): Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* File-based timer store for persistence
|
|
57
|
+
*/
|
|
58
|
+
export declare class FileTimerStore implements TimerStore {
|
|
59
|
+
private directory;
|
|
60
|
+
private indexFile;
|
|
61
|
+
private initialized;
|
|
62
|
+
private cache;
|
|
63
|
+
private fireCallbacks;
|
|
64
|
+
constructor(directory: string);
|
|
65
|
+
private ensureInitialized;
|
|
66
|
+
private persist;
|
|
67
|
+
schedule(entry: Omit<TimerEntry, 'id' | 'cancelled' | 'fired' | 'createdAt'>): Promise<string>;
|
|
68
|
+
get(id: string): Promise<TimerEntry | null>;
|
|
69
|
+
cancel(id: string): Promise<void>;
|
|
70
|
+
getByWorkflow(workflowId: string): Promise<TimerEntry[]>;
|
|
71
|
+
getByRun(runId: string): Promise<TimerEntry[]>;
|
|
72
|
+
getPending(): Promise<TimerEntry[]>;
|
|
73
|
+
getOverdue(): Promise<TimerEntry[]>;
|
|
74
|
+
markFired(id: string): Promise<void>;
|
|
75
|
+
cleanup(olderThan: number): Promise<number>;
|
|
76
|
+
onFire(callback: FireCallback): () => void;
|
|
77
|
+
list(options?: TimerQueryOptions): Promise<TimerEntry[]>;
|
|
78
|
+
count(options?: TimerQueryOptions): Promise<number>;
|
|
79
|
+
clear(): Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create an in-memory timer store
|
|
83
|
+
*/
|
|
84
|
+
export declare function createInMemoryTimerStore(): InMemoryTimerStore;
|
|
85
|
+
/**
|
|
86
|
+
* Create a file-based timer store
|
|
87
|
+
*/
|
|
88
|
+
export declare function createFileTimerStore(directory: string): FileTimerStore;
|
|
89
|
+
export {};
|
|
90
|
+
//# sourceMappingURL=timer-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer-store.d.ts","sourceRoot":"","sources":["../../src/timers/timer-store.ts"],"names":[],"mappings":"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"}
|