davinci-resolve-mcp 2.57.4 → 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 (328) hide show
  1. package/AGENTS.md +20 -0
  2. package/CHANGELOG.md +197 -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/docs/reference/api-limitations.md +38 -1
  21. package/install.py +27 -4
  22. package/package.json +23 -2
  23. package/resolve-advanced/README.md +194 -0
  24. package/resolve-advanced/package.json +50 -0
  25. package/resolve-advanced/server/black-balance.mjs +92 -0
  26. package/resolve-advanced/server/capabilities.mjs +86 -0
  27. package/resolve-advanced/server/cdl-io.mjs +76 -0
  28. package/resolve-advanced/server/contrast-normalize.mjs +180 -0
  29. package/resolve-advanced/server/db-patch.mjs +91 -0
  30. package/resolve-advanced/server/deliverable-entities.mjs +86 -0
  31. package/resolve-advanced/server/deliverable-qc.mjs +270 -0
  32. package/resolve-advanced/server/editorial.mjs +370 -0
  33. package/resolve-advanced/server/exposure-level.mjs +129 -0
  34. package/resolve-advanced/server/extract-frames.mjs +196 -0
  35. package/resolve-advanced/server/ffprobe-media.mjs +88 -0
  36. package/resolve-advanced/server/gamut-legal.mjs +112 -0
  37. package/resolve-advanced/server/grade-body-patch.mjs +246 -0
  38. package/resolve-advanced/server/grade-transfer.mjs +66 -0
  39. package/resolve-advanced/server/group-grade-read.mjs +137 -0
  40. package/resolve-advanced/server/index.mjs +105 -0
  41. package/resolve-advanced/server/lib.mjs +84 -0
  42. package/resolve-advanced/server/libs.mjs +65 -0
  43. package/resolve-advanced/server/lineage-db.mjs +479 -0
  44. package/resolve-advanced/server/lut-apply.mjs +61 -0
  45. package/resolve-advanced/server/match-to-reference.mjs +173 -0
  46. package/resolve-advanced/server/media-inventory.mjs +169 -0
  47. package/resolve-advanced/server/media-ops.mjs +243 -0
  48. package/resolve-advanced/server/node-meta-db.mjs +62 -0
  49. package/resolve-advanced/server/node-provenance.mjs +102 -0
  50. package/resolve-advanced/server/offline-ref-db.mjs +420 -0
  51. package/resolve-advanced/server/offline-ref.mjs +179 -0
  52. package/resolve-advanced/server/project-db.mjs +233 -0
  53. package/resolve-advanced/server/provenance-audit.mjs +210 -0
  54. package/resolve-advanced/server/qc-frame.mjs +224 -0
  55. package/resolve-advanced/server/qc-sampler.mjs +67 -0
  56. package/resolve-advanced/server/readback.mjs +77 -0
  57. package/resolve-advanced/server/render-manifest.mjs +93 -0
  58. package/resolve-advanced/server/reverse-clip-db.mjs +270 -0
  59. package/resolve-advanced/server/runner-apply-contract.mjs +64 -0
  60. package/resolve-advanced/server/runner.mjs +244 -0
  61. package/resolve-advanced/server/saturation-match.mjs +108 -0
  62. package/resolve-advanced/server/scope-read.mjs +257 -0
  63. package/resolve-advanced/server/season-look.mjs +96 -0
  64. package/resolve-advanced/server/shot-intent.mjs +82 -0
  65. package/resolve-advanced/server/shot-match.mjs +147 -0
  66. package/resolve-advanced/server/skin-match.mjs +205 -0
  67. package/resolve-advanced/server/spec-compile.mjs +217 -0
  68. package/resolve-advanced/server/tone-curve-transfer.mjs +184 -0
  69. package/resolve-advanced/server/tool-catalog.mjs +265 -0
  70. package/resolve-advanced/server/tools/audio.mjs +54 -0
  71. package/resolve-advanced/server/tools/audio_plan.mjs +58 -0
  72. package/resolve-advanced/server/tools/capabilities.mjs +16 -0
  73. package/resolve-advanced/server/tools/color_trace.mjs +165 -0
  74. package/resolve-advanced/server/tools/conform.mjs +291 -0
  75. package/resolve-advanced/server/tools/deliverable.mjs +105 -0
  76. package/resolve-advanced/server/tools/drp.mjs +232 -0
  77. package/resolve-advanced/server/tools/drt.mjs +200 -0
  78. package/resolve-advanced/server/tools/drx.mjs +943 -0
  79. package/resolve-advanced/server/tools/editorial.mjs +69 -0
  80. package/resolve-advanced/server/tools/fairlight.mjs +108 -0
  81. package/resolve-advanced/server/tools/fusion.mjs +64 -0
  82. package/resolve-advanced/server/tools/media.mjs +102 -0
  83. package/resolve-advanced/server/tools/offline_ref.mjs +123 -0
  84. package/resolve-advanced/server/tools/pipeline.mjs +137 -0
  85. package/resolve-advanced/server/tools/project_db.mjs +200 -0
  86. package/resolve-advanced/server/tools/project_read.mjs +212 -0
  87. package/resolve-advanced/server/tools/provenance.mjs +73 -0
  88. package/resolve-advanced/server/verify-grade.mjs +113 -0
  89. package/resolve-advanced/server/white-balance-match.mjs +122 -0
  90. package/resolve-advanced/vendor/audio/format-converter.js +330 -0
  91. package/resolve-advanced/vendor/audio/split.js +173 -0
  92. package/resolve-advanced/vendor/audio/trim.js +188 -0
  93. package/resolve-advanced/vendor/audio-fairlight/index.js +391 -0
  94. package/resolve-advanced/vendor/conform-qc/adapters/frame-sampler.js +56 -0
  95. package/resolve-advanced/vendor/conform-qc/adapters/local-ffmpeg-sampler.js +65 -0
  96. package/resolve-advanced/vendor/conform-qc/adapters/rendernode-ffmpeg-sampler.js +50 -0
  97. package/resolve-advanced/vendor/conform-qc/adapters/resolve/driver.py +176 -0
  98. package/resolve-advanced/vendor/conform-qc/adapters/resolve-driver.js +61 -0
  99. package/resolve-advanced/vendor/conform-qc/adapters/resolve-headless-driver.js +86 -0
  100. package/resolve-advanced/vendor/conform-qc/adapters/vision-validator.js +75 -0
  101. package/resolve-advanced/vendor/conform-qc/cli.js +63 -0
  102. package/resolve-advanced/vendor/conform-qc/compare/advisory.js +106 -0
  103. package/resolve-advanced/vendor/conform-qc/compare/decode.js +36 -0
  104. package/resolve-advanced/vendor/conform-qc/compare/index.js +61 -0
  105. package/resolve-advanced/vendor/conform-qc/compare/locate.js +70 -0
  106. package/resolve-advanced/vendor/conform-qc/compare/metrics.js +409 -0
  107. package/resolve-advanced/vendor/conform-qc/docs/runbook.md +72 -0
  108. package/resolve-advanced/vendor/conform-qc/index.js +49 -0
  109. package/resolve-advanced/vendor/conform-qc/knowledge/index.js +110 -0
  110. package/resolve-advanced/vendor/conform-qc/ops/conform-core.js +137 -0
  111. package/resolve-advanced/vendor/conform-qc/ops/conform-diff.js +109 -0
  112. package/resolve-advanced/vendor/conform-qc/ops/insert.js +108 -0
  113. package/resolve-advanced/vendor/conform-qc/ops/local-conform.js +61 -0
  114. package/resolve-advanced/vendor/conform-qc/ops/patch.js +80 -0
  115. package/resolve-advanced/vendor/conform-qc/ops/trigger.js +32 -0
  116. package/resolve-advanced/vendor/conform-qc/ops/verify.js +105 -0
  117. package/resolve-advanced/vendor/conform-qc/ops/workflow.js +30 -0
  118. package/resolve-advanced/vendor/conform-qc/oracle/emulate.js +155 -0
  119. package/resolve-advanced/vendor/conform-qc/oracle/index.js +38 -0
  120. package/resolve-advanced/vendor/conform-qc/oracle/resolve.js +196 -0
  121. package/resolve-advanced/vendor/conform-qc/package.json +16 -0
  122. package/resolve-advanced/vendor/conform-qc/packaging/emit-aaf.js +30 -0
  123. package/resolve-advanced/vendor/conform-qc/packaging/emit-fcp7.js +64 -0
  124. package/resolve-advanced/vendor/conform-qc/packaging/index.js +169 -0
  125. package/resolve-advanced/vendor/conform-qc/packaging/media-ops.js +56 -0
  126. package/resolve-advanced/vendor/conform-qc/packaging/otio.js +50 -0
  127. package/resolve-advanced/vendor/conform-qc/packaging/relink.js +50 -0
  128. package/resolve-advanced/vendor/conform-qc/packaging/surgical-relink.js +195 -0
  129. package/resolve-advanced/vendor/conform-qc/parse/index.js +54 -0
  130. package/resolve-advanced/vendor/conform-qc/parse/merge-dto.js +27 -0
  131. package/resolve-advanced/vendor/conform-qc/parse/xmeml-geometry.js +256 -0
  132. package/resolve-advanced/vendor/conform-qc/reference/burnin-ocr.js +100 -0
  133. package/resolve-advanced/vendor/conform-qc/reference/sidecar.js +37 -0
  134. package/resolve-advanced/vendor/conform-qc/repair/analysis.js +62 -0
  135. package/resolve-advanced/vendor/conform-qc/repair/index.js +78 -0
  136. package/resolve-advanced/vendor/conform-qc/repair/media-analysis.js +139 -0
  137. package/resolve-advanced/vendor/conform-qc/repair/media-index.js +135 -0
  138. package/resolve-advanced/vendor/conform-qc/repair/strategies.js +250 -0
  139. package/resolve-advanced/vendor/conform-qc/report/index.js +133 -0
  140. package/resolve-advanced/vendor/conform-qc/roles/index.js +96 -0
  141. package/resolve-advanced/vendor/conform-qc/synthetic/generate.js +233 -0
  142. package/resolve-advanced/vendor/conform-qc/test/advisory.test.js +85 -0
  143. package/resolve-advanced/vendor/conform-qc/test/cli.test.js +39 -0
  144. package/resolve-advanced/vendor/conform-qc/test/compare.test.js +152 -0
  145. package/resolve-advanced/vendor/conform-qc/test/conform-diff.test.js +70 -0
  146. package/resolve-advanced/vendor/conform-qc/test/emulate.test.js +51 -0
  147. package/resolve-advanced/vendor/conform-qc/test/frame-sampler.test.js +30 -0
  148. package/resolve-advanced/vendor/conform-qc/test/geometry.test.js +112 -0
  149. package/resolve-advanced/vendor/conform-qc/test/knowledge.test.js +56 -0
  150. package/resolve-advanced/vendor/conform-qc/test/lifecycle.test.js +110 -0
  151. package/resolve-advanced/vendor/conform-qc/test/local-ffmpeg-sampler.test.js +66 -0
  152. package/resolve-advanced/vendor/conform-qc/test/locate.test.js +63 -0
  153. package/resolve-advanced/vendor/conform-qc/test/media-analysis.test.js +63 -0
  154. package/resolve-advanced/vendor/conform-qc/test/media-index-normalized.test.js +65 -0
  155. package/resolve-advanced/vendor/conform-qc/test/media-index-origin.test.js +53 -0
  156. package/resolve-advanced/vendor/conform-qc/test/metrics-fast.test.js +91 -0
  157. package/resolve-advanced/vendor/conform-qc/test/oracle-reverse.test.js +86 -0
  158. package/resolve-advanced/vendor/conform-qc/test/oracle.test.js +136 -0
  159. package/resolve-advanced/vendor/conform-qc/test/p0-acceptance.test.js +60 -0
  160. package/resolve-advanced/vendor/conform-qc/test/p1-acceptance.test.js +75 -0
  161. package/resolve-advanced/vendor/conform-qc/test/p45-patch-acceptance.test.js +102 -0
  162. package/resolve-advanced/vendor/conform-qc/test/packaging.test.js +133 -0
  163. package/resolve-advanced/vendor/conform-qc/test/parse-stubs.test.js +28 -0
  164. package/resolve-advanced/vendor/conform-qc/test/repair-strategies.test.js +128 -0
  165. package/resolve-advanced/vendor/conform-qc/test/repair.test.js +84 -0
  166. package/resolve-advanced/vendor/conform-qc/test/report.test.js +52 -0
  167. package/resolve-advanced/vendor/conform-qc/test/resolve-readback.test.js +71 -0
  168. package/resolve-advanced/vendor/conform-qc/test/roles.test.js +107 -0
  169. package/resolve-advanced/vendor/conform-qc/test/runbook.test.js +30 -0
  170. package/resolve-advanced/vendor/conform-qc/test/scale-residual.test.js +40 -0
  171. package/resolve-advanced/vendor/conform-qc/test/sidecar.test.js +51 -0
  172. package/resolve-advanced/vendor/conform-qc/test/smoke.test.js +87 -0
  173. package/resolve-advanced/vendor/conform-qc/test/surgical-relink.test.js +73 -0
  174. package/resolve-advanced/vendor/conform-qc/test/synthetic.test.js +98 -0
  175. package/resolve-advanced/vendor/conform-qc/test/verify.test.js +93 -0
  176. package/resolve-advanced/vendor/conform-qc/test/vision-validator.test.js +43 -0
  177. package/resolve-advanced/vendor/conform-qc/test/workflow-driver.test.js +46 -0
  178. package/resolve-advanced/vendor/conform-qc/toolset/index.js +53 -0
  179. package/resolve-advanced/vendor/drp-format/README.md +116 -0
  180. package/resolve-advanced/vendor/drp-format/__tests__/_resolve-verify.js +39 -0
  181. package/resolve-advanced/vendor/drp-format/__tests__/add-media-clip.test.js +30 -0
  182. package/resolve-advanced/vendor/drp-format/__tests__/assemble-timeline.test.js +68 -0
  183. package/resolve-advanced/vendor/drp-format/__tests__/author-project.test.js +57 -0
  184. package/resolve-advanced/vendor/drp-format/__tests__/composition-text.test.js +98 -0
  185. package/resolve-advanced/vendor/drp-format/__tests__/diff.test.js +272 -0
  186. package/resolve-advanced/vendor/drp-format/__tests__/effect-filters-compressed.test.js +143 -0
  187. package/resolve-advanced/vendor/drp-format/__tests__/fixtures/p0-3-session30-empty-effectfilters.drp +0 -0
  188. package/resolve-advanced/vendor/drp-format/__tests__/fixtures/retimed-timemap-50pct.hex +1 -0
  189. package/resolve-advanced/vendor/drp-format/__tests__/fixtures/retimed-timemap-dynamic.hex +1 -0
  190. package/resolve-advanced/vendor/drp-format/__tests__/inject-grades.test.js +238 -0
  191. package/resolve-advanced/vendor/drp-format/__tests__/keyed-dict.test.js +85 -0
  192. package/resolve-advanced/vendor/drp-format/__tests__/lut-refs.test.js +119 -0
  193. package/resolve-advanced/vendor/drp-format/__tests__/media-blobs.test.js +25 -0
  194. package/resolve-advanced/vendor/drp-format/__tests__/media-timemap.test.js +119 -0
  195. package/resolve-advanced/vendor/drp-format/__tests__/place-fusion-title.test.js +52 -0
  196. package/resolve-advanced/vendor/drp-format/__tests__/place-generator.test.js +40 -0
  197. package/resolve-advanced/vendor/drp-format/__tests__/place-transition.test.js +48 -0
  198. package/resolve-advanced/vendor/drp-format/__tests__/protobuf-wire.test.js +64 -0
  199. package/resolve-advanced/vendor/drp-format/__tests__/relink-media.test.js +106 -0
  200. package/resolve-advanced/vendor/drp-format/__tests__/splice-clips.test.js +256 -0
  201. package/resolve-advanced/vendor/drp-format/assemble-timeline.js +65 -0
  202. package/resolve-advanced/vendor/drp-format/author-project.js +118 -0
  203. package/resolve-advanced/vendor/drp-format/composition-text.js +213 -0
  204. package/resolve-advanced/vendor/drp-format/curves-encoder.js +763 -0
  205. package/resolve-advanced/vendor/drp-format/diff.js +310 -0
  206. package/resolve-advanced/vendor/drp-format/drp-packager.js +201 -0
  207. package/resolve-advanced/vendor/drp-format/drp-validator.js +809 -0
  208. package/resolve-advanced/vendor/drp-format/effect-encoder.js +640 -0
  209. package/resolve-advanced/vendor/drp-format/extract-lut-refs.js +119 -0
  210. package/resolve-advanced/vendor/drp-format/grade-encoder.example.js +133 -0
  211. package/resolve-advanced/vendor/drp-format/grade-encoder.js +401 -0
  212. package/resolve-advanced/vendor/drp-format/grade-encoder.test.js +171 -0
  213. package/resolve-advanced/vendor/drp-format/grade-encoder.verify.js +249 -0
  214. package/resolve-advanced/vendor/drp-format/grade-node-extractor.js +495 -0
  215. package/resolve-advanced/vendor/drp-format/grade-parameter-decoder.js +774 -0
  216. package/resolve-advanced/vendor/drp-format/index.js +174 -0
  217. package/resolve-advanced/vendor/drp-format/inject-grades.js +219 -0
  218. package/resolve-advanced/vendor/drp-format/keyed-dict.js +227 -0
  219. package/resolve-advanced/vendor/drp-format/marker-encoder.js +532 -0
  220. package/resolve-advanced/vendor/drp-format/media-blobs.js +53 -0
  221. package/resolve-advanced/vendor/drp-format/media-timemap.js +164 -0
  222. package/resolve-advanced/vendor/drp-format/mp-folder-builder.js +293 -0
  223. package/resolve-advanced/vendor/drp-format/node-tree-encoder.js +1246 -0
  224. package/resolve-advanced/vendor/drp-format/package.json +18 -0
  225. package/resolve-advanced/vendor/drp-format/place-fusion-title.js +131 -0
  226. package/resolve-advanced/vendor/drp-format/place-generator.js +77 -0
  227. package/resolve-advanced/vendor/drp-format/place-transition.js +91 -0
  228. package/resolve-advanced/vendor/drp-format/power-window-encoder.js +776 -0
  229. package/resolve-advanced/vendor/drp-format/protobuf-wire.js +111 -0
  230. package/resolve-advanced/vendor/drp-format/qualifier-encoder.js +706 -0
  231. package/resolve-advanced/vendor/drp-format/relink-media.js +218 -0
  232. package/resolve-advanced/vendor/drp-format/rich-title-encoder.js +447 -0
  233. package/resolve-advanced/vendor/drp-format/seq-container-builder.js +572 -0
  234. package/resolve-advanced/vendor/drp-format/seq-surgery.js +155 -0
  235. package/resolve-advanced/vendor/drp-format/splice-clips.js +445 -0
  236. package/resolve-advanced/vendor/drp-format/templates/empty-project.drp +0 -0
  237. package/resolve-advanced/vendor/drp-format/templates/fusion-title.xml +56 -0
  238. package/resolve-advanced/vendor/drp-format/templates/generator-solid-color.xml +21 -0
  239. package/resolve-advanced/vendor/drp-format/templates/media-clip-h264.drp +0 -0
  240. package/resolve-advanced/vendor/drp-format/templates/transition-cross-dissolve.xml +22 -0
  241. package/resolve-advanced/vendor/drp-format/tool-registry.descriptor.js +80 -0
  242. package/resolve-advanced/vendor/drp-format/utils/safe-archive.js +54 -0
  243. package/resolve-advanced/vendor/drp-format/xml-builder.js +759 -0
  244. package/resolve-advanced/vendor/drt-format/__tests__/_resolve-verify.js +21 -0
  245. package/resolve-advanced/vendor/drt-format/__tests__/build.test.js +113 -0
  246. package/resolve-advanced/vendor/drt-format/__tests__/multi-format.test.js +93 -0
  247. package/resolve-advanced/vendor/drt-format/__tests__/parse-real-resolve21.test.js +51 -0
  248. package/resolve-advanced/vendor/drt-format/__tests__/parse.test.js +134 -0
  249. package/resolve-advanced/vendor/drt-format/__tests__/resolve-versions.test.js +120 -0
  250. package/resolve-advanced/vendor/drt-format/__tests__/schema-fingerprint.test.js +62 -0
  251. package/resolve-advanced/vendor/drt-format/__tests__/smoke.test.js +27 -0
  252. package/resolve-advanced/vendor/drt-format/__tests__/validate.test.js +109 -0
  253. package/resolve-advanced/vendor/drt-format/capabilities.js +69 -0
  254. package/resolve-advanced/vendor/drt-format/capability-domains.js +56 -0
  255. package/resolve-advanced/vendor/drt-format/drt-builder.js +42 -0
  256. package/resolve-advanced/vendor/drt-format/drt-parser.js +164 -0
  257. package/resolve-advanced/vendor/drt-format/drt-validator.js +98 -0
  258. package/resolve-advanced/vendor/drt-format/index.js +45 -0
  259. package/resolve-advanced/vendor/drt-format/package.json +17 -0
  260. package/resolve-advanced/vendor/drt-format/resolve-versions.js +153 -0
  261. package/resolve-advanced/vendor/drt-format/schema-fingerprint.js +74 -0
  262. package/resolve-advanced/vendor/drt-format/templates/drt-project-shell.xml +124 -0
  263. package/resolve-advanced/vendor/drx-codec/__tests__/curves-roundtrip.test.js +148 -0
  264. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-face-refinement.drx +58 -0
  265. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-filmgrain.drx +58 -0
  266. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-glow.drx +58 -0
  267. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-lens-flare.drx +58 -0
  268. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-3-beauty-25.drx +58 -0
  269. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-3-beauty-75.drx +58 -0
  270. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p5-1-node-no-lut.drx +58 -0
  271. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p5-1-node-with-lut.drx +58 -0
  272. package/resolve-advanced/vendor/drx-codec/__tests__/hsl-curves-roundtrip.test.js +117 -0
  273. package/resolve-advanced/vendor/drx-codec/__tests__/lut-refs-roundtrip.test.js +112 -0
  274. package/resolve-advanced/vendor/drx-codec/__tests__/matte-roundtrip.test.js +167 -0
  275. package/resolve-advanced/vendor/drx-codec/__tests__/ofx-roundtrip.test.js +215 -0
  276. package/resolve-advanced/vendor/drx-codec/__tests__/ofx-slugs-discovery.test.js +149 -0
  277. package/resolve-advanced/vendor/drx-codec/__tests__/power-window-roundtrip.test.js +230 -0
  278. package/resolve-advanced/vendor/drx-codec/__tests__/qualifier-roundtrip.test.js +226 -0
  279. package/resolve-advanced/vendor/drx-codec/cdl-exporter.js +470 -0
  280. package/resolve-advanced/vendor/drx-codec/color-nlp-parser.js +833 -0
  281. package/resolve-advanced/vendor/drx-codec/data/color-nlp-action-mappings.json +2232 -0
  282. package/resolve-advanced/vendor/drx-codec/drx-generator.js +4123 -0
  283. package/resolve-advanced/vendor/drx-codec/drx-merger.js +320 -0
  284. package/resolve-advanced/vendor/drx-codec/drx-parser.js +1808 -0
  285. package/resolve-advanced/vendor/drx-codec/extract-custom-curves.js +215 -0
  286. package/resolve-advanced/vendor/drx-codec/extract-hsl-curves.js +180 -0
  287. package/resolve-advanced/vendor/drx-codec/extract-lut-refs.js +158 -0
  288. package/resolve-advanced/vendor/drx-codec/extract-matte-finesse.js +83 -0
  289. package/resolve-advanced/vendor/drx-codec/extract-ofx-params.js +226 -0
  290. package/resolve-advanced/vendor/drx-codec/extract-power-window.js +184 -0
  291. package/resolve-advanced/vendor/drx-codec/extract-qualifier.js +99 -0
  292. package/resolve-advanced/vendor/drx-codec/index.js +109 -0
  293. package/resolve-advanced/vendor/drx-codec/node-layout.js +249 -0
  294. package/resolve-advanced/vendor/drx-codec/resolved-drx-generator.js +393 -0
  295. package/resolve-advanced/vendor/drx-codec/tool-resolver.js +974 -0
  296. package/resolve-advanced/vendor/drx-codec/training-examples.js +548 -0
  297. package/resolve-advanced/vendor/drx-codec/vocabulary-intents.js +539 -0
  298. package/resolve-advanced/vendor/drx-parameters/CALIBRATION-STATUS.md +319 -0
  299. package/resolve-advanced/vendor/drx-parameters/DRX-VALUE-SCALING.md +251 -0
  300. package/resolve-advanced/vendor/drx-parameters/calibrated-ranges.json +17737 -0
  301. package/resolve-advanced/vendor/drx-parameters/corrector-types.js +120 -0
  302. package/resolve-advanced/vendor/drx-parameters/index.js +193 -0
  303. package/resolve-advanced/vendor/drx-parameters/parameter-codec.js +451 -0
  304. package/resolve-advanced/vendor/drx-parameters/parameter-ids.js +1292 -0
  305. package/resolve-advanced/vendor/drx-parameters/parameter-ranges.js +570 -0
  306. package/resolve-advanced/vendor/drx-parameters/parameter-validator.js +392 -0
  307. package/resolve-advanced/vendor/drx-parameters/resolvefx-registry.json +14973 -0
  308. package/resolve-advanced/vendor/drx-parameters/tool-registry.descriptor.js +38 -0
  309. package/resolve-advanced/vendor/drx-parameters/tools/drx-analyzer.js +371 -0
  310. package/resolve-advanced/vendor/fairlight/index.js +833 -0
  311. package/resolve-advanced/vendor/fusion-codec/composition-generator.js +401 -0
  312. package/resolve-advanced/vendor/fusion-codec/templates/blur-region.js +103 -0
  313. package/resolve-advanced/vendor/fusion-codec/templates/color-correct.js +87 -0
  314. package/resolve-advanced/vendor/fusion-codec/templates/film-grain.js +106 -0
  315. package/resolve-advanced/vendor/fusion-codec/templates/lower-third.js +241 -0
  316. package/resolve-advanced/vendor/fusion-codec/templates/picture-in-picture.js +188 -0
  317. package/resolve-advanced/vendor/fusion-codec/templates/text-overlay.js +161 -0
  318. package/resolve-advanced/vendor/fusion-codec/templates/title-card.js +184 -0
  319. package/resolve-advanced/vendor/fusion-codec/templates/vignette.js +107 -0
  320. package/resolve-advanced/vendor/fusion-codec/templates/watermark.js +101 -0
  321. package/scripts/agent-rules/README.md +68 -0
  322. package/src/analysis_dashboard.py +233 -1
  323. package/src/granular/common.py +1 -1
  324. package/src/server.py +479 -29
  325. package/src/utils/api_truth.py +117 -0
  326. package/src/utils/cut_ir.py +1 -1
  327. package/src/utils/failure_tracker.py +0 -2
  328. package/src/utils/timeline_xml.py +405 -0
@@ -0,0 +1,495 @@
1
+ /**
2
+ * DaVinci Resolve Grade Node Extractor
3
+ *
4
+ * Extracts color correction nodes from DRP Body data.
5
+ *
6
+ * @module grade-node-extractor
7
+ */
8
+
9
+ const AdmZip = require('adm-zip');
10
+ const { XMLParser } = require('fast-xml-parser');
11
+ const { ZstdCodec } = require('zstd-codec');
12
+
13
+ /**
14
+ * Known node type identifiers based on Field 9.Field 1.Field 6 patterns
15
+ */
16
+ const NODE_TYPES = {
17
+ // Common patterns found in Field 1 of node params
18
+ 1: 'Primary Corrector',
19
+ 2: 'Contrast',
20
+ 3: 'Saturation',
21
+ 4: 'Hue',
22
+ 5: 'Lum Mix',
23
+ 6: 'Offset',
24
+ 18: 'Custom Curves',
25
+ };
26
+
27
+ /**
28
+ * Initialize ZSTD codec
29
+ */
30
+ let zstdCodec = null;
31
+ async function initZstd() {
32
+ if (zstdCodec) return zstdCodec;
33
+ zstdCodec = await new Promise((resolve) => {
34
+ ZstdCodec.run(zstd => resolve(new zstd.Streaming()));
35
+ });
36
+ return zstdCodec;
37
+ }
38
+
39
+ /**
40
+ * Decode a protobuf varint
41
+ */
42
+ function decodeVarint(buf, offset) {
43
+ let value = 0;
44
+ let shift = 0;
45
+ let pos = offset;
46
+
47
+ while (pos < buf.length) {
48
+ const byte = buf[pos];
49
+ value |= (byte & 0x7f) << shift;
50
+ pos++;
51
+ if ((byte & 0x80) === 0) break;
52
+ shift += 7;
53
+ }
54
+
55
+ return { value, bytesRead: pos - offset };
56
+ }
57
+
58
+ /**
59
+ * Parse protobuf message
60
+ */
61
+ function parseProtobuf(buf, start, end, depth = 0) {
62
+ const fields = [];
63
+ let offset = start;
64
+
65
+ while (offset < end && depth < 10) {
66
+ if (offset >= buf.length) break;
67
+
68
+ const tagResult = decodeVarint(buf, offset);
69
+ const tag = tagResult.value;
70
+ offset += tagResult.bytesRead;
71
+
72
+ const fieldNum = tag >> 3;
73
+ const wireType = tag & 0x7;
74
+
75
+ if (fieldNum === 0 || fieldNum > 1000) break;
76
+
77
+ let value;
78
+ let rawBytes;
79
+
80
+ switch (wireType) {
81
+ case 0: // Varint
82
+ const varintResult = decodeVarint(buf, offset);
83
+ value = varintResult.value;
84
+ offset += varintResult.bytesRead;
85
+ fields.push({ fieldNum, type: 'varint', value });
86
+ break;
87
+
88
+ case 1: // 64-bit
89
+ if (offset + 8 > end) return fields;
90
+ value = buf.readDoubleLE(offset);
91
+ offset += 8;
92
+ fields.push({ fieldNum, type: 'double', value });
93
+ break;
94
+
95
+ case 2: // Length-delimited
96
+ const lenResult = decodeVarint(buf, offset);
97
+ const len = lenResult.value;
98
+ offset += lenResult.bytesRead;
99
+
100
+ if (len > 50000 || offset + len > end) return fields;
101
+
102
+ rawBytes = buf.slice(offset, offset + len);
103
+
104
+ // Try to parse as nested protobuf
105
+ let nested = null;
106
+ if (len > 2 && len < 10000) {
107
+ try {
108
+ nested = parseProtobuf(buf, offset, offset + len, depth + 1);
109
+ if (nested.length === 0) nested = null;
110
+ } catch (e) {}
111
+ }
112
+
113
+ offset += len;
114
+ fields.push({
115
+ fieldNum,
116
+ type: 'bytes',
117
+ length: len,
118
+ nested,
119
+ raw: rawBytes
120
+ });
121
+ break;
122
+
123
+ case 5: // 32-bit
124
+ if (offset + 4 > end) return fields;
125
+ value = buf.readFloatLE(offset);
126
+ offset += 4;
127
+ fields.push({ fieldNum, type: 'float', value });
128
+ break;
129
+
130
+ default:
131
+ return fields;
132
+ }
133
+ }
134
+
135
+ return fields;
136
+ }
137
+
138
+ /**
139
+ * Extract node data from parsed protobuf
140
+ */
141
+ function extractNodes(fields) {
142
+ const nodes = [];
143
+ const connections = [];
144
+
145
+ // Find all Field 7 entries (nodes) and Field 8 entries (connections)
146
+ for (const field of fields) {
147
+ if (field.fieldNum === 7 && field.nested) {
148
+ const node = parseNode(field.nested);
149
+ if (node) nodes.push(node);
150
+ } else if (field.fieldNum === 8 && field.nested) {
151
+ const conn = parseConnection(field.nested);
152
+ if (conn) connections.push(conn);
153
+ }
154
+ }
155
+
156
+ return { nodes, connections };
157
+ }
158
+
159
+ /**
160
+ * Parse a single node from protobuf fields
161
+ */
162
+ function parseNode(fields) {
163
+ const node = {
164
+ id: null,
165
+ index: null,
166
+ posX: null,
167
+ posY: null,
168
+ label: null,
169
+ enabled: true,
170
+ parameters: [],
171
+ timestamp: null
172
+ };
173
+
174
+ for (const field of fields) {
175
+ switch (field.fieldNum) {
176
+ case 1:
177
+ node.id = field.value;
178
+ break;
179
+ case 2:
180
+ node.index = field.value;
181
+ break;
182
+ case 4:
183
+ node.posX = field.value;
184
+ break;
185
+ case 5:
186
+ node.posY = field.value;
187
+ break;
188
+ case 6:
189
+ // Label (string bytes)
190
+ if (field.raw) {
191
+ node.label = field.raw.toString('utf-8').replace(/\x00/g, '');
192
+ }
193
+ break;
194
+ case 7:
195
+ node.enabled = field.value === 1;
196
+ break;
197
+ case 9:
198
+ // Node parameters (nested message with corrector settings)
199
+ if (field.nested) {
200
+ node.parameters = extractNodeParameters(field.nested);
201
+ }
202
+ break;
203
+ case 12:
204
+ node.timestamp = field.value;
205
+ break;
206
+ }
207
+ }
208
+
209
+ return node.id !== null ? node : null;
210
+ }
211
+
212
+ /**
213
+ * Extract parameters from node's Field 9
214
+ */
215
+ function extractNodeParameters(fields) {
216
+ const params = [];
217
+
218
+ for (const field of fields) {
219
+ if (field.fieldNum === 1 && field.nested) {
220
+ // Each Field 1 is a corrector type
221
+ const corrector = parseCorrectorParams(field.nested);
222
+ if (corrector) params.push(corrector);
223
+ }
224
+ }
225
+
226
+ return params;
227
+ }
228
+
229
+ /**
230
+ * Parse corrector parameters
231
+ */
232
+ function parseCorrectorParams(fields) {
233
+ const corrector = {
234
+ type: null,
235
+ typeId: null,
236
+ enabled: true,
237
+ values: []
238
+ };
239
+
240
+ for (const field of fields) {
241
+ switch (field.fieldNum) {
242
+ case 1:
243
+ corrector.typeId = field.value;
244
+ corrector.type = NODE_TYPES[field.value] || `Type ${field.value}`;
245
+ break;
246
+ case 3:
247
+ corrector.enabled = field.value === 1;
248
+ break;
249
+ case 6:
250
+ // Nested parameter values
251
+ if (field.nested) {
252
+ corrector.values = extractParameterValues(field.nested);
253
+ } else if (field.raw) {
254
+ // Try to extract floats from raw bytes
255
+ corrector.rawSize = field.length;
256
+ }
257
+ break;
258
+ }
259
+ }
260
+
261
+ return corrector.typeId !== null ? corrector : null;
262
+ }
263
+
264
+ /**
265
+ * Extract parameter values (floats/doubles from nested data)
266
+ */
267
+ function extractParameterValues(fields) {
268
+ const values = [];
269
+
270
+ for (const field of fields) {
271
+ if (field.type === 'float') {
272
+ values.push({ param: field.fieldNum, value: field.value });
273
+ } else if (field.type === 'double') {
274
+ values.push({ param: field.fieldNum, value: field.value });
275
+ } else if (field.nested) {
276
+ // Recurse into nested
277
+ const nested = extractParameterValues(field.nested);
278
+ values.push(...nested);
279
+ }
280
+ }
281
+
282
+ return values;
283
+ }
284
+
285
+ /**
286
+ * Parse connection from protobuf fields
287
+ */
288
+ function parseConnection(fields) {
289
+ const conn = {
290
+ sourceNode: null,
291
+ targetNode: null,
292
+ sourcePort: null,
293
+ targetPort: null,
294
+ linkIndex: null
295
+ };
296
+
297
+ for (const field of fields) {
298
+ switch (field.fieldNum) {
299
+ case 1:
300
+ conn.sourceNode = field.value;
301
+ break;
302
+ case 3:
303
+ conn.targetNode = field.value;
304
+ break;
305
+ case 5:
306
+ conn.sourcePort = field.value;
307
+ break;
308
+ case 6:
309
+ conn.targetPort = field.value;
310
+ break;
311
+ case 7:
312
+ conn.linkIndex = field.value;
313
+ break;
314
+ }
315
+ }
316
+
317
+ return conn.sourceNode !== null ? conn : null;
318
+ }
319
+
320
+ /**
321
+ * Decompress and parse grade body data
322
+ */
323
+ async function parseGradeBody(hexData) {
324
+ const codec = await initZstd();
325
+ const buf = Buffer.from(hexData, 'hex');
326
+
327
+ let data;
328
+ if (buf[0] === 0x81) {
329
+ // ZSTD compressed
330
+ const compressed = new Uint8Array(buf.slice(1));
331
+ data = Buffer.from(codec.decompress(compressed));
332
+ } else if (buf[0] === 0x80) {
333
+ // Uncompressed
334
+ data = buf.slice(1);
335
+ } else {
336
+ throw new Error(`Unknown Body format marker: 0x${buf[0].toString(16)}`);
337
+ }
338
+
339
+ // Parse protobuf
340
+ const fields = parseProtobuf(data, 0, data.length, 0);
341
+
342
+ // Find the main container (Field 1)
343
+ const mainContainer = fields.find(f => f.fieldNum === 1 && f.nested);
344
+ if (!mainContainer) {
345
+ return { nodes: [], connections: [], raw: fields };
346
+ }
347
+
348
+ return extractNodes(mainContainer.nested);
349
+ }
350
+
351
+ /**
352
+ * Extract all grades from a DRP file
353
+ */
354
+ async function extractGradesFromDRP(drpPath) {
355
+ const zip = new AdmZip(drpPath);
356
+ const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '@_' });
357
+
358
+ const results = [];
359
+
360
+ // Find all sequence files
361
+ const entries = zip.getEntries();
362
+ const seqFiles = entries.filter(e =>
363
+ e.entryName.startsWith('SeqContainer/') && e.entryName.endsWith('.xml')
364
+ );
365
+
366
+ for (const seqFile of seqFiles) {
367
+ const seqXml = zip.readFile(seqFile).toString('utf-8');
368
+ const parsed = parser.parse(seqXml);
369
+
370
+ // Find all clips with Body
371
+ const clips = findClipsWithBody(parsed);
372
+
373
+ for (const clip of clips) {
374
+ try {
375
+ const gradeData = await parseGradeBody(clip.body);
376
+ results.push({
377
+ sequence: seqFile.entryName,
378
+ clipPath: clip.path,
379
+ clipId: clip.dbId,
380
+ nodeCount: gradeData.nodes.length,
381
+ connectionCount: gradeData.connections.length,
382
+ nodes: gradeData.nodes,
383
+ connections: gradeData.connections
384
+ });
385
+ } catch (e) {
386
+ results.push({
387
+ sequence: seqFile.entryName,
388
+ clipPath: clip.path,
389
+ clipId: clip.dbId,
390
+ error: e.message
391
+ });
392
+ }
393
+ }
394
+ }
395
+
396
+ return results;
397
+ }
398
+
399
+ /**
400
+ * Find all clips with Body data in parsed XML
401
+ */
402
+ function findClipsWithBody(obj, path = '', results = []) {
403
+ if (!obj || typeof obj !== 'object') return results;
404
+
405
+ // Check for Sm2VideoClip or similar with Body
406
+ if (obj['@_DbId'] && obj.Body && typeof obj.Body === 'string' && obj.Body.length > 10) {
407
+ results.push({
408
+ path,
409
+ dbId: obj['@_DbId'],
410
+ body: obj.Body
411
+ });
412
+ }
413
+
414
+ for (const key of Object.keys(obj)) {
415
+ if (!key.startsWith('@_')) {
416
+ findClipsWithBody(obj[key], path ? `${path}.${key}` : key, results);
417
+ }
418
+ }
419
+
420
+ return results;
421
+ }
422
+
423
+ /**
424
+ * Format nodes for display
425
+ */
426
+ function formatNodesForDisplay(gradeData) {
427
+ const lines = [];
428
+
429
+ lines.push(`Nodes (${gradeData.nodes.length}):`);
430
+ for (const node of gradeData.nodes) {
431
+ lines.push(` Node ${node.id} (index: ${node.index})`);
432
+ if (node.label) lines.push(` Label: "${node.label}"`);
433
+ lines.push(` Position: (${node.posX}, ${node.posY})`);
434
+ lines.push(` Enabled: ${node.enabled}`);
435
+
436
+ if (node.parameters.length > 0) {
437
+ lines.push(` Parameters:`);
438
+ for (const param of node.parameters) {
439
+ lines.push(` - ${param.type} (enabled: ${param.enabled})`);
440
+ if (param.values.length > 0) {
441
+ const valStr = param.values.slice(0, 5).map(v =>
442
+ `${v.param}=${typeof v.value === 'number' ? v.value.toFixed(4) : v.value}`
443
+ ).join(', ');
444
+ lines.push(` Values: ${valStr}${param.values.length > 5 ? '...' : ''}`);
445
+ }
446
+ }
447
+ }
448
+ }
449
+
450
+ lines.push(`\nConnections (${gradeData.connections.length}):`);
451
+ for (const conn of gradeData.connections) {
452
+ lines.push(` Node ${conn.sourceNode} -> Node ${conn.targetNode}`);
453
+ }
454
+
455
+ return lines.join('\n');
456
+ }
457
+
458
+ // CLI support
459
+ if (require.main === module) {
460
+ const drpPath = process.argv[2];
461
+ if (!drpPath) {
462
+ console.log('Usage: node grade-node-extractor.js <file.drp>');
463
+ process.exit(1);
464
+ }
465
+
466
+ extractGradesFromDRP(drpPath).then(results => {
467
+ console.log(`\nExtracted grades from ${results.length} clips:\n`);
468
+
469
+ for (const result of results.slice(0, 5)) {
470
+ console.log('='.repeat(60));
471
+ console.log(`Clip: ${result.clipId}`);
472
+ console.log(`Sequence: ${result.sequence}`);
473
+
474
+ if (result.error) {
475
+ console.log(`Error: ${result.error}`);
476
+ } else {
477
+ console.log(formatNodesForDisplay(result));
478
+ }
479
+ console.log();
480
+ }
481
+
482
+ if (results.length > 5) {
483
+ console.log(`... and ${results.length - 5} more clips`);
484
+ }
485
+ }).catch(console.error);
486
+ }
487
+
488
+ module.exports = {
489
+ parseGradeBody,
490
+ extractGradesFromDRP,
491
+ extractNodes,
492
+ parseProtobuf,
493
+ formatNodesForDisplay,
494
+ initZstd
495
+ };