@synthetic-ai/premiere-mcp 2.1.0 → 2.3.0-dev.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 (58) hide show
  1. package/CHANGELOG.md +135 -123
  2. package/LICENSE +21 -21
  3. package/README.md +242 -242
  4. package/cep-plugin/.debug +8 -8
  5. package/cep-plugin/CSInterface.js +92 -92
  6. package/cep-plugin/host.jsx +7 -7
  7. package/cep-plugin/index.html +472 -472
  8. package/cep-plugin/main.js +6 -0
  9. package/cep-plugin/premiere.jsx +24947 -24947
  10. package/dist/bridge/script-builder.js +378 -378
  11. package/dist/index.js +103 -4
  12. package/dist/license.js +38 -0
  13. package/dist/server.js +60 -60
  14. package/dist/tools/advanced.js +357 -357
  15. package/dist/tools/audio-advanced.js +1049 -1049
  16. package/dist/tools/audio.js +42 -42
  17. package/dist/tools/captions.js +27 -27
  18. package/dist/tools/clipboard.js +214 -214
  19. package/dist/tools/color-advanced.js +253 -253
  20. package/dist/tools/discovery.js +291 -291
  21. package/dist/tools/effects.js +285 -285
  22. package/dist/tools/export-presets.js +206 -206
  23. package/dist/tools/export.js +255 -255
  24. package/dist/tools/health.js +10 -10
  25. package/dist/tools/inspection.js +885 -885
  26. package/dist/tools/keyframes.js +369 -369
  27. package/dist/tools/markers.js +89 -89
  28. package/dist/tools/media.js +178 -178
  29. package/dist/tools/metadata.js +94 -94
  30. package/dist/tools/multicam.js +50 -50
  31. package/dist/tools/playback.js +15 -15
  32. package/dist/tools/playhead.js +95 -95
  33. package/dist/tools/project-manager.js +21 -21
  34. package/dist/tools/project.js +149 -149
  35. package/dist/tools/scripting.js +319 -319
  36. package/dist/tools/selection.js +202 -202
  37. package/dist/tools/sequence-advanced.js +379 -379
  38. package/dist/tools/sequence-settings.js +564 -564
  39. package/dist/tools/sequence.js +167 -167
  40. package/dist/tools/source-monitor.js +68 -68
  41. package/dist/tools/text.js +58 -58
  42. package/dist/tools/timeline.js +312 -312
  43. package/dist/tools/track-management.js +446 -446
  44. package/dist/tools/track-targeting.js +635 -635
  45. package/dist/tools/tracks.js +87 -87
  46. package/dist/tools/transitions-motion.js +174 -174
  47. package/dist/tools/transitions.js +111 -111
  48. package/dist/tools/utility.js +606 -606
  49. package/dist/tools/workspace.js +29 -29
  50. package/package.json +66 -66
  51. package/scripts/build-chat-dmg.sh +210 -210
  52. package/scripts/build-chat-zip.sh +291 -291
  53. package/scripts/install-cep-windows.ps1 +99 -99
  54. package/scripts/install-cep.sh +66 -66
  55. package/scripts/install-chat-plugin.bat +67 -67
  56. package/scripts/install-chat-plugin.sh +85 -85
  57. package/scripts/install-windows.bat +95 -95
  58. package/scripts/package.mjs +254 -254
@@ -29,46 +29,46 @@ export function getSelectionTools(bridgeOptions) {
29
29
  },
30
30
  handler: async (args) => {
31
31
  const trackType = args.track_type || "both";
32
- const script = buildToolScript(`
33
- var seq = app.project.activeSequence;
34
- if (!seq) return __error("No active sequence");
35
-
36
- var query = "${escapeForExtendScript(args.name)}".toLowerCase();
37
- var addToSel = ${args.add_to_selection ? "true" : "false"};
38
- var count = 0;
39
-
40
- function selectInTracks(tracks, type) {
41
- for (var t = 0; t < tracks.numTracks; t++) {
42
- ${args.track_index !== undefined ? `if (t !== ${args.track_index}) continue;` : ""}
43
- var track = tracks[t];
44
- for (var c = 0; c < track.clips.numItems; c++) {
45
- var clip = track.clips[c];
46
- if (clip.name.toLowerCase().indexOf(query) !== -1) {
47
- clip.setSelected(true, true);
48
- count++;
49
- } else if (!addToSel) {
50
- clip.setSelected(false, true);
51
- }
52
- }
53
- }
54
- }
55
-
56
- if (!addToSel) {
57
- // Deselect all first
58
- for (var t = 0; t < seq.videoTracks.numTracks; t++) {
59
- var track = seq.videoTracks[t];
60
- for (var c = 0; c < track.clips.numItems; c++) track.clips[c].setSelected(false, true);
61
- }
62
- for (var t = 0; t < seq.audioTracks.numTracks; t++) {
63
- var track = seq.audioTracks[t];
64
- for (var c = 0; c < track.clips.numItems; c++) track.clips[c].setSelected(false, true);
65
- }
66
- }
67
-
68
- if ("${trackType}" !== "audio") selectInTracks(seq.videoTracks, "video");
69
- if ("${trackType}" !== "video") selectInTracks(seq.audioTracks, "audio");
70
-
71
- return __result({ selected: count, query: "${escapeForExtendScript(args.name)}" });
32
+ const script = buildToolScript(`
33
+ var seq = app.project.activeSequence;
34
+ if (!seq) return __error("No active sequence");
35
+
36
+ var query = "${escapeForExtendScript(args.name)}".toLowerCase();
37
+ var addToSel = ${args.add_to_selection ? "true" : "false"};
38
+ var count = 0;
39
+
40
+ function selectInTracks(tracks, type) {
41
+ for (var t = 0; t < tracks.numTracks; t++) {
42
+ ${args.track_index !== undefined ? `if (t !== ${args.track_index}) continue;` : ""}
43
+ var track = tracks[t];
44
+ for (var c = 0; c < track.clips.numItems; c++) {
45
+ var clip = track.clips[c];
46
+ if (clip.name.toLowerCase().indexOf(query) !== -1) {
47
+ clip.setSelected(true, true);
48
+ count++;
49
+ } else if (!addToSel) {
50
+ clip.setSelected(false, true);
51
+ }
52
+ }
53
+ }
54
+ }
55
+
56
+ if (!addToSel) {
57
+ // Deselect all first
58
+ for (var t = 0; t < seq.videoTracks.numTracks; t++) {
59
+ var track = seq.videoTracks[t];
60
+ for (var c = 0; c < track.clips.numItems; c++) track.clips[c].setSelected(false, true);
61
+ }
62
+ for (var t = 0; t < seq.audioTracks.numTracks; t++) {
63
+ var track = seq.audioTracks[t];
64
+ for (var c = 0; c < track.clips.numItems; c++) track.clips[c].setSelected(false, true);
65
+ }
66
+ }
67
+
68
+ if ("${trackType}" !== "audio") selectInTracks(seq.videoTracks, "video");
69
+ if ("${trackType}" !== "video") selectInTracks(seq.audioTracks, "audio");
70
+
71
+ return __result({ selected: count, query: "${escapeForExtendScript(args.name)}" });
72
72
  `);
73
73
  return sendCommand(script, bridgeOptions);
74
74
  },
@@ -91,26 +91,26 @@ export function getSelectionTools(bridgeOptions) {
91
91
  },
92
92
  handler: async (args) => {
93
93
  const trackType = args.track_type || "both";
94
- const script = buildToolScript(`
95
- var seq = app.project.activeSequence;
96
- if (!seq) return __error("No active sequence");
97
-
98
- var count = 0;
99
- function selectAll(tracks) {
100
- for (var t = 0; t < tracks.numTracks; t++) {
101
- ${args.track_index !== undefined ? `if (t !== ${args.track_index}) continue;` : ""}
102
- var track = tracks[t];
103
- for (var c = 0; c < track.clips.numItems; c++) {
104
- track.clips[c].setSelected(true, true);
105
- count++;
106
- }
107
- }
108
- }
109
-
110
- if ("${trackType}" !== "audio") selectAll(seq.videoTracks);
111
- if ("${trackType}" !== "video") selectAll(seq.audioTracks);
112
-
113
- return __result({ selected: count });
94
+ const script = buildToolScript(`
95
+ var seq = app.project.activeSequence;
96
+ if (!seq) return __error("No active sequence");
97
+
98
+ var count = 0;
99
+ function selectAll(tracks) {
100
+ for (var t = 0; t < tracks.numTracks; t++) {
101
+ ${args.track_index !== undefined ? `if (t !== ${args.track_index}) continue;` : ""}
102
+ var track = tracks[t];
103
+ for (var c = 0; c < track.clips.numItems; c++) {
104
+ track.clips[c].setSelected(true, true);
105
+ count++;
106
+ }
107
+ }
108
+ }
109
+
110
+ if ("${trackType}" !== "audio") selectAll(seq.videoTracks);
111
+ if ("${trackType}" !== "video") selectAll(seq.audioTracks);
112
+
113
+ return __result({ selected: count });
114
114
  `);
115
115
  return sendCommand(script, bridgeOptions);
116
116
  },
@@ -119,26 +119,26 @@ export function getSelectionTools(bridgeOptions) {
119
119
  description: "Deselect all clips in the active sequence.",
120
120
  parameters: {},
121
121
  handler: async () => {
122
- const script = buildToolScript(`
123
- var seq = app.project.activeSequence;
124
- if (!seq) return __error("No active sequence");
125
-
126
- var count = 0;
127
- for (var t = 0; t < seq.videoTracks.numTracks; t++) {
128
- var track = seq.videoTracks[t];
129
- for (var c = 0; c < track.clips.numItems; c++) {
130
- track.clips[c].setSelected(false, true);
131
- count++;
132
- }
133
- }
134
- for (var t = 0; t < seq.audioTracks.numTracks; t++) {
135
- var track = seq.audioTracks[t];
136
- for (var c = 0; c < track.clips.numItems; c++) {
137
- track.clips[c].setSelected(false, true);
138
- count++;
139
- }
140
- }
141
- return __result({ deselected: count });
122
+ const script = buildToolScript(`
123
+ var seq = app.project.activeSequence;
124
+ if (!seq) return __error("No active sequence");
125
+
126
+ var count = 0;
127
+ for (var t = 0; t < seq.videoTracks.numTracks; t++) {
128
+ var track = seq.videoTracks[t];
129
+ for (var c = 0; c < track.clips.numItems; c++) {
130
+ track.clips[c].setSelected(false, true);
131
+ count++;
132
+ }
133
+ }
134
+ for (var t = 0; t < seq.audioTracks.numTracks; t++) {
135
+ var track = seq.audioTracks[t];
136
+ for (var c = 0; c < track.clips.numItems; c++) {
137
+ track.clips[c].setSelected(false, true);
138
+ count++;
139
+ }
140
+ }
141
+ return __result({ deselected: count });
142
142
  `);
143
143
  return sendCommand(script, bridgeOptions);
144
144
  },
@@ -170,42 +170,42 @@ export function getSelectionTools(bridgeOptions) {
170
170
  },
171
171
  handler: async (args) => {
172
172
  const trackType = args.track_type || "both";
173
- const script = buildToolScript(`
174
- var seq = app.project.activeSequence;
175
- if (!seq) return __error("No active sequence");
176
-
177
- var startTicks = __secondsToTicks(${args.start_seconds});
178
- var endTicks = __secondsToTicks(${args.end_seconds});
179
- var count = 0;
180
-
181
- // Deselect all first
182
- for (var t = 0; t < seq.videoTracks.numTracks; t++) {
183
- for (var c = 0; c < seq.videoTracks[t].clips.numItems; c++) seq.videoTracks[t].clips[c].setSelected(false, true);
184
- }
185
- for (var t = 0; t < seq.audioTracks.numTracks; t++) {
186
- for (var c = 0; c < seq.audioTracks[t].clips.numItems; c++) seq.audioTracks[t].clips[c].setSelected(false, true);
187
- }
188
-
189
- function selectInRange(tracks) {
190
- for (var t = 0; t < tracks.numTracks; t++) {
191
- ${args.track_index !== undefined ? `if (t !== ${args.track_index}) continue;` : ""}
192
- var track = tracks[t];
193
- for (var c = 0; c < track.clips.numItems; c++) {
194
- var clip = track.clips[c];
195
- var cs = parseFloat(clip.start.ticks);
196
- var ce = parseFloat(clip.end.ticks);
197
- if (cs < endTicks && ce > startTicks) {
198
- clip.setSelected(true, true);
199
- count++;
200
- }
201
- }
202
- }
203
- }
204
-
205
- if ("${trackType}" !== "audio") selectInRange(seq.videoTracks);
206
- if ("${trackType}" !== "video") selectInRange(seq.audioTracks);
207
-
208
- return __result({ selected: count, rangeStart: ${args.start_seconds}, rangeEnd: ${args.end_seconds} });
173
+ const script = buildToolScript(`
174
+ var seq = app.project.activeSequence;
175
+ if (!seq) return __error("No active sequence");
176
+
177
+ var startTicks = __secondsToTicks(${args.start_seconds});
178
+ var endTicks = __secondsToTicks(${args.end_seconds});
179
+ var count = 0;
180
+
181
+ // Deselect all first
182
+ for (var t = 0; t < seq.videoTracks.numTracks; t++) {
183
+ for (var c = 0; c < seq.videoTracks[t].clips.numItems; c++) seq.videoTracks[t].clips[c].setSelected(false, true);
184
+ }
185
+ for (var t = 0; t < seq.audioTracks.numTracks; t++) {
186
+ for (var c = 0; c < seq.audioTracks[t].clips.numItems; c++) seq.audioTracks[t].clips[c].setSelected(false, true);
187
+ }
188
+
189
+ function selectInRange(tracks) {
190
+ for (var t = 0; t < tracks.numTracks; t++) {
191
+ ${args.track_index !== undefined ? `if (t !== ${args.track_index}) continue;` : ""}
192
+ var track = tracks[t];
193
+ for (var c = 0; c < track.clips.numItems; c++) {
194
+ var clip = track.clips[c];
195
+ var cs = parseFloat(clip.start.ticks);
196
+ var ce = parseFloat(clip.end.ticks);
197
+ if (cs < endTicks && ce > startTicks) {
198
+ clip.setSelected(true, true);
199
+ count++;
200
+ }
201
+ }
202
+ }
203
+ }
204
+
205
+ if ("${trackType}" !== "audio") selectInRange(seq.videoTracks);
206
+ if ("${trackType}" !== "video") selectInRange(seq.audioTracks);
207
+
208
+ return __result({ selected: count, rangeStart: ${args.start_seconds}, rangeEnd: ${args.end_seconds} });
209
209
  `);
210
210
  return sendCommand(script, bridgeOptions);
211
211
  },
@@ -223,37 +223,37 @@ export function getSelectionTools(bridgeOptions) {
223
223
  required: ["color_index"],
224
224
  },
225
225
  handler: async (args) => {
226
- const script = buildToolScript(`
227
- var seq = app.project.activeSequence;
228
- if (!seq) return __error("No active sequence");
229
-
230
- // Deselect all
231
- for (var t = 0; t < seq.videoTracks.numTracks; t++) {
232
- for (var c = 0; c < seq.videoTracks[t].clips.numItems; c++) seq.videoTracks[t].clips[c].setSelected(false, true);
233
- }
234
- for (var t = 0; t < seq.audioTracks.numTracks; t++) {
235
- for (var c = 0; c < seq.audioTracks[t].clips.numItems; c++) seq.audioTracks[t].clips[c].setSelected(false, true);
236
- }
237
-
238
- var count = 0;
239
- function scan(tracks) {
240
- for (var t = 0; t < tracks.numTracks; t++) {
241
- var track = tracks[t];
242
- for (var c = 0; c < track.clips.numItems; c++) {
243
- var clip = track.clips[c];
244
- try {
245
- if (clip.projectItem && clip.projectItem.getColorLabel() === ${args.color_index}) {
246
- clip.setSelected(true, true);
247
- count++;
248
- }
249
- } catch(e) {}
250
- }
251
- }
252
- }
253
- scan(seq.videoTracks);
254
- scan(seq.audioTracks);
255
-
256
- return __result({ selected: count, colorIndex: ${args.color_index} });
226
+ const script = buildToolScript(`
227
+ var seq = app.project.activeSequence;
228
+ if (!seq) return __error("No active sequence");
229
+
230
+ // Deselect all
231
+ for (var t = 0; t < seq.videoTracks.numTracks; t++) {
232
+ for (var c = 0; c < seq.videoTracks[t].clips.numItems; c++) seq.videoTracks[t].clips[c].setSelected(false, true);
233
+ }
234
+ for (var t = 0; t < seq.audioTracks.numTracks; t++) {
235
+ for (var c = 0; c < seq.audioTracks[t].clips.numItems; c++) seq.audioTracks[t].clips[c].setSelected(false, true);
236
+ }
237
+
238
+ var count = 0;
239
+ function scan(tracks) {
240
+ for (var t = 0; t < tracks.numTracks; t++) {
241
+ var track = tracks[t];
242
+ for (var c = 0; c < track.clips.numItems; c++) {
243
+ var clip = track.clips[c];
244
+ try {
245
+ if (clip.projectItem && clip.projectItem.getColorLabel() === ${args.color_index}) {
246
+ clip.setSelected(true, true);
247
+ count++;
248
+ }
249
+ } catch(e) {}
250
+ }
251
+ }
252
+ }
253
+ scan(seq.videoTracks);
254
+ scan(seq.audioTracks);
255
+
256
+ return __result({ selected: count, colorIndex: ${args.color_index} });
257
257
  `);
258
258
  return sendCommand(script, bridgeOptions);
259
259
  },
@@ -262,31 +262,31 @@ export function getSelectionTools(bridgeOptions) {
262
262
  description: "Invert the current clip selection in the active sequence (selected become deselected and vice versa).",
263
263
  parameters: {},
264
264
  handler: async () => {
265
- const script = buildToolScript(`
266
- var seq = app.project.activeSequence;
267
- if (!seq) return __error("No active sequence");
268
-
269
- var selected = 0;
270
- var deselected = 0;
271
- function invert(tracks) {
272
- for (var t = 0; t < tracks.numTracks; t++) {
273
- var track = tracks[t];
274
- for (var c = 0; c < track.clips.numItems; c++) {
275
- var clip = track.clips[c];
276
- if (clip.selected) {
277
- clip.setSelected(false, true);
278
- deselected++;
279
- } else {
280
- clip.setSelected(true, true);
281
- selected++;
282
- }
283
- }
284
- }
285
- }
286
- invert(seq.videoTracks);
287
- invert(seq.audioTracks);
288
-
289
- return __result({ nowSelected: selected, nowDeselected: deselected });
265
+ const script = buildToolScript(`
266
+ var seq = app.project.activeSequence;
267
+ if (!seq) return __error("No active sequence");
268
+
269
+ var selected = 0;
270
+ var deselected = 0;
271
+ function invert(tracks) {
272
+ for (var t = 0; t < tracks.numTracks; t++) {
273
+ var track = tracks[t];
274
+ for (var c = 0; c < track.clips.numItems; c++) {
275
+ var clip = track.clips[c];
276
+ if (clip.selected) {
277
+ clip.setSelected(false, true);
278
+ deselected++;
279
+ } else {
280
+ clip.setSelected(true, true);
281
+ selected++;
282
+ }
283
+ }
284
+ }
285
+ }
286
+ invert(seq.videoTracks);
287
+ invert(seq.audioTracks);
288
+
289
+ return __result({ nowSelected: selected, nowDeselected: deselected });
290
290
  `);
291
291
  return sendCommand(script, bridgeOptions);
292
292
  },
@@ -295,36 +295,36 @@ export function getSelectionTools(bridgeOptions) {
295
295
  description: "Select all disabled clips in the active sequence.",
296
296
  parameters: {},
297
297
  handler: async () => {
298
- const script = buildToolScript(`
299
- var seq = app.project.activeSequence;
300
- if (!seq) return __error("No active sequence");
301
-
302
- // Deselect all
303
- for (var t = 0; t < seq.videoTracks.numTracks; t++) {
304
- for (var c = 0; c < seq.videoTracks[t].clips.numItems; c++) seq.videoTracks[t].clips[c].setSelected(false, true);
305
- }
306
- for (var t = 0; t < seq.audioTracks.numTracks; t++) {
307
- for (var c = 0; c < seq.audioTracks[t].clips.numItems; c++) seq.audioTracks[t].clips[c].setSelected(false, true);
308
- }
309
-
310
- var count = 0;
311
- function scan(tracks) {
312
- for (var t = 0; t < tracks.numTracks; t++) {
313
- var track = tracks[t];
314
- for (var c = 0; c < track.clips.numItems; c++) {
315
- try {
316
- if (track.clips[c].disabled) {
317
- track.clips[c].setSelected(true, true);
318
- count++;
319
- }
320
- } catch(e) {}
321
- }
322
- }
323
- }
324
- scan(seq.videoTracks);
325
- scan(seq.audioTracks);
326
-
327
- return __result({ selected: count });
298
+ const script = buildToolScript(`
299
+ var seq = app.project.activeSequence;
300
+ if (!seq) return __error("No active sequence");
301
+
302
+ // Deselect all
303
+ for (var t = 0; t < seq.videoTracks.numTracks; t++) {
304
+ for (var c = 0; c < seq.videoTracks[t].clips.numItems; c++) seq.videoTracks[t].clips[c].setSelected(false, true);
305
+ }
306
+ for (var t = 0; t < seq.audioTracks.numTracks; t++) {
307
+ for (var c = 0; c < seq.audioTracks[t].clips.numItems; c++) seq.audioTracks[t].clips[c].setSelected(false, true);
308
+ }
309
+
310
+ var count = 0;
311
+ function scan(tracks) {
312
+ for (var t = 0; t < tracks.numTracks; t++) {
313
+ var track = tracks[t];
314
+ for (var c = 0; c < track.clips.numItems; c++) {
315
+ try {
316
+ if (track.clips[c].disabled) {
317
+ track.clips[c].setSelected(true, true);
318
+ count++;
319
+ }
320
+ } catch(e) {}
321
+ }
322
+ }
323
+ }
324
+ scan(seq.videoTracks);
325
+ scan(seq.audioTracks);
326
+
327
+ return __result({ selected: count });
328
328
  `);
329
329
  return sendCommand(script, bridgeOptions);
330
330
  },