@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,420 +0,0 @@
|
|
|
1
|
-
"""Folder-oriented tools for media pool folders."""
|
|
2
|
-
|
|
3
|
-
from src.granular.common import * # noqa: F401,F403
|
|
4
|
-
|
|
5
|
-
resolve = ResolveProxy()
|
|
6
|
-
|
|
7
|
-
@mcp.tool()
|
|
8
|
-
def export_folder(folder_name: str, export_path: str, export_type: str = "DRB") -> str:
|
|
9
|
-
"""Export a folder to a DRB file or other format.
|
|
10
|
-
|
|
11
|
-
Args:
|
|
12
|
-
folder_name: Name of the folder to export
|
|
13
|
-
export_path: Path to save the exported file
|
|
14
|
-
export_type: Export format (DRB is default and currently the only supported option)
|
|
15
|
-
"""
|
|
16
|
-
pm, current_project = get_current_project()
|
|
17
|
-
if not current_project:
|
|
18
|
-
return "Error: No project currently open"
|
|
19
|
-
|
|
20
|
-
media_pool = current_project.GetMediaPool()
|
|
21
|
-
if not media_pool:
|
|
22
|
-
return "Error: Failed to get Media Pool"
|
|
23
|
-
|
|
24
|
-
# Find the folder by name
|
|
25
|
-
target_folder = None
|
|
26
|
-
root_folder = media_pool.GetRootFolder()
|
|
27
|
-
|
|
28
|
-
if folder_name.lower() == "root" or folder_name.lower() == "master":
|
|
29
|
-
target_folder = root_folder
|
|
30
|
-
else:
|
|
31
|
-
# Search for the folder by name
|
|
32
|
-
folders = get_all_media_pool_folders(media_pool)
|
|
33
|
-
for folder in folders:
|
|
34
|
-
if folder.GetName() == folder_name:
|
|
35
|
-
target_folder = folder
|
|
36
|
-
break
|
|
37
|
-
|
|
38
|
-
if not target_folder:
|
|
39
|
-
return f"Error: Folder '{folder_name}' not found in Media Pool"
|
|
40
|
-
|
|
41
|
-
# Check if directory exists, create if not
|
|
42
|
-
export_dir = os.path.dirname(export_path)
|
|
43
|
-
if not os.path.exists(export_dir) and export_dir:
|
|
44
|
-
try:
|
|
45
|
-
os.makedirs(export_dir)
|
|
46
|
-
except Exception as e:
|
|
47
|
-
return f"Error creating directory for export: {str(e)}"
|
|
48
|
-
|
|
49
|
-
# Export the folder
|
|
50
|
-
try:
|
|
51
|
-
result = target_folder.Export(export_path)
|
|
52
|
-
if result:
|
|
53
|
-
return f"Successfully exported folder '{folder_name}' to '{export_path}'"
|
|
54
|
-
else:
|
|
55
|
-
return f"Failed to export folder '{folder_name}'"
|
|
56
|
-
except Exception as e:
|
|
57
|
-
return f"Error exporting folder: {str(e)}"
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
@mcp.tool()
|
|
61
|
-
def transcribe_folder_audio(folder_name: str, use_speaker_detection: Optional[bool] = None) -> str:
|
|
62
|
-
"""Transcribe audio for all clips in a folder.
|
|
63
|
-
|
|
64
|
-
The transcription language follows the project's Speech Recognition setting
|
|
65
|
-
(Project Settings > Subtitles), not a per-call argument.
|
|
66
|
-
|
|
67
|
-
Args:
|
|
68
|
-
folder_name: Name of the folder containing clips to transcribe
|
|
69
|
-
use_speaker_detection: Optional (Resolve 21+). Enable speaker detection.
|
|
70
|
-
If omitted, the project's setting is used.
|
|
71
|
-
"""
|
|
72
|
-
pm, current_project = get_current_project()
|
|
73
|
-
if not current_project:
|
|
74
|
-
return "Error: No project currently open"
|
|
75
|
-
|
|
76
|
-
media_pool = current_project.GetMediaPool()
|
|
77
|
-
if not media_pool:
|
|
78
|
-
return "Error: Failed to get Media Pool"
|
|
79
|
-
|
|
80
|
-
# Find the folder by name
|
|
81
|
-
target_folder = None
|
|
82
|
-
root_folder = media_pool.GetRootFolder()
|
|
83
|
-
|
|
84
|
-
if folder_name.lower() == "root" or folder_name.lower() == "master":
|
|
85
|
-
target_folder = root_folder
|
|
86
|
-
else:
|
|
87
|
-
# Search for the folder by name
|
|
88
|
-
folders = get_all_media_pool_folders(media_pool)
|
|
89
|
-
for folder in folders:
|
|
90
|
-
if folder.GetName() == folder_name:
|
|
91
|
-
target_folder = folder
|
|
92
|
-
break
|
|
93
|
-
|
|
94
|
-
if not target_folder:
|
|
95
|
-
return f"Error: Folder '{folder_name}' not found in Media Pool"
|
|
96
|
-
|
|
97
|
-
# Transcribe audio in the folder.
|
|
98
|
-
# Resolve 21's signature is TranscribeAudio(useSpeakerDetection=None); pass the
|
|
99
|
-
# bool only when supplied so older Resolve builds (no arg) keep working.
|
|
100
|
-
try:
|
|
101
|
-
if use_speaker_detection is None:
|
|
102
|
-
result = target_folder.TranscribeAudio()
|
|
103
|
-
else:
|
|
104
|
-
result = target_folder.TranscribeAudio(use_speaker_detection)
|
|
105
|
-
if result:
|
|
106
|
-
return f"Successfully started audio transcription for folder '{folder_name}'"
|
|
107
|
-
else:
|
|
108
|
-
return f"Failed to start audio transcription for folder '{folder_name}'"
|
|
109
|
-
except Exception as e:
|
|
110
|
-
return f"Error during audio transcription: {str(e)}"
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
@mcp.tool()
|
|
114
|
-
def clear_folder_transcription(folder_name: str) -> str:
|
|
115
|
-
"""Clear audio transcription for all clips in a folder.
|
|
116
|
-
|
|
117
|
-
Args:
|
|
118
|
-
folder_name: Name of the folder to clear transcriptions from
|
|
119
|
-
"""
|
|
120
|
-
pm, current_project = get_current_project()
|
|
121
|
-
if not current_project:
|
|
122
|
-
return "Error: No project currently open"
|
|
123
|
-
|
|
124
|
-
media_pool = current_project.GetMediaPool()
|
|
125
|
-
if not media_pool:
|
|
126
|
-
return "Error: Failed to get Media Pool"
|
|
127
|
-
|
|
128
|
-
# Find the folder by name
|
|
129
|
-
target_folder = None
|
|
130
|
-
root_folder = media_pool.GetRootFolder()
|
|
131
|
-
|
|
132
|
-
if folder_name.lower() == "root" or folder_name.lower() == "master":
|
|
133
|
-
target_folder = root_folder
|
|
134
|
-
else:
|
|
135
|
-
# Search for the folder by name
|
|
136
|
-
folders = get_all_media_pool_folders(media_pool)
|
|
137
|
-
for folder in folders:
|
|
138
|
-
if folder.GetName() == folder_name:
|
|
139
|
-
target_folder = folder
|
|
140
|
-
break
|
|
141
|
-
|
|
142
|
-
if not target_folder:
|
|
143
|
-
return f"Error: Folder '{folder_name}' not found in Media Pool"
|
|
144
|
-
|
|
145
|
-
# Clear transcription for the folder
|
|
146
|
-
try:
|
|
147
|
-
result = target_folder.ClearTranscription()
|
|
148
|
-
if result:
|
|
149
|
-
return f"Successfully cleared audio transcription for folder '{folder_name}'"
|
|
150
|
-
else:
|
|
151
|
-
return f"Failed to clear audio transcription for folder '{folder_name}'"
|
|
152
|
-
except Exception as e:
|
|
153
|
-
return f"Error clearing audio transcription: {str(e)}"
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
@mcp.tool()
|
|
157
|
-
def get_folder_clip_list(folder_path: str = "") -> Dict[str, Any]:
|
|
158
|
-
"""Get list of clips in a Media Pool folder.
|
|
159
|
-
|
|
160
|
-
Args:
|
|
161
|
-
folder_path: Path from root. Empty for current folder.
|
|
162
|
-
"""
|
|
163
|
-
_, mp, err = _get_mp()
|
|
164
|
-
if err:
|
|
165
|
-
return err
|
|
166
|
-
if folder_path:
|
|
167
|
-
folder = _navigate_to_folder(mp, folder_path)
|
|
168
|
-
if not folder:
|
|
169
|
-
return {"error": f"Folder '{folder_path}' not found"}
|
|
170
|
-
else:
|
|
171
|
-
folder = mp.GetCurrentFolder()
|
|
172
|
-
clips = folder.GetClipList()
|
|
173
|
-
if clips:
|
|
174
|
-
return {"folder": folder.GetName(), "clips": [{"name": c.GetName(), "unique_id": c.GetUniqueId()} for c in clips]}
|
|
175
|
-
return {"folder": folder.GetName(), "clips": []}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
@mcp.tool()
|
|
179
|
-
def get_folder_subfolder_list(folder_path: str = "") -> Dict[str, Any]:
|
|
180
|
-
"""Get list of subfolders in a Media Pool folder.
|
|
181
|
-
|
|
182
|
-
Args:
|
|
183
|
-
folder_path: Path from root. Empty for current folder.
|
|
184
|
-
"""
|
|
185
|
-
_, mp, err = _get_mp()
|
|
186
|
-
if err:
|
|
187
|
-
return err
|
|
188
|
-
if folder_path:
|
|
189
|
-
folder = _navigate_to_folder(mp, folder_path)
|
|
190
|
-
if not folder:
|
|
191
|
-
return {"error": f"Folder '{folder_path}' not found"}
|
|
192
|
-
else:
|
|
193
|
-
folder = mp.GetCurrentFolder()
|
|
194
|
-
subs = folder.GetSubFolderList()
|
|
195
|
-
if subs:
|
|
196
|
-
return {"folder": folder.GetName(), "subfolders": [{"name": s.GetName(), "unique_id": s.GetUniqueId()} for s in subs]}
|
|
197
|
-
return {"folder": folder.GetName(), "subfolders": []}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
@mcp.tool()
|
|
201
|
-
def get_folder_is_stale(folder_path: str = "") -> Dict[str, Any]:
|
|
202
|
-
"""Check if a Media Pool folder is stale (needs refresh).
|
|
203
|
-
|
|
204
|
-
Args:
|
|
205
|
-
folder_path: Path from root. Empty for current folder.
|
|
206
|
-
"""
|
|
207
|
-
_, mp, err = _get_mp()
|
|
208
|
-
if err:
|
|
209
|
-
return err
|
|
210
|
-
if folder_path:
|
|
211
|
-
folder = _navigate_to_folder(mp, folder_path)
|
|
212
|
-
if not folder:
|
|
213
|
-
return {"error": f"Folder '{folder_path}' not found"}
|
|
214
|
-
else:
|
|
215
|
-
folder = mp.GetCurrentFolder()
|
|
216
|
-
return {"folder": folder.GetName(), "is_stale": bool(folder.GetIsFolderStale())}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
@mcp.tool()
|
|
220
|
-
def get_folder_unique_id(folder_path: str = "") -> Dict[str, Any]:
|
|
221
|
-
"""Get the unique ID of a Media Pool folder.
|
|
222
|
-
|
|
223
|
-
Args:
|
|
224
|
-
folder_path: Path from root. Empty for current folder.
|
|
225
|
-
"""
|
|
226
|
-
_, mp, err = _get_mp()
|
|
227
|
-
if err:
|
|
228
|
-
return err
|
|
229
|
-
if folder_path:
|
|
230
|
-
folder = _navigate_to_folder(mp, folder_path)
|
|
231
|
-
if not folder:
|
|
232
|
-
return {"error": f"Folder '{folder_path}' not found"}
|
|
233
|
-
else:
|
|
234
|
-
folder = mp.GetCurrentFolder()
|
|
235
|
-
return {"folder": folder.GetName(), "unique_id": folder.GetUniqueId()}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
@mcp.tool()
|
|
239
|
-
def folder_export(file_path: str, folder_path: str = "") -> Dict[str, Any]:
|
|
240
|
-
"""Export a Media Pool folder to a file.
|
|
241
|
-
|
|
242
|
-
Args:
|
|
243
|
-
file_path: Absolute path for the export.
|
|
244
|
-
folder_path: Path from root. Empty for current folder.
|
|
245
|
-
"""
|
|
246
|
-
_, mp, err = _get_mp()
|
|
247
|
-
if err:
|
|
248
|
-
return err
|
|
249
|
-
if folder_path:
|
|
250
|
-
folder = _navigate_to_folder(mp, folder_path)
|
|
251
|
-
if not folder:
|
|
252
|
-
return {"error": f"Folder '{folder_path}' not found"}
|
|
253
|
-
else:
|
|
254
|
-
folder = mp.GetCurrentFolder()
|
|
255
|
-
result = folder.Export(file_path)
|
|
256
|
-
return {"success": bool(result), "file_path": file_path}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
@mcp.tool()
|
|
260
|
-
def folder_transcribe_audio(folder_path: str = "") -> Dict[str, Any]:
|
|
261
|
-
"""Transcribe audio for all clips in a Media Pool folder.
|
|
262
|
-
|
|
263
|
-
Args:
|
|
264
|
-
folder_path: Path from root. Empty for current folder.
|
|
265
|
-
"""
|
|
266
|
-
_, mp, err = _get_mp()
|
|
267
|
-
if err:
|
|
268
|
-
return err
|
|
269
|
-
if folder_path:
|
|
270
|
-
folder = _navigate_to_folder(mp, folder_path)
|
|
271
|
-
if not folder:
|
|
272
|
-
return {"error": f"Folder '{folder_path}' not found"}
|
|
273
|
-
else:
|
|
274
|
-
folder = mp.GetCurrentFolder()
|
|
275
|
-
result = folder.TranscribeAudio()
|
|
276
|
-
return {"success": bool(result)}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
@mcp.tool()
|
|
280
|
-
def folder_clear_transcription(folder_path: str = "") -> Dict[str, Any]:
|
|
281
|
-
"""Clear transcription for all clips in a Media Pool folder.
|
|
282
|
-
|
|
283
|
-
Args:
|
|
284
|
-
folder_path: Path from root. Empty for current folder.
|
|
285
|
-
"""
|
|
286
|
-
_, mp, err = _get_mp()
|
|
287
|
-
if err:
|
|
288
|
-
return err
|
|
289
|
-
if folder_path:
|
|
290
|
-
folder = _navigate_to_folder(mp, folder_path)
|
|
291
|
-
if not folder:
|
|
292
|
-
return {"error": f"Folder '{folder_path}' not found"}
|
|
293
|
-
else:
|
|
294
|
-
folder = mp.GetCurrentFolder()
|
|
295
|
-
result = folder.ClearTranscription()
|
|
296
|
-
return {"success": bool(result)}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
def _resolve_folder(mp, folder_path):
|
|
300
|
-
"""Return (folder, error). Empty path -> current folder."""
|
|
301
|
-
if folder_path:
|
|
302
|
-
folder = _navigate_to_folder(mp, folder_path)
|
|
303
|
-
if not folder:
|
|
304
|
-
return None, {"error": f"Folder '{folder_path}' not found"}
|
|
305
|
-
return folder, None
|
|
306
|
-
return mp.GetCurrentFolder(), None
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
_MARKER_COLORS = [
|
|
310
|
-
"Blue", "Cyan", "Green", "Yellow", "Red", "Pink", "Purple", "Fuchsia",
|
|
311
|
-
"Rose", "Lavender", "Sky", "Mint", "Lemon", "Sand", "Cocoa", "Cream",
|
|
312
|
-
]
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
@mcp.tool()
|
|
316
|
-
def folder_perform_audio_classification(folder_path: str = "") -> Dict[str, Any]:
|
|
317
|
-
"""Classify audio of all clips in a Media Pool folder into categories (Resolve 21+).
|
|
318
|
-
|
|
319
|
-
Args:
|
|
320
|
-
folder_path: Path from root. Empty for current folder.
|
|
321
|
-
"""
|
|
322
|
-
_, mp, err = _get_mp()
|
|
323
|
-
if err:
|
|
324
|
-
return err
|
|
325
|
-
folder, err = _resolve_folder(mp, folder_path)
|
|
326
|
-
if err:
|
|
327
|
-
return err
|
|
328
|
-
if not hasattr(folder, "PerformAudioClassification"):
|
|
329
|
-
return {"error": "PerformAudioClassification requires DaVinci Resolve 21+"}
|
|
330
|
-
return {"success": bool(folder.PerformAudioClassification())}
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
@mcp.tool()
|
|
334
|
-
def folder_clear_audio_classification(folder_path: str = "") -> Dict[str, Any]:
|
|
335
|
-
"""Clear audio classification for all clips in a Media Pool folder (Resolve 21+).
|
|
336
|
-
|
|
337
|
-
Args:
|
|
338
|
-
folder_path: Path from root. Empty for current folder.
|
|
339
|
-
"""
|
|
340
|
-
_, mp, err = _get_mp()
|
|
341
|
-
if err:
|
|
342
|
-
return err
|
|
343
|
-
folder, err = _resolve_folder(mp, folder_path)
|
|
344
|
-
if err:
|
|
345
|
-
return err
|
|
346
|
-
if not hasattr(folder, "ClearAudioClassification"):
|
|
347
|
-
return {"error": "ClearAudioClassification requires DaVinci Resolve 21+"}
|
|
348
|
-
return {"success": bool(folder.ClearAudioClassification())}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
@mcp.tool()
|
|
352
|
-
def folder_analyze_for_intellisearch(folder_path: str = "", identify_faces: bool = False, is_better_mode: bool = False) -> Dict[str, Any]:
|
|
353
|
-
"""Run IntelliSearch analysis on all clips in a folder (Resolve 21+, requires AI IntelliSearch Extra).
|
|
354
|
-
|
|
355
|
-
Args:
|
|
356
|
-
folder_path: Path from root. Empty for current folder.
|
|
357
|
-
identify_faces: Whether to identify faces.
|
|
358
|
-
is_better_mode: Use Better mode (vs Faster).
|
|
359
|
-
"""
|
|
360
|
-
_, mp, err = _get_mp()
|
|
361
|
-
if err:
|
|
362
|
-
return err
|
|
363
|
-
folder, err = _resolve_folder(mp, folder_path)
|
|
364
|
-
if err:
|
|
365
|
-
return err
|
|
366
|
-
if not hasattr(folder, "AnalyzeForIntellisearch"):
|
|
367
|
-
return {"error": "AnalyzeForIntellisearch requires DaVinci Resolve 21+"}
|
|
368
|
-
return {"success": bool(folder.AnalyzeForIntellisearch(bool(identify_faces), bool(is_better_mode)))}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
@mcp.tool()
|
|
372
|
-
def folder_analyze_for_slate(folder_path: str = "", marker_color: str = "Blue") -> Dict[str, Any]:
|
|
373
|
-
"""Run Slate analysis on all clips in a folder (Resolve 21+, requires AI Slate ID Extra).
|
|
374
|
-
|
|
375
|
-
Args:
|
|
376
|
-
folder_path: Path from root. Empty for current folder.
|
|
377
|
-
marker_color: Marker color for detected slates (Blue, Cyan, Green, Yellow, Red, Pink,
|
|
378
|
-
Purple, Fuchsia, Rose, Lavender, Sky, Mint, Lemon, Sand, Cocoa, Cream).
|
|
379
|
-
"""
|
|
380
|
-
_, mp, err = _get_mp()
|
|
381
|
-
if err:
|
|
382
|
-
return err
|
|
383
|
-
folder, err = _resolve_folder(mp, folder_path)
|
|
384
|
-
if err:
|
|
385
|
-
return err
|
|
386
|
-
if not hasattr(folder, "AnalyzeForSlate"):
|
|
387
|
-
return {"error": "AnalyzeForSlate requires DaVinci Resolve 21+"}
|
|
388
|
-
if marker_color not in _MARKER_COLORS:
|
|
389
|
-
return {"error": f"Invalid marker_color '{marker_color}'. Valid: {', '.join(_MARKER_COLORS)}"}
|
|
390
|
-
return {"success": bool(folder.AnalyzeForSlate(marker_color))}
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
@mcp.tool()
|
|
394
|
-
def folder_remove_motion_blur(folder_path: str = "", deblur_option: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
|
395
|
-
"""Render motion-deblurred copies of all clips in a folder (Resolve 21+).
|
|
396
|
-
|
|
397
|
-
Creates NEW media files; source media is not modified.
|
|
398
|
-
|
|
399
|
-
Args:
|
|
400
|
-
folder_path: Path from root. Empty for current folder.
|
|
401
|
-
deblur_option: Settings dict (FileName, Format, Codec, EncodingProfile,
|
|
402
|
-
UseExtremeMode, UseMarkInMarkOut, RenderAtSourceRes, UseMoreGpuMemory).
|
|
403
|
-
"""
|
|
404
|
-
_, mp, err = _get_mp()
|
|
405
|
-
if err:
|
|
406
|
-
return err
|
|
407
|
-
folder, err = _resolve_folder(mp, folder_path)
|
|
408
|
-
if err:
|
|
409
|
-
return err
|
|
410
|
-
if not hasattr(folder, "RemoveMotionBlur"):
|
|
411
|
-
return {"error": "RemoveMotionBlur requires DaVinci Resolve 21+"}
|
|
412
|
-
result = folder.RemoveMotionBlur(deblur_option or {})
|
|
413
|
-
created = []
|
|
414
|
-
for pair in (result or []):
|
|
415
|
-
try:
|
|
416
|
-
orig, new = pair
|
|
417
|
-
created.append({"original": orig.GetName(), "new": new.GetName(), "new_id": new.GetUniqueId()})
|
|
418
|
-
except Exception:
|
|
419
|
-
continue
|
|
420
|
-
return {"success": bool(result), "created": created}
|