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,776 @@
1
+ /**
2
+ * DaVinci Resolve Power Window Encoder
3
+ *
4
+ * Advanced power window encoding for secondary corrections including:
5
+ * - Circular/Oval windows
6
+ * - Linear (gradient) windows
7
+ * - Polygon windows
8
+ * - Power Curve windows
9
+ * - Gradient windows
10
+ * - Transform controls (pan, zoom, rotation)
11
+ * - Softness and feathering
12
+ * - Window animation/tracking data
13
+ *
14
+ * Works with node-tree-encoder.js for complete grade encoding.
15
+ *
16
+ * @module power-window-encoder
17
+ */
18
+
19
+ const { encodeVarint, encodeFloat, encodeTag } = require('./grade-encoder');
20
+ const { WINDOW_TYPES, WINDOW_FIELDS, CORRECTOR_TYPE } = require('./grade-parameter-decoder');
21
+
22
+ // ═══════════════════════════════════════════════════════════════════════════
23
+ // WINDOW CONSTANTS
24
+ // ═══════════════════════════════════════════════════════════════════════════
25
+
26
+ /**
27
+ * Standard aspect ratios for oval windows
28
+ */
29
+ const ASPECT_RATIOS = {
30
+ SQUARE: 1.0,
31
+ WIDE_16_9: 16 / 9,
32
+ WIDE_2_35: 2.35,
33
+ TALL_9_16: 9 / 16,
34
+ PORTRAIT_4_5: 4 / 5,
35
+ ANAMORPHIC_2_39: 2.39,
36
+ };
37
+
38
+ /**
39
+ * Common gradient directions (in degrees)
40
+ */
41
+ const GRADIENT_DIRECTIONS = {
42
+ TOP_TO_BOTTOM: 0,
43
+ BOTTOM_TO_TOP: 180,
44
+ LEFT_TO_RIGHT: 90,
45
+ RIGHT_TO_LEFT: 270,
46
+ TOP_LEFT_TO_BOTTOM_RIGHT: 45,
47
+ TOP_RIGHT_TO_BOTTOM_LEFT: 135,
48
+ BOTTOM_LEFT_TO_TOP_RIGHT: 315,
49
+ BOTTOM_RIGHT_TO_TOP_LEFT: 225,
50
+ };
51
+
52
+ /**
53
+ * Pre-defined softness levels
54
+ */
55
+ const SOFTNESS_PRESETS = {
56
+ SHARP: 0,
57
+ SUBTLE: 0.05,
58
+ SOFT: 0.15,
59
+ VERY_SOFT: 0.3,
60
+ FEATHERED: 0.5,
61
+ EXTREME: 0.8,
62
+ };
63
+
64
+ // ═══════════════════════════════════════════════════════════════════════════
65
+ // CIRCULAR/OVAL WINDOW BUILDERS
66
+ // ═══════════════════════════════════════════════════════════════════════════
67
+
68
+ /**
69
+ * Create a circular power window
70
+ *
71
+ * @param {Object} options - Window options
72
+ * @param {number} options.centerX - Center X position (0-1, default 0.5)
73
+ * @param {number} options.centerY - Center Y position (0-1, default 0.5)
74
+ * @param {number} options.radius - Window radius (0-1, default 0.25)
75
+ * @param {number} options.softness - Edge softness (0-1, default 0.1)
76
+ * @param {number} options.rotation - Rotation in degrees
77
+ * @param {boolean} options.invert - Invert selection
78
+ * @returns {Object} Window settings
79
+ */
80
+ function createCircularWindow(options = {}) {
81
+ const {
82
+ centerX = 0.5,
83
+ centerY = 0.5,
84
+ radius = 0.25,
85
+ softness = 0.1,
86
+ rotation = 0,
87
+ invert = false,
88
+ } = options;
89
+
90
+ return {
91
+ type: 'CIRCLE',
92
+ enabled: true,
93
+ transform: {
94
+ panX: centerX - 0.5, // Offset from center
95
+ panY: centerY - 0.5,
96
+ zoomX: 1.0,
97
+ zoomY: 1.0,
98
+ rotation,
99
+ anchorX: 0.5,
100
+ anchorY: 0.5,
101
+ },
102
+ shape: {
103
+ radiusX: radius,
104
+ radiusY: radius,
105
+ softness,
106
+ insideSoftness: 0,
107
+ outsideSoftness: softness,
108
+ },
109
+ invert,
110
+ };
111
+ }
112
+
113
+ /**
114
+ * Create an oval power window with aspect ratio control
115
+ *
116
+ * @param {Object} options - Window options
117
+ * @param {number} options.centerX - Center X position (0-1)
118
+ * @param {number} options.centerY - Center Y position (0-1)
119
+ * @param {number} options.radiusX - Horizontal radius (0-1)
120
+ * @param {number} options.radiusY - Vertical radius (0-1)
121
+ * @param {number} options.aspectRatio - Use preset aspect ratio (overrides radiusY)
122
+ * @param {number} options.softness - Edge softness (0-1)
123
+ * @param {number} options.rotation - Rotation in degrees
124
+ * @param {boolean} options.invert - Invert selection
125
+ * @returns {Object} Window settings
126
+ */
127
+ function createOvalWindow(options = {}) {
128
+ const {
129
+ centerX = 0.5,
130
+ centerY = 0.5,
131
+ radiusX = 0.3,
132
+ radiusY = 0.2,
133
+ aspectRatio = null,
134
+ softness = 0.1,
135
+ rotation = 0,
136
+ invert = false,
137
+ } = options;
138
+
139
+ // Calculate radiusY from aspect ratio if provided
140
+ let finalRadiusY = radiusY;
141
+ if (aspectRatio) {
142
+ finalRadiusY = radiusX / aspectRatio;
143
+ }
144
+
145
+ return {
146
+ type: 'CIRCLE',
147
+ enabled: true,
148
+ transform: {
149
+ panX: centerX - 0.5,
150
+ panY: centerY - 0.5,
151
+ zoomX: 1.0,
152
+ zoomY: 1.0,
153
+ rotation,
154
+ anchorX: 0.5,
155
+ anchorY: 0.5,
156
+ },
157
+ shape: {
158
+ radiusX,
159
+ radiusY: finalRadiusY,
160
+ softness,
161
+ insideSoftness: 0,
162
+ outsideSoftness: softness,
163
+ },
164
+ invert,
165
+ };
166
+ }
167
+
168
+ /**
169
+ * Create a vignette effect (large inverted oval)
170
+ *
171
+ * @param {Object} options - Vignette options
172
+ * @param {number} options.strength - Vignette strength (0-1, affects size and softness)
173
+ * @param {number} options.roundness - Vignette roundness (1 = circle, <1 = oval)
174
+ * @param {number} options.offsetX - Horizontal center offset (-0.5 to 0.5)
175
+ * @param {number} options.offsetY - Vertical center offset (-0.5 to 0.5)
176
+ * @returns {Object} Window settings for vignette
177
+ */
178
+ function createVignetteWindow(options = {}) {
179
+ const {
180
+ strength = 0.5,
181
+ roundness = 0.8,
182
+ offsetX = 0,
183
+ offsetY = 0,
184
+ } = options;
185
+
186
+ // Calculate size based on strength (stronger = smaller/more visible)
187
+ const baseRadius = 1.2 - strength * 0.7;
188
+ const softness = 0.2 + strength * 0.4;
189
+
190
+ return createOvalWindow({
191
+ centerX: 0.5 + offsetX,
192
+ centerY: 0.5 + offsetY,
193
+ radiusX: baseRadius,
194
+ radiusY: baseRadius * roundness,
195
+ softness,
196
+ invert: true, // Vignettes are inverted to darken edges
197
+ });
198
+ }
199
+
200
+ // ═══════════════════════════════════════════════════════════════════════════
201
+ // LINEAR/GRADIENT WINDOW BUILDERS
202
+ // ═══════════════════════════════════════════════════════════════════════════
203
+
204
+ /**
205
+ * Create a linear (gradient) power window
206
+ *
207
+ * @param {Object} options - Window options
208
+ * @param {number} options.angle - Gradient angle in degrees (0 = top to bottom)
209
+ * @param {number} options.position - Position of gradient center (0-1)
210
+ * @param {number} options.softness - Gradient softness (0-1)
211
+ * @param {boolean} options.invert - Invert selection
212
+ * @returns {Object} Window settings
213
+ */
214
+ function createLinearWindow(options = {}) {
215
+ const {
216
+ angle = 0,
217
+ position = 0.5,
218
+ softness = 0.2,
219
+ invert = false,
220
+ } = options;
221
+
222
+ return {
223
+ type: 'LINEAR',
224
+ enabled: true,
225
+ transform: {
226
+ panX: 0,
227
+ panY: 0,
228
+ zoomX: 1.0,
229
+ zoomY: 1.0,
230
+ rotation: 0,
231
+ anchorX: 0.5,
232
+ anchorY: 0.5,
233
+ },
234
+ shape: {
235
+ angle,
236
+ position,
237
+ softness,
238
+ },
239
+ invert,
240
+ };
241
+ }
242
+
243
+ /**
244
+ * Create a gradient window from preset direction
245
+ *
246
+ * @param {string} direction - Direction name from GRADIENT_DIRECTIONS
247
+ * @param {Object} options - Additional options
248
+ * @param {number} options.position - Gradient position (0-1)
249
+ * @param {number} options.softness - Gradient softness (0-1)
250
+ * @param {boolean} options.invert - Invert selection
251
+ * @returns {Object} Window settings
252
+ */
253
+ function createGradientWindow(direction, options = {}) {
254
+ const angle = GRADIENT_DIRECTIONS[direction.toUpperCase()] ?? 0;
255
+ return createLinearWindow({ ...options, angle });
256
+ }
257
+
258
+ /**
259
+ * Create a horizontal split window (left/right)
260
+ *
261
+ * @param {Object} options - Split options
262
+ * @param {number} options.position - Split position (0-1, 0.5 = center)
263
+ * @param {number} options.softness - Edge softness (0-1)
264
+ * @param {boolean} options.selectRight - Select right side (default left)
265
+ * @returns {Object} Window settings
266
+ */
267
+ function createHorizontalSplit(options = {}) {
268
+ const { position = 0.5, softness = 0.05, selectRight = false } = options;
269
+
270
+ return createLinearWindow({
271
+ angle: 90,
272
+ position,
273
+ softness,
274
+ invert: selectRight,
275
+ });
276
+ }
277
+
278
+ /**
279
+ * Create a vertical split window (top/bottom)
280
+ *
281
+ * @param {Object} options - Split options
282
+ * @param {number} options.position - Split position (0-1, 0.5 = center)
283
+ * @param {number} options.softness - Edge softness (0-1)
284
+ * @param {boolean} options.selectBottom - Select bottom side (default top)
285
+ * @returns {Object} Window settings
286
+ */
287
+ function createVerticalSplit(options = {}) {
288
+ const { position = 0.5, softness = 0.05, selectBottom = false } = options;
289
+
290
+ return createLinearWindow({
291
+ angle: 0,
292
+ position,
293
+ softness,
294
+ invert: selectBottom,
295
+ });
296
+ }
297
+
298
+ // ═══════════════════════════════════════════════════════════════════════════
299
+ // POLYGON WINDOW BUILDERS
300
+ // ═══════════════════════════════════════════════════════════════════════════
301
+
302
+ /**
303
+ * Create a polygon power window
304
+ *
305
+ * @param {Array} points - Array of {x, y} points (0-1 normalized)
306
+ * @param {Object} options - Window options
307
+ * @param {number} options.softness - Edge softness (0-1)
308
+ * @param {boolean} options.invert - Invert selection
309
+ * @returns {Object} Window settings
310
+ */
311
+ function createPolygonWindow(points, options = {}) {
312
+ const { softness = 0.05, invert = false } = options;
313
+
314
+ return {
315
+ type: 'POLYGON',
316
+ enabled: true,
317
+ transform: {
318
+ panX: 0,
319
+ panY: 0,
320
+ zoomX: 1.0,
321
+ zoomY: 1.0,
322
+ rotation: 0,
323
+ anchorX: 0.5,
324
+ anchorY: 0.5,
325
+ },
326
+ shape: {
327
+ points: points.map((p) => ({ x: p.x, y: p.y })),
328
+ softness,
329
+ },
330
+ invert,
331
+ };
332
+ }
333
+
334
+ /**
335
+ * Create a rectangular polygon window
336
+ *
337
+ * @param {Object} options - Rectangle options
338
+ * @param {number} options.left - Left edge (0-1)
339
+ * @param {number} options.top - Top edge (0-1)
340
+ * @param {number} options.right - Right edge (0-1)
341
+ * @param {number} options.bottom - Bottom edge (0-1)
342
+ * @param {number} options.softness - Edge softness (0-1)
343
+ * @param {boolean} options.invert - Invert selection
344
+ * @returns {Object} Window settings
345
+ */
346
+ function createRectangleWindow(options = {}) {
347
+ const {
348
+ left = 0.25,
349
+ top = 0.25,
350
+ right = 0.75,
351
+ bottom = 0.75,
352
+ softness = 0.05,
353
+ invert = false,
354
+ } = options;
355
+
356
+ const points = [
357
+ { x: left, y: top },
358
+ { x: right, y: top },
359
+ { x: right, y: bottom },
360
+ { x: left, y: bottom },
361
+ ];
362
+
363
+ return createPolygonWindow(points, { softness, invert });
364
+ }
365
+
366
+ /**
367
+ * Create a triangular polygon window
368
+ *
369
+ * @param {Object} options - Triangle options
370
+ * @param {Object} options.point1 - First point {x, y}
371
+ * @param {Object} options.point2 - Second point {x, y}
372
+ * @param {Object} options.point3 - Third point {x, y}
373
+ * @param {number} options.softness - Edge softness (0-1)
374
+ * @param {boolean} options.invert - Invert selection
375
+ * @returns {Object} Window settings
376
+ */
377
+ function createTriangleWindow(options = {}) {
378
+ const {
379
+ point1 = { x: 0.5, y: 0.2 },
380
+ point2 = { x: 0.2, y: 0.8 },
381
+ point3 = { x: 0.8, y: 0.8 },
382
+ softness = 0.05,
383
+ invert = false,
384
+ } = options;
385
+
386
+ return createPolygonWindow([point1, point2, point3], { softness, invert });
387
+ }
388
+
389
+ /**
390
+ * Create a regular polygon window (pentagon, hexagon, etc.)
391
+ *
392
+ * @param {Object} options - Polygon options
393
+ * @param {number} options.sides - Number of sides (3-12)
394
+ * @param {number} options.centerX - Center X position (0-1)
395
+ * @param {number} options.centerY - Center Y position (0-1)
396
+ * @param {number} options.radius - Polygon radius (0-0.5)
397
+ * @param {number} options.rotation - Rotation in degrees
398
+ * @param {number} options.softness - Edge softness (0-1)
399
+ * @param {boolean} options.invert - Invert selection
400
+ * @returns {Object} Window settings
401
+ */
402
+ function createRegularPolygonWindow(options = {}) {
403
+ const {
404
+ sides = 6,
405
+ centerX = 0.5,
406
+ centerY = 0.5,
407
+ radius = 0.25,
408
+ rotation = 0,
409
+ softness = 0.05,
410
+ invert = false,
411
+ } = options;
412
+
413
+ const points = [];
414
+ const angleStep = (2 * Math.PI) / sides;
415
+ const rotationRad = (rotation * Math.PI) / 180;
416
+
417
+ for (let i = 0; i < sides; i++) {
418
+ const angle = angleStep * i - Math.PI / 2 + rotationRad;
419
+ points.push({
420
+ x: centerX + radius * Math.cos(angle),
421
+ y: centerY + radius * Math.sin(angle),
422
+ });
423
+ }
424
+
425
+ return createPolygonWindow(points, { softness, invert });
426
+ }
427
+
428
+ // ═══════════════════════════════════════════════════════════════════════════
429
+ // POWER CURVE WINDOW BUILDERS
430
+ // ═══════════════════════════════════════════════════════════════════════════
431
+
432
+ /**
433
+ * Create a power curve window (bezier-edged shape)
434
+ *
435
+ * @param {Array} controlPoints - Array of {x, y, handleX, handleY} points
436
+ * @param {Object} options - Window options
437
+ * @param {number} options.softness - Edge softness (0-1)
438
+ * @param {boolean} options.invert - Invert selection
439
+ * @returns {Object} Window settings
440
+ */
441
+ function createPowerCurveWindow(controlPoints, options = {}) {
442
+ const { softness = 0.1, invert = false } = options;
443
+
444
+ return {
445
+ type: 'CURVE',
446
+ enabled: true,
447
+ transform: {
448
+ panX: 0,
449
+ panY: 0,
450
+ zoomX: 1.0,
451
+ zoomY: 1.0,
452
+ rotation: 0,
453
+ anchorX: 0.5,
454
+ anchorY: 0.5,
455
+ },
456
+ shape: {
457
+ points: controlPoints.map((p) => ({
458
+ x: p.x,
459
+ y: p.y,
460
+ handleX: p.handleX ?? p.x,
461
+ handleY: p.handleY ?? p.y,
462
+ })),
463
+ softness,
464
+ feather: softness,
465
+ },
466
+ invert,
467
+ };
468
+ }
469
+
470
+ /**
471
+ * Create a curved rectangle (rounded corners)
472
+ *
473
+ * @param {Object} options - Rectangle options
474
+ * @param {number} options.left - Left edge (0-1)
475
+ * @param {number} options.top - Top edge (0-1)
476
+ * @param {number} options.right - Right edge (0-1)
477
+ * @param {number} options.bottom - Bottom edge (0-1)
478
+ * @param {number} options.cornerRadius - Corner radius (0-0.5)
479
+ * @param {number} options.softness - Edge softness (0-1)
480
+ * @param {boolean} options.invert - Invert selection
481
+ * @returns {Object} Window settings
482
+ */
483
+ function createRoundedRectangleWindow(options = {}) {
484
+ const {
485
+ left = 0.2,
486
+ top = 0.2,
487
+ right = 0.8,
488
+ bottom = 0.8,
489
+ cornerRadius = 0.1,
490
+ softness = 0.05,
491
+ invert = false,
492
+ } = options;
493
+
494
+ // Generate points with bezier handles for rounded corners
495
+ const r = cornerRadius;
496
+ const controlPoints = [
497
+ // Top edge
498
+ { x: left + r, y: top, handleX: left, handleY: top },
499
+ { x: right - r, y: top, handleX: right, handleY: top },
500
+ // Right edge
501
+ { x: right, y: top + r, handleX: right, handleY: top },
502
+ { x: right, y: bottom - r, handleX: right, handleY: bottom },
503
+ // Bottom edge
504
+ { x: right - r, y: bottom, handleX: right, handleY: bottom },
505
+ { x: left + r, y: bottom, handleX: left, handleY: bottom },
506
+ // Left edge
507
+ { x: left, y: bottom - r, handleX: left, handleY: bottom },
508
+ { x: left, y: top + r, handleX: left, handleY: top },
509
+ ];
510
+
511
+ return createPowerCurveWindow(controlPoints, { softness, invert });
512
+ }
513
+
514
+ // ═══════════════════════════════════════════════════════════════════════════
515
+ // WINDOW TRANSFORM UTILITIES
516
+ // ═══════════════════════════════════════════════════════════════════════════
517
+
518
+ /**
519
+ * Apply transform to an existing window
520
+ *
521
+ * @param {Object} window - Existing window settings
522
+ * @param {Object} transform - Transform to apply
523
+ * @param {number} transform.panX - X offset (-1 to 1)
524
+ * @param {number} transform.panY - Y offset (-1 to 1)
525
+ * @param {number} transform.zoomX - X scale (0.1 to 10)
526
+ * @param {number} transform.zoomY - Y scale (0.1 to 10)
527
+ * @param {number} transform.rotation - Rotation in degrees
528
+ * @returns {Object} Transformed window
529
+ */
530
+ function applyWindowTransform(window, transform) {
531
+ return {
532
+ ...window,
533
+ transform: {
534
+ ...window.transform,
535
+ panX: (window.transform?.panX ?? 0) + (transform.panX ?? 0),
536
+ panY: (window.transform?.panY ?? 0) + (transform.panY ?? 0),
537
+ zoomX: (window.transform?.zoomX ?? 1) * (transform.zoomX ?? 1),
538
+ zoomY: (window.transform?.zoomY ?? 1) * (transform.zoomY ?? 1),
539
+ rotation: (window.transform?.rotation ?? 0) + (transform.rotation ?? 0),
540
+ },
541
+ };
542
+ }
543
+
544
+ /**
545
+ * Scale a window uniformly
546
+ *
547
+ * @param {Object} window - Existing window settings
548
+ * @param {number} scale - Scale factor (1 = no change)
549
+ * @returns {Object} Scaled window
550
+ */
551
+ function scaleWindow(window, scale) {
552
+ return applyWindowTransform(window, {
553
+ zoomX: scale,
554
+ zoomY: scale,
555
+ });
556
+ }
557
+
558
+ /**
559
+ * Move a window
560
+ *
561
+ * @param {Object} window - Existing window settings
562
+ * @param {number} offsetX - X offset (-1 to 1)
563
+ * @param {number} offsetY - Y offset (-1 to 1)
564
+ * @returns {Object} Moved window
565
+ */
566
+ function moveWindow(window, offsetX, offsetY) {
567
+ return applyWindowTransform(window, {
568
+ panX: offsetX,
569
+ panY: offsetY,
570
+ });
571
+ }
572
+
573
+ /**
574
+ * Rotate a window
575
+ *
576
+ * @param {Object} window - Existing window settings
577
+ * @param {number} degrees - Rotation in degrees
578
+ * @returns {Object} Rotated window
579
+ */
580
+ function rotateWindow(window, degrees) {
581
+ return applyWindowTransform(window, {
582
+ rotation: degrees,
583
+ });
584
+ }
585
+
586
+ // ═══════════════════════════════════════════════════════════════════════════
587
+ // WINDOW SOFTNESS UTILITIES
588
+ // ═══════════════════════════════════════════════════════════════════════════
589
+
590
+ /**
591
+ * Apply softness settings to a window
592
+ *
593
+ * @param {Object} window - Existing window settings
594
+ * @param {Object} softness - Softness settings
595
+ * @param {number} softness.overall - Overall softness (0-1)
596
+ * @param {number} softness.inside - Inside edge softness (0-1)
597
+ * @param {number} softness.outside - Outside edge softness (0-1)
598
+ * @returns {Object} Window with updated softness
599
+ */
600
+ function applyWindowSoftness(window, softness = {}) {
601
+ const { overall, inside = 0, outside = softness.overall } = softness;
602
+
603
+ return {
604
+ ...window,
605
+ shape: {
606
+ ...window.shape,
607
+ softness: overall ?? window.shape?.softness,
608
+ insideSoftness: inside,
609
+ outsideSoftness: outside ?? overall ?? window.shape?.outsideSoftness,
610
+ },
611
+ };
612
+ }
613
+
614
+ /**
615
+ * Apply preset softness to a window
616
+ *
617
+ * @param {Object} window - Existing window settings
618
+ * @param {string} preset - Preset name from SOFTNESS_PRESETS
619
+ * @returns {Object} Window with preset softness
620
+ */
621
+ function applyPresetSoftness(window, preset) {
622
+ const softness = SOFTNESS_PRESETS[preset.toUpperCase()] ?? SOFTNESS_PRESETS.SOFT;
623
+ return applyWindowSoftness(window, { overall: softness });
624
+ }
625
+
626
+ // ═══════════════════════════════════════════════════════════════════════════
627
+ // WINDOW CORRECTOR BUILDER
628
+ // ═══════════════════════════════════════════════════════════════════════════
629
+
630
+ /**
631
+ * Create a complete window corrector ready for encoding
632
+ *
633
+ * @param {Object} window - Window settings from any builder
634
+ * @returns {Object} Corrector object for node-tree-encoder
635
+ */
636
+ function createWindowCorrector(window) {
637
+ return {
638
+ typeId: CORRECTOR_TYPE.WINDOW,
639
+ enabled: true,
640
+ values: {
641
+ window,
642
+ },
643
+ };
644
+ }
645
+
646
+ /**
647
+ * Create a windowed correction node (window + primary correction)
648
+ *
649
+ * @param {Object} window - Window settings
650
+ * @param {Object} correction - Primary correction to apply
651
+ * @returns {Object} Node definition with both correctors
652
+ */
653
+ function createWindowedCorrectionNode(window, correction) {
654
+ return {
655
+ id: `windowed_node_${Date.now()}`,
656
+ label: 'Windowed Correction',
657
+ enabled: true,
658
+ correctors: [
659
+ createWindowCorrector(window),
660
+ {
661
+ typeId: CORRECTOR_TYPE.PRIMARY,
662
+ enabled: true,
663
+ values: correction,
664
+ },
665
+ ],
666
+ };
667
+ }
668
+
669
+ /**
670
+ * Combine multiple windows (intersect/union)
671
+ *
672
+ * Note: DaVinci Resolve handles multiple windows per node
673
+ * through multiple window correctors. This creates a node
674
+ * with multiple windows.
675
+ *
676
+ * @param {Array} windows - Array of window settings
677
+ * @param {Object} correction - Primary correction to apply
678
+ * @returns {Object} Node with multiple windows
679
+ */
680
+ function createMultiWindowNode(windows, correction) {
681
+ const correctors = windows.map((w) => createWindowCorrector(w));
682
+
683
+ if (correction) {
684
+ correctors.push({
685
+ typeId: CORRECTOR_TYPE.PRIMARY,
686
+ enabled: true,
687
+ values: correction,
688
+ });
689
+ }
690
+
691
+ return {
692
+ id: `multi_window_node_${Date.now()}`,
693
+ label: 'Multi-Window',
694
+ enabled: true,
695
+ correctors,
696
+ };
697
+ }
698
+
699
+ // ═══════════════════════════════════════════════════════════════════════════
700
+ // TRACKING DATA (PLACEHOLDER)
701
+ // ═══════════════════════════════════════════════════════════════════════════
702
+
703
+ /**
704
+ * Window tracking data structure (read-only reference)
705
+ *
706
+ * Note: Tracking data is typically generated by Resolve's tracker,
707
+ * not encoded manually. This structure documents the format for
708
+ * potential future use in reading/modifying existing tracking data.
709
+ */
710
+ const TRACKING_DATA_STRUCTURE = {
711
+ // Frame-by-frame transform data
712
+ frames: [
713
+ {
714
+ frame: 0,
715
+ panX: 0,
716
+ panY: 0,
717
+ zoomX: 1,
718
+ zoomY: 1,
719
+ rotation: 0,
720
+ },
721
+ ],
722
+ // Tracking type
723
+ type: 'point', // 'point', 'object', 'surface'
724
+ // Source clip reference
725
+ clipId: null,
726
+ // Tracking region
727
+ searchRegion: { x: 0, y: 0, width: 0.2, height: 0.2 },
728
+ };
729
+
730
+ // ═══════════════════════════════════════════════════════════════════════════
731
+ // EXPORTS
732
+ // ═══════════════════════════════════════════════════════════════════════════
733
+
734
+ module.exports = {
735
+ // Circular/Oval windows
736
+ createCircularWindow,
737
+ createOvalWindow,
738
+ createVignetteWindow,
739
+
740
+ // Linear/Gradient windows
741
+ createLinearWindow,
742
+ createGradientWindow,
743
+ createHorizontalSplit,
744
+ createVerticalSplit,
745
+
746
+ // Polygon windows
747
+ createPolygonWindow,
748
+ createRectangleWindow,
749
+ createTriangleWindow,
750
+ createRegularPolygonWindow,
751
+
752
+ // Power curve windows
753
+ createPowerCurveWindow,
754
+ createRoundedRectangleWindow,
755
+
756
+ // Transform utilities
757
+ applyWindowTransform,
758
+ scaleWindow,
759
+ moveWindow,
760
+ rotateWindow,
761
+
762
+ // Softness utilities
763
+ applyWindowSoftness,
764
+ applyPresetSoftness,
765
+
766
+ // Corrector builders
767
+ createWindowCorrector,
768
+ createWindowedCorrectionNode,
769
+ createMultiWindowNode,
770
+
771
+ // Constants
772
+ ASPECT_RATIOS,
773
+ GRADIENT_DIRECTIONS,
774
+ SOFTNESS_PRESETS,
775
+ TRACKING_DATA_STRUCTURE,
776
+ };