@pixerate/editor 0.140.4 → 0.142.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/agent/canvasPlayback.d.cts +15 -0
  2. package/dist/agent/canvasPlayback.d.ts +15 -0
  3. package/dist/agent/index.cjs +173 -33
  4. package/dist/agent/index.d.cts +1 -0
  5. package/dist/agent/index.d.ts +1 -0
  6. package/dist/agent/index.js +147 -7
  7. package/dist/agent/providers.d.cts +12 -1
  8. package/dist/agent/providers.d.ts +12 -1
  9. package/dist/agent/types.d.cts +3 -0
  10. package/dist/agent/types.d.ts +3 -0
  11. package/dist/animation/index.cjs +2 -2
  12. package/dist/animation/index.js +1 -1
  13. package/dist/animation/presence.d.cts +1 -75
  14. package/dist/animation/presence.d.ts +1 -75
  15. package/dist/animation-editor/index.cjs +69 -19
  16. package/dist/animation-editor/index.d.cts +1 -0
  17. package/dist/animation-editor/index.d.ts +1 -0
  18. package/dist/animation-editor/index.js +54 -4
  19. package/dist/animation-editor/playback.d.cts +10 -0
  20. package/dist/animation-editor/playback.d.ts +10 -0
  21. package/dist/bridge/cli.cjs +3 -3
  22. package/dist/bridge/cli.js +2 -2
  23. package/dist/bridge/index.cjs +3 -3
  24. package/dist/bridge/index.js +2 -2
  25. package/dist/canvas/index.cjs +336 -646
  26. package/dist/canvas/index.d.cts +1 -0
  27. package/dist/canvas/index.d.ts +1 -0
  28. package/dist/canvas/index.js +44 -354
  29. package/dist/canvas/playback.d.cts +14 -0
  30. package/dist/canvas/playback.d.ts +14 -0
  31. package/dist/chart/index.cjs +255 -171
  32. package/dist/chart/index.d.cts +1 -0
  33. package/dist/chart/index.d.ts +1 -0
  34. package/dist/chart/index.js +244 -160
  35. package/dist/chart/playback.d.cts +22 -0
  36. package/dist/chart/playback.d.ts +22 -0
  37. package/dist/chunk-54GVEVXS.js +408 -0
  38. package/dist/{chunk-E747F3D5.js → chunk-CC6WKVIH.js} +86 -5
  39. package/dist/chunk-DW4CV5H4.js +591 -0
  40. package/dist/{chunk-UMS6YFA6.js → chunk-EAQ4BGNS.js} +1 -1
  41. package/dist/{chunk-AGCD3EHB.cjs → chunk-ENIZYNEF.cjs} +7 -7
  42. package/dist/{chunk-BSGPXPTW.js → chunk-PEEP2YR7.js} +1 -1
  43. package/dist/{chunk-VTY64I6H.cjs → chunk-QSM3MDDJ.cjs} +85 -85
  44. package/dist/{chunk-2RUNJYOX.cjs → chunk-QZFEX2N4.cjs} +86 -5
  45. package/dist/{chunk-RB62U6MS.js → chunk-RFBFTLVN.js} +27 -5
  46. package/dist/chunk-UBRYHNRU.cjs +591 -0
  47. package/dist/{chunk-GEY73RUW.cjs → chunk-UJGAA6AK.cjs} +1 -1
  48. package/dist/{chunk-LMSFXRAJ.js → chunk-VGJTUCWM.js} +1 -1
  49. package/dist/chunk-X2HQP7DF.cjs +408 -0
  50. package/dist/chunk-XH32BATE.cjs +68 -0
  51. package/dist/{chunk-HDK3T2QS.cjs → chunk-Y4BWZB6J.cjs} +29 -7
  52. package/dist/chunk-Y6SGC6KO.js +68 -0
  53. package/dist/commands/index.cjs +37 -1
  54. package/dist/commands/index.js +36 -0
  55. package/dist/commands/registry.d.cts +11 -0
  56. package/dist/commands/registry.d.ts +11 -0
  57. package/dist/diagram/index.cjs +7 -7
  58. package/dist/diagram/index.js +1 -1
  59. package/dist/image-editor/index.cjs +108 -16
  60. package/dist/image-editor/index.d.cts +1 -0
  61. package/dist/image-editor/index.d.ts +1 -0
  62. package/dist/image-editor/index.js +107 -15
  63. package/dist/image-editor/playback.d.cts +22 -0
  64. package/dist/image-editor/playback.d.ts +22 -0
  65. package/dist/index.cjs +7 -3
  66. package/dist/index.js +6 -2
  67. package/dist/paint-editor/index.cjs +73 -25
  68. package/dist/paint-editor/index.d.cts +1 -0
  69. package/dist/paint-editor/index.d.ts +1 -0
  70. package/dist/paint-editor/index.js +68 -20
  71. package/dist/paint-editor/playback.d.cts +16 -0
  72. package/dist/paint-editor/playback.d.ts +16 -0
  73. package/dist/parameters/index.cjs +32 -8
  74. package/dist/parameters/index.d.cts +1 -0
  75. package/dist/parameters/index.d.ts +1 -0
  76. package/dist/parameters/index.js +28 -4
  77. package/dist/parameters/playback.d.cts +10 -0
  78. package/dist/parameters/playback.d.ts +10 -0
  79. package/dist/spreadsheet/index.cjs +7 -3
  80. package/dist/spreadsheet/index.d.cts +1 -0
  81. package/dist/spreadsheet/index.d.ts +1 -0
  82. package/dist/spreadsheet/index.js +6 -2
  83. package/dist/spreadsheet/playback.d.cts +15 -0
  84. package/dist/spreadsheet/playback.d.ts +15 -0
  85. package/dist/tools/index.cjs +40 -3
  86. package/dist/tools/index.d.cts +3 -0
  87. package/dist/tools/index.d.ts +3 -0
  88. package/dist/tools/index.js +39 -2
  89. package/dist/tools/playback.d.cts +205 -0
  90. package/dist/tools/playback.d.ts +205 -0
  91. package/dist/tools/presence.d.cts +82 -0
  92. package/dist/tools/presence.d.ts +82 -0
  93. package/dist/tools/registry.d.cts +45 -6
  94. package/dist/tools/registry.d.ts +45 -6
  95. package/dist/tools/script.d.cts +77 -0
  96. package/dist/tools/script.d.ts +77 -0
  97. package/dist/tools/view.d.cts +2 -4
  98. package/dist/tools/view.d.ts +2 -4
  99. package/dist/vector/index.cjs +217 -100
  100. package/dist/vector/index.d.cts +1 -0
  101. package/dist/vector/index.d.ts +1 -0
  102. package/dist/vector/index.js +140 -23
  103. package/dist/vector/playback.d.cts +13 -0
  104. package/dist/vector/playback.d.ts +13 -0
  105. package/dist/video-editor/index.cjs +81 -28
  106. package/dist/video-editor/index.d.cts +1 -0
  107. package/dist/video-editor/index.d.ts +1 -0
  108. package/dist/video-editor/index.js +58 -5
  109. package/dist/video-editor/playback.d.cts +20 -0
  110. package/dist/video-editor/playback.d.ts +20 -0
  111. package/package.json +1 -1
  112. package/skills/pixerate-agent-tools/SKILL.md +13 -0
  113. package/skills/pixerate-animation-editor/SKILL.md +1 -0
  114. package/skills/pixerate-canvas/SKILL.md +3 -0
  115. package/skills/pixerate-chart/SKILL.md +1 -0
  116. package/skills/pixerate-image-editor/SKILL.md +2 -2
  117. package/skills/pixerate-paint-editor/SKILL.md +1 -0
  118. package/skills/pixerate-parameters/SKILL.md +1 -0
  119. package/skills/pixerate-spreadsheet/SKILL.md +1 -0
  120. package/skills/pixerate-vector/SKILL.md +5 -0
  121. package/skills/pixerate-video-editor/SKILL.md +1 -0
  122. package/dist/chunk-BTZS3KZY.js +0 -221
  123. package/dist/chunk-K73HMKQP.js +0 -0
  124. package/dist/chunk-LACYURUW.cjs +0 -1
  125. package/dist/chunk-MRD3NXKR.cjs +0 -221
@@ -3226,6 +3226,55 @@ function checkPreviewScale(scale) {
3226
3226
  return scale === 1 ? "full" : scale;
3227
3227
  }
3228
3228
 
3229
+ // src/video-editor/playback.ts
3230
+ function videoTimeRef(at) {
3231
+ return { kind: "time", id: [`t=${Math.round(at.time)}`, at.track ? `track=${at.track}` : "", at.clip ? `clip=${at.clip}` : ""].filter(Boolean).join(";") };
3232
+ }
3233
+ function parseVideoTimeRef(ref) {
3234
+ if (ref.kind !== "time") return null;
3235
+ const parts = Object.fromEntries(ref.id.split(";").map((p) => p.split("=")));
3236
+ const time = Number(parts.t);
3237
+ if (!Number.isFinite(time)) return null;
3238
+ return { time, ...parts.track ? { track: parts.track } : {}, ...parts.clip ? { clip: parts.clip } : {} };
3239
+ }
3240
+ var num2 = (v) => typeof v === "number" && Number.isFinite(v);
3241
+ var str2 = (v) => typeof v === "string" && v.length > 0;
3242
+ function clipsOf(args) {
3243
+ const out = [];
3244
+ const add = (v) => str2(v) && !out.includes(v) && out.push(v);
3245
+ add(args.clip);
3246
+ add(args.target);
3247
+ for (const key of ["clips", "ids"]) if (Array.isArray(args[key])) args[key].forEach(add);
3248
+ return out.slice(0, 6);
3249
+ }
3250
+ function planVideoToolPlayback(tool, args) {
3251
+ const clips = clipsOf(args);
3252
+ const track = str2(args.track) ? args.track : void 0;
3253
+ const newClip = args.clip && typeof args.clip === "object" ? args.clip : null;
3254
+ const time = [args.start, args.at, args.time, args.to, _optionalChain([newClip, 'optionalAccess', _104 => _104.start])].find(num2);
3255
+ const click = (ref) => [{ type: "target", ref }, { type: "press" }, { type: "release" }];
3256
+ if (clips.length === 1 && (time !== void 0 || track) && tool !== "split_video_clip") {
3257
+ const clip = clips[0];
3258
+ const to = videoTimeRef({ time: _nullishCoalesce(time, () => ( 0)), ...track ? { track } : { clip } });
3259
+ return [{ type: "target", ref: { kind: "clip", id: clip } }, { type: "press" }, { type: "target", ref: to }, { type: "release" }];
3260
+ }
3261
+ if (clips.length === 1 && time !== void 0) return click(videoTimeRef({ time, clip: clips[0] }));
3262
+ if (clips.length) return clips.flatMap((id) => click({ kind: "clip", id }));
3263
+ if (track) return click(time !== void 0 ? videoTimeRef({ time, track }) : { kind: "track", id: track });
3264
+ if (time !== void 0) return click(videoTimeRef({ time }));
3265
+ if (str2(args.marker)) return click({ kind: "marker", id: args.marker });
3266
+ return null;
3267
+ }
3268
+ function withVideoPlayback(provider, surface = "video") {
3269
+ const plan = (tool) => tool.plan || tool.playback !== void 0 ? tool : { ...tool, plan: (args) => planVideoToolPlayback(tool.name, args) };
3270
+ const tools = provider.tools;
3271
+ return {
3272
+ ...provider,
3273
+ playbackSurface: _nullishCoalesce(provider.playbackSurface, () => ( surface)),
3274
+ tools: typeof tools === "function" ? () => tools().map(plan) : tools.map(plan)
3275
+ };
3276
+ }
3277
+
3229
3278
  // src/video-editor/ui.ts
3230
3279
  var STEPS = [40, 100, 200, 500, 1e3, 2e3, 5e3, 1e4, 15e3, 3e4, 6e4, 12e4, 3e5, 6e5];
3231
3280
  function videoRulerTicks(duration, pxPerSecond, fps) {
@@ -3297,9 +3346,9 @@ function videoClipLabel(clip, asset, sequence) {
3297
3346
  if (clip.name) return clip.name;
3298
3347
  if (clip.type === "text") return clip.text.split("\n")[0];
3299
3348
  if (clip.type === "color") return clip.color;
3300
- if (clip.type === "sequence") return `Compound: ${_nullishCoalesce(_optionalChain([sequence, 'optionalAccess', _104 => _104.name]), () => ( clip.sequence))}`;
3349
+ if (clip.type === "sequence") return `Compound: ${_nullishCoalesce(_optionalChain([sequence, 'optionalAccess', _105 => _105.name]), () => ( clip.sequence))}`;
3301
3350
  if (clip.type === "effect") return `Effect: ${clip.effect}`;
3302
- const base = _nullishCoalesce(_nullishCoalesce(_optionalChain([asset, 'optionalAccess', _105 => _105.name]), () => ( _optionalChain([asset, 'optionalAccess', _106 => _106.src, 'access', _107 => _107.replace, 'call', _108 => _108(/^.*[\\/]/, "")]))), () => ( clip.asset));
3351
+ const base = _nullishCoalesce(_nullishCoalesce(_optionalChain([asset, 'optionalAccess', _106 => _106.name]), () => ( _optionalChain([asset, 'optionalAccess', _107 => _107.src, 'access', _108 => _108.replace, 'call', _109 => _109(/^.*[\\/]/, "")]))), () => ( clip.asset));
3303
3352
  const speed = _chunkVKF3PWKRcjs.videoClipSpeed.call(void 0, clip);
3304
3353
  return speed !== 1 ? `${base} (${Math.round(speed * 100)}%)` : base;
3305
3354
  }
@@ -3343,7 +3392,7 @@ function videoAssetDropEdit(project, assetId, options = {}) {
3343
3392
  const asset = _chunkVKF3PWKRcjs.videoAssetMap.call(void 0, project).get(assetId);
3344
3393
  if (!asset) return null;
3345
3394
  const kind = asset.kind === "audio" ? "audio" : "video";
3346
- const track = _nullishCoalesce(options.track, () => ( _optionalChain([project, 'access', _109 => _109.tracks, 'access', _110 => _110.find, 'call', _111 => _111((t) => t.kind === kind && !t.locked), 'optionalAccess', _112 => _112.id])));
3395
+ const track = _nullishCoalesce(options.track, () => ( _optionalChain([project, 'access', _110 => _110.tracks, 'access', _111 => _111.find, 'call', _112 => _112((t) => t.kind === kind && !t.locked), 'optionalAccess', _113 => _113.id])));
3347
3396
  if (!track) return null;
3348
3397
  return { op: "add_clip", track, clip: { type: "media", asset: asset.id, ...options.start !== void 0 ? { start: options.start } : {} }, ...options.ripple ? { ripple: true } : {}, ...options.mode && options.mode !== "refuse" ? { mode: options.mode } : {} };
3349
3398
  }
@@ -3392,14 +3441,14 @@ var KEY_LABELS = {
3392
3441
  scale: { label: "Scale", step: 0.05 },
3393
3442
  rotation: { label: "Rotation", step: 1 }
3394
3443
  };
3395
- var animatableOf = (clip, property) => _chunkVKF3PWKRcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([clip, 'access', _113 => _113.transform, 'optionalAccess', _114 => _114[property]]) : property === "volume" ? clip.type === "media" || clip.type === "sequence" ? clip.volume : void 0 : clip.opacity;
3444
+ var animatableOf = (clip, property) => _chunkVKF3PWKRcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([clip, 'access', _114 => _114.transform, 'optionalAccess', _115 => _115[property]]) : property === "volume" ? clip.type === "media" || clip.type === "sequence" ? clip.volume : void 0 : clip.opacity;
3396
3445
  var playheadInClip = (clip, time) => Math.round(Math.min(clip.duration, Math.max(0, time - clip.start)));
3397
3446
  function videoKeyframeRows(project, clipId, time) {
3398
3447
  const at = _chunkVKF3PWKRcjs.findVideoClip.call(void 0, project, clipId);
3399
3448
  if (!at) return [];
3400
3449
  const { clip } = at;
3401
3450
  const asset = clip.type === "media" ? _chunkVKF3PWKRcjs.videoAssetMap.call(void 0, project).get(clip.asset) : void 0;
3402
- const visual = !(_optionalChain([asset, 'optionalAccess', _115 => _115.kind]) === "audio" || at.track.kind === "audio");
3451
+ const visual = !(_optionalChain([asset, 'optionalAccess', _116 => _116.kind]) === "audio" || at.track.kind === "audio");
3403
3452
  const audible = clip.type === "media" && _chunkVKF3PWKRcjs.videoAssetHasSound.call(void 0, asset) || clip.type === "sequence";
3404
3453
  const properties = [...visual ? ["opacity"] : [], ...audible ? ["volume"] : [], ...visual ? _chunkVKF3PWKRcjs.VIDEO_TRANSFORM_PROPERTIES : []];
3405
3454
  const clipTime = playheadInClip(clip, time);
@@ -3671,7 +3720,7 @@ function describeVideoProject(project) {
3671
3720
  ...project.background ? { background: project.background } : {},
3672
3721
  assets: project.assets.map(videoAssetOut),
3673
3722
  tracks: describeVideoTracks(project.tracks),
3674
- ..._optionalChain([project, 'access', _116 => _116.sequences, 'optionalAccess', _117 => _117.length]) ? { sequences: project.sequences.map((q) => describeVideoSequence(project, q, false)) } : {},
3723
+ ..._optionalChain([project, 'access', _117 => _117.sequences, 'optionalAccess', _118 => _118.length]) ? { sequences: project.sequences.map((q) => describeVideoSequence(project, q, false)) } : {},
3675
3724
  markers: _nullishCoalesce(project.markers, () => ( []))
3676
3725
  };
3677
3726
  }
@@ -3698,14 +3747,14 @@ function createVideoEditorToolProvider(controller, options = {}) {
3698
3747
  return null;
3699
3748
  };
3700
3749
  const placed = (o) => ({
3701
- ..._optionalChain([o, 'access', _118 => _118.created, 'optionalAccess', _119 => _119.length]) ? { created: o.created } : {},
3702
- ..._optionalChain([o, 'access', _120 => _120.trimmed, 'optionalAccess', _121 => _121.length]) ? { trimmed: o.trimmed } : {},
3703
- ..._optionalChain([o, 'access', _122 => _122.removed, 'optionalAccess', _123 => _123.length]) ? { removed: o.removed } : {},
3750
+ ..._optionalChain([o, 'access', _119 => _119.created, 'optionalAccess', _120 => _120.length]) ? { created: o.created } : {},
3751
+ ..._optionalChain([o, 'access', _121 => _121.trimmed, 'optionalAccess', _122 => _122.length]) ? { trimmed: o.trimmed } : {},
3752
+ ..._optionalChain([o, 'access', _123 => _123.removed, 'optionalAccess', _124 => _124.length]) ? { removed: o.removed } : {},
3704
3753
  ...o.rippled ? { rippled: o.rippled } : {}
3705
3754
  });
3706
3755
  const keysOut = (p, clip, property) => {
3707
3756
  const c = clipOut(p, clip);
3708
- const value = _chunkVKF3PWKRcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([c, 'optionalAccess', _124 => _124.transform, 'optionalAccess', _125 => _125[property]]) : _optionalChain([c, 'optionalAccess', _126 => _126[property]]);
3757
+ const value = _chunkVKF3PWKRcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([c, 'optionalAccess', _125 => _125.transform, 'optionalAccess', _126 => _126[property]]) : _optionalChain([c, 'optionalAccess', _127 => _127[property]]);
3709
3758
  return typeof value === "object" ? { keys: value.keys } : { keys: [], value: _nullishCoalesce(value, () => ( null)) };
3710
3759
  };
3711
3760
  const getProject = {
@@ -3783,7 +3832,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
3783
3832
  annotations: { title: "Render a frame", ...READ },
3784
3833
  handler: async ({ time, times, columns, format = "svg" }) => {
3785
3834
  const p = project();
3786
- const lutSrcs = [...new Set(p.tracks.flatMap((t) => t.clips.map((c) => _optionalChain([c, 'access', _127 => _127.grade, 'optionalAccess', _128 => _128.lut, 'optionalAccess', _129 => _129.src])).filter((x) => !!x)))];
3835
+ const lutSrcs = [...new Set(p.tracks.flatMap((t) => t.clips.map((c) => _optionalChain([c, 'access', _128 => _128.grade, 'optionalAccess', _129 => _129.lut, 'optionalAccess', _130 => _130.src])).filter((x) => !!x)))];
3787
3836
  const missing = (await Promise.all(lutSrcs.map((src) => controller.luts.load(src).then(() => null, (e) => e.message)))).filter((m) => !!m);
3788
3837
  const svgOptions = { lutFor: (src) => controller.luts.peek(src), ...columns ? { columns } : {} };
3789
3838
  const svg = times ? _chunkVKF3PWKRcjs.videoContactSheetSvg.call(void 0, p, times, svgOptions) : _chunkVKF3PWKRcjs.videoProjectSvg.call(void 0, p, _nullishCoalesce(time, () => ( controller.getState().time)), svgOptions);
@@ -4024,7 +4073,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4024
4073
  const at = _chunkVKF3PWKRcjs.findVideoClip.call(void 0, p, id);
4025
4074
  if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
4026
4075
  const { clip } = at;
4027
- if (at.track.kind !== "video" || clip.type === "media" && _optionalChain([p, 'access', _130 => _130.assets, 'access', _131 => _131.find, 'call', _132 => _132((a) => a.id === clip.asset), 'optionalAccess', _133 => _133.kind]) === "audio")
4076
+ if (at.track.kind !== "video" || clip.type === "media" && _optionalChain([p, 'access', _131 => _131.assets, 'access', _132 => _132.find, 'call', _133 => _133((a) => a.id === clip.asset), 'optionalAccess', _134 => _134.kind]) === "audio")
4028
4077
  throw new Error(`Clip "${id}" is sound only; grades change pictures. Pass clips on video tracks.`);
4029
4078
  }
4030
4079
  };
@@ -4047,7 +4096,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4047
4096
  const grade = _chunkVKF3PWKRcjs.videoGradeLook.call(void 0, _chunkVKF3PWKRcjs.findVideoClip.call(void 0, project(), clip).clip.grade, preset, _nullishCoalesce(amount, () => ( 1)));
4048
4097
  return grade ? { op: "update_clip", clip, set: { grade } } : { op: "update_clip", clip, remove: ["grade"] };
4049
4098
  });
4050
- return apply(edits, `Apply ${preset} look`, (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkVKF3PWKRcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _134 => _134.clip, 'access', _135 => _135.grade]), () => ( null)) })) }));
4099
+ return apply(edits, `Apply ${preset} look`, (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkVKF3PWKRcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _135 => _135.clip, 'access', _136 => _136.grade]), () => ( null)) })) }));
4051
4100
  }
4052
4101
  };
4053
4102
  const copyGrade = {
@@ -4083,7 +4132,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4083
4132
  const lut = await controller.luts.load(src);
4084
4133
  const label = _nullishCoalesce(name, () => ( lut.title));
4085
4134
  const setting = { src, ...strength !== void 0 && strength !== 1 ? { strength } : {}, ...label ? { name: label } : {} };
4086
- return apply(videoLutEdits(project(), clips, setting), "Apply LUT", (r) => ({ lut: { src, ...lut.title ? { title: lut.title } : {}, size: lut.size }, clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkVKF3PWKRcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _136 => _136.clip, 'access', _137 => _137.grade]), () => ( null)) })) }));
4135
+ return apply(videoLutEdits(project(), clips, setting), "Apply LUT", (r) => ({ lut: { src, ...lut.title ? { title: lut.title } : {}, size: lut.size }, clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkVKF3PWKRcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _137 => _137.clip, 'access', _138 => _138.grade]), () => ( null)) })) }));
4087
4136
  }
4088
4137
  };
4089
4138
  const removeLut = {
@@ -4095,9 +4144,9 @@ function createVideoEditorToolProvider(controller, options = {}) {
4095
4144
  handler: ({ clips }) => {
4096
4145
  gradeTargets(clips);
4097
4146
  const p = project();
4098
- const withLut = clips.filter((id) => _optionalChain([_chunkVKF3PWKRcjs.findVideoClip.call(void 0, p, id), 'access', _138 => _138.clip, 'access', _139 => _139.grade, 'optionalAccess', _140 => _140.lut]));
4147
+ const withLut = clips.filter((id) => _optionalChain([_chunkVKF3PWKRcjs.findVideoClip.call(void 0, p, id), 'access', _139 => _139.clip, 'access', _140 => _140.grade, 'optionalAccess', _141 => _141.lut]));
4099
4148
  if (!withLut.length) throw new Error(`None of ${clips.map((c) => `"${c}"`).join(", ")} has a LUT; get_video_project shows each clip's grade.`);
4100
- return apply(videoLutEdits(p, withLut, null), "Remove LUT", (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkVKF3PWKRcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _141 => _141.clip, 'access', _142 => _142.grade]), () => ( null)) })) }));
4149
+ return apply(videoLutEdits(p, withLut, null), "Remove LUT", (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkVKF3PWKRcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _142 => _142.clip, 'access', _143 => _143.grade]), () => ( null)) })) }));
4101
4150
  }
4102
4151
  };
4103
4152
  const PROXY_SCALE = { type: "number", exclusiveMinimum: 0, exclusiveMaximum: 1, description: "Proxy size as a fraction of the original: 0.5 (half width and height, the default) or 0.25 for very large footage." };
@@ -4155,7 +4204,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4155
4204
  controller.setPreviewScale(scale);
4156
4205
  const s = controller.getState().previewScale;
4157
4206
  const fixed = s === "full" ? 1 : typeof s === "number" ? s : null;
4158
- const plays = fixed === null ? void 0 : project().assets.filter((a) => a.kind === "video").map((a) => ({ asset: a.id, src: _nullishCoalesce(_optionalChain([videoAssetProxy, 'call', _143 => _143(a, fixed), 'optionalAccess', _144 => _144.src]), () => ( a.src)), proxy: !!videoAssetProxy(a, fixed) }));
4207
+ const plays = fixed === null ? void 0 : project().assets.filter((a) => a.kind === "video").map((a) => ({ asset: a.id, src: _nullishCoalesce(_optionalChain([videoAssetProxy, 'call', _144 => _144(a, fixed), 'optionalAccess', _145 => _145.src]), () => ( a.src)), proxy: !!videoAssetProxy(a, fixed) }));
4159
4208
  return { previewScale: s, ...plays ? { plays } : { note: "auto picks the smallest proxy at least as large as the preview canvas shows, so it depends on the preview's size." } };
4160
4209
  }
4161
4210
  };
@@ -4224,7 +4273,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4224
4273
  handler: ({ track, from, to, limit }) => {
4225
4274
  const all = timelineWords(track).filter((w) => w.end > (_nullishCoalesce(from, () => ( 0))) && w.start < (_nullishCoalesce(to, () => ( Infinity))));
4226
4275
  const words = all.slice(0, _nullishCoalesce(limit, () => ( 1e3)));
4227
- return { track: _nullishCoalesce(_optionalChain([words, 'access', _145 => _145[0], 'optionalAccess', _146 => _146.track]), () => ( videoTranscriptTrack(project(), track))), text: words.map((w) => w.word).join(" "), words: words.map((w) => ({ word: w.word, start: round(w.start), end: round(w.end), clip: w.clip })), more: all.length > words.length };
4276
+ return { track: _nullishCoalesce(_optionalChain([words, 'access', _146 => _146[0], 'optionalAccess', _147 => _147.track]), () => ( videoTranscriptTrack(project(), track))), text: words.map((w) => w.word).join(" "), words: words.map((w) => ({ word: w.word, start: round(w.start), end: round(w.end), clip: w.clip })), more: all.length > words.length };
4228
4277
  }
4229
4278
  };
4230
4279
  const findText = {
@@ -4287,7 +4336,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4287
4336
  const { clip } = at;
4288
4337
  if (clip.type === "sequence") throw new Error(`Clip "${id}" is a compound clip, which plays its sequence at normal speed; change the speed of the clips inside the sequence instead.`);
4289
4338
  if (clip.type !== "media") throw new Error(`Clip "${id}" is a ${clip.type === "text" ? "title" : clip.type === "effect" ? "effect clip" : "colour"}, so it has no source to change the speed of; use a video or audio clip.`);
4290
- if (_optionalChain([project, 'call', _147 => _147(), 'access', _148 => _148.assets, 'access', _149 => _149.find, 'call', _150 => _150((a) => a.id === clip.asset), 'optionalAccess', _151 => _151.kind]) === "image") throw new Error(`Clip "${id}" is a still, so it has no motion to change the speed of.`);
4339
+ if (_optionalChain([project, 'call', _148 => _148(), 'access', _149 => _149.assets, 'access', _150 => _150.find, 'call', _151 => _151((a) => a.id === clip.asset), 'optionalAccess', _152 => _152.kind]) === "image") throw new Error(`Clip "${id}" is a still, so it has no motion to change the speed of.`);
4291
4340
  return clip;
4292
4341
  };
4293
4342
  const rampOut = (r, id) => {
@@ -4618,7 +4667,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4618
4667
  };
4619
4668
  const reads = [getProject, listSequences, getFrame, getTranscript, findText, findFillers, findPauses, findGaps, checkProject, renderFrame, getScopes, previewCache, planProxies, exportFfmpeg, exportLoudnessMeasure, exportEdl, audioLevels, findSilences, seek, setPreviewScale];
4620
4669
  const writes = [setSettings, addAsset, updateAsset, removeAsset, setProxies, addTrack, updateTrack, removeTrack, moveTrack, addClip, moveClip, trimClip, splitClip, deleteClips, updateClip, setTransition, setSpeedRamp, addFreeze, removeRamp, setTranscript, removeRanges, applyGradePreset, copyGrade, setLut, removeLut, setKeyframes, removeKeyframes, slipClip, rollEdit, slideClip, liftRange, extractRange, splitAt, closeGaps, addMarker, removeMarker, editVideo, undo, redo];
4621
- return {
4670
+ return withVideoPlayback({
4622
4671
  id: _nullishCoalesce(options.id, () => ( "video")),
4623
4672
  namespace: options.namespace,
4624
4673
  title: "Video editor",
@@ -4635,7 +4684,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4635
4684
  }
4636
4685
  });
4637
4686
  }
4638
- };
4687
+ });
4639
4688
  }
4640
4689
 
4641
4690
  // src/video-editor/effect-tools.ts
@@ -4643,7 +4692,7 @@ function videoClipAppliedEffects(clip) {
4643
4692
  const out = [];
4644
4693
  const ref = (r) => ({ effect: r.effect, ...r.name ? { name: r.name } : {}, ...r.provider ? { provider: r.provider } : {} });
4645
4694
  if (clip.type === "effect") out.push({ id: "generator", ...ref(clip), role: "effect clip", enabled: true, values: _nullishCoalesce(clip.values, () => ( {})) });
4646
- if (_optionalChain([clip, 'access', _152 => _152.transition, 'optionalAccess', _153 => _153.type]) === "effect" && clip.transition.effect) out.push({ id: "transition", ...ref(clip.transition.effect), role: "transition", enabled: true, values: { ..._nullishCoalesce(clip.transition.effect.values, () => ( {})) }, duration: clip.transition.duration });
4695
+ if (_optionalChain([clip, 'access', _153 => _153.transition, 'optionalAccess', _154 => _154.type]) === "effect" && clip.transition.effect) out.push({ id: "transition", ...ref(clip.transition.effect), role: "transition", enabled: true, values: { ..._nullishCoalesce(clip.transition.effect.values, () => ( {})) }, duration: clip.transition.duration });
4647
4696
  (_nullishCoalesce(clip.effects, () => ( []))).forEach((e, index) => out.push({ id: e.id, ...ref(e), role: "clip effect", enabled: e.enabled !== false, ...e.opacity !== void 0 ? { opacity: e.opacity } : {}, values: _nullishCoalesce(e.values, () => ( {})), index }));
4648
4697
  return out;
4649
4698
  }
@@ -4680,10 +4729,10 @@ function createVideoEffectsToolProvider(controller, options = {}) {
4680
4729
  const result = (r, target, instance, extra = {}) => {
4681
4730
  if (!r.ok) throw new Error(r.error);
4682
4731
  const effects = videoClipAppliedEffects(clipOf(target));
4683
- const effect = _nullishCoalesce(effects.find((e) => e.id === (_nullishCoalesce(instance, () => ( _optionalChain([r, 'access', _154 => _154.effect, 'optionalAccess', _155 => _155.id]))))), () => ( (r.effect ? { id: r.effect.id, effect: r.effect.effect, role: "clip effect", enabled: r.effect.enabled !== false, values: _nullishCoalesce(r.effect.values, () => ( {})) } : effects[0])));
4732
+ const effect = _nullishCoalesce(effects.find((e) => e.id === (_nullishCoalesce(instance, () => ( _optionalChain([r, 'access', _155 => _155.effect, 'optionalAccess', _156 => _156.id]))))), () => ( (r.effect ? { id: r.effect.id, effect: r.effect.effect, role: "clip effect", enabled: r.effect.enabled !== false, values: _nullishCoalesce(r.effect.values, () => ( {})) } : effects[0])));
4684
4733
  return { target, effect, effects, ...extra };
4685
4734
  };
4686
- return _chunkRUZQMYXHcjs.createEffectToolProvider.call(void 0, {
4735
+ return withVideoPlayback(_chunkRUZQMYXHcjs.createEffectToolProvider.call(void 0, {
4687
4736
  id: _nullishCoalesce(options.id, () => ( "video-effects")),
4688
4737
  namespace: options.namespace,
4689
4738
  title: "Video effects",
@@ -4800,8 +4849,8 @@ function createVideoEffectsToolProvider(controller, options = {}) {
4800
4849
  if (args.effect === "generator") {
4801
4850
  const clip = clipOf(args.clip);
4802
4851
  if (clip.type !== "effect") throw new Error(`Clip "${args.clip}" is not an effect clip; give the id of one of its effects (list_applied_effects).`);
4803
- const was = _optionalChain([clip, 'access', _156 => _156.values, 'optionalAccess', _157 => _157[args.control]]);
4804
- const plain = keys === null ? _chunkVKF3PWKRcjs.isVideoKeyframes.call(void 0, was) ? _optionalChain([was, 'access', _158 => _158.keys, 'access', _159 => _159[0], 'optionalAccess', _160 => _160.v]) : was : { keys: [...keys].sort((a, b) => a.t - b.t) };
4852
+ const was = _optionalChain([clip, 'access', _157 => _157.values, 'optionalAccess', _158 => _158[args.control]]);
4853
+ const plain = keys === null ? _chunkVKF3PWKRcjs.isVideoKeyframes.call(void 0, was) ? _optionalChain([was, 'access', _159 => _159.keys, 'access', _160 => _160[0], 'optionalAccess', _161 => _161.v]) : was : { keys: [...keys].sort((a, b) => a.t - b.t) };
4805
4854
  if (plain === void 0) throw new Error(`"${args.control}" has no value to keep; give keys instead.`);
4806
4855
  r = await controller.updateEffectValues(args.clip, "generator", { [args.control]: plain });
4807
4856
  } else r = await controller.setClipEffectKeyframes(args.clip, args.effect, args.control, keys);
@@ -4810,7 +4859,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
4810
4859
  }
4811
4860
  }
4812
4861
  ]
4813
- });
4862
+ }));
4814
4863
  }
4815
4864
 
4816
4865
 
@@ -5064,4 +5113,8 @@ function createVideoEffectsToolProvider(controller, options = {}) {
5064
5113
 
5065
5114
 
5066
5115
 
5067
- exports.VIDEO_BLEND_MODES = _chunkVKF3PWKRcjs.VIDEO_BLEND_MODES; exports.VIDEO_BLEND_MODE_LABELS = VIDEO_BLEND_MODE_LABELS; exports.VIDEO_CLIP_ANIMATION_DURATION = _chunkVKF3PWKRcjs.VIDEO_CLIP_ANIMATION_DURATION; exports.VIDEO_CLIP_ANIMATION_EFFECTS = _chunkVKF3PWKRcjs.VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_CLIP_ANIMATION_LABELS = VIDEO_CLIP_ANIMATION_LABELS; exports.VIDEO_CLIP_TYPES = _chunkVKF3PWKRcjs.VIDEO_CLIP_TYPES; exports.VIDEO_DEFAULT_FILLERS = VIDEO_DEFAULT_FILLERS; exports.VIDEO_DEFAULT_STILL_DURATION = VIDEO_DEFAULT_STILL_DURATION; exports.VIDEO_DEFAULT_TITLE_DURATION = VIDEO_DEFAULT_TITLE_DURATION; exports.VIDEO_EASE_NAMES = _chunkVKF3PWKRcjs.VIDEO_EASE_NAMES; exports.VIDEO_EDIT_OPS = VIDEO_EDIT_OPS; exports.VIDEO_EFFECT_PLACES = _chunkVKF3PWKRcjs.VIDEO_EFFECT_PLACES; exports.VIDEO_FADE_CURVES = _chunkVKF3PWKRcjs.VIDEO_FADE_CURVES; exports.VIDEO_FADE_CURVE_LABELS = VIDEO_FADE_CURVE_LABELS; exports.VIDEO_FITS = _chunkVKF3PWKRcjs.VIDEO_FITS; exports.VIDEO_GRADE_CONTROLS = _chunkVKF3PWKRcjs.VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = _chunkVKF3PWKRcjs.VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = _chunkVKF3PWKRcjs.VIDEO_GRADE_PRESET_NAMES; exports.VIDEO_ISSUE_CODES = VIDEO_ISSUE_CODES; exports.VIDEO_KEYFRAME_LIMITS = _chunkVKF3PWKRcjs.VIDEO_KEYFRAME_LIMITS; exports.VIDEO_KEYFRAME_PROPERTIES = _chunkVKF3PWKRcjs.VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_LUT_MAX_SIZE = _chunkVKF3PWKRcjs.VIDEO_LUT_MAX_SIZE; exports.VIDEO_PEAK_BLOCK = VIDEO_PEAK_BLOCK; exports.VIDEO_PLACEMENT_MODES = _chunkVKF3PWKRcjs.VIDEO_PLACEMENT_MODES; exports.VIDEO_PREVIEW_SCALE_OPTIONS = VIDEO_PREVIEW_SCALE_OPTIONS; exports.VIDEO_PROXY_SCALES = VIDEO_PROXY_SCALES; exports.VIDEO_SCOPE_KINDS = VIDEO_SCOPE_KINDS; exports.VIDEO_TIME_EPSILON = _chunkVKF3PWKRcjs.VIDEO_TIME_EPSILON; exports.VIDEO_TRANSFORM_PROPERTIES = _chunkVKF3PWKRcjs.VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_TRANSITION_LABELS = VIDEO_TRANSITION_LABELS; exports.VIDEO_TRANSITION_TYPES = _chunkVKF3PWKRcjs.VIDEO_TRANSITION_TYPES; exports.VIDEO_VECTORSCOPE_TARGETS = VIDEO_VECTORSCOPE_TARGETS; exports.VIDEO_WIPE_DIRECTIONS = _chunkVKF3PWKRcjs.VIDEO_WIPE_DIRECTIONS; exports.VideoAudioPeaksCache = VideoAudioPeaksCache; exports.VideoEditorController = VideoEditorController; exports.VideoEffectsEngine = _chunkVKF3PWKRcjs.VideoEffectsEngine; exports.VideoFrameCache = VideoFrameCache; exports.VideoLutCache = _chunkVKF3PWKRcjs.VideoLutCache; exports.VideoPreviewEngine = VideoPreviewEngine; exports.VideoPreviewPixels = VideoPreviewPixels; exports.allVideoClipIds = _chunkVKF3PWKRcjs.allVideoClipIds; exports.allVideoTracks = _chunkVKF3PWKRcjs.allVideoTracks; exports.applyVideoEdits = applyVideoEdits; exports.applyVideoGrade = _chunkVKF3PWKRcjs.applyVideoGrade; exports.applyVideoLut = _chunkVKF3PWKRcjs.applyVideoLut; exports.applyVideoLutToPixels = _chunkVKF3PWKRcjs.applyVideoLutToPixels; exports.buildVideoAudioPeaks = buildVideoAudioPeaks; exports.checkVideoEffectPlace = _chunkVKF3PWKRcjs.checkVideoEffectPlace; exports.checkVideoEffectValues = _chunkVKF3PWKRcjs.checkVideoEffectValues; exports.checkVideoProject = checkVideoProject; exports.checkVideoTimeRemap = _chunkVKF3PWKRcjs.checkVideoTimeRemap; exports.createVideoEditorToolProvider = createVideoEditorToolProvider; exports.createVideoEffectsToolProvider = createVideoEffectsToolProvider; exports.createVideoElementDecoder = createVideoElementDecoder; exports.createVideoProject = createVideoProject; exports.decodeVideoAudioPeaks = decodeVideoAudioPeaks; exports.describeVideoProject = describeVideoProject; exports.describeVideoSequence = describeVideoSequence; exports.drawVideoFrame = _chunkVKF3PWKRcjs.drawVideoFrame; exports.ffmpegFilterValue = _chunkVKF3PWKRcjs.ffmpegFilterValue; exports.findVideoAudioSilences = findVideoAudioSilences; exports.findVideoClip = _chunkVKF3PWKRcjs.findVideoClip; exports.findVideoFillers = findVideoFillers; exports.findVideoGaps = _chunkVKF3PWKRcjs.findVideoGaps; exports.findVideoSequenceClip = _chunkVKF3PWKRcjs.findVideoSequenceClip; exports.findVideoSequenceCycle = _chunkVKF3PWKRcjs.findVideoSequenceCycle; exports.findVideoTranscriptPauses = findVideoTranscriptPauses; exports.findVideoTranscriptText = findVideoTranscriptText; exports.formatVideoSeconds = _chunkVKF3PWKRcjs.formatVideoSeconds; exports.formatVideoTimecode = _chunkVKF3PWKRcjs.formatVideoTimecode; exports.formatVideoTimecodeFrames = _chunkVKF3PWKRcjs.formatVideoTimecodeFrames; exports.isVideoDropFrameRate = _chunkVKF3PWKRcjs.isVideoDropFrameRate; exports.isVideoKeyframes = _chunkVKF3PWKRcjs.isVideoKeyframes; exports.mergeVideoRanges = mergeVideoRanges; exports.mixEffectPixels = _chunkVKF3PWKRcjs.mixEffectPixels; exports.nextFreeVideoSlot = _chunkVKF3PWKRcjs.nextFreeVideoSlot; exports.normalizeVideoGrade = _chunkVKF3PWKRcjs.normalizeVideoGrade; exports.normalizeVideoGradeLut = _chunkVKF3PWKRcjs.normalizeVideoGradeLut; exports.normalizeVideoWord = normalizeVideoWord; exports.overEffectPixels = _chunkVKF3PWKRcjs.overEffectPixels; exports.parseVideoAnimatable = parseVideoAnimatable; exports.parseVideoAsset = parseVideoAsset; exports.parseVideoAssetProxies = parseVideoAssetProxies; exports.parseVideoClip = parseVideoClip; exports.parseVideoClipAnimation = parseVideoClipAnimation; exports.parseVideoClipEffects = parseVideoClipEffects; exports.parseVideoCubeLut = _chunkVKF3PWKRcjs.parseVideoCubeLut; exports.parseVideoEffectRef = parseVideoEffectRef; exports.parseVideoEffectValues = parseVideoEffectValues; exports.parseVideoGrade = parseVideoGrade; exports.parseVideoGradeLut = parseVideoGradeLut; exports.parseVideoKeyframes = parseVideoKeyframes; exports.parseVideoLoudnessMeasurement = _chunkVKF3PWKRcjs.parseVideoLoudnessMeasurement; exports.parseVideoMarker = parseVideoMarker; exports.parseVideoPreviewScale = parseVideoPreviewScale; exports.parseVideoProject = parseVideoProject; exports.parseVideoSequence = parseVideoSequence; exports.parseVideoTimeRemap = parseVideoTimeRemap; exports.parseVideoTrack = parseVideoTrack; exports.parseVideoTranscript = parseVideoTranscript; exports.parseVideoTranscriptWords = parseVideoTranscriptWords; exports.parseVideoTransform = parseVideoTransform; exports.parseVideoTransition = parseVideoTransition; exports.placeVideoRect = _chunkVKF3PWKRcjs.placeVideoRect; exports.planVideoClipDrag = planVideoClipDrag; exports.planVideoPrefetch = planVideoPrefetch; exports.probeVideoMedia = probeVideoMedia; exports.readVideoScopesPanel = readVideoScopesPanel; exports.removeVideoKey = _chunkVKF3PWKRcjs.removeVideoKey; exports.renderVideoFrameExact = _chunkVKF3PWKRcjs.renderVideoFrameExact; exports.resolveVideoPreviewScale = resolveVideoPreviewScale; exports.retimeVideoAnimatable = _chunkVKF3PWKRcjs.retimeVideoAnimatable; exports.setVideoKey = _chunkVKF3PWKRcjs.setVideoKey; exports.snapToVideoFrame = _chunkVKF3PWKRcjs.snapToVideoFrame; exports.snapVideoTime = _chunkVKF3PWKRcjs.snapVideoTime; exports.sortVideoKeys = _chunkVKF3PWKRcjs.sortVideoKeys; exports.sortedVideoClips = _chunkVKF3PWKRcjs.sortedVideoClips; exports.splitVideoAnimatable = _chunkVKF3PWKRcjs.splitVideoAnimatable; exports.summarizeVideoScopes = summarizeVideoScopes; exports.toVideoEdl = _chunkVKF3PWKRcjs.toVideoEdl; exports.toVideoFfmpeg = _chunkVKF3PWKRcjs.toVideoFfmpeg; exports.toVideoLoudnessMeasure = _chunkVKF3PWKRcjs.toVideoLoudnessMeasure; exports.videoAssetDropEdit = videoAssetDropEdit; exports.videoAssetHasSound = _chunkVKF3PWKRcjs.videoAssetHasSound; exports.videoAssetKindOf = videoAssetKindOf; exports.videoAssetMap = _chunkVKF3PWKRcjs.videoAssetMap; exports.videoAssetProxy = videoAssetProxy; exports.videoAudioLevels = videoAudioLevels; exports.videoAudioPeakRange = videoAudioPeakRange; exports.videoAudioPeakSpans = videoAudioPeakSpans; exports.videoAudioPeaksDuration = videoAudioPeaksDuration; exports.videoCacheEvictions = videoCacheEvictions; exports.videoChroma = videoChroma; exports.videoClipAfter = _chunkVKF3PWKRcjs.videoClipAfter; exports.videoClipAnimated = _chunkVKF3PWKRcjs.videoClipAnimated; exports.videoClipAnimationProperties = _chunkVKF3PWKRcjs.videoClipAnimationProperties; exports.videoClipAnimationSpans = _chunkVKF3PWKRcjs.videoClipAnimationSpans; exports.videoClipAppliedEffects = videoClipAppliedEffects; exports.videoClipBefore = _chunkVKF3PWKRcjs.videoClipBefore; exports.videoClipEffectUses = _chunkVKF3PWKRcjs.videoClipEffectUses; exports.videoClipEnd = _chunkVKF3PWKRcjs.videoClipEnd; exports.videoClipHandles = _chunkVKF3PWKRcjs.videoClipHandles; exports.videoClipKeyframes = videoClipKeyframes; exports.videoClipLabel = videoClipLabel; exports.videoClipOverhang = _chunkVKF3PWKRcjs.videoClipOverhang; exports.videoClipShowsWaveform = videoClipShowsWaveform; exports.videoClipSoundGain = _chunkVKF3PWKRcjs.videoClipSoundGain; exports.videoClipSourceRange = _chunkVKF3PWKRcjs.videoClipSourceRange; exports.videoClipSourceTime = _chunkVKF3PWKRcjs.videoClipSourceTime; exports.videoClipSpeed = _chunkVKF3PWKRcjs.videoClipSpeed; exports.videoClipSpeedAt = _chunkVKF3PWKRcjs.videoClipSpeedAt; exports.videoClipTint = videoClipTint; exports.videoClipWaveform = videoClipWaveform; exports.videoClipWaveformPath = videoClipWaveformPath; exports.videoClipsAt = _chunkVKF3PWKRcjs.videoClipsAt; exports.videoContactSheetSvg = _chunkVKF3PWKRcjs.videoContactSheetSvg; exports.videoDragLabel = videoDragLabel; exports.videoDropTracks = videoDropTracks; exports.videoEaseBezier = _chunkVKF3PWKRcjs.videoEaseBezier; exports.videoEaseProgress = _chunkVKF3PWKRcjs.videoEaseProgress; exports.videoEffectFrameTime = _chunkVKF3PWKRcjs.videoEffectFrameTime; exports.videoEffectLayerKey = _chunkVKF3PWKRcjs.videoEffectLayerKey; exports.videoEffectValuesAt = _chunkVKF3PWKRcjs.videoEffectValuesAt; exports.videoExposureNotes = videoExposureNotes; exports.videoExposureStats = videoExposureStats; exports.videoFadeCurveGain = _chunkVKF3PWKRcjs.videoFadeCurveGain; exports.videoFfmpegUnsupportedEffects = _chunkVKF3PWKRcjs.videoFfmpegUnsupportedEffects; exports.videoFrameAt = _chunkVKF3PWKRcjs.videoFrameAt; exports.videoFrameCacheKey = videoFrameCacheKey; exports.videoFrameDuration = _chunkVKF3PWKRcjs.videoFrameDuration; exports.videoFrameLeafLayers = _chunkVKF3PWKRcjs.videoFrameLeafLayers; exports.videoFrameRequestsAt = videoFrameRequestsAt; exports.videoFrameToSvg = _chunkVKF3PWKRcjs.videoFrameToSvg; exports.videoFrames = _chunkVKF3PWKRcjs.videoFrames; exports.videoFreezeFrameEdit = _chunkVKF3PWKRcjs.videoFreezeFrameEdit; exports.videoGradeCssFilter = _chunkVKF3PWKRcjs.videoGradeCssFilter; exports.videoGradeFfmpegFilters = _chunkVKF3PWKRcjs.videoGradeFfmpegFilters; exports.videoGradeGainsFilterId = _chunkVKF3PWKRcjs.videoGradeGainsFilterId; exports.videoGradeLook = _chunkVKF3PWKRcjs.videoGradeLook; exports.videoGradePreset = _chunkVKF3PWKRcjs.videoGradePreset; exports.videoGradeStepMatrix = _chunkVKF3PWKRcjs.videoGradeStepMatrix; exports.videoGradeStepSvgValues = _chunkVKF3PWKRcjs.videoGradeStepSvgValues; exports.videoGradeSteps = _chunkVKF3PWKRcjs.videoGradeSteps; exports.videoGradeSvgDefs = _chunkVKF3PWKRcjs.videoGradeSvgDefs; exports.videoGradeSvgFilter = _chunkVKF3PWKRcjs.videoGradeSvgFilter; exports.videoHistogram = videoHistogram; exports.videoHistogramImage = videoHistogramImage; exports.videoHourFrames = _chunkVKF3PWKRcjs.videoHourFrames; exports.videoIrisRadius = _chunkVKF3PWKRcjs.videoIrisRadius; exports.videoIssueKey = videoIssueKey; exports.videoKeyframeBreakpoints = _chunkVKF3PWKRcjs.videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = _chunkVKF3PWKRcjs.videoKeyframeFfmpegExpr; exports.videoKeyframeRows = videoKeyframeRows; exports.videoKeyframeToggleEdit = videoKeyframeToggleEdit; exports.videoKeyframeValueEdit = videoKeyframeValueEdit; exports.videoKeysOf = _chunkVKF3PWKRcjs.videoKeysOf; exports.videoLayersUseEffects = _chunkVKF3PWKRcjs.videoLayersUseEffects; exports.videoLayersWithoutTransitionEffects = _chunkVKF3PWKRcjs.videoLayersWithoutTransitionEffects; exports.videoLuma = videoLuma; exports.videoLumaWaveform = videoLumaWaveform; exports.videoLutEdits = videoLutEdits; exports.videoLutFromFunction = _chunkVKF3PWKRcjs.videoLutFromFunction; exports.videoLutSvgApproximation = _chunkVKF3PWKRcjs.videoLutSvgApproximation; exports.videoLutSvgPrimitives = _chunkVKF3PWKRcjs.videoLutSvgPrimitives; exports.videoLutToCube = _chunkVKF3PWKRcjs.videoLutToCube; exports.videoOverlap = _chunkVKF3PWKRcjs.videoOverlap; exports.videoPeakDb = videoPeakDb; exports.videoPreviewSrc = videoPreviewSrc; exports.videoProjectDuration = _chunkVKF3PWKRcjs.videoProjectDuration; exports.videoProjectEffects = _chunkVKF3PWKRcjs.videoProjectEffects; exports.videoProjectHasProxies = videoProjectHasProxies; exports.videoProjectSvg = _chunkVKF3PWKRcjs.videoProjectSvg; exports.videoProxyFfmpeg = videoProxyFfmpeg; exports.videoProxyName = videoProxyName; exports.videoProxyPlan = videoProxyPlan; exports.videoRemoveRangesEdits = videoRemoveRangesEdits; exports.videoRulerTicks = videoRulerTicks; exports.videoScopeImage = videoScopeImage; exports.videoSequenceChildren = _chunkVKF3PWKRcjs.videoSequenceChildren; exports.videoSequenceDuration = _chunkVKF3PWKRcjs.videoSequenceDuration; exports.videoSequenceMap = _chunkVKF3PWKRcjs.videoSequenceMap; exports.videoShellQuote = _chunkVKF3PWKRcjs.videoShellQuote; exports.videoSlowMotionRamp = _chunkVKF3PWKRcjs.videoSlowMotionRamp; exports.videoSnapPoints = _chunkVKF3PWKRcjs.videoSnapPoints; exports.videoSourceFrame = videoSourceFrame; exports.videoSourceFrameTime = videoSourceFrameTime; exports.videoSpeedRampEdit = _chunkVKF3PWKRcjs.videoSpeedRampEdit; exports.videoSpeedRampKeys = _chunkVKF3PWKRcjs.videoSpeedRampKeys; exports.videoTextStyle = _chunkVKF3PWKRcjs.videoTextStyle; exports.videoTimeRemapBreakpoints = _chunkVKF3PWKRcjs.videoTimeRemapBreakpoints; exports.videoTimeRemapSpan = _chunkVKF3PWKRcjs.videoTimeRemapSpan; exports.videoTimecodeFrames = _chunkVKF3PWKRcjs.videoTimecodeFrames; exports.videoTimelineTranscript = videoTimelineTranscript; exports.videoTitleFrame = _chunkVKF3PWKRcjs.videoTitleFrame; exports.videoTrackSyncLocked = _chunkVKF3PWKRcjs.videoTrackSyncLocked; exports.videoTranscriptEdit = videoTranscriptEdit; exports.videoTranscriptTrack = videoTranscriptTrack; exports.videoTransformAt = _chunkVKF3PWKRcjs.videoTransformAt; exports.videoTransitionAudioCurve = _chunkVKF3PWKRcjs.videoTransitionAudioCurve; exports.videoTransitionEase = _chunkVKF3PWKRcjs.videoTransitionEase; exports.videoTransitionHasDirection = videoTransitionHasDirection; exports.videoValueAt = _chunkVKF3PWKRcjs.videoValueAt; exports.videoVectorscope = videoVectorscope; exports.videoVectorscopeAngle = videoVectorscopeAngle; exports.videoVectorscopeImage = videoVectorscopeImage; exports.videoVectorscopePoint = videoVectorscopePoint; exports.videoWaveformImage = videoWaveformImage; exports.videoWaveformPath = videoWaveformPath; exports.videoWipeRect = _chunkVKF3PWKRcjs.videoWipeRect; exports.videoWordAt = videoWordAt; exports.videoWordsRange = videoWordsRange;
5116
+
5117
+
5118
+
5119
+
5120
+ exports.VIDEO_BLEND_MODES = _chunkVKF3PWKRcjs.VIDEO_BLEND_MODES; exports.VIDEO_BLEND_MODE_LABELS = VIDEO_BLEND_MODE_LABELS; exports.VIDEO_CLIP_ANIMATION_DURATION = _chunkVKF3PWKRcjs.VIDEO_CLIP_ANIMATION_DURATION; exports.VIDEO_CLIP_ANIMATION_EFFECTS = _chunkVKF3PWKRcjs.VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_CLIP_ANIMATION_LABELS = VIDEO_CLIP_ANIMATION_LABELS; exports.VIDEO_CLIP_TYPES = _chunkVKF3PWKRcjs.VIDEO_CLIP_TYPES; exports.VIDEO_DEFAULT_FILLERS = VIDEO_DEFAULT_FILLERS; exports.VIDEO_DEFAULT_STILL_DURATION = VIDEO_DEFAULT_STILL_DURATION; exports.VIDEO_DEFAULT_TITLE_DURATION = VIDEO_DEFAULT_TITLE_DURATION; exports.VIDEO_EASE_NAMES = _chunkVKF3PWKRcjs.VIDEO_EASE_NAMES; exports.VIDEO_EDIT_OPS = VIDEO_EDIT_OPS; exports.VIDEO_EFFECT_PLACES = _chunkVKF3PWKRcjs.VIDEO_EFFECT_PLACES; exports.VIDEO_FADE_CURVES = _chunkVKF3PWKRcjs.VIDEO_FADE_CURVES; exports.VIDEO_FADE_CURVE_LABELS = VIDEO_FADE_CURVE_LABELS; exports.VIDEO_FITS = _chunkVKF3PWKRcjs.VIDEO_FITS; exports.VIDEO_GRADE_CONTROLS = _chunkVKF3PWKRcjs.VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = _chunkVKF3PWKRcjs.VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = _chunkVKF3PWKRcjs.VIDEO_GRADE_PRESET_NAMES; exports.VIDEO_ISSUE_CODES = VIDEO_ISSUE_CODES; exports.VIDEO_KEYFRAME_LIMITS = _chunkVKF3PWKRcjs.VIDEO_KEYFRAME_LIMITS; exports.VIDEO_KEYFRAME_PROPERTIES = _chunkVKF3PWKRcjs.VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_LUT_MAX_SIZE = _chunkVKF3PWKRcjs.VIDEO_LUT_MAX_SIZE; exports.VIDEO_PEAK_BLOCK = VIDEO_PEAK_BLOCK; exports.VIDEO_PLACEMENT_MODES = _chunkVKF3PWKRcjs.VIDEO_PLACEMENT_MODES; exports.VIDEO_PREVIEW_SCALE_OPTIONS = VIDEO_PREVIEW_SCALE_OPTIONS; exports.VIDEO_PROXY_SCALES = VIDEO_PROXY_SCALES; exports.VIDEO_SCOPE_KINDS = VIDEO_SCOPE_KINDS; exports.VIDEO_TIME_EPSILON = _chunkVKF3PWKRcjs.VIDEO_TIME_EPSILON; exports.VIDEO_TRANSFORM_PROPERTIES = _chunkVKF3PWKRcjs.VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_TRANSITION_LABELS = VIDEO_TRANSITION_LABELS; exports.VIDEO_TRANSITION_TYPES = _chunkVKF3PWKRcjs.VIDEO_TRANSITION_TYPES; exports.VIDEO_VECTORSCOPE_TARGETS = VIDEO_VECTORSCOPE_TARGETS; exports.VIDEO_WIPE_DIRECTIONS = _chunkVKF3PWKRcjs.VIDEO_WIPE_DIRECTIONS; exports.VideoAudioPeaksCache = VideoAudioPeaksCache; exports.VideoEditorController = VideoEditorController; exports.VideoEffectsEngine = _chunkVKF3PWKRcjs.VideoEffectsEngine; exports.VideoFrameCache = VideoFrameCache; exports.VideoLutCache = _chunkVKF3PWKRcjs.VideoLutCache; exports.VideoPreviewEngine = VideoPreviewEngine; exports.VideoPreviewPixels = VideoPreviewPixels; exports.allVideoClipIds = _chunkVKF3PWKRcjs.allVideoClipIds; exports.allVideoTracks = _chunkVKF3PWKRcjs.allVideoTracks; exports.applyVideoEdits = applyVideoEdits; exports.applyVideoGrade = _chunkVKF3PWKRcjs.applyVideoGrade; exports.applyVideoLut = _chunkVKF3PWKRcjs.applyVideoLut; exports.applyVideoLutToPixels = _chunkVKF3PWKRcjs.applyVideoLutToPixels; exports.buildVideoAudioPeaks = buildVideoAudioPeaks; exports.checkVideoEffectPlace = _chunkVKF3PWKRcjs.checkVideoEffectPlace; exports.checkVideoEffectValues = _chunkVKF3PWKRcjs.checkVideoEffectValues; exports.checkVideoProject = checkVideoProject; exports.checkVideoTimeRemap = _chunkVKF3PWKRcjs.checkVideoTimeRemap; exports.createVideoEditorToolProvider = createVideoEditorToolProvider; exports.createVideoEffectsToolProvider = createVideoEffectsToolProvider; exports.createVideoElementDecoder = createVideoElementDecoder; exports.createVideoProject = createVideoProject; exports.decodeVideoAudioPeaks = decodeVideoAudioPeaks; exports.describeVideoProject = describeVideoProject; exports.describeVideoSequence = describeVideoSequence; exports.drawVideoFrame = _chunkVKF3PWKRcjs.drawVideoFrame; exports.ffmpegFilterValue = _chunkVKF3PWKRcjs.ffmpegFilterValue; exports.findVideoAudioSilences = findVideoAudioSilences; exports.findVideoClip = _chunkVKF3PWKRcjs.findVideoClip; exports.findVideoFillers = findVideoFillers; exports.findVideoGaps = _chunkVKF3PWKRcjs.findVideoGaps; exports.findVideoSequenceClip = _chunkVKF3PWKRcjs.findVideoSequenceClip; exports.findVideoSequenceCycle = _chunkVKF3PWKRcjs.findVideoSequenceCycle; exports.findVideoTranscriptPauses = findVideoTranscriptPauses; exports.findVideoTranscriptText = findVideoTranscriptText; exports.formatVideoSeconds = _chunkVKF3PWKRcjs.formatVideoSeconds; exports.formatVideoTimecode = _chunkVKF3PWKRcjs.formatVideoTimecode; exports.formatVideoTimecodeFrames = _chunkVKF3PWKRcjs.formatVideoTimecodeFrames; exports.isVideoDropFrameRate = _chunkVKF3PWKRcjs.isVideoDropFrameRate; exports.isVideoKeyframes = _chunkVKF3PWKRcjs.isVideoKeyframes; exports.mergeVideoRanges = mergeVideoRanges; exports.mixEffectPixels = _chunkVKF3PWKRcjs.mixEffectPixels; exports.nextFreeVideoSlot = _chunkVKF3PWKRcjs.nextFreeVideoSlot; exports.normalizeVideoGrade = _chunkVKF3PWKRcjs.normalizeVideoGrade; exports.normalizeVideoGradeLut = _chunkVKF3PWKRcjs.normalizeVideoGradeLut; exports.normalizeVideoWord = normalizeVideoWord; exports.overEffectPixels = _chunkVKF3PWKRcjs.overEffectPixels; exports.parseVideoAnimatable = parseVideoAnimatable; exports.parseVideoAsset = parseVideoAsset; exports.parseVideoAssetProxies = parseVideoAssetProxies; exports.parseVideoClip = parseVideoClip; exports.parseVideoClipAnimation = parseVideoClipAnimation; exports.parseVideoClipEffects = parseVideoClipEffects; exports.parseVideoCubeLut = _chunkVKF3PWKRcjs.parseVideoCubeLut; exports.parseVideoEffectRef = parseVideoEffectRef; exports.parseVideoEffectValues = parseVideoEffectValues; exports.parseVideoGrade = parseVideoGrade; exports.parseVideoGradeLut = parseVideoGradeLut; exports.parseVideoKeyframes = parseVideoKeyframes; exports.parseVideoLoudnessMeasurement = _chunkVKF3PWKRcjs.parseVideoLoudnessMeasurement; exports.parseVideoMarker = parseVideoMarker; exports.parseVideoPreviewScale = parseVideoPreviewScale; exports.parseVideoProject = parseVideoProject; exports.parseVideoSequence = parseVideoSequence; exports.parseVideoTimeRef = parseVideoTimeRef; exports.parseVideoTimeRemap = parseVideoTimeRemap; exports.parseVideoTrack = parseVideoTrack; exports.parseVideoTranscript = parseVideoTranscript; exports.parseVideoTranscriptWords = parseVideoTranscriptWords; exports.parseVideoTransform = parseVideoTransform; exports.parseVideoTransition = parseVideoTransition; exports.placeVideoRect = _chunkVKF3PWKRcjs.placeVideoRect; exports.planVideoClipDrag = planVideoClipDrag; exports.planVideoPrefetch = planVideoPrefetch; exports.planVideoToolPlayback = planVideoToolPlayback; exports.probeVideoMedia = probeVideoMedia; exports.readVideoScopesPanel = readVideoScopesPanel; exports.removeVideoKey = _chunkVKF3PWKRcjs.removeVideoKey; exports.renderVideoFrameExact = _chunkVKF3PWKRcjs.renderVideoFrameExact; exports.resolveVideoPreviewScale = resolveVideoPreviewScale; exports.retimeVideoAnimatable = _chunkVKF3PWKRcjs.retimeVideoAnimatable; exports.setVideoKey = _chunkVKF3PWKRcjs.setVideoKey; exports.snapToVideoFrame = _chunkVKF3PWKRcjs.snapToVideoFrame; exports.snapVideoTime = _chunkVKF3PWKRcjs.snapVideoTime; exports.sortVideoKeys = _chunkVKF3PWKRcjs.sortVideoKeys; exports.sortedVideoClips = _chunkVKF3PWKRcjs.sortedVideoClips; exports.splitVideoAnimatable = _chunkVKF3PWKRcjs.splitVideoAnimatable; exports.summarizeVideoScopes = summarizeVideoScopes; exports.toVideoEdl = _chunkVKF3PWKRcjs.toVideoEdl; exports.toVideoFfmpeg = _chunkVKF3PWKRcjs.toVideoFfmpeg; exports.toVideoLoudnessMeasure = _chunkVKF3PWKRcjs.toVideoLoudnessMeasure; exports.videoAssetDropEdit = videoAssetDropEdit; exports.videoAssetHasSound = _chunkVKF3PWKRcjs.videoAssetHasSound; exports.videoAssetKindOf = videoAssetKindOf; exports.videoAssetMap = _chunkVKF3PWKRcjs.videoAssetMap; exports.videoAssetProxy = videoAssetProxy; exports.videoAudioLevels = videoAudioLevels; exports.videoAudioPeakRange = videoAudioPeakRange; exports.videoAudioPeakSpans = videoAudioPeakSpans; exports.videoAudioPeaksDuration = videoAudioPeaksDuration; exports.videoCacheEvictions = videoCacheEvictions; exports.videoChroma = videoChroma; exports.videoClipAfter = _chunkVKF3PWKRcjs.videoClipAfter; exports.videoClipAnimated = _chunkVKF3PWKRcjs.videoClipAnimated; exports.videoClipAnimationProperties = _chunkVKF3PWKRcjs.videoClipAnimationProperties; exports.videoClipAnimationSpans = _chunkVKF3PWKRcjs.videoClipAnimationSpans; exports.videoClipAppliedEffects = videoClipAppliedEffects; exports.videoClipBefore = _chunkVKF3PWKRcjs.videoClipBefore; exports.videoClipEffectUses = _chunkVKF3PWKRcjs.videoClipEffectUses; exports.videoClipEnd = _chunkVKF3PWKRcjs.videoClipEnd; exports.videoClipHandles = _chunkVKF3PWKRcjs.videoClipHandles; exports.videoClipKeyframes = videoClipKeyframes; exports.videoClipLabel = videoClipLabel; exports.videoClipOverhang = _chunkVKF3PWKRcjs.videoClipOverhang; exports.videoClipShowsWaveform = videoClipShowsWaveform; exports.videoClipSoundGain = _chunkVKF3PWKRcjs.videoClipSoundGain; exports.videoClipSourceRange = _chunkVKF3PWKRcjs.videoClipSourceRange; exports.videoClipSourceTime = _chunkVKF3PWKRcjs.videoClipSourceTime; exports.videoClipSpeed = _chunkVKF3PWKRcjs.videoClipSpeed; exports.videoClipSpeedAt = _chunkVKF3PWKRcjs.videoClipSpeedAt; exports.videoClipTint = videoClipTint; exports.videoClipWaveform = videoClipWaveform; exports.videoClipWaveformPath = videoClipWaveformPath; exports.videoClipsAt = _chunkVKF3PWKRcjs.videoClipsAt; exports.videoContactSheetSvg = _chunkVKF3PWKRcjs.videoContactSheetSvg; exports.videoDragLabel = videoDragLabel; exports.videoDropTracks = videoDropTracks; exports.videoEaseBezier = _chunkVKF3PWKRcjs.videoEaseBezier; exports.videoEaseProgress = _chunkVKF3PWKRcjs.videoEaseProgress; exports.videoEffectFrameTime = _chunkVKF3PWKRcjs.videoEffectFrameTime; exports.videoEffectLayerKey = _chunkVKF3PWKRcjs.videoEffectLayerKey; exports.videoEffectValuesAt = _chunkVKF3PWKRcjs.videoEffectValuesAt; exports.videoExposureNotes = videoExposureNotes; exports.videoExposureStats = videoExposureStats; exports.videoFadeCurveGain = _chunkVKF3PWKRcjs.videoFadeCurveGain; exports.videoFfmpegUnsupportedEffects = _chunkVKF3PWKRcjs.videoFfmpegUnsupportedEffects; exports.videoFrameAt = _chunkVKF3PWKRcjs.videoFrameAt; exports.videoFrameCacheKey = videoFrameCacheKey; exports.videoFrameDuration = _chunkVKF3PWKRcjs.videoFrameDuration; exports.videoFrameLeafLayers = _chunkVKF3PWKRcjs.videoFrameLeafLayers; exports.videoFrameRequestsAt = videoFrameRequestsAt; exports.videoFrameToSvg = _chunkVKF3PWKRcjs.videoFrameToSvg; exports.videoFrames = _chunkVKF3PWKRcjs.videoFrames; exports.videoFreezeFrameEdit = _chunkVKF3PWKRcjs.videoFreezeFrameEdit; exports.videoGradeCssFilter = _chunkVKF3PWKRcjs.videoGradeCssFilter; exports.videoGradeFfmpegFilters = _chunkVKF3PWKRcjs.videoGradeFfmpegFilters; exports.videoGradeGainsFilterId = _chunkVKF3PWKRcjs.videoGradeGainsFilterId; exports.videoGradeLook = _chunkVKF3PWKRcjs.videoGradeLook; exports.videoGradePreset = _chunkVKF3PWKRcjs.videoGradePreset; exports.videoGradeStepMatrix = _chunkVKF3PWKRcjs.videoGradeStepMatrix; exports.videoGradeStepSvgValues = _chunkVKF3PWKRcjs.videoGradeStepSvgValues; exports.videoGradeSteps = _chunkVKF3PWKRcjs.videoGradeSteps; exports.videoGradeSvgDefs = _chunkVKF3PWKRcjs.videoGradeSvgDefs; exports.videoGradeSvgFilter = _chunkVKF3PWKRcjs.videoGradeSvgFilter; exports.videoHistogram = videoHistogram; exports.videoHistogramImage = videoHistogramImage; exports.videoHourFrames = _chunkVKF3PWKRcjs.videoHourFrames; exports.videoIrisRadius = _chunkVKF3PWKRcjs.videoIrisRadius; exports.videoIssueKey = videoIssueKey; exports.videoKeyframeBreakpoints = _chunkVKF3PWKRcjs.videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = _chunkVKF3PWKRcjs.videoKeyframeFfmpegExpr; exports.videoKeyframeRows = videoKeyframeRows; exports.videoKeyframeToggleEdit = videoKeyframeToggleEdit; exports.videoKeyframeValueEdit = videoKeyframeValueEdit; exports.videoKeysOf = _chunkVKF3PWKRcjs.videoKeysOf; exports.videoLayersUseEffects = _chunkVKF3PWKRcjs.videoLayersUseEffects; exports.videoLayersWithoutTransitionEffects = _chunkVKF3PWKRcjs.videoLayersWithoutTransitionEffects; exports.videoLuma = videoLuma; exports.videoLumaWaveform = videoLumaWaveform; exports.videoLutEdits = videoLutEdits; exports.videoLutFromFunction = _chunkVKF3PWKRcjs.videoLutFromFunction; exports.videoLutSvgApproximation = _chunkVKF3PWKRcjs.videoLutSvgApproximation; exports.videoLutSvgPrimitives = _chunkVKF3PWKRcjs.videoLutSvgPrimitives; exports.videoLutToCube = _chunkVKF3PWKRcjs.videoLutToCube; exports.videoOverlap = _chunkVKF3PWKRcjs.videoOverlap; exports.videoPeakDb = videoPeakDb; exports.videoPreviewSrc = videoPreviewSrc; exports.videoProjectDuration = _chunkVKF3PWKRcjs.videoProjectDuration; exports.videoProjectEffects = _chunkVKF3PWKRcjs.videoProjectEffects; exports.videoProjectHasProxies = videoProjectHasProxies; exports.videoProjectSvg = _chunkVKF3PWKRcjs.videoProjectSvg; exports.videoProxyFfmpeg = videoProxyFfmpeg; exports.videoProxyName = videoProxyName; exports.videoProxyPlan = videoProxyPlan; exports.videoRemoveRangesEdits = videoRemoveRangesEdits; exports.videoRulerTicks = videoRulerTicks; exports.videoScopeImage = videoScopeImage; exports.videoSequenceChildren = _chunkVKF3PWKRcjs.videoSequenceChildren; exports.videoSequenceDuration = _chunkVKF3PWKRcjs.videoSequenceDuration; exports.videoSequenceMap = _chunkVKF3PWKRcjs.videoSequenceMap; exports.videoShellQuote = _chunkVKF3PWKRcjs.videoShellQuote; exports.videoSlowMotionRamp = _chunkVKF3PWKRcjs.videoSlowMotionRamp; exports.videoSnapPoints = _chunkVKF3PWKRcjs.videoSnapPoints; exports.videoSourceFrame = videoSourceFrame; exports.videoSourceFrameTime = videoSourceFrameTime; exports.videoSpeedRampEdit = _chunkVKF3PWKRcjs.videoSpeedRampEdit; exports.videoSpeedRampKeys = _chunkVKF3PWKRcjs.videoSpeedRampKeys; exports.videoTextStyle = _chunkVKF3PWKRcjs.videoTextStyle; exports.videoTimeRef = videoTimeRef; exports.videoTimeRemapBreakpoints = _chunkVKF3PWKRcjs.videoTimeRemapBreakpoints; exports.videoTimeRemapSpan = _chunkVKF3PWKRcjs.videoTimeRemapSpan; exports.videoTimecodeFrames = _chunkVKF3PWKRcjs.videoTimecodeFrames; exports.videoTimelineTranscript = videoTimelineTranscript; exports.videoTitleFrame = _chunkVKF3PWKRcjs.videoTitleFrame; exports.videoTrackSyncLocked = _chunkVKF3PWKRcjs.videoTrackSyncLocked; exports.videoTranscriptEdit = videoTranscriptEdit; exports.videoTranscriptTrack = videoTranscriptTrack; exports.videoTransformAt = _chunkVKF3PWKRcjs.videoTransformAt; exports.videoTransitionAudioCurve = _chunkVKF3PWKRcjs.videoTransitionAudioCurve; exports.videoTransitionEase = _chunkVKF3PWKRcjs.videoTransitionEase; exports.videoTransitionHasDirection = videoTransitionHasDirection; exports.videoValueAt = _chunkVKF3PWKRcjs.videoValueAt; exports.videoVectorscope = videoVectorscope; exports.videoVectorscopeAngle = videoVectorscopeAngle; exports.videoVectorscopeImage = videoVectorscopeImage; exports.videoVectorscopePoint = videoVectorscopePoint; exports.videoWaveformImage = videoWaveformImage; exports.videoWaveformPath = videoWaveformPath; exports.videoWipeRect = _chunkVKF3PWKRcjs.videoWipeRect; exports.videoWordAt = videoWordAt; exports.videoWordsRange = videoWordsRange; exports.withVideoPlayback = withVideoPlayback;
@@ -32,3 +32,4 @@ export * from './controller.cjs';
32
32
  export * from './tools.cjs';
33
33
  export * from './effect-tools.cjs';
34
34
  export * from './ui.cjs';
35
+ export * from './playback.cjs';
@@ -32,3 +32,4 @@ export * from './controller.js';
32
32
  export * from './tools.js';
33
33
  export * from './effect-tools.js';
34
34
  export * from './ui.js';
35
+ export * from './playback.js';
@@ -3226,6 +3226,55 @@ function checkPreviewScale(scale) {
3226
3226
  return scale === 1 ? "full" : scale;
3227
3227
  }
3228
3228
 
3229
+ // src/video-editor/playback.ts
3230
+ function videoTimeRef(at) {
3231
+ return { kind: "time", id: [`t=${Math.round(at.time)}`, at.track ? `track=${at.track}` : "", at.clip ? `clip=${at.clip}` : ""].filter(Boolean).join(";") };
3232
+ }
3233
+ function parseVideoTimeRef(ref) {
3234
+ if (ref.kind !== "time") return null;
3235
+ const parts = Object.fromEntries(ref.id.split(";").map((p) => p.split("=")));
3236
+ const time = Number(parts.t);
3237
+ if (!Number.isFinite(time)) return null;
3238
+ return { time, ...parts.track ? { track: parts.track } : {}, ...parts.clip ? { clip: parts.clip } : {} };
3239
+ }
3240
+ var num2 = (v) => typeof v === "number" && Number.isFinite(v);
3241
+ var str2 = (v) => typeof v === "string" && v.length > 0;
3242
+ function clipsOf(args) {
3243
+ const out = [];
3244
+ const add = (v) => str2(v) && !out.includes(v) && out.push(v);
3245
+ add(args.clip);
3246
+ add(args.target);
3247
+ for (const key of ["clips", "ids"]) if (Array.isArray(args[key])) args[key].forEach(add);
3248
+ return out.slice(0, 6);
3249
+ }
3250
+ function planVideoToolPlayback(tool, args) {
3251
+ const clips = clipsOf(args);
3252
+ const track = str2(args.track) ? args.track : void 0;
3253
+ const newClip = args.clip && typeof args.clip === "object" ? args.clip : null;
3254
+ const time = [args.start, args.at, args.time, args.to, newClip?.start].find(num2);
3255
+ const click = (ref) => [{ type: "target", ref }, { type: "press" }, { type: "release" }];
3256
+ if (clips.length === 1 && (time !== void 0 || track) && tool !== "split_video_clip") {
3257
+ const clip = clips[0];
3258
+ const to = videoTimeRef({ time: time ?? 0, ...track ? { track } : { clip } });
3259
+ return [{ type: "target", ref: { kind: "clip", id: clip } }, { type: "press" }, { type: "target", ref: to }, { type: "release" }];
3260
+ }
3261
+ if (clips.length === 1 && time !== void 0) return click(videoTimeRef({ time, clip: clips[0] }));
3262
+ if (clips.length) return clips.flatMap((id) => click({ kind: "clip", id }));
3263
+ if (track) return click(time !== void 0 ? videoTimeRef({ time, track }) : { kind: "track", id: track });
3264
+ if (time !== void 0) return click(videoTimeRef({ time }));
3265
+ if (str2(args.marker)) return click({ kind: "marker", id: args.marker });
3266
+ return null;
3267
+ }
3268
+ function withVideoPlayback(provider, surface = "video") {
3269
+ const plan = (tool) => tool.plan || tool.playback !== void 0 ? tool : { ...tool, plan: (args) => planVideoToolPlayback(tool.name, args) };
3270
+ const tools = provider.tools;
3271
+ return {
3272
+ ...provider,
3273
+ playbackSurface: provider.playbackSurface ?? surface,
3274
+ tools: typeof tools === "function" ? () => tools().map(plan) : tools.map(plan)
3275
+ };
3276
+ }
3277
+
3229
3278
  // src/video-editor/ui.ts
3230
3279
  var STEPS = [40, 100, 200, 500, 1e3, 2e3, 5e3, 1e4, 15e3, 3e4, 6e4, 12e4, 3e5, 6e5];
3231
3280
  function videoRulerTicks(duration, pxPerSecond, fps) {
@@ -4618,7 +4667,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4618
4667
  };
4619
4668
  const reads = [getProject, listSequences, getFrame, getTranscript, findText, findFillers, findPauses, findGaps, checkProject, renderFrame, getScopes, previewCache, planProxies, exportFfmpeg, exportLoudnessMeasure, exportEdl, audioLevels, findSilences, seek, setPreviewScale];
4620
4669
  const writes = [setSettings, addAsset, updateAsset, removeAsset, setProxies, addTrack, updateTrack, removeTrack, moveTrack, addClip, moveClip, trimClip, splitClip, deleteClips, updateClip, setTransition, setSpeedRamp, addFreeze, removeRamp, setTranscript, removeRanges, applyGradePreset, copyGrade, setLut, removeLut, setKeyframes, removeKeyframes, slipClip, rollEdit, slideClip, liftRange, extractRange, splitAt, closeGaps, addMarker, removeMarker, editVideo, undo, redo];
4621
- return {
4670
+ return withVideoPlayback({
4622
4671
  id: options.id ?? "video",
4623
4672
  namespace: options.namespace,
4624
4673
  title: "Video editor",
@@ -4635,7 +4684,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4635
4684
  }
4636
4685
  });
4637
4686
  }
4638
- };
4687
+ });
4639
4688
  }
4640
4689
 
4641
4690
  // src/video-editor/effect-tools.ts
@@ -4683,7 +4732,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
4683
4732
  const effect = effects.find((e) => e.id === (instance ?? r.effect?.id)) ?? (r.effect ? { id: r.effect.id, effect: r.effect.effect, role: "clip effect", enabled: r.effect.enabled !== false, values: r.effect.values ?? {} } : effects[0]);
4684
4733
  return { target, effect, effects, ...extra };
4685
4734
  };
4686
- return createEffectToolProvider({
4735
+ return withVideoPlayback(createEffectToolProvider({
4687
4736
  id: options.id ?? "video-effects",
4688
4737
  namespace: options.namespace,
4689
4738
  title: "Video effects",
@@ -4810,7 +4859,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
4810
4859
  }
4811
4860
  }
4812
4861
  ]
4813
- });
4862
+ }));
4814
4863
  }
4815
4864
  export {
4816
4865
  VIDEO_BLEND_MODES,
@@ -4910,6 +4959,7 @@ export {
4910
4959
  parseVideoPreviewScale,
4911
4960
  parseVideoProject,
4912
4961
  parseVideoSequence,
4962
+ parseVideoTimeRef,
4913
4963
  parseVideoTimeRemap,
4914
4964
  parseVideoTrack,
4915
4965
  parseVideoTranscript,
@@ -4919,6 +4969,7 @@ export {
4919
4969
  placeVideoRect,
4920
4970
  planVideoClipDrag,
4921
4971
  planVideoPrefetch,
4972
+ planVideoToolPlayback,
4922
4973
  probeVideoMedia,
4923
4974
  readVideoScopesPanel,
4924
4975
  removeVideoKey,
@@ -5042,6 +5093,7 @@ export {
5042
5093
  videoSpeedRampEdit,
5043
5094
  videoSpeedRampKeys,
5044
5095
  videoTextStyle,
5096
+ videoTimeRef,
5045
5097
  videoTimeRemapBreakpoints,
5046
5098
  videoTimeRemapSpan,
5047
5099
  videoTimecodeFrames,
@@ -5063,5 +5115,6 @@ export {
5063
5115
  videoWaveformPath,
5064
5116
  videoWipeRect,
5065
5117
  videoWordAt,
5066
- videoWordsRange
5118
+ videoWordsRange,
5119
+ withVideoPlayback
5067
5120
  };
@@ -0,0 +1,20 @@
1
+ import type { AgentToolProvider } from '../tools/registry.cjs';
2
+ import type { PlaybackRef, PlaybackStep } from '../tools/playback.cjs';
3
+ /** A point on the timeline: `time` (ms), on `track` or on the row of `clip` (else the ruler). */
4
+ export interface VideoPlaybackTime {
5
+ time: number;
6
+ track?: string;
7
+ clip?: string;
8
+ }
9
+ /** A timeline point as a playback ref: `{ kind: 'time', id: 't=1200;track=v1' }`. */
10
+ export declare function videoTimeRef(at: VideoPlaybackTime): PlaybackRef;
11
+ /** Reads a `time` ref back (null for any other ref). */
12
+ export declare function parseVideoTimeRef(ref: PlaybackRef): VideoPlaybackTime | null;
13
+ /** The cursor steps for one video tool call (by bare name), or null to fall back to the ids it names. */
14
+ export declare function planVideoToolPlayback(tool: string, args: Record<string, any>): PlaybackStep[] | null;
15
+ /**
16
+ * Gives a video tool provider agent playback: each write tool plans its steps with
17
+ * `planVideoToolPlayback` and every call plays on `surface` (default `video`, where `VideoTimeline`
18
+ * attaches itself). `seek_video` (a read in name only) and `edit_video` (a batch) play too.
19
+ */
20
+ export declare function withVideoPlayback(provider: AgentToolProvider, surface?: string): AgentToolProvider;
@@ -0,0 +1,20 @@
1
+ import type { AgentToolProvider } from '../tools/registry.js';
2
+ import type { PlaybackRef, PlaybackStep } from '../tools/playback.js';
3
+ /** A point on the timeline: `time` (ms), on `track` or on the row of `clip` (else the ruler). */
4
+ export interface VideoPlaybackTime {
5
+ time: number;
6
+ track?: string;
7
+ clip?: string;
8
+ }
9
+ /** A timeline point as a playback ref: `{ kind: 'time', id: 't=1200;track=v1' }`. */
10
+ export declare function videoTimeRef(at: VideoPlaybackTime): PlaybackRef;
11
+ /** Reads a `time` ref back (null for any other ref). */
12
+ export declare function parseVideoTimeRef(ref: PlaybackRef): VideoPlaybackTime | null;
13
+ /** The cursor steps for one video tool call (by bare name), or null to fall back to the ids it names. */
14
+ export declare function planVideoToolPlayback(tool: string, args: Record<string, any>): PlaybackStep[] | null;
15
+ /**
16
+ * Gives a video tool provider agent playback: each write tool plans its steps with
17
+ * `planVideoToolPlayback` and every call plays on `surface` (default `video`, where `VideoTimeline`
18
+ * attaches itself). `seek_video` (a read in name only) and `edit_video` (a batch) play too.
19
+ */
20
+ export declare function withVideoPlayback(provider: AgentToolProvider, surface?: string): AgentToolProvider;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixerate/editor",
3
- "version": "0.140.4",
3
+ "version": "0.142.1",
4
4
  "description": "UI-agnostic rich text and media editing core library",
5
5
  "author": "Pixerate",
6
6
  "license": "MIT",
@@ -61,6 +61,19 @@ editor's, or (in discovery mode) only `list_toolsets`, `search_tools`, `enable_t
61
61
  6. **Undo your own mistakes** with the domain's `undo_*` tool or the `history.undo` command, not
62
62
  by hand-reverting with more edits.
63
63
 
64
+ ## Playback
65
+
66
+ The host may act your calls out on screen (agent playback): your cursor glides to what a call
67
+ names, presses, drags or types, and the change lands as one undo step. Results are the same with
68
+ or without it, and calls simply take a little longer while it plays.
69
+
70
+ - Do not add waits or poll for the animation; each call returns once its change is applied.
71
+ - Name your targets with the ids read tools return (`ids`, `nodeId`, `layerId`, a range). They are
72
+ also what the cursor heads for, so the user can follow along.
73
+ - A batch (`run_commands`) plays its steps' moves first, then applies once as one undo step.
74
+ - If you connect over MCP, your client's name labels your cursor; several agents get separate
75
+ cursors.
76
+
64
77
  ## Errors
65
78
 
66
79
  A failed call comes back as an `isError` result whose text says what was wrong and how to fix
@@ -147,6 +147,7 @@ refuse.
147
147
 
148
148
  ## Pitfalls
149
149
 
150
+ - With agent playback on, the cursor clicks the shot a call names in the timeline and visits the stage elements its commands target. Results are unchanged.
150
151
  - **Effect commands are ordinary commands.** You can retime or edit them with `edit_animation` like
151
152
  any command, but `update_effect` replaces all of an effect's commands. Change values through the
152
153
  effect, and timing through the commands.
@@ -271,6 +271,9 @@ effects provider (for example Flair); without one the read tools say so and the
271
271
  `get_editor_state` again, not guess.
272
272
  - `canvas_add_node` with `nearNodeId` also adds an edge from that node. Pass an explicit
273
273
  `position` (and no `nearNodeId`) for a free-standing design element.
274
+ - With agent playback on, the cursor clicks where `canvas_add_node` will place the node, drags
275
+ `canvas_connect` from source to target, and rings the nodes a layout or arrange command moved.
276
+ Nothing about the calls changes: still read ids with `get_editor_state` and pass them back.
274
277
  - `canvas_update_node` changes `data` only. Move nodes with layout, align or distribute commands,
275
278
  or by the host's own means; do not expect `position` inside `data` to move anything.
276
279
  - Align needs at least two nodes and distribute at least three; locked nodes never move. Shape
@@ -168,6 +168,7 @@ several charts may register them with another prefix.
168
168
 
169
169
  ## Pitfalls
170
170
 
171
+ - With agent playback on, value changes and selections are dragged by the chart's director, and other changes are clicked on the inspector option, data grid or toolbar they belong to. Results are unchanged.
171
172
  - Series values are positional: one value per category, in category order. After
172
173
  `add_chart_category` or `remove_chart_category`, every series shifts with it.
173
174
  - `set_chart_data` with only `series` keeps the categories; with only `categories` it keeps
@@ -415,8 +415,8 @@ in the source frame at the document's bit depth, colour mode and profile. Read
415
415
 
416
416
  ## Pitfalls
417
417
 
418
- - Effects need a shape: on an empty layer they draw nothing. They cannot go on adjustment
419
- layers. A clipped layer's effects stay inside the layer it is clipped to.
418
+ - Agent playback (if on) opens each write's panel, then traces `points`, drags boxes or visits the layers and sliders named; results are unchanged.
419
+ - Effects need a shape: on an empty layer they draw nothing. They cannot go on adjustment layers. A clipped layer's effects stay inside the layer it is clipped to.
420
420
  - `bevel-emboss` has no `blend` / `opacity`: it uses `highlightBlend`, `highlightOpacity`,
421
421
  `shadowBlend` and `shadowOpacity`. Inner shadows and inner glows use `choke`, not `spread`.
422
422
  - Glows paint a colour or a gradient, never a pattern; strokes take all three. Pattern effects
@@ -417,6 +417,7 @@ for the controls and presets.
417
417
 
418
418
  ## Pitfalls
419
419
 
420
+ - With agent playback on, strokes, fills and replays are painted live by the director, and other writes open their panel (Colour, Wet, Paper, Layers, Effects) and point at the control. Results are unchanged.
420
421
  - **Stroke-by-stroke drawing is slow and expensive.** Do not draw a detailed picture point by
421
422
  point. Block in with fills and big strokes, then replay and vary a few good strokes.
422
423
  - **A hidden or locked layer refuses paint**: show it (`update_layer visible true`) or unlock it.
@@ -69,6 +69,7 @@ with `list_commands` (query "Parameters").
69
69
 
70
70
  ## Pitfalls
71
71
 
72
+ - With agent playback on, `parameters.set` visits each control it changes and types the value. Set related values in one call; results are unchanged.
72
73
  - `parameters.set` takes a `values` object, not top-level ids: `{ "values": { "speed": 2 } }`.
73
74
  - One out-of-range value fails the whole call (nothing changes). Read the message, fix that
74
75
  value, and resend the full set.
@@ -126,6 +126,7 @@ nothing to do they fail with the reason.
126
126
 
127
127
  ## Pitfalls
128
128
 
129
+ - With agent playback on, `set_cell` is clicked and typed, `set_range` is dragged across the block it fills, and row and column edits mark their rows or columns. Results are unchanged; keep writing whole blocks with `set_range`.
129
130
  - **Raw versus computed.** `values` holds results, `raw` holds what to edit. When copying or
130
131
  moving a formula, copy from `raw`; `set_range` writes references as given (it does not
131
132
  offset relative references the way paste or fill-down does), so write each row's formula