premiere-pro-mcp 1.19.1 → 1.20.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 (106) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +24 -17
  3. package/after-effects-cep-plugin/CSXS/manifest.xml +3 -3
  4. package/after-effects-cep-plugin/bridge-directory-security.cjs +1 -0
  5. package/artifacts/MCPBridgeCEP.zxp +0 -0
  6. package/cep-plugin/CSXS/manifest.xml +3 -3
  7. package/cep-plugin/bridge-directory-security.cjs +1 -0
  8. package/cep-plugin/index.html +1 -1
  9. package/cep-plugin/main.js +3 -0
  10. package/cep-plugin/updater.cjs +1 -1
  11. package/dist/ai/editorial-review.d.ts +263 -0
  12. package/dist/ai/editorial-review.js +262 -0
  13. package/dist/ai/transcript-word-edits.d.ts +8 -1
  14. package/dist/ai/transcript-word-edits.js +28 -4
  15. package/dist/bridge/file-bridge.d.ts +6 -1
  16. package/dist/bridge/file-bridge.js +78 -9
  17. package/dist/bridge/script-builder.js +84 -6
  18. package/dist/bridge/uxp-websocket-bridge.d.ts +5 -0
  19. package/dist/bridge/uxp-websocket-bridge.js +30 -1
  20. package/dist/context/context-storage-security.d.ts +5 -0
  21. package/dist/context/context-storage-security.js +54 -0
  22. package/dist/context/project-context-store.js +77 -18
  23. package/dist/index.js +1 -1
  24. package/dist/platform-capabilities.d.ts +3 -3
  25. package/dist/security/capabilities.js +6 -0
  26. package/dist/server.js +6 -0
  27. package/dist/tool-capability-report.js +5 -0
  28. package/dist/tools/advanced.d.ts +6 -0
  29. package/dist/tools/advanced.js +67 -23
  30. package/dist/tools/audio.d.ts +1 -1
  31. package/dist/tools/audio.js +45 -17
  32. package/dist/tools/clipboard.js +175 -122
  33. package/dist/tools/competitor-gaps.d.ts +18 -0
  34. package/dist/tools/competitor-gaps.js +81 -12
  35. package/dist/tools/editor-requests.d.ts +7 -0
  36. package/dist/tools/editor-requests.js +26 -8
  37. package/dist/tools/editorial-review.d.ts +119 -0
  38. package/dist/tools/editorial-review.js +34 -0
  39. package/dist/tools/effects.js +49 -4
  40. package/dist/tools/export.d.ts +45 -1
  41. package/dist/tools/export.js +311 -15
  42. package/dist/tools/health.d.ts +3 -3
  43. package/dist/tools/inspection.js +18 -2
  44. package/dist/tools/interchange-analysis.d.ts +1 -0
  45. package/dist/tools/interchange-analysis.js +7 -3
  46. package/dist/tools/keyframes.d.ts +42 -0
  47. package/dist/tools/keyframes.js +97 -41
  48. package/dist/tools/markers.js +28 -7
  49. package/dist/tools/mask-fit.js +3 -1
  50. package/dist/tools/media.d.ts +5 -0
  51. package/dist/tools/media.js +33 -10
  52. package/dist/tools/metadata.d.ts +20 -0
  53. package/dist/tools/metadata.js +59 -48
  54. package/dist/tools/playhead.js +46 -16
  55. package/dist/tools/project.d.ts +12 -1
  56. package/dist/tools/project.js +35 -3
  57. package/dist/tools/ripple-delete-script.js +1 -1
  58. package/dist/tools/ripple-remove-ranges.d.ts +93 -0
  59. package/dist/tools/ripple-remove-ranges.js +263 -0
  60. package/dist/tools/scripting.js +8 -1
  61. package/dist/tools/source-to-timeline.d.ts +84 -0
  62. package/dist/tools/source-to-timeline.js +167 -0
  63. package/dist/tools/spot-workflows.js +3 -1
  64. package/dist/tools/stock-titles.js +1 -1
  65. package/dist/tools/timeline.js +97 -47
  66. package/dist/tools/track-targeting.d.ts +10 -0
  67. package/dist/tools/track-targeting.js +70 -26
  68. package/dist/tools/transcript-word-edits.js +1 -1
  69. package/dist/tools/transitions.js +28 -8
  70. package/dist/tools/utility.d.ts +12 -0
  71. package/dist/tools/utility.js +30 -2
  72. package/dist/tools/uxp-advanced-workflows.js +1 -1
  73. package/dist/tools/uxp-apply-snapshot.d.ts +19 -0
  74. package/dist/tools/uxp-apply-snapshot.js +41 -0
  75. package/dist/tools/uxp-clone-workflows.d.ts +5 -1
  76. package/dist/tools/uxp-clone-workflows.js +14 -11
  77. package/dist/tools/uxp-next-workflows.d.ts +1 -0
  78. package/dist/tools/uxp-next-workflows.js +8 -1
  79. package/dist/tools/uxp-ripple-delete-workflows.d.ts +5 -1
  80. package/dist/tools/uxp-ripple-delete-workflows.js +16 -13
  81. package/dist/tools/uxp-slide-workflows.d.ts +5 -1
  82. package/dist/tools/uxp-slide-workflows.js +15 -12
  83. package/dist/tools/uxp-slip-workflows.d.ts +4 -0
  84. package/dist/tools/uxp-slip-workflows.js +3 -2
  85. package/dist/tools/uxp.d.ts +32 -1
  86. package/dist/tools/uxp.js +14 -1
  87. package/dist/tools/workflow-recipes.d.ts +7 -2
  88. package/dist/tools/workflow-recipes.js +11 -2
  89. package/dist/workflows/agent-instructions.js +8 -5
  90. package/dist/workflows/catalog.d.ts +28 -3
  91. package/dist/workflows/catalog.js +31 -1
  92. package/dist/workflows/tool-metadata.js +5 -0
  93. package/dist/workflows/tool-packs.js +2 -0
  94. package/docs/editorial-review-workflows.md +95 -0
  95. package/docs/supported-actions.md +27 -20
  96. package/package.json +3 -2
  97. package/public-product-manifest.json +6 -6
  98. package/uxp-plugin/advanced-workflows.cjs +83 -12
  99. package/uxp-plugin/commands.cjs +25 -3
  100. package/uxp-plugin/index.cjs +1 -0
  101. package/uxp-plugin/manifest.json +1 -1
  102. package/uxp-plugin/ripple-delete-workflows.cjs +38 -0
  103. package/uxp-plugin/slide-workflows.cjs +34 -4
  104. package/uxp-plugin/slip-workflows.cjs +31 -2
  105. package/uxp-plugin/unique-identity-workflows.cjs +18 -4
  106. package/uxp-plugin/workspace.cjs +26 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,72 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.20.0] - 2026-10-06
10
+
11
+ ### Added
12
+
13
+ - `ripple_remove_timeline_ranges` previews and then applies a multi-range ripple removal (up to 50 sorted ranges) across unlocked, sync-locked tracks. Apply needs a single-use preview confirmation token and the `edit` capability, cuts on Premiere's own sequence timecode, and verifies every resulting clip by readback. It uses the experimental QE razor; a timeout after Premiere accepts the edit is reported as `mutationOutcome: "unknown"`. Live Premiere verification was reported by the contributor on 25.2.3 and 26.5.2; it was not re-run for this release.
14
+
15
+ - `set_footage_interpretation` accepts `field_type` (0 progressive, 1 upper field first, 2 lower field first) and reads it back (#806).
16
+ - `import_folder` accepts `target_bin` and skips `Thumbs.db`, `desktop.ini` and `.DS_Store` (#807).
17
+ - `get_encoder_presets` accepts `limit` and `offset`; the result adds `total` and `offset` (#808).
18
+ - `import_fcp_xml` accepts `mode: "into_open_project"` (with optional `target_bin`) to import into the open project; it succeeds only when the sequence count grew, and `project_path` is required only in the default `new_project` mode (#811).
19
+
20
+ ### Fixed
21
+
22
+ - `import_media` no longer reports an error when an `.xml`, `.aaf`, `.edl` or `.prproj` file imports correctly. Interchange files create sequences and bins rather than an item with the file's path, so they now return `outcome: "committed_unverified"` with `interchange: true`, which stops retries from duplicating the sequence (#805).
23
+
24
+ - `duplicate_clip` no longer places a copy one frame short. Premiere can snap the source out point a frame early, so on Premiere 26.5.2 a 677-frame clip was copied as 676 frames, and the tool still reported `verified` because it allowed two frames of drift. It now trims each placed copy, and its linked partner, back to the original end, reports `endCorrected`, and verifies start, end and source in-point to within half a frame.
25
+
26
+ - Effect parameter reads and writes use Premiere's lossless colour API for static colour controls, returning `[alpha, red, green, blue]` instead of a packed number. CEP refuses keyframed colour operations that cannot be read or written losslessly. Effect tools now refuse repeated property names with candidate indices or accept `property_index`; this applies to parameter reads, writes, keyframe operations, colour correction and built-in property workflows that resolve names.
27
+
28
+ - `razor_all_tracks` and `split_clip` cut on the requested frame in drop-frame sequences. They built a non-drop `HH:MM:SS:FF` string, which Premiere reads as drop-frame timecode on 29.97/59.94 DF sequences, so cuts landed early by the dropped-frame count (2 frames after the first minute, 28 frames at 16 minutes, measured on 25.2.3) and `razor_all_tracks` still reported `verified: true`. Both now let Premiere format the timecode in the sequence's display format, snap the cut to a frame, and verify the new boundary within half a frame; `razor_all_tracks` reports a misplaced cut as `committed_unverified`.
29
+ - Batched ripple-range previews now cap clip samples at 50 while retaining per-track counts and a confirmation fingerprint for the complete plan. Razor track spans are computed from one initial clip snapshot; cuts use Premiere's sequence-display timecode for fractional and drop-frame rates and refuse any resulting boundary more than half a frame from the snapped range edge. Frame-exact decimal ranges no longer appear as adjustments, and mutation receipts use the shared QE undo-stack reader.
30
+
31
+ - `add_audio_keyframes` and `setup_ducking` can add the first keyframe to a clip again. On Premiere 25.2.3 a property with no keyframes returns `undefined` from `getKeys()` (with `isTimeVarying()` false), which the audio and shared keyframe readers treated as unreadable storage, so both tools refused every clip without existing Volume keys. That state now reads as an empty key list; `null`, malformed lists, and `undefined` on a time-varying property still refuse.
32
+
33
+ - `detect_beats` no longer snaps tempo to a coarse grid or lets the beat grid drift. It decoded audio at 200 Hz and built a 20 Hz onset envelope, so periods could only take 50 ms steps (73 BPM reported as 75, 146 as 150) and the returned beat times drifted by about 0.4 s after 30 beats. It now decodes at 4 kHz, uses a 100 Hz envelope, and refines the period to a fraction of a sample across the whole file. On 3-minute click tracks from 60 to 174 BPM, tempo is exact and every beat time is within 20 ms.
34
+
35
+ - `detect_repeated_takes` no longer groups a short sentence with a much longer, different one because they share a few words. Similarity used bag-of-words containment, so on a real interview transcript "We have new city projects" (5 words) scored 0.8 against a 20-word sentence mentioning "different new city projects", and the default `keep: "last"` proposed removing 7.9 s of real content. When one sentence is under 60% of the other's length, containment now only counts a false start that matches the start of the longer sentence in order; similar-length retakes behave as before.
36
+
37
+ - `map_source_ranges_to_timeline` now treats `getSpeed() === 100` as normal speed on older Premiere hosts while continuing to refuse retimed or reversed clips.
38
+
39
+ - `set_sequence_frame_rate` sets exact NTSC timebases. It divided by the rounded decimal (`TICKS_PER_SECOND / 29.97`), giving 8475675676 ticks per frame for 29.97 and 10594594595 for 23.976, which are near-NTSC rates that drift against camera media and differ from Premiere's own presets (8475667200 and 10594584000). Requests within 0.005 fps of 23.976, 29.97, 47.952, 59.94 or 119.88 now use the exact `nominal × 1000/1001` timebase, and the receipt reports `ntsc` and `exactFrameRate`.
40
+
41
+ - Timeline edits for playhead, clip placement/duration/trim, sequence marks and sequence markers snap requested times to the active sequence frame grid, verify stored boundaries within 1/1000 frame, and report changed requested/applied values.
42
+
43
+ - `navigate_playhead` now reports timecode using Premiere's sequence display format, including drop-frame punctuation.
44
+
45
+ - Transition receipts distinguish verified placement from handle-limited duration, mark each deviating placement, and count duration deviations. Premiere-built title copies report their application-support location and are documented as user-managed files that must not be removed while any project references them.
46
+ - Filler-removal guidance explains that hesitation sounds require transcripts that preserve disfluencies; Whisper's default output omits them.
47
+
48
+ - FCP XML export receipts parse Premiere's BOM-prefixed Translation Report issue lines, bound effect details while reporting truncation, and wait for the XML size and modification time to stabilize before reporting its size.
49
+ - CEP command timeouts cancel still-unclaimed work when another recent busy marker or connector heartbeat shows Premiere is blocked; mutating commands report `not_applied`, while claimed work with a fresh busy marker continues waiting.
50
+
51
+ - `paste_clip_attributes` and `copy_effect_values` copy colour parameters (such as Lumetri White Balance) with `getColorValue()` / `setColorValue()`. `getValue()` returns these as one packed number above 2^53, so writing it back stored a different colour. On Premiere 25.2.3 a grey white balance came back as transparent blue. Keyframed colour parameters are reported as not copied instead of being written.
52
+ - `copy_effect_values` matches properties by position, then by unique display name. Lumetri Color repeats names such as Saturation and Intensity across sections, and the first-name match wrote values into the wrong controls. On 25.2.3 this left a correctly graded clip with the wrong Saturation and Intensity. Values that already match and unreadable section headers are no longer rewritten, and a failed copy now names the properties it skipped or could not verify.
53
+
54
+ - `copy_effects_between_clips` now copies and reads back effect parameter values and keyframes, updates an existing target effect instead of stacking a default instance, and refuses when the requested source effect is missing.
55
+
56
+ - Corrected the still-capture guidance from #771. Premiere's QE PNG stills are not wrong about keyframes. They are RGBA with straight alpha, so a fading clip keeps its colours and carries the fade only in alpha. On Premiere 26.5.2 macOS, stills composited over black matched an actual H.264 export (58.0 against 58.4 YAVG at mid-fade), and linear, hold and bezier gave different alpha (168, 255 and 189) at the same instant. The earlier "QE stills hold opacity" note came from measuring stills without their alpha channel. `export_frame` and `capture_frame` now report `hasAlpha` from the PNG header with a compositing note, and the client instructions, skills, interpolation receipts and review-frame scopes say to composite stills over black before comparing them with a video export.
57
+
58
+ - UXP tools on Premiere 26.5.2, found live on macOS:
59
+ - **Project-item IDs.** The project root and some folders return no `getId` until cast with `ProjectItem.cast`. `inspect_project_tree_uxp` and `inspect_unique_object_identity_uxp` failed, and bin listings reported empty IDs. The advanced-workflow and unique-identity helpers now cast, as the other helpers already did.
60
+ - **Slip, slide and split edits.** Premiere 26.5 applies TrackItem start/end and in/out actions like trims, so each edge action also moves its source point.
61
+ - `slip_track_item_uxp` landed as a move. It now restores the timeline position with a second, measured move (two undo steps).
62
+ - `slide_track_item_uxp` trimmed both neighbours twice. It now sends only the edge actions and writes source points afterwards only when they did not follow.
63
+ - `make_split_edit_uxp` extended the audio twice, and it never checked whether the extension was free. An L-cut into the next audio clip left two items over the same range, and Premiere crashed (heap corruption) while drawing them. It now refuses when the extension would overlap another item on the same track, and it applies the source point only when needed.
64
+ - **`ripple_delete_track_item_uxp`** deleted without rippling when another track had an item over the deleted range, such as a linked audio partner or a spanning adjustment layer. It now refuses before any change and names those items.
65
+ - **Snapshots.** Slip, slide, ripple-delete and duplicate `inspect` results now include a snake_case `expected_snapshot` that `apply` accepts unchanged. Previously the camelCase inspect output was rejected by the apply schema.
66
+ - **Capabilities.** The bridge re-reads the panel's live capabilities before refusing a command that the connect-time handshake marked unsupported, and `get_uxp_capabilities` reports the live list. A panel that connected before a project was open or a workspace was approved hid 25 of 192 commands for the session.
67
+ - **Markers.** `manage_markers_uxp` `add` now forwards and applies `color_index` and verifies every requested field. Previously the colour was dropped while the add reported verified.
68
+ - **Frame export.** `export_frame_uxp` retries with the file extension when Premiere rejects an extension-less name ("File Format is not supported"). It also waits up to 15 s for the PNG, which 26.5.2 writes after the call returns, and it checks for the file by walking the approved workspace folder: a plugin with request-only file access cannot open arbitrary `file:` URLs, so the old check reported a written frame as missing.
69
+ - **Media health.** `maintain_media_health_uxp` treats a single `project_item_id` as a one-item list for inspect, refresh and set_offline.
70
+
71
+ ### Changed
72
+
73
+ - Long-host receipts detect FCP Translation Report modals and report written XML/OMF as committed_unverified after host timeout; export preflight reports composite black/dead-air intervals within sequence In/Out with optional paged per-track details; media, ripple, and marker readbacks include generated-no-file classification, 1-based track labels, marker GUID and color. Queued commands now cancel atomically behind a fresh busy operation when possible, distinguishing not_applied from unknown mutation outcomes.
74
+
9
75
  ## [1.19.1] - 2026-10-04
10
76
 
11
77
  ### Fixed
@@ -20,10 +86,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
20
86
  - `clear_item_in_out` verifies a cleared Out mark against the item's `MediaDuration` and `MediaTimebase` (frames for video, samples for audio), so audio items verify too, and reports the In and Out results separately. Live on Premiere 25.2.3: a cleared Out reads the full media length, and `MediaTimebase` is `48000 Hz` for audio and `25.00 fps` for video. (#696)
21
87
  - An empty Source Monitor returns `undefined`, not `null`, on Premiere 25.2.3. The close and playback tools now treat a getter that returns `null` or `undefined` without throwing as an empty monitor; only a throwing getter is unreadable. Previously `close_all_source_clips` reported a genuinely empty monitor as `committed_unverified`. (#694)
22
88
  - `add_to_timeline` counts only clips that match the inserted source and start at the insertion time as inserted, and reports split remainders separately (`splitRemainders`). A same-source mid-clip insert on 25.2.3 previously reported `insertedTrackItems: 2` for one inserted clip. (#680)
89
+ - Mutating bridge commands that time out after Premiere accepts them can report `mutationOutcome: unknown` and `timelineChanged: null`, with guidance to inspect before retrying.
23
90
  - `encode_project_item`, `encode_file`, and `manage_proxies` `create` no longer call `app.encoder.startBatch()` after queueing. That API starts every ready Adobe Media Encoder job, including unrelated jobs already in the queue. Batch start is now opt-in with `start_batch: true`, matching `add_to_render_queue`. Use `start_batch_encode` to start the queue later.
24
91
  - `ripple_delete`, ripple removal in `remove_from_timeline`, and rippling `apply_edit_plan` removals shift clips with `TrackItem.move()` and single-pass per-track lookups. The contributor measured one pause cut on Premiere 25.2.3 macOS dropping from about 31 minutes to about 3 on a 2-hour, 1,490-clip podcast sequence. Ripples that would move more than 400 clips refuse before mutation with a count and time estimate unless `allow_large_ripple` is set, host waits scale with the work without shortening a longer configured timeout, and an edit that times out after Premiere accepted it reports an unknown timeline state instead of a plain failure.
25
92
  - `trim_clip`, `set_clip_duration`, `slip_edit`, `roll_edit`, and `slide_edit` no longer refuse every unlinked clip by default. On Premiere 25.2.3 `getLinkedItems()` returns `null` (without throwing) for a clip with no linked partner, which these tools treated as unreadable linkage; it now means "no partners", while throwing or malformed collections still refuse. `roll_edit` and `slide_edit` also accept the numeric `0` that `isSpeedReversed()` returns for a forward clip on that host (`1`/`true` still refuse), so they no longer refuse every clip there.
26
93
 
94
+ ### Added
95
+
96
+ - `ripple_remove_timeline_ranges` previews up to 50 frame-snapped pause ranges, then removes them in one guarded pass across unlocked sync-locked tracks, shifting each surviving clip once with a verified receipt.
97
+
27
98
  ## [1.19.0] - 2026-10-02
28
99
 
29
100
  ### Added
package/README.md CHANGED
@@ -14,7 +14,7 @@ Free, MIT licensed, local-first, and published to npm as [`premiere-pro-mcp`](ht
14
14
 
15
15
  [Website](https://premiere-pro-mcp.com/) · [Recorded demo](https://premiere-pro-mcp.com/demo/) · [Compare servers](https://premiere-pro-mcp.com/compare/) · [Setup guides](https://premiere-pro-mcp.com/blog/how-to-set-up-premiere-pro-mcp/) · [Search tools](https://premiere-pro-mcp.com/tools/) · [Troubleshooting](https://premiere-pro-mcp.com/docs/troubleshooting/) · [Release facts](https://premiere-pro-mcp.com/facts/)
16
16
 
17
- Development source: 386 core tools across 57 modules, 4 resources, and 19 guided workflows. A connected UXP host adds 96 capability-gated tools.
17
+ Development source: 393 core tools across 60 modules, 4 resources, and 24 guided workflows. A connected UXP host adds 96 capability-gated tools.
18
18
 
19
19
  The [completed AE render handoff](docs/after-effects-render-handoff.md) previews and confirms importing one finished render into an existing Premiere bin, with host and file rechecks and an import receipt.
20
20
 
@@ -125,17 +125,17 @@ and repository before configuring a client. The new
125
125
  VS Code, or Codex settings that point directly to this installation. It is a
126
126
  feature included in v1.15.1 and later.
127
127
 
128
- The current source exposes 386 core tools for supported workflow steps spanning the supported ExtendScript, QE DOM, local media and interchange analysis, revisioned project-context retrieval, safe edit-planning, project-intake preview, review handoff, connection verification, and guarded After Effects MOGRT authoring, batch, library, render-queue, inspection, and Premiere-handoff workflows. A compatible, authenticated UXP panel adds 96 documented, capability-gated tools without replacing the production CEP bridge.
128
+ The current source exposes 393 core tools for supported workflow steps spanning the supported ExtendScript, QE DOM, local media and interchange analysis, revisioned project-context retrieval, safe edit-planning, project-intake preview, review handoff, connection verification, and guarded After Effects MOGRT authoring, batch, library, render-queue, inspection, and Premiere-handoff workflows. A compatible, authenticated UXP panel adds 96 documented, capability-gated tools without replacing the production CEP bridge.
129
129
 
130
130
  <a id="latest-release"></a>
131
131
 
132
- ### Latest release: 1.19.1
132
+ ### Latest release: 1.20.0
133
133
 
134
- The published v1.19.1 npm artifact contains **386 core tools**, 384 in its default profile,
135
- and 480 with a compatible UXP connection. The development catalog above can include
134
+ The published v1.20.0 npm artifact contains **393 core tools**, 391 in its default profile,
135
+ and 487 with a compatible UXP connection. The development catalog above can include
136
136
  unreleased work. See the [versioned facts and package provenance](https://premiere-pro-mcp.com/facts/).
137
137
 
138
- GitHub releases use `v<SemVer>` for both title and tag, such as `v1.19.1`.
138
+ GitHub releases use `v<SemVer>` for both title and tag, such as `v1.20.0`.
139
139
  See [release naming and version conventions](docs/release-conventions.md).
140
140
 
141
141
  ### Try a bounded workflow
@@ -154,6 +154,9 @@ if the connection is unavailable.
154
154
 
155
155
  ### Release highlights
156
156
 
157
+ - **1.20.0 verified range removal:** `ripple_remove_timeline_ranges` previews, then applies a multi-range ripple removal with a single-use confirmation token and clip-level readback (QE razor; experimental).
158
+ - **1.20.0 effect safety:** effect colours read and write losslessly, ambiguous property names (for example repeated Lumetri controls) are refused unless `property_index` is given, and `duplicate_clip` copies keep the original length.
159
+ - **1.20.0 import and metadata additions:** `import_fcp_xml` can import into the open project, `import_folder` accepts `target_bin`, `get_encoder_presets` pages with `limit`/`offset`, `set_footage_interpretation` sets `field_type`, and XML/AAF/EDL imports through `import_media` no longer report a false error.
157
160
  - **1.19.1 timeline fixes:** bounded sequence pages with continuation, measured unlinked-clip compatibility, and faster ripple movement with a large-edit opt-in and scaled host waits.
158
161
  - **1.19.1 safer handoffs:** AME queue-wide start requires explicit opt-in, malformed MOGRT files refuse before host import, and uncertain committed edits retain inspection guidance.
159
162
  - **1.19.1 transcript and capture fixes:** empty host-attached transcripts can accept guarded imports; stored values and still files do not establish temporal animation. A short actual video export is needed to assess keyframe curves.
@@ -188,7 +191,7 @@ if the connection is unavailable.
188
191
  local Premiere processes. See the generated [supported action catalog](docs/supported-actions.md)
189
192
  for individual capability and verification contracts.
190
193
 
191
- See the [v1.19.1 release notes](https://github.com/leancoderkavy/premiere-pro-mcp/releases/tag/v1.19.1)
194
+ See the [v1.20.0 release notes](https://github.com/leancoderkavy/premiere-pro-mcp/releases/tag/v1.20.0)
192
195
  for complete details. Live installation in Premiere Pro still requires host verification.
193
196
 
194
197
  ### Current MCP protocol support
@@ -236,7 +239,7 @@ their bins, media rules, and organization rules before a facility uses one.
236
239
  > ### Install the published package (verify the name)
237
240
  >
238
241
  > ```bash
239
- > npm i -g premiere-pro-mcp@1.19.1
242
+ > npm i -g premiere-pro-mcp@1.20.0
240
243
  > ```
241
244
  >
242
245
  > This repository publishes only **`premiere-pro-mcp`**. A differently named package (`adobe-premiere-pro-mcp`) may also declare a `premiere-pro-mcp` executable. Before configuring a client, confirm:
@@ -244,7 +247,7 @@ their bins, media rules, and organization rules before a facility uses one.
244
247
  > | Check | Expected |
245
248
  > | --- | --- |
246
249
  > | Package name | `premiere-pro-mcp` (not `adobe-premiere-pro-mcp`) |
247
- > | Version | `1.19.1` |
250
+ > | Version | `1.20.0` |
248
251
  > | Homepage / repo | https://premiere-pro-mcp.com/ · https://github.com/leancoderkavy/premiere-pro-mcp |
249
252
  >
250
253
  > ```bash
@@ -257,9 +260,9 @@ their bins, media rules, and organization rules before a facility uses one.
257
260
 
258
261
  ### Easiest supported path: Claude Desktop
259
262
 
260
- 1. Download the current [Claude Desktop bundle (`.mcpb`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.19.1/premiere-pro-mcp-1.19.1.mcpb).
263
+ 1. Download the current [Claude Desktop bundle (`.mcpb`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.20.0/premiere-pro-mcp-1.20.0.mcpb).
261
264
  2. In Claude Desktop, open **Settings > Extensions > Advanced settings > Install Extension**, select the downloaded bundle, and restart Claude Desktop.
262
- 3. Download the separate [signed Premiere connector (`.zxp`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.19.1/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.
265
+ 3. Download the separate [signed Premiere connector (`.zxp`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.20.0/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.
263
266
  4. Restart Premiere, open a project, then open **Window > Extensions > MCP for Adobe Premiere Pro**.
264
267
  5. In Claude, enter: `Safely check my Premiere connection with verify_premiere_connection. Make no changes.`
265
268
 
@@ -563,11 +566,11 @@ From a clone of this repository:
563
566
  ```bash
564
567
  codex plugin marketplace add .
565
568
  codex plugin add premiere-pro@premiere-pro-mcp
566
- npx -y premiere-pro-mcp@1.19.1 --install-cep
569
+ npx -y premiere-pro-mcp@1.20.0 --install-cep
567
570
  ```
568
571
 
569
572
  Restart Premiere Pro and start a new Codex session after installation. The plugin
570
- launches `premiere-pro-mcp@1.19.1` through `npx`; the separate CEP installation is
573
+ launches `premiere-pro-mcp@1.20.0` through `npx`; the separate CEP installation is
571
574
  required because the MCP server communicates with the running Premiere host through
572
575
  the local bridge.
573
576
 
@@ -605,7 +608,7 @@ For Claude Code, add this repository as a marketplace and install the plugin:
605
608
  Then install the Premiere bridge and start a new Claude Code session:
606
609
 
607
610
  ```bash
608
- npx -y premiere-pro-mcp@1.19.1 --install-cep
611
+ npx -y premiere-pro-mcp@1.20.0 --install-cep
609
612
  ```
610
613
 
611
614
  The Claude Code package lives in
@@ -929,7 +932,9 @@ reports revision-bound notes, VFX state, change impact and turnover exceptions.
929
932
  It performs local inspection; host edits and exports use separate guarded tools.
930
933
  See [usage, example and remaining execution adapters](docs/film-editorial-workflows.md).
931
934
 
932
- ## Tools (386 core total; 384 under the default profile; 480 with a connected UXP bridge)
935
+ Reviewed assistant-editing tools now provide dialogue candidate decisions, quote paper-edit CSV, batch copy previews, sync-evidence triage, and owned-footage B-roll review. These are local evidence reviews, not new host engines. See [review workflow contracts](docs/editorial-review-workflows.md).
936
+
937
+ ## Tools (393 core total; 391 under the default profile; 487 with a connected UXP bridge)
933
938
 
934
939
  The [complete supported-actions catalog](docs/supported-actions.md) lists every
935
940
  registered core tool, the two tools restricted behind explicit `unsafe-script`
@@ -1368,7 +1373,7 @@ user/device authorization are implemented.
1368
1373
  | `PREMIERE_MCP_CAPABILITIES` | Comma-separated authority profile; add `unsafe-script` only when raw scripting is required | `inspect,edit,export,filesystem` |
1369
1374
  | `PREMIERE_MCP_DEBUG` | Set to `1` (or `true`) to emit verbose server diagnostics to stderr | unset |
1370
1375
  | `PREMIERE_CONTEXT_BACKEND` | Local project-context store: `auto`, `sqlite`, `json`, or `memory` | `auto` |
1371
- | `PREMIERE_CONTEXT_DIR` | Override the local project-context storage directory | OS application-data directory |
1376
+ | `PREMIERE_CONTEXT_DIR` | Override local context storage; unsafe existing ownership/permissions/links are rejected, safe POSIX directories/files tightened to 0700/0600 | OS application-data directory |
1372
1377
  | `PORT` | HTTP port (HTTP/SSE transport only) | `3000` |
1373
1378
  | `MCP_AUTH_TOKEN` | Operator bearer token for controlled HTTP deployments; mutually exclusive with OAuth mode | unset |
1374
1379
  | `MCP_OAUTH_ISSUER` | Exact trusted OAuth/OIDC token issuer URL | unset |
@@ -1418,7 +1423,7 @@ premiere-pro-mcp/
1418
1423
  ├── src/
1419
1424
  │ ├── index.ts # Entry point — stdio transport setup
1420
1425
  │ ├── http-server.ts # Entry point — HTTP/SSE transport (Fly.io / remote)
1421
- │ ├── server.ts # MCP server — registers 386 tools, filtered by authority profile
1426
+ │ ├── server.ts # MCP server — registers 393 tools, filtered by authority profile
1422
1427
  │ ├── bridge/
1423
1428
  │ │ ├── file-bridge.ts # File-based IPC (write .jsx, poll .json)
1424
1429
  │ │ └── script-builder.ts # ExtendScript generator with ES3 helpers
@@ -1488,6 +1493,8 @@ All generated scripts use **ES3 syntax** (`var`, manual `for` loops, no arrow fu
1488
1493
 
1489
1494
  ### Security
1490
1495
 
1496
+ Metadata privacy: CEP `get_metadata` and `get_xmp_metadata` now default to bounded parsed fields with GPS, serial, author and contact values omitted. Raw packets require explicit packet flags and `include_sensitive: true`; source media paths require `include_media_path: true`. Existing callers expecting raw XML must opt in. Disk context can retain names, transcripts and notes; select `PREMIERE_CONTEXT_BACKEND=memory` to avoid persistence.
1497
+
1491
1498
  Understand the trust model before deploying this: **any client that can reach the MCP
1492
1499
  server can control Premiere Pro.** `execute_extendscript` and `evaluate_expression` are
1493
1500
  arbitrary-code-execution tools by design and are omitted from discovery and denied at call time
@@ -1,8 +1,8 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.aftereffects.bridge" ExtensionBundleVersion="1.19.1" ExtensionBundleName="MCP for Adobe After Effects">
2
+ <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.aftereffects.bridge" ExtensionBundleVersion="1.20.0" ExtensionBundleName="MCP for Adobe After Effects">
3
3
  <ExtensionList>
4
- <Extension Id="com.mcp.aftereffects.bridge.panel" Version="1.19.1"/>
5
- <Extension Id="com.mcp.aftereffects.bridge.headless" Version="1.19.1"/>
4
+ <Extension Id="com.mcp.aftereffects.bridge.panel" Version="1.20.0"/>
5
+ <Extension Id="com.mcp.aftereffects.bridge.headless" Version="1.20.0"/>
6
6
  </ExtensionList>
7
7
  <ExecutionEnvironment>
8
8
  <HostList>
@@ -29,6 +29,7 @@
29
29
  '}',
30
30
  'if ($initialize) {',
31
31
  ' if ($unsafeAncestors.Count -ne 0) { throw ("Bridge directory ancestry is unsafe: " + (($unsafeAncestors | ForEach-Object { "{0} ({1}: {2})" -f $_.path, $_.reason, $_.sid }) -join "; ")) }',
32
+ ' $acl.SetOwner((New-Object System.Security.Principal.SecurityIdentifier($current)))',
32
33
  ' $acl.SetAccessRuleProtection($true, $false)',
33
34
  ' $inheritance = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit',
34
35
  ' $propagation = [System.Security.AccessControl.PropagationFlags]::None',
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.19.1" ExtensionBundleName="MCP for Adobe Premiere Pro">
2
+ <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.premiere.bridge" ExtensionBundleVersion="1.20.0" ExtensionBundleName="MCP for Adobe Premiere Pro">
3
3
  <ExtensionList>
4
- <Extension Id="com.mcp.premiere.bridge.panel" Version="1.19.1"/>
5
- <Extension Id="com.mcp.premiere.bridge.headless" Version="1.19.1"/>
4
+ <Extension Id="com.mcp.premiere.bridge.panel" Version="1.20.0"/>
5
+ <Extension Id="com.mcp.premiere.bridge.headless" Version="1.20.0"/>
6
6
  </ExtensionList>
7
7
  <ExecutionEnvironment>
8
8
  <HostList>
@@ -29,6 +29,7 @@
29
29
  '}',
30
30
  'if ($initialize) {',
31
31
  ' if ($unsafeAncestors.Count -ne 0) { throw ("Bridge directory ancestry is unsafe: " + (($unsafeAncestors | ForEach-Object { "{0} ({1}: {2})" -f $_.path, $_.reason, $_.sid }) -join "; ")) }',
32
+ ' $acl.SetOwner((New-Object System.Security.Principal.SecurityIdentifier($current)))',
32
33
  ' $acl.SetAccessRuleProtection($true, $false)',
33
34
  ' $inheritance = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit',
34
35
  ' $propagation = [System.Security.AccessControl.PropagationFlags]::None',
@@ -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">MCP updates</span>
84
- <strong id="updateTitle">Version 1.19.1</strong>
84
+ <strong id="updateTitle">Version 1.20.0</strong>
85
85
  <span id="updateDetail">Checking the global MCP server and connector release…</span>
86
86
  </div>
87
87
  <button id="btnUpdate" class="button button-update" onclick="handleUpdateClick()" type="button" aria-describedby="updateDetail" disabled>
@@ -321,6 +321,9 @@ function processOneCommand(cmdFileName) {
321
321
 
322
322
  // While evalScript is in flight, heartbeat a busy file so the MCP server can
323
323
  // tell "script still running (modal dialog?)" apart from "plugin not running".
324
+ // This setInterval runs on CEP's own event loop. A host call that blocks that
325
+ // loop (as long exports or a modal can) also stalls the heartbeat; absence of
326
+ // a fresh marker is therefore not proof that Premiere is idle.
324
327
  // Only starts after 2s, so fast commands never touch the extra file.
325
328
  var busyFilePath = path.join(tempDir, "busy_" + id + ".json");
326
329
  var startedAt = new Date().getTime();
@@ -7,7 +7,7 @@
7
7
  })(this, function () {
8
8
  "use strict";
9
9
 
10
- var CURRENT_VERSION = "1.19.1";
10
+ var CURRENT_VERSION = "1.20.0";
11
11
  var PACKAGE_NAME = "premiere-pro-mcp";
12
12
  var LATEST_PACKAGE_API = "https://registry.npmjs.org/" + PACKAGE_NAME;
13
13
  var LATEST_RELEASE_API =
@@ -0,0 +1,263 @@
1
+ import { z } from "zod";
2
+ export declare const dialogueReviewSchema: z.ZodObject<{
3
+ expected_review_revision: z.ZodOptional<z.ZodString>;
4
+ selected_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
5
+ rejected_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
6
+ segments: z.ZodArray<z.ZodObject<{
7
+ id: z.ZodString;
8
+ source_project_item_id: z.ZodString;
9
+ transcript_revision: z.ZodString;
10
+ start_seconds: z.ZodNumber;
11
+ end_seconds: z.ZodNumber;
12
+ text: z.ZodString;
13
+ speaker_label: z.ZodOptional<z.ZodString>;
14
+ }, z.core.$strict>>;
15
+ silence_ranges: z.ZodOptional<z.ZodArray<z.ZodObject<{
16
+ source_project_item_id: z.ZodString;
17
+ start_seconds: z.ZodNumber;
18
+ end_seconds: z.ZodNumber;
19
+ }, z.core.$strict>>>;
20
+ filler_words: z.ZodOptional<z.ZodArray<z.ZodString>>;
21
+ minimum_silence_seconds: z.ZodOptional<z.ZodNumber>;
22
+ padding_seconds: z.ZodDefault<z.ZodNumber>;
23
+ }, z.core.$strict>;
24
+ export declare const quoteReviewSchema: z.ZodObject<{
25
+ segments: z.ZodArray<z.ZodObject<{
26
+ id: z.ZodString;
27
+ source_project_item_id: z.ZodString;
28
+ transcript_revision: z.ZodString;
29
+ start_seconds: z.ZodNumber;
30
+ end_seconds: z.ZodNumber;
31
+ text: z.ZodString;
32
+ speaker_label: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strict>>;
34
+ quote_order: z.ZodOptional<z.ZodArray<z.ZodString>>;
35
+ expected_review_revision: z.ZodOptional<z.ZodString>;
36
+ }, z.core.$strict>;
37
+ export declare const textReviewSchema: z.ZodObject<{
38
+ expected_review_revision: z.ZodOptional<z.ZodString>;
39
+ selected_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
+ rejected_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
41
+ entries: z.ZodArray<z.ZodObject<{
42
+ id: z.ZodString;
43
+ target_id: z.ZodString;
44
+ source_revision: z.ZodString;
45
+ kind: z.ZodEnum<{
46
+ mogrt_text: "mogrt_text";
47
+ caption_artifact: "caption_artifact";
48
+ }>;
49
+ original_text: z.ZodString;
50
+ proposed_text: z.ZodOptional<z.ZodString>;
51
+ }, z.core.$strict>>;
52
+ find_text: z.ZodOptional<z.ZodString>;
53
+ replace_text: z.ZodOptional<z.ZodString>;
54
+ }, z.core.$strict>;
55
+ export declare const syncReviewSchema: z.ZodObject<{
56
+ expected_review_revision: z.ZodOptional<z.ZodString>;
57
+ selected_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
58
+ rejected_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
59
+ matches: z.ZodArray<z.ZodObject<{
60
+ id: z.ZodString;
61
+ camera_source_id: z.ZodString;
62
+ recorder_source_id: z.ZodString;
63
+ camera_revision: z.ZodString;
64
+ recorder_revision: z.ZodString;
65
+ estimates: z.ZodArray<z.ZodObject<{
66
+ method: z.ZodEnum<{
67
+ timecode: "timecode";
68
+ waveform: "waveform";
69
+ dialogue: "dialogue";
70
+ }>;
71
+ offset_seconds: z.ZodNumber;
72
+ confidence: z.ZodNumber;
73
+ }, z.core.$strict>>;
74
+ }, z.core.$strict>>;
75
+ agreement_tolerance_seconds: z.ZodDefault<z.ZodNumber>;
76
+ minimum_confidence: z.ZodDefault<z.ZodNumber>;
77
+ }, z.core.$strict>;
78
+ export declare const brollReviewSchema: z.ZodObject<{
79
+ expected_review_revision: z.ZodOptional<z.ZodString>;
80
+ selected_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
81
+ rejected_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
82
+ placements: z.ZodArray<z.ZodObject<{
83
+ id: z.ZodString;
84
+ sequence_id: z.ZodString;
85
+ sequence_revision: z.ZodString;
86
+ timeline_start_seconds: z.ZodNumber;
87
+ quote: z.ZodString;
88
+ source_project_item_id: z.ZodString;
89
+ source_revision: z.ZodString;
90
+ source_start_seconds: z.ZodNumber;
91
+ source_end_seconds: z.ZodNumber;
92
+ reason: z.ZodString;
93
+ alternative_source_ids: z.ZodDefault<z.ZodArray<z.ZodString>>;
94
+ }, z.core.$strict>>;
95
+ }, z.core.$strict>;
96
+ export declare function reviewDialogue(input: unknown): {
97
+ cards: {
98
+ decision: "rejected" | "approved" | "pending";
99
+ context: {
100
+ before: string;
101
+ passage: string;
102
+ after: string;
103
+ };
104
+ context_truncated: boolean;
105
+ removable_range: {
106
+ source_project_item_id: string;
107
+ start_seconds: number;
108
+ end_seconds: number;
109
+ } | null;
110
+ id: string;
111
+ reason: import("../tools/dialogue-analysis.js").DialogueCandidateReason;
112
+ confidence: "deterministic" | "review_required";
113
+ source_project_item_id: string;
114
+ start_seconds: number;
115
+ end_seconds: number;
116
+ segment_ids: string[];
117
+ matched_text?: string;
118
+ }[];
119
+ approved_source_cut_ranges: {
120
+ source_project_item_id: string;
121
+ start_seconds: number;
122
+ end_seconds: number;
123
+ }[];
124
+ projected_removed_source_seconds: number;
125
+ pending_count: number;
126
+ limitations: string[];
127
+ review_revision: string;
128
+ applied: boolean;
129
+ host_verified: boolean;
130
+ approval_token: null;
131
+ verification_boundary: string;
132
+ };
133
+ export declare function reviewQuotes(input: unknown): {
134
+ library: import("../tools/dialogue-analysis.js").DialogueSegment[];
135
+ rows: {
136
+ output_start_seconds: number;
137
+ duration_seconds: number;
138
+ id: string;
139
+ source_project_item_id: string;
140
+ transcript_revision: string;
141
+ start_seconds: number;
142
+ end_seconds: number;
143
+ text: string;
144
+ speaker_label?: string;
145
+ }[];
146
+ output_duration_seconds: number;
147
+ csv: string;
148
+ limitations: string[];
149
+ review_revision: string;
150
+ applied: boolean;
151
+ host_verified: boolean;
152
+ approval_token: null;
153
+ verification_boundary: string;
154
+ };
155
+ export declare function reviewText(input: unknown): {
156
+ cards: {
157
+ changed: boolean;
158
+ decision: "rejected" | "approved" | "pending";
159
+ proposed_text: string;
160
+ id: string;
161
+ target_id: string;
162
+ source_revision: string;
163
+ kind: "mogrt_text" | "caption_artifact";
164
+ original_text: string;
165
+ }[];
166
+ approved_changes: {
167
+ changed: boolean;
168
+ decision: "rejected" | "approved" | "pending";
169
+ proposed_text: string;
170
+ id: string;
171
+ target_id: string;
172
+ source_revision: string;
173
+ kind: "mogrt_text" | "caption_artifact";
174
+ original_text: string;
175
+ }[];
176
+ limitations: string[];
177
+ review_revision: string;
178
+ applied: boolean;
179
+ host_verified: boolean;
180
+ approval_token: null;
181
+ verification_boundary: string;
182
+ };
183
+ export declare function reviewSync(input: unknown): {
184
+ cards: {
185
+ evidence_status: string;
186
+ offset_spread_seconds: number;
187
+ proposed_offset_seconds: number | null;
188
+ decision: "rejected" | "approved" | "pending";
189
+ id: string;
190
+ camera_source_id: string;
191
+ recorder_source_id: string;
192
+ camera_revision: string;
193
+ recorder_revision: string;
194
+ estimates: {
195
+ method: "timecode" | "waveform" | "dialogue";
196
+ offset_seconds: number;
197
+ confidence: number;
198
+ }[];
199
+ }[];
200
+ approved_matches: {
201
+ evidence_status: string;
202
+ offset_spread_seconds: number;
203
+ proposed_offset_seconds: number | null;
204
+ decision: "rejected" | "approved" | "pending";
205
+ id: string;
206
+ camera_source_id: string;
207
+ recorder_source_id: string;
208
+ camera_revision: string;
209
+ recorder_revision: string;
210
+ estimates: {
211
+ method: "timecode" | "waveform" | "dialogue";
212
+ offset_seconds: number;
213
+ confidence: number;
214
+ }[];
215
+ }[];
216
+ limitations: string[];
217
+ review_revision: string;
218
+ applied: boolean;
219
+ host_verified: boolean;
220
+ approval_token: null;
221
+ verification_boundary: string;
222
+ };
223
+ export declare function reviewBroll(input: unknown): {
224
+ cards: {
225
+ decision: "rejected" | "approved" | "pending";
226
+ timeline_end_seconds: number;
227
+ video_only: boolean;
228
+ id: string;
229
+ sequence_id: string;
230
+ sequence_revision: string;
231
+ timeline_start_seconds: number;
232
+ quote: string;
233
+ source_project_item_id: string;
234
+ source_revision: string;
235
+ source_start_seconds: number;
236
+ source_end_seconds: number;
237
+ reason: string;
238
+ alternative_source_ids: string[];
239
+ }[];
240
+ approved_placements: {
241
+ decision: "rejected" | "approved" | "pending";
242
+ timeline_end_seconds: number;
243
+ video_only: boolean;
244
+ id: string;
245
+ sequence_id: string;
246
+ sequence_revision: string;
247
+ timeline_start_seconds: number;
248
+ quote: string;
249
+ source_project_item_id: string;
250
+ source_revision: string;
251
+ source_start_seconds: number;
252
+ source_end_seconds: number;
253
+ reason: string;
254
+ alternative_source_ids: string[];
255
+ }[];
256
+ limitations: string[];
257
+ review_revision: string;
258
+ applied: boolean;
259
+ host_verified: boolean;
260
+ approval_token: null;
261
+ verification_boundary: string;
262
+ };
263
+ //# sourceMappingURL=editorial-review.d.ts.map