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,548 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Training Examples Library (renamed from look-recipes.js)
|
|
3
|
+
*
|
|
4
|
+
* Named look presets with concrete adjustment values, multi-node configurations,
|
|
5
|
+
* and colorist reasoning for AI-driven grading decisions. Each recipe includes
|
|
6
|
+
* a `reasoning` field explaining the creative intent and technique behind the
|
|
7
|
+
* parameter choices — enabling AI agents to understand the "why" behind each look,
|
|
8
|
+
* not just the "what".
|
|
9
|
+
*
|
|
10
|
+
* Each recipe provides:
|
|
11
|
+
* - adjustments: parameter values in the -1 to +1 space used by resolveGrade
|
|
12
|
+
* - reasoning: colorist note explaining creative intent and technique
|
|
13
|
+
* - intent: tool selection hints for the ToolResolver
|
|
14
|
+
* - nodeLabel: descriptive label for the grade node
|
|
15
|
+
* - multiNode: optional multi-node configuration for more sophisticated looks
|
|
16
|
+
*
|
|
17
|
+
* Recipes are derived from real-world colorist techniques documented in
|
|
18
|
+
* the @colorist skill and verified via round-trip DRX generation → Resolve application.
|
|
19
|
+
*
|
|
20
|
+
* @module drx/training-examples
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
24
|
+
// LOOK RECIPES
|
|
25
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
26
|
+
|
|
27
|
+
const LOOK_RECIPES = {
|
|
28
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
29
|
+
// Cinematic Looks
|
|
30
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
cinematic_warm: {
|
|
33
|
+
name: 'Cinematic Warm',
|
|
34
|
+
description: 'Warm, slightly desaturated look with lifted blacks. Classic narrative cinema.',
|
|
35
|
+
category: 'cinematic',
|
|
36
|
+
reasoning: 'Warm highlights push emotional intimacy while desaturated midtones keep the image grounded. The lifted blacks prevent the shadows from going fully crushed, maintaining detail in dark areas — a hallmark of modern narrative cinema from colorists like Jill Bogdanowicz.',
|
|
37
|
+
adjustments: {
|
|
38
|
+
temperature: 0.25,
|
|
39
|
+
contrast: 0.15,
|
|
40
|
+
saturation: -0.15,
|
|
41
|
+
gainR: 0.12,
|
|
42
|
+
gainB: -0.08,
|
|
43
|
+
liftR: 0.02,
|
|
44
|
+
liftG: 0.01,
|
|
45
|
+
liftB: -0.01,
|
|
46
|
+
},
|
|
47
|
+
intent: { contrast: 'filmic', temperature: 'cinematic', saturation: 'smart' },
|
|
48
|
+
nodeLabel: 'Cinematic Warm',
|
|
49
|
+
multiNode: {
|
|
50
|
+
nodes: [
|
|
51
|
+
{
|
|
52
|
+
label: 'Balance',
|
|
53
|
+
adjustments: { exposure: 0.05, contrast: 0.08 },
|
|
54
|
+
intent: { contrast: 'soft' },
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
label: 'Warm Creative',
|
|
58
|
+
adjustments: {
|
|
59
|
+
temperature: 0.25,
|
|
60
|
+
saturation: -0.15,
|
|
61
|
+
gainR: 0.12,
|
|
62
|
+
gainB: -0.08,
|
|
63
|
+
liftR: 0.02,
|
|
64
|
+
liftG: 0.01,
|
|
65
|
+
liftB: -0.01,
|
|
66
|
+
contrast: 0.08,
|
|
67
|
+
},
|
|
68
|
+
intent: { contrast: 'filmic', temperature: 'cinematic', saturation: 'smart' },
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
bleach_bypass: {
|
|
75
|
+
name: 'Bleach Bypass',
|
|
76
|
+
description: 'Heavy desaturation, high contrast, milky lifted blacks. Silver retention look.',
|
|
77
|
+
category: 'cinematic',
|
|
78
|
+
reasoning: 'Simulates the photochemical process of skipping the bleach bath, retaining silver in the print. Heavy desaturation with high contrast creates a gritty, unsettling quality. The milky lifted blacks are the signature — pure black doesn\'t exist in a true bleach bypass.',
|
|
79
|
+
adjustments: {
|
|
80
|
+
saturation: -0.65,
|
|
81
|
+
contrast: 0.45,
|
|
82
|
+
exposure: -0.05,
|
|
83
|
+
liftR: 0.03,
|
|
84
|
+
liftG: 0.03,
|
|
85
|
+
liftB: 0.03,
|
|
86
|
+
gainR: -0.05,
|
|
87
|
+
gainG: -0.05,
|
|
88
|
+
gainB: -0.05,
|
|
89
|
+
},
|
|
90
|
+
intent: { contrast: 'punchy', saturation: 'global' },
|
|
91
|
+
nodeLabel: 'Bleach Bypass',
|
|
92
|
+
multiNode: {
|
|
93
|
+
nodes: [
|
|
94
|
+
{
|
|
95
|
+
label: 'Base Contrast',
|
|
96
|
+
adjustments: { contrast: 0.45, exposure: -0.05 },
|
|
97
|
+
intent: { contrast: 'punchy' },
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
label: 'Silver Retention',
|
|
101
|
+
adjustments: {
|
|
102
|
+
saturation: -0.65,
|
|
103
|
+
liftR: 0.03, liftG: 0.03, liftB: 0.03,
|
|
104
|
+
},
|
|
105
|
+
intent: { saturation: 'global' },
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
label: 'Output Trim',
|
|
109
|
+
adjustments: {
|
|
110
|
+
gainR: -0.05, gainG: -0.05, gainB: -0.05,
|
|
111
|
+
},
|
|
112
|
+
intent: {},
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
teal_and_orange: {
|
|
119
|
+
name: 'Teal and Orange',
|
|
120
|
+
description: 'Complementary color split: teal shadows, orange highlights. Modern blockbuster.',
|
|
121
|
+
category: 'cinematic',
|
|
122
|
+
reasoning: 'Complementary color theory applied to skin tones vs backgrounds. Orange in the highlights flatters skin while teal in the shadows creates depth and separation. Pioneered in modern blockbusters — the contrast between warm foreground and cool environment guides the eye.',
|
|
123
|
+
adjustments: {
|
|
124
|
+
saturation: 0.1,
|
|
125
|
+
liftR: -0.03,
|
|
126
|
+
liftB: 0.04,
|
|
127
|
+
gainR: 0.12,
|
|
128
|
+
gainB: -0.09,
|
|
129
|
+
},
|
|
130
|
+
intent: { contrast: 'filmic', temperature: 'split', saturation: 'smart' },
|
|
131
|
+
nodeLabel: 'Teal & Orange',
|
|
132
|
+
multiNode: {
|
|
133
|
+
nodes: [
|
|
134
|
+
{
|
|
135
|
+
label: 'Primary Balance',
|
|
136
|
+
adjustments: { contrast: 0.1 },
|
|
137
|
+
intent: { contrast: 'filmic' },
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
label: 'Teal Shadows',
|
|
141
|
+
adjustments: { liftR: -0.03, liftB: 0.04 },
|
|
142
|
+
intent: { temperature: 'shadowOnly' },
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
label: 'Orange Highlights',
|
|
146
|
+
adjustments: { gainR: 0.12, gainB: -0.09, saturation: 0.1 },
|
|
147
|
+
intent: { temperature: 'highlightOnly', saturation: 'smart' },
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
|
|
153
|
+
noir: {
|
|
154
|
+
name: 'Film Noir',
|
|
155
|
+
description: 'High contrast, deep blacks, near-monochrome. Classic noir atmosphere.',
|
|
156
|
+
category: 'cinematic',
|
|
157
|
+
reasoning: 'Deep blacks and near-monochrome evoke the hard shadows of 1940s crime cinema. High contrast with minimal saturation — the story is told through light and shadow, not color.',
|
|
158
|
+
adjustments: {
|
|
159
|
+
contrast: 0.5,
|
|
160
|
+
saturation: -0.7,
|
|
161
|
+
liftR: -0.02, liftG: -0.02, liftB: -0.02,
|
|
162
|
+
gainR: -0.03, gainG: -0.03, gainB: -0.03,
|
|
163
|
+
},
|
|
164
|
+
intent: { contrast: 'punchy', saturation: 'global' },
|
|
165
|
+
nodeLabel: 'Film Noir',
|
|
166
|
+
},
|
|
167
|
+
|
|
168
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
169
|
+
// Film Stock Emulations
|
|
170
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
171
|
+
|
|
172
|
+
kodachrome: {
|
|
173
|
+
name: 'Kodachrome',
|
|
174
|
+
description: 'Rich, saturated with warm midtones and slightly lifted blacks. Iconic reversal film.',
|
|
175
|
+
category: 'film_stock',
|
|
176
|
+
reasoning: 'Emulates Kodak\'s legendary reversal film: rich, punchy color with warm midtones. The slight lift in blacks prevents harsh shadows — Kodachrome never had true black, just deep warm tones.',
|
|
177
|
+
adjustments: {
|
|
178
|
+
saturation: 0.15,
|
|
179
|
+
contrast: 0.2,
|
|
180
|
+
temperature: 0.15,
|
|
181
|
+
liftR: 0.01, liftG: 0.005, liftB: -0.005,
|
|
182
|
+
gammaR: 0.02, gammaG: 0.01, gammaB: -0.01,
|
|
183
|
+
},
|
|
184
|
+
intent: { contrast: 'punchy', saturation: 'smart' },
|
|
185
|
+
nodeLabel: 'Kodachrome',
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
portra: {
|
|
189
|
+
name: 'Portra 400',
|
|
190
|
+
description: 'Soft, pastel tones with beautiful skin rendition. Low contrast negative film.',
|
|
191
|
+
category: 'film_stock',
|
|
192
|
+
reasoning: 'Negative film known for gorgeous skin rendition. Low contrast preserves highlight detail, soft pastels keep color relationships natural. The slight warmth is the film base — Portra always had that quality.',
|
|
193
|
+
adjustments: {
|
|
194
|
+
saturation: -0.1,
|
|
195
|
+
contrast: -0.15,
|
|
196
|
+
temperature: 0.08,
|
|
197
|
+
liftR: 0.02, liftG: 0.015, liftB: 0.01,
|
|
198
|
+
},
|
|
199
|
+
intent: { contrast: 'soft', temperature: 'global', saturation: 'natural' },
|
|
200
|
+
nodeLabel: 'Portra 400',
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
fuji_eterna: {
|
|
204
|
+
name: 'Fuji Eterna',
|
|
205
|
+
description: 'Cool, slightly desaturated with gentle highlight rolloff. Japanese cinema stock.',
|
|
206
|
+
category: 'film_stock',
|
|
207
|
+
reasoning: 'Japanese cinema stock known for cool, restrained color. Slight desaturation with gentle highlight rolloff — Eterna renders skin delicately without the warmth of Western stocks.',
|
|
208
|
+
adjustments: {
|
|
209
|
+
saturation: -0.12,
|
|
210
|
+
contrast: 0.05,
|
|
211
|
+
temperature: -0.1,
|
|
212
|
+
gainR: -0.02, gainB: 0.02,
|
|
213
|
+
},
|
|
214
|
+
intent: { contrast: 'filmic', temperature: 'global', saturation: 'natural' },
|
|
215
|
+
nodeLabel: 'Fuji Eterna',
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
ektachrome: {
|
|
219
|
+
name: 'Ektachrome',
|
|
220
|
+
description: 'Vivid blues, punchy contrast. Cross-process reversal feel.',
|
|
221
|
+
category: 'film_stock',
|
|
222
|
+
reasoning: 'Vivid blues and punchy contrast — Ektachrome\'s reversal character. The slight blue push in shadows and highlights creates that distinctive transparency look of projected slides.',
|
|
223
|
+
adjustments: {
|
|
224
|
+
saturation: 0.1,
|
|
225
|
+
contrast: 0.25,
|
|
226
|
+
temperature: -0.08,
|
|
227
|
+
gainB: 0.05,
|
|
228
|
+
liftR: -0.01, liftB: 0.02,
|
|
229
|
+
},
|
|
230
|
+
intent: { contrast: 'punchy', saturation: 'smart' },
|
|
231
|
+
nodeLabel: 'Ektachrome',
|
|
232
|
+
},
|
|
233
|
+
|
|
234
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
235
|
+
// Documentary / Natural
|
|
236
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
237
|
+
|
|
238
|
+
documentary_clean: {
|
|
239
|
+
name: 'Documentary Clean',
|
|
240
|
+
description: 'Neutral, balanced grade. Minimal stylization, honest representation.',
|
|
241
|
+
category: 'documentary',
|
|
242
|
+
reasoning: 'Minimal intervention. Slight contrast boost to combat flat Log/RAW footage, tiny desaturation to avoid hyperreal digital color. The goal is honest representation — the image should feel unmanipulated.',
|
|
243
|
+
adjustments: {
|
|
244
|
+
contrast: 0.08,
|
|
245
|
+
saturation: -0.05,
|
|
246
|
+
},
|
|
247
|
+
intent: { contrast: 'soft', saturation: 'natural' },
|
|
248
|
+
nodeLabel: 'Documentary Clean',
|
|
249
|
+
},
|
|
250
|
+
|
|
251
|
+
verite: {
|
|
252
|
+
name: 'Vérité',
|
|
253
|
+
description: 'Raw, natural feel with slight lift. Observational documentary aesthetic.',
|
|
254
|
+
category: 'documentary',
|
|
255
|
+
reasoning: 'Observational documentary aesthetic. Slightly lifted blacks and reduced contrast mimic the look of naturally-lit observational footage. The desaturation suggests unprocessed, authentic capture.',
|
|
256
|
+
adjustments: {
|
|
257
|
+
contrast: -0.05,
|
|
258
|
+
saturation: -0.1,
|
|
259
|
+
liftR: 0.015, liftG: 0.015, liftB: 0.015,
|
|
260
|
+
},
|
|
261
|
+
intent: { contrast: 'soft', saturation: 'natural' },
|
|
262
|
+
nodeLabel: 'Vérité',
|
|
263
|
+
},
|
|
264
|
+
|
|
265
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
266
|
+
// Mood / Atmosphere
|
|
267
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
268
|
+
|
|
269
|
+
golden_hour: {
|
|
270
|
+
name: 'Golden Hour',
|
|
271
|
+
description: 'Warm, amber-toned with soft contrast. Late afternoon sunlight.',
|
|
272
|
+
category: 'mood',
|
|
273
|
+
reasoning: 'Replicates the warm amber light of late afternoon sun. Strong temperature shift with a gamma push in red/green creates depth in the warmth. Soft contrast prevents the image from feeling harsh.',
|
|
274
|
+
adjustments: {
|
|
275
|
+
temperature: 0.35,
|
|
276
|
+
saturation: 0.08,
|
|
277
|
+
contrast: -0.05,
|
|
278
|
+
gainR: 0.08,
|
|
279
|
+
gammaR: 0.03, gammaG: 0.01,
|
|
280
|
+
},
|
|
281
|
+
intent: { temperature: 'global', saturation: 'smart', contrast: 'soft' },
|
|
282
|
+
nodeLabel: 'Golden Hour',
|
|
283
|
+
},
|
|
284
|
+
|
|
285
|
+
moonlight: {
|
|
286
|
+
name: 'Moonlight',
|
|
287
|
+
description: 'Cool blue shadows, desaturated. Night exterior mood.',
|
|
288
|
+
category: 'mood',
|
|
289
|
+
reasoning: 'Cool blue shadows, heavy desaturation, dropped exposure. The blue comes from the Purkinje effect — human vision shifts toward blue sensitivity in low light. Multiple nodes separate the temperature shift from the tonal work.',
|
|
290
|
+
adjustments: {
|
|
291
|
+
temperature: -0.3,
|
|
292
|
+
saturation: -0.25,
|
|
293
|
+
contrast: 0.15,
|
|
294
|
+
exposure: -0.15,
|
|
295
|
+
liftB: 0.03,
|
|
296
|
+
gainB: 0.04,
|
|
297
|
+
},
|
|
298
|
+
intent: { temperature: 'global', saturation: 'global', contrast: 'filmic' },
|
|
299
|
+
nodeLabel: 'Moonlight',
|
|
300
|
+
multiNode: {
|
|
301
|
+
nodes: [
|
|
302
|
+
{
|
|
303
|
+
label: 'Cool Temp Base',
|
|
304
|
+
adjustments: { temperature: -0.3 },
|
|
305
|
+
intent: { temperature: 'global' },
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
label: 'Teal Shadows',
|
|
309
|
+
adjustments: { liftB: 0.03, liftR: -0.02 },
|
|
310
|
+
intent: { temperature: 'shadowOnly' },
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
label: 'Highlight Rolloff',
|
|
314
|
+
adjustments: { gainB: 0.04, exposure: -0.15 },
|
|
315
|
+
intent: {},
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
label: 'Desat + Contrast',
|
|
319
|
+
adjustments: { saturation: -0.25, contrast: 0.15 },
|
|
320
|
+
intent: { saturation: 'global', contrast: 'filmic' },
|
|
321
|
+
},
|
|
322
|
+
],
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
|
|
326
|
+
dreamy: {
|
|
327
|
+
name: 'Dreamy',
|
|
328
|
+
description: 'Soft, low-contrast with lifted blacks and gentle warmth. Ethereal mood.',
|
|
329
|
+
category: 'mood',
|
|
330
|
+
reasoning: 'Ultra-low contrast with lifted blacks creates a hazy, ethereal quality. The slight warmth prevents the image from feeling clinical. This is the look of memory and nostalgia.',
|
|
331
|
+
adjustments: {
|
|
332
|
+
contrast: -0.25,
|
|
333
|
+
saturation: -0.15,
|
|
334
|
+
temperature: 0.1,
|
|
335
|
+
liftR: 0.04, liftG: 0.035, liftB: 0.03,
|
|
336
|
+
},
|
|
337
|
+
intent: { contrast: 'soft', saturation: 'natural' },
|
|
338
|
+
nodeLabel: 'Dreamy',
|
|
339
|
+
},
|
|
340
|
+
|
|
341
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
342
|
+
// Commercial / Broadcast
|
|
343
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
344
|
+
|
|
345
|
+
commercial_pop: {
|
|
346
|
+
name: 'Commercial Pop',
|
|
347
|
+
description: 'Clean, contrasty, vivid. Product-forward commercial look.',
|
|
348
|
+
category: 'commercial',
|
|
349
|
+
reasoning: 'Clean and vivid for product-forward work. Contrast and saturation boost together make images jump off the screen. No color shifts — the product\'s color must be accurate.',
|
|
350
|
+
adjustments: {
|
|
351
|
+
contrast: 0.25,
|
|
352
|
+
saturation: 0.15,
|
|
353
|
+
},
|
|
354
|
+
intent: { contrast: 'punchy', saturation: 'smart' },
|
|
355
|
+
nodeLabel: 'Commercial Pop',
|
|
356
|
+
},
|
|
357
|
+
|
|
358
|
+
broadcast_safe: {
|
|
359
|
+
name: 'Broadcast Safe',
|
|
360
|
+
description: 'Neutral, legal-level-safe grade. Broadcast delivery baseline.',
|
|
361
|
+
category: 'commercial',
|
|
362
|
+
reasoning: 'Conservative grade to ensure legal levels for broadcast. Minimal contrast avoidance of clipping, slight desaturation to stay within gamut. The most important thing is what you don\'t do.',
|
|
363
|
+
adjustments: {
|
|
364
|
+
contrast: 0.05,
|
|
365
|
+
saturation: -0.03,
|
|
366
|
+
},
|
|
367
|
+
intent: { contrast: 'broadcast', saturation: 'global' },
|
|
368
|
+
nodeLabel: 'Broadcast Safe',
|
|
369
|
+
},
|
|
370
|
+
|
|
371
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
372
|
+
// Vintage / Retro
|
|
373
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
374
|
+
|
|
375
|
+
vintage_70s: {
|
|
376
|
+
name: '70s Vintage',
|
|
377
|
+
description: 'Faded, warm with green-shifted midtones. 1970s film aesthetic.',
|
|
378
|
+
category: 'vintage',
|
|
379
|
+
reasoning: 'Faded, warm with green-shifted midtones. The gamma green push is the key — 1970s film stocks and processing had this characteristic green drift in the mids. Low contrast and lifted blacks simulate aged print stock.',
|
|
380
|
+
adjustments: {
|
|
381
|
+
contrast: -0.1,
|
|
382
|
+
saturation: -0.2,
|
|
383
|
+
temperature: 0.15,
|
|
384
|
+
liftR: 0.02, liftG: 0.025, liftB: 0.015,
|
|
385
|
+
gammaG: 0.02,
|
|
386
|
+
},
|
|
387
|
+
intent: { contrast: 'soft', temperature: 'global', saturation: 'natural' },
|
|
388
|
+
nodeLabel: '70s Vintage',
|
|
389
|
+
},
|
|
390
|
+
|
|
391
|
+
cross_process: {
|
|
392
|
+
name: 'Cross Process',
|
|
393
|
+
description: 'Shifted color channels, high contrast. Deliberate chemical mismatch.',
|
|
394
|
+
category: 'vintage',
|
|
395
|
+
reasoning: 'Deliberately processing film in the wrong chemistry creates unpredictable, vivid color shifts. The blue lift + green gamma + warm gain creates the characteristic cross-process color inversions.',
|
|
396
|
+
adjustments: {
|
|
397
|
+
contrast: 0.35,
|
|
398
|
+
saturation: 0.1,
|
|
399
|
+
liftB: 0.06,
|
|
400
|
+
gammaG: 0.06,
|
|
401
|
+
gainR: 0.15, gainB: -0.1,
|
|
402
|
+
},
|
|
403
|
+
intent: { contrast: 'filmic', temperature: 'split', saturation: 'smart' },
|
|
404
|
+
nodeLabel: 'Cross Process',
|
|
405
|
+
},
|
|
406
|
+
};
|
|
407
|
+
|
|
408
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
409
|
+
// LOOKUP FUNCTIONS
|
|
410
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Name aliases — maps natural language variants to recipe keys
|
|
414
|
+
*/
|
|
415
|
+
const NAME_ALIASES = {
|
|
416
|
+
// Direct names
|
|
417
|
+
'cinematic warm': 'cinematic_warm',
|
|
418
|
+
'cinematic': 'cinematic_warm',
|
|
419
|
+
'warm cinematic': 'cinematic_warm',
|
|
420
|
+
'bleach bypass': 'bleach_bypass',
|
|
421
|
+
'bleach': 'bleach_bypass',
|
|
422
|
+
'skip bleach': 'bleach_bypass',
|
|
423
|
+
'teal and orange': 'teal_and_orange',
|
|
424
|
+
'teal orange': 'teal_and_orange',
|
|
425
|
+
'teal & orange': 'teal_and_orange',
|
|
426
|
+
'blockbuster': 'teal_and_orange',
|
|
427
|
+
'noir': 'noir',
|
|
428
|
+
'film noir': 'noir',
|
|
429
|
+
'kodachrome': 'kodachrome',
|
|
430
|
+
'portra': 'portra',
|
|
431
|
+
'portra 400': 'portra',
|
|
432
|
+
'eterna': 'fuji_eterna',
|
|
433
|
+
'fuji eterna': 'fuji_eterna',
|
|
434
|
+
'fuji': 'fuji_eterna',
|
|
435
|
+
'ektachrome': 'ektachrome',
|
|
436
|
+
'documentary': 'documentary_clean',
|
|
437
|
+
'documentary clean': 'documentary_clean',
|
|
438
|
+
'clean': 'documentary_clean',
|
|
439
|
+
'verite': 'verite',
|
|
440
|
+
'vérité': 'verite',
|
|
441
|
+
'observational': 'verite',
|
|
442
|
+
'golden hour': 'golden_hour',
|
|
443
|
+
'golden': 'golden_hour',
|
|
444
|
+
'sunset': 'golden_hour',
|
|
445
|
+
'moonlight': 'moonlight',
|
|
446
|
+
'night': 'moonlight',
|
|
447
|
+
'blue night': 'moonlight',
|
|
448
|
+
'dreamy': 'dreamy',
|
|
449
|
+
'ethereal': 'dreamy',
|
|
450
|
+
'commercial': 'commercial_pop',
|
|
451
|
+
'commercial pop': 'commercial_pop',
|
|
452
|
+
'pop': 'commercial_pop',
|
|
453
|
+
'broadcast': 'broadcast_safe',
|
|
454
|
+
'broadcast safe': 'broadcast_safe',
|
|
455
|
+
'70s': 'vintage_70s',
|
|
456
|
+
'70s vintage': 'vintage_70s',
|
|
457
|
+
'vintage': 'vintage_70s',
|
|
458
|
+
'retro': 'vintage_70s',
|
|
459
|
+
'cross process': 'cross_process',
|
|
460
|
+
'cross processed': 'cross_process',
|
|
461
|
+
'xpro': 'cross_process',
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* Find a look recipe by name (fuzzy matching via aliases)
|
|
466
|
+
* @param {string} name - Look name (natural language)
|
|
467
|
+
* @returns {Object|null} Recipe object or null
|
|
468
|
+
*/
|
|
469
|
+
function findRecipe(name) {
|
|
470
|
+
if (!name) return null;
|
|
471
|
+
const normalized = name.toLowerCase().trim().replace(/[-_]+/g, ' ');
|
|
472
|
+
|
|
473
|
+
// Direct key match
|
|
474
|
+
if (LOOK_RECIPES[normalized.replace(/\s+/g, '_')]) {
|
|
475
|
+
return LOOK_RECIPES[normalized.replace(/\s+/g, '_')];
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// Alias match
|
|
479
|
+
if (NAME_ALIASES[normalized]) {
|
|
480
|
+
return LOOK_RECIPES[NAME_ALIASES[normalized]];
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// Partial match — find first recipe whose name contains the search term
|
|
484
|
+
for (const [key, recipe] of Object.entries(LOOK_RECIPES)) {
|
|
485
|
+
if (recipe.name.toLowerCase().includes(normalized) ||
|
|
486
|
+
key.includes(normalized.replace(/\s+/g, '_'))) {
|
|
487
|
+
return recipe;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return null;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* List all available recipes
|
|
496
|
+
* @param {string} [category] - Filter by category
|
|
497
|
+
* @returns {Array<{key: string, name: string, description: string, category: string}>}
|
|
498
|
+
*/
|
|
499
|
+
function listRecipes(category = null) {
|
|
500
|
+
return Object.entries(LOOK_RECIPES)
|
|
501
|
+
.filter(([, recipe]) => !category || recipe.category === category)
|
|
502
|
+
.map(([key, recipe]) => ({
|
|
503
|
+
key,
|
|
504
|
+
name: recipe.name,
|
|
505
|
+
description: recipe.description,
|
|
506
|
+
category: recipe.category,
|
|
507
|
+
hasMultiNode: !!recipe.multiNode,
|
|
508
|
+
}));
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Get all category names
|
|
513
|
+
* @returns {string[]}
|
|
514
|
+
*/
|
|
515
|
+
function getCategories() {
|
|
516
|
+
const cats = new Set();
|
|
517
|
+
for (const recipe of Object.values(LOOK_RECIPES)) {
|
|
518
|
+
cats.add(recipe.category);
|
|
519
|
+
}
|
|
520
|
+
return [...cats].sort();
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* Get all recipes as training examples with reasoning for AI-driven grading.
|
|
525
|
+
* @returns {Array<{key: string, name: string, description: string, category: string, reasoning: string, adjustments: Object, intent: Object, nodeLabel: string, hasMultiNode: boolean}>}
|
|
526
|
+
*/
|
|
527
|
+
function getTrainingExamples() {
|
|
528
|
+
return Object.entries(LOOK_RECIPES).map(([key, recipe]) => ({
|
|
529
|
+
key,
|
|
530
|
+
name: recipe.name,
|
|
531
|
+
description: recipe.description,
|
|
532
|
+
category: recipe.category,
|
|
533
|
+
reasoning: recipe.reasoning,
|
|
534
|
+
adjustments: recipe.adjustments,
|
|
535
|
+
intent: recipe.intent,
|
|
536
|
+
nodeLabel: recipe.nodeLabel,
|
|
537
|
+
hasMultiNode: !!recipe.multiNode,
|
|
538
|
+
}));
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
module.exports = {
|
|
542
|
+
LOOK_RECIPES,
|
|
543
|
+
NAME_ALIASES,
|
|
544
|
+
findRecipe,
|
|
545
|
+
listRecipes,
|
|
546
|
+
getCategories,
|
|
547
|
+
getTrainingExamples,
|
|
548
|
+
};
|