davinci-resolve-mcp 2.57.4 → 2.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/AGENTS.md +20 -0
  2. package/CHANGELOG.md +197 -2
  3. package/LICENSE +1 -1
  4. package/README.md +73 -1
  5. package/bin/davinci-resolve-advanced-mcp.mjs +20 -0
  6. package/docs/README.md +19 -0
  7. package/docs/SKILL.md +62 -1
  8. package/docs/contributing.md +1 -1
  9. package/docs/guides/control-panel.md +9 -0
  10. package/docs/kernels/README.md +21 -0
  11. package/docs/kernels/audio-fairlight-kernel.md +22 -0
  12. package/docs/kernels/color-grade-kernel.md +51 -0
  13. package/docs/kernels/fusion-composition-kernel.md +17 -0
  14. package/docs/kernels/media-pool-ingest-kernel.md +20 -0
  15. package/docs/kernels/render-deliver-kernel.md +32 -0
  16. package/docs/kernels/timeline-conform-interchange-kernel.md +39 -0
  17. package/docs/kernels/timeline-edit-kernel.md +17 -0
  18. package/docs/process/release-process.md +29 -7
  19. package/docs/reference/api-coverage.md +1 -1
  20. package/docs/reference/api-limitations.md +38 -1
  21. package/install.py +27 -4
  22. package/package.json +23 -2
  23. package/resolve-advanced/README.md +194 -0
  24. package/resolve-advanced/package.json +50 -0
  25. package/resolve-advanced/server/black-balance.mjs +92 -0
  26. package/resolve-advanced/server/capabilities.mjs +86 -0
  27. package/resolve-advanced/server/cdl-io.mjs +76 -0
  28. package/resolve-advanced/server/contrast-normalize.mjs +180 -0
  29. package/resolve-advanced/server/db-patch.mjs +91 -0
  30. package/resolve-advanced/server/deliverable-entities.mjs +86 -0
  31. package/resolve-advanced/server/deliverable-qc.mjs +270 -0
  32. package/resolve-advanced/server/editorial.mjs +370 -0
  33. package/resolve-advanced/server/exposure-level.mjs +129 -0
  34. package/resolve-advanced/server/extract-frames.mjs +196 -0
  35. package/resolve-advanced/server/ffprobe-media.mjs +88 -0
  36. package/resolve-advanced/server/gamut-legal.mjs +112 -0
  37. package/resolve-advanced/server/grade-body-patch.mjs +246 -0
  38. package/resolve-advanced/server/grade-transfer.mjs +66 -0
  39. package/resolve-advanced/server/group-grade-read.mjs +137 -0
  40. package/resolve-advanced/server/index.mjs +105 -0
  41. package/resolve-advanced/server/lib.mjs +84 -0
  42. package/resolve-advanced/server/libs.mjs +65 -0
  43. package/resolve-advanced/server/lineage-db.mjs +479 -0
  44. package/resolve-advanced/server/lut-apply.mjs +61 -0
  45. package/resolve-advanced/server/match-to-reference.mjs +173 -0
  46. package/resolve-advanced/server/media-inventory.mjs +169 -0
  47. package/resolve-advanced/server/media-ops.mjs +243 -0
  48. package/resolve-advanced/server/node-meta-db.mjs +62 -0
  49. package/resolve-advanced/server/node-provenance.mjs +102 -0
  50. package/resolve-advanced/server/offline-ref-db.mjs +420 -0
  51. package/resolve-advanced/server/offline-ref.mjs +179 -0
  52. package/resolve-advanced/server/project-db.mjs +233 -0
  53. package/resolve-advanced/server/provenance-audit.mjs +210 -0
  54. package/resolve-advanced/server/qc-frame.mjs +224 -0
  55. package/resolve-advanced/server/qc-sampler.mjs +67 -0
  56. package/resolve-advanced/server/readback.mjs +77 -0
  57. package/resolve-advanced/server/render-manifest.mjs +93 -0
  58. package/resolve-advanced/server/reverse-clip-db.mjs +270 -0
  59. package/resolve-advanced/server/runner-apply-contract.mjs +64 -0
  60. package/resolve-advanced/server/runner.mjs +244 -0
  61. package/resolve-advanced/server/saturation-match.mjs +108 -0
  62. package/resolve-advanced/server/scope-read.mjs +257 -0
  63. package/resolve-advanced/server/season-look.mjs +96 -0
  64. package/resolve-advanced/server/shot-intent.mjs +82 -0
  65. package/resolve-advanced/server/shot-match.mjs +147 -0
  66. package/resolve-advanced/server/skin-match.mjs +205 -0
  67. package/resolve-advanced/server/spec-compile.mjs +217 -0
  68. package/resolve-advanced/server/tone-curve-transfer.mjs +184 -0
  69. package/resolve-advanced/server/tool-catalog.mjs +265 -0
  70. package/resolve-advanced/server/tools/audio.mjs +54 -0
  71. package/resolve-advanced/server/tools/audio_plan.mjs +58 -0
  72. package/resolve-advanced/server/tools/capabilities.mjs +16 -0
  73. package/resolve-advanced/server/tools/color_trace.mjs +165 -0
  74. package/resolve-advanced/server/tools/conform.mjs +291 -0
  75. package/resolve-advanced/server/tools/deliverable.mjs +105 -0
  76. package/resolve-advanced/server/tools/drp.mjs +232 -0
  77. package/resolve-advanced/server/tools/drt.mjs +200 -0
  78. package/resolve-advanced/server/tools/drx.mjs +943 -0
  79. package/resolve-advanced/server/tools/editorial.mjs +69 -0
  80. package/resolve-advanced/server/tools/fairlight.mjs +108 -0
  81. package/resolve-advanced/server/tools/fusion.mjs +64 -0
  82. package/resolve-advanced/server/tools/media.mjs +102 -0
  83. package/resolve-advanced/server/tools/offline_ref.mjs +123 -0
  84. package/resolve-advanced/server/tools/pipeline.mjs +137 -0
  85. package/resolve-advanced/server/tools/project_db.mjs +200 -0
  86. package/resolve-advanced/server/tools/project_read.mjs +212 -0
  87. package/resolve-advanced/server/tools/provenance.mjs +73 -0
  88. package/resolve-advanced/server/verify-grade.mjs +113 -0
  89. package/resolve-advanced/server/white-balance-match.mjs +122 -0
  90. package/resolve-advanced/vendor/audio/format-converter.js +330 -0
  91. package/resolve-advanced/vendor/audio/split.js +173 -0
  92. package/resolve-advanced/vendor/audio/trim.js +188 -0
  93. package/resolve-advanced/vendor/audio-fairlight/index.js +391 -0
  94. package/resolve-advanced/vendor/conform-qc/adapters/frame-sampler.js +56 -0
  95. package/resolve-advanced/vendor/conform-qc/adapters/local-ffmpeg-sampler.js +65 -0
  96. package/resolve-advanced/vendor/conform-qc/adapters/rendernode-ffmpeg-sampler.js +50 -0
  97. package/resolve-advanced/vendor/conform-qc/adapters/resolve/driver.py +176 -0
  98. package/resolve-advanced/vendor/conform-qc/adapters/resolve-driver.js +61 -0
  99. package/resolve-advanced/vendor/conform-qc/adapters/resolve-headless-driver.js +86 -0
  100. package/resolve-advanced/vendor/conform-qc/adapters/vision-validator.js +75 -0
  101. package/resolve-advanced/vendor/conform-qc/cli.js +63 -0
  102. package/resolve-advanced/vendor/conform-qc/compare/advisory.js +106 -0
  103. package/resolve-advanced/vendor/conform-qc/compare/decode.js +36 -0
  104. package/resolve-advanced/vendor/conform-qc/compare/index.js +61 -0
  105. package/resolve-advanced/vendor/conform-qc/compare/locate.js +70 -0
  106. package/resolve-advanced/vendor/conform-qc/compare/metrics.js +409 -0
  107. package/resolve-advanced/vendor/conform-qc/docs/runbook.md +72 -0
  108. package/resolve-advanced/vendor/conform-qc/index.js +49 -0
  109. package/resolve-advanced/vendor/conform-qc/knowledge/index.js +110 -0
  110. package/resolve-advanced/vendor/conform-qc/ops/conform-core.js +137 -0
  111. package/resolve-advanced/vendor/conform-qc/ops/conform-diff.js +109 -0
  112. package/resolve-advanced/vendor/conform-qc/ops/insert.js +108 -0
  113. package/resolve-advanced/vendor/conform-qc/ops/local-conform.js +61 -0
  114. package/resolve-advanced/vendor/conform-qc/ops/patch.js +80 -0
  115. package/resolve-advanced/vendor/conform-qc/ops/trigger.js +32 -0
  116. package/resolve-advanced/vendor/conform-qc/ops/verify.js +105 -0
  117. package/resolve-advanced/vendor/conform-qc/ops/workflow.js +30 -0
  118. package/resolve-advanced/vendor/conform-qc/oracle/emulate.js +155 -0
  119. package/resolve-advanced/vendor/conform-qc/oracle/index.js +38 -0
  120. package/resolve-advanced/vendor/conform-qc/oracle/resolve.js +196 -0
  121. package/resolve-advanced/vendor/conform-qc/package.json +16 -0
  122. package/resolve-advanced/vendor/conform-qc/packaging/emit-aaf.js +30 -0
  123. package/resolve-advanced/vendor/conform-qc/packaging/emit-fcp7.js +64 -0
  124. package/resolve-advanced/vendor/conform-qc/packaging/index.js +169 -0
  125. package/resolve-advanced/vendor/conform-qc/packaging/media-ops.js +56 -0
  126. package/resolve-advanced/vendor/conform-qc/packaging/otio.js +50 -0
  127. package/resolve-advanced/vendor/conform-qc/packaging/relink.js +50 -0
  128. package/resolve-advanced/vendor/conform-qc/packaging/surgical-relink.js +195 -0
  129. package/resolve-advanced/vendor/conform-qc/parse/index.js +54 -0
  130. package/resolve-advanced/vendor/conform-qc/parse/merge-dto.js +27 -0
  131. package/resolve-advanced/vendor/conform-qc/parse/xmeml-geometry.js +256 -0
  132. package/resolve-advanced/vendor/conform-qc/reference/burnin-ocr.js +100 -0
  133. package/resolve-advanced/vendor/conform-qc/reference/sidecar.js +37 -0
  134. package/resolve-advanced/vendor/conform-qc/repair/analysis.js +62 -0
  135. package/resolve-advanced/vendor/conform-qc/repair/index.js +78 -0
  136. package/resolve-advanced/vendor/conform-qc/repair/media-analysis.js +139 -0
  137. package/resolve-advanced/vendor/conform-qc/repair/media-index.js +135 -0
  138. package/resolve-advanced/vendor/conform-qc/repair/strategies.js +250 -0
  139. package/resolve-advanced/vendor/conform-qc/report/index.js +133 -0
  140. package/resolve-advanced/vendor/conform-qc/roles/index.js +96 -0
  141. package/resolve-advanced/vendor/conform-qc/synthetic/generate.js +233 -0
  142. package/resolve-advanced/vendor/conform-qc/test/advisory.test.js +85 -0
  143. package/resolve-advanced/vendor/conform-qc/test/cli.test.js +39 -0
  144. package/resolve-advanced/vendor/conform-qc/test/compare.test.js +152 -0
  145. package/resolve-advanced/vendor/conform-qc/test/conform-diff.test.js +70 -0
  146. package/resolve-advanced/vendor/conform-qc/test/emulate.test.js +51 -0
  147. package/resolve-advanced/vendor/conform-qc/test/frame-sampler.test.js +30 -0
  148. package/resolve-advanced/vendor/conform-qc/test/geometry.test.js +112 -0
  149. package/resolve-advanced/vendor/conform-qc/test/knowledge.test.js +56 -0
  150. package/resolve-advanced/vendor/conform-qc/test/lifecycle.test.js +110 -0
  151. package/resolve-advanced/vendor/conform-qc/test/local-ffmpeg-sampler.test.js +66 -0
  152. package/resolve-advanced/vendor/conform-qc/test/locate.test.js +63 -0
  153. package/resolve-advanced/vendor/conform-qc/test/media-analysis.test.js +63 -0
  154. package/resolve-advanced/vendor/conform-qc/test/media-index-normalized.test.js +65 -0
  155. package/resolve-advanced/vendor/conform-qc/test/media-index-origin.test.js +53 -0
  156. package/resolve-advanced/vendor/conform-qc/test/metrics-fast.test.js +91 -0
  157. package/resolve-advanced/vendor/conform-qc/test/oracle-reverse.test.js +86 -0
  158. package/resolve-advanced/vendor/conform-qc/test/oracle.test.js +136 -0
  159. package/resolve-advanced/vendor/conform-qc/test/p0-acceptance.test.js +60 -0
  160. package/resolve-advanced/vendor/conform-qc/test/p1-acceptance.test.js +75 -0
  161. package/resolve-advanced/vendor/conform-qc/test/p45-patch-acceptance.test.js +102 -0
  162. package/resolve-advanced/vendor/conform-qc/test/packaging.test.js +133 -0
  163. package/resolve-advanced/vendor/conform-qc/test/parse-stubs.test.js +28 -0
  164. package/resolve-advanced/vendor/conform-qc/test/repair-strategies.test.js +128 -0
  165. package/resolve-advanced/vendor/conform-qc/test/repair.test.js +84 -0
  166. package/resolve-advanced/vendor/conform-qc/test/report.test.js +52 -0
  167. package/resolve-advanced/vendor/conform-qc/test/resolve-readback.test.js +71 -0
  168. package/resolve-advanced/vendor/conform-qc/test/roles.test.js +107 -0
  169. package/resolve-advanced/vendor/conform-qc/test/runbook.test.js +30 -0
  170. package/resolve-advanced/vendor/conform-qc/test/scale-residual.test.js +40 -0
  171. package/resolve-advanced/vendor/conform-qc/test/sidecar.test.js +51 -0
  172. package/resolve-advanced/vendor/conform-qc/test/smoke.test.js +87 -0
  173. package/resolve-advanced/vendor/conform-qc/test/surgical-relink.test.js +73 -0
  174. package/resolve-advanced/vendor/conform-qc/test/synthetic.test.js +98 -0
  175. package/resolve-advanced/vendor/conform-qc/test/verify.test.js +93 -0
  176. package/resolve-advanced/vendor/conform-qc/test/vision-validator.test.js +43 -0
  177. package/resolve-advanced/vendor/conform-qc/test/workflow-driver.test.js +46 -0
  178. package/resolve-advanced/vendor/conform-qc/toolset/index.js +53 -0
  179. package/resolve-advanced/vendor/drp-format/README.md +116 -0
  180. package/resolve-advanced/vendor/drp-format/__tests__/_resolve-verify.js +39 -0
  181. package/resolve-advanced/vendor/drp-format/__tests__/add-media-clip.test.js +30 -0
  182. package/resolve-advanced/vendor/drp-format/__tests__/assemble-timeline.test.js +68 -0
  183. package/resolve-advanced/vendor/drp-format/__tests__/author-project.test.js +57 -0
  184. package/resolve-advanced/vendor/drp-format/__tests__/composition-text.test.js +98 -0
  185. package/resolve-advanced/vendor/drp-format/__tests__/diff.test.js +272 -0
  186. package/resolve-advanced/vendor/drp-format/__tests__/effect-filters-compressed.test.js +143 -0
  187. package/resolve-advanced/vendor/drp-format/__tests__/fixtures/p0-3-session30-empty-effectfilters.drp +0 -0
  188. package/resolve-advanced/vendor/drp-format/__tests__/fixtures/retimed-timemap-50pct.hex +1 -0
  189. package/resolve-advanced/vendor/drp-format/__tests__/fixtures/retimed-timemap-dynamic.hex +1 -0
  190. package/resolve-advanced/vendor/drp-format/__tests__/inject-grades.test.js +238 -0
  191. package/resolve-advanced/vendor/drp-format/__tests__/keyed-dict.test.js +85 -0
  192. package/resolve-advanced/vendor/drp-format/__tests__/lut-refs.test.js +119 -0
  193. package/resolve-advanced/vendor/drp-format/__tests__/media-blobs.test.js +25 -0
  194. package/resolve-advanced/vendor/drp-format/__tests__/media-timemap.test.js +119 -0
  195. package/resolve-advanced/vendor/drp-format/__tests__/place-fusion-title.test.js +52 -0
  196. package/resolve-advanced/vendor/drp-format/__tests__/place-generator.test.js +40 -0
  197. package/resolve-advanced/vendor/drp-format/__tests__/place-transition.test.js +48 -0
  198. package/resolve-advanced/vendor/drp-format/__tests__/protobuf-wire.test.js +64 -0
  199. package/resolve-advanced/vendor/drp-format/__tests__/relink-media.test.js +106 -0
  200. package/resolve-advanced/vendor/drp-format/__tests__/splice-clips.test.js +256 -0
  201. package/resolve-advanced/vendor/drp-format/assemble-timeline.js +65 -0
  202. package/resolve-advanced/vendor/drp-format/author-project.js +118 -0
  203. package/resolve-advanced/vendor/drp-format/composition-text.js +213 -0
  204. package/resolve-advanced/vendor/drp-format/curves-encoder.js +763 -0
  205. package/resolve-advanced/vendor/drp-format/diff.js +310 -0
  206. package/resolve-advanced/vendor/drp-format/drp-packager.js +201 -0
  207. package/resolve-advanced/vendor/drp-format/drp-validator.js +809 -0
  208. package/resolve-advanced/vendor/drp-format/effect-encoder.js +640 -0
  209. package/resolve-advanced/vendor/drp-format/extract-lut-refs.js +119 -0
  210. package/resolve-advanced/vendor/drp-format/grade-encoder.example.js +133 -0
  211. package/resolve-advanced/vendor/drp-format/grade-encoder.js +401 -0
  212. package/resolve-advanced/vendor/drp-format/grade-encoder.test.js +171 -0
  213. package/resolve-advanced/vendor/drp-format/grade-encoder.verify.js +249 -0
  214. package/resolve-advanced/vendor/drp-format/grade-node-extractor.js +495 -0
  215. package/resolve-advanced/vendor/drp-format/grade-parameter-decoder.js +774 -0
  216. package/resolve-advanced/vendor/drp-format/index.js +174 -0
  217. package/resolve-advanced/vendor/drp-format/inject-grades.js +219 -0
  218. package/resolve-advanced/vendor/drp-format/keyed-dict.js +227 -0
  219. package/resolve-advanced/vendor/drp-format/marker-encoder.js +532 -0
  220. package/resolve-advanced/vendor/drp-format/media-blobs.js +53 -0
  221. package/resolve-advanced/vendor/drp-format/media-timemap.js +164 -0
  222. package/resolve-advanced/vendor/drp-format/mp-folder-builder.js +293 -0
  223. package/resolve-advanced/vendor/drp-format/node-tree-encoder.js +1246 -0
  224. package/resolve-advanced/vendor/drp-format/package.json +18 -0
  225. package/resolve-advanced/vendor/drp-format/place-fusion-title.js +131 -0
  226. package/resolve-advanced/vendor/drp-format/place-generator.js +77 -0
  227. package/resolve-advanced/vendor/drp-format/place-transition.js +91 -0
  228. package/resolve-advanced/vendor/drp-format/power-window-encoder.js +776 -0
  229. package/resolve-advanced/vendor/drp-format/protobuf-wire.js +111 -0
  230. package/resolve-advanced/vendor/drp-format/qualifier-encoder.js +706 -0
  231. package/resolve-advanced/vendor/drp-format/relink-media.js +218 -0
  232. package/resolve-advanced/vendor/drp-format/rich-title-encoder.js +447 -0
  233. package/resolve-advanced/vendor/drp-format/seq-container-builder.js +572 -0
  234. package/resolve-advanced/vendor/drp-format/seq-surgery.js +155 -0
  235. package/resolve-advanced/vendor/drp-format/splice-clips.js +445 -0
  236. package/resolve-advanced/vendor/drp-format/templates/empty-project.drp +0 -0
  237. package/resolve-advanced/vendor/drp-format/templates/fusion-title.xml +56 -0
  238. package/resolve-advanced/vendor/drp-format/templates/generator-solid-color.xml +21 -0
  239. package/resolve-advanced/vendor/drp-format/templates/media-clip-h264.drp +0 -0
  240. package/resolve-advanced/vendor/drp-format/templates/transition-cross-dissolve.xml +22 -0
  241. package/resolve-advanced/vendor/drp-format/tool-registry.descriptor.js +80 -0
  242. package/resolve-advanced/vendor/drp-format/utils/safe-archive.js +54 -0
  243. package/resolve-advanced/vendor/drp-format/xml-builder.js +759 -0
  244. package/resolve-advanced/vendor/drt-format/__tests__/_resolve-verify.js +21 -0
  245. package/resolve-advanced/vendor/drt-format/__tests__/build.test.js +113 -0
  246. package/resolve-advanced/vendor/drt-format/__tests__/multi-format.test.js +93 -0
  247. package/resolve-advanced/vendor/drt-format/__tests__/parse-real-resolve21.test.js +51 -0
  248. package/resolve-advanced/vendor/drt-format/__tests__/parse.test.js +134 -0
  249. package/resolve-advanced/vendor/drt-format/__tests__/resolve-versions.test.js +120 -0
  250. package/resolve-advanced/vendor/drt-format/__tests__/schema-fingerprint.test.js +62 -0
  251. package/resolve-advanced/vendor/drt-format/__tests__/smoke.test.js +27 -0
  252. package/resolve-advanced/vendor/drt-format/__tests__/validate.test.js +109 -0
  253. package/resolve-advanced/vendor/drt-format/capabilities.js +69 -0
  254. package/resolve-advanced/vendor/drt-format/capability-domains.js +56 -0
  255. package/resolve-advanced/vendor/drt-format/drt-builder.js +42 -0
  256. package/resolve-advanced/vendor/drt-format/drt-parser.js +164 -0
  257. package/resolve-advanced/vendor/drt-format/drt-validator.js +98 -0
  258. package/resolve-advanced/vendor/drt-format/index.js +45 -0
  259. package/resolve-advanced/vendor/drt-format/package.json +17 -0
  260. package/resolve-advanced/vendor/drt-format/resolve-versions.js +153 -0
  261. package/resolve-advanced/vendor/drt-format/schema-fingerprint.js +74 -0
  262. package/resolve-advanced/vendor/drt-format/templates/drt-project-shell.xml +124 -0
  263. package/resolve-advanced/vendor/drx-codec/__tests__/curves-roundtrip.test.js +148 -0
  264. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-face-refinement.drx +58 -0
  265. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-filmgrain.drx +58 -0
  266. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-glow.drx +58 -0
  267. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-1-lens-flare.drx +58 -0
  268. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-3-beauty-25.drx +58 -0
  269. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p2-3-beauty-75.drx +58 -0
  270. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p5-1-node-no-lut.drx +58 -0
  271. package/resolve-advanced/vendor/drx-codec/__tests__/fixtures/p5-1-node-with-lut.drx +58 -0
  272. package/resolve-advanced/vendor/drx-codec/__tests__/hsl-curves-roundtrip.test.js +117 -0
  273. package/resolve-advanced/vendor/drx-codec/__tests__/lut-refs-roundtrip.test.js +112 -0
  274. package/resolve-advanced/vendor/drx-codec/__tests__/matte-roundtrip.test.js +167 -0
  275. package/resolve-advanced/vendor/drx-codec/__tests__/ofx-roundtrip.test.js +215 -0
  276. package/resolve-advanced/vendor/drx-codec/__tests__/ofx-slugs-discovery.test.js +149 -0
  277. package/resolve-advanced/vendor/drx-codec/__tests__/power-window-roundtrip.test.js +230 -0
  278. package/resolve-advanced/vendor/drx-codec/__tests__/qualifier-roundtrip.test.js +226 -0
  279. package/resolve-advanced/vendor/drx-codec/cdl-exporter.js +470 -0
  280. package/resolve-advanced/vendor/drx-codec/color-nlp-parser.js +833 -0
  281. package/resolve-advanced/vendor/drx-codec/data/color-nlp-action-mappings.json +2232 -0
  282. package/resolve-advanced/vendor/drx-codec/drx-generator.js +4123 -0
  283. package/resolve-advanced/vendor/drx-codec/drx-merger.js +320 -0
  284. package/resolve-advanced/vendor/drx-codec/drx-parser.js +1808 -0
  285. package/resolve-advanced/vendor/drx-codec/extract-custom-curves.js +215 -0
  286. package/resolve-advanced/vendor/drx-codec/extract-hsl-curves.js +180 -0
  287. package/resolve-advanced/vendor/drx-codec/extract-lut-refs.js +158 -0
  288. package/resolve-advanced/vendor/drx-codec/extract-matte-finesse.js +83 -0
  289. package/resolve-advanced/vendor/drx-codec/extract-ofx-params.js +226 -0
  290. package/resolve-advanced/vendor/drx-codec/extract-power-window.js +184 -0
  291. package/resolve-advanced/vendor/drx-codec/extract-qualifier.js +99 -0
  292. package/resolve-advanced/vendor/drx-codec/index.js +109 -0
  293. package/resolve-advanced/vendor/drx-codec/node-layout.js +249 -0
  294. package/resolve-advanced/vendor/drx-codec/resolved-drx-generator.js +393 -0
  295. package/resolve-advanced/vendor/drx-codec/tool-resolver.js +974 -0
  296. package/resolve-advanced/vendor/drx-codec/training-examples.js +548 -0
  297. package/resolve-advanced/vendor/drx-codec/vocabulary-intents.js +539 -0
  298. package/resolve-advanced/vendor/drx-parameters/CALIBRATION-STATUS.md +319 -0
  299. package/resolve-advanced/vendor/drx-parameters/DRX-VALUE-SCALING.md +251 -0
  300. package/resolve-advanced/vendor/drx-parameters/calibrated-ranges.json +17737 -0
  301. package/resolve-advanced/vendor/drx-parameters/corrector-types.js +120 -0
  302. package/resolve-advanced/vendor/drx-parameters/index.js +193 -0
  303. package/resolve-advanced/vendor/drx-parameters/parameter-codec.js +451 -0
  304. package/resolve-advanced/vendor/drx-parameters/parameter-ids.js +1292 -0
  305. package/resolve-advanced/vendor/drx-parameters/parameter-ranges.js +570 -0
  306. package/resolve-advanced/vendor/drx-parameters/parameter-validator.js +392 -0
  307. package/resolve-advanced/vendor/drx-parameters/resolvefx-registry.json +14973 -0
  308. package/resolve-advanced/vendor/drx-parameters/tool-registry.descriptor.js +38 -0
  309. package/resolve-advanced/vendor/drx-parameters/tools/drx-analyzer.js +371 -0
  310. package/resolve-advanced/vendor/fairlight/index.js +833 -0
  311. package/resolve-advanced/vendor/fusion-codec/composition-generator.js +401 -0
  312. package/resolve-advanced/vendor/fusion-codec/templates/blur-region.js +103 -0
  313. package/resolve-advanced/vendor/fusion-codec/templates/color-correct.js +87 -0
  314. package/resolve-advanced/vendor/fusion-codec/templates/film-grain.js +106 -0
  315. package/resolve-advanced/vendor/fusion-codec/templates/lower-third.js +241 -0
  316. package/resolve-advanced/vendor/fusion-codec/templates/picture-in-picture.js +188 -0
  317. package/resolve-advanced/vendor/fusion-codec/templates/text-overlay.js +161 -0
  318. package/resolve-advanced/vendor/fusion-codec/templates/title-card.js +184 -0
  319. package/resolve-advanced/vendor/fusion-codec/templates/vignette.js +107 -0
  320. package/resolve-advanced/vendor/fusion-codec/templates/watermark.js +101 -0
  321. package/scripts/agent-rules/README.md +68 -0
  322. package/src/analysis_dashboard.py +233 -1
  323. package/src/granular/common.py +1 -1
  324. package/src/server.py +479 -29
  325. package/src/utils/api_truth.py +117 -0
  326. package/src/utils/cut_ir.py +1 -1
  327. package/src/utils/failure_tracker.py +0 -2
  328. package/src/utils/timeline_xml.py +405 -0
@@ -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
@@ -80,7 +80,7 @@ if not logging.getLogger().handlers:
80
80
  handlers=[logging.StreamHandler()],
81
81
  )
82
82
 
83
- VERSION = "2.57.4"
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()}")