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
|
@@ -17,7 +17,7 @@ import webbrowser
|
|
|
17
17
|
from concurrent.futures import ThreadPoolExecutor
|
|
18
18
|
from http import HTTPStatus
|
|
19
19
|
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
|
20
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
20
|
+
from typing import Any, Dict, List, Mapping, Optional, Tuple
|
|
21
21
|
from urllib.parse import parse_qs, unquote, urlparse
|
|
22
22
|
|
|
23
23
|
from src.utils.media_analysis import (
|
|
@@ -3936,6 +3936,8 @@ HTML = r"""<!doctype html>
|
|
|
3936
3936
|
<button class="nav-dropdown-item" data-panel-target="diagnostics" data-subpage-target="mcp" role="menuitem"><span class="nav-dropdown-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 7v10l8 5 8-5V7l-8-5z"></path><path d="m4 7 8 5 8-5"></path><path d="M12 12v10"></path></svg></span>MCP</button>
|
|
3937
3937
|
<button class="nav-dropdown-item" data-panel-target="diagnostics" data-subpage-target="storage" role="menuitem"><span class="nav-dropdown-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><ellipse cx="12" cy="5" rx="9" ry="3"></ellipse><path d="M3 5v14c0 1.66 4.03 3 9 3s9-1.34 9-3V5"></path><path d="M3 12c0 1.66 4.03 3 9 3s9-1.34 9-3"></path></svg></span>Storage</button>
|
|
3938
3938
|
<button class="nav-dropdown-item" data-panel-target="diagnostics" data-subpage-target="tools" role="menuitem"><span class="nav-dropdown-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l2.1-2.1a6 6 0 0 1-7.6 7.6l-4 4a2.1 2.1 0 0 1-3-3l4-4a6 6 0 0 1 7.6-7.6z"></path></svg></span>Tools</button>
|
|
3939
|
+
<button class="nav-dropdown-item" data-panel-target="diagnostics" data-subpage-target="advanced" role="menuitem"><span class="nav-dropdown-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 18 22 12 16 6"></polyline><polyline points="8 6 2 12 8 18"></polyline></svg></span>Advanced</button>
|
|
3940
|
+
<button class="nav-dropdown-item" data-panel-target="diagnostics" data-subpage-target="conform-qc" role="menuitem"><span class="nav-dropdown-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m9 11 3 3L22 4"></path><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path></svg></span>Conform QC</button>
|
|
3939
3941
|
<button class="nav-dropdown-item" data-panel-target="diagnostics" data-subpage-target="media-pool-history" role="menuitem"><span class="nav-dropdown-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 12h18"></path><path d="M3 6h18"></path><path d="M3 18h18"></path></svg></span>Media Pool History</button>
|
|
3940
3942
|
</div>
|
|
3941
3943
|
</div>
|
|
@@ -3946,6 +3948,7 @@ HTML = r"""<!doctype html>
|
|
|
3946
3948
|
<button class="nav-dropdown-item" data-panel-target="docs" data-subpage-target="release-notes" role="menuitem"><span class="nav-dropdown-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 8v4l3 3"></path><circle cx="12" cy="12" r="9"></circle></svg></span>Release Notes</button>
|
|
3947
3949
|
<button class="nav-dropdown-item" data-panel-target="docs" data-subpage-target="analysis-guide" role="menuitem"><span class="nav-dropdown-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 18h6"></path><path d="M10 22h4"></path><path d="M12 2a7 7 0 0 0-4 12c.65.55 1 1.35 1 2h6c0-.65.35-1.45 1-2A7 7 0 0 0 12 2z"></path></svg></span>Media Analysis Guide</button>
|
|
3948
3950
|
<button class="nav-dropdown-item" data-panel-target="docs" data-subpage-target="agent-skill" role="menuitem"><span class="nav-dropdown-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 8V4H8"></path><rect x="4" y="12" width="16" height="8" rx="2"></rect><path d="M2 14h2"></path><path d="M20 14h2"></path><path d="M15 13v2"></path><path d="M9 13v2"></path></svg></span>Agent Skill</button>
|
|
3951
|
+
<button class="nav-dropdown-item" data-panel-target="docs" data-subpage-target="advanced-server" role="menuitem"><span class="nav-dropdown-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 18 22 12 16 6"></polyline><polyline points="8 6 2 12 8 18"></polyline></svg></span>Advanced Server</button>
|
|
3949
3952
|
</div>
|
|
3950
3953
|
</div>
|
|
3951
3954
|
<div class="control-nav-item">
|
|
@@ -4453,6 +4456,32 @@ HTML = r"""<!doctype html>
|
|
|
4453
4456
|
</div>
|
|
4454
4457
|
<div id="mpcTable" class="mpc-table">loading…</div>
|
|
4455
4458
|
</section>
|
|
4459
|
+
|
|
4460
|
+
<section class="span-12 subpage" data-subpage-scope="diagnostics" data-subpage="advanced">
|
|
4461
|
+
<h2>Advanced Server</h2>
|
|
4462
|
+
<p class="section-copy">The optional offline Node sibling (<code>davinci-resolve-advanced-mcp</code>) edits Resolve files (<code>.drp</code>/<code>.drt</code>/<code>.drx</code>) and patches the project DB — no running Resolve required. The core is pure-JS and always available; a few features need user-installed helpers, shown live below. Full 18-tool catalog: Docs → Advanced Server.</p>
|
|
4463
|
+
<div class="mpc-toolbar">
|
|
4464
|
+
<button id="advRefreshBtn" class="secondary" type="button">Refresh</button>
|
|
4465
|
+
<span id="advMeta" class="mpc-meta"></span>
|
|
4466
|
+
</div>
|
|
4467
|
+
<div class="diag-grid" id="diagnosticsAdvanced">
|
|
4468
|
+
<div class="empty">Advanced-server capabilities pending.</div>
|
|
4469
|
+
</div>
|
|
4470
|
+
</section>
|
|
4471
|
+
|
|
4472
|
+
<section class="span-12 subpage" data-subpage-scope="diagnostics" data-subpage="conform-qc">
|
|
4473
|
+
<h2>Conform QC</h2>
|
|
4474
|
+
<p class="section-copy">Read-only browser for a conform <strong>lineage sidecar</strong> — the content-hashed snapshot store the advanced server's <code>conform</code> tool writes (<code>snapshot</code> ingest → <code>qc</code> per-cut frame verdicts). Point at a sidecar <code>.db</code> to inspect snapshots, diffs, and verdicts; ingest and QC runs stay with the MCP tools.</p>
|
|
4475
|
+
<div class="mpc-toolbar">
|
|
4476
|
+
<label class="mpc-toolbar-field" style="flex:1;min-width:280px">Lineage sidecar
|
|
4477
|
+
<input id="cqDbPath" type="text" placeholder="/path/to/lineage.db" spellcheck="false">
|
|
4478
|
+
</label>
|
|
4479
|
+
<button id="cqLoadBtn" class="secondary" type="button">Load</button>
|
|
4480
|
+
<span id="cqMeta" class="mpc-meta"></span>
|
|
4481
|
+
</div>
|
|
4482
|
+
<div id="cqSnapshots" class="mpc-table"><div class="empty">Enter the path to a lineage sidecar and Load.</div></div>
|
|
4483
|
+
<div id="cqDetail" style="margin-top:12px"></div>
|
|
4484
|
+
</section>
|
|
4456
4485
|
</main>
|
|
4457
4486
|
|
|
4458
4487
|
<main id="panel-docs" class="panel control-grid">
|
|
@@ -5007,6 +5036,7 @@ HTML = r"""<!doctype html>
|
|
|
5007
5036
|
'release-notes': 'Release Notes',
|
|
5008
5037
|
'analysis-guide': 'Media Analysis Guide',
|
|
5009
5038
|
'agent-skill': 'Agent Skill',
|
|
5039
|
+
'advanced-server': 'Advanced Server',
|
|
5010
5040
|
};
|
|
5011
5041
|
const SUBPAGE_LABELS = {
|
|
5012
5042
|
analysis: {
|
|
@@ -5018,6 +5048,8 @@ HTML = r"""<!doctype html>
|
|
|
5018
5048
|
mcp: 'MCP',
|
|
5019
5049
|
storage: 'Storage',
|
|
5020
5050
|
tools: 'Tools',
|
|
5051
|
+
advanced: 'Advanced',
|
|
5052
|
+
'conform-qc': 'Conform QC',
|
|
5021
5053
|
'media-pool-history': 'Media Pool History',
|
|
5022
5054
|
},
|
|
5023
5055
|
docs: DOC_LABELS,
|
|
@@ -5170,6 +5202,12 @@ HTML = r"""<!doctype html>
|
|
|
5170
5202
|
if (next === 'projects' && !state.allProjects) {
|
|
5171
5203
|
refreshAllProjects().catch(alertError);
|
|
5172
5204
|
}
|
|
5205
|
+
if (next === 'diagnostics' && subpage === 'advanced' && !state.advancedCaps) {
|
|
5206
|
+
refreshAdvancedCapabilities().catch(alertError);
|
|
5207
|
+
}
|
|
5208
|
+
if (next === 'diagnostics' && subpage === 'conform-qc') {
|
|
5209
|
+
initConformQc();
|
|
5210
|
+
}
|
|
5173
5211
|
if (next === 'analysis' && subpage === 'review') {
|
|
5174
5212
|
ensureReviewPanelStateTimer();
|
|
5175
5213
|
if (!state.review.clipList) {
|
|
@@ -11018,6 +11056,108 @@ HTML = r"""<!doctype html>
|
|
|
11018
11056
|
});
|
|
11019
11057
|
|
|
11020
11058
|
// Media Pool History (Diagnostics)
|
|
11059
|
+
// ── Advanced server (capabilities card + conform lineage browser) ──
|
|
11060
|
+
async function refreshAdvancedCapabilities() {
|
|
11061
|
+
setHtml('advMeta', 'checking…');
|
|
11062
|
+
const payload = await api('/api/advanced/capabilities');
|
|
11063
|
+
state.advancedCaps = payload;
|
|
11064
|
+
setHtml('advMeta', '');
|
|
11065
|
+
if (!payload.success) {
|
|
11066
|
+
setHtml('diagnosticsAdvanced', `<div class="empty">${escapeHtml(payload.error || 'Advanced server unavailable.')}${payload.hint ? `<div class="tool-chip-note">${escapeHtml(payload.hint)}</div>` : ''}</div>`);
|
|
11067
|
+
return;
|
|
11068
|
+
}
|
|
11069
|
+
const caps = payload.result || {};
|
|
11070
|
+
const optional = caps.optional || {};
|
|
11071
|
+
const cards = [`
|
|
11072
|
+
<div class="diag-card">
|
|
11073
|
+
<div class="diag-card-head"><strong>Core</strong> ${statusPill('pill-ok', 'Ready')}</div>
|
|
11074
|
+
<div class="diag-card-rows">${diagRow('Always available (pure-JS)', caps.core || '', {})}</div>
|
|
11075
|
+
</div>`];
|
|
11076
|
+
Object.keys(optional).forEach(name => {
|
|
11077
|
+
const dep = optional[name] || {};
|
|
11078
|
+
const ready = !!dep.available;
|
|
11079
|
+
cards.push(`
|
|
11080
|
+
<div class="diag-card">
|
|
11081
|
+
<div class="diag-card-head"><strong>${escapeHtml(name)}</strong> ${statusPill(ready ? 'pill-ok' : 'pill-warn', ready ? 'Available' : 'Missing')}</div>
|
|
11082
|
+
<div class="diag-card-rows">
|
|
11083
|
+
${diagRow('Enables', dep.enables || '', {})}
|
|
11084
|
+
${ready ? '' : diagRow('Install', dep.install || '', {})}
|
|
11085
|
+
</div>
|
|
11086
|
+
</div>`);
|
|
11087
|
+
});
|
|
11088
|
+
setHtml('diagnosticsAdvanced', cards.join(''));
|
|
11089
|
+
}
|
|
11090
|
+
|
|
11091
|
+
const CQ_VERDICT_TONE = { MATCH: 'pill-ok', OFFSET: 'pill-warn', WRONG: 'pill-err', REF_OFFLINE: 'pill-mute', UNREADABLE: 'pill-warn' };
|
|
11092
|
+
let cqInitialized = false;
|
|
11093
|
+
|
|
11094
|
+
function initConformQc() {
|
|
11095
|
+
if (cqInitialized) return;
|
|
11096
|
+
cqInitialized = true;
|
|
11097
|
+
const saved = localStorage.getItem('cq_lineage_db');
|
|
11098
|
+
if (saved && $('cqDbPath')) $('cqDbPath').value = saved;
|
|
11099
|
+
if (saved) cqLoadSnapshots().catch(alertError);
|
|
11100
|
+
}
|
|
11101
|
+
|
|
11102
|
+
async function cqLoadSnapshots() {
|
|
11103
|
+
const db = ($('cqDbPath')?.value || '').trim();
|
|
11104
|
+
if (!db) { setHtml('cqSnapshots', '<div class="empty">Enter the path to a lineage sidecar and Load.</div>'); return; }
|
|
11105
|
+
localStorage.setItem('cq_lineage_db', db);
|
|
11106
|
+
setHtml('cqMeta', 'loading…');
|
|
11107
|
+
setHtml('cqDetail', '');
|
|
11108
|
+
const payload = await api(`/api/advanced/lineage?op=list&db=${encodeURIComponent(db)}`);
|
|
11109
|
+
if (!payload.success) { setHtml('cqMeta', ''); setHtml('cqSnapshots', `<div class="empty">${escapeHtml(payload.error || 'Could not read lineage db.')}</div>`); return; }
|
|
11110
|
+
const snaps = (payload.result || {}).snapshots || [];
|
|
11111
|
+
setHtml('cqMeta', `${snaps.length} snapshot${snaps.length === 1 ? '' : 's'}`);
|
|
11112
|
+
if (!snaps.length) { setHtml('cqSnapshots', '<div class="empty">No snapshots in this sidecar yet.</div>'); return; }
|
|
11113
|
+
const rows = snaps.map((snap, i) => `
|
|
11114
|
+
<tr>
|
|
11115
|
+
<td><code>${escapeHtml(String(snap.snapshot_id || '').slice(0, 12))}</code></td>
|
|
11116
|
+
<td>${escapeHtml(snap.label || '')}</td>
|
|
11117
|
+
<td>${escapeHtml(snap.reel || '')}</td>
|
|
11118
|
+
<td>${escapeHtml(snap.kind || '')}</td>
|
|
11119
|
+
<td>${Number(snap.cut_count) || 0}</td>
|
|
11120
|
+
<td>${escapeHtml(snap.created_at || '')}</td>
|
|
11121
|
+
<td>
|
|
11122
|
+
<button class="secondary" type="button" data-cq-verdicts="${escapeHtml(snap.snapshot_id)}">Verdicts</button>
|
|
11123
|
+
${i + 1 < snaps.length ? `<button class="secondary" type="button" data-cq-diff-a="${escapeHtml(snaps[i + 1].snapshot_id)}" data-cq-diff-b="${escapeHtml(snap.snapshot_id)}">Diff prev</button>` : ''}
|
|
11124
|
+
</td>
|
|
11125
|
+
</tr>`).join('');
|
|
11126
|
+
setHtml('cqSnapshots', `<table><thead><tr><th>Snapshot</th><th>Label</th><th>Reel</th><th>Kind</th><th>Cuts</th><th>Created</th><th></th></tr></thead><tbody>${rows}</tbody></table>`);
|
|
11127
|
+
document.querySelectorAll('[data-cq-verdicts]').forEach(btn => btn.addEventListener('click', () => cqShowVerdicts(btn.dataset.cqVerdicts).catch(alertError)));
|
|
11128
|
+
document.querySelectorAll('[data-cq-diff-a]').forEach(btn => btn.addEventListener('click', () => cqShowDiff(btn.dataset.cqDiffA, btn.dataset.cqDiffB).catch(alertError)));
|
|
11129
|
+
}
|
|
11130
|
+
|
|
11131
|
+
async function cqShowVerdicts(snapshotId) {
|
|
11132
|
+
const db = ($('cqDbPath')?.value || '').trim();
|
|
11133
|
+
const payload = await api(`/api/advanced/lineage?op=verdicts&db=${encodeURIComponent(db)}&snapshot=${encodeURIComponent(snapshotId)}`);
|
|
11134
|
+
if (!payload.success) { setHtml('cqDetail', `<div class="empty">${escapeHtml(payload.error || 'verdicts unavailable')}</div>`); return; }
|
|
11135
|
+
const verdicts = (payload.result || {}).verdicts || [];
|
|
11136
|
+
const tallies = payload.tallies || {};
|
|
11137
|
+
const pills = Object.keys(tallies).map(k => `<span class="pill-legend-item"><span class="status-pill ${CQ_VERDICT_TONE[k] || 'pill-mute'}">${escapeHtml(k)}</span> ${tallies[k]}</span>`).join(' ');
|
|
11138
|
+
if (!verdicts.length) { setHtml('cqDetail', `<div class="empty">No QC verdicts recorded for <code>${escapeHtml(snapshotId.slice(0, 12))}</code> yet — run conform qc via the MCP tool.</div>`); return; }
|
|
11139
|
+
const rows = verdicts.map(v => `
|
|
11140
|
+
<tr>
|
|
11141
|
+
<td>${Number(v.cut_index)}</td>
|
|
11142
|
+
<td><span class="status-pill ${CQ_VERDICT_TONE[v.verdict] || 'pill-mute'}">${escapeHtml(v.verdict || '?')}</span></td>
|
|
11143
|
+
<td>${escapeHtml(v.category || '')}</td>
|
|
11144
|
+
<td>${v.psnr == null ? '' : Number(v.psnr).toFixed(1)}</td>
|
|
11145
|
+
<td>${escapeHtml(v.reference_ref || '')}</td>
|
|
11146
|
+
</tr>`).join('');
|
|
11147
|
+
setHtml('cqDetail', `<div class="pill-legend" style="margin-bottom:8px">${pills}</div><div class="mpc-table"><table><thead><tr><th>Cut</th><th>Verdict</th><th>Category</th><th>PSNR</th><th>Reference</th></tr></thead><tbody>${rows}</tbody></table></div>`);
|
|
11148
|
+
}
|
|
11149
|
+
|
|
11150
|
+
async function cqShowDiff(aId, bId) {
|
|
11151
|
+
const db = ($('cqDbPath')?.value || '').trim();
|
|
11152
|
+
const payload = await api(`/api/advanced/lineage?op=diff&db=${encodeURIComponent(db)}&a=${encodeURIComponent(aId)}&b=${encodeURIComponent(bId)}`);
|
|
11153
|
+
if (!payload.success) { setHtml('cqDetail', `<div class="empty">${escapeHtml(payload.error || 'diff unavailable')}</div>`); return; }
|
|
11154
|
+
setHtml('cqDetail', `<div class="mpc-table"><pre style="margin:0;white-space:pre-wrap">${escapeHtml(JSON.stringify(payload.result, null, 2))}</pre></div>`);
|
|
11155
|
+
}
|
|
11156
|
+
|
|
11157
|
+
$('advRefreshBtn')?.addEventListener('click', () => refreshAdvancedCapabilities().catch(alertError));
|
|
11158
|
+
$('cqLoadBtn')?.addEventListener('click', () => cqLoadSnapshots().catch(alertError));
|
|
11159
|
+
$('cqDbPath')?.addEventListener('keydown', (e) => { if (e.key === 'Enter') cqLoadSnapshots().catch(alertError); });
|
|
11160
|
+
|
|
11021
11161
|
$('mpcRefreshBtn')?.addEventListener('click', () => refreshMpcTable().catch(alertError));
|
|
11022
11162
|
$('mpcLimit')?.addEventListener('change', () => refreshMpcTable().catch(alertError));
|
|
11023
11163
|
$('mpcActionFilter')?.addEventListener('change', () => applyMpcFilter());
|
|
@@ -14021,6 +14161,7 @@ DOC_SOURCES = {
|
|
|
14021
14161
|
"readme": {"title": "README", "path": "README.md"},
|
|
14022
14162
|
"analysis-guide": {"title": "Media Analysis Guide", "path": "docs/guides/media-analysis-guide.md"},
|
|
14023
14163
|
"agent-skill": {"title": "Agent Skill", "path": "docs/SKILL.md"},
|
|
14164
|
+
"advanced-server": {"title": "Advanced Server", "path": "resolve-advanced/README.md"},
|
|
14024
14165
|
"release-notes": {"title": "Release Notes", "path": "CHANGELOG.md"},
|
|
14025
14166
|
}
|
|
14026
14167
|
|
|
@@ -14667,6 +14808,89 @@ def _dashboard_doc(doc_id: Any) -> Dict[str, Any]:
|
|
|
14667
14808
|
}
|
|
14668
14809
|
|
|
14669
14810
|
|
|
14811
|
+
|
|
14812
|
+
# ── Advanced server (Node) — read-only panel bridge ─────────────────────────
|
|
14813
|
+
# The panel inspects advanced-server state through resolve-advanced/scripts/
|
|
14814
|
+
# panel-bridge.mjs (one-shot JSON; capabilities + a read-only lineage subset).
|
|
14815
|
+
# Mutations (ingest, QC runs, patches) stay with the MCP tools by design.
|
|
14816
|
+
|
|
14817
|
+
_ADVANCED_LINEAGE_OPS = {"list", "show", "diff", "verdicts"}
|
|
14818
|
+
|
|
14819
|
+
|
|
14820
|
+
def _advanced_root() -> str:
|
|
14821
|
+
return os.path.join(_repo_root(), "resolve-advanced")
|
|
14822
|
+
|
|
14823
|
+
|
|
14824
|
+
def _run_advanced_bridge(surface: str, op: str, args: Optional[Dict[str, Any]] = None,
|
|
14825
|
+
timeout: float = 30.0) -> Dict[str, Any]:
|
|
14826
|
+
import shutil
|
|
14827
|
+
import subprocess
|
|
14828
|
+
|
|
14829
|
+
node = shutil.which("node")
|
|
14830
|
+
if not node:
|
|
14831
|
+
return {"success": False, "error": "Node.js not found on PATH",
|
|
14832
|
+
"hint": "Install Node.js 18+ to enable advanced-server features in the panel."}
|
|
14833
|
+
bridge = os.path.join(_advanced_root(), "scripts", "panel-bridge.mjs")
|
|
14834
|
+
if not os.path.isfile(bridge):
|
|
14835
|
+
return {"success": False, "error": f"panel bridge missing: {bridge}"}
|
|
14836
|
+
try:
|
|
14837
|
+
# stdin=DEVNULL: never let a child race-read a protocol/stdin stream (api_truth).
|
|
14838
|
+
proc = subprocess.run(
|
|
14839
|
+
[node, bridge, str(surface), str(op), json.dumps(args or {})],
|
|
14840
|
+
capture_output=True, text=True, timeout=timeout,
|
|
14841
|
+
stdin=subprocess.DEVNULL, cwd=_advanced_root(),
|
|
14842
|
+
)
|
|
14843
|
+
except subprocess.TimeoutExpired:
|
|
14844
|
+
return {"success": False, "error": f"advanced bridge timed out after {timeout:.0f}s"}
|
|
14845
|
+
except OSError as exc:
|
|
14846
|
+
return {"success": False, "error": str(exc)}
|
|
14847
|
+
raw = (proc.stdout or "").strip()
|
|
14848
|
+
try:
|
|
14849
|
+
payload = json.loads(raw) if raw else {}
|
|
14850
|
+
except json.JSONDecodeError:
|
|
14851
|
+
payload = {}
|
|
14852
|
+
if not isinstance(payload, dict) or "success" not in payload:
|
|
14853
|
+
stderr_tail = (proc.stderr or "").strip().splitlines()[-3:]
|
|
14854
|
+
return {"success": False, "error": "advanced bridge returned no JSON", "stderr": stderr_tail}
|
|
14855
|
+
return payload
|
|
14856
|
+
|
|
14857
|
+
|
|
14858
|
+
def _advanced_capabilities_payload() -> Dict[str, Any]:
|
|
14859
|
+
import shutil
|
|
14860
|
+
|
|
14861
|
+
payload = _run_advanced_bridge("capabilities", "get")
|
|
14862
|
+
payload["node"] = shutil.which("node")
|
|
14863
|
+
payload["root"] = _advanced_root()
|
|
14864
|
+
return payload
|
|
14865
|
+
|
|
14866
|
+
|
|
14867
|
+
def _advanced_lineage_payload(op: str, params: Mapping[str, str]) -> Dict[str, Any]:
|
|
14868
|
+
if op not in _ADVANCED_LINEAGE_OPS:
|
|
14869
|
+
return {"success": False, "error": f"unknown lineage op '{op}' (read-only: list|show|diff|verdicts)"}
|
|
14870
|
+
db = str(params.get("db") or "").strip()
|
|
14871
|
+
if not db:
|
|
14872
|
+
return {"success": False, "error": "db (path to the lineage SQLite sidecar) is required"}
|
|
14873
|
+
db = os.path.abspath(os.path.expanduser(db))
|
|
14874
|
+
# Never create a store from a browse UI — the sidecar must already exist.
|
|
14875
|
+
if not os.path.isfile(db):
|
|
14876
|
+
return {"success": False, "error": f"lineage db not found: {db}"}
|
|
14877
|
+
args: Dict[str, Any] = {"lineageDb": db}
|
|
14878
|
+
for src, dst in (("reel", "reel"), ("snapshot", "snapshotId"),
|
|
14879
|
+
("a", "aId"), ("b", "bId"), ("ref", "referenceRef")):
|
|
14880
|
+
value = str(params.get(src) or "").strip()
|
|
14881
|
+
if value:
|
|
14882
|
+
args[dst] = value
|
|
14883
|
+
payload = _run_advanced_bridge("lineage", op, args)
|
|
14884
|
+
if op == "verdicts" and payload.get("success"):
|
|
14885
|
+
verdicts = ((payload.get("result") or {}).get("verdicts")) or []
|
|
14886
|
+
tallies: Dict[str, int] = {}
|
|
14887
|
+
for v in verdicts:
|
|
14888
|
+
key = str(v.get("verdict") or "?")
|
|
14889
|
+
tallies[key] = tallies.get(key, 0) + 1
|
|
14890
|
+
payload["tallies"] = tallies
|
|
14891
|
+
return payload
|
|
14892
|
+
|
|
14893
|
+
|
|
14670
14894
|
def _setup_defaults(action: str, params: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
|
14671
14895
|
from src.server import setup as server_setup
|
|
14672
14896
|
|
|
@@ -14839,6 +15063,14 @@ class Handler(BaseHTTPRequestHandler):
|
|
|
14839
15063
|
if path == "/api/update/preview":
|
|
14840
15064
|
self._json(_update_preview_payload())
|
|
14841
15065
|
return
|
|
15066
|
+
if path == "/api/advanced/capabilities":
|
|
15067
|
+
self._json(_advanced_capabilities_payload())
|
|
15068
|
+
return
|
|
15069
|
+
if path == "/api/advanced/lineage":
|
|
15070
|
+
op = (query.get("op") or [""])[0]
|
|
15071
|
+
params = {k: (query.get(k) or [""])[0] for k in ("db", "reel", "snapshot", "a", "b", "ref")}
|
|
15072
|
+
self._json(_advanced_lineage_payload(op, params))
|
|
15073
|
+
return
|
|
14842
15074
|
if path == "/api/mcp/status":
|
|
14843
15075
|
self._json(_mcp_status_payload())
|
|
14844
15076
|
return
|
package/src/granular/common.py
CHANGED
|
@@ -80,7 +80,7 @@ if not logging.getLogger().handlers:
|
|
|
80
80
|
handlers=[logging.StreamHandler()],
|
|
81
81
|
)
|
|
82
82
|
|
|
83
|
-
VERSION = "2.
|
|
83
|
+
VERSION = "2.58.0"
|
|
84
84
|
logger = logging.getLogger("davinci-resolve-mcp")
|
|
85
85
|
logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
|
|
86
86
|
logger.info(f"Detected platform: {get_platform()}")
|