@synthetic-ai/premiere-mcp 2.0.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 (104) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/LICENSE +21 -0
  3. package/README.md +242 -0
  4. package/cep-plugin/.debug +8 -0
  5. package/cep-plugin/CSInterface.js +70 -0
  6. package/cep-plugin/CSXS/manifest.xml +49 -0
  7. package/cep-plugin/host.jsx +7 -0
  8. package/cep-plugin/index.html +419 -0
  9. package/cep-plugin/main.js +327 -0
  10. package/cep-plugin/premiere.jsx +24947 -0
  11. package/cep-plugin/synthetic-logo.png +0 -0
  12. package/dist/bridge/file-bridge.d.ts +29 -0
  13. package/dist/bridge/file-bridge.js +145 -0
  14. package/dist/bridge/script-builder.d.ts +19 -0
  15. package/dist/bridge/script-builder.js +408 -0
  16. package/dist/http-server.d.ts +21 -0
  17. package/dist/http-server.js +140 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.js +70 -0
  20. package/dist/resources/extendscript-reference.d.ts +2 -0
  21. package/dist/resources/extendscript-reference.js +219 -0
  22. package/dist/server.d.ts +4 -0
  23. package/dist/server.js +276 -0
  24. package/dist/tools/advanced.d.ts +530 -0
  25. package/dist/tools/advanced.js +923 -0
  26. package/dist/tools/audio-advanced.d.ts +847 -0
  27. package/dist/tools/audio-advanced.js +1653 -0
  28. package/dist/tools/audio.d.ts +84 -0
  29. package/dist/tools/audio.js +123 -0
  30. package/dist/tools/captions.d.ts +30 -0
  31. package/dist/tools/captions.js +73 -0
  32. package/dist/tools/clipboard.d.ts +153 -0
  33. package/dist/tools/clipboard.js +381 -0
  34. package/dist/tools/color-advanced.d.ts +821 -0
  35. package/dist/tools/color-advanced.js +772 -0
  36. package/dist/tools/discovery.d.ts +128 -0
  37. package/dist/tools/discovery.js +445 -0
  38. package/dist/tools/effects.d.ts +211 -0
  39. package/dist/tools/effects.js +554 -0
  40. package/dist/tools/export-presets.d.ts +333 -0
  41. package/dist/tools/export-presets.js +490 -0
  42. package/dist/tools/export.d.ts +320 -0
  43. package/dist/tools/export.js +618 -0
  44. package/dist/tools/health.d.ts +9 -0
  45. package/dist/tools/health.js +25 -0
  46. package/dist/tools/inspection.d.ts +179 -0
  47. package/dist/tools/inspection.js +1089 -0
  48. package/dist/tools/keyframes.d.ts +253 -0
  49. package/dist/tools/keyframes.js +611 -0
  50. package/dist/tools/markers.d.ts +117 -0
  51. package/dist/tools/markers.js +206 -0
  52. package/dist/tools/media.d.ts +297 -0
  53. package/dist/tools/media.js +493 -0
  54. package/dist/tools/metadata.d.ts +178 -0
  55. package/dist/tools/metadata.js +278 -0
  56. package/dist/tools/multicam.d.ts +199 -0
  57. package/dist/tools/multicam.js +212 -0
  58. package/dist/tools/playback.d.ts +34 -0
  59. package/dist/tools/playback.js +63 -0
  60. package/dist/tools/playhead.d.ts +77 -0
  61. package/dist/tools/playhead.js +185 -0
  62. package/dist/tools/project-manager.d.ts +65 -0
  63. package/dist/tools/project-manager.js +81 -0
  64. package/dist/tools/project.d.ts +390 -0
  65. package/dist/tools/project.js +596 -0
  66. package/dist/tools/scripting.d.ts +98 -0
  67. package/dist/tools/scripting.js +434 -0
  68. package/dist/tools/selection.d.ts +120 -0
  69. package/dist/tools/selection.js +334 -0
  70. package/dist/tools/sequence-advanced.d.ts +84 -0
  71. package/dist/tools/sequence-advanced.js +471 -0
  72. package/dist/tools/sequence-settings.d.ts +397 -0
  73. package/dist/tools/sequence-settings.js +967 -0
  74. package/dist/tools/sequence.d.ts +211 -0
  75. package/dist/tools/sequence.js +378 -0
  76. package/dist/tools/source-monitor.d.ts +95 -0
  77. package/dist/tools/source-monitor.js +180 -0
  78. package/dist/tools/text.d.ts +97 -0
  79. package/dist/tools/text.js +159 -0
  80. package/dist/tools/timeline.d.ts +265 -0
  81. package/dist/tools/timeline.js +575 -0
  82. package/dist/tools/track-management.d.ts +482 -0
  83. package/dist/tools/track-management.js +787 -0
  84. package/dist/tools/track-targeting.d.ts +666 -0
  85. package/dist/tools/track-targeting.js +1318 -0
  86. package/dist/tools/tracks.d.ts +90 -0
  87. package/dist/tools/tracks.js +183 -0
  88. package/dist/tools/transitions-motion.d.ts +788 -0
  89. package/dist/tools/transitions-motion.js +680 -0
  90. package/dist/tools/transitions.d.ts +124 -0
  91. package/dist/tools/transitions.js +267 -0
  92. package/dist/tools/utility.d.ts +469 -0
  93. package/dist/tools/utility.js +1118 -0
  94. package/dist/tools/workspace.d.ts +25 -0
  95. package/dist/tools/workspace.js +61 -0
  96. package/package.json +66 -0
  97. package/scripts/build-chat-dmg.sh +210 -0
  98. package/scripts/build-chat-zip.sh +291 -0
  99. package/scripts/install-cep-windows.ps1 +99 -0
  100. package/scripts/install-cep.sh +66 -0
  101. package/scripts/install-chat-plugin.bat +67 -0
  102. package/scripts/install-chat-plugin.sh +85 -0
  103. package/scripts/install-windows.bat +95 -0
  104. package/scripts/package.mjs +218 -0
@@ -0,0 +1,334 @@
1
+ import { buildToolScript, escapeForExtendScript } from "../bridge/script-builder.js";
2
+ import { sendCommand } from "../bridge/file-bridge.js";
3
+ export function getSelectionTools(bridgeOptions) {
4
+ return {
5
+ select_clips_by_name: {
6
+ description: "Select all clips in the active sequence that match a name (substring match). Optionally filter by track type and index.",
7
+ parameters: {
8
+ type: "object",
9
+ properties: {
10
+ name: {
11
+ type: "string",
12
+ description: "Clip name to search for (case-insensitive substring match)",
13
+ },
14
+ track_type: {
15
+ type: "string",
16
+ enum: ["video", "audio", "both"],
17
+ description: "Track type to search (default: both)",
18
+ },
19
+ track_index: {
20
+ type: "number",
21
+ description: "Specific track index to search (optional, searches all if omitted)",
22
+ },
23
+ add_to_selection: {
24
+ type: "boolean",
25
+ description: "If true, add to existing selection instead of replacing it (default: false)",
26
+ },
27
+ },
28
+ required: ["name"],
29
+ },
30
+ handler: async (args) => {
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)}" });
72
+ `);
73
+ return sendCommand(script, bridgeOptions);
74
+ },
75
+ },
76
+ select_all_clips: {
77
+ description: "Select all clips in the active sequence, or all clips on a specific track.",
78
+ parameters: {
79
+ type: "object",
80
+ properties: {
81
+ track_type: {
82
+ type: "string",
83
+ enum: ["video", "audio", "both"],
84
+ description: "Track type (default: both)",
85
+ },
86
+ track_index: {
87
+ type: "number",
88
+ description: "Specific track index (optional, selects all tracks if omitted)",
89
+ },
90
+ },
91
+ },
92
+ handler: async (args) => {
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 });
114
+ `);
115
+ return sendCommand(script, bridgeOptions);
116
+ },
117
+ },
118
+ deselect_all_clips: {
119
+ description: "Deselect all clips in the active sequence.",
120
+ parameters: {},
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 });
142
+ `);
143
+ return sendCommand(script, bridgeOptions);
144
+ },
145
+ },
146
+ select_clips_in_range: {
147
+ description: "Select all clips that overlap a time range in the active sequence.",
148
+ parameters: {
149
+ type: "object",
150
+ properties: {
151
+ start_seconds: {
152
+ type: "number",
153
+ description: "Start of selection range in seconds",
154
+ },
155
+ end_seconds: {
156
+ type: "number",
157
+ description: "End of selection range in seconds",
158
+ },
159
+ track_type: {
160
+ type: "string",
161
+ enum: ["video", "audio", "both"],
162
+ description: "Track type (default: both)",
163
+ },
164
+ track_index: {
165
+ type: "number",
166
+ description: "Specific track index (optional)",
167
+ },
168
+ },
169
+ required: ["start_seconds", "end_seconds"],
170
+ },
171
+ handler: async (args) => {
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} });
209
+ `);
210
+ return sendCommand(script, bridgeOptions);
211
+ },
212
+ },
213
+ select_clips_by_color: {
214
+ description: "Select all clips whose source project item has a specific color label.",
215
+ parameters: {
216
+ type: "object",
217
+ properties: {
218
+ color_index: {
219
+ type: "number",
220
+ description: "Label color index (0=Violet, 1=Iris, 2=Caribbean, 3=Lavender, 4=Cerulean, 5=Forest, 6=Rose, 7=Mango, 8=Purple, 9=Blue, 10=Teal, 11=Magenta, 12=Tan, 13=Green, 14=Brown, 15=Yellow)",
221
+ },
222
+ },
223
+ required: ["color_index"],
224
+ },
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} });
257
+ `);
258
+ return sendCommand(script, bridgeOptions);
259
+ },
260
+ },
261
+ invert_selection: {
262
+ description: "Invert the current clip selection in the active sequence (selected become deselected and vice versa).",
263
+ parameters: {},
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 });
290
+ `);
291
+ return sendCommand(script, bridgeOptions);
292
+ },
293
+ },
294
+ select_disabled_clips: {
295
+ description: "Select all disabled clips in the active sequence.",
296
+ parameters: {},
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 });
328
+ `);
329
+ return sendCommand(script, bridgeOptions);
330
+ },
331
+ },
332
+ };
333
+ }
334
+ //# sourceMappingURL=selection.js.map
@@ -0,0 +1,84 @@
1
+ import { BridgeOptions } from "../bridge/file-bridge.js";
2
+ export declare function getSequenceAdvancedTools(bridgeOptions: BridgeOptions): {
3
+ create_sequence_from_clip: {
4
+ description: string;
5
+ parameters: {
6
+ type: "object";
7
+ properties: {
8
+ item_id: {
9
+ type: string;
10
+ description: string;
11
+ };
12
+ name: {
13
+ type: string;
14
+ description: string;
15
+ };
16
+ };
17
+ required: string[];
18
+ };
19
+ handler: (args: {
20
+ item_id: string;
21
+ name: string;
22
+ }) => Promise<import("../bridge/file-bridge.js").CommandResult>;
23
+ };
24
+ add_audio_track: {
25
+ description: string;
26
+ parameters: {
27
+ type: "object";
28
+ properties: {
29
+ track_type: {
30
+ type: string;
31
+ enum: string[];
32
+ description: string;
33
+ };
34
+ name: {
35
+ type: string;
36
+ description: string;
37
+ };
38
+ };
39
+ required: never[];
40
+ };
41
+ handler: (args: {
42
+ track_type?: string;
43
+ name?: string;
44
+ }) => Promise<import("../bridge/file-bridge.js").CommandResult>;
45
+ };
46
+ set_track_volume: {
47
+ description: string;
48
+ parameters: {
49
+ type: "object";
50
+ properties: {
51
+ track_index: {
52
+ type: string;
53
+ description: string;
54
+ };
55
+ volume_db: {
56
+ type: string;
57
+ description: string;
58
+ };
59
+ };
60
+ required: string[];
61
+ };
62
+ handler: (args: {
63
+ track_index: number;
64
+ volume_db: number;
65
+ }) => Promise<import("../bridge/file-bridge.js").CommandResult>;
66
+ };
67
+ nest_sequence: {
68
+ description: string;
69
+ parameters: {
70
+ type: "object";
71
+ properties: {
72
+ name: {
73
+ type: string;
74
+ description: string;
75
+ };
76
+ };
77
+ required: string[];
78
+ };
79
+ handler: (args: {
80
+ name: string;
81
+ }) => Promise<import("../bridge/file-bridge.js").CommandResult>;
82
+ };
83
+ };
84
+ //# sourceMappingURL=sequence-advanced.d.ts.map