premiere-pro-mcp 1.14.4 → 1.14.6
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/CHANGELOG.md +37 -0
- package/README.md +73 -29
- package/artifacts/MCPBridgeCEP.zxp +0 -0
- package/cep-plugin/CSXS/manifest.xml +3 -3
- package/cep-plugin/index.html +1 -1
- package/cep-plugin/main.js +19 -7
- package/cep-plugin/updater.cjs +1 -1
- package/dist/ai/editorial-context-pack.d.ts +53 -0
- package/dist/ai/editorial-context-pack.js +133 -0
- package/dist/bridge/file-bridge.d.ts +2 -0
- package/dist/bridge/file-bridge.js +24 -2
- package/dist/bridge/script-builder.js +21 -0
- package/dist/context/project-context-store.d.ts +2 -0
- package/dist/context/project-context-store.js +21 -2
- package/dist/diagnostics.js +1 -1
- package/dist/index.js +95 -2
- package/dist/platform-capabilities.d.ts +3 -3
- package/dist/platform-capabilities.js +7 -0
- package/dist/resources/adobe-api-inventory.json +5096 -0
- package/dist/resources/adobe-uxp-coverage.json +226 -0
- package/dist/resources/cep-reference-inventory.json +25357 -0
- package/dist/resources/extendscript-api-inventory.json +2341 -0
- package/dist/resources/extendscript-reference.js +3 -4
- package/dist/resources/premiere-doc-inventory.json +2243 -0
- package/dist/resources/premiere-surface-registry.json +160 -0
- package/dist/resources/uxp-js-api-inventory.json +17053 -0
- package/dist/security/capabilities.js +15 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +23 -7
- package/dist/tool-capability-report.d.ts +2 -2
- package/dist/tool-capability-report.js +22 -9
- package/dist/tools/audio.d.ts +50 -0
- package/dist/tools/audio.js +138 -0
- package/dist/tools/clipboard.d.ts +14 -4
- package/dist/tools/clipboard.js +15 -25
- package/dist/tools/editorial-context-pack.d.ts +91 -0
- package/dist/tools/editorial-context-pack.js +129 -0
- package/dist/tools/effects.d.ts +16 -0
- package/dist/tools/effects.js +85 -0
- package/dist/tools/export.d.ts +156 -0
- package/dist/tools/export.js +295 -17
- package/dist/tools/health.d.ts +3 -3
- package/dist/tools/media-analysis.d.ts +231 -0
- package/dist/tools/media-analysis.js +200 -3
- package/dist/tools/project-context.d.ts +2 -0
- package/dist/tools/project-context.js +6 -2
- package/dist/tools/project.js +24 -8
- package/dist/tools/recovery.js +1 -0
- package/dist/tools/sequence.js +13 -1
- package/dist/tools/silence-removal.d.ts +24 -0
- package/dist/tools/silence-removal.js +66 -0
- package/dist/tools/spot-workflows.js +40 -10
- package/dist/tools/timeline.js +6 -2
- package/dist/tools/transitions.js +122 -29
- package/dist/tools/utility.js +65 -14
- package/dist/tools/uxp-advanced-workflows.d.ts +238 -0
- package/dist/tools/uxp-advanced-workflows.js +168 -5
- package/dist/tools/uxp-next-workflows.d.ts +5 -0
- package/dist/tools/uxp-next-workflows.js +3 -1
- package/dist/tools/uxp-workflows.d.ts +14 -0
- package/dist/tools/uxp-workflows.js +5 -0
- package/dist/tools/uxp.d.ts +602 -0
- package/dist/tools/uxp.js +169 -6
- package/dist/update.d.ts +6 -0
- package/dist/update.js +85 -0
- package/dist/workflows/catalog.d.ts +8 -3
- package/dist/workflows/catalog.js +7 -1
- package/dist/workflows/tool-metadata.js +2 -0
- package/dist/workflows/tool-packs.js +2 -0
- package/docs/adobe-api-inventory.md +26 -0
- package/docs/cep-reference-inventory.md +11 -0
- package/docs/extendscript-api-inventory.md +7 -0
- package/docs/native-sdk-header-inventory.md +65 -0
- package/docs/premiere-doc-inventory.md +7 -0
- package/docs/premiere-surface-registry.md +39 -0
- package/docs/supported-actions.md +32 -15
- package/docs/uxp-js-api-inventory.md +9 -0
- package/package.json +33 -4
- package/scripts/copy-adobe-uxp-coverage.mjs +16 -4
- package/scripts/generate-adobe-api-inventory.mjs +174 -0
- package/scripts/generate-cep-reference-inventory.mjs +113 -0
- package/scripts/generate-extendscript-api-inventory.mjs +102 -0
- package/scripts/generate-native-sdk-header-inventory.mjs +214 -0
- package/scripts/generate-premiere-doc-inventory.mjs +93 -0
- package/scripts/generate-supported-actions.mjs +6 -16
- package/scripts/generate-uxp-js-api-inventory.mjs +168 -0
- package/scripts/native-sdk-header-inventory-contract.mjs +31 -0
- package/scripts/update-source.mjs +106 -0
- package/scripts/verify-native-sdk-header-inventory.mjs +149 -0
- package/scripts/verify-npm-package.mjs +27 -0
- package/uxp-plugin/advanced-workflows.cjs +369 -31
- package/uxp-plugin/commands.cjs +425 -41
- package/uxp-plugin/manifest.json +1 -1
- package/uxp-plugin/next-workflows.cjs +46 -3
- package/uxp-plugin/workflows.cjs +71 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,43 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.14.6] - 2026-09-02
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added `create_editorial_context_pack`, a review-only, revision-aware Markdown
|
|
14
|
+
reading view for explicitly captured transcript, shot, audio, source,
|
|
15
|
+
timeline, and editor-note context. It is bounded by entry and character
|
|
16
|
+
limits and never invokes a provider, Premiere bridge, or project mutation.
|
|
17
|
+
- Added guarded UXP workflows for sequence playhead and range updates, marker
|
|
18
|
+
batch removal, native transition application, caption-track inventory,
|
|
19
|
+
silence-cut stringouts, atomic split edits, and beat-grid markers.
|
|
20
|
+
- Added local-only delivery conformance, sampled video scopes and motion
|
|
21
|
+
analysis, Warp Stabilizer status inspection, and shot-match planning.
|
|
22
|
+
- Added source-backed inventories for documented UXP, CEP, ExtendScript, and
|
|
23
|
+
native SDK integration surfaces.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- Made unsupported sequence pixel-aspect ratios, partial transitions,
|
|
28
|
+
unavailable media timing readback, and incomplete delivery probes fail
|
|
29
|
+
closed instead of reporting unverified success.
|
|
30
|
+
- Corrected marker, encoder, duplicate-media, caption, and capability
|
|
31
|
+
inference contracts, with expanded mutation verification coverage.
|
|
32
|
+
|
|
33
|
+
## [1.14.5] - 2026-08-31
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- Added safe user update commands for global npm installations and guarded
|
|
38
|
+
source check/update scripts. Global updates refresh the CEP connector after
|
|
39
|
+
npm succeeds; source updates require a clean fast-forwardable checkout.
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
|
|
43
|
+
- Corrected macOS bridge-directory handling when `TMPDIR` is set and made QE
|
|
44
|
+
transition writes target the intended clip on current Premiere builds.
|
|
45
|
+
|
|
9
46
|
## [1.14.4] - 2026-08-29
|
|
10
47
|
|
|
11
48
|
### Fixed
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
**Give compatible AI assistants structured control over supported Adobe Premiere Pro workflows.**
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
327 core tools across 37 modules, 4 resources, and 11 guided workflows. A connected UXP host adds 61 capability-gated tools.
|
|
12
12
|
|
|
13
13
|
[](LICENSE)
|
|
14
14
|
[](https://nodejs.org)
|
|
@@ -31,22 +31,22 @@ An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that l
|
|
|
31
31
|
"Add the B-roll clips to V2, apply a cross dissolve between each, color correct them to match the A-roll, and export a 1080p ProRes."
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
The AI handles the entire workflow through
|
|
34
|
+
The AI handles the entire workflow through 327 core tools spanning the supported ExtendScript, QE DOM, local media and interchange analysis, revisioned project-context retrieval, safe edit-planning, project-intake preview, review handoff, and connection-verification surfaces. A compatible, authenticated UXP panel adds 56 documented, capability-gated tools without replacing the production CEP bridge.
|
|
35
35
|
|
|
36
|
-
### Latest release: 1.14.
|
|
36
|
+
### Latest release: 1.14.6
|
|
37
37
|
|
|
38
|
-
- **
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
- **Guarded UXP editing:** compatible hosts can use verified sequence ranges,
|
|
39
|
+
playhead, marker, transition, caption, silence-cut, and split-edit workflows.
|
|
40
|
+
- **Review-first evidence:** local delivery checks, sampled media analysis, and
|
|
41
|
+
editorial context packs remain bounded and avoid unapproved provider writes.
|
|
42
|
+
- **Narrowed host behavior:** unsupported sequence pixel-aspect ratios and
|
|
43
|
+
partial UXP transition writes fail closed; other mutations retain their
|
|
44
|
+
documented verified or explicitly `committed_unverified` outcome.
|
|
45
45
|
- **Explicit boundary:** the hosted endpoint remains an operator-managed MCP
|
|
46
46
|
service; unauthenticated callers are rejected and it does not pair users to
|
|
47
47
|
local Premiere processes.
|
|
48
48
|
|
|
49
|
-
See the [v1.14.
|
|
49
|
+
See the [v1.14.6 release notes](https://github.com/leancoderkavy/premiere-pro-mcp/releases/tag/v1.14.6)
|
|
50
50
|
for complete details. Live installation in Premiere Pro still requires host verification.
|
|
51
51
|
|
|
52
52
|
### Current MCP protocol support
|
|
@@ -88,9 +88,9 @@ their bins, media rules, and organization rules before a facility uses one.
|
|
|
88
88
|
|
|
89
89
|
### Easiest supported path: Claude Desktop
|
|
90
90
|
|
|
91
|
-
1. Download the current [Claude Desktop bundle (`.mcpb`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.
|
|
91
|
+
1. Download the current [Claude Desktop bundle (`.mcpb`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.6/premiere-pro-mcp-1.14.6.mcpb).
|
|
92
92
|
2. In Claude Desktop, open **Settings > Extensions > Advanced settings > Install Extension**, select the downloaded bundle, and restart Claude Desktop.
|
|
93
|
-
3. Download the separate [signed Premiere connector (`.zxp`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.
|
|
93
|
+
3. Download the separate [signed Premiere connector (`.zxp`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.6/MCPBridgeCEP.zxp). Open it with your trusted ZXP installer. If your computer has no ZXP installer, use the npm connector installer in **Advanced setup** below.
|
|
94
94
|
4. Restart Premiere, open a project, then open **Window > Extensions > MCP for Adobe Premiere Pro**.
|
|
95
95
|
5. In Claude, enter: `Safely check my Premiere connection with verify_premiere_connection. Make no changes.`
|
|
96
96
|
|
|
@@ -165,6 +165,38 @@ premiere-pro-mcp --doctor
|
|
|
165
165
|
|
|
166
166
|
Then ask your MCP client to run `verify_premiere_connection`. The check is read-only.
|
|
167
167
|
|
|
168
|
+
#### Update an existing installation
|
|
169
|
+
|
|
170
|
+
New **releases** update the local server and Premiere connector; a deployment of
|
|
171
|
+
the hosted MCP service does not replace software on your computer. Fully quit
|
|
172
|
+
Premiere before updating the connector.
|
|
173
|
+
|
|
174
|
+
**Installed globally from npm:**
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
premiere-pro-mcp --check-update
|
|
178
|
+
premiere-pro-mcp --update
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
`--update` only changes a global npm installation. It installs the published
|
|
182
|
+
`latest` package, refreshes the bundled CEP connector, and leaves your MCP
|
|
183
|
+
client configuration and projects untouched. Restart Premiere and your MCP
|
|
184
|
+
client afterward, then run `verify_premiere_connection` before editing.
|
|
185
|
+
|
|
186
|
+
**Installed from a Git clone:**
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
npm run check-update:source
|
|
190
|
+
npm run update:source
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
The source updater refuses a checkout with uncommitted files or local commits,
|
|
194
|
+
fast-forwards only to its configured upstream, runs `npm ci` and the production
|
|
195
|
+
build, then refreshes the CEP connector. This avoids silently overwriting local
|
|
196
|
+
code. If you installed the Claude Desktop `.mcpb` bundle, download and install
|
|
197
|
+
the newer bundle from the GitHub release instead; Claude controls extension
|
|
198
|
+
updates.
|
|
199
|
+
|
|
168
200
|
#### Remove the CEP connector
|
|
169
201
|
|
|
170
202
|
Fully quit Premiere, then remove only this connector:
|
|
@@ -325,7 +357,7 @@ Add to your VS Code MCP server configuration:
|
|
|
325
357
|
4. Ask your AI assistant to run `get_capabilities`, then `ping`, with Premiere open.
|
|
326
358
|
5. For a safe first request, ask: *"What is my current Premiere Pro project and active sequence? Do not make changes."*
|
|
327
359
|
|
|
328
|
-
The default bridge directory is derived from the operating system on both sides, so most local setups should not set `PREMIERE_TEMP_DIR`. If you override it, use the same absolute path in the MCP server and CEP panel; Windows and macOS paths are not interchangeable.
|
|
360
|
+
The default bridge directory is derived from the operating system on both sides, so most local setups should not set `PREMIERE_TEMP_DIR`. On macOS, the server resolves the per-user system temporary directory even when a GUI-launched client strips `TMPDIR`, keeping it aligned with Premiere's CEP panel. If you override it, use the same absolute path in the MCP server and CEP panel; Windows and macOS paths are not interchangeable.
|
|
329
361
|
|
|
330
362
|
### Codex plugin
|
|
331
363
|
|
|
@@ -337,11 +369,11 @@ From a clone of this repository:
|
|
|
337
369
|
```bash
|
|
338
370
|
codex plugin marketplace add .
|
|
339
371
|
codex plugin add premiere-pro@premiere-pro-mcp
|
|
340
|
-
npx -y premiere-pro-mcp@1.14.
|
|
372
|
+
npx -y premiere-pro-mcp@1.14.6 --install-cep
|
|
341
373
|
```
|
|
342
374
|
|
|
343
375
|
Restart Premiere Pro and start a new Codex session after installation. The plugin
|
|
344
|
-
launches `premiere-pro-mcp@1.14.
|
|
376
|
+
launches `premiere-pro-mcp@1.14.6` through `npx`; the separate CEP installation is
|
|
345
377
|
required because the MCP server communicates with the running Premiere host through
|
|
346
378
|
the local bridge.
|
|
347
379
|
|
|
@@ -361,7 +393,7 @@ For Claude Code, add this repository as a marketplace and install the plugin:
|
|
|
361
393
|
Then install the Premiere bridge and start a new Claude Code session:
|
|
362
394
|
|
|
363
395
|
```bash
|
|
364
|
-
npx -y premiere-pro-mcp@1.14.
|
|
396
|
+
npx -y premiere-pro-mcp@1.14.6 --install-cep
|
|
365
397
|
```
|
|
366
398
|
|
|
367
399
|
The Claude Code package lives in
|
|
@@ -400,7 +432,7 @@ installed separately.
|
|
|
400
432
|
QE-backed tools are reported as `experimental` because QE is undocumented and can vary between Premiere builds. Authority availability is reported separately from implementation support, so disabling `edit`, for example, does not incorrectly label editing tools as unsupported. Static metadata never claims that a Premiere operation succeeded; use `ping` and inspect each tool result for runtime evidence.
|
|
401
433
|
|
|
402
434
|
MCP `tools/list` is filtered to the active authority profile. The default
|
|
403
|
-
`inspect,edit,export,filesystem` profile advertises
|
|
435
|
+
`inspect,edit,export,filesystem` profile advertises 325 of the 327 registered
|
|
404
436
|
tools and omits `execute_extendscript` and `evaluate_expression`, which require
|
|
405
437
|
explicit `unsafe-script` authority. `ping` and `get_capabilities` remain visible
|
|
406
438
|
under every profile so a restricted or misconfigured server can still explain
|
|
@@ -503,7 +535,7 @@ PREMIERE_UXP_TOKEN="replace-with-a-long-random-secret" premiere-pro-mcp
|
|
|
503
535
|
|
|
504
536
|
Enter the same token in the UXP panel. The listener binds only to `127.0.0.1:7777`, authenticates the WebSocket upgrade, requires a versioned capability handshake, correlates concurrent requests, and fails pending work on timeout or disconnect. Set `PREMIERE_UXP_PORT` to use another loopback port.
|
|
505
537
|
|
|
506
|
-
When enabled, MCP discovery includes
|
|
538
|
+
When enabled, MCP discovery includes 61 capability-gated UXP additions. The first expansion covers effects, deterministic timeline selection, selection batches, scene detection, proxy/ingest, relink, metadata, color conformance, read-only Premiere/After Effects environment inspection, Source Monitor audition, storage, and least-privilege workspace access. The second adds Project-panel selection, marker CRUD, single-transaction undoable beat-grid marker application, bin organization, sequence settings, imports, typed effect parameters/keyframes, track-item transforms, atomic J/L split edits, SequenceEditor timeline edits, sequence lifecycle, and AME encoding. The third wave begins with a redacted event journal, conservative AME terminal receipts, explicit host-readiness gates, safe multi-project sessions, lease-based growing-media control, namespaced workflow checkpoints, bounded media-health maintenance, caption-aware track mute state, transactional source trim/framing, and guarded sequence-range updates documented in [the third-wave workflow matrix](docs/third-wave-uxp-workflows.md). The bounded migration surface also includes a non-ripple selected-item lift plus native video-transition listing, target inspection, and guarded transactions; it does not claim direct empty-track create/delete or global redo support. A separate [hybrid benchmark gate](docs/uxp-hybrid-benchmark.md) keeps native acceleration disabled until reproducible cross-platform evidence exists. See also [the first stable workflow matrix](docs/uxp-stable-workflows.md) and [the next-ten workflow matrix](docs/uxp-next-ten-workflows.md). Commands are advertised only while the authenticated local UXP bridge is connected; the host capability handshake remains the authority for support in the running Premiere build. A failed UXP command is never silently retried through CEP because the first operation may have partially succeeded.
|
|
507
539
|
|
|
508
540
|
The panel now requests access to one operator-selected workspace instead of declaring full filesystem access. Choose the folder in the panel before invoking a path-based UXP workflow. Media, relink, preset, export, and Source Monitor file paths must remain inside it; the persistent capability token and native root path are never returned over MCP. Lexical containment alone cannot exclude symlink, junction, or reparse-point escapes, and Adobe's request-scoped UXP filesystem API does not document canonical-path resolution. Builds without a host-supplied canonical resolver therefore advertise path-based UXP commands as unsupported and fail closed at invocation; use the existing CEP fallback for those operations.
|
|
509
541
|
|
|
@@ -527,6 +559,16 @@ coverage matrix](docs/adobe-uxp-26.3-coverage.md) and [the UXP capability
|
|
|
527
559
|
foundation](docs/uxp-capability-foundation.md) for the command matrix and live-host
|
|
528
560
|
validation boundary.
|
|
529
561
|
|
|
562
|
+
The [Premiere surface registry](docs/premiere-surface-registry.md) separately
|
|
563
|
+
tracks the Premiere DOM, general UXP JavaScript, HTML/CSS, Spectrum, plugin
|
|
564
|
+
guides, UXP Hybrid C++, the standalone Premiere C++ PrSDK, CEP/ExtendScript,
|
|
565
|
+
the CEP platform, QE, and pinned competitor sources. The exhaustive
|
|
566
|
+
[general UXP JavaScript inventory](docs/uxp-js-api-inventory.md) is generated
|
|
567
|
+
from Adobe's pinned declarations, while the exhaustive
|
|
568
|
+
[Premiere documentation inventory](docs/premiere-doc-inventory.md) tracks every
|
|
569
|
+
page in Adobe's live sitemap. This keeps declaration and documentation
|
|
570
|
+
inventory distinct from implementation and licensed-host coverage.
|
|
571
|
+
|
|
530
572
|
The stable workflow expansion adds native component-chain effects, deterministic
|
|
531
573
|
timeline selection, compound selection batches, scene-edit detection, proxy/ingest control, guarded offline
|
|
532
574
|
relink, transactional project/XMP metadata, color and footage-conformance
|
|
@@ -578,11 +620,11 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
|
|
|
578
620
|
|
|
579
621
|
---
|
|
580
622
|
|
|
581
|
-
## Tools (
|
|
623
|
+
## Tools (327 core total; 325 under the default profile; 386 with a connected UXP bridge)
|
|
582
624
|
|
|
583
625
|
The [complete supported-actions catalog](docs/supported-actions.md) lists every
|
|
584
626
|
registered core tool, the two tools restricted behind explicit `unsafe-script`
|
|
585
|
-
authority, and all
|
|
627
|
+
authority, and all 61 authenticated UXP additions with their current action or mode
|
|
586
628
|
values. It is generated from the same MCP registration surface returned to clients;
|
|
587
629
|
the tables below are a shorter workflow-oriented overview.
|
|
588
630
|
|
|
@@ -635,12 +677,14 @@ the tables below are a shorter workflow-oriented overview.
|
|
|
635
677
|
> (`ripple_delete`, razor/split) and existing effect-parameter writes. These tools now verify
|
|
636
678
|
> the resulting sequence state and return an error instead of a false success. For structural
|
|
637
679
|
> edits, rebuild the wanted source ranges into a new sequence with `create_sequence` and
|
|
638
|
-
> `add_to_timeline`.
|
|
639
|
-
>
|
|
640
|
-
>
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
>
|
|
680
|
+
> `add_to_timeline`. The legacy CEP transition path targets `qeClip.addTransition` (not the
|
|
681
|
+
> QE track) and reports success only after DOM transition-count readback. Prefer the connected
|
|
682
|
+
> UXP transition tools where available; overlay clips remain a workaround when a legacy QE
|
|
683
|
+
> write is rejected or not verified. See [issue #21](https://github.com/leancoderkavy/premiere-pro-mcp/issues/21).
|
|
684
|
+
|
|
685
|
+
> **Speed, caption, and visual-keyframe boundaries:** Premiere Pro 26.3 may reflect legacy QE
|
|
686
|
+
> speed/direction methods, but exposes no supported scripting setter or Time Remapping component
|
|
687
|
+
> for timeline-clip speed or direction. `reverse_clip`,
|
|
644
688
|
> `speed_change`, `set_clip_speed_qe`, and `set_clip_properties` with `speed` now stop before host mutation;
|
|
645
689
|
> use the Speed/Duration UI or pre-render retimed media. `add_text_overlay` likewise stops
|
|
646
690
|
> before mutation because a raw-text-to-caption API is not exposed; import an `.srt`/`.vtt`
|
|
@@ -898,7 +942,7 @@ user/device authorization are implemented.
|
|
|
898
942
|
|
|
899
943
|
| Variable | Description | Default |
|
|
900
944
|
| :------- | :---------- | :------ |
|
|
901
|
-
| `PREMIERE_TEMP_DIR` | Shared temp directory for MCP ↔ CEP communication | OS temp dir + `/premiere-mcp-bridge` |
|
|
945
|
+
| `PREMIERE_TEMP_DIR` | Shared temp directory for MCP ↔ CEP communication | OS user temp dir + `/premiere-mcp-bridge` (macOS fallback is independent of `TMPDIR`) |
|
|
902
946
|
| `PREMIERE_TIMEOUT_MS` | Command timeout in milliseconds | `30000` |
|
|
903
947
|
| `PREMIERE_DEFAULT_SEQUENCE_PRESET` | Override the auto-discovered `.sqpreset` used by `create_sequence` | auto-discovered |
|
|
904
948
|
| `PREMIERE_MCP_CAPABILITIES` | Comma-separated authority profile; add `unsafe-script` only when raw scripting is required | `inspect,edit,export,filesystem` |
|
|
@@ -952,7 +996,7 @@ premiere-pro-mcp/
|
|
|
952
996
|
├── src/
|
|
953
997
|
│ ├── index.ts # Entry point — stdio transport setup
|
|
954
998
|
│ ├── http-server.ts # Entry point — HTTP/SSE transport (Fly.io / remote)
|
|
955
|
-
│ ├── server.ts # MCP server — registers
|
|
999
|
+
│ ├── server.ts # MCP server — registers 327 tools, filtered by authority profile
|
|
956
1000
|
│ ├── bridge/
|
|
957
1001
|
│ │ ├── file-bridge.ts # File-based IPC (write .jsx, poll .json)
|
|
958
1002
|
│ │ └── script-builder.ts # ExtendScript generator with ES3 helpers
|
|
Binary file
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.premiere.bridge" ExtensionBundleVersion="1.14.
|
|
2
|
+
<ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.premiere.bridge" ExtensionBundleVersion="1.14.6" ExtensionBundleName="MCP for Adobe Premiere Pro">
|
|
3
3
|
<ExtensionList>
|
|
4
|
-
<Extension Id="com.mcp.premiere.bridge.panel" Version="1.14.
|
|
5
|
-
<Extension Id="com.mcp.premiere.bridge.headless" Version="1.14.
|
|
4
|
+
<Extension Id="com.mcp.premiere.bridge.panel" Version="1.14.6"/>
|
|
5
|
+
<Extension Id="com.mcp.premiere.bridge.headless" Version="1.14.6"/>
|
|
6
6
|
</ExtensionList>
|
|
7
7
|
<ExecutionEnvironment>
|
|
8
8
|
<HostList>
|
package/cep-plugin/index.html
CHANGED
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
<section class="update-section" aria-live="polite">
|
|
82
82
|
<div class="update-copy">
|
|
83
83
|
<span class="section-label">Connector updates</span>
|
|
84
|
-
<strong id="updateTitle">Version 1.14.
|
|
84
|
+
<strong id="updateTitle">Version 1.14.6</strong>
|
|
85
85
|
<span id="updateDetail">Checking for updates…</span>
|
|
86
86
|
</div>
|
|
87
87
|
<button id="btnUpdate" class="button button-update" onclick="handleUpdateClick()" type="button" disabled>
|
package/cep-plugin/main.js
CHANGED
|
@@ -61,16 +61,18 @@ function refreshConnectionCenter() {
|
|
|
61
61
|
setConnectionCheck("checkProject", "waiting", "Checking…");
|
|
62
62
|
setConnectionCheck("checkSequence", "waiting", "Checking…");
|
|
63
63
|
cs.evalScript(
|
|
64
|
-
'(function(){var p=app&&app.project;return
|
|
64
|
+
'(function(){var p=app&&app.project;return "mcpstate:"+(p&&typeof p.name!=="undefined"?"1":"0")+","+(p&&p.activeSequence?"1":"0");}())',
|
|
65
65
|
function (raw) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
setConnectionCheck("checkProject", state.projectOpen ? "ready" : "needs-attention", state.projectOpen ? "Project open" : "Open a project in Premiere Pro");
|
|
69
|
-
setConnectionCheck("checkSequence", state.sequenceOpen ? "ready" : "needs-attention", state.sequenceOpen ? "Active sequence open" : "Open a sequence in Premiere Pro");
|
|
70
|
-
} catch (e) {
|
|
66
|
+
var match = /^mcpstate:([01]),([01])$/.exec(String(raw || ""));
|
|
67
|
+
if (!match) {
|
|
71
68
|
setConnectionCheck("checkProject", "needs-attention", "Could not read Premiere state");
|
|
72
69
|
setConnectionCheck("checkSequence", "needs-attention", "Could not read Premiere state");
|
|
70
|
+
return;
|
|
73
71
|
}
|
|
72
|
+
var projectOpen = match[1] === "1";
|
|
73
|
+
var sequenceOpen = match[2] === "1";
|
|
74
|
+
setConnectionCheck("checkProject", projectOpen ? "ready" : "needs-attention", projectOpen ? "Project open" : "Open a project in Premiere Pro");
|
|
75
|
+
setConnectionCheck("checkSequence", sequenceOpen ? "ready" : "needs-attention", sequenceOpen ? "Active sequence open" : "Open a sequence in Premiere Pro");
|
|
74
76
|
}
|
|
75
77
|
);
|
|
76
78
|
}
|
|
@@ -95,7 +97,17 @@ var fs = nodeRequire("fs");
|
|
|
95
97
|
var path = nodeRequire("path");
|
|
96
98
|
var os = nodeRequire("os");
|
|
97
99
|
var https = nodeRequire("https");
|
|
98
|
-
|
|
100
|
+
function defaultBridgeDirectory() {
|
|
101
|
+
try {
|
|
102
|
+
var nodeProcess = nodeRequire("process");
|
|
103
|
+
var configured = nodeProcess && nodeProcess.env && nodeProcess.env.PREMIERE_TEMP_DIR;
|
|
104
|
+
if (typeof configured === "string" && configured.trim()) return configured.trim();
|
|
105
|
+
} catch (e) {
|
|
106
|
+
// The panel still has a safe OS temporary-directory fallback.
|
|
107
|
+
}
|
|
108
|
+
return path.join(os.tmpdir(), "premiere-mcp-bridge");
|
|
109
|
+
}
|
|
110
|
+
tempDir = defaultBridgeDirectory();
|
|
99
111
|
var latestUpdate = null;
|
|
100
112
|
|
|
101
113
|
function ensureDir(dir) {
|
package/cep-plugin/updater.cjs
CHANGED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type ProjectContextDocument, type ProjectContextKind, type ProjectContextSearchResult } from "../context/project-context-store.js";
|
|
2
|
+
export declare const EDITORIAL_CONTEXT_PACK_SCHEMA_VERSION = 1;
|
|
3
|
+
export declare const DEFAULT_EDITORIAL_CONTEXT_PACK_ENTRIES = 12;
|
|
4
|
+
export declare const MAX_EDITORIAL_CONTEXT_PACK_ENTRIES = 50;
|
|
5
|
+
export declare const DEFAULT_EDITORIAL_CONTEXT_PACK_CHARACTERS = 12000;
|
|
6
|
+
export declare const MIN_EDITORIAL_CONTEXT_PACK_CHARACTERS = 1024;
|
|
7
|
+
export declare const MAX_EDITORIAL_CONTEXT_PACK_CHARACTERS = 24000;
|
|
8
|
+
export interface EditorialContextPackEvidence {
|
|
9
|
+
evidenceId: string;
|
|
10
|
+
kind: ProjectContextKind;
|
|
11
|
+
name: string;
|
|
12
|
+
score: number;
|
|
13
|
+
matchedTerms: string[];
|
|
14
|
+
textExcerpt: string;
|
|
15
|
+
textTruncated: boolean;
|
|
16
|
+
sequenceId?: string;
|
|
17
|
+
sourceId?: string;
|
|
18
|
+
timelineItemId?: string;
|
|
19
|
+
startSeconds?: number;
|
|
20
|
+
endSeconds?: number;
|
|
21
|
+
sourceRevision?: string;
|
|
22
|
+
timelineRevision?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface EditorialContextPack {
|
|
25
|
+
schemaVersion: typeof EDITORIAL_CONTEXT_PACK_SCHEMA_VERSION;
|
|
26
|
+
projectId: string;
|
|
27
|
+
projectName: string;
|
|
28
|
+
intent: string;
|
|
29
|
+
expectedContextRevision: string;
|
|
30
|
+
expectedSourceRevision: string;
|
|
31
|
+
expectedTimelineRevision: string;
|
|
32
|
+
evidence: EditorialContextPackEvidence[];
|
|
33
|
+
omittedEvidenceCount: number;
|
|
34
|
+
truncated: boolean;
|
|
35
|
+
markdown: string;
|
|
36
|
+
applied: false;
|
|
37
|
+
}
|
|
38
|
+
export interface BuildEditorialContextPackOptions {
|
|
39
|
+
intent: string;
|
|
40
|
+
results: ProjectContextSearchResult[];
|
|
41
|
+
/** Exact pre-limit relevant-match count used for honest truncation metadata. */
|
|
42
|
+
totalResultCount?: number;
|
|
43
|
+
maxEntries?: number;
|
|
44
|
+
maxCharacters?: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Produces a compact reading surface from evidence already captured in the
|
|
48
|
+
* local project-context store. It intentionally knows nothing about Premiere's
|
|
49
|
+
* private transcript JSON shape: callers must explicitly enrich context with
|
|
50
|
+
* the transcript passages or other analysis they want to expose.
|
|
51
|
+
*/
|
|
52
|
+
export declare function buildEditorialContextPack(document: ProjectContextDocument, options: BuildEditorialContextPackOptions): EditorialContextPack;
|
|
53
|
+
//# sourceMappingURL=editorial-context-pack.d.ts.map
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { normalizeContextText, } from "../context/project-context-store.js";
|
|
2
|
+
export const EDITORIAL_CONTEXT_PACK_SCHEMA_VERSION = 1;
|
|
3
|
+
export const DEFAULT_EDITORIAL_CONTEXT_PACK_ENTRIES = 12;
|
|
4
|
+
export const MAX_EDITORIAL_CONTEXT_PACK_ENTRIES = 50;
|
|
5
|
+
export const DEFAULT_EDITORIAL_CONTEXT_PACK_CHARACTERS = 12_000;
|
|
6
|
+
export const MIN_EDITORIAL_CONTEXT_PACK_CHARACTERS = 1_024;
|
|
7
|
+
export const MAX_EDITORIAL_CONTEXT_PACK_CHARACTERS = 24_000;
|
|
8
|
+
function boundedInteger(value, fallback, minimum, maximum, label) {
|
|
9
|
+
if (value === undefined)
|
|
10
|
+
return fallback;
|
|
11
|
+
if (!Number.isInteger(value) || typeof value !== "number" || value < minimum || value > maximum) {
|
|
12
|
+
throw new Error(`${label} must be an integer from ${minimum} through ${maximum}`);
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
function finiteSeconds(value) {
|
|
17
|
+
return typeof value === "number" && Number.isFinite(value) ? Number(value.toFixed(3)) : undefined;
|
|
18
|
+
}
|
|
19
|
+
function compactText(value, maximum) {
|
|
20
|
+
return value.length <= maximum ? value : `${value.slice(0, maximum - 1).trimEnd()}…`;
|
|
21
|
+
}
|
|
22
|
+
function sourceRange(record) {
|
|
23
|
+
const startSeconds = finiteSeconds(record.startSeconds);
|
|
24
|
+
const endSeconds = finiteSeconds(record.endSeconds);
|
|
25
|
+
if (startSeconds === undefined || endSeconds === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
return `${startSeconds.toFixed(3)}s–${endSeconds.toFixed(3)}s`;
|
|
28
|
+
}
|
|
29
|
+
function evidenceHeader(index, record, score, matchedTerms) {
|
|
30
|
+
const facts = [
|
|
31
|
+
`evidence ${compactText(record.id, 96)}`,
|
|
32
|
+
`score ${Number(score.toFixed(3))}`,
|
|
33
|
+
record.sourceId ? `source ${compactText(record.sourceId, 96)}` : undefined,
|
|
34
|
+
record.sequenceId ? `sequence ${compactText(record.sequenceId, 96)}` : undefined,
|
|
35
|
+
sourceRange(record),
|
|
36
|
+
matchedTerms.length ? `matched ${compactText(matchedTerms.join(", "), 160)}` : undefined,
|
|
37
|
+
].filter(Boolean).join(" · ");
|
|
38
|
+
return `## ${String(index + 1).padStart(2, "0")} · ${record.kind} · ${compactText(record.name, 160)}\n${facts}`;
|
|
39
|
+
}
|
|
40
|
+
function entryText(header, text) {
|
|
41
|
+
return `${header}\n${text}`;
|
|
42
|
+
}
|
|
43
|
+
function truncateTextToFit(header, text, availableCharacters) {
|
|
44
|
+
const prefix = `${header}\n`;
|
|
45
|
+
if (availableCharacters < prefix.length + 32)
|
|
46
|
+
return undefined;
|
|
47
|
+
const suffix = " … [excerpt truncated]";
|
|
48
|
+
const textBudget = availableCharacters - prefix.length - suffix.length;
|
|
49
|
+
if (textBudget < 1)
|
|
50
|
+
return undefined;
|
|
51
|
+
return `${prefix}${text.slice(0, textBudget).trimEnd()}${suffix}`;
|
|
52
|
+
}
|
|
53
|
+
function evidenceFromResult(result, textExcerpt, textTruncated) {
|
|
54
|
+
const { record } = result;
|
|
55
|
+
return {
|
|
56
|
+
evidenceId: record.id,
|
|
57
|
+
kind: record.kind,
|
|
58
|
+
name: record.name,
|
|
59
|
+
score: Number(result.score.toFixed(3)),
|
|
60
|
+
matchedTerms: [...result.matchedTerms],
|
|
61
|
+
textExcerpt,
|
|
62
|
+
textTruncated,
|
|
63
|
+
...(record.sequenceId ? { sequenceId: record.sequenceId } : {}),
|
|
64
|
+
...(record.sourceId ? { sourceId: record.sourceId } : {}),
|
|
65
|
+
...(record.timelineItemId ? { timelineItemId: record.timelineItemId } : {}),
|
|
66
|
+
...(finiteSeconds(record.startSeconds) === undefined ? {} : { startSeconds: finiteSeconds(record.startSeconds) }),
|
|
67
|
+
...(finiteSeconds(record.endSeconds) === undefined ? {} : { endSeconds: finiteSeconds(record.endSeconds) }),
|
|
68
|
+
...(record.sourceRevision ? { sourceRevision: record.sourceRevision } : {}),
|
|
69
|
+
...(record.timelineRevision ? { timelineRevision: record.timelineRevision } : {}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Produces a compact reading surface from evidence already captured in the
|
|
74
|
+
* local project-context store. It intentionally knows nothing about Premiere's
|
|
75
|
+
* private transcript JSON shape: callers must explicitly enrich context with
|
|
76
|
+
* the transcript passages or other analysis they want to expose.
|
|
77
|
+
*/
|
|
78
|
+
export function buildEditorialContextPack(document, options) {
|
|
79
|
+
const intent = normalizeContextText(options.intent).slice(0, 1_000);
|
|
80
|
+
if (!intent)
|
|
81
|
+
throw new Error("intent must not be empty");
|
|
82
|
+
const maxEntries = boundedInteger(options.maxEntries, DEFAULT_EDITORIAL_CONTEXT_PACK_ENTRIES, 1, MAX_EDITORIAL_CONTEXT_PACK_ENTRIES, "max_entries");
|
|
83
|
+
const maxCharacters = boundedInteger(options.maxCharacters, DEFAULT_EDITORIAL_CONTEXT_PACK_CHARACTERS, MIN_EDITORIAL_CONTEXT_PACK_CHARACTERS, MAX_EDITORIAL_CONTEXT_PACK_CHARACTERS, "max_characters");
|
|
84
|
+
const selected = options.results.slice(0, maxEntries);
|
|
85
|
+
const totalResultCount = Math.max(options.results.length, Math.trunc(options.totalResultCount ?? options.results.length));
|
|
86
|
+
const header = [
|
|
87
|
+
"# Premiere editorial context pack",
|
|
88
|
+
`Project: ${compactText(document.projectName, 120)}`,
|
|
89
|
+
`Intent: ${compactText(intent, 240)}`,
|
|
90
|
+
`Context revision: ${compactText(document.revision, 64)}`,
|
|
91
|
+
`Source revision: ${compactText(document.sourceRevision, 64)}`,
|
|
92
|
+
`Timeline revision: ${compactText(document.timelineRevision, 64)}`,
|
|
93
|
+
"",
|
|
94
|
+
"Review this evidence before proposing an edit. It is local context, not authority to mutate Premiere.",
|
|
95
|
+
].join("\n");
|
|
96
|
+
let markdown = header;
|
|
97
|
+
const evidence = [];
|
|
98
|
+
let truncated = false;
|
|
99
|
+
for (const [index, result] of selected.entries()) {
|
|
100
|
+
const text = normalizeContextText(result.record.text);
|
|
101
|
+
const block = entryText(evidenceHeader(index, result.record, result.score, result.matchedTerms), text);
|
|
102
|
+
const separator = markdown.length ? "\n\n" : "";
|
|
103
|
+
const availableCharacters = maxCharacters - markdown.length - separator.length;
|
|
104
|
+
if (block.length <= availableCharacters) {
|
|
105
|
+
markdown += `${separator}${block}`;
|
|
106
|
+
evidence.push(evidenceFromResult(result, text, false));
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const partial = truncateTextToFit(evidenceHeader(index, result.record, result.score, result.matchedTerms), text, availableCharacters);
|
|
110
|
+
if (partial) {
|
|
111
|
+
const excerpt = partial.slice(partial.lastIndexOf("\n") + 1).replace(/ … \[excerpt truncated\]$/, "");
|
|
112
|
+
markdown += `${separator}${partial}`;
|
|
113
|
+
evidence.push(evidenceFromResult(result, excerpt, true));
|
|
114
|
+
}
|
|
115
|
+
truncated = true;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
schemaVersion: EDITORIAL_CONTEXT_PACK_SCHEMA_VERSION,
|
|
120
|
+
projectId: document.projectId,
|
|
121
|
+
projectName: document.projectName,
|
|
122
|
+
intent,
|
|
123
|
+
expectedContextRevision: document.revision,
|
|
124
|
+
expectedSourceRevision: document.sourceRevision,
|
|
125
|
+
expectedTimelineRevision: document.timelineRevision,
|
|
126
|
+
evidence,
|
|
127
|
+
omittedEvidenceCount: Math.max(0, totalResultCount - evidence.length),
|
|
128
|
+
truncated: truncated || totalResultCount > selected.length,
|
|
129
|
+
markdown,
|
|
130
|
+
applied: false,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=editorial-context-pack.js.map
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export declare function getDarwinUserTempDirectory(): string | null;
|
|
2
|
+
export declare function getDefaultBridgeTempDir(platform?: NodeJS.Platform, fallbackTempDirectory?: string, readDarwinUserTempDirectory?: () => string | null, environment?: NodeJS.ProcessEnv): string;
|
|
1
3
|
export declare const BRIDGE_HEARTBEAT_FILE = "bridge-heartbeat.json";
|
|
2
4
|
export declare const BRIDGE_HEARTBEAT_STALE_MS = 3000;
|
|
3
5
|
export interface BridgeOptions {
|
|
@@ -1,9 +1,31 @@
|
|
|
1
1
|
import { mkdirSync, writeFileSync, readFileSync, unlinkSync, existsSync, readdirSync, renameSync, statSync, chmodSync, watch } from "node:fs";
|
|
2
|
-
import { basename, dirname, join } from "node:path";
|
|
2
|
+
import { basename, dirname, isAbsolute, join } from "node:path";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { execFileSync } from "node:child_process";
|
|
5
6
|
import { getHelpersSource, helpersFileName, buildBootstrap } from "./script-builder.js";
|
|
6
|
-
|
|
7
|
+
export function getDarwinUserTempDirectory() {
|
|
8
|
+
try {
|
|
9
|
+
// GUI-launched MCP clients can omit TMPDIR. On macOS, getconf still returns
|
|
10
|
+
// the same per-user temporary root inherited by Premiere's CEP process.
|
|
11
|
+
const value = execFileSync("/usr/bin/getconf", ["DARWIN_USER_TEMP_DIR"], {
|
|
12
|
+
encoding: "utf-8",
|
|
13
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
14
|
+
}).trim();
|
|
15
|
+
return value && isAbsolute(value) ? value : null;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function getDefaultBridgeTempDir(platform = process.platform, fallbackTempDirectory = tmpdir(), readDarwinUserTempDirectory = getDarwinUserTempDirectory, environment = process.env) {
|
|
22
|
+
const hasConfiguredNodeTempDirectory = Boolean(environment.TMPDIR || environment.TMP || environment.TEMP);
|
|
23
|
+
const temporaryRoot = platform === "darwin" && !hasConfiguredNodeTempDirectory
|
|
24
|
+
? readDarwinUserTempDirectory() ?? fallbackTempDirectory
|
|
25
|
+
: fallbackTempDirectory;
|
|
26
|
+
return join(temporaryRoot, "premiere-mcp-bridge");
|
|
27
|
+
}
|
|
28
|
+
const DEFAULT_TEMP_DIR = getDefaultBridgeTempDir();
|
|
7
29
|
const POLL_FALLBACK_MS = 250;
|
|
8
30
|
const DEFAULT_TIMEOUT_MS = 30000;
|
|
9
31
|
export const BRIDGE_HEARTBEAT_FILE = "bridge-heartbeat.json";
|
|
@@ -141,6 +141,27 @@ function __findClip(nodeId) {
|
|
|
141
141
|
return null;
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
+
// QE tracks include gaps and transitions in addition to clips, so a DOM clip
|
|
145
|
+
// index cannot safely be passed to qeTrack.getItemAt(). Resolve a QE clip by
|
|
146
|
+
// its timeline start instead. Return null rather than a nearest candidate: a
|
|
147
|
+
// mutation must never be redirected to a neighbouring clip.
|
|
148
|
+
function __findQeClipByDomClip(qeTrack, domClip) {
|
|
149
|
+
if (!qeTrack || !domClip) return null;
|
|
150
|
+
var wantedStart = null;
|
|
151
|
+
try { wantedStart = parseFloat(domClip.start.ticks); } catch (eStart) {}
|
|
152
|
+
if (wantedStart === null || isNaN(wantedStart)) return null;
|
|
153
|
+
|
|
154
|
+
for (var qi = 0; qi < qeTrack.numItems; qi++) {
|
|
155
|
+
var candidate = null;
|
|
156
|
+
try { candidate = qeTrack.getItemAt(qi); } catch (eItem) {}
|
|
157
|
+
if (!candidate || String(candidate.type) !== "Clip") continue;
|
|
158
|
+
try {
|
|
159
|
+
if (Math.abs(parseFloat(candidate.start.ticks) - wantedStart) < 1) return candidate;
|
|
160
|
+
} catch (eCandidate) {}
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
|
|
144
165
|
// CEP's legacy QE path can enumerate a host's effect catalog before adding an
|
|
145
166
|
// effect to a timeline clip. Recent Premiere builds can expose QE yet return an
|
|
146
167
|
// empty catalog, so distinguish that host limitation from a misspelled effect
|
|
@@ -71,6 +71,8 @@ export interface ProjectContextSearchResult {
|
|
|
71
71
|
record: ProjectContextRecord;
|
|
72
72
|
matchedTerms: string[];
|
|
73
73
|
}
|
|
74
|
+
/** Counts exact keyword-relevant records without materializing their evidence. */
|
|
75
|
+
export declare function countProjectContextMatches(document: ProjectContextDocument, options: Omit<ProjectContextSearchOptions, "limit">): number;
|
|
74
76
|
export declare function searchProjectContext(document: ProjectContextDocument, options: ProjectContextSearchOptions): ProjectContextSearchResult[];
|
|
75
77
|
export declare function contextRevision(sourceRevision: string, timelineRevision: string, records: ProjectContextRecord[]): string;
|
|
76
78
|
export declare function stableContextId(...parts: unknown[]): string;
|