Repository navigation
Releases: ZeusSheen/ppro-agent-bridge
Release list
v0.6.0 - the icon, a friendlier panel, the silent-clip fix
A big release: an icon and a friendlier Premiere panel, about twenty new commands, a fix for cut clips that played silent, and a security fix.
Important if you cut with 0.4.0 – 0.5.1
On Premiere 27.1, a piece made by split_clip or cut_range could look right on the timeline but render silent (audio) or empty (picture). The cause was a Premiere bug when a clip is moved past another clip; 0.6.0 no longer makes that move, and the panel refuses it. To check an older timeline, ask your helper to run review_cuts --render and export_frames over it: a silent audio piece is re-placed with the same source range, a blank picture piece is nudged a frame and back. split_clip, cut_range and extend_cut take a new --render-check that plays every piece they made.
The panel
- The new icon sits at the top of the panel: in full colour while the bridge is running, faded when it is not.
- A first run shows two steps: open Claude Code or Codex in a folder for the job, then paste a ready-made first message. The message already says where the bridge is installed, so the helper can do the rest.
- A Start bridge button appears when the bridge is not running.
- The panel speaks Chinese in a Chinese Premiere, English otherwise.
New commands
- Sequences:
set_active_sequence,list_sequences,clone_sequence(a restore point before a risky edit),save_project. - Markers:
list_markers,remove_marker. - Clean-up:
remove_transition,remove_effect,remove_keyframes,remove_project_items. - Timing:
shift_itemsmoves everything after a time on every track in one undo step. - Media:
subclip,relink,select_items. - Export and effects:
list_presets,export_video(renders with no time limit,--detach),list_effects,add_audio_effect,list_effect_presets,apply_preset(Premiere's.prfpsetpresets). set_paramssets keyframe interpolation ("interpolation"), and puts new effects on a title before its text layer, where they work.
Every write has a dry run, refuses before changing anything, is one labelled undo step where Premiere allows, and is read back.
Changed behaviour
set_volumeandset_scalewith--from/--totake only the clips entirely inside the range, likeremove_items.--mode overlapgives the old behaviour.
Security
- The bridge refuses to start when another program already holds its port (127.0.0.1:8017 or [::1]:8017) and names that program. Before, the panel could connect to the other program.
- Network share paths (
\\server\share) and Windows device paths are refused by the command line and by the panel, so Premiere never offers your Windows credentials to another computer. Put NAS media on a mapped drive letter. - Every write can carry the timeline's fingerprint (
--expect-fingerprint) and is refused if the timeline changed since it was read. - The broker refuses more than 300 writes a minute, a guard against a runaway script.
New install
- Download
ppro-agent-bridge-v0.6.0.zipbelow, right-click it and choose Extract All. - Double-click
1 Install Premiere Agent Bridge.batat the top of the extracted folder. The setup window checks your computer, fixes what is missing and puts a Premiere Agent Bridge shortcut on your desktop and in the Start menu. - Double-click that shortcut (or
2 Start Premiere Agent Bridge.bat), then open the Agent Bridge panel in Premiere. The panel tells you what to send your AI helper.
Upgrading from 0.5.x
- Close the bridge window.
- Replace your bridge folder with the
ppro-agent-bridgefolder from the zip. - Double-click
2 Start Premiere Agent Bridge.bat(orstart_bridge.batinside the folder). It reloads the panel in Premiere, sopingsays"compatible": true. To get the new desktop shortcut, run1 Install Premiere Agent Bridge.batonce.
Tests: 776 unit tests on synthetic data. The release zip passed the headless end-to-end run, which covers every command against the fake panel, the pairing token, the audit log, origin checks, a second panel refused, and ping over IPv6. B1 and the new panel commands were checked live on Premiere 27.1.
v0.5.1 - the setup window in black and white
A small release: the setup window now looks like the new project page (linked in the repository's About box).
The setup window in black and white
Double-click setup_bridge.bat and the window that checks your computer is now:
- pure black, black and white, with a thin glass rim of light on its panels;
- serif step titles and white main buttons;
- without the blurred background haze (it showed bands on near-black screens) and without the grey halos around cards.
Green, amber and red still mark "ready", "optional" and "needs setup", always with an icon and a word. The light theme (the sun/moon button) is black and white too.
Nothing else changed: the same commands, the same Premiere panel, the same setup steps.
Upgrading from 0.5.0
- Replace the bridge folder with this one.
- Close the bridge window and double-click
start_bridge.batagain. It reloads the panel in Premiere, sopingsays"compatible": trueagain.
Tests: 488 unit tests on synthetic data; the release zip passed the headless end-to-end run (every command against the fake panel, pairing token, audit log, origin checks).
v0.5.0 - one-click start, pairing token, and everything from 0.4
The biggest update since the first release. 0.4.0 was never published on its own, so this release carries all of it — a listening report, razor-free editing, Premiere Speech-to-Text, effects from the CLI, one action contract — plus 0.5: double-click start-up without clicking Load, a pairing token and an audit log, fixes from three real editing jobs, and a probe of what Premiere's UXP API really does.
Upgrading from 0.3.2 is a breaking change: run the CLI, broker and panel from the same 0.5.0 folder (the broker refuses older CLIs), and read "Changes visible to scripts" below if you call the bridge from your own code.
New in 0.5
Start it with a double-click
setup_bridge.bat (once) opens a setup window of its own (Edge app mode: no address bar or tabs, no console left open) that walks through the machine step by step, in English or Chinese: Python, the Python packages, Premiere (at least the panel's minimum, 26.3), UXP Developer Tool, developer mode, the optional ffmpeg / Pillow / faster-whisper, then a desktop shortcut, starting with Windows and starting the bridge. Each fix is a button; the window checks again whenever you come back to it. Without Python it opens a page that explains how to install it. setup_bridge.bat --console is the same check as text (python -m ppro_bridge.doctor), and python -m ppro_bridge.setup_ui --demo shows the window on made-up data. Its animated icons are Material Line Icons and SVG Spinners (both MIT, see THIRD_PARTY_NOTICES.md).
start_bridge.bat (every day) runs the broker with --load-panel: it starts UXP Developer Tool minimized when it is not running and loads the panel into Premiere whenever Premiere connects to UXP Developer Tool. No more clicking Load.
UXP Developer Tool still has to run: Premiere only connects to a developer service that UXP Developer Tool announces through Adobe's own IPC, so the bridge drives UXP Developer Tool's command-line service instead of replacing it (ppro_bridge/devloader.py; python -m ppro_bridge.devloader loads once). Loading by hand (UXP Developer Tool → Add Plugin → Load) still works.
Pairing token and audit log
On its first start the broker writes a random token to %USERPROFILE%.ppro-agent-bridge\token; the CLI and any script using ppro_bridge send it on every connection. (Not in %LOCALAPPDATA%: Windows gives packaged apps such as the Claude desktop app a private copy of it, so a CLI run from one would read a different token than a broker started by double-click.) A client without it — including a CLI older than 0.5 — is refused with AUTH_FAILED and nothing reaches Premiere. PPRO_BRIDGE_TOKEN / PPRO_BRIDGE_TOKEN_FILE override it for both sides. The browser Origin check stays.
Every request, refusal and panel (dis)connection is logged as one JSON line in %USERPROFILE%.ppro-agent-bridge\audit\audit-YYYY-MM-DD.jsonl: action, read/write, shortened params, guard, outcome, queue and run time. 30 days are kept; PPRO_AUDIT_DIR moves it, PPRO_AUDIT_DIR=off turns it off. The token is never logged.
Fixes from real jobs
Clip swaps (replace_clip, from a language-version swap): transitions are attributed by owner and side, so a neighbour's outgoing fade is no longer taken as the clip's own (and is put back exactly when the removal takes it); off-centre or handle-less shared transitions, and effects the new clip cannot get (such as Premiere 27's colour-tool container), are refused before anything is written (--skip-effect leaves one behind); an explicit --in/--out snaps to the nearest source frame. set_params gained a dry run.
Transitions: add_transition refuses an edit point that already has one (TRANSITION_EXISTS; Premiere would keep the old one) and verifies the result from OTIO.
Breathing room (extend_cut, from a re-cut): lists keyframed Level/Opacity on the clips it lengthens (heldKeyframes) and refuses an extension that a fade would hold silent or invisible (KEYFRAMED; --allow-silent to go ahead).
Listening report: the shadow mix refuses clips without a media file (NO_MEDIA) — Enhance Speech results and other generated items used to mix as silence; use --render there.
Frame export: all-black PNGs are flagged (black, with a warning), the reply reports the PNG size and how long the export took, and the file is polled every 50 ms instead of 500 ms.
Dry runs of remove_items, set_scale and set_volume honour --expect-seq.
What does this Premiere build's UXP API really do?
Groundwork for porting a much larger catalogue of editing tools to UXP: - probe_api (panel action and CLI) lists every class, method and instance member of the running build's UXP API and checks a watch list of the calls a port needs; --diff old.json shows what changed after a Premiere update. - tests/live/api_smoke.py runs the panel's api_smoke cases in a PAB_TEST* project, on scratch clips after the end of the sequence, undoing each case and listing anything it could not undo. - Result on Premiere 27.1.0 (build 21): almost every documented call tried works — removing markers, transitions, effects and keyframes, hold keyframes, adding Lumetri and audio effects (by display name), cloning, activating and deleting sequences, subclips, bins, relinking, custom properties, FCP XML and video export, saving. Two did not: changing a sequence's frame size through createSetSettingsAction had no effect, and AAF export waits on a modal log dialog (opt-in: --aaf). The only missing call on the watch list is a native razor.
Also in this release (0.4.0, never published separately)
Hear the cut
UXP can't play or meter audio, so the bridge listens offline. review_cuts rebuilds the dialogue track from the source files (or has Premiere render its own mix with --render, about a second per minute, plus integrated loudness and true peak) and measures every cut: too little breathing room before or after the words, a word cut off, room tone jumping, a click. The same report lints the timeline for slivers, near-miss V/A cuts, gaps and edges off the frame grid. lint_timeline and export_audio are available on their own.
Cut without a razor, keep the editor's work
Premiere 27.1 exposes no razor to UXP, and re-placing source ranges loses clip volume, scaling and effects. These commands build every piece from the clip itself: - split_clip --track V1 --at s — clone, trim, move; both halves keep every attribute. - cut_range --from a --to b — remove a range from every track and close the gap on all of them in one undo step, so tracks with gaps stay in sync. - extend_cut --at s --out 0.3 --in 0.25 — open a cut up with more of the clips' own source. - conform_captions --track V3 --srt f.srt — trims pieces of a pre-rendered caption movie that would flash the wrong line at a cut. - set_volume --track A1 --at s --db -6 — clip volume in dB as Premiere shows it; set_params and inspect_items work on audio tracks too. - snap_edges puts clip edges that drifted microseconds off the frame grid back on it; every position the bridge writes now lands on an exact frame.
Every step is read back and the whole timeline compared with the plan; dry runs plan the exact steps without writing.
Premiere Speech-to-Text
transcribe_clip --item "name" [--language en-US] [--wait 600] [--output f.json] runs Premiere's built-in transcription (26.5+) and saves the transcript. Local Whisper (transcribe.py) stays the default and writes valid Adobe language codes.
Effects from the CLI, with explicit keyframe time
set_params --track V2 --at s --json params.json writes effect params and keyframes; every keyframe list states its time base (media, clip or sequence), the whole request is validated before anything is written, and occurrence addresses repeated effects. add_transition --track V2 --at s --match-name "…" --duration 0.5 --edge start|end.
Transcripts that verify themselves
import_transcript checks the file, imports it, reads it back and compares word counts (TRANSCRIPT_NOT_IMPORTED for some 26.x builds' empty-import bug), and needs --replace to overwrite. export_transcript takes bin paths and refuses ambiguous names.
Safer protocol
ping reports protocol, per-build capabilities (--probe), a code hash (a warning when the loaded panel is stale) and a host denylist.
One action spec (ppro_bridge/actions.json, 27 panel actions) that the panel, the fake panel and the CLI are tested against: unknown or mistyped params are refused before Premiere is touched, every error has a code, outcomes are not_committed, committed, partial or unknown.
Requests can be pinned to a project/sequence (name, prefix or guid); the panel checks the pin on the very object it edits. --expect-seq on writes.
Commands that need the new panel refuse an old one (PANEL_OUTDATED).
From 0.3.3: source in/out points no longer lose a frame to float rounding, the broker sends one request at a time, the panel runs requests in order with a watchdog, apply_plan verifies the audio leg too.
Under the hood
The CLI is the ppro_bridge package (python -m ppro_bridge …, one function per command in ppro_bridge.ops); cli/ppro.py and the other scripts keep working. The panel is split into modules. One VERSION file; docs and skill copies are generated (scripts/sync_version.py). A fake panel answers every action, panel code is tested on Node, and live tests write only into projects named PAB_TEST*.
Changes visible to scripts
0.5: controllers must send the pairing token (ppro_bridge.transport does it for you); a 0.3/0.4 CLI cannot talk to a 0.5 broker.
0.4: unknown or mistyped params are refused (BAD_PARAMS); keyframes need a timeBase; export_transcript refuses empty placeholder transcripts and ambiguous names; import_transcript needs --replace to overwrite; CLI output no longer carries id/broker, error messages start with :, import_media lists missing files under data.missing; failed reads report not_committed; output is UTF-8; the transcript digest attaches punctuation tokens (sentence counts can change). cli/ppro.py keeps its 0.3.3 names...
v0.3.2 — edit plans, finishing tools, clip swaps
From a talking-head rough cut (v0.2) to B-roll, graphics and language-version swaps on a real timeline.
New
Edit plans — apply_plan plan.json: a JSON list of placements and notes, executed in one pass. Dry run first; imports into a bin, snaps every edge to the frame grid, routes B-roll audio to a free track (never A1 by default), refuses to overwrite occupied tracks, then re-reads the timeline and marks each step placed only if it is really there.
Timeline as JSON — get_sequence (frame size, fps, duration, tracks), list_items, list_project_items.
Effect-preserving clip swaps — inspect_items shows what an editor did to each clip (Motion, Opacity, filters, keyframes); replace_clip swaps the media and carries over source range, params, added filters and edge transitions, then verifies the result to within a frame.
Finishing tools — set_scale --fit/--fill/--value, set_fps (interpret footage), add_marker, remove_items (only clips entirely inside the range by default).
Contact sheets — export_frames --at 4,18.5,31.6 --sheet. Frame export now defaults to the sequence size, so vertical sequences stay vertical.
Version handshake — ping reports whether the loaded panel matches the CLI.
Fixed
import_media on Premiere 27.1 (needs a real target bin).
One-frame errors from 60 vs 59.94 interpretation, end-of-media clamping and transition tick rounding.
Security
The broker now refuses WebSocket connections from web pages. Before, any website open in a browser could connect to the local broker while it was running. Requires websockets>=14.
Upgrading from 0.2
pip install -r requirements.txt
In UXP Developer Tool, reload the Agent Bridge panel (the CLI refuses an old panel and says so).
Restart python broker/broker.py.
Headless testing without Premiere: broker/fake_panel.py keeps an in-memory timeline, so you can try apply_plan, list_items, set_scale and remove_items end to end.
Tested on Premiere Pro 26.x–27.1 / Windows 11. Still experimental; see Known limitations in the README.
v0.2.0 — first public release
First public release.
- Local Whisper transcription (faster-whisper, CUDA auto-detect) → Adobe-format transcript JSON
- Sentence-level timeline editing: place any source range as one labelled, undoable operation
- Three-layer closed loop: transcript digest (semantic) + OpenTimelineIO export (structure) + program-output frame export (perception)
- Ten whitelisted panel commands over a localhost-only WebSocket bridge — no eval, no remote access
- Pre-wired for Claude Code (
.claude/skills/) and Codex (AGENTS.md)
Tested on Premiere Pro 26.x / Windows 11. Experimental — see Known limitations in the README.