unity-open-mcp 0.1.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/LICENSE +21 -0
- package/README.md +145 -0
- package/dist/batch-spawn.d.ts +33 -0
- package/dist/batch-spawn.js +329 -0
- package/dist/batch-spawn.js.map +1 -0
- package/dist/capabilities/build-capabilities.d.ts +155 -0
- package/dist/capabilities/build-capabilities.js +475 -0
- package/dist/capabilities/build-capabilities.js.map +1 -0
- package/dist/capabilities/list-rules.d.ts +45 -0
- package/dist/capabilities/list-rules.js +121 -0
- package/dist/capabilities/list-rules.js.map +1 -0
- package/dist/capabilities/rule-catalog.d.ts +44 -0
- package/dist/capabilities/rule-catalog.js +330 -0
- package/dist/capabilities/rule-catalog.js.map +1 -0
- package/dist/capabilities/tool-groups.d.ts +53 -0
- package/dist/capabilities/tool-groups.js +396 -0
- package/dist/capabilities/tool-groups.js.map +1 -0
- package/dist/cli/args.d.ts +36 -0
- package/dist/cli/args.js +239 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/cli.d.ts +23 -0
- package/dist/cli/cli.js +125 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands.d.ts +37 -0
- package/dist/cli/commands.js +277 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/ping-poller.d.ts +81 -0
- package/dist/cli/ping-poller.js +161 -0
- package/dist/cli/ping-poller.js.map +1 -0
- package/dist/compat.d.ts +32 -0
- package/dist/compat.js +121 -0
- package/dist/compat.js.map +1 -0
- package/dist/compiler-errors.d.ts +31 -0
- package/dist/compiler-errors.js +91 -0
- package/dist/compiler-errors.js.map +1 -0
- package/dist/compressible-router.d.ts +18 -0
- package/dist/compressible-router.js +191 -0
- package/dist/compressible-router.js.map +1 -0
- package/dist/compression/asset-model.d.ts +86 -0
- package/dist/compression/asset-model.js +15 -0
- package/dist/compression/asset-model.js.map +1 -0
- package/dist/compression/compact.d.ts +153 -0
- package/dist/compression/compact.js +501 -0
- package/dist/compression/compact.js.map +1 -0
- package/dist/dialog-dismiss.d.ts +197 -0
- package/dist/dialog-dismiss.js +533 -0
- package/dist/dialog-dismiss.js.map +1 -0
- package/dist/event-stream.d.ts +60 -0
- package/dist/event-stream.js +228 -0
- package/dist/event-stream.js.map +1 -0
- package/dist/gate-error.d.ts +18 -0
- package/dist/gate-error.js +11 -0
- package/dist/gate-error.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +146 -0
- package/dist/index.js.map +1 -0
- package/dist/instance-discovery.d.ts +117 -0
- package/dist/instance-discovery.js +202 -0
- package/dist/instance-discovery.js.map +1 -0
- package/dist/live-client.d.ts +68 -0
- package/dist/live-client.js +583 -0
- package/dist/live-client.js.map +1 -0
- package/dist/offline.d.ts +75 -0
- package/dist/offline.js +1495 -0
- package/dist/offline.js.map +1 -0
- package/dist/package-version.d.ts +8 -0
- package/dist/package-version.js +41 -0
- package/dist/package-version.js.map +1 -0
- package/dist/ping-cache.d.ts +15 -0
- package/dist/ping-cache.js +10 -0
- package/dist/ping-cache.js.map +1 -0
- package/dist/project-health.d.ts +52 -0
- package/dist/project-health.js +177 -0
- package/dist/project-health.js.map +1 -0
- package/dist/resource-router.d.ts +26 -0
- package/dist/resource-router.js +143 -0
- package/dist/resource-router.js.map +1 -0
- package/dist/resources/index.d.ts +6 -0
- package/dist/resources/index.js +40 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/results.d.ts +14 -0
- package/dist/results.js +22 -0
- package/dist/results.js.map +1 -0
- package/dist/router.d.ts +5 -0
- package/dist/router.js +2 -0
- package/dist/router.js.map +1 -0
- package/dist/routers.d.ts +44 -0
- package/dist/routers.js +73 -0
- package/dist/routers.js.map +1 -0
- package/dist/schema-defaults.d.ts +10 -0
- package/dist/schema-defaults.js +43 -0
- package/dist/schema-defaults.js.map +1 -0
- package/dist/skill/client-paths.d.ts +33 -0
- package/dist/skill/client-paths.js +131 -0
- package/dist/skill/client-paths.js.map +1 -0
- package/dist/skill/generate-skill.d.ts +38 -0
- package/dist/skill/generate-skill.js +389 -0
- package/dist/skill/generate-skill.js.map +1 -0
- package/dist/tool-router.d.ts +40 -0
- package/dist/tool-router.js +778 -0
- package/dist/tool-router.js.map +1 -0
- package/dist/tool-session-state.d.ts +55 -0
- package/dist/tool-session-state.js +116 -0
- package/dist/tool-session-state.js.map +1 -0
- package/dist/tools/agent-capabilities.d.ts +2 -0
- package/dist/tools/agent-capabilities.js +24 -0
- package/dist/tools/agent-capabilities.js.map +1 -0
- package/dist/tools/animation-create.d.ts +2 -0
- package/dist/tools/animation-create.js +31 -0
- package/dist/tools/animation-create.js.map +1 -0
- package/dist/tools/animation-get-data.d.ts +2 -0
- package/dist/tools/animation-get-data.js +23 -0
- package/dist/tools/animation-get-data.js.map +1 -0
- package/dist/tools/animation-modify.d.ts +2 -0
- package/dist/tools/animation-modify.js +45 -0
- package/dist/tools/animation-modify.js.map +1 -0
- package/dist/tools/animator-create.d.ts +2 -0
- package/dist/tools/animator-create.js +31 -0
- package/dist/tools/animator-create.js.map +1 -0
- package/dist/tools/animator-get-data.d.ts +2 -0
- package/dist/tools/animator-get-data.js +23 -0
- package/dist/tools/animator-get-data.js.map +1 -0
- package/dist/tools/animator-modify.d.ts +2 -0
- package/dist/tools/animator-modify.js +51 -0
- package/dist/tools/animator-modify.js.map +1 -0
- package/dist/tools/apply-fix.d.ts +2 -0
- package/dist/tools/apply-fix.js +39 -0
- package/dist/tools/apply-fix.js.map +1 -0
- package/dist/tools/assets-copy.d.ts +2 -0
- package/dist/tools/assets-copy.js +50 -0
- package/dist/tools/assets-copy.js.map +1 -0
- package/dist/tools/assets-create-folder.d.ts +2 -0
- package/dist/tools/assets-create-folder.js +53 -0
- package/dist/tools/assets-create-folder.js.map +1 -0
- package/dist/tools/assets-delete.d.ts +2 -0
- package/dist/tools/assets-delete.js +34 -0
- package/dist/tools/assets-delete.js.map +1 -0
- package/dist/tools/assets-move.d.ts +2 -0
- package/dist/tools/assets-move.js +50 -0
- package/dist/tools/assets-move.js.map +1 -0
- package/dist/tools/assets-refresh.d.ts +2 -0
- package/dist/tools/assets-refresh.js +37 -0
- package/dist/tools/assets-refresh.js.map +1 -0
- package/dist/tools/baseline-create.d.ts +2 -0
- package/dist/tools/baseline-create.js +20 -0
- package/dist/tools/baseline-create.js.map +1 -0
- package/dist/tools/bridge-status.d.ts +2 -0
- package/dist/tools/bridge-status.js +44 -0
- package/dist/tools/bridge-status.js.map +1 -0
- package/dist/tools/build-get-active-target.d.ts +2 -0
- package/dist/tools/build-get-active-target.js +16 -0
- package/dist/tools/build-get-active-target.js.map +1 -0
- package/dist/tools/build-get-defines.d.ts +2 -0
- package/dist/tools/build-get-defines.js +16 -0
- package/dist/tools/build-get-defines.js.map +1 -0
- package/dist/tools/build-get-scenes.d.ts +2 -0
- package/dist/tools/build-get-scenes.js +16 -0
- package/dist/tools/build-get-scenes.js.map +1 -0
- package/dist/tools/build-get-targets.d.ts +2 -0
- package/dist/tools/build-get-targets.js +18 -0
- package/dist/tools/build-get-targets.js.map +1 -0
- package/dist/tools/build-set-defines.d.ts +2 -0
- package/dist/tools/build-set-defines.js +50 -0
- package/dist/tools/build-set-defines.js.map +1 -0
- package/dist/tools/build-set-scenes.d.ts +2 -0
- package/dist/tools/build-set-scenes.js +60 -0
- package/dist/tools/build-set-scenes.js.map +1 -0
- package/dist/tools/build-set-target.d.ts +2 -0
- package/dist/tools/build-set-target.js +49 -0
- package/dist/tools/build-set-target.js.map +1 -0
- package/dist/tools/build-start.d.ts +2 -0
- package/dist/tools/build-start.js +64 -0
- package/dist/tools/build-start.js.map +1 -0
- package/dist/tools/capture-inline.d.ts +2 -0
- package/dist/tools/capture-inline.js +57 -0
- package/dist/tools/capture-inline.js.map +1 -0
- package/dist/tools/checkpoint-create.d.ts +2 -0
- package/dist/tools/checkpoint-create.js +16 -0
- package/dist/tools/checkpoint-create.js.map +1 -0
- package/dist/tools/compile-check.d.ts +2 -0
- package/dist/tools/compile-check.js +26 -0
- package/dist/tools/compile-check.js.map +1 -0
- package/dist/tools/component-add.d.ts +2 -0
- package/dist/tools/component-add.js +47 -0
- package/dist/tools/component-add.js.map +1 -0
- package/dist/tools/component-destroy.d.ts +2 -0
- package/dist/tools/component-destroy.js +46 -0
- package/dist/tools/component-destroy.js.map +1 -0
- package/dist/tools/component-get.d.ts +2 -0
- package/dist/tools/component-get.js +54 -0
- package/dist/tools/component-get.js.map +1 -0
- package/dist/tools/component-list-all.d.ts +2 -0
- package/dist/tools/component-list-all.js +38 -0
- package/dist/tools/component-list-all.js.map +1 -0
- package/dist/tools/component-modify.d.ts +2 -0
- package/dist/tools/component-modify.js +80 -0
- package/dist/tools/component-modify.js.map +1 -0
- package/dist/tools/console-clear.d.ts +2 -0
- package/dist/tools/console-clear.js +19 -0
- package/dist/tools/console-clear.js.map +1 -0
- package/dist/tools/console-log.d.ts +2 -0
- package/dist/tools/console-log.js +47 -0
- package/dist/tools/console-log.js.map +1 -0
- package/dist/tools/delta.d.ts +2 -0
- package/dist/tools/delta.js +17 -0
- package/dist/tools/delta.js.map +1 -0
- package/dist/tools/editor-add-layer.d.ts +2 -0
- package/dist/tools/editor-add-layer.js +51 -0
- package/dist/tools/editor-add-layer.js.map +1 -0
- package/dist/tools/editor-add-tag.d.ts +2 -0
- package/dist/tools/editor-add-tag.js +41 -0
- package/dist/tools/editor-add-tag.js.map +1 -0
- package/dist/tools/editor-get-layers.d.ts +2 -0
- package/dist/tools/editor-get-layers.js +22 -0
- package/dist/tools/editor-get-layers.js.map +1 -0
- package/dist/tools/editor-get-tags.d.ts +2 -0
- package/dist/tools/editor-get-tags.js +19 -0
- package/dist/tools/editor-get-tags.js.map +1 -0
- package/dist/tools/editor-redo.d.ts +2 -0
- package/dist/tools/editor-redo.js +27 -0
- package/dist/tools/editor-redo.js.map +1 -0
- package/dist/tools/editor-set-state.d.ts +2 -0
- package/dist/tools/editor-set-state.js +57 -0
- package/dist/tools/editor-set-state.js.map +1 -0
- package/dist/tools/editor-status.d.ts +2 -0
- package/dist/tools/editor-status.js +17 -0
- package/dist/tools/editor-status.js.map +1 -0
- package/dist/tools/editor-undo.d.ts +2 -0
- package/dist/tools/editor-undo.js +29 -0
- package/dist/tools/editor-undo.js.map +1 -0
- package/dist/tools/execute-csharp.d.ts +2 -0
- package/dist/tools/execute-csharp.js +74 -0
- package/dist/tools/execute-csharp.js.map +1 -0
- package/dist/tools/execute-menu.d.ts +2 -0
- package/dist/tools/execute-menu.js +40 -0
- package/dist/tools/execute-menu.js.map +1 -0
- package/dist/tools/find-members.d.ts +2 -0
- package/dist/tools/find-members.js +56 -0
- package/dist/tools/find-members.js.map +1 -0
- package/dist/tools/find-references.d.ts +2 -0
- package/dist/tools/find-references.js +29 -0
- package/dist/tools/find-references.js.map +1 -0
- package/dist/tools/gameobject-create.d.ts +2 -0
- package/dist/tools/gameobject-create.js +61 -0
- package/dist/tools/gameobject-create.js.map +1 -0
- package/dist/tools/gameobject-destroy.d.ts +2 -0
- package/dist/tools/gameobject-destroy.js +38 -0
- package/dist/tools/gameobject-destroy.js.map +1 -0
- package/dist/tools/gameobject-duplicate.d.ts +2 -0
- package/dist/tools/gameobject-duplicate.js +40 -0
- package/dist/tools/gameobject-duplicate.js.map +1 -0
- package/dist/tools/gameobject-find.d.ts +2 -0
- package/dist/tools/gameobject-find.js +59 -0
- package/dist/tools/gameobject-find.js.map +1 -0
- package/dist/tools/gameobject-modify.d.ts +2 -0
- package/dist/tools/gameobject-modify.js +76 -0
- package/dist/tools/gameobject-modify.js.map +1 -0
- package/dist/tools/gameobject-set-parent.d.ts +2 -0
- package/dist/tools/gameobject-set-parent.js +55 -0
- package/dist/tools/gameobject-set-parent.js.map +1 -0
- package/dist/tools/gate-budget-estimate.d.ts +2 -0
- package/dist/tools/gate-budget-estimate.js +59 -0
- package/dist/tools/gate-budget-estimate.js.map +1 -0
- package/dist/tools/generate-skill.d.ts +2 -0
- package/dist/tools/generate-skill.js +37 -0
- package/dist/tools/generate-skill.js.map +1 -0
- package/dist/tools/impact-preview.d.ts +2 -0
- package/dist/tools/impact-preview.js +50 -0
- package/dist/tools/impact-preview.js.map +1 -0
- package/dist/tools/index.d.ts +30 -0
- package/dist/tools/index.js +576 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inputsystem-action-add.d.ts +2 -0
- package/dist/tools/inputsystem-action-add.js +61 -0
- package/dist/tools/inputsystem-action-add.js.map +1 -0
- package/dist/tools/inputsystem-actionmap-add.d.ts +2 -0
- package/dist/tools/inputsystem-actionmap-add.js +31 -0
- package/dist/tools/inputsystem-actionmap-add.js.map +1 -0
- package/dist/tools/inputsystem-asset-create.d.ts +2 -0
- package/dist/tools/inputsystem-asset-create.js +35 -0
- package/dist/tools/inputsystem-asset-create.js.map +1 -0
- package/dist/tools/inputsystem-binding-add.d.ts +2 -0
- package/dist/tools/inputsystem-binding-add.js +48 -0
- package/dist/tools/inputsystem-binding-add.js.map +1 -0
- package/dist/tools/inputsystem-binding-composite-add.d.ts +2 -0
- package/dist/tools/inputsystem-binding-composite-add.js +51 -0
- package/dist/tools/inputsystem-binding-composite-add.js.map +1 -0
- package/dist/tools/inputsystem-controlscheme-add.d.ts +2 -0
- package/dist/tools/inputsystem-controlscheme-add.js +43 -0
- package/dist/tools/inputsystem-controlscheme-add.js.map +1 -0
- package/dist/tools/inputsystem-get.d.ts +2 -0
- package/dist/tools/inputsystem-get.js +22 -0
- package/dist/tools/inputsystem-get.js.map +1 -0
- package/dist/tools/invoke-method.d.ts +2 -0
- package/dist/tools/invoke-method.js +104 -0
- package/dist/tools/invoke-method.js.map +1 -0
- package/dist/tools/list-assets.d.ts +2 -0
- package/dist/tools/list-assets.js +30 -0
- package/dist/tools/list-assets.js.map +1 -0
- package/dist/tools/list-rules.d.ts +2 -0
- package/dist/tools/list-rules.js +27 -0
- package/dist/tools/list-rules.js.map +1 -0
- package/dist/tools/manage-tools.d.ts +2 -0
- package/dist/tools/manage-tools.js +47 -0
- package/dist/tools/manage-tools.js.map +1 -0
- package/dist/tools/material-create.d.ts +2 -0
- package/dist/tools/material-create.js +37 -0
- package/dist/tools/material-create.js.map +1 -0
- package/dist/tools/material-get-keywords.d.ts +2 -0
- package/dist/tools/material-get-keywords.js +23 -0
- package/dist/tools/material-get-keywords.js.map +1 -0
- package/dist/tools/material-get-properties.d.ts +2 -0
- package/dist/tools/material-get-properties.js +32 -0
- package/dist/tools/material-get-properties.js.map +1 -0
- package/dist/tools/material-set-keyword.d.ts +2 -0
- package/dist/tools/material-set-keyword.js +42 -0
- package/dist/tools/material-set-keyword.js.map +1 -0
- package/dist/tools/material-set-property.d.ts +2 -0
- package/dist/tools/material-set-property.js +49 -0
- package/dist/tools/material-set-property.js.map +1 -0
- package/dist/tools/material-set-shader.d.ts +2 -0
- package/dist/tools/material-set-shader.js +39 -0
- package/dist/tools/material-set-shader.js.map +1 -0
- package/dist/tools/mutation-explain.d.ts +2 -0
- package/dist/tools/mutation-explain.js +44 -0
- package/dist/tools/mutation-explain.js.map +1 -0
- package/dist/tools/navigation-agent-add.d.ts +2 -0
- package/dist/tools/navigation-agent-add.js +38 -0
- package/dist/tools/navigation-agent-add.js.map +1 -0
- package/dist/tools/navigation-agent-set-destination.d.ts +2 -0
- package/dist/tools/navigation-agent-set-destination.js +33 -0
- package/dist/tools/navigation-agent-set-destination.js.map +1 -0
- package/dist/tools/navigation-get.d.ts +2 -0
- package/dist/tools/navigation-get.js +20 -0
- package/dist/tools/navigation-get.js.map +1 -0
- package/dist/tools/navigation-link-add.d.ts +2 -0
- package/dist/tools/navigation-link-add.js +57 -0
- package/dist/tools/navigation-link-add.js.map +1 -0
- package/dist/tools/navigation-list.d.ts +2 -0
- package/dist/tools/navigation-list.js +16 -0
- package/dist/tools/navigation-list.js.map +1 -0
- package/dist/tools/navigation-modifier-add.d.ts +2 -0
- package/dist/tools/navigation-modifier-add.js +42 -0
- package/dist/tools/navigation-modifier-add.js.map +1 -0
- package/dist/tools/navigation-modifier-volume-add.d.ts +2 -0
- package/dist/tools/navigation-modifier-volume-add.js +41 -0
- package/dist/tools/navigation-modifier-volume-add.js.map +1 -0
- package/dist/tools/navigation-modify.d.ts +2 -0
- package/dist/tools/navigation-modify.js +47 -0
- package/dist/tools/navigation-modify.js.map +1 -0
- package/dist/tools/navigation-set-bake-settings.d.ts +2 -0
- package/dist/tools/navigation-set-bake-settings.js +42 -0
- package/dist/tools/navigation-set-bake-settings.js.map +1 -0
- package/dist/tools/navigation-surface-add.d.ts +2 -0
- package/dist/tools/navigation-surface-add.js +62 -0
- package/dist/tools/navigation-surface-add.js.map +1 -0
- package/dist/tools/navigation-surface-bake.d.ts +2 -0
- package/dist/tools/navigation-surface-bake.js +30 -0
- package/dist/tools/navigation-surface-bake.js.map +1 -0
- package/dist/tools/object-get-data.d.ts +2 -0
- package/dist/tools/object-get-data.js +59 -0
- package/dist/tools/object-get-data.js.map +1 -0
- package/dist/tools/object-modify.d.ts +2 -0
- package/dist/tools/object-modify.js +73 -0
- package/dist/tools/object-modify.js.map +1 -0
- package/dist/tools/package-add.d.ts +2 -0
- package/dist/tools/package-add.js +42 -0
- package/dist/tools/package-add.js.map +1 -0
- package/dist/tools/package-check.d.ts +2 -0
- package/dist/tools/package-check.js +27 -0
- package/dist/tools/package-check.js.map +1 -0
- package/dist/tools/package-get-dependencies.d.ts +2 -0
- package/dist/tools/package-get-dependencies.js +17 -0
- package/dist/tools/package-get-dependencies.js.map +1 -0
- package/dist/tools/package-get-info.d.ts +2 -0
- package/dist/tools/package-get-info.js +33 -0
- package/dist/tools/package-get-info.js.map +1 -0
- package/dist/tools/package-list.d.ts +2 -0
- package/dist/tools/package-list.js +57 -0
- package/dist/tools/package-list.js.map +1 -0
- package/dist/tools/package-remove.d.ts +2 -0
- package/dist/tools/package-remove.js +40 -0
- package/dist/tools/package-remove.js.map +1 -0
- package/dist/tools/package-search.d.ts +2 -0
- package/dist/tools/package-search.js +42 -0
- package/dist/tools/package-search.js.map +1 -0
- package/dist/tools/particle-system-get.d.ts +2 -0
- package/dist/tools/particle-system-get.js +42 -0
- package/dist/tools/particle-system-get.js.map +1 -0
- package/dist/tools/particle-system-modify.d.ts +2 -0
- package/dist/tools/particle-system-modify.js +73 -0
- package/dist/tools/particle-system-modify.js.map +1 -0
- package/dist/tools/ping.d.ts +2 -0
- package/dist/tools/ping.js +10 -0
- package/dist/tools/ping.js.map +1 -0
- package/dist/tools/prefab-apply.d.ts +2 -0
- package/dist/tools/prefab-apply.js +39 -0
- package/dist/tools/prefab-apply.js.map +1 -0
- package/dist/tools/prefab-close.d.ts +2 -0
- package/dist/tools/prefab-close.js +29 -0
- package/dist/tools/prefab-close.js.map +1 -0
- package/dist/tools/prefab-create.d.ts +2 -0
- package/dist/tools/prefab-create.js +52 -0
- package/dist/tools/prefab-create.js.map +1 -0
- package/dist/tools/prefab-get-overrides.d.ts +2 -0
- package/dist/tools/prefab-get-overrides.js +27 -0
- package/dist/tools/prefab-get-overrides.js.map +1 -0
- package/dist/tools/prefab-instantiate.d.ts +2 -0
- package/dist/tools/prefab-instantiate.js +52 -0
- package/dist/tools/prefab-instantiate.js.map +1 -0
- package/dist/tools/prefab-open.d.ts +2 -0
- package/dist/tools/prefab-open.js +30 -0
- package/dist/tools/prefab-open.js.map +1 -0
- package/dist/tools/prefab-revert.d.ts +2 -0
- package/dist/tools/prefab-revert.js +37 -0
- package/dist/tools/prefab-revert.js.map +1 -0
- package/dist/tools/prefab-save.d.ts +2 -0
- package/dist/tools/prefab-save.js +24 -0
- package/dist/tools/prefab-save.js.map +1 -0
- package/dist/tools/prefab-status.d.ts +2 -0
- package/dist/tools/prefab-status.js +29 -0
- package/dist/tools/prefab-status.js.map +1 -0
- package/dist/tools/prefab-unpack.d.ts +2 -0
- package/dist/tools/prefab-unpack.js +43 -0
- package/dist/tools/prefab-unpack.js.map +1 -0
- package/dist/tools/probuilder-create-shape.d.ts +2 -0
- package/dist/tools/probuilder-create-shape.js +40 -0
- package/dist/tools/probuilder-create-shape.js.map +1 -0
- package/dist/tools/probuilder-delete-faces.d.ts +2 -0
- package/dist/tools/probuilder-delete-faces.js +47 -0
- package/dist/tools/probuilder-delete-faces.js.map +1 -0
- package/dist/tools/probuilder-extrude.d.ts +2 -0
- package/dist/tools/probuilder-extrude.js +58 -0
- package/dist/tools/probuilder-extrude.js.map +1 -0
- package/dist/tools/probuilder-get-mesh-info.d.ts +2 -0
- package/dist/tools/probuilder-get-mesh-info.js +21 -0
- package/dist/tools/probuilder-get-mesh-info.js.map +1 -0
- package/dist/tools/probuilder-set-face-material.d.ts +2 -0
- package/dist/tools/probuilder-set-face-material.js +53 -0
- package/dist/tools/probuilder-set-face-material.js.map +1 -0
- package/dist/tools/profiler-capture.d.ts +2 -0
- package/dist/tools/profiler-capture.js +84 -0
- package/dist/tools/profiler-capture.js.map +1 -0
- package/dist/tools/profiler-clear-data.d.ts +2 -0
- package/dist/tools/profiler-clear-data.js +20 -0
- package/dist/tools/profiler-clear-data.js.map +1 -0
- package/dist/tools/profiler-enable-module.d.ts +2 -0
- package/dist/tools/profiler-enable-module.js +32 -0
- package/dist/tools/profiler-enable-module.js.map +1 -0
- package/dist/tools/profiler-get-config.d.ts +2 -0
- package/dist/tools/profiler-get-config.js +21 -0
- package/dist/tools/profiler-get-config.js.map +1 -0
- package/dist/tools/profiler-get-script-stats.d.ts +2 -0
- package/dist/tools/profiler-get-script-stats.js +20 -0
- package/dist/tools/profiler-get-script-stats.js.map +1 -0
- package/dist/tools/profiler-get-status.d.ts +2 -0
- package/dist/tools/profiler-get-status.js +22 -0
- package/dist/tools/profiler-get-status.js.map +1 -0
- package/dist/tools/profiler-list-modules.d.ts +2 -0
- package/dist/tools/profiler-list-modules.js +20 -0
- package/dist/tools/profiler-list-modules.js.map +1 -0
- package/dist/tools/profiler-load-data.d.ts +2 -0
- package/dist/tools/profiler-load-data.js +38 -0
- package/dist/tools/profiler-load-data.js.map +1 -0
- package/dist/tools/profiler-memory.d.ts +2 -0
- package/dist/tools/profiler-memory.js +21 -0
- package/dist/tools/profiler-memory.js.map +1 -0
- package/dist/tools/profiler-rendering.d.ts +2 -0
- package/dist/tools/profiler-rendering.js +14 -0
- package/dist/tools/profiler-rendering.js.map +1 -0
- package/dist/tools/profiler-save-data.d.ts +2 -0
- package/dist/tools/profiler-save-data.js +38 -0
- package/dist/tools/profiler-save-data.js.map +1 -0
- package/dist/tools/profiler-set-config.d.ts +2 -0
- package/dist/tools/profiler-set-config.js +72 -0
- package/dist/tools/profiler-set-config.js.map +1 -0
- package/dist/tools/profiler-start.d.ts +2 -0
- package/dist/tools/profiler-start.js +31 -0
- package/dist/tools/profiler-start.js.map +1 -0
- package/dist/tools/profiler-stop.d.ts +2 -0
- package/dist/tools/profiler-stop.js +20 -0
- package/dist/tools/profiler-stop.js.map +1 -0
- package/dist/tools/pull-events.d.ts +2 -0
- package/dist/tools/pull-events.js +43 -0
- package/dist/tools/pull-events.js.map +1 -0
- package/dist/tools/read-asset.d.ts +2 -0
- package/dist/tools/read-asset.js +62 -0
- package/dist/tools/read-asset.js.map +1 -0
- package/dist/tools/read-compile-errors.d.ts +2 -0
- package/dist/tools/read-compile-errors.js +59 -0
- package/dist/tools/read-compile-errors.js.map +1 -0
- package/dist/tools/read-console.d.ts +2 -0
- package/dist/tools/read-console.js +57 -0
- package/dist/tools/read-console.js.map +1 -0
- package/dist/tools/regression-check.d.ts +2 -0
- package/dist/tools/regression-check.js +36 -0
- package/dist/tools/regression-check.js.map +1 -0
- package/dist/tools/reserialize.d.ts +2 -0
- package/dist/tools/reserialize.js +31 -0
- package/dist/tools/reserialize.js.map +1 -0
- package/dist/tools/run-tests.d.ts +2 -0
- package/dist/tools/run-tests.js +49 -0
- package/dist/tools/run-tests.js.map +1 -0
- package/dist/tools/scan-all.d.ts +2 -0
- package/dist/tools/scan-all.js +25 -0
- package/dist/tools/scan-all.js.map +1 -0
- package/dist/tools/scan-paths.d.ts +2 -0
- package/dist/tools/scan-paths.js +40 -0
- package/dist/tools/scan-paths.js.map +1 -0
- package/dist/tools/scene-create.d.ts +2 -0
- package/dist/tools/scene-create.js +47 -0
- package/dist/tools/scene-create.js.map +1 -0
- package/dist/tools/scene-focus.d.ts +2 -0
- package/dist/tools/scene-focus.js +55 -0
- package/dist/tools/scene-focus.js.map +1 -0
- package/dist/tools/scene-get-data.d.ts +2 -0
- package/dist/tools/scene-get-data.js +52 -0
- package/dist/tools/scene-get-data.js.map +1 -0
- package/dist/tools/scene-get-dirty-summary.d.ts +2 -0
- package/dist/tools/scene-get-dirty-summary.js +17 -0
- package/dist/tools/scene-get-dirty-summary.js.map +1 -0
- package/dist/tools/scene-list-opened.d.ts +2 -0
- package/dist/tools/scene-list-opened.js +16 -0
- package/dist/tools/scene-list-opened.js.map +1 -0
- package/dist/tools/scene-open.d.ts +2 -0
- package/dist/tools/scene-open.js +48 -0
- package/dist/tools/scene-open.js.map +1 -0
- package/dist/tools/scene-save.d.ts +2 -0
- package/dist/tools/scene-save.js +38 -0
- package/dist/tools/scene-save.js.map +1 -0
- package/dist/tools/scene-set-active.d.ts +2 -0
- package/dist/tools/scene-set-active.js +33 -0
- package/dist/tools/scene-set-active.js.map +1 -0
- package/dist/tools/scene-unload.d.ts +2 -0
- package/dist/tools/scene-unload.js +33 -0
- package/dist/tools/scene-unload.js.map +1 -0
- package/dist/tools/screenshot-camera.d.ts +2 -0
- package/dist/tools/screenshot-camera.js +59 -0
- package/dist/tools/screenshot-camera.js.map +1 -0
- package/dist/tools/screenshot-window.d.ts +2 -0
- package/dist/tools/screenshot-window.js +54 -0
- package/dist/tools/screenshot-window.js.map +1 -0
- package/dist/tools/screenshot.d.ts +2 -0
- package/dist/tools/screenshot.js +47 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/script-delete.d.ts +2 -0
- package/dist/tools/script-delete.js +37 -0
- package/dist/tools/script-delete.js.map +1 -0
- package/dist/tools/script-read.d.ts +2 -0
- package/dist/tools/script-read.js +46 -0
- package/dist/tools/script-read.js.map +1 -0
- package/dist/tools/script-write.d.ts +2 -0
- package/dist/tools/script-write.js +56 -0
- package/dist/tools/script-write.js.map +1 -0
- package/dist/tools/search-assets.d.ts +2 -0
- package/dist/tools/search-assets.js +49 -0
- package/dist/tools/search-assets.js.map +1 -0
- package/dist/tools/selection-get.d.ts +2 -0
- package/dist/tools/selection-get.js +28 -0
- package/dist/tools/selection-get.js.map +1 -0
- package/dist/tools/selection-set.d.ts +2 -0
- package/dist/tools/selection-set.js +72 -0
- package/dist/tools/selection-set.js.map +1 -0
- package/dist/tools/settings-get-lighting.d.ts +2 -0
- package/dist/tools/settings-get-lighting.js +21 -0
- package/dist/tools/settings-get-lighting.js.map +1 -0
- package/dist/tools/settings-get-physics.d.ts +2 -0
- package/dist/tools/settings-get-physics.js +17 -0
- package/dist/tools/settings-get-physics.js.map +1 -0
- package/dist/tools/settings-get-player.d.ts +2 -0
- package/dist/tools/settings-get-player.js +16 -0
- package/dist/tools/settings-get-player.js.map +1 -0
- package/dist/tools/settings-get-quality.d.ts +2 -0
- package/dist/tools/settings-get-quality.js +16 -0
- package/dist/tools/settings-get-quality.js.map +1 -0
- package/dist/tools/settings-set-lighting.d.ts +2 -0
- package/dist/tools/settings-set-lighting.js +58 -0
- package/dist/tools/settings-set-lighting.js.map +1 -0
- package/dist/tools/settings-set-physics.d.ts +2 -0
- package/dist/tools/settings-set-physics.js +52 -0
- package/dist/tools/settings-set-physics.js.map +1 -0
- package/dist/tools/settings-set-player.d.ts +2 -0
- package/dist/tools/settings-set-player.js +62 -0
- package/dist/tools/settings-set-player.js.map +1 -0
- package/dist/tools/settings-set-quality.d.ts +2 -0
- package/dist/tools/settings-set-quality.js +51 -0
- package/dist/tools/settings-set-quality.js.map +1 -0
- package/dist/tools/shader-get-data.d.ts +2 -0
- package/dist/tools/shader-get-data.js +31 -0
- package/dist/tools/shader-get-data.js.map +1 -0
- package/dist/tools/shader-list-all.d.ts +2 -0
- package/dist/tools/shader-list-all.js +24 -0
- package/dist/tools/shader-list-all.js.map +1 -0
- package/dist/tools/spatial-query.d.ts +2 -0
- package/dist/tools/spatial-query.js +117 -0
- package/dist/tools/spatial-query.js.map +1 -0
- package/dist/tools/splines-add-knot.d.ts +2 -0
- package/dist/tools/splines-add-knot.js +44 -0
- package/dist/tools/splines-add-knot.js.map +1 -0
- package/dist/tools/splines-container-create.d.ts +2 -0
- package/dist/tools/splines-container-create.js +39 -0
- package/dist/tools/splines-container-create.js.map +1 -0
- package/dist/tools/splines-evaluate.d.ts +2 -0
- package/dist/tools/splines-evaluate.js +31 -0
- package/dist/tools/splines-evaluate.js.map +1 -0
- package/dist/tools/splines-get-knots.d.ts +2 -0
- package/dist/tools/splines-get-knots.js +25 -0
- package/dist/tools/splines-get-knots.js.map +1 -0
- package/dist/tools/splines-modify.d.ts +2 -0
- package/dist/tools/splines-modify.js +35 -0
- package/dist/tools/splines-modify.js.map +1 -0
- package/dist/tools/splines-set-knot.d.ts +2 -0
- package/dist/tools/splines-set-knot.js +41 -0
- package/dist/tools/splines-set-knot.js.map +1 -0
- package/dist/tools/splines-set-tangent-mode.d.ts +2 -0
- package/dist/tools/splines-set-tangent-mode.js +43 -0
- package/dist/tools/splines-set-tangent-mode.js.map +1 -0
- package/dist/tools/type-schema.d.ts +2 -0
- package/dist/tools/type-schema.js +62 -0
- package/dist/tools/type-schema.js.map +1 -0
- package/dist/tools/validate-edit.d.ts +2 -0
- package/dist/tools/validate-edit.js +43 -0
- package/dist/tools/validate-edit.js.map +1 -0
- package/dist/unity-install-discovery.d.ts +79 -0
- package/dist/unity-install-discovery.js +206 -0
- package/dist/unity-install-discovery.js.map +1 -0
- package/dist/unity-log.d.ts +35 -0
- package/dist/unity-log.js +110 -0
- package/dist/unity-log.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// M13 T4.4 — bridge event stream client.
|
|
2
|
+
//
|
|
3
|
+
// The MCP server runs behind a stdio transport, so it can't directly forward
|
|
4
|
+
// bridge SSE to MCP notifications without a background SSE reader. This module
|
|
5
|
+
// owns that reader: a single SSE subscription per server process, parsed into
|
|
6
|
+
// events and pushed into an in-memory queue. The `unity_senses_pull_events`
|
|
7
|
+
// tool drains the queue per call so an agent can poll incremental console /
|
|
8
|
+
// compile-state events without burning an HTTP round-trip on every check.
|
|
9
|
+
//
|
|
10
|
+
// Lifecycle:
|
|
11
|
+
// - ensureSubscription() is called on every tool dispatch; it starts the SSE
|
|
12
|
+
// reader once and is a no-op afterwards.
|
|
13
|
+
// - The reader reconnects with the last subscriber id so it keeps its cursor
|
|
14
|
+
// across disconnects (a 10-minute SSE timeout or a Unity domain reload).
|
|
15
|
+
// - On bridge-unavailable (connection refused), ensureSubscription records
|
|
16
|
+
// the failure and the tool surfaces a `bridge_unavailable` error to the
|
|
17
|
+
// agent instead of hanging.
|
|
18
|
+
//
|
|
19
|
+
// No new runtime deps — uses only `node:crypto`, the global `fetch`, and the
|
|
20
|
+
// `node:events` API.
|
|
21
|
+
import { randomBytes } from "node:crypto";
|
|
22
|
+
const QUEUE_CAPACITY = 500;
|
|
23
|
+
export class BridgeEventStream {
|
|
24
|
+
baseUrl;
|
|
25
|
+
authToken;
|
|
26
|
+
subscriberId;
|
|
27
|
+
queue = [];
|
|
28
|
+
dropped = 0;
|
|
29
|
+
connected = false;
|
|
30
|
+
lastError = null;
|
|
31
|
+
abortController = null;
|
|
32
|
+
reconnectTimer = null;
|
|
33
|
+
started = false;
|
|
34
|
+
constructor(baseUrl, subscriberId, authToken) {
|
|
35
|
+
this.baseUrl = baseUrl;
|
|
36
|
+
this.authToken = authToken;
|
|
37
|
+
this.subscriberId =
|
|
38
|
+
subscriberId ?? randomBytes(16).toString("hex");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Start the SSE reader if it isn't running. Safe to call repeatedly; returns
|
|
42
|
+
* true when a fresh subscription was started this call.
|
|
43
|
+
*/
|
|
44
|
+
ensureSubscription() {
|
|
45
|
+
if (this.started)
|
|
46
|
+
return false;
|
|
47
|
+
this.started = true;
|
|
48
|
+
this.connect();
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
connect() {
|
|
52
|
+
if (this.abortController)
|
|
53
|
+
return;
|
|
54
|
+
this.abortController = new AbortController();
|
|
55
|
+
const url = `${this.baseUrl}/events?subscriber=${encodeURIComponent(this.subscriberId)}&max_per_poll=100`;
|
|
56
|
+
// SSE read is streaming; consume body manually so we can split on
|
|
57
|
+
// double-newline event boundaries. M14 — carry the bearer token so the
|
|
58
|
+
// stream is gated the same way as tool/ping requests.
|
|
59
|
+
const headers = { Accept: "text/event-stream" };
|
|
60
|
+
if (this.authToken)
|
|
61
|
+
headers["Authorization"] = `Bearer ${this.authToken}`;
|
|
62
|
+
fetch(url, {
|
|
63
|
+
method: "GET",
|
|
64
|
+
headers,
|
|
65
|
+
signal: this.abortController.signal,
|
|
66
|
+
})
|
|
67
|
+
.then((res) => {
|
|
68
|
+
if (!res.ok || !res.body) {
|
|
69
|
+
throw new Error(`HTTP ${res.status}`);
|
|
70
|
+
}
|
|
71
|
+
this.connected = true;
|
|
72
|
+
this.lastError = null;
|
|
73
|
+
this.pump(res.body);
|
|
74
|
+
})
|
|
75
|
+
.catch((err) => {
|
|
76
|
+
this.connected = false;
|
|
77
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
78
|
+
// AbortError means we intentionally stopped; treat as clean disconnect.
|
|
79
|
+
this.lastError = message.includes("abort") ? null : message;
|
|
80
|
+
this.scheduleReconnect();
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async pump(body) {
|
|
84
|
+
const reader = body.getReader();
|
|
85
|
+
const decoder = new TextDecoder();
|
|
86
|
+
let buffer = "";
|
|
87
|
+
try {
|
|
88
|
+
// eslint-disable-next-line no-constant-condition
|
|
89
|
+
while (true) {
|
|
90
|
+
const { value, done } = await reader.read();
|
|
91
|
+
if (done)
|
|
92
|
+
break;
|
|
93
|
+
buffer += decoder.decode(value, { stream: true });
|
|
94
|
+
let sep;
|
|
95
|
+
// SSE events are separated by a blank line.
|
|
96
|
+
while ((sep = buffer.indexOf("\n\n")) >= 0) {
|
|
97
|
+
const block = buffer.slice(0, sep);
|
|
98
|
+
buffer = buffer.slice(sep + 2);
|
|
99
|
+
this.handleBlock(block);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
// Network drop mid-stream — schedule a reconnect.
|
|
105
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
106
|
+
this.lastError = message;
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
this.connected = false;
|
|
110
|
+
try {
|
|
111
|
+
await reader.cancel();
|
|
112
|
+
}
|
|
113
|
+
catch { /* ignore */ }
|
|
114
|
+
this.scheduleReconnect();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
handleBlock(block) {
|
|
118
|
+
const evt = BridgeEventStream.parseSseBlock(block);
|
|
119
|
+
if (evt)
|
|
120
|
+
this.enqueue(evt);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Parse one SSE block (the text between two blank-line separators) into a
|
|
124
|
+
* BridgeEvent, or null when the block carries no data. Exposed for unit
|
|
125
|
+
* testing — the SSE reader loop calls it via handleBlock.
|
|
126
|
+
*/
|
|
127
|
+
static parseSseBlock(block) {
|
|
128
|
+
let eventName = "message";
|
|
129
|
+
const dataLines = [];
|
|
130
|
+
for (const line of block.split("\n")) {
|
|
131
|
+
if (line.startsWith("event:")) {
|
|
132
|
+
eventName = line.slice(6).trim();
|
|
133
|
+
}
|
|
134
|
+
else if (line.startsWith("data:")) {
|
|
135
|
+
dataLines.push(line.slice(5).replace(/^ /, ""));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (dataLines.length === 0)
|
|
139
|
+
return null;
|
|
140
|
+
const data = dataLines.join("\n");
|
|
141
|
+
let parsed = {};
|
|
142
|
+
try {
|
|
143
|
+
parsed = JSON.parse(data);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Non-JSON payload (e.g. "close"); keep raw.
|
|
147
|
+
parsed = { raw: data };
|
|
148
|
+
}
|
|
149
|
+
const evt = {
|
|
150
|
+
seq: typeof parsed.seq === "number" ? parsed.seq : Date.now(),
|
|
151
|
+
ts: typeof parsed.ts === "string" ? parsed.ts : new Date().toISOString(),
|
|
152
|
+
type: eventName,
|
|
153
|
+
};
|
|
154
|
+
if (eventName === "log") {
|
|
155
|
+
evt.logType = typeof parsed.logType === "string" ? parsed.logType : "log";
|
|
156
|
+
evt.message = typeof parsed.message === "string" ? parsed.message : "";
|
|
157
|
+
evt.stack = typeof parsed.stack === "string" ? parsed.stack : undefined;
|
|
158
|
+
}
|
|
159
|
+
else if (eventName === "editor_state") {
|
|
160
|
+
evt.state = typeof parsed.state === "string" ? parsed.state : "";
|
|
161
|
+
evt.isCompiling = parsed.isCompiling === true;
|
|
162
|
+
evt.isPlaying = parsed.isPlaying === true;
|
|
163
|
+
}
|
|
164
|
+
else if (eventName === "missed") {
|
|
165
|
+
// SSE "missed" marker — surfaces as its own event so the agent sees the gap.
|
|
166
|
+
evt.message = `missed=${parsed.missed ?? "unknown"}`;
|
|
167
|
+
}
|
|
168
|
+
return evt;
|
|
169
|
+
}
|
|
170
|
+
enqueue(evt) {
|
|
171
|
+
this.queue.push(evt);
|
|
172
|
+
while (this.queue.length > QUEUE_CAPACITY) {
|
|
173
|
+
this.queue.shift();
|
|
174
|
+
this.dropped++;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
scheduleReconnect() {
|
|
178
|
+
if (this.reconnectTimer)
|
|
179
|
+
return;
|
|
180
|
+
this.reconnectTimer = setTimeout(() => {
|
|
181
|
+
this.reconnectTimer = null;
|
|
182
|
+
this.abortController = null;
|
|
183
|
+
this.connect();
|
|
184
|
+
}, 2000);
|
|
185
|
+
}
|
|
186
|
+
/** Drain all queued events. The subscription keeps running. */
|
|
187
|
+
drain(maxEvents) {
|
|
188
|
+
const cap = maxEvents > 0 && maxEvents <= 1000 ? maxEvents : 100;
|
|
189
|
+
const out = this.queue.slice(0, cap);
|
|
190
|
+
this.queue = this.queue.slice(cap);
|
|
191
|
+
return out;
|
|
192
|
+
}
|
|
193
|
+
/** One-shot pull: start the subscription if needed and drain. */
|
|
194
|
+
pull(maxEvents) {
|
|
195
|
+
const started = this.ensureSubscription();
|
|
196
|
+
const events = this.drain(maxEvents);
|
|
197
|
+
return {
|
|
198
|
+
subscriberId: this.subscriberId,
|
|
199
|
+
events,
|
|
200
|
+
dropped: this.dropped,
|
|
201
|
+
connected: this.connected,
|
|
202
|
+
started,
|
|
203
|
+
lastError: this.lastError,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/** Stop the reader and clear state. Idempotent; used in tests. */
|
|
207
|
+
stop() {
|
|
208
|
+
if (this.reconnectTimer) {
|
|
209
|
+
clearTimeout(this.reconnectTimer);
|
|
210
|
+
this.reconnectTimer = null;
|
|
211
|
+
}
|
|
212
|
+
if (this.abortController) {
|
|
213
|
+
this.abortController.abort();
|
|
214
|
+
this.abortController = null;
|
|
215
|
+
}
|
|
216
|
+
this.started = false;
|
|
217
|
+
this.connected = false;
|
|
218
|
+
this.queue = [];
|
|
219
|
+
this.dropped = 0;
|
|
220
|
+
}
|
|
221
|
+
get isConnected() {
|
|
222
|
+
return this.connected;
|
|
223
|
+
}
|
|
224
|
+
get id() {
|
|
225
|
+
return this.subscriberId;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=event-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-stream.js","sourceRoot":"","sources":["../src/event-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface MutationEnvelope {
|
|
2
|
+
mutation: {
|
|
3
|
+
success: boolean;
|
|
4
|
+
output: unknown;
|
|
5
|
+
error: {
|
|
6
|
+
code: string;
|
|
7
|
+
message: string;
|
|
8
|
+
} | null;
|
|
9
|
+
};
|
|
10
|
+
gate: {
|
|
11
|
+
mode: string;
|
|
12
|
+
skipped: boolean;
|
|
13
|
+
validation: unknown;
|
|
14
|
+
delta: Record<string, unknown> | null;
|
|
15
|
+
};
|
|
16
|
+
agentNextSteps: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function deriveIsError(envelope: MutationEnvelope): boolean;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function deriveIsError(envelope) {
|
|
2
|
+
if (!envelope.mutation.success)
|
|
3
|
+
return true;
|
|
4
|
+
if (envelope.gate.mode === "enforce" && envelope.gate.delta) {
|
|
5
|
+
const newErrors = envelope.gate.delta.newErrors;
|
|
6
|
+
if (typeof newErrors === "number" && newErrors > 0)
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=gate-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-error.js","sourceRoot":"","sources":["../src/gate-error.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,aAAa,CAAC,QAA0B;IACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE5C,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAChD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAClE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { ALL_TOOLS } from "./tools/index.js";
|
|
6
|
+
import { ALL_RESOURCES } from "./resources/index.js";
|
|
7
|
+
import { LiveClient } from "./live-client.js";
|
|
8
|
+
import { BatchSpawn } from "./batch-spawn.js";
|
|
9
|
+
import { ToolRouter } from "./tool-router.js";
|
|
10
|
+
import { PingCache } from "./ping-cache.js";
|
|
11
|
+
import { ResourceRouter } from "./resource-router.js";
|
|
12
|
+
import { withSchemaDefaults } from "./schema-defaults.js";
|
|
13
|
+
import { resolvePort, resolveAuthToken } from "./instance-discovery.js";
|
|
14
|
+
import { BridgeEventStream } from "./event-stream.js";
|
|
15
|
+
import { KNOWN_COMMANDS } from "./cli/args.js";
|
|
16
|
+
import { runCli } from "./cli/cli.js";
|
|
17
|
+
import { readPackageVersion } from "./package-version.js";
|
|
18
|
+
import { ToolSessionState, filterVisibleTools, } from "./tool-session-state.js";
|
|
19
|
+
// Read the version from package.json at runtime so `npm version` (and the
|
|
20
|
+
// maintainer-panel version-bump in the Hub) keep the reported server + CLI
|
|
21
|
+
// version in sync without editing this source file.
|
|
22
|
+
const PACKAGE_VERSION = readPackageVersion();
|
|
23
|
+
/** Name → tool lookup, built once for default-injection in the CallTool handler. */
|
|
24
|
+
const TOOL_BY_NAME = new Map(ALL_TOOLS.map((t) => [t.name, t]));
|
|
25
|
+
/**
|
|
26
|
+
* Resolve env for the MCP server. UNITY_PROJECT_PATH is mandatory. The port
|
|
27
|
+
* uses M13 T4.3 instance discovery:
|
|
28
|
+
* 1. UNITY_OPEN_MCP_BRIDGE_PORT env var (override wins; users who pin a
|
|
29
|
+
* port keep working as before)
|
|
30
|
+
* 2. ~/.unity-open-mcp/instances/<hash>.json lock file (when its pid is alive)
|
|
31
|
+
* 3. deterministic hash of the project path (20000 + sha256 % 10000)
|
|
32
|
+
* The resolved port is logged so users can see which bridge was picked.
|
|
33
|
+
*/
|
|
34
|
+
function getEnv() {
|
|
35
|
+
const projectPath = process.env.UNITY_PROJECT_PATH;
|
|
36
|
+
if (!projectPath) {
|
|
37
|
+
console.error("unity-open-mcp: UNITY_PROJECT_PATH environment variable is required.");
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const rawEnvPort = process.env.UNITY_OPEN_MCP_BRIDGE_PORT;
|
|
41
|
+
const envPort = rawEnvPort ? parseInt(rawEnvPort, 10) : undefined;
|
|
42
|
+
const port = resolvePort(projectPath, Number.isInteger(envPort) ? envPort : undefined);
|
|
43
|
+
const source = rawEnvPort && Number.isInteger(envPort)
|
|
44
|
+
? "env override"
|
|
45
|
+
: "instance discovery";
|
|
46
|
+
console.error(`[unity-open-mcp] Bridge port resolved to ${port} (${source}) for project ${projectPath}`);
|
|
47
|
+
// M14 — auto-discover the bridge's per-session bearer token from the same
|
|
48
|
+
// instance lock we read the port from. Undefined when no live lock exists
|
|
49
|
+
// (older bridge / env port override); in that case the client sends no
|
|
50
|
+
// Authorization header and the bridge must be in authMode "none".
|
|
51
|
+
const authToken = resolveAuthToken(projectPath, Number.isInteger(envPort) ? envPort : undefined);
|
|
52
|
+
if (authToken) {
|
|
53
|
+
console.error("[unity-open-mcp] Bridge auth token discovered from instance lock.");
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.error("[unity-open-mcp] No bridge auth token discovered (authMode must be \"none\").");
|
|
57
|
+
}
|
|
58
|
+
return { projectPath, port, authToken };
|
|
59
|
+
}
|
|
60
|
+
export function createServer(projectPath, port, authToken) {
|
|
61
|
+
const server = new Server({ name: "unity-open-mcp", version: PACKAGE_VERSION }, { capabilities: { tools: { listChanged: true }, resources: {} } });
|
|
62
|
+
const pingCache = new PingCache();
|
|
63
|
+
const liveClient = new LiveClient(port, pingCache, authToken, projectPath);
|
|
64
|
+
const batchSpawn = new BatchSpawn();
|
|
65
|
+
// M13 T4.4 — one SSE subscription per server process. The MCP server is the
|
|
66
|
+
// only long-lived hop between the bridge and the LLM; a per-process reader
|
|
67
|
+
// amortizes the connection and lets every `unity_senses_pull_events` call
|
|
68
|
+
// share the same buffered queue.
|
|
69
|
+
const eventStream = new BridgeEventStream(`http://127.0.0.1:${port}`, undefined, authToken);
|
|
70
|
+
// M18 Plan 2 / T18.2.2 — per-session tool-group visibility state. Lives in
|
|
71
|
+
// the MCP server (matches the Coplay model and the resolved decision in
|
|
72
|
+
// M18 execution-plan.md). Resets to `core`-only on every server restart;
|
|
73
|
+
// mutated only by unity_open_mcp_manage_tools and consulted by ListTools.
|
|
74
|
+
const sessionState = new ToolSessionState();
|
|
75
|
+
const notifyToolListChanged = async () => {
|
|
76
|
+
try {
|
|
77
|
+
await server.notification({ method: "notifications/tools/list_changed" });
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
console.error("[unity-open-mcp] Failed to send tools/list_changed notification:", err);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const router = new ToolRouter(liveClient, batchSpawn, projectPath, eventStream, sessionState, notifyToolListChanged);
|
|
84
|
+
const resourceRouter = new ResourceRouter({
|
|
85
|
+
live: liveClient,
|
|
86
|
+
pingCache,
|
|
87
|
+
projectPath,
|
|
88
|
+
port,
|
|
89
|
+
});
|
|
90
|
+
// M18 Plan 2 / T18.2.2 — ListTools filters per the session's active groups.
|
|
91
|
+
// A fresh session sees only `core` + always-visible meta-tools (capabilities,
|
|
92
|
+
// manage_tools, ping, ...). Activating a group via manage_tools adds its
|
|
93
|
+
// tools to subsequent ListTools responses in the same session.
|
|
94
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
95
|
+
tools: filterVisibleTools(ALL_TOOLS, sessionState),
|
|
96
|
+
}));
|
|
97
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
98
|
+
const { name, arguments: args } = request.params;
|
|
99
|
+
const callArgs = (args ?? {});
|
|
100
|
+
// Fill missing top-level scalar defaults (e.g. timeout_ms) from the
|
|
101
|
+
// tool's documented schema. MCP clients may omit these; without this
|
|
102
|
+
// step every downstream layer falls back to its own hardcoded value and
|
|
103
|
+
// silently contradicts the schema (historically 30s vs run_tests' 60s).
|
|
104
|
+
const tool = TOOL_BY_NAME.get(name);
|
|
105
|
+
const routedArgs = tool ? withSchemaDefaults(tool, callArgs) : callArgs;
|
|
106
|
+
return router.route(name, routedArgs);
|
|
107
|
+
});
|
|
108
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
109
|
+
resources: ALL_RESOURCES,
|
|
110
|
+
}));
|
|
111
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
112
|
+
const { uri } = request.params;
|
|
113
|
+
return resourceRouter.read(uri);
|
|
114
|
+
});
|
|
115
|
+
return server;
|
|
116
|
+
}
|
|
117
|
+
async function main() {
|
|
118
|
+
// M15 T6.1 — CLI dispatch. When argv[0] is a known subcommand (ping,
|
|
119
|
+
// wait-for-ready, status, run-tool) or an explicit --help/--version, run
|
|
120
|
+
// the thin CLI and exit. Otherwise fall through to the stdio MCP server so
|
|
121
|
+
// a single `bin` works for both MCP clients and scripting.
|
|
122
|
+
const firstArg = process.argv[2];
|
|
123
|
+
const looksLikeCli = firstArg !== undefined &&
|
|
124
|
+
(KNOWN_COMMANDS.includes(firstArg) ||
|
|
125
|
+
firstArg === "--help" ||
|
|
126
|
+
firstArg === "-h" ||
|
|
127
|
+
firstArg === "--version" ||
|
|
128
|
+
firstArg === "-V");
|
|
129
|
+
if (looksLikeCli) {
|
|
130
|
+
const outcome = await runCli({ version: PACKAGE_VERSION });
|
|
131
|
+
if (outcome.handled) {
|
|
132
|
+
process.exit(outcome.exitCode);
|
|
133
|
+
}
|
|
134
|
+
// runCli only returns handled:false when argv had no recognized command;
|
|
135
|
+
// in that case fall through to the stdio server below.
|
|
136
|
+
}
|
|
137
|
+
const { port, projectPath, authToken } = getEnv();
|
|
138
|
+
const server = createServer(projectPath, port, authToken);
|
|
139
|
+
const transport = new StdioServerTransport();
|
|
140
|
+
await server.connect(transport);
|
|
141
|
+
}
|
|
142
|
+
main().catch((err) => {
|
|
143
|
+
console.error("unity-open-mcp fatal:", err);
|
|
144
|
+
process.exit(1);
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
export declare const PORT_RANGE_START = 20000;
|
|
2
|
+
export declare const PORT_RANGE_SIZE = 10000;
|
|
3
|
+
/** Editor state values the bridge writes into its lock / heartbeat file. */
|
|
4
|
+
export type InstanceState = "idle" | "compiling" | "reloading" | "entering_playmode" | "playing" | "exiting_playmode";
|
|
5
|
+
/** Shape of ~/.unity-open-mcp/instances/<hash>.json (bridge BridgeInstanceLock). */
|
|
6
|
+
export interface InstanceLock {
|
|
7
|
+
pid: number;
|
|
8
|
+
port: number;
|
|
9
|
+
/** M14 — per-session bearer token. Optional for back-compat with locks
|
|
10
|
+
* written by older bridges; when absent the MCP client sends no header
|
|
11
|
+
* (authMode "none" accepts that). */
|
|
12
|
+
authToken?: string;
|
|
13
|
+
projectPath: string;
|
|
14
|
+
projectHash: string;
|
|
15
|
+
startedAt: string;
|
|
16
|
+
updatedAt: string;
|
|
17
|
+
heartbeatAt: string;
|
|
18
|
+
state: InstanceState;
|
|
19
|
+
isPlaying: boolean;
|
|
20
|
+
isCompiling: boolean;
|
|
21
|
+
bridgeVersion: string;
|
|
22
|
+
unityVersion: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Path normalization applied BEFORE hashing. Mirrors
|
|
26
|
+
* InstancePortResolver.NormalizePath in the bridge:
|
|
27
|
+
* - backslashes -> forward slashes (Windows paths hash the same cross-platform)
|
|
28
|
+
* - trailing slashes trimmed
|
|
29
|
+
* No lowercasing — macOS/Linux paths are case-sensitive.
|
|
30
|
+
*/
|
|
31
|
+
export declare function normalizePath(projectPath: string): string;
|
|
32
|
+
/** Lowercase hex SHA256 of the normalized project path. */
|
|
33
|
+
export declare function projectHash(projectPath: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Deterministic port for a project path: 20000 + (sha256(path) % 10000).
|
|
36
|
+
* Uses the first 8 bytes of the hash as a BigInt so the modulo matches the
|
|
37
|
+
* C# UInt64 computation exactly.
|
|
38
|
+
*/
|
|
39
|
+
export declare function computePort(projectPath: string): number;
|
|
40
|
+
/** Directory holding one lock file per running bridge instance. */
|
|
41
|
+
export declare function instancesDir(): string;
|
|
42
|
+
/** Path to this project's instance lock file. */
|
|
43
|
+
export declare function lockPath(projectPath: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Read this project's instance lock from disk. Returns null if the file is
|
|
46
|
+
* missing, unreadable, or doesn't parse. Never throws — the caller falls
|
|
47
|
+
* through to the deterministic hash on any failure.
|
|
48
|
+
*/
|
|
49
|
+
export declare function readInstanceLock(projectPath: string): InstanceLock | null;
|
|
50
|
+
/**
|
|
51
|
+
* kill -0 equivalent. Returns true if a process with the given pid exists.
|
|
52
|
+
* Wrapped in try/catch: EPERM (exists but can't be probed) → true,
|
|
53
|
+
* ESRCH (no such process) → false. Mirrors the C# Process.GetProcessById
|
|
54
|
+
* logic in BridgeInstanceLock.IsPidAlive.
|
|
55
|
+
*/
|
|
56
|
+
export declare function isPidAlive(pid: number): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Resolve the bridge port for a project, with override precedence:
|
|
59
|
+
* 1. explicit envPort (already parsed + validated by the caller)
|
|
60
|
+
* 2. live instance lock's port (only when its pid is alive)
|
|
61
|
+
* 3. deterministic hash
|
|
62
|
+
*
|
|
63
|
+
* @param projectPath absolute Unity project root
|
|
64
|
+
* @param envPort parsed UNITY_OPEN_MCP_BRIDGE_PORT, or undefined
|
|
65
|
+
*/
|
|
66
|
+
export declare function resolvePort(projectPath: string, envPort?: number): number;
|
|
67
|
+
/**
|
|
68
|
+
* M14 — Resolve the bridge's per-session bearer token for a project.
|
|
69
|
+
*
|
|
70
|
+
* The token is only discoverable from a live instance lock (the same file we
|
|
71
|
+
* read the port from). When an explicit env port override is in use there is
|
|
72
|
+
* no lock file to read, so this returns undefined — in that case the MCP
|
|
73
|
+
* client sends no Authorization header and the bridge must be in authMode
|
|
74
|
+
* "none" for the request to succeed. Returns undefined when the lock is
|
|
75
|
+
* missing, stale (dead pid), or predates the token field.
|
|
76
|
+
*
|
|
77
|
+
* @param projectPath absolute Unity project root
|
|
78
|
+
* @param envPort parsed UNITY_OPEN_MCP_BRIDGE_PORT, or undefined. When set,
|
|
79
|
+
* skips the lock read (no token to discover).
|
|
80
|
+
*/
|
|
81
|
+
export declare function resolveAuthToken(projectPath: string, envPort?: number): string | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* A heartbeat is considered "stale" once it is this many milliseconds old.
|
|
84
|
+
* The bridge writes every 0.5s (BridgeHeartbeat.HeartbeatIntervalSec), so
|
|
85
|
+
* anything older than a few seconds means the heartbeat writer is no longer
|
|
86
|
+
* running. The threshold is generous to absorb a slow domain reload + ILPP
|
|
87
|
+
* pass without a false "dead" classification.
|
|
88
|
+
*/
|
|
89
|
+
export declare const HEARTBEAT_STALE_MS = 10000;
|
|
90
|
+
/**
|
|
91
|
+
* Coarse health classification of a bridge instance derived from its on-disk
|
|
92
|
+
* lock. Used by the live-client to decide whether a /ping failure is
|
|
93
|
+
* recoverable (keep waiting) or fatal (fail fast).
|
|
94
|
+
*
|
|
95
|
+
* - "healthy" — lock fresh and PID alive; bridge is (or just was) up.
|
|
96
|
+
* - "reloading" — lock fresh + state="reloading" + PID alive; a normal
|
|
97
|
+
* domain reload in flight, expected to recover.
|
|
98
|
+
* - "dead_bridge" — PID alive BUT heartbeat is stale. The Unity process is
|
|
99
|
+
* running but the bridge's heartbeat writer is gone — the
|
|
100
|
+
* signature of a bridge assembly that failed to recompile.
|
|
101
|
+
* /ping will not recover until the C# error is fixed.
|
|
102
|
+
* - "gone" — no lock, or PID no longer alive. No live instance.
|
|
103
|
+
*/
|
|
104
|
+
export type InstanceClassification = "healthy" | "reloading" | "dead_bridge" | "gone";
|
|
105
|
+
/**
|
|
106
|
+
* Age of the lock's heartbeat in milliseconds, measured against `nowMs`.
|
|
107
|
+
* Returns `Infinity` when the heartbeat timestamp is missing or unparseable,
|
|
108
|
+
* so a malformed lock is treated as maximally stale (and thus, if the PID is
|
|
109
|
+
* alive, "dead_bridge").
|
|
110
|
+
*/
|
|
111
|
+
export declare function heartbeatAgeMs(lock: InstanceLock | null, nowMs?: number): number;
|
|
112
|
+
/**
|
|
113
|
+
* Classify a bridge instance from its on-disk lock. `lock` may be null (no
|
|
114
|
+
* lock file / unreadable) — treated as "gone". This is a pure function over
|
|
115
|
+
* the lock snapshot + current time + PID liveness; it does no I/O of its own.
|
|
116
|
+
*/
|
|
117
|
+
export declare function classifyInstance(lock: InstanceLock | null, nowMs?: number): InstanceClassification;
|