stelo 1.0.1

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 (141) hide show
  1. package/LICENSE +184 -0
  2. package/README.md +853 -0
  3. package/dist/accessibility.d.ts +227 -0
  4. package/dist/accessibility.d.ts.map +1 -0
  5. package/dist/accessibility.js +602 -0
  6. package/dist/accessibility.js.map +1 -0
  7. package/dist/agent.d.ts +870 -0
  8. package/dist/agent.d.ts.map +1 -0
  9. package/dist/agent.js +1107 -0
  10. package/dist/agent.js.map +1 -0
  11. package/dist/audio-stream.d.ts +114 -0
  12. package/dist/audio-stream.d.ts.map +1 -0
  13. package/dist/audio-stream.js +167 -0
  14. package/dist/audio-stream.js.map +1 -0
  15. package/dist/clipboard.d.ts +99 -0
  16. package/dist/clipboard.d.ts.map +1 -0
  17. package/dist/clipboard.js +352 -0
  18. package/dist/clipboard.js.map +1 -0
  19. package/dist/config.d.ts +183 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +477 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/context.d.ts +213 -0
  24. package/dist/context.d.ts.map +1 -0
  25. package/dist/context.js +387 -0
  26. package/dist/context.js.map +1 -0
  27. package/dist/cortex.d.ts +548 -0
  28. package/dist/cortex.d.ts.map +1 -0
  29. package/dist/cortex.js +1479 -0
  30. package/dist/cortex.js.map +1 -0
  31. package/dist/errors.d.ts +133 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +278 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/events.d.ts +227 -0
  36. package/dist/events.d.ts.map +1 -0
  37. package/dist/events.js +429 -0
  38. package/dist/events.js.map +1 -0
  39. package/dist/executor.d.ts +212 -0
  40. package/dist/executor.d.ts.map +1 -0
  41. package/dist/executor.js +545 -0
  42. package/dist/executor.js.map +1 -0
  43. package/dist/index.d.ts +69 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +167 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/integration.d.ts +159 -0
  48. package/dist/integration.d.ts.map +1 -0
  49. package/dist/integration.js +533 -0
  50. package/dist/integration.js.map +1 -0
  51. package/dist/keyboard.d.ts +276 -0
  52. package/dist/keyboard.d.ts.map +1 -0
  53. package/dist/keyboard.js +404 -0
  54. package/dist/keyboard.js.map +1 -0
  55. package/dist/logger.d.ts +198 -0
  56. package/dist/logger.d.ts.map +1 -0
  57. package/dist/logger.js +516 -0
  58. package/dist/logger.js.map +1 -0
  59. package/dist/middleware.d.ts +183 -0
  60. package/dist/middleware.d.ts.map +1 -0
  61. package/dist/middleware.js +493 -0
  62. package/dist/middleware.js.map +1 -0
  63. package/dist/monitor.d.ts +136 -0
  64. package/dist/monitor.d.ts.map +1 -0
  65. package/dist/monitor.js +341 -0
  66. package/dist/monitor.js.map +1 -0
  67. package/dist/mouse.d.ts +290 -0
  68. package/dist/mouse.d.ts.map +1 -0
  69. package/dist/mouse.js +466 -0
  70. package/dist/mouse.js.map +1 -0
  71. package/dist/plugin.d.ts +157 -0
  72. package/dist/plugin.d.ts.map +1 -0
  73. package/dist/plugin.js +409 -0
  74. package/dist/plugin.js.map +1 -0
  75. package/dist/process.d.ts +106 -0
  76. package/dist/process.d.ts.map +1 -0
  77. package/dist/process.js +326 -0
  78. package/dist/process.js.map +1 -0
  79. package/dist/recorder.d.ts +100 -0
  80. package/dist/recorder.d.ts.map +1 -0
  81. package/dist/recorder.js +258 -0
  82. package/dist/recorder.js.map +1 -0
  83. package/dist/safety.d.ts +59 -0
  84. package/dist/safety.d.ts.map +1 -0
  85. package/dist/safety.js +98 -0
  86. package/dist/safety.js.map +1 -0
  87. package/dist/scheduler.d.ts +152 -0
  88. package/dist/scheduler.d.ts.map +1 -0
  89. package/dist/scheduler.js +615 -0
  90. package/dist/scheduler.js.map +1 -0
  91. package/dist/screen.d.ts +96 -0
  92. package/dist/screen.d.ts.map +1 -0
  93. package/dist/screen.js +154 -0
  94. package/dist/screen.js.map +1 -0
  95. package/dist/session.d.ts +209 -0
  96. package/dist/session.d.ts.map +1 -0
  97. package/dist/session.js +479 -0
  98. package/dist/session.js.map +1 -0
  99. package/dist/stream.d.ts +168 -0
  100. package/dist/stream.d.ts.map +1 -0
  101. package/dist/stream.js +298 -0
  102. package/dist/stream.js.map +1 -0
  103. package/dist/telemetry.d.ts +223 -0
  104. package/dist/telemetry.d.ts.map +1 -0
  105. package/dist/telemetry.js +433 -0
  106. package/dist/telemetry.js.map +1 -0
  107. package/dist/types.d.ts +165 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/dist/types.js +8 -0
  110. package/dist/types.js.map +1 -0
  111. package/dist/utils/bezier.d.ts +51 -0
  112. package/dist/utils/bezier.d.ts.map +1 -0
  113. package/dist/utils/bezier.js +117 -0
  114. package/dist/utils/bezier.js.map +1 -0
  115. package/dist/utils/helpers.d.ts +90 -0
  116. package/dist/utils/helpers.d.ts.map +1 -0
  117. package/dist/utils/helpers.js +143 -0
  118. package/dist/utils/helpers.js.map +1 -0
  119. package/dist/utils/index.d.ts +4 -0
  120. package/dist/utils/index.d.ts.map +1 -0
  121. package/dist/utils/index.js +18 -0
  122. package/dist/utils/index.js.map +1 -0
  123. package/dist/validation.d.ts +254 -0
  124. package/dist/validation.d.ts.map +1 -0
  125. package/dist/validation.js +478 -0
  126. package/dist/validation.js.map +1 -0
  127. package/dist/vision.d.ts +719 -0
  128. package/dist/vision.d.ts.map +1 -0
  129. package/dist/vision.js +1197 -0
  130. package/dist/vision.js.map +1 -0
  131. package/dist/window.d.ts +80 -0
  132. package/dist/window.d.ts.map +1 -0
  133. package/dist/window.js +170 -0
  134. package/dist/window.js.map +1 -0
  135. package/dist/workflow.d.ts +224 -0
  136. package/dist/workflow.d.ts.map +1 -0
  137. package/dist/workflow.js +578 -0
  138. package/dist/workflow.js.map +1 -0
  139. package/index.d.ts +840 -0
  140. package/index.js +495 -0
  141. package/package.json +91 -0
@@ -0,0 +1,615 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // Stelo — Task Scheduler
4
+ // ============================================================================
5
+ // Cron-like scheduling, delayed execution, recurring tasks, task
6
+ // dependencies, and distributed-safe scheduling primitives.
7
+ // ============================================================================
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.scheduler = void 0;
10
+ const events_1 = require("./events");
11
+ const logger_1 = require("./logger");
12
+ let _taskIdCounter = 0;
13
+ const _tasks = new Map();
14
+ const _completedTasks = [];
15
+ const _log = logger_1.logger.child('scheduler');
16
+ let _schedulerOptions = {
17
+ maxConcurrent: 10,
18
+ timezone: 'local',
19
+ catchErrors: true,
20
+ };
21
+ function generateId() {
22
+ return `sched_${Date.now()}_${++_taskIdCounter}`;
23
+ }
24
+ function getRunningCount() {
25
+ let count = 0;
26
+ for (const task of _tasks.values()) {
27
+ if (task.isRunning)
28
+ count++;
29
+ }
30
+ return count;
31
+ }
32
+ async function executeTask(task) {
33
+ if (task.status === 'cancelled' || task.status === 'completed')
34
+ return;
35
+ // Check overlap policy
36
+ if (task.isRunning) {
37
+ if (task.options.overlapPolicy === 'skip') {
38
+ _log.debug('Skipping overlapping task', { taskId: task.id });
39
+ return;
40
+ }
41
+ if (task.options.overlapPolicy === 'queue') {
42
+ // Wait for current execution to finish
43
+ while (task.isRunning) {
44
+ await new Promise((r) => setTimeout(r, 100));
45
+ }
46
+ }
47
+ }
48
+ // Check max concurrent
49
+ while (getRunningCount() >= _schedulerOptions.maxConcurrent) {
50
+ await new Promise((r) => setTimeout(r, 50));
51
+ }
52
+ // Check dependencies
53
+ if (task.options.dependsOn?.length) {
54
+ for (const depId of task.options.dependsOn) {
55
+ if (!_completedTasks.includes(depId)) {
56
+ _log.debug('Task dependency not met, deferring', {
57
+ taskId: task.id,
58
+ dependency: depId,
59
+ });
60
+ return;
61
+ }
62
+ }
63
+ }
64
+ task.isRunning = true;
65
+ task.status = 'active';
66
+ task.lastRunAt = Date.now();
67
+ events_1.events.emit('scheduler.task_start', 'scheduler', {
68
+ taskId: task.id,
69
+ name: task.name,
70
+ runCount: task.runCount + 1,
71
+ }, { source: 'scheduler' });
72
+ let timeoutHandle = null;
73
+ try {
74
+ const promise = Promise.resolve(task.fn());
75
+ if (task.options.timeoutMs && task.options.timeoutMs > 0) {
76
+ const result = await Promise.race([
77
+ promise,
78
+ new Promise((_, reject) => {
79
+ timeoutHandle = setTimeout(() => reject(new Error(`Task ${task.id} timed out after ${task.options.timeoutMs}ms`)), task.options.timeoutMs);
80
+ }),
81
+ ]);
82
+ }
83
+ else {
84
+ await promise;
85
+ }
86
+ if (timeoutHandle)
87
+ clearTimeout(timeoutHandle);
88
+ task.runCount++;
89
+ task.retryCount = 0;
90
+ events_1.events.emit('scheduler.task_complete', 'scheduler', {
91
+ taskId: task.id,
92
+ name: task.name,
93
+ runCount: task.runCount,
94
+ }, { source: 'scheduler' });
95
+ // Check if max runs reached
96
+ if (task.maxRuns > 0 && task.runCount >= task.maxRuns) {
97
+ task.status = 'completed';
98
+ _completedTasks.push(task.id);
99
+ if (task.timerRef) {
100
+ clearTimeout(task.timerRef);
101
+ clearInterval(task.timerRef);
102
+ task.timerRef = undefined;
103
+ }
104
+ events_1.events.emit('scheduler.task_finished', 'scheduler', {
105
+ taskId: task.id,
106
+ name: task.name,
107
+ totalRuns: task.runCount,
108
+ }, { source: 'scheduler' });
109
+ }
110
+ else {
111
+ task.status = 'pending';
112
+ }
113
+ }
114
+ catch (err) {
115
+ if (timeoutHandle)
116
+ clearTimeout(timeoutHandle);
117
+ task.failCount++;
118
+ // Check retry
119
+ const retryOpts = task.options.retry;
120
+ if (retryOpts && task.retryCount < retryOpts.attempts) {
121
+ task.retryCount++;
122
+ const delay = (retryOpts.delayMs ?? 1000) *
123
+ Math.pow(retryOpts.backoff ?? 2, task.retryCount - 1);
124
+ _log.warn('Retrying task', {
125
+ taskId: task.id,
126
+ attempt: task.retryCount,
127
+ delayMs: delay,
128
+ });
129
+ setTimeout(() => executeTask(task), delay);
130
+ }
131
+ else {
132
+ task.status = 'failed';
133
+ events_1.events.emit('scheduler.task_failed', 'scheduler', {
134
+ taskId: task.id,
135
+ name: task.name,
136
+ error: String(err),
137
+ }, { source: 'scheduler' });
138
+ if (!_schedulerOptions.catchErrors)
139
+ throw err;
140
+ _log.error('Task failed', err, { taskId: task.id });
141
+ }
142
+ }
143
+ finally {
144
+ task.isRunning = false;
145
+ }
146
+ }
147
+ // ── Simple Cron Parser ───────────────────────────────────────────────────────
148
+ /**
149
+ * Minimal cron parser supporting: second minute hour dayOfMonth month dayOfWeek
150
+ * Supports: numbers, *, /step, ranges (1-5), and lists (1,3,5).
151
+ */
152
+ function parseCronField(field, min, max) {
153
+ if (field === '*') {
154
+ return Array.from({ length: max - min + 1 }, (_, i) => min + i);
155
+ }
156
+ const results = [];
157
+ for (const part of field.split(',')) {
158
+ if (part.includes('/')) {
159
+ const [range, stepStr] = part.split('/');
160
+ const step = parseInt(stepStr, 10);
161
+ const [start, end] = range === '*' ? [min, max] : range.split('-').map(Number);
162
+ for (let i = start; i <= (end ?? max); i += step) {
163
+ results.push(i);
164
+ }
165
+ }
166
+ else if (part.includes('-')) {
167
+ const [start, end] = part.split('-').map(Number);
168
+ for (let i = start; i <= end; i++) {
169
+ results.push(i);
170
+ }
171
+ }
172
+ else {
173
+ results.push(parseInt(part, 10));
174
+ }
175
+ }
176
+ return results.filter((n) => n >= min && n <= max);
177
+ }
178
+ function getNextCronTime(pattern) {
179
+ const parts = pattern.trim().split(/\s+/);
180
+ // Support both 5 and 6 field cron (with seconds)
181
+ let second, minute, hour;
182
+ let dayOfMonth, month, dayOfWeek;
183
+ if (parts.length === 6) {
184
+ second = parseCronField(parts[0], 0, 59);
185
+ minute = parseCronField(parts[1], 0, 59);
186
+ hour = parseCronField(parts[2], 0, 23);
187
+ dayOfMonth = parseCronField(parts[3], 1, 31);
188
+ month = parseCronField(parts[4], 1, 12);
189
+ dayOfWeek = parseCronField(parts[5], 0, 6);
190
+ }
191
+ else if (parts.length === 5) {
192
+ second = [0];
193
+ minute = parseCronField(parts[0], 0, 59);
194
+ hour = parseCronField(parts[1], 0, 23);
195
+ dayOfMonth = parseCronField(parts[2], 1, 31);
196
+ month = parseCronField(parts[3], 1, 12);
197
+ dayOfWeek = parseCronField(parts[4], 0, 6);
198
+ }
199
+ else {
200
+ throw new Error(`Invalid cron pattern: ${pattern}`);
201
+ }
202
+ const now = new Date();
203
+ const searchLimit = new Date(now.getTime() + 366 * 24 * 60 * 60 * 1000);
204
+ const candidate = new Date(now);
205
+ candidate.setMilliseconds(0);
206
+ candidate.setSeconds(candidate.getSeconds() + 1);
207
+ while (candidate < searchLimit) {
208
+ if (month.includes(candidate.getMonth() + 1) &&
209
+ dayOfMonth.includes(candidate.getDate()) &&
210
+ dayOfWeek.includes(candidate.getDay()) &&
211
+ hour.includes(candidate.getHours()) &&
212
+ minute.includes(candidate.getMinutes()) &&
213
+ second.includes(candidate.getSeconds())) {
214
+ return candidate.getTime();
215
+ }
216
+ candidate.setSeconds(candidate.getSeconds() + 1);
217
+ // Optimization: skip ahead if day doesn't match
218
+ if (!dayOfMonth.includes(candidate.getDate()) || !dayOfWeek.includes(candidate.getDay())) {
219
+ candidate.setHours(0, 0, 0, 0);
220
+ candidate.setDate(candidate.getDate() + 1);
221
+ }
222
+ else if (!hour.includes(candidate.getHours())) {
223
+ candidate.setMinutes(0, 0, 0);
224
+ candidate.setHours(candidate.getHours() + 1);
225
+ }
226
+ else if (!minute.includes(candidate.getMinutes())) {
227
+ candidate.setSeconds(0, 0);
228
+ candidate.setMinutes(candidate.getMinutes() + 1);
229
+ }
230
+ }
231
+ throw new Error(`No next cron match found within 1 year for: ${pattern}`);
232
+ }
233
+ function scheduleCronTask(task) {
234
+ const schedule = () => {
235
+ if (task.status === 'cancelled' || task.status === 'completed')
236
+ return;
237
+ try {
238
+ const nextTime = getNextCronTime(task.cronPattern);
239
+ const delayMs = Math.max(0, nextTime - Date.now());
240
+ task.nextRunAt = nextTime;
241
+ task.timerRef = setTimeout(async () => {
242
+ await executeTask(task);
243
+ schedule(); // Schedule next occurrence
244
+ }, delayMs);
245
+ }
246
+ catch (err) {
247
+ _log.error('Failed to schedule cron task', err, { taskId: task.id });
248
+ task.status = 'failed';
249
+ }
250
+ };
251
+ schedule();
252
+ }
253
+ // ── Public API ───────────────────────────────────────────────────────────────
254
+ exports.scheduler = {
255
+ /**
256
+ * Configure the scheduler.
257
+ */
258
+ configure(options) {
259
+ _schedulerOptions = { ..._schedulerOptions, ...options };
260
+ },
261
+ /**
262
+ * Schedule a one-time delayed task.
263
+ */
264
+ once(delayMs, fn, options) {
265
+ const id = options?.id ?? generateId();
266
+ const task = {
267
+ id,
268
+ name: options?.name ?? `once-${id}`,
269
+ status: 'pending',
270
+ tags: options?.tags ?? [],
271
+ type: 'once',
272
+ fn,
273
+ options: { ...options, maxRuns: 1 },
274
+ createdAt: Date.now(),
275
+ nextRunAt: Date.now() + delayMs,
276
+ runCount: 0,
277
+ failCount: 0,
278
+ maxRuns: 1,
279
+ isRunning: false,
280
+ retryCount: 0,
281
+ };
282
+ task.timerRef = setTimeout(() => executeTask(task), delayMs);
283
+ _tasks.set(id, task);
284
+ _log.debug('Scheduled one-time task', { id, delayMs });
285
+ return id;
286
+ },
287
+ /**
288
+ * Schedule a recurring task at a fixed interval.
289
+ */
290
+ every(intervalMs, fn, options) {
291
+ const id = options?.id ?? generateId();
292
+ const task = {
293
+ id,
294
+ name: options?.name ?? `interval-${id}`,
295
+ status: 'pending',
296
+ tags: options?.tags ?? [],
297
+ type: 'interval',
298
+ fn,
299
+ options: options ?? {},
300
+ createdAt: Date.now(),
301
+ runCount: 0,
302
+ failCount: 0,
303
+ maxRuns: options?.maxRuns ?? 0,
304
+ intervalMs,
305
+ isRunning: false,
306
+ retryCount: 0,
307
+ };
308
+ if (options?.runImmediately) {
309
+ executeTask(task);
310
+ }
311
+ task.nextRunAt = Date.now() + intervalMs;
312
+ task.timerRef = setInterval(() => executeTask(task), intervalMs);
313
+ _tasks.set(id, task);
314
+ _log.debug('Scheduled recurring task', { id, intervalMs });
315
+ return id;
316
+ },
317
+ /**
318
+ * Schedule a task using a cron pattern.
319
+ * Supports 5-field (minute-level) and 6-field (second-level) cron expressions.
320
+ *
321
+ * @example
322
+ * ```
323
+ * scheduler.cron('0 * * * *', fn) // every hour
324
+ * scheduler.cron('*​/5 * * * *', fn) // every 5 minutes
325
+ * scheduler.cron('0 0 9 * * 1-5', fn) // 9am weekdays (6-field with seconds)
326
+ * ```
327
+ */
328
+ cron(pattern, fn, options) {
329
+ const id = options?.id ?? generateId();
330
+ const task = {
331
+ id,
332
+ name: options?.name ?? `cron-${id}`,
333
+ status: 'pending',
334
+ tags: options?.tags ?? [],
335
+ type: 'cron',
336
+ fn,
337
+ options: options ?? {},
338
+ createdAt: Date.now(),
339
+ runCount: 0,
340
+ failCount: 0,
341
+ maxRuns: options?.maxRuns ?? 0,
342
+ cronPattern: pattern,
343
+ isRunning: false,
344
+ retryCount: 0,
345
+ };
346
+ if (options?.runImmediately) {
347
+ executeTask(task);
348
+ }
349
+ scheduleCronTask(task);
350
+ _tasks.set(id, task);
351
+ _log.debug('Scheduled cron task', { id, pattern });
352
+ return id;
353
+ },
354
+ /**
355
+ * Cancel a scheduled task.
356
+ */
357
+ cancel(taskId) {
358
+ const task = _tasks.get(taskId);
359
+ if (!task)
360
+ return false;
361
+ task.status = 'cancelled';
362
+ if (task.timerRef) {
363
+ clearTimeout(task.timerRef);
364
+ clearInterval(task.timerRef);
365
+ task.timerRef = undefined;
366
+ }
367
+ events_1.events.emit('scheduler.task_cancelled', 'scheduler', {
368
+ taskId: task.id,
369
+ name: task.name,
370
+ }, { source: 'scheduler' });
371
+ return true;
372
+ },
373
+ /**
374
+ * Pause a scheduled task.
375
+ */
376
+ pause(taskId) {
377
+ const task = _tasks.get(taskId);
378
+ if (!task || task.status === 'cancelled' || task.status === 'completed')
379
+ return false;
380
+ task.status = 'paused';
381
+ if (task.timerRef) {
382
+ clearTimeout(task.timerRef);
383
+ clearInterval(task.timerRef);
384
+ task.timerRef = undefined;
385
+ }
386
+ return true;
387
+ },
388
+ /**
389
+ * Resume a paused task.
390
+ */
391
+ resume(taskId) {
392
+ const task = _tasks.get(taskId);
393
+ if (!task || task.status !== 'paused')
394
+ return false;
395
+ task.status = 'pending';
396
+ if (task.type === 'interval' && task.intervalMs) {
397
+ task.timerRef = setInterval(() => executeTask(task), task.intervalMs);
398
+ }
399
+ else if (task.type === 'cron' && task.cronPattern) {
400
+ scheduleCronTask(task);
401
+ }
402
+ return true;
403
+ },
404
+ /**
405
+ * Get info for a specific task.
406
+ */
407
+ getTask(taskId) {
408
+ const task = _tasks.get(taskId);
409
+ if (!task)
410
+ return null;
411
+ return {
412
+ id: task.id,
413
+ name: task.name,
414
+ status: task.status,
415
+ tags: task.tags,
416
+ type: task.type,
417
+ createdAt: new Date(task.createdAt).toISOString(),
418
+ lastRunAt: task.lastRunAt
419
+ ? new Date(task.lastRunAt).toISOString()
420
+ : undefined,
421
+ nextRunAt: task.nextRunAt
422
+ ? new Date(task.nextRunAt).toISOString()
423
+ : undefined,
424
+ runCount: task.runCount,
425
+ failCount: task.failCount,
426
+ maxRuns: task.maxRuns,
427
+ };
428
+ },
429
+ /**
430
+ * List all tasks, optionally filtered.
431
+ */
432
+ listTasks(filter) {
433
+ const results = [];
434
+ for (const task of _tasks.values()) {
435
+ if (filter?.status && task.status !== filter.status)
436
+ continue;
437
+ if (filter?.tag && !task.tags.includes(filter.tag))
438
+ continue;
439
+ if (filter?.type && task.type !== filter.type)
440
+ continue;
441
+ results.push({
442
+ id: task.id,
443
+ name: task.name,
444
+ status: task.status,
445
+ tags: task.tags,
446
+ type: task.type,
447
+ createdAt: new Date(task.createdAt).toISOString(),
448
+ lastRunAt: task.lastRunAt ? new Date(task.lastRunAt).toISOString() : undefined,
449
+ nextRunAt: task.nextRunAt ? new Date(task.nextRunAt).toISOString() : undefined,
450
+ runCount: task.runCount,
451
+ failCount: task.failCount,
452
+ maxRuns: task.maxRuns,
453
+ });
454
+ }
455
+ return results;
456
+ },
457
+ /**
458
+ * Get scheduler stats.
459
+ */
460
+ getStats() {
461
+ let totalExecutions = 0;
462
+ let active = 0, pending = 0, completed = 0, failed = 0, cancelled = 0;
463
+ for (const task of _tasks.values()) {
464
+ totalExecutions += task.runCount;
465
+ switch (task.status) {
466
+ case 'active':
467
+ active++;
468
+ break;
469
+ case 'pending':
470
+ pending++;
471
+ break;
472
+ case 'completed':
473
+ completed++;
474
+ break;
475
+ case 'failed':
476
+ failed++;
477
+ break;
478
+ case 'cancelled':
479
+ cancelled++;
480
+ break;
481
+ }
482
+ }
483
+ return {
484
+ totalTasks: _tasks.size,
485
+ activeTasks: active,
486
+ pendingTasks: pending,
487
+ completedTasks: completed,
488
+ failedTasks: failed,
489
+ cancelledTasks: cancelled,
490
+ totalExecutions,
491
+ };
492
+ },
493
+ /**
494
+ * Cancel all tasks.
495
+ */
496
+ cancelAll() {
497
+ let count = 0;
498
+ for (const [id] of _tasks) {
499
+ if (exports.scheduler.cancel(id))
500
+ count++;
501
+ }
502
+ return count;
503
+ },
504
+ /**
505
+ * Remove completed/cancelled/failed tasks from the task list.
506
+ */
507
+ cleanup() {
508
+ let count = 0;
509
+ for (const [id, task] of _tasks) {
510
+ if (task.status === 'completed' ||
511
+ task.status === 'cancelled' ||
512
+ task.status === 'failed') {
513
+ _tasks.delete(id);
514
+ count++;
515
+ }
516
+ }
517
+ return count;
518
+ },
519
+ /**
520
+ * Reset the scheduler (cancel all tasks and clear state).
521
+ */
522
+ reset() {
523
+ exports.scheduler.cancelAll();
524
+ _tasks.clear();
525
+ _completedTasks.length = 0;
526
+ _taskIdCounter = 0;
527
+ },
528
+ // ── Convenience Helpers ────────────────────────────────────────────────
529
+ /**
530
+ * Run a function after a delay (like setTimeout but tracked).
531
+ */
532
+ delay(ms) {
533
+ return new Promise((resolve) => {
534
+ exports.scheduler.once(ms, resolve, { name: `delay-${ms}ms` });
535
+ });
536
+ },
537
+ /**
538
+ * Run a function at a specific time.
539
+ */
540
+ at(date, fn, options) {
541
+ const delayMs = Math.max(0, date.getTime() - Date.now());
542
+ return exports.scheduler.once(delayMs, fn, {
543
+ ...options,
544
+ name: options?.name ?? `at-${date.toISOString()}`,
545
+ });
546
+ },
547
+ /**
548
+ * Wait until a condition is true, polling at an interval.
549
+ */
550
+ async waitUntil(predicate, options) {
551
+ const intervalMs = options?.intervalMs ?? 200;
552
+ const timeoutMs = options?.timeoutMs ?? 30000;
553
+ const start = Date.now();
554
+ while (Date.now() - start < timeoutMs) {
555
+ if (await predicate())
556
+ return true;
557
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
558
+ }
559
+ return false;
560
+ },
561
+ /**
562
+ * Debounce: only execute after the function hasn't been called for `delayMs`.
563
+ * Returns a wrapped function and a cancel handle.
564
+ */
565
+ debounce(fn, delayMs) {
566
+ let timer = null;
567
+ return {
568
+ call: (...args) => {
569
+ if (timer)
570
+ clearTimeout(timer);
571
+ timer = setTimeout(() => {
572
+ fn(...args);
573
+ timer = null;
574
+ }, delayMs);
575
+ },
576
+ cancel: () => {
577
+ if (timer) {
578
+ clearTimeout(timer);
579
+ timer = null;
580
+ }
581
+ },
582
+ };
583
+ },
584
+ /**
585
+ * Throttle: execute at most once per `intervalMs`.
586
+ */
587
+ throttle(fn, intervalMs) {
588
+ let lastRun = 0;
589
+ let timer = null;
590
+ return {
591
+ call: (...args) => {
592
+ const now = Date.now();
593
+ const remaining = intervalMs - (now - lastRun);
594
+ if (remaining <= 0) {
595
+ lastRun = now;
596
+ fn(...args);
597
+ }
598
+ else if (!timer) {
599
+ timer = setTimeout(() => {
600
+ lastRun = Date.now();
601
+ timer = null;
602
+ fn(...args);
603
+ }, remaining);
604
+ }
605
+ },
606
+ cancel: () => {
607
+ if (timer) {
608
+ clearTimeout(timer);
609
+ timer = null;
610
+ }
611
+ },
612
+ };
613
+ },
614
+ };
615
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../ts/scheduler.ts"],"names":[],"mappings":"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"}