davinci-resolve-mcp 2.134.1 → 2.135.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/install.py +1 -1
- package/package.json +1 -1
- package/resolve-advanced/server/tools/audio.mjs +14 -4
- package/src/granular/common.py +1 -1
- package/src/server.py +1 -1
package/install.py
CHANGED
|
@@ -37,7 +37,7 @@ from src.utils.update_check import (
|
|
|
37
37
|
|
|
38
38
|
# ─── Version ──────────────────────────────────────────────────────────────────
|
|
39
39
|
|
|
40
|
-
VERSION = "2.
|
|
40
|
+
VERSION = "2.135.0"
|
|
41
41
|
# Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
|
|
42
42
|
# Resolve's scripting bridge loads into newer interpreters on recent builds
|
|
43
43
|
# (Python 3.14 verified against Resolve Studio 20.3.2). Older Resolve builds
|
package/package.json
CHANGED
|
@@ -22,9 +22,19 @@ function load(mod) {
|
|
|
22
22
|
return require(`../../vendor/audio/${mod}.js`);
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
// .strict(): a mistyped window key (start/duration/…) must refuse, not be
|
|
26
|
+
// silently stripped — a stripped window turned `trim` into a whole-file copy
|
|
27
|
+
// reported as success (measured through the MCP layer, E59 sweep). Extra
|
|
28
|
+
// ffmpeg knobs belong in `opts`, which stays passthrough.
|
|
29
|
+
const splitSchema = z.object({ input: z.string(), output: z.string().optional(), mode: z.string().optional(), opts: z.object({}).passthrough().optional() }).strict();
|
|
30
|
+
// durationFrames is REQUIRED: trim without a window is a no-op copy wearing
|
|
31
|
+
// a trim's name. Use `convert` for windowless transcodes. fps converts it to
|
|
32
|
+
// the vendored module's seconds vocabulary (default 24) — the module knows
|
|
33
|
+
// {startTime, endTime, duration} in SECONDS only, so an untranslated
|
|
34
|
+
// durationFrames was silently discarded and trim NEVER trimmed (measured
|
|
35
|
+
// through the MCP layer, E59: durationFrames 24 returned the whole file).
|
|
36
|
+
const trimSchema = z.object({ input: z.string(), output: z.string(), durationFrames: z.number().positive(), fps: z.number().positive().optional(), opts: z.object({}).passthrough().optional() }).strict();
|
|
37
|
+
const convertSchema = z.object({ input: z.string(), output: z.string(), opts: z.object({}).passthrough().optional() }).strict();
|
|
28
38
|
|
|
29
39
|
export const audioTool = {
|
|
30
40
|
name: 'audio',
|
|
@@ -41,7 +51,7 @@ export const audioTool = {
|
|
|
41
51
|
const p = trimSchema.parse(args);
|
|
42
52
|
const m = load('trim');
|
|
43
53
|
const fn = m.trimAudio || m.trim || m.default;
|
|
44
|
-
return fn(p.input, p.output, {
|
|
54
|
+
return fn(p.input, p.output, { duration: p.durationFrames / (p.fps ?? 24), ...(p.opts || {}) });
|
|
45
55
|
}
|
|
46
56
|
if (action === 'convert') {
|
|
47
57
|
const p = convertSchema.parse(args);
|
package/src/granular/common.py
CHANGED
|
@@ -87,7 +87,7 @@ if not logging.getLogger().handlers:
|
|
|
87
87
|
handlers=[logging.StreamHandler()],
|
|
88
88
|
)
|
|
89
89
|
|
|
90
|
-
VERSION = "2.
|
|
90
|
+
VERSION = "2.135.0"
|
|
91
91
|
logger = logging.getLogger("davinci-resolve-mcp")
|
|
92
92
|
logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
|
|
93
93
|
logger.info(f"Detected platform: {get_platform()}")
|