davinci-resolve-mcp 2.44.0 → 2.45.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.
- package/CHANGELOG.md +40 -0
- package/README.md +3 -3
- package/docs/SKILL.md +35 -0
- package/install.py +1 -1
- package/package.json +1 -1
- package/src/granular/common.py +1 -1
- package/src/server.py +506 -1
- package/src/utils/analysis_store.py +20 -2
- package/src/utils/destructive_hook.py +5 -0
- package/src/utils/edit_engine.py +646 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
Release history for the DaVinci Resolve MCP Server. The latest release is summarized in the root README; older entries live here to keep the README focused.
|
|
4
4
|
|
|
5
|
+
## What's New in v2.45.0
|
|
6
|
+
|
|
7
|
+
The edit engine — Phase E, the final phase of the analysis + edit-engine
|
|
8
|
+
program. Three evidence-driven loops on one shared skeleton: evidence query
|
|
9
|
+
→ dry-run plan with per-decision rationale → confirm token → versioned
|
|
10
|
+
timeline ops → metric readback → brain_edits rows.
|
|
11
|
+
|
|
12
|
+
- **Added** a new `edit_engine` MCP tool (compound tool count: 34):
|
|
13
|
+
- `plan_selects` / `execute_selects` — ranks shots by deep-tier
|
|
14
|
+
`editorial.select_potential` and best moments (clip-level fallback for
|
|
15
|
+
standard-analyzed clips), story-spine order, duration budget; execution
|
|
16
|
+
builds a NEW selects timeline from per-shot source ranges. Additive.
|
|
17
|
+
- `plan_tighten` / `execute_tighten` — dead-air lifts from transcript-gap
|
|
18
|
+
evidence per timeline item (no transcript → reported in `skipped`,
|
|
19
|
+
never silently trimmed); execution assembles a tightened VARIANT
|
|
20
|
+
timeline from keep ranges (true partial trims via the range-copy
|
|
21
|
+
kernel) — the original timeline is never mutated.
|
|
22
|
+
- `plan_swap` / `execute_swap` — alternates for a timeline item via the
|
|
23
|
+
visual-similarity index, filtered to shots that can fill the slot
|
|
24
|
+
exactly; execution replaces the item in place (lift + positioned
|
|
25
|
+
append) on the version-archived timeline.
|
|
26
|
+
- `list_plans` / `get_plan` — plans persist under `memory/edit_plans/`
|
|
27
|
+
with content fingerprints; a stale or tampered plan refuses to execute.
|
|
28
|
+
- **Added** `src/utils/edit_engine.py` (DB-only planning/evidence layer) and
|
|
29
|
+
`tests/live_edit_engine_validation.py` (disposable-project live harness).
|
|
30
|
+
execute_* actions are confirm-token gated and registered with the
|
|
31
|
+
version-on-mutate hook (archive + brain_edits come from the same
|
|
32
|
+
machinery as every other destructive op).
|
|
33
|
+
- **Fixed** frame→shot mapping in the analysis store: frames now fall back
|
|
34
|
+
to time-containment when a report's shots don't record
|
|
35
|
+
`frame_indices_used` (commit paths that omit it previously produced no
|
|
36
|
+
shot-level visual vectors).
|
|
37
|
+
- **Validation**: full offline suite (1118 tests; 13 new). Live pilot on a
|
|
38
|
+
disposable synthetic-media Resolve project (ffmpeg + spoken audio):
|
|
39
|
+
20/20 checks — selects timeline assembled (2 decisions), tighten variant
|
|
40
|
+
removed exactly the 15.2s of transcript dead air while keeping the
|
|
41
|
+
spoken 4.8s (original untouched), swap replaced the item with a 0.92
|
|
42
|
+
cosine alternate, brain_edits rationale rows present for all three
|
|
43
|
+
loops, timeline versions archived.
|
|
44
|
+
|
|
5
45
|
## What's New in v2.44.0
|
|
6
46
|
|
|
7
47
|
Cross-clip entities + bin briefing v2 — Phase D of the analysis +
|
package/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# DaVinci Resolve MCP Server
|
|
2
2
|
|
|
3
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
4
4
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
5
5
|
[](docs/reference/api-coverage.md)
|
|
6
|
-
[-blue.svg)](#server-modes)
|
|
7
7
|
[](docs/reference/api-coverage.md#test-results)
|
|
8
8
|
[](https://www.blackmagicdesign.com/products/davinciresolve)
|
|
9
9
|
[](https://www.python.org/downloads/)
|
|
@@ -49,7 +49,7 @@ The command starts a localhost server and opens the control panel in your browse
|
|
|
49
49
|
|
|
50
50
|
| Mode | Entry point | Tools | Best for |
|
|
51
51
|
|------|-------------|-------|----------|
|
|
52
|
-
| Compound | `src/server.py` |
|
|
52
|
+
| Compound | `src/server.py` | 34 | Default mode for most assistants. Related Resolve operations are grouped behind action parameters to keep context usage low. |
|
|
53
53
|
| Full / granular | `src/server.py --full` or `src/resolve_mcp_server.py` | 341 | Power users who want one MCP tool per Resolve API method. |
|
|
54
54
|
|
|
55
55
|
The compound server is recommended unless you specifically need the granular one-tool-per-method surface.
|
package/docs/SKILL.md
CHANGED
|
@@ -671,6 +671,41 @@ only when that mutation is intentional.
|
|
|
671
671
|
|
|
672
672
|
### Timelines
|
|
673
673
|
|
|
674
|
+
**`edit_engine`** — Evidence-driven edit loops (v2.45.0+): selects assembly,
|
|
675
|
+
tighten, swap.
|
|
676
|
+
|
|
677
|
+
Every loop is plan → confirm → execute. plan_* actions are dry-run by
|
|
678
|
+
construction: they query the DB-canonical analysis store and return a
|
|
679
|
+
per-decision rationale plus a stored `plan_id` (plans persist under
|
|
680
|
+
`memory/edit_plans/` with a content fingerprint, so a stale plan cannot run
|
|
681
|
+
against a changed project). execute_* actions require a `confirm_token`, run
|
|
682
|
+
under the version-on-mutate hook, and return before/after duration and
|
|
683
|
+
clip-count readback plus `brain_edits` rationale rows.
|
|
684
|
+
|
|
685
|
+
- `plan_selects(min_select_potential?, max_duration_seconds?, max_shots?,
|
|
686
|
+
timeline_name?, analysis_root?)` — ranks shots by deep-tier
|
|
687
|
+
`editorial.select_potential` / best moments (clip-level fallback for
|
|
688
|
+
standard-analyzed clips), story-spine order.
|
|
689
|
+
`execute_selects(plan_id)` creates a NEW selects timeline from the plan's
|
|
690
|
+
per-shot source ranges — additive; nothing existing is touched.
|
|
691
|
+
- `plan_tighten(timeline_name?, target_ratio?, min_pause_seconds?,
|
|
692
|
+
handle_seconds?)` — dead-air lifts from transcript-gap evidence for each
|
|
693
|
+
timeline item (items without transcripts are reported in `skipped`, never
|
|
694
|
+
silently trimmed). `execute_tighten(plan_id)` assembles a tightened
|
|
695
|
+
VARIANT timeline from the plan's keep ranges — true partial trims; the
|
|
696
|
+
original timeline is never mutated.
|
|
697
|
+
- `plan_swap(timeline_start_frame | item_name, kind="visual"|"text",
|
|
698
|
+
limit?)` — alternates for one timeline item via the similarity index,
|
|
699
|
+
filtered to shots long enough to fill the slot exactly.
|
|
700
|
+
`execute_swap(plan_id, alternate_index)` replaces the item in place
|
|
701
|
+
(lift + positioned append at the same record frame) on the
|
|
702
|
+
version-archived timeline.
|
|
703
|
+
- `list_plans(limit?)` / `get_plan(plan_id)`.
|
|
704
|
+
|
|
705
|
+
The engine needs the analysis substrate: analyzed clips in the DB (run
|
|
706
|
+
`db_ingest` on older roots), transcripts for tighten, and visual embeddings
|
|
707
|
+
(`build_embeddings(kinds=['visual'])`) for swap.
|
|
708
|
+
|
|
674
709
|
**`timeline_versioning`** — Version-on-mutate, archive, rollback, brain-edit history (C6).
|
|
675
710
|
|
|
676
711
|
Every destructive timeline op (compound, captions, ripple delete, gap close,
|
package/install.py
CHANGED
|
@@ -35,7 +35,7 @@ from src.utils.update_check import (
|
|
|
35
35
|
|
|
36
36
|
# ─── Version ──────────────────────────────────────────────────────────────────
|
|
37
37
|
|
|
38
|
-
VERSION = "2.
|
|
38
|
+
VERSION = "2.45.0"
|
|
39
39
|
# Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
|
|
40
40
|
# Resolve's scripting bridge loads into newer interpreters on recent builds
|
|
41
41
|
# (Python 3.14 verified against Resolve Studio 20.3.2). Older Resolve builds
|
package/package.json
CHANGED
package/src/granular/common.py
CHANGED
|
@@ -80,7 +80,7 @@ if not logging.getLogger().handlers:
|
|
|
80
80
|
handlers=[logging.StreamHandler()],
|
|
81
81
|
)
|
|
82
82
|
|
|
83
|
-
VERSION = "2.
|
|
83
|
+
VERSION = "2.45.0"
|
|
84
84
|
logger = logging.getLogger("davinci-resolve-mcp")
|
|
85
85
|
logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
|
|
86
86
|
logger.info(f"Detected platform: {get_platform()}")
|