@synthetic-ai/premiere-mcp 2.3.6 → 3.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 (126) hide show
  1. package/LICENSE +5 -21
  2. package/README.md +10 -242
  3. package/launcher.mjs +111 -0
  4. package/package.json +10 -54
  5. package/CHANGELOG.md +0 -186
  6. package/cep-plugin/.debug +0 -8
  7. package/cep-plugin/CSInterface.js +0 -92
  8. package/cep-plugin/CSXS/manifest.xml +0 -49
  9. package/cep-plugin/host.jsx +0 -7
  10. package/cep-plugin/i18n-core.cjs +0 -224
  11. package/cep-plugin/i18n-locales.js +0 -3
  12. package/cep-plugin/i18n-panel.cjs +0 -178
  13. package/cep-plugin/index.html +0 -507
  14. package/cep-plugin/main.js +0 -793
  15. package/cep-plugin/premiere.jsx +0 -24947
  16. package/cep-plugin/synthetic-logo.png +0 -0
  17. package/dist/bridge/file-bridge.d.ts +0 -29
  18. package/dist/bridge/file-bridge.js +0 -146
  19. package/dist/bridge/script-builder.d.ts +0 -19
  20. package/dist/bridge/script-builder.js +0 -408
  21. package/dist/http-server.d.ts +0 -22
  22. package/dist/http-server.js +0 -143
  23. package/dist/i18n.d.ts +0 -42
  24. package/dist/i18n.js +0 -69
  25. package/dist/index.d.ts +0 -3
  26. package/dist/index.js +0 -179
  27. package/dist/license.d.ts +0 -22
  28. package/dist/license.js +0 -133
  29. package/dist/resources/extendscript-reference.d.ts +0 -2
  30. package/dist/resources/extendscript-reference.js +0 -219
  31. package/dist/server.d.ts +0 -4
  32. package/dist/server.js +0 -292
  33. package/dist/tools/advanced.d.ts +0 -530
  34. package/dist/tools/advanced.js +0 -923
  35. package/dist/tools/audio-advanced.d.ts +0 -847
  36. package/dist/tools/audio-advanced.js +0 -1653
  37. package/dist/tools/audio.d.ts +0 -84
  38. package/dist/tools/audio.js +0 -123
  39. package/dist/tools/captions.d.ts +0 -30
  40. package/dist/tools/captions.js +0 -73
  41. package/dist/tools/clipboard.d.ts +0 -153
  42. package/dist/tools/clipboard.js +0 -381
  43. package/dist/tools/color-advanced.d.ts +0 -821
  44. package/dist/tools/color-advanced.js +0 -772
  45. package/dist/tools/discovery.d.ts +0 -128
  46. package/dist/tools/discovery.js +0 -445
  47. package/dist/tools/effects.d.ts +0 -211
  48. package/dist/tools/effects.js +0 -555
  49. package/dist/tools/export-presets.d.ts +0 -333
  50. package/dist/tools/export-presets.js +0 -490
  51. package/dist/tools/export.d.ts +0 -320
  52. package/dist/tools/export.js +0 -619
  53. package/dist/tools/health.d.ts +0 -9
  54. package/dist/tools/health.js +0 -25
  55. package/dist/tools/inspection.d.ts +0 -179
  56. package/dist/tools/inspection.js +0 -1089
  57. package/dist/tools/keyframes.d.ts +0 -253
  58. package/dist/tools/keyframes.js +0 -611
  59. package/dist/tools/markers.d.ts +0 -117
  60. package/dist/tools/markers.js +0 -206
  61. package/dist/tools/media.d.ts +0 -297
  62. package/dist/tools/media.js +0 -493
  63. package/dist/tools/metadata.d.ts +0 -178
  64. package/dist/tools/metadata.js +0 -278
  65. package/dist/tools/multicam.d.ts +0 -199
  66. package/dist/tools/multicam.js +0 -212
  67. package/dist/tools/playback.d.ts +0 -34
  68. package/dist/tools/playback.js +0 -63
  69. package/dist/tools/playhead.d.ts +0 -77
  70. package/dist/tools/playhead.js +0 -185
  71. package/dist/tools/project-manager.d.ts +0 -65
  72. package/dist/tools/project-manager.js +0 -81
  73. package/dist/tools/project.d.ts +0 -390
  74. package/dist/tools/project.js +0 -596
  75. package/dist/tools/scripting.d.ts +0 -98
  76. package/dist/tools/scripting.js +0 -434
  77. package/dist/tools/selection.d.ts +0 -120
  78. package/dist/tools/selection.js +0 -334
  79. package/dist/tools/sequence-advanced.d.ts +0 -84
  80. package/dist/tools/sequence-advanced.js +0 -476
  81. package/dist/tools/sequence-settings.d.ts +0 -397
  82. package/dist/tools/sequence-settings.js +0 -975
  83. package/dist/tools/sequence.d.ts +0 -211
  84. package/dist/tools/sequence.js +0 -400
  85. package/dist/tools/source-monitor.d.ts +0 -95
  86. package/dist/tools/source-monitor.js +0 -180
  87. package/dist/tools/text.d.ts +0 -97
  88. package/dist/tools/text.js +0 -159
  89. package/dist/tools/timeline.d.ts +0 -265
  90. package/dist/tools/timeline.js +0 -575
  91. package/dist/tools/track-management.d.ts +0 -482
  92. package/dist/tools/track-management.js +0 -787
  93. package/dist/tools/track-targeting.d.ts +0 -666
  94. package/dist/tools/track-targeting.js +0 -1318
  95. package/dist/tools/tracks.d.ts +0 -90
  96. package/dist/tools/tracks.js +0 -183
  97. package/dist/tools/transitions-motion.d.ts +0 -788
  98. package/dist/tools/transitions-motion.js +0 -680
  99. package/dist/tools/transitions.d.ts +0 -124
  100. package/dist/tools/transitions.js +0 -268
  101. package/dist/tools/utility.d.ts +0 -469
  102. package/dist/tools/utility.js +0 -1118
  103. package/dist/tools/workspace.d.ts +0 -25
  104. package/dist/tools/workspace.js +0 -61
  105. package/i18n/i18n-core.cjs +0 -224
  106. package/i18n/locales/de.json +0 -1488
  107. package/i18n/locales/en.json +0 -1488
  108. package/i18n/locales/es.json +0 -1488
  109. package/i18n/locales/fr.json +0 -1488
  110. package/i18n/locales/hashes/de.json +0 -1488
  111. package/i18n/locales/hashes/es.json +0 -1488
  112. package/i18n/locales/hashes/fr.json +0 -1488
  113. package/i18n/locales/hashes/ja.json +0 -1488
  114. package/i18n/locales/hashes/pt-BR.json +0 -1488
  115. package/i18n/locales/ja.json +0 -1488
  116. package/i18n/locales/pt-BR.json +0 -1488
  117. package/i18n/node.cjs +0 -124
  118. package/scripts/build-chat-dmg.sh +0 -210
  119. package/scripts/build-chat-zip.sh +0 -291
  120. package/scripts/install-cep-windows.ps1 +0 -99
  121. package/scripts/install-cep.sh +0 -66
  122. package/scripts/install-chat-plugin.bat +0 -67
  123. package/scripts/install-chat-plugin.sh +0 -85
  124. package/scripts/install-windows.bat +0 -95
  125. package/scripts/package.mjs +0 -270
  126. package/scripts/sync-i18n.mjs +0 -117
@@ -1,507 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8">
5
- <title>Synthetic Premiere MCP</title>
6
- <style>
7
- /* -- Synthetic design system applied to the CEP panel ----------------- */
8
- /* Dark canvas + purple accent (Premiere MCP brand). Element ids match */
9
- /* main.js exactly so the bridge logic does not change. */
10
-
11
- * { margin: 0; padding: 0; box-sizing: border-box; }
12
-
13
- :root {
14
- --bg: #080809;
15
- --surface: rgba(24, 24, 27, 0.6);
16
- --surface-2: rgba(39, 39, 42, 0.7);
17
- --border: rgba(63, 63, 70, 0.6);
18
- --border-soft: rgba(63, 63, 70, 0.35);
19
- --text: #f4f4f5;
20
- --text-mute: #a1a1aa;
21
- --text-dim: #71717a;
22
- --text-faint: #52525b;
23
-
24
- --accent: #a855f7; /* purple-500 — Premiere MCP brand */
25
- --accent-hover: #9333ea; /* purple-600 */
26
- --accent-soft-bg: rgba(168, 85, 247, 0.12);
27
- --accent-soft-border: rgba(168, 85, 247, 0.30);
28
-
29
- --ok: #4ade80; /* green-400 */
30
- --warn: #fbbf24; /* amber-400 */
31
- --err: #f87171; /* red-400 */
32
- --info: #93c5fd; /* blue-300 */
33
- }
34
-
35
- html, body { height: 100%; }
36
- /* Body is a flex column so .synth-footer (margin-top:auto) pins to the
37
- very bottom. The .synth-header/.synth-footer span edge-to-edge, so
38
- body padding is 0; the panel content lives inside #panel-content with
39
- its own padding. */
40
- body {
41
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Inter", sans-serif;
42
- background: var(--bg);
43
- color: var(--text);
44
- font-size: 12px;
45
- letter-spacing: -0.005em;
46
- display: flex;
47
- flex-direction: column;
48
- min-height: 100vh;
49
- margin: 0;
50
- box-sizing: border-box;
51
- }
52
- #panel-content {
53
- flex: 1;
54
- padding: 16px;
55
- display: flex;
56
- flex-direction: column;
57
- }
58
-
59
- /* ─── Synthetic shell — canonical (see synthetic/docs/DESIGN_SYSTEM.md)
60
- Do NOT edit per-panel. Edit the canonical block in DESIGN_SYSTEM.md
61
- then copy-paste verbatim. */
62
- :root {
63
- --shell-accent: #a855f7; /* purple-500 */
64
- --shell-accent-dim: rgba(168, 85, 247, 0.12);
65
- }
66
- .synth-header,
67
- .synth-footer {
68
- display: flex;
69
- align-items: center;
70
- justify-content: center;
71
- gap: 8px;
72
- padding: 8px 14px;
73
- flex-shrink: 0;
74
- text-decoration: none;
75
- color: inherit;
76
- font-family: inherit;
77
- box-sizing: border-box;
78
- }
79
- .synth-header {
80
- background: rgba(24, 24, 27, 0.5);
81
- border-bottom: 1px solid rgba(63, 63, 70, 0.35);
82
- cursor: pointer;
83
- transition: background-color 120ms ease;
84
- }
85
- .synth-header:hover { background: rgba(24, 24, 27, 0.7); }
86
- .synth-header:active { background: rgba(24, 24, 27, 0.85); }
87
- .synth-header-logo { width: 9px; height: 15px; object-fit: contain; flex-shrink: 0; }
88
- .synth-header-name {
89
- font-weight: 700;
90
- font-size: 12.5px;
91
- letter-spacing: -0.01em;
92
- color: #f4f4f5;
93
- }
94
- .synth-version-tag {
95
- display: inline-flex;
96
- align-items: center;
97
- padding: 2px 8px;
98
- border-radius: 999px;
99
- background: var(--shell-accent-dim);
100
- border: 1px solid var(--shell-accent);
101
- font-size: 9px;
102
- font-weight: 700;
103
- color: var(--shell-accent);
104
- letter-spacing: 0.3px;
105
- text-transform: uppercase;
106
- }
107
- .synth-footer {
108
- margin-top: auto;
109
- background: rgba(24, 24, 27, 0.5);
110
- border-top: 1px solid rgba(63, 63, 70, 0.35);
111
- gap: 6px;
112
- font-size: 10px;
113
- letter-spacing: 0.04em;
114
- text-transform: uppercase;
115
- color: #71717a;
116
- }
117
- .synth-footer-label { color: #71717a; }
118
- .synth-footer-link {
119
- display: inline-flex;
120
- align-items: center;
121
- gap: 6px;
122
- padding: 3px 8px;
123
- border-radius: 999px;
124
- text-decoration: none;
125
- color: inherit;
126
- cursor: pointer;
127
- transition: background-color 120ms ease;
128
- }
129
- .synth-footer-link:hover { background: rgba(255, 255, 255, 0.06); }
130
- .synth-footer-link:active { background: rgba(255, 255, 255, 0.10); }
131
- .synth-footer-logo { width: 9px; height: 15px; object-fit: contain; }
132
- .synth-footer-name {
133
- color: #a1a1aa;
134
- font-weight: 600;
135
- text-transform: none;
136
- letter-spacing: -0.005em;
137
- font-size: 11px;
138
- }
139
- .synth-footer-link:hover .synth-footer-name { color: #f4f4f5; }
140
- /* ─── End Synthetic shell ───────────────────────────────────────────── */
141
-
142
- /* (Old .header / .version-tag / a.header-link rules removed — replaced
143
- by the canonical .synth-header block above.) */
144
-
145
- /* -- Hero: product title strip ----------------------------------------- */
146
- .product {
147
- display: flex;
148
- align-items: center;
149
- gap: 10px;
150
- background: linear-gradient(135deg, rgba(88, 28, 135, 0.18), rgba(24, 24, 27, 0.2) 60%, rgba(24, 24, 27, 0.05));
151
- border: 1px solid var(--accent-soft-border);
152
- border-radius: 12px;
153
- padding: 10px 12px;
154
- margin-bottom: 14px;
155
- }
156
- .product .mark {
157
- width: 30px; height: 30px;
158
- border-radius: 8px;
159
- background: var(--accent-soft-bg);
160
- border: 1px solid var(--accent-soft-border);
161
- display: flex; align-items: center; justify-content: center;
162
- color: var(--accent);
163
- flex-shrink: 0;
164
- }
165
- .product .mark svg { width: 16px; height: 16px; }
166
- .product-text { min-width: 0; flex: 1; }
167
- .product .title { font-weight: 700; font-size: 12.5px; line-height: 1.2; }
168
- .product .sub { font-size: 10px; color: var(--text-dim); margin-top: 2px; }
169
- /* Status dot inside the product block — grey by default, turns green
170
- with a soft halo when the bridge is running (see main.js init). */
171
- .product-status {
172
- width: 8px;
173
- height: 8px;
174
- border-radius: 50%;
175
- flex-shrink: 0;
176
- background: var(--text-faint);
177
- transition: background 120ms ease, box-shadow 120ms ease;
178
- }
179
- .product-status.ok {
180
- background: var(--ok);
181
- box-shadow: 0 0 0 3px rgba(74, 222, 128, 0.15);
182
- }
183
- .product-status.warn {
184
- background: var(--warn);
185
- box-shadow: 0 0 0 3px rgba(251, 191, 36, 0.15);
186
- }
187
- .product-status.err {
188
- background: var(--err);
189
- box-shadow: 0 0 0 3px rgba(248, 113, 113, 0.15);
190
- }
191
- /* Reload/settings buttons — sit outside the .product card in #topbar-right,
192
- same layout as AE Agent's icon row. */
193
- .icon-btn {
194
- background: none;
195
- border: none;
196
- color: var(--text-dim);
197
- cursor: pointer;
198
- padding: 5px 6px;
199
- border-radius: 6px;
200
- font-size: 13px;
201
- line-height: 1;
202
- transition: color 0.15s, background 0.15s;
203
- }
204
- .icon-btn:hover {
205
- color: var(--text);
206
- background: rgba(255,255,255,0.06);
207
- }
208
-
209
- /* -- Status row -------------------------------------------------------- */
210
- .status-row {
211
- display: flex;
212
- align-items: center;
213
- gap: 8px;
214
- font-size: 11.5px;
215
- color: var(--text-mute);
216
- margin-bottom: 4px;
217
- }
218
- .status-dot {
219
- width: 8px; height: 8px;
220
- border-radius: 50%;
221
- background: var(--text-faint);
222
- box-shadow: 0 0 0 0 transparent;
223
- flex-shrink: 0;
224
- }
225
- .status-dot.connected {
226
- background: var(--ok);
227
- box-shadow: 0 0 0 3px rgba(74, 222, 128, 0.15);
228
- }
229
- .status-dot.warning {
230
- background: var(--warn);
231
- box-shadow: 0 0 0 3px rgba(251, 191, 36, 0.15);
232
- }
233
- .status-dot.error {
234
- background: var(--err);
235
- box-shadow: 0 0 0 3px rgba(248, 113, 113, 0.15);
236
- }
237
- .status-dot.waiting {
238
- background: var(--info);
239
- box-shadow: 0 0 0 3px rgba(147, 197, 253, 0.15);
240
- }
241
- #statusText { color: var(--text); font-weight: 500; }
242
-
243
- .meta {
244
- font-size: 10.5px;
245
- color: var(--text-dim);
246
- margin: 8px 0 14px;
247
- }
248
- .meta strong { color: var(--text); font-weight: 600; }
249
-
250
- /* -- Form -------------------------------------------------------------- */
251
- label {
252
- display: block;
253
- font-size: 10px;
254
- font-weight: 600;
255
- letter-spacing: 0.04em;
256
- text-transform: uppercase;
257
- color: var(--text-dim);
258
- margin: 12px 0 6px;
259
- }
260
- input[type="text"] {
261
- width: 100%;
262
- padding: 8px 10px;
263
- background: var(--surface);
264
- border: 1px solid var(--border);
265
- color: var(--text);
266
- border-radius: 8px;
267
- font-size: 11.5px;
268
- font-family: "Cascadia Code", "Fira Code", ui-monospace, monospace;
269
- outline: none;
270
- transition: border-color 120ms ease;
271
- }
272
- input[type="text"]:focus {
273
- border-color: var(--accent);
274
- background: var(--surface-2);
275
- }
276
- /* Language selector (rendered by i18n/panel.cjs into #languageSettings) */
277
- .synth-lang-select {
278
- width: 100%;
279
- padding: 7px 8px;
280
- background: var(--surface);
281
- border: 1px solid var(--border);
282
- color: var(--text);
283
- border-radius: 8px;
284
- font-size: 11.5px;
285
- font-family: inherit;
286
- outline: none;
287
- }
288
- .synth-lang-select:focus { border-color: var(--accent); }
289
- .synth-lang-select option { background: #18181b; color: var(--text); }
290
- .synth-lang-note {
291
- font-size: 10.5px;
292
- color: var(--text-dim);
293
- margin-top: 6px;
294
- line-height: 1.4;
295
- }
296
-
297
- /* -- Buttons (Synthetic primary / secondary) --------------------------- */
298
- .button-row {
299
- display: flex;
300
- gap: 6px;
301
- margin-top: 12px;
302
- }
303
- button {
304
- flex: 1;
305
- padding: 8px 10px;
306
- border: 1px solid transparent;
307
- border-radius: 8px;
308
- cursor: pointer;
309
- font-size: 11.5px;
310
- font-weight: 600;
311
- font-family: inherit;
312
- letter-spacing: -0.005em;
313
- transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease;
314
- }
315
- button:disabled { opacity: 0.4; cursor: not-allowed; }
316
-
317
- /* Primary (Start) */
318
- #btnStart {
319
- background: var(--accent);
320
- color: #fff;
321
- }
322
- #btnStart:hover:not(:disabled) { background: var(--accent-hover); }
323
-
324
- /* Secondary (Stop, Save) */
325
- #btnStop, button:not(#btnStart) {
326
- background: var(--surface);
327
- color: var(--text);
328
- border-color: var(--border);
329
- }
330
- #btnStop:hover:not(:disabled),
331
- button:not(#btnStart):hover:not(:disabled) {
332
- background: var(--surface-2);
333
- border-color: var(--text-faint);
334
- }
335
- #btnStop {
336
- color: var(--err);
337
- }
338
-
339
- /* -- Terminal log ------------------------------------------------------ */
340
- .log-label {
341
- display: flex;
342
- align-items: center;
343
- justify-content: space-between;
344
- margin: 14px 0 6px;
345
- }
346
- .log-label .l {
347
- font-size: 10px;
348
- font-weight: 600;
349
- letter-spacing: 0.04em;
350
- text-transform: uppercase;
351
- color: var(--text-dim);
352
- }
353
- .log-label .r {
354
- font-size: 10px;
355
- color: var(--text-faint);
356
- font-family: "Cascadia Code", ui-monospace, monospace;
357
- }
358
- #log {
359
- background: rgba(0, 0, 0, 0.45);
360
- border: 1px solid var(--border);
361
- border-radius: 8px;
362
- padding: 10px;
363
- max-height: 180px;
364
- overflow-y: auto;
365
- font-family: "Cascadia Code", "Fira Code", ui-monospace, monospace;
366
- font-size: 10.5px;
367
- line-height: 1.65;
368
- }
369
- #log::-webkit-scrollbar { width: 8px; }
370
- #log::-webkit-scrollbar-track { background: transparent; }
371
- #log::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }
372
- #log::-webkit-scrollbar-thumb:hover { background: var(--text-faint); }
373
- .log-entry { color: var(--text-mute); }
374
- .log-entry.cmd { color: var(--info); }
375
- .log-entry.ok { color: var(--ok); }
376
- .log-entry.err { color: var(--err); }
377
-
378
- /* (Old .footer / .footer-link / .footer-label rules removed — replaced
379
- by the canonical .synth-footer block above.) */
380
- </style>
381
- </head>
382
- <body>
383
- <!-- ── Synthetic shell header (canonical — DO NOT edit per-panel) ── -->
384
- <a class="synth-header" data-href="https://synthetic.com.ar" href="#" title="Open synthetic.com.ar" data-i18n-title="ui.bridge.header.openSite">
385
- <img class="synth-header-logo" src="synthetic-logo.png" alt="Synthetic">
386
- <span class="synth-header-name">Synthetic</span>
387
- <span class="synth-version-tag" id="synthHeaderVersion">v2.0.0</span>
388
- </a>
389
-
390
- <div id="panel-content">
391
-
392
- <!-- Product strip: Premiere MCP identity in the purple accent. Uses the
393
- exact lucide Film glyph that the synthetic.com.ar /premiere-mcp page
394
- renders in the brand strip, so the panel matches the website 1:1.
395
- #topbar-right sits OUTSIDE the bordered .product card — same layout
396
- AE Agent uses for its reload/library/settings row. -->
397
- <div id="topbar" style="display:flex; align-items:center; gap:8px; margin-bottom:14px;">
398
- <div class="product" style="flex:1; margin-bottom:0;">
399
- <div class="mark">
400
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
401
- <rect width="18" height="18" x="3" y="3" rx="2"></rect>
402
- <path d="M7 3v18"></path>
403
- <path d="M3 7.5h4"></path>
404
- <path d="M3 12h18"></path>
405
- <path d="M3 16.5h4"></path>
406
- <path d="M17 3v18"></path>
407
- <path d="M17 7.5h4"></path>
408
- <path d="M17 16.5h4"></path>
409
- </svg>
410
- </div>
411
- <div class="product-text">
412
- <div class="title">Premiere Pro MCP</div>
413
- <div class="sub" data-i18n="ui.bridge.product.subtitle" data-i18n-vars='{"count":437}'>Bridge · 437 tools</div>
414
- </div>
415
- <!-- Status dot inside the product block — green = bridge running, grey
416
- = stopped. Updated alongside #statusDot/#statusText from main.js. -->
417
- <span id="productStatus" class="product-status" title="Panel ready"></span>
418
- </div>
419
- <div id="topbar-right" style="display:flex; gap:2px; flex-shrink:0;">
420
- <button id="btnReload" onclick="reloadPanel()" title="Reload panel" data-i18n-title="ui.bridge.toolbar.reload" class="icon-btn">⟳</button>
421
- <button id="btnSettingsToggle" onclick="toggleSettings()" title="Settings" data-i18n-title="ui.bridge.toolbar.settings" class="icon-btn">⚙</button>
422
- </div>
423
- </div>
424
-
425
- <!-- Settings (hidden by default — toggled by the ⚙ button above). The
426
- license key + the language: this panel doesn't have AE Agent's full
427
- Subscription/API Keys/Data settings system, and doesn't need it. -->
428
- <div id="settingsPanel" style="display:none; margin: 0 0 14px; padding: 10px; border: 1px solid #3a3a3a; border-radius: 8px; background: rgba(255,255,255,0.02);">
429
- <label for="licenseKeyInput" data-i18n="ui.bridge.settings.licenseKey">License key</label>
430
- <div class="button-row" style="margin-top:0;">
431
- <input type="text" id="licenseKeyInput" placeholder="Paste your Premiere MCP license key" data-i18n-placeholder="ui.bridge.settings.licensePlaceholder" style="flex:1;">
432
- </div>
433
- <div class="button-row">
434
- <button id="btnSaveLicense" onclick="saveLicenseKey()" data-i18n="ui.bridge.settings.saveLicense">Save license</button>
435
- </div>
436
- <div id="licenseStatus" class="meta" style="margin: 6px 0 0;"></div>
437
- <!-- Language: saved to <USER_DATA>/com.mcp.premiere.bridge/settings.json,
438
- shared with the AI Chat panel and read by the MCP server when it
439
- (re)starts. The panel UI switches immediately. See main.js initI18n. -->
440
- <div id="languageSettings"></div>
441
- <div id="languageStatus" class="meta" style="margin: 6px 0 0;"></div>
442
- <!-- Temp dir field -->
443
- <label for="tempDir" data-i18n="ui.bridge.tempDir.label">Temp directory</label>
444
- <div class="button-row" style="margin-top:0;">
445
- <input type="text" id="tempDir" value="" style="flex:1;">
446
- </div>
447
- <div class="button-row">
448
- <button onclick="saveTempDir()" data-i18n="ui.bridge.controls.save">Save</button>
449
- </div>
450
- </div>
451
-
452
- <!-- Status -->
453
- <div class="status-row">
454
- <div class="status-dot" id="statusDot"></div>
455
- <span id="statusText" data-i18n="ui.bridge.status.stopped">Stopped</span>
456
- </div>
457
- <div class="meta"><span data-i18n="ui.bridge.stats.commandsProcessed">Commands processed:</span> <strong id="cmdCount">0</strong></div>
458
-
459
- <!-- Update banner (hidden until checkForUpdates() finds a newer version) -->
460
- <div id="updateBanner" style="display:none; margin: 12px 0; padding: 12px; border: 1px solid #a855f7; border-radius: 8px; background: rgba(168,85,247,0.08);">
461
- <div style="display:flex; align-items:center; justify-content:space-between; gap:8px; margin-bottom: 8px;">
462
- <span style="font-weight:600; color:#e9d5ff;" data-i18n="ui.bridge.update.available">Update available</span>
463
- <span id="updateVersionTag" style="font-family: monospace; font-size: 11px; color:#c084fc;">v? -> v?</span>
464
- </div>
465
- <div id="updateNotes" style="font-size: 11px; color:#a8a4c0; margin-bottom: 10px; line-height: 1.4;"></div>
466
- <div style="display:flex; gap:6px;">
467
- <button id="btnUpdateNow" onclick="applyUpdate()" style="flex:1; background:#a855f7; color:#fff; border:none; padding:6px 10px; border-radius:4px; font-size:12px; cursor:pointer;" data-i18n="ui.bridge.update.now">Update now</button>
468
- <button id="btnUpdateLater" onclick="dismissUpdate()" style="background:transparent; color:#a8a4c0; border:1px solid #444; padding:6px 10px; border-radius:4px; font-size:12px; cursor:pointer;" data-i18n="ui.bridge.update.later">Later</button>
469
- <button id="btnUpdateInstaller" onclick="openInstaller()" title="If hot-swap fails or the release needs a fresh manifest" data-i18n-title="ui.bridge.update.installerHint" style="background:transparent; color:#a8a4c0; border:1px solid #444; padding:6px 10px; border-radius:4px; font-size:12px; cursor:pointer;">.zxp</button>
470
- </div>
471
- </div>
472
-
473
- <!-- Controls -->
474
- <div class="button-row">
475
- <button id="btnStart" onclick="startBridge()" data-i18n="ui.bridge.controls.start">Start bridge</button>
476
- <button id="btnStop" onclick="stopBridge()" disabled data-i18n="ui.bridge.controls.stop">Stop</button>
477
- </div>
478
-
479
- <!-- Log -->
480
- <div class="log-label">
481
- <span class="l" data-i18n="ui.bridge.activity.title">Activity log</span>
482
- <span class="r">premiere-mcp-bridge</span>
483
- </div>
484
- <div id="log"></div>
485
-
486
- </div><!-- /#panel-content -->
487
-
488
- <!-- ── Synthetic shell footer (canonical — DO NOT edit per-panel) ── -->
489
- <footer class="synth-footer">
490
- <span class="synth-footer-label" data-i18n="ui.bridge.footer.builtBy">Built by</span>
491
- <a class="synth-footer-link" data-href="https://synthetic.com.ar" href="#" title="Open synthetic.com.ar" data-i18n-title="ui.bridge.header.openSite">
492
- <img class="synth-footer-logo" src="synthetic-logo.png" alt="Synthetic">
493
- <span class="synth-footer-name">Synthetic</span>
494
- </a>
495
- </footer>
496
-
497
- <script src="CSInterface.js"></script>
498
- <!-- i18n (vendored from synthetic-idiomas by scripts/sync-i18n.mjs). With
499
- --enable-nodejs CEP exposes a global `module`, so the UMD core registers
500
- itself on module.exports instead of window: pick it up from there. -->
501
- <script src="i18n-core.cjs"></script>
502
- <script>if (!window.SyntheticI18n && typeof module === "object" && module && module.exports && module.exports.createI18n) window.SyntheticI18n = module.exports;</script>
503
- <script src="i18n-panel.cjs"></script>
504
- <script src="i18n-locales.js"></script>
505
- <script src="main.js"></script>
506
- </body>
507
- </html>