@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
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// setLayerProperties.jsx
|
|
2
|
+
// Sets properties of a specified layer in a composition
|
|
3
|
+
|
|
4
|
+
function setLayerProperties(args) {
|
|
5
|
+
try {
|
|
6
|
+
// Extract parameters from args
|
|
7
|
+
var compName = args.compName || "";
|
|
8
|
+
var layerName = args.layerName || "";
|
|
9
|
+
var layerIndex = args.layerIndex; // If provided, used instead of layerName
|
|
10
|
+
var position = args.position; // [x, y] or [x, y, z]
|
|
11
|
+
var scale = args.scale; // [x, y] or [x, y, z] in percent (100 = 100%)
|
|
12
|
+
var rotation = args.rotation; // Rotation in degrees
|
|
13
|
+
var opacity = args.opacity; // 0-100
|
|
14
|
+
var startTime = args.startTime; // New in-point time
|
|
15
|
+
var duration = args.duration; // New duration
|
|
16
|
+
|
|
17
|
+
// Find the composition by name
|
|
18
|
+
var comp = null;
|
|
19
|
+
for (var i = 1; i <= app.project.numItems; i++) {
|
|
20
|
+
var item = app.project.item(i);
|
|
21
|
+
if (item instanceof CompItem && item.name === compName) {
|
|
22
|
+
comp = item;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// If no composition was found by name, use the active composition
|
|
28
|
+
if (!comp) {
|
|
29
|
+
if (app.project.activeItem instanceof CompItem) {
|
|
30
|
+
comp = app.project.activeItem;
|
|
31
|
+
} else {
|
|
32
|
+
throw new Error("No composition found with name '" + compName + "' and no active composition");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Find the layer
|
|
37
|
+
var layer = null;
|
|
38
|
+
if (layerIndex !== undefined && layerIndex !== null) {
|
|
39
|
+
// Try to get layer by index
|
|
40
|
+
if (layerIndex > 0 && layerIndex <= comp.numLayers) {
|
|
41
|
+
layer = comp.layer(layerIndex);
|
|
42
|
+
} else {
|
|
43
|
+
throw new Error("Layer index out of bounds: " + layerIndex);
|
|
44
|
+
}
|
|
45
|
+
} else if (layerName) {
|
|
46
|
+
// Try to get layer by name
|
|
47
|
+
for (var j = 1; j <= comp.numLayers; j++) {
|
|
48
|
+
if (comp.layer(j).name === layerName) {
|
|
49
|
+
layer = comp.layer(j);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (!layer) {
|
|
56
|
+
throw new Error("Layer not found: " + (layerName || "index " + layerIndex));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Set properties if provided
|
|
60
|
+
var changedProperties = [];
|
|
61
|
+
|
|
62
|
+
// Position
|
|
63
|
+
if (position !== undefined && position !== null) {
|
|
64
|
+
layer.property("Position").setValue(position);
|
|
65
|
+
changedProperties.push("position");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Scale
|
|
69
|
+
if (scale !== undefined && scale !== null) {
|
|
70
|
+
layer.property("Scale").setValue(scale);
|
|
71
|
+
changedProperties.push("scale");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Rotation
|
|
75
|
+
if (rotation !== undefined && rotation !== null) {
|
|
76
|
+
// Check if we're dealing with a 3D layer
|
|
77
|
+
if (layer.threeDLayer) {
|
|
78
|
+
// For 3D layers, we need to set rotations individually
|
|
79
|
+
layer.property("Rotation").setValue([0, 0, rotation]);
|
|
80
|
+
} else {
|
|
81
|
+
// For 2D layers, simple rotation
|
|
82
|
+
layer.property("Rotation").setValue(rotation);
|
|
83
|
+
}
|
|
84
|
+
changedProperties.push("rotation");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Opacity
|
|
88
|
+
if (opacity !== undefined && opacity !== null) {
|
|
89
|
+
layer.property("Opacity").setValue(opacity);
|
|
90
|
+
changedProperties.push("opacity");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Timing
|
|
94
|
+
var timingChanged = false;
|
|
95
|
+
if (startTime !== undefined && startTime !== null) {
|
|
96
|
+
layer.startTime = startTime;
|
|
97
|
+
timingChanged = true;
|
|
98
|
+
changedProperties.push("startTime");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (duration !== undefined && duration !== null && duration > 0) {
|
|
102
|
+
// Set outPoint based on startTime and duration
|
|
103
|
+
var actualStartTime = (startTime !== undefined && startTime !== null) ? startTime : layer.startTime;
|
|
104
|
+
layer.outPoint = actualStartTime + duration;
|
|
105
|
+
timingChanged = true;
|
|
106
|
+
changedProperties.push("duration");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Return success with updated layer details
|
|
110
|
+
return JSON.stringify({
|
|
111
|
+
status: "success",
|
|
112
|
+
message: "Layer properties updated successfully",
|
|
113
|
+
layer: {
|
|
114
|
+
name: layer.name,
|
|
115
|
+
index: layer.index,
|
|
116
|
+
position: layer.property("Position").value,
|
|
117
|
+
scale: layer.property("Scale").value,
|
|
118
|
+
rotation: layer.threeDLayer
|
|
119
|
+
? layer.property("Rotation").value
|
|
120
|
+
: layer.property("Rotation").value,
|
|
121
|
+
opacity: layer.property("Opacity").value,
|
|
122
|
+
inPoint: layer.inPoint,
|
|
123
|
+
outPoint: layer.outPoint,
|
|
124
|
+
changedProperties: changedProperties
|
|
125
|
+
}
|
|
126
|
+
}, null, 2);
|
|
127
|
+
} catch (error) {
|
|
128
|
+
// Return error message
|
|
129
|
+
return JSON.stringify({
|
|
130
|
+
status: "error",
|
|
131
|
+
message: error.toString()
|
|
132
|
+
}, null, 2);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Read arguments from the file (passed by the Node.js script)
|
|
137
|
+
var argsFile = new File($.fileName.replace(/[^\\\/]*$/, '') + "../temp/args.json");
|
|
138
|
+
var args = {};
|
|
139
|
+
if (argsFile.exists) {
|
|
140
|
+
argsFile.open("r");
|
|
141
|
+
var content = argsFile.read();
|
|
142
|
+
argsFile.close();
|
|
143
|
+
if (content) {
|
|
144
|
+
try {
|
|
145
|
+
args = JSON.parse(content);
|
|
146
|
+
} catch (e) {
|
|
147
|
+
// Handle parsing error
|
|
148
|
+
$.write(JSON.stringify({
|
|
149
|
+
status: "error",
|
|
150
|
+
message: "Failed to parse arguments: " + e.toString()
|
|
151
|
+
}, null, 2));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Run the function and write the result
|
|
157
|
+
var result = setLayerProperties(args);
|
|
158
|
+
|
|
159
|
+
// Write the result so it can be captured by the Node.js process
|
|
160
|
+
$.write(result);
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computer Use MCP Client — typed API over MCP protocol.
|
|
3
|
+
*/
|
|
4
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
export interface ToolResult {
|
|
6
|
+
content: Array<{
|
|
7
|
+
type: 'text';
|
|
8
|
+
text: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: 'image';
|
|
11
|
+
data: string;
|
|
12
|
+
mimeType: string;
|
|
13
|
+
}>;
|
|
14
|
+
isError?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export type FocusStrategy = 'strict' | 'best_effort' | 'none';
|
|
17
|
+
/** Optional window-targeting and focus strategy options for input methods. */
|
|
18
|
+
export interface WindowTargetOpts {
|
|
19
|
+
targetWindowId?: number;
|
|
20
|
+
focusStrategy?: FocusStrategy;
|
|
21
|
+
}
|
|
22
|
+
/** Options for semantic mutating tools — window_id is already required positionally. */
|
|
23
|
+
export interface SemanticOpts {
|
|
24
|
+
focusStrategy?: FocusStrategy;
|
|
25
|
+
}
|
|
26
|
+
/** Criteria for find_element — at least one must be present. */
|
|
27
|
+
export interface FindElementCriteria {
|
|
28
|
+
role?: string;
|
|
29
|
+
label?: string;
|
|
30
|
+
value?: string;
|
|
31
|
+
maxResults?: number;
|
|
32
|
+
}
|
|
33
|
+
/** A single field for fill_form. */
|
|
34
|
+
export interface FillFormField {
|
|
35
|
+
role: string;
|
|
36
|
+
label: string;
|
|
37
|
+
value: string;
|
|
38
|
+
}
|
|
39
|
+
export interface ComputerUseClient {
|
|
40
|
+
listTools(): Promise<Array<{
|
|
41
|
+
name: string;
|
|
42
|
+
description?: string;
|
|
43
|
+
}>>;
|
|
44
|
+
callTool(name: string, args?: Record<string, unknown>): Promise<ToolResult>;
|
|
45
|
+
close(): Promise<void>;
|
|
46
|
+
screenshot(args?: {
|
|
47
|
+
width?: number;
|
|
48
|
+
quality?: number;
|
|
49
|
+
target_app?: string;
|
|
50
|
+
target_window_id?: number;
|
|
51
|
+
provider?: 'anthropic' | 'openai' | 'openai-low' | 'gemini' | 'llama' | 'grok' | 'mistral' | 'qwen' | 'nova' | 'deepseek-vl' | 'phi' | 'auto';
|
|
52
|
+
}): Promise<ToolResult>;
|
|
53
|
+
zoom(region: [number, number, number, number], quality?: number): Promise<ToolResult>;
|
|
54
|
+
click(x: number, y: number, targetApp?: string, opts?: WindowTargetOpts): Promise<ToolResult>;
|
|
55
|
+
doubleClick(x: number, y: number, targetApp?: string, opts?: WindowTargetOpts): Promise<ToolResult>;
|
|
56
|
+
tripleClick(x: number, y: number, targetApp?: string, opts?: WindowTargetOpts): Promise<ToolResult>;
|
|
57
|
+
rightClick(x: number, y: number, targetApp?: string, opts?: WindowTargetOpts): Promise<ToolResult>;
|
|
58
|
+
middleClick(x: number, y: number, targetApp?: string, opts?: WindowTargetOpts): Promise<ToolResult>;
|
|
59
|
+
moveMouse(x: number, y: number, targetApp?: string, opts?: WindowTargetOpts): Promise<ToolResult>;
|
|
60
|
+
drag(to: [number, number], from?: [number, number], targetApp?: string, opts?: WindowTargetOpts): Promise<ToolResult>;
|
|
61
|
+
mouseDown(x: number, y: number, targetApp?: string, opts?: WindowTargetOpts): Promise<ToolResult>;
|
|
62
|
+
mouseUp(x: number, y: number, targetApp?: string, opts?: WindowTargetOpts): Promise<ToolResult>;
|
|
63
|
+
type(text: string, targetApp?: string, opts?: WindowTargetOpts & {
|
|
64
|
+
clear?: boolean;
|
|
65
|
+
pressEnter?: boolean;
|
|
66
|
+
caretPosition?: 'start' | 'end' | 'idle';
|
|
67
|
+
}): Promise<ToolResult>;
|
|
68
|
+
key(combo: string, targetApp?: string, opts?: WindowTargetOpts & {
|
|
69
|
+
repeat?: number;
|
|
70
|
+
}): Promise<ToolResult>;
|
|
71
|
+
holdKey(keys: string[], durationSecs: number, targetApp?: string, opts?: WindowTargetOpts): Promise<ToolResult>;
|
|
72
|
+
scroll(x: number, y: number, direction: 'up' | 'down' | 'left' | 'right', amount?: number, targetApp?: string, opts?: WindowTargetOpts): Promise<ToolResult>;
|
|
73
|
+
readClipboard(): Promise<ToolResult>;
|
|
74
|
+
writeClipboard(text: string): Promise<ToolResult>;
|
|
75
|
+
openApp(bundleId: string): Promise<ToolResult>;
|
|
76
|
+
getFrontmostApp(): Promise<ToolResult>;
|
|
77
|
+
listWindows(bundleId?: string): Promise<ToolResult>;
|
|
78
|
+
cursorPosition(): Promise<ToolResult>;
|
|
79
|
+
wait(seconds: number): Promise<ToolResult>;
|
|
80
|
+
listRunningApps(): Promise<ToolResult>;
|
|
81
|
+
hideApp(bundleId: string): Promise<ToolResult>;
|
|
82
|
+
unhideApp(bundleId: string): Promise<ToolResult>;
|
|
83
|
+
getDisplaySize(displayId?: number): Promise<ToolResult>;
|
|
84
|
+
listDisplays(): Promise<ToolResult>;
|
|
85
|
+
getWindow(windowId: number): Promise<ToolResult>;
|
|
86
|
+
getCursorWindow(): Promise<ToolResult>;
|
|
87
|
+
activateApp(bundleId: string, timeoutMs?: number): Promise<ToolResult>;
|
|
88
|
+
activateWindow(windowId: number, timeoutMs?: number): Promise<ToolResult>;
|
|
89
|
+
getUiTree(windowId: number, maxDepth?: number): Promise<ToolResult>;
|
|
90
|
+
getFocusedElement(): Promise<ToolResult>;
|
|
91
|
+
findElement(windowId: number, criteria: FindElementCriteria): Promise<ToolResult>;
|
|
92
|
+
clickElement(windowId: number, role: string, label: string, opts?: SemanticOpts): Promise<ToolResult>;
|
|
93
|
+
setValue(windowId: number, role: string, label: string, value: string, opts?: SemanticOpts): Promise<ToolResult>;
|
|
94
|
+
pressButton(windowId: number, label: string, opts?: SemanticOpts): Promise<ToolResult>;
|
|
95
|
+
selectMenuItem(bundleId: string, menu: string, item: string, submenu?: string): Promise<ToolResult>;
|
|
96
|
+
listMenuBar(bundleId: string): Promise<ToolResult>;
|
|
97
|
+
fillForm(windowId: number, fields: FillFormField[], opts?: SemanticOpts): Promise<ToolResult>;
|
|
98
|
+
runScript(language: 'applescript' | 'javascript' | 'powershell', script: string, timeoutMs?: number): Promise<ToolResult>;
|
|
99
|
+
getAppDictionary(bundleId: string, suite?: string): Promise<ToolResult>;
|
|
100
|
+
getToolGuide(taskDescription: string): Promise<ToolResult>;
|
|
101
|
+
getAppCapabilities(bundleId: string): Promise<ToolResult>;
|
|
102
|
+
listSpaces(): Promise<ToolResult>;
|
|
103
|
+
getActiveSpace(): Promise<ToolResult>;
|
|
104
|
+
createAgentSpace(): Promise<ToolResult>;
|
|
105
|
+
moveWindowToSpace(windowId: number, spaceId: number): Promise<ToolResult>;
|
|
106
|
+
removeWindowFromSpace(windowId: number, spaceId: number): Promise<ToolResult>;
|
|
107
|
+
destroySpace(spaceId: number): Promise<ToolResult>;
|
|
108
|
+
getToolMetadata(toolName: string): Promise<ToolResult>;
|
|
109
|
+
filesystem(mode: string, path: string, opts?: Record<string, unknown>): Promise<ToolResult>;
|
|
110
|
+
processKill(mode: 'list' | 'kill', opts?: {
|
|
111
|
+
name?: string;
|
|
112
|
+
pid?: number;
|
|
113
|
+
force?: boolean;
|
|
114
|
+
}): Promise<ToolResult>;
|
|
115
|
+
registry(mode: string, path: string, opts?: {
|
|
116
|
+
name?: string;
|
|
117
|
+
value?: string;
|
|
118
|
+
type?: string;
|
|
119
|
+
}): Promise<ToolResult>;
|
|
120
|
+
notification(title: string, message: string, appId?: string): Promise<ToolResult>;
|
|
121
|
+
multiSelect(locs?: [number, number][], opts?: {
|
|
122
|
+
labels?: string[];
|
|
123
|
+
pressCtrl?: boolean;
|
|
124
|
+
targetApp?: string;
|
|
125
|
+
}): Promise<ToolResult>;
|
|
126
|
+
multiEdit(locs?: [number, number, string][], opts?: {
|
|
127
|
+
labels?: [string, string][];
|
|
128
|
+
targetApp?: string;
|
|
129
|
+
}): Promise<ToolResult>;
|
|
130
|
+
scrape(url: string, opts?: {
|
|
131
|
+
query?: string;
|
|
132
|
+
useDom?: boolean;
|
|
133
|
+
}): Promise<ToolResult>;
|
|
134
|
+
resizeWindow(opts: {
|
|
135
|
+
windowName?: string;
|
|
136
|
+
windowId?: number;
|
|
137
|
+
windowSize?: [number, number];
|
|
138
|
+
windowLoc?: [number, number];
|
|
139
|
+
}): Promise<ToolResult>;
|
|
140
|
+
snapshot(opts?: {
|
|
141
|
+
useVision?: boolean;
|
|
142
|
+
useAnnotation?: boolean;
|
|
143
|
+
gridLines?: [number, number];
|
|
144
|
+
display?: number[];
|
|
145
|
+
width?: number;
|
|
146
|
+
targetApp?: string;
|
|
147
|
+
}): Promise<ToolResult>;
|
|
148
|
+
}
|
|
149
|
+
export declare function connectStdio(command: string, args: string[], cwd?: string): Promise<ComputerUseClient>;
|
|
150
|
+
export declare function connectInProcess(server: McpServer): Promise<ComputerUseClient>;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computer Use MCP Client — typed API over MCP protocol.
|
|
3
|
+
*/
|
|
4
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
5
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
6
|
+
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
|
|
7
|
+
export async function connectStdio(command, args, cwd) {
|
|
8
|
+
const transport = new StdioClientTransport({ command, args, cwd });
|
|
9
|
+
const client = new Client({ name: 'computer-use-client', version: '2.0.0' });
|
|
10
|
+
await client.connect(transport);
|
|
11
|
+
return wrap(client, () => client.close());
|
|
12
|
+
}
|
|
13
|
+
export async function connectInProcess(server) {
|
|
14
|
+
const [ct, st] = InMemoryTransport.createLinkedPair();
|
|
15
|
+
const client = new Client({ name: 'computer-use-client', version: '2.0.0' });
|
|
16
|
+
await server.connect(st);
|
|
17
|
+
await client.connect(ct);
|
|
18
|
+
return wrap(client, async () => { await client.close(); await server.close(); });
|
|
19
|
+
}
|
|
20
|
+
function targetArgs(app, opts) {
|
|
21
|
+
return {
|
|
22
|
+
...(app ? { target_app: app } : {}),
|
|
23
|
+
...(opts?.targetWindowId !== undefined ? { target_window_id: opts.targetWindowId } : {}),
|
|
24
|
+
...(opts?.focusStrategy ? { focus_strategy: opts.focusStrategy } : {}),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function wrap(client, closeFn) {
|
|
28
|
+
const call = async (name, args = {}) => (await client.callTool({ name, arguments: args }));
|
|
29
|
+
return {
|
|
30
|
+
async listTools() { return (await client.listTools()).tools.map(t => ({ name: t.name, description: t.description })); },
|
|
31
|
+
callTool: call,
|
|
32
|
+
close: closeFn,
|
|
33
|
+
screenshot: (args) => call('screenshot', args ?? {}),
|
|
34
|
+
zoom: (region, quality) => call('zoom', { region, ...(quality !== undefined ? { quality } : {}) }),
|
|
35
|
+
click: (x, y, app, opts) => call('left_click', { coordinate: [x, y], ...targetArgs(app, opts) }),
|
|
36
|
+
doubleClick: (x, y, app, opts) => call('double_click', { coordinate: [x, y], ...targetArgs(app, opts) }),
|
|
37
|
+
tripleClick: (x, y, app, opts) => call('triple_click', { coordinate: [x, y], ...targetArgs(app, opts) }),
|
|
38
|
+
rightClick: (x, y, app, opts) => call('right_click', { coordinate: [x, y], ...targetArgs(app, opts) }),
|
|
39
|
+
middleClick: (x, y, app, opts) => call('middle_click', { coordinate: [x, y], ...targetArgs(app, opts) }),
|
|
40
|
+
moveMouse: (x, y, app, opts) => call('mouse_move', { coordinate: [x, y], ...targetArgs(app, opts) }),
|
|
41
|
+
drag: (to, from, app, opts) => call('left_click_drag', { coordinate: to, ...(from ? { start_coordinate: from } : {}), ...targetArgs(app, opts) }),
|
|
42
|
+
mouseDown: (x, y, app, opts) => call('left_mouse_down', { coordinate: [x, y], ...targetArgs(app, opts) }),
|
|
43
|
+
mouseUp: (x, y, app, opts) => call('left_mouse_up', { coordinate: [x, y], ...targetArgs(app, opts) }),
|
|
44
|
+
type: (text, app, opts) => call('type', { text, ...targetArgs(app, opts), ...(opts?.clear !== undefined ? { clear: opts.clear } : {}), ...(opts?.pressEnter !== undefined ? { press_enter: opts.pressEnter } : {}), ...(opts?.caretPosition ? { caret_position: opts.caretPosition } : {}) }),
|
|
45
|
+
key: (combo, app, opts) => call('key', { text: combo, ...targetArgs(app, opts), ...(opts?.repeat !== undefined ? { repeat: opts.repeat } : {}) }),
|
|
46
|
+
holdKey: (keys, durationSecs, app, opts) => call('hold_key', { keys, duration: durationSecs, ...targetArgs(app, opts) }),
|
|
47
|
+
scroll: (x, y, dir, amt = 3, app, opts) => call('scroll', { coordinate: [x, y], direction: dir, amount: amt, ...targetArgs(app, opts) }),
|
|
48
|
+
readClipboard: () => call('read_clipboard'),
|
|
49
|
+
writeClipboard: (text) => call('write_clipboard', { text }),
|
|
50
|
+
openApp: (id) => call('open_application', { bundle_id: id }),
|
|
51
|
+
getFrontmostApp: () => call('get_frontmost_app'),
|
|
52
|
+
listWindows: (bundleId) => call('list_windows', bundleId ? { bundle_id: bundleId } : {}),
|
|
53
|
+
cursorPosition: () => call('cursor_position'),
|
|
54
|
+
wait: (s) => call('wait', { duration: s }),
|
|
55
|
+
listRunningApps: () => call('list_running_apps'),
|
|
56
|
+
hideApp: (id) => call('hide_app', { bundle_id: id }),
|
|
57
|
+
unhideApp: (id) => call('unhide_app', { bundle_id: id }),
|
|
58
|
+
getDisplaySize: (id) => call('get_display_size', id !== undefined ? { display_id: id } : {}),
|
|
59
|
+
listDisplays: () => call('list_displays'),
|
|
60
|
+
// v4 methods
|
|
61
|
+
getWindow: (windowId) => call('get_window', { window_id: windowId }),
|
|
62
|
+
getCursorWindow: () => call('get_cursor_window'),
|
|
63
|
+
activateApp: (bundleId, timeoutMs) => call('activate_app', { bundle_id: bundleId, ...(timeoutMs !== undefined ? { timeout_ms: timeoutMs } : {}) }),
|
|
64
|
+
activateWindow: (windowId, timeoutMs) => call('activate_window', { window_id: windowId, ...(timeoutMs !== undefined ? { timeout_ms: timeoutMs } : {}) }),
|
|
65
|
+
// v5: Accessibility observation
|
|
66
|
+
getUiTree: (windowId, maxDepth) => call('get_ui_tree', {
|
|
67
|
+
window_id: windowId,
|
|
68
|
+
...(maxDepth !== undefined ? { max_depth: maxDepth } : {}),
|
|
69
|
+
}),
|
|
70
|
+
getFocusedElement: () => call('get_focused_element'),
|
|
71
|
+
findElement: (windowId, criteria) => call('find_element', {
|
|
72
|
+
window_id: windowId,
|
|
73
|
+
...(criteria.role !== undefined ? { role: criteria.role } : {}),
|
|
74
|
+
...(criteria.label !== undefined ? { label: criteria.label } : {}),
|
|
75
|
+
...(criteria.value !== undefined ? { value: criteria.value } : {}),
|
|
76
|
+
...(criteria.maxResults !== undefined ? { max_results: criteria.maxResults } : {}),
|
|
77
|
+
}),
|
|
78
|
+
// v5: Semantic actions
|
|
79
|
+
clickElement: (windowId, role, label, opts) => call('click_element', {
|
|
80
|
+
window_id: windowId, role, label,
|
|
81
|
+
...(opts?.focusStrategy ? { focus_strategy: opts.focusStrategy } : {}),
|
|
82
|
+
}),
|
|
83
|
+
setValue: (windowId, role, label, value, opts) => call('set_value', {
|
|
84
|
+
window_id: windowId, role, label, value,
|
|
85
|
+
...(opts?.focusStrategy ? { focus_strategy: opts.focusStrategy } : {}),
|
|
86
|
+
}),
|
|
87
|
+
pressButton: (windowId, label, opts) => call('press_button', {
|
|
88
|
+
window_id: windowId, label,
|
|
89
|
+
...(opts?.focusStrategy ? { focus_strategy: opts.focusStrategy } : {}),
|
|
90
|
+
}),
|
|
91
|
+
selectMenuItem: (bundleId, menu, item, submenu) => call('select_menu_item', {
|
|
92
|
+
bundle_id: bundleId, menu, item,
|
|
93
|
+
...(submenu !== undefined ? { submenu } : {}),
|
|
94
|
+
}),
|
|
95
|
+
listMenuBar: (bundleId) => call('list_menu_bar', { bundle_id: bundleId }),
|
|
96
|
+
fillForm: (windowId, fields, opts) => call('fill_form', {
|
|
97
|
+
window_id: windowId, fields,
|
|
98
|
+
...(opts?.focusStrategy ? { focus_strategy: opts.focusStrategy } : {}),
|
|
99
|
+
}),
|
|
100
|
+
// v5: Scripting bridge
|
|
101
|
+
runScript: (language, script, timeoutMs) => call('run_script', {
|
|
102
|
+
language, script,
|
|
103
|
+
...(timeoutMs !== undefined ? { timeout_ms: timeoutMs } : {}),
|
|
104
|
+
}),
|
|
105
|
+
getAppDictionary: (bundleId, suite) => call('get_app_dictionary', {
|
|
106
|
+
bundle_id: bundleId,
|
|
107
|
+
...(suite !== undefined ? { suite } : {}),
|
|
108
|
+
}),
|
|
109
|
+
// v5: Strategy advisor
|
|
110
|
+
getToolGuide: (taskDescription) => call('get_tool_guide', { task_description: taskDescription }),
|
|
111
|
+
getAppCapabilities: (bundleId) => call('get_app_capabilities', { bundle_id: bundleId }),
|
|
112
|
+
// v5: Spaces
|
|
113
|
+
listSpaces: () => call('list_spaces'),
|
|
114
|
+
getActiveSpace: () => call('get_active_space'),
|
|
115
|
+
createAgentSpace: () => call('create_agent_space'),
|
|
116
|
+
moveWindowToSpace: (windowId, spaceId) => call('move_window_to_space', {
|
|
117
|
+
window_id: windowId, space_id: spaceId,
|
|
118
|
+
}),
|
|
119
|
+
removeWindowFromSpace: (windowId, spaceId) => call('remove_window_from_space', {
|
|
120
|
+
window_id: windowId, space_id: spaceId,
|
|
121
|
+
}),
|
|
122
|
+
destroySpace: (spaceId) => call('destroy_space', { space_id: spaceId }),
|
|
123
|
+
// v5.2: Tool metadata
|
|
124
|
+
getToolMetadata: (toolName) => call('get_tool_metadata', { tool_name: toolName }),
|
|
125
|
+
// Windows-parity tools
|
|
126
|
+
filesystem: (mode, path, opts) => call('filesystem', { mode, path, ...opts }),
|
|
127
|
+
processKill: (mode, opts) => call('process_kill', { mode, ...opts }),
|
|
128
|
+
registry: (mode, path, opts) => call('registry', { mode, path, ...opts }),
|
|
129
|
+
notification: (title, message, appId) => call('notification', { title, message, ...(appId ? { app_id: appId } : {}) }),
|
|
130
|
+
multiSelect: (locs, opts) => call('multi_select', { ...(locs ? { locs } : {}), ...(opts?.labels ? { labels: opts.labels } : {}), ...(opts?.pressCtrl !== undefined ? { press_ctrl: opts.pressCtrl } : {}), ...(opts?.targetApp ? { target_app: opts.targetApp } : {}) }),
|
|
131
|
+
multiEdit: (locs, opts) => call('multi_edit', { ...(locs ? { locs } : {}), ...(opts?.labels ? { labels: opts.labels } : {}), ...(opts?.targetApp ? { target_app: opts.targetApp } : {}) }),
|
|
132
|
+
scrape: (url, opts) => call('scrape', { url, ...(opts?.query ? { query: opts.query } : {}), ...(opts?.useDom !== undefined ? { use_dom: opts.useDom } : {}) }),
|
|
133
|
+
resizeWindow: (opts) => call('resize_window', { ...(opts.windowName ? { window_name: opts.windowName } : {}), ...(opts.windowId !== undefined ? { window_id: opts.windowId } : {}), ...(opts.windowSize ? { window_size: opts.windowSize } : {}), ...(opts.windowLoc ? { window_loc: opts.windowLoc } : {}) }),
|
|
134
|
+
snapshot: (opts) => call('snapshot', { ...(opts?.useVision !== undefined ? { use_vision: opts.useVision } : {}), ...(opts?.useAnnotation !== undefined ? { use_annotation: opts.useAnnotation } : {}), ...(opts?.gridLines ? { grid_lines: opts.gridLines } : {}), ...(opts?.display ? { display: opts.display } : {}), ...(opts?.width ? { width: opts.width } : {}), ...(opts?.targetApp ? { target_app: opts.targetApp } : {}) }),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone stdio entrypoint detection.
|
|
3
|
+
*
|
|
4
|
+
* Determines whether the current Node process was invoked as the
|
|
5
|
+
* computer-use-mcp stdio server (e.g. `node dist/server.js` or
|
|
6
|
+
* `npx @zavora-ai/computer-use-mcp`) vs imported as a library.
|
|
7
|
+
*
|
|
8
|
+
* Path-separator-agnostic: Node normalizes `process.argv[1]` to the platform
|
|
9
|
+
* separator, so a hard-coded `/` check rejects valid Windows invocations like
|
|
10
|
+
* `C:\path\to\server.js`. Without this, the server silently exits without
|
|
11
|
+
* starting StdioServerTransport on every Windows host.
|
|
12
|
+
*
|
|
13
|
+
* Kept in its own module (no native imports) so the helper is unit-testable
|
|
14
|
+
* without building the Rust NAPI binary.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isStdioEntrypoint(argv1: string | undefined): boolean;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone stdio entrypoint detection.
|
|
3
|
+
*
|
|
4
|
+
* Determines whether the current Node process was invoked as the
|
|
5
|
+
* computer-use-mcp stdio server (e.g. `node dist/server.js` or
|
|
6
|
+
* `npx @zavora-ai/computer-use-mcp`) vs imported as a library.
|
|
7
|
+
*
|
|
8
|
+
* Path-separator-agnostic: Node normalizes `process.argv[1]` to the platform
|
|
9
|
+
* separator, so a hard-coded `/` check rejects valid Windows invocations like
|
|
10
|
+
* `C:\path\to\server.js`. Without this, the server silently exits without
|
|
11
|
+
* starting StdioServerTransport on every Windows host.
|
|
12
|
+
*
|
|
13
|
+
* Kept in its own module (no native imports) so the helper is unit-testable
|
|
14
|
+
* without building the Rust NAPI binary.
|
|
15
|
+
*/
|
|
16
|
+
export function isStdioEntrypoint(argv1) {
|
|
17
|
+
if (!argv1)
|
|
18
|
+
return false;
|
|
19
|
+
// Normalize backslashes to forward slashes once, then match against the
|
|
20
|
+
// POSIX-style suffixes. Cheaper and clearer than checking both separators
|
|
21
|
+
// for every suffix.
|
|
22
|
+
const normalized = argv1.replace(/\\/g, '/');
|
|
23
|
+
return (normalized.endsWith('/server.ts') ||
|
|
24
|
+
normalized.endsWith('/server.js') ||
|
|
25
|
+
normalized.endsWith('/computer-use-mcp'));
|
|
26
|
+
}
|