summer-engine 3.7.0 → 4.0.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/.claude-plugin/marketplace.json +2 -13
- package/.claude-plugin/plugin.json +25 -22
- package/.codex-plugin/plugin.json +8 -14
- package/.cursor-plugin/plugin.json +7 -13
- package/.factory-plugin/plugin.json +7 -13
- package/AGENTS.md +19 -12
- package/CHANGELOG.md +112 -0
- package/GEMINI.md +3 -3
- package/README.md +111 -31
- package/assets/icon.png +0 -0
- package/commands/start.md +71 -0
- package/commands/summer.md +5 -3
- package/dist/cli/banner.js +3 -0
- package/dist/cli/commands/login.d.ts +27 -0
- package/dist/cli/commands/login.js +58 -12
- package/dist/cli/commands/ops.d.ts +47 -0
- package/dist/cli/commands/ops.js +301 -0
- package/dist/cli/commands/setup.d.ts +2 -0
- package/dist/cli/commands/setup.js +37 -12
- package/dist/cli/commands/skills.js +11 -7
- package/dist/cli/index.js +7 -0
- package/dist/core/agent-host.d.ts +65 -0
- package/dist/core/agent-host.js +193 -0
- package/dist/core/capabilities/agent-playbook.d.ts +3 -0
- package/dist/core/capabilities/agent-playbook.js +54 -2
- package/dist/core/capabilities/apps.d.ts +341 -0
- package/dist/core/capabilities/apps.js +353 -0
- package/dist/core/capabilities/doctor.d.ts +3 -0
- package/dist/core/capabilities/doctor.js +20 -15
- package/dist/core/capabilities/enable-plugin.d.ts +27 -0
- package/dist/core/capabilities/enable-plugin.js +75 -0
- package/dist/core/capabilities/fabricate-mesh.d.ts +2 -2
- package/dist/core/capabilities/game-task-plan.d.ts +12 -6
- package/dist/core/capabilities/game-task-plan.js +80 -5
- package/dist/core/capabilities/motion-generation.js +2 -2
- package/dist/core/capabilities/navigation/open.d.ts +6 -2
- package/dist/core/capabilities/navigation/open.js +3 -0
- package/dist/core/capabilities/publish-build.js +2 -0
- package/dist/core/capabilities/runtime-control.d.ts +4 -4
- package/dist/core/capabilities/scene-script-target.d.ts +17 -0
- package/dist/core/capabilities/scene-script-target.js +70 -0
- package/dist/core/capabilities/sfx-choices.d.ts +4 -0
- package/dist/core/capabilities/sfx-choices.js +13 -6
- package/dist/core/capabilities/tool-dispatch.d.ts +12 -3
- package/dist/core/capabilities/tool-dispatch.js +130 -46
- package/dist/core/capability-skew.js +4 -0
- package/dist/core/embeddings.d.ts +2 -0
- package/dist/core/embeddings.js +1 -1
- package/dist/core/error-codes.d.ts +62 -0
- package/dist/core/error-codes.js +97 -0
- package/dist/core/format.d.ts +2 -0
- package/dist/core/format.js +2 -1
- package/dist/core/hosted-mcp.d.ts +22 -0
- package/dist/core/hosted-mcp.js +56 -1
- package/dist/core/library-read.js +5 -0
- package/dist/core/library-search.js +2 -1
- package/dist/core/oauth.js +4 -0
- package/dist/core/ops/catalog.d.ts +41 -0
- package/dist/core/ops/catalog.js +145 -0
- package/dist/core/ops/cloud.d.ts +56 -0
- package/dist/core/ops/cloud.js +175 -0
- package/dist/core/ops/contract.d.ts +119 -0
- package/dist/core/ops/contract.js +142 -0
- package/dist/core/ops/engine-answer.d.ts +25 -0
- package/dist/core/ops/engine-answer.js +117 -0
- package/dist/core/ops/engine.d.ts +55 -0
- package/dist/core/ops/engine.js +649 -0
- package/dist/core/ops/save-files.d.ts +78 -0
- package/dist/core/ops/save-files.js +419 -0
- package/dist/core/ops/search.d.ts +9 -0
- package/dist/core/ops/search.js +55 -0
- package/dist/core/skills-registry.d.ts +16 -1
- package/dist/core/skills-registry.js +35 -2
- package/dist/core/telemetry.d.ts +32 -0
- package/dist/core/telemetry.js +38 -10
- package/dist/core/tool-profiles.d.ts +25 -0
- package/dist/core/tool-profiles.js +41 -0
- package/dist/installer/agent-config.d.ts +17 -4
- package/dist/installer/agent-config.js +22 -6
- package/dist/installer/agent-table.d.ts +3 -0
- package/dist/installer/agent-table.js +10 -7
- package/dist/installer/setup.d.ts +2 -0
- package/dist/installer/setup.js +9 -4
- package/dist/installer/version-check.d.ts +29 -9
- package/dist/installer/version-check.js +81 -28
- package/dist/mcp/command.js +7 -0
- package/dist/mcp/hosted-mount.d.ts +27 -2
- package/dist/mcp/hosted-mount.js +66 -24
- package/dist/mcp/legacy-toolset.d.ts +27 -0
- package/dist/mcp/legacy-toolset.js +43 -0
- package/dist/mcp/ops-surface.d.ts +59 -0
- package/dist/mcp/ops-surface.js +443 -0
- package/dist/mcp/server.d.ts +35 -11
- package/dist/mcp/server.js +236 -89
- package/dist/mcp/tool-results.d.ts +26 -0
- package/dist/mcp/tool-results.js +81 -0
- package/dist/mcp/tool-surface.d.ts +65 -0
- package/dist/mcp/tool-surface.js +317 -0
- package/dist/mcp/tools/app-tools.d.ts +2 -0
- package/dist/mcp/tools/app-tools.js +71 -0
- package/dist/mcp/tools/asset-tools.js +55 -53
- package/dist/mcp/tools/audit-tools.js +21 -21
- package/dist/mcp/tools/debug-tools.js +6 -6
- package/dist/mcp/tools/fabricate-tools.js +6 -6
- package/dist/mcp/tools/generate-tools.js +76 -70
- package/dist/mcp/tools/project-tools.d.ts +9 -4
- package/dist/mcp/tools/project-tools.js +16 -10
- package/dist/mcp/tools/scene-tools.js +12 -23
- package/dist/mcp/tools/script-tools.js +9 -5
- package/dist/mcp/tools/with-engine.d.ts +6 -0
- package/dist/mcp/tools/with-engine.js +19 -0
- package/gemini-extension.json +6 -12
- package/hooks/pre-commit-doctor.sh +5 -4
- package/hooks/session-start.sh +24 -28
- package/integrations/claude-desktop/README.md +1 -1
- package/integrations/copilot-jetbrains/README.md +1 -1
- package/integrations/junie/README.md +1 -1
- package/integrations/lm-studio/README.md +1 -1
- package/integrations/trae/README.md +1 -1
- package/integrations/visual-studio/README.md +1 -1
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +85 -35
- package/library/references/mcp-tools-reference/resource.yaml +1 -1
- package/library/references/product-map/resource.yaml +2 -2
- package/library/skills/3d-lighting/SKILL.md +53 -28
- package/library/skills/3d-lighting/resource.yaml +1 -1
- package/library/skills/README.md +126 -116
- package/library/skills/adaptive-music/SKILL.md +19 -23
- package/library/skills/adaptive-music/resource.yaml +1 -1
- package/library/skills/agent-playtesting/SKILL.md +1 -1
- package/library/skills/agent-playtesting/resource.yaml +1 -1
- package/library/skills/ai-characters-in-games/SKILL.md +1 -1
- package/library/skills/ai-characters-in-games/resource.yaml +1 -1
- package/library/skills/ambient-bed/SKILL.md +22 -13
- package/library/skills/ambient-bed/resource.yaml +1 -1
- package/library/skills/animated-loop/SKILL.md +41 -32
- package/library/skills/animated-loop/resource.yaml +1 -1
- package/library/skills/animation-tree/SKILL.md +1 -1
- package/library/skills/animation-tree/resource.yaml +1 -1
- package/library/skills/art-direction/SKILL.md +3 -3
- package/library/skills/art-direction/resource.yaml +1 -1
- package/library/skills/asset-strategy/SKILL.md +21 -4
- package/library/skills/asset-strategy/resource.yaml +2 -1
- package/library/skills/audio-direction/SKILL.md +10 -10
- package/library/skills/audio-direction/resource.yaml +1 -1
- package/library/skills/auto-fire-targeting/SKILL.md +1 -1
- package/library/skills/auto-fire-targeting/resource.yaml +1 -1
- package/library/skills/bounded-engine-runs/SKILL.md +1 -1
- package/library/skills/bounded-engine-runs/resource.yaml +1 -1
- package/library/skills/brainstorm-game/SKILL.md +1 -1
- package/library/skills/brainstorm-game/resource.yaml +1 -1
- package/library/skills/brainstorming/SKILL.md +1 -1
- package/library/skills/brainstorming/resource.yaml +1 -1
- package/library/skills/browse-templates/SKILL.md +1 -1
- package/library/skills/browse-templates/resource.yaml +1 -1
- package/library/skills/camera-rigs/SKILL.md +2 -2
- package/library/skills/camera-rigs/resource.yaml +1 -1
- package/library/skills/celeste-momentum-platforming/resource.yaml +1 -0
- package/library/skills/character-animation-wiring/SKILL.md +4 -4
- package/library/skills/character-animation-wiring/resource.yaml +1 -1
- package/library/skills/character-model/SKILL.md +55 -47
- package/library/skills/character-model/resource.yaml +1 -1
- package/library/skills/character-movement/SKILL.md +3 -3
- package/library/skills/character-movement/resource.yaml +1 -1
- package/library/skills/character-portrait/SKILL.md +24 -19
- package/library/skills/character-portrait/resource.yaml +1 -1
- package/library/skills/cinematic-cutscene/SKILL.md +58 -46
- package/library/skills/cinematic-cutscene/resource.yaml +1 -1
- package/library/skills/combat-basics/SKILL.md +1 -1
- package/library/skills/combat-basics/resource.yaml +1 -1
- package/library/skills/compatibility-renderer-traps/SKILL.md +1 -1
- package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
- package/library/skills/concept-art/SKILL.md +16 -12
- package/library/skills/concept-art/resource.yaml +1 -1
- package/library/skills/concept-to-level/SKILL.md +239 -0
- package/library/skills/concept-to-level/references/technical-rules.md +150 -0
- package/library/skills/concept-to-level/resource.yaml +44 -0
- package/library/skills/create-asset-sheet/SKILL.md +19 -13
- package/library/skills/create-asset-sheet/resource.yaml +1 -1
- package/library/skills/debug/SKILL.md +2 -2
- package/library/skills/debug/resource.yaml +1 -1
- package/library/skills/debugging-game-feel/SKILL.md +1 -1
- package/library/skills/debugging-game-feel/resource.yaml +1 -1
- package/library/skills/design-level/SKILL.md +23 -35
- package/library/skills/design-level/resource.yaml +1 -1
- package/library/skills/design-mechanic/SKILL.md +1 -1
- package/library/skills/design-mechanic/resource.yaml +1 -1
- package/library/skills/design-npc/SKILL.md +22 -24
- package/library/skills/design-npc/resource.yaml +1 -1
- package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
- package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
- package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
- package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
- package/library/skills/environment-kit/SKILL.md +20 -16
- package/library/skills/environment-kit/resource.yaml +1 -1
- package/library/skills/export-and-ship/SKILL.md +6 -6
- package/library/skills/export-and-ship/resource.yaml +1 -1
- package/library/skills/fabricating-assets/SKILL.md +7 -7
- package/library/skills/fabricating-assets/resource.yaml +3 -3
- package/library/skills/facial-and-lipsync/SKILL.md +14 -15
- package/library/skills/facial-and-lipsync/resource.yaml +1 -1
- package/library/skills/fps-controller/SKILL.md +33 -41
- package/library/skills/fps-controller/resource.yaml +1 -1
- package/library/skills/game-feel/SKILL.md +8 -8
- package/library/skills/game-feel/resource.yaml +1 -1
- package/library/skills/gameskill/SKILL.md +4 -4
- package/library/skills/gameskill/resource.yaml +1 -1
- package/library/skills/gdscript-patterns/SKILL.md +1 -1
- package/library/skills/gdscript-patterns/resource.yaml +1 -1
- package/library/skills/generate-motion/SKILL.md +30 -21
- package/library/skills/generate-motion/resource.yaml +1 -1
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
- package/library/skills/grow-analytics/SKILL.md +3 -3
- package/library/skills/grow-analytics/resource.yaml +1 -1
- package/library/skills/headless-scripting/SKILL.md +1 -1
- package/library/skills/headless-scripting/resource.yaml +1 -1
- package/library/skills/in-game-purchases/SKILL.md +1 -1
- package/library/skills/in-game-purchases/resource.yaml +1 -1
- package/library/skills/instantiate-asset-pack/SKILL.md +2 -2
- package/library/skills/instantiate-asset-pack/resource.yaml +1 -1
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +1 -0
- package/library/skills/make-game/SKILL.md +4 -4
- package/library/skills/make-game/references/2d-platformer.md +1 -1
- package/library/skills/make-game/references/3d-fps.md +1 -1
- package/library/skills/make-game/references/3d-horror.md +1 -1
- package/library/skills/make-game/references/3d-third-person.md +2 -2
- package/library/skills/make-game/resource.yaml +1 -1
- package/library/skills/multiplayer/SKILL.md +1 -1
- package/library/skills/multiplayer/resource.yaml +1 -1
- package/library/skills/multiplayer-movement/SKILL.md +1 -1
- package/library/skills/multiplayer-movement/resource.yaml +1 -1
- package/library/skills/multiplayer-project/SKILL.md +1 -1
- package/library/skills/multiplayer-project/resource.yaml +1 -1
- package/library/skills/multiplayer-publish/SKILL.md +8 -7
- package/library/skills/multiplayer-publish/resource.yaml +3 -3
- package/library/skills/multiplayer-state/SKILL.md +1 -1
- package/library/skills/multiplayer-state/resource.yaml +1 -1
- package/library/skills/multiplayer-testing/SKILL.md +1 -1
- package/library/skills/multiplayer-testing/resource.yaml +1 -1
- package/library/skills/music-track/SKILL.md +22 -13
- package/library/skills/music-track/resource.yaml +1 -1
- package/library/skills/navigate-summer/SKILL.md +11 -9
- package/library/skills/navigate-summer/resource.yaml +1 -1
- package/library/skills/new-project/SKILL.md +1 -1
- package/library/skills/new-project/resource.yaml +1 -1
- package/library/skills/organic-model/SKILL.md +24 -18
- package/library/skills/organic-model/resource.yaml +1 -1
- package/library/skills/pixel-art/SKILL.md +27 -23
- package/library/skills/pixel-art/resource.yaml +1 -1
- package/library/skills/play/SKILL.md +1 -1
- package/library/skills/play/resource.yaml +1 -1
- package/library/skills/playtesting-a-feature/SKILL.md +1 -1
- package/library/skills/playtesting-a-feature/resource.yaml +1 -1
- package/library/skills/procedural-animation/SKILL.md +20 -16
- package/library/skills/procedural-animation/resource.yaml +1 -1
- package/library/skills/prop-model/SKILL.md +25 -19
- package/library/skills/prop-model/resource.yaml +1 -1
- package/library/skills/psx-retro-rendering/resource.yaml +1 -0
- package/library/skills/publish-your-game/SKILL.md +16 -6
- package/library/skills/publish-your-game/resource.yaml +3 -3
- package/library/skills/realtime-wet-surfaces/resource.yaml +1 -0
- package/library/skills/release-readiness/SKILL.md +1 -1
- package/library/skills/release-readiness/resource.yaml +1 -1
- package/library/skills/remote-deploy/SKILL.md +1 -1
- package/library/skills/remote-deploy/resource.yaml +1 -1
- package/library/skills/retarget/SKILL.md +23 -20
- package/library/skills/retarget/resource.yaml +1 -1
- package/library/skills/running-in-the-cloud/SKILL.md +1 -1
- package/library/skills/running-in-the-cloud/resource.yaml +1 -1
- package/library/skills/save-load/SKILL.md +1 -1
- package/library/skills/save-load/resource.yaml +1 -1
- package/library/skills/scene-composition/SKILL.md +1 -1
- package/library/skills/scene-composition/resource.yaml +1 -1
- package/library/skills/scene-hierarchy-design/SKILL.md +2 -2
- package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
- package/library/skills/scene-scripting/SKILL.md +66 -636
- package/library/skills/scene-scripting/references/ctx-api.md +184 -0
- package/library/skills/scene-scripting/references/recipes-2d-ui.md +193 -0
- package/library/skills/scene-scripting/references/recipes-3d.md +280 -0
- package/library/skills/scene-scripting/resource.yaml +4 -4
- package/library/skills/scene-to-level/SKILL.md +2 -2
- package/library/skills/scene-to-level/resource.yaml +1 -1
- package/library/skills/skill-create/resource.yaml +1 -0
- package/library/skills/skill-improve/resource.yaml +1 -0
- package/library/skills/skill-test/SKILL.md +2 -2
- package/library/skills/skill-test/resource.yaml +1 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +1 -0
- package/library/skills/skybox-panorama/SKILL.md +27 -21
- package/library/skills/skybox-panorama/resource.yaml +1 -1
- package/library/skills/sound-effect/SKILL.md +31 -20
- package/library/skills/sound-effect/resource.yaml +1 -1
- package/library/skills/spatial-placement/SKILL.md +14 -9
- package/library/skills/spatial-placement/resource.yaml +1 -1
- package/library/skills/sprite-sheet/SKILL.md +32 -27
- package/library/skills/sprite-sheet/resource.yaml +1 -1
- package/library/skills/store-art/SKILL.md +3 -3
- package/library/skills/store-art/resource.yaml +2 -2
- package/library/skills/store-listing/SKILL.md +3 -3
- package/library/skills/store-listing/resource.yaml +2 -2
- package/library/skills/summer-analytics/SKILL.md +7 -5
- package/library/skills/summer-analytics/resource.yaml +2 -2
- package/library/skills/summer-apps/SKILL.md +168 -0
- package/library/skills/summer-apps/manifest.md +57 -0
- package/library/skills/summer-apps/minimal-app.md +183 -0
- package/library/skills/summer-apps/resource.yaml +36 -0
- package/library/skills/summer-apps/sdk-reference.md +135 -0
- package/library/skills/summer-apps-design/SKILL.md +197 -0
- package/library/skills/summer-apps-design/resource.yaml +23 -0
- package/library/skills/summer-assets/SKILL.md +56 -0
- package/library/skills/summer-assets/resource.yaml +34 -0
- package/library/skills/summer-store/SKILL.md +1 -1
- package/library/skills/text-to-motion/SKILL.md +30 -23
- package/library/skills/text-to-motion/prompts-and-controls.md +5 -5
- package/library/skills/text-to-motion/resource.yaml +1 -1
- package/library/skills/text-to-motion/rigging-for-text-motion.md +2 -2
- package/library/skills/tileable-texture/SKILL.md +19 -15
- package/library/skills/tileable-texture/resource.yaml +1 -1
- package/library/skills/trailer-shot/SKILL.md +28 -24
- package/library/skills/trailer-shot/resource.yaml +1 -1
- package/library/skills/tune-performance/SKILL.md +6 -6
- package/library/skills/tune-performance/resource.yaml +1 -1
- package/library/skills/ui-basics/SKILL.md +41 -36
- package/library/skills/ui-basics/resource.yaml +1 -1
- package/library/skills/ui-graphics/SKILL.md +47 -38
- package/library/skills/ui-graphics/resource.yaml +1 -1
- package/library/skills/use-widget-asset/SKILL.md +1 -1
- package/library/skills/use-widget-asset/resource.yaml +1 -1
- package/library/skills/using-summer/SKILL.md +7 -5
- package/library/skills/using-summer/resource.yaml +1 -1
- package/library/skills/vehicle-model/SKILL.md +65 -57
- package/library/skills/vehicle-model/resource.yaml +1 -1
- package/library/skills/verification-before-completion/SKILL.md +1 -1
- package/library/skills/verification-before-completion/resource.yaml +1 -1
- package/library/skills/verifying-scenes/SKILL.md +2 -2
- package/library/skills/verifying-scenes/resource.yaml +1 -1
- package/library/skills/vfx-dissolve/SKILL.md +2 -2
- package/library/skills/vfx-dissolve/resource.yaml +1 -1
- package/library/skills/vfx-fire/SKILL.md +15 -41
- package/library/skills/vfx-fire/resource.yaml +1 -1
- package/library/skills/vfx-hit-spark/SKILL.md +1 -1
- package/library/skills/vfx-hit-spark/resource.yaml +1 -1
- package/library/skills/vfx-lightning/SKILL.md +7 -16
- package/library/skills/vfx-lightning/resource.yaml +1 -1
- package/library/skills/vfx-magic-glow/SKILL.md +23 -32
- package/library/skills/vfx-magic-glow/resource.yaml +1 -1
- package/library/skills/vfx-muzzle-flash/SKILL.md +20 -35
- package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
- package/library/skills/vfx-smoke/SKILL.md +13 -31
- package/library/skills/vfx-smoke/resource.yaml +1 -1
- package/library/skills/vfx-water-ripple/SKILL.md +12 -31
- package/library/skills/vfx-water-ripple/resource.yaml +1 -1
- package/library/skills/voice-line/SKILL.md +71 -40
- package/library/skills/voice-line/resource.yaml +1 -1
- package/library/skills/web-and-touch-input/SKILL.md +1 -1
- package/library/skills/web-and-touch-input/resource.yaml +1 -1
- package/library/skills/web-compatibility-look/SKILL.md +1 -1
- package/library/skills/web-compatibility-look/resource.yaml +1 -1
- package/library/skills/world-building-3d/SKILL.md +1 -1
- package/library/skills/world-building-3d/resource.yaml +1 -1
- package/library/skills/writing-skills/resource.yaml +1 -0
- package/library/tools/add-node/GUIDE.md +14 -0
- package/library/tools/align-distribute-3d/GUIDE.md +7 -0
- package/library/tools/app-call/resource.yaml +59 -0
- package/library/tools/app-create/resource.yaml +67 -0
- package/library/tools/app-data/resource.yaml +74 -0
- package/library/tools/app-dock/resource.yaml +59 -0
- package/library/tools/app-events/resource.yaml +68 -0
- package/library/tools/app-get/resource.yaml +46 -0
- package/library/tools/app-guide/resource.yaml +55 -0
- package/library/tools/app-list/resource.yaml +48 -0
- package/library/tools/app-page/resource.yaml +74 -0
- package/library/tools/app-publish/resource.yaml +90 -0
- package/library/tools/app-report-gap/resource.yaml +58 -0
- package/library/tools/app-screenshot/resource.yaml +103 -0
- package/library/tools/app-tools/resource.yaml +46 -0
- package/library/tools/app-update/resource.yaml +68 -0
- package/library/tools/attach-to-surface/GUIDE.md +15 -0
- package/library/tools/batch/GUIDE.md +27 -0
- package/library/tools/camera-bookmark/GUIDE.md +12 -0
- package/library/tools/capture-gameplay/GUIDE.md +3 -0
- package/library/tools/capture-gameplay/resource.yaml +3 -3
- package/library/tools/check-job/resource.yaml +1 -1
- package/library/tools/clear-console/GUIDE.md +3 -0
- package/library/tools/connect-ports/GUIDE.md +9 -0
- package/library/tools/connect-signal/GUIDE.md +14 -0
- package/library/tools/create-debug-report/GUIDE.md +10 -0
- package/library/tools/create-scene/GUIDE.md +10 -0
- package/library/tools/debug-views/GUIDE.md +7 -0
- package/library/tools/enable-plugin/GUIDE.md +3 -0
- package/library/tools/enable-plugin/resource.yaml +53 -0
- package/library/tools/export-game/GUIDE.md +3 -0
- package/library/tools/export-game/resource.yaml +3 -3
- package/library/tools/export-templates/GUIDE.md +3 -0
- package/library/tools/fabricate-3d/GUIDE.md +19 -0
- package/library/tools/frame-nodes/GUIDE.md +9 -0
- package/library/tools/frame-shot/GUIDE.md +9 -0
- package/library/tools/game-control/GUIDE.md +9 -0
- package/library/tools/game-input/GUIDE.md +9 -0
- package/library/tools/game-probe/GUIDE.md +9 -0
- package/library/tools/generate-3d/resource.yaml +3 -3
- package/library/tools/generate-motion/resource.yaml +2 -2
- package/library/tools/get-console/GUIDE.md +9 -0
- package/library/tools/get-console/resource.yaml +5 -0
- package/library/tools/get-debugger-errors/GUIDE.md +7 -0
- package/library/tools/get-debugger-errors/resource.yaml +5 -0
- package/library/tools/get-debugger-warnings/GUIDE.md +7 -0
- package/library/tools/get-debugger-warnings/resource.yaml +5 -0
- package/library/tools/get-diagnostics/GUIDE.md +13 -0
- package/library/tools/get-project-context/GUIDE.md +25 -0
- package/library/tools/get-runtime-tree/GUIDE.md +7 -0
- package/library/tools/get-runtime-tree/resource.yaml +5 -0
- package/library/tools/get-scene-tree/GUIDE.md +11 -0
- package/library/tools/get-scene-tree/resource.yaml +5 -0
- package/library/tools/get-script-errors/GUIDE.md +5 -0
- package/library/tools/grep/GUIDE.md +11 -0
- package/library/tools/import-asset/GUIDE.md +8 -0
- package/library/tools/import-asset-by-id/GUIDE.md +12 -0
- package/library/tools/import-from-url/GUIDE.md +10 -0
- package/library/tools/import-from-url-batch/GUIDE.md +3 -0
- package/library/tools/import-hdri/GUIDE.md +16 -0
- package/library/tools/input-map-bind/GUIDE.md +11 -0
- package/library/tools/inspect-asset/GUIDE.md +14 -0
- package/library/tools/inspect-asset/resource.yaml +5 -0
- package/library/tools/inspect-node/GUIDE.md +11 -0
- package/library/tools/inspect-node/resource.yaml +5 -0
- package/library/tools/inspect-resource/GUIDE.md +7 -0
- package/library/tools/inspect-resource/resource.yaml +5 -0
- package/library/tools/inspect-runtime-node/GUIDE.md +7 -0
- package/library/tools/inspect-runtime-node/resource.yaml +5 -0
- package/library/tools/instantiate-scene/GUIDE.md +12 -0
- package/library/tools/is-running/GUIDE.md +3 -0
- package/library/tools/measure/GUIDE.md +8 -0
- package/library/tools/navigation-probe/GUIDE.md +9 -0
- package/library/tools/open/resource.yaml +2 -2
- package/library/tools/open-main-scene/GUIDE.md +6 -0
- package/library/tools/open-scene/GUIDE.md +8 -0
- package/library/tools/place-adjacent/GUIDE.md +7 -0
- package/library/tools/play/GUIDE.md +13 -0
- package/library/tools/project-setting/GUIDE.md +9 -0
- package/library/tools/publish-build/resource.yaml +6 -6
- package/library/tools/raycast/GUIDE.md +7 -0
- package/library/tools/read-file/GUIDE.md +10 -0
- package/library/tools/read-library/resource.yaml +5 -0
- package/library/tools/recent-events/GUIDE.md +7 -0
- package/library/tools/remove-node/GUIDE.md +3 -0
- package/library/tools/repeat-along/GUIDE.md +5 -0
- package/library/tools/replace-node/GUIDE.md +9 -0
- package/library/tools/replace-text/GUIDE.md +5 -0
- package/library/tools/run-editor-script/GUIDE.md +16 -0
- package/library/tools/run-script/GUIDE.md +30 -0
- package/library/tools/run-script/resource.yaml +6 -3
- package/library/tools/runtime-animate/GUIDE.md +7 -0
- package/library/tools/runtime-call/GUIDE.md +7 -0
- package/library/tools/runtime-set/GUIDE.md +9 -0
- package/library/tools/runtime-spawn/GUIDE.md +9 -0
- package/library/tools/save-scene/GUIDE.md +3 -0
- package/library/tools/scene-audit/GUIDE.md +29 -0
- package/library/tools/screenshot/GUIDE.md +17 -0
- package/library/tools/select-node/GUIDE.md +3 -0
- package/library/tools/set-prop/GUIDE.md +23 -0
- package/library/tools/set-resource-property/GUIDE.md +8 -0
- package/library/tools/shot-sheet/GUIDE.md +7 -0
- package/library/tools/snap-to-surface/GUIDE.md +17 -0
- package/library/tools/snapshot-diff/GUIDE.md +7 -0
- package/library/tools/starcast/GUIDE.md +12 -0
- package/library/tools/stop/GUIDE.md +3 -0
- package/library/tools/test-placement/GUIDE.md +7 -0
- package/library/tools/ui-actions/GUIDE.md +12 -0
- package/library/tools/ui-activate/GUIDE.md +11 -0
- package/library/tools/ui-screenshot/GUIDE.md +9 -0
- package/library/tools/ui-tree/GUIDE.md +10 -0
- package/library/tools/wait-for-event/GUIDE.md +11 -0
- package/library/tools/world-snapshot/GUIDE.md +9 -0
- package/library/tools/write-file/GUIDE.md +5 -0
- package/library/tools/zoom/GUIDE.md +5 -0
- package/package.json +6 -4
- package/registry/generated/aliases.json +15 -0
- package/registry/generated/counts.json +3 -3
- package/registry/generated/gemini-extension.json +6 -12
- package/registry/generated/index.json +1155 -408
- package/registry/generated/marketplace.claude.json +2 -13
- package/registry/generated/plugin.claude.json +25 -22
- package/registry/generated/plugin.codex.json +8 -14
- package/registry/generated/plugin.cursor.json +7 -13
- package/registry/generated/plugin.factory.json +7 -13
- package/registry/generated/server.json +34 -0
- package/registry/generated/skills-index.md +126 -116
- package/registry/generated/skills-registry.json +178 -113
- package/registry/operations/fixtures/invalid-deprecated-without-replacement.json +60 -0
- package/registry/operations/fixtures/invalid-name.json +60 -0
- package/registry/operations/fixtures/invalid-publish-without-owner.json +82 -0
- package/registry/operations/fixtures/invalid-spend-without-estimate.json +42 -0
- package/registry/operations/fixtures/invalid-unknown-field.json +61 -0
- package/registry/operations/fixtures/valid-player-facing.json +82 -0
- package/registry/operations/fixtures/valid-read.json +60 -0
- package/registry/operations/fixtures/valid-spend.json +43 -0
- package/registry/operations/legacy-names.json +1206 -0
- package/registry/schemas/allowed-hosts.json +4 -2
- package/registry/schemas/operation.schema.json +318 -0
- package/registry/schemas/skill.schema.json +4 -0
- package/CLAUDE.md +0 -7
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { getSkillRegistry } from "../skills-registry.js";
|
|
2
|
+
import { getSkillRegistry, isAssetSkill } from "../skills-registry.js";
|
|
3
3
|
export const GAME_TASK_MODES = [
|
|
4
4
|
"auto",
|
|
5
5
|
"new-game",
|
|
@@ -150,7 +150,7 @@ function addSkill(routes, name, why, weight) {
|
|
|
150
150
|
}
|
|
151
151
|
routes.push({ name, why, weight });
|
|
152
152
|
}
|
|
153
|
-
function inferSkills(mode, target, goal) {
|
|
153
|
+
function inferSkills(mode, target, goal, engine = true) {
|
|
154
154
|
const text = goal.toLowerCase();
|
|
155
155
|
const routes = [];
|
|
156
156
|
const animationIntent = includesAny(text, [
|
|
@@ -182,7 +182,12 @@ function inferSkills(mode, target, goal) {
|
|
|
182
182
|
"voice",
|
|
183
183
|
"animation clip",
|
|
184
184
|
]);
|
|
185
|
-
|
|
185
|
+
if (engine) {
|
|
186
|
+
addSkill(routes, "using-summer", "Baseline workflow for building through Summer CLI/MCP.", 100);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
addSkill(routes, "summer-assets", "The asset loop without Summer Engine: reuse, generate, check, download.", 250);
|
|
190
|
+
}
|
|
186
191
|
if (mode === "debug") {
|
|
187
192
|
addSkill(routes, "debug", "Primary runtime/script/diagnostics loop.", 300);
|
|
188
193
|
addSkill(routes, "investigating-bugs", "Systematic bug investigation workflow.", 220);
|
|
@@ -307,6 +312,8 @@ function inferSkills(mode, target, goal) {
|
|
|
307
312
|
addSkill(routes, "gdscript-patterns", "Use guarded Summer file tools for scripts, then verify through MCP.", 90);
|
|
308
313
|
addSkill(routes, "verification-before-completion", "Do not finish without a clean verification story.", 80);
|
|
309
314
|
return routes
|
|
315
|
+
// Without engine tools, only the skills that work without them.
|
|
316
|
+
.filter((route) => engine || isAssetSkill(skillByName().get(route.name)))
|
|
310
317
|
.sort((a, b) => b.weight - a.weight)
|
|
311
318
|
.slice(0, 7)
|
|
312
319
|
.map((route) => {
|
|
@@ -372,9 +379,34 @@ function buildMcpToolPlan(mode, target, assetPolicy, verification, goal = "") {
|
|
|
372
379
|
}
|
|
373
380
|
return { start, mutate, assets, verify };
|
|
374
381
|
}
|
|
375
|
-
|
|
382
|
+
/** The plan for a session without engine tools: find, generate, check, hand over a file. */
|
|
383
|
+
function buildAssetsToolPlan(target, assetPolicy, verification) {
|
|
384
|
+
const assets = ["summer_list_my_assets", "summer_search_assets", "summer_get_asset"];
|
|
385
|
+
if (assetPolicy !== "no-paid-generation") {
|
|
386
|
+
const generator = {
|
|
387
|
+
"3d": "summer_generate_3d",
|
|
388
|
+
"2d": "summer_generate_image",
|
|
389
|
+
ui: "summer_generate_image",
|
|
390
|
+
audio: "summer_generate_audio",
|
|
391
|
+
animation: "summer_generate_motion",
|
|
392
|
+
};
|
|
393
|
+
if (generator[target])
|
|
394
|
+
assets.push(generator[target]);
|
|
395
|
+
assets.push("summer_check_job");
|
|
396
|
+
}
|
|
397
|
+
assets.push("summer_get_asset_download_url");
|
|
398
|
+
return {
|
|
399
|
+
start: ["summer_search_library", "summer_read_library"],
|
|
400
|
+
mutate: [],
|
|
401
|
+
assets,
|
|
402
|
+
verify: verification === "none" ? [] : ["summer_check_job", "summer_get_asset"],
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
function buildUserGates(mode, assetPolicy, engine = true) {
|
|
376
406
|
const gates = [
|
|
377
|
-
|
|
407
|
+
engine
|
|
408
|
+
? "Ask before destructive scene changes, deleting assets, or changing locked .summer memory."
|
|
409
|
+
: "Ask before deleting or replacing the person's assets.",
|
|
378
410
|
];
|
|
379
411
|
if (assetPolicy !== "generate-when-clearly-needed") {
|
|
380
412
|
gates.push("Ask before paid generation, rigging, video, or large batch asset creation.");
|
|
@@ -395,6 +427,8 @@ export function buildGameTaskPlan(options) {
|
|
|
395
427
|
const verification = options.verification ?? "full";
|
|
396
428
|
const mode = inferMode(goal, options.mode ?? "auto");
|
|
397
429
|
const target = inferTarget(goal, options.target ?? "auto");
|
|
430
|
+
if (options.engine === false)
|
|
431
|
+
return buildAssetsPlan(goal, mode, target, assetPolicy, verification);
|
|
398
432
|
return {
|
|
399
433
|
goal,
|
|
400
434
|
mode,
|
|
@@ -431,3 +465,44 @@ export function buildGameTaskPlan(options) {
|
|
|
431
465
|
],
|
|
432
466
|
};
|
|
433
467
|
}
|
|
468
|
+
/** summer_start_game_task in a session without engine tools (the assets profile). */
|
|
469
|
+
function buildAssetsPlan(goal, mode, target, assetPolicy, verification) {
|
|
470
|
+
const needsEngine = mode !== "asset";
|
|
471
|
+
return {
|
|
472
|
+
goal,
|
|
473
|
+
mode,
|
|
474
|
+
target,
|
|
475
|
+
assetPolicy,
|
|
476
|
+
verification,
|
|
477
|
+
profileNote: "This session has generation and the Summer asset library, and no Summer Engine tools. Deliver files the person can use in any engine or web app." +
|
|
478
|
+
(needsEngine
|
|
479
|
+
? " Building or changing a game needs Summer Engine and the full setup: npx -y summer-engine@latest setup <agent> --yes. Until then, make the assets the task needs."
|
|
480
|
+
: ""),
|
|
481
|
+
principles: [
|
|
482
|
+
"Deliver files, not scenes: the asset is done when it is saved where the person asked.",
|
|
483
|
+
"Reuse the person's assets and the Summer library before paid generation unless the person wants something custom.",
|
|
484
|
+
"Use the asset id a job returns; never search by name right after a generation.",
|
|
485
|
+
"Check each asset before claiming it is done: the job finished, and you saw the preview (or the person heard the sound).",
|
|
486
|
+
],
|
|
487
|
+
recommendedSkills: inferSkills(mode, target, goal, false),
|
|
488
|
+
mcpToolPlan: buildAssetsToolPlan(target, assetPolicy, verification),
|
|
489
|
+
hostFileWork: [
|
|
490
|
+
"summer_generate_image saves the file itself when you pass out (a folder or a file path in the person's project).",
|
|
491
|
+
"Download other assets from summer_get_asset_download_url with your own shell into the folder the person named.",
|
|
492
|
+
],
|
|
493
|
+
userGates: buildUserGates(mode, assetPolicy, false),
|
|
494
|
+
nextAgentSteps: [
|
|
495
|
+
"Load the top recommended skill; follow it until the asset exists, then its 'Without Summer Engine' section.",
|
|
496
|
+
"Ask what the asset is for: engine or app, format, size or scale, style, how many.",
|
|
497
|
+
"Check summer_list_my_assets and summer_search_assets before generating.",
|
|
498
|
+
"Generate after the person confirms the spend; poll summer_check_job until the state is terminal.",
|
|
499
|
+
"Hand the file over and tell the person its path and format.",
|
|
500
|
+
],
|
|
501
|
+
antiPatterns: [
|
|
502
|
+
"Do not call engine tools (summer_get_project_context, summer_add_node, summer_play, summer_import_asset_by_id): this session does not have them.",
|
|
503
|
+
"Do not generate assets before checking library/user assets.",
|
|
504
|
+
"Do not search by name for an asset immediately after generation; use the returned asset ID.",
|
|
505
|
+
"Do not say an asset looks right without a preview you actually received.",
|
|
506
|
+
],
|
|
507
|
+
};
|
|
508
|
+
}
|
|
@@ -53,8 +53,8 @@ export const motionGenerationArgsSchema = z.object({
|
|
|
53
53
|
.describe("Stable retry key so the same logical request is not billed or queued twice"),
|
|
54
54
|
wait: z
|
|
55
55
|
.boolean()
|
|
56
|
-
.default(
|
|
57
|
-
.describe("
|
|
56
|
+
.default(false)
|
|
57
|
+
.describe("Block until the job finishes (up to 10 min) and return the result. Default false returns the jobId at once; poll summer_check_job."),
|
|
58
58
|
options: z
|
|
59
59
|
.record(z.any())
|
|
60
60
|
.optional()
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { z } from "zod";
|
|
22
22
|
import type { EngineCapabilities } from "../../capability-skew.js";
|
|
23
|
+
import { type SummerErrorCode } from "../../error-codes.js";
|
|
23
24
|
import { type EditorTargetMeta, type NavParam, type NavSurface, type NavTarget } from "./targets.js";
|
|
24
25
|
export type OpenSurface = "auto" | NavSurface;
|
|
25
26
|
/** The ONE argument shape both faces validate with (mirrors
|
|
@@ -36,14 +37,14 @@ export declare const openArgsSchema: z.ZodObject<{
|
|
|
36
37
|
surface: z.ZodOptional<z.ZodEnum<["auto", "web", "editor"]>>;
|
|
37
38
|
open: z.ZodOptional<z.ZodBoolean>;
|
|
38
39
|
}, "strict", z.ZodTypeAny, {
|
|
40
|
+
surface?: "web" | "editor" | "auto" | undefined;
|
|
39
41
|
params?: Record<string, string> | undefined;
|
|
40
42
|
target?: string | undefined;
|
|
41
|
-
surface?: "web" | "editor" | "auto" | undefined;
|
|
42
43
|
open?: boolean | undefined;
|
|
43
44
|
}, {
|
|
45
|
+
surface?: "web" | "editor" | "auto" | undefined;
|
|
44
46
|
params?: Record<string, string> | undefined;
|
|
45
47
|
target?: string | undefined;
|
|
46
|
-
surface?: "web" | "editor" | "auto" | undefined;
|
|
47
48
|
open?: boolean | undefined;
|
|
48
49
|
}>;
|
|
49
50
|
export type OpenArgs = z.infer<typeof openArgsSchema>;
|
|
@@ -93,6 +94,9 @@ export interface OpenResult {
|
|
|
93
94
|
receipt?: unknown;
|
|
94
95
|
/** Structured failure class for ok:false results (engine_lacks_op, …). */
|
|
95
96
|
failure_reason?: string;
|
|
97
|
+
/** The shared code (core/error-codes.ts) when the engine is not running. */
|
|
98
|
+
code?: SummerErrorCode;
|
|
99
|
+
recovery?: string;
|
|
96
100
|
matches?: OpenMatch[];
|
|
97
101
|
targets?: OpenTargetSummary[];
|
|
98
102
|
hint?: string;
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { z } from "zod";
|
|
22
22
|
import { extractOpError } from "../engine-receipt.js";
|
|
23
|
+
import { RECOVERY } from "../../error-codes.js";
|
|
23
24
|
import { NAV_TARGETS, WEB_CATALOG, getNavTarget, } from "./targets.js";
|
|
24
25
|
/** The ONE argument shape both faces validate with (mirrors
|
|
25
26
|
* library/tools/open/resource.yaml input_schema; parity-tested). */
|
|
@@ -516,6 +517,8 @@ export async function runOpen(args, deps) {
|
|
|
516
517
|
return {
|
|
517
518
|
ok: false,
|
|
518
519
|
action: "engine_not_running",
|
|
520
|
+
code: "engine_not_running",
|
|
521
|
+
recovery: RECOVERY.engine_not_running,
|
|
519
522
|
target: summary,
|
|
520
523
|
op: navigateOp,
|
|
521
524
|
engine: { running: false, error: message },
|
|
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { createReadStream } from "node:fs";
|
|
3
3
|
import { open } from "node:fs/promises";
|
|
4
4
|
import { extname, resolve } from "node:path";
|
|
5
|
+
import { summerRequestHeaders } from "../agent-host.js";
|
|
5
6
|
import { resolveGatewayUrl } from "../config.js";
|
|
6
7
|
import { getStoreAccessToken, OAuthError } from "../oauth.js";
|
|
7
8
|
import { appendStoreJsonLine } from "../store.js";
|
|
@@ -87,6 +88,7 @@ export function createStore(baseUrl, token, deps) {
|
|
|
87
88
|
response = await deps.fetch(`${baseUrl}${STORE_PROXY_PATH}/${path}`, {
|
|
88
89
|
method,
|
|
89
90
|
headers: {
|
|
91
|
+
...summerRequestHeaders(),
|
|
90
92
|
accept: "application/json",
|
|
91
93
|
authorization: `Bearer ${token}`,
|
|
92
94
|
...(options.body === undefined ? {} : { "content-type": "application/json" }),
|
|
@@ -140,18 +140,18 @@ export declare const runtimeSpawnArgsSchema: z.ZodObject<{
|
|
|
140
140
|
}, "strip", z.ZodTypeAny, {
|
|
141
141
|
action: "spawn" | "free";
|
|
142
142
|
mode?: "free" | "queue_free" | undefined;
|
|
143
|
+
name?: string | undefined;
|
|
143
144
|
instance?: string | undefined;
|
|
144
145
|
scene?: string | undefined;
|
|
145
|
-
name?: string | undefined;
|
|
146
146
|
path?: string | undefined;
|
|
147
147
|
parent?: string | undefined;
|
|
148
148
|
props?: Record<string, string | number | boolean> | undefined;
|
|
149
149
|
}, {
|
|
150
150
|
action: "spawn" | "free";
|
|
151
151
|
mode?: "free" | "queue_free" | undefined;
|
|
152
|
+
name?: string | undefined;
|
|
152
153
|
instance?: string | undefined;
|
|
153
154
|
scene?: string | undefined;
|
|
154
|
-
name?: string | undefined;
|
|
155
155
|
path?: string | undefined;
|
|
156
156
|
parent?: string | undefined;
|
|
157
157
|
props?: Record<string, string | number | boolean> | undefined;
|
|
@@ -182,10 +182,10 @@ export declare const runtimeAnimateArgsSchema: z.ZodObject<{
|
|
|
182
182
|
}, "strip", z.ZodTypeAny, {
|
|
183
183
|
path: string;
|
|
184
184
|
target: "tree" | "player" | "bones";
|
|
185
|
+
name?: string | undefined;
|
|
185
186
|
state?: string | undefined;
|
|
186
187
|
value?: string | number | boolean | undefined;
|
|
187
188
|
instance?: string | undefined;
|
|
188
|
-
name?: string | undefined;
|
|
189
189
|
space?: "local" | "global" | "both" | undefined;
|
|
190
190
|
cmd?: "state" | "pause" | "play" | "stop" | "seek" | "speed" | "travel" | "start" | "set_param" | "get_param" | undefined;
|
|
191
191
|
blend?: number | undefined;
|
|
@@ -201,10 +201,10 @@ export declare const runtimeAnimateArgsSchema: z.ZodObject<{
|
|
|
201
201
|
}, {
|
|
202
202
|
path: string;
|
|
203
203
|
target: "tree" | "player" | "bones";
|
|
204
|
+
name?: string | undefined;
|
|
204
205
|
state?: string | undefined;
|
|
205
206
|
value?: string | number | boolean | undefined;
|
|
206
207
|
instance?: string | undefined;
|
|
207
|
-
name?: string | undefined;
|
|
208
208
|
space?: "local" | "global" | "both" | undefined;
|
|
209
209
|
cmd?: "state" | "pause" | "play" | "stop" | "seek" | "speed" | "travel" | "start" | "set_param" | "get_param" | undefined;
|
|
210
210
|
blend?: number | undefined;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type RunSceneScriptArgs } from "./scene-script.js";
|
|
2
|
+
export interface SceneScriptClient {
|
|
3
|
+
executeIdentityBoundOps(ops: Record<string, unknown>[], options?: Record<string, unknown>, timeoutMs?: number): Promise<unknown>;
|
|
4
|
+
getSceneState(): Promise<unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface SceneTarget {
|
|
7
|
+
scenePath: string;
|
|
8
|
+
/** The script's scene was not the edited one, so its tab was brought forward. */
|
|
9
|
+
opened: boolean;
|
|
10
|
+
/** The scene the editor showed before, opened again after the run. */
|
|
11
|
+
restored?: string;
|
|
12
|
+
/** Why that tab could not be restored (the script still ran). */
|
|
13
|
+
restore_error?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function runSceneScriptOn(client: SceneScriptClient, args: RunSceneScriptArgs & {
|
|
16
|
+
scenePath?: string;
|
|
17
|
+
}): Promise<unknown>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* summer_run_script with a target scene. The engine's RunSceneScript runs
|
|
3
|
+
* against the scene the editor is editing and takes no target of its own, so
|
|
4
|
+
* a scenePath is honored here, the same way for the MCP tool and the CLI:
|
|
5
|
+
*
|
|
6
|
+
* 1. Read the scene the editor is editing (a snapshot up to ~300 ms old).
|
|
7
|
+
* 2. OpenScene scenePath, alone (never in one batch with a mutation), even
|
|
8
|
+
* when the snapshot says it is already the edited scene: the person may
|
|
9
|
+
* have switched tabs since, and opening the current scene again changes
|
|
10
|
+
* nothing. The engine answers ok only once that scene is the edited one,
|
|
11
|
+
* so a failed open stops here and the script never runs.
|
|
12
|
+
* 3. Run the script.
|
|
13
|
+
* 4. Give the person back the tab they had (OpenScene of the earlier scene),
|
|
14
|
+
* as the engine's own scene-targeted ops do.
|
|
15
|
+
*
|
|
16
|
+
* The result is the engine's RunSceneScript receipt plus `scene_target`.
|
|
17
|
+
*/
|
|
18
|
+
import { resolveCurrentScene } from "./project-context.js";
|
|
19
|
+
import { buildRunSceneScriptOp } from "./scene-script.js";
|
|
20
|
+
import { validateScenePath } from "./seeing/seeing.js";
|
|
21
|
+
import { extractOpError } from "./engine-receipt.js";
|
|
22
|
+
function withTarget(result, target) {
|
|
23
|
+
return result && typeof result === "object" && !Array.isArray(result)
|
|
24
|
+
? { ...result, scene_target: target }
|
|
25
|
+
: { result, scene_target: target };
|
|
26
|
+
}
|
|
27
|
+
export async function runSceneScriptOn(client, args) {
|
|
28
|
+
const { op, timeoutMs } = buildRunSceneScriptOp(args);
|
|
29
|
+
if (args.scenePath === undefined)
|
|
30
|
+
return client.executeIdentityBoundOps([op], undefined, timeoutMs);
|
|
31
|
+
const scenePath = validateScenePath(args.scenePath);
|
|
32
|
+
let before = null;
|
|
33
|
+
let beforeError;
|
|
34
|
+
try {
|
|
35
|
+
before = resolveCurrentScene(undefined, await client.getSceneState(), undefined);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
beforeError = error instanceof Error ? error.message : String(error);
|
|
39
|
+
}
|
|
40
|
+
const open = await client.executeIdentityBoundOps([{ op: "OpenScene", path: scenePath }]);
|
|
41
|
+
const openError = extractOpError(open);
|
|
42
|
+
if (openError) {
|
|
43
|
+
return {
|
|
44
|
+
ok: false,
|
|
45
|
+
error: `Could not open ${scenePath}, so the script did not run. ${openError}`,
|
|
46
|
+
failure_reason: "scene_target_failed",
|
|
47
|
+
scene_target: { scenePath, opened: false },
|
|
48
|
+
receipt: open,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const opened = before !== scenePath;
|
|
52
|
+
const result = await client.executeIdentityBoundOps([op], undefined, timeoutMs);
|
|
53
|
+
const target = { scenePath, opened };
|
|
54
|
+
if (beforeError !== undefined)
|
|
55
|
+
target.restore_error = `The scene open before could not be read, so no tab was restored: ${beforeError}`;
|
|
56
|
+
if (opened && before) {
|
|
57
|
+
try {
|
|
58
|
+
const restore = await client.executeIdentityBoundOps([{ op: "OpenScene", path: before }]);
|
|
59
|
+
const restoreError = extractOpError(restore);
|
|
60
|
+
if (restoreError)
|
|
61
|
+
target.restore_error = restoreError;
|
|
62
|
+
else
|
|
63
|
+
target.restored = before;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
target.restore_error = error instanceof Error ? error.message : String(error);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return withTarget(result, target);
|
|
70
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { type SummerErrorCode } from "../error-codes.js";
|
|
2
3
|
/**
|
|
3
4
|
* Sound-effect choices (summer_generate_sfx_choices + summer_get_choices).
|
|
4
5
|
*
|
|
@@ -59,6 +60,9 @@ export interface GatewayReply {
|
|
|
59
60
|
data?: any;
|
|
60
61
|
error?: string;
|
|
61
62
|
status: number;
|
|
63
|
+
/** Set for the shared failures (not signed in, no credits, network). */
|
|
64
|
+
code?: SummerErrorCode;
|
|
65
|
+
recovery?: string;
|
|
62
66
|
}
|
|
63
67
|
export interface SfxChoicesDeps {
|
|
64
68
|
post(endpoint: string, body: Record<string, unknown>, timeoutMs: number): Promise<GatewayReply>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { codedFailure } from "../error-codes.js";
|
|
2
3
|
/**
|
|
3
4
|
* Sound-effect choices (summer_generate_sfx_choices + summer_get_choices).
|
|
4
5
|
*
|
|
@@ -59,6 +60,14 @@ export const getChoicesArgsSchema = z.object({
|
|
|
59
60
|
.optional()
|
|
60
61
|
.describe("Wait up to this many seconds (max 50) for the person to decide before answering. 0 or omitted: answer now"),
|
|
61
62
|
});
|
|
63
|
+
/** A failed reply as a tool result; coded when the reply carries a code. */
|
|
64
|
+
function replyFailure(reply) {
|
|
65
|
+
// An unavailable reply's data is already `{details: {cause}}`.
|
|
66
|
+
const details = reply.code === "unavailable" ? reply.data ?? {} : reply.data ? { details: reply.data } : {};
|
|
67
|
+
return reply.code
|
|
68
|
+
? codedFailure(reply.code, reply.error ?? "Request failed", details, reply.recovery)
|
|
69
|
+
: { ok: false, error: reply.error, ...details };
|
|
70
|
+
}
|
|
62
71
|
// ---------------------------------------------------------------------------
|
|
63
72
|
// Showing the page
|
|
64
73
|
// ---------------------------------------------------------------------------
|
|
@@ -138,9 +147,8 @@ function clipSummary(clip) {
|
|
|
138
147
|
}
|
|
139
148
|
export async function generateSfxChoices(args, deps) {
|
|
140
149
|
const reply = await deps.post(SFX_CHOICES_ENDPOINT, sfxChoicesRequestBody(args), SFX_CHOICES_TIMEOUT_MS);
|
|
141
|
-
if (reply.error)
|
|
142
|
-
return
|
|
143
|
-
}
|
|
150
|
+
if (reply.error)
|
|
151
|
+
return replyFailure(reply);
|
|
144
152
|
const data = reply.data ?? {};
|
|
145
153
|
const clips = Array.isArray(data.clips) ? data.clips : [];
|
|
146
154
|
const failed = Array.isArray(data.failed) ? data.failed : [];
|
|
@@ -211,9 +219,8 @@ export async function getChoices(args, deps) {
|
|
|
211
219
|
if (args.waitSeconds)
|
|
212
220
|
params.set("waitSeconds", String(args.waitSeconds));
|
|
213
221
|
const reply = await deps.get(choicesEndpoint(args.choiceSetId), params, choicesTimeoutMs(args.waitSeconds));
|
|
214
|
-
if (reply.error)
|
|
215
|
-
return
|
|
216
|
-
}
|
|
222
|
+
if (reply.error)
|
|
223
|
+
return replyFailure(reply);
|
|
217
224
|
const data = reply.data ?? {};
|
|
218
225
|
const clips = Array.isArray(data.clips) ? data.clips : [];
|
|
219
226
|
const status = data.status === "decided" ? "decided" : "pending";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EngineApiClient } from "../api-client.js";
|
|
2
|
+
import { type SummerErrorCode } from "../error-codes.js";
|
|
2
3
|
export type DispatchArgs = Record<string, unknown>;
|
|
3
4
|
export interface ToolDispatchContext {
|
|
4
5
|
/** Lazily connect to the local engine. Throws EngineUnavailableError with a
|
|
@@ -19,9 +20,6 @@ export interface ToolDispatchEntry {
|
|
|
19
20
|
/** Dispatch-level failure with a user-facing message (no stack needed). */
|
|
20
21
|
export declare class ToolDispatchError extends Error {
|
|
21
22
|
}
|
|
22
|
-
/** The local engine is not reachable — a clean state, not a crash. */
|
|
23
|
-
export declare class EngineUnavailableError extends ToolDispatchError {
|
|
24
|
-
}
|
|
25
23
|
/** A tool failed with a structured receipt that `summer tool` prints whole
|
|
26
24
|
* (JSON on stdout, exit 1) instead of flattening to `message`: every engine
|
|
27
25
|
* envelope extractOpError reads as a failure (the same gate the MCP face
|
|
@@ -33,6 +31,17 @@ export declare class ToolResultError extends ToolDispatchError {
|
|
|
33
31
|
readonly result: Record<string, unknown>;
|
|
34
32
|
constructor(result: Record<string, unknown>, message: string);
|
|
35
33
|
}
|
|
34
|
+
/** A shared failure (core/error-codes.ts) — not signed in, no credits,
|
|
35
|
+
* network — printed as `{ok:false, code, error, recovery}` with the shell
|
|
36
|
+
* wording of the next step. */
|
|
37
|
+
export declare class CodedToolError extends ToolResultError {
|
|
38
|
+
constructor(code: SummerErrorCode, message: string, extra?: Record<string, unknown>, recovery?: string);
|
|
39
|
+
}
|
|
40
|
+
/** The local engine is not reachable — a clean state, not a crash. Prints
|
|
41
|
+
* `{ok:false, code:"engine_not_running", error, recovery, hint}`. */
|
|
42
|
+
export declare class EngineUnavailableError extends CodedToolError {
|
|
43
|
+
constructor(message: string);
|
|
44
|
+
}
|
|
36
45
|
export declare function createDefaultDispatchContext(): ToolDispatchContext;
|
|
37
46
|
export declare const TOOL_DISPATCH: readonly ToolDispatchEntry[];
|
|
38
47
|
export declare function listToolDispatches(): readonly ToolDispatchEntry[];
|