goatedit-mcp 1.1.1 → 1.1.3
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.
- package/bundle/goatedit-mcp.js +473 -14
- package/package.json +1 -1
package/bundle/goatedit-mcp.js
CHANGED
|
@@ -19155,6 +19155,14 @@ var num = (description) => ({ type: "number", description });
|
|
|
19155
19155
|
var str = (description) => ({ type: "string", description });
|
|
19156
19156
|
var bool = (description) => ({ type: "boolean", description });
|
|
19157
19157
|
var CLIP_ID = str("ID of the clip, as returned by get_timeline.");
|
|
19158
|
+
var SKIP_ADJUSTMENTS = bool(
|
|
19159
|
+
"Render without any adjustment layer (a global camera move, a grade). For frames you will bake into a clip that sits under that layer, which would otherwise apply it twice. The timeline is not changed."
|
|
19160
|
+
);
|
|
19161
|
+
var HIDE_CLIP_IDS = {
|
|
19162
|
+
type: "array",
|
|
19163
|
+
items: { type: "string" },
|
|
19164
|
+
description: "Render as if these clips were not there. The timeline is not changed."
|
|
19165
|
+
};
|
|
19158
19166
|
var TEXT_STYLE_PROPS = {
|
|
19159
19167
|
fontSize: num("Font size in pixels, authored against a 1080p-tall frame."),
|
|
19160
19168
|
fontFamily: str("Font family name."),
|
|
@@ -19171,10 +19179,24 @@ var TEXT_STYLE_PROPS = {
|
|
|
19171
19179
|
textShadowColor: str("Drop shadow colour."),
|
|
19172
19180
|
lineHeight: num("Line advance as a multiple of the line height. Defaults to 1.2."),
|
|
19173
19181
|
letterSpacing: num("Extra tracking in pixels @1080p."),
|
|
19182
|
+
textUnderline: bool("Underline the text."),
|
|
19183
|
+
textShadowBlur: num("Drop shadow softness in pixels @1080p. 0 is a hard shadow."),
|
|
19184
|
+
textShadowOffsetX: num("Drop shadow offset to the right, pixels @1080p."),
|
|
19185
|
+
textShadowOffsetY: num("Drop shadow offset downward, pixels @1080p."),
|
|
19186
|
+
textGradientStart: str("Fill the words with a gradient from this colour (top) \u2026"),
|
|
19187
|
+
textGradientEnd: str("\u2026 to this one (bottom). Set both."),
|
|
19188
|
+
textAccentColor: str("Colour for accent words. Mark an accent word in the text as *word*."),
|
|
19189
|
+
textAccentFontFamily: str(`Font for accent words, e.g. "'Great Vibes', cursive" for a script word inside heavy caps.`),
|
|
19190
|
+
textAccentScale: num("Size of accent words relative to the rest, e.g. 1.8."),
|
|
19191
|
+
textAccentGradientStart: str("Gradient start colour for accent words."),
|
|
19192
|
+
textAccentGradientEnd: str("Gradient end colour for accent words."),
|
|
19193
|
+
textSwooshUnderline: bool("Hand-drawn swoosh under the last line."),
|
|
19194
|
+
textSticker: { type: "string", enum: ["ghost", "arrow", "pen", "star", "flame"], description: "Small sticker drawn beside the accent word." },
|
|
19195
|
+
textLayoutMode: { type: "string", enum: ["side-grid", "luxury-stack", "editorial-hero", "slanted-red", "double-hero"], description: "Editorial layout engine for multi-word titles." },
|
|
19174
19196
|
posX: num("Horizontal position as a fraction of the frame, 0..1. 0.5 is centre."),
|
|
19175
19197
|
posY: num("Vertical position as a fraction of the frame, 0..1. 0.5 is centre.")
|
|
19176
19198
|
};
|
|
19177
|
-
var
|
|
19199
|
+
var BASE_TOOLS = [
|
|
19178
19200
|
{
|
|
19179
19201
|
name: "get_session_status",
|
|
19180
19202
|
description: "Check whether a GoatEdit editor tab is currently attached to this session, and which project it has open. Call this first if any other tool reports the editor is not connected.",
|
|
@@ -19232,12 +19254,20 @@ var TOOLS = [
|
|
|
19232
19254
|
properties: {
|
|
19233
19255
|
time: num("Timeline position to render, in seconds."),
|
|
19234
19256
|
clipId: str("Render this clip\u2019s midpoint instead of a time."),
|
|
19257
|
+
times: {
|
|
19258
|
+
type: "array",
|
|
19259
|
+
items: { type: "number" },
|
|
19260
|
+
description: "Render up to 24 moments as ONE contact-sheet image instead of a single frame: tiles left to right, top to bottom, each stamped with its time and frame number. Use it to review a whole cut, compare scene joins side by side, or check an animation across its length in one call. width is then the sheet width (default 1280, up to 1600)."
|
|
19261
|
+
},
|
|
19262
|
+
columns: num("With times: tiles per row. Defaults to a near-square grid."),
|
|
19235
19263
|
saveToDisk: {
|
|
19236
19264
|
type: "boolean",
|
|
19237
19265
|
description: "Write the frame to disk through the local bridge and return its path instead of the image itself. A frame is around 200KB, and inline it is paid for twice \u2014 as tokens and as a cached object \u2014 so a review pass over twenty cuts is expensive. With this set, read the returned path with your own file tools. Falls back to an inline image, with a warning, when the bridge is not running."
|
|
19238
19266
|
},
|
|
19239
19267
|
width: num("Width of the returned image in pixels, up to 1280. Defaults to 1024."),
|
|
19240
|
-
outlines: bool(`Draw every layer's box, handles and anchor point over the picture, with a timecode \u2014 the look of the editor's selection, on every layer at once. The same option the Export dialog offers as "Show layer outlines".`)
|
|
19268
|
+
outlines: bool(`Draw every layer's box, handles and anchor point over the picture, with a timecode \u2014 the look of the editor's selection, on every layer at once. The same option the Export dialog offers as "Show layer outlines".`),
|
|
19269
|
+
skipAdjustments: SKIP_ADJUSTMENTS,
|
|
19270
|
+
hideClipIds: HIDE_CLIP_IDS
|
|
19241
19271
|
}
|
|
19242
19272
|
},
|
|
19243
19273
|
method: "renderFrame"
|
|
@@ -19263,7 +19293,9 @@ var TOOLS = [
|
|
|
19263
19293
|
startTime: num("Start of the range in seconds."),
|
|
19264
19294
|
endTime: num("End of the range in seconds. Ranges over 10 minutes are refused."),
|
|
19265
19295
|
frames: num("How many frames to sample, up to 6. Defaults to 4."),
|
|
19266
|
-
width: num("Width of each frame in pixels. Defaults to 640.")
|
|
19296
|
+
width: num("Width of each frame in pixels. Defaults to 640."),
|
|
19297
|
+
skipAdjustments: SKIP_ADJUSTMENTS,
|
|
19298
|
+
hideClipIds: HIDE_CLIP_IDS
|
|
19267
19299
|
},
|
|
19268
19300
|
required: ["startTime", "endTime"]
|
|
19269
19301
|
},
|
|
@@ -19271,7 +19303,7 @@ var TOOLS = [
|
|
|
19271
19303
|
},
|
|
19272
19304
|
{
|
|
19273
19305
|
name: "lint_timeline",
|
|
19274
|
-
description: "Check the timeline for problems that leave state looking correct while the result is broken \u2014 most importantly clips that carry sound but sit on a video track, where the mixer never reads them and they are silent in both preview and export. Also reports dangling and out-of-sync clip links, clips reading past the end of their source, clips whose media has left the bin, and overlaps. Call this after any batch of edits; it is the cheapest verification available and needs no rendering.",
|
|
19306
|
+
description: "Check the timeline for problems that leave state looking correct while the result is broken \u2014 most importantly clips that carry sound but sit on a video track, where the mixer never reads them and they are silent in both preview and export. Also reports dangling and out-of-sync clip links, clips reading past the end of their source, clips whose media has left the bin, and overlaps. It also asks every source whether it still loads \u2014 media files, and the pictures inside HTML clips \u2014 and reports the ones that render as nothing or as a broken-image icon (a blob: link from before a reload, a local server that stopped). Call this after any batch of edits; it is the cheapest verification available and needs no rendering.",
|
|
19275
19307
|
inputSchema: { type: "object", properties: {} },
|
|
19276
19308
|
method: "lintTimeline"
|
|
19277
19309
|
},
|
|
@@ -19356,7 +19388,7 @@ var TOOLS = [
|
|
|
19356
19388
|
},
|
|
19357
19389
|
{
|
|
19358
19390
|
name: "get_timeline",
|
|
19359
|
-
description: 'Get just the timeline \u2014 all tracks with their clips, ids, start times and durations. Cheaper than get_project_state; use it before your first edit so you have current clip ids. After that, each edit\u2019s reply lists the clips it added, changed and removed under timelineChanges, so a re-read is only needed when that says it was truncated. Animation data (keyframes, motion tracking, masks, per-word caption timings) is reported as counts under *Summary keys rather than in full, so a clip showing keyframeSummary is animated even though the keyframes themselves are not listed. By default the view is lean: a field at its usual value is left out (no volume means 1, no isMuted means false, no opacity means 1), and effects are listed by id and type only. Pass detail: "full" when you need effect parameters.',
|
|
19391
|
+
description: 'Get just the timeline \u2014 all tracks with their clips, ids, start times and durations. Cheaper than get_project_state; use it before your first edit so you have current clip ids. After that, each edit\u2019s reply lists the clips it added, changed and removed under timelineChanges, so a re-read is only needed when that says it was truncated. Animation data (keyframes, motion tracking, masks, per-word caption timings) is reported as counts under *Summary keys rather than in full, so a clip showing keyframeSummary is animated even though the keyframes themselves are not listed; get_clip returns them. By default the view is lean: a field at its usual value is left out (no volume means 1, no isMuted means false, no opacity means 1), and effects are listed by id and type only. Pass detail: "full" when you need effect parameters.',
|
|
19360
19392
|
inputSchema: {
|
|
19361
19393
|
type: "object",
|
|
19362
19394
|
properties: {
|
|
@@ -19368,6 +19400,40 @@ var TOOLS = [
|
|
|
19368
19400
|
},
|
|
19369
19401
|
method: "getTimeline"
|
|
19370
19402
|
},
|
|
19403
|
+
{
|
|
19404
|
+
name: "get_clip",
|
|
19405
|
+
description: "Get clips in full, animation included: every keyframe on every property (time in seconds from the clip\u2019s start, value, ease \u2014 the shape set_keyframes takes), effect parameters and their keyframes, mask shapes, crop, key and transform. Use it to copy or adjust a clip\u2019s animation; get_timeline only counts keyframes. Per-frame data (motion tracking, roto point sets per frame, caption word timings) stays a count, as does any property with more than 300 keyframes.",
|
|
19406
|
+
inputSchema: {
|
|
19407
|
+
type: "object",
|
|
19408
|
+
properties: {
|
|
19409
|
+
clipIds: { type: "array", items: { type: "string" }, description: "Clip ids from get_timeline, up to 50." }
|
|
19410
|
+
},
|
|
19411
|
+
required: ["clipIds"]
|
|
19412
|
+
},
|
|
19413
|
+
method: "getClips"
|
|
19414
|
+
},
|
|
19415
|
+
{
|
|
19416
|
+
name: "create_checkpoint",
|
|
19417
|
+
description: "Save a copy of the whole project (every sequence and the media bin) to return to with restore_checkpoint. Take one before a long scripted change: undo goes back one step at a time and a big rebuild can outrun it. Kept in the editor tab until it reloads, the newest 20 per project.",
|
|
19418
|
+
inputSchema: { type: "object", properties: { name: str("Optional label.") } },
|
|
19419
|
+
method: "createCheckpoint"
|
|
19420
|
+
},
|
|
19421
|
+
{
|
|
19422
|
+
name: "list_checkpoints",
|
|
19423
|
+
description: "List the checkpoints saved in this tab for the open project.",
|
|
19424
|
+
inputSchema: { type: "object", properties: {} },
|
|
19425
|
+
method: "listCheckpoints"
|
|
19426
|
+
},
|
|
19427
|
+
{
|
|
19428
|
+
name: "restore_checkpoint",
|
|
19429
|
+
description: "Put the whole project back as it was at a checkpoint, as one undoable step. Everything done since is undone at once, in every sequence.",
|
|
19430
|
+
inputSchema: {
|
|
19431
|
+
type: "object",
|
|
19432
|
+
properties: { checkpointId: str("Id from create_checkpoint or list_checkpoints.") },
|
|
19433
|
+
required: ["checkpointId"]
|
|
19434
|
+
},
|
|
19435
|
+
method: "restoreCheckpoint"
|
|
19436
|
+
},
|
|
19371
19437
|
{
|
|
19372
19438
|
name: "get_media_bin",
|
|
19373
19439
|
description: "List every media file imported into the project, with id, name, type and duration.",
|
|
@@ -19418,7 +19484,7 @@ var TOOLS = [
|
|
|
19418
19484
|
inputSchema: {
|
|
19419
19485
|
type: "object",
|
|
19420
19486
|
properties: {
|
|
19421
|
-
trackId: str('Target track id from get_timeline,
|
|
19487
|
+
trackId: str('Target track id from get_timeline, "__new_video__" to let the editor pick a free video track, or "__new_track__" for a new video track on top.'),
|
|
19422
19488
|
mediaFileId: str("Media bin file id from get_media_bin."),
|
|
19423
19489
|
startTime: num("Where the clip starts on the timeline, in seconds."),
|
|
19424
19490
|
duration: num("Length of the clip on the timeline, in seconds."),
|
|
@@ -19525,6 +19591,247 @@ var TOOLS = [
|
|
|
19525
19591
|
},
|
|
19526
19592
|
method: "addShapeClip"
|
|
19527
19593
|
},
|
|
19594
|
+
{
|
|
19595
|
+
name: "update_shape_clip",
|
|
19596
|
+
description: "Change a shape after it was made \u2014 fill, size, corners, outline, and a dashed or rounded outline \u2014 without deleting it and losing its id, keyframes and effects.",
|
|
19597
|
+
inputSchema: {
|
|
19598
|
+
type: "object",
|
|
19599
|
+
properties: {
|
|
19600
|
+
clipId: CLIP_ID,
|
|
19601
|
+
color: str("Fill colour."),
|
|
19602
|
+
width: num("Width in design units against a 1080p-tall frame."),
|
|
19603
|
+
height: num("Height in design units against a 1080p-tall frame."),
|
|
19604
|
+
cornerRadius: num("Corner radius in design units."),
|
|
19605
|
+
strokeColor: str("Outline colour."),
|
|
19606
|
+
strokeWidth: num("Outline width in design units."),
|
|
19607
|
+
strokeCap: { type: "string", enum: ["butt", "round", "square"], description: "Ends of an open or dashed outline." },
|
|
19608
|
+
strokeJoin: { type: "string", enum: ["miter", "round", "bevel"], description: "Outline corners." },
|
|
19609
|
+
dash: num("Dash length for a dashed outline, design units. 0 for solid."),
|
|
19610
|
+
gap: num("Gap between dashes, design units.")
|
|
19611
|
+
},
|
|
19612
|
+
required: ["clipId"]
|
|
19613
|
+
},
|
|
19614
|
+
method: "updateShapeClip"
|
|
19615
|
+
},
|
|
19616
|
+
{
|
|
19617
|
+
name: "add_null",
|
|
19618
|
+
description: "Add a Null Object: an invisible handle that other clips are parented to (set_parent). Move, scale or rotate the null and everything under it follows, orbiting its position \u2014 the After Effects way to group a polaroid with its caption, or make a whole layout drift as one.",
|
|
19619
|
+
inputSchema: {
|
|
19620
|
+
type: "object",
|
|
19621
|
+
properties: {
|
|
19622
|
+
startTime: num("Seconds. Defaults to 0."),
|
|
19623
|
+
duration: num("Seconds."),
|
|
19624
|
+
x: num("Position as a fraction of the frame width. Defaults to 0.5."),
|
|
19625
|
+
y: num("Position as a fraction of the frame height. Defaults to 0.5."),
|
|
19626
|
+
name: str("Display name."),
|
|
19627
|
+
trackId: str('Video track, or "__new_video__" (default) for a free one.')
|
|
19628
|
+
},
|
|
19629
|
+
required: ["duration"]
|
|
19630
|
+
},
|
|
19631
|
+
method: "addNull"
|
|
19632
|
+
},
|
|
19633
|
+
{
|
|
19634
|
+
name: "set_parent",
|
|
19635
|
+
description: "Parent a clip to another clip or null, After Effects style. The clip stays exactly where it is when parented; from then on it follows the parent's move, scale and rotation, orbiting the parent's position and spreading as it scales. parentId null unparents. position / scale / rotation pick-whip a single channel to a different clip (null cuts that channel loose): a channel parent passes on only its own change. Parent first, then animate the parent.",
|
|
19636
|
+
inputSchema: {
|
|
19637
|
+
type: "object",
|
|
19638
|
+
properties: {
|
|
19639
|
+
clipId: CLIP_ID,
|
|
19640
|
+
parentId: { type: ["string", "null"], description: "Parent clip id, or null to unparent." },
|
|
19641
|
+
position: { type: ["string", "null"], description: "Take position only from this clip." },
|
|
19642
|
+
scale: { type: ["string", "null"], description: "Take scale only from this clip." },
|
|
19643
|
+
rotation: { type: ["string", "null"], description: "Take rotation only from this clip." }
|
|
19644
|
+
},
|
|
19645
|
+
required: ["clipId"]
|
|
19646
|
+
},
|
|
19647
|
+
method: "setParent"
|
|
19648
|
+
},
|
|
19649
|
+
{
|
|
19650
|
+
name: "group_clips",
|
|
19651
|
+
description: "Group clips under a new null spanning all of them, so they move, scale and rotate as one; each keeps its place. Returns the group's clipId \u2014 animate that. With layout set, the null becomes an Auto Layout frame and the clips flow inside it (tune it with set_auto_layout).",
|
|
19652
|
+
inputSchema: {
|
|
19653
|
+
type: "object",
|
|
19654
|
+
properties: {
|
|
19655
|
+
clipIds: { type: "array", items: { type: "string" }, description: "Clips to group." },
|
|
19656
|
+
name: str("Group name."),
|
|
19657
|
+
layout: { type: "string", enum: ["none", "horizontal", "vertical", "wrap", "orbit"], description: "Defaults to none: a plain group." },
|
|
19658
|
+
gap: num("Gap between laid-out clips, design units. Defaults to 16."),
|
|
19659
|
+
x: num("Group pivot, fraction of the frame width. Defaults to the members' average."),
|
|
19660
|
+
y: num("Group pivot, fraction of the frame height."),
|
|
19661
|
+
trackId: str('Video track for the null, or "__new_video__" (default).')
|
|
19662
|
+
},
|
|
19663
|
+
required: ["clipIds"]
|
|
19664
|
+
},
|
|
19665
|
+
method: "groupClips"
|
|
19666
|
+
},
|
|
19667
|
+
{
|
|
19668
|
+
name: "set_proximity",
|
|
19669
|
+
description: "Drive one property of a clip by how close it is to another clip on screen \u2014 a card that brightens as a cursor nears it, a label that grows when a photo slides over it. Distance is measured between where both are drawn (parents and layout included), as a fraction of the frame width. At `near` or closer the property is nearValue, at `far` or beyond it is farValue, linear between.",
|
|
19670
|
+
inputSchema: {
|
|
19671
|
+
type: "object",
|
|
19672
|
+
properties: {
|
|
19673
|
+
clipId: CLIP_ID,
|
|
19674
|
+
targetClipId: str("The clip whose distance drives it."),
|
|
19675
|
+
property: { type: "string", enum: ["opacity", "scaleX", "scaleY", "posX", "posY", "rotation"], description: "Defaults to opacity." },
|
|
19676
|
+
near: num("Distance for nearValue. Defaults to 0.05."),
|
|
19677
|
+
far: num("Distance for farValue. Defaults to 0.3."),
|
|
19678
|
+
nearValue: num("Defaults to 1."),
|
|
19679
|
+
farValue: num("Defaults to 0."),
|
|
19680
|
+
remove: bool("Remove the driver.")
|
|
19681
|
+
},
|
|
19682
|
+
required: ["clipId"]
|
|
19683
|
+
},
|
|
19684
|
+
method: "setProximity"
|
|
19685
|
+
},
|
|
19686
|
+
{
|
|
19687
|
+
name: "set_clip_speed",
|
|
19688
|
+
description: "Retime a video or audio clip like the Speed panel: speed (0.1\u201310) keeps the source range and changes the clip length (stopping at the next clip); ramp applies a speed curve \u2014 a preset name (montage, hero, bullet, jumpCut, flashIn, flashOut) or [{x 0..1, y rate}] points; null flattens it. reversed plays it backwards; holdFrame freezes from that many seconds into the clip (null releases). Linked audio is retimed with it.",
|
|
19689
|
+
inputSchema: {
|
|
19690
|
+
type: "object",
|
|
19691
|
+
properties: {
|
|
19692
|
+
clipId: CLIP_ID,
|
|
19693
|
+
speed: num("Playback rate, 1 = normal."),
|
|
19694
|
+
ramp: { type: ["string", "array", "null"], description: "Preset id, or points [{x, y}], or null." },
|
|
19695
|
+
reversed: bool("Play backwards."),
|
|
19696
|
+
holdFrame: { type: ["number", "null"], description: "Freeze from this clip-relative time; null removes the hold." }
|
|
19697
|
+
},
|
|
19698
|
+
required: ["clipId"]
|
|
19699
|
+
},
|
|
19700
|
+
method: "setClipSpeed"
|
|
19701
|
+
},
|
|
19702
|
+
{
|
|
19703
|
+
name: "join_scenes",
|
|
19704
|
+
description: "Join two scenes at a cut so the edit flows instead of cutting: push (one camera move across a shared canvas \u2014 the outgoing scene speeds out and the incoming arrives at the same speed, so the cut falls mid-motion), zoomThrough (push into one element of the outgoing scene until it fills the frame; the incoming scene opens out of it), or matchCut (a layer of the incoming scene starts exactly where a layer of the outgoing one was \u2014 position, size, turn, through parents, 3D models included \u2014 then settles into its own place). push and zoomThrough add a camera null per side and parent that side's top-level clips to it, so every layer stays editable and the camera's keyframes can be tuned afterwards. at is the cut: outgoing clips end there and incoming clips start there.",
|
|
19705
|
+
inputSchema: {
|
|
19706
|
+
type: "object",
|
|
19707
|
+
properties: {
|
|
19708
|
+
at: num("The cut time in seconds."),
|
|
19709
|
+
type: { type: "string", enum: ["push", "zoomThrough", "matchCut"], description: "Which join." },
|
|
19710
|
+
duration: num("Seconds the move takes on each side of the cut. Default 0.4."),
|
|
19711
|
+
direction: { type: "string", enum: ["left", "right", "up", "down"], description: "push: which way the picture travels. Default left." },
|
|
19712
|
+
clipId: str("zoomThrough: the element of the outgoing scene to fly into."),
|
|
19713
|
+
zoom: num("zoomThrough: how far in the outgoing camera goes. Default: until the element overfills the frame."),
|
|
19714
|
+
inZoom: num("zoomThrough: scale the incoming scene opens from. Default 1.8."),
|
|
19715
|
+
fromClipId: str("matchCut: the outgoing layer to match."),
|
|
19716
|
+
toClipId: str("matchCut: the incoming layer that takes its place.")
|
|
19717
|
+
},
|
|
19718
|
+
required: ["at", "type"]
|
|
19719
|
+
},
|
|
19720
|
+
method: "joinScenes"
|
|
19721
|
+
},
|
|
19722
|
+
{
|
|
19723
|
+
name: "create_3d_object",
|
|
19724
|
+
description: "Make a word, a logo or an SVG solid: extruded to a depth with rounded edges and lit like a 3D model, as its own clip with nothing around it (no backdrop), so it floats over whatever is beneath. Give text (drawn in font/weight/color) or mediaFileId of a transparent PNG or an SVG in the bin (a photo needs remove_background first). spins turns it whole times over the clip; rotateX/Y/Z pose it. It is a showcase clip: describe_effect showcase lists its looks (chrome, glass\u2026), lighting and side colour, set with set_clip_effect.",
|
|
19725
|
+
inputSchema: {
|
|
19726
|
+
type: "object",
|
|
19727
|
+
properties: {
|
|
19728
|
+
text: str("A word or short line to extrude."),
|
|
19729
|
+
font: str("With text: font family loaded in the editor. Default Inter."),
|
|
19730
|
+
weight: num("With text: font weight. Default 800."),
|
|
19731
|
+
color: str("With text: fill colour, hex. Default #f2661c."),
|
|
19732
|
+
mediaFileId: str("A transparent PNG or SVG in the bin, instead of text."),
|
|
19733
|
+
startTime: num("Start in seconds. Default 0."),
|
|
19734
|
+
duration: num("Length in seconds."),
|
|
19735
|
+
trackId: str("Track to place it on. Default a new video track on top."),
|
|
19736
|
+
depth: num("Extrude depth, percent of its height (0\u201360). Default 12."),
|
|
19737
|
+
bevel: num("Soft edges, 0\u2013100. Default 40."),
|
|
19738
|
+
spins: num("Whole turns over the clip. Default 0."),
|
|
19739
|
+
rotateX: num("Pose, degrees."),
|
|
19740
|
+
rotateY: num("Pose, degrees. Default 28 when not spinning, so the depth shows."),
|
|
19741
|
+
rotateZ: num("Pose, degrees."),
|
|
19742
|
+
size: num("Size in the frame, percent (20\u2013250). Default 92."),
|
|
19743
|
+
name: str("Clip name.")
|
|
19744
|
+
},
|
|
19745
|
+
required: ["duration"]
|
|
19746
|
+
},
|
|
19747
|
+
method: "create3dObject"
|
|
19748
|
+
},
|
|
19749
|
+
{
|
|
19750
|
+
name: "remove_background",
|
|
19751
|
+
description: "Cut the subject out of a still image \u2014 a product, an object, a person \u2014 into a transparent PNG, the way stock photos become floating cut-outs. Runs in the editor tab (the model downloads once, ~45 MB for quality). The cut-out is added to the bin as a new file and, by default, every clip showing the photo switches to it (or only clipId when given); the original stays. For video use roto instead.",
|
|
19752
|
+
inputSchema: {
|
|
19753
|
+
type: "object",
|
|
19754
|
+
properties: {
|
|
19755
|
+
clipId: str("An image clip to cut out; it switches to the cut-out."),
|
|
19756
|
+
mediaFileId: str("A bin image to cut out, instead of a clip."),
|
|
19757
|
+
engine: { type: "string", enum: ["quality", "fast"], description: "quality (default): any subject, sharper edges. fast: people only, tiny download." },
|
|
19758
|
+
applyToClips: bool("Switch clips to the cut-out. Default true.")
|
|
19759
|
+
}
|
|
19760
|
+
},
|
|
19761
|
+
method: "removeBackground"
|
|
19762
|
+
},
|
|
19763
|
+
{
|
|
19764
|
+
name: "set_scene",
|
|
19765
|
+
description: "Mark a stretch of timeline as a named scene (a ruler marker with a length), so retime_range can move or stretch it as one piece later. With start and end it makes a scene; with sceneId it changes one (start, end, label, color) or deletes it (remove: true); with no arguments it lists every scene.",
|
|
19766
|
+
inputSchema: {
|
|
19767
|
+
type: "object",
|
|
19768
|
+
properties: {
|
|
19769
|
+
start: num("Scene start in seconds."),
|
|
19770
|
+
end: num("Scene end in seconds."),
|
|
19771
|
+
label: str('Name, e.g. "P03 Grid".'),
|
|
19772
|
+
color: str("Marker colour, hex."),
|
|
19773
|
+
sceneId: str("An existing scene to change or remove."),
|
|
19774
|
+
remove: bool("With sceneId: delete the scene marker (clips are untouched).")
|
|
19775
|
+
}
|
|
19776
|
+
},
|
|
19777
|
+
method: "setScene"
|
|
19778
|
+
},
|
|
19779
|
+
{
|
|
19780
|
+
name: "retime_range",
|
|
19781
|
+
description: "Move or stretch a whole stretch of timeline in one step \u2014 every clip that lies wholly inside it, on every track. Clips scale in place, every keyframe inside them (transform, text, effects, masks, paths, tracker) scales with them, text animation timings and fades scale, and footage changes speed to cover the same source in the new length \u2014 so squeezing a scene from 1.6s to 1.2s plays all of its animation faster instead of cutting the end off. With ripple (default) everything after the range shifts by the change in its end, closing or opening the gap; scene markers move too. Name the range by scene (a set_scene id or label) or by from/to. Clips crossing an edge are left alone and reported. One undo step.",
|
|
19782
|
+
inputSchema: {
|
|
19783
|
+
type: "object",
|
|
19784
|
+
properties: {
|
|
19785
|
+
scene: str("A scene id or label from set_scene, instead of from/to."),
|
|
19786
|
+
from: num("Range start in seconds."),
|
|
19787
|
+
to: num("Range end in seconds."),
|
|
19788
|
+
duration: num("New length of the range in seconds. Omit to keep it (a plain move)."),
|
|
19789
|
+
start: num("New start of the range in seconds. Omit to keep it in place."),
|
|
19790
|
+
ripple: bool("Shift everything after the range by the change in its end. Default true."),
|
|
19791
|
+
allowOverlap: bool("Proceed even when the moved range lands on clips outside it (they would be overlapped)."),
|
|
19792
|
+
dryRun: bool("Report what would move without changing anything.")
|
|
19793
|
+
}
|
|
19794
|
+
},
|
|
19795
|
+
method: "retimeRange"
|
|
19796
|
+
},
|
|
19797
|
+
{
|
|
19798
|
+
name: "set_auto_layout",
|
|
19799
|
+
description: "Figma-style Auto Layout. On a frame (group_clips with a layout, or any clip with children): mode, gap, padding, alignment, resizing, clip content, reverse, stack order, orbit settings. Children are spaced by the room they take at their own scale, and the frame's own scale and rotation act on the whole arrangement. On a child: absolute (leave the flow and sit at its own position inside the frame), grow (share of free space when resizing is fill), min/max size.",
|
|
19800
|
+
inputSchema: {
|
|
19801
|
+
type: "object",
|
|
19802
|
+
properties: {
|
|
19803
|
+
clipId: CLIP_ID,
|
|
19804
|
+
enabled: bool("Switch the layout on or off without losing it."),
|
|
19805
|
+
mode: { type: "string", enum: ["none", "horizontal", "vertical", "wrap", "orbit"] },
|
|
19806
|
+
gap: num("Gap between children, design units."),
|
|
19807
|
+
gapV: num("Gap between rows in wrap mode."),
|
|
19808
|
+
padding: num("All four paddings at once."),
|
|
19809
|
+
paddingLeft: num("Design units."),
|
|
19810
|
+
paddingRight: num("Design units."),
|
|
19811
|
+
paddingTop: num("Design units."),
|
|
19812
|
+
paddingBottom: num("Design units."),
|
|
19813
|
+
primaryAlign: { type: "string", enum: ["start", "center", "end", "space-between", "space-around", "space-evenly"] },
|
|
19814
|
+
counterAlign: { type: "string", enum: ["start", "center", "end", "stretch"] },
|
|
19815
|
+
horizontalResizing: { type: "string", enum: ["fixed", "hug", "fill"] },
|
|
19816
|
+
verticalResizing: { type: "string", enum: ["fixed", "hug", "fill"] },
|
|
19817
|
+
clipContent: bool("Clip children to the frame."),
|
|
19818
|
+
reverse: bool("Reverse the flow order."),
|
|
19819
|
+
stackOrder: { type: "string", enum: ["firstOnTop", "lastOnTop"] },
|
|
19820
|
+
orbitRadius: num("Orbit mode radius, design units."),
|
|
19821
|
+
orbitSpeed: num("Orbit mode degrees per second."),
|
|
19822
|
+
orbitStartAngle: num("Orbit mode start angle, degrees."),
|
|
19823
|
+
orbitRotateChildren: bool("Turn children to face along the orbit."),
|
|
19824
|
+
absolute: bool("Child only: leave the flow."),
|
|
19825
|
+
grow: num("Child only: share of free space with fill resizing."),
|
|
19826
|
+
minWidth: num("Design units."),
|
|
19827
|
+
maxWidth: num("Design units."),
|
|
19828
|
+
minHeight: num("Design units."),
|
|
19829
|
+
maxHeight: num("Design units.")
|
|
19830
|
+
},
|
|
19831
|
+
required: ["clipId"]
|
|
19832
|
+
},
|
|
19833
|
+
method: "setAutoLayout"
|
|
19834
|
+
},
|
|
19528
19835
|
{
|
|
19529
19836
|
name: "set_shape_gradient",
|
|
19530
19837
|
description: "Give a shape or a pen path a gradient fill or a gradient stroke, replacing its flat colour. Works on anything with a shapeType, including paths drawn with the pen tool. The ramp is laid out against the shape's own bounding box, so it stays put on the object when the shape is moved, scaled or rotated rather than sliding across it. Pass null to clear one and go back to the flat colour. gradientKeyframes animates it \u2014 a sweep that turns, a glow that shifts colour.",
|
|
@@ -19684,10 +19991,17 @@ var TOOLS = [
|
|
|
19684
19991
|
},
|
|
19685
19992
|
{
|
|
19686
19993
|
name: "set_clip_transform",
|
|
19687
|
-
description:
|
|
19994
|
+
description: `Position, scale, rotate or fade a clip in the frame. Positions are fractions of the frame, 0..1, with 0.5 the centre \u2014 so a top-left watermark is roughly x 0.12, y 0.1. A parented clip's own values are measured from its parent's pose, not the screen: to put it somewhere exact, pass space: "screen", or matchClipId to sit it on another clip; animated properties keep their animation and move as a whole.`,
|
|
19688
19995
|
inputSchema: {
|
|
19689
19996
|
type: "object",
|
|
19690
19997
|
properties: {
|
|
19998
|
+
matchClipId: str("Put this clip where another clip appears on screen \u2014 through any parents on either side. With match choose what to copy; the default is position and size (fitted inside, keeping proportions)."),
|
|
19999
|
+
match: { type: "array", items: { type: "string", enum: ["position", "size", "rotation"] }, description: 'With matchClipId: what to copy. Defaults to ["position", "size"].' },
|
|
20000
|
+
space: { type: "string", enum: ["own", "screen"], description: "screen: x and y are where the picture's centre should appear (fractions of the frame), width/height its on-screen size in pixels, rotation as seen \u2014 solved through parents, so a parented clip lands exactly there. Default own: the clip's own values." },
|
|
20001
|
+
width: num("With space screen: on-screen width in pixels."),
|
|
20002
|
+
height: num("With space screen: on-screen height in pixels."),
|
|
20003
|
+
stretch: bool("With a size target: scale X and Y separately to fill it, instead of fitting inside."),
|
|
20004
|
+
time: num("With matchClipId or space screen: the moment to measure at, in timeline seconds. Defaults to the playhead, clamped into the clip."),
|
|
19691
20005
|
clipId: CLIP_ID,
|
|
19692
20006
|
x: num("Horizontal centre as a fraction of frame width, 0..1."),
|
|
19693
20007
|
y: num("Vertical centre as a fraction of frame height, 0..1."),
|
|
@@ -19695,12 +20009,69 @@ var TOOLS = [
|
|
|
19695
20009
|
scaleX: num("Horizontal scale, overriding scale."),
|
|
19696
20010
|
scaleY: num("Vertical scale, overriding scale."),
|
|
19697
20011
|
rotation: num("Rotation in degrees."),
|
|
19698
|
-
opacity: num("Opacity from 0 to 1.")
|
|
20012
|
+
opacity: num("Opacity from 0 to 1."),
|
|
20013
|
+
blendMode: {
|
|
20014
|
+
type: "string",
|
|
20015
|
+
enum: [
|
|
20016
|
+
"normal",
|
|
20017
|
+
"multiply",
|
|
20018
|
+
"screen",
|
|
20019
|
+
"overlay",
|
|
20020
|
+
"darken",
|
|
20021
|
+
"lighten",
|
|
20022
|
+
"color-dodge",
|
|
20023
|
+
"color-burn",
|
|
20024
|
+
"hard-light",
|
|
20025
|
+
"soft-light",
|
|
20026
|
+
"difference",
|
|
20027
|
+
"exclusion",
|
|
20028
|
+
"hue",
|
|
20029
|
+
"saturation",
|
|
20030
|
+
"color",
|
|
20031
|
+
"luminosity"
|
|
20032
|
+
],
|
|
20033
|
+
description: "How the clip mixes with the layers beneath it. screen for light leaks, flares and dust shot on black; multiply for paper textures, ink and shadows shot on white; overlay or soft-light for texture over a picture. normal sets it back."
|
|
20034
|
+
}
|
|
19699
20035
|
},
|
|
19700
20036
|
required: ["clipId"]
|
|
19701
20037
|
},
|
|
19702
20038
|
method: "setClipTransform"
|
|
19703
20039
|
},
|
|
20040
|
+
{
|
|
20041
|
+
name: "set_ultra_key",
|
|
20042
|
+
description: "Green screen: knock a colour out of a video or image clip so the tracks beneath show through \u2014 a paper unfold, a smoke burst or a presenter shot on green or blue. Unset values keep what the clip already has (or the defaults: green, tolerance 0.18, softness 0.1, spill 0.4). Raise tolerance when green is left behind, softness for a gentler edge, spill when edges carry a green tint. Check the result with render_preview_frame; pass remove to take the key off.",
|
|
20043
|
+
inputSchema: {
|
|
20044
|
+
type: "object",
|
|
20045
|
+
properties: {
|
|
20046
|
+
clipId: CLIP_ID,
|
|
20047
|
+
keyColor: str('Colour to remove, as "#rrggbb". Defaults to "#00ff00"; pick "#0000ff" for blue screen, or the sampled backdrop colour when the green is off-pure.'),
|
|
20048
|
+
tolerance: num("How close to the key colour a pixel must be to vanish, 0..1. Defaults to 0.18."),
|
|
20049
|
+
softness: num("Width of the soft edge around the key, 0..1. Defaults to 0.1."),
|
|
20050
|
+
spill: num("How strongly green fringing is desaturated on edges, 0..1. Defaults to 0.4."),
|
|
20051
|
+
enabled: bool("Switch the key off without losing its settings. Defaults to true."),
|
|
20052
|
+
remove: bool("Remove the key entirely.")
|
|
20053
|
+
},
|
|
20054
|
+
required: ["clipId"]
|
|
20055
|
+
},
|
|
20056
|
+
method: "setUltraKey"
|
|
20057
|
+
},
|
|
20058
|
+
{
|
|
20059
|
+
name: "set_track_matte",
|
|
20060
|
+
description: "After Effects track matte: another clip\u2019s transparency (alpha) or brightness (luma) becomes this clip\u2019s transparency, optionally inverted. Use it to reveal an image through a moving shape \u2014 a torn-paper or ink-bleed clip, a wipe, text \u2014 without baking. The matte clip stops drawing once it is used as a matte unless keepSourceVisible is set. Name the matte with sourceClipId (any clip, on any track; give it the same transform as the clip it cuts); without one, the matte is whatever is live on the nearest video track above. Unset values keep what the clip already has. Pass remove to take the matte off.",
|
|
20061
|
+
inputSchema: {
|
|
20062
|
+
type: "object",
|
|
20063
|
+
properties: {
|
|
20064
|
+
clipId: CLIP_ID,
|
|
20065
|
+
type: { type: "string", enum: ["alpha", "alphaInverted", "luma", "lumaInverted"], description: "Defaults to alpha." },
|
|
20066
|
+
sourceClipId: str("Clip that supplies the matte."),
|
|
20067
|
+
keepSourceVisible: bool("Keep drawing the matte clip as well. Defaults to false."),
|
|
20068
|
+
enabled: bool("Switch the matte off without losing it. Defaults to true."),
|
|
20069
|
+
remove: bool("Remove the matte.")
|
|
20070
|
+
},
|
|
20071
|
+
required: ["clipId"]
|
|
20072
|
+
},
|
|
20073
|
+
method: "setTrackMatte"
|
|
20074
|
+
},
|
|
19704
20075
|
{
|
|
19705
20076
|
name: "set_keyframes",
|
|
19706
20077
|
description: "Animate one property of a clip over time. set_clip_transform sets a value; this is what makes it move \u2014 a card sliding on, a background drifting, a photo pushing in. Times are in seconds RELATIVE TO THE CLIP's start, and each keyframe may carry its own outgoing easing as a CSS cubic-bezier ([0.22, 1, 0.36, 1] is a good decelerate). Two or more keyframes make motion; one holds a value. Writing keyframes for a property overrides whatever flat value the clip carries for it, and replaces any track already on that property \u2014 pass clear to remove one.",
|
|
@@ -19798,11 +20169,15 @@ var TOOLS = [
|
|
|
19798
20169
|
},
|
|
19799
20170
|
{
|
|
19800
20171
|
name: "save_preset",
|
|
19801
|
-
description:
|
|
20172
|
+
description: 'Save clips as a reusable preset: their transform keyframes (stored as fractions of the clip, so the move stretches to whatever it is applied to), effects, transition, and text or shape styling. It is kept in this browser and shows under My Presets in the Presets panel, across reloads. One clip makes a preset that can be laid onto another clip; several make a group that is added as new clips. Or pass `preset` instead of clipIds to save a definition directly \u2014 the only way to make a preset with media layers: each layer is a video or image (by URL) sized to the clip the preset is applied to, drawn over it (role "over") or cutting it as its track matte (role "matte"), e.g. a torn-paper overlay plus a luma matte that reveals a photo.',
|
|
19802
20173
|
inputSchema: {
|
|
19803
20174
|
type: "object",
|
|
19804
20175
|
properties: {
|
|
19805
20176
|
clipIds: { type: "array", items: { type: "string" }, description: "The clips to capture." },
|
|
20177
|
+
preset: {
|
|
20178
|
+
type: "object",
|
|
20179
|
+
description: 'A preset definition instead of clipIds: { name, category?, description?, tags?, id? (custom_\u2026 to replace one), clips?: [], layers: [{ label, role: "over"|"matte", matteType?: "alpha"|"alphaInverted"|"luma"|"lumaInverted", start (s from the clip start), dur?, followLongSide? (quarter-turn to match a portrait clip), copyEffects? (effect types copied from the clip, e.g. ["dropShadow"]), blendMode?, media: { url, name, type: "video"|"image", duration, width, height } }] }.'
|
|
20180
|
+
},
|
|
19806
20181
|
name: str("Preset name."),
|
|
19807
20182
|
category: {
|
|
19808
20183
|
type: "string",
|
|
@@ -19811,14 +20186,13 @@ var TOOLS = [
|
|
|
19811
20186
|
},
|
|
19812
20187
|
tags: { type: "array", items: { type: "string" }, description: "Optional search tags." },
|
|
19813
20188
|
description: str("Optional one-line description.")
|
|
19814
|
-
}
|
|
19815
|
-
required: ["clipIds", "name"]
|
|
20189
|
+
}
|
|
19816
20190
|
},
|
|
19817
20191
|
method: "savePreset"
|
|
19818
20192
|
},
|
|
19819
20193
|
{
|
|
19820
20194
|
name: "apply_preset",
|
|
19821
|
-
description: "Apply a preset (saved or built-in; ids from list_presets). With clipId, a one-clip preset is laid onto that clip, keeping its media and place and replacing animation only on the properties the preset sets. Without clipId, the preset\u2019s clips are added as new clips at time (default: the playhead).",
|
|
20195
|
+
description: "Apply a preset (saved or built-in; ids from list_presets). With clipId, a one-clip preset is laid onto that clip, keeping its media and place and replacing animation only on the properties the preset sets. Without clipId, the preset\u2019s clips are added as new clips at time (default: the playhead). A preset with media layers (list_presets says needsClipId) needs clipId: its layers go on new tracks directly above that clip, sized to its box, starting with it.",
|
|
19822
20196
|
inputSchema: {
|
|
19823
20197
|
type: "object",
|
|
19824
20198
|
properties: {
|
|
@@ -20043,7 +20417,7 @@ var TOOLS = [
|
|
|
20043
20417
|
properties: {
|
|
20044
20418
|
clipId: CLIP_ID,
|
|
20045
20419
|
newStartTime: num("New timeline start time in seconds."),
|
|
20046
|
-
newTrackId: str('Track to move onto. Defaults to the clip\u2019s current track. Accepts "__new_video__" to pick a video track free across the clip\u2019s span.')
|
|
20420
|
+
newTrackId: str('Track to move onto. Defaults to the clip\u2019s current track. Accepts "__new_video__" to pick a video track free across the clip\u2019s span, or "__new_track__" for a new video track on top.')
|
|
20047
20421
|
},
|
|
20048
20422
|
required: ["clipId", "newStartTime"]
|
|
20049
20423
|
},
|
|
@@ -20167,6 +20541,90 @@ var TOOLS = [
|
|
|
20167
20541
|
method: "redo"
|
|
20168
20542
|
}
|
|
20169
20543
|
];
|
|
20544
|
+
var SEQUENCE_EDITS = /* @__PURE__ */ new Set([
|
|
20545
|
+
"addClip",
|
|
20546
|
+
"addClips",
|
|
20547
|
+
"addTextClip",
|
|
20548
|
+
"updateTextClip",
|
|
20549
|
+
"addShapeClip",
|
|
20550
|
+
"addAdjustmentLayer",
|
|
20551
|
+
"addTitleCard",
|
|
20552
|
+
"insertRipple",
|
|
20553
|
+
"setClipAudio",
|
|
20554
|
+
"setClipTransform",
|
|
20555
|
+
"setUltraKey",
|
|
20556
|
+
"setTrackMatte",
|
|
20557
|
+
"setShapeGradient",
|
|
20558
|
+
"setMask",
|
|
20559
|
+
"setKeyframes",
|
|
20560
|
+
"setClipEffect",
|
|
20561
|
+
"setTextAnimation",
|
|
20562
|
+
"addHtmlClip",
|
|
20563
|
+
"setColorGrade",
|
|
20564
|
+
"setClipDenoise",
|
|
20565
|
+
"addTransition",
|
|
20566
|
+
"applyAiEdit",
|
|
20567
|
+
"batchEdit",
|
|
20568
|
+
"clearTrack",
|
|
20569
|
+
"nestClips",
|
|
20570
|
+
"addSequenceClip",
|
|
20571
|
+
"removeClip",
|
|
20572
|
+
"moveClip",
|
|
20573
|
+
"trimClip",
|
|
20574
|
+
"splitClip",
|
|
20575
|
+
"rippleDeleteClip",
|
|
20576
|
+
"generateCaptions",
|
|
20577
|
+
"applyPreset",
|
|
20578
|
+
"updateShapeClip",
|
|
20579
|
+
"addNull",
|
|
20580
|
+
"setParent",
|
|
20581
|
+
"groupClips",
|
|
20582
|
+
"setProximity",
|
|
20583
|
+
"setClipSpeed",
|
|
20584
|
+
"setAutoLayout"
|
|
20585
|
+
]);
|
|
20586
|
+
var EXPECTED_SEQUENCE = str(
|
|
20587
|
+
"Optional guard: the sequence id this edit is meant for (from list_sequences). If the tab has a different sequence open, the call is refused instead of editing the wrong one."
|
|
20588
|
+
);
|
|
20589
|
+
var PLACING_EDITS = /* @__PURE__ */ new Set([
|
|
20590
|
+
"addClip",
|
|
20591
|
+
"addClips",
|
|
20592
|
+
"addTextClip",
|
|
20593
|
+
"addShapeClip",
|
|
20594
|
+
"addAdjustmentLayer",
|
|
20595
|
+
"addHtmlClip",
|
|
20596
|
+
"addSequenceClip",
|
|
20597
|
+
"moveClip",
|
|
20598
|
+
"trimClip",
|
|
20599
|
+
"batchEdit",
|
|
20600
|
+
"generateCaptions",
|
|
20601
|
+
"addNull",
|
|
20602
|
+
"groupClips",
|
|
20603
|
+
"setClipSpeed"
|
|
20604
|
+
]);
|
|
20605
|
+
var OVERWRITE = {
|
|
20606
|
+
type: "boolean",
|
|
20607
|
+
description: 'Placing, moving or lengthening a clip onto a span of a named track that other clips already hold is refused, naming them, because it would cut or delete them. Pass true to replace them anyway. Use trackId "__new_video__" for a free video track or "__new_track__" for a new one on top instead.'
|
|
20608
|
+
};
|
|
20609
|
+
var NEW_TRACK_ABOVE = str(
|
|
20610
|
+
'With trackId "__new_track__": put the new track directly above this video track instead of on top of everything \u2014 for a layer that belongs with a clip, below a full-length adjustment layer.'
|
|
20611
|
+
);
|
|
20612
|
+
var NEW_TRACK_BELOW = str('With trackId "__new_track__": put the new track directly below this video track.');
|
|
20613
|
+
var TOOLS = BASE_TOOLS.map((tool) => {
|
|
20614
|
+
if (!tool.method || !SEQUENCE_EDITS.has(tool.method)) return tool;
|
|
20615
|
+
return {
|
|
20616
|
+
...tool,
|
|
20617
|
+
inputSchema: {
|
|
20618
|
+
...tool.inputSchema,
|
|
20619
|
+
properties: {
|
|
20620
|
+
...tool.inputSchema.properties,
|
|
20621
|
+
expectedSequenceId: EXPECTED_SEQUENCE,
|
|
20622
|
+
...PLACING_EDITS.has(tool.method) ? { overwrite: OVERWRITE } : {},
|
|
20623
|
+
...PLACING_EDITS.has(tool.method) && tool.method !== "trimClip" ? { aboveTrackId: NEW_TRACK_ABOVE, belowTrackId: NEW_TRACK_BELOW } : {}
|
|
20624
|
+
}
|
|
20625
|
+
}
|
|
20626
|
+
};
|
|
20627
|
+
});
|
|
20170
20628
|
var TOOLS_BY_NAME = new Map(TOOLS.map((t) => [t.name, t]));
|
|
20171
20629
|
function editDistance(a, b) {
|
|
20172
20630
|
const rows = [Array.from({ length: b.length + 1 }, (_, j) => j)];
|
|
@@ -20356,7 +20814,8 @@ var MEDIA_TYPES = {
|
|
|
20356
20814
|
".gif": { mime: "image/gif", kind: "image" },
|
|
20357
20815
|
".webp": { mime: "image/webp", kind: "image" },
|
|
20358
20816
|
".svg": { mime: "image/svg+xml", kind: "image" },
|
|
20359
|
-
".json": { mime: "application/json", kind: "lottie" }
|
|
20817
|
+
".json": { mime: "application/json", kind: "lottie" },
|
|
20818
|
+
".glb": { mime: "model/gltf-binary", kind: "model" }
|
|
20360
20819
|
};
|
|
20361
20820
|
function mediaUrl(rel) {
|
|
20362
20821
|
return `http://localhost:${WEBSOCKET_PORT}/media/${rel.split(path2.sep).map(encodeURIComponent).join("/")}`;
|
package/package.json
CHANGED