@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,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":"AAAA;;;;;;;;;GASG;AAMH,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAuF7E;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,IAAY,EACZ,KAAa,EACb,UAAgE,EAAE;IAElE,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,OAAO;QACb,KAAK;QACL,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,QAA8B,EAC9B,UAAqE,EAAE;IAEvE,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,SAAS;QACf,QAAQ;QACR,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,UAAkB,EAClB,UAAmE,EAAE;IAErE,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,MAAM;QACZ,UAAU;QACV,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,IAAY,EACZ,OAAoC,EACpC,UAAiE,EAAE;IAEnE,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,OAAO;QACb,OAAO;QACP,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAA6B,EAC7B,KAAQ;IAER,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,KAAK,CAAC;QAEtB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEhC,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,CAAC,UAAU,EAAE;gBACpD,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;gBACtE,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,CAAC;QAC3C,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,UAAU,GAAG,MAAM,YAAY,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YACtE,MAAM,KAAK,GAAG,UAAU,GAAG,GAAG,CAAC;YAE/B,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACnC,OAAO,CAAC,CAAC;YACX,CAAC;YAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAA6B,EAC7B,KAAQ,EACR,OAA8B;IAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC;IAE5B,IAAI,OAA2B,CAAC;IAEhC,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACzC,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO;YACP,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;YACvF,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;SAC3C,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,SAAS,GAAG,IAAI,CAAC;YAEjB,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,EAAE,CAAC;gBACpD,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACpD,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAEtC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,EAAE,CAAC;QAClE,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,WAAW,EAAE,GAAG;QAChB,OAAO;QACP,MAAM;QACN,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAO,GAAG,eAAe;QACnC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAa,EAAE,MAAoB;IACxD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAsB;IAC3D,OAAO;QACL,SAAS,EAAE,CACT,IAAY,EACZ,KAAa,EACb,UAAgE,EAAE,EAClE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAE1D,gBAAgB,EAAE,CAChB,IAAY,EACZ,QAA8B,EAC9B,UAAqE,EAAE,EACvE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAEpE,YAAY,EAAE,CACZ,IAAY,EACZ,UAAkB,EAClB,UAAmE,EAAE,EACrE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAElE,SAAS,EAAE,CACT,IAAY,EACZ,OAAoC,EACpC,UAAiE,EAAE,EACnE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAE5D,gBAAgB,EAAE,CAChB,MAA6B,EAC7B,KAAQ,EACR,OAAkD,EAClD,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAC;KACjE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,YAAY,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI;IAChC,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI;IACrC,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IACxC,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IAC5C,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;CACzC,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,KAAK,GAAG,qCAAqC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEpC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,IAAI;YACP,OAAO,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtC,KAAK,GAAG;YACN,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,GAAG;YACN,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,GAAG;YACN,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,GAAG;YACN,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,KAAK,GAAG;YACN,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACd,OAAO,GAAG,EAAE,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,CAAC;IAED,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACvC,CAAC;IAED,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;QAClB,OAAO,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACzC,CAAC;IAED,OAAO,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1C,CAAC"}
@@ -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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"}