@pixerate/editor 0.229.0 → 0.231.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 (73) hide show
  1. package/dist/animation-editor/camera-tools.d.cts +10 -0
  2. package/dist/animation-editor/camera-tools.d.ts +10 -0
  3. package/dist/animation-editor/camera.d.cts +67 -0
  4. package/dist/animation-editor/camera.d.ts +67 -0
  5. package/dist/animation-editor/compile.d.cts +4 -0
  6. package/dist/animation-editor/compile.d.ts +4 -0
  7. package/dist/animation-editor/controller.d.cts +34 -2
  8. package/dist/animation-editor/controller.d.ts +34 -2
  9. package/dist/animation-editor/effect-tools.d.cts +2 -1
  10. package/dist/animation-editor/effect-tools.d.ts +2 -1
  11. package/dist/animation-editor/evaluate.d.cts +9 -0
  12. package/dist/animation-editor/evaluate.d.ts +9 -0
  13. package/dist/animation-editor/flair.d.cts +8 -0
  14. package/dist/animation-editor/flair.d.ts +8 -0
  15. package/dist/animation-editor/index.cjs +603 -217
  16. package/dist/animation-editor/index.d.cts +2 -0
  17. package/dist/animation-editor/index.d.ts +2 -0
  18. package/dist/animation-editor/index.js +454 -68
  19. package/dist/animation-editor/issues.d.cts +16 -0
  20. package/dist/animation-editor/issues.d.ts +16 -0
  21. package/dist/animation-editor/tools.d.cts +1 -1
  22. package/dist/animation-editor/tools.d.ts +1 -1
  23. package/dist/animation-editor/types.d.cts +21 -3
  24. package/dist/animation-editor/types.d.ts +21 -3
  25. package/dist/canvas/index.cjs +7 -7
  26. package/dist/canvas/index.js +1 -1
  27. package/dist/{chunk-IGPEBXUD.cjs → chunk-5T3H7CGG.cjs} +21 -11
  28. package/dist/{chunk-K5GXW5TR.cjs → chunk-C73U5UI3.cjs} +14 -14
  29. package/dist/{chunk-LPTFDCJO.js → chunk-CSM5T6SE.js} +14 -4
  30. package/dist/{chunk-EBDZWIOP.cjs → chunk-ERJA5CGT.cjs} +5 -1
  31. package/dist/{chunk-5MQOBTNP.cjs → chunk-OPSK22DL.cjs} +80 -9
  32. package/dist/{chunk-PB6JV62G.js → chunk-SBPGIZQN.js} +1 -1
  33. package/dist/{chunk-UGYUGZE2.js → chunk-TCZ2J7PR.js} +71 -0
  34. package/dist/{chunk-W4KFNAWC.js → chunk-TYCJGFCF.js} +5 -1
  35. package/dist/effects/helpers.d.cts +35 -1
  36. package/dist/effects/helpers.d.ts +35 -1
  37. package/dist/effects/index.cjs +60 -44
  38. package/dist/effects/index.js +18 -2
  39. package/dist/effects/types.d.cts +15 -0
  40. package/dist/effects/types.d.ts +15 -0
  41. package/dist/image-editor/index.cjs +13 -13
  42. package/dist/image-editor/index.js +1 -1
  43. package/dist/paint-editor/index.cjs +7 -7
  44. package/dist/paint-editor/index.js +2 -2
  45. package/dist/vector/index.cjs +6 -6
  46. package/dist/vector/index.js +1 -1
  47. package/dist/video-editor/camera-tools.d.cts +10 -0
  48. package/dist/video-editor/camera-tools.d.ts +10 -0
  49. package/dist/video-editor/camera.d.cts +47 -0
  50. package/dist/video-editor/camera.d.ts +47 -0
  51. package/dist/video-editor/check.d.cts +1 -1
  52. package/dist/video-editor/check.d.ts +1 -1
  53. package/dist/video-editor/controller.d.cts +37 -2
  54. package/dist/video-editor/controller.d.ts +37 -2
  55. package/dist/video-editor/effect-tools.d.cts +2 -1
  56. package/dist/video-editor/effect-tools.d.ts +2 -1
  57. package/dist/video-editor/index.cjs +705 -390
  58. package/dist/video-editor/index.d.cts +2 -0
  59. package/dist/video-editor/index.d.ts +2 -0
  60. package/dist/video-editor/index.js +334 -19
  61. package/dist/video-editor/keyframes.d.cts +10 -3
  62. package/dist/video-editor/keyframes.d.ts +10 -3
  63. package/dist/video-editor/parse.d.cts +5 -3
  64. package/dist/video-editor/parse.d.ts +5 -3
  65. package/dist/video-editor/tools.d.cts +18 -0
  66. package/dist/video-editor/tools.d.ts +18 -0
  67. package/dist/video-editor/types.d.cts +37 -1
  68. package/dist/video-editor/types.d.ts +37 -1
  69. package/package.json +1 -1
  70. package/skills/pixerate-animation-editor/SKILL.md +28 -1
  71. package/skills/pixerate-animation-motion-graphics/SKILL.md +3 -0
  72. package/skills/pixerate-video-editor/SKILL.md +16 -1
  73. package/skills/pixerate-video-montage/SKILL.md +2 -1
@@ -558,7 +558,7 @@ import {
558
558
  EffectsSlot,
559
559
  createEffectToolProvider,
560
560
  resolveEffectValues
561
- } from "../chunk-UGYUGZE2.js";
561
+ } from "../chunk-TCZ2J7PR.js";
562
562
  import "../chunk-V2ZCJRDM.js";
563
563
  import {
564
564
  GRAIN_PATTERNS
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Agent tools for provider camera moves on video clips (see `VideoClipCamera`): list the moves
3
+ * by role, set one on a clip (baked into its transform keys) and clear it. They ride on the video
4
+ * effects tool provider (`createVideoEffectsToolProvider`).
5
+ */
6
+ import type { EffectToolContext } from '../effects/tools.cjs';
7
+ import type { AgentTool } from '../tools/registry.cjs';
8
+ import type { VideoEditorController } from './controller.cjs';
9
+ /** The video camera move tools (see the module comment). */
10
+ export declare function videoCameraMoveTools(controller: VideoEditorController, ctx: EffectToolContext): AgentTool[];
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Agent tools for provider camera moves on video clips (see `VideoClipCamera`): list the moves
3
+ * by role, set one on a clip (baked into its transform keys) and clear it. They ride on the video
4
+ * effects tool provider (`createVideoEffectsToolProvider`).
5
+ */
6
+ import type { EffectToolContext } from '../effects/tools.js';
7
+ import type { AgentTool } from '../tools/registry.js';
8
+ import type { VideoEditorController } from './controller.js';
9
+ /** The video camera move tools (see the module comment). */
10
+ export declare function videoCameraMoveTools(controller: VideoEditorController, ctx: EffectToolContext): AgentTool[];
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Provider camera moves on video clips (see `VideoClipCamera` and `@pixerate/editor/effects`).
3
+ * A clip is the shot: a `transition` move (`in`) moves the camera from `from` to `framing` from
4
+ * the clip's start, and a `hold` move (`during`) plays across the rest of the clip. The moves are
5
+ * baked into the clip's x, y, scale and rotation keys with `sampleEffectCameraMove` at the
6
+ * project's frame rate, keeping a cut's two keys (a jump), so nothing downstream needs the
7
+ * provider. The camera looks at the clip's picture as its own transform places it.
8
+ */
9
+ import type { CameraMoveRole, CameraMoveSpec, CameraStage, CameraView, EffectProvider } from '../effects/types.cjs';
10
+ import type { VideoCameraFraming, VideoClip, VideoClipCamera, VideoProject, VideoTransform } from './types.cjs';
11
+ /** The view that shows `framing` of a `stage`-sized frame (see `VideoCameraFraming`). */
12
+ export declare function videoCameraView(framing: VideoCameraFraming | undefined, stage: CameraStage): CameraView;
13
+ /**
14
+ * The clip transform that shows `view` of a picture placed by `base`: the picture's centre goes
15
+ * where the camera puts it (turned by the view's roll round the frame's centre), its scale times
16
+ * the zoom, its rotation plus the roll. Tilt, turn and blur have no place in a clip transform.
17
+ */
18
+ export declare function videoTransformOfView(view: CameraView, base: VideoClipCamera['base'], stage: CameraStage): Required<VideoClipCamera['base']>;
19
+ /** What baking a clip's camera moves gave: its transform with the keys, and notes on what could not be kept. */
20
+ export interface VideoCameraBake {
21
+ transform: VideoTransform;
22
+ /** Ms from the clip's start of each move's cut, when it has one. */
23
+ cuts: number[];
24
+ /** When each move plays (clip ms). */
25
+ windows: {
26
+ in?: {
27
+ start: number;
28
+ end: number;
29
+ };
30
+ during?: {
31
+ start: number;
32
+ end: number;
33
+ };
34
+ };
35
+ notes: string[];
36
+ }
37
+ /** The clip's transform as plain numbers, for a camera's `base` (refusing keyed fields, which a camera would replace). */
38
+ export declare function videoCameraBase(clip: VideoClip): VideoClipCamera['base'];
39
+ /**
40
+ * Bakes a clip's camera moves (its `camera`) into transform keys at the project's frame rate:
41
+ * `in` from the clip's start over its `ms` (default the move's `durationMs`), then `during`
42
+ * across the rest of the clip. Keys are linear, one per frame, with both keys of a cut kept.
43
+ * Async: the provider samples the moves (`sampleEffectCameraMove`).
44
+ */
45
+ export declare function bakeVideoClipCamera(clip: VideoClip, camera: VideoClipCamera, project: Pick<VideoProject, 'width' | 'height' | 'fps'>, provider: EffectProvider): Promise<VideoCameraBake>;
46
+ /** A clip's camera move for a role as its parts, or undefined. */
47
+ export declare function videoClipCameraMove(clip: Pick<VideoClip, 'camera'> | undefined, role: CameraMoveRole): Exclude<CameraMoveSpec, string> | undefined;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Provider camera moves on video clips (see `VideoClipCamera` and `@pixerate/editor/effects`).
3
+ * A clip is the shot: a `transition` move (`in`) moves the camera from `from` to `framing` from
4
+ * the clip's start, and a `hold` move (`during`) plays across the rest of the clip. The moves are
5
+ * baked into the clip's x, y, scale and rotation keys with `sampleEffectCameraMove` at the
6
+ * project's frame rate, keeping a cut's two keys (a jump), so nothing downstream needs the
7
+ * provider. The camera looks at the clip's picture as its own transform places it.
8
+ */
9
+ import type { CameraMoveRole, CameraMoveSpec, CameraStage, CameraView, EffectProvider } from '../effects/types.js';
10
+ import type { VideoCameraFraming, VideoClip, VideoClipCamera, VideoProject, VideoTransform } from './types.js';
11
+ /** The view that shows `framing` of a `stage`-sized frame (see `VideoCameraFraming`). */
12
+ export declare function videoCameraView(framing: VideoCameraFraming | undefined, stage: CameraStage): CameraView;
13
+ /**
14
+ * The clip transform that shows `view` of a picture placed by `base`: the picture's centre goes
15
+ * where the camera puts it (turned by the view's roll round the frame's centre), its scale times
16
+ * the zoom, its rotation plus the roll. Tilt, turn and blur have no place in a clip transform.
17
+ */
18
+ export declare function videoTransformOfView(view: CameraView, base: VideoClipCamera['base'], stage: CameraStage): Required<VideoClipCamera['base']>;
19
+ /** What baking a clip's camera moves gave: its transform with the keys, and notes on what could not be kept. */
20
+ export interface VideoCameraBake {
21
+ transform: VideoTransform;
22
+ /** Ms from the clip's start of each move's cut, when it has one. */
23
+ cuts: number[];
24
+ /** When each move plays (clip ms). */
25
+ windows: {
26
+ in?: {
27
+ start: number;
28
+ end: number;
29
+ };
30
+ during?: {
31
+ start: number;
32
+ end: number;
33
+ };
34
+ };
35
+ notes: string[];
36
+ }
37
+ /** The clip's transform as plain numbers, for a camera's `base` (refusing keyed fields, which a camera would replace). */
38
+ export declare function videoCameraBase(clip: VideoClip): VideoClipCamera['base'];
39
+ /**
40
+ * Bakes a clip's camera moves (its `camera`) into transform keys at the project's frame rate:
41
+ * `in` from the clip's start over its `ms` (default the move's `durationMs`), then `during`
42
+ * across the rest of the clip. Keys are linear, one per frame, with both keys of a cut kept.
43
+ * Async: the provider samples the moves (`sampleEffectCameraMove`).
44
+ */
45
+ export declare function bakeVideoClipCamera(clip: VideoClip, camera: VideoClipCamera, project: Pick<VideoProject, 'width' | 'height' | 'fps'>, provider: EffectProvider): Promise<VideoCameraBake>;
46
+ /** A clip's camera move for a role as its parts, or undefined. */
47
+ export declare function videoClipCameraMove(clip: Pick<VideoClip, 'camera'> | undefined, role: CameraMoveRole): Exclude<CameraMoveSpec, string> | undefined;
@@ -6,7 +6,7 @@ export declare function videoClipKeyframes(clip: VideoClip): {
6
6
  keys: ReturnType<typeof videoKeysOf>;
7
7
  }[];
8
8
  export type VideoIssueSeverity = 'error' | 'warning' | 'note';
9
- export declare const VIDEO_ISSUE_CODES: readonly ["missing-asset", "missing-sequence", "sequence-cycle", "wrong-track", "overlap", "source-overrun", "transition-without-cut", "transition-too-long", "transition-handles", "fades-too-long", "animations-too-long", "animation-keyed", "keyframes-outside-clip", "unknown-duration", "unused-asset", "unused-sequence", "marker-past-end", "missing-target-track", "empty"];
9
+ export declare const VIDEO_ISSUE_CODES: readonly ["missing-asset", "missing-sequence", "sequence-cycle", "wrong-track", "overlap", "source-overrun", "transition-without-cut", "transition-too-long", "transition-handles", "fades-too-long", "animations-too-long", "animation-keyed", "keyframes-outside-clip", "camera-stale", "unknown-duration", "unused-asset", "unused-sequence", "marker-past-end", "missing-target-track", "empty"];
10
10
  export type VideoIssueCode = (typeof VIDEO_ISSUE_CODES)[number];
11
11
  export interface VideoIssue {
12
12
  code: VideoIssueCode;
@@ -6,7 +6,7 @@ export declare function videoClipKeyframes(clip: VideoClip): {
6
6
  keys: ReturnType<typeof videoKeysOf>;
7
7
  }[];
8
8
  export type VideoIssueSeverity = 'error' | 'warning' | 'note';
9
- export declare const VIDEO_ISSUE_CODES: readonly ["missing-asset", "missing-sequence", "sequence-cycle", "wrong-track", "overlap", "source-overrun", "transition-without-cut", "transition-too-long", "transition-handles", "fades-too-long", "animations-too-long", "animation-keyed", "keyframes-outside-clip", "unknown-duration", "unused-asset", "unused-sequence", "marker-past-end", "missing-target-track", "empty"];
9
+ export declare const VIDEO_ISSUE_CODES: readonly ["missing-asset", "missing-sequence", "sequence-cycle", "wrong-track", "overlap", "source-overrun", "transition-without-cut", "transition-too-long", "transition-handles", "fades-too-long", "animations-too-long", "animation-keyed", "keyframes-outside-clip", "camera-stale", "unknown-duration", "unused-asset", "unused-sequence", "marker-past-end", "missing-target-track", "empty"];
10
10
  export type VideoIssueCode = (typeof VIDEO_ISSUE_CODES)[number];
11
11
  export interface VideoIssue {
12
12
  code: VideoIssueCode;
@@ -12,9 +12,10 @@ import { VideoPreviewPixels } from './scopes.cjs';
12
12
  import type { VideoPreviewScale } from './proxy.cjs';
13
13
  import type { VideoFrameCache } from './frame-cache.cjs';
14
14
  import { type VideoSvgOptions } from './render.cjs';
15
- import type { VideoClipEffect, VideoEffectValues, VideoPlacementMode, VideoProject } from './types.cjs';
15
+ import type { VideoCameraFraming, VideoClipCamera, VideoClipEffect, VideoEffectValues, VideoPlacementMode, VideoProject } from './types.cjs';
16
16
  import { EffectsSlot } from '../effects/helpers.cjs';
17
- import type { EffectDescription, EffectProvider, EffectValue } from '../effects/types.cjs';
17
+ import { type VideoCameraBake } from './camera.cjs';
18
+ import type { CameraMoveRole, CameraMoveSpec, EffectDescription, EffectProvider, EffectSummary, EffectValue } from '../effects/types.cjs';
18
19
  import { VideoEffectsEngine, type VideoEffectPlace } from './effects.cjs';
19
20
  import { type VideoAnimatable, type VideoKey } from './keyframes.cjs';
20
21
  import { type VideoEditPlan, type VideoEditPlanInput } from './plan.cjs';
@@ -50,6 +51,19 @@ export interface VideoEditorOptions {
50
51
  effects?: EffectProvider | null;
51
52
  }
52
53
  /** What `applyClipEffect` and the other effect edits return: the edit result plus what they made or changed. */
54
+ /** What setting or clearing a clip's camera move did: its camera now, the keys baked per property, any cuts and when each move plays (clip ms). */
55
+ export type VideoCameraMoveResult = {
56
+ ok: true;
57
+ clip: string;
58
+ camera: VideoClipCamera | null;
59
+ keys: Record<'x' | 'y' | 'scale' | 'rotation', number>;
60
+ cuts: number[];
61
+ windows: VideoCameraBake['windows'];
62
+ notes: string[];
63
+ } | {
64
+ ok: false;
65
+ error: string;
66
+ };
53
67
  export type VideoEffectEditResult = (VideoEditResult & {
54
68
  ok: true;
55
69
  clip: string;
@@ -272,6 +286,27 @@ export declare class VideoEditorController {
272
286
  }, options?: {
273
287
  merge?: string;
274
288
  }): Promise<VideoEffectEditResult>;
289
+ /** The provider's camera moves for a role (`transition` into a clip, `hold` while it plays), or all of them. Empty without camera support. */
290
+ cameraMoves(role?: CameraMoveRole): Promise<EffectSummary[]>;
291
+ private cameraClip;
292
+ private cameraEdit;
293
+ /**
294
+ * Sets the camera move a clip plays into (`transition`: from `from` to `framing` from the
295
+ * clip's start) or while it holds (`hold`: across the rest of the clip at `framing`), and bakes
296
+ * the clip's moves into its x, y, scale and rotation keys at the project's frame rate, keeping a
297
+ * cut's two keys. The move is checked first (role, preset, values; a preset's values and a move
298
+ * in's length are written out). A clip whose transform is keyed by hand is refused. One undo step.
299
+ */
300
+ setClipCameraMove(clip: string, role: CameraMoveRole, spec: CameraMoveSpec, options?: {
301
+ from?: VideoCameraFraming | null;
302
+ framing?: VideoCameraFraming | null;
303
+ merge?: string;
304
+ }): Promise<VideoCameraMoveResult>;
305
+ /**
306
+ * Removes a clip's camera move for a role and bakes what is left (which needs the provider);
307
+ * with no move left the transform goes back to what it was before the moves. One undo step.
308
+ */
309
+ clearClipCameraMove(clip: string, role: CameraMoveRole): Promise<VideoCameraMoveResult>;
275
310
  /** Removes an effect from a clip's stack (works without a provider, so placeholders can be cleared). One undo step. */
276
311
  removeClipEffect(clip: string, instance: string): VideoEffectEditResult;
277
312
  /**
@@ -12,9 +12,10 @@ import { VideoPreviewPixels } from './scopes.js';
12
12
  import type { VideoPreviewScale } from './proxy.js';
13
13
  import type { VideoFrameCache } from './frame-cache.js';
14
14
  import { type VideoSvgOptions } from './render.js';
15
- import type { VideoClipEffect, VideoEffectValues, VideoPlacementMode, VideoProject } from './types.js';
15
+ import type { VideoCameraFraming, VideoClipCamera, VideoClipEffect, VideoEffectValues, VideoPlacementMode, VideoProject } from './types.js';
16
16
  import { EffectsSlot } from '../effects/helpers.js';
17
- import type { EffectDescription, EffectProvider, EffectValue } from '../effects/types.js';
17
+ import { type VideoCameraBake } from './camera.js';
18
+ import type { CameraMoveRole, CameraMoveSpec, EffectDescription, EffectProvider, EffectSummary, EffectValue } from '../effects/types.js';
18
19
  import { VideoEffectsEngine, type VideoEffectPlace } from './effects.js';
19
20
  import { type VideoAnimatable, type VideoKey } from './keyframes.js';
20
21
  import { type VideoEditPlan, type VideoEditPlanInput } from './plan.js';
@@ -50,6 +51,19 @@ export interface VideoEditorOptions {
50
51
  effects?: EffectProvider | null;
51
52
  }
52
53
  /** What `applyClipEffect` and the other effect edits return: the edit result plus what they made or changed. */
54
+ /** What setting or clearing a clip's camera move did: its camera now, the keys baked per property, any cuts and when each move plays (clip ms). */
55
+ export type VideoCameraMoveResult = {
56
+ ok: true;
57
+ clip: string;
58
+ camera: VideoClipCamera | null;
59
+ keys: Record<'x' | 'y' | 'scale' | 'rotation', number>;
60
+ cuts: number[];
61
+ windows: VideoCameraBake['windows'];
62
+ notes: string[];
63
+ } | {
64
+ ok: false;
65
+ error: string;
66
+ };
53
67
  export type VideoEffectEditResult = (VideoEditResult & {
54
68
  ok: true;
55
69
  clip: string;
@@ -272,6 +286,27 @@ export declare class VideoEditorController {
272
286
  }, options?: {
273
287
  merge?: string;
274
288
  }): Promise<VideoEffectEditResult>;
289
+ /** The provider's camera moves for a role (`transition` into a clip, `hold` while it plays), or all of them. Empty without camera support. */
290
+ cameraMoves(role?: CameraMoveRole): Promise<EffectSummary[]>;
291
+ private cameraClip;
292
+ private cameraEdit;
293
+ /**
294
+ * Sets the camera move a clip plays into (`transition`: from `from` to `framing` from the
295
+ * clip's start) or while it holds (`hold`: across the rest of the clip at `framing`), and bakes
296
+ * the clip's moves into its x, y, scale and rotation keys at the project's frame rate, keeping a
297
+ * cut's two keys. The move is checked first (role, preset, values; a preset's values and a move
298
+ * in's length are written out). A clip whose transform is keyed by hand is refused. One undo step.
299
+ */
300
+ setClipCameraMove(clip: string, role: CameraMoveRole, spec: CameraMoveSpec, options?: {
301
+ from?: VideoCameraFraming | null;
302
+ framing?: VideoCameraFraming | null;
303
+ merge?: string;
304
+ }): Promise<VideoCameraMoveResult>;
305
+ /**
306
+ * Removes a clip's camera move for a role and bakes what is left (which needs the provider);
307
+ * with no move left the transform goes back to what it was before the moves. One undo step.
308
+ */
309
+ clearClipCameraMove(clip: string, role: CameraMoveRole): Promise<VideoCameraMoveResult>;
275
310
  /** Removes an effect from a clip's stack (works without a provider, so placeholders can be cleared). One undo step. */
276
311
  removeClipEffect(clip: string, instance: string): VideoEffectEditResult;
277
312
  /**
@@ -2,7 +2,8 @@
2
2
  * Agent tools for provider effects in the video editor: the shared effect tools
3
3
  * (`search_effects`, `describe_effect`, `list_applied_effects`, `apply_effect`, `update_effect`,
4
4
  * `remove_effect`) on clips, plus `add_video_effect_clip`, `set_video_effect_transition` and
5
- * `set_video_effect_keyframes`.
5
+ * `set_video_effect_keyframes`, and the camera move tools (`list_video_camera_moves`,
6
+ * `set_clip_camera_move`, `clear_clip_camera_move`).
6
7
  */
7
8
  import { type AppliedEffectInfo } from '../effects/tools.cjs';
8
9
  import type { AgentToolProvider } from '../tools/registry.cjs';
@@ -2,7 +2,8 @@
2
2
  * Agent tools for provider effects in the video editor: the shared effect tools
3
3
  * (`search_effects`, `describe_effect`, `list_applied_effects`, `apply_effect`, `update_effect`,
4
4
  * `remove_effect`) on clips, plus `add_video_effect_clip`, `set_video_effect_transition` and
5
- * `set_video_effect_keyframes`.
5
+ * `set_video_effect_keyframes`, and the camera move tools (`list_video_camera_moves`,
6
+ * `set_clip_camera_move`, `clear_clip_camera_move`).
6
7
  */
7
8
  import { type AppliedEffectInfo } from '../effects/tools.js';
8
9
  import type { AgentToolProvider } from '../tools/registry.js';