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.
- package/AGENTS.md +20 -0
- package/CHANGELOG.md +197 -2
- package/LICENSE +1 -1
- package/README.md +73 -1
- package/bin/davinci-resolve-advanced-mcp.mjs +20 -0
- package/docs/README.md +19 -0
- package/docs/SKILL.md +62 -1
- package/docs/contributing.md +1 -1
- package/docs/guides/control-panel.md +9 -0
- package/docs/kernels/README.md +21 -0
- package/docs/kernels/audio-fairlight-kernel.md +22 -0
- package/docs/kernels/color-grade-kernel.md +51 -0
- package/docs/kernels/fusion-composition-kernel.md +17 -0
- package/docs/kernels/media-pool-ingest-kernel.md +20 -0
- package/docs/kernels/render-deliver-kernel.md +32 -0
- package/docs/kernels/timeline-conform-interchange-kernel.md +39 -0
- package/docs/kernels/timeline-edit-kernel.md +17 -0
- package/docs/process/release-process.md +29 -7
- package/docs/reference/api-coverage.md +1 -1
- package/docs/reference/api-limitations.md +38 -1
- package/install.py +27 -4
- package/package.json +23 -2
- package/resolve-advanced/README.md +194 -0
- package/resolve-advanced/package.json +50 -0
- package/resolve-advanced/server/black-balance.mjs +92 -0
- package/resolve-advanced/server/capabilities.mjs +86 -0
- package/resolve-advanced/server/cdl-io.mjs +76 -0
- package/resolve-advanced/server/contrast-normalize.mjs +180 -0
- package/resolve-advanced/server/db-patch.mjs +91 -0
- package/resolve-advanced/server/deliverable-entities.mjs +86 -0
- package/resolve-advanced/server/deliverable-qc.mjs +270 -0
- package/resolve-advanced/server/editorial.mjs +370 -0
- package/resolve-advanced/server/exposure-level.mjs +129 -0
- package/resolve-advanced/server/extract-frames.mjs +196 -0
- package/resolve-advanced/server/ffprobe-media.mjs +88 -0
- package/resolve-advanced/server/gamut-legal.mjs +112 -0
- package/resolve-advanced/server/grade-body-patch.mjs +246 -0
- package/resolve-advanced/server/grade-transfer.mjs +66 -0
- package/resolve-advanced/server/group-grade-read.mjs +137 -0
- package/resolve-advanced/server/index.mjs +105 -0
- package/resolve-advanced/server/lib.mjs +84 -0
- package/resolve-advanced/server/libs.mjs +65 -0
- package/resolve-advanced/server/lineage-db.mjs +479 -0
- package/resolve-advanced/server/lut-apply.mjs +61 -0
- package/resolve-advanced/server/match-to-reference.mjs +173 -0
- package/resolve-advanced/server/media-inventory.mjs +169 -0
- package/resolve-advanced/server/media-ops.mjs +243 -0
- package/resolve-advanced/server/node-meta-db.mjs +62 -0
- package/resolve-advanced/server/node-provenance.mjs +102 -0
- package/resolve-advanced/server/offline-ref-db.mjs +420 -0
- package/resolve-advanced/server/offline-ref.mjs +179 -0
- package/resolve-advanced/server/project-db.mjs +233 -0
- package/resolve-advanced/server/provenance-audit.mjs +210 -0
- package/resolve-advanced/server/qc-frame.mjs +224 -0
- package/resolve-advanced/server/qc-sampler.mjs +67 -0
- package/resolve-advanced/server/readback.mjs +77 -0
- package/resolve-advanced/server/render-manifest.mjs +93 -0
- package/resolve-advanced/server/reverse-clip-db.mjs +270 -0
- package/resolve-advanced/server/runner-apply-contract.mjs +64 -0
- package/resolve-advanced/server/runner.mjs +244 -0
- package/resolve-advanced/server/saturation-match.mjs +108 -0
- package/resolve-advanced/server/scope-read.mjs +257 -0
- package/resolve-advanced/server/season-look.mjs +96 -0
- package/resolve-advanced/server/shot-intent.mjs +82 -0
- package/resolve-advanced/server/shot-match.mjs +147 -0
- package/resolve-advanced/server/skin-match.mjs +205 -0
- package/resolve-advanced/server/spec-compile.mjs +217 -0
- package/resolve-advanced/server/tone-curve-transfer.mjs +184 -0
- package/resolve-advanced/server/tool-catalog.mjs +265 -0
- package/resolve-advanced/server/tools/audio.mjs +54 -0
- package/resolve-advanced/server/tools/audio_plan.mjs +58 -0
- package/resolve-advanced/server/tools/capabilities.mjs +16 -0
- package/resolve-advanced/server/tools/color_trace.mjs +165 -0
- package/resolve-advanced/server/tools/conform.mjs +291 -0
- package/resolve-advanced/server/tools/deliverable.mjs +105 -0
- package/resolve-advanced/server/tools/drp.mjs +232 -0
- package/resolve-advanced/server/tools/drt.mjs +200 -0
- package/resolve-advanced/server/tools/drx.mjs +943 -0
- package/resolve-advanced/server/tools/editorial.mjs +69 -0
- package/resolve-advanced/server/tools/fairlight.mjs +108 -0
- package/resolve-advanced/server/tools/fusion.mjs +64 -0
- package/resolve-advanced/server/tools/media.mjs +102 -0
- package/resolve-advanced/server/tools/offline_ref.mjs +123 -0
- package/resolve-advanced/server/tools/pipeline.mjs +137 -0
- package/resolve-advanced/server/tools/project_db.mjs +200 -0
- package/resolve-advanced/server/tools/project_read.mjs +212 -0
- package/resolve-advanced/server/tools/provenance.mjs +73 -0
- package/resolve-advanced/server/verify-grade.mjs +113 -0
- package/resolve-advanced/server/white-balance-match.mjs +122 -0
- package/resolve-advanced/vendor/audio/format-converter.js +330 -0
- package/resolve-advanced/vendor/audio/split.js +173 -0
- package/resolve-advanced/vendor/audio/trim.js +188 -0
- package/resolve-advanced/vendor/audio-fairlight/index.js +391 -0
- package/resolve-advanced/vendor/conform-qc/adapters/frame-sampler.js +56 -0
- package/resolve-advanced/vendor/conform-qc/adapters/local-ffmpeg-sampler.js +65 -0
- package/resolve-advanced/vendor/conform-qc/adapters/rendernode-ffmpeg-sampler.js +50 -0
- package/resolve-advanced/vendor/conform-qc/adapters/resolve/driver.py +176 -0
- package/resolve-advanced/vendor/conform-qc/adapters/resolve-driver.js +61 -0
- package/resolve-advanced/vendor/conform-qc/adapters/resolve-headless-driver.js +86 -0
- package/resolve-advanced/vendor/conform-qc/adapters/vision-validator.js +75 -0
- package/resolve-advanced/vendor/conform-qc/cli.js +63 -0
- package/resolve-advanced/vendor/conform-qc/compare/advisory.js +106 -0
- package/resolve-advanced/vendor/conform-qc/compare/decode.js +36 -0
- package/resolve-advanced/vendor/conform-qc/compare/index.js +61 -0
- package/resolve-advanced/vendor/conform-qc/compare/locate.js +70 -0
- package/resolve-advanced/vendor/conform-qc/compare/metrics.js +409 -0
- package/resolve-advanced/vendor/conform-qc/docs/runbook.md +72 -0
- package/resolve-advanced/vendor/conform-qc/index.js +49 -0
- package/resolve-advanced/vendor/conform-qc/knowledge/index.js +110 -0
- package/resolve-advanced/vendor/conform-qc/ops/conform-core.js +137 -0
- package/resolve-advanced/vendor/conform-qc/ops/conform-diff.js +109 -0
- package/resolve-advanced/vendor/conform-qc/ops/insert.js +108 -0
- package/resolve-advanced/vendor/conform-qc/ops/local-conform.js +61 -0
- package/resolve-advanced/vendor/conform-qc/ops/patch.js +80 -0
- package/resolve-advanced/vendor/conform-qc/ops/trigger.js +32 -0
- package/resolve-advanced/vendor/conform-qc/ops/verify.js +105 -0
- package/resolve-advanced/vendor/conform-qc/ops/workflow.js +30 -0
- package/resolve-advanced/vendor/conform-qc/oracle/emulate.js +155 -0
- package/resolve-advanced/vendor/conform-qc/oracle/index.js +38 -0
- package/resolve-advanced/vendor/conform-qc/oracle/resolve.js +196 -0
- package/resolve-advanced/vendor/conform-qc/package.json +16 -0
- package/resolve-advanced/vendor/conform-qc/packaging/emit-aaf.js +30 -0
- package/resolve-advanced/vendor/conform-qc/packaging/emit-fcp7.js +64 -0
- package/resolve-advanced/vendor/conform-qc/packaging/index.js +169 -0
- package/resolve-advanced/vendor/conform-qc/packaging/media-ops.js +56 -0
- package/resolve-advanced/vendor/conform-qc/packaging/otio.js +50 -0
- package/resolve-advanced/vendor/conform-qc/packaging/relink.js +50 -0
- package/resolve-advanced/vendor/conform-qc/packaging/surgical-relink.js +195 -0
- package/resolve-advanced/vendor/conform-qc/parse/index.js +54 -0
- package/resolve-advanced/vendor/conform-qc/parse/merge-dto.js +27 -0
- package/resolve-advanced/vendor/conform-qc/parse/xmeml-geometry.js +256 -0
- package/resolve-advanced/vendor/conform-qc/reference/burnin-ocr.js +100 -0
- package/resolve-advanced/vendor/conform-qc/reference/sidecar.js +37 -0
- package/resolve-advanced/vendor/conform-qc/repair/analysis.js +62 -0
- package/resolve-advanced/vendor/conform-qc/repair/index.js +78 -0
- package/resolve-advanced/vendor/conform-qc/repair/media-analysis.js +139 -0
- package/resolve-advanced/vendor/conform-qc/repair/media-index.js +135 -0
- package/resolve-advanced/vendor/conform-qc/repair/strategies.js +250 -0
- package/resolve-advanced/vendor/conform-qc/report/index.js +133 -0
- package/resolve-advanced/vendor/conform-qc/roles/index.js +96 -0
- package/resolve-advanced/vendor/conform-qc/synthetic/generate.js +233 -0
- package/resolve-advanced/vendor/conform-qc/test/advisory.test.js +85 -0
- package/resolve-advanced/vendor/conform-qc/test/cli.test.js +39 -0
- package/resolve-advanced/vendor/conform-qc/test/compare.test.js +152 -0
- package/resolve-advanced/vendor/conform-qc/test/conform-diff.test.js +70 -0
- package/resolve-advanced/vendor/conform-qc/test/emulate.test.js +51 -0
- package/resolve-advanced/vendor/conform-qc/test/frame-sampler.test.js +30 -0
- package/resolve-advanced/vendor/conform-qc/test/geometry.test.js +112 -0
- package/resolve-advanced/vendor/conform-qc/test/knowledge.test.js +56 -0
- package/resolve-advanced/vendor/conform-qc/test/lifecycle.test.js +110 -0
- package/resolve-advanced/vendor/conform-qc/test/local-ffmpeg-sampler.test.js +66 -0
- package/resolve-advanced/vendor/conform-qc/test/locate.test.js +63 -0
- package/resolve-advanced/vendor/conform-qc/test/media-analysis.test.js +63 -0
- package/resolve-advanced/vendor/conform-qc/test/media-index-normalized.test.js +65 -0
- package/resolve-advanced/vendor/conform-qc/test/media-index-origin.test.js +53 -0
- package/resolve-advanced/vendor/conform-qc/test/metrics-fast.test.js +91 -0
- package/resolve-advanced/vendor/conform-qc/test/oracle-reverse.test.js +86 -0
- package/resolve-advanced/vendor/conform-qc/test/oracle.test.js +136 -0
- package/resolve-advanced/vendor/conform-qc/test/p0-acceptance.test.js +60 -0
- package/resolve-advanced/vendor/conform-qc/test/p1-acceptance.test.js +75 -0
- package/resolve-advanced/vendor/conform-qc/test/p45-patch-acceptance.test.js +102 -0
- package/resolve-advanced/vendor/conform-qc/test/packaging.test.js +133 -0
- package/resolve-advanced/vendor/conform-qc/test/parse-stubs.test.js +28 -0
- package/resolve-advanced/vendor/conform-qc/test/repair-strategies.test.js +128 -0
- package/resolve-advanced/vendor/conform-qc/test/repair.test.js +84 -0
- package/resolve-advanced/vendor/conform-qc/test/report.test.js +52 -0
- package/resolve-advanced/vendor/conform-qc/test/resolve-readback.test.js +71 -0
- package/resolve-advanced/vendor/conform-qc/test/roles.test.js +107 -0
- package/resolve-advanced/vendor/conform-qc/test/runbook.test.js +30 -0
- package/resolve-advanced/vendor/conform-qc/test/scale-residual.test.js +40 -0
- package/resolve-advanced/vendor/conform-qc/test/sidecar.test.js +51 -0
- package/resolve-advanced/vendor/conform-qc/test/smoke.test.js +87 -0
- package/resolve-advanced/vendor/conform-qc/test/surgical-relink.test.js +73 -0
- package/resolve-advanced/vendor/conform-qc/test/synthetic.test.js +98 -0
- package/resolve-advanced/vendor/conform-qc/test/verify.test.js +93 -0
- package/resolve-advanced/vendor/conform-qc/test/vision-validator.test.js +43 -0
- package/resolve-advanced/vendor/conform-qc/test/workflow-driver.test.js +46 -0
- package/resolve-advanced/vendor/conform-qc/toolset/index.js +53 -0
- package/resolve-advanced/vendor/drp-format/README.md +116 -0
- package/resolve-advanced/vendor/drp-format/__tests__/_resolve-verify.js +39 -0
- package/resolve-advanced/vendor/drp-format/__tests__/add-media-clip.test.js +30 -0
- package/resolve-advanced/vendor/drp-format/__tests__/assemble-timeline.test.js +68 -0
- package/resolve-advanced/vendor/drp-format/__tests__/author-project.test.js +57 -0
- package/resolve-advanced/vendor/drp-format/__tests__/composition-text.test.js +98 -0
- package/resolve-advanced/vendor/drp-format/__tests__/diff.test.js +272 -0
- package/resolve-advanced/vendor/drp-format/__tests__/effect-filters-compressed.test.js +143 -0
- package/resolve-advanced/vendor/drp-format/__tests__/fixtures/p0-3-session30-empty-effectfilters.drp +0 -0
- package/resolve-advanced/vendor/drp-format/__tests__/fixtures/retimed-timemap-50pct.hex +1 -0
- package/resolve-advanced/vendor/drp-format/__tests__/fixtures/retimed-timemap-dynamic.hex +1 -0
- package/resolve-advanced/vendor/drp-format/__tests__/inject-grades.test.js +238 -0
- package/resolve-advanced/vendor/drp-format/__tests__/keyed-dict.test.js +85 -0
- package/resolve-advanced/vendor/drp-format/__tests__/lut-refs.test.js +119 -0
- package/resolve-advanced/vendor/drp-format/__tests__/media-blobs.test.js +25 -0
- package/resolve-advanced/vendor/drp-format/__tests__/media-timemap.test.js +119 -0
- package/resolve-advanced/vendor/drp-format/__tests__/place-fusion-title.test.js +52 -0
- package/resolve-advanced/vendor/drp-format/__tests__/place-generator.test.js +40 -0
- package/resolve-advanced/vendor/drp-format/__tests__/place-transition.test.js +48 -0
- package/resolve-advanced/vendor/drp-format/__tests__/protobuf-wire.test.js +64 -0
- package/resolve-advanced/vendor/drp-format/__tests__/relink-media.test.js +106 -0
- package/resolve-advanced/vendor/drp-format/__tests__/splice-clips.test.js +256 -0
- package/resolve-advanced/vendor/drp-format/assemble-timeline.js +65 -0
- package/resolve-advanced/vendor/drp-format/author-project.js +118 -0
- package/resolve-advanced/vendor/drp-format/composition-text.js +213 -0
- package/resolve-advanced/vendor/drp-format/curves-encoder.js +763 -0
- package/resolve-advanced/vendor/drp-format/diff.js +310 -0
- package/resolve-advanced/vendor/drp-format/drp-packager.js +201 -0
- package/resolve-advanced/vendor/drp-format/drp-validator.js +809 -0
- package/resolve-advanced/vendor/drp-format/effect-encoder.js +640 -0
- package/resolve-advanced/vendor/drp-format/extract-lut-refs.js +119 -0
- package/resolve-advanced/vendor/drp-format/grade-encoder.example.js +133 -0
- package/resolve-advanced/vendor/drp-format/grade-encoder.js +401 -0
- package/resolve-advanced/vendor/drp-format/grade-encoder.test.js +171 -0
- package/resolve-advanced/vendor/drp-format/grade-encoder.verify.js +249 -0
- package/resolve-advanced/vendor/drp-format/grade-node-extractor.js +495 -0
- package/resolve-advanced/vendor/drp-format/grade-parameter-decoder.js +774 -0
- package/resolve-advanced/vendor/drp-format/index.js +174 -0
- package/resolve-advanced/vendor/drp-format/inject-grades.js +219 -0
- package/resolve-advanced/vendor/drp-format/keyed-dict.js +227 -0
- package/resolve-advanced/vendor/drp-format/marker-encoder.js +532 -0
- package/resolve-advanced/vendor/drp-format/media-blobs.js +53 -0
- package/resolve-advanced/vendor/drp-format/media-timemap.js +164 -0
- package/resolve-advanced/vendor/drp-format/mp-folder-builder.js +293 -0
- package/resolve-advanced/vendor/drp-format/node-tree-encoder.js +1246 -0
- package/resolve-advanced/vendor/drp-format/package.json +18 -0
- package/resolve-advanced/vendor/drp-format/place-fusion-title.js +131 -0
- package/resolve-advanced/vendor/drp-format/place-generator.js +77 -0
- package/resolve-advanced/vendor/drp-format/place-transition.js +91 -0
- package/resolve-advanced/vendor/drp-format/power-window-encoder.js +776 -0
- package/resolve-advanced/vendor/drp-format/protobuf-wire.js +111 -0
- package/resolve-advanced/vendor/drp-format/qualifier-encoder.js +706 -0
- package/resolve-advanced/vendor/drp-format/relink-media.js +218 -0
- package/resolve-advanced/vendor/drp-format/rich-title-encoder.js +447 -0
- package/resolve-advanced/vendor/drp-format/seq-container-builder.js +572 -0
- package/resolve-advanced/vendor/drp-format/seq-surgery.js +155 -0
- package/resolve-advanced/vendor/drp-format/splice-clips.js +445 -0
- package/resolve-advanced/vendor/drp-format/templates/empty-project.drp +0 -0
- package/resolve-advanced/vendor/drp-format/templates/fusion-title.xml +56 -0
- package/resolve-advanced/vendor/drp-format/templates/generator-solid-color.xml +21 -0
- package/resolve-advanced/vendor/drp-format/templates/media-clip-h264.drp +0 -0
- package/resolve-advanced/vendor/drp-format/templates/transition-cross-dissolve.xml +22 -0
- package/resolve-advanced/vendor/drp-format/tool-registry.descriptor.js +80 -0
- package/resolve-advanced/vendor/drp-format/utils/safe-archive.js +54 -0
- package/resolve-advanced/vendor/drp-format/xml-builder.js +759 -0
- package/resolve-advanced/vendor/drt-format/__tests__/_resolve-verify.js +21 -0
- package/resolve-advanced/vendor/drt-format/__tests__/build.test.js +113 -0
- package/resolve-advanced/vendor/drt-format/__tests__/multi-format.test.js +93 -0
- package/resolve-advanced/vendor/drt-format/__tests__/parse-real-resolve21.test.js +51 -0
- package/resolve-advanced/vendor/drt-format/__tests__/parse.test.js +134 -0
- package/resolve-advanced/vendor/drt-format/__tests__/resolve-versions.test.js +120 -0
- package/resolve-advanced/vendor/drt-format/__tests__/schema-fingerprint.test.js +62 -0
- package/resolve-advanced/vendor/drt-format/__tests__/smoke.test.js +27 -0
- package/resolve-advanced/vendor/drt-format/__tests__/validate.test.js +109 -0
- package/resolve-advanced/vendor/drt-format/capabilities.js +69 -0
- package/resolve-advanced/vendor/drt-format/capability-domains.js +56 -0
- package/resolve-advanced/vendor/drt-format/drt-builder.js +42 -0
- package/resolve-advanced/vendor/drt-format/drt-parser.js +164 -0
- package/resolve-advanced/vendor/drt-format/drt-validator.js +98 -0
- package/resolve-advanced/vendor/drt-format/index.js +45 -0
- package/resolve-advanced/vendor/drt-format/package.json +17 -0
- package/resolve-advanced/vendor/drt-format/resolve-versions.js +153 -0
- package/resolve-advanced/vendor/drt-format/schema-fingerprint.js +74 -0
- package/resolve-advanced/vendor/drt-format/templates/drt-project-shell.xml +124 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/curves-roundtrip.test.js +148 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-face-refinement.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-filmgrain.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-glow.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-lens-flare.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-3-beauty-25.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-3-beauty-75.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p5-1-node-no-lut.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p5-1-node-with-lut.drx +58 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/hsl-curves-roundtrip.test.js +117 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/lut-refs-roundtrip.test.js +112 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/matte-roundtrip.test.js +167 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/ofx-roundtrip.test.js +215 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/ofx-slugs-discovery.test.js +149 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/power-window-roundtrip.test.js +230 -0
- package/resolve-advanced/vendor/drx-codec/__tests__/qualifier-roundtrip.test.js +226 -0
- package/resolve-advanced/vendor/drx-codec/cdl-exporter.js +470 -0
- package/resolve-advanced/vendor/drx-codec/color-nlp-parser.js +833 -0
- package/resolve-advanced/vendor/drx-codec/data/color-nlp-action-mappings.json +2232 -0
- package/resolve-advanced/vendor/drx-codec/drx-generator.js +4123 -0
- package/resolve-advanced/vendor/drx-codec/drx-merger.js +320 -0
- package/resolve-advanced/vendor/drx-codec/drx-parser.js +1808 -0
- package/resolve-advanced/vendor/drx-codec/extract-custom-curves.js +215 -0
- package/resolve-advanced/vendor/drx-codec/extract-hsl-curves.js +180 -0
- package/resolve-advanced/vendor/drx-codec/extract-lut-refs.js +158 -0
- package/resolve-advanced/vendor/drx-codec/extract-matte-finesse.js +83 -0
- package/resolve-advanced/vendor/drx-codec/extract-ofx-params.js +226 -0
- package/resolve-advanced/vendor/drx-codec/extract-power-window.js +184 -0
- package/resolve-advanced/vendor/drx-codec/extract-qualifier.js +99 -0
- package/resolve-advanced/vendor/drx-codec/index.js +109 -0
- package/resolve-advanced/vendor/drx-codec/node-layout.js +249 -0
- package/resolve-advanced/vendor/drx-codec/resolved-drx-generator.js +393 -0
- package/resolve-advanced/vendor/drx-codec/tool-resolver.js +974 -0
- package/resolve-advanced/vendor/drx-codec/training-examples.js +548 -0
- package/resolve-advanced/vendor/drx-codec/vocabulary-intents.js +539 -0
- package/resolve-advanced/vendor/drx-parameters/CALIBRATION-STATUS.md +319 -0
- package/resolve-advanced/vendor/drx-parameters/DRX-VALUE-SCALING.md +251 -0
- package/resolve-advanced/vendor/drx-parameters/calibrated-ranges.json +17737 -0
- package/resolve-advanced/vendor/drx-parameters/corrector-types.js +120 -0
- package/resolve-advanced/vendor/drx-parameters/index.js +193 -0
- package/resolve-advanced/vendor/drx-parameters/parameter-codec.js +451 -0
- package/resolve-advanced/vendor/drx-parameters/parameter-ids.js +1292 -0
- package/resolve-advanced/vendor/drx-parameters/parameter-ranges.js +570 -0
- package/resolve-advanced/vendor/drx-parameters/parameter-validator.js +392 -0
- package/resolve-advanced/vendor/drx-parameters/resolvefx-registry.json +14973 -0
- package/resolve-advanced/vendor/drx-parameters/tool-registry.descriptor.js +38 -0
- package/resolve-advanced/vendor/drx-parameters/tools/drx-analyzer.js +371 -0
- package/resolve-advanced/vendor/fairlight/index.js +833 -0
- package/resolve-advanced/vendor/fusion-codec/composition-generator.js +401 -0
- package/resolve-advanced/vendor/fusion-codec/templates/blur-region.js +103 -0
- package/resolve-advanced/vendor/fusion-codec/templates/color-correct.js +87 -0
- package/resolve-advanced/vendor/fusion-codec/templates/film-grain.js +106 -0
- package/resolve-advanced/vendor/fusion-codec/templates/lower-third.js +241 -0
- package/resolve-advanced/vendor/fusion-codec/templates/picture-in-picture.js +188 -0
- package/resolve-advanced/vendor/fusion-codec/templates/text-overlay.js +161 -0
- package/resolve-advanced/vendor/fusion-codec/templates/title-card.js +184 -0
- package/resolve-advanced/vendor/fusion-codec/templates/vignette.js +107 -0
- package/resolve-advanced/vendor/fusion-codec/templates/watermark.js +101 -0
- package/scripts/agent-rules/README.md +68 -0
- package/src/analysis_dashboard.py +233 -1
- package/src/granular/common.py +1 -1
- package/src/server.py +479 -29
- package/src/utils/api_truth.py +117 -0
- package/src/utils/cut_ir.py +1 -1
- package/src/utils/failure_tracker.py +0 -2
- 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
|
+
};
|