@hybridlabor-api/aos 4.4.1 → 4.4.2-beta.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/skills/firecrawl/SKILL.md +149 -0
- package/.agents/skills/firecrawl/rules/install.md +82 -0
- package/.agents/skills/firecrawl/rules/security.md +26 -0
- package/.agents/skills/firecrawl-agent/SKILL.md +58 -0
- package/.agents/skills/firecrawl-build/SKILL.md +39 -0
- package/.agents/skills/firecrawl-build-interact/SKILL.md +68 -0
- package/.agents/skills/firecrawl-build-onboarding/SKILL.md +103 -0
- package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +39 -0
- package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +20 -0
- package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +17 -0
- package/.agents/skills/firecrawl-build-scrape/SKILL.md +69 -0
- package/.agents/skills/firecrawl-build-search/SKILL.md +69 -0
- package/.agents/skills/firecrawl-crawl/SKILL.md +59 -0
- package/.agents/skills/firecrawl-download/SKILL.md +70 -0
- package/.agents/skills/firecrawl-interact/SKILL.md +84 -0
- package/.agents/skills/firecrawl-map/SKILL.md +51 -0
- package/.agents/skills/firecrawl-scrape/SKILL.md +69 -0
- package/.agents/skills/firecrawl-search/SKILL.md +60 -0
- package/CLAUDE.md +573 -0
- package/README.de.md +0 -8
- package/README.md +0 -8
- package/README.pt.md +0 -8
- package/assets/brand/ao-ant-mark.svg +91 -0
- package/assets/brand/bdb-core-mark.svg +34 -0
- package/assets/brand/heimdall-guardian-mark.svg +16 -0
- package/assets/brand/memb-crystal-mark.svg +18 -0
- package/bin/aos-config.mjs +89 -0
- package/bin/aos-dashboard.mjs +608 -0
- package/bin/aos-uninstall.mjs +227 -0
- package/docs/sessions/audit-2026-09-14-silent-failures.md +114 -0
- package/docs/skills_table.md +0 -3
- package/installer.js +387 -237
- package/mcps/RhinoMCP/cc-plugin/.claude/settings.json +10 -0
- package/mcps/after-effects-mcp/build/index.js +840 -0
- package/mcps/after-effects-mcp/build/scripts/applyEffect.jsx +153 -0
- package/mcps/after-effects-mcp/build/scripts/applyEffectTemplate.jsx +218 -0
- package/mcps/after-effects-mcp/build/scripts/createComposition.jsx +71 -0
- package/mcps/after-effects-mcp/build/scripts/createShapeLayer.jsx +147 -0
- package/mcps/after-effects-mcp/build/scripts/createSolidLayer.jsx +114 -0
- package/mcps/after-effects-mcp/build/scripts/createTextLayer.jsx +115 -0
- package/mcps/after-effects-mcp/build/scripts/getLayerInfo.jsx +192 -0
- package/mcps/after-effects-mcp/build/scripts/getProjectInfo.jsx +90 -0
- package/mcps/after-effects-mcp/build/scripts/listCompositions.jsx +50 -0
- package/mcps/after-effects-mcp/build/scripts/mcp-bridge-auto.jsx +1773 -0
- package/mcps/after-effects-mcp/build/scripts/setLayerProperties.jsx +160 -0
- package/mcps/computer-use-mcp/dist/client.d.ts +150 -0
- package/mcps/computer-use-mcp/dist/client.js +136 -0
- package/mcps/computer-use-mcp/dist/entrypoint.d.ts +16 -0
- package/mcps/computer-use-mcp/dist/entrypoint.js +26 -0
- package/mcps/computer-use-mcp/dist/native.d.ts +212 -0
- package/mcps/computer-use-mcp/dist/native.js +50 -0
- package/mcps/computer-use-mcp/dist/server.d.ts +32 -0
- package/mcps/computer-use-mcp/dist/server.js +342 -0
- package/mcps/computer-use-mcp/dist/session.d.ts +101 -0
- package/mcps/computer-use-mcp/dist/session.js +2372 -0
- package/package.json +13 -4
- package/skills/global_config/aos-project-init/SKILL.md +97 -130
- package/skills/global_config/aos-project-init/assets/openwikiignore.template +62 -0
- package/skills/global_config/aos-project-init/scripts/aos-project-doctor.mjs +38 -1
- package/skills/global_config/aos-setup/SKILL.md +98 -8
- package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +21 -2
- package/skills/global_config/ask-tim/SKILL.md +2 -7
- package/skills/global_config/openwiki-skill/scripts/openwiki_daemon.py +65 -12
- package/bin/setup-saas.mjs +0 -792
- package/mcps/blender-mcp-server/.dockerignore +0 -19
- package/mcps/blender-mcp-server/.github/workflows/ci.yml +0 -67
- package/mcps/blender-mcp-server/.github/workflows/publish-pypi.yml +0 -54
- package/mcps/blender-mcp-server/CHANGELOG.md +0 -64
- package/mcps/blender-mcp-server/CONTRIBUTING.md +0 -107
- package/mcps/blender-mcp-server/Dockerfile +0 -19
- package/mcps/blender-mcp-server/LICENSE +0 -21
- package/mcps/blender-mcp-server/README.md +0 -409
- package/mcps/blender-mcp-server/addon/__init__.py +0 -1440
- package/mcps/blender-mcp-server/addon/models.py +0 -223
- package/mcps/blender-mcp-server/pyproject.toml +0 -120
- package/mcps/blender-mcp-server/scripts/blender_bridge_request.py +0 -71
- package/mcps/blender-mcp-server/scripts/blender_create_test_cube.py +0 -49
- package/mcps/blender-mcp-server/scripts/blender_scene_info.py +0 -38
- package/mcps/blender-mcp-server/scripts/build_addon_zip.sh +0 -29
- package/mcps/blender-mcp-server/scripts/demos/README.md +0 -186
- package/mcps/blender-mcp-server/scripts/demos/dam_break_scene.py +0 -276
- package/mcps/blender-mcp-server/scripts/demos/open_dam_break_gui.py +0 -33
- package/mcps/blender-mcp-server/scripts/demos/pipe_movement_study.py +0 -518
- package/mcps/blender-mcp-server/scripts/demos/pipe_pressure_failure_scene.py +0 -806
- package/mcps/blender-mcp-server/scripts/demos/procedural_dam_break_scene.py +0 -600
- package/mcps/blender-mcp-server/scripts/demos/run_dam_break.py +0 -510
- package/mcps/blender-mcp-server/scripts/launch_blender_gui.py +0 -41
- package/mcps/blender-mcp-server/scripts/library/README.md +0 -64
- package/mcps/blender-mcp-server/scripts/library/apply_transforms.py +0 -46
- package/mcps/blender-mcp-server/scripts/library/camera.py +0 -51
- package/mcps/blender-mcp-server/scripts/library/collections.py +0 -65
- package/mcps/blender-mcp-server/scripts/library/create_mesh.py +0 -41
- package/mcps/blender-mcp-server/scripts/library/effector.py +0 -48
- package/mcps/blender-mcp-server/scripts/library/fluid_domain.py +0 -80
- package/mcps/blender-mcp-server/scripts/library/fluid_inflow.py +0 -98
- package/mcps/blender-mcp-server/scripts/library/frame_range.py +0 -35
- package/mcps/blender-mcp-server/scripts/library/keyframes.py +0 -59
- package/mcps/blender-mcp-server/scripts/library/rigid_body.py +0 -52
- package/mcps/blender-mcp-server/scripts/library/save_blend.py +0 -40
- package/mcps/blender-mcp-server/scripts/server_start.sh +0 -26
- package/mcps/blender-mcp-server/src/blender_mcp_server/__init__.py +0 -3
- package/mcps/blender-mcp-server/src/blender_mcp_server/headless.py +0 -330
- package/mcps/blender-mcp-server/src/blender_mcp_server/server.py +0 -606
- package/mcps/davinci-mcp-professional/.bandit +0 -35
- package/mcps/davinci-mcp-professional/.claude/commands/security-review.md +0 -191
- package/mcps/davinci-mcp-professional/.claude/settings.json +0 -1
- package/mcps/davinci-mcp-professional/.editorconfig +0 -27
- package/mcps/davinci-mcp-professional/.gitattributes +0 -207
- package/mcps/davinci-mcp-professional/.github/CODEOWNERS +0 -2
- package/mcps/davinci-mcp-professional/.github/ISSUE_TEMPLATE/bug_report.md +0 -33
- package/mcps/davinci-mcp-professional/.github/ISSUE_TEMPLATE/feature_request.md +0 -19
- package/mcps/davinci-mcp-professional/.github/PULL_REQUEST_TEMPLATE.md +0 -20
- package/mcps/davinci-mcp-professional/.github/SECURITY.md +0 -97
- package/mcps/davinci-mcp-professional/.github/dependabot.yml +0 -27
- package/mcps/davinci-mcp-professional/.github/workflows/ci.yml +0 -39
- package/mcps/davinci-mcp-professional/ATTRIBUTION.md +0 -4
- package/mcps/davinci-mcp-professional/AUTHORS.md +0 -9
- package/mcps/davinci-mcp-professional/BUGS.md +0 -55
- package/mcps/davinci-mcp-professional/CLAUDE.md +0 -229
- package/mcps/davinci-mcp-professional/CONTRIBUTING.md +0 -51
- package/mcps/davinci-mcp-professional/COPYING.md +0 -228
- package/mcps/davinci-mcp-professional/Doxyfile +0 -379
- package/mcps/davinci-mcp-professional/README.md +0 -143
- package/mcps/davinci-mcp-professional/SECURITY.md +0 -40
- package/mcps/davinci-mcp-professional/USING.md +0 -301
- package/mcps/davinci-mcp-professional/VERSION.md +0 -13
- package/mcps/davinci-mcp-professional/build.py +0 -169
- package/mcps/davinci-mcp-professional/claude_desktop_config_template.json +0 -11
- package/mcps/davinci-mcp-professional/hooks/ci-check.sh +0 -29
- package/mcps/davinci-mcp-professional/hooks/pre-push +0 -46
- package/mcps/davinci-mcp-professional/main.py +0 -40
- package/mcps/davinci-mcp-professional/mcp_server.py +0 -30
- package/mcps/davinci-mcp-professional/pyproject.toml +0 -115
- package/mcps/davinci-mcp-professional/security_audit.py +0 -379
- package/mcps/davinci-mcp-professional/src/davinci_mcp/__init__.py +0 -19
- package/mcps/davinci-mcp-professional/src/davinci_mcp/cli.py +0 -138
- package/mcps/davinci-mcp-professional/src/davinci_mcp/resolve_client.py +0 -342
- package/mcps/davinci-mcp-professional/src/davinci_mcp/resources/__init__.py +0 -60
- package/mcps/davinci-mcp-professional/src/davinci_mcp/server.py +0 -185
- package/mcps/davinci-mcp-professional/src/davinci_mcp/tools/__init__.py +0 -146
- package/mcps/davinci-mcp-professional/src/davinci_mcp/types.py +0 -125
- package/mcps/davinci-mcp-professional/src/davinci_mcp/utils/__init__.py +0 -19
- package/mcps/davinci-mcp-professional/src/davinci_mcp/utils/platform.py +0 -239
- package/mcps/davinci-mcp-professional/test.py +0 -186
- package/mcps/davinci-mcp-professional/uv.lock +0 -2073
- package/mcps/davinci-resolve-mcp/.claude/skills/media-analysis.md +0 -44
- package/mcps/davinci-resolve-mcp/.clinerules +0 -17
- package/mcps/davinci-resolve-mcp/.cursorrules +0 -17
- package/mcps/davinci-resolve-mcp/.github/copilot-instructions.md +0 -17
- package/mcps/davinci-resolve-mcp/.github/workflows/npm-publish.yml +0 -109
- package/mcps/davinci-resolve-mcp/.windsurfrules +0 -17
- package/mcps/davinci-resolve-mcp/AGENTS.md +0 -114
- package/mcps/davinci-resolve-mcp/CHANGELOG.md +0 -2648
- package/mcps/davinci-resolve-mcp/CLAUDE.md +0 -15
- package/mcps/davinci-resolve-mcp/LICENSE +0 -21
- package/mcps/davinci-resolve-mcp/README.md +0 -173
- package/mcps/davinci-resolve-mcp/SECURITY.md +0 -53
- package/mcps/davinci-resolve-mcp/bin/davinci-resolve-mcp.mjs +0 -450
- package/mcps/davinci-resolve-mcp/examples/README.md +0 -53
- package/mcps/davinci-resolve-mcp/examples/markers/README.md +0 -81
- package/mcps/davinci-resolve-mcp/examples/media/README.md +0 -94
- package/mcps/davinci-resolve-mcp/examples/timeline/README.md +0 -98
- package/mcps/davinci-resolve-mcp/install.py +0 -1687
- package/mcps/davinci-resolve-mcp/package.json +0 -52
- package/mcps/davinci-resolve-mcp/release-notes/v2.22.0.md +0 -51
- package/mcps/davinci-resolve-mcp/release-notes/v2.23.0.md +0 -51
- package/mcps/davinci-resolve-mcp/release-notes/v2.23.1.md +0 -35
- package/mcps/davinci-resolve-mcp/release-notes/v2.24.1.md +0 -32
- package/mcps/davinci-resolve-mcp/scripts/audit_api_parity.py +0 -275
- package/mcps/davinci-resolve-mcp/scripts/audit_readwrite_symmetry.py +0 -80
- package/mcps/davinci-resolve-mcp/scripts/doctor.py +0 -227
- package/mcps/davinci-resolve-mcp/scripts/gen_api_limitations.py +0 -144
- package/mcps/davinci-resolve-mcp/scripts/live_media_analysis_polish_probe.py +0 -65
- package/mcps/davinci-resolve-mcp/scripts/measure_bridge_cost.py +0 -65
- package/mcps/davinci-resolve-mcp/scripts/regen_panel_screenshots.py +0 -76
- package/mcps/davinci-resolve-mcp/src/__init__.py +0 -3
- package/mcps/davinci-resolve-mcp/src/analysis_dashboard.py +0 -15505
- package/mcps/davinci-resolve-mcp/src/batch_cli.py +0 -540
- package/mcps/davinci-resolve-mcp/src/control_panel.py +0 -13
- package/mcps/davinci-resolve-mcp/src/granular/__init__.py +0 -17
- package/mcps/davinci-resolve-mcp/src/granular/common.py +0 -741
- package/mcps/davinci-resolve-mcp/src/granular/folder.py +0 -420
- package/mcps/davinci-resolve-mcp/src/granular/gallery.py +0 -306
- package/mcps/davinci-resolve-mcp/src/granular/graph.py +0 -309
- package/mcps/davinci-resolve-mcp/src/granular/media_pool.py +0 -679
- package/mcps/davinci-resolve-mcp/src/granular/media_pool_item.py +0 -1020
- package/mcps/davinci-resolve-mcp/src/granular/media_storage.py +0 -179
- package/mcps/davinci-resolve-mcp/src/granular/project.py +0 -1654
- package/mcps/davinci-resolve-mcp/src/granular/resolve_control.py +0 -538
- package/mcps/davinci-resolve-mcp/src/granular/timeline.py +0 -1075
- package/mcps/davinci-resolve-mcp/src/granular/timeline_item.py +0 -2251
- package/mcps/davinci-resolve-mcp/src/resolve_mcp_server.py +0 -43
- package/mcps/davinci-resolve-mcp/src/server.py +0 -24116
- package/mcps/davinci-resolve-mcp/src/utils/__init__.py +0 -3
- package/mcps/davinci-resolve-mcp/src/utils/actor_identity.py +0 -46
- package/mcps/davinci-resolve-mcp/src/utils/analysis_caps.py +0 -678
- package/mcps/davinci-resolve-mcp/src/utils/analysis_memory.py +0 -755
- package/mcps/davinci-resolve-mcp/src/utils/analysis_runs.py +0 -307
- package/mcps/davinci-resolve-mcp/src/utils/analysis_store.py +0 -945
- package/mcps/davinci-resolve-mcp/src/utils/api_truth.py +0 -525
- package/mcps/davinci-resolve-mcp/src/utils/app_control.py +0 -319
- package/mcps/davinci-resolve-mcp/src/utils/audio_fairlight_live_probe.py +0 -263
- package/mcps/davinci-resolve-mcp/src/utils/brain_edits.py +0 -387
- package/mcps/davinci-resolve-mcp/src/utils/bridge_metrics.py +0 -76
- package/mcps/davinci-resolve-mcp/src/utils/cdl.py +0 -20
- package/mcps/davinci-resolve-mcp/src/utils/clip_query.py +0 -85
- package/mcps/davinci-resolve-mcp/src/utils/cloud_operations.py +0 -192
- package/mcps/davinci-resolve-mcp/src/utils/color_grade_live_probe.py +0 -444
- package/mcps/davinci-resolve-mcp/src/utils/contracts.py +0 -102
- package/mcps/davinci-resolve-mcp/src/utils/cut_ir.py +0 -115
- package/mcps/davinci-resolve-mcp/src/utils/dctl_templates.py +0 -368
- package/mcps/davinci-resolve-mcp/src/utils/deep_vision.py +0 -643
- package/mcps/davinci-resolve-mcp/src/utils/destructive_hook.py +0 -606
- package/mcps/davinci-resolve-mcp/src/utils/edit_engine.py +0 -737
- package/mcps/davinci-resolve-mcp/src/utils/embeddings.py +0 -922
- package/mcps/davinci-resolve-mcp/src/utils/entities.py +0 -579
- package/mcps/davinci-resolve-mcp/src/utils/extension_authoring_live_probe.py +0 -292
- package/mcps/davinci-resolve-mcp/src/utils/failure_tracker.py +0 -119
- package/mcps/davinci-resolve-mcp/src/utils/fuse_templates.py +0 -1968
- package/mcps/davinci-resolve-mcp/src/utils/fusion_composition_live_probe.py +0 -284
- package/mcps/davinci-resolve-mcp/src/utils/fusion_group_settings.py +0 -334
- package/mcps/davinci-resolve-mcp/src/utils/layout_presets.py +0 -333
- package/mcps/davinci-resolve-mcp/src/utils/mcp_stdio.py +0 -32
- package/mcps/davinci-resolve-mcp/src/utils/mcp_transport.py +0 -128
- package/mcps/davinci-resolve-mcp/src/utils/media_analysis.py +0 -7690
- package/mcps/davinci-resolve-mcp/src/utils/media_analysis_jobs.py +0 -805
- package/mcps/davinci-resolve-mcp/src/utils/media_pool_changes.py +0 -121
- package/mcps/davinci-resolve-mcp/src/utils/media_pool_ingest_live_probe.py +0 -592
- package/mcps/davinci-resolve-mcp/src/utils/multicam.py +0 -393
- package/mcps/davinci-resolve-mcp/src/utils/object_inspection.py +0 -301
- package/mcps/davinci-resolve-mcp/src/utils/page_lock.py +0 -75
- package/mcps/davinci-resolve-mcp/src/utils/platform.py +0 -157
- package/mcps/davinci-resolve-mcp/src/utils/proc.py +0 -26
- package/mcps/davinci-resolve-mcp/src/utils/project_cleanup.py +0 -73
- package/mcps/davinci-resolve-mcp/src/utils/project_lifecycle_live_probe.py +0 -376
- package/mcps/davinci-resolve-mcp/src/utils/project_lint.py +0 -131
- package/mcps/davinci-resolve-mcp/src/utils/project_properties.py +0 -601
- package/mcps/davinci-resolve-mcp/src/utils/project_spec.py +0 -459
- package/mcps/davinci-resolve-mcp/src/utils/readback.py +0 -91
- package/mcps/davinci-resolve-mcp/src/utils/render_deliver_live_probe.py +0 -384
- package/mcps/davinci-resolve-mcp/src/utils/resolve_ai_governance.py +0 -214
- package/mcps/davinci-resolve-mcp/src/utils/resolve_ai_ledger.py +0 -244
- package/mcps/davinci-resolve-mcp/src/utils/resolve_busy.py +0 -171
- package/mcps/davinci-resolve-mcp/src/utils/resolve_connection.py +0 -77
- package/mcps/davinci-resolve-mcp/src/utils/review_annotation_live_probe.py +0 -352
- package/mcps/davinci-resolve-mcp/src/utils/script_templates.py +0 -1193
- package/mcps/davinci-resolve-mcp/src/utils/shot_relationships.py +0 -544
- package/mcps/davinci-resolve-mcp/src/utils/structural_diff.py +0 -175
- package/mcps/davinci-resolve-mcp/src/utils/sync_detection.py +0 -889
- package/mcps/davinci-resolve-mcp/src/utils/timeline_brain_db.py +0 -826
- package/mcps/davinci-resolve-mcp/src/utils/timeline_conform_live_probe.py +0 -280
- package/mcps/davinci-resolve-mcp/src/utils/timeline_kernel_live_probe.py +0 -1092
- package/mcps/davinci-resolve-mcp/src/utils/timeline_kernel_probe.py +0 -185
- package/mcps/davinci-resolve-mcp/src/utils/timeline_title_text.py +0 -87
- package/mcps/davinci-resolve-mcp/src/utils/timeline_versioning.py +0 -730
- package/mcps/davinci-resolve-mcp/src/utils/update_check.py +0 -685
- package/mcps/vectorworks-mcp/.dockerignore +0 -8
- package/mcps/vectorworks-mcp/Dockerfile +0 -28
- package/mcps/vectorworks-mcp/README.md +0 -156
- package/mcps/vectorworks-mcp/app/__init__.py +0 -2
- package/mcps/vectorworks-mcp/app/api.py +0 -52
- package/mcps/vectorworks-mcp/app/chunking.py +0 -56
- package/mcps/vectorworks-mcp/app/config.py +0 -29
- package/mcps/vectorworks-mcp/app/embeddings.py +0 -28
- package/mcps/vectorworks-mcp/app/indexer.py +0 -106
- package/mcps/vectorworks-mcp/app/main.py +0 -33
- package/mcps/vectorworks-mcp/app/mcp_server.py +0 -71
- package/mcps/vectorworks-mcp/app/search.py +0 -54
- package/mcps/vectorworks-mcp/app/utils.py +0 -14
- package/mcps/vectorworks-mcp/data/.gitkeep +0 -1
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_PluginScript.htm +0 -95
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_ScriptEditor.htm +0 -266
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2022_Scripting.htm +0 -106
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2023_CreatingScriptedPlugins.htm +0 -327
- package/mcps/vectorworks-mcp/data/vw-app-help/VW2024_RunningScripts.htm +0 -116
- package/mcps/vectorworks-mcp/data/vw-devwiki/VS_Function_Reference_category.html +0 -2129
- package/mcps/vectorworks-mcp/data/vw-jp-ref/ObjectsSymbols.html +0 -2035
- package/mcps/vectorworks-mcp/data/vw-jp-ref/ScriptFunctionReference.html +0 -29
- package/mcps/vectorworks-mcp/design.md +0 -57
- package/mcps/vectorworks-mcp/docker-compose.yml +0 -18
- package/mcps/vectorworks-mcp/index/.gitkeep +0 -1
- package/mcps/vectorworks-mcp/index/meta.jsonl +0 -3956
- package/mcps/vectorworks-mcp/index/vw.faiss +0 -0
- package/mcps/vectorworks-mcp/requirements.txt +0 -10
- package/mcps/vectorworks-mcp/scripts/fetch_docs_minimal.sh +0 -84
- package/mcps/vectorworks-mcp/scripts/fetch_github_vectorworks.sh +0 -85
- package/mcps/vectorworks-mcp/templates/index.html +0 -40
- package/scripts/ecosystem-health-audit.js +0 -257
- package/skills/bdb-dev-os-skill/SKILL.md +0 -49
- package/skills/bdb-dev-os-skill/package.json +0 -11
- package/skills/bdbsaastraining/SKILL.md +0 -316
- package/skills/bdbsaastraining/references/exam-pool.md +0 -313
- package/skills/bdbsaastraining/references/interaction-modes.md +0 -94
- package/skills/bdbsaastraining/references/track-a-ai-agent.md +0 -111
- package/skills/bdbsaastraining/references/track-b-wordpress.md +0 -111
- package/skills/bdbsaastraining/references/track-c-mailserver.md +0 -107
- package/skills/bdbsaastraining/references/track-d-debian.md +0 -109
- package/skills/bdbsaastraining/references/track-e-custom.md +0 -83
- package/skills/bdbsaastraining/scripts/build_profile.py +0 -529
- package/skills/bdbsaastraining/scripts/generate_certificate.py +0 -161
- package/skills/bdbsaastraining/scripts/preflight_check.sh +0 -150
- package/skills/bdbsaastraining/templates/certificate_template.html +0 -508
- package/skills/global_config/bdb-ecosystem-health/SKILL.md +0 -68
- package/skills/global_config/bdbsaas-ops/SKILL.md +0 -16
- package/skills/global_config/bdbsaashost/SKILL.md +0 -125
|
@@ -1,2648 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
Release history for the DaVinci Resolve MCP Server. The latest release is summarized in the root README; older entries live here to keep the README focused.
|
|
4
|
-
|
|
5
|
-
## What's New in v2.57.5
|
|
6
|
-
|
|
7
|
-
Fixes a silent data-loss bug on Reel Name writes (issue #77) and bundles the
|
|
8
|
-
community-contributed API-limitation entries from PR #76 (issue #75).
|
|
9
|
-
|
|
10
|
-
- **Fixed** (#77) `set_clip_property` / `set_metadata` reporting `success: true`
|
|
11
|
-
when writing the `Reel Name` clip property even though Resolve silently
|
|
12
|
-
dropped the value. Resolve gates `Reel Name` behind the project setting
|
|
13
|
-
*General Options > Assist using reel names from the:* — when that derives reel
|
|
14
|
-
names automatically, scripted writes are ignored but still return `True`. On a
|
|
15
|
-
batch ingest this meant hundreds of clips believed to have reel names assigned
|
|
16
|
-
when none actually stuck. The server now reads the value back after writing
|
|
17
|
-
known-unreliable keys and refuses to report success on mismatch, surfacing the
|
|
18
|
-
project-setting gate as a `hint`. Wired into `set_clip_property`,
|
|
19
|
-
`set_metadata` (both forms), and the bulk `normalize_metadata` path. Adds an
|
|
20
|
-
`api_truth` bug entry (report now lists 18 missing + 11 bugs) and 10 unit
|
|
21
|
-
tests.
|
|
22
|
-
- **Added** (PR #76, thanks @swayll) four `submit: missing` API-limitation
|
|
23
|
-
entries verified on Resolve 21.0.0: per-subtitle text/timing editing, subtitle
|
|
24
|
-
track styling/presets, speech-recognition engine selection + SRT import, and
|
|
25
|
-
Media Pool folder rename. These document the API ceiling behind the subtitle
|
|
26
|
-
feature request in #75 — direct subtitle text editing and SRT round-trip are
|
|
27
|
-
not exposed by the Blackmagic scripting API.
|
|
28
|
-
|
|
29
|
-
### Validation
|
|
30
|
-
|
|
31
|
-
- Offline: full unit suite green; new `tests/test_reel_name_writeback.py` (10
|
|
32
|
-
tests) plus the api_truth/limitations drift guards. Live Resolve validation of
|
|
33
|
-
the Reel Name read-back is recommended but not performed here — forcing the
|
|
34
|
-
gate would require writing reel names into a live project's media metadata.
|
|
35
|
-
|
|
36
|
-
## What's New in v2.57.4
|
|
37
|
-
|
|
38
|
-
Live mutating verification of the catalogued API gaps.
|
|
39
|
-
|
|
40
|
-
- **Added** `tests/live_api_gap_verification.py` — attempts each catalogued
|
|
41
|
-
"missing capability" against a disposable project built from synthetic ffmpeg
|
|
42
|
-
media, recording the failing call alongside a positive control that succeeds.
|
|
43
|
-
All 8 surface-audited gaps confirmed missing on Resolve Studio 21.0.0:
|
|
44
|
-
`SetProperty('Speed', …)` / audio-level keys return False while
|
|
45
|
-
`RetimeProcess` / video-transform keys succeed; trim/move/split/proxy/node-
|
|
46
|
-
graph/Smart-Bin methods are absent (by `dir()`), while append/CDL/AddSubFolder
|
|
47
|
-
controls work.
|
|
48
|
-
- **Added** a new bug entry: `hasattr()`/`getattr()` are unusable on Resolve
|
|
49
|
-
objects — the Python bridge fabricates a callable for ANY attribute name, so
|
|
50
|
-
capability detection must use `dir()`. (Discovered when the first harness pass
|
|
51
|
-
reported nonexistent methods as present.) Report now lists 14 missing + 10 bugs.
|
|
52
|
-
- **Changed** the report's Scope note to record the live mutating-harness
|
|
53
|
-
methodology and the `hasattr` caveat. Strengthened the clip-speed and
|
|
54
|
-
Fairlight-audio entries with the live `SetProperty` rejection evidence (and
|
|
55
|
-
noted that `'Pan'` is the video-transform key, not audio pan).
|
|
56
|
-
|
|
57
|
-
## What's New in v2.57.3
|
|
58
|
-
|
|
59
|
-
Expanded the API-limitations catalogue with a live surface audit.
|
|
60
|
-
|
|
61
|
-
- **Added** 8 newly-catalogued **missing capabilities** to
|
|
62
|
-
`docs/reference/api-limitations.md`, found by a `dir()` audit of the live
|
|
63
|
-
Resolve 21.0.0 API objects diffed against the UI feature set: timeline-item
|
|
64
|
-
trim/move/re-time (getters only, no setters), razor/blade/split, clip
|
|
65
|
-
speed/retime ratio & ramps, color node-graph editing + primary grade values,
|
|
66
|
-
Fairlight audio levels/pan/EQ/automation/FairlightFX, proxy/optimized-media
|
|
67
|
-
generation, insert/overwrite/replace/fit-to-fill edit modes, and Smart/Power
|
|
68
|
-
Bin creation. The report now lists 14 missing capabilities + 9 bugs.
|
|
69
|
-
- **Verified** the four previously-doc-derived entries (per-clip audio
|
|
70
|
-
stereo↔mono, native multicam creation, transitions, cloud list/export/user)
|
|
71
|
-
against the live API surface; all confirmed absent.
|
|
72
|
-
- **Changed** the generated report to carry an explicit **Scope & completeness**
|
|
73
|
-
note — it is not guaranteed exhaustive (surface audit + incident log; misses
|
|
74
|
-
parameters that exist-but-misbehave and untested capabilities).
|
|
75
|
-
|
|
76
|
-
## What's New in v2.57.2
|
|
77
|
-
|
|
78
|
-
Consolidated, submittable list of Resolve scripting-API limitations.
|
|
79
|
-
|
|
80
|
-
- **Added** `docs/reference/api-limitations.md` — a curated, behaviorally-verified
|
|
81
|
-
catalogue of Resolve scripting-API gaps and bugs, split into **Missing
|
|
82
|
-
Capabilities** (please add) and **Bugs / Unreliable Behavior** (please fix),
|
|
83
|
-
formatted for submission to Blackmagic Design's developer feedback. First cut:
|
|
84
|
-
6 missing capabilities (Source Track Selector / insert `trackIndex`, per-clip
|
|
85
|
-
audio stereo↔mono, native multicam-clip creation, transition create/copy,
|
|
86
|
-
`GetTimelineByName`, cloud project list/export/user management) and 9
|
|
87
|
-
bugs/unreliable behaviors (enum-key silent failures in `AutoSyncAudio`,
|
|
88
|
-
`CreateSubtitlesFromAudio`, CloudProject family, and `Timeline.Export`; flaky
|
|
89
|
-
`DeleteProject`; `Composition.Paste` bridge failure; `FlowView` unreliable
|
|
90
|
-
returns; truncated `Transcription` property; automation-blocking `CreateProject`
|
|
91
|
-
modal).
|
|
92
|
-
- **Added** `scripts/gen_api_limitations.py` — the report is generated from the
|
|
93
|
-
`submit`-tagged entries in the `api_truth` ledger (single source of truth, also
|
|
94
|
-
queryable at runtime via `resolve_control api_truth`), so it never drifts.
|
|
95
|
-
- **Changed** the release process and CI to keep it current: a new
|
|
96
|
-
`tests.test_api_limitations_doc` drift guard (added to the publish workflow)
|
|
97
|
-
fails if the doc is stale, and `docs/process/release-process.md` now requires
|
|
98
|
-
regenerating it whenever a `submit`-tagged entry changes.
|
|
99
|
-
|
|
100
|
-
## What's New in v2.57.1
|
|
101
|
-
|
|
102
|
-
Investigation outcome for community feature request #74 — no behavior change.
|
|
103
|
-
|
|
104
|
-
- **Note** (issue #74) the DaVinci Resolve scripting API does not expose the
|
|
105
|
-
Source/Auto Track Selector, so there is no way to choose the destination track
|
|
106
|
-
when inserting Text+/titles/generators. Verified live on Resolve Studio 21.0.0:
|
|
107
|
-
no get/set for the selector exists; the `Insert*IntoTimeline` family takes no
|
|
108
|
-
`trackIndex` and always lands on V1; locking lower tracks makes the insert fail
|
|
109
|
-
rather than redirect; and titles/generators can't be relocated afterward (no
|
|
110
|
-
`MediaPoolItem`). Closed as won't-fix (API limitation).
|
|
111
|
-
- **Documentation** recorded the limitation in the verified `api_truth` ledger
|
|
112
|
-
(query at runtime with `resolve_control api_truth "track"`) and in
|
|
113
|
-
`docs/reference/api-coverage.md`, with the supported alternative for
|
|
114
|
-
media-backed clips (`MediaPool.AppendToTimeline` clipInfo `trackIndex`, exposed
|
|
115
|
-
as `media_pool.append_to_timeline` `clip_infos`). Added a regression test.
|
|
116
|
-
|
|
117
|
-
## What's New in v2.57.0
|
|
118
|
-
|
|
119
|
-
Community feature requests #72 and #73.
|
|
120
|
-
|
|
121
|
-
- **Added** OpenCode to the installer's supported MCP clients (issue #72). The
|
|
122
|
-
installer now writes/merges `~/.config/opencode/opencode.json` using OpenCode's
|
|
123
|
-
own schema (`type`/`enabled`, a combined `command` array, and an `environment`
|
|
124
|
-
block), and `--manual` prints a ready-to-paste OpenCode snippet.
|
|
125
|
-
- **Added** `fusion_comp(action="add_fusion_mask", ...)` (issue #73): a one-call
|
|
126
|
-
Rectangle/Ellipse mask — adds the mask tool, sets its params (`corner_radius`,
|
|
127
|
-
`width`, `height`, `center`/`center_x`/`center_y`, etc., all 0..1), and
|
|
128
|
-
optionally wires it into a tool's mask input (`EffectMask` by default). Each
|
|
129
|
-
input is applied independently so one unsupported parameter never aborts the rest.
|
|
130
|
-
- **Added** `fusion_comp(action="set_text_plus" / "get_text_plus", ...)` (issue
|
|
131
|
-
#73): read/write the text of a Fusion `Text+` tool or Fusion title template
|
|
132
|
-
(e.g. a "Deep" title), auto-finding the `Text+` tool when `tool_name` is
|
|
133
|
-
omitted. Complements `timeline(action="set_title_text")` for generator titles.
|
|
134
|
-
- **Note** (issue #73) per-clip audio Stereo↔Mono conversion is not in
|
|
135
|
-
Blackmagic's scripting API and was not added. The supported surface is already
|
|
136
|
-
exposed: `timeline get_track_sub_type` (query channel format), `add_track` with
|
|
137
|
-
`audioType` (create mono/stereo tracks), `convert_to_stereo` (timeline-wide),
|
|
138
|
-
and `timeline_item get_source_audio_channel_mapping`.
|
|
139
|
-
|
|
140
|
-
## What's New in v2.56.1
|
|
141
|
-
|
|
142
|
-
Final reliability batch from the exhaustive audit (Wave B + P2/P3 selections).
|
|
143
|
-
|
|
144
|
-
- **Fixed** (EX11) `audio_track_probe` reported `available: true` for track index 0
|
|
145
|
-
(and negatives); audio tracks are 1-indexed, so it now requires
|
|
146
|
-
`1 <= index <= track_count`.
|
|
147
|
-
- **Fixed** (EX10) `_find_timeline_item_by_id` no longer silently skips a whole
|
|
148
|
-
track type when `GetTrackCount` errors — it logs the failure so a real API error
|
|
149
|
-
isn't mistaken for "item not found".
|
|
150
|
-
- **Fixed** (P3) the raw `timeline_item_color.set_cdl` now validates the ASC-CDL
|
|
151
|
-
payload (shape/ranges) before `SetCDL`, matching its safe twin — malformed CDL
|
|
152
|
-
returns a structured error instead of being silently rejected by Resolve.
|
|
153
|
-
- **Fixed** (P2) `media_pool.delete_timelines` is read-back verified: it reports
|
|
154
|
-
`verified` from the project's timeline count dropping, not the unreliable boolean.
|
|
155
|
-
`import_folder` now validates its required `path`.
|
|
156
|
-
|
|
157
|
-
## What's New in v2.56.0
|
|
158
|
-
|
|
159
|
-
Destructive-action registry audit (EX-REG) — a systemic version of the EX2 bug.
|
|
160
|
-
|
|
161
|
-
Many destructive actions were registered under the **wrong tool key**, so
|
|
162
|
-
`is_destructive()` returned False and **version-on-mutate archiving / change
|
|
163
|
-
logging silently never fired** for them. Examples: `create_timeline`,
|
|
164
|
-
`auto_sync_audio`, `create_stereo_clip`, `append_to_timeline` were filed under
|
|
165
|
-
`timeline` though `media_pool` dispatches them; `set_cdl`, `copy_grades`,
|
|
166
|
-
`export_lut`, the version ops were under `timeline_item` though
|
|
167
|
-
`timeline_item_color` dispatches them; the Fusion-comp and take actions used stale
|
|
168
|
-
names (`add_fusion_comp`, `delete_take`) that matched no real handler.
|
|
169
|
-
|
|
170
|
-
- **Fixed** rebuilt `DESTRUCTIVE_ACTIONS_BY_TOOL` so every action is keyed under
|
|
171
|
-
the tool that actually dispatches it (stale names mapped to real ones:
|
|
172
|
-
`*_fusion_comp` → `*_comp`, `*_take` → `add`/`delete`/`select`/`finalize`,
|
|
173
|
-
`import_into` → `import_into_timeline`, `create_subtitles_from_audio` →
|
|
174
|
-
`create_subtitles`). Inert entries whose tool isn't governed (media_pool_item
|
|
175
|
-
`replace_clip`/`link_*`) were dropped. Catastrophic take/Fusion-comp deletes and
|
|
176
|
-
the media-pool create/sync ops are now archived as intended.
|
|
177
|
-
- **Added** the registry-drift guard now asserts *every* registry action is a real
|
|
178
|
-
handler of its tool (broad check enabled), so this class can't regress.
|
|
179
|
-
|
|
180
|
-
## What's New in v2.55.2
|
|
181
|
-
|
|
182
|
-
Deep-QC P1 1b — required-param validation. Mutating/destructive actions that
|
|
183
|
-
hard-indexed required params (`p["name"]`, `p["index"]`, `p["color"]`, …) now
|
|
184
|
-
return a structured error instead of crashing with an unhandled `KeyError` (or,
|
|
185
|
-
for `set_clip_enabled`/`set_current`, coercing the value). Guarded actions:
|
|
186
|
-
|
|
187
|
-
- `timeline`: `set_current`, `set_name`, `set_start_timecode`, `add_track`
|
|
188
|
-
- `timeline_item`: `set_property`, `set_clip_enabled`
|
|
189
|
-
- `project_manager`: `create`, `load`, `import_project`, `export_project`,
|
|
190
|
-
`archive`, `restore`
|
|
191
|
-
- marker `delete_by_color` (clip / timeline / item — destructive)
|
|
192
|
-
- `layout_presets`: `save`, `export`; `project_settings`: `set_name`, `set_setting`
|
|
193
|
-
|
|
194
|
-
## What's New in v2.55.1
|
|
195
|
-
|
|
196
|
-
Deep-QC P1 — settings/options whitelisting + DeleteProject reliability.
|
|
197
|
-
|
|
198
|
-
- **Fixed** options/settings dicts passed to several Resolve APIs are now
|
|
199
|
-
whitelisted to their documented keys, so a typo'd key is reported instead of
|
|
200
|
-
silently dropped (`_filter_to_keys` → `ignored_options`/`ignored_settings`):
|
|
201
|
-
`media_pool.import_timeline` (ImportTimelineFromFile), `timeline.import_into_timeline`
|
|
202
|
-
(ImportIntoTimeline), raw `render.set_settings` (SetRenderSettings) and
|
|
203
|
-
`render.quick_export`, and `set_voice_isolation_state` (track + item).
|
|
204
|
-
- **Fixed** `ProjectManager.DeleteProject` is flaky — it silently returns False
|
|
205
|
-
when the target is/was the current project. All callers (the safe and raw
|
|
206
|
-
`project_manager.delete` actions and the granular `delete_project`) now route
|
|
207
|
-
through `delete_project_safely` (switch-away + retry) and report `delete_detail`.
|
|
208
|
-
Added an `api_truth` entry.
|
|
209
|
-
- **Added** a destructive-registry drift guard (`tests/test_destructive_registry_drift.py`)
|
|
210
|
-
that asserts token-gated actions map to real handlers and locks in the media-pool
|
|
211
|
-
delete governance from v2.55.0. (It also surfaced a pre-existing registry
|
|
212
|
-
mis-keying issue now tracked for a dedicated audit.)
|
|
213
|
-
|
|
214
|
-
## What's New in v2.55.0
|
|
215
|
-
|
|
216
|
-
Governance for catastrophic Media Pool deletes (exhaustive audit EX2/EX3).
|
|
217
|
-
|
|
218
|
-
**Behavior change:** `media_pool` `delete_clips`, `delete_folders`, and
|
|
219
|
-
`delete_timelines` now require a confirm token, the same two-step handshake
|
|
220
|
-
`timeline.delete_track` already uses — the first call returns
|
|
221
|
-
`status: "confirmation_required"` with a `confirm_token` and a preview (count +
|
|
222
|
-
names); re-call with `params.confirm_token` to execute. Callers that disable
|
|
223
|
-
gating via the `destructive.require_confirm_token=false` preference are
|
|
224
|
-
unaffected.
|
|
225
|
-
|
|
226
|
-
- **Fixed** the destructive-action registry listed granular function names
|
|
227
|
-
(`delete_media_pool_clips`, `move_media_pool_folders`, …) that the compound
|
|
228
|
-
`media_pool` tool never dispatches, so `is_destructive()` returned False and
|
|
229
|
-
these catastrophic deletes silently skipped version-on-mutate archiving and
|
|
230
|
-
change logging. The registry now uses the real compound action strings, so the
|
|
231
|
-
deletes are archived/logged as intended.
|
|
232
|
-
- **Added** confirm-token gating + previews to the three deletes (EX3). The
|
|
233
|
-
registry fix also re-enables the existing media-pool change log for them.
|
|
234
|
-
- Live-validated against DaVinci Resolve Studio 21.0.0 (non-destructively): the
|
|
235
|
-
no-token call returns `confirmation_required` and deletes nothing.
|
|
236
|
-
|
|
237
|
-
## What's New in v2.54.5
|
|
238
|
-
|
|
239
|
-
Reliability + security hardening from the exhaustive reliability audit (Wave A).
|
|
240
|
-
|
|
241
|
-
- **Security** `apply_spec` hooks no longer run with `shell=True`. A spec's hook
|
|
242
|
-
command is now `shlex`-split and executed without a shell, so a hook string
|
|
243
|
-
can't inject arbitrary shell (`; rm -rf …`, pipes, expansion). Hooks needing
|
|
244
|
-
shell features must invoke an interpreter explicitly (e.g. `bash -c "…"`).
|
|
245
|
-
- **Fixed** the confirm-token table (`_CONFIRM_TOKENS`) is now guarded by a lock.
|
|
246
|
-
The control panel is threaded, so issue/consume/GC ran concurrently; validate-
|
|
247
|
-
then-pop is now atomic and GC can't race a write.
|
|
248
|
-
- **Fixed** negative item indices are rejected instead of silently returning the
|
|
249
|
-
wrong item (Python reverse-indexing): `_get_item`, the audio item resolver, and
|
|
250
|
-
the two timeline-matte helpers now require `0 <= index < len`.
|
|
251
|
-
- **Fixed** history queries clamp `limit` to `[1, 1000]`. SQLite treats a negative
|
|
252
|
-
`LIMIT` as "no limit", so a negative value could silently fetch the entire table
|
|
253
|
-
(`get_brain_edit_history`, `list_runs`, `get_media_pool_change_history`).
|
|
254
|
-
`timeline_versioning` version/limit/keep_n params are now validated (no unhandled
|
|
255
|
-
`ValueError`; `rollback` rejects negative versions before archiving). `max_files`
|
|
256
|
-
/`max_seconds` in the relink file search are clamped positive.
|
|
257
|
-
- **Fixed** the server-reachable ffmpeg probes (render, audio, review) now pass
|
|
258
|
-
`timeout=120` so a hung ffmpeg can't block the server indefinitely.
|
|
259
|
-
|
|
260
|
-
(Deferred to a live-validated follow-up: confirm-token gating + archiving for
|
|
261
|
-
catastrophic media-pool/take/fusion deletes, and temp-directory lifecycle cleanup.)
|
|
262
|
-
|
|
263
|
-
## What's New in v2.54.4
|
|
264
|
-
|
|
265
|
-
Persistence-safety hardening (generalizes issue #71 to the analysis state
|
|
266
|
-
stores). A multi-agent audit found several state files whose **readers** swallow a
|
|
267
|
-
`JSONDecodeError` and reset to an empty default — so a later read-modify-write
|
|
268
|
-
writes back only the new field, silently wiping prior data. Atomic writes don't
|
|
269
|
-
help, because the loss happens at *read* time.
|
|
270
|
-
|
|
271
|
-
- **Fixed** read-modify-write paths now read strictly and **refuse to overwrite**
|
|
272
|
-
a corrupt existing file (via a shared `ConfigParseError` + `_read_json_strict`),
|
|
273
|
-
rather than clobbering it:
|
|
274
|
-
- media-analysis **preferences** — 5 write paths (set-defaults, timed-marker
|
|
275
|
-
default, sampling-mode default, AI governance, caps preset)
|
|
276
|
-
- **update-state** — configure/clear update settings (3 paths), now also written
|
|
277
|
-
atomically (temp + `os.replace`)
|
|
278
|
-
- per-clip **corrections** (human edit history — the highest-value store) —
|
|
279
|
-
update and revert paths
|
|
280
|
-
- **Fixed** non-atomic writes that a crash mid-write could truncate: the bin
|
|
281
|
-
summary markdown and Fusion `.setting` files now write to a temp file and
|
|
282
|
-
`os.replace`.
|
|
283
|
-
- **Fixed** a read-modify-write race on `analysis.json` under the threaded control
|
|
284
|
-
panel: transcript regeneration is now serialized under the existing state lock,
|
|
285
|
-
so a concurrent regen/batch write can't drop the other's updates.
|
|
286
|
-
- Read-only callers keep their forgiving behavior (they fall back to defaults and
|
|
287
|
-
never write). New tests in `tests/test_persistence_safety.py`.
|
|
288
|
-
|
|
289
|
-
## What's New in v2.54.3
|
|
290
|
-
|
|
291
|
-
Follow-up to the v2.54.2 config-merge fix (#71): the JSONC sanitizer's
|
|
292
|
-
trailing-comma step was not string-aware.
|
|
293
|
-
|
|
294
|
-
- **Fixed** `_strip_jsonc` removed trailing commas with a regex applied to the
|
|
295
|
-
whole document, so a comma inside a string value followed by whitespace and a
|
|
296
|
-
closing brace/bracket — e.g. `"greeting": "hello, } world"` — had the comma
|
|
297
|
-
silently stripped *from inside the string* when merging a commented (JSONC)
|
|
298
|
-
client config. The trailing-comma pass is now string-aware (mirroring the
|
|
299
|
-
comment stripper), so string contents are never altered while real trailing
|
|
300
|
-
commas are still removed. Added regression tests covering string values that
|
|
301
|
-
contain `, }` / `, ]`. (Dropped the now-unused `re` import.)
|
|
302
|
-
|
|
303
|
-
## What's New in v2.54.2
|
|
304
|
-
|
|
305
|
-
A destructive-overwrite bug in the installer (issue #71): the MCP client setup
|
|
306
|
-
step could wipe a user's entire editor settings file instead of merging into it.
|
|
307
|
-
|
|
308
|
-
- **Fixed** `install.py` silently destroyed existing client config files whose
|
|
309
|
-
contents weren't strict JSON. `read_json` swallowed `JSONDecodeError` and
|
|
310
|
-
returned `{}`, so the subsequent "merge" wrote a file containing *only* the
|
|
311
|
-
`davinci-resolve` server entry — wiping themes, terminal env vars, LSP
|
|
312
|
-
settings, keybindings, everything else. Zed was the reported victim because
|
|
313
|
-
its `settings.json` ships with `//` comments (JSONC), but the same latent
|
|
314
|
-
risk existed for **every** supported client — VS Code and Continue also accept
|
|
315
|
-
JSONC. The fix is centralized in the single read/merge path so all clients are
|
|
316
|
-
covered:
|
|
317
|
-
- `read_json` now best-effort strips JSONC `//` and `/* */` comments and
|
|
318
|
-
trailing commas (string-aware, so comment markers inside string values are
|
|
319
|
-
preserved), letting commented configs merge cleanly instead of being lost.
|
|
320
|
-
- When a config file exists but still can't be parsed after that, the
|
|
321
|
-
installer **refuses to overwrite it** and tells the user to add the entry
|
|
322
|
-
manually — rather than silently replacing their settings.
|
|
323
|
-
- **Added** regression tests covering JSONC merge, plain-JSON merge,
|
|
324
|
-
refuse-to-overwrite on unparseable files, fresh-file creation, and
|
|
325
|
-
string-aware comment stripping.
|
|
326
|
-
|
|
327
|
-
## What's New in v2.54.1
|
|
328
|
-
|
|
329
|
-
One more instance of the enum-keyed silent-failure class (issue #70), plus a
|
|
330
|
-
guard so the next one can't ship unnoticed.
|
|
331
|
-
|
|
332
|
-
- **Fixed** the raw `timeline.export` action passed `type`/`subtype` straight to
|
|
333
|
-
`Timeline.Export`, which needs resolved `resolve.EXPORT_*` enum *values* — a
|
|
334
|
-
JSON/MCP caller can't pass a live enum, so the action silently wrote nothing
|
|
335
|
-
for every caller. It now resolves friendly format names (and `EXPORT_*`
|
|
336
|
-
constant names) via the same `_timeline_export_spec` resolver that
|
|
337
|
-
`export_timeline_checked` uses, and reports the resolved `export_type`/
|
|
338
|
-
`export_subtype`.
|
|
339
|
-
- **Fixed** `export_timeline_checked` resolved enum constants against the module
|
|
340
|
-
global `resolve` (which can be `None` and silently degrade the `EXPORT_*` args
|
|
341
|
-
to strings); it now uses `get_resolve()`, matching the issue-#70 lesson.
|
|
342
|
-
- **Added** an `api_truth` ↔ mitigation guard test: every `enum`-tagged catalog
|
|
343
|
-
entry must declare a `mitigation` (the resolver/wrapper functions), each of
|
|
344
|
-
which must exist in `src.server`. The next raw enum passthrough — a documented
|
|
345
|
-
symbol with no real resolver, or a renamed/removed resolver — now fails CI.
|
|
346
|
-
Added a `Timeline.Export` catalog entry and wired `mitigation` onto the
|
|
347
|
-
`AutoSyncAudio`, `CreateSubtitlesFromAudio`, and CloudProject entries.
|
|
348
|
-
|
|
349
|
-
## What's New in v2.54.0
|
|
350
|
-
|
|
351
|
-
Hardens the rest of the enum-keyed settings APIs against the same silent-failure
|
|
352
|
-
class fixed for `AutoSyncAudio` in v2.53.0 (issue #70). Several Resolve methods
|
|
353
|
-
key their settings dict by `resolve.<CONST>` enum attributes and silently reject
|
|
354
|
-
the whole call when handed plain string keys — returning `False`/`None` with
|
|
355
|
-
nothing applied and no error.
|
|
356
|
-
|
|
357
|
-
- **Fixed** `CreateSubtitlesFromAudio` (both `timeline_ai.create_subtitles` and
|
|
358
|
-
`timeline.subtitle_generation_probe`) now resolves human-readable
|
|
359
|
-
`autoCaptionSettings` — `language`, `preset`, `line_break`, `chars_per_line`,
|
|
360
|
-
`gap` — into live `SUBTITLE_*`/`AUTO_CAPTION_*` enum keys/values. Unknown keys
|
|
361
|
-
and unresolvable values are dropped and reported in `ignored_settings` instead
|
|
362
|
-
of poisoning the call, and generation is read-back verified against the
|
|
363
|
-
timeline's subtitle track count (the boolean return is unreliable).
|
|
364
|
-
- **Fixed** the `ProjectManager` CloudProject family (`create`/`load`/
|
|
365
|
-
`import_project`/`restore`) resolves `{cloudSettings}` into live
|
|
366
|
-
`CLOUD_SETTING_*`/`CLOUD_SYNC_*` enums (`project_name`, `media_path`,
|
|
367
|
-
`is_collab`, `sync_mode`, `is_camera_access`), dropping unknown keys into
|
|
368
|
-
`ignored_settings`.
|
|
369
|
-
- **Changed** the string→enum resolution is now a shared `_resolve_enum_settings`
|
|
370
|
-
primitive driven by per-field specs, so the next enum-keyed API gets the same
|
|
371
|
-
treatment without re-implementing it.
|
|
372
|
-
- **Added** `api_truth` entries for `Timeline.CreateSubtitlesFromAudio` and the
|
|
373
|
-
CloudProject family, documenting the silent-rejection + unreliable-return
|
|
374
|
-
behavior alongside the existing `AutoSyncAudio` entry.
|
|
375
|
-
|
|
376
|
-
## What's New in v2.53.0
|
|
377
|
-
|
|
378
|
-
Two improvements to audio sync reliability and inventory control.
|
|
379
|
-
|
|
380
|
-
`safe_auto_sync_audio` / `media_pool.auto_sync_audio` no longer fail silently on
|
|
381
|
-
human-readable settings (issue #70). The previous normalizer recognized
|
|
382
|
-
`syncBy`/`mode` but not `method`, and it forwarded *every* unrecognized key
|
|
383
|
-
(`group_id`, `primary_clip_id`, …) straight into `MediaPool.AutoSyncAudio` —
|
|
384
|
-
which silently rejects the whole call when it sees a key it doesn't understand,
|
|
385
|
-
returning `False` with nothing linked and no error.
|
|
386
|
-
|
|
387
|
-
- **Fixed** `method` (matching the tool's own parameter naming) is now accepted
|
|
388
|
-
as an alias for the sync mode alongside `syncBy`/`sync_by`/`mode`/`syncMode`.
|
|
389
|
-
- **Fixed** unrecognized settings keys are dropped instead of forwarded, so a
|
|
390
|
-
stray `group_id`/`primary_clip_id` no longer poisons the call. Dropped keys
|
|
391
|
-
are reported back in a new `ignored_settings` field on the response, so a
|
|
392
|
-
rejection is no longer invisible.
|
|
393
|
-
- **Fixed** the raw `media_pool.auto_sync_audio` action now routes settings
|
|
394
|
-
through the same live `AUDIO_SYNC_*` enum resolution as the safe wrapper
|
|
395
|
-
(previously it passed strings straight through).
|
|
396
|
-
|
|
397
|
-
The Media Pool inventory walk is now configurable:
|
|
398
|
-
|
|
399
|
-
- **Added** `media_analysis.inventory_exclude_bins` — a comma-separated list of
|
|
400
|
-
folder names to skip entirely during the inventory walk (recursively). Empty
|
|
401
|
-
by default, so every folder is indexed unless you opt out.
|
|
402
|
-
- **Added** `media_analysis.inventory_limit` — the maximum clips to index per
|
|
403
|
-
walk, configurable from the control panel and `setup`. The hard ceiling is
|
|
404
|
-
raised from 2000 to 10000.
|
|
405
|
-
- Adapted from PR #69 by @rgxdev; the default was changed to exclude nothing
|
|
406
|
-
(the PR defaulted to excluding an `assets` bin, which would have silently
|
|
407
|
-
stopped indexing existing `assets` folders on upgrade).
|
|
408
|
-
|
|
409
|
-
## What's New in v2.52.1
|
|
410
|
-
|
|
411
|
-
Analysis reuse no longer blocks on missing capabilities when every clip is
|
|
412
|
-
satisfied by an existing report (issue #68). `build_plan` records
|
|
413
|
-
`capability_gaps` from the *requested* options before the per-clip reuse
|
|
414
|
-
decision runs; when a fully-reused plan only re-keys and imports existing
|
|
415
|
-
reports into the current root, no fresh transcription/vision/ffprobe happens,
|
|
416
|
-
so the missing-capability gate must not fire.
|
|
417
|
-
|
|
418
|
-
- **Fixed** the missing-capability gate is now evaluated against the clips that
|
|
419
|
-
still need fresh analysis, not the requested-options gaps. A clip is exempt
|
|
420
|
-
only when it both skips execution and has an existing report path; any clip
|
|
421
|
-
needing fresh work still enforces the gate.
|
|
422
|
-
- **Fixed** extended the exemption to the entry points that short-circuit
|
|
423
|
-
before `execute_plan_async` and were still blocking fully-reused runs: the
|
|
424
|
-
`media_analysis` analyze action, metadata-publish analysis, and batch-job
|
|
425
|
-
creation. The batch CLI `plan` preview no longer prints "Missing tools" for a
|
|
426
|
-
fully-reusable plan.
|
|
427
|
-
- **Changed** the reuse/capability logic is now a shared
|
|
428
|
-
`plan_requires_capabilities()` / `executing_clips()` helper, replacing the
|
|
429
|
-
duplicated inline comprehensions so every gate stays consistent.
|
|
430
|
-
- Includes PR #68 by @diesdaas, which fixed the inner `execute_plan_async` gate
|
|
431
|
-
and isolated the marker-param and host-vision tests from unrelated
|
|
432
|
-
capability/destructive-hook coupling.
|
|
433
|
-
|
|
434
|
-
## What's New in v2.52.0
|
|
435
|
-
|
|
436
|
-
`edit_engine` tighten now carries audio. Previously `execute_tighten`
|
|
437
|
-
assembled a video-only variant — a speech-driven dead-air cut came out
|
|
438
|
-
silent, with nothing in the preview or readback to warn you (issue #67).
|
|
439
|
-
|
|
440
|
-
- **Fixed** `plan_tighten` mirrors every kept video range onto its linked
|
|
441
|
-
audio track(s) with identical source frames, so the assembled variant
|
|
442
|
-
stays frame-locked and audible. Audio targets the item's detected linked
|
|
443
|
-
audio tracks (same `GetLinkedItems` matching `execute_swap` uses), falling
|
|
444
|
-
back to audio track 1 where a single linked A/V clip's audio lives.
|
|
445
|
-
- **Added** `include_audio` parameter to `plan_tighten` (default `true`).
|
|
446
|
-
Pass `include_audio=false` for the prior video-only assembly.
|
|
447
|
-
- **Added** an `audio_accounting` block to the `execute_tighten` confirm
|
|
448
|
-
preview and readback (planned vs. actual audio/video item counts), so a
|
|
449
|
-
silent variant can no longer ship unnoticed. Old video-only plans
|
|
450
|
-
re-executed against this build still work and are now loudly flagged as
|
|
451
|
-
silent.
|
|
452
|
-
|
|
453
|
-
## What's New in v2.51.0
|
|
454
|
-
|
|
455
|
-
CLAP audio embeddings — the final phase of the post-program improvements.
|
|
456
|
-
Detection-based like every other backend (never auto-installed); local
|
|
457
|
-
compute, so nothing touches the caps ledger.
|
|
458
|
-
|
|
459
|
-
- **Added** audio embedding backend detection: CLAP via `transformers`
|
|
460
|
-
(laion/clap-htsat-unfused, preferred) or the `laion_clap` package, plus
|
|
461
|
-
torch + ffmpeg. `capabilities` gains an `audio` block with install
|
|
462
|
-
guidance and a `clap_audio` Tools-page entry.
|
|
463
|
-
- **Added** `build_embeddings(kinds=["audio"])`: one CLAP window per shot
|
|
464
|
-
(center-cropped to ~10 s, piped from the source media as raw PCM —
|
|
465
|
-
read-only on source media, no temp files) plus a clip-level mean vector,
|
|
466
|
-
stored as `embedding_kind="audio"` rows. Idempotent via content hashes;
|
|
467
|
-
offline media is reported in `skipped_missing_media`; a missing backend
|
|
468
|
-
is a graceful skip with install guidance.
|
|
469
|
-
- **Added** `find_similar(kind="audio")`: shot/clip queries over the audio
|
|
470
|
-
vectors, and free-text queries ("engine revving") via the CLAP text
|
|
471
|
-
encoder.
|
|
472
|
-
|
|
473
|
-
## What's New in v2.50.0
|
|
474
|
-
|
|
475
|
-
The last JSON-fed readers now source from the DB-canonical analysis store
|
|
476
|
-
(consistency/perf hygiene — the JSON export is lockstep with the DB, so this
|
|
477
|
-
is shape-preserving by construction).
|
|
478
|
-
|
|
479
|
-
- **Changed** `summarize_reports` aggregates from the DB (blob + human
|
|
480
|
-
overlay) when every report dir on disk is covered by an ingested clip row;
|
|
481
|
-
pre-v9 roots and MIXED roots (some clips not ingested) fall back WHOLESALE
|
|
482
|
-
to the JSON walk — a partial DB view would silently under-report. The
|
|
483
|
-
summary gains a `"source": "db"|"json"` key for observability; the F1
|
|
484
|
-
provenance map (source_reports / missing_reports) is unchanged.
|
|
485
|
-
- **Changed** `build_analysis_index` sources local reports from the DB
|
|
486
|
-
instead of re-parsing every `analysis.json`; job-linked EXTERNAL report
|
|
487
|
-
paths (their rows live under another project's DB) and pre-v9 dirs keep
|
|
488
|
-
the JSON read. The FTS schema and the query surface are identical; the
|
|
489
|
-
result gains `report_sources` counts.
|
|
490
|
-
- **Added** DB-vs-JSON parity tests (semantic equality with normalized
|
|
491
|
-
ordering) plus wholesale-fallback regressions for mixed and pre-v9 roots;
|
|
492
|
-
live-validated on the sample analysis root (summary, index counts, and
|
|
493
|
-
FTS query results identical on both paths).
|
|
494
|
-
|
|
495
|
-
## What's New in v2.49.0
|
|
496
|
-
|
|
497
|
-
Cross-shot relationships (spec §4 — pattern recognition only): the shot
|
|
498
|
-
page's Relationships group finally fills, and the edit engine can prefer
|
|
499
|
-
vision-confirmed alternates.
|
|
500
|
-
|
|
501
|
-
- **Added** schema v12 `shot_relationships` (same_setup_as / alt_take_of
|
|
502
|
-
symmetric, continues_from directional — the source shot continues from
|
|
503
|
-
the target) with supersede semantics (current rows have
|
|
504
|
-
`superseded_at IS NULL`).
|
|
505
|
-
- **Added** `media_analysis` actions `detect_shot_relationships` /
|
|
506
|
-
`commit_shot_relationships` / `list_shot_relationships`: pairwise cosine
|
|
507
|
-
over the per-shot visual vectors (transcript continuity as a second
|
|
508
|
-
signal for continues_from) → a deferred confirmation payload with a
|
|
509
|
-
representative frame PAIR per candidate (caps pre-checked; candidates
|
|
510
|
-
live only in the detection-state stash until committed, so re-detect
|
|
511
|
-
never leaves ghosts) → vision-confirmed rows. Representative frames use
|
|
512
|
-
the shot's middle sample (first/last frames often catch fades).
|
|
513
|
-
- **Added** the shot page's Relationships group now renders from the DB
|
|
514
|
-
(`continues_from` shows on the continuing shot; cross-clip targets are
|
|
515
|
-
clip-qualified).
|
|
516
|
-
- **Changed** `plan_swap` prefers confirmed `alt_take_of` alternates over
|
|
517
|
-
raw cosine similarity — confirmed takes sort first (and are unioned in
|
|
518
|
-
even when the cosine search missed them); each alternate's rationale
|
|
519
|
-
states which basis ranked it.
|
|
520
|
-
|
|
521
|
-
## What's New in v2.48.1
|
|
522
|
-
|
|
523
|
-
Bug fix surfaced by the first real-cut tighten pilot.
|
|
524
|
-
|
|
525
|
-
- **Fixed** cross-root analysis reuse never landed in the current project's
|
|
526
|
-
DB: when the registry matched a reusable report from another project's
|
|
527
|
-
analysis root, `execute_plan_async` reported success but wrote no DB rows
|
|
528
|
-
and no local export — so `media_ref` lookups against the current media
|
|
529
|
-
pool (edit-engine planners, panel readers) found nothing. The reuse path
|
|
530
|
-
now re-keys the report to the current project's clip identity, ingests it
|
|
531
|
-
into the current root's DB, and writes a lockstep `analysis.json` export
|
|
532
|
-
(provenance kept in `reused_from`).
|
|
533
|
-
|
|
534
|
-
## What's New in v2.48.0
|
|
535
|
-
|
|
536
|
-
Edit-engine hardening: trustworthy execute readback ahead of the first
|
|
537
|
-
real-cut pilot. Live-validated end-to-end on a disposable synthetic-media
|
|
538
|
-
project (24/24 checks).
|
|
539
|
-
|
|
540
|
-
- **Added** `timeline_versioning(action="diff_timelines", params={from_timeline,
|
|
541
|
-
to_timeline})`: structural diff (added/removed/moved/trimmed + summary)
|
|
542
|
-
between two LIVE timelines by name — read-only, no archived snapshots
|
|
543
|
-
needed. Built for edit-engine variants, which are new-name timelines with
|
|
544
|
-
no shared version chain. The item walk and the snapshot comparison were
|
|
545
|
-
factored out of the version-snapshot path
|
|
546
|
-
(`capture_timeline_clip_usage` / `compare_usage_snapshots`) and reused.
|
|
547
|
-
- **Fixed** `execute_swap` audio accounting: the lift was video-only while
|
|
548
|
-
the replacement appended linked video+audio, so item counts drifted on
|
|
549
|
-
every swap. The lift is now scoped to the target's video track plus its
|
|
550
|
-
linked audio tracks (`GetLinkedItems`, with a media-id track-scan fallback;
|
|
551
|
-
items with no linked audio and audio-only timelines are handled
|
|
552
|
-
gracefully), and readback reports per-track-type `track_counts`
|
|
553
|
-
before/after plus an `audio_accounting` block.
|
|
554
|
-
- **Added** `execute_tighten` readback now includes `structural_diff`
|
|
555
|
-
(source vs variant); `execute_selects` readback includes a
|
|
556
|
-
`usage_summary` (per-track-type item counts — a diff against a source
|
|
557
|
-
timeline is meaningless for a fresh assembly).
|
|
558
|
-
- **Changed** the live edit-engine validation harness asserts the tighten
|
|
559
|
-
structural diff, `diff_timelines` agreement, and swap track-count
|
|
560
|
-
symmetry (24 checks, up from 20).
|
|
561
|
-
|
|
562
|
-
## What's New in v2.47.0
|
|
563
|
-
|
|
564
|
-
Edit-engine plan browser in the control panel (Media → Edit Plans) — the
|
|
565
|
-
panel UX pass for the v2.45.0 edit engine. Chat-first: the panel surfaces
|
|
566
|
-
plans and evidence; execution stays in chat behind the confirm-token gate.
|
|
567
|
-
|
|
568
|
-
- **Added** a plan browser at `#analysis/review/plans`: every saved
|
|
569
|
-
`edit_engine` plan with kind, summary, save time, and an `executed` chip;
|
|
570
|
-
fingerprint-corrupt plans surface as warning rows instead of being hidden.
|
|
571
|
-
- **Added** plan detail views per kind: selects decisions render with shot
|
|
572
|
-
thumbnails, rank, duration, rationale, and a deep link to the shot page;
|
|
573
|
-
tighten plans list each dead-air lift with its transcript-gap evidence and
|
|
574
|
-
skipped items; swap plans show the current item plus numbered alternates
|
|
575
|
-
with similarity scores. Executed plans show their execution readback.
|
|
576
|
-
- **Added** a copyable per-kind execute chat prompt on each plan (the panel
|
|
577
|
-
never executes; swaps include an `alternate_index` placeholder).
|
|
578
|
-
- **Added** `/api/edit_plans` + `/api/edit_plans/<plan_id>` panel endpoints
|
|
579
|
-
(DB/file only — no Resolve round-trips; decisions are enriched server-side
|
|
580
|
-
with `resolve_clip_id` and a `thumb_frame_index` for the existing frames
|
|
581
|
-
route).
|
|
582
|
-
- **Changed** `edit_engine.list_plans` gained `include_corrupt` (default off;
|
|
583
|
-
the MCP action shape is unchanged).
|
|
584
|
-
|
|
585
|
-
## What's New in v2.46.1
|
|
586
|
-
|
|
587
|
-
Test and hygiene hardening; no public tool surface changes.
|
|
588
|
-
|
|
589
|
-
- **Fixed** the three `InventoryCacheReuseTests` failures that appeared
|
|
590
|
-
whenever a live Resolve instance was running: the reuse/build-path tests
|
|
591
|
-
now stub the read-only Resolve probe, so the suite is green with Resolve
|
|
592
|
-
open or closed.
|
|
593
|
-
- **Added** `src/utils/project_cleanup.delete_project_safely`: a retrying
|
|
594
|
-
delete helper for disposable Resolve projects (switch away from the target,
|
|
595
|
-
retry `DeleteProject` once after a pause, report the leftover by name on
|
|
596
|
-
persistent failure). The live edit-engine validation harness now uses it
|
|
597
|
-
during cleanup, so disposable pilot projects stop lingering in the library.
|
|
598
|
-
|
|
599
|
-
## What's New in v2.46.0
|
|
600
|
-
|
|
601
|
-
Community PR bundle: five contributed fixes and features (#62–#66), live-validated
|
|
602
|
-
on Resolve Studio 21.
|
|
603
|
-
|
|
604
|
-
- **Fixed** timeline marker frames are now correctly relative to the timeline
|
|
605
|
-
start (#66): timecode params and the playhead default rebase by
|
|
606
|
-
`GetStartFrame()`, so markers on hour-start timelines land where the UI
|
|
607
|
-
shows them instead of an hour past the end. Raw `frame` params pass through
|
|
608
|
-
unchanged (documented as relative). Contact sheets and marker thumbnail
|
|
609
|
-
review rebase the other way with a legacy-absolute guard.
|
|
610
|
-
- **Fixed** project lint no longer flags audio-only timelines as empty (#62);
|
|
611
|
-
live lint state now reports per-type `video/audio/subtitle_item_count`.
|
|
612
|
-
- **Added** `media_pool.check_proxy_media_compatibility` (#63): ffprobe-vs-source
|
|
613
|
-
signature diagnostics (resolution/fps/frames/sample rate, expected
|
|
614
|
-
codec/profile). Same-aspect downscales count as compatible — half-res
|
|
615
|
-
proxies are the normal workflow.
|
|
616
|
-
- **Added** readback verification envelopes (`verified_operation`) around
|
|
617
|
-
`media_pool.link_proxy_checked` (#63) and `media_pool.append_to_timeline`
|
|
618
|
-
(#64): preflight, execution, post-state readback, verification status, and a
|
|
619
|
-
journal event. `link_proxy_checked` gains `check_compatibility` /
|
|
620
|
-
`require_compatible` guards that refuse incompatible proxies before linking.
|
|
621
|
-
- **Added** `bins` to declarative project specs (#65): missing media-pool bin
|
|
622
|
-
paths plan as `ensure` actions and are created idempotently; existing bins
|
|
623
|
-
are noops. Bin paths normalize to the `Master/` prefix so unprefixed spec
|
|
624
|
-
bins converge instead of reporting perpetual drift.
|
|
625
|
-
|
|
626
|
-
## What's New in v2.45.0
|
|
627
|
-
|
|
628
|
-
The edit engine — Phase E, the final phase of the analysis + edit-engine
|
|
629
|
-
program. Three evidence-driven loops on one shared skeleton: evidence query
|
|
630
|
-
→ dry-run plan with per-decision rationale → confirm token → versioned
|
|
631
|
-
timeline ops → metric readback → brain_edits rows.
|
|
632
|
-
|
|
633
|
-
- **Added** a new `edit_engine` MCP tool (compound tool count: 34):
|
|
634
|
-
- `plan_selects` / `execute_selects` — ranks shots by deep-tier
|
|
635
|
-
`editorial.select_potential` and best moments (clip-level fallback for
|
|
636
|
-
standard-analyzed clips), story-spine order, duration budget; execution
|
|
637
|
-
builds a NEW selects timeline from per-shot source ranges. Additive.
|
|
638
|
-
- `plan_tighten` / `execute_tighten` — dead-air lifts from transcript-gap
|
|
639
|
-
evidence per timeline item (no transcript → reported in `skipped`,
|
|
640
|
-
never silently trimmed); execution assembles a tightened VARIANT
|
|
641
|
-
timeline from keep ranges (true partial trims via the range-copy
|
|
642
|
-
kernel) — the original timeline is never mutated.
|
|
643
|
-
- `plan_swap` / `execute_swap` — alternates for a timeline item via the
|
|
644
|
-
visual-similarity index, filtered to shots that can fill the slot
|
|
645
|
-
exactly; execution replaces the item in place (lift + positioned
|
|
646
|
-
append) on the version-archived timeline.
|
|
647
|
-
- `list_plans` / `get_plan` — plans persist under `memory/edit_plans/`
|
|
648
|
-
with content fingerprints; a stale or tampered plan refuses to execute.
|
|
649
|
-
- **Added** `src/utils/edit_engine.py` (DB-only planning/evidence layer) and
|
|
650
|
-
`tests/live_edit_engine_validation.py` (disposable-project live harness).
|
|
651
|
-
execute_* actions are confirm-token gated and registered with the
|
|
652
|
-
version-on-mutate hook (archive + brain_edits come from the same
|
|
653
|
-
machinery as every other destructive op).
|
|
654
|
-
- **Fixed** frame→shot mapping in the analysis store: frames now fall back
|
|
655
|
-
to time-containment when a report's shots don't record
|
|
656
|
-
`frame_indices_used` (commit paths that omit it previously produced no
|
|
657
|
-
shot-level visual vectors).
|
|
658
|
-
- **Validation**: full offline suite (1118 tests; 13 new). Live pilot on a
|
|
659
|
-
disposable synthetic-media Resolve project (ffmpeg + spoken audio):
|
|
660
|
-
20/20 checks — selects timeline assembled (2 decisions), tighten variant
|
|
661
|
-
removed exactly the 15.2s of transcript dead air while keeping the
|
|
662
|
-
spoken 4.8s (original untouched), swap replaced the item with a 0.92
|
|
663
|
-
cosine alternate, brain_edits rationale rows present for all three
|
|
664
|
-
loops, timeline versions archived.
|
|
665
|
-
|
|
666
|
-
## What's New in v2.44.0
|
|
667
|
-
|
|
668
|
-
Cross-clip entities + bin briefing v2 — Phase D of the analysis +
|
|
669
|
-
edit-engine program. Recurring people/places/props found by clustering the
|
|
670
|
-
visual embeddings, confirmed with one vision call per cluster.
|
|
671
|
-
|
|
672
|
-
- **Added** schema v11 (`entities` + `entity_appearances`) and
|
|
673
|
-
`src/utils/entities.py`: union-find clustering over the v10 CLIP frame
|
|
674
|
-
vectors (cosine threshold, no new deps), representative-frame selection,
|
|
675
|
-
ghost pruning across re-runs (labeled entities persist), and a
|
|
676
|
-
detection-state stash so `entity_index` always resolves against the exact
|
|
677
|
-
ordering the payload was issued with.
|
|
678
|
-
- **Added** `media_analysis` actions: `detect_entities` (clusters + deferred
|
|
679
|
-
one-frame-per-cluster confirmation payload, caps pre-checked),
|
|
680
|
-
`commit_entities` (kind/label/description with conservative-label rules;
|
|
681
|
-
`merge_with` collapses duplicate clusters), `list_entities`,
|
|
682
|
-
`prepare_bin_briefing` (entities + per-clip summaries, text-only), and
|
|
683
|
-
`commit_bin_summary` (host-synthesized briefing written above the v2.0
|
|
684
|
-
aggregate in `memory/bin_summary.md`).
|
|
685
|
-
- **Added** a "Recurring across this bin" card on the panel's Review page
|
|
686
|
-
(`/api/entities`), shown once labeled entities exist.
|
|
687
|
-
- **Validation**: full offline suite (1105 tests; 10 new). Live on the real
|
|
688
|
-
sample root: 3 clusters detected from 16 CLIP vectors; host-chat
|
|
689
|
-
confirmation labeled the shattered-windshield POV and the white rental
|
|
690
|
-
sedan and merged the sedan's two clusters; bin briefing synthesized and
|
|
691
|
-
committed; panel card verified and screenshots regenerated.
|
|
692
|
-
|
|
693
|
-
## What's New in v2.43.0
|
|
694
|
-
|
|
695
|
-
Embeddings + similarity search — Phase C of the analysis + edit-engine
|
|
696
|
-
program. "Find clips/shots like this," locally, with no vendor token cost.
|
|
697
|
-
|
|
698
|
-
- **Added** `src/utils/embeddings.py` and schema v10 (`embeddings` table:
|
|
699
|
-
one float32 vector per entity/kind/model, with content hashes so re-runs
|
|
700
|
-
only re-embed what changed). Brute-force cosine — numpy when present.
|
|
701
|
-
- **Added** `media_analysis` actions `build_embeddings` (idempotent; clip
|
|
702
|
-
summaries, shot descriptions + deep field groups, transcript segments,
|
|
703
|
-
sampled frames with per-shot mean vectors) and `find_similar` (query by
|
|
704
|
-
free text, clip, or shot; `kind="text"|"visual"`; free-text visual queries
|
|
705
|
-
go through the CLIP text encoder).
|
|
706
|
-
- **Added** backend detection, never installation (the whisper pattern):
|
|
707
|
-
text = ollama `nomic-embed-text` (serving probe) or sentence-transformers;
|
|
708
|
-
visual = open_clip ViT-B-32. Capabilities and the Diagnostics → Tools page
|
|
709
|
-
list availability with install guidance.
|
|
710
|
-
- **Added** a `Semantic` toggle on the panel's Review search (shown only
|
|
711
|
-
when a text backend is detected) backed by `/api/search/semantic`, which
|
|
712
|
-
returns rows in the existing search-card shape.
|
|
713
|
-
- **Validation**: full offline suite (1095 tests; 14 new, backends mocked).
|
|
714
|
-
Live on the 2026-05-17 sample root: 54 text vectors in 1.2s via ollama
|
|
715
|
-
with correct top hits for three editorial queries; 27 CLIP vectors with
|
|
716
|
-
"cracked broken windshield glass" ranking the shattered-windshield frame
|
|
717
|
-
first; panel endpoint verified and screenshots regenerated.
|
|
718
|
-
|
|
719
|
-
## What's New in v2.42.0
|
|
720
|
-
|
|
721
|
-
Deep shot-level vision tier — Phase B of the analysis + edit-engine program.
|
|
722
|
-
Opt-in, estimate-first per-shot field filling for the Visual / Content /
|
|
723
|
-
Production / Editorial / Cuttability groups the shot pages already render.
|
|
724
|
-
|
|
725
|
-
- **Added** `src/utils/deep_vision.py` and three `media_analysis` actions:
|
|
726
|
-
`deepen` (estimate → confirm_token → deferred host-vision payload per
|
|
727
|
-
clip/shot), `commit_shot_vision` (writes `vision_deep_v1` provenance rows,
|
|
728
|
-
updates the canonical blob, re-exports analysis.json in lockstep), and
|
|
729
|
-
`vision_pending_sweep` (lists clips stuck in `pending_host_analysis`;
|
|
730
|
-
`reoffer=true` returns the stored payload, `expire=true` stamps them).
|
|
731
|
-
- **Added** deep depth to the analyze flow: `depth="deep"` extends the
|
|
732
|
-
deferred payload with the per-shot schema and requires `confirm_deep=true`
|
|
733
|
-
after a token-cost estimate. Caps pre-call refusal applies on both paths.
|
|
734
|
-
- **Added** panel affordances: `Deepen analysis` (clip view) and `Deepen this
|
|
735
|
-
shot` (shot view) copy ready-made chat prompts, per the chat-first UX.
|
|
736
|
-
Shots with no sampled frames on disk get 1–2 frames re-extracted via
|
|
737
|
-
ffmpeg, downscaled per caps (source media stays read-only).
|
|
738
|
-
- **Fixed** a provenance bug in the analysis store: a source re-deriving an
|
|
739
|
-
unchanged value no longer re-attributes the row (a deep pass would
|
|
740
|
-
otherwise claim every untouched field as `vision_deep_v1`).
|
|
741
|
-
- **Validation**: full offline suite (1081 tests; 15 new), and a real
|
|
742
|
-
end-to-end deep pass on the 2026-05-17 sample clip — estimate → confirm →
|
|
743
|
-
frames read by the host chat → commit → rows/blob/export parity → fields
|
|
744
|
-
visible in the panel shot view. Control-panel guide screenshots
|
|
745
|
-
regenerated from the live panel.
|
|
746
|
-
|
|
747
|
-
## What's New in v2.41.0
|
|
748
|
-
|
|
749
|
-
DB-canonical clip analysis (C1) — Phase A of the analysis + edit-engine
|
|
750
|
-
program. The per-project SQLite DB is now the source of truth for clip
|
|
751
|
-
analysis; `analysis.json` becomes a derived export written in lockstep.
|
|
752
|
-
|
|
753
|
-
- **Added** schema v9 to the per-project timeline-brain DB: `clips`,
|
|
754
|
-
`clip_aliases`, `analysis_reports` (canonical full payload), `shots`,
|
|
755
|
-
`subjective_fields` + `field_changelog` (per-field provenance),
|
|
756
|
-
`transcript_segments`, `frames`, and `qc_observations`.
|
|
757
|
-
- **Added** `src/utils/analysis_store.py`: transactional ingest, export with
|
|
758
|
-
human-correction overlay (human rows always win and survive re-analysis),
|
|
759
|
-
alias-based clip lookup, shot ids stable under one-second boundary jitter,
|
|
760
|
-
and a round-trip guard verified against a real sample analysis root.
|
|
761
|
-
- **Added** `media_analysis` actions `db_status` (schema version + row
|
|
762
|
-
counts) and `db_ingest` (one-shot migration of existing JSON reports and
|
|
763
|
-
`corrections.json` sidecars into the DB).
|
|
764
|
-
- **Changed** the analysis write path: `execute_plan` and `commit_vision`
|
|
765
|
-
write DB rows first, then export the JSON. Panel clip/shot endpoints read
|
|
766
|
-
DB-first with JSON fallback for pre-v9 reports and job-linked report dirs.
|
|
767
|
-
- **Changed** `update_clip_field` / `update_shot_field` / `revert_field` to
|
|
768
|
-
mirror corrections into the DB as row-level provenance (the
|
|
769
|
-
`corrections.json` sidecar remains for compatibility).
|
|
770
|
-
- **Fixed** eight V2 actions that were unreachable from MCP dispatch since
|
|
771
|
-
v2.24.0 (`get_panel_state`, `set_panel_state`, `session_start_context`,
|
|
772
|
-
`update_shot_field`, `update_clip_field`, `get_field_history`,
|
|
773
|
-
`revert_field`, `list_corrections`): they were checked inside the
|
|
774
|
-
project-root dispatch block but missing from its membership set. The
|
|
775
|
-
control panel proxied to the helpers directly, which masked it.
|
|
776
|
-
- **Fixed** the action-list drift guard to inspect async tool functions
|
|
777
|
-
(media_analysis had drifted unchecked) and to fail on actions that are
|
|
778
|
-
unreachable inside membership blocks — the exact class above. Four
|
|
779
|
-
reachable-but-unadvertised actions (`coverage_report`,
|
|
780
|
-
`get_resolve_ai_usage`, `get_ai_governance`, `set_ai_governance`) are now
|
|
781
|
-
listed in the unknown-action error.
|
|
782
|
-
- **Validation**: full offline suite (1066 tests; 12 new), round-trip guard
|
|
783
|
-
on the real 2026-05-17 sample root, and a live headless pipeline run on
|
|
784
|
-
synthetic media verifying rows-then-export parity, row-level corrections,
|
|
785
|
-
and DB-first panel reads.
|
|
786
|
-
|
|
787
|
-
## What's New in v2.40.0
|
|
788
|
-
|
|
789
|
-
Control panel UX overhaul + docs refresh, from a full live audit of every
|
|
790
|
-
panel view, with drift guards so neither can silently go stale again.
|
|
791
|
-
|
|
792
|
-
- **Added** a governance mode toggle (Advisory / Enforce) to the AI Console,
|
|
793
|
-
with corrected copy (the old text predated v2.39.0 enforce mode), and a
|
|
794
|
-
Recent-runs list on the AI-ops ledger showing each run's actor.
|
|
795
|
-
- **Added** chat-first onboarding: empty Overview, Review, and Inventory
|
|
796
|
-
states show plain-language guidance with a copyable suggested prompt
|
|
797
|
-
instead of zero-walls and MCP action names.
|
|
798
|
-
- **Added** History as a first-class Media menu item, deep-linkable at
|
|
799
|
-
`#analysis/review/history`; documented the full hash deep-link scheme.
|
|
800
|
-
- **Changed** the top-level "Analysis" menu to "Media" (it collided with the
|
|
801
|
-
Preferences page of the same name); "Analyze" is now "Inventory". Full
|
|
802
|
-
vocabulary pass: humanized readiness chips and frame-sampling labels, no
|
|
803
|
-
internal codenames, file names, or absolute paths in UI copy.
|
|
804
|
-
- **Fixed** the README's linked screenshot rendering broken in the Docs
|
|
805
|
-
reader: badge parsing no longer claims local linked images, and a new
|
|
806
|
-
`/api/doc_asset/` route serves repo doc images (path-constrained).
|
|
807
|
-
- **Fixed** poll hygiene: timers pause while the tab is hidden, panel-state
|
|
808
|
-
polling backs off when unfocused, and unchanged inventory polls return a
|
|
809
|
-
tiny 200 instead of a 304 that Chrome logged as an aborted request.
|
|
810
|
-
- **Docs**: `docs/guides/control-panel.md` fully rewritten for the current
|
|
811
|
-
IA with all screenshots regenerated from the live panel
|
|
812
|
-
(`scripts/regen_panel_screenshots.py`). A new drift-guard test fails the
|
|
813
|
-
suite — and the publish workflow, which now runs all three static guards
|
|
814
|
-
on every tag — when the guide drifts from the panel's navigation or
|
|
815
|
-
screenshots.
|
|
816
|
-
|
|
817
|
-
## What's New in v2.39.0
|
|
818
|
-
|
|
819
|
-
Governance enforce mode and actor identity — the staged Phase 3 of the
|
|
820
|
-
Resolve 21 AI-ops work.
|
|
821
|
-
|
|
822
|
-
- **Added** governance `mode` for the media-creating AI ops (motion deblur,
|
|
823
|
-
speech generation): `advisory` (default, unchanged — confirm-preview
|
|
824
|
-
warnings only) or `enforce`, where an over-tier run is blocked with
|
|
825
|
-
`GOVERNANCE_BLOCKED` before token issuance, naming the exceeded dimensions.
|
|
826
|
-
Escape hatches: raise the tier, relax the mode, or pass
|
|
827
|
-
`override_governance=true` to consciously exceed the tier once.
|
|
828
|
-
`set_ai_governance` accepts `mode` (preset now optional);
|
|
829
|
-
`get_ai_governance` reports it.
|
|
830
|
-
- **Added** instance-level actor identity (per the recorded concurrency
|
|
831
|
-
design): each entry point declares itself — `stdio`, `network-sse`,
|
|
832
|
-
`network-http`, `control-panel`, `batch-cli` — and AI-ops ledger rows,
|
|
833
|
-
brain edits, and timeline versions now carry `actor` (`<instance>:<pid>`)
|
|
834
|
-
alongside `initiator`. Schema v8 (additive columns); migration verified
|
|
835
|
-
against a copy of a real project DB with all rows preserved.
|
|
836
|
-
|
|
837
|
-
## What's New in v2.38.0
|
|
838
|
-
|
|
839
|
-
Busy gate for long DaVinci Resolve operations — the first piece of the
|
|
840
|
-
concurrency design for the stdio + networked two-instance setup.
|
|
841
|
-
|
|
842
|
-
- **Added** cross-process registration for long synchronous Resolve calls
|
|
843
|
-
(timeline export/import, scene-cut detection, subtitle generation,
|
|
844
|
-
Dolby Vision analysis, folder/clip audio transcription). A tool call that
|
|
845
|
-
arrives while one is running now waits up to 5 seconds and then returns a
|
|
846
|
-
structured `RESOLVE_BUSY` error (new `busy` category, retryable, with
|
|
847
|
-
`state.busy_with` and `state.age_seconds`) instead of hanging silently
|
|
848
|
-
inside the scripting bridge. Stale registrations from crashed operations
|
|
849
|
-
are ignored automatically; an operation never gates its own thread.
|
|
850
|
-
- Design decisions recorded: single-editor/multi-client is the supported
|
|
851
|
-
concurrency target; confirm tokens stay per-instance; actor identity is
|
|
852
|
-
deferred to the governance phase.
|
|
853
|
-
|
|
854
|
-
## What's New in v2.37.3
|
|
855
|
-
|
|
856
|
-
Deep-audit fixes, rounds two and three: agent-facing action discovery,
|
|
857
|
-
crash-safe user-state persistence, and resource hygiene.
|
|
858
|
-
|
|
859
|
-
- **Fixed** three tools' unknown-action error lists drifting from their real
|
|
860
|
-
dispatch: `timeline` omitted `clip_where` and `action_help`;
|
|
861
|
-
`timeline_item_color` and `graph` omitted `action_help`. Agents recovering
|
|
862
|
-
from a typo now see the full action set. A static AST test keeps every
|
|
863
|
-
tool's advertised list in both-way sync with its dispatch (and verifies
|
|
864
|
-
docstring-advertised actions are real).
|
|
865
|
-
- **Fixed** user-state files being vulnerable to truncation by a crash
|
|
866
|
-
mid-write. Affected files all reset to `{}` on corruption, so the next
|
|
867
|
-
save would silently wipe remaining user data. Writers now use atomic
|
|
868
|
-
temp-file + `os.replace`: `media-analysis-preferences.json` (all
|
|
869
|
-
analysis/caps/governance/update defaults — including the
|
|
870
|
-
`set_resolution_tier` and `set_caps_preset` paths, now routed through the
|
|
871
|
-
shared writer), `update-check.json`, the dashboard's `analysis.json`
|
|
872
|
-
transcription patch, and `transcript-corrections.json`.
|
|
873
|
-
- **Fixed** `_safe_project_delete` discarding `SaveProject()`'s result when
|
|
874
|
-
closing the current project before deletion; a failed save now surfaces
|
|
875
|
-
as a warning in the response.
|
|
876
|
-
- **Fixed** a file-descriptor leak: the parent kept its copy of the control
|
|
877
|
-
panel's log handle open after spawning the detached child.
|
|
878
|
-
- Audit classes verified clean: bare excepts, mutable default arguments,
|
|
879
|
-
`asyncio.run` inside running loops, subprocess timeouts, docstring phantom
|
|
880
|
-
actions, silent-success swallows in metadata/marker/archive write paths.
|
|
881
|
-
|
|
882
|
-
## What's New in v2.37.2
|
|
883
|
-
|
|
884
|
-
Static-audit fixes — four undefined-name references that silently fell back
|
|
885
|
-
to defaults instead of erroring (the same bug class as the v2.37.0
|
|
886
|
-
confirm-token fix), plus a regression guard.
|
|
887
|
-
|
|
888
|
-
- **Fixed** the `status://mcp_version` resource reporting update channel
|
|
889
|
-
`"stable"` unconditionally; it now calls the real `get_update_channel()`,
|
|
890
|
-
so beta/dev channel installs report correctly.
|
|
891
|
-
- **Fixed** the `versioning_auto_run_idle_timeout_seconds` preference being
|
|
892
|
-
silently ignored (auto-run idle timeout was always 90s) due to a
|
|
893
|
-
misspelled preference-reader name in the destructive hook.
|
|
894
|
-
- **Fixed** resolve-state snapshot tokens always falling back to a timestamp
|
|
895
|
-
because `short_hash` was never imported; tokens are now content-stable.
|
|
896
|
-
- **Fixed** the timeline-kernel live probe's MCP-stub fallback crashing with
|
|
897
|
-
a `NameError` (missing `types` import) exactly when the mcp library is
|
|
898
|
-
absent — the only case the fallback exists for.
|
|
899
|
-
- **Added** a static test that runs pyflakes over `src/` and fails on any
|
|
900
|
-
undefined name, so this bug class cannot reappear unnoticed.
|
|
901
|
-
|
|
902
|
-
## What's New in v2.37.1
|
|
903
|
-
|
|
904
|
-
Test-suite hygiene — no server behavior changed.
|
|
905
|
-
|
|
906
|
-
- **Fixed** the legacy live-harness scripts (`test_all_tools`, `test_phase2`–`5`)
|
|
907
|
-
exiting at import when Resolve is unavailable, which crashed pytest
|
|
908
|
-
collection and surfaced as five loader errors under unittest discovery.
|
|
909
|
-
They now skip cleanly under both runners and keep the hard-exit behavior
|
|
910
|
-
when run as standalone scripts. (Adapted from a contribution by @diesdaas.)
|
|
911
|
-
- **Fixed** pytest mis-collecting `test_resolve20_api.py`'s internal `test()`
|
|
912
|
-
helper (renamed to `run_live_check()`), and made the batch-CLI synthetic-job
|
|
913
|
-
test independent of which transcription backends the host has installed.
|
|
914
|
-
- **CI**: the npm publish workflow no longer reports failure when the registry
|
|
915
|
-
accepted the publish but npm's retried request hit a consumed OIDC token;
|
|
916
|
-
it now verifies the published tarball shasum before failing. Runner actions
|
|
917
|
-
bumped to their Node 24 majors.
|
|
918
|
-
|
|
919
|
-
## What's New in v2.37.0
|
|
920
|
-
|
|
921
|
-
Render format-id fix, offline-media diagnosis, and a setup doctor.
|
|
922
|
-
|
|
923
|
-
- **Fixed** render helpers passing the display name from `GetRenderFormats()`
|
|
924
|
-
(e.g. `QuickTime`) into `GetRenderCodecs`, `GetRenderResolutions`, and
|
|
925
|
-
`SetCurrentRenderFormatAndCodec`, which expect the format id (e.g. `mov`).
|
|
926
|
-
`GetRenderCodecs("QuickTime")` returned empty, so `probe_render_matrix`
|
|
927
|
-
reported no QuickTime codecs and `prepare_render_job` could not target
|
|
928
|
-
ProRes (e.g. `ProRes422LT` proxy renders). Display names and format ids are
|
|
929
|
-
now both accepted as input and normalized to the id for Resolve API calls;
|
|
930
|
-
`probe_render_matrix` rows include `format_id`. Closes #59.
|
|
931
|
-
- **Fixed** the destructive confirm-token gate referencing a stale function
|
|
932
|
-
name, which made it silently ignore the `destructive.require_confirm_token`
|
|
933
|
-
preference and always fall back to the default.
|
|
934
|
-
- **Added** a `diagnosis` block to `timeline.detect_missing_media`:
|
|
935
|
-
deduplicated missing Media Pool items, volume/folder mounted checks, a
|
|
936
|
-
primary cause (`volume_not_mounted` / `folder_not_found` /
|
|
937
|
-
`files_missing_or_renamed`), and a recommended next step. Optional
|
|
938
|
-
`sanitized`/`sanitize_paths` redacts raw media paths.
|
|
939
|
-
- **Added** bounds to `timeline.build_relink_plan`: skips the broad scan by
|
|
940
|
-
default when a source volume (e.g. a camera card) is not mounted, dedupes
|
|
941
|
-
missing basenames, and caps the search with `max_depth`, `max_seconds`
|
|
942
|
-
(default 20s), and `max_files_scanned` (default 50k), reporting per-candidate
|
|
943
|
-
scan stats.
|
|
944
|
-
- **Fixed** `media_analysis` accepting `vision: true/false` boolean shorthand
|
|
945
|
-
(now normalized to the full options dict) and `timeline_markers.get_thumbnail`
|
|
946
|
-
returning a structured error instead of raw `None` when no thumbnail is
|
|
947
|
-
available.
|
|
948
|
-
- **Added** `scripts/doctor.py`, a read-only setup diagnostic that checks the
|
|
949
|
-
checkout, Python, Resolve app/scripting paths, and MCP client configs, and
|
|
950
|
-
probes the scripting bridge end to end with OK/WARN/FAIL output (`--json`
|
|
951
|
-
supported).
|
|
952
|
-
|
|
953
|
-
## What's New in v2.36.1
|
|
954
|
-
|
|
955
|
-
Bug fix — restore the `fusion_comp` MCP tool.
|
|
956
|
-
|
|
957
|
-
- **Fixed** a regression from `32be0ec` (v2.33.0) that left `fusion_comp`
|
|
958
|
-
unregistered: a new `_parse_pos` helper was inserted between the `@mcp.tool()`
|
|
959
|
-
decorator and `def fusion_comp`, so the decorator landed on the private helper
|
|
960
|
-
instead. As a result `_parse_pos` was exposed as a tool while **all**
|
|
961
|
-
`fusion_comp` node-graph operations (`add_tool`, `connect`, `add_keyframe`,
|
|
962
|
-
`get_keyframes`, `copy_tool`, `set_position`, …) were missing from the tool
|
|
963
|
-
list. The decorator is restored to `fusion_comp` and `_parse_pos` is once
|
|
964
|
-
again a plain internal helper. Live-validated on DaVinci Resolve Studio 21.
|
|
965
|
-
|
|
966
|
-
## What's New in v2.36.0
|
|
967
|
-
|
|
968
|
-
Optional networked transport — run the MCP server over the network, safely, with
|
|
969
|
-
control-panel management. Local stdio remains the default and is unchanged.
|
|
970
|
-
|
|
971
|
-
- **Added** `--transport stdio|sse|streamable-http` (default `stdio`). The networked
|
|
972
|
-
modes bind to **loopback (127.0.0.1) by default** and **require a bearer token** on
|
|
973
|
-
every request (from `$DAVINCI_MCP_TOKEN`, or generated + logged at startup). A
|
|
974
|
-
non-loopback bind logs a loud security warning. stdio is untouched; you can run a
|
|
975
|
-
local stdio instance and a networked instance against the same Resolve at once.
|
|
976
|
-
- **Added** control-panel management (Setup → MCP): a Transport card showing the live
|
|
977
|
-
mode / URL / token / loopback status, with Start/Stop buttons (loopback-only). Backed
|
|
978
|
-
by `/api/mcp/transport/{start,stop}` and a transport field on `/api/mcp/status`.
|
|
979
|
-
- The page-switch lock (v2.34.1) already serializes concurrent page switches across the
|
|
980
|
-
local and networked instances.
|
|
981
|
-
|
|
982
|
-
## What's New in v2.35.2
|
|
983
|
-
|
|
984
|
-
Verification observability and a validator consolidation.
|
|
985
|
-
|
|
986
|
-
- **Added** `resolve_control(action="verification_stats")` returns a
|
|
987
|
-
process-level tally of readback-verification outcomes
|
|
988
|
-
(verified / contradicted / unverified) since server start. A rising
|
|
989
|
-
`contradicted` count means the Resolve API reported success but a readback
|
|
990
|
-
disagreed. No connection required.
|
|
991
|
-
- **Changed** `open_page` now validates its `page` argument through the declarative
|
|
992
|
-
contract layer (`contracts.validate`) instead of a hand-written enum check —
|
|
993
|
-
behavior unchanged; part of folding scattered validation into one place.
|
|
994
|
-
|
|
995
|
-
## What's New in v2.35.1
|
|
996
|
-
|
|
997
|
-
- **Added** `media_pool_item(action="extract_frames", clip_id, timestamps, output_dir?)`
|
|
998
|
-
extracts still JPEGs from a clip's source media at the given timestamps (seconds)
|
|
999
|
-
via ffmpeg. Source-safe: it reads the source and writes only to a scratch output
|
|
1000
|
-
directory — it never modifies, transcodes, or proxies the source. (Closes a
|
|
1001
|
-
read/write-symmetry gap: the analysis sampler existed internally but had no
|
|
1002
|
-
standalone frame-extraction tool.)
|
|
1003
|
-
|
|
1004
|
-
## What's New in v2.35.0
|
|
1005
|
-
|
|
1006
|
-
The Cut-IR executor — transcript-driven editing now closes the loop onto the
|
|
1007
|
-
timeline.
|
|
1008
|
-
|
|
1009
|
-
- **Added** `timeline(action="apply_cuts", cuts, dry_run?, confirm_token?)` applies
|
|
1010
|
-
a CutList (from `propose_cuts`) to the timeline as lift / ripple deletes. It is
|
|
1011
|
-
**DRY-RUN by default**; applying is destructive and fully governed: confirm-token
|
|
1012
|
-
gated, and a timeline version is archived first (so it is reversible), through
|
|
1013
|
-
the existing destructive hook. Cuts apply latest-first so ripple deletes do not
|
|
1014
|
-
invalidate earlier spans. Live-validated end-to-end (propose -> token -> apply ->
|
|
1015
|
-
version archived).
|
|
1016
|
-
|
|
1017
|
-
## What's New in v2.34.1
|
|
1018
|
-
|
|
1019
|
-
Page-switch serialization — the concurrency primitive for safe multi-agent use.
|
|
1020
|
-
|
|
1021
|
-
- **Added** `src/utils/page_lock.py` — Resolve has a single globally-active page,
|
|
1022
|
-
so two agents that flip pages concurrently corrupt each other. `page_lock()`
|
|
1023
|
-
serializes page switches: a reentrant intra-process lock plus a best-effort
|
|
1024
|
-
inter-process advisory file lock around the outermost section. The `open_page`
|
|
1025
|
-
action now routes through it. This must be in place before any concurrent-agent
|
|
1026
|
-
feature ships.
|
|
1027
|
-
- Networked transport, sandboxed scripting, and capability/role scoping (the rest
|
|
1028
|
-
of the safe remote/multi-user design) are security-critical and remain a
|
|
1029
|
-
separate, sign-off-gated phase — they are intentionally not shipped here.
|
|
1030
|
-
|
|
1031
|
-
## What's New in v2.34.0
|
|
1032
|
-
|
|
1033
|
-
First phase of transcript-driven editing: a Cut intermediate representation and a
|
|
1034
|
-
mechanical cut proposer.
|
|
1035
|
-
|
|
1036
|
-
- **Added** `src/utils/cut_ir.py` — the Cut-IR: a typed representation of an
|
|
1037
|
-
editorial cut ({kind, span, action, confidence, rationale, evidence}) plus a
|
|
1038
|
-
deterministic Pass-1 detector that flags filler words, long pauses, and
|
|
1039
|
-
repeated lines from a timestamped transcript. No LLM.
|
|
1040
|
-
- **Added** `timeline(action="propose_cuts", cues?, long_pause_frames?)` — a
|
|
1041
|
-
DRY-RUN that runs Pass-1 over the timeline's subtitle transcript (or provided
|
|
1042
|
-
cues) and returns a CutList. It proposes only; it applies nothing. The semantic
|
|
1043
|
-
Pass-2 and the governed timeline executor are subsequent phases.
|
|
1044
|
-
|
|
1045
|
-
## What's New in v2.33.8
|
|
1046
|
-
|
|
1047
|
-
Bridge-call performance instrumentation.
|
|
1048
|
-
|
|
1049
|
-
- **Added** `src/utils/bridge_metrics.py` — a counting proxy that wraps a Resolve
|
|
1050
|
-
handle and tallies attribute accesses and method calls (each a COM/socket
|
|
1051
|
-
round-trip), so the real bridge cost of an operation is measured rather than
|
|
1052
|
-
guessed.
|
|
1053
|
-
- **Added** `scripts/measure_bridge_cost.py` — runs a representative media-pool
|
|
1054
|
-
traversal through the proxy and reports round-trips per clip. A minimal
|
|
1055
|
-
name+type walk measured ~6.7 round-trips per clip, confirming round-trips scale
|
|
1056
|
-
linearly with traversal size. A property cache remains gated on profiling
|
|
1057
|
-
*repeated*-read patterns in real workflows (don't cache blind).
|
|
1058
|
-
|
|
1059
|
-
## What's New in v2.33.7
|
|
1060
|
-
|
|
1061
|
-
Read/write symmetry audit and a gap it surfaced.
|
|
1062
|
-
|
|
1063
|
-
- **Added** `scripts/audit_readwrite_symmetry.py` + generated
|
|
1064
|
-
`docs/reference/readwrite-symmetry.md` — scans every tool's action surface and
|
|
1065
|
-
reports `set_`/`add_`/`create_` writes that lack a read counterpart, so
|
|
1066
|
-
write-without-read gaps surface before users hit them. A repeatable
|
|
1067
|
-
feature-discovery method.
|
|
1068
|
-
- **Added** `fusion_comp(action="get_frame_range")` — reads the comp's render
|
|
1069
|
-
frame range, the read counterpart to `set_frame_range` (a gap the audit found).
|
|
1070
|
-
|
|
1071
|
-
## What's New in v2.33.6
|
|
1072
|
-
|
|
1073
|
-
Internal consolidation: a declarative parameter-contract validator and centralized
|
|
1074
|
-
subprocess hygiene.
|
|
1075
|
-
|
|
1076
|
-
- **Added** `src/utils/contracts.py` `validate(params, rules, invariants)` — one
|
|
1077
|
-
validator for required/type/enum/min/max/non-empty/parent-dir-exists plus custom
|
|
1078
|
-
invariants, returning consistent agent-friendly errors with coercion + defaults
|
|
1079
|
-
applied. Replaces scattered, hand-written validation.
|
|
1080
|
-
- **Changed** `export_frame_as_still` and `set_mark_in_out` (clip + timeline) now
|
|
1081
|
-
validate through contracts. Behavior is preserved (same rejections); `mark_in`/
|
|
1082
|
-
`mark_out` are now coerced to int.
|
|
1083
|
-
- **Added** `src/utils/proc.py` `safe_run`/`safe_popen` — subprocess wrappers that
|
|
1084
|
-
default `stdin` to DEVNULL so a child can't consume the MCP stdio protocol
|
|
1085
|
-
stream. Inline Python execution now routes through `safe_run`.
|
|
1086
|
-
|
|
1087
|
-
## What's New in v2.33.5
|
|
1088
|
-
|
|
1089
|
-
A queryable ledger of verified Resolve API behavior.
|
|
1090
|
-
|
|
1091
|
-
- **Added** `resolve_control(action="api_truth", query?)` returns
|
|
1092
|
-
behaviorally-verified facts about quirky or unreliable Resolve scripting-API
|
|
1093
|
-
behavior — methods that live on unexpected objects, return values that lie,
|
|
1094
|
-
silently-rejected string keys, and calls that don't exist. Each fact records
|
|
1095
|
-
the reality, a recommended approach, and the Resolve build it was verified on.
|
|
1096
|
-
No connection required. Backed by `src/utils/api_truth.py`, seeded from
|
|
1097
|
-
hard-won findings (AutoSyncAudio, Fusion Paste, FlowView positions,
|
|
1098
|
-
GetTimelineByName, project render methods, transcription truncation, the
|
|
1099
|
-
CreateProject modal, stdio subprocess hygiene) and meant to grow over time.
|
|
1100
|
-
|
|
1101
|
-
## What's New in v2.33.4
|
|
1102
|
-
|
|
1103
|
-
Internal reliability framework.
|
|
1104
|
-
|
|
1105
|
-
- **Added** `verify_by_readback` (`src/utils/readback.py`) — a primitive for
|
|
1106
|
-
mutating Resolve ops that verifies an action by reading the real post-state
|
|
1107
|
-
back instead of trusting the API's frequently-unreliable return value. A
|
|
1108
|
-
contradiction (reported success but a failing readback) is logged as a
|
|
1109
|
-
reliability signal.
|
|
1110
|
-
- **Changed** Auto-sync audio now runs through `verify_by_readback` as its first
|
|
1111
|
-
user and reports a `verified` field alongside `linked`/`newly_linked`. Behavior
|
|
1112
|
-
is unchanged; the bespoke readback loop is replaced by the shared primitive.
|
|
1113
|
-
|
|
1114
|
-
## What's New in v2.33.3
|
|
1115
|
-
|
|
1116
|
-
Two read tools that surface existing project state.
|
|
1117
|
-
|
|
1118
|
-
- **Added** `project_settings(action="project_summary")` returns a live
|
|
1119
|
-
structural readout — current page, timeline count and current timeline, and a
|
|
1120
|
-
media-pool inventory (folder/clip counts, clips by type, optional clip
|
|
1121
|
-
sample). A cheap "what's in this project right now" snapshot that needs no
|
|
1122
|
-
prior analysis.
|
|
1123
|
-
- **Added** `timeline(action="get_transcript")` reads the current timeline's
|
|
1124
|
-
subtitle track(s) as transcript text `{text, cue_count, has_subtitles, cues}`,
|
|
1125
|
-
with optional per-cue timecodes. Complements the clip-level
|
|
1126
|
-
`get_transcription`.
|
|
1127
|
-
|
|
1128
|
-
## What's New in v2.33.2
|
|
1129
|
-
|
|
1130
|
-
Documentation: a guide for hand-authoring DaVinci Resolve `.setting` template
|
|
1131
|
-
files.
|
|
1132
|
-
|
|
1133
|
-
- **Added** `docs/authoring/setting-files/` — how to author Edit effects,
|
|
1134
|
-
transitions, titles, generators, and Fusion macros as `.setting` files: the
|
|
1135
|
-
Lua-table format, the `InstanceInput`/`UserControls` control catalog, thumbnail
|
|
1136
|
-
conventions, Templates install paths, and a set of hard-won gotchas (ordered
|
|
1137
|
-
vs unordered `Inputs`, `ControlGroup` anchoring, transition easing via
|
|
1138
|
-
`LUTLookup`, `KeyStretcher` on titles, the category-subfolder rule, OFX
|
|
1139
|
-
boilerplate, and more). Includes 13 copyable starter templates and is linked
|
|
1140
|
-
from `docs/SKILL.md`.
|
|
1141
|
-
|
|
1142
|
-
## What's New in v2.33.1
|
|
1143
|
-
|
|
1144
|
-
Clip transcription read-back and more trustworthy auto-sync reporting.
|
|
1145
|
-
|
|
1146
|
-
- **Added** `media_pool_item(action="get_transcription")` returns
|
|
1147
|
-
`{text, truncated, status, has_transcription}`. Transcription could previously
|
|
1148
|
-
be triggered but never read back. Resolve's `Transcription` clip property is a
|
|
1149
|
-
preview that ends in an ellipsis when the full transcript is longer, so
|
|
1150
|
-
`truncated` tells callers the returned text is partial.
|
|
1151
|
-
- **Changed** Auto-sync audio now verifies linkage by reading each clip's
|
|
1152
|
-
`Synced Audio` property before and after the call and reporting
|
|
1153
|
-
`linked` / `newly_linked` / `already_linked`, instead of trusting
|
|
1154
|
-
`AutoSyncAudio`'s unreliable boolean. The boolean is still returned as
|
|
1155
|
-
`success`, but callers should trust `linked`.
|
|
1156
|
-
|
|
1157
|
-
## What's New in v2.33.0
|
|
1158
|
-
|
|
1159
|
-
Fusion node-graph layout and duplication, plus performance and robustness
|
|
1160
|
-
improvements across the compound server. Live-validated on DaVinci Resolve
|
|
1161
|
-
Studio 21.0.0.
|
|
1162
|
-
|
|
1163
|
-
### Fusion node layout & duplication
|
|
1164
|
-
|
|
1165
|
-
- **Added** `fusion_comp(action="get_position")` and `set_position` — read and
|
|
1166
|
-
write a node's position on the FlowView canvas. `set_position` confirms the
|
|
1167
|
-
move by reading the position back.
|
|
1168
|
-
- **Added** `fusion_comp(action="copy_tool")` — duplicate a node, optionally
|
|
1169
|
-
renaming and repositioning it. Settings are carried through a temporary
|
|
1170
|
-
`.setting` file, which round-trips reliably across the Python bridge where the
|
|
1171
|
-
in-memory `SaveSettings()`/`Paste()` table form fails.
|
|
1172
|
-
- **Added** `fusion_comp(action="auto_arrange")` — lay tools out in a row
|
|
1173
|
-
(`direction="horizontal"`) or column (`"vertical"`) at a given spacing.
|
|
1174
|
-
|
|
1175
|
-
### Performance
|
|
1176
|
-
|
|
1177
|
-
- **Changed** Resolve object inspection walks `dir(obj)` once instead of once for
|
|
1178
|
-
methods and again for properties, skips `inspect.signature()` for C-extension
|
|
1179
|
-
methods (slow and almost always raising there), and reads `__doc__` directly.
|
|
1180
|
-
Each attribute access on a Resolve object is a bridge round-trip, so this
|
|
1181
|
-
roughly halves inspection cost on the `resolve_control` path.
|
|
1182
|
-
- **Changed** Media-pool find-by-name lookups walk the folder tree lazily and
|
|
1183
|
-
stop at the first match instead of materializing the entire project tree.
|
|
1184
|
-
|
|
1185
|
-
### Robustness & fixes
|
|
1186
|
-
|
|
1187
|
-
- **Fixed** `export_frame_as_still` rejects an empty path or a nonexistent target
|
|
1188
|
-
directory instead of silently returning failure.
|
|
1189
|
-
- **Fixed** `set_mark_in_out` (clip and timeline) rejects `mark_in > mark_out`.
|
|
1190
|
-
- **Fixed** Auto-sync audio resolves `AUDIO_SYNC_*` enum constants via the live
|
|
1191
|
-
Resolve handle, closing a path where a stale module handle silently degraded
|
|
1192
|
-
`AutoSyncAudio` to rejected string keys.
|
|
1193
|
-
- **Changed** Every `subprocess` call that can run while the MCP stdio server is
|
|
1194
|
-
active now sets `stdin=subprocess.DEVNULL`, so a child process cannot consume
|
|
1195
|
-
bytes from the JSON-RPC protocol stream; the spec-hook runner also captures its
|
|
1196
|
-
child's output. Applies to both the compound and granular launchers.
|
|
1197
|
-
|
|
1198
|
-
## What's New in v2.32.2
|
|
1199
|
-
|
|
1200
|
-
Fixes `fusion_comp(action="get_keyframes")` serialization.
|
|
1201
|
-
|
|
1202
|
-
The handler iterated `Input.GetKeyFrames()` as if it returned `{time: value}`,
|
|
1203
|
-
but Fusion returns `{1-based index: frame_position}`. The result put the
|
|
1204
|
-
keyframe **index** in `time` and the **frame position** in `value` — the actual
|
|
1205
|
-
keyframed values were never reported.
|
|
1206
|
-
|
|
1207
|
-
The handler now treats the dict values as frame positions and reads each
|
|
1208
|
-
keyframed value back via `GetInput(input_name, frame)`.
|
|
1209
|
-
|
|
1210
|
-
- **Fixed** `get_keyframes` now returns `[{"time": <frame>, "value": <value>}, ...]`
|
|
1211
|
-
in frame order (live-validated on DaVinci Resolve Studio 21.0.0:
|
|
1212
|
-
`Size` keyed `1.0@f0` / `1.4@f75` → `[{0.0: 1.0}, {75.0: 1.4}]`).
|
|
1213
|
-
- Follow-up to the `add_keyframe` fix in v2.32.1; flagged by @sandypoli-boop in #56.
|
|
1214
|
-
|
|
1215
|
-
## What's New in v2.32.1
|
|
1216
|
-
|
|
1217
|
-
Fixes `fusion_comp(action="add_keyframe")` so it actually **animates** the input.
|
|
1218
|
-
|
|
1219
|
-
Previously the handler did `inp[time] = value` on the input directly. On an input
|
|
1220
|
-
with no animation spline, that only assigns a **static** value (last write wins) —
|
|
1221
|
-
no keyframe is created. Symptoms: `get_keyframes` returned `[]`, `get_input` at
|
|
1222
|
-
different times returned the same value, and the clip never animated.
|
|
1223
|
-
|
|
1224
|
-
The handler now attaches a `BezierSpline` modifier the first time an input is
|
|
1225
|
-
animated, then sets the keyframe. A new optional `modifier` param lets callers
|
|
1226
|
-
pass e.g. `"Path"` for Point inputs such as `Center`. Behavior is unchanged for
|
|
1227
|
-
inputs that are already animated or otherwise connected.
|
|
1228
|
-
|
|
1229
|
-
- **Fixed** `add_keyframe` now creates real, editable keyframes (live-validated on
|
|
1230
|
-
DaVinci Resolve Studio 21.0.0).
|
|
1231
|
-
- **Added** optional `modifier` param to `add_keyframe`.
|
|
1232
|
-
- Thanks to @sandypoli-boop for the diagnosis and fix ([#56](https://github.com/samuelgursky/davinci-resolve-mcp/pull/56)).
|
|
1233
|
-
|
|
1234
|
-
## What's New in v2.32.0
|
|
1235
|
-
|
|
1236
|
-
Adds **governance tiers** for the media-creating Resolve 21 AI ops (Phase 3, the
|
|
1237
|
-
final phase of the AI-ops build: ledger → console → governance).
|
|
1238
|
-
|
|
1239
|
-
The two ops that render new files — `remove_motion_blur` and `generate_speech` —
|
|
1240
|
-
now have **soft, per-session limits** chosen by a named tier:
|
|
1241
|
-
|
|
1242
|
-
| dimension | off | lenient | standard | strict |
|
|
1243
|
-
|---|---|---|---|---|
|
|
1244
|
-
| deblur runs | ∞ | 50 | 15 | 5 |
|
|
1245
|
-
| speech runs | ∞ | 50 | 15 | 5 |
|
|
1246
|
-
| media created | ∞ | 50 GB | 10 GB | 2 GB |
|
|
1247
|
-
| render time | ∞ | 1 h | 20 min | 5 min |
|
|
1248
|
-
|
|
1249
|
-
Governance is **advisory** — it never hard-blocks (the ops are already
|
|
1250
|
-
confirm-token gated). When you're near or over the active tier, the confirmation
|
|
1251
|
-
dialog surfaces a warning before you proceed; the limits are computed from the
|
|
1252
|
-
v2.30.0 AI-ops ledger for the current session.
|
|
1253
|
-
|
|
1254
|
-
- **New module** `src/utils/resolve_ai_governance.py` — tiers + `check()` (status
|
|
1255
|
-
for the next run) + `status()` (session usage vs tier). Default tier: `standard`.
|
|
1256
|
-
- **New MCP actions** `media_analysis(action="get_ai_governance")` and
|
|
1257
|
-
`media_analysis(action="set_ai_governance", preset, overrides?)`. Override keys:
|
|
1258
|
-
`deblur_runs`, `speech_runs`, `render_bytes`, `render_wall_clock_ms` (int or `"unlimited"`).
|
|
1259
|
-
- **Confirm preview** for the two creators now carries a `governance` block
|
|
1260
|
-
(current usage, projected, warnings, exceeded/near flags).
|
|
1261
|
-
- **Control panel** — the AI Console gains a **Governance** section: a tier picker
|
|
1262
|
-
(off/lenient/standard/strict, with each tier's thresholds) plus live
|
|
1263
|
-
consumption gauges, and the confirm dialog shows the warning inline.
|
|
1264
|
-
|
|
1265
|
-
This completes the staged AI-ops build. Validated live against Resolve Studio
|
|
1266
|
-
21.0.0.47 (tier switching, persistence, gauges, confirm-dialog warnings).
|
|
1267
|
-
|
|
1268
|
-
## What's New in v2.31.0
|
|
1269
|
-
|
|
1270
|
-
Adds the **AI Console** to the control panel — an interactive surface for the
|
|
1271
|
-
Resolve 21 local AI operations (Phase 2 of the staged AI-ops build: ledger →
|
|
1272
|
-
console → governance).
|
|
1273
|
-
|
|
1274
|
-
A new **AI Console** tab runs the 21.0 ops against the current Media Pool folder
|
|
1275
|
-
or a specific clip:
|
|
1276
|
-
|
|
1277
|
-
- **Capability matrix** — shows which AI methods this Resolve build exposes (green
|
|
1278
|
-
= available, grey = absent on older builds) and which Extra each gated method
|
|
1279
|
-
needs to actually run.
|
|
1280
|
-
- **Analysis** — Classify audio / Clear classification, IntelliSearch (with
|
|
1281
|
-
identify-faces and Better-mode toggles), Analyze for slate (16-color marker
|
|
1282
|
-
picker), Transcribe (with speaker-detection toggle), Clear transcription.
|
|
1283
|
-
- **Motion deblur** and **Speech generator** — full options forms; because both
|
|
1284
|
-
create new media files they route through a confirmation modal (the same
|
|
1285
|
-
confirm-token gate the MCP tools use) before running.
|
|
1286
|
-
- **Session** — Disable background tasks for the current Resolve session.
|
|
1287
|
-
- A live result readout, and the *Resolve 21 AI ops* ledger refreshes after each
|
|
1288
|
-
run so file/byte totals stay current.
|
|
1289
|
-
|
|
1290
|
-
Backend: a loopback-only `POST /api/resolve_ai/run` endpoint dispatches each op
|
|
1291
|
-
to the consolidated `folder` / `media_pool_item` / `project_settings` /
|
|
1292
|
-
`resolve_control` tools, relaying the confirm-token two-step. No new MCP tools or
|
|
1293
|
-
Resolve API surface — the console reuses the existing v2.29.0 actions. Validated
|
|
1294
|
-
live end-to-end against Resolve Studio 21.0.0.47.
|
|
1295
|
-
|
|
1296
|
-
## What's New in v2.30.0
|
|
1297
|
-
|
|
1298
|
-
Adds the **Resolve 21 AI-ops ledger** — usage/time/file accounting for the
|
|
1299
|
-
Resolve-local AI operations added in v2.29.0 (audio classification, IntelliSearch,
|
|
1300
|
-
slate, motion-deblur, speech generation). These run on Resolve's own GPU/AI engine
|
|
1301
|
-
and do **not** consume the Claude-side analysis token budget, so they get their
|
|
1302
|
-
own ledger instead of being metered by the analysis-caps layer.
|
|
1303
|
-
|
|
1304
|
-
**What's tracked.** Every run of the five 21.0 ops records: op name, op class
|
|
1305
|
-
(`analysis` vs `render`), clip id, success/failure, wall-clock time, and — for the
|
|
1306
|
-
two media-creating ops (`remove_motion_blur`, `generate_speech`) — the output
|
|
1307
|
-
file path and byte size. The reliable signal is invocation counts + the
|
|
1308
|
-
file/disk accounting for the creators; durations for the bool-returning analysis
|
|
1309
|
-
ops reflect the script-call time (some queue work inside Resolve).
|
|
1310
|
-
|
|
1311
|
-
- **New table** `resolve_ai_op_usage` (timeline_brain DB schema v7).
|
|
1312
|
-
- **New module** `src/utils/resolve_ai_ledger.py` — `timed()` context manager +
|
|
1313
|
-
`record_op` / `get_usage` / `get_summary`. All writes are best-effort and never
|
|
1314
|
-
block or mask the underlying Resolve op.
|
|
1315
|
-
- **Instrumentation** wraps the consolidated `folder` / `media_pool_item`
|
|
1316
|
-
`perform_audio_classification` / `clear_audio_classification` /
|
|
1317
|
-
`analyze_for_intellisearch` / `analyze_for_slate` / `remove_motion_blur`
|
|
1318
|
-
handlers and `project_settings.generate_speech`.
|
|
1319
|
-
- **New MCP action** `media_analysis(action="get_resolve_ai_usage", session_only?, op?, limit?)`
|
|
1320
|
-
returns the per-op summary + recent runs.
|
|
1321
|
-
- **Control panel**: a read-only "Resolve 21 AI ops" card (`/api/resolve_ai_usage`)
|
|
1322
|
-
shows runs, success/fail, total time, and files/bytes created.
|
|
1323
|
-
|
|
1324
|
-
Phase 1 of a staged build (ledger → interactive console → governance). Granular
|
|
1325
|
-
`--full` server instrumentation is deferred — the ledger covers the consolidated
|
|
1326
|
-
server, which is the default surface. Validated live against Resolve Studio 21.0.0.47.
|
|
1327
|
-
|
|
1328
|
-
## What's New in v2.29.0
|
|
1329
|
-
|
|
1330
|
-
Adds the **DaVinci Resolve 21.0** scripting-API additions. Every new method is
|
|
1331
|
-
runtime-detected (`_requires_method`/capability flags), so the tools stay inert
|
|
1332
|
-
on older Resolve builds and activate automatically on Resolve 21+.
|
|
1333
|
-
|
|
1334
|
-
**New AI analysis actions** on the `folder` and `media_pool_item` compound tools
|
|
1335
|
-
(and mirrored as granular `--full` tools):
|
|
1336
|
-
|
|
1337
|
-
- `perform_audio_classification` / `clear_audio_classification` — classify clip
|
|
1338
|
-
audio into categories and subcategories.
|
|
1339
|
-
- `analyze_for_intellisearch(identify_faces?, is_better_mode?)` — IntelliSearch
|
|
1340
|
-
analysis with optional face identification. Requires the *AI IntelliSearch* Extra.
|
|
1341
|
-
- `analyze_for_slate(marker_color?)` — slate/clapboard detection that drops a
|
|
1342
|
-
marker of the chosen color (validated against the 16 Resolve marker colors).
|
|
1343
|
-
Requires the *AI Slate ID* Extra.
|
|
1344
|
-
- `remove_motion_blur(deblur_option?)` — renders motion-deblurred copies. This
|
|
1345
|
-
**creates new media files** (source media is never modified) and is therefore
|
|
1346
|
-
**confirm-token gated**: the first call returns a preview + token, the second
|
|
1347
|
-
call (with the token) runs.
|
|
1348
|
-
|
|
1349
|
-
**Speaker-detection transcription.** `transcribe_audio` now accepts an optional
|
|
1350
|
-
`use_speaker_detection` boolean (Resolve 21+); omit it to use the project's
|
|
1351
|
-
Speech Recognition setting.
|
|
1352
|
-
|
|
1353
|
-
**Speech generation.** `project_settings(action="generate_speech", ...)` wraps
|
|
1354
|
-
`Project.GenerateSpeech` (AI text-to-speech). It creates a new audio item and
|
|
1355
|
-
optionally places it on the timeline, so it is also confirm-token gated.
|
|
1356
|
-
Requires the *AI Speech Generator* Extra. Granular `--full` tool: `generate_speech`.
|
|
1357
|
-
|
|
1358
|
-
**Session control.** `resolve_control(action="disable_background_tasks_for_current_session")`
|
|
1359
|
-
wraps `Resolve.DisableBackgroundTasksForCurrentResolveSession()` to quiet
|
|
1360
|
-
background work during heavy scripted runs.
|
|
1361
|
-
|
|
1362
|
-
**Capability surface.** The `media_analysis` transcription-capability report and
|
|
1363
|
-
the control panel's boot payload (`resolve.ai_features`) now list which 21.0 AI
|
|
1364
|
-
methods are available and which Extras each gated method needs.
|
|
1365
|
-
|
|
1366
|
-
Notes: these are Resolve-local GPU/AI operations and do not consume the
|
|
1367
|
-
Claude-side analysis token budget, so they are not metered by the analysis-caps
|
|
1368
|
-
layer; the derivative-creating ones are protected by the confirm-token gate
|
|
1369
|
-
instead. The granular `--full` server grew from 329 to 341 tools.
|
|
1370
|
-
|
|
1371
|
-
## What's New in v2.28.1
|
|
1372
|
-
|
|
1373
|
-
Bug-fix release.
|
|
1374
|
-
|
|
1375
|
-
**Audio transcription no longer passes an invalid `language` argument.** The
|
|
1376
|
-
`transcribe_audio` (clip) and `transcribe_folder_audio` tools in the full
|
|
1377
|
-
(`--full`) server were calling `TranscribeAudio(language)` with a language
|
|
1378
|
-
string, but the Resolve scripting API has never accepted a language positional —
|
|
1379
|
-
its signature is `TranscribeAudio(useSpeakerDetection=None)`. The string was
|
|
1380
|
-
silently coerced to a truthy boolean and misread as a speaker-detection flag,
|
|
1381
|
-
and the success message falsely claimed a transcription language. The language
|
|
1382
|
-
is controlled by the project's Speech Recognition setting, not per call.
|
|
1383
|
-
|
|
1384
|
-
- `transcribe_audio(clip_name, use_speaker_detection=None)` — the `language`
|
|
1385
|
-
parameter is replaced with an optional `use_speaker_detection` boolean
|
|
1386
|
-
(Resolve 21+). Omit it to use the project's setting.
|
|
1387
|
-
- `transcribe_folder_audio(folder_name, use_speaker_detection=None)` — same
|
|
1388
|
-
change for the folder-level tool.
|
|
1389
|
-
- Both pass the boolean through only when supplied, so older Resolve builds
|
|
1390
|
-
(which take no argument) keep working.
|
|
1391
|
-
|
|
1392
|
-
The consolidated 32-tool server was unaffected — its `folder`/`media_pool_item`
|
|
1393
|
-
`transcribe_audio` actions already called `TranscribeAudio()` correctly.
|
|
1394
|
-
|
|
1395
|
-
## What's New in v2.28.0
|
|
1396
|
-
|
|
1397
|
-
This release adds a structural timeline-diff engine, a declarative project spec
|
|
1398
|
-
you can `apply` like infrastructure-as-code, a project health `lint`, a clip
|
|
1399
|
-
query DSL, and a machine-readable `state` field on error responses.
|
|
1400
|
-
|
|
1401
|
-
**Timeline version diff — see exactly what an edit changed.** Comparing two
|
|
1402
|
-
archived timeline versions now reports clips that were **added, removed, moved,
|
|
1403
|
-
and trimmed**, plus summary counts and before/after clip totals. A new reusable
|
|
1404
|
-
diff engine aligns clips by a rename-stable identity (so a reordered or renamed
|
|
1405
|
-
clip reads as a move/change, not a delete-and-re-add).
|
|
1406
|
-
|
|
1407
|
-
- `timeline_versioning(action="diff_versions", timeline_name, from_version, to_version)`
|
|
1408
|
-
now returns `{added, removed, moved, trimmed, summary}` (the previous
|
|
1409
|
-
`added`/`removed`/`moved` keys are unchanged).
|
|
1410
|
-
- Dashboard endpoint `GET /api/timeline_versions/diff?timeline_name=&from_version=&to_version=`
|
|
1411
|
-
exposes the same diff to the control panel.
|
|
1412
|
-
|
|
1413
|
-
**Declarative project spec + `apply` — reproducible project setup.** Describe a
|
|
1414
|
-
project's desired settings, color preset, timelines, and markers in a
|
|
1415
|
-
`project.dvr.yaml` (or `.json`), then reconcile the live project toward it. Runs
|
|
1416
|
-
are **idempotent** — applying twice is a no-op — and a dry run previews every
|
|
1417
|
-
change before anything is touched.
|
|
1418
|
-
|
|
1419
|
-
- New MCP actions on `project_manager`:
|
|
1420
|
-
- `diff_to_spec(spec_path | spec)` — preview drift without mutating.
|
|
1421
|
-
- `plan_spec(spec_path | spec)` — the ordered action list (dry run).
|
|
1422
|
-
- `apply_spec(spec_path | spec, dry_run?, run_hooks?, continue_on_error?)` —
|
|
1423
|
-
reconcile. Color/HDR settings apply in dependency order; markers are only
|
|
1424
|
-
added when absent; an explicit `color_preset` can be overridden by explicit
|
|
1425
|
-
`settings`. Failures can abort on first error or accumulate.
|
|
1426
|
-
- New headless CLI commands: `davinci-resolve-mcp batch plan-spec SPEC` and
|
|
1427
|
-
`davinci-resolve-mcp batch apply SPEC [--dry-run] [--run-hooks] [--continue-on-error]`.
|
|
1428
|
-
Exit codes follow the existing convention (`0` ok, `2` partial, `3` fatal).
|
|
1429
|
-
- Optional before/after shell **hooks** in the spec run only when `run_hooks` is
|
|
1430
|
-
passed (opt-in).
|
|
1431
|
-
|
|
1432
|
-
**Project health `lint` — a pre-flight before editing.** `project_manager(action="lint")`
|
|
1433
|
-
returns a graded issue list (errors / warnings / info) covering: no project, no
|
|
1434
|
-
current timeline, mixed frame rates across timelines, empty timelines, unset
|
|
1435
|
-
render format, unmanaged color science, offline media, and unanalyzed clips.
|
|
1436
|
-
|
|
1437
|
-
**Clip query DSL — find clips in one call.** `timeline(action="clip_where", ...)`
|
|
1438
|
-
returns the clips on the current timeline matching named filters (AND), instead
|
|
1439
|
-
of enumerating tracks by hand. Live filters: `track_type`, `track_index`,
|
|
1440
|
-
`name_contains`, `duration_lt`, `duration_gt`. A typo'd filter name is rejected
|
|
1441
|
-
rather than silently matching everything.
|
|
1442
|
-
|
|
1443
|
-
**Machine-readable error context.** Structured error responses can now carry an
|
|
1444
|
-
optional `state` object — a snapshot of the relevant values at failure time
|
|
1445
|
-
(e.g. which filter was unknown, which spec failed and where) — so an agent can
|
|
1446
|
-
react without parsing prose. Existing error fields are unchanged.
|
|
1447
|
-
|
|
1448
|
-
## What's New in v2.27.2
|
|
1449
|
-
|
|
1450
|
-
**Control panel under-counted analyzed clips after a Media Pool rename (issue
|
|
1451
|
-
#51)** — with every clip analyzed (e.g. 303/303 reports on disk), the overview
|
|
1452
|
-
and Media tab could report something like "108 / 303 analyzed". The panel only
|
|
1453
|
-
recognized a report when a folder's name exactly matched the clip's *current*
|
|
1454
|
-
display name, so renaming clips after analysis hid their existing reports even
|
|
1455
|
-
though the underlying media was unchanged.
|
|
1456
|
-
|
|
1457
|
-
Root cause and fix:
|
|
1458
|
-
|
|
1459
|
-
- **Lookups are keyed by a rename-stable hash, not the display-name folder.**
|
|
1460
|
-
Report folders are named `<display-slug>-<hash>`; the count now matches on the
|
|
1461
|
-
trailing hash (and the ids inside each report), so a renamed clip still
|
|
1462
|
-
resolves to its existing folder. Both the disk path and the jobs-DB fallback
|
|
1463
|
-
were corrected.
|
|
1464
|
-
- **The hash is now anchored to the normalized file path (canonical basis).**
|
|
1465
|
-
Previously the basis was a `clip_id`-first cascade, so the same media hashed
|
|
1466
|
-
differently depending on which fields a record carried — Resolve inventory
|
|
1467
|
-
(clip_id) vs path-based batch jobs (file path) disagreed on the same clip.
|
|
1468
|
-
Anchoring to the file path removes that cross-basis mismatch. Legacy folders
|
|
1469
|
-
(clip_id-based, or raw-path-based) still resolve via a migration-safe set of
|
|
1470
|
-
candidate hashes, so **no on-disk migration is required**.
|
|
1471
|
-
- **Writes reuse an existing report folder** (matched by canonical or legacy
|
|
1472
|
-
hash) instead of minting a new `<newslug>-<hash>` directory, eliminating
|
|
1473
|
-
orphaned duplicate folders when a renamed clip is re-analyzed.
|
|
1474
|
-
- **A persisted clip index (`clips/index.json`)** maps every stable id found in
|
|
1475
|
-
a report (normalized + raw file path, clip_id, media_id) to its folder, so the
|
|
1476
|
-
count can still match a clip by any id it carries — including an offline clip
|
|
1477
|
-
that no longer reports a file path but retains its clip_id. The index is
|
|
1478
|
-
refreshed only when a report is added, removed, or rewritten (cheap signature
|
|
1479
|
-
check), so the recurring poll stays inexpensive.
|
|
1480
|
-
|
|
1481
|
-
No public MCP tool surface changed. Adds regression tests in
|
|
1482
|
-
`tests/test_media_analysis.py` covering rename, cross-basis, legacy-folder reuse,
|
|
1483
|
-
the jobs-DB fallback, and the offline/no-path case.
|
|
1484
|
-
|
|
1485
|
-
## What's New in v2.27.1
|
|
1486
|
-
|
|
1487
|
-
**Faster control-panel startup with network source media (issue #50)** — on
|
|
1488
|
-
first open the control panel could sit on "connection pending" for a long time
|
|
1489
|
-
when Media Pool clips lived on mounted network storage, because the UI only
|
|
1490
|
-
treated the connection as live once the full media inventory finished loading,
|
|
1491
|
-
and that inventory probed every clip's file path on disk.
|
|
1492
|
-
|
|
1493
|
-
Fixes and performance work:
|
|
1494
|
-
|
|
1495
|
-
- **Connection state is decoupled from the media inventory.** The overview and
|
|
1496
|
-
diagnostics panels now derive "connected" from the `/api/boot` handshake (which
|
|
1497
|
-
returns as soon as the Resolve bridge is reachable) and show inventory loading
|
|
1498
|
-
separately, so Resolve reads as live immediately while clips stream in.
|
|
1499
|
-
- **Parallel, cached file-existence probing.** `os.path.exists` for every clip
|
|
1500
|
-
now runs in a thread pool and is memoized for a short TTL, instead of two serial
|
|
1501
|
-
`stat()` calls per clip — the dominant cost on network storage.
|
|
1502
|
-
- **Background polls reuse the cached Media Pool walk.** The recurring poll no
|
|
1503
|
-
longer re-runs the ~N serial `GetClipProperty` calls; it reuses the last walk
|
|
1504
|
-
and re-applies only the local, disk-backed analysis-status overlay. A cheap
|
|
1505
|
-
project-id check still catches a project switched directly in Resolve, and a
|
|
1506
|
-
manual refresh always does a full walk.
|
|
1507
|
-
- **Resolve scripting API access is serialized.** A re-entrant lock guards every
|
|
1508
|
-
scripting-API entry point, since the dashboard's threaded HTTP server could
|
|
1509
|
-
previously fire concurrent (thread-unsafe) Resolve calls at startup.
|
|
1510
|
-
- **ETag/304 on the inventory endpoint** skips transfer and table re-render when
|
|
1511
|
-
nothing changed; the last good inventory is cached client-side and painted
|
|
1512
|
-
instantly on reload; and the first inventory build is warmed in a background
|
|
1513
|
-
thread at server start.
|
|
1514
|
-
|
|
1515
|
-
No public MCP tool surface changed. Adds regression tests in
|
|
1516
|
-
`tests/test_media_analysis.py` (path-existence probing, inventory cache reuse,
|
|
1517
|
-
project-switch detection, lock reentrancy).
|
|
1518
|
-
|
|
1519
|
-
## What's New in v2.27.0
|
|
1520
|
-
|
|
1521
|
-
**Frame-sampling modes (issue #46)** — how many frames a clip gets for visual
|
|
1522
|
-
analysis is now governed by a `sampling_mode`, decoupled from `depth` (which
|
|
1523
|
-
still controls which layers run). A fixed frame count over-sampled short clips
|
|
1524
|
-
and under-covered long ones; the demand-driven engine already scaled by
|
|
1525
|
-
duration/content, but the caps layer was flat-truncating its output back to 8
|
|
1526
|
-
frames — that flat cap was the real cause of long-clip under-coverage.
|
|
1527
|
-
|
|
1528
|
-
Four clearly-tiered modes, organized so token cost is predictable per tier:
|
|
1529
|
-
|
|
1530
|
-
- **Economy** (`fixed`) — flat N evenly-spaced, content-blind frames. Cheapest and
|
|
1531
|
-
most predictable; good for proxies/triage.
|
|
1532
|
-
- **Balanced** (`per_minute`) — `clamp(minutes × frames_per_minute, floor, ceiling)`
|
|
1533
|
-
(defaults 4/min, 3–80). Cost is linear in footage length; content-blind.
|
|
1534
|
-
- **Thorough** (`adaptive_capped`, recommended/default) — content-aware: samples
|
|
1535
|
-
shot boundaries, representatives, and flash candidates, bounded to `[floor,
|
|
1536
|
-
ceiling]`. Best coverage with a bounded cost.
|
|
1537
|
-
- **Thorough (uncapped)** (`adaptive`) — content-aware with no per-clip ceiling
|
|
1538
|
-
(up to the 512-frame hard cap). Use only when clips are short or few.
|
|
1539
|
-
|
|
1540
|
-
The first time you analyze without a saved default, the tool returns a
|
|
1541
|
-
`confirmation_required` response with a `sampling_mode_prompt`; choosing a mode
|
|
1542
|
-
saves it as your standing default (mirrors `timed_markers_default`). Pass
|
|
1543
|
-
`sampling_mode` per call any time for a one-off that doesn't change the default.
|
|
1544
|
-
Tunables (`frames_per_minute`, `frame_floor`, `frame_ceiling`) and the mode are
|
|
1545
|
-
all exposed in the control panel (Preferences → Frame sampling mode) with a live
|
|
1546
|
-
per-clip token-cost estimate; batch jobs honor the saved default.
|
|
1547
|
-
|
|
1548
|
-
Analysis-caps presets were retuned so `frames_per_clip` is now a *safety ceiling*
|
|
1549
|
-
(minimal/standard/generous = 12/80/200), not the primary frame dial, and the
|
|
1550
|
-
per-clip/job/day vision-token caps were raised so the default Thorough mode isn't
|
|
1551
|
-
refused by the per-clip token cap. Cache reuse re-samples only when switching up
|
|
1552
|
-
the thoroughness rank; a richer prior report still satisfies a cheaper mode. Adds
|
|
1553
|
-
`tests/test_sampling_modes.py` (30 tests). Validated end-to-end on a synthetic
|
|
1554
|
-
multi-shot clip with real ffmpeg frame extraction.
|
|
1555
|
-
|
|
1556
|
-
## What's New in v2.26.1
|
|
1557
|
-
|
|
1558
|
-
**Python 3.13 / 3.14 support (issue #45)** — `npx davinci-resolve-mcp setup`
|
|
1559
|
-
previously hard-refused any interpreter outside 3.10–3.12, so it failed outright
|
|
1560
|
-
on Python 3.14. The 3.12 ceiling was based on a stale assumption that Resolve's
|
|
1561
|
-
scripting bridge has ABI incompatibilities on 3.13+. Verified empirically against
|
|
1562
|
-
DaVinci Resolve Studio 20.3.2.9: Python 3.14.4 connects and exercises the
|
|
1563
|
-
dict/list marshalling paths cleanly. The launcher and installer now enforce only
|
|
1564
|
-
the 3.10 floor (the `mcp[cli]` SDK requirement) with no upper cap. Python 3.13/3.14
|
|
1565
|
-
are accepted with a soft heads-up; `setup`/`doctor` surface a precise,
|
|
1566
|
-
connection-aware hint only when Resolve is running but the bridge returns no
|
|
1567
|
-
connection on 3.13+. Sub-3.10 interpreters get an actionable error instead of a
|
|
1568
|
-
dead end. `server.py` warns (never exits) on 3.13+. Adds 6 version-gate unit tests.
|
|
1569
|
-
|
|
1570
|
-
## What's New in v2.26.0
|
|
1571
|
-
|
|
1572
|
-
**Fusion group-settings helpers** — Three new `fusion_comp` actions for
|
|
1573
|
-
authoring and patching `GroupOperator` macros without leaving the kernel.
|
|
1574
|
-
`group_settings_export` writes a live group to a `.setting` file and returns a
|
|
1575
|
-
parsed `published_inputs` summary using a balanced-brace walker so nested
|
|
1576
|
-
`UserControls` / `ControlGroup` tables are bounded correctly (the original
|
|
1577
|
-
flat-regex parser truncated `InstanceInput` bodies at the first inner `}`).
|
|
1578
|
-
`group_settings_splice_inputs` replaces the `Inputs = ordered() { ... }` block
|
|
1579
|
-
of one `.setting` with the matching block from another, preserving the source's
|
|
1580
|
-
outer structure and inner `Tools`. `group_settings_load` applies a `.setting`
|
|
1581
|
-
to a live group with an automatic timestamped backup, wrapped in
|
|
1582
|
-
`StartUndo`/`Lock`/`LoadSettings`/`Unlock`/`EndUndo(True)` so Fusion's Ctrl+Z
|
|
1583
|
-
reverses the change — verified live via direct BMD API.
|
|
1584
|
-
|
|
1585
|
-
**bulk_set_expressions** — Companion to the existing `bulk_set_inputs`. Batch
|
|
1586
|
-
attach Fusion expressions across many timeline-item comps in one call. Each op
|
|
1587
|
-
requires timeline scope plus `tool_name`, `input_name`, `expression`. Returns
|
|
1588
|
-
per-op `success`/`error` rows + `op_count`, matching the bulk-inputs contract.
|
|
1589
|
-
Useful for animating many controls at once (`time/30`, etc.) under a single
|
|
1590
|
-
chat turn.
|
|
1591
|
-
|
|
1592
|
-
**Headless batch-runner CLI** — New
|
|
1593
|
-
`davinci-resolve-mcp batch <plan|run|status|list|resume|cancel>` subcommand
|
|
1594
|
-
drives `src/utils/media_analysis_jobs` from outside an MCP/chat client so long
|
|
1595
|
-
analysis batches can run via cron, CI, or terminal without holding a chat turn
|
|
1596
|
-
open. The orchestration loop and durable state stay in the existing jobs
|
|
1597
|
-
engine; the CLI only handles argv, progress streaming, and exit codes
|
|
1598
|
-
(`0` ok / `2` partial / `3` fatal / `130` Ctrl+C). JSON mode (`--json`)
|
|
1599
|
-
emits one record per progress event for log scraping. Closes #42.
|
|
1600
|
-
|
|
1601
|
-
**Adapted from PR #40** — Group-settings work originated as a contribution
|
|
1602
|
-
from @RaincloudTheDragon; PR #43 retains the keepable parts (parser, exporter,
|
|
1603
|
-
splicer, loader, `bulk_set_expressions`) with a balanced-brace fix on the
|
|
1604
|
-
parser and an undo+lock wrap on `group_settings_load`. The two AMZ-specific
|
|
1605
|
-
templates and the static checklist from #40 were dropped as out-of-scope for a
|
|
1606
|
-
general kernel.
|
|
1607
|
-
|
|
1608
|
-
## What's New in v2.25.0
|
|
1609
|
-
|
|
1610
|
-
**Agentic flow improvements** — A second-pass review against the Claude
|
|
1611
|
-
Certified Architect study material drove a sweep of correctness gains. Every
|
|
1612
|
-
tool error now returns a structured envelope (`code` / `category` /
|
|
1613
|
-
`retryable` / `reason` / `remediation` / `message`); `retryable` defaults are
|
|
1614
|
-
locked per category so a host can make a one-shot retry decision without
|
|
1615
|
-
inference. Compound-tool descriptions for `media_analysis` and
|
|
1616
|
-
`timeline_item_color` adopt XML semantic tags (`<when_to_use>`, `<actions>`,
|
|
1617
|
-
`<returns>`) for cheaper per-turn parsing. Repeated failures on the same
|
|
1618
|
-
`(scope, action)` pair attach an `escalation` block on the 3rd response —
|
|
1619
|
-
halts auto-retry loops with a `suggested_action` for the host. Batch
|
|
1620
|
-
manifests now always carry `partial_success`, `completed_clip_ids`, and
|
|
1621
|
-
`failed_clip_ids` for safe targeted retry.
|
|
1622
|
-
|
|
1623
|
-
**MCP resources surface** — 8 read-only resource URIs the host can poll
|
|
1624
|
-
without paying a tool-turn cost: `status://mcp_version`,
|
|
1625
|
-
`status://resolve_connection`, `status://current_project`,
|
|
1626
|
-
`status://current_timeline`, `status://caps_preset`,
|
|
1627
|
-
`analysis://recent_reports`, `capabilities://installed_tools`,
|
|
1628
|
-
`capabilities://install_guidance`. Paired tools still work for hosts that
|
|
1629
|
-
don't consume resources.
|
|
1630
|
-
|
|
1631
|
-
**MCP prompts surface** — 5 slash-command workflow templates:
|
|
1632
|
-
`/davinci-resolve:analyze_and_propose_grade`,
|
|
1633
|
-
`/davinci-resolve:match_bin_to_hero`,
|
|
1634
|
-
`/davinci-resolve:verify_timeline_coverage`,
|
|
1635
|
-
`/davinci-resolve:open_and_analyze_selection`,
|
|
1636
|
-
`/davinci-resolve:prep_color_handoff`. First-class agentic intent, no
|
|
1637
|
-
re-derivation from SKILL.md prose.
|
|
1638
|
-
|
|
1639
|
-
**Color-grading evidence base** — `timeline_item_color.grade_evidence_base`
|
|
1640
|
-
composes `version_snapshot` + `node_graph` + `color_group` + coverage report
|
|
1641
|
-
into a single `evidence_base` summary string; the SKILL guide now teaches
|
|
1642
|
-
agents to lead any color recommendation with that line.
|
|
1643
|
-
`timeline_item_color.propose_grade` formalizes a recommendation as a
|
|
1644
|
-
validated structured plan (returns `plan_id` + `preview_path`; requires
|
|
1645
|
-
explicit `execute=true` re-call). `bulk_match_to_hero` drives CDL-delta or
|
|
1646
|
-
copy-grade across many targets with a `confirm_token` gate and dry-run
|
|
1647
|
-
preview.
|
|
1648
|
-
|
|
1649
|
-
**Analysis caps layer** — Token-budget governance for analysis. 7 cap
|
|
1650
|
-
dimensions across vision/transcription/job/clip/day scopes, 4 named presets
|
|
1651
|
-
(`minimal` / `standard` / `generous` / `unlimited`), pre-call refusal with
|
|
1652
|
-
`CAPS_REFUSAL` / `budget_exhausted` / `retryable: false`. New
|
|
1653
|
-
`media_analysis` actions: `get_caps`, `set_caps_preset`. Token usage table
|
|
1654
|
-
in the analysis DB plus a control-panel widget with gauges + override
|
|
1655
|
-
inputs. Wall-clock timeout helper wraps vision/transcription call sites.
|
|
1656
|
-
|
|
1657
|
-
**Timeline versioning + analysis↔timeline marriage** — New
|
|
1658
|
-
`timeline_versioning` MCP tool: every destructive timeline edit
|
|
1659
|
-
auto-archives the current timeline into an Archive bin (compound, captions,
|
|
1660
|
-
ripple, gap close, etc.), so versions can be diffed and rolled back. Run
|
|
1661
|
-
scoping, schema v4 migrations, concurrency safety, structural snapshots,
|
|
1662
|
-
action filtering, strict mode, auto-save preference, media-pool destructive
|
|
1663
|
-
coverage, thumbnails. Backed by new modules `timeline_versioning.py`,
|
|
1664
|
-
`timeline_brain_db.py`, `brain_edits.py`, `analysis_runs.py`,
|
|
1665
|
-
`media_pool_changes.py`, `destructive_hook.py`. Surfaced in the control
|
|
1666
|
-
panel's Review → History view.
|
|
1667
|
-
|
|
1668
|
-
**Async opt-in for long-running ops** — `analyze_clip` / `analyze_file` /
|
|
1669
|
-
`commit_vision` accept `prefer_handle: true`. When set (and the estimated
|
|
1670
|
-
runtime exceeds the configured threshold), the response is a fast handoff
|
|
1671
|
-
with `job_id` + `status: "queued"`; poll `batch_job_status({job_id})`.
|
|
1672
|
-
Default behavior unchanged.
|
|
1673
|
-
|
|
1674
|
-
**Aggregated provenance** — `summarize`,
|
|
1675
|
-
`review_timeline_markers`, and `grade_evidence_base` now return a
|
|
1676
|
-
`provenance` block: `source_reports[]` (clip_id, signature, report_path,
|
|
1677
|
-
analyzed_at), `missing_reports[]` (per reason: `no_report` / `stale_report`
|
|
1678
|
-
/ `caps_refused`), and inline `[ref:<clip_id>]` citations in the human
|
|
1679
|
-
summary text. Multi-clip claims are now traceable.
|
|
1680
|
-
|
|
1681
|
-
**Confirm-token gates on destructive batches** — `propose_grade`,
|
|
1682
|
-
`bulk_match_to_hero`, and other multi-target writes now require an explicit
|
|
1683
|
-
`confirm_token` on first execute (returned on the dry-run), with a
|
|
1684
|
-
`pending_user_decision` error if missing.
|
|
1685
|
-
|
|
1686
|
-
**Action-help indirection** — `action_help(name=...)` returns the long-form
|
|
1687
|
-
guidance for a single action, keeping the top-level tool descriptions
|
|
1688
|
-
compact while preserving full per-action documentation.
|
|
1689
|
-
|
|
1690
|
-
**Tool-choice hint emission** — Analyze responses include a
|
|
1691
|
-
`host_tool_choice_hint` block. Hosts that respect it pass
|
|
1692
|
-
`tool_choice={type:"tool", name:"media_analysis"}` on the next API turn,
|
|
1693
|
-
hard-locking the agent into the correct next call.
|
|
1694
|
-
|
|
1695
|
-
**Update process hardening** — Five improvements layered onto the
|
|
1696
|
-
update-check path: active-job lock prevents updates mid-analysis, auto-stash
|
|
1697
|
-
strategy preserves uncommitted work across updates, restart-needed marker
|
|
1698
|
-
surfaces to the host, channels (`stable` / `beta` / `dev`), pre-update
|
|
1699
|
-
breaking-change scan, integrity SHA verification of downloaded artifacts,
|
|
1700
|
-
update history table, eager DB migration on update, and rollback to the
|
|
1701
|
-
previous build. New `analysis_caps.py` + `update_check.py` revisions.
|
|
1702
|
-
|
|
1703
|
-
**Source-safe guardrails** — `destructive_hook.py` + decorator coverage
|
|
1704
|
-
tests ensure every destructive surface goes through the auto-archive path
|
|
1705
|
-
and never modifies, transcodes, or creates derivatives of source media.
|
|
1706
|
-
|
|
1707
|
-
**Test surface** — 30+ new test modules covering error envelopes,
|
|
1708
|
-
failure tracking, partial-success manifests, `prefer_handle`, MCP resources,
|
|
1709
|
-
MCP prompts, provenance, XML description shape, `action_help`,
|
|
1710
|
-
`grade_evidence_base`, `propose_grade`, `bulk_match_to_hero`,
|
|
1711
|
-
`confirm_token`, the analysis caps layer, caps integration / events /
|
|
1712
|
-
history, timeline versioning, the timeline-brain DB, destructive decorator
|
|
1713
|
-
coverage, the destructive hook, update hardening, and update history.
|
|
1714
|
-
|
|
1715
|
-
**Validation** — `tests/test_import.py`, `scripts/audit_api_parity.py`,
|
|
1716
|
-
`node bin/davinci-resolve-mcp.mjs --version`, `npm pack --dry-run`, and
|
|
1717
|
-
`git diff --check` all pass. 375 focused unit tests pass. Live Resolve
|
|
1718
|
-
validation covered the D1–F2 surface end-to-end against project CKY /
|
|
1719
|
-
Timeline 7 (D1 `retryable`, D2 XML descriptions, D3 partial-success on
|
|
1720
|
-
plans + CAPS_REFUSAL manifests, E1 8 MCP resource URIs, E2 escalation on
|
|
1721
|
-
3× repeated failure, E3 `prefer_handle` job handoff with
|
|
1722
|
-
`batch_job_status` polling, F1 provenance block) — 6/6 PASS on the
|
|
1723
|
-
fourteenth-attempt smoke test. No source media was modified.
|
|
1724
|
-
|
|
1725
|
-
## What's New in v2.24.1
|
|
1726
|
-
|
|
1727
|
-
**`npx davinci-resolve-mcp` no longer breaks MCP clients when invoked without a
|
|
1728
|
-
subcommand.** The npm bootstrapper previously defaulted to `--help`, which wrote
|
|
1729
|
-
usage text to stdout and exited 0. MCP stdio clients (Hermes Agent, Claude
|
|
1730
|
-
Desktop, Cursor, etc.) read that as malformed JSON-RPC, retried three times,
|
|
1731
|
-
then dropped the connection. `bin/davinci-resolve-mcp.mjs` now defaults to the
|
|
1732
|
-
`server` subcommand when no arguments are supplied. Explicit `--help`, `-h`,
|
|
1733
|
-
`help`, `--version`, and `-v` continue to print to stdout as before, and
|
|
1734
|
-
existing configs that already pass `server` explicitly are unaffected. Reported
|
|
1735
|
-
in [#41](https://github.com/samuelgursky/davinci-resolve-mcp/issues/41).
|
|
1736
|
-
|
|
1737
|
-
## What's New in v2.24.0
|
|
1738
|
-
|
|
1739
|
-
**Host-chat vision protocol (V2)** — `analyze_*` actions now use
|
|
1740
|
-
`vision.provider="host_chat_paths"` by default. The analyze response is a
|
|
1741
|
-
deferred payload with absolute `frame_paths`, a per-shot `shot_table`, and a
|
|
1742
|
-
JSON schema; the host chat reads each frame as a local image, produces JSON per
|
|
1743
|
-
the schema, and calls `media_analysis(action="commit_vision", params={clip_id,
|
|
1744
|
-
visual, vision_token})` to finalize. `commit_vision` merges the visual report,
|
|
1745
|
-
rebuilds Media Pool clip markers, publishes metadata to Resolve, and preserves
|
|
1746
|
-
human corrections via `corrections.json`. Skipping the commit leaves the run in
|
|
1747
|
-
`pending_host_vision_analysis` — surfaced explicitly rather than silently
|
|
1748
|
-
downgraded. The legacy `chat_context`/`mcp_sampling` providers still resolve to
|
|
1749
|
-
the same host-chat path.
|
|
1750
|
-
|
|
1751
|
-
**Trust-by-default analysis defaults** — `analyze_media` defaults to
|
|
1752
|
-
`include_transcription=true`, `persist=true`, `publish_metadata=true`, and
|
|
1753
|
-
`timed_markers="ask"` so source-safe no longer means underpowered. Agents that
|
|
1754
|
-
need a technical-only or read-only run must explicitly pass
|
|
1755
|
-
`include_visuals=false`, `include_transcription=false`, `publish_metadata=false`,
|
|
1756
|
-
`timed_markers="no"`, `session_only=true`, or `dry_run=true`. The
|
|
1757
|
-
`analyze_media` prompt and SKILL.md spell out the anti-regression rule.
|
|
1758
|
-
|
|
1759
|
-
**Control panel: Review surface (Phase B)** — The local browser control panel
|
|
1760
|
-
gains a Review tab backed by new endpoints: `/api/clips`, `/api/clips/<id>`,
|
|
1761
|
-
`/api/clips/<id>/shots`, `/api/clips/<id>/shots/<index>`,
|
|
1762
|
-
`/api/clips/<id>/frames/<n>`, `/api/clips/<id>/transcript`,
|
|
1763
|
-
`/api/clips/<id>/corrections`, `/api/clips/combined`, `/api/clips/export`,
|
|
1764
|
-
`/api/panel_state`, `/api/update/status`, `/api/update/apply`, and
|
|
1765
|
-
`/api/resolve/open_clip`. The UI ships a bin grid with thumbnails, a clip
|
|
1766
|
-
detail with shot strip, a shot detail with grouped V2 fields + frame grid,
|
|
1767
|
-
inline correction editors per subjective field, transcript correction +
|
|
1768
|
-
regeneration, an Open-in-Resolve bridge, and 2-second chat ↔ panel state
|
|
1769
|
-
polling.
|
|
1770
|
-
|
|
1771
|
-
**Control panel MCP actions** — `resolve_control.open_control_panel`,
|
|
1772
|
-
`control_panel_status`, and `close_control_panel` manage the local panel
|
|
1773
|
-
subprocess via a pidfile. `save_state` / `restore_state` snapshot and restore
|
|
1774
|
-
Resolve playhead + selection state. `get_panel_state`, `set_panel_state`, and
|
|
1775
|
-
`session_start_context` share panel focus between chat and the UI through
|
|
1776
|
-
`panel_state.json`.
|
|
1777
|
-
|
|
1778
|
-
**Correction tools** — New `media_analysis` actions for editing analysis
|
|
1779
|
-
without re-running it: `update_shot_field`, `update_clip_field`,
|
|
1780
|
-
`get_field_history`, `revert_field`, `list_corrections`. Writes land in
|
|
1781
|
-
`{clip_dir}/corrections.json` with append-only changelog + provenance
|
|
1782
|
-
(mirrors the V2 DB schema). `commit_vision` merges corrections on top of the
|
|
1783
|
-
fresh visual report so human edits survive re-analysis.
|
|
1784
|
-
|
|
1785
|
-
**Media Pool item open-in-viewer** — `media_pool_item.open_in_viewer` selects
|
|
1786
|
-
a clip on the Media page and loads it into the source viewer, optionally
|
|
1787
|
-
setting mark in/out and bringing Resolve to the foreground via OS-level
|
|
1788
|
-
window activation. Useful for chat → Resolve hand-off.
|
|
1789
|
-
|
|
1790
|
-
**Source-trust prompt grading** — `source_trust` parameter
|
|
1791
|
-
(`auto`/`filename`/`low`/`medium`/`high`) on analyze actions tunes the vision
|
|
1792
|
-
prompt to hedge identity/intent/value for archival or thin-evidence clips.
|
|
1793
|
-
|
|
1794
|
-
**Analysis memory layer** — New `src/utils/analysis_memory.py` introduces
|
|
1795
|
-
per-project memory + heartbeat + bin summary + soul scaffolding under the
|
|
1796
|
-
analysis root. `regenerate_bin_summary_from_manifest` aggregates per-clip
|
|
1797
|
-
fields (primary use, select potential, style, energy arc, top tags/locations)
|
|
1798
|
-
into a bin briefing. Auto-initialized on analyze.
|
|
1799
|
-
|
|
1800
|
-
**Control-panel polish** — Diagnostics + Overview restyled with a status-pill
|
|
1801
|
-
design system, navbar dropdowns fixed so top-level buttons no longer navigate
|
|
1802
|
-
on their own, Preferences consolidated (Dashboard Convenience + Storage pages
|
|
1803
|
-
removed), summary-style enum renamed to `full`/`concise`/`creative`/
|
|
1804
|
-
`technical` with backwards compat, navbar version badge + update modal,
|
|
1805
|
-
source-trust dropdown wired through.
|
|
1806
|
-
|
|
1807
|
-
**Server-side bug fixes** — `commit_vision` auto-publish now reflects per-row
|
|
1808
|
-
status correctly (no silent-lie pending), compact analyze responses by default
|
|
1809
|
-
(`verbose: true` for the full manifest), `resolve_output_root` skips slug
|
|
1810
|
-
append when the configured base already terminates in the slug, frame sampler
|
|
1811
|
-
reserves per-shot budget so shot starts aren't starved by flash candidates,
|
|
1812
|
-
and machine markers are no longer written to Resolve (V2 architecture).
|
|
1813
|
-
|
|
1814
|
-
**Path hardening for GUI launches** — `media_analysis` now augments `PATH`
|
|
1815
|
-
with the standard tool dirs (`/opt/homebrew/bin`, `/usr/local/bin`, etc.) so
|
|
1816
|
-
ffprobe/ffmpeg resolve even when the MCP server is launched by a GUI app
|
|
1817
|
-
(Claude.app, Dock/Spotlight) that inherits launchd's bare PATH.
|
|
1818
|
-
|
|
1819
|
-
**Documentation** — `AGENTS.md` adds the "Media Analysis Defaults Are
|
|
1820
|
-
Mandatory" section. `docs/SKILL.md` rewrites the `analyze_media` prompt
|
|
1821
|
-
guidance for the host-chat-paths protocol and adds the anti-regression rule.
|
|
1822
|
-
`docs/guides/media-analysis-guide.md` covers the deferred vision payload and
|
|
1823
|
-
commit step.
|
|
1824
|
-
|
|
1825
|
-
**Validation**: static import checks, API parity audit, focused
|
|
1826
|
-
media-analysis + marker/range/v232/v233 unit tests, npm CLI smoke,
|
|
1827
|
-
`npm pack --dry-run`, and `git diff --check` all passed. No source media was
|
|
1828
|
-
modified. Resolve scripting behavior is additive (new actions; existing
|
|
1829
|
-
actions unchanged); live Resolve validation covered the control-panel +
|
|
1830
|
-
open_in_viewer + commit_vision auto-publish + corrections-merge paths during
|
|
1831
|
-
the V2 push sessions logged in MEMORY.md.
|
|
1832
|
-
|
|
1833
|
-
## What's New in v2.23.1
|
|
1834
|
-
|
|
1835
|
-
**Control panel navigation fixes** — The local browser control panel now keeps
|
|
1836
|
-
top-level dropdown buttons from navigating by themselves. Analysis,
|
|
1837
|
-
Diagnostics, Docs, and Preferences open their menus first; selecting a menu item
|
|
1838
|
-
is what changes the active view.
|
|
1839
|
-
|
|
1840
|
-
**Project dropdown cleanup** — The project context dropdown is back to showing
|
|
1841
|
-
only the open/current project context plus a bottom `View All Projects` option.
|
|
1842
|
-
The full database browser stays in the Projects view, and the standalone
|
|
1843
|
-
Projects navbar button has been removed.
|
|
1844
|
-
|
|
1845
|
-
**Validation**: static import checks, API parity audit, focused dashboard unit
|
|
1846
|
-
tests, npm CLI smoke tests, package dry-run, and `git diff --check` passed. A
|
|
1847
|
-
local dashboard smoke check verified the served HTML on `127.0.0.1:8765`.
|
|
1848
|
-
No Resolve scripting behavior changed; live Resolve mutation validation was not
|
|
1849
|
-
required.
|
|
1850
|
-
|
|
1851
|
-
## What's New in v2.23.0
|
|
1852
|
-
|
|
1853
|
-
**npm installer** — `npx davinci-resolve-mcp setup` is now the primary quick
|
|
1854
|
-
start. The npm package bootstraps a managed per-user install, runs the existing
|
|
1855
|
-
Python installer from that stable location, and keeps MCP client configs pointed
|
|
1856
|
-
at the managed virtual environment and `src/server.py`.
|
|
1857
|
-
|
|
1858
|
-
**Local control panel** — Added a single-user browser control panel for server
|
|
1859
|
-
status, Resolve clip visibility, source-safe analysis jobs, analysis search, and
|
|
1860
|
-
preference management. It can be launched from source with
|
|
1861
|
-
`venv/bin/python -m src.control_panel` or from npm with
|
|
1862
|
-
`npx davinci-resolve-mcp control-panel`.
|
|
1863
|
-
|
|
1864
|
-
**Durable media-analysis jobs and search** — `media_analysis` can now create,
|
|
1865
|
-
slice, inspect, cancel, resume, and list durable analysis jobs. Persisted reports
|
|
1866
|
-
refresh a single-user SQLite index with clip, marker, timeline occurrence,
|
|
1867
|
-
keyframe, and transcript search helpers through `build_index`, `index_status`,
|
|
1868
|
-
and `query_index`.
|
|
1869
|
-
|
|
1870
|
-
**Release automation** — Added npm package metadata, package-content guards, and
|
|
1871
|
-
a tag-driven GitHub Actions workflow for trusted npm publishing with provenance.
|
|
1872
|
-
The workflow skips publish when the package version already exists, which keeps
|
|
1873
|
-
the first manual npm registration from fighting the later tag workflow.
|
|
1874
|
-
|
|
1875
|
-
**Validation**: static import checks, API parity audit, focused media-analysis,
|
|
1876
|
-
update-check, and media-pool ingest unit tests passed. npm smoke tests, setup
|
|
1877
|
-
dry-run, package dry-run, and `git diff --check` passed. No source media was
|
|
1878
|
-
modified.
|
|
1879
|
-
|
|
1880
|
-
## What's New in v2.22.0
|
|
1881
|
-
|
|
1882
|
-
**Configurable MCP update prompting** — Update checks now carry a persisted
|
|
1883
|
-
policy: `prompt`, `auto`, `notify`, or `never`. The server still never blocks
|
|
1884
|
-
MCP stdio startup, but the installer can prompt users to update, continue,
|
|
1885
|
-
snooze for 24 hours, ignore the current release, enable safe auto-update, or
|
|
1886
|
-
disable checks. Safe auto-update is opt-in and only attempts a clean git
|
|
1887
|
-
fast-forward from checkouts with no local changes and a configured upstream.
|
|
1888
|
-
|
|
1889
|
-
**MCP update controls** — `resolve_control.mcp_update_status` reports the local
|
|
1890
|
-
MCP version, cached or forced update status, and the current prompt decision.
|
|
1891
|
-
`set_mcp_update_policy`, `ignore_mcp_update`, `snooze_mcp_update`, and
|
|
1892
|
-
`clear_mcp_update_preferences` expose the same policy state through the
|
|
1893
|
-
compound server without requiring Resolve to be connected.
|
|
1894
|
-
|
|
1895
|
-
**Conversation setup defaults** — New `setup` compound tool centralizes
|
|
1896
|
-
conversation-configurable defaults. It can read, set, dry-run, and clear
|
|
1897
|
-
preferences for media-analysis modality, slate detection, transcription,
|
|
1898
|
-
analysis persistence, metadata publish fields and overwrite policy, timed marker
|
|
1899
|
-
types/colors/counts, report style, preferred analysis roots, post-operation page
|
|
1900
|
-
behavior, and MCP update interval/snooze policy. These defaults shape future
|
|
1901
|
-
tool calls while preserving explicit confirmation for Resolve project writes.
|
|
1902
|
-
|
|
1903
|
-
**Metadata field inventory** — `media_pool.metadata_field_inventory` gives
|
|
1904
|
-
assistant editors and metadata workflows a read-only map of clip metadata,
|
|
1905
|
-
clip-property keys, default analysis writeback fields, optional slate fields,
|
|
1906
|
-
and inferred Resolve Metadata-panel groups. This helps bridge analysis
|
|
1907
|
-
publishing to the fields Resolve actually exposes on a given clip/build.
|
|
1908
|
-
|
|
1909
|
-
**Optional timed analysis markers** — `media_analysis.publish_clip_metadata`
|
|
1910
|
-
can now write source-frame Media Pool clip markers for slate claps, best
|
|
1911
|
-
moments, and QC warnings when the user opts in. If no marker preference exists,
|
|
1912
|
-
the tool returns a prompt with yes/no/default-yes/default-no choices rather than
|
|
1913
|
-
silently writing markers.
|
|
1914
|
-
|
|
1915
|
-
**Validation**: static import checks, API parity audit, `git diff --check`, and
|
|
1916
|
-
focused update-check, media-analysis, and media-pool ingest unit tests passed.
|
|
1917
|
-
Media-pool ingest tests cover the new metadata inventory and Metadata-panel
|
|
1918
|
-
group hints. Live validation used DaVinci Resolve Studio 20.3.2.9 through the
|
|
1919
|
-
connected MCP server with a disposable project and synthetic media only. It
|
|
1920
|
-
verified `metadata_field_inventory`, `MediaPool.ExportMetadata()` header
|
|
1921
|
-
comparison, default analysis writeback field mapping, and `SetMetadata()`
|
|
1922
|
-
readback for analysis and slate fields. The standalone live metadata inventory
|
|
1923
|
-
harness is included for future release validation with a Resolve-compatible
|
|
1924
|
-
Python 3.10-3.12 interpreter.
|
|
1925
|
-
|
|
1926
|
-
## What's New in v2.21.0
|
|
1927
|
-
|
|
1928
|
-
**Resolve metadata publishing from analysis** —
|
|
1929
|
-
`media_analysis.publish_clip_metadata` turns source-safe analysis reports into
|
|
1930
|
-
Resolve-native clip metadata. It proposes field-specific merges for
|
|
1931
|
-
`Description`, `Comments`, `Keywords`, `People`, and optional slate-derived
|
|
1932
|
-
fields, preserves existing human metadata by default, writes provenance to
|
|
1933
|
-
third-party metadata, and requires `confirm=true` before mutating Resolve.
|
|
1934
|
-
|
|
1935
|
-
**Slate-aware metadata proposals** — Metadata publishing can reuse
|
|
1936
|
-
`detect_sync_events` slate-clap evidence and, when chat-context sampling is
|
|
1937
|
-
available, inspect frames around the clap for high-confidence slate fields before
|
|
1938
|
-
proposing `Scene`, `Shot`, `Take`, `Camera #`, and `Roll/Card` writes.
|
|
1939
|
-
|
|
1940
|
-
**MCP update visibility** — The installer and both MCP server entrypoints now
|
|
1941
|
-
perform a best-effort GitHub release check, cache the result under `logs/`, and
|
|
1942
|
-
surface the local MCP version plus last update-check status from
|
|
1943
|
-
`resolve_control.get_version`. Checks are informational only and never install
|
|
1944
|
-
code automatically.
|
|
1945
|
-
|
|
1946
|
-
**Validation**: static/import checks, API parity audit, focused media-analysis,
|
|
1947
|
-
sync-event, and update-check unit tests passed. Live validation used DaVinci
|
|
1948
|
-
Resolve Studio 20.3.2.9 through the active Resolve script runner with disposable
|
|
1949
|
-
projects and synthetic media only. `tests/live_metadata_publish_validation.py`
|
|
1950
|
-
verified dry-run previews, confirmed metadata writes, human metadata
|
|
1951
|
-
preservation, keyword merging, third-party provenance, and cleanup;
|
|
1952
|
-
`tests/live_sync_event_validation.py` revalidated 2-pop/slate-clap detection and
|
|
1953
|
-
confirmed marker writes.
|
|
1954
|
-
|
|
1955
|
-
## What's New in v2.20.0
|
|
1956
|
-
|
|
1957
|
-
**Sync event detection helper** — `media_analysis.detect_sync_events` detects
|
|
1958
|
-
likely audio 2-pops and slate claps with FFprobe/FFmpeg, returns advisory
|
|
1959
|
-
frame/timecode positions, and suggests per-file `record_offset` values for
|
|
1960
|
-
`media_pool.setup_multicam_timeline(sync_mode="record_frame")`. The helper is
|
|
1961
|
-
source-safe and never installs FFmpeg automatically. It also returns marker
|
|
1962
|
-
suggestions; `media_analysis.add_sync_event_markers` writes Media Pool item
|
|
1963
|
-
markers only when called separately with `confirm=true`.
|
|
1964
|
-
|
|
1965
|
-
**Validation**: static/import checks, API parity audit, focused media-analysis
|
|
1966
|
-
and multicam unit tests, and `tests/live_sync_event_validation.py` passed. The
|
|
1967
|
-
live run used DaVinci Resolve Studio 20.3.2.9, a disposable project, and
|
|
1968
|
-
synthetic audio only; it verified detection, confirmation refusal, confirmed
|
|
1969
|
-
Media Pool marker writes, and cleanup.
|
|
1970
|
-
|
|
1971
|
-
## What's New in v2.19.0
|
|
1972
|
-
|
|
1973
|
-
**Multicam setup support** — `media_pool.setup_multicam_timeline` creates a
|
|
1974
|
-
source-safe stacked prep timeline from Media Pool clips, with one angle per video
|
|
1975
|
-
track, optional matching audio tracks, and stack-start, manual record-frame, or
|
|
1976
|
-
source-timecode planning. Native multicam clip conversion remains a Resolve UI
|
|
1977
|
-
step because the public scripting API does not expose a multicam-create method;
|
|
1978
|
-
the current UI workflow is documented in the DaVinci Resolve 20 Manual,
|
|
1979
|
-
Edit > Chapter 42, "Multicam Editing."
|
|
1980
|
-
|
|
1981
|
-
**Documentation**: added `docs/guides/multicam-setup-guide.md` and linked the
|
|
1982
|
-
helper from the README, docs index, AI skill reference, kernel coverage, ingest
|
|
1983
|
-
kernel, and API coverage notes so it is clearly listed as a helper rather than
|
|
1984
|
-
a native API feature.
|
|
1985
|
-
|
|
1986
|
-
## What's New in v2.18.0
|
|
1987
|
-
|
|
1988
|
-
**Edit-page title / Text+ text (undocumented keys)** — `timeline.title_property_scan`,
|
|
1989
|
-
`timeline.set_title_text`, and `timeline.bulk_set_title_text` use
|
|
1990
|
-
`TimelineItem.GetProperty` / `SetProperty` to discover and update generator Text+
|
|
1991
|
-
payloads when `GetFusionCompCount()` is zero (no Fusion comp for `fusion_comp`).
|
|
1992
|
-
Heuristic key ranking and a minimal styled-text XML fallback are included; callers
|
|
1993
|
-
should confirm keys with `title_property_scan` on their Resolve build.
|
|
1994
|
-
|
|
1995
|
-
## What's New in v2.17.1
|
|
1996
|
-
|
|
1997
|
-
Operational and client-safety hardening for the v2.17 media-analysis release.
|
|
1998
|
-
|
|
1999
|
-
**MCP tool metadata**: compound and granular tools now publish MCP
|
|
2000
|
-
`ToolAnnotations` with conservative read-only, destructive, idempotent, and
|
|
2001
|
-
external-resource hints. Compound tool annotations are intentionally conservative
|
|
2002
|
-
because each tool groups multiple actions behind an `action` parameter.
|
|
2003
|
-
|
|
2004
|
-
**MCPSafe report cleanup**: explicitly annotated the granular tools highlighted
|
|
2005
|
-
by the public MCPSafe report, including project settings, media import, page
|
|
2006
|
-
switching, proxy linking, Gallery album reads, and timeline-item transforms.
|
|
2007
|
-
|
|
2008
|
-
**Operational guardrails**: Resolve app-control subprocess fallbacks now use
|
|
2009
|
-
bounded timeouts and report non-zero exits. Best-effort Resolve object
|
|
2010
|
-
inspection and state probes now log swallowed exceptions at debug level instead
|
|
2011
|
-
of failing silently.
|
|
2012
|
-
|
|
2013
|
-
**Correctness fix**: fixed the granular
|
|
2014
|
-
`media_pool.append_to_timeline(clip_infos=...)` path so it retains the current
|
|
2015
|
-
project handle while normalizing positioned appends against the active timeline
|
|
2016
|
-
start frame.
|
|
2017
|
-
|
|
2018
|
-
**Documentation**: added `SECURITY.md` with the local stdio trust boundary,
|
|
2019
|
-
confirmation guidance for destructive tools, source-media safety boundaries, and
|
|
2020
|
-
private vulnerability reporting guidance. The README now links the security
|
|
2021
|
-
policy and summarizes the local-only auth posture.
|
|
2022
|
-
|
|
2023
|
-
**Validation**: static/import checks, API parity audit, compileall, and 161
|
|
2024
|
-
focused unit tests passed. Live validated against DaVinci Resolve Studio 20.3.2.9
|
|
2025
|
-
with a direct external-scripting smoke test, `tests/live_v233_validation.py`
|
|
2026
|
-
passing 10/10 checks, and a v2.17.1 disposable-project
|
|
2027
|
-
`media_pool.append_to_timeline(clip_infos=...)` normalization probe passing 2/2
|
|
2028
|
-
checks. The v2.17.1 probe used synthetic media only and verified the default
|
|
2029
|
-
relative `record_frame` path landed at timeline start frame 86400 + 12 = 86412,
|
|
2030
|
-
while `record_frame_mode="absolute"` preserved frame 86484.
|
|
2031
|
-
|
|
2032
|
-
## What's New in v2.17.0
|
|
2033
|
-
|
|
2034
|
-
Media analysis and editorial-assist expansion - `media_analysis` now reuses
|
|
2035
|
-
existing project reports when cache signatures satisfy the requested analysis
|
|
2036
|
-
layers, can review timeline marker contact sheets with chat-context vision, and
|
|
2037
|
-
`timeline` adds editor-facing helpers for story-spine reports, declarative
|
|
2038
|
-
variant creation, bulk item property writes, multi-item look application,
|
|
2039
|
-
thumbnail contact sheets, marker thumbnail review, and audio mix capability
|
|
2040
|
-
fallback reporting.
|
|
2041
|
-
|
|
2042
|
-
**New `media_analysis` compound tool**: added `capabilities`,
|
|
2043
|
-
`install_guidance`, `resolve_output_root`, `plan`, `analyze_file`,
|
|
2044
|
-
`analyze_clip`, `analyze_bin`, `analyze_project`, `review_timeline_markers`,
|
|
2045
|
-
`summarize`, `get_report`, and `cleanup_artifacts`.
|
|
2046
|
-
|
|
2047
|
-
**MCP prompts and visual review**: the compound server now registers
|
|
2048
|
-
`davinci_resolve_workflow` and `analyze_media` prompts. `analyze_media` defaults
|
|
2049
|
-
to chat-context visual analysis when MCP sampling is available, while
|
|
2050
|
-
`timeline_markers.get_thumbnail_image` returns current Resolve frames as MCP
|
|
2051
|
-
image content without writing a file.
|
|
2052
|
-
|
|
2053
|
-
**Source-safe editorial helpers**: timeline actions now support
|
|
2054
|
-
`story_spine_report`, `create_variant_from_ranges`, `bulk_set_item_properties`,
|
|
2055
|
-
`apply_look_to_items`, `thumbnail_contact_sheet`, `marker_thumbnail_review`, and
|
|
2056
|
-
`audio_mix_capability_report`. Positioned timeline appends normalize
|
|
2057
|
-
`record_frame` relative to the active timeline start by default, matching
|
|
2058
|
-
Resolve's common 01:00:00:00 start-frame behavior.
|
|
2059
|
-
|
|
2060
|
-
**Documentation reorganization**: moved durable references into `docs/guides`,
|
|
2061
|
-
`docs/kernels`, `docs/authoring`, `docs/notes`, `docs/process`, and
|
|
2062
|
-
`docs/reference`, added a compact docs index, and kept local gameplans/scratch
|
|
2063
|
-
artifacts ignored.
|
|
2064
|
-
|
|
2065
|
-
**Privacy cleanup**: sanitized tracked live-test fixtures and scripts that had
|
|
2066
|
-
workstation-specific source-media paths while leaving public project contact
|
|
2067
|
-
information intact.
|
|
2068
|
-
|
|
2069
|
-
**Validation**: static/import checks, API parity audit, and 141 focused unit
|
|
2070
|
-
tests passed. Live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
2071
|
-
disposable `_mcp_media_analysis_v2170_probe` project and a generated synthetic
|
|
2072
|
-
clip only. The run covered source-adjacent output-root rejection,
|
|
2073
|
-
`media_analysis.plan`, session-only `analyze_file`, `story_spine_report`,
|
|
2074
|
-
`audio_mix_capability_report`, raw thumbnail retrieval, `thumbnail_contact_sheet`,
|
|
2075
|
-
and `review_timeline_markers`; the disposable project and temp artifacts were
|
|
2076
|
-
cleaned up.
|
|
2077
|
-
|
|
2078
|
-
## v2.16.0
|
|
2079
|
-
|
|
2080
|
-
Extension Authoring kernel expansion - adding lifecycle-aware Fuse, DCTL, ACES
|
|
2081
|
-
DCTL, and Resolve-page script probes around the existing authoring tools.
|
|
2082
|
-
|
|
2083
|
-
**New `script_plugin` extension actions**: added `extension_capabilities`,
|
|
2084
|
-
`probe_fuse_lifecycle`, `probe_dctl_lifecycle`, `probe_script_lifecycle`,
|
|
2085
|
-
`safe_install_extension`, `safe_remove_extension`,
|
|
2086
|
-
`refresh_or_restart_required`, and `extension_boundary_report`.
|
|
2087
|
-
|
|
2088
|
-
**Lifecycle and cleanup guards**: safe extension installs require `_mcp_` names
|
|
2089
|
-
and MCP markers by default. Safe removal refuses to delete unmarked files unless
|
|
2090
|
-
explicitly overridden. The kernel classifies Fuse and ACES DCTL installs as
|
|
2091
|
-
restart-required, regular LUT DCTLs as `refresh_luts`-driven, and Resolve-page
|
|
2092
|
-
scripts as menu-refresh-only.
|
|
2093
|
-
|
|
2094
|
-
**Documented support map**: added
|
|
2095
|
-
[`docs/kernels/extension-authoring-kernel.md`](docs/kernels/extension-authoring-kernel.md) and
|
|
2096
|
-
updated the Fuse/DCTL and script authoring docs with live lifecycle findings.
|
|
2097
|
-
|
|
2098
|
-
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
|
|
2099
|
-
MCP-marked `_mcp_` extension files only. Final probe result: 14 supported, 1
|
|
2100
|
-
partially supported installed-Lua-script execution boundary, 1 intentional
|
|
2101
|
-
unsupported unmarked-source guard, and 0 errors. All generated extension files
|
|
2102
|
-
and the disposable project were cleaned up.
|
|
2103
|
-
|
|
2104
|
-
## v2.15.0
|
|
2105
|
-
|
|
2106
|
-
Project / Database / Archive kernel expansion - adding disposable project
|
|
2107
|
-
lifecycle guards, settings snapshots and write/restore probes, database switch
|
|
2108
|
-
dry-runs, preset lifecycle probing, archive safety validation, and project
|
|
2109
|
-
boundary reporting.
|
|
2110
|
-
|
|
2111
|
-
**New `project_manager` lifecycle actions**: added `project_capabilities`,
|
|
2112
|
-
`probe_project_lifecycle`, `probe_project_settings`, `safe_project_create`,
|
|
2113
|
-
`safe_project_export`, `safe_project_import`, `safe_project_archive`,
|
|
2114
|
-
`safe_project_restore`, `safe_project_delete`, `safe_set_project_settings`,
|
|
2115
|
-
`project_settings_snapshot`, `database_capabilities`,
|
|
2116
|
-
`safe_set_current_database`, `preset_lifecycle_probe`, and
|
|
2117
|
-
`project_boundary_report`.
|
|
2118
|
-
|
|
2119
|
-
**Operational guardrails**: safe project mutation defaults to `_mcp_`
|
|
2120
|
-
disposable names and temp paths. Database switching dry-runs by default because
|
|
2121
|
-
Resolve closes open projects when changing databases. Archive source media,
|
|
2122
|
-
render cache, and proxy media flags are rejected unless explicitly opted in.
|
|
2123
|
-
|
|
2124
|
-
**Documented support map**: added
|
|
2125
|
-
[`docs/kernels/project-lifecycle-kernel.md`](docs/kernels/project-lifecycle-kernel.md) with
|
|
2126
|
-
project CRUD, DRP import/export, archive/restore, folder, settings, database,
|
|
2127
|
-
layout preset, render preset, page, keyframe, and cloud-infrastructure
|
|
2128
|
-
boundaries.
|
|
2129
|
-
|
|
2130
|
-
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
|
|
2131
|
-
disposable `_mcp_` projects only. Final probe result: 35 supported, 5 partially
|
|
2132
|
-
supported lifecycle/archive/keyframe/render-preset boundaries, 1 intentional
|
|
2133
|
-
unsupported archive media-flag guard, 1 not-applicable archive restore boundary,
|
|
2134
|
-
and 0 errors. Disposable projects, layout presets, and temp work files were
|
|
2135
|
-
cleaned up.
|
|
2136
|
-
|
|
2137
|
-
## v2.14.0
|
|
2138
|
-
|
|
2139
|
-
Audio / Fairlight kernel expansion - adding audio track/item probes, source
|
|
2140
|
-
audio mapping reports, guarded audio property writes, voice isolation
|
|
2141
|
-
capabilities, auto-sync planning, transcription/subtitle probes, and Fairlight
|
|
2142
|
-
boundary reporting.
|
|
2143
|
-
|
|
2144
|
-
**New `timeline` audio actions**: added `audio_capabilities`,
|
|
2145
|
-
`probe_audio_track`, `probe_audio_item`, `safe_set_audio_properties`,
|
|
2146
|
-
`voice_isolation_capabilities`, `audio_mapping_report`, `safe_auto_sync_audio`,
|
|
2147
|
-
`transcription_capabilities`, `subtitle_generation_probe`, and
|
|
2148
|
-
`fairlight_boundary_report`.
|
|
2149
|
-
|
|
2150
|
-
**Audio state and mapping**: the kernel snapshots audio track state, timeline
|
|
2151
|
-
item audio properties, source audio channel mapping, MediaPoolItem audio
|
|
2152
|
-
mapping, and track/item voice isolation availability.
|
|
2153
|
-
|
|
2154
|
-
**Guarded AI and sync surfaces**: auto-sync dry-runs by default and normalizes
|
|
2155
|
-
Resolve audio-sync constants. Subtitle generation dry-runs unless
|
|
2156
|
-
`allow_generate=True`; transcription capability reporting is read-only by
|
|
2157
|
-
default.
|
|
2158
|
-
|
|
2159
|
-
**Documented support map**: added
|
|
2160
|
-
[`docs/kernels/audio-fairlight-kernel.md`](docs/kernels/audio-fairlight-kernel.md) with
|
|
2161
|
-
track/item state, voice isolation, mapping, transcription, subtitle, auto-sync,
|
|
2162
|
-
and Fairlight insertion boundaries.
|
|
2163
|
-
|
|
2164
|
-
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
|
|
2165
|
-
generated synthetic video and audio-only media. Final probe result: 13
|
|
2166
|
-
supported, 3 partially supported audio property/auto-sync/audio-insert
|
|
2167
|
-
boundaries, and 0 errors. The disposable project and generated media were
|
|
2168
|
-
cleaned up.
|
|
2169
|
-
|
|
2170
|
-
## v2.13.0
|
|
2171
|
-
|
|
2172
|
-
Timeline Conform / Interchange kernel expansion - adding timeline structure
|
|
2173
|
-
snapshots, source range reporting, gap/overlap detection, guarded interchange
|
|
2174
|
-
export/import, round-trip comparison, missing-media detection, and relink
|
|
2175
|
-
planning around Resolve's public timeline APIs.
|
|
2176
|
-
|
|
2177
|
-
**New `timeline` conform actions**: added `conform_capabilities`,
|
|
2178
|
-
`probe_timeline_structure`, `detect_gaps_overlaps`, `source_range_report`,
|
|
2179
|
-
`export_timeline_checked`, `import_timeline_checked`, `compare_timelines`,
|
|
2180
|
-
`probe_interchange_roundtrip`, `detect_missing_media`, `build_relink_plan`,
|
|
2181
|
-
and `conform_boundary_report`.
|
|
2182
|
-
|
|
2183
|
-
**Interchange probing**: export aliases now cover FCPXML, DRT, EDL, AAF, OTIO,
|
|
2184
|
-
FCP 7 XML, and EDL subtype variants. FCPXML directory-style exports are
|
|
2185
|
-
normalized with a `primary_file` path for import.
|
|
2186
|
-
|
|
2187
|
-
**Conform analysis**: the kernel reports track/item structure, same-track gaps
|
|
2188
|
-
and overlaps, source ranges with handles, missing/offline media, and relink
|
|
2189
|
-
candidates without mutating user source media.
|
|
2190
|
-
|
|
2191
|
-
**Documented support map**: added
|
|
2192
|
-
[`docs/kernels/timeline-conform-interchange-kernel.md`](docs/kernels/timeline-conform-interchange-kernel.md)
|
|
2193
|
-
with export, round-trip, missing-media, relink planning, and format-survival
|
|
2194
|
-
boundaries.
|
|
2195
|
-
|
|
2196
|
-
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
2197
|
-
generated synthetic gapped timeline. Final probe result: 17 supported, 1
|
|
2198
|
-
partially supported FCPXML round-trip survivability boundary, and 0 errors. The
|
|
2199
|
-
disposable project, generated media, and imported round-trip timelines were
|
|
2200
|
-
cleaned up.
|
|
2201
|
-
|
|
2202
|
-
## v2.12.0
|
|
2203
|
-
|
|
2204
|
-
Fusion Composition kernel expansion - adding safe Fusion graph inspection,
|
|
2205
|
-
tool creation, input writes, connection validation, scoped bulk writes, and
|
|
2206
|
-
boundary reporting around Resolve's public Fusion comp API.
|
|
2207
|
-
|
|
2208
|
-
**New `fusion_comp` kernel actions**: added `fusion_graph_capabilities`,
|
|
2209
|
-
`probe_fusion_comp`, `probe_fusion_tool`, `safe_add_tool`, `safe_set_inputs`,
|
|
2210
|
-
`safe_connect_tools`, and `fusion_boundary_report`.
|
|
2211
|
-
|
|
2212
|
-
**Timeline item graph automation**: the kernel can target timeline item Fusion
|
|
2213
|
-
comps via `timeline_item`, `clip_id`, or `timeline_item_id`, then add tools,
|
|
2214
|
-
write inputs with readback, inspect ports, connect tools, set frame ranges, and
|
|
2215
|
-
export the comp through `timeline_item_fusion`.
|
|
2216
|
-
|
|
2217
|
-
**Scoped bulk writes**: `bulk_set_inputs` remains the safe batch path for
|
|
2218
|
-
applying input updates across multiple explicitly scoped timeline-item comps,
|
|
2219
|
-
so agent workflows do not accidentally mutate the active Fusion page comp.
|
|
2220
|
-
|
|
2221
|
-
**Documented support map**: added
|
|
2222
|
-
[`docs/kernels/fusion-composition-kernel.md`](docs/kernels/fusion-composition-kernel.md) with
|
|
2223
|
-
tool availability, input/output, scope, comp export, and page-state boundaries.
|
|
2224
|
-
|
|
2225
|
-
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
2226
|
-
generated synthetic timeline item Fusion comp. Final probe result: 18
|
|
2227
|
-
supported, 0 unsupported, 0 partially supported, and 0 errors. The disposable
|
|
2228
|
-
project, generated media, and exported temp comp were cleaned up.
|
|
2229
|
-
|
|
2230
|
-
## v2.11.0
|
|
2231
|
-
|
|
2232
|
-
Color / Grade kernel expansion - adding safe grade inspection, CDL validation,
|
|
2233
|
-
node graph probing, grade copy, LUT export, version restore, Gallery, and color
|
|
2234
|
-
group boundary reporting around Resolve's public Color API.
|
|
2235
|
-
|
|
2236
|
-
**New `timeline_item_color` kernel actions**: added `grade_capabilities`,
|
|
2237
|
-
`probe_grade_item`, `probe_node_graph`, `safe_set_cdl`, `safe_copy_grade`,
|
|
2238
|
-
`safe_apply_drx`, `safe_export_lut`, `grade_version_snapshot`,
|
|
2239
|
-
`grade_version_restore`, `color_group_capabilities`, `gallery_capabilities`,
|
|
2240
|
-
and `grade_boundary_report`.
|
|
2241
|
-
|
|
2242
|
-
**Grade and graph probing**: the kernel snapshots item grade versions, graph
|
|
2243
|
-
availability, node counts, node LUT/cache/label/tools metadata, color-group
|
|
2244
|
-
assignment, and cache state without guessing at opaque node internals.
|
|
2245
|
-
|
|
2246
|
-
**Safe mutation helpers**: CDL payloads are validated and normalized before
|
|
2247
|
-
`SetCDL`; grade copy resolves target timeline item IDs first; LUT export is
|
|
2248
|
-
guarded to temp paths by default; DRX apply requires an existing DRX path and
|
|
2249
|
-
documents that it replaces the target graph.
|
|
2250
|
-
|
|
2251
|
-
**Color groups and Gallery**: color-group capability probes cover project
|
|
2252
|
-
groups plus pre/post graph availability. Gallery capability probes report album
|
|
2253
|
-
state and classify still export as UI/page dependent when Resolve returns false.
|
|
2254
|
-
|
|
2255
|
-
**Documented support map**: added
|
|
2256
|
-
[`docs/kernels/color-grade-kernel.md`](docs/kernels/color-grade-kernel.md) with graph, LUT, DRX,
|
|
2257
|
-
version, Gallery, color-group, and AI-tool boundaries.
|
|
2258
|
-
|
|
2259
|
-
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
2260
|
-
generated synthetic color-bar timeline. Final probe result: 25 supported, 2
|
|
2261
|
-
version/page-dependent Gallery/DRX export boundaries, 1 not-applicable DRX apply
|
|
2262
|
-
path because no DRX could be produced in that run, and 0 errors. The disposable
|
|
2263
|
-
project, generated media, and temp LUT exports were cleaned up.
|
|
2264
|
-
|
|
2265
|
-
## v2.10.0
|
|
2266
|
-
|
|
2267
|
-
Review Annotation kernel expansion - adding a unified marker, custom data,
|
|
2268
|
-
flag, clip color, copy/move, and review report layer across timeline, timeline
|
|
2269
|
-
item, and media pool item scopes.
|
|
2270
|
-
|
|
2271
|
-
**New `timeline_markers` kernel actions**: added
|
|
2272
|
-
`annotation_capabilities`, `probe_annotations`, `normalize_marker_payload`,
|
|
2273
|
-
`copy_annotations`, `move_annotations`, `sync_marker_custom_data`,
|
|
2274
|
-
`clear_annotations_by_scope`, `export_review_report`, and
|
|
2275
|
-
`annotation_boundary_report`.
|
|
2276
|
-
|
|
2277
|
-
**Unified annotation scopes**: the new helpers normalize marker payloads,
|
|
2278
|
-
frame/timecode aliases, custom data aliases, and marker colors before touching
|
|
2279
|
-
Resolve. `probe_annotations` snapshots timeline, current timeline item, and
|
|
2280
|
-
media pool item annotations when the current playhead can resolve them.
|
|
2281
|
-
|
|
2282
|
-
**Review metadata copying**: `copy_annotations` and `move_annotations` can copy
|
|
2283
|
-
marker payloads between timeline, timeline item, and media pool item scopes
|
|
2284
|
-
using direct frame numbers. When supported by both scopes, flags and clip color
|
|
2285
|
-
can travel with the marker payload.
|
|
2286
|
-
|
|
2287
|
-
**Read-only review reports**: `export_review_report` and
|
|
2288
|
-
`annotation_boundary_report` produce agent-friendly summaries without mutating
|
|
2289
|
-
media or projects.
|
|
2290
|
-
|
|
2291
|
-
**Documented support map**: added
|
|
2292
|
-
[`docs/kernels/review-annotation-kernel.md`](docs/kernels/review-annotation-kernel.md) with the
|
|
2293
|
-
scope matrix, field support, frame-space caveats, and live probe findings.
|
|
2294
|
-
|
|
2295
|
-
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
2296
|
-
generated synthetic timeline. Final probe result: 44 supported, 1 expected
|
|
2297
|
-
unsupported invalid-color boundary, and 0 errors. The disposable project and
|
|
2298
|
-
generated media were cleaned up after report generation.
|
|
2299
|
-
|
|
2300
|
-
## v2.9.0
|
|
2301
|
-
|
|
2302
|
-
Render / Deliver kernel expansion — adding a safer render planning, settings,
|
|
2303
|
-
format/codec compatibility, queue lifecycle, and Quick Export boundary layer.
|
|
2304
|
-
|
|
2305
|
-
**New `render` kernel actions**: added `render_capabilities`,
|
|
2306
|
-
`probe_render_matrix`, `probe_render_settings`, `validate_render_settings`,
|
|
2307
|
-
`safe_set_render_settings`, `prepare_render_job`,
|
|
2308
|
-
`render_job_lifecycle_probe`, `quick_export_capabilities`,
|
|
2309
|
-
`safe_quick_export`, and `export_render_boundary_report`.
|
|
2310
|
-
|
|
2311
|
-
**Render compatibility matrix**: `probe_render_matrix` walks available render
|
|
2312
|
-
formats, codecs, and resolutions so agents can choose what this specific
|
|
2313
|
-
Resolve install can actually deliver.
|
|
2314
|
-
|
|
2315
|
-
**Job-safe rendering helpers**: render settings validation now checks documented
|
|
2316
|
-
setting keys, value types, frame ranges, and temp-target requirements.
|
|
2317
|
-
`prepare_render_job` creates queued jobs without starting renders, while
|
|
2318
|
-
`render_job_lifecycle_probe` validates add/status/delete behavior safely.
|
|
2319
|
-
|
|
2320
|
-
**Guarded Quick Export**: `safe_quick_export` validates temp targets, forces
|
|
2321
|
-
`EnableUpload=False`, and requires `allow_render=True` before it can actually
|
|
2322
|
-
start Quick Export.
|
|
2323
|
-
|
|
2324
|
-
**Documented support map**: added
|
|
2325
|
-
[`docs/kernels/render-deliver-kernel.md`](docs/kernels/render-deliver-kernel.md) with
|
|
2326
|
-
format/codec, settings, render job, and Quick Export boundaries.
|
|
2327
|
-
|
|
2328
|
-
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
2329
|
-
two-second generated synthetic timeline. Final probe result: 23 supported, 1
|
|
2330
|
-
version/page-dependent `GetRenderSettings` readback boundary, and 0 errors. The
|
|
2331
|
-
probe rendered one tiny synthetic output, then cleaned up the disposable project
|
|
2332
|
-
and generated files.
|
|
2333
|
-
|
|
2334
|
-
## v2.8.0
|
|
2335
|
-
|
|
2336
|
-
Media Pool / Ingest kernel expansion — applying the timeline edit kernel probe
|
|
2337
|
-
pattern to import, organization, metadata, annotation, and media-link boundary
|
|
2338
|
-
workflows while preserving source media integrity.
|
|
2339
|
-
|
|
2340
|
-
**New `media_pool` kernel actions**: added `ingest_capabilities`,
|
|
2341
|
-
`probe_media_pool`, `probe_ingest_item`, `safe_import_media`,
|
|
2342
|
-
`safe_import_sequence`, `safe_import_folder`, `organize_clips`,
|
|
2343
|
-
`copy_metadata`, `normalize_metadata`, `probe_clip_properties`,
|
|
2344
|
-
`safe_relink`, `safe_unlink`, `link_proxy_checked`,
|
|
2345
|
-
`link_full_resolution_checked`, `set_clip_marks`, `clear_clip_marks`,
|
|
2346
|
-
`copy_clip_annotations`, and `media_pool_boundary_report`.
|
|
2347
|
-
|
|
2348
|
-
**Safe ingest and organization**: safe import helpers validate paths, sequence
|
|
2349
|
-
patterns, frame ranges, and optional target folders before calling Resolve.
|
|
2350
|
-
`organize_clips` can move clips to existing folders or create missing folder
|
|
2351
|
-
paths explicitly. All helpers support dry-run where useful for planning.
|
|
2352
|
-
|
|
2353
|
-
**Metadata and annotation workflows**: bulk metadata normalization, metadata
|
|
2354
|
-
copying, clip property probes, mark in/out bulk operations, and annotation copy
|
|
2355
|
-
now have agent-friendly wrappers over Resolve's lower-level clip APIs.
|
|
2356
|
-
|
|
2357
|
-
**Documented support map**: added
|
|
2358
|
-
[`docs/kernels/media-pool-ingest-kernel.md`](docs/kernels/media-pool-ingest-kernel.md) so
|
|
2359
|
-
agents and users can inspect the supported, partial, unsupported, and
|
|
2360
|
-
version/page-dependent ingest boundaries directly.
|
|
2361
|
-
|
|
2362
|
-
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
|
|
2363
|
-
generated synthetic video, audio, still, image sequence, and non-media
|
|
2364
|
-
fixtures. Final probe result: 56 supported, 1 expected unsupported non-media
|
|
2365
|
-
text import, and 0 errors. The disposable project and generated media were
|
|
2366
|
-
cleaned up after report generation.
|
|
2367
|
-
|
|
2368
|
-
## v2.7.0
|
|
2369
|
-
|
|
2370
|
-
Timeline edit kernel expansion — turning the v2.6.0 duplicate helper into a
|
|
2371
|
-
broader, live-probed edit layer for clip duplication, linked audio, range edits,
|
|
2372
|
-
state copying, and capability reporting while preserving source media integrity.
|
|
2373
|
-
|
|
2374
|
-
**Expanded `timeline.duplicate_clips` action**: duplication now supports
|
|
2375
|
-
`selected=True`, explicit `record_frame`, `track_offset`, and placement modes
|
|
2376
|
-
`same_time`, `offset`, `at_playhead`, `track_above`, `after_source`, and
|
|
2377
|
-
`next_gap`. `include_linked=True` duplicates linked audio and restores the
|
|
2378
|
-
video/audio link state. `copy_clips` is an alias for duplication, and
|
|
2379
|
-
`move_clips` duplicates successfully first before deleting the original source
|
|
2380
|
-
items.
|
|
2381
|
-
|
|
2382
|
-
**Timeline range operations**: added `copy_range`, `duplicate_range`,
|
|
2383
|
-
`overwrite_range`, and `lift_range`. Range copies rebuild exact source segments
|
|
2384
|
-
with positioned append operations. `overwrite_range` deletes whole destination
|
|
2385
|
-
overlaps before appending. `lift_range` safely deletes whole matching items and
|
|
2386
|
-
requires explicit `allow_partial_item_delete=True` for whole-item deletion when
|
|
2387
|
-
a requested range only partially overlaps an item.
|
|
2388
|
-
|
|
2389
|
-
**State copying groups**: duplicate/copy operations can now copy transform,
|
|
2390
|
-
crop, composite, audio, retime, dynamic zoom, scaling, stabilization, clip
|
|
2391
|
-
color, markers, flags, enabled state, cache, voice isolation, Fusion comps,
|
|
2392
|
-
grades, takes, and keyframes where Resolve exposes readable/writable item APIs.
|
|
2393
|
-
Transition cloning is accepted as a requested group but reported unsupported
|
|
2394
|
-
because Resolve's public scripting API does not expose transition cloning.
|
|
2395
|
-
|
|
2396
|
-
**Capability and boundary probes**: added `timeline.edit_kernel_capabilities`
|
|
2397
|
-
for a maintained support map and `timeline.probe_edit_kernel_item` for read-only
|
|
2398
|
-
inspection of item methods, properties, keyframes, and linked items. Added
|
|
2399
|
-
`src/utils/timeline_kernel_live_probe.py` plus offline report/parser tests so
|
|
2400
|
-
future work can expand the technical boundary without guessing.
|
|
2401
|
-
|
|
2402
|
-
**Documented limits**: added
|
|
2403
|
-
[`docs/kernels/timeline-edit-kernel.md`](docs/kernels/timeline-edit-kernel.md), which records
|
|
2404
|
-
the supported, partially supported, unsupported, and version/page-dependent
|
|
2405
|
-
surfaces. Known public-API boundaries include transition cloning, direct
|
|
2406
|
-
razor/split edits, true partial lifts, source-less item append cloning, and
|
|
2407
|
-
opaque speed-ramp internals.
|
|
2408
|
-
|
|
2409
|
-
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
|
|
2410
|
-
disposable projects and synthetic media. Final exhaustive probe result:
|
|
2411
|
-
255 supported, 4 partially supported, 138 unsupported, 4 version/page
|
|
2412
|
-
dependent, and 0 errors. Static/unit checks include `tests/test_import.py`,
|
|
2413
|
-
`scripts/audit_api_parity.py`, `git diff --check`, the focused timeline/helper
|
|
2414
|
-
unit suite, and the full live duplicate/range/probe harness.
|
|
2415
|
-
|
|
2416
|
-
## v2.6.0
|
|
2417
|
-
|
|
2418
|
-
Timeline clip duplication — adding an Alt-drag-style helper for duplicating
|
|
2419
|
-
existing video timeline items without creating proxy media, renders, or source
|
|
2420
|
-
derivatives.
|
|
2421
|
-
|
|
2422
|
-
**New `timeline.duplicate_clips` action**: `timeline(action="duplicate_clips")`
|
|
2423
|
-
duplicates video timeline items by re-appending the same Media Pool item with
|
|
2424
|
-
the same source trim via `MediaPool.AppendToTimeline([{clipInfo}])`. It accepts
|
|
2425
|
-
timeline item IDs from `timeline.get_items`, an optional
|
|
2426
|
-
`target_track_index`, and `record_frame_offset`; each result reports per-clip
|
|
2427
|
-
success and the duplicated timeline item ID when Resolve exposes or recovers it.
|
|
2428
|
-
|
|
2429
|
-
**Resolve append-result hardening**: duplicate results now tolerate thin
|
|
2430
|
-
`AppendToTimeline` return objects that lack readable `GetUniqueId()` or
|
|
2431
|
-
`GetName()` methods, then scan the target video track to recover the real item
|
|
2432
|
-
handle. Bad inputs now return clean per-clip errors for non-video items,
|
|
2433
|
-
invalid offsets, and nonexistent target tracks.
|
|
2434
|
-
|
|
2435
|
-
**Live-tested source trim semantics**: validation against Resolve Studio
|
|
2436
|
-
20.3.2.9 confirmed that positioned `AppendToTimeline` treats `endFrame` as an
|
|
2437
|
-
exclusive source boundary in this workflow. `duplicate_clips` now uses
|
|
2438
|
-
`TimelineItem.GetDuration()` and `GetSourceStartFrame()` where available, so
|
|
2439
|
-
the duplicate preserves the original duration and source start.
|
|
2440
|
-
|
|
2441
|
-
**Validation**: added `tests/live_duplicate_clips_validation.py`, which creates
|
|
2442
|
-
a disposable project, imports synthetic media, places a trimmed clip, duplicates
|
|
2443
|
-
it to another track, verifies record frame/duration/source trim/media identity,
|
|
2444
|
-
checks the invalid-track error path, and deletes the project. Focused unit
|
|
2445
|
-
coverage now includes anonymous append objects, source-start preference,
|
|
2446
|
-
video-only `mediaType`, and target-track ID recovery.
|
|
2447
|
-
|
|
2448
|
-
## v2.5.0
|
|
2449
|
-
|
|
2450
|
-
Three new compound tools for *authoring and conversationally executing* Resolve extensions: Fusion Fuse plugins, DCTL color transforms, and Resolve-page Lua/Python scripts. Plus a documentation pass on six adjacent Resolve extension systems.
|
|
2451
|
-
|
|
2452
|
-
**New `fuse_plugin` tool**: generate, install, list, read, remove, and validate Fusion Fuse plugins (`.fuse`). **18 template kinds** spanning color (`color_matrix`, `per_pixel`, `channel_op`), geometric (`transform`, `spatial_warp`), text/shapes (`text_overlay`, `shape_generator`), source/temporal (`source_generator`, `time_displace`), filters (`builtin_blur`, `builtin_resize`, `variable_blur` SAT-based), modifiers (`modifier`, `point_modifier`), display shaders (`view_lut`, `dctl_kernel`), and reference (`controls_demo`, `notifychanged_demo`). Each generator produces ready-to-install Lua (or Lua + GLSL / Lua + DCTL) source that passes `luac -p` syntax checks across all option branches. **Live-verified in DaVinci Resolve Studio 20.3.2.9**: generated Fuses register on Resolve restart and instantiate via `comp:AddTool`; the `text_overlay` template was confirmed rendering glyphs into the viewer. The `view_lut` template supports `float`, `vec2`, `vec3_rgb`, and `vec4_rgba` shader parameter types. Includes a path-bug fix: corrected install path on macOS to `Fusion/Fuses/` (the SDK doc lists `Support/Fusion/Fuses/`, but Fusion's own `MapPath("Fuses:")` returns the path without `/Support/`).
|
|
2453
|
-
|
|
2454
|
-
**New `dctl` tool**: generate, install, list, read, remove, and validate DCTL color-transform files plus ACES IDT/ODT transforms. **8 template kinds** — `transform`, `transform_alpha` (Resolve 19.1+ alpha modes), `transition` (with `TRANSITION_PROGRESS`), `matrix` (3x3 color matrix), `kernel` (TODO stub), `lut_apply` (wraps an external `.cube` LUT via `DEFINE_LUT`/`APPLY_LUT`), `aces_idt`, `aces_odt`. UI-parameter syntax covers all six DCTL UI types (slider float/int, value box, checkbox, combo, color picker) with optional tooltips. Per-template `suggested_category` so callers know whether to install to the regular LUT directory or the separate ACES Transforms tree. Subdir support with strict path-traversal guards. Validator catches missing entry points, brace imbalance, and float literals missing the required `f` suffix. Regular DCTLs pick up via `project_settings(action='refresh_luts')`; ACES DCTLs require a Resolve restart.
|
|
2455
|
-
|
|
2456
|
-
**New `script_plugin` tool — conversational Lua/Python execution**: generate, install, and **execute** Resolve-page scripts that appear in the Workspace → Scripts menu. Two template kinds: `scaffold` (minimal stub) and `media_rules` (a comprehensive rules-and-variables DSL with sources, extract patterns, transforms, targets, actions, conditions, dry-run mode, external CSV/JSON data with exact/regex/fuzzy matching, and per-rule metadata — ~22k chars Lua engine and ~18k chars Python engine, both first-class). **Two new actions close the conversational loop**: `run_inline(source, language)` runs an ad-hoc Lua/Python snippet inside Resolve and streams stdout + return value back into the conversation; `execute(name, category, language)` runs an installed script the same way. Python uses subprocess with full stdout/stderr capture; Lua uses `fusion.RunScript()` against a temp file with completion-sentinel polling and `app:SetData()` bridge for return values (Resolve 20.x's `fusion.Execute()` is a no-op from the Python bridge — that quirk is encoded in the implementation). **Live-verified end-to-end** on Resolve Studio 20.3.2.9: Python `run_inline` returned project list and walked media pool; Lua `run_inline` enumerated `MapPath` symbols with stdout AND return value captured.
|
|
2457
|
-
|
|
2458
|
-
**`list_templates` action** on all three new tools enumerates available kinds.
|
|
2459
|
-
|
|
2460
|
-
**Resolve developer-package reference consolidation**: extension-system notes
|
|
2461
|
-
were consolidated back into README/SKILL guidance, while dedicated authoring
|
|
2462
|
-
docs remain in `docs/authoring/fuse-dctl-authoring.md` and
|
|
2463
|
-
`docs/authoring/script-plugin-authoring.md`.
|
|
2464
|
-
|
|
2465
|
-
**Test coverage**: 185 offline tests across 7 modules (`test_fuse_dctl_authoring.py` and `test_script_plugin.py` both new in this release), all green in <2s. Includes hermetic round-trip tests with mocked install paths, DSL-coverage tests confirming every documented source/action/target/transform is in both Lua and Python engines, and Python subprocess execution tests with real captured stdout/stderr.
|
|
2466
|
-
|
|
2467
|
-
**Compound tool count: 27 → 30**. Granular tool count unchanged at 328.
|
|
2468
|
-
|
|
2469
|
-
## v2.4.1
|
|
2470
|
-
|
|
2471
|
-
Release process hardening — documenting the version bump, validation, tag, and GitHub Release checklist.
|
|
2472
|
-
|
|
2473
|
-
**Release checklist documented**: added `docs/process/release-process.md` with semantic version guidance, required version surfaces, validation requirements, tag/release commands, and release-note template.
|
|
2474
|
-
|
|
2475
|
-
**Live-test requirement clarified**: Resolve behavior changes must be validated live with disposable projects and synthetic media before release. Docs-only releases do not require a live Resolve run when no behavior changed.
|
|
2476
|
-
|
|
2477
|
-
## v2.4.0
|
|
2478
|
-
|
|
2479
|
-
Timeline source range extraction — adding a compound workflow helper for frame-pull and conform preparation.
|
|
2480
|
-
|
|
2481
|
-
**New `timeline.extract_source_frame_ranges` action**: `timeline(action="extract_source_frame_ranges")` scans every video clip on the current timeline and returns per-source frame ranges, clip occurrences, timeline positions, source offsets, applied handles, and timeline item IDs. Clip names prefer the basename from the Media Pool `File Path`, with audio extensions skipped by default.
|
|
2482
|
-
|
|
2483
|
-
**Handle-aware source ranges**: fixed handles default to 24 frames. Passing `handles=0` switches to gap-only auto handles, using neighboring timeline gaps up to `gap_max` frames. Returned `source_range_final` and `frame_ranges` endpoints are inclusive/inclusive for downstream extraction tools.
|
|
2484
|
-
|
|
2485
|
-
**Inclusive endpoint fix**: live validation caught and fixed the off-by-one where Resolve's exclusive source boundary was being returned as an inclusive final frame. A 48-frame synthetic clip with `handles=0` now returns `source_used_inclusive_end=47` and `source_range_final=[0, 47]`.
|
|
2486
|
-
|
|
2487
|
-
**Live Resolve validation**: verified against DaVinci Resolve Studio 20.3.2.9 in a disposable project with synthetic media. Added unit coverage in `tests/test_extract_source_frame_ranges.py` for zero-handle and fixed-handle ranges.
|
|
2488
|
-
|
|
2489
|
-
## v2.3.4
|
|
2490
|
-
|
|
2491
|
-
Marker API hardening for Issue #34 — making the compound marker tools match the parameter shapes agents and users naturally send.
|
|
2492
|
-
|
|
2493
|
-
**Marker parameter aliases fixed**: `timeline_markers`, `media_pool_item_markers`, and `timeline_item_markers` now accept `frame`, `frame_id`, and `frameId` consistently for add/get/update/delete operations. Marker lookup and delete paths also accept `customData` as an alias for `custom_data`.
|
|
2494
|
-
|
|
2495
|
-
**Timeline marker ergonomics improved**: `timeline_markers(action="add")` can now add at the current playhead when no frame/timecode is provided, and also accepts explicit `timecode` input. Optional marker fields now have sensible defaults (`color="Blue"`, `name` from note or `"Marker"`, `note=""`, `duration=1`).
|
|
2496
|
-
|
|
2497
|
-
**Resolve overload fallback**: marker creation first uses the documented six-argument `AddMarker(..., customData)` call, and falls back to the five-argument form when `customData` is empty and a Resolve build rejects the optional parameter.
|
|
2498
|
-
|
|
2499
|
-
**Live Resolve validation**: verified against DaVinci Resolve Studio 20.3.2.9 with `tests/live_marker_validation.py`. The harness creates a disposable project, imports synthetic media, inserts a visible timeline generator, and live-tests timeline, media-pool-item, and timeline-item marker add/get/update/delete alias paths. A `--keep-open` mode leaves a marked timeline open for visual inspection.
|
|
2500
|
-
|
|
2501
|
-
## v2.3.3
|
|
2502
|
-
|
|
2503
|
-
Granular layer hardening — closing exposure gaps and dropped-dict-key bugs surfaced by an exhaustive parity audit of every documented Resolve scripting method against both server layers.
|
|
2504
|
-
|
|
2505
|
-
**Cloud project helper rewritten** (Critical): `src/utils/cloud_operations.py` was calling `pm.CreateCloudProject(project_name, folder_path)` with positional arguments — but the documented Resolve API signature is `CreateCloudProject({cloudSettings})`, a single dict. Same bug affected `ImportCloudProject` and `RestoreCloudProject`. Helper now builds proper `{cloudSettings}` dicts and exposes all 5 documented keys (`PROJECT_NAME`, `PROJECT_MEDIA_PATH`, `IS_COLLAB`, `SYNC_MODE`, `IS_CAMERA_ACCESS`) per docs lines 576-594. Granular wrappers (`create_cloud_project_tool`, `import_cloud_project_tool`, `restore_cloud_project_tool`) updated to expose the full settings surface; `load_cloud_project_tool` added (was missing entirely from granular).
|
|
2506
|
-
|
|
2507
|
-
**Silent-drop bugs fixed** (Critical):
|
|
2508
|
-
- **`render_with_quick_export()` (granular)** previously dropped the documented `{param_dict}` (TargetDir, CustomName, VideoQuality, EnableUpload). Now forwards all four keys per docs line 179.
|
|
2509
|
-
- **`timeline_create_compound_clip()` (granular)** previously dropped the documented `{clipInfo}` dict (`name`, `startTimecode`). Now exposes both keys per docs line 369.
|
|
2510
|
-
|
|
2511
|
-
**Missing granular tools added**:
|
|
2512
|
-
- **`append_to_timeline`** — both simple `clip_ids` form and positioned `clip_infos` form (`MediaPool.AppendToTimeline` was completely absent from granular layer; only compound had it).
|
|
2513
|
-
- **`auto_sync_audio`** — with proper `{audioSyncSettings}` dict mapping per docs lines 600-614 (`sync_mode`, `channel_number` with `'automatic'`/`'mix'` aliases, `retain_embedded_audio`, `retain_video_metadata`).
|
|
2514
|
-
- **`load_cloud_project_tool`** — was missing entirely; compound had it.
|
|
2515
|
-
- **`rename_color_group`** — wraps `ColorGroup.SetName` (compound had it via `color_group(action="set_name")` but no granular tool).
|
|
2516
|
-
|
|
2517
|
-
**Removed 4 undocumented cloud method wrappers**:
|
|
2518
|
-
- `get_cloud_projects` resource → `GetCloudProjectList` not in API docs
|
|
2519
|
-
- `export_project_to_cloud_tool` → `ExportToCloud`/`ExportProjectToCloud` not in API docs
|
|
2520
|
-
- `add_user_to_cloud_project_tool` → `AddUserToCloudProject` not in API docs
|
|
2521
|
-
- `remove_user_from_cloud_project_tool` → `RemoveUserFromCloudProject` not in API docs
|
|
2522
|
-
|
|
2523
|
-
**Removed 9 legacy granular gallery tools** that wrapped undocumented or renamed methods (`gallery.GetAlbums()`, `gallery.CreateAlbum()`, `still.GetTimecode()`, `still.IsGrabbed()`, etc.). The proper documented Gallery and GalleryStillAlbum wrappers (lines 743+ of the previous gallery.py — all 14 of those, e.g. `get_gallery_still_albums`, `create_gallery_still_album`, `import_stills_to_album`, `export_stills_from_album`, `get_album_stills`, `set_still_label`) cover the documented API surface and remain. Removed: `get_color_presets`, `save_color_preset`, `apply_color_preset`, `delete_color_preset`, `create_color_preset_album`, `delete_color_preset_album`, `export_lut`, `get_lut_formats`, `export_all_powergrade_luts`.
|
|
2524
|
-
|
|
2525
|
-
**Removed 2 granular project optimized-media tools** that wrapped undocumented Resolve methods (`Project.GenerateOptimizedMedia`, `Project.DeleteOptimizedMedia`, `MediaPool.SetClipSelection` — none in API docs). Removed: `generate_optimized_media`, `delete_optimized_media`. Use the Resolve UI for optimized-media generation; `set_optimized_media_mode` (which uses the documented `Project.SetSetting("OptimizedMediaMode", ...)`) is preserved.
|
|
2526
|
-
|
|
2527
|
-
**Deprecated method call fixed**: `timeline(action="get_items_in_track")` was calling the deprecated `tl.GetItemsInTrack()` form (docs line 989, marked deprecated) instead of the supported `tl.GetItemListInTrack()` (line 350). Every other call site already used the correct form.
|
|
2528
|
-
|
|
2529
|
-
**New: API parity CI guard** at `scripts/audit_api_parity.py`. Parses `docs/reference/resolve_scripting_api.txt` and verifies (1) no `from api.X` broken imports remain, (2) every documented Resolve method appears somewhere in `src/`, (3) wrappers calling undocumented methods are flagged for review. Includes an allowlist for legitimate undocumented-but-real Resolve API surface (Fusion compositing API, UIManager methods like `OpenProjectSettings`/`LoadUILayout`/`SaveUILayout`, internal type-discrimination helpers like `TimelineItem.GetType`/`GetMediaType`). Run with `python3 scripts/audit_api_parity.py` — currently passes all three checks cleanly.
|
|
2530
|
-
|
|
2531
|
-
**Tool count: 328 granular tools** (was 354 before v2.3.2; net change since v2.3.1 is −26 broken/duplicate/undocumented tools removed and +4 missing tools added). 20 new unit tests against Resolve stubs covering the cloud settings builder, audio sync settings builder, and AppendToTimeline clipInfo builder. All 41 tests pass without a live Resolve connection.
|
|
2532
|
-
|
|
2533
|
-
**Live disposable Resolve validation**: every new and changed v2.3.3 granular tool was exercised against DaVinci Resolve Studio 20.3.2.9 in a disposable project with synthetic temp media via `tests/live_v233_validation.py`. 10/10 checks passed: `append_to_timeline` (simple + positioned + failure path), `auto_sync_audio` (settings dict + invalid input rejection), `import_media` image-sequence form, `timeline_create_compound_clip` (info dict forwarded — compound clip created with explicit name), `rename_color_group` (renamed a real color group), `render_with_quick_export` (params dict forwarded — Resolve's structured `{JobStatus, Error}` response confirms the dict reached it), and the compound-side `GetItemListInTrack` deprecated→supported fix.
|
|
2534
|
-
|
|
2535
|
-
## v2.3.2
|
|
2536
|
-
|
|
2537
|
-
API parity sweep — closing documented overloads and dropped parameters that the v2.3.1 audit surfaced.
|
|
2538
|
-
|
|
2539
|
-
- **Positioned `CreateTimelineFromClips` via `clip_infos`** — `media_pool(action="create_timeline_from_clips", params={"clip_infos": [...]})` and the granular `create_timeline_from_clips(clip_infos=[...])` now expose the documented `MediaPool.CreateTimelineFromClips(name, [{clipInfo}, ...])` overload (4 keys: `mediaPoolItem`, `startFrame`, `endFrame`, `recordFrame`)
|
|
2540
|
-
- **Image-sequence `ImportMedia` via `clip_infos`** — both layers now expose `MediaPool.ImportMedia([{FilePath, StartIndex, EndIndex}, ...])` for DPX/EXR/etc. sequence imports. PascalCase keys preserved per Resolve docs
|
|
2541
|
-
- **Positioned `AddItemListToMediaPool` via `item_infos`** — `media_storage(action="import_to_pool", params={"item_infos": [{media, startFrame, endFrame}, ...]})` and granular `add_items_to_media_pool_from_storage(item_infos=[...])` now expose the documented `MediaStorage.AddItemListToMediaPool([{itemInfo}, ...])` overload
|
|
2542
|
-
- **`Timeline.AddTrack` dict form** — replaced the legacy bare-string `sub_type` argument with the documented `newTrackOptions` dict (`audio_type`, `index`). Granular `timeline_add_track(track_type, audio_type=, index=)` and compound `timeline(action="add_track", params={"track_type", "options": {audio_type, index}})`
|
|
2543
|
-
- **`CreateSubtitlesFromAudio` actually wired up** — granular `timeline_create_subtitles_from_audio` previously advertised `language` and `preset` parameters then silently dropped them. Now maps user strings (e.g. `"korean"`, `"netflix"`, `"double"`) to `resolve.AUTO_CAPTION_*` constants per docs lines 720-761, and exposes the missing `chars_per_line`, `line_break`, `gap` keys
|
|
2544
|
-
- **Granular `import_media` no longer crashes** — the granular `import_media` tool was importing from a deleted `api.media_operations` module and would throw `ModuleNotFoundError` on first call. Rewritten to call `MediaPool.ImportMedia` directly and to share the new `clip_infos` overload
|
|
2545
|
-
- **`SetRenderSettings` docstring completeness** — granular `set_render_settings` now documents all 27 keys per docs lines 765-799 (previously omitted `EncodingProfile`, `MultiPassEncode`, `AlphaMode`, `NetworkOptimization`, `PixelAspectRatio`, `ClipStartFrame`, `TimelineStartTimecode`, `ReplaceExistingFilesInPlace`)
|
|
2546
|
-
- **Removed 18 broken granular tools (+ 7 broken resources)** that imported from a deleted `api.*` namespace and would crash with `ModuleNotFoundError` on first call. All 25 had working equivalents elsewhere or wrapped undocumented Resolve methods. Granular tool count is now **336** (was 354). Migration map for any caller that was hitting them:
|
|
2547
|
-
- `delete_media` → `media_pool(action="delete_clips")`
|
|
2548
|
-
- `move_media_to_bin` → `media_pool(action="move_clips")`
|
|
2549
|
-
- `auto_sync_audio` (granular tool) → `media_pool(action="auto_sync_audio")`
|
|
2550
|
-
- `unlink_clips` → `media_pool(action="unlink")`
|
|
2551
|
-
- `relink_clips` → `media_pool(action="relink")`
|
|
2552
|
-
- `create_bin` → `media_pool(action="add_subfolder")`
|
|
2553
|
-
- `list_media_pool_bins` (resource) → `folder(action="get_subfolders")`
|
|
2554
|
-
- `get_media_pool_bin_contents` (resource) → `folder(action="get_clips")`
|
|
2555
|
-
- `get_timeline_tracks` (resource) → `timeline(action="get_track_count")` + `timeline(action="get_items_in_track")`
|
|
2556
|
-
- `create_empty_timeline` → `media_pool(action="create_timeline")`
|
|
2557
|
-
- `delete_timeline` → `media_pool(action="delete_timelines")`
|
|
2558
|
-
- `add_marker` (granular timeline tool) → `timeline_markers(action="add")`
|
|
2559
|
-
- `add_clip_to_timeline` → `media_pool(action="append_to_timeline")`
|
|
2560
|
-
- `apply_lut` (granular graph tool) → `graph(action="set_lut")`
|
|
2561
|
-
- `copy_grade` → `timeline_item_color(action="copy_grades")`
|
|
2562
|
-
- `get_render_presets` (resource) → `render(action="list_presets")`
|
|
2563
|
-
- `add_to_render_queue` → `render(action="add_job")`
|
|
2564
|
-
- `start_render` (granular project tool) → `render(action="start")`
|
|
2565
|
-
- `get_render_queue_status` (resource) → `render(action="list_jobs")` + `render(action="get_job_status")`
|
|
2566
|
-
- `clear_render_queue` (granular project tool) → `render(action="delete_all_jobs")`
|
|
2567
|
-
- `create_sub_clip`, `get_current_color_node`, `get_color_wheel_params`, `set_color_wheel_param`, `add_node`: removed — these wrapped undocumented Resolve methods that were never exposed in the official scripting API. No replacement exists; use the Resolve UI for now.
|
|
2568
|
-
|
|
2569
|
-
## v2.3.1
|
|
2570
|
-
|
|
2571
|
-
- **Positioned `AppendToTimeline` via `clip_infos`** — `media_pool(action="append_to_timeline", params={"clip_infos": [...]})` now exposes the documented `MediaPool.AppendToTimeline([{clipInfo}, ...])` overload, accepting per-entry `clip_id`/`media_pool_item_id`, `start_frame`, `end_frame`, `record_frame`, `track_index`, and optional `media_type`. Each appended item returns its `timeline_item_id` for follow-up Fusion ops
|
|
2572
|
-
- **Positioned append failure reporting** — the same call now returns `{"error": ...}` when Resolve fails to produce valid timeline items, including falsey `AppendToTimeline()` results and returned item handles without a timeline item id
|
|
2573
|
-
- **Live disposable Resolve validation** — verified the fix against DaVinci Resolve Studio 20.3.2 with synthetic temp media in a disposable project: valid `clip_infos` append returned `success`, `count=1`, and `timeline_item_id`; invalid `clip_infos` calls returned errors
|
|
2574
|
-
|
|
2575
|
-
## v2.3.0
|
|
2576
|
-
|
|
2577
|
-
- **Resolve 20.2.2 API sync** — added the 12 scripting methods introduced across Resolve 20.0-20.2.2, with compatibility guards so older Resolve builds return clear "requires Resolve 20.x" errors instead of crashing
|
|
2578
|
-
- **Resolve 20 live validation** — revalidated the new API surface against DaVinci Resolve Studio 20.3.2, bringing live-tested coverage to 331/336 methods (98.5%)
|
|
2579
|
-
- **Official scripting docs refreshed** — `docs/reference/resolve_scripting_api.txt` now tracks the Resolve 20 scripting README bundled with the installed 20.3.2 developer package
|
|
2580
|
-
- **AI skill reference updated** — merged PR #30's `docs/SKILL.md` and updated it for the Resolve 20 method count, granular server, version guards, and source media integrity guidance
|
|
2581
|
-
- **Stale Resolve handle recovery** — both server modes now validate cached Resolve handles and reconnect cleanly after Resolve restarts or Project Manager transitions
|
|
2582
|
-
|
|
2583
|
-
## v2.2.0
|
|
2584
|
-
|
|
2585
|
-
- **Granular server modularized internally** — `src/resolve_mcp_server.py` is now a thin entrypoint, with the granular implementation split across `src/granular/resolve_control.py`, `project.py`, `timeline.py`, `timeline_item.py`, `media_pool.py`, `folder.py`, `media_pool_item.py`, `gallery.py`, `graph.py`, and `media_storage.py`
|
|
2586
|
-
- **Installer now emits env blocks for every generated stdio config** — standard `.mcp.json`, VS Code `.vscode/mcp.json`, Zed `context_servers`, and manual snippets now include `RESOLVE_SCRIPT_API`, `RESOLVE_SCRIPT_LIB`, and `PYTHONPATH`
|
|
2587
|
-
- **Windows Resolve 20.3 hardening** — on Windows, the installer also emits `PYTHONHOME` derived from the selected interpreter's base install so Resolve binds against the intended Python instead of a newer globally registered one
|
|
2588
|
-
- **Windows stdio transport hardening** — server entrypoints now run FastMCP through strict LF-only stdio wrappers to avoid client disconnects caused by platform newline translation in Windows pipes
|
|
2589
|
-
- **`set_cdl` accepts arrays cleanly** — both compound and granular servers now normalize JSON array, tuple, and numeric CDL values into Resolve's required string form like `"1.0 1.0 1.0"`
|
|
2590
|
-
- **`fusion_comp` can target timeline item comps** — node graph actions can now operate on a clip's Fusion comp via `clip_id`, `timeline_item_id`, or `timeline_item`, and `bulk_set_inputs` applies scoped input changes across multiple timeline comps
|
|
2591
|
-
- **`python src/server.py --full` now stays intact** — the compound entrypoint now correctly launches the granular server instead of importing it and exiting
|
|
2592
|
-
|
|
2593
|
-
## v2.1.0
|
|
2594
|
-
|
|
2595
|
-
- **New `fusion_comp` tool** — 20-action tool exposing the full Fusion composition node graph API. Add/delete/find nodes, wire connections, set/get parameters, manage keyframes, control undo grouping, set render ranges, and trigger renders — all on the currently active Fusion page composition
|
|
2596
|
-
- **`timeline_item_fusion` cache actions** — added `get_cache_enabled` and `set_cache` actions for Fusion output cache control directly on timeline items
|
|
2597
|
-
- **Fusion node graph reference** — docstring includes common tool IDs (Merge, TextPlus, Background, Transform, ColorCorrector, DeltaKeyer, etc.) for discoverability
|
|
2598
|
-
|
|
2599
|
-
## v2.0.9
|
|
2600
|
-
|
|
2601
|
-
- **Cross-platform sandbox path redirect** — `_resolve_safe_dir()` now handles macOS (`/var/folders`, `/private/var`), Linux (`/tmp`, `/var/tmp`), and Windows (`AppData\Local\Temp`) sandbox paths that Resolve can't write to. Redirects to `~/Documents/resolve-stills` instead of Desktop
|
|
2602
|
-
- **Auto-cleanup for `grab_and_export`** — exported files are read into the response (DRX as inline text, images as base64) then deleted from disk automatically. Zero file accumulation. Pass `cleanup: false` to keep files on disk
|
|
2603
|
-
- **Both servers in sync** — `server.py` and `resolve_mcp_server.py` now share the same version and both use `_resolve_safe_dir()` for all Resolve-facing temp paths (project export, LUT export, still export)
|
|
2604
|
-
|
|
2605
|
-
## v2.0.8
|
|
2606
|
-
|
|
2607
|
-
- **New `grab_and_export` action on `gallery_stills`** — combines `GrabStill()` + `ExportStills()` in a single atomic call, keeping the live GalleryStill reference for reliable export. Returns a file manifest with exported image + companion `.drx` grade file
|
|
2608
|
-
- **Format fallback chain** — if the requested format fails, automatically retries with tif then dpx
|
|
2609
|
-
- **macOS sandbox path redirect** — `/var/folders` and `/private/var` paths are redirected to `~/Desktop/resolve-stills` since Resolve's process can't write to sandboxed temp directories
|
|
2610
|
-
- **Key finding documented** — `ExportStills` requires the Gallery panel to be visible on the Color page. All 9 supported formats (dpx, cin, tif, jpg, png, ppm, bmp, xpm, drx) produce a companion `.drx` grade file alongside the image
|
|
2611
|
-
|
|
2612
|
-
## v2.0.7
|
|
2613
|
-
|
|
2614
|
-
- **Security: path traversal protection for layout preset tools** — `export_layout_preset`, `import_layout_preset`, and `delete_layout_preset` now validate that resolved file paths stay within the expected Resolve presets directory, preventing path traversal via crafted preset names
|
|
2615
|
-
- **Security: document destructive tool risk** — added Security Considerations section noting that `quit_app`/`restart_app` tools can terminate Resolve; MCP clients should require user confirmation before invoking
|
|
2616
|
-
|
|
2617
|
-
## v2.0.6
|
|
2618
|
-
|
|
2619
|
-
- **Fix color group operations crash** — `timeline_item_color` unpacked `_check()` as `(proj, _, _)` but `_check()` returns `(pm, proj, err)`, so `proj` got the ProjectManager instead of the Project, crashing `assign_color_group` and `remove_from_color_group`
|
|
2620
|
-
|
|
2621
|
-
## v2.0.5
|
|
2622
|
-
|
|
2623
|
-
- **Lazy connection recovery** — full server (`--full` mode) now auto-reconnects and auto-launches Resolve, matching the compound server behavior
|
|
2624
|
-
- **Null guards on all chained API calls** — `GetProjectManager()`, `GetCurrentProject()`, `GetCurrentTimeline()` failures now return clear errors instead of `NoneType` crashes
|
|
2625
|
-
- **Helper functions** — `get_resolve()`, `get_project_manager()`, `get_current_project()` replace 178 boilerplate blocks
|
|
2626
|
-
|
|
2627
|
-
## v2.0.4
|
|
2628
|
-
|
|
2629
|
-
- **Fix apply_grade_from_drx parameter** — renamed `mode` to `grade_mode` to match Resolve API; corrected documentation from replace/append to actual keyframe alignment modes (0=No keyframes, 1=Source Timecode aligned, 2=Start Frames aligned)
|
|
2630
|
-
- **Backward compatible** — still accepts `mode` for existing clients, `grade_mode` takes precedence
|
|
2631
|
-
|
|
2632
|
-
## v2.0.3
|
|
2633
|
-
|
|
2634
|
-
- **Fix GetNodeGraph crash** — `GetNodeGraph(0)` returns `False` in Resolve; now calls without args unless `layer_index` is explicitly provided
|
|
2635
|
-
- **Falsy node graph check** — guard checks `not g` instead of `g is None` to catch `False` returns
|
|
2636
|
-
|
|
2637
|
-
## v2.0.2
|
|
2638
|
-
|
|
2639
|
-
- **Antigravity support** — Google's agentic AI coding assistant added as 10th MCP client
|
|
2640
|
-
- **Alphabetical client ordering** — MCP_CLIENTS list sorted for easier maintenance
|
|
2641
|
-
|
|
2642
|
-
## v2.0.1
|
|
2643
|
-
|
|
2644
|
-
- **26-tool compound server** — all 324 API methods grouped into 26 context-efficient tools (default)
|
|
2645
|
-
- **Universal installer** — single `python install.py` for macOS/Windows/Linux, 10 MCP clients
|
|
2646
|
-
- **Dedicated timeline_item actions** — retime/speed, transform, crop, composite, audio, keyframes with validation
|
|
2647
|
-
- **Lazy Resolve connection** — server starts instantly, connects when first tool is called
|
|
2648
|
-
- **Bug fixes** — CreateMagicMask param type, GetCurrentClipThumbnailImage args, Python 3.13+ warning
|