summer-engine 3.4.0 → 3.4.1
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 +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/.factory-plugin/plugin.json +1 -1
- package/.opencode/INSTALL.md +8 -8
- package/.opencode/plugins/summer.js +2 -2
- package/AGENTS.md +7 -7
- package/CHANGELOG.md +14 -0
- package/GEMINI.md +1 -1
- package/NOTICE +1 -1
- package/README.md +30 -34
- package/assets/autopilot/run.sh +2 -2
- package/assets/navigation/web-routes.json +1 -1
- package/commands/gameskill.md +2 -2
- package/commands/summer.md +25 -25
- package/dist/cli/commands/open.d.ts +1 -1
- package/dist/cli/commands/run.d.ts +1 -1
- package/dist/cli/commands/run.js +1 -1
- package/dist/cli/commands/skills.js +2 -2
- package/dist/core/api-client.d.ts +5 -6
- package/dist/core/api-client.js +12 -15
- package/dist/core/auth.js +2 -2
- package/dist/core/capabilities/asset-import.d.ts +0 -1
- package/dist/core/capabilities/camera-view.d.ts +1 -1
- package/dist/core/capabilities/camera-view.js +2 -2
- package/dist/core/capabilities/connect-signal.d.ts +1 -2
- package/dist/core/capabilities/connect-signal.js +1 -2
- package/dist/core/capabilities/console-read.d.ts +2 -2
- package/dist/core/capabilities/console-read.js +2 -2
- package/dist/core/capabilities/engine-receipt.d.ts +5 -7
- package/dist/core/capabilities/engine-receipt.js +7 -9
- package/dist/core/capabilities/export-game.js +3 -3
- package/dist/core/capabilities/export-presets.d.ts +1 -1
- package/dist/core/capabilities/export-presets.js +1 -1
- package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
- package/dist/core/capabilities/fabricate-mesh.js +2 -3
- package/dist/core/capabilities/frame-quality.d.ts +4 -4
- package/dist/core/capabilities/frame-quality.js +4 -4
- package/dist/core/capabilities/grep.d.ts +1 -1
- package/dist/core/capabilities/grep.js +1 -1
- package/dist/core/capabilities/navigation/open.d.ts +1 -1
- package/dist/core/capabilities/navigation/open.js +1 -1
- package/dist/core/capabilities/navigation/render-product-map.js +1 -1
- package/dist/core/capabilities/navigation/targets.js +2 -2
- package/dist/core/capabilities/placement-batch.d.ts +1 -1
- package/dist/core/capabilities/placement-batch.js +2 -2
- package/dist/core/capabilities/play-determinism.d.ts +1 -1
- package/dist/core/capabilities/play-determinism.js +1 -1
- package/dist/core/capabilities/publish-build.d.ts +1 -1
- package/dist/core/capabilities/publish-build.js +4 -6
- package/dist/core/capabilities/publish-download.d.ts +1 -2
- package/dist/core/capabilities/publish-download.js +2 -3
- package/dist/core/capabilities/replace-node.d.ts +1 -3
- package/dist/core/capabilities/replace-node.js +1 -3
- package/dist/core/capabilities/runtime-control.d.ts +5 -7
- package/dist/core/capabilities/runtime-control.js +7 -9
- package/dist/core/capabilities/scene-batch.d.ts +1 -1
- package/dist/core/capabilities/scene-batch.js +1 -1
- package/dist/core/capabilities/scene-kind.js +1 -1
- package/dist/core/capabilities/scene-readback.d.ts +3 -4
- package/dist/core/capabilities/scene-readback.js +3 -4
- package/dist/core/capabilities/scene-script.d.ts +2 -2
- package/dist/core/capabilities/scene-script.js +2 -2
- package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
- package/dist/core/capabilities/seeing/shot-store.js +1 -1
- package/dist/core/capabilities/summer-bundle.d.ts +2 -3
- package/dist/core/capabilities/summer-bundle.js +2 -3
- package/dist/core/capabilities/surface-snap.d.ts +1 -1
- package/dist/core/capabilities/surface-snap.js +1 -1
- package/dist/core/capabilities/tool-dispatch.js +1 -1
- package/dist/core/capabilities/ui-control.d.ts +1 -2
- package/dist/core/capabilities/ui-control.js +1 -2
- package/dist/core/capabilities/world-snapshot.d.ts +1 -1
- package/dist/core/capabilities/world-snapshot.js +1 -1
- package/dist/core/capability-skew.d.ts +2 -3
- package/dist/core/capability-skew.js +4 -5
- package/dist/core/feedback/client.js +1 -1
- package/dist/core/launch-posture.d.ts +3 -3
- package/dist/core/launch-posture.js +3 -3
- package/dist/core/library-read.js +1 -2
- package/dist/core/templates.d.ts +1 -2
- package/dist/core/templates.js +1 -2
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.js +2 -2
- package/dist/mcp/tools/creator-tools.js +1 -1
- package/dist/mcp/tools/debug-tools.js +1 -1
- package/dist/mcp/tools/generate-tools.js +7 -7
- package/dist/mcp/tools/navigation-tools.d.ts +1 -1
- package/dist/mcp/tools/navigation-tools.js +1 -1
- package/dist/mcp/tools/spatial-tools.js +1 -1
- package/dist/mcp/tools/visual-tools.js +2 -2
- package/dist/mcp/tools/with-engine.d.ts +1 -2
- package/dist/mcp/tools/with-engine.js +1 -2
- package/gemini-extension.json +1 -1
- package/hooks/session-start.sh +2 -2
- package/integrations/README.md +70 -76
- package/integrations/claude/README.md +0 -3
- package/integrations/codex/README.md +1 -2
- package/integrations/copilot-jetbrains/README.md +1 -1
- package/integrations/cursor/README.md +1 -2
- package/integrations/factory/README.md +15 -11
- package/integrations/mistral-vibe/README.md +1 -1
- package/integrations/opencode/README.md +1 -1
- package/integrations/roo-code/README.md +1 -1
- package/integrations/rovo-dev/README.md +1 -1
- package/integrations/trae/README.md +1 -1
- package/integrations/windsurf/README.md +3 -3
- package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
- package/library/references/gd-style/gd-style.md +4 -6
- package/library/references/godot-version/godot-version.md +3 -3
- package/library/references/headless-routing/headless-routing.md +2 -2
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +15 -14
- package/library/references/product-map/product-map.md +1 -1
- package/library/references/public-surface-language/public-surface-language.md +1 -1
- package/library/references/summer-folder/summer-folder.md +1 -1
- package/library/skills/3d-lighting/SKILL.md +4 -4
- package/library/skills/README.md +5 -5
- package/library/skills/adaptive-music/SKILL.md +7 -7
- package/library/skills/ai-characters-in-games/SKILL.md +1 -1
- package/library/skills/ambient-bed/SKILL.md +12 -14
- package/library/skills/animated-loop/SKILL.md +42 -42
- package/library/skills/animation-tree/SKILL.md +6 -6
- package/library/skills/art-direction/SKILL.md +8 -11
- package/library/skills/asset-strategy/SKILL.md +3 -3
- package/library/skills/audio-direction/SKILL.md +8 -10
- package/library/skills/auto-fire-targeting/SKILL.md +4 -3
- package/library/skills/bounded-engine-runs/SKILL.md +6 -7
- package/library/skills/brainstorm-game/SKILL.md +5 -5
- package/library/skills/brainstorming/SKILL.md +9 -15
- package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
- package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
- package/library/skills/character-animation-wiring/SKILL.md +2 -2
- package/library/skills/character-model/SKILL.md +15 -26
- package/library/skills/character-movement/SKILL.md +1 -1
- package/library/skills/character-movement/references/movement-3d.md +1 -1
- package/library/skills/character-portrait/SKILL.md +4 -4
- package/library/skills/cinematic-cutscene/SKILL.md +38 -38
- package/library/skills/combat-basics/SKILL.md +1 -1
- package/library/skills/compatibility-renderer-traps/SKILL.md +2 -2
- package/library/skills/concept-art/SKILL.md +3 -3
- package/library/skills/create-asset-sheet/SKILL.md +12 -31
- package/library/skills/debug/SKILL.md +5 -4
- package/library/skills/debugging-game-feel/SKILL.md +1 -4
- package/library/skills/debugging-game-feel/resource.yaml +1 -1
- package/library/skills/design-level/SKILL.md +5 -5
- package/library/skills/design-mechanic/SKILL.md +6 -6
- package/library/skills/design-npc/SKILL.md +8 -15
- package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
- package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
- package/library/skills/environment-kit/SKILL.md +5 -5
- package/library/skills/export-and-ship/SKILL.md +23 -24
- package/library/skills/fabricating-assets/SKILL.md +1 -1
- package/library/skills/facial-and-lipsync/SKILL.md +5 -5
- package/library/skills/fps-controller/SKILL.md +17 -16
- package/library/skills/fps-controller/resource.yaml +0 -2
- package/library/skills/game-feel/SKILL.md +6 -7
- package/library/skills/gameskill/SKILL.md +3 -3
- package/library/skills/gdscript-patterns/SKILL.md +3 -3
- package/library/skills/generate-motion/SKILL.md +5 -22
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
- package/library/skills/headless-scripting/SKILL.md +8 -8
- package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
- package/library/skills/investigating-bugs/SKILL.md +3 -11
- package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
- package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
- package/library/skills/make-game/SKILL.md +3 -5
- package/library/skills/make-game/references/2d-platformer.md +1 -1
- package/library/skills/multiplayer-project/SKILL.md +1 -1
- package/library/skills/multiplayer-testing/SKILL.md +4 -4
- package/library/skills/music-track/SKILL.md +40 -38
- package/library/skills/new-project/SKILL.md +4 -6
- package/library/skills/organic-model/SKILL.md +9 -9
- package/library/skills/pixel-art/SKILL.md +6 -6
- package/library/skills/play/SKILL.md +3 -4
- package/library/skills/playtesting-a-feature/SKILL.md +4 -6
- package/library/skills/procedural-animation/SKILL.md +10 -11
- package/library/skills/prop-model/SKILL.md +4 -4
- package/library/skills/psx-retro-rendering/SKILL.md +20 -20
- package/library/skills/psx-retro-rendering/resource.yaml +2 -3
- package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
- package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
- package/library/skills/remote-deploy/SKILL.md +20 -21
- package/library/skills/retarget/SKILL.md +19 -23
- package/library/skills/running-in-the-cloud/SKILL.md +5 -5
- package/library/skills/scene-composition/SKILL.md +5 -5
- package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
- package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
- package/library/skills/scene-scripting/SKILL.md +3 -3
- package/library/skills/scene-to-level/SKILL.md +28 -31
- package/library/skills/skill-create/SKILL.md +1 -1
- package/library/skills/skill-improve/SKILL.md +9 -9
- package/library/skills/skill-test/SKILL.md +10 -10
- package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
- package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
- package/library/skills/skybox-panorama/SKILL.md +8 -9
- package/library/skills/sound-effect/SKILL.md +19 -19
- package/library/skills/spatial-placement/SKILL.md +2 -2
- package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
- package/library/skills/sprite-sheet/SKILL.md +10 -10
- package/library/skills/summer-analytics/SKILL.md +3 -3
- package/library/skills/summer-friends/SKILL.md +10 -10
- package/library/skills/summer-leaderboards/SKILL.md +6 -6
- package/library/skills/summer-match-results/SKILL.md +13 -13
- package/library/skills/summer-matchmaking/SKILL.md +11 -11
- package/library/skills/summer-parties/SKILL.md +9 -9
- package/library/skills/summer-player-data/SKILL.md +12 -12
- package/library/skills/summer-store/SKILL.md +6 -6
- package/library/skills/summer-world-chat/SKILL.md +9 -9
- package/library/skills/summer-world-saves/SKILL.md +7 -7
- package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
- package/library/skills/tileable-texture/SKILL.md +1 -1
- package/library/skills/trailer-shot/SKILL.md +36 -36
- package/library/skills/tune-performance/SKILL.md +13 -13
- package/library/skills/tune-performance/resource.yaml +1 -1
- package/library/skills/ui-graphics/SKILL.md +7 -7
- package/library/skills/use-widget-asset/SKILL.md +7 -7
- package/library/skills/using-summer/SKILL.md +5 -7
- package/library/skills/vehicle-model/SKILL.md +6 -7
- package/library/skills/vehicle-model/resource.yaml +2 -2
- package/library/skills/verification-before-completion/SKILL.md +5 -6
- package/library/skills/vfx-dissolve/SKILL.md +4 -4
- package/library/skills/vfx-fire/SKILL.md +6 -6
- package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-hit-spark/SKILL.md +4 -4
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/SKILL.md +5 -5
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-magic-glow/SKILL.md +4 -4
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-smoke/SKILL.md +5 -5
- package/library/skills/vfx-water-ripple/SKILL.md +2 -2
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/voice-line/SKILL.md +9 -9
- package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
- package/library/skills/writing-plans/SKILL.md +4 -4
- package/library/skills/writing-skills/SKILL.md +8 -8
- package/library/tools/creator-publish/resource.yaml +4 -4
- package/library/tools/creator-releases/resource.yaml +5 -5
- package/library/tools/publish-build/resource.yaml +5 -1
- package/package.json +1 -1
- package/registry/generated/gemini-extension.json +1 -1
- package/registry/generated/index.json +130 -130
- package/registry/generated/marketplace.claude.json +1 -1
- package/registry/generated/plugin.claude.json +1 -1
- package/registry/generated/plugin.codex.json +1 -1
- package/registry/generated/plugin.cursor.json +1 -1
- package/registry/generated/plugin.factory.json +1 -1
- package/registry/generated/skills-index.md +5 -5
- package/registry/generated/skills-registry.json +5 -5
- package/registry/schemas/domains.json +1 -1
|
@@ -340,7 +340,7 @@ skillsCommand
|
|
|
340
340
|
console.log(previewIncludedLine(previewIncluded));
|
|
341
341
|
if (previewSkipped > 0)
|
|
342
342
|
console.log(previewSkippedLine(previewSkipped));
|
|
343
|
-
// Claude Code: also install slash commands (`
|
|
343
|
+
// Claude Code: also install slash commands (`commands/*.md`)
|
|
344
344
|
// into `~/.claude/commands/`. Other agents don't have an equivalent today.
|
|
345
345
|
if (agent === "claude-code") {
|
|
346
346
|
const commandResults = installClaudeCommands(scope, Boolean(opts.force));
|
|
@@ -352,7 +352,7 @@ skillsCommand
|
|
|
352
352
|
printInstallSummary(skills.length, agent, scope, location);
|
|
353
353
|
});
|
|
354
354
|
/**
|
|
355
|
-
* Copy every `.md` file in `
|
|
355
|
+
* Copy every `.md` file in the package's `commands/` to the user's
|
|
356
356
|
* `~/.claude/commands/` directory so the slash commands (e.g. `/gameskill`)
|
|
357
357
|
* are available on every machine that runs `summer skills install`.
|
|
358
358
|
*
|
|
@@ -22,7 +22,7 @@ export type EngineSnapshot = {
|
|
|
22
22
|
/** Structured failure classifier the engine returns on a game snapshot over
|
|
23
23
|
* local HTTP (409 `bridge_required`) — surfaced verbatim so the tool can give
|
|
24
24
|
* an honest, actionable message instead of a truncated generic 409 string.
|
|
25
|
-
*
|
|
25
|
+
* Once game snapshots answer 200/202 over HTTP this simply
|
|
26
26
|
* never fires and the tool works. */
|
|
27
27
|
failureReason?: string;
|
|
28
28
|
/** Scene-preview confession fields (P4.3). Populated only for target:"scene".
|
|
@@ -194,8 +194,8 @@ export declare class EngineApiClient {
|
|
|
194
194
|
private _parseSnapshotResponse;
|
|
195
195
|
/**
|
|
196
196
|
* Turn a 409 from /api/snapshot/game into a structured failure. The engine's
|
|
197
|
-
* structural refusal carries `bridge_required` / `unsupported_transport
|
|
198
|
-
*
|
|
197
|
+
* structural refusal carries `bridge_required` / `unsupported_transport`;
|
|
198
|
+
* a 409 without that shape is surfaced as a
|
|
199
199
|
* plain error rather than silently claiming "bridge required".
|
|
200
200
|
*/
|
|
201
201
|
private _bridgeRequiredFromResponse;
|
|
@@ -246,9 +246,8 @@ export declare class EngineApiClient {
|
|
|
246
246
|
getPort(): number;
|
|
247
247
|
/**
|
|
248
248
|
* Cheap drift probe for the MCP client cache. The engine mints a fresh
|
|
249
|
-
* api-token on every launch
|
|
250
|
-
*
|
|
251
|
-
* the old socket lingers), so a client built before an engine restart holds
|
|
249
|
+
* api-token on every launch and can bind a different port (it increments
|
|
250
|
+
* 6550..6565 when the old socket lingers), so a client built before an engine restart holds
|
|
252
251
|
* dead credentials. Re-read the on-disk creds and report whether they no longer
|
|
253
252
|
* match this client's snapshot.
|
|
254
253
|
*
|
package/dist/core/api-client.js
CHANGED
|
@@ -492,8 +492,7 @@ export class EngineApiClient {
|
|
|
492
492
|
async getSceneState(scenePath, options) {
|
|
493
493
|
// depth/limit/root only take effect on targeted (scene=) reads: the engine
|
|
494
494
|
// routes those through the live command queue and forwards every query
|
|
495
|
-
// param into
|
|
496
|
-
// _parse_state_args). An UNtargeted read is answered from a pre-published
|
|
495
|
+
// param into the engine's scene-state reader. An UNtargeted read is answered from a pre-published
|
|
497
496
|
// snapshot built with the defaults (depth 2, limit 200) and its query
|
|
498
497
|
// params are ignored — callers who need depth/limit must pass scenePath
|
|
499
498
|
// (summer_get_scene_tree resolves the current scene path for this).
|
|
@@ -515,9 +514,8 @@ export class EngineApiClient {
|
|
|
515
514
|
async getProjectState(prefix) {
|
|
516
515
|
// ?prefix= is sent for forward-compatibility, but current engine builds
|
|
517
516
|
// IGNORE it: /api/state/project is always served from the snapshot, which
|
|
518
|
-
// is published with empty args
|
|
519
|
-
//
|
|
520
|
-
// query. Callers that need a prefix subset must also filter client-side
|
|
517
|
+
// is published with empty args, so the engine's project-state reader never
|
|
518
|
+
// sees the query. Callers that need a prefix subset must also filter client-side
|
|
521
519
|
// (summer_get_project_context does).
|
|
522
520
|
const query = prefix ? `?prefix=${encodeURIComponent(prefix)}` : "";
|
|
523
521
|
return this.request("GET", `/api/state/project${query}`);
|
|
@@ -542,13 +540,13 @@ export class EngineApiClient {
|
|
|
542
540
|
if (pins) {
|
|
543
541
|
// Determinism params (seed / fixed_fps / time_scale) — the /api/play rung
|
|
544
542
|
// copies ONLY `scene` from options into the PlayGame op
|
|
545
|
-
// (
|
|
543
|
+
// (the engine's /api/play handler), so a pinned launch travels as an
|
|
546
544
|
// explicit PlayGame op through /api/ops. executeOps stamps the bound
|
|
547
545
|
// identity like every other op. An engine that predates the params
|
|
548
546
|
// ignores the extra keys and answers the v1 result (no `determinism`).
|
|
549
547
|
return this.executeOps([{ op: "PlayGame", ...(scene ? { scene } : {}), ...pins }], undefined, 60_000);
|
|
550
548
|
}
|
|
551
|
-
// The engine reads play params from body.options
|
|
549
|
+
// The engine reads play params from body.options,
|
|
552
550
|
// and the play handler reads options["scene"] — a top-level { scene } is
|
|
553
551
|
// dropped, so the scene MUST be nested inside options. The bound identity
|
|
554
552
|
// rides in the same options dict so play is refused on a mismatched project.
|
|
@@ -593,10 +591,10 @@ export class EngineApiClient {
|
|
|
593
591
|
// with the same payload shape — _requestQueued resolves both.
|
|
594
592
|
//
|
|
595
593
|
// Game capture over local HTTP structurally 409s today with a STRUCTURED
|
|
596
|
-
// reason (`failure_reason:"unsupported_transport"`, `bridge_required:true
|
|
597
|
-
//
|
|
594
|
+
// reason (`failure_reason:"unsupported_transport"`, `bridge_required:true`).
|
|
595
|
+
// Detect that specific shape and return it
|
|
598
596
|
// verbatim so the tool can give an honest message — do NOT hardcode "game
|
|
599
|
-
// always fails": once the engine answers 200/202
|
|
597
|
+
// always fails": once the engine answers 200/202, the same response
|
|
600
598
|
// flows into the normal queued path. ONE request either way: a probe that
|
|
601
599
|
// discarded a 200 (or orphaned an accepted 202 requestId) and then asked
|
|
602
600
|
// again would capture the game twice.
|
|
@@ -681,8 +679,8 @@ export class EngineApiClient {
|
|
|
681
679
|
}
|
|
682
680
|
/**
|
|
683
681
|
* Turn a 409 from /api/snapshot/game into a structured failure. The engine's
|
|
684
|
-
* structural refusal carries `bridge_required` / `unsupported_transport
|
|
685
|
-
*
|
|
682
|
+
* structural refusal carries `bridge_required` / `unsupported_transport`;
|
|
683
|
+
* a 409 without that shape is surfaced as a
|
|
686
684
|
* plain error rather than silently claiming "bridge required".
|
|
687
685
|
*/
|
|
688
686
|
async _bridgeRequiredFromResponse(res) {
|
|
@@ -777,9 +775,8 @@ export class EngineApiClient {
|
|
|
777
775
|
}
|
|
778
776
|
/**
|
|
779
777
|
* Cheap drift probe for the MCP client cache. The engine mints a fresh
|
|
780
|
-
* api-token on every launch
|
|
781
|
-
*
|
|
782
|
-
* the old socket lingers), so a client built before an engine restart holds
|
|
778
|
+
* api-token on every launch and can bind a different port (it increments
|
|
779
|
+
* 6550..6565 when the old socket lingers), so a client built before an engine restart holds
|
|
783
780
|
* dead credentials. Re-read the on-disk creds and report whether they no longer
|
|
784
781
|
* match this client's snapshot.
|
|
785
782
|
*
|
package/dist/core/auth.js
CHANGED
|
@@ -161,8 +161,8 @@ export async function saveLoginSession(session) {
|
|
|
161
161
|
// those exact files. credential-metadata.json adds audience/scope information
|
|
162
162
|
// without changing or duplicating the secret.
|
|
163
163
|
// Write order: user.json, then auth-token, then the advisory metadata. The
|
|
164
|
-
// desktop engine cross-checks token.sub against user.json's id
|
|
165
|
-
//
|
|
164
|
+
// desktop engine cross-checks token.sub against user.json's id when it
|
|
165
|
+
// adopts the CLI credential, so a
|
|
166
166
|
// write interrupted between the first two files fails closed instead of
|
|
167
167
|
// adopting a mismatched identity. The metadata write is last and is NOT a
|
|
168
168
|
// gate: the token is already live by then, and its contents are re-derived
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Asset import into the engine-bound project (Kenney texture pairing + path
|
|
3
3
|
* inference + optional scene placement). ONE copy shared by the MCP asset tools
|
|
4
4
|
* and the CLI dispatch table.
|
|
5
|
-
* See: publicsummerengine/Docs/ASSET_IMPORT_END_TO_END.md
|
|
6
5
|
*/
|
|
7
6
|
import type { EngineApiClient } from "../api-client.js";
|
|
8
7
|
/** An asset record as returned by the Summer gateway asset APIs. */
|
|
@@ -4,7 +4,7 @@ export type CameraBookmarkAction = (typeof CAMERA_BOOKMARK_ACTIONS)[number];
|
|
|
4
4
|
export declare const CAMERA_BOOKMARK_OPS: Record<CameraBookmarkAction, string>;
|
|
5
5
|
/** What the engine_lacks_op result tells the model to do instead. */
|
|
6
6
|
export declare const CAMERA_BOOKMARK_FALLBACK = "pass the pose explicitly on every capture with summer_screenshot framing:\"free\" (camera_position + camera_look_at), or render through a Camera3D placed in the scene with framing:\"camera\"";
|
|
7
|
-
/** Bookmark name grammar (
|
|
7
|
+
/** Bookmark name grammar (same as the engine's): 1-64 of [A-Za-z0-9_-]. */
|
|
8
8
|
export declare const BOOKMARK_NAME_PATTERN: RegExp;
|
|
9
9
|
export interface CameraBookmarkArgs {
|
|
10
10
|
action: CameraBookmarkAction;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* and the CLI dispatcher so both faces validate the same way and send the same
|
|
5
5
|
* op.
|
|
6
6
|
*
|
|
7
|
-
* Engine contract
|
|
7
|
+
* Engine contract:
|
|
8
8
|
* SaveCameraBookmark { name, position?, look_at?, fov? } -> pose_source
|
|
9
9
|
* ListCameraBookmarks {} -> names, bookmarks
|
|
10
10
|
* DeleteCameraBookmark { name } -> remaining
|
|
@@ -25,7 +25,7 @@ export const CAMERA_BOOKMARK_OPS = {
|
|
|
25
25
|
};
|
|
26
26
|
/** What the engine_lacks_op result tells the model to do instead. */
|
|
27
27
|
export const CAMERA_BOOKMARK_FALLBACK = "pass the pose explicitly on every capture with summer_screenshot framing:\"free\" (camera_position + camera_look_at), or render through a Camera3D placed in the scene with framing:\"camera\"";
|
|
28
|
-
/** Bookmark name grammar (
|
|
28
|
+
/** Bookmark name grammar (same as the engine's): 1-64 of [A-Za-z0-9_-]. */
|
|
29
29
|
export const BOOKMARK_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
30
30
|
function requireBookmarkName(name, action) {
|
|
31
31
|
const trimmed = name?.trim() ?? "";
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
* (src/mcp/tools/scene-tools.ts and tool-dispatch.ts) that leaves the
|
|
4
4
|
* connection in the saved scene, verified from the file.
|
|
5
5
|
*
|
|
6
|
-
* Why not the engine's ConnectSignal op:
|
|
7
|
-
* modules/1summer_engine/editor/ops/scene_ops.cpp) builds
|
|
6
|
+
* Why not the engine's ConnectSignal op: it builds
|
|
8
7
|
* `Callable(receiver, method)` and registers
|
|
9
8
|
* `add_do_method(emitter, "connect", signal, cb)` — no CONNECT_PERSIST, and the
|
|
10
9
|
* op reads no flags argument. PackedScene::pack writes only persistent
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
* (src/mcp/tools/scene-tools.ts and tool-dispatch.ts) that leaves the
|
|
4
4
|
* connection in the saved scene, verified from the file.
|
|
5
5
|
*
|
|
6
|
-
* Why not the engine's ConnectSignal op:
|
|
7
|
-
* modules/1summer_engine/editor/ops/scene_ops.cpp) builds
|
|
6
|
+
* Why not the engine's ConnectSignal op: it builds
|
|
8
7
|
* `Callable(receiver, method)` and registers
|
|
9
8
|
* `add_do_method(emitter, "connect", signal, cb)` — no CONNECT_PERSIST, and the
|
|
10
9
|
* op reads no flags argument. PackedScene::pack writes only persistent
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* Output panel (EditorLog) never received them: a running game's errors are
|
|
7
7
|
* collected by the debugger (summer_get_debugger_errors / the `debugger`
|
|
8
8
|
* section of summer_get_diagnostics). The engine types console lines straight
|
|
9
|
-
* from EditorLog::MSG_TYPE (error / warning / std / editor
|
|
10
|
-
* GetConsoleOutput
|
|
9
|
+
* from EditorLog::MSG_TYPE (error / warning / std / editor) in
|
|
10
|
+
* GetConsoleOutput, so dropping `std` lines by default hides nothing that
|
|
11
11
|
* was an error; the trap is treating this tool's count as the post-play
|
|
12
12
|
* verdict at all. The note travels with the result because tool descriptions
|
|
13
13
|
* are read once and results are read every time.
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* Output panel (EditorLog) never received them: a running game's errors are
|
|
7
7
|
* collected by the debugger (summer_get_debugger_errors / the `debugger`
|
|
8
8
|
* section of summer_get_diagnostics). The engine types console lines straight
|
|
9
|
-
* from EditorLog::MSG_TYPE (error / warning / std / editor
|
|
10
|
-
* GetConsoleOutput
|
|
9
|
+
* from EditorLog::MSG_TYPE (error / warning / std / editor) in
|
|
10
|
+
* GetConsoleOutput, so dropping `std` lines by default hides nothing that
|
|
11
11
|
* was an error; the trap is treating this tool's count as the post-play
|
|
12
12
|
* verdict at all. The note travels with the result because tool descriptions
|
|
13
13
|
* are read once and results are read every time.
|
|
@@ -26,10 +26,9 @@ export declare function getFailureReason(value: {
|
|
|
26
26
|
* Decide whether an engine result envelope represents a FAILURE, and if so
|
|
27
27
|
* return a model-visible message. Returns null only for genuine success.
|
|
28
28
|
*
|
|
29
|
-
* Guards the two
|
|
30
|
-
* `isFailureSignal`):
|
|
29
|
+
* Guards the two bug classes the web platform's tool layer once had:
|
|
31
30
|
* - a failure `terminalState` (anything other than applied/no_op) is a failure
|
|
32
|
-
* even when results[] is absent — the
|
|
31
|
+
* even when results[] is absent — the "no-results envelope looked
|
|
33
32
|
* applied" masking. The poll loop surfaces timed_out/etc. here.
|
|
34
33
|
* - an explicit ok:false / status:"error" / failed op inside results[].
|
|
35
34
|
*
|
|
@@ -37,9 +36,8 @@ export declare function getFailureReason(value: {
|
|
|
37
36
|
*/
|
|
38
37
|
export declare function extractOpError(result: unknown): string | null;
|
|
39
38
|
/**
|
|
40
|
-
* The engine stamps `scenePersistence.persisted` on every scene-targeted batch
|
|
41
|
-
*
|
|
42
|
-
* explicit_scene_save_succeeded). It only means SaveScene returned OK, not
|
|
39
|
+
* The engine stamps `scenePersistence.persisted` on every scene-targeted batch.
|
|
40
|
+
* It only means SaveScene returned OK, not
|
|
43
41
|
* that the file holds the change: a ReparentNode subtree whose owners the
|
|
44
42
|
* engine cleared, or a ConnectSignal made without CONNECT_PERSIST, is missing
|
|
45
43
|
* from a file whose save "persisted". Rename it to
|
|
@@ -50,7 +48,7 @@ export declare function extractOpError(result: unknown): string | null;
|
|
|
50
48
|
export declare function honestSceneReceipt<T>(result: T): T;
|
|
51
49
|
/**
|
|
52
50
|
* An older engine answers an unknown op with a per-op "unknown op: <Kind>"
|
|
53
|
-
*
|
|
51
|
+
* Amend the envelope's error so the model gets
|
|
54
52
|
* the upgrade path instead of retrying, and stamp `failure_reason:
|
|
55
53
|
* "engine_lacks_op"` (+ `op`) so the result is detectable the same way as the
|
|
56
54
|
* capability pre-flight's MissingOpResult: programmatic callers read the
|
|
@@ -9,7 +9,7 @@ export function getFailureReason(value) {
|
|
|
9
9
|
? value.failure_reason
|
|
10
10
|
: undefined;
|
|
11
11
|
}
|
|
12
|
-
// 0.5.34
|
|
12
|
+
// Engine 0.5.34 receipt contract, shared with the web platform's tool layer.
|
|
13
13
|
// The async lifecycle (async-op-lifecycle.ts pollOpToTerminal) merges
|
|
14
14
|
// terminalState/errorClass onto the apply dict it returns. ONLY these two are
|
|
15
15
|
// "applied something / applied nothing-on-purpose" — every other terminal state
|
|
@@ -33,10 +33,9 @@ const TERMINAL_STATE_MESSAGES = {
|
|
|
33
33
|
* Decide whether an engine result envelope represents a FAILURE, and if so
|
|
34
34
|
* return a model-visible message. Returns null only for genuine success.
|
|
35
35
|
*
|
|
36
|
-
* Guards the two
|
|
37
|
-
* `isFailureSignal`):
|
|
36
|
+
* Guards the two bug classes the web platform's tool layer once had:
|
|
38
37
|
* - a failure `terminalState` (anything other than applied/no_op) is a failure
|
|
39
|
-
* even when results[] is absent — the
|
|
38
|
+
* even when results[] is absent — the "no-results envelope looked
|
|
40
39
|
* applied" masking. The poll loop surfaces timed_out/etc. here.
|
|
41
40
|
* - an explicit ok:false / status:"error" / failed op inside results[].
|
|
42
41
|
*
|
|
@@ -97,9 +96,8 @@ export function extractOpError(result) {
|
|
|
97
96
|
return null;
|
|
98
97
|
}
|
|
99
98
|
/**
|
|
100
|
-
* The engine stamps `scenePersistence.persisted` on every scene-targeted batch
|
|
101
|
-
*
|
|
102
|
-
* explicit_scene_save_succeeded). It only means SaveScene returned OK, not
|
|
99
|
+
* The engine stamps `scenePersistence.persisted` on every scene-targeted batch.
|
|
100
|
+
* It only means SaveScene returned OK, not
|
|
103
101
|
* that the file holds the change: a ReparentNode subtree whose owners the
|
|
104
102
|
* engine cleared, or a ConnectSignal made without CONNECT_PERSIST, is missing
|
|
105
103
|
* from a file whose save "persisted". Rename it to
|
|
@@ -123,11 +121,11 @@ export function honestSceneReceipt(result) {
|
|
|
123
121
|
return (out ?? result);
|
|
124
122
|
}
|
|
125
123
|
/** The per-op text an older engine answers for a Kind its dispatch ladder does
|
|
126
|
-
* not know (
|
|
124
|
+
* not know (`unknown op: <Kind>`). */
|
|
127
125
|
const UNKNOWN_OP_PATTERN = /unknown op/i;
|
|
128
126
|
/**
|
|
129
127
|
* An older engine answers an unknown op with a per-op "unknown op: <Kind>"
|
|
130
|
-
*
|
|
128
|
+
* Amend the envelope's error so the model gets
|
|
131
129
|
* the upgrade path instead of retrying, and stamp `failure_reason:
|
|
132
130
|
* "engine_lacks_op"` (+ `op`) so the result is detectable the same way as the
|
|
133
131
|
* capability pre-flight's MissingOpResult: programmatic callers read the
|
|
@@ -36,15 +36,15 @@ export { runEngine, SUMMER_GAMES_PRESET };
|
|
|
36
36
|
*/
|
|
37
37
|
export const LAST_EXPORT_FILE = "last-export.json";
|
|
38
38
|
const DEFAULT_TIMEOUT_MS = 15 * 60_000;
|
|
39
|
-
/** Store platform ids of the versions intake
|
|
39
|
+
/** Store platform ids of the store's versions intake. */
|
|
40
40
|
const STORE_VERSION_PLATFORM = {
|
|
41
41
|
web: "web",
|
|
42
42
|
macos: "macos-universal",
|
|
43
43
|
windows: "windows-x64",
|
|
44
44
|
};
|
|
45
|
-
/** Web zip limits of the store
|
|
45
|
+
/** Web zip limits of the store. */
|
|
46
46
|
const WEB_LIMITS = { zipBytes: 500 * 1024 * 1024, fileBytes: 200 * 1024 * 1024, files: 2000 };
|
|
47
|
-
/** Games without a server run on the phone apps only (
|
|
47
|
+
/** Games without a server run on the phone apps only (the store's standalone targets). */
|
|
48
48
|
const STANDALONE_TARGETS = ["ios", "android"];
|
|
49
49
|
/** Engine support per bundle target, for the recovery text when a target is missing. */
|
|
50
50
|
const TARGET_ENGINE_NOTE = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Store targets for summer_export_game, and the export presets that make them.
|
|
3
3
|
*
|
|
4
|
-
* The Summer Games store has two intakes
|
|
4
|
+
* The Summer Games store has two intakes:
|
|
5
5
|
* - build-publications takes ONE summer.bundle.v1 .zip per Build. Summer runs
|
|
6
6
|
* its client.pck on its own client templates (the Summer Games iOS and
|
|
7
7
|
* Android apps, the Summer desktop app on macOS and Windows), so the creator
|
|
@@ -5,7 +5,7 @@ import { BuildToolError } from "./summer-bundle.js";
|
|
|
5
5
|
/**
|
|
6
6
|
* Store targets for summer_export_game, and the export presets that make them.
|
|
7
7
|
*
|
|
8
|
-
* The Summer Games store has two intakes
|
|
8
|
+
* The Summer Games store has two intakes:
|
|
9
9
|
* - build-publications takes ONE summer.bundle.v1 .zip per Build. Summer runs
|
|
10
10
|
* its client.pck on its own client templates (the Summer Games iOS and
|
|
11
11
|
* Android apps, the Summer desktop app on macOS and Windows), so the creator
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* (`summer tool fabricate-3d`) so both faces validate the same arguments, send
|
|
5
5
|
* the same op with the same clamps, and wait the same client poll budget.
|
|
6
6
|
*
|
|
7
|
-
* What the op does on the engine side
|
|
7
|
+
* What the op does on the engine side: run one
|
|
8
8
|
* agent-authored bpy script in a supervised headless child of the USER'S OWN
|
|
9
9
|
* Blender install, validate the .glb the child exported, move it under res://,
|
|
10
10
|
* wait for the editor import to settle, and optionally instantiate it into the
|
|
@@ -28,8 +28,7 @@ export declare const FABRICATE_DEFAULT_OUT_DIR = "res://assets/fabricated/";
|
|
|
28
28
|
/** What the tool tells the model to do when the engine lacks FabricateMesh. */
|
|
29
29
|
export declare const FABRICATE_FALLBACK = "generate the asset with summer_generate_3d, import one from the free library with summer_search_assets / summer_import_asset, use summer_import_hdri for environment lighting, or build blockout geometry in-scene with summer_add_node / summer_set_prop or a summer_run_editor_script";
|
|
30
30
|
/**
|
|
31
|
-
* Mirror of the engine's out_path pre-validation
|
|
32
|
-
* _resolve_out_path) so a bad destination is refused on this side with the
|
|
31
|
+
* Mirror of the engine's out_path pre-validation so a bad destination is refused on this side with the
|
|
33
32
|
* same words, and nothing is sent. Returns null when the path is acceptable.
|
|
34
33
|
*/
|
|
35
34
|
export declare function fabricateOutPathProblem(rawPath: string): string | null;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* (`summer tool fabricate-3d`) so both faces validate the same arguments, send
|
|
5
5
|
* the same op with the same clamps, and wait the same client poll budget.
|
|
6
6
|
*
|
|
7
|
-
* What the op does on the engine side
|
|
7
|
+
* What the op does on the engine side: run one
|
|
8
8
|
* agent-authored bpy script in a supervised headless child of the USER'S OWN
|
|
9
9
|
* Blender install, validate the .glb the child exported, move it under res://,
|
|
10
10
|
* wait for the editor import to settle, and optionally instantiate it into the
|
|
@@ -30,8 +30,7 @@ export const FABRICATE_DEFAULT_OUT_DIR = "res://assets/fabricated/";
|
|
|
30
30
|
export const FABRICATE_FALLBACK = "generate the asset with summer_generate_3d, import one from the free library with summer_search_assets / summer_import_asset, use summer_import_hdri for environment lighting, or build blockout geometry in-scene with summer_add_node / summer_set_prop or a summer_run_editor_script";
|
|
31
31
|
const VECTOR3_VARIANT_RE = /^Vector3\(\s*[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?\s*,\s*[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?\s*,\s*[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?\s*\)$/;
|
|
32
32
|
/**
|
|
33
|
-
* Mirror of the engine's out_path pre-validation
|
|
34
|
-
* _resolve_out_path) so a bad destination is refused on this side with the
|
|
33
|
+
* Mirror of the engine's out_path pre-validation so a bad destination is refused on this side with the
|
|
35
34
|
* same words, and nothing is sent. Returns null when the path is acceptable.
|
|
36
35
|
*/
|
|
37
36
|
export function fabricateOutPathProblem(rawPath) {
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Frame-quality probe for engine screenshots (tool/screenshot).
|
|
3
3
|
*
|
|
4
|
-
* WHY THIS EXISTS. In the 2026-09-03 end-to-end run
|
|
5
|
-
*
|
|
4
|
+
* WHY THIS EXISTS. In the 2026-09-03 end-to-end run,
|
|
5
|
+
* `summer_screenshot target:"viewport"` returned an entirely black
|
|
6
6
|
* 1072x1280 JPEG (src/core/capabilities/__fixtures__/frames/01-mcp-viewport-black.jpg)
|
|
7
7
|
* with a caption
|
|
8
8
|
* telling the agent to describe what it saw. It was the first viewport capture
|
|
9
9
|
* after scene mutations had flipped the editor from the 3D to the 2D tab; the
|
|
10
10
|
* same call 67 s later returned real content. Engine side, the ViewportSnapshot
|
|
11
|
-
* op
|
|
11
|
+
* op reads the
|
|
12
12
|
* editor SubViewport's texture with get_texture()->get_image() AS-IS — no forced
|
|
13
13
|
* RenderingServer draw and no blank-frame retry, both of which ScenePreview has
|
|
14
|
-
*
|
|
14
|
+
* because a not-yet-drawn
|
|
15
15
|
* texture reads back black. That is consistent with a 2D subviewport that had
|
|
16
16
|
* not been redrawn since the tab switch, but it has NOT been proven by
|
|
17
17
|
* instrumenting the engine, so this module detects the SYMPTOM (a flat frame)
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Frame-quality probe for engine screenshots (tool/screenshot).
|
|
3
3
|
*
|
|
4
|
-
* WHY THIS EXISTS. In the 2026-09-03 end-to-end run
|
|
5
|
-
*
|
|
4
|
+
* WHY THIS EXISTS. In the 2026-09-03 end-to-end run,
|
|
5
|
+
* `summer_screenshot target:"viewport"` returned an entirely black
|
|
6
6
|
* 1072x1280 JPEG (src/core/capabilities/__fixtures__/frames/01-mcp-viewport-black.jpg)
|
|
7
7
|
* with a caption
|
|
8
8
|
* telling the agent to describe what it saw. It was the first viewport capture
|
|
9
9
|
* after scene mutations had flipped the editor from the 3D to the 2D tab; the
|
|
10
10
|
* same call 67 s later returned real content. Engine side, the ViewportSnapshot
|
|
11
|
-
* op
|
|
11
|
+
* op reads the
|
|
12
12
|
* editor SubViewport's texture with get_texture()->get_image() AS-IS — no forced
|
|
13
13
|
* RenderingServer draw and no blank-frame retry, both of which ScenePreview has
|
|
14
|
-
*
|
|
14
|
+
* because a not-yet-drawn
|
|
15
15
|
* texture reads back black. That is consistent with a 2D subviewport that had
|
|
16
16
|
* not been redrawn since the tab switch, but it has NOT been proven by
|
|
17
17
|
* instrumenting the engine, so this module detects the SYMPTOM (a flat frame)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* grep — ONE implementation of `summer_grep` for both faces
|
|
3
3
|
* (src/mcp/tools/file-tools.ts and tool-dispatch.ts), over the engine's
|
|
4
|
-
* ripgrep-backed Grep op
|
|
4
|
+
* ripgrep-backed Grep op.
|
|
5
5
|
*
|
|
6
6
|
* The engine op returns {file, line, content} per match and parses only
|
|
7
7
|
* ripgrep's "match" events, so its contextLines flag adds nothing to the
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* grep — ONE implementation of `summer_grep` for both faces
|
|
3
3
|
* (src/mcp/tools/file-tools.ts and tool-dispatch.ts), over the engine's
|
|
4
|
-
* ripgrep-backed Grep op
|
|
4
|
+
* ripgrep-backed Grep op.
|
|
5
5
|
*
|
|
6
6
|
* The engine op returns {file, line, content} per match and parses only
|
|
7
7
|
* ripgrep's "match" events, so its contextLines flag adds nothing to the
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* advertises `capabilities.navigation` the tool sends the one-table op
|
|
13
13
|
* `Navigate { target, ...args }`; on an engine that predates it the few ids the
|
|
14
14
|
* original ops can serve (scene, node, script, file, the three docks) use those
|
|
15
|
-
* ops and everything else answers `engine_lacks_op`.
|
|
15
|
+
* ops and everything else answers `engine_lacks_op`.
|
|
16
16
|
*
|
|
17
17
|
* Both faces call runOpen(); the CLI (tool-dispatch + `summer open`) and the
|
|
18
18
|
* MCP tool (src/mcp/tools/navigation-tools.ts) only differ in how the engine
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* advertises `capabilities.navigation` the tool sends the one-table op
|
|
13
13
|
* `Navigate { target, ...args }`; on an engine that predates it the few ids the
|
|
14
14
|
* original ops can serve (scene, node, script, file, the three docks) use those
|
|
15
|
-
* ops and everything else answers `engine_lacks_op`.
|
|
15
|
+
* ops and everything else answers `engine_lacks_op`.
|
|
16
16
|
*
|
|
17
17
|
* Both faces call runOpen(); the CLI (tool-dispatch + `summer open`) and the
|
|
18
18
|
* MCP tool (src/mcp/tools/navigation-tools.ts) only differ in how the engine
|
|
@@ -49,7 +49,7 @@ export function renderProductMap() {
|
|
|
49
49
|
lines.push("## Who owns what");
|
|
50
50
|
lines.push("");
|
|
51
51
|
lines.push("- **Web rows** come from summerengine.com's own route catalog (`/agent-routes.json`, published from the web repo's `src/lib/navigation/routes.ts`). The toolkit vendors a snapshot (`assets/navigation/web-routes.json`, refreshed with `npm run sync:web-routes`); it does not invent pages.");
|
|
52
|
-
lines.push("- **Editor rows** are ids of Summer Engine's one navigation table (
|
|
52
|
+
lines.push("- **Editor rows** are ids of Summer Engine's one navigation table (the `Navigate` op). The running engine advertises which ids it can open in `/api/health` `capabilities.navigation`; `summer open --list` shows availability from the connected engine. Engines that predate the `Navigate` op can still serve the rows with a legacy op (last-but-one column); every other row answers `engine_lacks_op` with an update hint.");
|
|
53
53
|
lines.push("");
|
|
54
54
|
lines.push("## How to read a row");
|
|
55
55
|
lines.push("");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The product map as the toolkit sees it (
|
|
2
|
+
* The product map as the toolkit sees it (rendered for agents as library/references/product-map).
|
|
3
3
|
*
|
|
4
4
|
* The toolkit does NOT own where things are. Each product does:
|
|
5
5
|
*
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* src/lib/navigation/routes.ts). A vendored snapshot lives at
|
|
8
8
|
* assets/navigation/web-routes.json (refresh: `npm run sync:web-routes`) and
|
|
9
9
|
* every web row below is built from it — nothing hand-written.
|
|
10
|
-
* - Summer Engine owns one table of editor destinations (
|
|
10
|
+
* - Summer Engine owns one table of editor destinations (the Navigate op) and
|
|
11
11
|
* advertises the ids it can open in /api/health capabilities.navigation.
|
|
12
12
|
* The rows below are METADATA for those ids (titles, intents, argument
|
|
13
13
|
* names) plus, for the few ids an older engine can serve through its
|
|
@@ -8,7 +8,7 @@ export type PlacementField = (typeof PLACEMENT_FIELDS)[number];
|
|
|
8
8
|
/** Model-visible budget for compact receipts (the 5 KB tool-result contract). */
|
|
9
9
|
export declare const COMPACT_LIMIT_BYTES: number;
|
|
10
10
|
/** Held-back transform SetProps sent per request; the engine refuses requests
|
|
11
|
-
* over 256 ops
|
|
11
|
+
* over 256 ops. */
|
|
12
12
|
export declare const TRANSFORM_OPS_PER_REQUEST = 200;
|
|
13
13
|
export interface PlacementProp {
|
|
14
14
|
key: PlacementField;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* twins.
|
|
5
5
|
*
|
|
6
6
|
* The engine's InstantiateScene accepts only parent / scene / name /
|
|
7
|
-
* target_size
|
|
7
|
+
* target_size and must travel as its own
|
|
8
8
|
* request (single-only). A placed piece is therefore an InstantiateScene plus
|
|
9
9
|
* SetProps on the node path its receipt reports (meta.nodePath, which already
|
|
10
10
|
* carries any collision rename). The caller writes ONE op; this module expands
|
|
@@ -35,7 +35,7 @@ export const PLACEMENT_FIELDS = ["position", "rotation_degrees", "scale", "trans
|
|
|
35
35
|
/** Model-visible budget for compact receipts (the 5 KB tool-result contract). */
|
|
36
36
|
export const COMPACT_LIMIT_BYTES = 5 * 1024;
|
|
37
37
|
/** Held-back transform SetProps sent per request; the engine refuses requests
|
|
38
|
-
* over 256 ops
|
|
38
|
+
* over 256 ops. */
|
|
39
39
|
export const TRANSFORM_OPS_PER_REQUEST = 200;
|
|
40
40
|
const SUMMARY_TARGET_BYTES = 4600;
|
|
41
41
|
const ERROR_TEXT_LIMIT = 240;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* summer_play tool and the CLI dispatcher.
|
|
6
6
|
*
|
|
7
7
|
* Transport note: the engine's /api/play rung copies only `scene` into the
|
|
8
|
-
* PlayGame op
|
|
8
|
+
* PlayGame op, so a launch that carries a
|
|
9
9
|
* pin is sent as an explicit PlayGame op through /api/ops instead. A launch
|
|
10
10
|
* without any pin stays on /api/play, byte-for-byte the v1 call.
|
|
11
11
|
*
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* summer_play tool and the CLI dispatcher.
|
|
6
6
|
*
|
|
7
7
|
* Transport note: the engine's /api/play rung copies only `scene` into the
|
|
8
|
-
* PlayGame op
|
|
8
|
+
* PlayGame op, so a launch that carries a
|
|
9
9
|
* pin is sent as an explicit PlayGame op through /api/ops instead. A launch
|
|
10
10
|
* without any pin stays on /api/play, byte-for-byte the v1 call.
|
|
11
11
|
*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BuildToolError } from "./summer-bundle.js";
|
|
2
|
-
/**
|
|
2
|
+
/** Store client versions: vMAJOR.MINOR.PATCH[-rN]. */
|
|
3
3
|
export declare const CLIENT_VERSION: RegExp;
|
|
4
4
|
export interface PublishBuildInput {
|
|
5
5
|
gameId?: string;
|
|
@@ -12,8 +12,7 @@ import { BuildToolError, readSummerBundle } from "./summer-bundle.js";
|
|
|
12
12
|
/**
|
|
13
13
|
* summer_publish_build: upload a summer.games export to the creator's game
|
|
14
14
|
* through the same creator store routes Studio's export upload uses
|
|
15
|
-
* (
|
|
16
|
-
* /v1/management/*, build-publications, ADR 0033):
|
|
15
|
+
* (/api/creator-store/*, build-publications):
|
|
17
16
|
*
|
|
18
17
|
* POST games/{g}/build-publications declare the export (idempotent)
|
|
19
18
|
* POST .../{p}:source-upload open the part plan (64 MiB parts)
|
|
@@ -24,8 +23,7 @@ import { BuildToolError, readSummerBundle } from "./summer-bundle.js";
|
|
|
24
23
|
* POST games/{g}/builds/{b}/client-packages name the Build's client pack
|
|
25
24
|
* POST .../{p}:publish only with publish=true
|
|
26
25
|
*
|
|
27
|
-
* Mirrors
|
|
28
|
-
* (uploadExportedGame), including its idempotency keys, so a retry continues
|
|
26
|
+
* Mirrors Studio's export upload, including its idempotency keys, so a retry continues
|
|
29
27
|
* the same publication instead of creating another one.
|
|
30
28
|
*
|
|
31
29
|
* Auth: the Summer store OAuth token from "summer login --store" (audience
|
|
@@ -38,11 +36,11 @@ const CONCURRENCY = 3;
|
|
|
38
36
|
const PART_RETRIES = 3;
|
|
39
37
|
const DEFAULT_WAIT_SECONDS = 600;
|
|
40
38
|
const POLL_MS = 3_000;
|
|
41
|
-
/**
|
|
39
|
+
/** Store client versions: vMAJOR.MINOR.PATCH[-rN]. */
|
|
42
40
|
export const CLIENT_VERSION = /^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-r[1-9]\d*)?$/;
|
|
43
41
|
const INTAKE_DONE = ["preview_ready", "published", "ready", "succeeded"];
|
|
44
42
|
const NOT_ACTIONABLE = "deployment_not_actionable";
|
|
45
|
-
/** Games without a server run on the Summer Games phone apps only (
|
|
43
|
+
/** Games without a server run on the Summer Games phone apps only (the store's standalone targets). */
|
|
46
44
|
const STANDALONE_TARGETS = ["ios", "android"];
|
|
47
45
|
/** Why the Platform did not take the export, in plain words (same text Studio shows). */
|
|
48
46
|
const INTAKE_FAILURES = {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type PublishBuildDependencies } from "./publish-build.js";
|
|
2
2
|
/**
|
|
3
|
-
* The store's second build path (
|
|
4
|
-
* internal/creatorstore): a web build (an HTML5 .zip played on summer.games)
|
|
3
|
+
* The store's second build path (store versions): a web build (an HTML5 .zip played on summer.games)
|
|
5
4
|
* or a native download (macOS universal, Windows x64, Linux x64) that players
|
|
6
5
|
* download. summer_export_game format "download" makes these files;
|
|
7
6
|
* summer_publish_build uploads them here, through the same creator store
|