summer-engine 2.8.1 → 3.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 +27 -7
- package/.claude-plugin/plugin.json +99 -83
- package/.codex-plugin/plugin.json +112 -82
- package/.cursor-plugin/plugin.json +119 -83
- package/.factory-plugin/plugin.json +100 -3
- package/.mcp.json +6 -1
- package/.opencode/INSTALL.md +7 -4
- package/.opencode/plugins/summer.js +31 -18
- package/AGENTS.md +107 -34
- package/CHANGELOG.md +134 -41
- package/CLAUDE.md +4 -2
- package/GEMINI.md +7 -53
- package/NOTICE +31 -0
- package/README.md +159 -391
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/README.md +20 -6
- package/assets/autopilot/autopilot.gd +80 -26
- package/assets/autopilot/run.sh +132 -7
- package/assets/navigation/web-routes.json +719 -0
- package/commands/gameskill.md +10 -108
- package/commands/summer.md +72 -4
- package/dist/bin/summer.js +6 -87
- package/dist/cli/banner.d.ts +1 -0
- package/dist/cli/banner.js +33 -0
- package/dist/{commands → cli/commands}/config.js +1 -1
- package/dist/cli/commands/create.d.ts +30 -0
- package/dist/cli/commands/create.js +212 -0
- package/dist/{commands → cli/commands}/debug.js +2 -2
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +18 -0
- package/dist/cli/commands/events.d.ts +57 -0
- package/dist/cli/commands/events.js +158 -0
- package/dist/cli/commands/install.d.ts +50 -0
- package/dist/cli/commands/install.js +447 -0
- package/dist/cli/commands/list.js +72 -0
- package/dist/{commands → cli/commands}/login.js +33 -17
- package/dist/{commands → cli/commands}/logout.d.ts +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/{commands → cli/commands}/memory.d.ts +1 -8
- package/dist/{commands → cli/commands}/memory.js +20 -11
- package/dist/cli/commands/open.d.ts +45 -0
- package/dist/cli/commands/open.js +216 -0
- package/dist/{commands → cli/commands}/plan.js +2 -2
- package/dist/{commands → cli/commands}/publish.js +1 -1
- package/dist/{commands → cli/commands}/releases.js +1 -1
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.js +255 -0
- package/dist/{commands → cli/commands}/setup.js +43 -89
- package/dist/{commands → cli/commands}/skills.js +85 -222
- package/dist/{commands → cli/commands}/status.d.ts +1 -0
- package/dist/cli/commands/status.js +62 -0
- package/dist/cli/commands/tool.d.ts +11 -0
- package/dist/cli/commands/tool.js +121 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/root-action.d.ts +7 -0
- package/dist/cli/root-action.js +15 -0
- package/dist/{lib → core}/api-client.d.ts +106 -15
- package/dist/{lib → core}/api-client.js +267 -75
- package/dist/{lib → core}/async-op-lifecycle.d.ts +3 -4
- package/dist/{lib → core}/async-op-lifecycle.js +3 -4
- package/dist/{lib → core}/auth.d.ts +14 -6
- package/dist/{lib → core}/auth.js +56 -40
- package/dist/core/capabilities/agent-playbook.d.ts +20 -0
- package/dist/core/capabilities/agent-playbook.js +218 -0
- package/dist/core/capabilities/api-docs.d.ts +36 -0
- package/dist/core/capabilities/api-docs.js +118 -0
- package/dist/core/capabilities/asset-import.d.ts +49 -0
- package/dist/core/capabilities/asset-import.js +134 -0
- package/dist/core/capabilities/camera-view.d.ts +98 -0
- package/dist/core/capabilities/camera-view.js +222 -0
- package/dist/core/capabilities/capture.d.ts +63 -0
- package/dist/core/capabilities/capture.js +67 -0
- package/dist/core/capabilities/console-read.d.ts +17 -0
- package/dist/core/capabilities/console-read.js +21 -0
- package/dist/{lib → core/capabilities}/creator.d.ts +1 -29
- package/dist/{lib → core/capabilities}/creator.js +14 -33
- package/dist/{lib → core/capabilities}/debug-report.d.ts +1 -1
- package/dist/{lib → core/capabilities}/debug-report.js +12 -31
- package/dist/{commands → core/capabilities}/doctor.d.ts +7 -2
- package/dist/{commands → core/capabilities}/doctor.js +47 -73
- package/dist/core/capabilities/engine-fallbacks.d.ts +26 -0
- package/dist/core/capabilities/engine-fallbacks.js +36 -0
- package/dist/core/capabilities/engine-ops.d.ts +33 -0
- package/dist/core/capabilities/engine-ops.js +145 -0
- package/dist/core/capabilities/engine-receipt.d.ts +53 -0
- package/dist/core/capabilities/engine-receipt.js +134 -0
- package/dist/core/capabilities/events.d.ts +200 -0
- package/dist/core/capabilities/events.js +383 -0
- package/dist/core/capabilities/fabricate-mesh.d.ts +111 -0
- package/dist/core/capabilities/fabricate-mesh.js +165 -0
- package/dist/core/capabilities/frame-quality.d.ts +71 -0
- package/dist/core/capabilities/frame-quality.js +449 -0
- package/dist/core/capabilities/game-task-plan.d.ts +66 -0
- package/dist/{lib → core/capabilities}/game-task-plan.js +59 -8
- package/dist/core/capabilities/hdri-import.d.ts +90 -0
- package/dist/core/capabilities/hdri-import.js +250 -0
- package/dist/core/capabilities/image-generation.d.ts +24 -0
- package/dist/core/capabilities/image-generation.js +22 -0
- package/dist/core/capabilities/navigation/open.d.ts +156 -0
- package/dist/core/capabilities/navigation/open.js +567 -0
- package/dist/core/capabilities/navigation/render-product-map.d.ts +1 -0
- package/dist/core/capabilities/navigation/render-product-map.js +84 -0
- package/dist/core/capabilities/navigation/targets.d.ts +87 -0
- package/dist/core/capabilities/navigation/targets.js +250 -0
- package/dist/core/capabilities/play-determinism.d.ts +35 -0
- package/dist/core/capabilities/play-determinism.js +86 -0
- package/dist/core/capabilities/project-context.d.ts +114 -0
- package/dist/core/capabilities/project-context.js +249 -0
- package/dist/core/capabilities/runtime-control.d.ts +540 -0
- package/dist/core/capabilities/runtime-control.js +1011 -0
- package/dist/core/capabilities/scene-kind.d.ts +19 -0
- package/dist/core/capabilities/scene-kind.js +137 -0
- package/dist/core/capabilities/scene-script.d.ts +38 -0
- package/dist/core/capabilities/scene-script.js +45 -0
- package/dist/core/capabilities/tool-dispatch.d.ts +42 -0
- package/dist/core/capabilities/tool-dispatch.js +1490 -0
- package/dist/core/capabilities/ui-control.d.ts +179 -0
- package/dist/core/capabilities/ui-control.js +423 -0
- package/dist/core/capabilities/variant-types.d.ts +22 -0
- package/dist/core/capabilities/variant-types.js +101 -0
- package/dist/core/capability-skew.d.ts +205 -0
- package/dist/core/capability-skew.js +386 -0
- package/dist/{lib → core}/config.d.ts +11 -1
- package/dist/{lib → core}/config.js +13 -2
- package/dist/core/embeddings.d.ts +78 -0
- package/dist/core/embeddings.js +166 -0
- package/dist/core/engine-install.d.ts +105 -0
- package/dist/core/engine-install.js +190 -0
- package/dist/core/engine.d.ts +94 -0
- package/dist/{lib → core}/engine.js +74 -28
- package/dist/core/feedback/client.d.ts +88 -0
- package/dist/core/feedback/client.js +182 -0
- package/dist/{lib → core}/format.d.ts +0 -1
- package/dist/{lib → core}/format.js +1 -1
- package/dist/core/headless/connection.d.ts +86 -0
- package/dist/core/headless/connection.js +97 -0
- package/dist/core/headless/editor-connection.d.ts +26 -0
- package/dist/core/headless/editor-connection.js +81 -0
- package/dist/core/headless/mcp-routing.d.ts +38 -0
- package/dist/core/headless/mcp-routing.js +83 -0
- package/dist/core/headless/registry.d.ts +91 -0
- package/dist/core/headless/registry.js +226 -0
- package/dist/core/headless/resolve.d.ts +46 -0
- package/dist/core/headless/resolve.js +75 -0
- package/dist/core/headless/spawn.d.ts +46 -0
- package/dist/core/headless/spawn.js +205 -0
- package/dist/core/headless/worker-connection.d.ts +96 -0
- package/dist/core/headless/worker-connection.js +353 -0
- package/dist/core/headless/worker-engine-client.d.ts +58 -0
- package/dist/core/headless/worker-engine-client.js +246 -0
- package/dist/core/launch-posture.d.ts +170 -0
- package/dist/core/launch-posture.js +317 -0
- package/dist/core/library-read.d.ts +73 -0
- package/dist/core/library-read.js +279 -0
- package/dist/core/library-search.d.ts +143 -0
- package/dist/core/library-search.js +301 -0
- package/dist/{lib → core}/log-filters.js +4 -2
- package/dist/{lib → core}/mcp-log.js +2 -17
- package/dist/core/package-root.d.ts +9 -0
- package/dist/core/package-root.js +11 -0
- package/dist/core/redact.d.ts +20 -0
- package/dist/core/redact.js +64 -0
- package/dist/core/registry-search.d.ts +167 -0
- package/dist/core/registry-search.js +358 -0
- package/dist/core/skills-registry.d.ts +47 -0
- package/dist/core/skills-registry.js +83 -0
- package/dist/{lib → core}/store.js +11 -7
- package/dist/{lib → core}/summer-compatibility.js +3 -3
- package/dist/{lib → core}/telemetry.js +5 -2
- package/dist/core/templates.d.ts +98 -0
- package/dist/core/templates.js +241 -0
- package/dist/core/tool-errors.d.ts +30 -0
- package/dist/core/tool-errors.js +40 -0
- package/dist/core/trajectory.d.ts +80 -0
- package/dist/core/trajectory.js +307 -0
- package/dist/core/util/http.d.ts +13 -0
- package/dist/core/util/http.js +28 -0
- package/dist/core/util/json.d.ts +12 -0
- package/dist/core/util/json.js +21 -0
- package/dist/core/util/process.d.ts +3 -0
- package/dist/core/util/process.js +13 -0
- package/dist/core/util/sleep.d.ts +1 -0
- package/dist/core/util/sleep.js +3 -0
- package/dist/core/version.d.ts +3 -0
- package/dist/core/version.js +5 -0
- package/dist/{lib → installer}/agent-config.d.ts +20 -1
- package/dist/{lib → installer}/agent-config.js +148 -23
- package/dist/installer/legacy-skills.d.ts +26 -0
- package/dist/installer/legacy-skills.js +53 -0
- package/dist/installer/setup.d.ts +76 -0
- package/dist/installer/setup.js +146 -0
- package/dist/installer/skill-locations.d.ts +45 -0
- package/dist/installer/skill-locations.js +170 -0
- package/dist/installer/version-check.d.ts +174 -0
- package/dist/{lib → installer}/version-check.js +173 -42
- package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
- package/dist/{commands/mcp.js → mcp/command.js} +18 -6
- package/dist/mcp/server.d.ts +23 -3
- package/dist/mcp/server.js +122 -28
- package/dist/mcp/tools/asset-tools.js +62 -142
- package/dist/mcp/tools/creator-tools.js +5 -23
- package/dist/mcp/tools/debug-tools.js +61 -18
- package/dist/mcp/tools/event-tools.d.ts +14 -0
- package/dist/mcp/tools/event-tools.js +41 -0
- package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
- package/dist/mcp/tools/fabricate-tools.js +28 -0
- package/dist/mcp/tools/feedback-tools.d.ts +77 -0
- package/dist/mcp/tools/feedback-tools.js +88 -0
- package/dist/mcp/tools/file-tools.js +6 -53
- package/dist/mcp/tools/generate-tools.js +37 -63
- package/dist/mcp/tools/library-tools.d.ts +11 -0
- package/dist/mcp/tools/library-tools.js +42 -0
- package/dist/mcp/tools/navigation-tools.d.ts +7 -0
- package/dist/mcp/tools/navigation-tools.js +37 -0
- package/dist/mcp/tools/perception-tools.d.ts +20 -0
- package/dist/mcp/tools/perception-tools.js +146 -0
- package/dist/mcp/tools/project-tools.d.ts +14 -0
- package/dist/mcp/tools/project-tools.js +72 -281
- package/dist/mcp/tools/runtime-tools.d.ts +2 -0
- package/dist/mcp/tools/runtime-tools.js +92 -0
- package/dist/mcp/tools/scene-tools.d.ts +3 -0
- package/dist/mcp/tools/scene-tools.js +68 -119
- package/dist/mcp/tools/script-tools.d.ts +3 -0
- package/dist/mcp/tools/script-tools.js +118 -0
- package/dist/mcp/tools/spatial-tools.d.ts +2 -0
- package/dist/mcp/tools/spatial-tools.js +485 -0
- package/dist/mcp/tools/text-json.d.ts +8 -0
- package/dist/mcp/tools/text-json.js +12 -0
- package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
- package/dist/mcp/tools/ui-tools.js +82 -0
- package/dist/mcp/tools/visual-tools.d.ts +2 -7
- package/dist/mcp/tools/visual-tools.js +383 -101
- package/dist/mcp/tools/with-engine.d.ts +9 -15
- package/dist/mcp/tools/with-engine.js +60 -96
- package/dist/project-memory/project-manifest.d.ts +36 -0
- package/dist/project-memory/project-manifest.js +50 -0
- package/dist/project-memory/project-memory.d.ts +57 -0
- package/dist/{lib → project-memory}/project-memory.js +46 -0
- package/gemini-extension.json +103 -2
- package/hooks/hooks-cursor.json +2 -2
- package/hooks/hooks.json +2 -1
- package/hooks/pre-commit-doctor.sh +45 -39
- package/hooks/run-hook.cmd +30 -23
- package/hooks/run-hook.sh +20 -0
- package/hooks/session-start.sh +18 -7
- package/integrations/README.md +70 -0
- package/integrations/claude/README.md +19 -0
- package/integrations/claude/manifest-target.json +16 -0
- package/integrations/cline/README.md +13 -0
- package/integrations/cline/manifest-target.json +3 -0
- package/integrations/codex/README.md +15 -0
- package/integrations/codex/manifest-target.json +5 -0
- package/integrations/cursor/README.md +16 -0
- package/integrations/cursor/manifest-target.json +5 -0
- package/integrations/factory/README.md +26 -0
- package/integrations/factory/manifest-target.json +5 -0
- package/integrations/gemini/README.md +26 -0
- package/integrations/gemini/manifest-target.json +5 -0
- package/integrations/github-copilot/README.md +12 -0
- package/integrations/github-copilot/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +16 -0
- package/integrations/kilo-code/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +12 -0
- package/integrations/lm-studio/manifest-target.json +3 -0
- package/integrations/opencode/README.md +15 -0
- package/integrations/opencode/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +13 -0
- package/integrations/roo-code/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +12 -0
- package/integrations/vscode-copilot/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +13 -0
- package/integrations/windsurf/manifest-target.json +3 -0
- package/library/references/collaborative-protocol/resource.yaml +24 -0
- package/library/references/gd-style/resource.yaml +24 -0
- package/{references → library/references/godot-version}/godot-version.md +6 -6
- package/library/references/godot-version/resource.yaml +22 -0
- package/library/references/headless-routing/headless-routing.md +46 -0
- package/library/references/headless-routing/resource.yaml +24 -0
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
- package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
- package/library/references/mcp-tools-reference/resource.yaml +17 -0
- package/library/references/product-map/product-map.md +103 -0
- package/library/references/product-map/resource.yaml +33 -0
- package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
- package/library/references/public-surface-language/resource.yaml +17 -0
- package/library/references/summer-folder/resource.yaml +20 -0
- package/{references → library/references/summer-folder}/summer-folder.md +22 -21
- package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
- package/library/skills/3d-lighting/resource.yaml +27 -0
- package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
- package/library/skills/adaptive-music/resource.yaml +28 -0
- package/library/skills/agent-playtesting/SKILL.md +148 -0
- package/library/skills/agent-playtesting/resource.yaml +52 -0
- package/library/skills/ambient-bed/resource.yaml +24 -0
- package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
- package/library/skills/animated-loop/resource.yaml +27 -0
- package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
- package/library/skills/animation-tree/resource.yaml +33 -0
- package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
- package/library/skills/art-direction/resource.yaml +29 -0
- package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
- package/library/skills/asset-strategy/resource.yaml +63 -0
- package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
- package/library/skills/audio-direction/resource.yaml +32 -0
- package/library/skills/auto-fire-targeting/resource.yaml +22 -0
- package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
- package/library/skills/brainstorm-game/resource.yaml +30 -0
- package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
- package/library/skills/brainstorming/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
- package/library/skills/browse-templates/resource.yaml +23 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
- package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
- package/library/skills/character-animation-wiring/SKILL.md +249 -0
- package/library/skills/character-animation-wiring/resource.yaml +39 -0
- package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
- package/library/skills/character-model/resource.yaml +36 -0
- package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
- package/library/skills/character-portrait/resource.yaml +30 -0
- package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
- package/library/skills/cinematic-cutscene/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
- package/library/skills/concept-art/resource.yaml +34 -0
- package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
- package/library/skills/create-asset-sheet/resource.yaml +33 -0
- package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
- package/library/skills/debug/resource.yaml +31 -0
- package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
- package/library/skills/debugging-game-feel/resource.yaml +25 -0
- package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
- package/library/skills/design-level/resource.yaml +31 -0
- package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
- package/library/skills/design-mechanic/resource.yaml +31 -0
- package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
- package/library/skills/design-npc/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
- package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
- package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
- package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
- package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
- package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
- package/library/skills/environment-kit/resource.yaml +29 -0
- package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
- package/library/skills/export-and-ship/resource.yaml +32 -0
- package/library/skills/fabricating-assets/SKILL.md +195 -0
- package/library/skills/fabricating-assets/resource.yaml +52 -0
- package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
- package/library/skills/facial-and-lipsync/resource.yaml +36 -0
- package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
- package/library/skills/fps-controller/resource.yaml +29 -0
- package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
- package/library/skills/game-feel/resource.yaml +27 -0
- package/library/skills/gameskill/SKILL.md +64 -0
- package/library/skills/gameskill/resource.yaml +22 -0
- package/library/skills/gdscript-patterns/resource.yaml +23 -0
- package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
- package/library/skills/generate-motion/resource.yaml +34 -0
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
- package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
- package/library/skills/headless-scripting/resource.yaml +26 -0
- package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +1 -1
- package/library/skills/host-authoritative-state/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
- package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
- package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
- package/library/skills/investigating-bugs/resource.yaml +24 -0
- package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +23 -23
- package/library/skills/make-game/resource.yaml +35 -0
- package/library/skills/music-track/resource.yaml +28 -0
- package/library/skills/navigate-summer/SKILL.md +61 -0
- package/library/skills/navigate-summer/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
- package/library/skills/new-project/resource.yaml +28 -0
- package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
- package/library/skills/organic-model/resource.yaml +32 -0
- package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
- package/library/skills/pixel-art/resource.yaml +31 -0
- package/library/skills/play/resource.yaml +26 -0
- package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
- package/library/skills/playtesting-a-feature/resource.yaml +31 -0
- package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
- package/library/skills/procedural-animation/resource.yaml +33 -0
- package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
- package/library/skills/prop-model/resource.yaml +33 -0
- package/library/skills/psx-retro-rendering/SKILL.md +416 -0
- package/library/skills/psx-retro-rendering/resource.yaml +36 -0
- package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
- package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
- package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
- package/library/skills/remote-deploy/resource.yaml +23 -0
- package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
- package/library/skills/retarget/resource.yaml +33 -0
- package/library/skills/running-in-the-cloud/SKILL.md +103 -0
- package/library/skills/running-in-the-cloud/resource.yaml +33 -0
- package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +9 -1
- package/library/skills/scene-composition/resource.yaml +27 -0
- package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
- package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
- package/library/skills/scene-scripting/SKILL.md +764 -0
- package/library/skills/scene-scripting/resource.yaml +58 -0
- package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
- package/library/skills/scene-to-level/resource.yaml +33 -0
- package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +1 -1
- package/library/skills/setup-multiplayer/resource.yaml +28 -0
- package/library/skills/skill-create/SKILL.md +138 -0
- package/library/skills/skill-create/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
- package/library/skills/skill-improve/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
- package/library/skills/skill-test/resource.yaml +26 -0
- package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
- package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
- package/library/skills/skybox-panorama/resource.yaml +28 -0
- package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
- package/library/skills/sound-effect/resource.yaml +27 -0
- package/library/skills/spatial-placement/SKILL.md +74 -0
- package/library/skills/spatial-placement/resource.yaml +42 -0
- package/library/skills/spatial-placement/tests/spec.md +65 -0
- package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
- package/library/skills/sprite-sheet/resource.yaml +32 -0
- package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
- package/library/skills/tileable-texture/resource.yaml +31 -0
- package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
- package/library/skills/trailer-shot/resource.yaml +27 -0
- package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
- package/library/skills/tune-performance/resource.yaml +31 -0
- package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +1 -1
- package/library/skills/ui-basics/resource.yaml +25 -0
- package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
- package/library/skills/ui-graphics/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
- package/library/skills/use-widget-asset/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
- package/library/skills/using-summer/resource.yaml +41 -0
- package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
- package/library/skills/vehicle-model/resource.yaml +34 -0
- package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
- package/library/skills/verification-before-completion/resource.yaml +23 -0
- package/library/skills/verifying-scenes/SKILL.md +98 -0
- package/library/skills/verifying-scenes/resource.yaml +42 -0
- package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
- package/library/skills/vfx-dissolve/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
- package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-fire/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-hit-spark/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-lightning/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-magic-glow/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
- package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
- package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-smoke/resource.yaml +32 -0
- package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-water-ripple/resource.yaml +31 -0
- package/library/skills/voice-line/resource.yaml +27 -0
- package/library/skills/world-building-3d/SKILL.md +105 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
- package/library/skills/world-building-3d/resource.yaml +44 -0
- package/library/skills/world-building-3d/tests/spec.md +48 -0
- package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
- package/library/skills/writing-plans/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
- package/library/skills/writing-skills/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
- package/library/templates/2d-brario-platformer/resource.yaml +21 -0
- package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
- package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
- package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
- package/library/templates/2d-platformer/resource.yaml +24 -0
- package/library/templates/2d-rpg/resource.yaml +21 -0
- package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
- package/library/templates/3d-basic/resource.yaml +16 -0
- package/library/templates/3d-city-kit/resource.yaml +24 -0
- package/library/templates/3d-fps-old-school/resource.yaml +21 -0
- package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
- package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
- package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
- package/library/templates/3d-racing-game/resource.yaml +21 -0
- package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
- package/library/templates/3d-third-person-controller/resource.yaml +21 -0
- package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
- package/library/templates/README.md +94 -0
- package/library/templates/empty/resource.yaml +16 -0
- package/library/tools/add-node/resource.yaml +60 -0
- package/library/tools/align-distribute-3d/resource.yaml +87 -0
- package/library/tools/api-docs/resource.yaml +57 -0
- package/library/tools/batch/resource.yaml +52 -0
- package/library/tools/camera-bookmark/resource.yaml +73 -0
- package/library/tools/check-job/resource.yaml +45 -0
- package/library/tools/clear-console/resource.yaml +40 -0
- package/library/tools/connect-signal/resource.yaml +63 -0
- package/library/tools/create-debug-report/resource.yaml +67 -0
- package/library/tools/create-scene/resource.yaml +59 -0
- package/library/tools/creator-config/resource.yaml +63 -0
- package/library/tools/creator-publish/resource.yaml +73 -0
- package/library/tools/creator-releases/resource.yaml +53 -0
- package/library/tools/fabricate-3d/resource.yaml +108 -0
- package/library/tools/game-control/resource.yaml +84 -0
- package/library/tools/game-input/resource.yaml +159 -0
- package/library/tools/game-probe/resource.yaml +90 -0
- package/library/tools/generate-3d/resource.yaml +112 -0
- package/library/tools/generate-audio/resource.yaml +80 -0
- package/library/tools/generate-image/resource.yaml +62 -0
- package/library/tools/generate-motion/resource.yaml +66 -0
- package/library/tools/generate-video/resource.yaml +66 -0
- package/library/tools/get-agent-playbook/resource.yaml +40 -0
- package/library/tools/get-asset/resource.yaml +42 -0
- package/library/tools/get-asset-download-url/resource.yaml +52 -0
- package/library/tools/get-console/resource.yaml +69 -0
- package/library/tools/get-debugger-errors/resource.yaml +56 -0
- package/library/tools/get-debugger-warnings/resource.yaml +52 -0
- package/library/tools/get-diagnostics/resource.yaml +42 -0
- package/library/tools/get-project-context/resource.yaml +45 -0
- package/library/tools/get-runtime-tree/resource.yaml +62 -0
- package/library/tools/get-scene-tree/resource.yaml +52 -0
- package/library/tools/get-script-errors/resource.yaml +45 -0
- package/library/tools/get-studio-workflow/resource.yaml +43 -0
- package/library/tools/import-asset/resource.yaml +73 -0
- package/library/tools/import-asset-by-id/resource.yaml +56 -0
- package/library/tools/import-from-url/resource.yaml +51 -0
- package/library/tools/import-from-url-batch/resource.yaml +60 -0
- package/library/tools/import-hdri/resource.yaml +69 -0
- package/library/tools/input-map-bind/resource.yaml +52 -0
- package/library/tools/inspect-node/resource.yaml +46 -0
- package/library/tools/inspect-resource/resource.yaml +45 -0
- package/library/tools/inspect-runtime-node/resource.yaml +54 -0
- package/library/tools/instantiate-scene/resource.yaml +62 -0
- package/library/tools/is-running/resource.yaml +40 -0
- package/library/tools/library-feedback/resource.yaml +89 -0
- package/library/tools/list-my-assets/resource.yaml +56 -0
- package/library/tools/navigation-probe/resource.yaml +85 -0
- package/library/tools/open/resource.yaml +80 -0
- package/library/tools/open-main-scene/resource.yaml +40 -0
- package/library/tools/open-scene/resource.yaml +46 -0
- package/library/tools/play/resource.yaml +91 -0
- package/library/tools/project-setting/resource.yaml +53 -0
- package/library/tools/read-file/resource.yaml +47 -0
- package/library/tools/read-library/resource.yaml +67 -0
- package/library/tools/recent-events/resource.yaml +71 -0
- package/library/tools/remove-node/resource.yaml +51 -0
- package/library/tools/replace-node/resource.yaml +57 -0
- package/library/tools/replace-text/resource.yaml +61 -0
- package/library/tools/run-editor-script/resource.yaml +61 -0
- package/library/tools/run-script/resource.yaml +73 -0
- package/library/tools/runtime-animate/resource.yaml +140 -0
- package/library/tools/runtime-call/resource.yaml +74 -0
- package/library/tools/runtime-set/resource.yaml +80 -0
- package/library/tools/runtime-spawn/resource.yaml +95 -0
- package/library/tools/save-scene/resource.yaml +50 -0
- package/library/tools/screenshot/resource.yaml +112 -0
- package/library/tools/search-assets/resource.yaml +67 -0
- package/library/tools/search-library/resource.yaml +81 -0
- package/library/tools/select-node/resource.yaml +48 -0
- package/library/tools/set-prop/resource.yaml +64 -0
- package/library/tools/set-resource-property/resource.yaml +66 -0
- package/library/tools/slice-asset-sheet/resource.yaml +47 -0
- package/library/tools/snap-to-surface/resource.yaml +90 -0
- package/library/tools/snapshot-diff/resource.yaml +58 -0
- package/library/tools/starcast/resource.yaml +120 -0
- package/library/tools/start-game-task/resource.yaml +91 -0
- package/library/tools/stop/resource.yaml +51 -0
- package/library/tools/test-placement/resource.yaml +109 -0
- package/library/tools/ui-actions/resource.yaml +77 -0
- package/library/tools/ui-activate/resource.yaml +88 -0
- package/library/tools/ui-screenshot/resource.yaml +63 -0
- package/library/tools/ui-tree/resource.yaml +69 -0
- package/library/tools/wait-for-event/resource.yaml +84 -0
- package/library/tools/world-snapshot/resource.yaml +60 -0
- package/library/tools/write-file/resource.yaml +54 -0
- package/package.json +22 -16
- package/registry/generated/aliases.json +207 -0
- package/registry/generated/counts.json +12 -0
- package/registry/generated/gemini-extension.json +122 -0
- package/registry/generated/index.json +7709 -0
- package/registry/generated/marketplace.claude.json +44 -0
- package/registry/generated/mcp.json +13 -0
- package/registry/generated/plugin.claude.json +135 -0
- package/registry/generated/plugin.codex.json +144 -0
- package/registry/generated/plugin.cursor.json +134 -0
- package/registry/generated/plugin.factory.json +117 -0
- package/registry/generated/skills-registry.json +851 -0
- package/registry/generated/templates-registry.json +455 -0
- package/registry/schemas/allowed-hosts.json +19 -0
- package/registry/schemas/collection.schema.json +68 -0
- package/registry/schemas/domains.json +96 -0
- package/registry/schemas/example.schema.json +11 -0
- package/registry/schemas/reference.schema.json +10 -0
- package/registry/schemas/resource.schema.json +154 -0
- package/registry/schemas/skill.schema.json +14 -0
- package/registry/schemas/template.schema.json +46 -0
- package/registry/schemas/tool.schema.json +61 -0
- package/_persona/summer/SKILL.md +0 -113
- package/dist/bin/postinstall.d.ts +0 -2
- package/dist/bin/postinstall.js +0 -3
- package/dist/commands/cloud.d.ts +0 -2
- package/dist/commands/cloud.js +0 -80
- package/dist/commands/create.d.ts +0 -3
- package/dist/commands/create.js +0 -171
- package/dist/commands/install.d.ts +0 -19
- package/dist/commands/install.js +0 -194
- package/dist/commands/list.js +0 -67
- package/dist/commands/logout.js +0 -13
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -19
- package/dist/commands/open.d.ts +0 -2
- package/dist/commands/open.js +0 -32
- package/dist/commands/orchestrator.d.ts +0 -8
- package/dist/commands/orchestrator.js +0 -143
- package/dist/commands/run.d.ts +0 -2
- package/dist/commands/run.js +0 -167
- package/dist/commands/status.js +0 -46
- package/dist/lib/banner.d.ts +0 -4
- package/dist/lib/banner.js +0 -122
- package/dist/lib/cloud/api.d.ts +0 -79
- package/dist/lib/cloud/api.js +0 -107
- package/dist/lib/cloud/apply.d.ts +0 -32
- package/dist/lib/cloud/apply.js +0 -294
- package/dist/lib/cloud/checkpoint.d.ts +0 -26
- package/dist/lib/cloud/checkpoint.js +0 -142
- package/dist/lib/cloud/conflicts.d.ts +0 -55
- package/dist/lib/cloud/conflicts.js +0 -131
- package/dist/lib/cloud/containment.d.ts +0 -8
- package/dist/lib/cloud/containment.js +0 -52
- package/dist/lib/cloud/diff.d.ts +0 -39
- package/dist/lib/cloud/diff.js +0 -138
- package/dist/lib/cloud/engine-bridge.d.ts +0 -34
- package/dist/lib/cloud/engine-bridge.js +0 -139
- package/dist/lib/cloud/hash-cache.d.ts +0 -23
- package/dist/lib/cloud/hash-cache.js +0 -44
- package/dist/lib/cloud/hash.d.ts +0 -10
- package/dist/lib/cloud/hash.js +0 -111
- package/dist/lib/cloud/http.d.ts +0 -17
- package/dist/lib/cloud/http.js +0 -47
- package/dist/lib/cloud/lock-path.d.ts +0 -1
- package/dist/lib/cloud/lock-path.js +0 -5
- package/dist/lib/cloud/lock.d.ts +0 -14
- package/dist/lib/cloud/lock.js +0 -143
- package/dist/lib/cloud/manifest.d.ts +0 -6
- package/dist/lib/cloud/manifest.js +0 -41
- package/dist/lib/cloud/paths.d.ts +0 -20
- package/dist/lib/cloud/paths.js +0 -90
- package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
- package/dist/lib/cloud/project-godot-merge.js +0 -185
- package/dist/lib/cloud/rules.d.ts +0 -39
- package/dist/lib/cloud/rules.js +0 -159
- package/dist/lib/cloud/sync.d.ts +0 -21
- package/dist/lib/cloud/sync.js +0 -518
- package/dist/lib/cloud/transfer.d.ts +0 -23
- package/dist/lib/cloud/transfer.js +0 -184
- package/dist/lib/cloud/types.d.ts +0 -62
- package/dist/lib/cloud/types.js +0 -1
- package/dist/lib/cloud/validate-path.d.ts +0 -23
- package/dist/lib/cloud/validate-path.js +0 -103
- package/dist/lib/engine.d.ts +0 -51
- package/dist/lib/game-task-plan.d.ts +0 -42
- package/dist/lib/project-memory.d.ts +0 -33
- package/dist/lib/public-surface-paths.d.ts +0 -13
- package/dist/lib/public-surface-paths.js +0 -42
- package/dist/lib/remote-templates.d.ts +0 -25
- package/dist/lib/remote-templates.js +0 -86
- package/dist/lib/skills-registry.d.ts +0 -572
- package/dist/lib/skills-registry.js +0 -1061
- package/dist/lib/version-check.d.ts +0 -106
- package/dist/mcp/tools/cloud-tools.js +0 -42
- package/references/mcp-tools-reference.md +0 -199
- package/references/template-registry.md +0 -73
- package/skills/README.md +0 -103
- package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
- package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
- package/skills/workflow/brainstorming/scripts/helper.js +0 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
- package/skills/workflow/brainstorming/visual-companion.md +0 -287
- package/skills/workflow/gameskill/SKILL.md +0 -120
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
- package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
- package/skills/workflow/investigating-bugs/test-academic.md +0 -14
- package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
- package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
- package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
- package/skills/workflow/mcpupdate/SKILL.md +0 -134
- package/skills/workflow/skill-create/SKILL.md +0 -153
- package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
- package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
- package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
- package/skills/workflow/writing-skills/render-graphs.js +0 -168
- /package/dist/{commands → cli/commands}/config.d.ts +0 -0
- /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/login.d.ts +0 -0
- /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
- /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
- /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
- /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
- /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
- /package/dist/{lib → core}/log-filters.d.ts +0 -0
- /package/dist/{lib → core}/mcp-log.d.ts +0 -0
- /package/dist/{lib → core}/store.d.ts +0 -0
- /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
- /package/dist/{lib → core}/telemetry.d.ts +0 -0
- /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
- /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
- /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
- /package/{references → library/references/gd-style}/gd-style.md +0 -0
- /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
- /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
- /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
- /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
- /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
- /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
- /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
|
@@ -1,23 +1,11 @@
|
|
|
1
|
-
import { mkdir, writeFile } from "fs/promises";
|
|
1
|
+
import { mkdir, readdir, rm, stat, writeFile } from "fs/promises";
|
|
2
2
|
import { tmpdir } from "os";
|
|
3
3
|
import { join } from "path";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
5
|
-
import {
|
|
5
|
+
import { checkEngineHealth, discoverRegistryConnection, engineNotRunningError, engineSelectionFromEnv, getApiPort, getApiToken, resolveEngineConnection, } from "./engine.js";
|
|
6
|
+
import { asRecord, boolFrom, numberFrom, stringFrom } from "./util/json.js";
|
|
6
7
|
import { classifyOpsResponse, pollOpToTerminal, } from "./async-op-lifecycle.js";
|
|
7
|
-
|
|
8
|
-
return value && typeof value === "object" && !Array.isArray(value)
|
|
9
|
-
? value
|
|
10
|
-
: null;
|
|
11
|
-
}
|
|
12
|
-
function stringFrom(value) {
|
|
13
|
-
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
14
|
-
}
|
|
15
|
-
function numberFrom(value) {
|
|
16
|
-
return typeof value === "number" ? value : undefined;
|
|
17
|
-
}
|
|
18
|
-
function boolFrom(value) {
|
|
19
|
-
return typeof value === "boolean" ? value : undefined;
|
|
20
|
-
}
|
|
8
|
+
import { pickPlayDeterminism } from "./capabilities/play-determinism.js";
|
|
21
9
|
function findSnapshotPayload(value) {
|
|
22
10
|
const record = asRecord(value);
|
|
23
11
|
if (!record)
|
|
@@ -65,6 +53,38 @@ function withoutImageData(payload) {
|
|
|
65
53
|
}
|
|
66
54
|
return metadata;
|
|
67
55
|
}
|
|
56
|
+
/** rebind() could not re-read engine health; the session identity is unchanged. */
|
|
57
|
+
export class EngineRebindError extends Error {
|
|
58
|
+
constructor(message) {
|
|
59
|
+
super(message);
|
|
60
|
+
this.name = "EngineRebindError";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const SNAPSHOT_TTL_MS = 24 * 60 * 60 * 1000;
|
|
64
|
+
/**
|
|
65
|
+
* Snapshot files otherwise accumulate in tmpdir for the life of the machine.
|
|
66
|
+
* Remove those older than 24h on each write. Best-effort by contract: a
|
|
67
|
+
* failed reap must never fail (or slow down) the capture that triggered it.
|
|
68
|
+
*/
|
|
69
|
+
async function reapStaleSnapshots(dir) {
|
|
70
|
+
try {
|
|
71
|
+
const cutoff = Date.now() - SNAPSHOT_TTL_MS;
|
|
72
|
+
for (const name of await readdir(dir)) {
|
|
73
|
+
const full = join(dir, name);
|
|
74
|
+
try {
|
|
75
|
+
const info = await stat(full);
|
|
76
|
+
if (info.isFile() && info.mtimeMs < cutoff)
|
|
77
|
+
await rm(full, { force: true });
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// per-file failure (raced by another process, permissions): skip it
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// unreadable directory: nothing to reap
|
|
86
|
+
}
|
|
87
|
+
}
|
|
68
88
|
export class EngineApiClient {
|
|
69
89
|
port;
|
|
70
90
|
token;
|
|
@@ -75,6 +95,14 @@ export class EngineApiClient {
|
|
|
75
95
|
// supplied a projectIdHash.
|
|
76
96
|
targetIdentity;
|
|
77
97
|
selection;
|
|
98
|
+
// Set only when the no-selection connect found its editor through the
|
|
99
|
+
// instance registry (no live pointer): credentialsChanged then re-runs the
|
|
100
|
+
// registry lookup with the same options instead of reading the pointer.
|
|
101
|
+
registryDiscovery = null;
|
|
102
|
+
// The most recent /api/health seen at connect/rebind. Carries the engine's
|
|
103
|
+
// capability advert (opKinds, singleOnlyOps) so tools can fail closed on a
|
|
104
|
+
// provably missing op without a second health round trip per call.
|
|
105
|
+
lastHealth = null;
|
|
78
106
|
constructor(port, token, targetIdentity = {}, selection = null) {
|
|
79
107
|
this.port = port;
|
|
80
108
|
this.token = token;
|
|
@@ -84,34 +112,73 @@ export class EngineApiClient {
|
|
|
84
112
|
: { ...targetIdentity };
|
|
85
113
|
this.selection = selection ? { ...selection } : null;
|
|
86
114
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
115
|
+
/**
|
|
116
|
+
* With a selection (the MCP server: --project / --instance / its cwd) the
|
|
117
|
+
* registry decides — resolveEngineConnection. Without one (the CLI face):
|
|
118
|
+
* SUMMER_ENGINE_PROJECT / SUMMER_ENGINE_INSTANCE_ID when set (same names the
|
|
119
|
+
* MCP server reads), else the global pointer (~/.summer/api-token + api-port)
|
|
120
|
+
* when it names an engine that answers /api/health — today's behaviour,
|
|
121
|
+
* unchanged — else the instance registry (discoverRegistryConnection), so an
|
|
122
|
+
* editor launched `--summer-no-publish` or a second editor is still found.
|
|
123
|
+
* The pointer is read through getApiPort/getApiToken/checkEngineHealth so
|
|
124
|
+
* tests that stub those readers never touch the real ~/.summer. `discovery`
|
|
125
|
+
* is a test seam (fake ~/.summer, cwd, env).
|
|
126
|
+
*/
|
|
127
|
+
static async connect(selection, discovery = {}) {
|
|
128
|
+
const envSelection = selection ? null : engineSelectionFromEnv(discovery.env);
|
|
129
|
+
const effective = selection ?? envSelection;
|
|
130
|
+
if (effective) {
|
|
131
|
+
const connection = await resolveEngineConnection(effective, {
|
|
132
|
+
summerDir: discovery.summerDir,
|
|
133
|
+
nowMs: discovery.nowMs,
|
|
134
|
+
});
|
|
135
|
+
const client = new EngineApiClient(connection.port, connection.token, {
|
|
91
136
|
instanceId: connection.health.instanceId,
|
|
92
137
|
projectId: connection.health.projectId,
|
|
93
138
|
projectIdHash: connection.health.projectIdHash,
|
|
94
|
-
}, { ...
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const token = await getApiToken();
|
|
98
|
-
if (!token) {
|
|
99
|
-
throw new Error("Summer Engine is not running (no api-token found). Open Summer Engine first.");
|
|
100
|
-
}
|
|
101
|
-
const health = await checkEngineHealth(port);
|
|
102
|
-
if (!health) {
|
|
103
|
-
throw new Error(`Summer Engine is not responding on port ${port}. Make sure it's open.`);
|
|
139
|
+
}, { ...effective });
|
|
140
|
+
client.lastHealth = connection.health;
|
|
141
|
+
return client;
|
|
104
142
|
}
|
|
105
143
|
// Bind to whatever project is open right now. On a genuine engine restart the
|
|
106
144
|
// token rotates and getClient() rebuilds this client, so a restart naturally
|
|
107
145
|
// rebinds to the current project. An in-place project switch keeps the same
|
|
108
146
|
// token, so the cached client retains its original binding and the engine
|
|
109
147
|
// rejects mismatched mutations until the agent explicitly rebinds.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
148
|
+
const port = await getApiPort(discovery.summerDir);
|
|
149
|
+
const token = await getApiToken(discovery.summerDir);
|
|
150
|
+
if (token) {
|
|
151
|
+
const health = await checkEngineHealth(port);
|
|
152
|
+
if (health) {
|
|
153
|
+
const client = new EngineApiClient(port, token, {
|
|
154
|
+
instanceId: health.instanceId,
|
|
155
|
+
projectId: health.projectId,
|
|
156
|
+
projectIdHash: health.projectIdHash,
|
|
157
|
+
});
|
|
158
|
+
client.lastHealth = health;
|
|
159
|
+
return client;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const connection = await discoverRegistryConnection(discovery);
|
|
163
|
+
if (!connection)
|
|
164
|
+
throw engineNotRunningError({ port, token }, discovery.summerDir);
|
|
165
|
+
const client = new EngineApiClient(connection.port, connection.token, {
|
|
166
|
+
instanceId: connection.health.instanceId,
|
|
167
|
+
projectId: connection.health.projectId,
|
|
168
|
+
projectIdHash: connection.health.projectIdHash,
|
|
114
169
|
});
|
|
170
|
+
client.lastHealth = connection.health;
|
|
171
|
+
client.registryDiscovery = { ...discovery };
|
|
172
|
+
return client;
|
|
173
|
+
}
|
|
174
|
+
/** The engine's capability advert from the last health read (connect or
|
|
175
|
+
* rebind), or undefined when the engine predates the advert. */
|
|
176
|
+
getEngineCapabilities() {
|
|
177
|
+
return this.lastHealth?.capabilities;
|
|
178
|
+
}
|
|
179
|
+
/** Engine version string from the last health read, for skew messages. */
|
|
180
|
+
getEngineVersion() {
|
|
181
|
+
return this.lastHealth?.version;
|
|
115
182
|
}
|
|
116
183
|
/** The projectIdHash this session is bound to (undefined if none was reported
|
|
117
184
|
* at connect — e.g. no project open yet). */
|
|
@@ -124,16 +191,22 @@ export class EngineApiClient {
|
|
|
124
191
|
* switch (the deliberate escape hatch after an identity_mismatch). Returns the
|
|
125
192
|
* new bound hash. The direct health probe is intentionally unscoped, so it can
|
|
126
193
|
* reach the current engine even when bound requests would be rejected.
|
|
194
|
+
*
|
|
195
|
+
* Throws EngineRebindError when the health probe fails: the previous identity
|
|
196
|
+
* is kept, and reporting it as "the rebound hash" would tell the agent a
|
|
197
|
+
* switch it never followed had succeeded.
|
|
127
198
|
*/
|
|
128
199
|
async rebind() {
|
|
129
200
|
const health = await checkEngineHealth(this.port);
|
|
130
|
-
if (health) {
|
|
131
|
-
this.targetIdentity
|
|
132
|
-
instanceId: health.instanceId,
|
|
133
|
-
projectId: health.projectId,
|
|
134
|
-
projectIdHash: health.projectIdHash,
|
|
135
|
-
};
|
|
201
|
+
if (!health) {
|
|
202
|
+
throw new EngineRebindError(`Summer Engine did not answer the health probe on port ${this.port}; this session is still bound to ${this.targetIdentity.projectIdHash ?? "no project"}. Recovery: confirm the engine is running with the project open, then call summer_get_project_context again.`);
|
|
136
203
|
}
|
|
204
|
+
this.lastHealth = health;
|
|
205
|
+
this.targetIdentity = {
|
|
206
|
+
instanceId: health.instanceId,
|
|
207
|
+
projectId: health.projectId,
|
|
208
|
+
projectIdHash: health.projectIdHash,
|
|
209
|
+
};
|
|
137
210
|
return this.targetIdentity.projectIdHash;
|
|
138
211
|
}
|
|
139
212
|
/** Identity to attach to a MUTATING command's options so the engine can reject
|
|
@@ -179,7 +252,14 @@ export class EngineApiClient {
|
|
|
179
252
|
const text = await res.text().catch(() => "");
|
|
180
253
|
throw new Error(`Engine API error ${res.status}: ${text.slice(0, 200)}`);
|
|
181
254
|
}
|
|
182
|
-
|
|
255
|
+
try {
|
|
256
|
+
return await res.json();
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// A bare SyntaxError names nothing; say which request answered with a
|
|
260
|
+
// non-JSON body (a proxy page, an HTML error, a half-written stream).
|
|
261
|
+
throw new Error(`Engine API returned a non-JSON response for ${method} ${path} (HTTP ${res.status}).`);
|
|
262
|
+
}
|
|
183
263
|
}
|
|
184
264
|
/** Raw fetch with auth + timeout — returns the Response so callers can inspect
|
|
185
265
|
* the status (202 queued vs 200 legacy). */
|
|
@@ -240,6 +320,16 @@ export class EngineApiClient {
|
|
|
240
320
|
const detail = error instanceof Error ? error.message : String(error);
|
|
241
321
|
throw new Error(`Summer Engine did not acknowledge request ${clientRequestId}; dispatch state is unknown. Do not retry blindly. ${detail}`);
|
|
242
322
|
}
|
|
323
|
+
return this._resolveQueuedResponse(res, clientRequestId, timeoutMs);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* The post-submission half of _requestQueued: classify an already-fetched
|
|
327
|
+
* response (200 legacy / 202 queued / 429 backpressure) and, for 202, poll
|
|
328
|
+
* the accepted requestId to its terminal receipt. Split out so a caller that
|
|
329
|
+
* has to inspect the raw status first (gameSnapshot's 409 bridge check) can
|
|
330
|
+
* feed its ONE response in here instead of issuing a second request.
|
|
331
|
+
*/
|
|
332
|
+
async _resolveQueuedResponse(res, clientRequestId, timeoutMs) {
|
|
243
333
|
// 202 (queued) + 429 (backpressure, errorClass in body) are handled below;
|
|
244
334
|
// any other non-2xx is a real transport error.
|
|
245
335
|
if (!res.ok && res.status !== 202 && res.status !== 429) {
|
|
@@ -304,24 +394,83 @@ export class EngineApiClient {
|
|
|
304
394
|
async health() {
|
|
305
395
|
return this.request("GET", "/api/health");
|
|
306
396
|
}
|
|
307
|
-
|
|
397
|
+
/**
|
|
398
|
+
* One long-poll of GET /api/events/poll (the engine's events channel). The
|
|
399
|
+
* engine answers on the first event matching `kinds` with seq > `since`, or
|
|
400
|
+
* after `wait` ms with `timed_out:true`; a 2xx is the poll envelope
|
|
401
|
+
* {ok, events:[{seq, kind, ts, data}], next_seq, last_seq, since, truncated,
|
|
402
|
+
* timed_out}. Identity-gated like every other route: the bound project rides
|
|
403
|
+
* in the query, so a wrong project answers 409 identity_mismatch.
|
|
404
|
+
*
|
|
405
|
+
* The three answers this route documents — 404 (no channel on this build),
|
|
406
|
+
* 409 (identity mismatch), 503 (bus not started) — come back as a STRUCTURED
|
|
407
|
+
* failure {ok:false, http_status, ...body} so both faces classify them (a
|
|
408
|
+
* terminalState keeps its standard message and rebind hint; the events
|
|
409
|
+
* capability rewrites a 404 into engine_lacks_events). Anything else throws
|
|
410
|
+
* like every other request, so a stale-token 401/403 still triggers
|
|
411
|
+
* withEngine's reconnect-and-retry.
|
|
412
|
+
*/
|
|
413
|
+
async pollEvents(params = {}, timeoutMs) {
|
|
414
|
+
const query = new URLSearchParams();
|
|
415
|
+
if (params.since !== undefined)
|
|
416
|
+
query.set("since", String(params.since));
|
|
417
|
+
if (params.kinds && params.kinds.length > 0)
|
|
418
|
+
query.set("kinds", params.kinds.join(","));
|
|
419
|
+
if (params.wait !== undefined)
|
|
420
|
+
query.set("wait", String(params.wait));
|
|
421
|
+
if (params.limit !== undefined)
|
|
422
|
+
query.set("limit", String(params.limit));
|
|
423
|
+
// URLSearchParams.size is undefined on Node < 18.16; stringify instead.
|
|
424
|
+
const suffix = query.toString();
|
|
425
|
+
const path = `/api/events/poll${suffix ? `?${suffix}` : ""}`;
|
|
426
|
+
// The engine holds the request up to `wait` ms; give the socket headroom.
|
|
427
|
+
const wait = params.wait ?? 25_000;
|
|
428
|
+
const res = await this._fetchRaw("GET", path, undefined, timeoutMs ?? wait + 5_000);
|
|
429
|
+
if (res.ok) {
|
|
430
|
+
try {
|
|
431
|
+
return await res.json();
|
|
432
|
+
}
|
|
433
|
+
catch {
|
|
434
|
+
throw new Error(`Engine API returned a non-JSON response for GET /api/events/poll (HTTP ${res.status}).`);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
const text = await res.text().catch(() => "");
|
|
438
|
+
if (res.status === 404 || res.status === 409 || res.status === 503) {
|
|
439
|
+
let body = {};
|
|
440
|
+
try {
|
|
441
|
+
body = asRecord(JSON.parse(text)) ?? {};
|
|
442
|
+
}
|
|
443
|
+
catch {
|
|
444
|
+
// non-JSON body (an HTML 404 page): keep the raw text below
|
|
445
|
+
}
|
|
446
|
+
const failure = { ok: false, ...body, http_status: res.status };
|
|
447
|
+
if (typeof failure.error !== "string" && typeof failure.terminalState !== "string") {
|
|
448
|
+
failure.error = `Engine API error ${res.status}: ${text.slice(0, 200)}`;
|
|
449
|
+
}
|
|
450
|
+
return failure;
|
|
451
|
+
}
|
|
452
|
+
throw new Error(`Engine API error ${res.status}: ${text.slice(0, 200)}`);
|
|
453
|
+
}
|
|
454
|
+
async executeOps(ops, options, timeoutMs = 120_000) {
|
|
308
455
|
// Ops may include long-running work (ImportFromUrlBatch, GitCommit); the
|
|
309
|
-
// engine keeps it "running" and we poll. 120s budget
|
|
310
|
-
//
|
|
456
|
+
// engine keeps it "running" and we poll. 120s budget by default; ops that
|
|
457
|
+
// declare a longer server-side max_seconds (RunEditorScript) pass a larger
|
|
458
|
+
// timeoutMs so the client never gives up before the engine can finish.
|
|
459
|
+
// Resolves legacy-200 or async-202 (Block E).
|
|
311
460
|
// Attach the bound project identity so the engine rejects a write aimed at a
|
|
312
461
|
// different project (identity_mismatch, atomic — before any op applies).
|
|
313
462
|
const merged = { ...(options ?? {}), ...this.identityOptions() };
|
|
314
463
|
const body = Object.keys(merged).length ? { ops, options: merged } : { ops };
|
|
315
|
-
return this._requestQueued("POST", "/api/ops", body,
|
|
464
|
+
return this._requestQueued("POST", "/api/ops", body, timeoutMs);
|
|
316
465
|
}
|
|
317
466
|
/**
|
|
318
467
|
* Mutation path for MCP file tools. Unlike legacy executeOps callers, this
|
|
319
468
|
* fails closed when health did not provide a complete target identity. The
|
|
320
469
|
* bound hash is stamped last so a caller cannot override it in options.
|
|
321
470
|
*/
|
|
322
|
-
async executeIdentityBoundOps(ops, options) {
|
|
471
|
+
async executeIdentityBoundOps(ops, options, timeoutMs) {
|
|
323
472
|
const identity = this.requireBoundIdentity();
|
|
324
|
-
return this.executeOps(ops, { ...(options ?? {}), ...identity });
|
|
473
|
+
return this.executeOps(ops, { ...(options ?? {}), ...identity }, timeoutMs);
|
|
325
474
|
}
|
|
326
475
|
async readProjectFile(path, maxBytes = 200_000) {
|
|
327
476
|
const query = new URLSearchParams({
|
|
@@ -370,8 +519,18 @@ export class EngineApiClient {
|
|
|
370
519
|
async getScriptErrors(path) {
|
|
371
520
|
return this.request("GET", `/api/state/script-errors?path=${encodeURIComponent(path)}`);
|
|
372
521
|
}
|
|
373
|
-
async play(scene) {
|
|
522
|
+
async play(scene, determinism) {
|
|
374
523
|
// Cold-load on large projects can take 25-40s. 60s budget.
|
|
524
|
+
const pins = pickPlayDeterminism(determinism);
|
|
525
|
+
if (pins) {
|
|
526
|
+
// Determinism params (seed / fixed_fps / time_scale) — the /api/play rung
|
|
527
|
+
// copies ONLY `scene` from options into the PlayGame op
|
|
528
|
+
// (local_api_server.cpp play branch), so a pinned launch travels as an
|
|
529
|
+
// explicit PlayGame op through /api/ops. executeOps stamps the bound
|
|
530
|
+
// identity like every other op. An engine that predates the params
|
|
531
|
+
// ignores the extra keys and answers the v1 result (no `determinism`).
|
|
532
|
+
return this.executeOps([{ op: "PlayGame", ...(scene ? { scene } : {}), ...pins }], undefined, 60_000);
|
|
533
|
+
}
|
|
375
534
|
// The engine reads play params from body.options (tool_net_thread.cpp:503),
|
|
376
535
|
// and the play handler reads options["scene"] — a top-level { scene } is
|
|
377
536
|
// dropped, so the scene MUST be nested inside options. The bound identity
|
|
@@ -402,6 +561,7 @@ export class EngineApiClient {
|
|
|
402
561
|
async writeSnapshotFile(kind, buffer, ext) {
|
|
403
562
|
const dir = join(tmpdir(), "summer-engine", "snapshots");
|
|
404
563
|
await mkdir(dir, { recursive: true });
|
|
564
|
+
await reapStaleSnapshots(dir);
|
|
405
565
|
const filename = `${kind}-${Date.now()}-${Math.random()
|
|
406
566
|
.toString(36)
|
|
407
567
|
.slice(2, 8)}.${ext}`;
|
|
@@ -419,16 +579,17 @@ export class EngineApiClient {
|
|
|
419
579
|
// reason (`failure_reason:"unsupported_transport"`, `bridge_required:true`,
|
|
420
580
|
// tool_net_thread.cpp:495-503). Detect that specific shape and return it
|
|
421
581
|
// verbatim so the tool can give an honest message — do NOT hardcode "game
|
|
422
|
-
// always fails": once the engine answers 200/202 (P4.4), the
|
|
423
|
-
//
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
if (bridge)
|
|
427
|
-
return bridge;
|
|
428
|
-
}
|
|
582
|
+
// always fails": once the engine answers 200/202 (P4.4), the same response
|
|
583
|
+
// flows into the normal queued path. ONE request either way: a probe that
|
|
584
|
+
// discarded a 200 (or orphaned an accepted 202 requestId) and then asked
|
|
585
|
+
// again would capture the game twice.
|
|
429
586
|
let response;
|
|
430
587
|
try {
|
|
431
|
-
|
|
588
|
+
const res = await this._fetchRaw("GET", `/api/snapshot/${kind}`, undefined, 60_000);
|
|
589
|
+
if (kind === "game" && res.status === 409) {
|
|
590
|
+
return this._bridgeRequiredFromResponse(res);
|
|
591
|
+
}
|
|
592
|
+
response = await this._resolveQueuedResponse(res, undefined, 60_000);
|
|
432
593
|
}
|
|
433
594
|
catch (err) {
|
|
434
595
|
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
@@ -502,24 +663,12 @@ export class EngineApiClient {
|
|
|
502
663
|
};
|
|
503
664
|
}
|
|
504
665
|
/**
|
|
505
|
-
*
|
|
506
|
-
*
|
|
507
|
-
*
|
|
508
|
-
*
|
|
509
|
-
* normal queued path — so the moment the engine starts answering over HTTP
|
|
510
|
-
* (P4.4), game capture just works with no code change here.
|
|
666
|
+
* Turn a 409 from /api/snapshot/game into a structured failure. The engine's
|
|
667
|
+
* structural refusal carries `bridge_required` / `unsupported_transport`
|
|
668
|
+
* (tool_net_thread.cpp:495-503); a 409 without that shape is surfaced as a
|
|
669
|
+
* plain error rather than silently claiming "bridge required".
|
|
511
670
|
*/
|
|
512
|
-
async
|
|
513
|
-
let res;
|
|
514
|
-
try {
|
|
515
|
-
res = await this._fetchRaw("GET", path, undefined, 15_000);
|
|
516
|
-
}
|
|
517
|
-
catch {
|
|
518
|
-
// Transport error — let the normal path surface it uniformly.
|
|
519
|
-
return null;
|
|
520
|
-
}
|
|
521
|
-
if (res.status !== 409)
|
|
522
|
-
return null;
|
|
671
|
+
async _bridgeRequiredFromResponse(res) {
|
|
523
672
|
const body = (await res.json().catch(() => ({})));
|
|
524
673
|
const reason = stringFrom(body.failure_reason);
|
|
525
674
|
const bridge = body.bridge_required === true;
|
|
@@ -552,9 +701,24 @@ export class EngineApiClient {
|
|
|
552
701
|
* name `node_path`); an unresolvable node fails with failure_reason
|
|
553
702
|
* "node_not_found". framing "auto" is an alias of "iso"; the engine also
|
|
554
703
|
* accepts "top"/"front"/"back"/"left"/"right" and echoes the resolved framing.
|
|
555
|
-
*
|
|
556
|
-
*
|
|
704
|
+
* framing "camera" renders through the scene's current/first Camera3D — or
|
|
705
|
+
* the Camera3D named by `cameraPath` — with the scene's REAL WorldEnvironment
|
|
706
|
+
* instead of the flat preview substitute; the engine echoes the resolved
|
|
707
|
+
* framing, so an older build that ignores the value is detectable by the
|
|
708
|
+
* caller. The result carries image_base64 + mime (+ width/height) plus the
|
|
709
|
+
* P4.3 confession fields (scene_has_camera / scene_had_light /
|
|
557
710
|
* used_synthetic_camera) and framing / framed_node / render_retries.
|
|
711
|
+
*
|
|
712
|
+
* Perception additions (engine scene-scripting contracts): framing "free" takes
|
|
713
|
+
* `cameraPosition` / `cameraLookAt` (Godot "Vector3(x, y, z)" literals) and
|
|
714
|
+
* `fov`; framing "bookmark:<name>" resolves the pose from the project's
|
|
715
|
+
* camera bookmarks (fov overrides the bookmark's). `marks` draws the
|
|
716
|
+
* Set-of-Mark overlay (numbered tags + boxes over the largest visible
|
|
717
|
+
* VisualInstance3D nodes), capped by `maxMarks`. The result adds
|
|
718
|
+
* framing_source / camera_pose / bookmark and marks / marks_skipped /
|
|
719
|
+
* marks_candidates / marks_truncated / max_marks (all kept in `metadata`).
|
|
720
|
+
* Older engines resolve the new framings to a preset and echo THAT — the
|
|
721
|
+
* caller compares the echo against what it asked for.
|
|
558
722
|
*/
|
|
559
723
|
async scenePreview(input) {
|
|
560
724
|
const opInput = { op: "ScenePreview" };
|
|
@@ -567,6 +731,18 @@ export class EngineApiClient {
|
|
|
567
731
|
opInput.size = input.size;
|
|
568
732
|
if (input?.nodePath)
|
|
569
733
|
opInput.node = input.nodePath;
|
|
734
|
+
if (input?.cameraPath)
|
|
735
|
+
opInput.camera_path = input.cameraPath;
|
|
736
|
+
if (input?.cameraPosition)
|
|
737
|
+
opInput.camera_position = input.cameraPosition;
|
|
738
|
+
if (input?.cameraLookAt)
|
|
739
|
+
opInput.camera_look_at = input.cameraLookAt;
|
|
740
|
+
if (input?.fov !== undefined)
|
|
741
|
+
opInput.fov = input.fov;
|
|
742
|
+
if (input?.marks !== undefined)
|
|
743
|
+
opInput.marks = input.marks;
|
|
744
|
+
if (input?.maxMarks !== undefined)
|
|
745
|
+
opInput.max_marks = input.maxMarks;
|
|
570
746
|
let response;
|
|
571
747
|
try {
|
|
572
748
|
// executeOps stamps the bound identity so a drifted project is rejected
|
|
@@ -609,6 +785,22 @@ export class EngineApiClient {
|
|
|
609
785
|
return true;
|
|
610
786
|
}
|
|
611
787
|
}
|
|
788
|
+
if (this.registryDiscovery) {
|
|
789
|
+
// Found through the registry (no pointer): ask the registry again. An
|
|
790
|
+
// editor that vanished or became ambiguous is real drift, like the
|
|
791
|
+
// selected-editor case above.
|
|
792
|
+
try {
|
|
793
|
+
const connection = await discoverRegistryConnection(this.registryDiscovery);
|
|
794
|
+
if (!connection)
|
|
795
|
+
return true;
|
|
796
|
+
return (connection.port !== this.port ||
|
|
797
|
+
connection.token !== this.token ||
|
|
798
|
+
connection.health.instanceId !== this.targetIdentity.instanceId);
|
|
799
|
+
}
|
|
800
|
+
catch {
|
|
801
|
+
return true;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
612
804
|
try {
|
|
613
805
|
const [port, token] = await Promise.all([getApiPort(), getApiToken()]);
|
|
614
806
|
if (!token)
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Async tool-lifecycle consumer for the CLI/MCP.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* the engine's responsive tool server (Block E):
|
|
4
|
+
* Speaks the engine tool server's async op contract (the same one the Summer
|
|
5
|
+
* web app uses), so both clients read engine responses identically:
|
|
7
6
|
* - NEW path: `202 {requestId, status:"queued"}` -> long-poll
|
|
8
7
|
* GET /api/ops/result?requestId=&wait=ms until terminal (done|failed|canceled).
|
|
9
8
|
* - LEGACY path (dormant/older engine): a synchronous `200` with the full apply
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Async tool-lifecycle consumer for the CLI/MCP.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* the engine's responsive tool server (Block E):
|
|
4
|
+
* Speaks the engine tool server's async op contract (the same one the Summer
|
|
5
|
+
* web app uses), so both clients read engine responses identically:
|
|
7
6
|
* - NEW path: `202 {requestId, status:"queued"}` -> long-poll
|
|
8
7
|
* GET /api/ops/result?requestId=&wait=ms until terminal (done|failed|canceled).
|
|
9
8
|
* - LEGACY path (dormant/older engine): a synchronous `200` with the full apply
|
|
@@ -14,20 +14,29 @@ export interface CredentialMetadata {
|
|
|
14
14
|
interface CredentialMetadataDocument {
|
|
15
15
|
schemaVersion: 1;
|
|
16
16
|
auth?: CredentialMetadata;
|
|
17
|
-
cloud?: CredentialMetadata;
|
|
18
17
|
creator?: CredentialMetadata;
|
|
19
18
|
}
|
|
20
19
|
export interface LoginSession {
|
|
21
20
|
token: string;
|
|
22
|
-
cloudToken?: string | null;
|
|
23
21
|
user?: SummerUserInfo;
|
|
24
22
|
scopes?: string[];
|
|
25
|
-
cloudScopes?: string[];
|
|
26
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Gateway credential. SUMMER_TOKEN wins over ~/.summer/auth-token so a
|
|
26
|
+
* headless/cloud agent can authenticate gateway features (asset search,
|
|
27
|
+
* generation, releases) without a browser login. The env override never
|
|
28
|
+
* touches the store: `summer login` still writes the file, and the desktop
|
|
29
|
+
* engine keeps reading it. Local engine ops need neither — they authenticate
|
|
30
|
+
* with the engine-minted ~/.summer/api-token (see core/engine.ts).
|
|
31
|
+
*/
|
|
27
32
|
export declare function getAuthToken(): Promise<string | null>;
|
|
33
|
+
/**
|
|
34
|
+
* True when SUMMER_TOKEN (env) is the credential in effect. `summer logout`
|
|
35
|
+
* only clears the store, so status/logout must say the env token still
|
|
36
|
+
* applies rather than reporting the stored identity as the active one.
|
|
37
|
+
*/
|
|
38
|
+
export declare function hasEnvAuthToken(): boolean;
|
|
28
39
|
export declare function saveAuthToken(token: string, scopes?: string[]): Promise<void>;
|
|
29
|
-
export declare function getCloudToken(): Promise<string | null>;
|
|
30
|
-
export declare function saveCloudToken(token: string, scopes?: string[]): Promise<void>;
|
|
31
40
|
/**
|
|
32
41
|
* Summercraft creator tokens are a separate credential audience from the
|
|
33
42
|
* core-compatible Summer CLI JWT. Never store an sc_ token in auth-token:
|
|
@@ -40,4 +49,3 @@ export declare function saveUserInfo(info: SummerUserInfo): Promise<void>;
|
|
|
40
49
|
export declare function saveLoginSession(session: LoginSession): Promise<void>;
|
|
41
50
|
export declare function getCredentialMetadata(): Promise<CredentialMetadataDocument>;
|
|
42
51
|
export declare function clearAuthCredentials(): Promise<number>;
|
|
43
|
-
export declare function assertCredentialScopes(metadata: CredentialMetadata | undefined, requiredScopes: string[]): void;
|