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,226 @@
1
+ /**
2
+ * Decode RESOLVEFX/OFX plugin parameter bags back to {pluginId, params}
3
+ * specs (P1.6).
4
+ *
5
+ * Container structure (per drx-generator.js buildOFXToolEntry +
6
+ * drx-parameters.RESOLVEFX comments):
7
+ *
8
+ * nodeData.F7.F10 (tool list entry — F1 wraps each tool)
9
+ * F1 = standard node marker (varint, fieldNum 1, value 2)
10
+ * F2.F21 (OFX container)
11
+ * F1 = 0x4F4659 ("OFY" marker varint)
12
+ * F2 = pluginId UTF-8 string
13
+ * F3 = instanceId UTF-8 string
14
+ * F4 = enabled varint (1)
15
+ * F5[] = repeated param entries
16
+ * F1 = param name UTF-8
17
+ * F2 = wrapped value: F2 (float64) OR F5 (UTF-8 string)
18
+ *
19
+ * extractOFXTools(toolListBuf | toolListField) returns
20
+ * Array<{ pluginId, instanceId, enabled, params: {name: value} }>
21
+ *
22
+ * Each `value` is either a number (when F2.F2 was a float64) or a
23
+ * string (when F2.F5 was UTF-8).
24
+ *
25
+ * P2 coverage: tool IDs beyond Film Grain land in the registry as
26
+ * AutoResearch lands them. The extractor doesn't depend on the tool ID
27
+ * registry — it surfaces the raw pluginId string from F2 of the OFX
28
+ * container. Callers can look it up against RESOLVEFX themselves.
29
+ *
30
+ * @module drx-codec/extract-ofx-params
31
+ */
32
+
33
+ // ─── Mini protobuf reader (CJS-local copy to avoid cross-dep) ────────────
34
+
35
+ function readVarint(buf, offset) {
36
+ let result = 0n;
37
+ let shift = 0n;
38
+ let cur = offset;
39
+ while (cur < buf.length) {
40
+ const byte = buf[cur++];
41
+ result |= BigInt(byte & 0x7f) << shift;
42
+ if ((byte & 0x80) === 0) return { value: result, next: cur };
43
+ shift += 7n;
44
+ }
45
+ throw new Error('Truncated varint');
46
+ }
47
+
48
+ function readField(buf, offset) {
49
+ const tag = readVarint(buf, offset);
50
+ const tagNum = Number(tag.value);
51
+ const wireType = tagNum & 0x07;
52
+ const fieldNum = tagNum >>> 3;
53
+ let cur = tag.next;
54
+ if (wireType === 0) {
55
+ const v = readVarint(buf, cur);
56
+ return { wireType, fieldNum, value: v.value, next: v.next };
57
+ }
58
+ if (wireType === 5) return { wireType, fieldNum, value: buf.readFloatLE(cur), next: cur + 4 };
59
+ if (wireType === 1) return { wireType, fieldNum, value: buf.readDoubleLE(cur), next: cur + 8 };
60
+ if (wireType === 2) {
61
+ const len = readVarint(buf, cur);
62
+ const start = len.next;
63
+ const end = start + Number(len.value);
64
+ return { wireType, fieldNum, value: buf.slice(start, end), next: end };
65
+ }
66
+ throw new Error(`Unsupported wire type ${wireType}`);
67
+ }
68
+
69
+ function readAllFields(buf) {
70
+ const fields = [];
71
+ let cur = 0;
72
+ while (cur < buf.length) {
73
+ const f = readField(buf, cur);
74
+ fields.push(f);
75
+ cur = f.next;
76
+ }
77
+ return fields;
78
+ }
79
+
80
+ function utf8(buf) {
81
+ return Buffer.isBuffer(buf) ? buf.toString('utf-8') : '';
82
+ }
83
+
84
+ // ─── OFX decoder ─────────────────────────────────────────────────────────
85
+
86
+ const OFY_MARKER = 0x4F4659;
87
+
88
+ /**
89
+ * Decode an F5 param-entry buffer to {name, value}.
90
+ * F1 = name (length-delimited UTF-8)
91
+ * F2 = wrapped value (F2 = float64 OR F5 = UTF-8 string)
92
+ */
93
+ function decodeParamEntry(entryBuf) {
94
+ let name = '';
95
+ let value = null;
96
+ const fields = readAllFields(entryBuf);
97
+ for (const f of fields) {
98
+ if (f.fieldNum === 1 && f.wireType === 2) {
99
+ name = utf8(f.value);
100
+ } else if (f.fieldNum === 2 && f.wireType === 2) {
101
+ // f.value is the wrapped value buffer; walk it for F2 (float64) or F5 (string).
102
+ const inner = readAllFields(f.value);
103
+ for (const inn of inner) {
104
+ if (inn.fieldNum === 2 && inn.wireType === 1) {
105
+ value = inn.value; // float64
106
+ } else if (inn.fieldNum === 5 && inn.wireType === 2) {
107
+ value = utf8(inn.value);
108
+ }
109
+ }
110
+ }
111
+ }
112
+ return { name, value };
113
+ }
114
+
115
+ /**
116
+ * Decode an OFX container (F2.F21 contents) to one tool record.
117
+ */
118
+ function decodeOFXContainer(containerBuf) {
119
+ const fields = readAllFields(containerBuf);
120
+ let marker = null;
121
+ let pluginId = '';
122
+ let instanceId = '';
123
+ let enabled = false;
124
+ const params = {};
125
+ for (const f of fields) {
126
+ if (f.fieldNum === 1 && f.wireType === 0) {
127
+ marker = Number(f.value);
128
+ } else if (f.fieldNum === 2 && f.wireType === 2) {
129
+ pluginId = utf8(f.value);
130
+ } else if (f.fieldNum === 3 && f.wireType === 2) {
131
+ instanceId = utf8(f.value);
132
+ } else if (f.fieldNum === 4 && f.wireType === 0) {
133
+ enabled = Number(f.value) === 1;
134
+ } else if (f.fieldNum === 5 && f.wireType === 2) {
135
+ const { name, value } = decodeParamEntry(f.value);
136
+ if (name) params[name] = value;
137
+ }
138
+ }
139
+ return { marker, pluginId, instanceId, enabled, params };
140
+ }
141
+
142
+ /**
143
+ * Walk a single tool-list entry (F7.F10[i]) looking for the F2.F21 OFX
144
+ * container.
145
+ *
146
+ * Returns null when the entry isn't an OFX entry (e.g., the standard
147
+ * node marker at F1=2 carries no plugin payload).
148
+ */
149
+ function decodeToolEntry(entryBuf) {
150
+ if (!Buffer.isBuffer(entryBuf) || entryBuf.length === 0) return null;
151
+ const fields = readAllFields(entryBuf);
152
+ for (const f of fields) {
153
+ if (f.fieldNum === 2 && f.wireType === 2) {
154
+ // F2 wraps F21 container in OFX entries.
155
+ const inner = readAllFields(f.value);
156
+ for (const inn of inner) {
157
+ if (inn.fieldNum === 21 && inn.wireType === 2) {
158
+ const ofx = decodeOFXContainer(inn.value);
159
+ if (ofx.marker === OFY_MARKER) return ofx;
160
+ }
161
+ }
162
+ }
163
+ }
164
+ return null;
165
+ }
166
+
167
+ /**
168
+ * Extract OFX tools from a tool-list buffer (the F7.F10 field value).
169
+ *
170
+ * The F7.F10 field is itself a wrapper around repeated F1 entries.
171
+ * Each F1 entry may be either the standard node marker (no OFX) or
172
+ * an OFX container.
173
+ *
174
+ * @param {Buffer|Object} toolList - raw F10 buffer OR parser-surfaced
175
+ * { _fields: [...] } structure
176
+ * @returns {Array<{pluginId, instanceId, enabled, params}>}
177
+ */
178
+ function extractOFXTools(toolList) {
179
+ const tools = [];
180
+
181
+ let entries = [];
182
+ if (Buffer.isBuffer(toolList)) {
183
+ // toolList is the raw F10 buffer. F1 entries are length-delimited.
184
+ const fields = readAllFields(toolList);
185
+ for (const f of fields) {
186
+ if (f.fieldNum === 1 && f.wireType === 2) entries.push(f.value);
187
+ }
188
+ } else if (toolList && Array.isArray(toolList._fields)) {
189
+ for (const f of toolList._fields) {
190
+ if (f.fieldNum === 1 && f.wireType === 2 && Buffer.isBuffer(f.value)) {
191
+ entries.push(f.value);
192
+ }
193
+ }
194
+ } else if (Array.isArray(toolList)) {
195
+ // Caller passed a pre-extracted entries list.
196
+ entries = toolList.filter((b) => Buffer.isBuffer(b));
197
+ } else {
198
+ return tools;
199
+ }
200
+
201
+ for (const e of entries) {
202
+ const t = decodeToolEntry(e);
203
+ if (t) tools.push(t);
204
+ }
205
+ return tools;
206
+ }
207
+
208
+ /**
209
+ * Convenience: extract the FIRST OFX tool from a tool list. Many use
210
+ * cases (Film Grain on a node) only have one plugin per node.
211
+ *
212
+ * @returns {Object|null}
213
+ */
214
+ function extractOFXParams(toolList) {
215
+ const tools = extractOFXTools(toolList);
216
+ return tools.length > 0 ? tools[0] : null;
217
+ }
218
+
219
+ module.exports = {
220
+ extractOFXParams,
221
+ extractOFXTools,
222
+ _internals: {
223
+ decodeOFXContainer, decodeToolEntry, decodeParamEntry,
224
+ readAllFields, OFY_MARKER,
225
+ },
226
+ };
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Decode POWER_WINDOWS (Corrector Type 4 + companions) params back to the
3
+ * spec shape generateDRX's window input accepts (P1.4).
4
+ *
5
+ * Encoding (TRUE live-calibrated scales, multi-point fit 2026-06-22, applied
6
+ * to the generator 2026-07-01 — see test/power-window-transform-calibration):
7
+ * WINDOW_TYPE 0x88500008 varint {F2:2} — CONSTANT in every shape's fixture;
8
+ * shape is discriminated by which corrector blocks are present,
9
+ * not by this flag (circle=ct4; linear=ct4+ct3 mask;
10
+ * gradient=ct65554; polygon/curve=ct4+ct6 vertex ring)
11
+ * ROTATE float stored = −UI°/180
12
+ * SIZE float stored = 1 + (UI−50)×0.08 (neutral 1.0)
13
+ * ASPECT float stored = (50−UI)/50 (neutral 0)
14
+ * PAN/TILT float stored = (UI−50)/50 × 4096 (frame pixels)
15
+ * SOFT_REF, SOFT_1..4 float UI × 16 (SOFT_1–4 live in the ct3 mask block)
16
+ * OPACITY float UI / 100
17
+ * gradient ct65554: ROTATION −UI°/180, HANDLE_1/2 ±4096 px,
18
+ * SOFTNESS UI × 100, OPACITY UI / 100
19
+ *
20
+ * SOFT_REF and SOFT_1 both surface as soft1 (prefer SOFT_REF when both).
21
+ *
22
+ * @module drx-codec/extract-power-window
23
+ */
24
+
25
+ const drxParams = require('../drx-parameters');
26
+ const { POWER_WINDOWS, GRADIENT_WINDOW } = drxParams;
27
+
28
+ const PW = POWER_WINDOWS;
29
+ const GW = GRADIENT_WINDOW;
30
+
31
+ function toNumber(v) {
32
+ if (typeof v === 'bigint') return Number(v);
33
+ if (typeof v === 'number') return v;
34
+ // Varint envelope params (e.g. WINDOW_TYPE) may arrive as a parsed {F2: n} message.
35
+ if (v && typeof v === 'object' && v.F2 !== undefined) return Number(v.F2);
36
+ return 0;
37
+ }
38
+
39
+ function round4(v) { return Math.round(v * 1e4) / 1e4; }
40
+ function drxToRotate(v) { return round4(-toNumber(v) * 180); }
41
+ function drxToSize(v) { return round4(50 + (toNumber(v) - 1) / 0.08); }
42
+ function drxToAspect(v) { return round4(50 - toNumber(v) * 50); }
43
+ function drxToPanTilt(v) { return round4(50 + (toNumber(v) / 4096) * 50); }
44
+ function drxSoftToUi(v, scale) { return round4(toNumber(v) / scale); }
45
+
46
+ // Back-compat shims (old approximate conventions) kept ONLY for _internals users.
47
+ function drxToPan(v) { return drxToPanTilt(v); }
48
+ function drxToTilt(v) { return drxToPanTilt(v); }
49
+
50
+ /**
51
+ * Convert the raw DRX window-type flag back to a UI type.
52
+ *
53
+ * The wire flag is a CONSTANT varint 2 for every shape (live-confirmed on the
54
+ * circle/linear/gradient/polygon/curve fixtures), so it cannot discriminate
55
+ * shape. We disambiguate by sibling params:
56
+ * - gradient params (0x08F0xxxx) present → UI 5 (Gradient)
57
+ * - SOFT_2..4 present (linear-only mask) → UI 2 (Linear)
58
+ * - otherwise → UI 1 (Circle)
59
+ * Values 3 (Polygon) and 4 (Curve) never appear in this flag; their shape is
60
+ * carried by the ct6 vertex ring (node.params.polygonVertices).
61
+ */
62
+ function drxToUiType(drxType, hasLinearSoftness = false) {
63
+ const t = toNumber(drxType);
64
+ if (t === 2) return hasLinearSoftness ? 2 : 1;
65
+ return t;
66
+ }
67
+
68
+ /**
69
+ * Extract window settings from a flattened window parameter list
70
+ * (ct4 transform + ct3 softness mask + ct65554 gradient params).
71
+ *
72
+ * @param {Array<{id, value, name}>} parameters
73
+ * @returns {Object|null} window spec, or null if no window params present
74
+ */
75
+ function extractPowerWindow(parameters) {
76
+ if (!Array.isArray(parameters)) return null;
77
+
78
+ const out = {};
79
+ let foundAny = false;
80
+ let softRefVal;
81
+ let soft1Val;
82
+
83
+ // First pass — sibling-param shape discrimination (see drxToUiType).
84
+ let hasLinearSoftness = false;
85
+ let hasGradient = false;
86
+ for (const p of parameters) {
87
+ if (p.id === PW.SOFT_2 || p.id === PW.SOFT_3 || p.id === PW.SOFT_4) hasLinearSoftness = true;
88
+ if (GW && (p.id === GW.SOFTNESS || p.id === GW.ROTATION || p.id === GW.HANDLE_1_POS)) hasGradient = true;
89
+ }
90
+
91
+ for (const param of parameters) {
92
+ const v = param.value;
93
+ switch (param.id) {
94
+ case PW.WINDOW_TYPE:
95
+ out.type = hasGradient ? 5 : drxToUiType(v, hasLinearSoftness);
96
+ foundAny = true;
97
+ break;
98
+ case PW.ROTATE:
99
+ out.rotate = drxToRotate(v);
100
+ foundAny = true;
101
+ break;
102
+ case PW.SIZE:
103
+ out.size = drxToSize(v);
104
+ foundAny = true;
105
+ break;
106
+ case PW.ASPECT:
107
+ out.aspect = drxToAspect(v);
108
+ foundAny = true;
109
+ break;
110
+ case PW.PAN:
111
+ out.pan = drxToPanTilt(v);
112
+ foundAny = true;
113
+ break;
114
+ case PW.TILT:
115
+ out.tilt = drxToPanTilt(v);
116
+ foundAny = true;
117
+ break;
118
+ case PW.OPACITY:
119
+ out.opacity = round4(toNumber(v) * 100);
120
+ foundAny = true;
121
+ break;
122
+ case PW.SOFT_REF:
123
+ softRefVal = toNumber(v);
124
+ foundAny = true;
125
+ break;
126
+ case PW.SOFT_1:
127
+ soft1Val = toNumber(v);
128
+ foundAny = true;
129
+ break;
130
+ case PW.SOFT_2:
131
+ out.soft2 = drxSoftToUi(v, 16);
132
+ foundAny = true;
133
+ break;
134
+ case PW.SOFT_3:
135
+ out.soft3 = drxSoftToUi(v, 16);
136
+ foundAny = true;
137
+ break;
138
+ case PW.SOFT_4:
139
+ out.soft4 = drxSoftToUi(v, 16);
140
+ foundAny = true;
141
+ break;
142
+ default:
143
+ // Gradient window (ct65554) params.
144
+ if (GW && param.id === GW.SOFTNESS) {
145
+ out.type = 5;
146
+ out.soft1 = drxSoftToUi(v, 100);
147
+ foundAny = true;
148
+ } else if (GW && param.id === GW.ROTATION) {
149
+ out.type = 5;
150
+ out.rotate = drxToRotate(v);
151
+ foundAny = true;
152
+ } else if (GW && param.id === GW.HANDLE_1_POS) {
153
+ out.type = 5;
154
+ out.pan = drxToPanTilt(v);
155
+ foundAny = true;
156
+ } else if (GW && param.id === GW.HANDLE_2_POS) {
157
+ out.type = 5;
158
+ out.tilt = drxToPanTilt(v);
159
+ foundAny = true;
160
+ } else if (GW && param.id === GW.OPACITY) {
161
+ out.type = 5;
162
+ out.opacity = round4(toNumber(v) * 100);
163
+ foundAny = true;
164
+ }
165
+ break;
166
+ }
167
+ }
168
+
169
+ // Reconcile SOFT_REF / SOFT_1 if either was present (circle/linear), UI × 16.
170
+ if (softRefVal !== undefined) {
171
+ out.soft1 = drxSoftToUi(softRefVal, 16);
172
+ } else if (soft1Val !== undefined) {
173
+ out.soft1 = drxSoftToUi(soft1Val, 16);
174
+ }
175
+
176
+ return foundAny ? out : null;
177
+ }
178
+
179
+ module.exports = {
180
+ extractPowerWindow,
181
+ _internals: {
182
+ drxToRotate, drxToSize, drxToAspect, drxToPanTilt, drxToPan, drxToTilt, drxSoftToUi, drxToUiType, toNumber,
183
+ },
184
+ };
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Decode HSL_QUALIFIER (Corrector Type 2) params back to the spec
3
+ * shape generateDRX's qualifier input accepts (P1.3).
4
+ *
5
+ * All percentage-based params store DRX value = UI / 100, so the
6
+ * extractor multiplies by 100 to recover UI units. mode and modeFlag
7
+ * (varints) come through as numbers.
8
+ *
9
+ * @module drx-codec/extract-qualifier
10
+ */
11
+
12
+ const drxParams = require('../drx-parameters');
13
+ const { HSL_QUALIFIER } = drxParams;
14
+
15
+ // Map of param ID → output key. The duplicate hue params (HUE_WIDTH_DUP,
16
+ // HUE_SOFT_DUP) appear in the protobuf but are linked to the canonical
17
+ // HUE_WIDTH / HUE_SOFT values — we don't surface them separately, only
18
+ // the canonical names. If they disagree, the canonical entry wins
19
+ // (the canonical id appears first in the generator's emission order).
20
+ const PARAM_TO_KEY = new Map([
21
+ [HSL_QUALIFIER.HUE_CENTER, 'hueCenter'],
22
+ [HSL_QUALIFIER.HUE_WIDTH, 'hueWidth'],
23
+ [HSL_QUALIFIER.HUE_SYM, 'hueSymmetry'],
24
+ [HSL_QUALIFIER.HUE_SOFT, 'hueSoft'],
25
+ [HSL_QUALIFIER.SAT_HIGH, 'satHigh'],
26
+ [HSL_QUALIFIER.SAT_LOW, 'satLow'],
27
+ [HSL_QUALIFIER.SAT_HIGH_SOFT, 'satHighSoft'],
28
+ [HSL_QUALIFIER.SAT_LOW_SOFT, 'satLowSoft'],
29
+ [HSL_QUALIFIER.LUM_HIGH, 'lumHigh'],
30
+ [HSL_QUALIFIER.LUM_LOW, 'lumLow'],
31
+ [HSL_QUALIFIER.LUM_HIGH_SOFT, 'lumHighSoft'],
32
+ [HSL_QUALIFIER.LUM_LOW_SOFT, 'lumLowSoft'],
33
+ ]);
34
+
35
+ const VARINT_IDS = new Set([
36
+ HSL_QUALIFIER.MODE_FLAG,
37
+ HSL_QUALIFIER.QUALIFIER_MODE,
38
+ ]);
39
+
40
+ /**
41
+ * Convert a stored DRX float value back to UI percentage.
42
+ * Tolerates BigInt (from varints) and clamps to a sane range.
43
+ */
44
+ function drxToUi(v) {
45
+ if (typeof v === 'bigint') v = Number(v);
46
+ if (typeof v !== 'number' || !Number.isFinite(v)) return 0;
47
+ // Multiply by 100 and round to 6 decimals to suppress float32 noise.
48
+ return Math.round(v * 100 * 1e6) / 1e6;
49
+ }
50
+
51
+ /**
52
+ * Convert a varint value (possibly BigInt) to a plain number.
53
+ */
54
+ function varintToNumber(v) {
55
+ if (typeof v === 'bigint') return Number(v);
56
+ if (typeof v === 'number') return v;
57
+ return 0;
58
+ }
59
+
60
+ /**
61
+ * Extract HSL qualifier settings from a corrector's parameter list.
62
+ *
63
+ * @param {Array<{id, value, name}>} parameters - parser-surfaced params
64
+ * @returns {Object|null} qualifier spec or null if not a qualifier corrector
65
+ */
66
+ function extractQualifier(parameters) {
67
+ if (!Array.isArray(parameters)) return null;
68
+
69
+ const out = {};
70
+ let foundAny = false;
71
+ let foundMode = false;
72
+
73
+ for (const param of parameters) {
74
+ if (PARAM_TO_KEY.has(param.id)) {
75
+ const key = PARAM_TO_KEY.get(param.id);
76
+ // Don't overwrite if already set (duplicate hue params come after
77
+ // the canonical ones in the generator's emission order, but the
78
+ // canonical entries should win).
79
+ if (out[key] === undefined) {
80
+ out[key] = drxToUi(param.value);
81
+ foundAny = true;
82
+ }
83
+ } else if (param.id === HSL_QUALIFIER.MODE_FLAG) {
84
+ out.modeFlag = varintToNumber(param.value);
85
+ foundMode = true;
86
+ } else if (param.id === HSL_QUALIFIER.QUALIFIER_MODE) {
87
+ out.mode = varintToNumber(param.value);
88
+ foundMode = true;
89
+ }
90
+ }
91
+
92
+ if (!foundAny && !foundMode) return null;
93
+ return out;
94
+ }
95
+
96
+ module.exports = {
97
+ extractQualifier,
98
+ _internals: { PARAM_TO_KEY, VARINT_IDS, drxToUi, varintToNumber },
99
+ };
@@ -0,0 +1,109 @@
1
+ /**
2
+ * drx-codec — DRX Codec Stack
3
+ *
4
+ * Deterministic, offline DRX generation and parsing: node-graph generate/parse,
5
+ * request→grade resolution, tool selection, CDL export, grade merging, and NLP
6
+ * parsing of colorist vocabulary. All local — no LLM, no network.
7
+ *
8
+ * @module drx-codec
9
+ */
10
+
11
+ // Core generation
12
+ const drxGenerator = require('./drx-generator');
13
+ const resolvedDrxGenerator = require('./resolved-drx-generator');
14
+
15
+ // Tool resolution system
16
+ const toolResolver = require('./tool-resolver');
17
+ const vocabularyIntents = require('./vocabulary-intents');
18
+
19
+ // DRX parsing
20
+ const drxParser = require('./drx-parser');
21
+
22
+ // CDL export
23
+ const cdlExporter = require('./cdl-exporter');
24
+
25
+ // Grade merging
26
+ const drxMerger = require('./drx-merger');
27
+
28
+ // NLP parsing (deterministic colorist-vocabulary → params)
29
+ const colorNlpParser = require('./color-nlp-parser');
30
+
31
+ // Look recipes / named look presets with concrete adjustment values
32
+ const lookRecipes = require('./training-examples');
33
+
34
+ // P1.1 — extract custom (YRGB) curves from a corrector's parameter list
35
+ const extractCustomCurvesModule = require('./extract-custom-curves');
36
+ // P1.2 — extract HSL curves (hueVs* / satVs* / lumVs*) from a corrector
37
+ const extractHSLCurvesModule = require('./extract-hsl-curves');
38
+ // P1.3 — extract HSL qualifier regions from a Corrector Type 2 param list
39
+ const extractQualifierModule = require('./extract-qualifier');
40
+ // P1.4 — extract power window settings from a Corrector Type 4 param list
41
+ const extractPowerWindowModule = require('./extract-power-window');
42
+ // P1.5 — extract matte finesse cleanup from a Corrector Type 9 param list
43
+ const extractMatteFinesseModule = require('./extract-matte-finesse');
44
+ // P1.6 — extract RESOLVEFX/OFX plugin parameter bags from a node's tool list
45
+ const extractOFXParamsModule = require('./extract-ofx-params');
46
+ // P5.1 — extract per-node LUT references (Resolve "Right-click → LUT")
47
+ const extractLutRefsModule = require('./extract-lut-refs');
48
+
49
+ module.exports = {
50
+ // Core generation
51
+ drxGenerator,
52
+ resolvedDrxGenerator,
53
+
54
+ // Tool resolution
55
+ toolResolver,
56
+ vocabularyIntents,
57
+
58
+ // Parsing
59
+ drxParser,
60
+
61
+ // CDL export
62
+ cdlExporter,
63
+
64
+ // Grade merging
65
+ drxMerger,
66
+
67
+ // NLP parsing
68
+ colorNlpParser,
69
+
70
+ // Look recipes
71
+ lookRecipes,
72
+
73
+ // P1.1 — DRX parser parity for custom curves
74
+ extractCustomCurves: extractCustomCurvesModule.extractCustomCurves,
75
+
76
+ // P1.2 — DRX parser parity for HSL curves
77
+ extractHSLCurves: extractHSLCurvesModule.extractHSLCurves,
78
+
79
+ // P1.3 — DRX parser parity for HSL qualifier regions
80
+ extractQualifier: extractQualifierModule.extractQualifier,
81
+
82
+ // P1.4 — DRX parser parity for power windows
83
+ extractPowerWindow: extractPowerWindowModule.extractPowerWindow,
84
+
85
+ // P1.5 — DRX parser parity for matte finesse cleanup
86
+ // (external matte refs deferred — see resolve-verifications.md)
87
+ extractMatteFinesse: extractMatteFinesseModule.extractMatteFinesse,
88
+
89
+ // P1.6 — DRX parser parity for RESOLVEFX/OFX plugin parameter bags
90
+ // (Film Grain at minimum; P2.1 will expand the tool registry)
91
+ extractOFXParams: extractOFXParamsModule.extractOFXParams,
92
+ extractOFXTools: extractOFXParamsModule.extractOFXTools,
93
+
94
+ // P5.1 — DRX parser parity for per-node LUT references
95
+ extractNodeLutRef: extractLutRefsModule.extractNodeLutRef,
96
+ extractDrxLutRefs: extractLutRefsModule.extractDrxLutRefs,
97
+
98
+ // Convenience functions (backwards-compatible with post-assistant's old index)
99
+ generateGrade: resolvedDrxGenerator.generateResolvedDRX,
100
+ generateFromRequest: resolvedDrxGenerator.generateFromRequest,
101
+ previewTools: resolvedDrxGenerator.previewResolution,
102
+ extractIntents: (input) => {
103
+ if (typeof input === 'string' && input.includes(' ')) {
104
+ return vocabularyIntents.extractIntentsFromRequest(input);
105
+ }
106
+ return vocabularyIntents.extractIntents(input);
107
+ },
108
+ getAvailableTools: toolResolver.getAvailableTools,
109
+ };