@synthetic-ai/premiere-mcp 2.2.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 (57) hide show
  1. package/CHANGELOG.md +135 -135
  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/license.js +38 -0
  12. package/dist/server.js +60 -60
  13. package/dist/tools/advanced.js +357 -357
  14. package/dist/tools/audio-advanced.js +1049 -1049
  15. package/dist/tools/audio.js +42 -42
  16. package/dist/tools/captions.js +27 -27
  17. package/dist/tools/clipboard.js +214 -214
  18. package/dist/tools/color-advanced.js +253 -253
  19. package/dist/tools/discovery.js +291 -291
  20. package/dist/tools/effects.js +285 -285
  21. package/dist/tools/export-presets.js +206 -206
  22. package/dist/tools/export.js +255 -255
  23. package/dist/tools/health.js +10 -10
  24. package/dist/tools/inspection.js +885 -885
  25. package/dist/tools/keyframes.js +369 -369
  26. package/dist/tools/markers.js +89 -89
  27. package/dist/tools/media.js +178 -178
  28. package/dist/tools/metadata.js +94 -94
  29. package/dist/tools/multicam.js +50 -50
  30. package/dist/tools/playback.js +15 -15
  31. package/dist/tools/playhead.js +95 -95
  32. package/dist/tools/project-manager.js +21 -21
  33. package/dist/tools/project.js +149 -149
  34. package/dist/tools/scripting.js +319 -319
  35. package/dist/tools/selection.js +202 -202
  36. package/dist/tools/sequence-advanced.js +379 -379
  37. package/dist/tools/sequence-settings.js +564 -564
  38. package/dist/tools/sequence.js +167 -167
  39. package/dist/tools/source-monitor.js +68 -68
  40. package/dist/tools/text.js +58 -58
  41. package/dist/tools/timeline.js +312 -312
  42. package/dist/tools/track-management.js +446 -446
  43. package/dist/tools/track-targeting.js +635 -635
  44. package/dist/tools/tracks.js +87 -87
  45. package/dist/tools/transitions-motion.js +174 -174
  46. package/dist/tools/transitions.js +111 -111
  47. package/dist/tools/utility.js +606 -606
  48. package/dist/tools/workspace.js +29 -29
  49. package/package.json +66 -66
  50. package/scripts/build-chat-dmg.sh +210 -210
  51. package/scripts/build-chat-zip.sh +291 -291
  52. package/scripts/install-cep-windows.ps1 +99 -99
  53. package/scripts/install-cep.sh +66 -66
  54. package/scripts/install-chat-plugin.bat +67 -67
  55. package/scripts/install-chat-plugin.sh +85 -85
  56. package/scripts/install-windows.bat +95 -95
  57. 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
  },