clipwise 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.
@@ -0,0 +1,1631 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const StepActionSchema: z.ZodDiscriminatedUnion<"action", [z.ZodObject<{
4
+ action: z.ZodLiteral<"navigate">;
5
+ url: z.ZodString;
6
+ waitUntil: z.ZodDefault<z.ZodEnum<["load", "domcontentloaded", "networkidle"]>>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ action: "navigate";
9
+ url: string;
10
+ waitUntil: "load" | "domcontentloaded" | "networkidle";
11
+ }, {
12
+ action: "navigate";
13
+ url: string;
14
+ waitUntil?: "load" | "domcontentloaded" | "networkidle" | undefined;
15
+ }>, z.ZodObject<{
16
+ action: z.ZodLiteral<"click">;
17
+ selector: z.ZodString;
18
+ delay: z.ZodOptional<z.ZodNumber>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ action: "click";
21
+ selector: string;
22
+ delay?: number | undefined;
23
+ }, {
24
+ action: "click";
25
+ selector: string;
26
+ delay?: number | undefined;
27
+ }>, z.ZodObject<{
28
+ action: z.ZodLiteral<"type">;
29
+ selector: z.ZodString;
30
+ text: z.ZodString;
31
+ delay: z.ZodDefault<z.ZodNumber>;
32
+ }, "strip", z.ZodTypeAny, {
33
+ action: "type";
34
+ selector: string;
35
+ delay: number;
36
+ text: string;
37
+ }, {
38
+ action: "type";
39
+ selector: string;
40
+ text: string;
41
+ delay?: number | undefined;
42
+ }>, z.ZodObject<{
43
+ action: z.ZodLiteral<"scroll">;
44
+ selector: z.ZodOptional<z.ZodString>;
45
+ y: z.ZodDefault<z.ZodNumber>;
46
+ x: z.ZodDefault<z.ZodNumber>;
47
+ smooth: z.ZodDefault<z.ZodBoolean>;
48
+ }, "strip", z.ZodTypeAny, {
49
+ action: "scroll";
50
+ y: number;
51
+ x: number;
52
+ smooth: boolean;
53
+ selector?: string | undefined;
54
+ }, {
55
+ action: "scroll";
56
+ selector?: string | undefined;
57
+ y?: number | undefined;
58
+ x?: number | undefined;
59
+ smooth?: boolean | undefined;
60
+ }>, z.ZodObject<{
61
+ action: z.ZodLiteral<"wait">;
62
+ duration: z.ZodNumber;
63
+ }, "strip", z.ZodTypeAny, {
64
+ action: "wait";
65
+ duration: number;
66
+ }, {
67
+ action: "wait";
68
+ duration: number;
69
+ }>, z.ZodObject<{
70
+ action: z.ZodLiteral<"hover">;
71
+ selector: z.ZodString;
72
+ }, "strip", z.ZodTypeAny, {
73
+ action: "hover";
74
+ selector: string;
75
+ }, {
76
+ action: "hover";
77
+ selector: string;
78
+ }>, z.ZodObject<{
79
+ action: z.ZodLiteral<"screenshot">;
80
+ name: z.ZodOptional<z.ZodString>;
81
+ fullPage: z.ZodDefault<z.ZodBoolean>;
82
+ }, "strip", z.ZodTypeAny, {
83
+ action: "screenshot";
84
+ fullPage: boolean;
85
+ name?: string | undefined;
86
+ }, {
87
+ action: "screenshot";
88
+ name?: string | undefined;
89
+ fullPage?: boolean | undefined;
90
+ }>]>;
91
+ type StepAction = z.infer<typeof StepActionSchema>;
92
+ declare const EffectsConfigSchema: z.ZodObject<{
93
+ zoom: z.ZodDefault<z.ZodObject<{
94
+ enabled: z.ZodDefault<z.ZodBoolean>;
95
+ scale: z.ZodDefault<z.ZodNumber>;
96
+ duration: z.ZodDefault<z.ZodNumber>;
97
+ easing: z.ZodDefault<z.ZodEnum<["ease-in-out", "ease-in", "ease-out", "linear"]>>;
98
+ autoZoom: z.ZodDefault<z.ZodObject<{
99
+ followCursor: z.ZodDefault<z.ZodBoolean>;
100
+ maxScale: z.ZodDefault<z.ZodNumber>;
101
+ transitionDuration: z.ZodDefault<z.ZodNumber>;
102
+ padding: z.ZodDefault<z.ZodNumber>;
103
+ }, "strip", z.ZodTypeAny, {
104
+ followCursor: boolean;
105
+ maxScale: number;
106
+ transitionDuration: number;
107
+ padding: number;
108
+ }, {
109
+ followCursor?: boolean | undefined;
110
+ maxScale?: number | undefined;
111
+ transitionDuration?: number | undefined;
112
+ padding?: number | undefined;
113
+ }>>;
114
+ }, "strip", z.ZodTypeAny, {
115
+ duration: number;
116
+ enabled: boolean;
117
+ scale: number;
118
+ easing: "ease-in-out" | "ease-in" | "ease-out" | "linear";
119
+ autoZoom: {
120
+ followCursor: boolean;
121
+ maxScale: number;
122
+ transitionDuration: number;
123
+ padding: number;
124
+ };
125
+ }, {
126
+ duration?: number | undefined;
127
+ enabled?: boolean | undefined;
128
+ scale?: number | undefined;
129
+ easing?: "ease-in-out" | "ease-in" | "ease-out" | "linear" | undefined;
130
+ autoZoom?: {
131
+ followCursor?: boolean | undefined;
132
+ maxScale?: number | undefined;
133
+ transitionDuration?: number | undefined;
134
+ padding?: number | undefined;
135
+ } | undefined;
136
+ }>>;
137
+ cursor: z.ZodDefault<z.ZodObject<{
138
+ enabled: z.ZodDefault<z.ZodBoolean>;
139
+ size: z.ZodDefault<z.ZodNumber>;
140
+ color: z.ZodDefault<z.ZodString>;
141
+ speed: z.ZodDefault<z.ZodEnum<["fast", "normal", "slow"]>>;
142
+ smoothing: z.ZodDefault<z.ZodBoolean>;
143
+ clickEffect: z.ZodDefault<z.ZodBoolean>;
144
+ clickColor: z.ZodDefault<z.ZodString>;
145
+ clickRadius: z.ZodDefault<z.ZodNumber>;
146
+ trail: z.ZodDefault<z.ZodBoolean>;
147
+ trailLength: z.ZodDefault<z.ZodNumber>;
148
+ trailColor: z.ZodDefault<z.ZodString>;
149
+ highlight: z.ZodDefault<z.ZodBoolean>;
150
+ highlightRadius: z.ZodDefault<z.ZodNumber>;
151
+ highlightColor: z.ZodDefault<z.ZodString>;
152
+ }, "strip", z.ZodTypeAny, {
153
+ enabled: boolean;
154
+ size: number;
155
+ color: string;
156
+ speed: "fast" | "normal" | "slow";
157
+ smoothing: boolean;
158
+ clickEffect: boolean;
159
+ clickColor: string;
160
+ clickRadius: number;
161
+ trail: boolean;
162
+ trailLength: number;
163
+ trailColor: string;
164
+ highlight: boolean;
165
+ highlightRadius: number;
166
+ highlightColor: string;
167
+ }, {
168
+ enabled?: boolean | undefined;
169
+ size?: number | undefined;
170
+ color?: string | undefined;
171
+ speed?: "fast" | "normal" | "slow" | undefined;
172
+ smoothing?: boolean | undefined;
173
+ clickEffect?: boolean | undefined;
174
+ clickColor?: string | undefined;
175
+ clickRadius?: number | undefined;
176
+ trail?: boolean | undefined;
177
+ trailLength?: number | undefined;
178
+ trailColor?: string | undefined;
179
+ highlight?: boolean | undefined;
180
+ highlightRadius?: number | undefined;
181
+ highlightColor?: string | undefined;
182
+ }>>;
183
+ background: z.ZodDefault<z.ZodObject<{
184
+ type: z.ZodDefault<z.ZodEnum<["gradient", "solid", "image"]>>;
185
+ value: z.ZodDefault<z.ZodString>;
186
+ padding: z.ZodDefault<z.ZodNumber>;
187
+ borderRadius: z.ZodDefault<z.ZodNumber>;
188
+ shadow: z.ZodDefault<z.ZodBoolean>;
189
+ }, "strip", z.ZodTypeAny, {
190
+ value: string;
191
+ type: "gradient" | "solid" | "image";
192
+ padding: number;
193
+ borderRadius: number;
194
+ shadow: boolean;
195
+ }, {
196
+ value?: string | undefined;
197
+ type?: "gradient" | "solid" | "image" | undefined;
198
+ padding?: number | undefined;
199
+ borderRadius?: number | undefined;
200
+ shadow?: boolean | undefined;
201
+ }>>;
202
+ deviceFrame: z.ZodDefault<z.ZodObject<{
203
+ enabled: z.ZodDefault<z.ZodBoolean>;
204
+ type: z.ZodDefault<z.ZodEnum<["browser", "macbook", "iphone", "ipad", "android", "none"]>>;
205
+ darkMode: z.ZodDefault<z.ZodBoolean>;
206
+ }, "strip", z.ZodTypeAny, {
207
+ type: "browser" | "macbook" | "iphone" | "ipad" | "android" | "none";
208
+ enabled: boolean;
209
+ darkMode: boolean;
210
+ }, {
211
+ type?: "browser" | "macbook" | "iphone" | "ipad" | "android" | "none" | undefined;
212
+ enabled?: boolean | undefined;
213
+ darkMode?: boolean | undefined;
214
+ }>>;
215
+ speedRamp: z.ZodDefault<z.ZodObject<{
216
+ enabled: z.ZodDefault<z.ZodBoolean>;
217
+ idleSpeed: z.ZodDefault<z.ZodNumber>;
218
+ actionSpeed: z.ZodDefault<z.ZodNumber>;
219
+ transitionFrames: z.ZodDefault<z.ZodNumber>;
220
+ }, "strip", z.ZodTypeAny, {
221
+ enabled: boolean;
222
+ idleSpeed: number;
223
+ actionSpeed: number;
224
+ transitionFrames: number;
225
+ }, {
226
+ enabled?: boolean | undefined;
227
+ idleSpeed?: number | undefined;
228
+ actionSpeed?: number | undefined;
229
+ transitionFrames?: number | undefined;
230
+ }>>;
231
+ keystroke: z.ZodDefault<z.ZodObject<{
232
+ enabled: z.ZodDefault<z.ZodBoolean>;
233
+ position: z.ZodDefault<z.ZodEnum<["bottom-center", "bottom-left", "bottom-right"]>>;
234
+ fontSize: z.ZodDefault<z.ZodNumber>;
235
+ backgroundColor: z.ZodDefault<z.ZodString>;
236
+ textColor: z.ZodDefault<z.ZodString>;
237
+ padding: z.ZodDefault<z.ZodNumber>;
238
+ fadeAfter: z.ZodDefault<z.ZodNumber>;
239
+ }, "strip", z.ZodTypeAny, {
240
+ padding: number;
241
+ enabled: boolean;
242
+ position: "bottom-center" | "bottom-left" | "bottom-right";
243
+ fontSize: number;
244
+ backgroundColor: string;
245
+ textColor: string;
246
+ fadeAfter: number;
247
+ }, {
248
+ padding?: number | undefined;
249
+ enabled?: boolean | undefined;
250
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
251
+ fontSize?: number | undefined;
252
+ backgroundColor?: string | undefined;
253
+ textColor?: string | undefined;
254
+ fadeAfter?: number | undefined;
255
+ }>>;
256
+ watermark: z.ZodDefault<z.ZodObject<{
257
+ enabled: z.ZodDefault<z.ZodBoolean>;
258
+ text: z.ZodDefault<z.ZodString>;
259
+ position: z.ZodDefault<z.ZodEnum<["top-left", "top-right", "bottom-left", "bottom-right"]>>;
260
+ opacity: z.ZodDefault<z.ZodNumber>;
261
+ fontSize: z.ZodDefault<z.ZodNumber>;
262
+ color: z.ZodDefault<z.ZodString>;
263
+ }, "strip", z.ZodTypeAny, {
264
+ text: string;
265
+ enabled: boolean;
266
+ color: string;
267
+ position: "bottom-left" | "bottom-right" | "top-left" | "top-right";
268
+ fontSize: number;
269
+ opacity: number;
270
+ }, {
271
+ text?: string | undefined;
272
+ enabled?: boolean | undefined;
273
+ color?: string | undefined;
274
+ position?: "bottom-left" | "bottom-right" | "top-left" | "top-right" | undefined;
275
+ fontSize?: number | undefined;
276
+ opacity?: number | undefined;
277
+ }>>;
278
+ }, "strip", z.ZodTypeAny, {
279
+ zoom: {
280
+ duration: number;
281
+ enabled: boolean;
282
+ scale: number;
283
+ easing: "ease-in-out" | "ease-in" | "ease-out" | "linear";
284
+ autoZoom: {
285
+ followCursor: boolean;
286
+ maxScale: number;
287
+ transitionDuration: number;
288
+ padding: number;
289
+ };
290
+ };
291
+ cursor: {
292
+ enabled: boolean;
293
+ size: number;
294
+ color: string;
295
+ speed: "fast" | "normal" | "slow";
296
+ smoothing: boolean;
297
+ clickEffect: boolean;
298
+ clickColor: string;
299
+ clickRadius: number;
300
+ trail: boolean;
301
+ trailLength: number;
302
+ trailColor: string;
303
+ highlight: boolean;
304
+ highlightRadius: number;
305
+ highlightColor: string;
306
+ };
307
+ background: {
308
+ value: string;
309
+ type: "gradient" | "solid" | "image";
310
+ padding: number;
311
+ borderRadius: number;
312
+ shadow: boolean;
313
+ };
314
+ deviceFrame: {
315
+ type: "browser" | "macbook" | "iphone" | "ipad" | "android" | "none";
316
+ enabled: boolean;
317
+ darkMode: boolean;
318
+ };
319
+ speedRamp: {
320
+ enabled: boolean;
321
+ idleSpeed: number;
322
+ actionSpeed: number;
323
+ transitionFrames: number;
324
+ };
325
+ keystroke: {
326
+ padding: number;
327
+ enabled: boolean;
328
+ position: "bottom-center" | "bottom-left" | "bottom-right";
329
+ fontSize: number;
330
+ backgroundColor: string;
331
+ textColor: string;
332
+ fadeAfter: number;
333
+ };
334
+ watermark: {
335
+ text: string;
336
+ enabled: boolean;
337
+ color: string;
338
+ position: "bottom-left" | "bottom-right" | "top-left" | "top-right";
339
+ fontSize: number;
340
+ opacity: number;
341
+ };
342
+ }, {
343
+ zoom?: {
344
+ duration?: number | undefined;
345
+ enabled?: boolean | undefined;
346
+ scale?: number | undefined;
347
+ easing?: "ease-in-out" | "ease-in" | "ease-out" | "linear" | undefined;
348
+ autoZoom?: {
349
+ followCursor?: boolean | undefined;
350
+ maxScale?: number | undefined;
351
+ transitionDuration?: number | undefined;
352
+ padding?: number | undefined;
353
+ } | undefined;
354
+ } | undefined;
355
+ cursor?: {
356
+ enabled?: boolean | undefined;
357
+ size?: number | undefined;
358
+ color?: string | undefined;
359
+ speed?: "fast" | "normal" | "slow" | undefined;
360
+ smoothing?: boolean | undefined;
361
+ clickEffect?: boolean | undefined;
362
+ clickColor?: string | undefined;
363
+ clickRadius?: number | undefined;
364
+ trail?: boolean | undefined;
365
+ trailLength?: number | undefined;
366
+ trailColor?: string | undefined;
367
+ highlight?: boolean | undefined;
368
+ highlightRadius?: number | undefined;
369
+ highlightColor?: string | undefined;
370
+ } | undefined;
371
+ background?: {
372
+ value?: string | undefined;
373
+ type?: "gradient" | "solid" | "image" | undefined;
374
+ padding?: number | undefined;
375
+ borderRadius?: number | undefined;
376
+ shadow?: boolean | undefined;
377
+ } | undefined;
378
+ deviceFrame?: {
379
+ type?: "browser" | "macbook" | "iphone" | "ipad" | "android" | "none" | undefined;
380
+ enabled?: boolean | undefined;
381
+ darkMode?: boolean | undefined;
382
+ } | undefined;
383
+ speedRamp?: {
384
+ enabled?: boolean | undefined;
385
+ idleSpeed?: number | undefined;
386
+ actionSpeed?: number | undefined;
387
+ transitionFrames?: number | undefined;
388
+ } | undefined;
389
+ keystroke?: {
390
+ padding?: number | undefined;
391
+ enabled?: boolean | undefined;
392
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
393
+ fontSize?: number | undefined;
394
+ backgroundColor?: string | undefined;
395
+ textColor?: string | undefined;
396
+ fadeAfter?: number | undefined;
397
+ } | undefined;
398
+ watermark?: {
399
+ text?: string | undefined;
400
+ enabled?: boolean | undefined;
401
+ color?: string | undefined;
402
+ position?: "bottom-left" | "bottom-right" | "top-left" | "top-right" | undefined;
403
+ fontSize?: number | undefined;
404
+ opacity?: number | undefined;
405
+ } | undefined;
406
+ }>;
407
+ type EffectsConfig = z.infer<typeof EffectsConfigSchema>;
408
+ declare const OutputConfigSchema: z.ZodObject<{
409
+ format: z.ZodDefault<z.ZodEnum<["gif", "mp4", "webm", "png-sequence"]>>;
410
+ width: z.ZodDefault<z.ZodNumber>;
411
+ height: z.ZodDefault<z.ZodNumber>;
412
+ fps: z.ZodDefault<z.ZodNumber>;
413
+ quality: z.ZodDefault<z.ZodNumber>;
414
+ outputDir: z.ZodDefault<z.ZodString>;
415
+ filename: z.ZodDefault<z.ZodString>;
416
+ }, "strip", z.ZodTypeAny, {
417
+ format: "gif" | "mp4" | "webm" | "png-sequence";
418
+ width: number;
419
+ height: number;
420
+ fps: number;
421
+ quality: number;
422
+ outputDir: string;
423
+ filename: string;
424
+ }, {
425
+ format?: "gif" | "mp4" | "webm" | "png-sequence" | undefined;
426
+ width?: number | undefined;
427
+ height?: number | undefined;
428
+ fps?: number | undefined;
429
+ quality?: number | undefined;
430
+ outputDir?: string | undefined;
431
+ filename?: string | undefined;
432
+ }>;
433
+ type OutputConfig = z.infer<typeof OutputConfigSchema>;
434
+ declare const StepSchema: z.ZodObject<{
435
+ name: z.ZodOptional<z.ZodString>;
436
+ actions: z.ZodArray<z.ZodDiscriminatedUnion<"action", [z.ZodObject<{
437
+ action: z.ZodLiteral<"navigate">;
438
+ url: z.ZodString;
439
+ waitUntil: z.ZodDefault<z.ZodEnum<["load", "domcontentloaded", "networkidle"]>>;
440
+ }, "strip", z.ZodTypeAny, {
441
+ action: "navigate";
442
+ url: string;
443
+ waitUntil: "load" | "domcontentloaded" | "networkidle";
444
+ }, {
445
+ action: "navigate";
446
+ url: string;
447
+ waitUntil?: "load" | "domcontentloaded" | "networkidle" | undefined;
448
+ }>, z.ZodObject<{
449
+ action: z.ZodLiteral<"click">;
450
+ selector: z.ZodString;
451
+ delay: z.ZodOptional<z.ZodNumber>;
452
+ }, "strip", z.ZodTypeAny, {
453
+ action: "click";
454
+ selector: string;
455
+ delay?: number | undefined;
456
+ }, {
457
+ action: "click";
458
+ selector: string;
459
+ delay?: number | undefined;
460
+ }>, z.ZodObject<{
461
+ action: z.ZodLiteral<"type">;
462
+ selector: z.ZodString;
463
+ text: z.ZodString;
464
+ delay: z.ZodDefault<z.ZodNumber>;
465
+ }, "strip", z.ZodTypeAny, {
466
+ action: "type";
467
+ selector: string;
468
+ delay: number;
469
+ text: string;
470
+ }, {
471
+ action: "type";
472
+ selector: string;
473
+ text: string;
474
+ delay?: number | undefined;
475
+ }>, z.ZodObject<{
476
+ action: z.ZodLiteral<"scroll">;
477
+ selector: z.ZodOptional<z.ZodString>;
478
+ y: z.ZodDefault<z.ZodNumber>;
479
+ x: z.ZodDefault<z.ZodNumber>;
480
+ smooth: z.ZodDefault<z.ZodBoolean>;
481
+ }, "strip", z.ZodTypeAny, {
482
+ action: "scroll";
483
+ y: number;
484
+ x: number;
485
+ smooth: boolean;
486
+ selector?: string | undefined;
487
+ }, {
488
+ action: "scroll";
489
+ selector?: string | undefined;
490
+ y?: number | undefined;
491
+ x?: number | undefined;
492
+ smooth?: boolean | undefined;
493
+ }>, z.ZodObject<{
494
+ action: z.ZodLiteral<"wait">;
495
+ duration: z.ZodNumber;
496
+ }, "strip", z.ZodTypeAny, {
497
+ action: "wait";
498
+ duration: number;
499
+ }, {
500
+ action: "wait";
501
+ duration: number;
502
+ }>, z.ZodObject<{
503
+ action: z.ZodLiteral<"hover">;
504
+ selector: z.ZodString;
505
+ }, "strip", z.ZodTypeAny, {
506
+ action: "hover";
507
+ selector: string;
508
+ }, {
509
+ action: "hover";
510
+ selector: string;
511
+ }>, z.ZodObject<{
512
+ action: z.ZodLiteral<"screenshot">;
513
+ name: z.ZodOptional<z.ZodString>;
514
+ fullPage: z.ZodDefault<z.ZodBoolean>;
515
+ }, "strip", z.ZodTypeAny, {
516
+ action: "screenshot";
517
+ fullPage: boolean;
518
+ name?: string | undefined;
519
+ }, {
520
+ action: "screenshot";
521
+ name?: string | undefined;
522
+ fullPage?: boolean | undefined;
523
+ }>]>, "many">;
524
+ captureDelay: z.ZodDefault<z.ZodNumber>;
525
+ holdDuration: z.ZodDefault<z.ZodNumber>;
526
+ transition: z.ZodDefault<z.ZodEnum<["fade", "none"]>>;
527
+ }, "strip", z.ZodTypeAny, {
528
+ actions: ({
529
+ action: "navigate";
530
+ url: string;
531
+ waitUntil: "load" | "domcontentloaded" | "networkidle";
532
+ } | {
533
+ action: "click";
534
+ selector: string;
535
+ delay?: number | undefined;
536
+ } | {
537
+ action: "type";
538
+ selector: string;
539
+ delay: number;
540
+ text: string;
541
+ } | {
542
+ action: "scroll";
543
+ y: number;
544
+ x: number;
545
+ smooth: boolean;
546
+ selector?: string | undefined;
547
+ } | {
548
+ action: "wait";
549
+ duration: number;
550
+ } | {
551
+ action: "hover";
552
+ selector: string;
553
+ } | {
554
+ action: "screenshot";
555
+ fullPage: boolean;
556
+ name?: string | undefined;
557
+ })[];
558
+ captureDelay: number;
559
+ holdDuration: number;
560
+ transition: "none" | "fade";
561
+ name?: string | undefined;
562
+ }, {
563
+ actions: ({
564
+ action: "navigate";
565
+ url: string;
566
+ waitUntil?: "load" | "domcontentloaded" | "networkidle" | undefined;
567
+ } | {
568
+ action: "click";
569
+ selector: string;
570
+ delay?: number | undefined;
571
+ } | {
572
+ action: "type";
573
+ selector: string;
574
+ text: string;
575
+ delay?: number | undefined;
576
+ } | {
577
+ action: "scroll";
578
+ selector?: string | undefined;
579
+ y?: number | undefined;
580
+ x?: number | undefined;
581
+ smooth?: boolean | undefined;
582
+ } | {
583
+ action: "wait";
584
+ duration: number;
585
+ } | {
586
+ action: "hover";
587
+ selector: string;
588
+ } | {
589
+ action: "screenshot";
590
+ name?: string | undefined;
591
+ fullPage?: boolean | undefined;
592
+ })[];
593
+ name?: string | undefined;
594
+ captureDelay?: number | undefined;
595
+ holdDuration?: number | undefined;
596
+ transition?: "none" | "fade" | undefined;
597
+ }>;
598
+ type Step = z.infer<typeof StepSchema>;
599
+ declare const ScenarioSchema: z.ZodObject<{
600
+ name: z.ZodString;
601
+ description: z.ZodOptional<z.ZodString>;
602
+ viewport: z.ZodDefault<z.ZodObject<{
603
+ width: z.ZodDefault<z.ZodNumber>;
604
+ height: z.ZodDefault<z.ZodNumber>;
605
+ }, "strip", z.ZodTypeAny, {
606
+ width: number;
607
+ height: number;
608
+ }, {
609
+ width?: number | undefined;
610
+ height?: number | undefined;
611
+ }>>;
612
+ effects: z.ZodDefault<z.ZodObject<{
613
+ zoom: z.ZodDefault<z.ZodObject<{
614
+ enabled: z.ZodDefault<z.ZodBoolean>;
615
+ scale: z.ZodDefault<z.ZodNumber>;
616
+ duration: z.ZodDefault<z.ZodNumber>;
617
+ easing: z.ZodDefault<z.ZodEnum<["ease-in-out", "ease-in", "ease-out", "linear"]>>;
618
+ autoZoom: z.ZodDefault<z.ZodObject<{
619
+ followCursor: z.ZodDefault<z.ZodBoolean>;
620
+ maxScale: z.ZodDefault<z.ZodNumber>;
621
+ transitionDuration: z.ZodDefault<z.ZodNumber>;
622
+ padding: z.ZodDefault<z.ZodNumber>;
623
+ }, "strip", z.ZodTypeAny, {
624
+ followCursor: boolean;
625
+ maxScale: number;
626
+ transitionDuration: number;
627
+ padding: number;
628
+ }, {
629
+ followCursor?: boolean | undefined;
630
+ maxScale?: number | undefined;
631
+ transitionDuration?: number | undefined;
632
+ padding?: number | undefined;
633
+ }>>;
634
+ }, "strip", z.ZodTypeAny, {
635
+ duration: number;
636
+ enabled: boolean;
637
+ scale: number;
638
+ easing: "ease-in-out" | "ease-in" | "ease-out" | "linear";
639
+ autoZoom: {
640
+ followCursor: boolean;
641
+ maxScale: number;
642
+ transitionDuration: number;
643
+ padding: number;
644
+ };
645
+ }, {
646
+ duration?: number | undefined;
647
+ enabled?: boolean | undefined;
648
+ scale?: number | undefined;
649
+ easing?: "ease-in-out" | "ease-in" | "ease-out" | "linear" | undefined;
650
+ autoZoom?: {
651
+ followCursor?: boolean | undefined;
652
+ maxScale?: number | undefined;
653
+ transitionDuration?: number | undefined;
654
+ padding?: number | undefined;
655
+ } | undefined;
656
+ }>>;
657
+ cursor: z.ZodDefault<z.ZodObject<{
658
+ enabled: z.ZodDefault<z.ZodBoolean>;
659
+ size: z.ZodDefault<z.ZodNumber>;
660
+ color: z.ZodDefault<z.ZodString>;
661
+ speed: z.ZodDefault<z.ZodEnum<["fast", "normal", "slow"]>>;
662
+ smoothing: z.ZodDefault<z.ZodBoolean>;
663
+ clickEffect: z.ZodDefault<z.ZodBoolean>;
664
+ clickColor: z.ZodDefault<z.ZodString>;
665
+ clickRadius: z.ZodDefault<z.ZodNumber>;
666
+ trail: z.ZodDefault<z.ZodBoolean>;
667
+ trailLength: z.ZodDefault<z.ZodNumber>;
668
+ trailColor: z.ZodDefault<z.ZodString>;
669
+ highlight: z.ZodDefault<z.ZodBoolean>;
670
+ highlightRadius: z.ZodDefault<z.ZodNumber>;
671
+ highlightColor: z.ZodDefault<z.ZodString>;
672
+ }, "strip", z.ZodTypeAny, {
673
+ enabled: boolean;
674
+ size: number;
675
+ color: string;
676
+ speed: "fast" | "normal" | "slow";
677
+ smoothing: boolean;
678
+ clickEffect: boolean;
679
+ clickColor: string;
680
+ clickRadius: number;
681
+ trail: boolean;
682
+ trailLength: number;
683
+ trailColor: string;
684
+ highlight: boolean;
685
+ highlightRadius: number;
686
+ highlightColor: string;
687
+ }, {
688
+ enabled?: boolean | undefined;
689
+ size?: number | undefined;
690
+ color?: string | undefined;
691
+ speed?: "fast" | "normal" | "slow" | undefined;
692
+ smoothing?: boolean | undefined;
693
+ clickEffect?: boolean | undefined;
694
+ clickColor?: string | undefined;
695
+ clickRadius?: number | undefined;
696
+ trail?: boolean | undefined;
697
+ trailLength?: number | undefined;
698
+ trailColor?: string | undefined;
699
+ highlight?: boolean | undefined;
700
+ highlightRadius?: number | undefined;
701
+ highlightColor?: string | undefined;
702
+ }>>;
703
+ background: z.ZodDefault<z.ZodObject<{
704
+ type: z.ZodDefault<z.ZodEnum<["gradient", "solid", "image"]>>;
705
+ value: z.ZodDefault<z.ZodString>;
706
+ padding: z.ZodDefault<z.ZodNumber>;
707
+ borderRadius: z.ZodDefault<z.ZodNumber>;
708
+ shadow: z.ZodDefault<z.ZodBoolean>;
709
+ }, "strip", z.ZodTypeAny, {
710
+ value: string;
711
+ type: "gradient" | "solid" | "image";
712
+ padding: number;
713
+ borderRadius: number;
714
+ shadow: boolean;
715
+ }, {
716
+ value?: string | undefined;
717
+ type?: "gradient" | "solid" | "image" | undefined;
718
+ padding?: number | undefined;
719
+ borderRadius?: number | undefined;
720
+ shadow?: boolean | undefined;
721
+ }>>;
722
+ deviceFrame: z.ZodDefault<z.ZodObject<{
723
+ enabled: z.ZodDefault<z.ZodBoolean>;
724
+ type: z.ZodDefault<z.ZodEnum<["browser", "macbook", "iphone", "ipad", "android", "none"]>>;
725
+ darkMode: z.ZodDefault<z.ZodBoolean>;
726
+ }, "strip", z.ZodTypeAny, {
727
+ type: "browser" | "macbook" | "iphone" | "ipad" | "android" | "none";
728
+ enabled: boolean;
729
+ darkMode: boolean;
730
+ }, {
731
+ type?: "browser" | "macbook" | "iphone" | "ipad" | "android" | "none" | undefined;
732
+ enabled?: boolean | undefined;
733
+ darkMode?: boolean | undefined;
734
+ }>>;
735
+ speedRamp: z.ZodDefault<z.ZodObject<{
736
+ enabled: z.ZodDefault<z.ZodBoolean>;
737
+ idleSpeed: z.ZodDefault<z.ZodNumber>;
738
+ actionSpeed: z.ZodDefault<z.ZodNumber>;
739
+ transitionFrames: z.ZodDefault<z.ZodNumber>;
740
+ }, "strip", z.ZodTypeAny, {
741
+ enabled: boolean;
742
+ idleSpeed: number;
743
+ actionSpeed: number;
744
+ transitionFrames: number;
745
+ }, {
746
+ enabled?: boolean | undefined;
747
+ idleSpeed?: number | undefined;
748
+ actionSpeed?: number | undefined;
749
+ transitionFrames?: number | undefined;
750
+ }>>;
751
+ keystroke: z.ZodDefault<z.ZodObject<{
752
+ enabled: z.ZodDefault<z.ZodBoolean>;
753
+ position: z.ZodDefault<z.ZodEnum<["bottom-center", "bottom-left", "bottom-right"]>>;
754
+ fontSize: z.ZodDefault<z.ZodNumber>;
755
+ backgroundColor: z.ZodDefault<z.ZodString>;
756
+ textColor: z.ZodDefault<z.ZodString>;
757
+ padding: z.ZodDefault<z.ZodNumber>;
758
+ fadeAfter: z.ZodDefault<z.ZodNumber>;
759
+ }, "strip", z.ZodTypeAny, {
760
+ padding: number;
761
+ enabled: boolean;
762
+ position: "bottom-center" | "bottom-left" | "bottom-right";
763
+ fontSize: number;
764
+ backgroundColor: string;
765
+ textColor: string;
766
+ fadeAfter: number;
767
+ }, {
768
+ padding?: number | undefined;
769
+ enabled?: boolean | undefined;
770
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
771
+ fontSize?: number | undefined;
772
+ backgroundColor?: string | undefined;
773
+ textColor?: string | undefined;
774
+ fadeAfter?: number | undefined;
775
+ }>>;
776
+ watermark: z.ZodDefault<z.ZodObject<{
777
+ enabled: z.ZodDefault<z.ZodBoolean>;
778
+ text: z.ZodDefault<z.ZodString>;
779
+ position: z.ZodDefault<z.ZodEnum<["top-left", "top-right", "bottom-left", "bottom-right"]>>;
780
+ opacity: z.ZodDefault<z.ZodNumber>;
781
+ fontSize: z.ZodDefault<z.ZodNumber>;
782
+ color: z.ZodDefault<z.ZodString>;
783
+ }, "strip", z.ZodTypeAny, {
784
+ text: string;
785
+ enabled: boolean;
786
+ color: string;
787
+ position: "bottom-left" | "bottom-right" | "top-left" | "top-right";
788
+ fontSize: number;
789
+ opacity: number;
790
+ }, {
791
+ text?: string | undefined;
792
+ enabled?: boolean | undefined;
793
+ color?: string | undefined;
794
+ position?: "bottom-left" | "bottom-right" | "top-left" | "top-right" | undefined;
795
+ fontSize?: number | undefined;
796
+ opacity?: number | undefined;
797
+ }>>;
798
+ }, "strip", z.ZodTypeAny, {
799
+ zoom: {
800
+ duration: number;
801
+ enabled: boolean;
802
+ scale: number;
803
+ easing: "ease-in-out" | "ease-in" | "ease-out" | "linear";
804
+ autoZoom: {
805
+ followCursor: boolean;
806
+ maxScale: number;
807
+ transitionDuration: number;
808
+ padding: number;
809
+ };
810
+ };
811
+ cursor: {
812
+ enabled: boolean;
813
+ size: number;
814
+ color: string;
815
+ speed: "fast" | "normal" | "slow";
816
+ smoothing: boolean;
817
+ clickEffect: boolean;
818
+ clickColor: string;
819
+ clickRadius: number;
820
+ trail: boolean;
821
+ trailLength: number;
822
+ trailColor: string;
823
+ highlight: boolean;
824
+ highlightRadius: number;
825
+ highlightColor: string;
826
+ };
827
+ background: {
828
+ value: string;
829
+ type: "gradient" | "solid" | "image";
830
+ padding: number;
831
+ borderRadius: number;
832
+ shadow: boolean;
833
+ };
834
+ deviceFrame: {
835
+ type: "browser" | "macbook" | "iphone" | "ipad" | "android" | "none";
836
+ enabled: boolean;
837
+ darkMode: boolean;
838
+ };
839
+ speedRamp: {
840
+ enabled: boolean;
841
+ idleSpeed: number;
842
+ actionSpeed: number;
843
+ transitionFrames: number;
844
+ };
845
+ keystroke: {
846
+ padding: number;
847
+ enabled: boolean;
848
+ position: "bottom-center" | "bottom-left" | "bottom-right";
849
+ fontSize: number;
850
+ backgroundColor: string;
851
+ textColor: string;
852
+ fadeAfter: number;
853
+ };
854
+ watermark: {
855
+ text: string;
856
+ enabled: boolean;
857
+ color: string;
858
+ position: "bottom-left" | "bottom-right" | "top-left" | "top-right";
859
+ fontSize: number;
860
+ opacity: number;
861
+ };
862
+ }, {
863
+ zoom?: {
864
+ duration?: number | undefined;
865
+ enabled?: boolean | undefined;
866
+ scale?: number | undefined;
867
+ easing?: "ease-in-out" | "ease-in" | "ease-out" | "linear" | undefined;
868
+ autoZoom?: {
869
+ followCursor?: boolean | undefined;
870
+ maxScale?: number | undefined;
871
+ transitionDuration?: number | undefined;
872
+ padding?: number | undefined;
873
+ } | undefined;
874
+ } | undefined;
875
+ cursor?: {
876
+ enabled?: boolean | undefined;
877
+ size?: number | undefined;
878
+ color?: string | undefined;
879
+ speed?: "fast" | "normal" | "slow" | undefined;
880
+ smoothing?: boolean | undefined;
881
+ clickEffect?: boolean | undefined;
882
+ clickColor?: string | undefined;
883
+ clickRadius?: number | undefined;
884
+ trail?: boolean | undefined;
885
+ trailLength?: number | undefined;
886
+ trailColor?: string | undefined;
887
+ highlight?: boolean | undefined;
888
+ highlightRadius?: number | undefined;
889
+ highlightColor?: string | undefined;
890
+ } | undefined;
891
+ background?: {
892
+ value?: string | undefined;
893
+ type?: "gradient" | "solid" | "image" | undefined;
894
+ padding?: number | undefined;
895
+ borderRadius?: number | undefined;
896
+ shadow?: boolean | undefined;
897
+ } | undefined;
898
+ deviceFrame?: {
899
+ type?: "browser" | "macbook" | "iphone" | "ipad" | "android" | "none" | undefined;
900
+ enabled?: boolean | undefined;
901
+ darkMode?: boolean | undefined;
902
+ } | undefined;
903
+ speedRamp?: {
904
+ enabled?: boolean | undefined;
905
+ idleSpeed?: number | undefined;
906
+ actionSpeed?: number | undefined;
907
+ transitionFrames?: number | undefined;
908
+ } | undefined;
909
+ keystroke?: {
910
+ padding?: number | undefined;
911
+ enabled?: boolean | undefined;
912
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
913
+ fontSize?: number | undefined;
914
+ backgroundColor?: string | undefined;
915
+ textColor?: string | undefined;
916
+ fadeAfter?: number | undefined;
917
+ } | undefined;
918
+ watermark?: {
919
+ text?: string | undefined;
920
+ enabled?: boolean | undefined;
921
+ color?: string | undefined;
922
+ position?: "bottom-left" | "bottom-right" | "top-left" | "top-right" | undefined;
923
+ fontSize?: number | undefined;
924
+ opacity?: number | undefined;
925
+ } | undefined;
926
+ }>>;
927
+ output: z.ZodDefault<z.ZodObject<{
928
+ format: z.ZodDefault<z.ZodEnum<["gif", "mp4", "webm", "png-sequence"]>>;
929
+ width: z.ZodDefault<z.ZodNumber>;
930
+ height: z.ZodDefault<z.ZodNumber>;
931
+ fps: z.ZodDefault<z.ZodNumber>;
932
+ quality: z.ZodDefault<z.ZodNumber>;
933
+ outputDir: z.ZodDefault<z.ZodString>;
934
+ filename: z.ZodDefault<z.ZodString>;
935
+ }, "strip", z.ZodTypeAny, {
936
+ format: "gif" | "mp4" | "webm" | "png-sequence";
937
+ width: number;
938
+ height: number;
939
+ fps: number;
940
+ quality: number;
941
+ outputDir: string;
942
+ filename: string;
943
+ }, {
944
+ format?: "gif" | "mp4" | "webm" | "png-sequence" | undefined;
945
+ width?: number | undefined;
946
+ height?: number | undefined;
947
+ fps?: number | undefined;
948
+ quality?: number | undefined;
949
+ outputDir?: string | undefined;
950
+ filename?: string | undefined;
951
+ }>>;
952
+ steps: z.ZodArray<z.ZodObject<{
953
+ name: z.ZodOptional<z.ZodString>;
954
+ actions: z.ZodArray<z.ZodDiscriminatedUnion<"action", [z.ZodObject<{
955
+ action: z.ZodLiteral<"navigate">;
956
+ url: z.ZodString;
957
+ waitUntil: z.ZodDefault<z.ZodEnum<["load", "domcontentloaded", "networkidle"]>>;
958
+ }, "strip", z.ZodTypeAny, {
959
+ action: "navigate";
960
+ url: string;
961
+ waitUntil: "load" | "domcontentloaded" | "networkidle";
962
+ }, {
963
+ action: "navigate";
964
+ url: string;
965
+ waitUntil?: "load" | "domcontentloaded" | "networkidle" | undefined;
966
+ }>, z.ZodObject<{
967
+ action: z.ZodLiteral<"click">;
968
+ selector: z.ZodString;
969
+ delay: z.ZodOptional<z.ZodNumber>;
970
+ }, "strip", z.ZodTypeAny, {
971
+ action: "click";
972
+ selector: string;
973
+ delay?: number | undefined;
974
+ }, {
975
+ action: "click";
976
+ selector: string;
977
+ delay?: number | undefined;
978
+ }>, z.ZodObject<{
979
+ action: z.ZodLiteral<"type">;
980
+ selector: z.ZodString;
981
+ text: z.ZodString;
982
+ delay: z.ZodDefault<z.ZodNumber>;
983
+ }, "strip", z.ZodTypeAny, {
984
+ action: "type";
985
+ selector: string;
986
+ delay: number;
987
+ text: string;
988
+ }, {
989
+ action: "type";
990
+ selector: string;
991
+ text: string;
992
+ delay?: number | undefined;
993
+ }>, z.ZodObject<{
994
+ action: z.ZodLiteral<"scroll">;
995
+ selector: z.ZodOptional<z.ZodString>;
996
+ y: z.ZodDefault<z.ZodNumber>;
997
+ x: z.ZodDefault<z.ZodNumber>;
998
+ smooth: z.ZodDefault<z.ZodBoolean>;
999
+ }, "strip", z.ZodTypeAny, {
1000
+ action: "scroll";
1001
+ y: number;
1002
+ x: number;
1003
+ smooth: boolean;
1004
+ selector?: string | undefined;
1005
+ }, {
1006
+ action: "scroll";
1007
+ selector?: string | undefined;
1008
+ y?: number | undefined;
1009
+ x?: number | undefined;
1010
+ smooth?: boolean | undefined;
1011
+ }>, z.ZodObject<{
1012
+ action: z.ZodLiteral<"wait">;
1013
+ duration: z.ZodNumber;
1014
+ }, "strip", z.ZodTypeAny, {
1015
+ action: "wait";
1016
+ duration: number;
1017
+ }, {
1018
+ action: "wait";
1019
+ duration: number;
1020
+ }>, z.ZodObject<{
1021
+ action: z.ZodLiteral<"hover">;
1022
+ selector: z.ZodString;
1023
+ }, "strip", z.ZodTypeAny, {
1024
+ action: "hover";
1025
+ selector: string;
1026
+ }, {
1027
+ action: "hover";
1028
+ selector: string;
1029
+ }>, z.ZodObject<{
1030
+ action: z.ZodLiteral<"screenshot">;
1031
+ name: z.ZodOptional<z.ZodString>;
1032
+ fullPage: z.ZodDefault<z.ZodBoolean>;
1033
+ }, "strip", z.ZodTypeAny, {
1034
+ action: "screenshot";
1035
+ fullPage: boolean;
1036
+ name?: string | undefined;
1037
+ }, {
1038
+ action: "screenshot";
1039
+ name?: string | undefined;
1040
+ fullPage?: boolean | undefined;
1041
+ }>]>, "many">;
1042
+ captureDelay: z.ZodDefault<z.ZodNumber>;
1043
+ holdDuration: z.ZodDefault<z.ZodNumber>;
1044
+ transition: z.ZodDefault<z.ZodEnum<["fade", "none"]>>;
1045
+ }, "strip", z.ZodTypeAny, {
1046
+ actions: ({
1047
+ action: "navigate";
1048
+ url: string;
1049
+ waitUntil: "load" | "domcontentloaded" | "networkidle";
1050
+ } | {
1051
+ action: "click";
1052
+ selector: string;
1053
+ delay?: number | undefined;
1054
+ } | {
1055
+ action: "type";
1056
+ selector: string;
1057
+ delay: number;
1058
+ text: string;
1059
+ } | {
1060
+ action: "scroll";
1061
+ y: number;
1062
+ x: number;
1063
+ smooth: boolean;
1064
+ selector?: string | undefined;
1065
+ } | {
1066
+ action: "wait";
1067
+ duration: number;
1068
+ } | {
1069
+ action: "hover";
1070
+ selector: string;
1071
+ } | {
1072
+ action: "screenshot";
1073
+ fullPage: boolean;
1074
+ name?: string | undefined;
1075
+ })[];
1076
+ captureDelay: number;
1077
+ holdDuration: number;
1078
+ transition: "none" | "fade";
1079
+ name?: string | undefined;
1080
+ }, {
1081
+ actions: ({
1082
+ action: "navigate";
1083
+ url: string;
1084
+ waitUntil?: "load" | "domcontentloaded" | "networkidle" | undefined;
1085
+ } | {
1086
+ action: "click";
1087
+ selector: string;
1088
+ delay?: number | undefined;
1089
+ } | {
1090
+ action: "type";
1091
+ selector: string;
1092
+ text: string;
1093
+ delay?: number | undefined;
1094
+ } | {
1095
+ action: "scroll";
1096
+ selector?: string | undefined;
1097
+ y?: number | undefined;
1098
+ x?: number | undefined;
1099
+ smooth?: boolean | undefined;
1100
+ } | {
1101
+ action: "wait";
1102
+ duration: number;
1103
+ } | {
1104
+ action: "hover";
1105
+ selector: string;
1106
+ } | {
1107
+ action: "screenshot";
1108
+ name?: string | undefined;
1109
+ fullPage?: boolean | undefined;
1110
+ })[];
1111
+ name?: string | undefined;
1112
+ captureDelay?: number | undefined;
1113
+ holdDuration?: number | undefined;
1114
+ transition?: "none" | "fade" | undefined;
1115
+ }>, "many">;
1116
+ }, "strip", z.ZodTypeAny, {
1117
+ name: string;
1118
+ viewport: {
1119
+ width: number;
1120
+ height: number;
1121
+ };
1122
+ effects: {
1123
+ zoom: {
1124
+ duration: number;
1125
+ enabled: boolean;
1126
+ scale: number;
1127
+ easing: "ease-in-out" | "ease-in" | "ease-out" | "linear";
1128
+ autoZoom: {
1129
+ followCursor: boolean;
1130
+ maxScale: number;
1131
+ transitionDuration: number;
1132
+ padding: number;
1133
+ };
1134
+ };
1135
+ cursor: {
1136
+ enabled: boolean;
1137
+ size: number;
1138
+ color: string;
1139
+ speed: "fast" | "normal" | "slow";
1140
+ smoothing: boolean;
1141
+ clickEffect: boolean;
1142
+ clickColor: string;
1143
+ clickRadius: number;
1144
+ trail: boolean;
1145
+ trailLength: number;
1146
+ trailColor: string;
1147
+ highlight: boolean;
1148
+ highlightRadius: number;
1149
+ highlightColor: string;
1150
+ };
1151
+ background: {
1152
+ value: string;
1153
+ type: "gradient" | "solid" | "image";
1154
+ padding: number;
1155
+ borderRadius: number;
1156
+ shadow: boolean;
1157
+ };
1158
+ deviceFrame: {
1159
+ type: "browser" | "macbook" | "iphone" | "ipad" | "android" | "none";
1160
+ enabled: boolean;
1161
+ darkMode: boolean;
1162
+ };
1163
+ speedRamp: {
1164
+ enabled: boolean;
1165
+ idleSpeed: number;
1166
+ actionSpeed: number;
1167
+ transitionFrames: number;
1168
+ };
1169
+ keystroke: {
1170
+ padding: number;
1171
+ enabled: boolean;
1172
+ position: "bottom-center" | "bottom-left" | "bottom-right";
1173
+ fontSize: number;
1174
+ backgroundColor: string;
1175
+ textColor: string;
1176
+ fadeAfter: number;
1177
+ };
1178
+ watermark: {
1179
+ text: string;
1180
+ enabled: boolean;
1181
+ color: string;
1182
+ position: "bottom-left" | "bottom-right" | "top-left" | "top-right";
1183
+ fontSize: number;
1184
+ opacity: number;
1185
+ };
1186
+ };
1187
+ output: {
1188
+ format: "gif" | "mp4" | "webm" | "png-sequence";
1189
+ width: number;
1190
+ height: number;
1191
+ fps: number;
1192
+ quality: number;
1193
+ outputDir: string;
1194
+ filename: string;
1195
+ };
1196
+ steps: {
1197
+ actions: ({
1198
+ action: "navigate";
1199
+ url: string;
1200
+ waitUntil: "load" | "domcontentloaded" | "networkidle";
1201
+ } | {
1202
+ action: "click";
1203
+ selector: string;
1204
+ delay?: number | undefined;
1205
+ } | {
1206
+ action: "type";
1207
+ selector: string;
1208
+ delay: number;
1209
+ text: string;
1210
+ } | {
1211
+ action: "scroll";
1212
+ y: number;
1213
+ x: number;
1214
+ smooth: boolean;
1215
+ selector?: string | undefined;
1216
+ } | {
1217
+ action: "wait";
1218
+ duration: number;
1219
+ } | {
1220
+ action: "hover";
1221
+ selector: string;
1222
+ } | {
1223
+ action: "screenshot";
1224
+ fullPage: boolean;
1225
+ name?: string | undefined;
1226
+ })[];
1227
+ captureDelay: number;
1228
+ holdDuration: number;
1229
+ transition: "none" | "fade";
1230
+ name?: string | undefined;
1231
+ }[];
1232
+ description?: string | undefined;
1233
+ }, {
1234
+ name: string;
1235
+ steps: {
1236
+ actions: ({
1237
+ action: "navigate";
1238
+ url: string;
1239
+ waitUntil?: "load" | "domcontentloaded" | "networkidle" | undefined;
1240
+ } | {
1241
+ action: "click";
1242
+ selector: string;
1243
+ delay?: number | undefined;
1244
+ } | {
1245
+ action: "type";
1246
+ selector: string;
1247
+ text: string;
1248
+ delay?: number | undefined;
1249
+ } | {
1250
+ action: "scroll";
1251
+ selector?: string | undefined;
1252
+ y?: number | undefined;
1253
+ x?: number | undefined;
1254
+ smooth?: boolean | undefined;
1255
+ } | {
1256
+ action: "wait";
1257
+ duration: number;
1258
+ } | {
1259
+ action: "hover";
1260
+ selector: string;
1261
+ } | {
1262
+ action: "screenshot";
1263
+ name?: string | undefined;
1264
+ fullPage?: boolean | undefined;
1265
+ })[];
1266
+ name?: string | undefined;
1267
+ captureDelay?: number | undefined;
1268
+ holdDuration?: number | undefined;
1269
+ transition?: "none" | "fade" | undefined;
1270
+ }[];
1271
+ description?: string | undefined;
1272
+ viewport?: {
1273
+ width?: number | undefined;
1274
+ height?: number | undefined;
1275
+ } | undefined;
1276
+ effects?: {
1277
+ zoom?: {
1278
+ duration?: number | undefined;
1279
+ enabled?: boolean | undefined;
1280
+ scale?: number | undefined;
1281
+ easing?: "ease-in-out" | "ease-in" | "ease-out" | "linear" | undefined;
1282
+ autoZoom?: {
1283
+ followCursor?: boolean | undefined;
1284
+ maxScale?: number | undefined;
1285
+ transitionDuration?: number | undefined;
1286
+ padding?: number | undefined;
1287
+ } | undefined;
1288
+ } | undefined;
1289
+ cursor?: {
1290
+ enabled?: boolean | undefined;
1291
+ size?: number | undefined;
1292
+ color?: string | undefined;
1293
+ speed?: "fast" | "normal" | "slow" | undefined;
1294
+ smoothing?: boolean | undefined;
1295
+ clickEffect?: boolean | undefined;
1296
+ clickColor?: string | undefined;
1297
+ clickRadius?: number | undefined;
1298
+ trail?: boolean | undefined;
1299
+ trailLength?: number | undefined;
1300
+ trailColor?: string | undefined;
1301
+ highlight?: boolean | undefined;
1302
+ highlightRadius?: number | undefined;
1303
+ highlightColor?: string | undefined;
1304
+ } | undefined;
1305
+ background?: {
1306
+ value?: string | undefined;
1307
+ type?: "gradient" | "solid" | "image" | undefined;
1308
+ padding?: number | undefined;
1309
+ borderRadius?: number | undefined;
1310
+ shadow?: boolean | undefined;
1311
+ } | undefined;
1312
+ deviceFrame?: {
1313
+ type?: "browser" | "macbook" | "iphone" | "ipad" | "android" | "none" | undefined;
1314
+ enabled?: boolean | undefined;
1315
+ darkMode?: boolean | undefined;
1316
+ } | undefined;
1317
+ speedRamp?: {
1318
+ enabled?: boolean | undefined;
1319
+ idleSpeed?: number | undefined;
1320
+ actionSpeed?: number | undefined;
1321
+ transitionFrames?: number | undefined;
1322
+ } | undefined;
1323
+ keystroke?: {
1324
+ padding?: number | undefined;
1325
+ enabled?: boolean | undefined;
1326
+ position?: "bottom-center" | "bottom-left" | "bottom-right" | undefined;
1327
+ fontSize?: number | undefined;
1328
+ backgroundColor?: string | undefined;
1329
+ textColor?: string | undefined;
1330
+ fadeAfter?: number | undefined;
1331
+ } | undefined;
1332
+ watermark?: {
1333
+ text?: string | undefined;
1334
+ enabled?: boolean | undefined;
1335
+ color?: string | undefined;
1336
+ position?: "bottom-left" | "bottom-right" | "top-left" | "top-right" | undefined;
1337
+ fontSize?: number | undefined;
1338
+ opacity?: number | undefined;
1339
+ } | undefined;
1340
+ } | undefined;
1341
+ output?: {
1342
+ format?: "gif" | "mp4" | "webm" | "png-sequence" | undefined;
1343
+ width?: number | undefined;
1344
+ height?: number | undefined;
1345
+ fps?: number | undefined;
1346
+ quality?: number | undefined;
1347
+ outputDir?: string | undefined;
1348
+ filename?: string | undefined;
1349
+ } | undefined;
1350
+ }>;
1351
+ type Scenario = z.infer<typeof ScenarioSchema>;
1352
+ interface KeystrokeEvent {
1353
+ key: string;
1354
+ timestamp: number;
1355
+ }
1356
+ interface CapturedFrame {
1357
+ index: number;
1358
+ screenshot: Buffer;
1359
+ timestamp: number;
1360
+ cursorPosition: {
1361
+ x: number;
1362
+ y: number;
1363
+ } | null;
1364
+ clickPosition: {
1365
+ x: number;
1366
+ y: number;
1367
+ } | null;
1368
+ clickProgress?: number;
1369
+ viewport: {
1370
+ width: number;
1371
+ height: number;
1372
+ };
1373
+ stepName?: string;
1374
+ stepIndex?: number;
1375
+ actionType?: string;
1376
+ keystrokes?: KeystrokeEvent[];
1377
+ }
1378
+ interface ComposedFrame {
1379
+ index: number;
1380
+ buffer: Buffer;
1381
+ timestamp: number;
1382
+ }
1383
+ interface RecordingSession {
1384
+ scenario: Scenario;
1385
+ frames: CapturedFrame[];
1386
+ startTime: number;
1387
+ endTime?: number;
1388
+ }
1389
+
1390
+ declare class ClipwiseRecorder {
1391
+ private browser;
1392
+ private context;
1393
+ private page;
1394
+ private cdpClient;
1395
+ private rawFrames;
1396
+ private cursorTimeline;
1397
+ private clickTimeline;
1398
+ private keystrokeTimeline;
1399
+ private currentStepIndex;
1400
+ private cursorPosition;
1401
+ private viewport;
1402
+ private isCapturing;
1403
+ private targetFps;
1404
+ private cursorSpeed;
1405
+ /**
1406
+ * Launch the browser and create a page with the scenario viewport.
1407
+ */
1408
+ init(scenario: Scenario): Promise<void>;
1409
+ /**
1410
+ * Start CDP screencast for continuous frame capture.
1411
+ * Frames are received asynchronously and stored in rawFrames.
1412
+ */
1413
+ startCapture(): Promise<void>;
1414
+ /**
1415
+ * Stop CDP screencast and flush remaining frames.
1416
+ */
1417
+ stopCapture(): Promise<void>;
1418
+ /**
1419
+ * Execute the full scenario with continuous capture and return a RecordingSession.
1420
+ */
1421
+ record(scenario: Scenario): Promise<RecordingSession>;
1422
+ /**
1423
+ * Wait for a given duration while forcing periodic repaints
1424
+ * so CDP screencast keeps sending frames even on static pages.
1425
+ */
1426
+ private waitWithRepaints;
1427
+ /**
1428
+ * Execute a single action. CDP screencast captures frames continuously
1429
+ * in the background while actions are performed.
1430
+ */
1431
+ private executeAction;
1432
+ /**
1433
+ * Move cursor smoothly from current position to target using
1434
+ * manual step-by-step movement with delays between each step.
1435
+ * Speed is controlled by the cursor.speed preset (fast/normal/slow).
1436
+ */
1437
+ private moveCursorSmooth;
1438
+ /**
1439
+ * Build CapturedFrame array from raw screencast frames,
1440
+ * interpolating cursor positions and mapping click events.
1441
+ */
1442
+ private buildCapturedFrames;
1443
+ /**
1444
+ * Resample captured frames to the target FPS.
1445
+ *
1446
+ * Even if CDP only sent a few unique screenshots, we generate enough
1447
+ * output frames for smooth playback. Each output frame:
1448
+ * - Uses the nearest raw screenshot (may be duplicated)
1449
+ * - Gets a uniquely interpolated cursor position
1450
+ * - Gets properly mapped click effects
1451
+ */
1452
+ private resampleToTargetFps;
1453
+ /**
1454
+ * Interpolate cursor position at a given timestamp using the cursor timeline.
1455
+ */
1456
+ private interpolateCursorAt;
1457
+ /**
1458
+ * Clean up browser resources. Always called after recording.
1459
+ */
1460
+ cleanup(): Promise<void>;
1461
+ }
1462
+
1463
+ interface FrameContext {
1464
+ zoomScale: number;
1465
+ clickProgress: number | null;
1466
+ cursorTrail: Array<{
1467
+ x: number;
1468
+ y: number;
1469
+ }>;
1470
+ }
1471
+ declare class CanvasRenderer {
1472
+ private effects;
1473
+ private output;
1474
+ private steps;
1475
+ constructor(effects: EffectsConfig, output: OutputConfig, steps?: Step[]);
1476
+ /**
1477
+ * Apply the full effects pipeline to a single captured frame.
1478
+ *
1479
+ * Pipeline order:
1480
+ * 1. Device frame (browser chrome / mobile mockup)
1481
+ * 2. Cursor highlight (Screen Studio glow)
1482
+ * 3. Cursor trail
1483
+ * 4. Cursor rendering
1484
+ * 5. Click ripple effect (animated progress)
1485
+ * 6. Keystroke HUD
1486
+ * 7. Zoom (adaptive, cursor-following)
1487
+ * 8. Background (padding, gradient, rounded corners)
1488
+ * 9. Watermark overlay
1489
+ * 10. Final resize
1490
+ */
1491
+ composeFrame(frame: CapturedFrame, context?: Partial<FrameContext>): Promise<ComposedFrame>;
1492
+ /**
1493
+ * Process an entire sequence of captured frames through the effects pipeline.
1494
+ *
1495
+ * Multi-pass approach:
1496
+ * Pass 1: Speed ramping (adjust frame set).
1497
+ * Pass 2: Calculate per-frame contexts (zoom, click, trail).
1498
+ * Pass 3: Render each frame with effects.
1499
+ * Pass 4: Apply scene transitions at step boundaries.
1500
+ */
1501
+ composeAll(frames: CapturedFrame[]): Promise<ComposedFrame[]>;
1502
+ /**
1503
+ * Calculate per-frame rendering context (zoom, click progress, cursor trail, tilt).
1504
+ */
1505
+ private calculateFrameContexts;
1506
+ /**
1507
+ * Apply speed ramping: slow down near actions, speed up during idle.
1508
+ * Returns a new frame array with frames duplicated or skipped.
1509
+ */
1510
+ private applySpeedRamp;
1511
+ /**
1512
+ * Apply crossfade transitions at step boundaries where configured.
1513
+ * Modifies the composed array in-place.
1514
+ */
1515
+ private applyTransitions;
1516
+ }
1517
+
1518
+ /**
1519
+ * Encode a sequence of composed frames into a GIF buffer.
1520
+ * Uses gifenc for encoding and sharp for raw RGBA conversion.
1521
+ */
1522
+ declare function encodeGif(frames: ComposedFrame[], config: OutputConfig): Promise<Buffer>;
1523
+ /**
1524
+ * Encode a sequence of composed frames into an MP4 file using ffmpeg.
1525
+ * Writes frames as PNG sequence to a temp directory, then runs ffmpeg.
1526
+ *
1527
+ * Requires ffmpeg to be installed and available in PATH.
1528
+ */
1529
+ declare function encodeMp4(frames: ComposedFrame[], config: OutputConfig): Promise<Buffer>;
1530
+ /**
1531
+ * Save a sequence of composed frames as individual PNG files.
1532
+ * Returns an array of file paths for the saved images.
1533
+ */
1534
+ declare function savePngSequence(frames: ComposedFrame[], config: OutputConfig): Promise<string[]>;
1535
+
1536
+ /**
1537
+ * Calculate adaptive zoom scale based on proximity to click/action frames.
1538
+ * Zooms in smoothly near important actions, stays at 1.0 during idle.
1539
+ *
1540
+ * @param frames - Array of frames with optional clickPosition
1541
+ * @param currentIndex - Index of the current frame
1542
+ * @param maxScale - Peak zoom scale
1543
+ * @param transitionFrames - Number of frames for zoom-in/zoom-out transition
1544
+ * @returns Scale value for the current frame (1.0 = no zoom)
1545
+ */
1546
+ declare function calculateAdaptiveZoom(frames: Array<{
1547
+ clickPosition: {
1548
+ x: number;
1549
+ y: number;
1550
+ } | null;
1551
+ }>, currentIndex: number, maxScale: number, transitionFrames: number): number;
1552
+ /**
1553
+ * Calculate pan offset to keep a focus point centered when zoomed in.
1554
+ * The offset defines the top-left corner of the visible crop region.
1555
+ */
1556
+ declare function calculatePanOffset(focusPoint: {
1557
+ x: number;
1558
+ y: number;
1559
+ }, scale: number, frameWidth: number, frameHeight: number): {
1560
+ x: number;
1561
+ y: number;
1562
+ };
1563
+ /**
1564
+ * Smoothly interpolate (lerp) between current and target zoom values.
1565
+ */
1566
+ declare function lerpZoom(current: number, target: number, factor: number): number;
1567
+
1568
+ type CursorEffect = EffectsConfig["cursor"];
1569
+ /**
1570
+ * Render a glowing highlight circle around the cursor (Screen Studio style).
1571
+ */
1572
+ declare function renderCursorHighlight(frameBuffer: Buffer, position: {
1573
+ x: number;
1574
+ y: number;
1575
+ }, config: CursorEffect, frameWidth: number, frameHeight: number): Promise<Buffer>;
1576
+ /**
1577
+ * Render a cursor trail (fading line segments following cursor path).
1578
+ * Each segment fades from transparent (oldest) to opaque (newest).
1579
+ */
1580
+ declare function renderCursorTrail(frameBuffer: Buffer, positions: Array<{
1581
+ x: number;
1582
+ y: number;
1583
+ }>, config: CursorEffect, frameWidth: number, frameHeight: number): Promise<Buffer>;
1584
+
1585
+ type KeystrokeConfig = EffectsConfig["keystroke"];
1586
+ /**
1587
+ * Render a keystroke HUD overlay showing recently typed keys.
1588
+ * Inspired by KeyCastr / CursorClip.
1589
+ */
1590
+ declare function renderKeystrokeHud(frameBuffer: Buffer, keystrokes: KeystrokeEvent[], frameTimestamp: number, config: KeystrokeConfig, frameWidth: number, frameHeight: number): Promise<Buffer>;
1591
+
1592
+ /**
1593
+ * Apply a crossfade transition between two frame buffers.
1594
+ * Uses raw pixel weighted averaging for accurate blending.
1595
+ *
1596
+ * @param fromBuffer - The outgoing frame
1597
+ * @param toBuffer - The incoming frame
1598
+ * @param progress - 0 = fully "from", 1 = fully "to"
1599
+ * @param width - Frame width
1600
+ * @param height - Frame height
1601
+ */
1602
+ declare function applyCrossfade(fromBuffer: Buffer, toBuffer: Buffer, progress: number, width: number, height: number): Promise<Buffer>;
1603
+
1604
+ type WatermarkConfig = EffectsConfig["watermark"];
1605
+ /**
1606
+ * Render a text watermark overlay at the specified corner.
1607
+ */
1608
+ declare function renderWatermark(frameBuffer: Buffer, config: WatermarkConfig, frameWidth: number, frameHeight: number): Promise<Buffer>;
1609
+
1610
+ /**
1611
+ * Parse a YAML string and return a validated Scenario object.
1612
+ * Throws with descriptive error messages on parse or validation failure.
1613
+ */
1614
+ declare function parseScenario(yamlContent: string): Scenario;
1615
+ /**
1616
+ * Load and parse a scenario from a YAML file path.
1617
+ */
1618
+ declare function loadScenario(filePath: string): Promise<Scenario>;
1619
+
1620
+ interface ValidationResult {
1621
+ valid: boolean;
1622
+ errors: string[];
1623
+ warnings: string[];
1624
+ }
1625
+ /**
1626
+ * Validate the logical consistency of a parsed Scenario.
1627
+ * This performs checks beyond what Zod schema validation covers.
1628
+ */
1629
+ declare function validateScenario(scenario: Scenario): ValidationResult;
1630
+
1631
+ export { CanvasRenderer, type CapturedFrame, ClipwiseRecorder, type ComposedFrame, type EffectsConfig, type FrameContext, type KeystrokeEvent, type OutputConfig, type RecordingSession, type Scenario, type Step, type StepAction, applyCrossfade, calculateAdaptiveZoom, calculatePanOffset, encodeGif, encodeMp4, lerpZoom, loadScenario, parseScenario, renderCursorHighlight, renderCursorTrail, renderKeystrokeHud, renderWatermark, savePngSequence, validateScenario };