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,570 @@
1
+ /**
2
+ * DRX Parameter Value Ranges and Defaults
3
+ *
4
+ * Defines valid ranges, default values, and normalization rules
5
+ * for all DRX parameters.
6
+ *
7
+ * @module drx-parameters/parameter-ranges
8
+ */
9
+
10
+ /**
11
+ * Parameter range definitions
12
+ *
13
+ * Each entry defines:
14
+ * - min: Minimum valid value
15
+ * - max: Maximum valid value
16
+ * - default: Default/neutral value
17
+ * - unit: Unit of measurement (optional)
18
+ * - precision: Decimal places for display (optional)
19
+ */
20
+ const PARAMETER_RANGES = {
21
+ // ========================================================================
22
+ // Color Wheels - Lift (Shadows)
23
+ // ========================================================================
24
+ lift: {
25
+ r: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
26
+ g: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
27
+ b: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
28
+ master: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
29
+ },
30
+
31
+ // ========================================================================
32
+ // Color Wheels - Gamma (Midtones)
33
+ // ========================================================================
34
+ gamma: {
35
+ r: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
36
+ g: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
37
+ b: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
38
+ master: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
39
+ },
40
+
41
+ // ========================================================================
42
+ // Color Wheels - Gain (Highlights)
43
+ // ========================================================================
44
+ gain: {
45
+ r: { min: 0.0, max: 4.0, default: 1.0, precision: 3 },
46
+ g: { min: 0.0, max: 4.0, default: 1.0, precision: 3 },
47
+ b: { min: 0.0, max: 4.0, default: 1.0, precision: 3 },
48
+ master: { min: 0.0, max: 4.0, default: 1.0, precision: 3 },
49
+ },
50
+
51
+ // ========================================================================
52
+ // Color Wheels - Offset
53
+ // ========================================================================
54
+ offset: {
55
+ r: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
56
+ g: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
57
+ b: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
58
+ },
59
+
60
+ // ========================================================================
61
+ // Primary Adjustments
62
+ // ========================================================================
63
+ saturation: {
64
+ master: { min: 0, max: 100, default: 50, precision: 0 },
65
+ primary: { min: 0.0, max: 4.0, default: 1.0, precision: 3, note: 'DRX float: UI/50' },
66
+ },
67
+
68
+ temperature: {
69
+ master: { min: -4000, max: 4000, default: 0, unit: 'offset', precision: 0 },
70
+ },
71
+
72
+ tint: {
73
+ master: { min: -100, max: 100, default: 0, precision: 0 },
74
+ },
75
+
76
+ midtoneDetail: {
77
+ master: { min: -100, max: 100, default: 0, precision: 0 },
78
+ },
79
+
80
+ // ========================================================================
81
+ // Contrast Corrector
82
+ // ========================================================================
83
+ contrast: {
84
+ master: { min: 0.0, max: 2.0, default: 1.0, precision: 2 },
85
+ },
86
+
87
+ pivot: {
88
+ master: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
89
+ },
90
+
91
+ pivotFine: {
92
+ master: { min: 0.0, max: 1.0, default: 0.435, precision: 3 },
93
+ },
94
+
95
+ highRange: {
96
+ master: { min: 0.0, max: 1.0, default: 0.75, precision: 2 },
97
+ },
98
+
99
+ lowRange: {
100
+ master: { min: 0.0, max: 1.0, default: 0.25, precision: 2 },
101
+ },
102
+
103
+ softClipHigh: {
104
+ master: { min: 0.0, max: 1.0, default: 1.0, precision: 2 },
105
+ },
106
+
107
+ softClipLow: {
108
+ master: { min: 0.0, max: 1.0, default: 0.0, precision: 2 },
109
+ },
110
+
111
+ // ========================================================================
112
+ // Log Wheels Mode
113
+ // ========================================================================
114
+ logShadow: {
115
+ r: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
116
+ g: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
117
+ b: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
118
+ master: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
119
+ },
120
+
121
+ logMidtone: {
122
+ r: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
123
+ g: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
124
+ b: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
125
+ },
126
+
127
+ logHighlight: {
128
+ r: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
129
+ g: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
130
+ b: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
131
+ },
132
+
133
+ // ========================================================================
134
+ // Hue Corrector (Type 4) - Ranges TBD through testing
135
+ // ========================================================================
136
+ hue: {
137
+ param1: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
138
+ param2: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
139
+ param3: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
140
+ param4: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
141
+ param5: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
142
+ param6: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
143
+ },
144
+
145
+ // ========================================================================
146
+ // Luma vs Saturation (Type 5) - Ranges TBD through testing
147
+ // ========================================================================
148
+ lumMix: {
149
+ param1: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
150
+ param2: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
151
+ param3: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
152
+ param4: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
153
+ param5: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
154
+ param6: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
155
+ param7: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
156
+ param8: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
157
+ param9: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
158
+ param10: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
159
+ param11: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
160
+ },
161
+
162
+ // ========================================================================
163
+ // Saturation vs Saturation — RANGES REMOVED 2026-07-01.
164
+ // The satVsSat.param1–7 id mapping (0x08F000xx) is VESTIGIAL: the real Sat-vs-Sat
165
+ // curve writes the hslCurves spline 0x86000404 (see satvssat-curve-calibration),
166
+ // and 0x08F000xx are the GRADIENT WINDOW's ids (ct65554: rotation ±, handles ±4096,
167
+ // softness ×100). The old [0,1] guesses here made createParameterEntry clamp real
168
+ // gradient-window writes to garbage. No ranges → clamp-free pass-through.
169
+ // ========================================================================
170
+
171
+ // ========================================================================
172
+ // HDR Global Controls - TRAINED 2026-03-16
173
+ // ========================================================================
174
+ hdrBlackOffset: {
175
+ master: { min: -1.0, max: 1.0, default: 0.0, precision: 3 },
176
+ },
177
+
178
+ // HDR Zone (Type 9) - Ranges TBD through testing
179
+ // ========================================================================
180
+ hdrZone: {
181
+ param1: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
182
+ },
183
+
184
+ // ========================================================================
185
+ // Curves (Type 18) - Ranges TBD through testing
186
+ // ========================================================================
187
+ curves: {
188
+ param1: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
189
+ param2: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
190
+ param3: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
191
+ param4: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
192
+ param5: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
193
+ param6: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
194
+ param7: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
195
+ param8: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
196
+ param9: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
197
+ param10: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
198
+ param11: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
199
+ param12: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
200
+ param13: { min: 0.0, max: 1.0, default: 0.5, precision: 3 },
201
+ },
202
+
203
+ // ========================================================================
204
+ // HDR Wheels (Zone-based grading) - TRAINED 2026-01-14, UPDATED 2026-03-16
205
+ // Zone adjustments: Uses nested protobuf (0x86000305) with zone name strings
206
+ // Zone definitions: Uses nested protobuf (0x86000306) with range + falloff
207
+ // Color Balance uses X/Y (not hueAngle/hueSat as previously labeled)
208
+ // Default falloffs are symmetric: Black/Specular=0.10, Dark/Highlight=0.20, Shadow/Light=0.22
209
+ // ========================================================================
210
+ hdrBlack: {
211
+ exposure: { min: -6.0, max: 6.0, default: 0.0, unit: 'stops', precision: 2 },
212
+ saturation: { min: 0.0, max: 4.0, default: 1.0, precision: 2 },
213
+ colorBalanceX: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
214
+ colorBalanceY: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
215
+ falloff: { min: 0.0, max: 2.0, default: 0.10, precision: 2 },
216
+ },
217
+ hdrDark: {
218
+ exposure: { min: -6.0, max: 6.0, default: 0.0, unit: 'stops', precision: 2 },
219
+ saturation: { min: 0.0, max: 4.0, default: 1.0, precision: 2 },
220
+ colorBalanceX: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
221
+ colorBalanceY: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
222
+ falloff: { min: 0.0, max: 2.0, default: 0.20, precision: 2 },
223
+ },
224
+ hdrShadow: {
225
+ exposure: { min: -6.0, max: 6.0, default: 0.0, unit: 'stops', precision: 2 },
226
+ saturation: { min: 0.0, max: 4.0, default: 1.0, precision: 2 },
227
+ colorBalanceX: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
228
+ colorBalanceY: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
229
+ falloff: { min: 0.0, max: 2.0, default: 0.22, precision: 2 },
230
+ },
231
+ hdrLight: {
232
+ exposure: { min: -6.0, max: 6.0, default: 0.0, unit: 'stops', precision: 2 },
233
+ saturation: { min: 0.0, max: 4.0, default: 1.0, precision: 2 },
234
+ colorBalanceX: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
235
+ colorBalanceY: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
236
+ falloff: { min: 0.0, max: 2.0, default: 0.22, precision: 2 },
237
+ },
238
+ hdrHighlight: {
239
+ exposure: { min: -6.0, max: 6.0, default: 0.0, unit: 'stops', precision: 2 },
240
+ saturation: { min: 0.0, max: 4.0, default: 1.0, precision: 2 },
241
+ colorBalanceX: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
242
+ colorBalanceY: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
243
+ falloff: { min: 0.0, max: 2.0, default: 0.20, precision: 2 },
244
+ },
245
+ hdrSpecular: {
246
+ exposure: { min: -6.0, max: 6.0, default: 0.0, unit: 'stops', precision: 2 },
247
+ saturation: { min: 0.0, max: 4.0, default: 1.0, precision: 2 },
248
+ colorBalanceX: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
249
+ colorBalanceY: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
250
+ falloff: { min: 0.0, max: 2.0, default: 0.10, precision: 2 },
251
+ },
252
+ hdrGlobal: {
253
+ exposure: { min: -6.0, max: 6.0, default: 0.0, unit: 'stops', precision: 2 },
254
+ saturation: { min: 0.0, max: 4.0, default: 1.0, precision: 2 },
255
+ colorBalanceX: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
256
+ colorBalanceY: { min: -1.0, max: 1.0, default: 0.0, precision: 2 },
257
+ },
258
+
259
+ // ========================================================================
260
+ // HSL Qualifier - Awaiting DRX training
261
+ // ========================================================================
262
+ qualifier: {
263
+ // Hue selection
264
+ hueCenter: { min: 0, max: 360, default: 0, unit: '°', precision: 0 },
265
+ hueWidth: { min: 0, max: 180, default: 30, unit: '°', precision: 0 },
266
+ hueSoft: { min: 0, max: 100, default: 10, precision: 0 },
267
+
268
+ // Saturation selection
269
+ satLow: { min: 0, max: 100, default: 0, precision: 0 },
270
+ satHigh: { min: 0, max: 100, default: 100, precision: 0 },
271
+ satLowSoft: { min: 0, max: 100, default: 0, precision: 0 },
272
+ satHighSoft: { min: 0, max: 100, default: 0, precision: 0 },
273
+
274
+ // Luminance selection
275
+ lumLow: { min: 0, max: 100, default: 0, precision: 0 },
276
+ lumHigh: { min: 0, max: 100, default: 100, precision: 0 },
277
+ lumLowSoft: { min: 0, max: 100, default: 0, precision: 0 },
278
+ lumHighSoft: { min: 0, max: 100, default: 0, precision: 0 },
279
+
280
+ // Additional qualifier params
281
+ hueSymmetry: { min: 0.0, max: 1.0, default: 0.5, precision: 3, note: 'DRX = UI/100' },
282
+ blurRadius: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
283
+
284
+ // Matte controls
285
+ denoise: { min: 0, max: 100, default: 0, precision: 0 },
286
+ blur: { min: 0, max: 100, default: 0, precision: 0 },
287
+ invert: { min: 0, max: 1, default: 0, precision: 0 },
288
+ },
289
+
290
+ // ========================================================================
291
+ // Power Windows - Awaiting DRX training
292
+ // ========================================================================
293
+ window: {
294
+ // Position (normalized 0-1)
295
+ centerX: { min: 0, max: 1, default: 0.5, precision: 3 },
296
+ centerY: { min: 0, max: 1, default: 0.5, precision: 3 },
297
+
298
+ // Size (normalized 0-1)
299
+ width: { min: 0, max: 2, default: 0.5, precision: 3 },
300
+ height: { min: 0, max: 2, default: 0.5, precision: 3 },
301
+
302
+ // Rotation
303
+ rotation: { min: -180, max: 180, default: 0, unit: '°', precision: 1 },
304
+
305
+ // Softness
306
+ soft1: { min: 0, max: 100, default: 0, precision: 0 },
307
+ soft2: { min: 0, max: 100, default: 0, precision: 0 },
308
+ soft3: { min: 0, max: 100, default: 0, precision: 0 },
309
+ soft4: { min: 0, max: 100, default: 0, precision: 0 },
310
+
311
+ // Type (0=none, 1=linear, 2=circle, 3=polygon, 4=curve, 5=gradient)
312
+ type: { min: 0, max: 5, default: 2, precision: 0 },
313
+ invert: { min: 0, max: 1, default: 0, precision: 0 },
314
+ },
315
+
316
+ // ========================================================================
317
+ // Custom Curves - Awaiting DRX training
318
+ // ========================================================================
319
+ customCurves: {
320
+ // Each curve has control points (x, y pairs)
321
+ // These are semantic representations - actual encoding TBD
322
+ lumaCurve: { min: 0, max: 1, default: null, precision: 3, note: 'Array of control points' },
323
+ redCurve: { min: 0, max: 1, default: null, precision: 3, note: 'Array of control points' },
324
+ greenCurve: { min: 0, max: 1, default: null, precision: 3, note: 'Array of control points' },
325
+ blueCurve: { min: 0, max: 1, default: null, precision: 3, note: 'Array of control points' },
326
+ },
327
+
328
+ // ========================================================================
329
+ // Color Boost (already implemented)
330
+ // ========================================================================
331
+ colorBoost: {
332
+ master: { min: 0, max: 100, default: 0, precision: 0 },
333
+ },
334
+
335
+ // ========================================================================
336
+ // Additional Primary Controls (added for universal clamp coverage)
337
+ // ========================================================================
338
+ hueRotate: {
339
+ master: { min: -1.0, max: 1.0, default: 0.0, precision: 3, note: 'DRX space: (UI-50)/50' },
340
+ },
341
+
342
+ highlights: {
343
+ master: { min: -100, max: 100, default: 0, precision: 0, note: 'Direct value' },
344
+ },
345
+
346
+ shadows: {
347
+ master: { min: -100, max: 100, default: 0, precision: 0, note: 'Direct value' },
348
+ },
349
+
350
+ lumMixSlider: {
351
+ master: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
352
+ },
353
+
354
+ // ========================================================================
355
+ // RGB Mixer (3x3 channel matrix, identity = diagonal 1.0)
356
+ // ========================================================================
357
+ rgbMixer: {
358
+ rr: { min: -2.0, max: 2.0, default: 1.0, precision: 3 },
359
+ gr: { min: -2.0, max: 2.0, default: 0.0, precision: 3 },
360
+ br: { min: -2.0, max: 2.0, default: 0.0, precision: 3 },
361
+ rg: { min: -2.0, max: 2.0, default: 0.0, precision: 3 },
362
+ gg: { min: -2.0, max: 2.0, default: 1.0, precision: 3 },
363
+ bg: { min: -2.0, max: 2.0, default: 0.0, precision: 3 },
364
+ rb: { min: -2.0, max: 2.0, default: 0.0, precision: 3 },
365
+ gb: { min: -2.0, max: 2.0, default: 0.0, precision: 3 },
366
+ bb: { min: -2.0, max: 2.0, default: 1.0, precision: 3 },
367
+ preserveLuminance: { min: 0, max: 1, default: 0, precision: 0, note: 'Boolean toggle' },
368
+ },
369
+
370
+ // ========================================================================
371
+ // Matte Finesse (all DRX = UI / 100, range 0-1)
372
+ // ========================================================================
373
+ matteFinesse: {
374
+ denoise: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
375
+ blackClip: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
376
+ whiteClip: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
377
+ inOutRatio: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
378
+ cleanBlack: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
379
+ cleanWhite: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
380
+ morphRadius: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
381
+ preFilter: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
382
+ postFilter: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
383
+ shadow: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
384
+ midtone: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
385
+ highlight: { min: 0.0, max: 1.0, default: 0.0, precision: 3 },
386
+ },
387
+
388
+ // ========================================================================
389
+ // Power Windows (spatial correction)
390
+ // ========================================================================
391
+ window: {
392
+ // DRX-INTERNAL spans — calibrated 2026-06-22 (multi-point fit) and widened 2026-07-01.
393
+ // The previous normalized guesses ([-1,1] pan/tilt, [0,1] softRef) clamped the TRUE
394
+ // stored values (pan/tilt = (UI−50)/50 × 4096; softRef = UI × 16; size = 1+(UI−50)×0.08;
395
+ // rotate = −UI°/180) inside createParameterEntry, which is why the generator could not
396
+ // write Resolve-faithful window transforms.
397
+ rotate: { min: -2.0, max: 2.0, default: 0, precision: 4, note: 'stored = −UI°/180' },
398
+ size: { min: -3.0, max: 5.0, default: 1.0, precision: 4, note: 'stored = 1+(UI−50)×0.08' },
399
+ softRef: { min: 0.0, max: 1600.0, default: 0.0, precision: 2, note: 'stored = UI × 16' },
400
+ soft1: { min: 0.0, max: 1600.0, default: 0.0, precision: 2, note: 'stored = UI × 16 (ct3 mask)' },
401
+ soft2: { min: 0.0, max: 1600.0, default: 0.0, precision: 2, note: 'stored = UI × 16 (ct3 mask)' },
402
+ soft3: { min: 0.0, max: 1600.0, default: 0.0, precision: 2, note: 'stored = UI × 16 (ct3 mask)' },
403
+ soft4: { min: 0.0, max: 1600.0, default: 0.0, precision: 2, note: 'stored = UI × 16 (ct3 mask)' },
404
+ aspect: { min: -1.0, max: 1.0, default: 0.0, precision: 4, note: 'stored = (50−UI)/50' },
405
+ pan: { min: -4096.0, max: 4096.0, default: 0.0, precision: 2, note: 'stored = (UI−50)/50 × 4096' },
406
+ tilt: { min: -4096.0, max: 4096.0, default: 0.0, precision: 2, note: 'stored = (UI−50)/50 × 4096' },
407
+ opacity: { min: 0.0, max: 1.0, default: 1.0, precision: 3, note: 'stored = UI/100' },
408
+ type: { min: 0, max: 5, default: 2, precision: 0 },
409
+ invert: { min: 0, max: 1, default: 0, precision: 0 },
410
+ },
411
+ };
412
+
413
+ /**
414
+ * Get range info for a parameter
415
+ * @param {string} control - Control name (e.g., 'lift', 'gain')
416
+ * @param {string} channel - Channel name (e.g., 'r', 'master')
417
+ * @returns {object|null} Range object or null if not found
418
+ */
419
+ function getRange(control, channel) {
420
+ const controlRanges = PARAMETER_RANGES[control];
421
+ if (!controlRanges) return null;
422
+ return controlRanges[channel] || null;
423
+ }
424
+
425
+ /**
426
+ * Get the default value for a parameter
427
+ * @param {string} control - Control name
428
+ * @param {string} channel - Channel name
429
+ * @returns {number|null} Default value or null if not found
430
+ */
431
+ function getDefault(control, channel) {
432
+ const range = getRange(control, channel);
433
+ return range ? range.default : null;
434
+ }
435
+
436
+ /**
437
+ * Clamp a value to the valid range for a parameter
438
+ * @param {string} control - Control name
439
+ * @param {string} channel - Channel name
440
+ * @param {number} value - Value to clamp
441
+ * @returns {number} Clamped value
442
+ */
443
+ function clamp(control, channel, value) {
444
+ const range = getRange(control, channel);
445
+ if (!range) return value;
446
+ return Math.max(range.min, Math.min(range.max, value));
447
+ }
448
+
449
+ /**
450
+ * Normalize a value to 0-1 range
451
+ * @param {string} control - Control name
452
+ * @param {string} channel - Channel name
453
+ * @param {number} value - Raw value
454
+ * @returns {number} Normalized 0-1 value
455
+ */
456
+ function normalize(control, channel, value) {
457
+ const range = getRange(control, channel);
458
+ if (!range) return value;
459
+ return (value - range.min) / (range.max - range.min);
460
+ }
461
+
462
+ /**
463
+ * Denormalize a 0-1 value to parameter range
464
+ * @param {string} control - Control name
465
+ * @param {string} channel - Channel name
466
+ * @param {number} normalized - Normalized 0-1 value
467
+ * @returns {number} Denormalized value
468
+ */
469
+ function denormalize(control, channel, normalized) {
470
+ const range = getRange(control, channel);
471
+ if (!range) return normalized;
472
+ return range.min + normalized * (range.max - range.min);
473
+ }
474
+
475
+ /**
476
+ * Check if a value is at the default/neutral
477
+ * @param {string} control - Control name
478
+ * @param {string} channel - Channel name
479
+ * @param {number} value - Value to check
480
+ * @param {number} tolerance - Tolerance for floating point comparison
481
+ * @returns {boolean}
482
+ */
483
+ function isDefault(control, channel, value, tolerance = 0.001) {
484
+ const defaultVal = getDefault(control, channel);
485
+ if (defaultVal === null) return false;
486
+ return Math.abs(value - defaultVal) < tolerance;
487
+ }
488
+
489
+ /**
490
+ * Format a value for display
491
+ * @param {string} control - Control name
492
+ * @param {string} channel - Channel name
493
+ * @param {number} value - Value to format
494
+ * @returns {string} Formatted string
495
+ */
496
+ function formatValue(control, channel, value) {
497
+ const range = getRange(control, channel);
498
+ if (!range) return String(value);
499
+
500
+ const precision = range.precision || 2;
501
+ let formatted = value.toFixed(precision);
502
+
503
+ // Add unit if present
504
+ if (range.unit) {
505
+ formatted += ` ${range.unit}`;
506
+ }
507
+
508
+ // Add sign for positive values on signed ranges
509
+ if (range.min < 0 && value > 0) {
510
+ formatted = '+' + formatted;
511
+ }
512
+
513
+ return formatted;
514
+ }
515
+
516
+ /**
517
+ * Get all default parameter values as a flat object
518
+ * @returns {object} Object with control.channel keys and default values
519
+ */
520
+ function getAllDefaults() {
521
+ const defaults = {};
522
+
523
+ for (const [control, channels] of Object.entries(PARAMETER_RANGES)) {
524
+ defaults[control] = {};
525
+ for (const [channel, range] of Object.entries(channels)) {
526
+ defaults[control][channel] = range.default;
527
+ }
528
+ }
529
+
530
+ return defaults;
531
+ }
532
+
533
+ /**
534
+ * Visual impact weights for change detection
535
+ * Higher values = more visually impactful changes
536
+ */
537
+ const VISUAL_IMPACT_WEIGHTS = {
538
+ saturation: 2.0, // Saturation changes are very noticeable
539
+ contrast: 1.8, // Contrast is highly visible
540
+ temperature: 1.5, // Color temperature shifts are obvious
541
+ gamma: 1.2, // Midtone changes are visible
542
+ lift: 1.0, // Shadow changes
543
+ gain: 1.0, // Highlight changes
544
+ tint: 1.0, // Tint is noticeable
545
+ offset: 0.8, // Offset is subtle
546
+ pivot: 0.5, // Pivot changes are less obvious
547
+ };
548
+
549
+ /**
550
+ * Get visual impact weight for a control
551
+ * @param {string} control - Control name
552
+ * @returns {number} Impact weight (default 1.0)
553
+ */
554
+ function getVisualImpactWeight(control) {
555
+ return VISUAL_IMPACT_WEIGHTS[control] || 1.0;
556
+ }
557
+
558
+ module.exports = {
559
+ PARAMETER_RANGES,
560
+ VISUAL_IMPACT_WEIGHTS,
561
+ getRange,
562
+ getDefault,
563
+ clamp,
564
+ normalize,
565
+ denormalize,
566
+ isDefault,
567
+ formatValue,
568
+ getAllDefaults,
569
+ getVisualImpactWeight,
570
+ };