davinci-resolve-mcp 2.26.1 → 2.27.1

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 CHANGED
@@ -2,6 +2,77 @@
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.27.1
6
+
7
+ **Faster control-panel startup with network source media (issue #50)** — on
8
+ first open the control panel could sit on "connection pending" for a long time
9
+ when Media Pool clips lived on mounted network storage, because the UI only
10
+ treated the connection as live once the full media inventory finished loading,
11
+ and that inventory probed every clip's file path on disk.
12
+
13
+ Fixes and performance work:
14
+
15
+ - **Connection state is decoupled from the media inventory.** The overview and
16
+ diagnostics panels now derive "connected" from the `/api/boot` handshake (which
17
+ returns as soon as the Resolve bridge is reachable) and show inventory loading
18
+ separately, so Resolve reads as live immediately while clips stream in.
19
+ - **Parallel, cached file-existence probing.** `os.path.exists` for every clip
20
+ now runs in a thread pool and is memoized for a short TTL, instead of two serial
21
+ `stat()` calls per clip — the dominant cost on network storage.
22
+ - **Background polls reuse the cached Media Pool walk.** The recurring poll no
23
+ longer re-runs the ~N serial `GetClipProperty` calls; it reuses the last walk
24
+ and re-applies only the local, disk-backed analysis-status overlay. A cheap
25
+ project-id check still catches a project switched directly in Resolve, and a
26
+ manual refresh always does a full walk.
27
+ - **Resolve scripting API access is serialized.** A re-entrant lock guards every
28
+ scripting-API entry point, since the dashboard's threaded HTTP server could
29
+ previously fire concurrent (thread-unsafe) Resolve calls at startup.
30
+ - **ETag/304 on the inventory endpoint** skips transfer and table re-render when
31
+ nothing changed; the last good inventory is cached client-side and painted
32
+ instantly on reload; and the first inventory build is warmed in a background
33
+ thread at server start.
34
+
35
+ No public MCP tool surface changed. Adds regression tests in
36
+ `tests/test_media_analysis.py` (path-existence probing, inventory cache reuse,
37
+ project-switch detection, lock reentrancy).
38
+
39
+ ## What's New in v2.27.0
40
+
41
+ **Frame-sampling modes (issue #46)** — how many frames a clip gets for visual
42
+ analysis is now governed by a `sampling_mode`, decoupled from `depth` (which
43
+ still controls which layers run). A fixed frame count over-sampled short clips
44
+ and under-covered long ones; the demand-driven engine already scaled by
45
+ duration/content, but the caps layer was flat-truncating its output back to 8
46
+ frames — that flat cap was the real cause of long-clip under-coverage.
47
+
48
+ Four clearly-tiered modes, organized so token cost is predictable per tier:
49
+
50
+ - **Economy** (`fixed`) — flat N evenly-spaced, content-blind frames. Cheapest and
51
+ most predictable; good for proxies/triage.
52
+ - **Balanced** (`per_minute`) — `clamp(minutes × frames_per_minute, floor, ceiling)`
53
+ (defaults 4/min, 3–80). Cost is linear in footage length; content-blind.
54
+ - **Thorough** (`adaptive_capped`, recommended/default) — content-aware: samples
55
+ shot boundaries, representatives, and flash candidates, bounded to `[floor,
56
+ ceiling]`. Best coverage with a bounded cost.
57
+ - **Thorough (uncapped)** (`adaptive`) — content-aware with no per-clip ceiling
58
+ (up to the 512-frame hard cap). Use only when clips are short or few.
59
+
60
+ The first time you analyze without a saved default, the tool returns a
61
+ `confirmation_required` response with a `sampling_mode_prompt`; choosing a mode
62
+ saves it as your standing default (mirrors `timed_markers_default`). Pass
63
+ `sampling_mode` per call any time for a one-off that doesn't change the default.
64
+ Tunables (`frames_per_minute`, `frame_floor`, `frame_ceiling`) and the mode are
65
+ all exposed in the control panel (Preferences → Frame sampling mode) with a live
66
+ per-clip token-cost estimate; batch jobs honor the saved default.
67
+
68
+ Analysis-caps presets were retuned so `frames_per_clip` is now a *safety ceiling*
69
+ (minimal/standard/generous = 12/80/200), not the primary frame dial, and the
70
+ per-clip/job/day vision-token caps were raised so the default Thorough mode isn't
71
+ refused by the per-clip token cap. Cache reuse re-samples only when switching up
72
+ the thoroughness rank; a richer prior report still satisfies a cheaper mode. Adds
73
+ `tests/test_sampling_modes.py` (30 tests). Validated end-to-end on a synthetic
74
+ multi-shot clip with real ffmpeg frame extraction.
75
+
5
76
  ## What's New in v2.26.1
6
77
 
7
78
  **Python 3.13 / 3.14 support (issue #45)** — `npx davinci-resolve-mcp setup`
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # DaVinci Resolve MCP Server
2
2
 
3
- [![Version](https://img.shields.io/badge/version-2.26.1-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
3
+ [![Version](https://img.shields.io/badge/version-2.27.1-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
4
4
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
5
5
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
6
6
  [![Tools](https://img.shields.io/badge/MCP%20Tools-32%20(329%20full)-blue.svg)](#server-modes)
package/docs/SKILL.md CHANGED
@@ -468,6 +468,16 @@ for existing reports. `quick` uses ffprobe metadata; `standard` adds ffmpeg
468
468
  read-through checks,
469
469
  cut-boundary analysis from full-stream scene detection, flash-frame candidates,
470
470
  motion/variance scoring, analysis keyframes, and sidecar reports.
471
+ `depth` controls which layers run; a separate `sampling_mode` controls how many
472
+ frames each clip gets for visual analysis (and thus token cost): `fixed`
473
+ (Economy, flat content-blind frames), `per_minute` (Balanced, frames scale with
474
+ duration), `adaptive_capped` (Thorough, content-aware bounded to
475
+ `[frame_floor, frame_ceiling]` — recommended/default), or `adaptive` (Thorough
476
+ uncapped). When no default is saved, the first analyze returns
477
+ `confirmation_required` with a `sampling_mode_prompt`; choosing a mode saves it
478
+ as the default. Pass `sampling_mode` per call for a one-off. The mode owns frame
479
+ count — `analysis_caps.frames_per_clip` is a safety ceiling above it, not the
480
+ primary dial.
471
481
  By default, planning checks the active project's analysis root and bounded
472
482
  related project-version roots for existing reports, then marks matching clips
473
483
  `skip_execution=true` when those reports already contain the requested
@@ -93,6 +93,33 @@ FFprobe is required. If missing:
93
93
  via host_chat_paths (finalized per clip with commit_vision, ~2-5 minutes per
94
94
  file plus host-chat read time)
95
95
 
96
+ `depth` controls *which layers run*. How many frames each clip gets for visual
97
+ analysis is a separate axis — the **sampling mode** — because a fixed frame count
98
+ over-samples short clips and under-covers long ones.
99
+
100
+ ### 3b. Frame-sampling mode
101
+
102
+ Pass `sampling_mode` on any analyze action, or set a standing default in the
103
+ control panel (Preferences → Frame sampling mode). The mode owns frame count and
104
+ thus token cost; `analysis_caps.frames_per_clip` is now a safety ceiling above it,
105
+ not the primary dial.
106
+
107
+ - **Economy** (`fixed`) — flat N frames (depth-derived, default 8) regardless of
108
+ clip length. Cheapest and most predictable; good for proxies/triage.
109
+ - **Balanced** (`per_minute`) — `frames = clamp(minutes × frames_per_minute, floor,
110
+ ceiling)` (defaults 4/min, 3–80). Cost is linear in footage length; content-blind.
111
+ - **Thorough** (`adaptive_capped`, **recommended**) — content-aware: samples shot
112
+ boundaries, representatives, and flash candidates, bounded to `[floor, ceiling]`
113
+ (3–80). Best coverage with a bounded cost.
114
+ - **Thorough (uncapped)** (`adaptive`) — content-aware with no per-clip ceiling
115
+ (up to the absolute 512-frame hard cap). Use only when clips are short or few.
116
+
117
+ Tunables (`frames_per_minute`, `frame_floor`, `frame_ceiling`) apply to Balanced
118
+ and Thorough. The first time you analyze without a saved default, the tool returns
119
+ a `confirmation_required` response with a `sampling_mode_prompt`; re-run with
120
+ `sampling_mode=<choice>` (which saves it as your default) or pick it in the panel.
121
+ Pass `sampling_mode` explicitly any time for a one-off that doesn't change the default.
122
+
96
123
  ---
97
124
 
98
125
  ## Analysis Commands
package/install.py CHANGED
@@ -35,7 +35,7 @@ from src.utils.update_check import (
35
35
 
36
36
  # ─── Version ──────────────────────────────────────────────────────────────────
37
37
 
38
- VERSION = "2.26.1"
38
+ VERSION = "2.27.1"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.26.1",
3
+ "version": "2.27.1",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",