davinci-resolve-mcp 2.57.5 → 2.58.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 (327) hide show
  1. package/AGENTS.md +20 -0
  2. package/CHANGELOG.md +166 -2
  3. package/LICENSE +1 -1
  4. package/README.md +73 -1
  5. package/bin/davinci-resolve-advanced-mcp.mjs +20 -0
  6. package/docs/README.md +19 -0
  7. package/docs/SKILL.md +62 -1
  8. package/docs/contributing.md +1 -1
  9. package/docs/guides/control-panel.md +9 -0
  10. package/docs/kernels/README.md +21 -0
  11. package/docs/kernels/audio-fairlight-kernel.md +22 -0
  12. package/docs/kernels/color-grade-kernel.md +51 -0
  13. package/docs/kernels/fusion-composition-kernel.md +17 -0
  14. package/docs/kernels/media-pool-ingest-kernel.md +20 -0
  15. package/docs/kernels/render-deliver-kernel.md +32 -0
  16. package/docs/kernels/timeline-conform-interchange-kernel.md +39 -0
  17. package/docs/kernels/timeline-edit-kernel.md +17 -0
  18. package/docs/process/release-process.md +29 -7
  19. package/docs/reference/api-coverage.md +1 -1
  20. package/install.py +27 -4
  21. package/package.json +23 -2
  22. package/resolve-advanced/README.md +194 -0
  23. package/resolve-advanced/package.json +50 -0
  24. package/resolve-advanced/server/black-balance.mjs +92 -0
  25. package/resolve-advanced/server/capabilities.mjs +86 -0
  26. package/resolve-advanced/server/cdl-io.mjs +76 -0
  27. package/resolve-advanced/server/contrast-normalize.mjs +180 -0
  28. package/resolve-advanced/server/db-patch.mjs +91 -0
  29. package/resolve-advanced/server/deliverable-entities.mjs +86 -0
  30. package/resolve-advanced/server/deliverable-qc.mjs +270 -0
  31. package/resolve-advanced/server/editorial.mjs +370 -0
  32. package/resolve-advanced/server/exposure-level.mjs +129 -0
  33. package/resolve-advanced/server/extract-frames.mjs +196 -0
  34. package/resolve-advanced/server/ffprobe-media.mjs +88 -0
  35. package/resolve-advanced/server/gamut-legal.mjs +112 -0
  36. package/resolve-advanced/server/grade-body-patch.mjs +246 -0
  37. package/resolve-advanced/server/grade-transfer.mjs +66 -0
  38. package/resolve-advanced/server/group-grade-read.mjs +137 -0
  39. package/resolve-advanced/server/index.mjs +105 -0
  40. package/resolve-advanced/server/lib.mjs +84 -0
  41. package/resolve-advanced/server/libs.mjs +65 -0
  42. package/resolve-advanced/server/lineage-db.mjs +479 -0
  43. package/resolve-advanced/server/lut-apply.mjs +61 -0
  44. package/resolve-advanced/server/match-to-reference.mjs +173 -0
  45. package/resolve-advanced/server/media-inventory.mjs +169 -0
  46. package/resolve-advanced/server/media-ops.mjs +243 -0
  47. package/resolve-advanced/server/node-meta-db.mjs +62 -0
  48. package/resolve-advanced/server/node-provenance.mjs +102 -0
  49. package/resolve-advanced/server/offline-ref-db.mjs +420 -0
  50. package/resolve-advanced/server/offline-ref.mjs +179 -0
  51. package/resolve-advanced/server/project-db.mjs +233 -0
  52. package/resolve-advanced/server/provenance-audit.mjs +210 -0
  53. package/resolve-advanced/server/qc-frame.mjs +224 -0
  54. package/resolve-advanced/server/qc-sampler.mjs +67 -0
  55. package/resolve-advanced/server/readback.mjs +77 -0
  56. package/resolve-advanced/server/render-manifest.mjs +93 -0
  57. package/resolve-advanced/server/reverse-clip-db.mjs +270 -0
  58. package/resolve-advanced/server/runner-apply-contract.mjs +64 -0
  59. package/resolve-advanced/server/runner.mjs +244 -0
  60. package/resolve-advanced/server/saturation-match.mjs +108 -0
  61. package/resolve-advanced/server/scope-read.mjs +257 -0
  62. package/resolve-advanced/server/season-look.mjs +96 -0
  63. package/resolve-advanced/server/shot-intent.mjs +82 -0
  64. package/resolve-advanced/server/shot-match.mjs +147 -0
  65. package/resolve-advanced/server/skin-match.mjs +205 -0
  66. package/resolve-advanced/server/spec-compile.mjs +217 -0
  67. package/resolve-advanced/server/tone-curve-transfer.mjs +184 -0
  68. package/resolve-advanced/server/tool-catalog.mjs +265 -0
  69. package/resolve-advanced/server/tools/audio.mjs +54 -0
  70. package/resolve-advanced/server/tools/audio_plan.mjs +58 -0
  71. package/resolve-advanced/server/tools/capabilities.mjs +16 -0
  72. package/resolve-advanced/server/tools/color_trace.mjs +165 -0
  73. package/resolve-advanced/server/tools/conform.mjs +291 -0
  74. package/resolve-advanced/server/tools/deliverable.mjs +105 -0
  75. package/resolve-advanced/server/tools/drp.mjs +232 -0
  76. package/resolve-advanced/server/tools/drt.mjs +200 -0
  77. package/resolve-advanced/server/tools/drx.mjs +943 -0
  78. package/resolve-advanced/server/tools/editorial.mjs +69 -0
  79. package/resolve-advanced/server/tools/fairlight.mjs +108 -0
  80. package/resolve-advanced/server/tools/fusion.mjs +64 -0
  81. package/resolve-advanced/server/tools/media.mjs +102 -0
  82. package/resolve-advanced/server/tools/offline_ref.mjs +123 -0
  83. package/resolve-advanced/server/tools/pipeline.mjs +137 -0
  84. package/resolve-advanced/server/tools/project_db.mjs +200 -0
  85. package/resolve-advanced/server/tools/project_read.mjs +212 -0
  86. package/resolve-advanced/server/tools/provenance.mjs +73 -0
  87. package/resolve-advanced/server/verify-grade.mjs +113 -0
  88. package/resolve-advanced/server/white-balance-match.mjs +122 -0
  89. package/resolve-advanced/vendor/audio/format-converter.js +330 -0
  90. package/resolve-advanced/vendor/audio/split.js +173 -0
  91. package/resolve-advanced/vendor/audio/trim.js +188 -0
  92. package/resolve-advanced/vendor/audio-fairlight/index.js +391 -0
  93. package/resolve-advanced/vendor/conform-qc/adapters/frame-sampler.js +56 -0
  94. package/resolve-advanced/vendor/conform-qc/adapters/local-ffmpeg-sampler.js +65 -0
  95. package/resolve-advanced/vendor/conform-qc/adapters/rendernode-ffmpeg-sampler.js +50 -0
  96. package/resolve-advanced/vendor/conform-qc/adapters/resolve/driver.py +176 -0
  97. package/resolve-advanced/vendor/conform-qc/adapters/resolve-driver.js +61 -0
  98. package/resolve-advanced/vendor/conform-qc/adapters/resolve-headless-driver.js +86 -0
  99. package/resolve-advanced/vendor/conform-qc/adapters/vision-validator.js +75 -0
  100. package/resolve-advanced/vendor/conform-qc/cli.js +63 -0
  101. package/resolve-advanced/vendor/conform-qc/compare/advisory.js +106 -0
  102. package/resolve-advanced/vendor/conform-qc/compare/decode.js +36 -0
  103. package/resolve-advanced/vendor/conform-qc/compare/index.js +61 -0
  104. package/resolve-advanced/vendor/conform-qc/compare/locate.js +70 -0
  105. package/resolve-advanced/vendor/conform-qc/compare/metrics.js +409 -0
  106. package/resolve-advanced/vendor/conform-qc/docs/runbook.md +72 -0
  107. package/resolve-advanced/vendor/conform-qc/index.js +49 -0
  108. package/resolve-advanced/vendor/conform-qc/knowledge/index.js +110 -0
  109. package/resolve-advanced/vendor/conform-qc/ops/conform-core.js +137 -0
  110. package/resolve-advanced/vendor/conform-qc/ops/conform-diff.js +109 -0
  111. package/resolve-advanced/vendor/conform-qc/ops/insert.js +108 -0
  112. package/resolve-advanced/vendor/conform-qc/ops/local-conform.js +61 -0
  113. package/resolve-advanced/vendor/conform-qc/ops/patch.js +80 -0
  114. package/resolve-advanced/vendor/conform-qc/ops/trigger.js +32 -0
  115. package/resolve-advanced/vendor/conform-qc/ops/verify.js +105 -0
  116. package/resolve-advanced/vendor/conform-qc/ops/workflow.js +30 -0
  117. package/resolve-advanced/vendor/conform-qc/oracle/emulate.js +155 -0
  118. package/resolve-advanced/vendor/conform-qc/oracle/index.js +38 -0
  119. package/resolve-advanced/vendor/conform-qc/oracle/resolve.js +196 -0
  120. package/resolve-advanced/vendor/conform-qc/package.json +16 -0
  121. package/resolve-advanced/vendor/conform-qc/packaging/emit-aaf.js +30 -0
  122. package/resolve-advanced/vendor/conform-qc/packaging/emit-fcp7.js +64 -0
  123. package/resolve-advanced/vendor/conform-qc/packaging/index.js +169 -0
  124. package/resolve-advanced/vendor/conform-qc/packaging/media-ops.js +56 -0
  125. package/resolve-advanced/vendor/conform-qc/packaging/otio.js +50 -0
  126. package/resolve-advanced/vendor/conform-qc/packaging/relink.js +50 -0
  127. package/resolve-advanced/vendor/conform-qc/packaging/surgical-relink.js +195 -0
  128. package/resolve-advanced/vendor/conform-qc/parse/index.js +54 -0
  129. package/resolve-advanced/vendor/conform-qc/parse/merge-dto.js +27 -0
  130. package/resolve-advanced/vendor/conform-qc/parse/xmeml-geometry.js +256 -0
  131. package/resolve-advanced/vendor/conform-qc/reference/burnin-ocr.js +100 -0
  132. package/resolve-advanced/vendor/conform-qc/reference/sidecar.js +37 -0
  133. package/resolve-advanced/vendor/conform-qc/repair/analysis.js +62 -0
  134. package/resolve-advanced/vendor/conform-qc/repair/index.js +78 -0
  135. package/resolve-advanced/vendor/conform-qc/repair/media-analysis.js +139 -0
  136. package/resolve-advanced/vendor/conform-qc/repair/media-index.js +135 -0
  137. package/resolve-advanced/vendor/conform-qc/repair/strategies.js +250 -0
  138. package/resolve-advanced/vendor/conform-qc/report/index.js +133 -0
  139. package/resolve-advanced/vendor/conform-qc/roles/index.js +96 -0
  140. package/resolve-advanced/vendor/conform-qc/synthetic/generate.js +233 -0
  141. package/resolve-advanced/vendor/conform-qc/test/advisory.test.js +85 -0
  142. package/resolve-advanced/vendor/conform-qc/test/cli.test.js +39 -0
  143. package/resolve-advanced/vendor/conform-qc/test/compare.test.js +152 -0
  144. package/resolve-advanced/vendor/conform-qc/test/conform-diff.test.js +70 -0
  145. package/resolve-advanced/vendor/conform-qc/test/emulate.test.js +51 -0
  146. package/resolve-advanced/vendor/conform-qc/test/frame-sampler.test.js +30 -0
  147. package/resolve-advanced/vendor/conform-qc/test/geometry.test.js +112 -0
  148. package/resolve-advanced/vendor/conform-qc/test/knowledge.test.js +56 -0
  149. package/resolve-advanced/vendor/conform-qc/test/lifecycle.test.js +110 -0
  150. package/resolve-advanced/vendor/conform-qc/test/local-ffmpeg-sampler.test.js +66 -0
  151. package/resolve-advanced/vendor/conform-qc/test/locate.test.js +63 -0
  152. package/resolve-advanced/vendor/conform-qc/test/media-analysis.test.js +63 -0
  153. package/resolve-advanced/vendor/conform-qc/test/media-index-normalized.test.js +65 -0
  154. package/resolve-advanced/vendor/conform-qc/test/media-index-origin.test.js +53 -0
  155. package/resolve-advanced/vendor/conform-qc/test/metrics-fast.test.js +91 -0
  156. package/resolve-advanced/vendor/conform-qc/test/oracle-reverse.test.js +86 -0
  157. package/resolve-advanced/vendor/conform-qc/test/oracle.test.js +136 -0
  158. package/resolve-advanced/vendor/conform-qc/test/p0-acceptance.test.js +60 -0
  159. package/resolve-advanced/vendor/conform-qc/test/p1-acceptance.test.js +75 -0
  160. package/resolve-advanced/vendor/conform-qc/test/p45-patch-acceptance.test.js +102 -0
  161. package/resolve-advanced/vendor/conform-qc/test/packaging.test.js +133 -0
  162. package/resolve-advanced/vendor/conform-qc/test/parse-stubs.test.js +28 -0
  163. package/resolve-advanced/vendor/conform-qc/test/repair-strategies.test.js +128 -0
  164. package/resolve-advanced/vendor/conform-qc/test/repair.test.js +84 -0
  165. package/resolve-advanced/vendor/conform-qc/test/report.test.js +52 -0
  166. package/resolve-advanced/vendor/conform-qc/test/resolve-readback.test.js +71 -0
  167. package/resolve-advanced/vendor/conform-qc/test/roles.test.js +107 -0
  168. package/resolve-advanced/vendor/conform-qc/test/runbook.test.js +30 -0
  169. package/resolve-advanced/vendor/conform-qc/test/scale-residual.test.js +40 -0
  170. package/resolve-advanced/vendor/conform-qc/test/sidecar.test.js +51 -0
  171. package/resolve-advanced/vendor/conform-qc/test/smoke.test.js +87 -0
  172. package/resolve-advanced/vendor/conform-qc/test/surgical-relink.test.js +73 -0
  173. package/resolve-advanced/vendor/conform-qc/test/synthetic.test.js +98 -0
  174. package/resolve-advanced/vendor/conform-qc/test/verify.test.js +93 -0
  175. package/resolve-advanced/vendor/conform-qc/test/vision-validator.test.js +43 -0
  176. package/resolve-advanced/vendor/conform-qc/test/workflow-driver.test.js +46 -0
  177. package/resolve-advanced/vendor/conform-qc/toolset/index.js +53 -0
  178. package/resolve-advanced/vendor/drp-format/README.md +116 -0
  179. package/resolve-advanced/vendor/drp-format/__tests__/_resolve-verify.js +39 -0
  180. package/resolve-advanced/vendor/drp-format/__tests__/add-media-clip.test.js +30 -0
  181. package/resolve-advanced/vendor/drp-format/__tests__/assemble-timeline.test.js +68 -0
  182. package/resolve-advanced/vendor/drp-format/__tests__/author-project.test.js +57 -0
  183. package/resolve-advanced/vendor/drp-format/__tests__/composition-text.test.js +98 -0
  184. package/resolve-advanced/vendor/drp-format/__tests__/diff.test.js +272 -0
  185. package/resolve-advanced/vendor/drp-format/__tests__/effect-filters-compressed.test.js +143 -0
  186. package/resolve-advanced/vendor/drp-format/__tests__/fixtures/p0-3-session30-empty-effectfilters.drp +0 -0
  187. package/resolve-advanced/vendor/drp-format/__tests__/fixtures/retimed-timemap-50pct.hex +1 -0
  188. package/resolve-advanced/vendor/drp-format/__tests__/fixtures/retimed-timemap-dynamic.hex +1 -0
  189. package/resolve-advanced/vendor/drp-format/__tests__/inject-grades.test.js +238 -0
  190. package/resolve-advanced/vendor/drp-format/__tests__/keyed-dict.test.js +85 -0
  191. package/resolve-advanced/vendor/drp-format/__tests__/lut-refs.test.js +119 -0
  192. package/resolve-advanced/vendor/drp-format/__tests__/media-blobs.test.js +25 -0
  193. package/resolve-advanced/vendor/drp-format/__tests__/media-timemap.test.js +119 -0
  194. package/resolve-advanced/vendor/drp-format/__tests__/place-fusion-title.test.js +52 -0
  195. package/resolve-advanced/vendor/drp-format/__tests__/place-generator.test.js +40 -0
  196. package/resolve-advanced/vendor/drp-format/__tests__/place-transition.test.js +48 -0
  197. package/resolve-advanced/vendor/drp-format/__tests__/protobuf-wire.test.js +64 -0
  198. package/resolve-advanced/vendor/drp-format/__tests__/relink-media.test.js +106 -0
  199. package/resolve-advanced/vendor/drp-format/__tests__/splice-clips.test.js +256 -0
  200. package/resolve-advanced/vendor/drp-format/assemble-timeline.js +65 -0
  201. package/resolve-advanced/vendor/drp-format/author-project.js +118 -0
  202. package/resolve-advanced/vendor/drp-format/composition-text.js +213 -0
  203. package/resolve-advanced/vendor/drp-format/curves-encoder.js +763 -0
  204. package/resolve-advanced/vendor/drp-format/diff.js +310 -0
  205. package/resolve-advanced/vendor/drp-format/drp-packager.js +201 -0
  206. package/resolve-advanced/vendor/drp-format/drp-validator.js +809 -0
  207. package/resolve-advanced/vendor/drp-format/effect-encoder.js +640 -0
  208. package/resolve-advanced/vendor/drp-format/extract-lut-refs.js +119 -0
  209. package/resolve-advanced/vendor/drp-format/grade-encoder.example.js +133 -0
  210. package/resolve-advanced/vendor/drp-format/grade-encoder.js +401 -0
  211. package/resolve-advanced/vendor/drp-format/grade-encoder.test.js +171 -0
  212. package/resolve-advanced/vendor/drp-format/grade-encoder.verify.js +249 -0
  213. package/resolve-advanced/vendor/drp-format/grade-node-extractor.js +495 -0
  214. package/resolve-advanced/vendor/drp-format/grade-parameter-decoder.js +774 -0
  215. package/resolve-advanced/vendor/drp-format/index.js +174 -0
  216. package/resolve-advanced/vendor/drp-format/inject-grades.js +219 -0
  217. package/resolve-advanced/vendor/drp-format/keyed-dict.js +227 -0
  218. package/resolve-advanced/vendor/drp-format/marker-encoder.js +532 -0
  219. package/resolve-advanced/vendor/drp-format/media-blobs.js +53 -0
  220. package/resolve-advanced/vendor/drp-format/media-timemap.js +164 -0
  221. package/resolve-advanced/vendor/drp-format/mp-folder-builder.js +293 -0
  222. package/resolve-advanced/vendor/drp-format/node-tree-encoder.js +1246 -0
  223. package/resolve-advanced/vendor/drp-format/package.json +18 -0
  224. package/resolve-advanced/vendor/drp-format/place-fusion-title.js +131 -0
  225. package/resolve-advanced/vendor/drp-format/place-generator.js +77 -0
  226. package/resolve-advanced/vendor/drp-format/place-transition.js +91 -0
  227. package/resolve-advanced/vendor/drp-format/power-window-encoder.js +776 -0
  228. package/resolve-advanced/vendor/drp-format/protobuf-wire.js +111 -0
  229. package/resolve-advanced/vendor/drp-format/qualifier-encoder.js +706 -0
  230. package/resolve-advanced/vendor/drp-format/relink-media.js +218 -0
  231. package/resolve-advanced/vendor/drp-format/rich-title-encoder.js +447 -0
  232. package/resolve-advanced/vendor/drp-format/seq-container-builder.js +572 -0
  233. package/resolve-advanced/vendor/drp-format/seq-surgery.js +155 -0
  234. package/resolve-advanced/vendor/drp-format/splice-clips.js +445 -0
  235. package/resolve-advanced/vendor/drp-format/templates/empty-project.drp +0 -0
  236. package/resolve-advanced/vendor/drp-format/templates/fusion-title.xml +56 -0
  237. package/resolve-advanced/vendor/drp-format/templates/generator-solid-color.xml +21 -0
  238. package/resolve-advanced/vendor/drp-format/templates/media-clip-h264.drp +0 -0
  239. package/resolve-advanced/vendor/drp-format/templates/transition-cross-dissolve.xml +22 -0
  240. package/resolve-advanced/vendor/drp-format/tool-registry.descriptor.js +80 -0
  241. package/resolve-advanced/vendor/drp-format/utils/safe-archive.js +54 -0
  242. package/resolve-advanced/vendor/drp-format/xml-builder.js +759 -0
  243. package/resolve-advanced/vendor/drt-format/__tests__/_resolve-verify.js +21 -0
  244. package/resolve-advanced/vendor/drt-format/__tests__/build.test.js +113 -0
  245. package/resolve-advanced/vendor/drt-format/__tests__/multi-format.test.js +93 -0
  246. package/resolve-advanced/vendor/drt-format/__tests__/parse-real-resolve21.test.js +51 -0
  247. package/resolve-advanced/vendor/drt-format/__tests__/parse.test.js +134 -0
  248. package/resolve-advanced/vendor/drt-format/__tests__/resolve-versions.test.js +120 -0
  249. package/resolve-advanced/vendor/drt-format/__tests__/schema-fingerprint.test.js +62 -0
  250. package/resolve-advanced/vendor/drt-format/__tests__/smoke.test.js +27 -0
  251. package/resolve-advanced/vendor/drt-format/__tests__/validate.test.js +109 -0
  252. package/resolve-advanced/vendor/drt-format/capabilities.js +69 -0
  253. package/resolve-advanced/vendor/drt-format/capability-domains.js +56 -0
  254. package/resolve-advanced/vendor/drt-format/drt-builder.js +42 -0
  255. package/resolve-advanced/vendor/drt-format/drt-parser.js +164 -0
  256. package/resolve-advanced/vendor/drt-format/drt-validator.js +98 -0
  257. package/resolve-advanced/vendor/drt-format/index.js +45 -0
  258. package/resolve-advanced/vendor/drt-format/package.json +17 -0
  259. package/resolve-advanced/vendor/drt-format/resolve-versions.js +153 -0
  260. package/resolve-advanced/vendor/drt-format/schema-fingerprint.js +74 -0
  261. package/resolve-advanced/vendor/drt-format/templates/drt-project-shell.xml +124 -0
  262. package/resolve-advanced/vendor/drx-codec/__tests__/curves-roundtrip.test.js +148 -0
  263. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-face-refinement.drx +58 -0
  264. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-filmgrain.drx +58 -0
  265. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-glow.drx +58 -0
  266. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-lens-flare.drx +58 -0
  267. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-3-beauty-25.drx +58 -0
  268. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-3-beauty-75.drx +58 -0
  269. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p5-1-node-no-lut.drx +58 -0
  270. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p5-1-node-with-lut.drx +58 -0
  271. package/resolve-advanced/vendor/drx-codec/__tests__/hsl-curves-roundtrip.test.js +117 -0
  272. package/resolve-advanced/vendor/drx-codec/__tests__/lut-refs-roundtrip.test.js +112 -0
  273. package/resolve-advanced/vendor/drx-codec/__tests__/matte-roundtrip.test.js +167 -0
  274. package/resolve-advanced/vendor/drx-codec/__tests__/ofx-roundtrip.test.js +215 -0
  275. package/resolve-advanced/vendor/drx-codec/__tests__/ofx-slugs-discovery.test.js +149 -0
  276. package/resolve-advanced/vendor/drx-codec/__tests__/power-window-roundtrip.test.js +230 -0
  277. package/resolve-advanced/vendor/drx-codec/__tests__/qualifier-roundtrip.test.js +226 -0
  278. package/resolve-advanced/vendor/drx-codec/cdl-exporter.js +470 -0
  279. package/resolve-advanced/vendor/drx-codec/color-nlp-parser.js +833 -0
  280. package/resolve-advanced/vendor/drx-codec/data/color-nlp-action-mappings.json +2232 -0
  281. package/resolve-advanced/vendor/drx-codec/drx-generator.js +4123 -0
  282. package/resolve-advanced/vendor/drx-codec/drx-merger.js +320 -0
  283. package/resolve-advanced/vendor/drx-codec/drx-parser.js +1808 -0
  284. package/resolve-advanced/vendor/drx-codec/extract-custom-curves.js +215 -0
  285. package/resolve-advanced/vendor/drx-codec/extract-hsl-curves.js +180 -0
  286. package/resolve-advanced/vendor/drx-codec/extract-lut-refs.js +158 -0
  287. package/resolve-advanced/vendor/drx-codec/extract-matte-finesse.js +83 -0
  288. package/resolve-advanced/vendor/drx-codec/extract-ofx-params.js +226 -0
  289. package/resolve-advanced/vendor/drx-codec/extract-power-window.js +184 -0
  290. package/resolve-advanced/vendor/drx-codec/extract-qualifier.js +99 -0
  291. package/resolve-advanced/vendor/drx-codec/index.js +109 -0
  292. package/resolve-advanced/vendor/drx-codec/node-layout.js +249 -0
  293. package/resolve-advanced/vendor/drx-codec/resolved-drx-generator.js +393 -0
  294. package/resolve-advanced/vendor/drx-codec/tool-resolver.js +974 -0
  295. package/resolve-advanced/vendor/drx-codec/training-examples.js +548 -0
  296. package/resolve-advanced/vendor/drx-codec/vocabulary-intents.js +539 -0
  297. package/resolve-advanced/vendor/drx-parameters/CALIBRATION-STATUS.md +319 -0
  298. package/resolve-advanced/vendor/drx-parameters/DRX-VALUE-SCALING.md +251 -0
  299. package/resolve-advanced/vendor/drx-parameters/calibrated-ranges.json +17737 -0
  300. package/resolve-advanced/vendor/drx-parameters/corrector-types.js +120 -0
  301. package/resolve-advanced/vendor/drx-parameters/index.js +193 -0
  302. package/resolve-advanced/vendor/drx-parameters/parameter-codec.js +451 -0
  303. package/resolve-advanced/vendor/drx-parameters/parameter-ids.js +1292 -0
  304. package/resolve-advanced/vendor/drx-parameters/parameter-ranges.js +570 -0
  305. package/resolve-advanced/vendor/drx-parameters/parameter-validator.js +392 -0
  306. package/resolve-advanced/vendor/drx-parameters/resolvefx-registry.json +14973 -0
  307. package/resolve-advanced/vendor/drx-parameters/tool-registry.descriptor.js +38 -0
  308. package/resolve-advanced/vendor/drx-parameters/tools/drx-analyzer.js +371 -0
  309. package/resolve-advanced/vendor/fairlight/index.js +833 -0
  310. package/resolve-advanced/vendor/fusion-codec/composition-generator.js +401 -0
  311. package/resolve-advanced/vendor/fusion-codec/templates/blur-region.js +103 -0
  312. package/resolve-advanced/vendor/fusion-codec/templates/color-correct.js +87 -0
  313. package/resolve-advanced/vendor/fusion-codec/templates/film-grain.js +106 -0
  314. package/resolve-advanced/vendor/fusion-codec/templates/lower-third.js +241 -0
  315. package/resolve-advanced/vendor/fusion-codec/templates/picture-in-picture.js +188 -0
  316. package/resolve-advanced/vendor/fusion-codec/templates/text-overlay.js +161 -0
  317. package/resolve-advanced/vendor/fusion-codec/templates/title-card.js +184 -0
  318. package/resolve-advanced/vendor/fusion-codec/templates/vignette.js +107 -0
  319. package/resolve-advanced/vendor/fusion-codec/templates/watermark.js +101 -0
  320. package/scripts/agent-rules/README.md +68 -0
  321. package/src/analysis_dashboard.py +233 -1
  322. package/src/granular/common.py +1 -1
  323. package/src/server.py +378 -25
  324. package/src/utils/api_truth.py +21 -0
  325. package/src/utils/cut_ir.py +1 -1
  326. package/src/utils/failure_tracker.py +0 -2
  327. package/src/utils/timeline_xml.py +405 -0
@@ -64,6 +64,38 @@ All actions are under `render(action=...)`.
64
64
  existing `render_presets` tool, but the live kernel probe does not fabricate
65
65
  arbitrary preset files.
66
66
 
67
+ ## Advanced (offline) server — deliverable QC, media front-end, provenance
68
+
69
+ The live actions above plan and drive renders in a *running* Resolve. The
70
+ companion advanced server (`davinci-resolve-advanced`, see
71
+ `resolve-advanced/README.md`) QCs the **finished render** and manages media/
72
+ provenance with **no Resolve running**. It is report-only —
73
+ **`gate: review`, never auto-pass-clear.**
74
+
75
+ - **`deliverable`** — `deliverable_qc` (ffprobe a render vs its spec → pass/fail
76
+ **per field**), `loudness_qc` (ebur128 LUFS/true-peak/LRA),
77
+ `reframe_blanking_check`, `conform_completeness` (every intended shot present),
78
+ `re_delivery_diff`, `render_manifest` (build/reconcile), `expand_deliverable`
79
+ (texted/textless/stems/slate/leader entities).
80
+ - **`media`** (front-end / AE) — `ingest_verify` (hash seal/verify/dupes),
81
+ `media_inventory` (fps/codec/colorspace/TC + card gaps), `sync` (picture↔sound
82
+ TC + drift/MOS), `relink_manifest`, `rename_plan` (**refuses camera
83
+ originals**) / `reel_normalize`, `turnover_package`, `project_hygiene`.
84
+ - **`provenance`** (audit) — `grade_provenance` ("why is this graded this way"),
85
+ `gallery_lineage`, `cdl_export` / `cdl_diff` (round-trip asserted),
86
+ `revision_tracking`, `episode_report`.
87
+
88
+ Rules an agent must know:
89
+
90
+ - QC tools **refuse rather than fabricate** — a "refused" result means missing
91
+ file, wrong spec, or a metric it cannot honestly compute.
92
+ - Deliverable gates never auto-clear; surface the per-field verdict to a human.
93
+ - **Deps.** `deliverable`/`media` QC needs **ffmpeg + ffprobe on PATH** (GPL, not
94
+ bundled) — call the advanced `capabilities` tool for status + install hints.
95
+
96
+ See the `resolve-delivery` skill (`.claude/skills/delivery.md`) for the
97
+ craft ↔ live ↔ offline routing.
98
+
67
99
  ## Live Evidence
68
100
 
69
101
  Final validation ran on May 9, 2026 with DaVinci Resolve Studio 20.3.2.9 and
@@ -84,6 +84,45 @@ Supported aliases include `aaf`, `drt`, `edl`, `edl_cdl`, `edl_sdl`,
84
84
  - Export and import helpers require temp paths by default because they write
85
85
  interchange artifacts.
86
86
 
87
+ ## Advanced (offline) server — the conform QC engine
88
+
89
+ The live actions above operate on a *running* Resolve. The companion advanced
90
+ server (`davinci-resolve-advanced`, see `resolve-advanced/README.md`) does the
91
+ finishing-grade conform work with **no Resolve running**, against `.drt`/`.drp`
92
+ files and the project DB.
93
+
94
+ - **`conform`** — offline conform/relink QC with **frame-oracle math, not
95
+ filename matching** (it catches a clip relinked to the wrong-but-similarly-named
96
+ source). Also: reverse/retimed subclip DB repair (reversed `source_start` =
97
+ `masterFrames − 1 − endoffset`, live-validated), sequence lineage store + diff +
98
+ rollback (hashed snapshots), and per-cut frame QC (oracle-frame vs
99
+ reference-render, scale-corrected, red/yellow/cyan verdicts).
100
+ - **`color_trace`** — cross-project clip matching → a trace plan for carrying
101
+ grades across a re-conform (pairs with the color kernel's `drx grade_transfer`).
102
+ - **`offline_ref`** — offline-reference clips have **no scripting API** but live
103
+ inside `.drp`/`.drt` as `<OfflineClip>` entries; patch them here.
104
+ - **`editorial`** — `parse_interchange` (EDL/OTIO/XMEML; **AAF = honest refuse**),
105
+ `turnover_changelist` (moved/retimed/replaced/new/gone with timing guards),
106
+ `conform_manifest`, `marker_roundtrip`.
107
+ - **`drt` / `project_db`** — timeline file authoring and DB patching.
108
+
109
+ Gotchas the live path shares:
110
+
111
+ - **XML import via the scripting API goes _offline_** (missing-media/generators
112
+ abort). Use `import_timeline_checked` with media **sanitize** (FCP7/FCPXML) so
113
+ the API imports with links intact, then exact-path relink. Restart a running MCP
114
+ server to pick up the sanitize fix.
115
+ - **`.drt` version.** For DaVinci Resolve 19.1.3, set `DbPrjVer` 17 → 16 when
116
+ authoring a `.drt`.
117
+ - **`project_db` patches** require the project **CLOSED** plus
118
+ `iConfirmProjectClosed:true`; writes auto-back-up and read-back verify. Resolve
119
+ caches open projects — **fully quit and relaunch** after patching.
120
+ - **Deps.** `better-sqlite3` gates lineage/reverse/DB; `sharp`/ffmpeg gate frame
121
+ compare — call the advanced `capabilities` tool.
122
+
123
+ See the `resolve-conform` skill (`.claude/skills/conform.md`) for the
124
+ craft ↔ live ↔ offline routing.
125
+
87
126
  ## Live Probe
88
127
 
89
128
  Run the live boundary probe with:
@@ -180,6 +180,23 @@ Some behavior depends on Resolve's current page or bridge state:
180
180
  if Resolve loses current timeline state, the harness records the bridge
181
181
  condition separately.
182
182
 
183
+ ## Advanced (offline) server — editorial interchange + changelist
184
+
185
+ The kernel above restructures a *running* timeline. The companion advanced server
186
+ (`davinci-resolve-advanced`, see `resolve-advanced/README.md`) authors/diffs
187
+ timelines and reasons over editorial interchange with **no Resolve running**:
188
+
189
+ - **`editorial`** — `parse_interchange` (EDL/OTIO/XMEML; **AAF = honest refuse**),
190
+ `turnover_changelist` (moved/retimed/replaced/new/gone between two cuts, with
191
+ timing silent-lie guards), `conform_manifest`, `marker_roundtrip`.
192
+ - **`drt`** — `.drt` timeline file authoring + structural diff.
193
+
194
+ Use these to answer "what changed between v3 and v4" or to hand a conform an
195
+ accurate change list without opening either timeline. For conforming/relinking
196
+ that change list, see the Timeline Conform / Interchange kernel and the
197
+ `resolve-conform` skill; for the edit ↔ offline routing, see the `resolve-edit`
198
+ skill (`.claude/skills/timeline-edit.md`).
199
+
183
200
  ## Development Guardrails
184
201
 
185
202
  - Use disposable projects and synthetic media for live validation.
@@ -35,11 +35,15 @@ Every release bump must update all version surfaces:
35
35
  `venv/bin/python scripts/gen_api_limitations.py`. The
36
36
  `tests.test_api_limitations_doc` drift guard fails the suite if it is stale.
37
37
  - `docs/SKILL.md` when tool discovery, examples, or behavior changed
38
- - `docs/guides/control-panel.md` when the control panel UI changed, plus
38
+ - `docs/guides/control-panel.md` check EVERY release, not only when the
39
+ panel "changed": panel surfaces grow transitively (new tools, new docs pages,
40
+ new diagnostics cards), so review the guide for accuracy and update it plus
39
41
  regenerated screenshots: start the panel against a project with analysis
40
42
  data, then run `venv/bin/python scripts/regen_panel_screenshots.py`.
41
43
  The `tests.test_panel_docs_drift` guard fails the suite (and the publish
42
- workflow) when the guide drifts from the panel's navigation or screenshots.
44
+ workflow) when the guide drifts from the panel's navigation or screenshots
45
+ but the guard checks presence, not prose accuracy; the human pass is the
46
+ accuracy check.
43
47
  - Git tag, e.g. `v2.4.1`
44
48
  - GitHub Release notes
45
49
 
@@ -54,17 +58,35 @@ Always run static checks before release:
54
58
  venv/bin/python tests/test_import.py
55
59
  venv/bin/python scripts/audit_api_parity.py
56
60
  venv/bin/python scripts/gen_api_limitations.py --check
57
- venv/bin/python -m unittest tests.test_static_undefined_names tests.test_action_list_drift tests.test_panel_docs_drift
61
+ node scripts/agent-rules/generate.mjs --check
62
+ venv/bin/python -m unittest tests.test_static_undefined_names tests.test_action_list_drift tests.test_panel_docs_drift tests.test_doc_tool_counts tests.test_agent_rules_drift
58
63
  node bin/davinci-resolve-mcp.mjs --help
59
64
  node bin/davinci-resolve-mcp.mjs --version
60
65
  npm pack --dry-run
61
66
  git diff --check
62
67
  ```
63
68
 
64
- The three drift guards (undefined names in `src/`, tool action lists vs
65
- dispatch, control-panel guide vs panel navigation/screenshots) also run in the
66
- `Publish npm package` workflow on every `v*` tag, so a stale doc or drifted
67
- action list fails the publish — fix the drift rather than bypassing the gate.
69
+ The drift guards (undefined names in `src/`, tool action lists vs dispatch,
70
+ control-panel guide vs panel navigation/screenshots, api-limitations vs the
71
+ api_truth ledger, and **tool counts across the docs vs reality**
72
+ `test_doc_tool_counts`) also run in the `Publish npm package` workflow on every
73
+ `v*` tag, so a stale doc or drifted action list fails the publish — fix the drift
74
+ rather than bypassing the gate.
75
+
76
+ `test_doc_tool_counts` statically counts the compound (`src/server.py`), granular
77
+ (`src/granular/`), and Node advanced (`resolve-advanced/server/index.mjs`) tools and
78
+ asserts the numbers quoted in README, `resolve-advanced/README.md`, `docs/contributing.md`,
79
+ `docs/SKILL.md`, `docs/reference/api-coverage.md`, and `.github/copilot-instructions.md`
80
+ still match. When you add/remove a tool, update those docs to the counts the test prints.
81
+
82
+ The cross-platform agent rule files (`.cursor/rules/*`, `.github/instructions/*`,
83
+ `.windsurf/rules/*`, `.cursorrules`, `.windsurfrules`, the `AGENTS.md` domain-routing
84
+ block, and `.github/copilot-instructions.md`) are **generated** by
85
+ `scripts/agent-rules/generate.mjs`, which parses those same counts from their
86
+ canonical docs. After a count or tool-routing change, run
87
+ `node scripts/agent-rules/generate.mjs` and commit the result;
88
+ `test_agent_rules_drift` fails the suite (and publish) if the committed files are
89
+ stale. See `scripts/agent-rules/README.md`.
68
90
 
69
91
  Run focused unit tests for the changed surface. For recent timeline/marker
70
92
  helpers, this usually includes:
@@ -17,7 +17,7 @@ Complete Resolve scripting API coverage, live-test status, and method-by-method
17
17
 
18
18
  ## API Coverage
19
19
 
20
- Every non-deprecated method in the DaVinci Resolve Scripting API is covered. The default compound server exposes **33 tools** that group related operations by action parameter, keeping LLM context windows lean. The full granular server provides **341 individual tools** for power users. Both modes cover all 13 API object classes. MCP-level kernel actions are tracked separately in [Kernel Action Coverage](../kernels/README.md).
20
+ Every non-deprecated method in the DaVinci Resolve Scripting API is covered. The default compound server exposes **34 tools** that group related operations by action parameter, keeping LLM context windows lean. The full granular server provides **341 individual tools** for power users. Both modes cover all 13 API object classes. MCP-level kernel actions are tracked separately in [Kernel Action Coverage](../kernels/README.md).
21
21
 
22
22
  The 33rd compound tool is `timeline_versioning` (C6) — an MCP-level workflow
23
23
  tool, not a wrapper around a Resolve API method. It surfaces the
package/install.py CHANGED
@@ -35,7 +35,7 @@ from src.utils.update_check import (
35
35
 
36
36
  # ─── Version ──────────────────────────────────────────────────────────────────
37
37
 
38
- VERSION = "2.57.5"
38
+ VERSION = "2.58.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
@@ -666,14 +666,37 @@ def write_client_config(client, python_path, server_path, api_path, lib_path, dr
666
666
  return True, str(config_path)
667
667
 
668
668
 
669
+ def build_advanced_entry(server_path):
670
+ """Build the config entry for the optional 'davinci-resolve-advanced' server.
671
+
672
+ This is the Node, beyond-the-scripting-API sibling (file/.drp/.drt/.drx
673
+ authoring + conform + editorial, no live Resolve required). It ships in the
674
+ same package as a second bin. Opt-in: include it only if you want the
675
+ file-level tools alongside the live server.
676
+ """
677
+ project_dir = Path(server_path).resolve().parents[1] # .../src/server.py -> repo root
678
+ advanced_bin = project_dir / "bin" / "davinci-resolve-advanced-mcp.mjs"
679
+ return {"command": "node", "args": [str(advanced_bin)]}
680
+
681
+
669
682
  def generate_manual_config(python_path, server_path, api_path, lib_path):
670
683
  """Generate config snippets for manual setup."""
671
684
  entry = build_server_entry(python_path, server_path, api_path, lib_path)
672
685
  zed_entry = build_zed_entry(python_path, server_path, api_path, lib_path)
673
686
  opencode_entry = build_opencode_entry(python_path, server_path, api_path, lib_path)
674
-
675
- standard = json.dumps({"mcpServers": {"davinci-resolve": entry}}, indent=2)
676
- vscode_fmt = json.dumps({"servers": {"davinci-resolve": entry}}, indent=2)
687
+ advanced = build_advanced_entry(server_path)
688
+
689
+ # Standard snippet includes BOTH servers: the live Python server and the
690
+ # optional Node 'advanced' server (file-level, no Resolve). Drop the
691
+ # advanced entry if you only want live control.
692
+ standard = json.dumps({"mcpServers": {
693
+ "davinci-resolve": entry,
694
+ "davinci-resolve-advanced": advanced,
695
+ }}, indent=2)
696
+ vscode_fmt = json.dumps({"servers": {
697
+ "davinci-resolve": entry,
698
+ "davinci-resolve-advanced": advanced,
699
+ }}, indent=2)
677
700
  zed_fmt = json.dumps({"context_servers": {"davinci-resolve": zed_entry}}, indent=2)
678
701
  opencode_fmt = json.dumps({"mcp": {"davinci-resolve": opencode_entry}}, indent=2)
679
702
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.57.5",
3
+ "version": "2.58.0",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -14,11 +14,32 @@
14
14
  },
15
15
  "type": "module",
16
16
  "bin": {
17
- "davinci-resolve-mcp": "./bin/davinci-resolve-mcp.mjs"
17
+ "davinci-resolve-mcp": "./bin/davinci-resolve-mcp.mjs",
18
+ "davinci-resolve-advanced-mcp": "./bin/davinci-resolve-advanced-mcp.mjs"
19
+ },
20
+ "dependencies": {
21
+ "@modelcontextprotocol/sdk": "^1.27.1",
22
+ "adm-zip": "^0.5.16",
23
+ "fast-xml-parser": "^5.7.3",
24
+ "fzstd": "^0.1.1",
25
+ "jszip": "^3.10.1",
26
+ "uuid": "^9.0.0",
27
+ "zod": "^3.25.76",
28
+ "zstd-codec": "^0.1.5"
29
+ },
30
+ "optionalDependencies": {
31
+ "better-sqlite3": "^11.0.0",
32
+ "js-yaml": "^4.1.0",
33
+ "pg": "^8.11.0",
34
+ "sharp": "^0.33.0"
18
35
  },
19
36
  "files": [
20
37
  "bin/",
21
38
  "src/**/*.py",
39
+ "resolve-advanced/server/**/*.mjs",
40
+ "resolve-advanced/vendor/**",
41
+ "resolve-advanced/package.json",
42
+ "resolve-advanced/README.md",
22
43
  "docs/**/*.md",
23
44
  "docs/reference/resolve_scripting_api.txt",
24
45
  "examples/**/*.md",
@@ -0,0 +1,194 @@
1
+ # davinci-resolve-advanced-mcp
2
+
3
+ The **beyond-the-API** half of `davinci-resolve-mcp`: a Node MCP server that authors and edits
4
+ DaVinci Resolve **files** (`.drp` / `.drt` / `.drx`) and applies DB/XML-level changes (Fairlight
5
+ routing, offline-reference, conform, color-group grade read) — **with no DaVinci Resolve running.**
6
+
7
+ It ships as a second `bin` inside the `davinci-resolve-mcp` npm package (one install, two servers):
8
+
9
+ ```
10
+ bin/davinci-resolve-mcp.mjs → Python, live, sanctioned scripting API (drives Resolve)
11
+ bin/davinci-resolve-advanced-mcp.mjs → Node, beyond-API file/DB authoring (no Resolve required) [this]
12
+ ```
13
+
14
+ Runs cloud or local — the file tools never touch Resolve.
15
+
16
+ ## Two ways to use it
17
+
18
+ - **As an MCP server** (the bin above) — point any MCP client at it.
19
+ - **As a library** — `import` the engine directly. The package exposes a public API surface
20
+ (`server/lib.mjs`, wired via `package.json` `main`/`exports`), grouped as **codec** (offline
21
+ `.drp/.drt/.drx`), **grading** (deterministic compute cores), **pipeline** (the DB-as-truth
22
+ foundation), **tools** (the MCP tool handlers), and **mcp** (the stdio server entry). The MCP
23
+ server is a thin shell over these same exports.
24
+
25
+ ## Usage
26
+
27
+ **As a library — a grading core.** You extract display-referred frames per clip (ffmpeg, your
28
+ call); the engine computes the grade offline and writes an apply-ready `.drx`. Applying it in
29
+ Resolve (via the scripting API) is the caller's job.
30
+
31
+ ```js
32
+ import { computeSkinMatch } from 'davinci-resolve-advanced-mcp';
33
+
34
+ const { grades, report, warnings } = await computeSkinMatch(
35
+ [
36
+ { id: 'B_0008', png: '/frames/B_0008.png', group: 'Guest' },
37
+ { id: 'C_0016', png: '/frames/C_0016.png', group: 'Guest' },
38
+ ],
39
+ { outDir: '/out/skin' },
40
+ );
41
+ // grades[].drxPath → apply in Resolve; warnings flag over-corrections; low-skin clips are skipped, not faked.
42
+ ```
43
+
44
+ **The DB-as-truth pipeline** (via the `pipeline` tool handler — same API the MCP server exposes).
45
+ Compile YAML specs into the canonical DB, plan a run, execute a deterministic stage (you supply the
46
+ tool inputs), then read decoded state back and check drift:
47
+
48
+ ```js
49
+ import { pipelineTool } from 'davinci-resolve-advanced-mcp';
50
+ const call = (action, args) => pipelineTool.handler({ action, args });
51
+
52
+ const dbPath = '/proj/project.db';
53
+ const now = new Date().toISOString(); // the tool takes an explicit timestamp
54
+
55
+ await call('compile', { dbPath, now, yamlDir: '/proj/specs' }); // YAML → resolved entity tree
56
+ const { runId, stages } = await call('plan', { dbPath, episodeSlug: 'e012', now });
57
+
58
+ // Deterministic stages run now (you pass the tool args); Resolve-apply stages return an action plan.
59
+ await call('execute_stage', {
60
+ dbPath, runId, stageIndex: 0, now,
61
+ toolArgs: { tool: 'gamut_legal', args: { clips: [{ id: 'f', png: '/frames/f.png' }] } },
62
+ });
63
+
64
+ // Pull decoded actual state up and flag intent↔actual drift.
65
+ await call('readback', {
66
+ dbPath, entitySlug: 'e012.group.Host', now,
67
+ facts: { 'look.lut': 'Kodak_5219' }, pushFields: [{ field: 'look.lut' }],
68
+ });
69
+ ```
70
+
71
+ ## Tools (18)
72
+
73
+ `drp` · `drt` · `drx` · `offline_ref` · `conform` · `color_trace` · `fusion` · `audio` ·
74
+ `audio_plan` · `fairlight` · `project_db` · `project_read` · `pipeline` · `capabilities` ·
75
+ `deliverable` · `media` · `editorial` · `provenance`
76
+
77
+ Each dispatches on an `action`. Highlights:
78
+
79
+ - **`drx`** — per-clip grade (`.drx`) codec: `parse`, `generate`, `generate_from_request`,
80
+ `export_cdl`, `merge`, plus the **grading/QC catalog** below.
81
+ - **`drp` / `drt`** — project / timeline file authoring + editing + grade injection + structural diff.
82
+ - **`conform`** — offline conform/relink QC engine (frame-oracle math, not filename matching),
83
+ reverse-clip DB repair, sequence lineage store + diff, per-cut frame QC.
84
+ - **`color_trace`** — cross-project clip matching → a trace plan for carrying grades across a re-conform.
85
+ - **`project_read` / `project_db`** — read/patch the Resolve project DB (SQLite or Postgres).
86
+ - **`pipeline`** — the DB-as-truth pipeline foundation (see below).
87
+ - **`deliverable`** — deliverable QC / compliance: `deliverable_qc` (ffprobe a render vs its spec →
88
+ pass/fail per field), `loudness_qc` (ebur128 LUFS/true-peak/LRA), `reframe_blanking_check`,
89
+ `conform_completeness`, `re_delivery_diff`, `render_manifest` (build/reconcile), `expand_deliverable`
90
+ (texted/textless/stems/slate/leader entities). Report-only (`gate: review` — never auto-pass-clear).
91
+ - **`media`** — media front-end / AE: `ingest_verify` (hash seal/verify/dupes-by-hash), `media_inventory`
92
+ (fps/codec/colorspace/TC + card gaps), `sync` (TC picture↔sound + drift/MOS), `relink_manifest`,
93
+ `rename_plan` (refuses camera originals) / `reel_normalize`, `turnover_package`, `project_hygiene`.
94
+ - **`editorial`** — editorial integrity: `parse_interchange` (EDL/OTIO/XMEML; AAF = honest refuse),
95
+ `turnover_changelist` (moved/retimed/replaced/new/gone + timing silent-lie guards), `conform_manifest`,
96
+ `marker_roundtrip`.
97
+ - **`provenance`** — provenance / audit: `gallery_lineage`, `grade_provenance` ("why is this graded this
98
+ way"), `cdl_export` (+ `cdl_diff`, round-trip asserted), `revision_tracking`, `episode_report`.
99
+
100
+ ### Grading / QC catalog (`drx` actions — all local, deterministic, no Resolve)
101
+
102
+ Frame-stats → arithmetic → `.drx` grade. Frame extraction and grade **apply** are the caller's job;
103
+ these compute the grade offline. Each carries guards that refuse to fabricate a match rather than emit
104
+ a silent no-op.
105
+
106
+ | Action | What |
107
+ |---|---|
108
+ | `level_clips` | within-camera exposure/WB drift → a group hero (whole-frame mean) |
109
+ | `skin_match` | cross-camera skin-tone cohesion (skin-gated mean; throws on log/wrong-space frames) |
110
+ | `shot_match` | b-roll cohesion — gray-world `neutralize` or `hero` match (per-channel median) |
111
+ | `white_balance_match` | WB from a known-neutral patch (gray card) — accurate, not gray-world guess |
112
+ | `contrast_normalize` | match black/white points to a hero (affine gain+offset) |
113
+ | `match_to_reference` | affine mean-std transfer toward an approved still (skin-line gated, luma-preserve) |
114
+ | `saturation_match` | skin/overall saturation cohesion toward a hero |
115
+ | `black_balance` | neutralize a shadow colour cast (p1 black point, offset-only) |
116
+ | `cdl_io` | import ASC CDL (`.cc`/`.ccc`/`.cdl`) → `.drx` |
117
+ | `grade_transfer` | lossless Body copy — a `.drp` group / `.drx` look → an apply-ready `.drx` |
118
+ | `relayout` | programmatic "Cleanup Node Graph" (the UI command has no API) — rewrite node x/y to Resolve's clean row, grade byte-preserved. Live recipe: grab → `relayout` → reset grade → apply (same-structure applies keep the old layout). Bulk whole-project sweep: `project_db` `relayout_node_graphs` |
119
+ | `author_look` / `carry_look` | version an approved season/host look + plan carrying it across episodes |
120
+ | `lut_apply` | attach a named `.cube` LUT to a node (Body-LUT write path, round-trip asserted) |
121
+ | `scope_read` | frame readouts: parade balance, vectorscope skin-line, black-balance, %clip/%crush + intent signals |
122
+ | `intent_tags` | derive L1 shot-intent tags (low_key, monochromatic, motivated_warm) to exclude from neutralize |
123
+ | `verify_grade` | intended vs applied `.drx` → landed/drifted/missing/unverifiable |
124
+ | `extract_frames` | ffmpeg display-referred frame extraction (hard log-refuse) |
125
+ | `gamut_legal` | broadcast-legal + hard-clip QC (measurement only, no grade emitted) |
126
+
127
+ ### Pipeline foundation (`pipeline` tool — DB-as-truth)
128
+
129
+ A canonical local **SQLite project DB** is the source of truth; **YAML authoring compiles into it**
130
+ (4-layer inheritance: type → series → episode → deliverable, with validation); a **runner** reads the
131
+ resolved `pipeline:` and executes stages with gates + provenance; **readback** records decoded actual
132
+ state and flags intent↔actual **drift**. Deterministic stages run in Node; Resolve-apply stages emit an
133
+ action plan for the live agent (Node can't drive Resolve). Actions: `compile`, `list_entities`,
134
+ `get_entity`, `ancestry`, `catalog`, `plan`, `execute_stage`, `approve_gate`, `mark_applied`,
135
+ `readback`, `get_run`, `list_runs`, `provenance`, `drift`.
136
+
137
+ ## Layout
138
+ - `vendor/` — vendored, MIT copies of the format libraries (CommonJS):
139
+ - `drp-format/` — `.drp` project authoring/editing + grade injection + structural diff
140
+ - `drt-format/` — `.drt` timeline authoring (delegates to drp-format)
141
+ - `drx-codec/` — per-clip DRX grade parse/generate, CDL export, node-tree/curves/qualifier/window codecs
142
+ - `drx-parameters/` — calibrated parameter ranges/ids consumed by drx-codec
143
+ - `conform-qc/` — the offline conform/relink QC engine
144
+ - `server/` — the MCP server, tools, grading cores, and the DB-as-truth pipeline foundation
145
+ - `test/` — offline unit suite (`npm test`); `.prettierrc.json` — formatting config
146
+ - `package.json` — manifest; intentionally CommonJS (no `"type": "module"`) so the vendored libs load
147
+ under the repo's `type: module` root.
148
+
149
+ ## Requirements & optional features
150
+
151
+ The **core is pure-JS / MIT with zero required native modules or bundled binaries** — `drp`, `drt`,
152
+ `drx` (incl. the grading catalog needs `sharp`, see below), `offline_ref`, `fusion`, `audio_plan`,
153
+ `conform` (core), `color_trace`, `project_read`, `capabilities` all work out of the box, cloud or local.
154
+
155
+ A few features need something the **user installs themselves** (call the `capabilities` tool for live
156
+ status + install hints):
157
+
158
+ | Feature | Needs | Why not bundled / Install |
159
+ |---|---|---|
160
+ | `audio` (split/trim/convert), conform frame ops | **ffmpeg + ffprobe on PATH** | FFmpeg binaries are **GPL** — bundling them would taint this MIT package. `brew install ffmpeg` / `apt install ffmpeg` / `choco install ffmpeg`. |
161
+ | grading/QC catalog, `conform.verify` (frame compare) | `sharp` (optional) | native module; `npm i sharp` |
162
+ | `pipeline` (project DB), `fairlight` live-DB path, conform lineage/reverse | `better-sqlite3` (optional) | native module; `npm i better-sqlite3`. (The `.drp`-zip Fairlight path needs none.) |
163
+ | YAML authoring (`pipeline compile` from a YAML dir) | `js-yaml` (optional) | pure JS; `npm i js-yaml` |
164
+
165
+ Missing features fail with a clear, actionable message rather than crashing; the server logs a one-line
166
+ "needs setup" summary to stderr at startup.
167
+
168
+ ## Provenance & license
169
+ Vendored libraries are clean offline format-interop and deterministic compute code: no secrets, no
170
+ external service coupling, no network calls, no LLM dependency. Where a feature can take a second
171
+ opinion from an AI (the conform engine's advisory `VisionValidator`), it does so only through a
172
+ host-injected adapter — the engine ships the interface and a deterministic fake, never a concrete
173
+ LLM client. Licensed **MIT** under this repo's root `LICENSE` (Copyright DaVinci Resolve MCP
174
+ Contributors and Bradford Operations LLC).
175
+
176
+ > The bundled `vendor/drp-format/templates/media-clip-h264.drp` uses a neutral synthetic source
177
+ > (`/Media/sample.mp4`) — scrubbed of any personal path / third-party clip reference.
178
+
179
+ DRX write paths were calibrated live against DaVinci Resolve 19 Studio (2026-07): primaries use one
180
+ unified `space: 'ui' | 'drx'` value-space flag (panel units by default), and the structural writes —
181
+ power windows (circle/linear/gradient + polygon/curve vertex shapes), HSL/RGB/luma qualifiers, HDR
182
+ zones, ColorSlice globals, blur/key/motion-effects palettes, sat/lum-axis HSL curves, and hue-axis
183
+ HSL curves (single- **and** multi-band, via a canonical bezier-cage emitter that replicates Resolve's
184
+ own serialization; edge-on-band-slot geometry passes through raw) — are panel-readback-verified.
185
+ OFX/ResolveFX plugin params are read AND write verified (params are self-describing
186
+ on the wire; writes render-confirmed live — see the ResolveFX registry for the full
187
+ plugin universe, measured ranges, and per-plugin enum vocabularies). HDR zone
188
+ DEFINITIONS (custom Max Range/falloff), Motion Effects scales, and the tracker-data
189
+ blob are decoded and (where applicable) write-verified. Still experimental to write:
190
+ Color Warper on Resolve 19 (the pin-list wire format is R21's). Per-control status
191
+ lives in `vendor/drx-parameters/CALIBRATION-STATUS.md` — capabilities are flagged
192
+ honestly, not overclaimed.
193
+ The grading catalog and pipeline foundation are unit-tested offline; their Resolve **apply** is the
194
+ caller's job and is validated live separately.
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "davinci-resolve-advanced-mcp",
3
+ "version": "0.0.0-dev",
4
+ "private": true,
5
+ "license": "MIT",
6
+ "description": "Beyond-the-API DaVinci Resolve MCP — offline .drp/.drt/.drx authoring/editing. Sibling Node server to the Python davinci-resolve-mcp. Dev-local package.json; deps promote to the repo root at packaging.",
7
+ "comment_commonjs": "Intentionally NO \"type\": \"module\" — the vendored libs are CommonJS (require()). The repo root is type:module, so this nested manifest scopes resolve-advanced/**/*.js back to CommonJS.",
8
+ "comment_exports": "Public library surface so a downstream consumer can import the codec/grading/pipeline API, not just spawn the MCP bin. `.` = the lib barrel; `./mcp` = the stdio server entry. Still private:true — publish name/registry + un-privating are a parked decision.",
9
+ "main": "./server/lib.mjs",
10
+ "exports": {
11
+ ".": "./server/lib.mjs",
12
+ "./mcp": "./server/index.mjs",
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": [
16
+ "server/**/*.mjs",
17
+ "vendor/**",
18
+ "README.md"
19
+ ],
20
+ "dependencies": {
21
+ "@modelcontextprotocol/sdk": "^1.27.1",
22
+ "adm-zip": "^0.5.16",
23
+ "fast-xml-parser": "^5.7.3",
24
+ "fzstd": "^0.1.1",
25
+ "jszip": "^3.10.1",
26
+ "uuid": "^9.0.0",
27
+ "zod": "^3.25.76",
28
+ "zstd-codec": "^0.1.5"
29
+ },
30
+ "optionalDependencies": {
31
+ "better-sqlite3": "^11.10.0",
32
+ "js-yaml": "^4.3.0",
33
+ "pg": "^8.22.0",
34
+ "sharp": "^0.33.0"
35
+ },
36
+ "peerDependenciesMeta": {
37
+ "_comment": "audio (split/trim/convert) + conform frame ops need system ffmpeg/ffprobe on PATH (NOT bundled — FFmpeg binaries are GPL; this package stays MIT). Install ffmpeg yourself: brew install ffmpeg."
38
+ },
39
+ "scripts": {
40
+ "test": "node --test vendor/drp-format/__tests__/ vendor/drt-format/__tests__/ vendor/drx-codec/__tests__/ test/",
41
+ "test:libs": "node --test vendor/drp-format/__tests__/ vendor/drt-format/__tests__/ vendor/drx-codec/__tests__/",
42
+ "test:server": "node --test test/"
43
+ },
44
+ "engines": {
45
+ "node": ">=18.0.0"
46
+ },
47
+ "devDependencies": {
48
+ "prettier": "^3.9.4"
49
+ }
50
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * black_balance (P1d) — neutralize a SHADOW cast specifically. Where white_balance_match
3
+ * balances a mid/highlight neutral patch, this operates on the p1 shadow point ONLY: it aligns
4
+ * each channel's black point to a common target (the lowest channel black), removing a colour
5
+ * cast in the shadows WITHOUT lifting or crushing them (gain=1, offset-only).
6
+ *
7
+ * Emits an offset-only affine (reuse generateAssertedAffineDRX). Skips a clip whose shadows are
8
+ * already neutral (nothing to do — skip-not-fake). LOCAL & deterministic; no Resolve.
9
+ */
10
+ import fs from 'node:fs';
11
+ import { createRequire } from 'node:module';
12
+ import { generateAssertedAffineDRX } from './contrast-normalize.mjs';
13
+ import { provenanceLabel, gist } from './node-provenance.mjs';
14
+
15
+ const require = createRequire(import.meta.url);
16
+ function loadSharp() {
17
+ try {
18
+ return require('sharp');
19
+ } catch {
20
+ throw new Error("black-balance needs the optional dep 'sharp'. Install: npm i sharp");
21
+ }
22
+ }
23
+ const clamp = (x, lo, hi) => Math.max(lo, Math.min(hi, x));
24
+ function percentile(sorted, p) {
25
+ if (!sorted.length) return 0;
26
+ const idx = clamp(Math.round((p / 100) * (sorted.length - 1)), 0, sorted.length - 1);
27
+ return sorted[idx];
28
+ }
29
+
30
+ /** Per-channel black point (p1, 0..1). Returns {r,g,b} or null. */
31
+ export async function measureBlackPoint(pngPath, opts = {}) {
32
+ const sharp = loadSharp();
33
+ const lowP = opts.lowPct ?? 1,
34
+ maxSide = opts.maxSide ?? 480;
35
+ let data, ch;
36
+ try {
37
+ const out = await sharp(pngPath).resize(maxSide, maxSide, { fit: 'inside', kernel: 'nearest' }).raw().toBuffer({ resolveWithObject: true });
38
+ data = out.data;
39
+ ch = out.info.channels;
40
+ } catch {
41
+ return null;
42
+ }
43
+ const R = [],
44
+ G = [],
45
+ B = [];
46
+ for (let i = 0; i < data.length; i += ch) {
47
+ R.push(data[i]);
48
+ G.push(data[i + 1]);
49
+ B.push(data[i + 2]);
50
+ }
51
+ if (!R.length) return null;
52
+ R.sort((a, b) => a - b);
53
+ G.sort((a, b) => a - b);
54
+ B.sort((a, b) => a - b);
55
+ return { r: percentile(R, lowP) / 255, g: percentile(G, lowP) / 255, b: percentile(B, lowP) / 255 };
56
+ }
57
+
58
+ /**
59
+ * @param {Array<{id, png, group?}>} clips
60
+ * @param {{outDir, castThreshold?:number, clampOffset?:[number,number]}} opts
61
+ */
62
+ export async function computeBlackBalance(clips, opts = {}) {
63
+ if (!opts.outDir) throw new Error('opts.outDir required');
64
+ fs.mkdirSync(opts.outDir, { recursive: true });
65
+ const castThreshold = opts.castThreshold ?? 0.004; // ~1/255 — below this the shadows are already neutral
66
+ const [olo, ohi] = opts.clampOffset || [-0.2, 0.2];
67
+
68
+ const grades = [];
69
+ const warnings = [];
70
+ const skipped = [];
71
+ const report = {};
72
+ for (const c of clips) {
73
+ const bp = await measureBlackPoint(c.png, opts);
74
+ if (!bp) {
75
+ skipped.push({ id: c.id, reason: 'unreadable frame' });
76
+ continue;
77
+ }
78
+ const target = Math.min(bp.r, bp.g, bp.b); // align to the lowest black — pull casts DOWN, don't lift
79
+ const spread = Math.max(bp.r, bp.g, bp.b) - target;
80
+ if (spread < castThreshold) {
81
+ skipped.push({ id: c.id, reason: 'shadows already neutral', castSpread: +spread.toFixed(4) });
82
+ continue;
83
+ }
84
+ const gain = { r: 1, g: 1, b: 1 };
85
+ const offset = { r: clamp(target - bp.r, olo, ohi), g: clamp(target - bp.g, olo, ohi), b: clamp(target - bp.b, olo, ohi) };
86
+ const drxPath = `${opts.outDir}/${c.id}_blackbal.drx`;
87
+ await generateAssertedAffineDRX(gain, offset, provenanceLabel('black_balance', { source: 'shadow-neutral', gist: gist('offset', offset) }), drxPath, warnings);
88
+ grades.push({ id: c.id, offset, castSpreadPct: +(100 * spread).toFixed(2), drxPath });
89
+ report[c.id] = { castSpreadPct: +(100 * spread).toFixed(2) };
90
+ }
91
+ return { grades, report, warnings, skipped };
92
+ }