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,326 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // Stelo — Process Management
4
+ // ============================================================================
5
+ // Process discovery, tracking, lifecycle management, and foreground
6
+ // process monitoring using the existing window API.
7
+ // ============================================================================
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.process_manager = void 0;
10
+ const events_1 = require("./events");
11
+ const logger_1 = require("./logger");
12
+ // ── Internal ─────────────────────────────────────────────────────────────────
13
+ let _watchInterval = null;
14
+ let _lastForegroundPid = null;
15
+ let _lastForegroundInfo = null;
16
+ const _foregroundHistory = [];
17
+ const MAX_FOREGROUND_HISTORY = 100;
18
+ const _log = logger_1.logger.child('process');
19
+ function getNative() {
20
+ try {
21
+ return require('../index.js');
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ function windowToProcess(w) {
28
+ return {
29
+ pid: w.processId,
30
+ name: w.processName,
31
+ title: w.title,
32
+ windowId: w.id,
33
+ bounds: { x: w.x, y: w.y, width: w.width, height: w.height },
34
+ isVisible: w.isVisible,
35
+ isMinimized: w.isMinimized,
36
+ };
37
+ }
38
+ // ── Public API ───────────────────────────────────────────────────────────────
39
+ exports.process_manager = {
40
+ /**
41
+ * List all visible processes (via window enumeration).
42
+ */
43
+ list() {
44
+ const native = getNative();
45
+ if (!native)
46
+ return [];
47
+ try {
48
+ const windows = native.windowGetAll();
49
+ // Deduplicate by PID (keep first/most relevant window)
50
+ const seen = new Map();
51
+ for (const w of windows) {
52
+ const proc = windowToProcess(w);
53
+ if (!seen.has(proc.pid)) {
54
+ seen.set(proc.pid, proc);
55
+ }
56
+ }
57
+ return [...seen.values()];
58
+ }
59
+ catch (err) {
60
+ _log.error('Failed to list processes', err);
61
+ return [];
62
+ }
63
+ },
64
+ /**
65
+ * Find processes by name (case-insensitive partial match).
66
+ */
67
+ findByName(name) {
68
+ const lower = name.toLowerCase();
69
+ return exports.process_manager.list().filter((p) => p.name.toLowerCase().includes(lower));
70
+ },
71
+ /**
72
+ * Find processes by window title (case-insensitive partial match).
73
+ */
74
+ findByTitle(title) {
75
+ const native = getNative();
76
+ if (!native)
77
+ return [];
78
+ try {
79
+ const windows = native.windowFind(title);
80
+ return windows.map(windowToProcess);
81
+ }
82
+ catch (err) {
83
+ _log.error('Failed to find process by title', err);
84
+ return [];
85
+ }
86
+ },
87
+ /**
88
+ * Get the currently focused/foreground process.
89
+ */
90
+ getForeground() {
91
+ const native = getNative();
92
+ if (!native)
93
+ return null;
94
+ try {
95
+ const active = native.windowGetActive();
96
+ return windowToProcess(active);
97
+ }
98
+ catch (err) {
99
+ _log.error('Failed to get foreground process', err);
100
+ return null;
101
+ }
102
+ },
103
+ /**
104
+ * Focus a process by name (brings its window to front).
105
+ */
106
+ focus(name) {
107
+ const native = getNative();
108
+ if (!native)
109
+ return false;
110
+ try {
111
+ native.windowFocusByTitle(name);
112
+ return true;
113
+ }
114
+ catch {
115
+ // Try finding by process name
116
+ const procs = exports.process_manager.findByName(name);
117
+ if (procs.length > 0) {
118
+ try {
119
+ native.windowFocus(procs[0].windowId);
120
+ return true;
121
+ }
122
+ catch {
123
+ return false;
124
+ }
125
+ }
126
+ return false;
127
+ }
128
+ },
129
+ /**
130
+ * Focus a process by PID.
131
+ */
132
+ focusByPid(pid) {
133
+ const native = getNative();
134
+ if (!native)
135
+ return false;
136
+ const proc = exports.process_manager.list().find((p) => p.pid === pid);
137
+ if (!proc)
138
+ return false;
139
+ try {
140
+ native.windowFocus(proc.windowId);
141
+ return true;
142
+ }
143
+ catch {
144
+ return false;
145
+ }
146
+ },
147
+ /**
148
+ * Close a process window by name.
149
+ */
150
+ close(name) {
151
+ const native = getNative();
152
+ if (!native)
153
+ return false;
154
+ const procs = exports.process_manager.findByName(name);
155
+ if (procs.length === 0)
156
+ return false;
157
+ try {
158
+ native.windowClose(procs[0].windowId);
159
+ return true;
160
+ }
161
+ catch {
162
+ return false;
163
+ }
164
+ },
165
+ /**
166
+ * Wait for a process/window to appear.
167
+ */
168
+ async waitFor(name, timeoutMs = 30000, pollIntervalMs = 500) {
169
+ const start = Date.now();
170
+ while (Date.now() - start < timeoutMs) {
171
+ const procs = exports.process_manager.findByName(name);
172
+ if (procs.length > 0)
173
+ return procs[0];
174
+ const byTitle = exports.process_manager.findByTitle(name);
175
+ if (byTitle.length > 0)
176
+ return byTitle[0];
177
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
178
+ }
179
+ return null;
180
+ },
181
+ /**
182
+ * Wait for a process to close/disappear.
183
+ */
184
+ async waitForClose(name, timeoutMs = 30000, pollIntervalMs = 500) {
185
+ const start = Date.now();
186
+ while (Date.now() - start < timeoutMs) {
187
+ const procs = exports.process_manager.findByName(name);
188
+ const byTitle = exports.process_manager.findByTitle(name);
189
+ if (procs.length === 0 && byTitle.length === 0)
190
+ return true;
191
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
192
+ }
193
+ return false;
194
+ },
195
+ /**
196
+ * Launch a process/application.
197
+ */
198
+ async launch(command, args) {
199
+ try {
200
+ const { spawn } = require('child_process');
201
+ const child = spawn(command, args ?? [], {
202
+ detached: true,
203
+ stdio: 'ignore',
204
+ });
205
+ child.unref();
206
+ events_1.events.emit('process.launch', 'process', {
207
+ command,
208
+ args,
209
+ pid: child.pid,
210
+ }, { source: 'process' });
211
+ return child.pid ?? null;
212
+ }
213
+ catch (err) {
214
+ _log.error('Failed to launch process', err, { command, args });
215
+ return null;
216
+ }
217
+ },
218
+ /**
219
+ * Kill a process by PID.
220
+ */
221
+ kill(pid, signal = 'SIGTERM') {
222
+ if (!Number.isInteger(pid) || pid <= 0) {
223
+ _log.error('Invalid PID', undefined, { pid });
224
+ return false;
225
+ }
226
+ try {
227
+ const p = require('process');
228
+ p.kill(pid, signal);
229
+ events_1.events.emit('process.kill', 'process', { pid, signal }, { source: 'process' });
230
+ return true;
231
+ }
232
+ catch (err) {
233
+ _log.error('Failed to kill process', err, { pid, signal });
234
+ return false;
235
+ }
236
+ },
237
+ // ── Foreground Monitoring ──────────────────────────────────────────────
238
+ /**
239
+ * Start monitoring foreground process changes.
240
+ */
241
+ startWatching(options) {
242
+ if (_watchInterval)
243
+ return;
244
+ const intervalMs = options?.intervalMs ?? 500;
245
+ const trackForeground = options?.trackForeground ?? true;
246
+ _log.info('Process watcher started', { intervalMs });
247
+ _watchInterval = setInterval(() => {
248
+ if (!trackForeground)
249
+ return;
250
+ const current = exports.process_manager.getForeground();
251
+ if (!current)
252
+ return;
253
+ if (current.pid !== _lastForegroundPid) {
254
+ const change = {
255
+ previous: _lastForegroundInfo ?? undefined,
256
+ current,
257
+ timestamp: new Date().toISOString(),
258
+ };
259
+ _foregroundHistory.push(change);
260
+ while (_foregroundHistory.length > MAX_FOREGROUND_HISTORY) {
261
+ _foregroundHistory.shift();
262
+ }
263
+ _lastForegroundPid = current.pid;
264
+ _lastForegroundInfo = current;
265
+ events_1.events.emit('process.foreground_change', 'process', {
266
+ previousName: change.previous?.name,
267
+ currentName: current.name,
268
+ currentTitle: current.title,
269
+ pid: current.pid,
270
+ }, { source: 'process' });
271
+ }
272
+ }, intervalMs);
273
+ },
274
+ /**
275
+ * Stop monitoring.
276
+ */
277
+ stopWatching() {
278
+ if (_watchInterval) {
279
+ clearInterval(_watchInterval);
280
+ _watchInterval = null;
281
+ _log.info('Process watcher stopped');
282
+ }
283
+ },
284
+ /** Is the watcher running? */
285
+ isWatching() {
286
+ return _watchInterval !== null;
287
+ },
288
+ /**
289
+ * Get foreground process change history.
290
+ */
291
+ getForegroundHistory() {
292
+ return [..._foregroundHistory];
293
+ },
294
+ /**
295
+ * Get how long the current foreground process has been active (ms).
296
+ */
297
+ getForegroundDuration() {
298
+ if (_foregroundHistory.length === 0)
299
+ return 0;
300
+ const last = _foregroundHistory[_foregroundHistory.length - 1];
301
+ return Date.now() - new Date(last.timestamp).getTime();
302
+ },
303
+ /**
304
+ * Wait until a specific process becomes the foreground window.
305
+ */
306
+ async waitForForeground(name, timeoutMs = 30000, pollIntervalMs = 300) {
307
+ const lower = name.toLowerCase();
308
+ const start = Date.now();
309
+ while (Date.now() - start < timeoutMs) {
310
+ const fg = exports.process_manager.getForeground();
311
+ if (fg && (fg.name.toLowerCase().includes(lower) || fg.title.toLowerCase().includes(lower))) {
312
+ return fg;
313
+ }
314
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
315
+ }
316
+ return null;
317
+ },
318
+ /** Reset the module */
319
+ reset() {
320
+ exports.process_manager.stopWatching();
321
+ _lastForegroundPid = null;
322
+ _lastForegroundInfo = null;
323
+ _foregroundHistory.length = 0;
324
+ },
325
+ };
326
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../ts/process.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAC/E,oEAAoE;AACpE,oDAAoD;AACpD,+EAA+E;;;AAE/E,qCAAkC;AAClC,qCAAkC;AAqClC,gFAAgF;AAEhF,IAAI,cAAc,GAA0C,IAAI,CAAC;AACjE,IAAI,kBAAkB,GAAkB,IAAI,CAAC;AAC7C,IAAI,mBAAmB,GAAuB,IAAI,CAAC;AACnD,MAAM,kBAAkB,GAAuB,EAAE,CAAC;AAClD,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,IAAI,GAAG,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAErC,SAAS,SAAS;IAChB,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,CAAM;IAC7B,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,SAAS;QAChB,IAAI,EAAE,CAAC,CAAC,WAAW;QACnB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,QAAQ,EAAE,CAAC,CAAC,EAAE;QACd,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAC5D,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,WAAW,EAAE,CAAC,CAAC,WAAW;KAC3B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEnE,QAAA,eAAe,GAAG;IAC7B;;OAEG;IACH,IAAI;QACF,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YACtC,uDAAuD;YACvD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;YAC5C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;YAC5C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,OAAO,uBAAe,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACzC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CACrC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAa;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;YACxC,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAY;QAChB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;YAC9B,MAAM,KAAK,GAAG,uBAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACH,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;oBACtC,OAAO,IAAI,CAAC;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,GAAW;QACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,MAAM,IAAI,GAAG,uBAAe,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAY;QAChB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,MAAM,KAAK,GAAG,uBAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,YAAoB,KAAK,EACzB,iBAAyB,GAAG;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,uBAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtC,MAAM,OAAO,GAAG,uBAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;YAE1C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,IAAY,EACZ,YAAoB,KAAK,EACzB,iBAAyB,GAAG;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,uBAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,uBAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC5D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,IAAe;QAC3C,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE;gBACvC,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,CAAC;YAEd,eAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE;gBACvC,OAAO;gBACP,IAAI;gBACJ,GAAG,EAAE,KAAK,CAAC,GAAG;aACf,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAE1B,OAAO,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,GAAW,EAAE,SAAiB,SAAS;QAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACpB,eAAM,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC/E,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,0EAA0E;IAE1E;;OAEG;IACH,aAAa,CAAC,OAA+B;QAC3C,IAAI,cAAc;YAAE,OAAO;QAE3B,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,GAAG,CAAC;QAC9C,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC;QAEzD,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAErD,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,eAAe;gBAAE,OAAO;YAE7B,MAAM,OAAO,GAAG,uBAAe,CAAC,aAAa,EAAE,CAAC;YAChD,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,IAAI,OAAO,CAAC,GAAG,KAAK,kBAAkB,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAqB;oBAC/B,QAAQ,EAAE,mBAAmB,IAAI,SAAS;oBAC1C,OAAO;oBACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC;gBAEF,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChC,OAAO,kBAAkB,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;oBAC1D,kBAAkB,CAAC,KAAK,EAAE,CAAC;gBAC7B,CAAC;gBAED,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC;gBACjC,mBAAmB,GAAG,OAAO,CAAC;gBAE9B,eAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,SAAS,EAAE;oBAClD,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI;oBACnC,WAAW,EAAE,OAAO,CAAC,IAAI;oBACzB,YAAY,EAAE,OAAO,CAAC,KAAK;oBAC3B,GAAG,EAAE,OAAO,CAAC,GAAG;iBACjB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,cAAc,EAAE,CAAC;YACnB,aAAa,CAAC,cAAc,CAAC,CAAC;YAC9B,cAAc,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,UAAU;QACR,OAAO,cAAc,KAAK,IAAI,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,CAAC,GAAG,kBAAkB,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,qBAAqB;QACnB,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,IAAY,EACZ,YAAoB,KAAK,EACzB,iBAAyB,GAAG;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;YACtC,MAAM,EAAE,GAAG,uBAAe,CAAC,aAAa,EAAE,CAAC;YAC3C,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC5F,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB;IACvB,KAAK;QACH,uBAAe,CAAC,YAAY,EAAE,CAAC;QAC/B,kBAAkB,GAAG,IAAI,CAAC;QAC1B,mBAAmB,GAAG,IAAI,CAAC;QAC3B,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;IAChC,CAAC;CACF,CAAC"}
@@ -0,0 +1,100 @@
1
+ import type { AutomationEvent, PlaybackOptions, MouseButton, ScrollDirection } from './types';
2
+ /**
3
+ * Automation recorder and playback engine.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * import { recorder } from 'stelo';
8
+ *
9
+ * // Build a sequence programmatically
10
+ * const sequence = recorder.sequence()
11
+ * .moveTo(100, 200)
12
+ * .click()
13
+ * .delay(500)
14
+ * .type('Hello World')
15
+ * .hotkey('ctrl', 's')
16
+ * .build();
17
+ *
18
+ * // Execute the sequence
19
+ * await recorder.play(sequence);
20
+ *
21
+ * // Replay at 2x speed
22
+ * await recorder.play(sequence, { speed: 2 });
23
+ *
24
+ * // Export/Import
25
+ * const json = recorder.toJSON(sequence);
26
+ * const loaded = recorder.fromJSON(json);
27
+ * ```
28
+ */
29
+ export declare const recorder: {
30
+ /**
31
+ * Create a new sequence builder.
32
+ */
33
+ sequence(): SequenceBuilder;
34
+ /**
35
+ * Play back a recorded sequence of automation events.
36
+ */
37
+ play(events: AutomationEvent[], options?: PlaybackOptions): Promise<void>;
38
+ /**
39
+ * Serialize a sequence to JSON string.
40
+ */
41
+ toJSON(events: AutomationEvent[]): string;
42
+ /**
43
+ * Deserialize a sequence from JSON string.
44
+ */
45
+ fromJSON(json: string): AutomationEvent[];
46
+ };
47
+ declare class SequenceBuilder {
48
+ private events;
49
+ private currentTime;
50
+ /**
51
+ * Move mouse to position.
52
+ */
53
+ moveTo(x: number, y: number): this;
54
+ /**
55
+ * Click at current position.
56
+ */
57
+ click(button?: MouseButton): this;
58
+ /**
59
+ * Mouse button down.
60
+ */
61
+ mouseDown(button?: MouseButton): this;
62
+ /**
63
+ * Mouse button up.
64
+ */
65
+ mouseUp(button?: MouseButton): this;
66
+ /**
67
+ * Scroll mouse wheel.
68
+ */
69
+ scroll(amount: number, direction?: ScrollDirection): this;
70
+ /**
71
+ * Press and release a key.
72
+ */
73
+ press(key: string): this;
74
+ /**
75
+ * Hold a key down.
76
+ */
77
+ keyDown(key: string): this;
78
+ /**
79
+ * Release a key.
80
+ */
81
+ keyUp(key: string): this;
82
+ /**
83
+ * Type text string.
84
+ */
85
+ type(text: string): this;
86
+ /**
87
+ * Execute a keyboard shortcut.
88
+ */
89
+ hotkey(...keys: string[]): this;
90
+ /**
91
+ * Add a delay between actions.
92
+ */
93
+ delay(ms: number): this;
94
+ /**
95
+ * Build the sequence into an array of events.
96
+ */
97
+ build(): AutomationEvent[];
98
+ }
99
+ export {};
100
+ //# sourceMappingURL=recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../ts/recorder.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM9F;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,QAAQ;IACnB;;OAEG;gBACS,eAAe;IAI3B;;OAEG;iBACgB,eAAe,EAAE,YAAY,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/E;;OAEG;mBACY,eAAe,EAAE,GAAG,MAAM;IAIzC;;OAEG;mBACY,MAAM,GAAG,eAAe,EAAE;CAG1C,CAAC;AAIF,cAAM,eAAe;IACnB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,WAAW,CAAK;IAExB;;OAEG;IACH,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAUlC;;OAEG;IACH,KAAK,CAAC,MAAM,GAAE,WAAoB,GAAG,IAAI;IAWzC;;OAEG;IACH,SAAS,CAAC,MAAM,GAAE,WAAoB,GAAG,IAAI;IAW7C;;OAEG;IACH,OAAO,CAAC,MAAM,GAAE,WAAoB,GAAG,IAAI;IAW3C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,eAAsB,GAAG,IAAI;IAU/D;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IASxB;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAS1B;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IASxB;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASxB;;OAEG;IACH,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAmB/B;;OAEG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IASvB;;OAEG;IACH,KAAK,IAAI,eAAe,EAAE;CAG3B"}
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // Stelo — Automation Recorder & Playback Engine
4
+ // ============================================================================
5
+ // Record user actions, replay them with timing, export/import sequences.
6
+ // ============================================================================
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.recorder = void 0;
9
+ const mouse_1 = require("./mouse");
10
+ const keyboard_1 = require("./keyboard");
11
+ const native = require('../index.js');
12
+ /**
13
+ * Automation recorder and playback engine.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { recorder } from 'stelo';
18
+ *
19
+ * // Build a sequence programmatically
20
+ * const sequence = recorder.sequence()
21
+ * .moveTo(100, 200)
22
+ * .click()
23
+ * .delay(500)
24
+ * .type('Hello World')
25
+ * .hotkey('ctrl', 's')
26
+ * .build();
27
+ *
28
+ * // Execute the sequence
29
+ * await recorder.play(sequence);
30
+ *
31
+ * // Replay at 2x speed
32
+ * await recorder.play(sequence, { speed: 2 });
33
+ *
34
+ * // Export/Import
35
+ * const json = recorder.toJSON(sequence);
36
+ * const loaded = recorder.fromJSON(json);
37
+ * ```
38
+ */
39
+ exports.recorder = {
40
+ /**
41
+ * Create a new sequence builder.
42
+ */
43
+ sequence() {
44
+ return new SequenceBuilder();
45
+ },
46
+ /**
47
+ * Play back a recorded sequence of automation events.
48
+ */
49
+ async play(events, options) {
50
+ const speed = options?.speed ?? 1.0;
51
+ const repeat = options?.repeat ?? 1;
52
+ for (let r = 0; r < repeat; r++) {
53
+ for (const event of events) {
54
+ await executeEvent(event, speed);
55
+ }
56
+ }
57
+ },
58
+ /**
59
+ * Serialize a sequence to JSON string.
60
+ */
61
+ toJSON(events) {
62
+ return JSON.stringify(events, null, 2);
63
+ },
64
+ /**
65
+ * Deserialize a sequence from JSON string.
66
+ */
67
+ fromJSON(json) {
68
+ return JSON.parse(json);
69
+ },
70
+ };
71
+ // ── Sequence Builder ────────────────────────────────────────────────────────
72
+ class SequenceBuilder {
73
+ events = [];
74
+ currentTime = 0;
75
+ /**
76
+ * Move mouse to position.
77
+ */
78
+ moveTo(x, y) {
79
+ this.events.push({
80
+ type: 'mouseMove',
81
+ x,
82
+ y,
83
+ timestamp: this.currentTime,
84
+ });
85
+ return this;
86
+ }
87
+ /**
88
+ * Click at current position.
89
+ */
90
+ click(button = 'left') {
91
+ this.events.push({
92
+ type: 'mouseClick',
93
+ button,
94
+ x: 0,
95
+ y: 0,
96
+ timestamp: this.currentTime,
97
+ });
98
+ return this;
99
+ }
100
+ /**
101
+ * Mouse button down.
102
+ */
103
+ mouseDown(button = 'left') {
104
+ this.events.push({
105
+ type: 'mouseDown',
106
+ button,
107
+ x: 0,
108
+ y: 0,
109
+ timestamp: this.currentTime,
110
+ });
111
+ return this;
112
+ }
113
+ /**
114
+ * Mouse button up.
115
+ */
116
+ mouseUp(button = 'left') {
117
+ this.events.push({
118
+ type: 'mouseUp',
119
+ button,
120
+ x: 0,
121
+ y: 0,
122
+ timestamp: this.currentTime,
123
+ });
124
+ return this;
125
+ }
126
+ /**
127
+ * Scroll mouse wheel.
128
+ */
129
+ scroll(amount, direction = 'up') {
130
+ this.events.push({
131
+ type: 'mouseScroll',
132
+ amount,
133
+ direction,
134
+ timestamp: this.currentTime,
135
+ });
136
+ return this;
137
+ }
138
+ /**
139
+ * Press and release a key.
140
+ */
141
+ press(key) {
142
+ this.events.push({
143
+ type: 'keyPress',
144
+ key,
145
+ timestamp: this.currentTime,
146
+ });
147
+ return this;
148
+ }
149
+ /**
150
+ * Hold a key down.
151
+ */
152
+ keyDown(key) {
153
+ this.events.push({
154
+ type: 'keyDown',
155
+ key,
156
+ timestamp: this.currentTime,
157
+ });
158
+ return this;
159
+ }
160
+ /**
161
+ * Release a key.
162
+ */
163
+ keyUp(key) {
164
+ this.events.push({
165
+ type: 'keyUp',
166
+ key,
167
+ timestamp: this.currentTime,
168
+ });
169
+ return this;
170
+ }
171
+ /**
172
+ * Type text string.
173
+ */
174
+ type(text) {
175
+ this.events.push({
176
+ type: 'typeText',
177
+ text,
178
+ timestamp: this.currentTime,
179
+ });
180
+ return this;
181
+ }
182
+ /**
183
+ * Execute a keyboard shortcut.
184
+ */
185
+ hotkey(...keys) {
186
+ // Expand as keyDown + keyUp sequence
187
+ for (const key of keys) {
188
+ this.events.push({
189
+ type: 'keyDown',
190
+ key,
191
+ timestamp: this.currentTime,
192
+ });
193
+ }
194
+ for (const key of [...keys].reverse()) {
195
+ this.events.push({
196
+ type: 'keyUp',
197
+ key,
198
+ timestamp: this.currentTime,
199
+ });
200
+ }
201
+ return this;
202
+ }
203
+ /**
204
+ * Add a delay between actions.
205
+ */
206
+ delay(ms) {
207
+ this.currentTime += ms;
208
+ this.events.push({
209
+ type: 'delay',
210
+ duration: ms,
211
+ });
212
+ return this;
213
+ }
214
+ /**
215
+ * Build the sequence into an array of events.
216
+ */
217
+ build() {
218
+ return [...this.events];
219
+ }
220
+ }
221
+ // ── Event Executor ──────────────────────────────────────────────────────────
222
+ async function executeEvent(event, speed) {
223
+ switch (event.type) {
224
+ case 'mouseMove':
225
+ mouse_1.mouse.move(event.x, event.y);
226
+ break;
227
+ case 'mouseClick':
228
+ mouse_1.mouse.click(event.button);
229
+ break;
230
+ case 'mouseDown':
231
+ mouse_1.mouse.down(event.button);
232
+ break;
233
+ case 'mouseUp':
234
+ mouse_1.mouse.up(event.button);
235
+ break;
236
+ case 'mouseScroll':
237
+ mouse_1.mouse.scroll(event.amount, event.direction);
238
+ break;
239
+ case 'keyPress':
240
+ keyboard_1.keyboard.press(event.key);
241
+ break;
242
+ case 'keyDown':
243
+ keyboard_1.keyboard.down(event.key);
244
+ break;
245
+ case 'keyUp':
246
+ keyboard_1.keyboard.up(event.key);
247
+ break;
248
+ case 'typeText':
249
+ keyboard_1.keyboard.type(event.text);
250
+ break;
251
+ case 'delay': {
252
+ const duration = Math.round(event.duration / speed);
253
+ await new Promise((resolve) => setTimeout(resolve, duration));
254
+ break;
255
+ }
256
+ }
257
+ }
258
+ //# sourceMappingURL=recorder.js.map