@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.
Files changed (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -0
  3. package/dist/builder.d.ts +39 -0
  4. package/dist/builder.d.ts.map +1 -0
  5. package/dist/builder.js +224 -0
  6. package/dist/builder.js.map +1 -0
  7. package/dist/checkpoint.d.ts +33 -0
  8. package/dist/checkpoint.d.ts.map +1 -0
  9. package/dist/checkpoint.js +108 -0
  10. package/dist/checkpoint.js.map +1 -0
  11. package/dist/executor.d.ts +24 -0
  12. package/dist/executor.d.ts.map +1 -0
  13. package/dist/executor.js +207 -0
  14. package/dist/executor.js.map +1 -0
  15. package/dist/human/approval-store.d.ts +95 -0
  16. package/dist/human/approval-store.d.ts.map +1 -0
  17. package/dist/human/approval-store.js +377 -0
  18. package/dist/human/approval-store.js.map +1 -0
  19. package/dist/human/human-node.d.ts +104 -0
  20. package/dist/human/human-node.d.ts.map +1 -0
  21. package/dist/human/human-node.js +342 -0
  22. package/dist/human/human-node.js.map +1 -0
  23. package/dist/human/index.d.ts +17 -0
  24. package/dist/human/index.d.ts.map +1 -0
  25. package/dist/human/index.js +17 -0
  26. package/dist/human/index.js.map +1 -0
  27. package/dist/human/notifiers.d.ts +85 -0
  28. package/dist/human/notifiers.d.ts.map +1 -0
  29. package/dist/human/notifiers.js +289 -0
  30. package/dist/human/notifiers.js.map +1 -0
  31. package/dist/index.d.ts +32 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +19 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/manager/index.d.ts +19 -0
  36. package/dist/manager/index.d.ts.map +1 -0
  37. package/dist/manager/index.js +17 -0
  38. package/dist/manager/index.js.map +1 -0
  39. package/dist/manager/run-store.d.ts +78 -0
  40. package/dist/manager/run-store.d.ts.map +1 -0
  41. package/dist/manager/run-store.js +390 -0
  42. package/dist/manager/run-store.js.map +1 -0
  43. package/dist/manager/scheduler.d.ts +159 -0
  44. package/dist/manager/scheduler.d.ts.map +1 -0
  45. package/dist/manager/scheduler.js +355 -0
  46. package/dist/manager/scheduler.js.map +1 -0
  47. package/dist/manager/workflow-manager.d.ts +114 -0
  48. package/dist/manager/workflow-manager.d.ts.map +1 -0
  49. package/dist/manager/workflow-manager.js +460 -0
  50. package/dist/manager/workflow-manager.js.map +1 -0
  51. package/dist/nodes/agent.d.ts +24 -0
  52. package/dist/nodes/agent.d.ts.map +1 -0
  53. package/dist/nodes/agent.js +37 -0
  54. package/dist/nodes/agent.js.map +1 -0
  55. package/dist/nodes/base.d.ts +12 -0
  56. package/dist/nodes/base.d.ts.map +1 -0
  57. package/dist/nodes/base.js +5 -0
  58. package/dist/nodes/base.js.map +1 -0
  59. package/dist/nodes/function.d.ts +27 -0
  60. package/dist/nodes/function.d.ts.map +1 -0
  61. package/dist/nodes/function.js +29 -0
  62. package/dist/nodes/function.js.map +1 -0
  63. package/dist/nodes/index.d.ts +8 -0
  64. package/dist/nodes/index.d.ts.map +1 -0
  65. package/dist/nodes/index.js +8 -0
  66. package/dist/nodes/index.js.map +1 -0
  67. package/dist/nodes/tool.d.ts +19 -0
  68. package/dist/nodes/tool.d.ts.map +1 -0
  69. package/dist/nodes/tool.js +26 -0
  70. package/dist/nodes/tool.js.map +1 -0
  71. package/dist/observability/exporters.d.ts +93 -0
  72. package/dist/observability/exporters.d.ts.map +1 -0
  73. package/dist/observability/exporters.js +330 -0
  74. package/dist/observability/exporters.js.map +1 -0
  75. package/dist/observability/index.d.ts +17 -0
  76. package/dist/observability/index.d.ts.map +1 -0
  77. package/dist/observability/index.js +17 -0
  78. package/dist/observability/index.js.map +1 -0
  79. package/dist/observability/metrics.d.ts +114 -0
  80. package/dist/observability/metrics.d.ts.map +1 -0
  81. package/dist/observability/metrics.js +435 -0
  82. package/dist/observability/metrics.js.map +1 -0
  83. package/dist/observability/span-attributes.d.ts +95 -0
  84. package/dist/observability/span-attributes.d.ts.map +1 -0
  85. package/dist/observability/span-attributes.js +142 -0
  86. package/dist/observability/span-attributes.js.map +1 -0
  87. package/dist/observability/tracer.d.ts +110 -0
  88. package/dist/observability/tracer.d.ts.map +1 -0
  89. package/dist/observability/tracer.js +409 -0
  90. package/dist/observability/tracer.js.map +1 -0
  91. package/dist/patterns/index.d.ts +15 -0
  92. package/dist/patterns/index.d.ts.map +1 -0
  93. package/dist/patterns/index.js +15 -0
  94. package/dist/patterns/index.js.map +1 -0
  95. package/dist/patterns/map-reduce.d.ts +223 -0
  96. package/dist/patterns/map-reduce.d.ts.map +1 -0
  97. package/dist/patterns/map-reduce.js +378 -0
  98. package/dist/patterns/map-reduce.js.map +1 -0
  99. package/dist/saga/circuit-breaker.d.ts +153 -0
  100. package/dist/saga/circuit-breaker.d.ts.map +1 -0
  101. package/dist/saga/circuit-breaker.js +306 -0
  102. package/dist/saga/circuit-breaker.js.map +1 -0
  103. package/dist/saga/compensation.d.ts +134 -0
  104. package/dist/saga/compensation.d.ts.map +1 -0
  105. package/dist/saga/compensation.js +240 -0
  106. package/dist/saga/compensation.js.map +1 -0
  107. package/dist/saga/dead-letter.d.ts +113 -0
  108. package/dist/saga/dead-letter.d.ts.map +1 -0
  109. package/dist/saga/dead-letter.js +307 -0
  110. package/dist/saga/dead-letter.js.map +1 -0
  111. package/dist/saga/idempotency.d.ts +95 -0
  112. package/dist/saga/idempotency.d.ts.map +1 -0
  113. package/dist/saga/idempotency.js +266 -0
  114. package/dist/saga/idempotency.js.map +1 -0
  115. package/dist/saga/index.d.ts +16 -0
  116. package/dist/saga/index.d.ts.map +1 -0
  117. package/dist/saga/index.js +16 -0
  118. package/dist/saga/index.js.map +1 -0
  119. package/dist/saga/retry.d.ts +59 -0
  120. package/dist/saga/retry.d.ts.map +1 -0
  121. package/dist/saga/retry.js +222 -0
  122. package/dist/saga/retry.js.map +1 -0
  123. package/dist/scheduler.d.ts +37 -0
  124. package/dist/scheduler.d.ts.map +1 -0
  125. package/dist/scheduler.js +151 -0
  126. package/dist/scheduler.js.map +1 -0
  127. package/dist/subworkflows/index.d.ts +16 -0
  128. package/dist/subworkflows/index.d.ts.map +1 -0
  129. package/dist/subworkflows/index.js +16 -0
  130. package/dist/subworkflows/index.js.map +1 -0
  131. package/dist/subworkflows/parallel-subworkflows.d.ts +139 -0
  132. package/dist/subworkflows/parallel-subworkflows.d.ts.map +1 -0
  133. package/dist/subworkflows/parallel-subworkflows.js +270 -0
  134. package/dist/subworkflows/parallel-subworkflows.js.map +1 -0
  135. package/dist/subworkflows/subworkflow-node.d.ts +136 -0
  136. package/dist/subworkflows/subworkflow-node.d.ts.map +1 -0
  137. package/dist/subworkflows/subworkflow-node.js +164 -0
  138. package/dist/subworkflows/subworkflow-node.js.map +1 -0
  139. package/dist/timers/cron-parser.d.ts +110 -0
  140. package/dist/timers/cron-parser.d.ts.map +1 -0
  141. package/dist/timers/cron-parser.js +412 -0
  142. package/dist/timers/cron-parser.js.map +1 -0
  143. package/dist/timers/index.d.ts +18 -0
  144. package/dist/timers/index.d.ts.map +1 -0
  145. package/dist/timers/index.js +18 -0
  146. package/dist/timers/index.js.map +1 -0
  147. package/dist/timers/timer-manager.d.ts +219 -0
  148. package/dist/timers/timer-manager.d.ts.map +1 -0
  149. package/dist/timers/timer-manager.js +351 -0
  150. package/dist/timers/timer-manager.js.map +1 -0
  151. package/dist/timers/timer-node.d.ts +144 -0
  152. package/dist/timers/timer-node.d.ts.map +1 -0
  153. package/dist/timers/timer-node.js +246 -0
  154. package/dist/timers/timer-node.js.map +1 -0
  155. package/dist/timers/timer-store.d.ts +90 -0
  156. package/dist/timers/timer-store.d.ts.map +1 -0
  157. package/dist/timers/timer-store.js +357 -0
  158. package/dist/timers/timer-store.js.map +1 -0
  159. package/dist/triggers/cron-trigger.d.ts +102 -0
  160. package/dist/triggers/cron-trigger.d.ts.map +1 -0
  161. package/dist/triggers/cron-trigger.js +309 -0
  162. package/dist/triggers/cron-trigger.js.map +1 -0
  163. package/dist/triggers/index.d.ts +14 -0
  164. package/dist/triggers/index.d.ts.map +1 -0
  165. package/dist/triggers/index.js +10 -0
  166. package/dist/triggers/index.js.map +1 -0
  167. package/dist/triggers/rate-limiter.d.ts +130 -0
  168. package/dist/triggers/rate-limiter.d.ts.map +1 -0
  169. package/dist/triggers/rate-limiter.js +294 -0
  170. package/dist/triggers/rate-limiter.js.map +1 -0
  171. package/dist/triggers/trigger-manager.d.ts +166 -0
  172. package/dist/triggers/trigger-manager.d.ts.map +1 -0
  173. package/dist/triggers/trigger-manager.js +436 -0
  174. package/dist/triggers/trigger-manager.js.map +1 -0
  175. package/dist/triggers/webhook-trigger.d.ts +150 -0
  176. package/dist/triggers/webhook-trigger.d.ts.map +1 -0
  177. package/dist/triggers/webhook-trigger.js +452 -0
  178. package/dist/triggers/webhook-trigger.js.map +1 -0
  179. package/package.json +44 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Cron expression parser with timezone support
3
+ *
4
+ * Features:
5
+ * - Standard cron expression parsing (5 or 6 fields)
6
+ * - Timezone-aware scheduling
7
+ * - Human-readable descriptions
8
+ * - Next/previous occurrence calculation
9
+ * - Validation and error reporting
10
+ */
11
+ /**
12
+ * Cron field descriptor
13
+ */
14
+ interface CronField {
15
+ name: string;
16
+ min: number;
17
+ max: number;
18
+ aliases?: Record<string, number>;
19
+ }
20
+ declare const CRON_FIELDS: CronField[];
21
+ /**
22
+ * Common cron presets
23
+ */
24
+ export declare const CRON_PRESETS: Record<string, string>;
25
+ /**
26
+ * Parsed cron expression result
27
+ */
28
+ export interface ParsedCron {
29
+ expression: string;
30
+ fields: {
31
+ second?: number[];
32
+ minute: number[];
33
+ hour: number[];
34
+ dayOfMonth: number[];
35
+ month: number[];
36
+ dayOfWeek: number[];
37
+ };
38
+ hasSeconds: boolean;
39
+ timezone?: string;
40
+ }
41
+ /**
42
+ * Cron iterator options
43
+ */
44
+ export interface CronIteratorOptions {
45
+ currentDate?: Date;
46
+ startDate?: Date;
47
+ endDate?: Date;
48
+ timezone?: string;
49
+ iterator?: boolean;
50
+ }
51
+ /**
52
+ * Validate a cron expression
53
+ */
54
+ export declare function validateCronExpression(expression: string): {
55
+ valid: boolean;
56
+ error?: string;
57
+ normalized?: string;
58
+ };
59
+ /**
60
+ * Parse a cron expression
61
+ */
62
+ export declare function parseCronExpression(expression: string, timezone?: string): ParsedCron;
63
+ /**
64
+ * Get the next occurrence of a cron expression
65
+ */
66
+ export declare function getNextCronOccurrence(expression: string, options?: CronIteratorOptions): Date;
67
+ /**
68
+ * Get the previous occurrence of a cron expression
69
+ */
70
+ export declare function getPreviousCronOccurrence(expression: string, options?: CronIteratorOptions): Date;
71
+ /**
72
+ * Get next N occurrences of a cron expression
73
+ */
74
+ export declare function getNextCronOccurrences(expression: string, count: number, options?: CronIteratorOptions): Date[];
75
+ /**
76
+ * Check if a cron expression matches a given date
77
+ */
78
+ export declare function cronMatchesDate(expression: string, date: Date, timezone?: string): boolean;
79
+ /**
80
+ * Calculate milliseconds until next occurrence
81
+ */
82
+ export declare function msUntilNextCronOccurrence(expression: string, options?: CronIteratorOptions): number;
83
+ /**
84
+ * Get human-readable description of a cron expression
85
+ */
86
+ export declare function describeCronExpression(expression: string): string;
87
+ /**
88
+ * Create a cron iterator
89
+ */
90
+ export declare function createCronIterator(expression: string, options?: CronIteratorOptions): {
91
+ next: () => Date | null;
92
+ prev: () => Date | null;
93
+ hasNext: () => boolean;
94
+ hasPrev: () => boolean;
95
+ reset: (date?: Date) => void;
96
+ };
97
+ /**
98
+ * Check if cron expression is valid
99
+ */
100
+ export declare function isValidCronExpression(expression: string): boolean;
101
+ /**
102
+ * Get all supported timezones
103
+ */
104
+ export declare function getSupportedTimezones(): string[];
105
+ /**
106
+ * Check if timezone is valid
107
+ */
108
+ export declare function isValidTimezone(timezone: string): boolean;
109
+ export { CRON_FIELDS };
110
+ //# sourceMappingURL=cron-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-parser.d.ts","sourceRoot":"","sources":["../../src/timers/cron-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,412 @@
1
+ /**
2
+ * Cron expression parser with timezone support
3
+ *
4
+ * Features:
5
+ * - Standard cron expression parsing (5 or 6 fields)
6
+ * - Timezone-aware scheduling
7
+ * - Human-readable descriptions
8
+ * - Next/previous occurrence calculation
9
+ * - Validation and error reporting
10
+ */
11
+ import parser from 'cron-parser';
12
+ const CRON_FIELDS = [
13
+ { name: 'second', min: 0, max: 59 },
14
+ { name: 'minute', min: 0, max: 59 },
15
+ { name: 'hour', min: 0, max: 23 },
16
+ { name: 'day', min: 1, max: 31 },
17
+ {
18
+ name: 'month',
19
+ min: 1,
20
+ max: 12,
21
+ aliases: {
22
+ jan: 1,
23
+ feb: 2,
24
+ mar: 3,
25
+ apr: 4,
26
+ may: 5,
27
+ jun: 6,
28
+ jul: 7,
29
+ aug: 8,
30
+ sep: 9,
31
+ oct: 10,
32
+ nov: 11,
33
+ dec: 12,
34
+ },
35
+ },
36
+ {
37
+ name: 'dayOfWeek',
38
+ min: 0,
39
+ max: 7,
40
+ aliases: {
41
+ sun: 0,
42
+ mon: 1,
43
+ tue: 2,
44
+ wed: 3,
45
+ thu: 4,
46
+ fri: 5,
47
+ sat: 6,
48
+ },
49
+ },
50
+ ];
51
+ /**
52
+ * Common cron presets
53
+ */
54
+ export const CRON_PRESETS = {
55
+ '@yearly': '0 0 1 1 *',
56
+ '@annually': '0 0 1 1 *',
57
+ '@monthly': '0 0 1 * *',
58
+ '@weekly': '0 0 * * 0',
59
+ '@daily': '0 0 * * *',
60
+ '@midnight': '0 0 * * *',
61
+ '@hourly': '0 * * * *',
62
+ '@every_minute': '* * * * *',
63
+ '@every_5_minutes': '*/5 * * * *',
64
+ '@every_15_minutes': '*/15 * * * *',
65
+ '@every_30_minutes': '*/30 * * * *',
66
+ '@weekdays': '0 0 * * 1-5',
67
+ '@weekends': '0 0 * * 0,6',
68
+ };
69
+ /**
70
+ * Validate a cron expression
71
+ */
72
+ export function validateCronExpression(expression) {
73
+ const normalized = CRON_PRESETS[expression.toLowerCase()] ?? expression;
74
+ try {
75
+ parser.parseExpression(normalized);
76
+ return { valid: true, normalized };
77
+ }
78
+ catch (error) {
79
+ return {
80
+ valid: false,
81
+ error: error instanceof Error ? error.message : 'Invalid cron expression',
82
+ };
83
+ }
84
+ }
85
+ /**
86
+ * Parse a cron expression
87
+ */
88
+ export function parseCronExpression(expression, timezone) {
89
+ const normalized = CRON_PRESETS[expression.toLowerCase()] ?? expression;
90
+ const parts = normalized.trim().split(/\s+/);
91
+ const hasSeconds = parts.length === 6;
92
+ const options = {};
93
+ if (timezone) {
94
+ options.timezone = timezone;
95
+ }
96
+ const interval = parser.parseExpression(normalized, options);
97
+ const fields = interval.fields;
98
+ return {
99
+ expression: normalized,
100
+ fields: {
101
+ second: hasSeconds ? Array.from(fields.second) : undefined,
102
+ minute: Array.from(fields.minute),
103
+ hour: Array.from(fields.hour),
104
+ dayOfMonth: Array.from(fields.dayOfMonth),
105
+ month: Array.from(fields.month),
106
+ dayOfWeek: Array.from(fields.dayOfWeek),
107
+ },
108
+ hasSeconds,
109
+ timezone,
110
+ };
111
+ }
112
+ /**
113
+ * Get the next occurrence of a cron expression
114
+ */
115
+ export function getNextCronOccurrence(expression, options = {}) {
116
+ const normalized = CRON_PRESETS[expression.toLowerCase()] ?? expression;
117
+ const interval = parser.parseExpression(normalized, {
118
+ currentDate: options.currentDate ?? new Date(),
119
+ startDate: options.startDate,
120
+ endDate: options.endDate,
121
+ tz: options.timezone,
122
+ });
123
+ return interval.next().toDate();
124
+ }
125
+ /**
126
+ * Get the previous occurrence of a cron expression
127
+ */
128
+ export function getPreviousCronOccurrence(expression, options = {}) {
129
+ const normalized = CRON_PRESETS[expression.toLowerCase()] ?? expression;
130
+ const interval = parser.parseExpression(normalized, {
131
+ currentDate: options.currentDate ?? new Date(),
132
+ startDate: options.startDate,
133
+ endDate: options.endDate,
134
+ tz: options.timezone,
135
+ });
136
+ return interval.prev().toDate();
137
+ }
138
+ /**
139
+ * Get next N occurrences of a cron expression
140
+ */
141
+ export function getNextCronOccurrences(expression, count, options = {}) {
142
+ const normalized = CRON_PRESETS[expression.toLowerCase()] ?? expression;
143
+ const occurrences = [];
144
+ const interval = parser.parseExpression(normalized, {
145
+ currentDate: options.currentDate ?? new Date(),
146
+ startDate: options.startDate,
147
+ endDate: options.endDate,
148
+ tz: options.timezone,
149
+ });
150
+ for (let i = 0; i < count; i++) {
151
+ try {
152
+ occurrences.push(interval.next().toDate());
153
+ }
154
+ catch {
155
+ break;
156
+ }
157
+ }
158
+ return occurrences;
159
+ }
160
+ /**
161
+ * Check if a cron expression matches a given date
162
+ */
163
+ export function cronMatchesDate(expression, date, timezone) {
164
+ const normalized = CRON_PRESETS[expression.toLowerCase()] ?? expression;
165
+ let checkDate = date;
166
+ if (timezone) {
167
+ const formatter = new Intl.DateTimeFormat('en-US', {
168
+ timeZone: timezone,
169
+ year: 'numeric',
170
+ month: '2-digit',
171
+ day: '2-digit',
172
+ hour: '2-digit',
173
+ minute: '2-digit',
174
+ second: '2-digit',
175
+ hour12: false,
176
+ });
177
+ const parts = formatter.formatToParts(date);
178
+ const get = (type) => parseInt(parts.find((p) => p.type === type)?.value ?? '0');
179
+ checkDate = new Date(get('year'), get('month') - 1, get('day'), get('hour'), get('minute'), get('second'));
180
+ }
181
+ const parsed = parseCronExpression(normalized, timezone);
182
+ const minute = checkDate.getMinutes();
183
+ const hour = checkDate.getHours();
184
+ const dayOfMonth = checkDate.getDate();
185
+ const month = checkDate.getMonth() + 1;
186
+ const dayOfWeek = checkDate.getDay();
187
+ if (!parsed.fields.minute.includes(minute))
188
+ return false;
189
+ if (!parsed.fields.hour.includes(hour))
190
+ return false;
191
+ if (!parsed.fields.month.includes(month))
192
+ return false;
193
+ const dayOfMonthSpecified = parsed.fields.dayOfMonth.length < 31;
194
+ const dayOfWeekSpecified = parsed.fields.dayOfWeek.length < 8;
195
+ if (dayOfMonthSpecified && dayOfWeekSpecified) {
196
+ if (!parsed.fields.dayOfMonth.includes(dayOfMonth) &&
197
+ !parsed.fields.dayOfWeek.includes(dayOfWeek)) {
198
+ return false;
199
+ }
200
+ }
201
+ else if (dayOfMonthSpecified) {
202
+ if (!parsed.fields.dayOfMonth.includes(dayOfMonth))
203
+ return false;
204
+ }
205
+ else if (dayOfWeekSpecified) {
206
+ if (!parsed.fields.dayOfWeek.includes(dayOfWeek))
207
+ return false;
208
+ }
209
+ if (parsed.hasSeconds && parsed.fields.second) {
210
+ const second = checkDate.getSeconds();
211
+ if (!parsed.fields.second.includes(second))
212
+ return false;
213
+ }
214
+ return true;
215
+ }
216
+ /**
217
+ * Calculate milliseconds until next occurrence
218
+ */
219
+ export function msUntilNextCronOccurrence(expression, options = {}) {
220
+ const now = options.currentDate ?? new Date();
221
+ const next = getNextCronOccurrence(expression, options);
222
+ return next.getTime() - now.getTime();
223
+ }
224
+ /**
225
+ * Get human-readable description of a cron expression
226
+ */
227
+ export function describeCronExpression(expression) {
228
+ const normalized = CRON_PRESETS[expression.toLowerCase()] ?? expression;
229
+ const parts = normalized.trim().split(/\s+/);
230
+ const presetDescriptions = {
231
+ '0 0 1 1 *': 'At midnight on January 1st',
232
+ '0 0 1 * *': 'At midnight on the first day of each month',
233
+ '0 0 * * 0': 'At midnight every Sunday',
234
+ '0 0 * * *': 'At midnight every day',
235
+ '0 * * * *': 'At the start of every hour',
236
+ '* * * * *': 'Every minute',
237
+ '*/5 * * * *': 'Every 5 minutes',
238
+ '*/15 * * * *': 'Every 15 minutes',
239
+ '*/30 * * * *': 'Every 30 minutes',
240
+ '0 0 * * 1-5': 'At midnight on weekdays',
241
+ '0 0 * * 0,6': 'At midnight on weekends',
242
+ };
243
+ if (presetDescriptions[normalized]) {
244
+ return presetDescriptions[normalized];
245
+ }
246
+ const hasSeconds = parts.length === 6;
247
+ const offset = hasSeconds ? 1 : 0;
248
+ const minute = parts[0 + offset];
249
+ const hour = parts[1 + offset];
250
+ const dayOfMonth = parts[2 + offset];
251
+ const month = parts[3 + offset];
252
+ const dayOfWeek = parts[4 + offset];
253
+ const descriptions = [];
254
+ if (minute === '*' && hour === '*') {
255
+ descriptions.push('Every minute');
256
+ }
257
+ else if (minute.startsWith('*/')) {
258
+ const interval = minute.slice(2);
259
+ descriptions.push(`Every ${interval} minutes`);
260
+ }
261
+ else if (hour === '*') {
262
+ descriptions.push(`At minute ${minute} of every hour`);
263
+ }
264
+ else if (minute === '0') {
265
+ if (hour === '*') {
266
+ descriptions.push('At the start of every hour');
267
+ }
268
+ else if (hour.includes(',')) {
269
+ descriptions.push(`At ${hour.split(',').join(', ')}:00`);
270
+ }
271
+ else if (hour.includes('-')) {
272
+ const [start, end] = hour.split('-');
273
+ descriptions.push(`Every hour from ${start}:00 to ${end}:00`);
274
+ }
275
+ else {
276
+ descriptions.push(`At ${hour}:00`);
277
+ }
278
+ }
279
+ else {
280
+ descriptions.push(`At ${hour}:${minute.padStart(2, '0')}`);
281
+ }
282
+ if (dayOfMonth !== '*' || dayOfWeek !== '*') {
283
+ if (dayOfWeek !== '*') {
284
+ const dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
285
+ if (dayOfWeek.includes(',')) {
286
+ const days = dayOfWeek.split(',').map((d) => dayNames[parseInt(d)] || d);
287
+ descriptions.push(`on ${days.join(', ')}`);
288
+ }
289
+ else if (dayOfWeek.includes('-')) {
290
+ const [start, end] = dayOfWeek.split('-');
291
+ descriptions.push(`${dayNames[parseInt(start)]} through ${dayNames[parseInt(end)]}`);
292
+ }
293
+ else if (dayOfWeek !== '*') {
294
+ descriptions.push(`on ${dayNames[parseInt(dayOfWeek)]}`);
295
+ }
296
+ }
297
+ if (dayOfMonth !== '*') {
298
+ if (dayOfMonth.includes(',')) {
299
+ descriptions.push(`on days ${dayOfMonth}`);
300
+ }
301
+ else if (dayOfMonth.includes('-')) {
302
+ const [start, end] = dayOfMonth.split('-');
303
+ descriptions.push(`on days ${start} through ${end}`);
304
+ }
305
+ else {
306
+ const suffix = dayOfMonth === '1' || dayOfMonth === '21' || dayOfMonth === '31'
307
+ ? 'st'
308
+ : dayOfMonth === '2' || dayOfMonth === '22'
309
+ ? 'nd'
310
+ : dayOfMonth === '3' || dayOfMonth === '23'
311
+ ? 'rd'
312
+ : 'th';
313
+ descriptions.push(`on the ${dayOfMonth}${suffix}`);
314
+ }
315
+ }
316
+ }
317
+ if (month !== '*') {
318
+ const monthNames = [
319
+ '',
320
+ 'January',
321
+ 'February',
322
+ 'March',
323
+ 'April',
324
+ 'May',
325
+ 'June',
326
+ 'July',
327
+ 'August',
328
+ 'September',
329
+ 'October',
330
+ 'November',
331
+ 'December',
332
+ ];
333
+ if (month.includes(',')) {
334
+ const months = month.split(',').map((m) => monthNames[parseInt(m)] || m);
335
+ descriptions.push(`in ${months.join(', ')}`);
336
+ }
337
+ else if (month.includes('-')) {
338
+ const [start, end] = month.split('-');
339
+ descriptions.push(`from ${monthNames[parseInt(start)]} to ${monthNames[parseInt(end)]}`);
340
+ }
341
+ else {
342
+ descriptions.push(`in ${monthNames[parseInt(month)]}`);
343
+ }
344
+ }
345
+ return descriptions.join(' ');
346
+ }
347
+ /**
348
+ * Create a cron iterator
349
+ */
350
+ export function createCronIterator(expression, options = {}) {
351
+ const normalized = CRON_PRESETS[expression.toLowerCase()] ?? expression;
352
+ let interval = parser.parseExpression(normalized, {
353
+ currentDate: options.currentDate ?? new Date(),
354
+ startDate: options.startDate,
355
+ endDate: options.endDate,
356
+ tz: options.timezone,
357
+ });
358
+ return {
359
+ next: () => {
360
+ try {
361
+ return interval.next().toDate();
362
+ }
363
+ catch {
364
+ return null;
365
+ }
366
+ },
367
+ prev: () => {
368
+ try {
369
+ return interval.prev().toDate();
370
+ }
371
+ catch {
372
+ return null;
373
+ }
374
+ },
375
+ hasNext: () => interval.hasNext(),
376
+ hasPrev: () => interval.hasPrev(),
377
+ reset: (date) => {
378
+ interval = parser.parseExpression(normalized, {
379
+ currentDate: date ?? new Date(),
380
+ startDate: options.startDate,
381
+ endDate: options.endDate,
382
+ tz: options.timezone,
383
+ });
384
+ },
385
+ };
386
+ }
387
+ /**
388
+ * Check if cron expression is valid
389
+ */
390
+ export function isValidCronExpression(expression) {
391
+ return validateCronExpression(expression).valid;
392
+ }
393
+ /**
394
+ * Get all supported timezones
395
+ */
396
+ export function getSupportedTimezones() {
397
+ return Intl.supportedValuesOf('timeZone');
398
+ }
399
+ /**
400
+ * Check if timezone is valid
401
+ */
402
+ export function isValidTimezone(timezone) {
403
+ try {
404
+ Intl.DateTimeFormat(undefined, { timeZone: timezone });
405
+ return true;
406
+ }
407
+ catch {
408
+ return false;
409
+ }
410
+ }
411
+ export { CRON_FIELDS };
412
+ //# sourceMappingURL=cron-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-parser.js","sourceRoot":"","sources":["../../src/timers/cron-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @cogitator-ai/workflows - Timer module
3
+ *
4
+ * Provides timer and scheduling capabilities for workflow execution.
5
+ *
6
+ * Features:
7
+ * - Fixed and dynamic delay nodes
8
+ * - Cron-based scheduling with timezone support
9
+ * - Timer persistence across restarts
10
+ * - Background timer processing
11
+ * - Automatic recovery of missed timers
12
+ * - Cleanup of old timers
13
+ */
14
+ export { type TimerQueryOptions, InMemoryTimerStore, FileTimerStore, createInMemoryTimerStore, createFileTimerStore, } from './timer-store';
15
+ export { type ParsedCron, type CronIteratorOptions, CRON_PRESETS, CRON_FIELDS, validateCronExpression, parseCronExpression, getNextCronOccurrence, getPreviousCronOccurrence, getNextCronOccurrences, cronMatchesDate, msUntilNextCronOccurrence, describeCronExpression, createCronIterator, isValidCronExpression, getSupportedTimezones, isValidTimezone, } from './cron-parser';
16
+ export { type TimerNodeType, type TimerNodeConfig, type FixedDelayConfig, type DynamicDelayConfig, type CronWaitConfig, type UntilDateConfig, type AnyTimerNodeConfig, type TimerNodeResult, type TimerExecutionContext, delayNode, dynamicDelayNode, cronWaitNode, untilNode, calculateTimerDelay, executeTimerNode, createTimerNodeHelpers, AbortError, Duration, parseDuration, formatDuration, } from './timer-node';
17
+ export { type TimerHandler, type TimerManagerConfig, type TimerManagerStats, TimerManager, createTimerManager, RecurringTimerScheduler, createRecurringScheduler, } from './timer-manager';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/timers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,KAAK,iBAAiB,EACtB,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,YAAY,EACZ,WAAW,EACX,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,UAAU,EACV,QAAQ,EACR,aAAa,EACb,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @cogitator-ai/workflows - Timer module
3
+ *
4
+ * Provides timer and scheduling capabilities for workflow execution.
5
+ *
6
+ * Features:
7
+ * - Fixed and dynamic delay nodes
8
+ * - Cron-based scheduling with timezone support
9
+ * - Timer persistence across restarts
10
+ * - Background timer processing
11
+ * - Automatic recovery of missed timers
12
+ * - Cleanup of old timers
13
+ */
14
+ export { InMemoryTimerStore, FileTimerStore, createInMemoryTimerStore, createFileTimerStore, } from './timer-store';
15
+ export { CRON_PRESETS, CRON_FIELDS, validateCronExpression, parseCronExpression, getNextCronOccurrence, getPreviousCronOccurrence, getNextCronOccurrences, cronMatchesDate, msUntilNextCronOccurrence, describeCronExpression, createCronIterator, isValidCronExpression, getSupportedTimezones, isValidTimezone, } from './cron-parser';
16
+ export { delayNode, dynamicDelayNode, cronWaitNode, untilNode, calculateTimerDelay, executeTimerNode, createTimerNodeHelpers, AbortError, Duration, parseDuration, formatDuration, } from './timer-node';
17
+ export { TimerManager, createTimerManager, RecurringTimerScheduler, createRecurringScheduler, } from './timer-manager';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/timers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAEL,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAGL,YAAY,EACZ,WAAW,EACX,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAUL,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,UAAU,EACV,QAAQ,EACR,aAAa,EACb,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EAIL,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC"}