@hybridlabor-api/aos 4.4.1 → 4.4.2-beta.1
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 +471 -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,525 +0,0 @@
|
|
|
1
|
-
"""Behaviorally-verified facts about the DaVinci Resolve scripting API.
|
|
2
|
-
|
|
3
|
-
The Resolve scripting API is under-documented and frequently behaves differently
|
|
4
|
-
from its apparent signature: methods live on objects you wouldn't expect, return
|
|
5
|
-
values lie, string keys are silently rejected, and some documented-looking calls
|
|
6
|
-
don't exist. This module records facts we have *verified against live Resolve* so
|
|
7
|
-
agents and code can look the reality up instead of rediscovering it the hard way.
|
|
8
|
-
|
|
9
|
-
Each entry is a small dict. Grow it opportunistically — every readback recipe and
|
|
10
|
-
every fix that uncovers a surprising behavior should add an entry. Facts are
|
|
11
|
-
stamped with the Resolve build they were verified on so drift is visible when a
|
|
12
|
-
new version ships.
|
|
13
|
-
|
|
14
|
-
Optional keys on an entry feed the Blackmagic-facing limitations report
|
|
15
|
-
(``docs/reference/api-limitations.md``, generated by
|
|
16
|
-
``scripts/gen_api_limitations.py``):
|
|
17
|
-
|
|
18
|
-
- ``submit``: ``"missing"`` (a capability Blackmagic should add) or ``"bug"``
|
|
19
|
-
(a behavior Blackmagic should fix). Entries without ``submit`` are internal
|
|
20
|
-
quirks/tips and stay out of the report.
|
|
21
|
-
- ``issue``: GitHub issue number (int) that drove the finding, for cross-ref.
|
|
22
|
-
|
|
23
|
-
When you add or change a ``submit``-tagged entry, regenerate the report
|
|
24
|
-
(``venv/bin/python scripts/gen_api_limitations.py``) or the
|
|
25
|
-
``tests.test_api_limitations_doc`` drift guard fails.
|
|
26
|
-
"""
|
|
27
|
-
from typing import Any, Dict, List, Optional
|
|
28
|
-
|
|
29
|
-
VERIFIED_ON = "DaVinci Resolve Studio 21.0.0"
|
|
30
|
-
|
|
31
|
-
# Each entry: symbol, object, reality, recommended, tags. `signature` optional.
|
|
32
|
-
API_TRUTH: List[Dict[str, Any]] = [
|
|
33
|
-
{
|
|
34
|
-
"symbol": "MediaPool.AutoSyncAudio",
|
|
35
|
-
"object": "MediaPool",
|
|
36
|
-
"signature": "(clips, settings) -> bool",
|
|
37
|
-
"reality": "The boolean return does not reflect whether clips actually "
|
|
38
|
-
"linked, and string enum keys in `settings` are silently "
|
|
39
|
-
"rejected (the call returns False).",
|
|
40
|
-
"recommended": "Resolve the AUDIO_SYNC_* enum constants via the live "
|
|
41
|
-
"resolve handle, and verify by reading each clip's "
|
|
42
|
-
"'Synced Audio' property (see verify_by_readback).",
|
|
43
|
-
"tags": ["unreliable-return", "silent-failure", "audio", "enum"],
|
|
44
|
-
"submit": "bug",
|
|
45
|
-
"mitigation": ["_normalize_auto_sync_settings", "_safe_auto_sync_audio"],
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"symbol": "Timeline.CreateSubtitlesFromAudio",
|
|
49
|
-
"object": "Timeline",
|
|
50
|
-
"signature": "(autoCaptionSettings) -> bool",
|
|
51
|
-
"reality": "Same failure mode as AutoSyncAudio: the autoCaptionSettings "
|
|
52
|
-
"dict is keyed by resolve.SUBTITLE_* enum constants with "
|
|
53
|
-
"resolve.AUTO_CAPTION_* enum values, so plain string keys like "
|
|
54
|
-
"{'language': 'korean'} are silently rejected (returns False, "
|
|
55
|
-
"no subtitle track created). The boolean is also unreliable.",
|
|
56
|
-
"recommended": "Resolve the SUBTITLE_*/AUTO_CAPTION_* constants via the "
|
|
57
|
-
"live resolve handle (server._normalize_auto_caption_settings) "
|
|
58
|
-
"and verify by reading the timeline's subtitle track count "
|
|
59
|
-
"before/after (server._safe_create_subtitles).",
|
|
60
|
-
"tags": ["unreliable-return", "silent-failure", "subtitle", "enum"],
|
|
61
|
-
"submit": "bug",
|
|
62
|
-
"mitigation": ["_normalize_auto_caption_settings", "_safe_create_subtitles"],
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
"symbol": "ProjectManager CloudProject family (Create/Load/Import/RestoreCloudProject)",
|
|
66
|
-
"object": "ProjectManager",
|
|
67
|
-
"signature": "(..., cloudSettings) -> Project | bool",
|
|
68
|
-
"reality": "All four take an enum-keyed {cloudSettings} dict "
|
|
69
|
-
"(resolve.CLOUD_SETTING_* keys, resolve.CLOUD_SYNC_* sync-mode "
|
|
70
|
-
"values). Plain string keys are silently rejected, so a settings "
|
|
71
|
-
"dict built from human-readable keys yields no project / False.",
|
|
72
|
-
"recommended": "Resolve the CLOUD_SETTING_*/CLOUD_SYNC_* constants via the "
|
|
73
|
-
"live resolve handle (server._normalize_cloud_settings) "
|
|
74
|
-
"before calling, and treat the bool return from "
|
|
75
|
-
"Import/RestoreCloudProject as advisory.",
|
|
76
|
-
"tags": ["silent-failure", "project", "cloud", "enum"],
|
|
77
|
-
"submit": "bug",
|
|
78
|
-
"mitigation": ["_normalize_cloud_settings"],
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
"symbol": "Timeline.Export",
|
|
82
|
-
"object": "Timeline",
|
|
83
|
-
"signature": "(fileName, exportType, exportSubtype) -> bool",
|
|
84
|
-
"reality": "exportType/exportSubtype must be resolve.EXPORT_* enum *values* "
|
|
85
|
-
"resolved from the live handle. A JSON/MCP caller cannot pass a "
|
|
86
|
-
"live enum, and a plain string ('fcpxml', or even the constant "
|
|
87
|
-
"name 'EXPORT_FCPXML_1_10') is silently rejected with no file "
|
|
88
|
-
"written.",
|
|
89
|
-
"recommended": "Map a friendly format/subtype to the EXPORT_* constant and "
|
|
90
|
-
"resolve it against the live handle "
|
|
91
|
-
"(server._timeline_export_spec) before calling; verify the "
|
|
92
|
-
"output file exists afterward.",
|
|
93
|
-
"tags": ["silent-failure", "timeline", "export", "enum"],
|
|
94
|
-
"submit": "bug",
|
|
95
|
-
"mitigation": ["_timeline_export_spec", "_timeline_export_value"],
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
"symbol": "ProjectManager.DeleteProject",
|
|
99
|
-
"object": "ProjectManager",
|
|
100
|
-
"signature": "(projectName) -> bool",
|
|
101
|
-
"reality": "Returns False (no deletion) when the target project is, or "
|
|
102
|
-
"recently was, the current project, and is flaky on the first "
|
|
103
|
-
"attempt — so a single bool() call leaves the project undeleted "
|
|
104
|
-
"with no useful error.",
|
|
105
|
-
"recommended": "Load/close away from the target first, then retry; use "
|
|
106
|
-
"src/utils/project_cleanup.py:delete_project_safely.",
|
|
107
|
-
"tags": ["unreliable-return", "project", "flaky"],
|
|
108
|
-
"submit": "bug",
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
"symbol": "Composition.Paste",
|
|
112
|
-
"object": "Fusion Composition",
|
|
113
|
-
"reality": "Passing tool.SaveSettings()'s in-memory table to Paste() / "
|
|
114
|
-
"LoadSettings() fails across the Python bridge with an "
|
|
115
|
-
"OrderedDict/null-argument error and creates no node, while "
|
|
116
|
-
"reporting nothing useful.",
|
|
117
|
-
"recommended": "Duplicate via AddTool(RegID) + SaveSettings(path)/"
|
|
118
|
-
"LoadSettings(path) through a temp .setting FILE, which "
|
|
119
|
-
"round-trips reliably. Identify the new node by name diff.",
|
|
120
|
-
"tags": ["fusion", "bridge", "silent-failure"],
|
|
121
|
-
"submit": "bug",
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
"symbol": "FlowView.SetPos / FlowView.GetPosTable",
|
|
125
|
-
"object": "Fusion FlowView (comp.CurrentFrame.FlowView)",
|
|
126
|
-
"reality": "Node positions are read/written through the FlowView, not the "
|
|
127
|
-
"tool. SetPos returns nothing reliable; GetPosTable returns a "
|
|
128
|
-
"1-indexed table (or dict/tuple depending on bridge).",
|
|
129
|
-
"recommended": "Use comp.CurrentFrame.FlowView.SetPos(tool, x, y); confirm "
|
|
130
|
-
"with GetPosTable and a liberal position parser.",
|
|
131
|
-
"tags": ["fusion", "unreliable-return"],
|
|
132
|
-
"submit": "bug",
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
"symbol": "Timeline.GetTimelineByName",
|
|
136
|
-
"object": "Project",
|
|
137
|
-
"reality": "Does not exist. Timelines are looked up by index.",
|
|
138
|
-
"recommended": "Iterate GetTimelineByIndex(1..GetTimelineCount()).",
|
|
139
|
-
"tags": ["missing-method", "timeline"],
|
|
140
|
-
"submit": "missing",
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
"symbol": "Project render methods (AddRenderJob, SetRenderSettings, ...)",
|
|
144
|
-
"object": "Project",
|
|
145
|
-
"reality": "Render methods live on the Project object, not on a separate "
|
|
146
|
-
"render-settings interface.",
|
|
147
|
-
"recommended": "Call proj.AddRenderJob(), proj.SetRenderSettings(), "
|
|
148
|
-
"proj.LoadRenderPreset() directly on the project.",
|
|
149
|
-
"tags": ["render"],
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
"symbol": "MediaPoolItem.GetClipProperty('Transcription')",
|
|
153
|
-
"object": "MediaPoolItem",
|
|
154
|
-
"reality": "Returns a PREVIEW of the transcription that ends in an "
|
|
155
|
-
"ellipsis when the full transcript is longer than the property "
|
|
156
|
-
"exposes.",
|
|
157
|
-
"recommended": "Treat a trailing ellipsis as truncation (see "
|
|
158
|
-
"media_pool_item get_transcription's `truncated` flag).",
|
|
159
|
-
"tags": ["transcription", "truncation"],
|
|
160
|
-
"submit": "bug",
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
"symbol": "ProjectManager.CreateProject (with a dirty Untitled project)",
|
|
164
|
-
"object": "ProjectManager",
|
|
165
|
-
"reality": "Returns None and pops a modal 'Save Current Project' dialog "
|
|
166
|
-
"when the current unsaved/Untitled project blocks the switch. "
|
|
167
|
-
"SaveProject() on an Untitled project re-triggers the same modal.",
|
|
168
|
-
"recommended": "CloseProject(current) to discard the untitled project "
|
|
169
|
-
"without a prompt, then CreateProject; restore with "
|
|
170
|
-
"LoadProject afterward.",
|
|
171
|
-
"tags": ["project", "modal", "silent-failure"],
|
|
172
|
-
"submit": "bug",
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
"symbol": "Timeline.InsertFusionCompositionIntoTimeline",
|
|
176
|
-
"object": "Timeline",
|
|
177
|
-
"reality": "Reliable way to obtain a Fusion comp on an otherwise empty "
|
|
178
|
-
"timeline: it inserts a Fusion composition clip whose comp is "
|
|
179
|
-
"then reachable via GetFusionCompByIndex(1).",
|
|
180
|
-
"recommended": "Use it (rather than InsertGeneratorIntoTimeline) when you "
|
|
181
|
-
"need a comp to operate on.",
|
|
182
|
-
"tags": ["fusion", "timeline"],
|
|
183
|
-
},
|
|
184
|
-
{
|
|
185
|
-
"symbol": "Source Track Selector / destination track for Insert*IntoTimeline",
|
|
186
|
-
"object": "Timeline",
|
|
187
|
-
"reality": "There is no API to read or set the Source/Auto Track Selector "
|
|
188
|
-
"(the Edit-page patch panel that picks the destination track). "
|
|
189
|
-
"InsertTitleIntoTimeline, InsertFusionTitleIntoTimeline, "
|
|
190
|
-
"InsertGeneratorIntoTimeline, InsertFusionGeneratorIntoTimeline, "
|
|
191
|
-
"InsertOFXGeneratorIntoTimeline and "
|
|
192
|
-
"InsertFusionCompositionIntoTimeline take no trackIndex and "
|
|
193
|
-
"always drop the clip on the selector's current target (V1 in "
|
|
194
|
-
"practice). Locking lower video tracks does NOT redirect the "
|
|
195
|
-
"insert — verified live on 21.0.0: locking V1 makes the insert "
|
|
196
|
-
"FAIL rather than land on V2. Titles/generators also can't be "
|
|
197
|
-
"moved afterward (no MediaPoolItem, so AppendToTimeline clipInfo "
|
|
198
|
-
"and MoveClips don't apply).",
|
|
199
|
-
"recommended": "Accept the limitation for titles/generators (insert lands "
|
|
200
|
-
"on V1). For clips that DO have a MediaPoolItem, target a "
|
|
201
|
-
"track with MediaPool.AppendToTimeline's clipInfo 'trackIndex' "
|
|
202
|
-
"instead (exposed as media_pool append_to_timeline clip_infos). "
|
|
203
|
-
"See issue #74.",
|
|
204
|
-
"tags": ["missing-method", "timeline", "title", "generator", "track"],
|
|
205
|
-
"submit": "missing",
|
|
206
|
-
"issue": 74,
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
"symbol": "Per-clip audio channel-format conversion (Stereo<->Mono)",
|
|
210
|
-
"object": "MediaPoolItem / TimelineItem",
|
|
211
|
-
"reality": "No scripting method converts an individual clip's audio "
|
|
212
|
-
"channel format. ConvertTimelineToStereo is timeline-wide, and "
|
|
213
|
-
"CreateStereoClip builds a 3D *visual* stereoscopic clip, not an "
|
|
214
|
-
"audio mono->stereo change. The Edit-page 'Clip Attributes > "
|
|
215
|
-
"Audio' channel mapping is UI-only.",
|
|
216
|
-
"recommended": "Use the supported surface: timeline add_track with audioType "
|
|
217
|
-
"(create mono/stereo tracks), get_track_sub_type (query "
|
|
218
|
-
"format), convert_to_stereo (timeline-wide), and "
|
|
219
|
-
"timeline_item get_source_audio_channel_mapping. Per-clip "
|
|
220
|
-
"conversion is not possible. See issue #73.",
|
|
221
|
-
"tags": ["missing-method", "audio", "channel"],
|
|
222
|
-
"submit": "missing",
|
|
223
|
-
"issue": 73,
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
"symbol": "Native multicam clip creation",
|
|
227
|
-
"object": "MediaPool",
|
|
228
|
-
"reality": "There is no method to create a native multicam clip from a set "
|
|
229
|
-
"of angles. Angles can be stacked onto tracks programmatically, "
|
|
230
|
-
"but the multicam-clip conversion is a UI-only step.",
|
|
231
|
-
"recommended": "Prepare a stacked timeline (media_pool setup_multicam_timeline) "
|
|
232
|
-
"and finish the multicam-clip conversion in the Resolve UI.",
|
|
233
|
-
"tags": ["missing-method", "media-pool", "multicam"],
|
|
234
|
-
"submit": "missing",
|
|
235
|
-
},
|
|
236
|
-
{
|
|
237
|
-
"symbol": "Transition create / copy / clone",
|
|
238
|
-
"object": "Timeline / TimelineItem",
|
|
239
|
-
"reality": "The scripting API exposes no method to add, read, copy, or "
|
|
240
|
-
"clone an edit transition (cross-dissolve, etc.). Transitions "
|
|
241
|
-
"applied in the UI are invisible to and unmodifiable by scripts.",
|
|
242
|
-
"recommended": "Apply/duplicate transitions in the Resolve UI; no scripted "
|
|
243
|
-
"equivalent exists.",
|
|
244
|
-
"tags": ["missing-method", "timeline", "transition"],
|
|
245
|
-
"submit": "missing",
|
|
246
|
-
},
|
|
247
|
-
{
|
|
248
|
-
"symbol": "Cloud project enumeration / export / user management",
|
|
249
|
-
"object": "ProjectManager",
|
|
250
|
-
"reality": "Only CreateCloudProject, LoadCloudProject, ImportCloudProject "
|
|
251
|
-
"and RestoreCloudProject exist. There is no GetCloudProjectList "
|
|
252
|
-
"(list available cloud projects), no ExportToCloud, and no "
|
|
253
|
-
"Add/RemoveUserToCloudProject — so cloud collaboration can't be "
|
|
254
|
-
"fully automated.",
|
|
255
|
-
"recommended": "Drive cloud project listing, export, and collaborator "
|
|
256
|
-
"management from the Resolve UI; only create/load/import/"
|
|
257
|
-
"restore are scriptable.",
|
|
258
|
-
"tags": ["missing-method", "project", "cloud"],
|
|
259
|
-
"submit": "missing",
|
|
260
|
-
},
|
|
261
|
-
{
|
|
262
|
-
"symbol": "TimelineItem trim / move / re-time (no position setters)",
|
|
263
|
-
"object": "TimelineItem",
|
|
264
|
-
"reality": "TimelineItem exposes GetStart, GetEnd, GetDuration, "
|
|
265
|
-
"GetLeftOffset, GetRightOffset and GetSourceStart/EndFrame, but "
|
|
266
|
-
"NO matching setters. A clip cannot be trimmed, slipped, slid, "
|
|
267
|
-
"rolled, moved to another time/track, or have its duration "
|
|
268
|
-
"changed once it is on the timeline. Verified via dir() on "
|
|
269
|
-
"Resolve 21.0.0 (getters only).",
|
|
270
|
-
"recommended": "Do edit-point adjustments in the Resolve UI, or rebuild the "
|
|
271
|
-
"timeline from MediaPool.AppendToTimeline clipInfos with the "
|
|
272
|
-
"desired startFrame/endFrame/recordFrame.",
|
|
273
|
-
"tags": ["missing-method", "timeline", "edit", "trim"],
|
|
274
|
-
"submit": "missing",
|
|
275
|
-
},
|
|
276
|
-
{
|
|
277
|
-
"symbol": "Razor / blade / split a timeline item",
|
|
278
|
-
"object": "Timeline / TimelineItem",
|
|
279
|
-
"reality": "There is no method to split/cut/blade a clip at a given frame. "
|
|
280
|
-
"Verified absent on Timeline and TimelineItem (dir(), 21.0.0).",
|
|
281
|
-
"recommended": "Split in the Resolve UI, or construct the cut up-front by "
|
|
282
|
-
"appending two clipInfos with the desired in/out points.",
|
|
283
|
-
"tags": ["missing-method", "timeline", "edit"],
|
|
284
|
-
"submit": "missing",
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
"symbol": "Clip speed / retime ratio and speed ramps",
|
|
288
|
-
"object": "TimelineItem",
|
|
289
|
-
"reality": "SetProperty exposes only retime *quality* (RetimeProcess, "
|
|
290
|
-
"MotionEstimation) and transform/crop/composite/opacity keys — "
|
|
291
|
-
"not the speed value itself. There is no way to set a clip to a "
|
|
292
|
-
"given % speed, reverse it, or author a speed ramp. Verified "
|
|
293
|
-
"against the documented SetProperty key list AND by live "
|
|
294
|
-
"mutating attempt on 21.0.0: SetProperty('Speed'|'PlaybackSpeed'"
|
|
295
|
-
"|'RetimeSpeed'|'ClipSpeed', 50) all return False, while "
|
|
296
|
-
"SetProperty('RetimeProcess', 1) returns True.",
|
|
297
|
-
"recommended": "Set clip speed/retime in the Resolve UI; no scripted "
|
|
298
|
-
"equivalent exists.",
|
|
299
|
-
"tags": ["missing-method", "timeline", "retime", "speed"],
|
|
300
|
-
"submit": "missing",
|
|
301
|
-
},
|
|
302
|
-
{
|
|
303
|
-
"symbol": "Color node graph editing and primary grade values",
|
|
304
|
-
"object": "Graph / TimelineItem",
|
|
305
|
-
"reality": "The Graph object exposes node enable/label/count, LUT get/set, "
|
|
306
|
-
"cache mode, ResetAllGrades, ApplyGradeFromDRX and "
|
|
307
|
-
"ApplyArriCdlLut; TimelineItem adds SetCDL, CopyGrades and color "
|
|
308
|
-
"versions. But you cannot add, delete, or connect nodes, and you "
|
|
309
|
-
"cannot read or write primary grade values (lift/gamma/gain/"
|
|
310
|
-
"offset/contrast/curves/qualifiers/power windows). Grading is "
|
|
311
|
-
"limited to CDL, whole-grade DRX/LUT application and copying.",
|
|
312
|
-
"recommended": "Build node trees and dial grades in the Resolve UI or via "
|
|
313
|
-
"DRX/CDL/LUT import; per-parameter grade control is not "
|
|
314
|
-
"scriptable.",
|
|
315
|
-
"tags": ["missing-method", "color", "grade", "node"],
|
|
316
|
-
"submit": "missing",
|
|
317
|
-
},
|
|
318
|
-
{
|
|
319
|
-
"symbol": "Fairlight audio levels / pan / EQ / automation / FairlightFX",
|
|
320
|
-
"object": "TimelineItem / Timeline",
|
|
321
|
-
"reality": "There is no API to set clip or track volume, pan, EQ, audio "
|
|
322
|
-
"automation, or to add/configure FairlightFX. SetProperty covers "
|
|
323
|
-
"video transform only; the audio surface is read-only "
|
|
324
|
-
"(GetSourceAudioChannelMapping, GetAudioMapping, voice "
|
|
325
|
-
"isolation). Verified via dir() + SetProperty docs AND by live "
|
|
326
|
-
"mutating attempt on 21.0.0: SetProperty('Volume'|'Level'|'Gain'"
|
|
327
|
-
"|'AudioVolume', 0) all return False (note 'Pan' is the VIDEO "
|
|
328
|
-
"transform key, not audio pan, so it misleadingly succeeds).",
|
|
329
|
-
"recommended": "Mix in the Fairlight UI; only voice-isolation state and "
|
|
330
|
-
"channel-mapping reads are scriptable.",
|
|
331
|
-
"tags": ["missing-method", "audio", "fairlight"],
|
|
332
|
-
"submit": "missing",
|
|
333
|
-
},
|
|
334
|
-
{
|
|
335
|
-
"symbol": "Proxy / optimized-media generation",
|
|
336
|
-
"object": "MediaPoolItem",
|
|
337
|
-
"reality": "Only LinkProxyMedia, UnlinkProxyMedia and "
|
|
338
|
-
"LinkFullResolutionMedia exist (attach/detach EXISTING proxies). "
|
|
339
|
-
"There is no method to generate proxies or optimized media. "
|
|
340
|
-
"Verified via MediaPoolItem dir() (21.0.0).",
|
|
341
|
-
"recommended": "Trigger proxy/optimized-media generation from the Resolve "
|
|
342
|
-
"UI; scripting can only link/unlink already-rendered proxies.",
|
|
343
|
-
"tags": ["missing-method", "media-pool", "proxy"],
|
|
344
|
-
"submit": "missing",
|
|
345
|
-
},
|
|
346
|
-
{
|
|
347
|
-
"symbol": "Insert / Overwrite / Replace / Fit-to-Fill edit modes",
|
|
348
|
-
"object": "MediaPool / Timeline",
|
|
349
|
-
"reality": "MediaPool.AppendToTimeline (with optional recordFrame "
|
|
350
|
-
"positioning) is the only programmatic placement. The standard "
|
|
351
|
-
"edit modes — insert (ripple), overwrite, replace, fit-to-fill, "
|
|
352
|
-
"place-on-top — have no API. Verified via dir() (21.0.0).",
|
|
353
|
-
"recommended": "Position clips with AppendToTimeline clipInfo recordFrame, "
|
|
354
|
-
"or perform insert/overwrite/replace edits in the Resolve UI.",
|
|
355
|
-
"tags": ["missing-method", "timeline", "edit"],
|
|
356
|
-
"submit": "missing",
|
|
357
|
-
},
|
|
358
|
-
{
|
|
359
|
-
"symbol": "Smart Bins / Power Bins creation",
|
|
360
|
-
"object": "MediaPool",
|
|
361
|
-
"reality": "Only AddSubFolder (a regular bin) exists. Smart Bins (rule-"
|
|
362
|
-
"based) and Power Bins (cross-project) cannot be created or "
|
|
363
|
-
"configured. Verified via MediaPool dir() (21.0.0).",
|
|
364
|
-
"recommended": "Create Smart/Power Bins in the Resolve UI; only regular "
|
|
365
|
-
"bins are scriptable.",
|
|
366
|
-
"tags": ["missing-method", "media-pool", "bins"],
|
|
367
|
-
"submit": "missing",
|
|
368
|
-
},
|
|
369
|
-
{
|
|
370
|
-
"symbol": "Per-subtitle text content and timing editing",
|
|
371
|
-
"object": "TimelineItem (subtitle track)",
|
|
372
|
-
"reality": "TimelineItem on a subtitle track exposes only 21 standard "
|
|
373
|
-
"transform/composite properties (Pan, Tilt, ZoomX, Opacity, "
|
|
374
|
-
"Crop, etc.). There are no methods to get or set subtitle "
|
|
375
|
-
"text (GetText/SetText), start time, end time, or duration "
|
|
376
|
-
"for individual subtitle items. Subtitles created via "
|
|
377
|
-
"CreateSubtitlesFromAudio or imported via the Resolve UI "
|
|
378
|
-
"cannot have their content or timing read or modified "
|
|
379
|
-
"programmatically. Verified via dir() and GetProperty() on "
|
|
380
|
-
"Resolve 21.0.0.48.",
|
|
381
|
-
"recommended": "No workaround exists — subtitle text and timing are "
|
|
382
|
-
"completely inaccessible from the scripting API. Must "
|
|
383
|
-
"be edited in the Resolve UI.",
|
|
384
|
-
"tags": ["missing-method", "subtitle", "text", "timing"],
|
|
385
|
-
"submit": "missing",
|
|
386
|
-
},
|
|
387
|
-
{
|
|
388
|
-
"symbol": "Subtitle track styling and presets",
|
|
389
|
-
"object": "TimelineItem / Timeline / Project",
|
|
390
|
-
"reality": "There is no API method to set or query subtitle font "
|
|
391
|
-
"family, font size, text color, background color, outline, "
|
|
392
|
-
"shadow, position, alignment, or to apply/query subtitle "
|
|
393
|
-
"style presets. TimelineItem.GetProperty() on subtitle "
|
|
394
|
-
"items returns only transform/composite keys. "
|
|
395
|
-
"Timeline.GetSetting() and Project.GetSetting() return "
|
|
396
|
-
"None for all probed subtitle-style keys (e.g. "
|
|
397
|
-
"'subtitleFontName', 'subtitleFontSize', "
|
|
398
|
-
"'subtitleTextColor', 'subtitleBackgroundColor', "
|
|
399
|
-
"'subtitlePosition', 'subtitleAlignment', "
|
|
400
|
-
"'subtitlePreset', 'subtitleStyle'). Verified via dir(), "
|
|
401
|
-
"GetProperty(), and GetSetting() on Resolve 21.0.0.48.",
|
|
402
|
-
"recommended": "No workaround exists — subtitle styling is UI-only. "
|
|
403
|
-
"Burn-in overlays via Fusion titles are a visual "
|
|
404
|
-
"alternative but do not produce proper subtitle tracks.",
|
|
405
|
-
"tags": ["missing-method", "subtitle", "style", "preset"],
|
|
406
|
-
"submit": "missing",
|
|
407
|
-
},
|
|
408
|
-
{
|
|
409
|
-
"symbol": "Speech recognition engine selection and SRT import",
|
|
410
|
-
"object": "Timeline",
|
|
411
|
-
"reality": "Timeline.CreateSubtitlesFromAudio(autoCaptionSettings) "
|
|
412
|
-
"always uses the built-in Resolve speech recognition "
|
|
413
|
-
"engine. There is no API parameter to select an alternative "
|
|
414
|
-
"provider (e.g. whisper-cli, Google Speech, AWS Transcribe). "
|
|
415
|
-
"The language selection via resolve.AUTO_CAPTION_LANGUAGE_* "
|
|
416
|
-
"is the only customization; the engine itself cannot be "
|
|
417
|
-
"changed. Furthermore, there is no API method to import an "
|
|
418
|
-
"SRT file into a subtitle track programmatically — "
|
|
419
|
-
"File -> Import -> Subtitle is UI-only.",
|
|
420
|
-
"recommended": "No workaround exists for provider selection or SRT "
|
|
421
|
-
"import. External transcripts must be converted to SRT "
|
|
422
|
-
"and imported through the Resolve UI.",
|
|
423
|
-
"tags": ["missing-method", "subtitle", "transcription",
|
|
424
|
-
"speech-recognition", "asr"],
|
|
425
|
-
"submit": "missing",
|
|
426
|
-
},
|
|
427
|
-
{
|
|
428
|
-
"symbol": "Media Pool folder rename",
|
|
429
|
-
"object": "MediaPool",
|
|
430
|
-
"reality": "MediaPool exposes AddSubFolder(name), "
|
|
431
|
-
"DeleteSubFolders([names]), and "
|
|
432
|
-
"MoveFolders([names], targetFolder) but no "
|
|
433
|
-
"RenameSubFolder(oldName, newName) method. Folders can be "
|
|
434
|
-
"created, deleted, and moved, but their names cannot be "
|
|
435
|
-
"changed through the API. Verified via dir() on Resolve "
|
|
436
|
-
"21.0.0.",
|
|
437
|
-
"recommended": "Delete and recreate the folder with the desired name, "
|
|
438
|
-
"or rename in the Resolve UI.",
|
|
439
|
-
"tags": ["missing-method", "media-pool", "folder"],
|
|
440
|
-
"submit": "missing",
|
|
441
|
-
},
|
|
442
|
-
{
|
|
443
|
-
"symbol": "hasattr() / getattr() on Resolve API objects (attribute fabrication)",
|
|
444
|
-
"object": "(all Resolve scripting objects)",
|
|
445
|
-
"reality": "The Python bridge returns a callable for ANY attribute name, so "
|
|
446
|
-
"hasattr(obj, 'TotallyMadeUpMethod') is always True and getattr "
|
|
447
|
-
"never raises. This makes capability detection by hasattr "
|
|
448
|
-
"impossible — verified on 21.0.0 (hasattr reported SetStart, "
|
|
449
|
-
"Razor, AddNode, GenerateProxy, AddSmartBin etc. as present "
|
|
450
|
-
"though none exist). Only dir() lists the real methods.",
|
|
451
|
-
"recommended": "Never probe method existence with hasattr/getattr; test "
|
|
452
|
-
"membership against dir(obj) instead. Calling a fabricated "
|
|
453
|
-
"method typically returns None/False with no error.",
|
|
454
|
-
"tags": ["bridge", "introspection", "silent-failure"],
|
|
455
|
-
"submit": "bug",
|
|
456
|
-
},
|
|
457
|
-
{
|
|
458
|
-
"symbol": "subprocess inheriting stdin under the MCP stdio server",
|
|
459
|
-
"object": "(server runtime)",
|
|
460
|
-
"reality": "A child process that inherits stdin can race-read bytes off "
|
|
461
|
-
"the JSON-RPC protocol stream and corrupt it; capture_output "
|
|
462
|
-
"redirects only stdout/stderr.",
|
|
463
|
-
"recommended": "Pass stdin=subprocess.DEVNULL on every subprocess that can "
|
|
464
|
-
"run while serving over stdio.",
|
|
465
|
-
"tags": ["runtime", "stdio", "subprocess"],
|
|
466
|
-
},
|
|
467
|
-
{
|
|
468
|
-
"symbol": "MediaPoolItem.SetClipProperty('Reel Name', ...)",
|
|
469
|
-
"object": "MediaPoolItem",
|
|
470
|
-
"signature": "(propertyName, propertyValue) -> bool",
|
|
471
|
-
"reality": "Setting the 'Reel Name' clip property returns True but the "
|
|
472
|
-
"value is silently dropped on read-back when the project is "
|
|
473
|
-
"configured to derive reel names automatically "
|
|
474
|
-
"(General Options > 'Assist using reel names from the:' set "
|
|
475
|
-
"to source clip file / embedding / filename pattern). The "
|
|
476
|
-
"same True-but-unpersisted behavior occurs via "
|
|
477
|
-
"SetMetadata('Reel Name', ...). Other clip properties on the "
|
|
478
|
-
"same clip (e.g. 'Comments') write and persist normally, so "
|
|
479
|
-
"this is field-specific, not a bridge/permission failure. "
|
|
480
|
-
"Verified on Resolve 21.0.0; reported as issue #77.",
|
|
481
|
-
"recommended": "After writing 'Reel Name', read it back with "
|
|
482
|
-
"GetClipProperty('Reel Name') and refuse to report "
|
|
483
|
-
"success on mismatch; surface the project-setting gate to "
|
|
484
|
-
"the caller (server._verify_clip_property_writeback).",
|
|
485
|
-
"tags": ["unreliable-return", "silent-failure", "metadata", "reel-name"],
|
|
486
|
-
"submit": "bug",
|
|
487
|
-
"issue": 77,
|
|
488
|
-
"mitigation": ["_verify_clip_property_writeback", "_verify_writeback"],
|
|
489
|
-
},
|
|
490
|
-
]
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
def lookup_api_truth(query: Optional[str] = None) -> List[Dict[str, Any]]:
|
|
494
|
-
"""Return verified facts matching `query`, or all facts if no query.
|
|
495
|
-
|
|
496
|
-
Matches a case-insensitive substring against the symbol, tags, and reality.
|
|
497
|
-
"""
|
|
498
|
-
if not query:
|
|
499
|
-
return list(API_TRUTH)
|
|
500
|
-
q = query.lower()
|
|
501
|
-
out = []
|
|
502
|
-
for e in API_TRUTH:
|
|
503
|
-
hay = " ".join([
|
|
504
|
-
e.get("symbol", ""),
|
|
505
|
-
e.get("object", ""),
|
|
506
|
-
e.get("reality", ""),
|
|
507
|
-
" ".join(e.get("tags", [])),
|
|
508
|
-
]).lower()
|
|
509
|
-
if q in hay:
|
|
510
|
-
out.append(e)
|
|
511
|
-
return out
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
def submittable_limitations() -> Dict[str, List[Dict[str, Any]]]:
|
|
515
|
-
"""Group ``submit``-tagged entries for the Blackmagic-facing report.
|
|
516
|
-
|
|
517
|
-
Returns ``{"missing": [...], "bug": [...]}`` — entries Blackmagic should add
|
|
518
|
-
vs. behaviors they should fix — preserving API_TRUTH order within each group.
|
|
519
|
-
"""
|
|
520
|
-
groups: Dict[str, List[Dict[str, Any]]] = {"missing": [], "bug": []}
|
|
521
|
-
for e in API_TRUTH:
|
|
522
|
-
kind = e.get("submit")
|
|
523
|
-
if kind in groups:
|
|
524
|
-
groups[kind].append(e)
|
|
525
|
-
return groups
|