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
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { readdir, readFile, lstat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { getAuthToken } from "../auth.js";
|
|
5
|
+
import { resolveGatewayUrl } from "../config.js";
|
|
6
|
+
import { summerRequestHeaders } from "../agent-host.js";
|
|
7
|
+
import { codedFailure, describeNetworkError, networkDetails, NOT_SIGNED_IN, SIGN_IN_AGAIN_RECOVERY } from "../error-codes.js";
|
|
8
|
+
/**
|
|
9
|
+
* Summer Apps (summer_app_*): tools a game team uses inside Summer Studio,
|
|
10
|
+
* built by agents. Every cloud tool here calls the Summer web API under
|
|
11
|
+
* /api/mcp/apps with the signed-in Summer account; summer_app_dock asks the
|
|
12
|
+
* running editor to dock an app (engine ops OpenAppDock / CloseAppDock /
|
|
13
|
+
* ListAppDocks).
|
|
14
|
+
*
|
|
15
|
+
* One implementation for both faces: the MCP tools (src/mcp/tools/app-tools.ts)
|
|
16
|
+
* and `summer tool app-*` (tool-dispatch.ts) share the schemas and functions
|
|
17
|
+
* here and pass their own client surface.
|
|
18
|
+
*/
|
|
19
|
+
export const APPS_ENDPOINT = "/api/mcp/apps";
|
|
20
|
+
/** The server's long-poll ceiling for summer_app_events. */
|
|
21
|
+
export const MAX_APP_EVENTS_WAIT_SECONDS = 50;
|
|
22
|
+
export const APP_GUIDE_SECTIONS = ["all", "overview", "manifest", "sdk", "kit", "layout", "design", "examples", "types"];
|
|
23
|
+
export const APP_DOCK_SLOTS = ["left", "right", "bottom"];
|
|
24
|
+
/** Bundle limits the server enforces (checked here first for a clear local error). */
|
|
25
|
+
const MAX_FILES = 300;
|
|
26
|
+
const MAX_FILE_BYTES = 5 * 1024 * 1024;
|
|
27
|
+
const MAX_BUNDLE_BYTES = 10 * 1024 * 1024;
|
|
28
|
+
const TEXT_EXTENSIONS = new Set([".html", ".js", ".mjs", ".css", ".json", ".txt", ".md", ".svg", ".gltf"]);
|
|
29
|
+
const appId = z.string().uuid().describe("The app id from summer_app_create or summer_app_list");
|
|
30
|
+
const jsonObject = z.record(z.unknown());
|
|
31
|
+
export const appGuideArgsSchema = z.object({
|
|
32
|
+
section: z
|
|
33
|
+
.enum(APP_GUIDE_SECTIONS)
|
|
34
|
+
.default("overview")
|
|
35
|
+
.describe("Start with overview (the default), then read what the app needs: examples (a working app to copy), sdk, manifest, kit, design, layout, types (exact SDK TypeScript types). all returns every section but types (about 100 KB)"),
|
|
36
|
+
});
|
|
37
|
+
export const appListArgsSchema = z.object({
|
|
38
|
+
workspaceId: z.string().uuid().optional().describe("Only this workspace (team). Default: every workspace the person is in"),
|
|
39
|
+
q: z.string().max(200).optional().describe("Search app names and purposes"),
|
|
40
|
+
});
|
|
41
|
+
export const appCreateArgsSchema = z.object({
|
|
42
|
+
name: z.string().min(1).max(80),
|
|
43
|
+
purpose: z.string().max(280).optional().describe("One line: what the tool does and where its data goes"),
|
|
44
|
+
format: z.enum(["code", "layout"]).default("code").describe("code: index.html + JS/CSS (default). layout: a JSON layout of kit nodes, for quick decision UIs"),
|
|
45
|
+
workspaceId: z.string().uuid().optional().describe("A workspace id. Default: the person's team (the one their Studio tab is on, else their latest team, else personal); the result's workspace says which"),
|
|
46
|
+
folder: z.string().min(1).max(80).optional(),
|
|
47
|
+
});
|
|
48
|
+
export const appPublishArgsSchema = z.object({
|
|
49
|
+
appId,
|
|
50
|
+
dir: z
|
|
51
|
+
.string()
|
|
52
|
+
.min(1)
|
|
53
|
+
.optional()
|
|
54
|
+
.describe("A local folder holding the app (index.html at its root). Every file under it is published; dotfiles, node_modules and .d.ts files are skipped"),
|
|
55
|
+
files: z
|
|
56
|
+
.array(z.object({
|
|
57
|
+
path: z.string().min(1).max(200),
|
|
58
|
+
content: z.string(),
|
|
59
|
+
encoding: z.enum(["utf8", "base64"]).default("utf8"),
|
|
60
|
+
}))
|
|
61
|
+
.max(MAX_FILES)
|
|
62
|
+
.optional()
|
|
63
|
+
.describe("The files instead of dir: [{path, content, encoding}]"),
|
|
64
|
+
layout: jsonObject.optional().describe("Layout apps: { version: 1, title, root }"),
|
|
65
|
+
manifest: jsonObject.describe("The manifest {name, purpose, permissions, engineFiles, agentEvents, agentTools} (summer_app_guide section manifest)"),
|
|
66
|
+
note: z.string().max(500).optional().describe("What changed, shown in the version list"),
|
|
67
|
+
idempotencyKey: z.string().min(8).max(128).optional(),
|
|
68
|
+
});
|
|
69
|
+
export const appGetArgsSchema = z.object({ appId });
|
|
70
|
+
export const appEventsArgsSchema = z.object({
|
|
71
|
+
appId,
|
|
72
|
+
after: z.number().int().min(0).default(0).describe("Return events after this cursor (0: from the start). Pass the returned cursor next time"),
|
|
73
|
+
timeoutSeconds: z.number().int().min(0).max(MAX_APP_EVENTS_WAIT_SECONDS).default(25).describe("Wait up to this long (max 50) for the first new event"),
|
|
74
|
+
kinds: z.array(z.enum(["agent", "error", "feedback", "tool"])).max(4).optional().describe("Default: agent, error, feedback"),
|
|
75
|
+
});
|
|
76
|
+
export const appPageArgsSchema = z.object({
|
|
77
|
+
appId,
|
|
78
|
+
fill: z
|
|
79
|
+
.array(z.object({ field: z.string().min(1).max(200), value: z.union([z.string().max(10_000), z.number(), z.boolean()]) }))
|
|
80
|
+
.max(50)
|
|
81
|
+
.optional()
|
|
82
|
+
.describe("Values to set: [{field, value}] with field ids from a read"),
|
|
83
|
+
press: z.string().min(1).max(200).optional().describe("An action id to press after filling"),
|
|
84
|
+
});
|
|
85
|
+
export const appUpdateArgsSchema = z.object({
|
|
86
|
+
appId,
|
|
87
|
+
name: z.string().min(1).max(80).optional(),
|
|
88
|
+
purpose: z.string().max(280).optional(),
|
|
89
|
+
status: z.enum(["scratch", "kept", "archived"]).optional().describe("kept: the team keeps it. archived: hidden from the app list (restore with scratch or kept)"),
|
|
90
|
+
folder: z.string().min(1).max(80).nullable().optional().describe("null takes it out of its folder"),
|
|
91
|
+
});
|
|
92
|
+
export const appScreenshotArgsSchema = z.object({
|
|
93
|
+
appId,
|
|
94
|
+
version: z.number().int().positive().optional().describe("A published version. Default: the current one"),
|
|
95
|
+
width: z.number().int().min(320).max(1920).default(1280).describe("Viewport width in px: 390 for a phone"),
|
|
96
|
+
height: z.number().int().min(320).max(1600).default(800),
|
|
97
|
+
theme: z.enum(["light", "dark"]).default("light"),
|
|
98
|
+
fullPage: z.boolean().default(false).describe("Capture the whole scroll height (up to 4000 px)"),
|
|
99
|
+
params: z.record(z.string().max(500)).optional().describe("Launch params, as in /studio/apps/<id>?key=value"),
|
|
100
|
+
steps: z
|
|
101
|
+
.array(z.object({ click: z.string().max(300).optional(), press: z.string().max(40).optional(), wait: z.number().int().min(0).max(3000).optional() }))
|
|
102
|
+
.max(5)
|
|
103
|
+
.optional()
|
|
104
|
+
.describe('Before the capture, in order: click a CSS selector in the app (">>>" reaches inside kit components), press a declared action id, or wait ms. Use it to see a dialog or a second state'),
|
|
105
|
+
out: z.string().min(1).optional().describe("Also save the PNG to this local path"),
|
|
106
|
+
});
|
|
107
|
+
export const appDataArgsSchema = z.object({
|
|
108
|
+
appId,
|
|
109
|
+
collection: z.string().max(48).optional().describe("Read: one collection. Default: all"),
|
|
110
|
+
after: z.string().max(200).optional().describe("Read: the next cursor from the previous page"),
|
|
111
|
+
limit: z.number().int().min(1).max(500).default(200),
|
|
112
|
+
ops: z
|
|
113
|
+
.array(jsonObject)
|
|
114
|
+
.min(1)
|
|
115
|
+
.max(100)
|
|
116
|
+
.optional()
|
|
117
|
+
.describe("Write: [{op: put, collection, recordId, data}, {op: patch, collection, recordId, patch}, {op: remove, collection, recordId}]; ifRevision on an op applies it only at that record revision (0: must not exist)"),
|
|
118
|
+
as: z.enum(["agent", "seed"]).optional().describe("Write: seed for starter data that belongs to the team (no author). Default: agent"),
|
|
119
|
+
});
|
|
120
|
+
export const appToolsArgsSchema = z.object({ appId });
|
|
121
|
+
export const appCallArgsSchema = z.object({
|
|
122
|
+
appId,
|
|
123
|
+
tool: z.string().min(1).max(64).describe("The agent tool name from summer_app_tools"),
|
|
124
|
+
input: jsonObject.default({}).describe("Input matching the tool's input schema"),
|
|
125
|
+
});
|
|
126
|
+
export const appReportGapArgsSchema = z.object({
|
|
127
|
+
capability: z.string().min(1).max(200).describe('What the app needed, e.g. "read Steam reviews"'),
|
|
128
|
+
detail: z.string().max(2000).optional(),
|
|
129
|
+
method: z.string().max(100).optional().describe("The SDK method name you wished existed"),
|
|
130
|
+
appId: appId.optional(),
|
|
131
|
+
});
|
|
132
|
+
export const appDockArgsSchema = z.object({
|
|
133
|
+
action: z.enum(["open", "close", "list"]).default("open"),
|
|
134
|
+
appId: appId.optional().describe("open, close: the app"),
|
|
135
|
+
slot: z.enum(APP_DOCK_SLOTS).default("right").describe("open: left, right or bottom"),
|
|
136
|
+
});
|
|
137
|
+
/** Fetch with the Summer account token; errors come back as replies, never throws. */
|
|
138
|
+
export function appsGateway(surface, tool) {
|
|
139
|
+
return async (method, endpoint, { query, body, timeoutMs }) => {
|
|
140
|
+
const token = await getAuthToken();
|
|
141
|
+
if (!token)
|
|
142
|
+
return {
|
|
143
|
+
ok: false,
|
|
144
|
+
status: 401,
|
|
145
|
+
data: { error: { code: "not_signed_in", message: NOT_SIGNED_IN } },
|
|
146
|
+
};
|
|
147
|
+
const gateway = await resolveGatewayUrl();
|
|
148
|
+
const suffix = query?.toString() ? `?${query.toString()}` : "";
|
|
149
|
+
let response;
|
|
150
|
+
try {
|
|
151
|
+
response = await fetch(`${gateway}${endpoint}${suffix}`, {
|
|
152
|
+
method,
|
|
153
|
+
headers: {
|
|
154
|
+
...summerRequestHeaders({ tool, surface }),
|
|
155
|
+
Authorization: `Bearer ${token}`,
|
|
156
|
+
"X-Summer-MCP-Endpoint": endpoint,
|
|
157
|
+
...(body !== undefined ? { "Content-Type": "application/json" } : {}),
|
|
158
|
+
},
|
|
159
|
+
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
160
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
return { ok: false, status: 0, data: { error: { code: "unavailable", message: `Request failed: ${describeNetworkError(error)}`, ...networkDetails(error) } } };
|
|
165
|
+
}
|
|
166
|
+
const text = await response.text().catch(() => "");
|
|
167
|
+
let data = {};
|
|
168
|
+
try {
|
|
169
|
+
data = text ? JSON.parse(text) : {};
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
data = { message: text.slice(0, 1000) };
|
|
173
|
+
}
|
|
174
|
+
return { ok: response.ok, status: response.status, data };
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/** The server's `{error: {code, message}}` as one flat result an agent can act on.
|
|
178
|
+
* Not signed in, no credits and network failures carry the shared codes
|
|
179
|
+
* (core/error-codes.ts); the server's own codes pass through. */
|
|
180
|
+
function failure(reply) {
|
|
181
|
+
const error = reply.data.error;
|
|
182
|
+
const record = error && typeof error === "object" ? error : {};
|
|
183
|
+
const code = typeof record.code === "string" ? record.code : reply.status === 404 ? "not_found" : "unavailable";
|
|
184
|
+
const message = typeof record.message === "string" ? record.message : typeof reply.data.message === "string" ? reply.data.message : `Request failed (${reply.status})`;
|
|
185
|
+
const { error: _error, message: _message, ...rest } = reply.data;
|
|
186
|
+
const extra = { status: reply.status, ...rest, ...(record.details ? { details: record.details } : {}) };
|
|
187
|
+
if (code === "not_signed_in")
|
|
188
|
+
return codedFailure("not_signed_in", message, extra);
|
|
189
|
+
if (code === "unauthorized" || reply.status === 401)
|
|
190
|
+
return codedFailure("not_signed_in", message, extra, SIGN_IN_AGAIN_RECOVERY);
|
|
191
|
+
if (reply.status === 402)
|
|
192
|
+
return codedFailure("no_credits", message, extra);
|
|
193
|
+
if (reply.status === 0)
|
|
194
|
+
return codedFailure("unavailable", message, extra);
|
|
195
|
+
const hints = {
|
|
196
|
+
not_found: "Summer Apps is not available for this account yet, or the app id is wrong: summer_app_list shows the person's apps.",
|
|
197
|
+
app_not_open: "Use summer_app_data, or ask the person to open the app in Summer Studio.",
|
|
198
|
+
invalid: "Fix what the message names and try again (summer_app_guide has the rules).",
|
|
199
|
+
too_large: "Limits: 10 MB per app, 300 files, 5 MB per file.",
|
|
200
|
+
rate_limited: "Wait a minute and try again.",
|
|
201
|
+
};
|
|
202
|
+
return { ok: false, code, error: message, status: reply.status, ...(hints[code] ? { hint: hints[code] } : {}), ...rest, ...(record.details ? { details: record.details } : {}) };
|
|
203
|
+
}
|
|
204
|
+
const done = (reply) => (reply.ok ? { ok: true, ...reply.data } : failure(reply));
|
|
205
|
+
const params = (values) => {
|
|
206
|
+
const query = new URLSearchParams();
|
|
207
|
+
for (const [key, value] of Object.entries(values))
|
|
208
|
+
if (value !== undefined && value !== "")
|
|
209
|
+
query.set(key, value);
|
|
210
|
+
return query;
|
|
211
|
+
};
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
// Tools
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
export async function appGuide(args, deps) {
|
|
216
|
+
return done(await deps.request("GET", `${APPS_ENDPOINT}/guide`, { query: params({ section: args.section }), timeoutMs: 30_000 }));
|
|
217
|
+
}
|
|
218
|
+
export async function appList(args, deps) {
|
|
219
|
+
return done(await deps.request("GET", APPS_ENDPOINT, { query: params({ workspaceId: args.workspaceId, q: args.q }), timeoutMs: 30_000 }));
|
|
220
|
+
}
|
|
221
|
+
export async function appCreate(args, deps) {
|
|
222
|
+
const reply = await deps.request("POST", APPS_ENDPOINT, { body: args, timeoutMs: 30_000 });
|
|
223
|
+
if (!reply.ok)
|
|
224
|
+
return failure(reply);
|
|
225
|
+
const studio = reply.data.studio;
|
|
226
|
+
const workspace = reply.data.workspace;
|
|
227
|
+
const where = workspace?.name ? `It is in ${workspace.kind === "personal" ? "the person's personal workspace" : `the team ${workspace.name}`}: tell them. ` : "";
|
|
228
|
+
return {
|
|
229
|
+
ok: true,
|
|
230
|
+
...reply.data,
|
|
231
|
+
next: `${where}${studio?.queued ? "The person's Summer Studio tab is opening the app. " : ""}Write the app (summer_app_guide first), then summer_app_publish with appId and the files or dir.`,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/** Every file under dir (dotfiles, node_modules and .d.ts type files skipped), as publish files. */
|
|
235
|
+
export async function readAppDir(dir) {
|
|
236
|
+
const root = path.resolve(dir);
|
|
237
|
+
const files = [];
|
|
238
|
+
let total = 0;
|
|
239
|
+
const walk = async (current) => {
|
|
240
|
+
for (const entry of (await readdir(current, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
241
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules" || entry.name.endsWith(".d.ts"))
|
|
242
|
+
continue;
|
|
243
|
+
const full = path.join(current, entry.name);
|
|
244
|
+
if (entry.isDirectory()) {
|
|
245
|
+
await walk(full);
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (!entry.isFile() || (await lstat(full)).isSymbolicLink())
|
|
249
|
+
continue;
|
|
250
|
+
const bytes = await readFile(full);
|
|
251
|
+
if (bytes.length > MAX_FILE_BYTES)
|
|
252
|
+
throw new Error(`${path.relative(root, full)} is over 5 MB`);
|
|
253
|
+
total += bytes.length;
|
|
254
|
+
if (total > MAX_BUNDLE_BYTES)
|
|
255
|
+
throw new Error(`${dir} is over the 10 MB app limit`);
|
|
256
|
+
const relative = path.relative(root, full).split(path.sep).join("/");
|
|
257
|
+
const text = TEXT_EXTENSIONS.has(path.extname(entry.name).toLowerCase());
|
|
258
|
+
files.push({ path: relative, content: bytes.toString(text ? "utf8" : "base64"), encoding: text ? "utf8" : "base64" });
|
|
259
|
+
if (files.length > MAX_FILES)
|
|
260
|
+
throw new Error(`${dir} has more than ${MAX_FILES} files`);
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
await walk(root);
|
|
264
|
+
return files;
|
|
265
|
+
}
|
|
266
|
+
export async function appPublish(args, deps) {
|
|
267
|
+
const sources = [args.dir, args.files, args.layout].filter((value) => value !== undefined).length;
|
|
268
|
+
if (sources !== 1)
|
|
269
|
+
return { ok: false, code: "invalid", error: "Send exactly one of dir, files or layout." };
|
|
270
|
+
let files = args.files;
|
|
271
|
+
if (args.dir) {
|
|
272
|
+
try {
|
|
273
|
+
files = await (deps.readDir ?? readAppDir)(args.dir);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
return { ok: false, code: "invalid", error: error instanceof Error ? error.message : String(error) };
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const body = { ...(files ? { files } : { layout: args.layout }), manifest: args.manifest, ...(args.note ? { note: args.note } : {}), ...(args.idempotencyKey ? { idempotencyKey: args.idempotencyKey } : {}) };
|
|
280
|
+
const reply = await deps.request("POST", `${APPS_ENDPOINT}/${args.appId}/publish`, { body, timeoutMs: 120_000 });
|
|
281
|
+
if (!reply.ok)
|
|
282
|
+
return failure(reply);
|
|
283
|
+
const version = reply.data.version;
|
|
284
|
+
return {
|
|
285
|
+
ok: true,
|
|
286
|
+
...reply.data,
|
|
287
|
+
next: `Version ${version?.version ?? "?"} is live in the person's Studio. Wait for what the app sends with summer_app_events, or publish again to change it.`,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
export async function appGet(args, deps) {
|
|
291
|
+
return done(await deps.request("GET", `${APPS_ENDPOINT}/${args.appId}`, { timeoutMs: 60_000 }));
|
|
292
|
+
}
|
|
293
|
+
export async function appEvents(args, deps) {
|
|
294
|
+
return done(await deps.request("GET", `${APPS_ENDPOINT}/${args.appId}/events`, {
|
|
295
|
+
query: params({ after: String(args.after), timeoutMs: String(args.timeoutSeconds * 1000), kinds: args.kinds?.join(",") }),
|
|
296
|
+
timeoutMs: (args.timeoutSeconds + 20) * 1000,
|
|
297
|
+
}));
|
|
298
|
+
}
|
|
299
|
+
export async function appPage(args, deps) {
|
|
300
|
+
const { appId: id, ...body } = args;
|
|
301
|
+
return done(await deps.request("POST", `${APPS_ENDPOINT}/${id}/page`, { body, timeoutMs: 60_000 }));
|
|
302
|
+
}
|
|
303
|
+
export async function appUpdate(args, deps) {
|
|
304
|
+
const { appId: id, ...body } = args;
|
|
305
|
+
return done(await deps.request("POST", `${APPS_ENDPOINT}/${id}/update`, { body, timeoutMs: 30_000 }));
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* summer_app_screenshot: the server renders the app headless and read-only as the
|
|
309
|
+
* person and answers the PNG (base64) with its console, errors and declared page.
|
|
310
|
+
* The image moves to `image`; `out` also writes it to disk.
|
|
311
|
+
*/
|
|
312
|
+
export async function appScreenshot(args, deps) {
|
|
313
|
+
const { appId: id, out, ...body } = args;
|
|
314
|
+
const result = done(await deps.request("POST", `${APPS_ENDPOINT}/${id}/screenshot`, { body, timeoutMs: 90_000 }));
|
|
315
|
+
if (result.ok !== true)
|
|
316
|
+
return result;
|
|
317
|
+
const { image, ...report } = result;
|
|
318
|
+
if (!image)
|
|
319
|
+
return { ...report, ok: false, code: "invalid", error: "The server answered without an image" };
|
|
320
|
+
if (out)
|
|
321
|
+
await (deps.writeFile ?? ((file, data) => import("node:fs/promises").then((fs) => fs.writeFile(file, data))))(path.resolve(out), Buffer.from(image.base64, "base64"));
|
|
322
|
+
return { ...report, image, ...(out ? { savedTo: path.resolve(out) } : {}) };
|
|
323
|
+
}
|
|
324
|
+
export async function appData(args, deps) {
|
|
325
|
+
if (args.ops)
|
|
326
|
+
return done(await deps.request("POST", `${APPS_ENDPOINT}/${args.appId}/data`, { body: { ops: args.ops, ...(args.as ? { as: args.as } : {}) }, timeoutMs: 30_000 }));
|
|
327
|
+
return done(await deps.request("GET", `${APPS_ENDPOINT}/${args.appId}/data`, {
|
|
328
|
+
query: params({ collection: args.collection, after: args.after, limit: String(args.limit) }),
|
|
329
|
+
timeoutMs: 30_000,
|
|
330
|
+
}));
|
|
331
|
+
}
|
|
332
|
+
export async function appTools(args, deps) {
|
|
333
|
+
return done(await deps.request("GET", `${APPS_ENDPOINT}/${args.appId}/tools`, { timeoutMs: 30_000 }));
|
|
334
|
+
}
|
|
335
|
+
export async function appCall(args, deps) {
|
|
336
|
+
const { appId: id, ...body } = args;
|
|
337
|
+
return done(await deps.request("POST", `${APPS_ENDPOINT}/${id}/call`, { body, timeoutMs: 90_000 }));
|
|
338
|
+
}
|
|
339
|
+
export async function appReportGap(args, deps) {
|
|
340
|
+
return done(await deps.request("POST", `${APPS_ENDPOINT}/report-gap`, { body: args, timeoutMs: 30_000 }));
|
|
341
|
+
}
|
|
342
|
+
// ---------------------------------------------------------------------------
|
|
343
|
+
// summer_app_dock (engine)
|
|
344
|
+
// ---------------------------------------------------------------------------
|
|
345
|
+
export const APP_DOCK_FALLBACK = "This engine build cannot dock apps yet. Open the app in the Summer Studio tab instead (summer_studio_open with /studio/apps/<appId>), or update Summer Engine.";
|
|
346
|
+
/** The engine op for one dock action. */
|
|
347
|
+
export function appDockOp(args) {
|
|
348
|
+
if (args.action === "list")
|
|
349
|
+
return { op: "ListAppDocks" };
|
|
350
|
+
if (!args.appId)
|
|
351
|
+
throw new Error(`${args.action} needs appId`);
|
|
352
|
+
return args.action === "open" ? { op: "OpenAppDock", appId: args.appId, slot: args.slot } : { op: "CloseAppDock", appId: args.appId };
|
|
353
|
+
}
|
|
@@ -22,6 +22,9 @@ interface DoctorOptions {
|
|
|
22
22
|
quiet?: boolean;
|
|
23
23
|
}
|
|
24
24
|
export declare function runDoctor(options?: DoctorOptions): Promise<DoctorResult>;
|
|
25
|
+
/** The oldest Node major the package supports: `engines.node` in package.json. */
|
|
26
|
+
export declare const MIN_NODE_MAJOR = 20;
|
|
27
|
+
export declare function checkNodeVersion(nodeVersion?: string): DoctorCheck;
|
|
25
28
|
export declare function checkLogin(): Promise<DoctorCheck>;
|
|
26
29
|
/**
|
|
27
30
|
* Store access: with a store sign-in ("summer login --store"), ask the store
|
|
@@ -10,14 +10,15 @@ import { c, pad, sym, tildeify } from "../format.js";
|
|
|
10
10
|
import { getMcpLogPath } from "../mcp-log.js";
|
|
11
11
|
import { checkStoreAccess, hasStoreSignIn } from "../hosted-mcp.js";
|
|
12
12
|
import { formatProjectPin, getProjectMemorySummary, } from "../../project-memory/project-memory.js";
|
|
13
|
-
import { buildCliVersionCheck, buildSkillsVersionCheck, defaultSkillMarkerCandidates, detectRecordedInstall, fetchLatestRegistryVersion, } from "../../installer/version-check.js";
|
|
13
|
+
import { buildCliVersionCheck, buildSkillsVersionCheck, defaultSkillMarkerCandidates, detectRecordedInstall, fetchLatestRegistryVersion, fetchRegistryDistTags, } from "../../installer/version-check.js";
|
|
14
14
|
import { TOOLKIT_VERSION as version } from "../version.js";
|
|
15
|
+
import { resolveSurface } from "../tool-profiles.js";
|
|
15
16
|
const MIN_EXPECTED_MCP_TOOLS = 50;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"summer_generate_image",
|
|
19
|
-
"summer_create_debug_report",
|
|
20
|
-
|
|
17
|
+
/** Per surface: the spawned `summer mcp` reads SUMMER_SURFACE from this process's env. */
|
|
18
|
+
const REQUIRED_MCP_TOOLS = {
|
|
19
|
+
v3: ["summer_get_project_context", "summer_generate_image", "summer_create_debug_report"],
|
|
20
|
+
v4: ["summer_get_project_context", "summer_search", "summer_call", "summer_create_debug_report"],
|
|
21
|
+
};
|
|
21
22
|
export async function runDoctor(options = {}) {
|
|
22
23
|
const checks = [];
|
|
23
24
|
checks.push(checkNodeVersion());
|
|
@@ -47,21 +48,24 @@ export async function runDoctor(options = {}) {
|
|
|
47
48
|
}
|
|
48
49
|
return result;
|
|
49
50
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
/** The oldest Node major the package supports: `engines.node` in package.json. */
|
|
52
|
+
export const MIN_NODE_MAJOR = 20;
|
|
53
|
+
export function checkNodeVersion(nodeVersion = process.versions.node) {
|
|
54
|
+
const major = Number(nodeVersion.split(".")[0]);
|
|
55
|
+
const shown = `v${nodeVersion.replace(/^v/, "")}`;
|
|
56
|
+
if (Number.isFinite(major) && major >= MIN_NODE_MAJOR) {
|
|
53
57
|
return {
|
|
54
58
|
id: "node-version",
|
|
55
59
|
label: "Node.js",
|
|
56
60
|
status: "ok",
|
|
57
|
-
message:
|
|
61
|
+
message: shown,
|
|
58
62
|
};
|
|
59
63
|
}
|
|
60
64
|
return {
|
|
61
65
|
id: "node-version",
|
|
62
66
|
label: "Node.js",
|
|
63
67
|
status: "fail",
|
|
64
|
-
message: `${
|
|
68
|
+
message: `${shown} (need ${MIN_NODE_MAJOR}+)`,
|
|
65
69
|
};
|
|
66
70
|
}
|
|
67
71
|
async function checkCliVersionCurrent() {
|
|
@@ -83,12 +87,12 @@ async function checkCliVersionCurrent() {
|
|
|
83
87
|
* recorded by `summer setup`: a `--local-dev` link gets the local-dev form
|
|
84
88
|
* so the fix does not replace the checkout with the published package. */
|
|
85
89
|
async function checkSkillsVersion() {
|
|
86
|
-
const registry = await
|
|
90
|
+
const registry = await fetchRegistryDistTags();
|
|
87
91
|
const result = await buildSkillsVersionCheck({
|
|
88
92
|
installedCliVersion: version,
|
|
89
93
|
candidates: defaultSkillMarkerCandidates(),
|
|
90
94
|
recordedInstall: detectRecordedInstall,
|
|
91
|
-
...(registry.ok ? { latestRegistryVersion: registry.
|
|
95
|
+
...(registry.ok ? { latestRegistryVersion: registry.tags.latest, nextRegistryVersion: registry.tags.next } : {}),
|
|
92
96
|
});
|
|
93
97
|
return {
|
|
94
98
|
id: "skills-version-stale",
|
|
@@ -384,11 +388,12 @@ async function checkMcpToolsList() {
|
|
|
384
388
|
await client.connect(transport, { timeout: 5000 });
|
|
385
389
|
const listed = await client.listTools(undefined, { timeout: 5000 });
|
|
386
390
|
const toolNames = listed.tools.map((tool) => tool.name).sort();
|
|
387
|
-
const
|
|
391
|
+
const requiredTools = REQUIRED_MCP_TOOLS[resolveSurface(undefined)];
|
|
392
|
+
const missing = requiredTools.filter((tool) => !toolNames.includes(tool));
|
|
388
393
|
const details = {
|
|
389
394
|
...resolved,
|
|
390
395
|
toolCount: toolNames.length,
|
|
391
|
-
requiredTools
|
|
396
|
+
requiredTools,
|
|
392
397
|
missing,
|
|
393
398
|
server: client.getServerVersion(),
|
|
394
399
|
stderr: stderr.trim().slice(-1000),
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* summer_enable_plugin: enable an editor plugin (`res://addons/<name>/`) and
|
|
4
|
+
* report what really happened. Engines with Summer Apps support run the
|
|
5
|
+
* EnableEditorPlugin op until the plugin's `_enter_tree` has run and answer
|
|
6
|
+
* `enabled` (or a failure `code`); older engines only queue the enable and
|
|
7
|
+
* answer `deferred: true`, so this tool says the result is unknown instead of
|
|
8
|
+
* claiming success. One implementation for the MCP tool and `summer tool
|
|
9
|
+
* enable-plugin`.
|
|
10
|
+
*/
|
|
11
|
+
export declare const enablePluginArgsSchema: z.ZodObject<{
|
|
12
|
+
plugin: z.ZodString;
|
|
13
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
plugin: string;
|
|
16
|
+
timeoutMs?: number | undefined;
|
|
17
|
+
}, {
|
|
18
|
+
plugin: string;
|
|
19
|
+
timeoutMs?: number | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
export declare function enablePluginOp(args: z.output<typeof enablePluginArgsSchema>): {
|
|
22
|
+
op: string;
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
};
|
|
25
|
+
export declare const QUEUED_ONLY_NOTE: string;
|
|
26
|
+
/** The engine's answer for EnableEditorPlugin, as one result an agent can trust. */
|
|
27
|
+
export declare function interpretEnablePluginResult(raw: unknown): Record<string, unknown>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { asRecord } from "../util/json.js";
|
|
3
|
+
import { extractOpError } from "./engine-receipt.js";
|
|
4
|
+
/**
|
|
5
|
+
* summer_enable_plugin: enable an editor plugin (`res://addons/<name>/`) and
|
|
6
|
+
* report what really happened. Engines with Summer Apps support run the
|
|
7
|
+
* EnableEditorPlugin op until the plugin's `_enter_tree` has run and answer
|
|
8
|
+
* `enabled` (or a failure `code`); older engines only queue the enable and
|
|
9
|
+
* answer `deferred: true`, so this tool says the result is unknown instead of
|
|
10
|
+
* claiming success. One implementation for the MCP tool and `summer tool
|
|
11
|
+
* enable-plugin`.
|
|
12
|
+
*/
|
|
13
|
+
export const enablePluginArgsSchema = z.object({
|
|
14
|
+
plugin: z
|
|
15
|
+
.string()
|
|
16
|
+
.min(1)
|
|
17
|
+
.max(200)
|
|
18
|
+
.describe("The plugin folder under res://addons/ (e.g. 'quest_tools') or its 'res://addons/<name>/plugin.cfg'"),
|
|
19
|
+
timeoutMs: z
|
|
20
|
+
.number()
|
|
21
|
+
.int()
|
|
22
|
+
.min(1000)
|
|
23
|
+
.max(120_000)
|
|
24
|
+
.optional()
|
|
25
|
+
.describe("How long the engine waits for the plugin to load (default 30000)"),
|
|
26
|
+
});
|
|
27
|
+
export function enablePluginOp(args) {
|
|
28
|
+
return { op: "EnableEditorPlugin", pluginPath: args.plugin.trim(), ...(args.timeoutMs ? { timeoutMs: args.timeoutMs } : {}) };
|
|
29
|
+
}
|
|
30
|
+
const FAILURE_HINTS = {
|
|
31
|
+
CFG_MISSING: "No plugin.cfg there. Check the folder name under res://addons/.",
|
|
32
|
+
CFG_PARSE_FAILED: "plugin.cfg does not parse. Fix it and enable again.",
|
|
33
|
+
NO_SCRIPT_KEY: "plugin.cfg needs a script= entry under [plugin].",
|
|
34
|
+
EMPTY_SCRIPT_PATH: "plugin.cfg needs a script= entry under [plugin].",
|
|
35
|
+
SCRIPT_MISSING: "The script plugin.cfg names does not exist.",
|
|
36
|
+
SCRIPT_LOAD_FAILED: "The plugin script did not load. Read summer_get_script_errors for it.",
|
|
37
|
+
SCRIPT_ERROR: "The plugin script has errors. Read summer_get_script_errors, fix them, and enable again.",
|
|
38
|
+
NOT_EDITOR_PLUGIN: "The plugin script must extend EditorPlugin.",
|
|
39
|
+
NOT_TOOL: "The plugin script must start with @tool.",
|
|
40
|
+
TIMEOUT: "The plugin did not finish loading in time (often a filesystem scan). Try again, or raise timeoutMs.",
|
|
41
|
+
};
|
|
42
|
+
export const QUEUED_ONLY_NOTE = "This Summer Engine build only queues the enable and does not report whether the plugin loaded. " +
|
|
43
|
+
"Check summer_get_debugger_errors and summer_get_script_errors for the plugin script before relying on it, or update Summer Engine for the real result.";
|
|
44
|
+
/** The engine's answer for EnableEditorPlugin, as one result an agent can trust. */
|
|
45
|
+
export function interpretEnablePluginResult(raw) {
|
|
46
|
+
const root = asRecord(raw) ?? {};
|
|
47
|
+
const results = Array.isArray(root.results) ? root.results : [];
|
|
48
|
+
const entry = asRecord(results.find((item) => asRecord(item)?.op === "EnableEditorPlugin") ?? results[0]) ?? root;
|
|
49
|
+
const addonPath = typeof entry.addonPath === "string" ? entry.addonPath : undefined;
|
|
50
|
+
const error = extractOpError(raw) ?? (entry.ok === false ? String(entry.error ?? "The plugin was not enabled.") : null);
|
|
51
|
+
if (error) {
|
|
52
|
+
const code = typeof entry.code === "string" ? entry.code : undefined;
|
|
53
|
+
return {
|
|
54
|
+
ok: false,
|
|
55
|
+
enabled: false,
|
|
56
|
+
...(addonPath ? { addonPath } : {}),
|
|
57
|
+
...(code ? { code } : {}),
|
|
58
|
+
error,
|
|
59
|
+
...(code && FAILURE_HINTS[code] ? { hint: FAILURE_HINTS[code] } : {}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (entry.alreadyEnabled === true)
|
|
63
|
+
return { ok: true, enabled: true, alreadyEnabled: true, ...(addonPath ? { addonPath } : {}) };
|
|
64
|
+
if (entry.enabled === true) {
|
|
65
|
+
return {
|
|
66
|
+
ok: true,
|
|
67
|
+
enabled: true,
|
|
68
|
+
...(addonPath ? { addonPath } : {}),
|
|
69
|
+
autoloadsRegistered: Array.isArray(entry.autoloadsRegistered) ? entry.autoloadsRegistered : [],
|
|
70
|
+
...(typeof entry.elapsedMs === "number" ? { elapsedMs: entry.elapsedMs } : {}),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Older engines: { ok: true, deferred: true } means "scheduled", not "loaded".
|
|
74
|
+
return { ok: true, enabled: null, queued: true, ...(addonPath ? { addonPath } : {}), note: QUEUED_ONLY_NOTE };
|
|
75
|
+
}
|
|
@@ -56,8 +56,8 @@ export declare const fabricateArgsSchema: z.ZodObject<{
|
|
|
56
56
|
checkpoint: z.ZodOptional<z.ZodBoolean>;
|
|
57
57
|
blender_path: z.ZodOptional<z.ZodString>;
|
|
58
58
|
}, "strip", z.ZodTypeAny, {
|
|
59
|
-
source: string;
|
|
60
59
|
name: string;
|
|
60
|
+
source: string;
|
|
61
61
|
out_path?: string | undefined;
|
|
62
62
|
target_size?: number | undefined;
|
|
63
63
|
import_to_scene?: {
|
|
@@ -68,8 +68,8 @@ export declare const fabricateArgsSchema: z.ZodObject<{
|
|
|
68
68
|
checkpoint?: boolean | undefined;
|
|
69
69
|
blender_path?: string | undefined;
|
|
70
70
|
}, {
|
|
71
|
-
source: string;
|
|
72
71
|
name: string;
|
|
72
|
+
source: string;
|
|
73
73
|
out_path?: string | undefined;
|
|
74
74
|
target_size?: number | undefined;
|
|
75
75
|
import_to_scene?: {
|
|
@@ -15,17 +15,17 @@ export declare const gameTaskPlanInputSchema: z.ZodObject<{
|
|
|
15
15
|
assetPolicy: z.ZodDefault<z.ZodEnum<["reuse-first", "ask-before-paid-generation", "no-paid-generation", "generate-when-clearly-needed"]>>;
|
|
16
16
|
verification: z.ZodDefault<z.ZodEnum<["none", "fast", "full"]>>;
|
|
17
17
|
}, "strip", z.ZodTypeAny, {
|
|
18
|
-
mode: "auto" | "debug" | "new-game" | "feature" | "asset" | "playtest" | "polish"
|
|
19
|
-
target: "auto" | "audio" | "level" | "npc" | "
|
|
18
|
+
mode: "auto" | "ship" | "debug" | "new-game" | "feature" | "asset" | "playtest" | "polish";
|
|
19
|
+
target: "auto" | "audio" | "level" | "npc" | "ui" | "2d" | "3d" | "animation" | "multiplayer";
|
|
20
20
|
goal: string;
|
|
21
21
|
assetPolicy: "reuse-first" | "ask-before-paid-generation" | "no-paid-generation" | "generate-when-clearly-needed";
|
|
22
|
-
verification: "none" | "
|
|
22
|
+
verification: "none" | "full" | "fast";
|
|
23
23
|
}, {
|
|
24
24
|
goal: string;
|
|
25
|
-
mode?: "auto" | "debug" | "new-game" | "feature" | "asset" | "playtest" | "polish" |
|
|
26
|
-
target?: "auto" | "audio" | "level" | "npc" | "
|
|
25
|
+
mode?: "auto" | "ship" | "debug" | "new-game" | "feature" | "asset" | "playtest" | "polish" | undefined;
|
|
26
|
+
target?: "auto" | "audio" | "level" | "npc" | "ui" | "2d" | "3d" | "animation" | "multiplayer" | undefined;
|
|
27
27
|
assetPolicy?: "reuse-first" | "ask-before-paid-generation" | "no-paid-generation" | "generate-when-clearly-needed" | undefined;
|
|
28
|
-
verification?: "none" | "
|
|
28
|
+
verification?: "none" | "full" | "fast" | undefined;
|
|
29
29
|
}>;
|
|
30
30
|
export type GameTaskMode = (typeof GAME_TASK_MODES)[number];
|
|
31
31
|
export type GameTaskTarget = (typeof GAME_TASK_TARGETS)[number];
|
|
@@ -37,6 +37,10 @@ export interface GameTaskPlanOptions {
|
|
|
37
37
|
target?: GameTaskTarget;
|
|
38
38
|
assetPolicy?: AssetPolicy;
|
|
39
39
|
verification?: VerificationLevel;
|
|
40
|
+
/** False when the session has no engine tools (the assets profile): the plan
|
|
41
|
+
* then ends at a delivered file and names only tools the session has. Not
|
|
42
|
+
* part of the input schema; the MCP server sets it from its profile. */
|
|
43
|
+
engine?: boolean;
|
|
40
44
|
}
|
|
41
45
|
export interface SkillRoute {
|
|
42
46
|
/** Library resource id, e.g. "skill/make-game". */
|
|
@@ -62,5 +66,7 @@ export interface GameTaskPlan {
|
|
|
62
66
|
userGates: string[];
|
|
63
67
|
nextAgentSteps: string[];
|
|
64
68
|
antiPatterns: string[];
|
|
69
|
+
/** Present only without engine tools: what this session can and cannot do. */
|
|
70
|
+
profileNote?: string;
|
|
65
71
|
}
|
|
66
72
|
export declare function buildGameTaskPlan(options: GameTaskPlanOptions): GameTaskPlan;
|