@pixerate/editor 0.160.0 → 0.162.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/agent/index.cjs +36 -35
  2. package/dist/agent/index.js +7 -6
  3. package/dist/animation/index.cjs +5 -4
  4. package/dist/animation/index.js +4 -3
  5. package/dist/animation-editor/index.cjs +62 -61
  6. package/dist/animation-editor/index.js +6 -5
  7. package/dist/canvas/index.cjs +33 -32
  8. package/dist/canvas/index.js +6 -5
  9. package/dist/chart/index.cjs +88 -87
  10. package/dist/chart/index.js +7 -6
  11. package/dist/{chunk-QMI5HZWA.cjs → chunk-236TKNUR.cjs} +3 -3
  12. package/dist/{chunk-6UPGM3JB.js → chunk-2TKHLX6H.js} +1 -1
  13. package/dist/{chunk-3YDQLQH2.cjs → chunk-32MMQYCQ.cjs} +81 -81
  14. package/dist/{chunk-MHEXLG3M.cjs → chunk-3GJH2MGH.cjs} +37 -37
  15. package/dist/{chunk-AKDWAWSY.cjs → chunk-3IHNXRUV.cjs} +45 -45
  16. package/dist/{chunk-VKF3PWKR.cjs → chunk-3OSXHLIT.cjs} +259 -28
  17. package/dist/{chunk-TVO6W2Q6.cjs → chunk-4NGVHHJB.cjs} +17 -17
  18. package/dist/chunk-4VU4CP7R.js +769 -0
  19. package/dist/chunk-6DM3PUQD.cjs +767 -0
  20. package/dist/{chunk-DBIVICAO.js → chunk-7CKPUUN4.js} +1 -1
  21. package/dist/{chunk-57JLBGJ5.cjs → chunk-7YBDRJXT.cjs} +8 -8
  22. package/dist/{chunk-KY3FYKP3.js → chunk-BQWGN5WH.js} +1 -1
  23. package/dist/{chunk-LEUZ4FRC.cjs → chunk-CIPIESX4.cjs} +3 -3
  24. package/dist/chunk-CJE5MOIS.js +347 -0
  25. package/dist/{chunk-5QBRAIVK.js → chunk-CX6JLDFC.js} +3 -3
  26. package/dist/{chunk-R3QY7PPL.js → chunk-DTSTNRPH.js} +1 -1
  27. package/dist/{chunk-6LUYFHHN.cjs → chunk-EQ46F75O.cjs} +51 -51
  28. package/dist/{chunk-UKCJ43YL.cjs → chunk-ES3UEVUT.cjs} +130 -898
  29. package/dist/{chunk-UM3RPYC5.js → chunk-EVPZ5IKN.js} +1 -1
  30. package/dist/{chunk-XNQ5EFB4.cjs → chunk-EY22AY6R.cjs} +16 -16
  31. package/dist/chunk-FKUKJ3XA.cjs +347 -0
  32. package/dist/{chunk-YABNLNY7.js → chunk-GLMP22FT.js} +3 -3
  33. package/dist/{chunk-SUF6WRXR.cjs → chunk-GTELFJRE.cjs} +2 -2
  34. package/dist/{chunk-72BGL3I2.js → chunk-GWV4T5NZ.js} +1 -1
  35. package/dist/{chunk-AY65VQSU.js → chunk-H3OEM3Q2.js} +1 -1
  36. package/dist/{chunk-4YWAEV4W.cjs → chunk-HDGBM7EA.cjs} +26 -26
  37. package/dist/{chunk-H5XX4KHB.js → chunk-HLOKB7WW.js} +5 -3
  38. package/dist/{chunk-WNAAWLZ5.js → chunk-KGTF55R3.js} +2 -2
  39. package/dist/{chunk-WPPJH6X4.cjs → chunk-LL3H5XUH.cjs} +6 -4
  40. package/dist/{chunk-4T44CJ5K.cjs → chunk-NA4UVVJ4.cjs} +15 -15
  41. package/dist/{chunk-Q6PA362P.js → chunk-NO5QQDHZ.js} +2 -2
  42. package/dist/{chunk-AA34BA7G.js → chunk-QYZGBVNC.js} +30 -798
  43. package/dist/chunk-S6X2QRVU.cjs +769 -0
  44. package/dist/{chunk-SSCL7QQ4.js → chunk-XDCFJEU7.js} +2 -2
  45. package/dist/{chunk-IQ6KKXOU.js → chunk-YN4AYYBJ.js} +243 -12
  46. package/dist/chunk-ZGOHKS3X.js +767 -0
  47. package/dist/color/index.cjs +6 -2
  48. package/dist/color/index.d.cts +1 -0
  49. package/dist/color/index.d.ts +1 -0
  50. package/dist/color/index.js +28 -24
  51. package/dist/color/suggest.d.cts +12 -0
  52. package/dist/color/suggest.d.ts +12 -0
  53. package/dist/effects/index.cjs +44 -771
  54. package/dist/effects/index.js +34 -761
  55. package/dist/effects/ui.d.cts +20 -3
  56. package/dist/effects/ui.d.ts +20 -3
  57. package/dist/export/index.cjs +6 -5
  58. package/dist/export/index.js +5 -4
  59. package/dist/extensions/index.cjs +9 -8
  60. package/dist/extensions/index.js +8 -7
  61. package/dist/gradient/index.cjs +28 -26
  62. package/dist/gradient/index.js +7 -5
  63. package/dist/image-editor/index.cjs +638 -637
  64. package/dist/image-editor/index.js +5 -4
  65. package/dist/index.cjs +15 -14
  66. package/dist/index.js +9 -8
  67. package/dist/paint-editor/index.cjs +17 -16
  68. package/dist/paint-editor/index.js +6 -5
  69. package/dist/typography/accessibility.d.cts +44 -0
  70. package/dist/typography/accessibility.d.ts +44 -0
  71. package/dist/typography/catalog.d.cts +98 -0
  72. package/dist/typography/catalog.d.ts +98 -0
  73. package/dist/typography/index.cjs +1099 -0
  74. package/dist/typography/index.d.cts +16 -0
  75. package/dist/typography/index.d.ts +16 -0
  76. package/dist/typography/index.js +1099 -0
  77. package/dist/typography/metrics.d.cts +31 -0
  78. package/dist/typography/metrics.d.ts +31 -0
  79. package/dist/typography/picker.d.cts +132 -0
  80. package/dist/typography/picker.d.ts +132 -0
  81. package/dist/typography/registry.d.cts +66 -0
  82. package/dist/typography/registry.d.ts +66 -0
  83. package/dist/typography/scale.d.cts +62 -0
  84. package/dist/typography/scale.d.ts +62 -0
  85. package/dist/typography/segment.d.cts +26 -0
  86. package/dist/typography/segment.d.ts +26 -0
  87. package/dist/typography/stack.d.cts +26 -0
  88. package/dist/typography/stack.d.ts +26 -0
  89. package/dist/typography/tools.d.cts +34 -0
  90. package/dist/typography/tools.d.ts +34 -0
  91. package/dist/typography/types.d.cts +96 -0
  92. package/dist/typography/types.d.ts +96 -0
  93. package/dist/typography/weight.d.cts +13 -0
  94. package/dist/typography/weight.d.ts +13 -0
  95. package/dist/vector/index.cjs +950 -949
  96. package/dist/vector/index.js +5 -4
  97. package/dist/video-editor/audio.d.cts +9 -0
  98. package/dist/video-editor/audio.d.ts +9 -0
  99. package/dist/video-editor/check.d.cts +1 -1
  100. package/dist/video-editor/check.d.ts +1 -1
  101. package/dist/video-editor/controller.d.cts +47 -0
  102. package/dist/video-editor/controller.d.ts +47 -0
  103. package/dist/video-editor/dialogue-tools.d.cts +19 -0
  104. package/dist/video-editor/dialogue-tools.d.ts +19 -0
  105. package/dist/video-editor/effect-authoring.d.cts +54 -0
  106. package/dist/video-editor/effect-authoring.d.ts +54 -0
  107. package/dist/video-editor/evaluate.d.cts +11 -0
  108. package/dist/video-editor/evaluate.d.ts +11 -0
  109. package/dist/video-editor/export.d.cts +7 -1
  110. package/dist/video-editor/export.d.ts +7 -1
  111. package/dist/video-editor/index.cjs +1857 -531
  112. package/dist/video-editor/index.d.cts +7 -0
  113. package/dist/video-editor/index.d.ts +7 -0
  114. package/dist/video-editor/index.js +1516 -190
  115. package/dist/video-editor/lut.d.cts +12 -2
  116. package/dist/video-editor/lut.d.ts +12 -2
  117. package/dist/video-editor/mask.d.cts +48 -0
  118. package/dist/video-editor/mask.d.ts +48 -0
  119. package/dist/video-editor/mix.d.cts +107 -0
  120. package/dist/video-editor/mix.d.ts +107 -0
  121. package/dist/video-editor/music-tools.d.cts +19 -0
  122. package/dist/video-editor/music-tools.d.ts +19 -0
  123. package/dist/video-editor/parse.d.cts +3 -1
  124. package/dist/video-editor/parse.d.ts +3 -1
  125. package/dist/video-editor/plan.d.cts +75 -0
  126. package/dist/video-editor/plan.d.ts +75 -0
  127. package/dist/video-editor/render.d.cts +1 -1
  128. package/dist/video-editor/render.d.ts +1 -1
  129. package/dist/video-editor/timeline.d.cts +2 -0
  130. package/dist/video-editor/timeline.d.ts +2 -0
  131. package/dist/video-editor/tools.d.cts +90 -0
  132. package/dist/video-editor/tools.d.ts +90 -0
  133. package/dist/video-editor/transcript-controller.d.cts +106 -0
  134. package/dist/video-editor/transcript-controller.d.ts +106 -0
  135. package/dist/video-editor/transcript.d.cts +40 -0
  136. package/dist/video-editor/transcript.d.ts +40 -0
  137. package/dist/video-editor/types.d.cts +62 -2
  138. package/dist/video-editor/types.d.ts +62 -2
  139. package/dist/video-editor/ui.d.cts +21 -1
  140. package/dist/video-editor/ui.d.ts +21 -1
  141. package/package.json +11 -1
  142. package/skills/README.md +3 -0
  143. package/skills/pixerate-bgm-alignment/SKILL.md +82 -0
  144. package/skills/pixerate-talking-head-edit/SKILL.md +80 -0
  145. package/skills/pixerate-typography/SKILL.md +91 -0
  146. package/skills/pixerate-video-editor/SKILL.md +40 -2
@@ -68,6 +68,7 @@ export declare function describeVideoSequence(project: VideoProject, sequence: V
68
68
  fadeOut?: number;
69
69
  transition?: import("./types.cjs").VideoTransition;
70
70
  effects?: import("./types.cjs").VideoClipEffect[];
71
+ mask?: import("./types.cjs").VideoClipMask;
71
72
  } | {
72
73
  source?: {
73
74
  in: number;
@@ -96,6 +97,7 @@ export declare function describeVideoSequence(project: VideoProject, sequence: V
96
97
  fadeOut?: number;
97
98
  transition?: import("./types.cjs").VideoTransition;
98
99
  effects?: import("./types.cjs").VideoClipEffect[];
100
+ mask?: import("./types.cjs").VideoClipMask;
99
101
  } | {
100
102
  source?: {
101
103
  in: number;
@@ -119,6 +121,7 @@ export declare function describeVideoSequence(project: VideoProject, sequence: V
119
121
  fadeOut?: number;
120
122
  transition?: import("./types.cjs").VideoTransition;
121
123
  effects?: import("./types.cjs").VideoClipEffect[];
124
+ mask?: import("./types.cjs").VideoClipMask;
122
125
  } | {
123
126
  source?: {
124
127
  in: number;
@@ -147,6 +150,7 @@ export declare function describeVideoSequence(project: VideoProject, sequence: V
147
150
  fadeOut?: number;
148
151
  transition?: import("./types.cjs").VideoTransition;
149
152
  effects?: import("./types.cjs").VideoClipEffect[];
153
+ mask?: import("./types.cjs").VideoClipMask;
150
154
  } | {
151
155
  source?: {
152
156
  in: number;
@@ -169,9 +173,35 @@ export declare function describeVideoSequence(project: VideoProject, sequence: V
169
173
  fadeOut?: number;
170
174
  transition?: import("./types.cjs").VideoTransition;
171
175
  effects?: import("./types.cjs").VideoClipEffect[];
176
+ mask?: import("./types.cjs").VideoClipMask;
172
177
  effect: string;
173
178
  provider?: string;
174
179
  values?: import("./types.cjs").VideoEffectValues;
180
+ } | {
181
+ source?: {
182
+ in: number;
183
+ out: number;
184
+ } | null | undefined;
185
+ end: number;
186
+ type: "adjustment";
187
+ scope?: import("./types.cjs").VideoAdjustmentScope;
188
+ targetTrack?: string;
189
+ id: string;
190
+ name?: string;
191
+ start: number;
192
+ duration: number;
193
+ opacity?: VideoAnimatable;
194
+ transform?: import("./types.cjs").VideoTransform;
195
+ fit?: import("./types.cjs").VideoFit;
196
+ blend?: import("./types.cjs").VideoBlendMode;
197
+ grade?: import("./types.cjs").VideoGrade;
198
+ animateIn?: import("./types.cjs").VideoClipAnimation;
199
+ animateOut?: import("./types.cjs").VideoClipAnimation;
200
+ fadeIn?: number;
201
+ fadeOut?: number;
202
+ transition?: import("./types.cjs").VideoTransition;
203
+ effects?: import("./types.cjs").VideoClipEffect[];
204
+ mask?: import("./types.cjs").VideoClipMask;
175
205
  })[];
176
206
  volume?: number | undefined;
177
207
  syncLocked?: boolean | undefined;
@@ -255,6 +285,7 @@ export declare function describeVideoProject(project: VideoProject): {
255
285
  fadeOut?: number;
256
286
  transition?: import("./types.cjs").VideoTransition;
257
287
  effects?: import("./types.cjs").VideoClipEffect[];
288
+ mask?: import("./types.cjs").VideoClipMask;
258
289
  } | {
259
290
  source?: {
260
291
  in: number;
@@ -283,6 +314,7 @@ export declare function describeVideoProject(project: VideoProject): {
283
314
  fadeOut?: number;
284
315
  transition?: import("./types.cjs").VideoTransition;
285
316
  effects?: import("./types.cjs").VideoClipEffect[];
317
+ mask?: import("./types.cjs").VideoClipMask;
286
318
  } | {
287
319
  source?: {
288
320
  in: number;
@@ -306,6 +338,7 @@ export declare function describeVideoProject(project: VideoProject): {
306
338
  fadeOut?: number;
307
339
  transition?: import("./types.cjs").VideoTransition;
308
340
  effects?: import("./types.cjs").VideoClipEffect[];
341
+ mask?: import("./types.cjs").VideoClipMask;
309
342
  } | {
310
343
  source?: {
311
344
  in: number;
@@ -334,6 +367,7 @@ export declare function describeVideoProject(project: VideoProject): {
334
367
  fadeOut?: number;
335
368
  transition?: import("./types.cjs").VideoTransition;
336
369
  effects?: import("./types.cjs").VideoClipEffect[];
370
+ mask?: import("./types.cjs").VideoClipMask;
337
371
  } | {
338
372
  source?: {
339
373
  in: number;
@@ -356,9 +390,35 @@ export declare function describeVideoProject(project: VideoProject): {
356
390
  fadeOut?: number;
357
391
  transition?: import("./types.cjs").VideoTransition;
358
392
  effects?: import("./types.cjs").VideoClipEffect[];
393
+ mask?: import("./types.cjs").VideoClipMask;
359
394
  effect: string;
360
395
  provider?: string;
361
396
  values?: import("./types.cjs").VideoEffectValues;
397
+ } | {
398
+ source?: {
399
+ in: number;
400
+ out: number;
401
+ } | null | undefined;
402
+ end: number;
403
+ type: "adjustment";
404
+ scope?: import("./types.cjs").VideoAdjustmentScope;
405
+ targetTrack?: string;
406
+ id: string;
407
+ name?: string;
408
+ start: number;
409
+ duration: number;
410
+ opacity?: VideoAnimatable;
411
+ transform?: import("./types.cjs").VideoTransform;
412
+ fit?: import("./types.cjs").VideoFit;
413
+ blend?: import("./types.cjs").VideoBlendMode;
414
+ grade?: import("./types.cjs").VideoGrade;
415
+ animateIn?: import("./types.cjs").VideoClipAnimation;
416
+ animateOut?: import("./types.cjs").VideoClipAnimation;
417
+ fadeIn?: number;
418
+ fadeOut?: number;
419
+ transition?: import("./types.cjs").VideoTransition;
420
+ effects?: import("./types.cjs").VideoClipEffect[];
421
+ mask?: import("./types.cjs").VideoClipMask;
362
422
  })[];
363
423
  volume?: number | undefined;
364
424
  syncLocked?: boolean | undefined;
@@ -462,6 +522,7 @@ export declare function describeVideoProject(project: VideoProject): {
462
522
  fadeOut?: number;
463
523
  transition?: import("./types.cjs").VideoTransition;
464
524
  effects?: import("./types.cjs").VideoClipEffect[];
525
+ mask?: import("./types.cjs").VideoClipMask;
465
526
  } | {
466
527
  source?: {
467
528
  in: number;
@@ -490,6 +551,7 @@ export declare function describeVideoProject(project: VideoProject): {
490
551
  fadeOut?: number;
491
552
  transition?: import("./types.cjs").VideoTransition;
492
553
  effects?: import("./types.cjs").VideoClipEffect[];
554
+ mask?: import("./types.cjs").VideoClipMask;
493
555
  } | {
494
556
  source?: {
495
557
  in: number;
@@ -513,6 +575,7 @@ export declare function describeVideoProject(project: VideoProject): {
513
575
  fadeOut?: number;
514
576
  transition?: import("./types.cjs").VideoTransition;
515
577
  effects?: import("./types.cjs").VideoClipEffect[];
578
+ mask?: import("./types.cjs").VideoClipMask;
516
579
  } | {
517
580
  source?: {
518
581
  in: number;
@@ -541,6 +604,7 @@ export declare function describeVideoProject(project: VideoProject): {
541
604
  fadeOut?: number;
542
605
  transition?: import("./types.cjs").VideoTransition;
543
606
  effects?: import("./types.cjs").VideoClipEffect[];
607
+ mask?: import("./types.cjs").VideoClipMask;
544
608
  } | {
545
609
  source?: {
546
610
  in: number;
@@ -563,9 +627,35 @@ export declare function describeVideoProject(project: VideoProject): {
563
627
  fadeOut?: number;
564
628
  transition?: import("./types.cjs").VideoTransition;
565
629
  effects?: import("./types.cjs").VideoClipEffect[];
630
+ mask?: import("./types.cjs").VideoClipMask;
566
631
  effect: string;
567
632
  provider?: string;
568
633
  values?: import("./types.cjs").VideoEffectValues;
634
+ } | {
635
+ source?: {
636
+ in: number;
637
+ out: number;
638
+ } | null | undefined;
639
+ end: number;
640
+ type: "adjustment";
641
+ scope?: import("./types.cjs").VideoAdjustmentScope;
642
+ targetTrack?: string;
643
+ id: string;
644
+ name?: string;
645
+ start: number;
646
+ duration: number;
647
+ opacity?: VideoAnimatable;
648
+ transform?: import("./types.cjs").VideoTransform;
649
+ fit?: import("./types.cjs").VideoFit;
650
+ blend?: import("./types.cjs").VideoBlendMode;
651
+ grade?: import("./types.cjs").VideoGrade;
652
+ animateIn?: import("./types.cjs").VideoClipAnimation;
653
+ animateOut?: import("./types.cjs").VideoClipAnimation;
654
+ fadeIn?: number;
655
+ fadeOut?: number;
656
+ transition?: import("./types.cjs").VideoTransition;
657
+ effects?: import("./types.cjs").VideoClipEffect[];
658
+ mask?: import("./types.cjs").VideoClipMask;
569
659
  })[];
570
660
  volume?: number | undefined;
571
661
  syncLocked?: boolean | undefined;
@@ -68,6 +68,7 @@ export declare function describeVideoSequence(project: VideoProject, sequence: V
68
68
  fadeOut?: number;
69
69
  transition?: import("./types.js").VideoTransition;
70
70
  effects?: import("./types.js").VideoClipEffect[];
71
+ mask?: import("./types.js").VideoClipMask;
71
72
  } | {
72
73
  source?: {
73
74
  in: number;
@@ -96,6 +97,7 @@ export declare function describeVideoSequence(project: VideoProject, sequence: V
96
97
  fadeOut?: number;
97
98
  transition?: import("./types.js").VideoTransition;
98
99
  effects?: import("./types.js").VideoClipEffect[];
100
+ mask?: import("./types.js").VideoClipMask;
99
101
  } | {
100
102
  source?: {
101
103
  in: number;
@@ -119,6 +121,7 @@ export declare function describeVideoSequence(project: VideoProject, sequence: V
119
121
  fadeOut?: number;
120
122
  transition?: import("./types.js").VideoTransition;
121
123
  effects?: import("./types.js").VideoClipEffect[];
124
+ mask?: import("./types.js").VideoClipMask;
122
125
  } | {
123
126
  source?: {
124
127
  in: number;
@@ -147,6 +150,7 @@ export declare function describeVideoSequence(project: VideoProject, sequence: V
147
150
  fadeOut?: number;
148
151
  transition?: import("./types.js").VideoTransition;
149
152
  effects?: import("./types.js").VideoClipEffect[];
153
+ mask?: import("./types.js").VideoClipMask;
150
154
  } | {
151
155
  source?: {
152
156
  in: number;
@@ -169,9 +173,35 @@ export declare function describeVideoSequence(project: VideoProject, sequence: V
169
173
  fadeOut?: number;
170
174
  transition?: import("./types.js").VideoTransition;
171
175
  effects?: import("./types.js").VideoClipEffect[];
176
+ mask?: import("./types.js").VideoClipMask;
172
177
  effect: string;
173
178
  provider?: string;
174
179
  values?: import("./types.js").VideoEffectValues;
180
+ } | {
181
+ source?: {
182
+ in: number;
183
+ out: number;
184
+ } | null | undefined;
185
+ end: number;
186
+ type: "adjustment";
187
+ scope?: import("./types.js").VideoAdjustmentScope;
188
+ targetTrack?: string;
189
+ id: string;
190
+ name?: string;
191
+ start: number;
192
+ duration: number;
193
+ opacity?: VideoAnimatable;
194
+ transform?: import("./types.js").VideoTransform;
195
+ fit?: import("./types.js").VideoFit;
196
+ blend?: import("./types.js").VideoBlendMode;
197
+ grade?: import("./types.js").VideoGrade;
198
+ animateIn?: import("./types.js").VideoClipAnimation;
199
+ animateOut?: import("./types.js").VideoClipAnimation;
200
+ fadeIn?: number;
201
+ fadeOut?: number;
202
+ transition?: import("./types.js").VideoTransition;
203
+ effects?: import("./types.js").VideoClipEffect[];
204
+ mask?: import("./types.js").VideoClipMask;
175
205
  })[];
176
206
  volume?: number | undefined;
177
207
  syncLocked?: boolean | undefined;
@@ -255,6 +285,7 @@ export declare function describeVideoProject(project: VideoProject): {
255
285
  fadeOut?: number;
256
286
  transition?: import("./types.js").VideoTransition;
257
287
  effects?: import("./types.js").VideoClipEffect[];
288
+ mask?: import("./types.js").VideoClipMask;
258
289
  } | {
259
290
  source?: {
260
291
  in: number;
@@ -283,6 +314,7 @@ export declare function describeVideoProject(project: VideoProject): {
283
314
  fadeOut?: number;
284
315
  transition?: import("./types.js").VideoTransition;
285
316
  effects?: import("./types.js").VideoClipEffect[];
317
+ mask?: import("./types.js").VideoClipMask;
286
318
  } | {
287
319
  source?: {
288
320
  in: number;
@@ -306,6 +338,7 @@ export declare function describeVideoProject(project: VideoProject): {
306
338
  fadeOut?: number;
307
339
  transition?: import("./types.js").VideoTransition;
308
340
  effects?: import("./types.js").VideoClipEffect[];
341
+ mask?: import("./types.js").VideoClipMask;
309
342
  } | {
310
343
  source?: {
311
344
  in: number;
@@ -334,6 +367,7 @@ export declare function describeVideoProject(project: VideoProject): {
334
367
  fadeOut?: number;
335
368
  transition?: import("./types.js").VideoTransition;
336
369
  effects?: import("./types.js").VideoClipEffect[];
370
+ mask?: import("./types.js").VideoClipMask;
337
371
  } | {
338
372
  source?: {
339
373
  in: number;
@@ -356,9 +390,35 @@ export declare function describeVideoProject(project: VideoProject): {
356
390
  fadeOut?: number;
357
391
  transition?: import("./types.js").VideoTransition;
358
392
  effects?: import("./types.js").VideoClipEffect[];
393
+ mask?: import("./types.js").VideoClipMask;
359
394
  effect: string;
360
395
  provider?: string;
361
396
  values?: import("./types.js").VideoEffectValues;
397
+ } | {
398
+ source?: {
399
+ in: number;
400
+ out: number;
401
+ } | null | undefined;
402
+ end: number;
403
+ type: "adjustment";
404
+ scope?: import("./types.js").VideoAdjustmentScope;
405
+ targetTrack?: string;
406
+ id: string;
407
+ name?: string;
408
+ start: number;
409
+ duration: number;
410
+ opacity?: VideoAnimatable;
411
+ transform?: import("./types.js").VideoTransform;
412
+ fit?: import("./types.js").VideoFit;
413
+ blend?: import("./types.js").VideoBlendMode;
414
+ grade?: import("./types.js").VideoGrade;
415
+ animateIn?: import("./types.js").VideoClipAnimation;
416
+ animateOut?: import("./types.js").VideoClipAnimation;
417
+ fadeIn?: number;
418
+ fadeOut?: number;
419
+ transition?: import("./types.js").VideoTransition;
420
+ effects?: import("./types.js").VideoClipEffect[];
421
+ mask?: import("./types.js").VideoClipMask;
362
422
  })[];
363
423
  volume?: number | undefined;
364
424
  syncLocked?: boolean | undefined;
@@ -462,6 +522,7 @@ export declare function describeVideoProject(project: VideoProject): {
462
522
  fadeOut?: number;
463
523
  transition?: import("./types.js").VideoTransition;
464
524
  effects?: import("./types.js").VideoClipEffect[];
525
+ mask?: import("./types.js").VideoClipMask;
465
526
  } | {
466
527
  source?: {
467
528
  in: number;
@@ -490,6 +551,7 @@ export declare function describeVideoProject(project: VideoProject): {
490
551
  fadeOut?: number;
491
552
  transition?: import("./types.js").VideoTransition;
492
553
  effects?: import("./types.js").VideoClipEffect[];
554
+ mask?: import("./types.js").VideoClipMask;
493
555
  } | {
494
556
  source?: {
495
557
  in: number;
@@ -513,6 +575,7 @@ export declare function describeVideoProject(project: VideoProject): {
513
575
  fadeOut?: number;
514
576
  transition?: import("./types.js").VideoTransition;
515
577
  effects?: import("./types.js").VideoClipEffect[];
578
+ mask?: import("./types.js").VideoClipMask;
516
579
  } | {
517
580
  source?: {
518
581
  in: number;
@@ -541,6 +604,7 @@ export declare function describeVideoProject(project: VideoProject): {
541
604
  fadeOut?: number;
542
605
  transition?: import("./types.js").VideoTransition;
543
606
  effects?: import("./types.js").VideoClipEffect[];
607
+ mask?: import("./types.js").VideoClipMask;
544
608
  } | {
545
609
  source?: {
546
610
  in: number;
@@ -563,9 +627,35 @@ export declare function describeVideoProject(project: VideoProject): {
563
627
  fadeOut?: number;
564
628
  transition?: import("./types.js").VideoTransition;
565
629
  effects?: import("./types.js").VideoClipEffect[];
630
+ mask?: import("./types.js").VideoClipMask;
566
631
  effect: string;
567
632
  provider?: string;
568
633
  values?: import("./types.js").VideoEffectValues;
634
+ } | {
635
+ source?: {
636
+ in: number;
637
+ out: number;
638
+ } | null | undefined;
639
+ end: number;
640
+ type: "adjustment";
641
+ scope?: import("./types.js").VideoAdjustmentScope;
642
+ targetTrack?: string;
643
+ id: string;
644
+ name?: string;
645
+ start: number;
646
+ duration: number;
647
+ opacity?: VideoAnimatable;
648
+ transform?: import("./types.js").VideoTransform;
649
+ fit?: import("./types.js").VideoFit;
650
+ blend?: import("./types.js").VideoBlendMode;
651
+ grade?: import("./types.js").VideoGrade;
652
+ animateIn?: import("./types.js").VideoClipAnimation;
653
+ animateOut?: import("./types.js").VideoClipAnimation;
654
+ fadeIn?: number;
655
+ fadeOut?: number;
656
+ transition?: import("./types.js").VideoTransition;
657
+ effects?: import("./types.js").VideoClipEffect[];
658
+ mask?: import("./types.js").VideoClipMask;
569
659
  })[];
570
660
  volume?: number | undefined;
571
661
  syncLocked?: boolean | undefined;
@@ -0,0 +1,106 @@
1
+ import type { VideoEditorController } from './controller.cjs';
2
+ import type { VideoEditResult } from './edit.cjs';
3
+ import type { VideoEditPlan } from './plan.cjs';
4
+ import { type VideoDisfluency, type VideoDisfluencyKind, type VideoDisfluencyOptions, type VideoTimelineWord } from './transcript.cjs';
5
+ /** A snapshot of a transcript editor. The same object is returned until something changes. */
6
+ export interface TranscriptVideoState {
7
+ /** The track whose words are shown, or `null` when nothing is transcribed. */
8
+ track: string | null;
9
+ /** The words the timeline plays on that track, in order. */
10
+ words: readonly VideoTimelineWord[];
11
+ /** The words joined with single spaces: what `textOffset` and `timeAtOffset` count in. */
12
+ text: string;
13
+ /** Index of the word under the playhead, or -1. */
14
+ current: number;
15
+ /** Selected words, first and last index (inclusive), or `null`. */
16
+ selection: readonly [number, number] | null;
17
+ /** Fillers, pauses and stutters found in the words (see `detectVideoDisfluencies`). */
18
+ disfluencies: readonly VideoDisfluency[];
19
+ /** For each word index, the kinds of disfluency it is part of (absent when none). */
20
+ flags: Readonly<Record<number, readonly VideoDisfluencyKind[]>>;
21
+ /** Whether text edits may change the timeline (false while the project is read-only). */
22
+ editable: boolean;
23
+ /** Why the last action was refused, if it was. */
24
+ error: string | null;
25
+ }
26
+ export interface TranscriptVideoOptions {
27
+ /** Track whose words to follow (default: the first audio track with a transcribed clip, else the first video track with one). */
28
+ track?: string;
29
+ /** How disfluencies are found (see `detectVideoDisfluencies`). */
30
+ disfluencies?: VideoDisfluencyOptions;
31
+ /**
32
+ * Deleting words proposes a plan for review instead of cutting at once (default false). Cleanup
33
+ * (`planCleanup`) always proposes one.
34
+ */
35
+ planFirst?: boolean;
36
+ }
37
+ /** What deleting or cleaning up did: the cut it applied, or the plan it proposed. */
38
+ export type TranscriptVideoResult = {
39
+ ok: true;
40
+ applied: VideoEditResult & {
41
+ ok: true;
42
+ };
43
+ plan?: undefined;
44
+ } | {
45
+ ok: true;
46
+ plan: VideoEditPlan;
47
+ applied?: undefined;
48
+ } | {
49
+ ok: false;
50
+ error: string;
51
+ };
52
+ /**
53
+ * Edit video by its words: a transcript view model over a `VideoEditorController`. It keeps the
54
+ * words the timeline plays (from the media's transcripts), the word under the playhead, a word
55
+ * selection and the disfluencies found, and turns text actions into timeline edits both ways:
56
+ * clicking a word seeks there, playing highlights the word, deleting words cuts that stretch out on
57
+ * every sync-locked track, and cleanup proposes one plan for every filler, pause and stutter. Each
58
+ * cut is one undo step. Framework bindings render it; agents use the same functions through tools.
59
+ */
60
+ export declare class TranscriptVideoController {
61
+ readonly controller: VideoEditorController;
62
+ private readonly options;
63
+ private readonly listeners;
64
+ private unsubscribe;
65
+ private track;
66
+ private selection;
67
+ private error;
68
+ private state;
69
+ /** Words and disfluencies are worked out once per project. */
70
+ private cache;
71
+ constructor(controller: VideoEditorController, options?: TranscriptVideoOptions);
72
+ getState: () => TranscriptVideoState;
73
+ private connect;
74
+ /** Listens for changes. Subscribing after `destroy` follows the editor again (React StrictMode remounts). */
75
+ subscribe: (listener: (state: TranscriptVideoState) => void) => (() => void);
76
+ /** Stops following the editor. */
77
+ destroy(): void;
78
+ private words;
79
+ private compute;
80
+ private refresh;
81
+ /** Follows another track's words (`undefined`: the default track). */
82
+ setTrack(track: string | undefined): void;
83
+ /** Moves the playhead to the start of a word. */
84
+ seekToWord(index: number): void;
85
+ /** Selects words `a` to `b` (either order), or clears the selection with `null`. */
86
+ select(a: number | null, b?: number | null): void;
87
+ /** Index of the word playing at a timeline time, or -1. */
88
+ wordAt(time: number): number;
89
+ /** Where word `index` begins in `text` (characters). */
90
+ textOffset(index: number): number;
91
+ /** The word a caret at `offset` characters into `text` is in (or just after), as an index; -1 when there are no words. */
92
+ wordAtOffset(offset: number): number;
93
+ /** The timeline time a caret at `offset` characters into `text` stands for: the start of its word. */
94
+ timeAtOffset(offset: number): number | null;
95
+ private fail;
96
+ /** Cuts ranges out (or proposes a plan to, with `plan`), as one undo step. */
97
+ private cut;
98
+ /** Deletes the selected words, cutting their stretch out of the timeline (or proposing it with `planFirst`). */
99
+ deleteSelection(options?: {
100
+ plan?: boolean;
101
+ }): TranscriptVideoResult;
102
+ /** Cuts one disfluency out at once (its index in `disfluencies`), as one undo step. */
103
+ removeDisfluency(index: number): TranscriptVideoResult;
104
+ /** Proposes one plan that cuts every disfluency of the given kinds (default all), for review. */
105
+ planCleanup(kinds?: readonly VideoDisfluencyKind[]): TranscriptVideoResult;
106
+ }
@@ -0,0 +1,106 @@
1
+ import type { VideoEditorController } from './controller.js';
2
+ import type { VideoEditResult } from './edit.js';
3
+ import type { VideoEditPlan } from './plan.js';
4
+ import { type VideoDisfluency, type VideoDisfluencyKind, type VideoDisfluencyOptions, type VideoTimelineWord } from './transcript.js';
5
+ /** A snapshot of a transcript editor. The same object is returned until something changes. */
6
+ export interface TranscriptVideoState {
7
+ /** The track whose words are shown, or `null` when nothing is transcribed. */
8
+ track: string | null;
9
+ /** The words the timeline plays on that track, in order. */
10
+ words: readonly VideoTimelineWord[];
11
+ /** The words joined with single spaces: what `textOffset` and `timeAtOffset` count in. */
12
+ text: string;
13
+ /** Index of the word under the playhead, or -1. */
14
+ current: number;
15
+ /** Selected words, first and last index (inclusive), or `null`. */
16
+ selection: readonly [number, number] | null;
17
+ /** Fillers, pauses and stutters found in the words (see `detectVideoDisfluencies`). */
18
+ disfluencies: readonly VideoDisfluency[];
19
+ /** For each word index, the kinds of disfluency it is part of (absent when none). */
20
+ flags: Readonly<Record<number, readonly VideoDisfluencyKind[]>>;
21
+ /** Whether text edits may change the timeline (false while the project is read-only). */
22
+ editable: boolean;
23
+ /** Why the last action was refused, if it was. */
24
+ error: string | null;
25
+ }
26
+ export interface TranscriptVideoOptions {
27
+ /** Track whose words to follow (default: the first audio track with a transcribed clip, else the first video track with one). */
28
+ track?: string;
29
+ /** How disfluencies are found (see `detectVideoDisfluencies`). */
30
+ disfluencies?: VideoDisfluencyOptions;
31
+ /**
32
+ * Deleting words proposes a plan for review instead of cutting at once (default false). Cleanup
33
+ * (`planCleanup`) always proposes one.
34
+ */
35
+ planFirst?: boolean;
36
+ }
37
+ /** What deleting or cleaning up did: the cut it applied, or the plan it proposed. */
38
+ export type TranscriptVideoResult = {
39
+ ok: true;
40
+ applied: VideoEditResult & {
41
+ ok: true;
42
+ };
43
+ plan?: undefined;
44
+ } | {
45
+ ok: true;
46
+ plan: VideoEditPlan;
47
+ applied?: undefined;
48
+ } | {
49
+ ok: false;
50
+ error: string;
51
+ };
52
+ /**
53
+ * Edit video by its words: a transcript view model over a `VideoEditorController`. It keeps the
54
+ * words the timeline plays (from the media's transcripts), the word under the playhead, a word
55
+ * selection and the disfluencies found, and turns text actions into timeline edits both ways:
56
+ * clicking a word seeks there, playing highlights the word, deleting words cuts that stretch out on
57
+ * every sync-locked track, and cleanup proposes one plan for every filler, pause and stutter. Each
58
+ * cut is one undo step. Framework bindings render it; agents use the same functions through tools.
59
+ */
60
+ export declare class TranscriptVideoController {
61
+ readonly controller: VideoEditorController;
62
+ private readonly options;
63
+ private readonly listeners;
64
+ private unsubscribe;
65
+ private track;
66
+ private selection;
67
+ private error;
68
+ private state;
69
+ /** Words and disfluencies are worked out once per project. */
70
+ private cache;
71
+ constructor(controller: VideoEditorController, options?: TranscriptVideoOptions);
72
+ getState: () => TranscriptVideoState;
73
+ private connect;
74
+ /** Listens for changes. Subscribing after `destroy` follows the editor again (React StrictMode remounts). */
75
+ subscribe: (listener: (state: TranscriptVideoState) => void) => (() => void);
76
+ /** Stops following the editor. */
77
+ destroy(): void;
78
+ private words;
79
+ private compute;
80
+ private refresh;
81
+ /** Follows another track's words (`undefined`: the default track). */
82
+ setTrack(track: string | undefined): void;
83
+ /** Moves the playhead to the start of a word. */
84
+ seekToWord(index: number): void;
85
+ /** Selects words `a` to `b` (either order), or clears the selection with `null`. */
86
+ select(a: number | null, b?: number | null): void;
87
+ /** Index of the word playing at a timeline time, or -1. */
88
+ wordAt(time: number): number;
89
+ /** Where word `index` begins in `text` (characters). */
90
+ textOffset(index: number): number;
91
+ /** The word a caret at `offset` characters into `text` is in (or just after), as an index; -1 when there are no words. */
92
+ wordAtOffset(offset: number): number;
93
+ /** The timeline time a caret at `offset` characters into `text` stands for: the start of its word. */
94
+ timeAtOffset(offset: number): number | null;
95
+ private fail;
96
+ /** Cuts ranges out (or proposes a plan to, with `plan`), as one undo step. */
97
+ private cut;
98
+ /** Deletes the selected words, cutting their stretch out of the timeline (or proposing it with `planFirst`). */
99
+ deleteSelection(options?: {
100
+ plan?: boolean;
101
+ }): TranscriptVideoResult;
102
+ /** Cuts one disfluency out at once (its index in `disfluencies`), as one undo step. */
103
+ removeDisfluency(index: number): TranscriptVideoResult;
104
+ /** Proposes one plan that cuts every disfluency of the given kinds (default all), for review. */
105
+ planCleanup(kinds?: readonly VideoDisfluencyKind[]): TranscriptVideoResult;
106
+ }
@@ -85,3 +85,43 @@ export declare function videoWordsRange(words: readonly VideoTimelineWord[], a:
85
85
  export declare function videoTranscriptEdit(assetId: string, text: string): VideoEdit;
86
86
  /** The word playing at a timeline time, as its index in `words`, or -1. */
87
87
  export declare function videoWordAt(words: readonly VideoTimelineWord[], time: number): number;
88
+ export interface VideoRepetitionOptions {
89
+ /** Longest phrase to look for repeated (words, default 3). */
90
+ maxPhrase?: number;
91
+ /** Longest gap between a phrase and its repeat that still counts as a stutter (ms, default 1000). */
92
+ maxGap?: number;
93
+ }
94
+ /**
95
+ * Words said twice in a row ("I I think", "we should we should"), as timeline ranges covering the
96
+ * first saying and the gap up to the repeat, so cutting them leaves the phrase said once. Longer
97
+ * phrases are tried first; "I I I" gives two ranges. Some repeats are meant ("very very"): check them.
98
+ */
99
+ export declare function findVideoRepetitions(words: readonly VideoTimelineWord[], options?: VideoRepetitionOptions): VideoTranscriptRange[];
100
+ export type VideoDisfluencyKind = 'filler' | 'pause' | 'repetition';
101
+ export declare const VIDEO_DISFLUENCY_KINDS: readonly ["filler", "pause", "repetition"];
102
+ /** Something to tidy out of speech: where it is (timeline ms), what kind and what was said. */
103
+ export interface VideoDisfluency extends VideoTranscriptRange {
104
+ kind: VideoDisfluencyKind;
105
+ /** Indexes in the word list of the first and last word it covers (for a pause: the words either side). */
106
+ words: [number, number];
107
+ }
108
+ export interface VideoDisfluencyOptions {
109
+ /** Which kinds to look for (default all). */
110
+ kinds?: readonly VideoDisfluencyKind[];
111
+ /** Filler words and phrases (default `VIDEO_DEFAULT_FILLERS`). */
112
+ fillers?: readonly string[];
113
+ /** How pauses are measured (default: over 700 ms, keeping 150 ms of breath either side). */
114
+ pauses?: VideoPauseOptions;
115
+ repetitions?: VideoRepetitionOptions;
116
+ }
117
+ /**
118
+ * Fillers, long pauses and stutters in one pass, in time order, each with the words it covers, so
119
+ * a transcript can mark them and an agent can review them before cutting. Overlapping finds are
120
+ * all kept (a filler inside a repetition): `mergeVideoRanges` joins them when they are cut.
121
+ */
122
+ export declare function detectVideoDisfluencies(words: readonly VideoTimelineWord[], options?: VideoDisfluencyOptions): VideoDisfluency[];
123
+ /** Cut ranges shrunk by `keep` ms at each end, so a little breath stays either side; ranges that vanish are dropped. */
124
+ export declare function videoCutsWithMargin<T extends {
125
+ from: number;
126
+ to: number;
127
+ }>(ranges: readonly T[], keep: number): T[];