summer-engine 2.6.1 → 2.6.5
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/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.cursor-plugin/plugin.json +1 -1
- package/.factory-plugin/plugin.json +1 -1
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +20 -0
- package/GEMINI.md +2 -1
- package/README.md +61 -9
- package/dist/bin/summer.js +1 -1
- package/dist/commands/setup.js +9 -1
- package/dist/commands/skills.js +15 -5
- package/dist/lib/agent-config.d.ts +1 -1
- package/dist/lib/agent-config.js +53 -15
- package/dist/lib/api-client.d.ts +75 -1
- package/dist/lib/api-client.js +191 -8
- package/dist/lib/game-task-plan.js +6 -2
- package/dist/lib/skills-registry.d.ts +66 -66
- package/dist/lib/skills-registry.js +1 -0
- package/dist/mcp/server.js +63 -18
- package/dist/mcp/tools/asset-tools.js +14 -4
- package/dist/mcp/tools/generate-tools.js +6 -0
- package/dist/mcp/tools/project-tools.js +72 -5
- package/dist/mcp/tools/scene-tools.js +6 -2
- package/dist/mcp/tools/visual-tools.d.ts +9 -0
- package/dist/mcp/tools/visual-tools.js +126 -0
- package/dist/mcp/tools/with-engine.d.ts +52 -5
- package/dist/mcp/tools/with-engine.js +117 -15
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "summer",
|
|
4
4
|
"version": "2.5.1",
|
|
5
|
-
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a
|
|
5
|
+
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 52-tool MCP bridge to the local desktop app.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Summer Engine",
|
|
8
8
|
"email": "founders@summerengine.com",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "summer",
|
|
3
3
|
"version": "2.5.1",
|
|
4
|
-
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a
|
|
4
|
+
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 52-tool MCP bridge. Build games by talking.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Summer Engine",
|
|
7
7
|
"email": "founders@summerengine.com",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"interface": {
|
|
93
93
|
"displayName": "Summer",
|
|
94
94
|
"shortDescription": "Superpowers for AI game dev. Build games by talking.",
|
|
95
|
-
"longDescription": "Summer turns Codex into a game-dev studio for Summer Engine, the AI-native game engine. It adds game-dev skills, a using-summer workflow skill, lifecycle hooks, and a
|
|
95
|
+
"longDescription": "Summer turns Codex into a game-dev studio for Summer Engine, the AI-native game engine. It adds game-dev skills, a using-summer workflow skill, lifecycle hooks, and a 52-tool MCP bridge for scene editing, asset import, play mode, diagnostics, and generation. File, git, shell, and grep stay with the host agent. Summer Engine is compatible with Godot 4.5. Write code in GDScript and drive the engine through MCP. Session-start orients the session. Pre-commit doctor (opt-in) blocks bad commits.",
|
|
96
96
|
"developerName": "Summer Engine",
|
|
97
97
|
"category": "Coding",
|
|
98
98
|
"capabilities": ["Interactive", "Read", "Write"],
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "summer",
|
|
4
4
|
"displayName": "Summer",
|
|
5
5
|
"version": "2.5.1",
|
|
6
|
-
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a
|
|
6
|
+
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 52-tool MCP bridge to the local desktop app.",
|
|
7
7
|
"author": { "name": "Summer Engine", "email": "founders@summerengine.com" },
|
|
8
8
|
"publisher": "summer-engine",
|
|
9
9
|
"homepage": "https://summerengine.com",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "summer",
|
|
3
|
-
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a
|
|
3
|
+
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 52-tool MCP bridge to the local desktop app.",
|
|
4
4
|
"version": "2.5.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Summer Engine",
|
package/AGENTS.md
CHANGED
|
@@ -22,11 +22,12 @@ This file is for any AI agent that loads context from `AGENTS.md` (Codex CLI, Fa
|
|
|
22
22
|
|
|
23
23
|
## MCP tool palette (engine on `localhost:6550`)
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
52 tools total. Categories:
|
|
26
26
|
|
|
27
27
|
- Scene: `summer_get_scene_tree`, `summer_open_scene`, `summer_create_scene`, `summer_add_node`, `summer_set_prop`, `summer_set_resource_property`, `summer_remove_node`, `summer_save_scene`, `summer_instantiate_scene`, `summer_replace_node`, `summer_select_node`, `summer_inspect_node`, `summer_inspect_resource`, `summer_connect_signal`, `summer_batch`.
|
|
28
28
|
- Diagnostics: `summer_get_script_errors`, `summer_get_diagnostics`, `summer_get_console`, `summer_clear_console`, `summer_get_debugger_errors`, `summer_get_debugger_warnings`.
|
|
29
29
|
- Runtime: `summer_play`, `summer_stop`, `summer_is_running`.
|
|
30
|
+
- Visual: `summer_screenshot` (capture the editor viewport or running game as an image to verify it).
|
|
30
31
|
- Project: `summer_get_project_context`, `summer_open_main_scene`, `summer_project_setting`, `summer_input_map_bind`, `summer_get_agent_playbook`.
|
|
31
32
|
- Assets: `summer_search_assets`, `summer_list_my_assets`, `summer_get_asset`, `summer_get_asset_download_url`, `summer_import_asset`, `summer_import_asset_by_id`, `summer_import_from_url`, `summer_import_from_url_batch`.
|
|
32
33
|
- Generation: `summer_generate_image`, `summer_generate_3d`, `summer_generate_audio`, `summer_generate_video`, `summer_generate_motion`, `summer_check_job`.
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to summer-engine will be documented here. Following [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Semantic Versioning](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [2.6.5] — 2026-07-04 — "Cloud tools don't need the engine"
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- Tool descriptions now say explicitly which tools run in Summer's cloud and work WITHOUT the engine open (`summer_generate_*`, `summer_search_assets`, `summer_list_my_assets`, `summer_get_asset`, `summer_get_asset_download_url`, `summer_check_job`) and which need the engine (imports, scene ops). Agents were misreading a missing `npx summer-engine login` as "MCP requires the engine".
|
|
9
|
+
- The "Summer Engine is not running" error now tells the agent that cloud tools still work without the engine.
|
|
10
|
+
|
|
11
|
+
## [2.6.4] — 2026-07-03 — "See-Work + project binding" (unpublished, ships with 2.6.5)
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- MCP session binds to its project; the engine rejects wrong-project writes (`identity_mismatch`) instead of applying them to whatever project is open.
|
|
15
|
+
- Structured per-tool-call stderr logging; agent playbook rewritten around the MCP verification ladder; honest game-capture failure states and identity-stamped reads.
|
|
16
|
+
|
|
17
|
+
## [2.6.3] — 2026-06-30 — "Agent vision"
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
- `summer_screenshot` MCP tool: capture the editor viewport or the running game as an image the agent sees directly (`target: "viewport" | "game"`, viewport by default). Lets the agent visually verify scene layout, asset placement, scale, framing, and runtime state — the client reads the actual frame, with no description step in between. Total MCP tool surface is now 52.
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- MCP/CLI session now reconnects automatically after a transient engine restart (the engine rotates its api-token and can move its port on relaunch), instead of surfacing as a "disconnected" error.
|
|
24
|
+
|
|
5
25
|
## [2.6.0] — 2026-06-10 — "Summer Cloud"
|
|
6
26
|
|
|
7
27
|
### Added
|
package/GEMINI.md
CHANGED
|
@@ -20,12 +20,13 @@ The single most important skill to know is `summer:using-summer` — it explains
|
|
|
20
20
|
|
|
21
21
|
## MCP tools (when the engine is running on `localhost:6550`)
|
|
22
22
|
|
|
23
|
-
The `summer-engine` MCP server exposes
|
|
23
|
+
The `summer-engine` MCP server exposes 52 focused tools. The most important:
|
|
24
24
|
|
|
25
25
|
- **Scene mutation**: `summer_add_node`, `summer_set_prop`, `summer_set_resource_property`, `summer_remove_node`, `summer_save_scene`, `summer_replace_node`, `summer_batch`.
|
|
26
26
|
- **Scene inspection**: `summer_get_scene_tree`, `summer_inspect_node`, `summer_inspect_resource`.
|
|
27
27
|
- **Diagnostics**: `summer_get_script_errors` (cheapest), `summer_get_diagnostics`, `summer_get_console`, `summer_get_debugger_errors`, `summer_get_debugger_warnings`.
|
|
28
28
|
- **Run game**: `summer_play`, `summer_stop`, `summer_is_running`.
|
|
29
|
+
- **Visual**: `summer_screenshot` (capture the viewport or running game as an image you can see).
|
|
29
30
|
- **Project**: `summer_get_project_context`, `summer_open_main_scene`, `summer_project_setting`, `summer_input_map_bind`.
|
|
30
31
|
- **Assets**: `summer_search_assets`, `summer_import_asset`, `summer_import_from_url`, `summer_generate_image`, `summer_generate_3d`, `summer_generate_audio`, `summer_generate_video`, `summer_check_job`.
|
|
31
32
|
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Build real 2D and 3D games through conversation. No coding required. Export to Steam, desktop, mobile, and web. Built on the Godot team's work, customized and honed so AI agents and humans can collaborate on great games.
|
|
4
4
|
|
|
5
|
-
**Summer** is the MIT open-source agent layer that connects your AI coding agent to Summer Engine. It is the **Summer CLI**, the **Summer MCP** server, and the **Summer agent** skills, hooks, and plugin manifests, all in one package. First-class setup works in Claude Code, Cursor, Codex, Windsurf, Cline, Roo Code, Gemini CLI, GitHub Copilot CLI, GitHub Copilot in VS Code, and OpenCode. Factory Droid uses the plugin marketplace path.
|
|
5
|
+
**Summer** is the MIT open-source agent layer that connects your AI coding agent to Summer Engine. It is the **Summer CLI**, the **Summer MCP** server, and the **Summer agent** skills, hooks, and plugin manifests, all in one package. First-class setup works in Claude Code, Cursor, Codex, Devin Desktop (formerly Windsurf), Cline, Roo Code, Gemini CLI, GitHub Copilot CLI, GitHub Copilot in VS Code, and OpenCode. Factory Droid uses the plugin marketplace path.
|
|
6
6
|
|
|
7
7
|
- **Source:** [github.com/SummerEngine/summer-engine-agent](https://github.com/SummerEngine/summer-engine-agent)
|
|
8
8
|
- **CLI setup:** [www.summerengine.com/cli](https://www.summerengine.com/cli)
|
|
@@ -18,7 +18,7 @@ It just works. Open your agent, say *"let's make an FPS in Summer Engine,"* and
|
|
|
18
18
|
Three names, one npm package (`summer-engine`):
|
|
19
19
|
|
|
20
20
|
- **Summer CLI** (`npx -y summer-engine@latest`): installs the engine, signs you in, scaffolds and runs projects, and writes your agent's config. See [www.summerengine.com/cli](https://www.summerengine.com/cli).
|
|
21
|
-
- **Summer MCP**: the local MCP server that gives your agent
|
|
21
|
+
- **Summer MCP**: the local MCP server that gives your agent 52 engine tools to build, run, and debug a real game. See [www.summerengine.com/mcp](https://www.summerengine.com/mcp).
|
|
22
22
|
- **Summer agent layer**: the game-dev skills, hooks, and plugin manifests that give your AI agent judgment, not just a chat box.
|
|
23
23
|
|
|
24
24
|
All MIT, all free to use. One paste sets up all three.
|
|
@@ -41,7 +41,7 @@ The same operations are available to agents as MCP tools (`summer_cloud_push`, `
|
|
|
41
41
|
|
|
42
42
|
## Get started: one prompt
|
|
43
43
|
|
|
44
|
-
Open your AI agent (Claude Code, Cursor, Codex, Copilot,
|
|
44
|
+
Open your AI agent (Claude Code, Cursor, Codex, Copilot, Devin Desktop, etc.) and paste:
|
|
45
45
|
|
|
46
46
|
> Install Summer Engine and let's make a game. Read github.com/SummerEngine/summer-engine-agent, check what I already have installed, install whatever is missing, log me in, and scaffold a starter project so we can start building.
|
|
47
47
|
|
|
@@ -102,7 +102,7 @@ The relevant check ids are `node-version`, `cli-version`, `cli-version-current`,
|
|
|
102
102
|
npx -y summer-engine@latest setup claude-code --yes --force
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
-
Replace `claude-code` with the user's actual agent: `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `gemini`, `github-copilot`, `vscode-copilot`, or `
|
|
105
|
+
Replace `claude-code` with the user's actual agent: `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `kilo-code`, `gemini`, `github-copilot`, `vscode-copilot`, `opencode`, or `lm-studio`. Use `github-copilot` for Copilot CLI and `vscode-copilot` for GitHub Copilot Chat/Agent in VS Code. Factory Droid still uses the plugin marketplace path in the install section below. This writes the current Summer skill bundle to `~/.claude/skills/<name>/SKILL.md` (or the agent's equivalent user-skill directory) AND writes the MCP server config so the agent can talk to the engine. The `--force` flag wipes any stale skill content first, so re-runs always end up with the latest copy.
|
|
106
106
|
|
|
107
107
|
**First-install detection:** if `~/.claude/skills/` didn't exist before this command, Claude Code wasn't watching it and won't auto-detect the new files this session. Tell the user **once**: "Skills installed - restart your agent so they load." On subsequent installs (directory already existed), skills auto-detect mid-session and no restart is needed. **You can detect first-install vs upgrade by checking if `~/.claude/skills/` existed before Step 1; record the result before running setup.**
|
|
108
108
|
|
|
@@ -192,7 +192,7 @@ Only skip brainstorm if the user explicitly said "skip brainstorm" or "just buil
|
|
|
192
192
|
- **Don't loop `summer login` if it times out at 120s.** Re-run it once and tell the user to be quicker; loop forever and the user is stuck.
|
|
193
193
|
- **Don't jump straight into `summer create` from a vague prompt.** Invoke `summer:brainstorm-game` first (Step 6). The build skills assume `.summer/GameSoul.md` exists.
|
|
194
194
|
|
|
195
|
-
**Using a different agent?** Replace `claude-code` with any supported agent in Step 1: `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `gemini`, `github-copilot`, `vscode-copilot`, or `
|
|
195
|
+
**Using a different agent?** Replace `claude-code` with any supported agent in Step 1: `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `kilo-code`, `gemini`, `github-copilot`, `vscode-copilot`, `opencode`, or `lm-studio`. (`devin` is also accepted as an alias for `windsurf`.) Skill targets vary per agent (Cursor uses `.cursor/rules/`, Devin Desktop uses `.windsurfrules`, Cline + Roo use `.clinerules/`, Copilot uses `~/.copilot/skills` or `.github/skills`, OpenCode uses agent definitions, etc.). The CLI handles the difference. After install, **Cline and Roo Code users should restart VS Code** so the extension reloads its MCP config. **Gemini users** may need to run `gemini extensions enable summer-engine` after the first install. **VS Code Copilot users** should start the `summer-engine` MCP server from Agent mode if VS Code does not autostart it. **Factory Droid** still has its own plugin path below.
|
|
196
196
|
|
|
197
197
|
**Power-user note:** if the user specifically wants `summer` on their `PATH` for everyday terminal use outside the AI agent, a global npm install is still possible. The agent flow doesn't need it.
|
|
198
198
|
|
|
@@ -269,13 +269,15 @@ Two pieces, plus the glue.
|
|
|
269
269
|
|
|
270
270
|
Skills don't list steps. They encode the **order of operations**: diagnose before editing, scope before building, ask before guessing. [Agent Skills](https://agentskills.io) format, so any conformant tool picks them up.
|
|
271
271
|
|
|
272
|
-
**MCP bridge.** The `summer-engine` MCP server gives the agent
|
|
272
|
+
**MCP bridge.** The `summer-engine` MCP server gives the agent 52 tools that talk to your local engine on `localhost:6550`:
|
|
273
273
|
|
|
274
274
|
| | |
|
|
275
275
|
|---|---|
|
|
276
276
|
| Scene | `summer_add_node`, `summer_set_prop`, `summer_instantiate_scene`, `summer_replace_node`, `summer_get_scene_tree`, `summer_inspect_node`, `summer_batch` |
|
|
277
277
|
| Diagnostics | `summer_get_script_errors`, `summer_get_diagnostics`, `summer_get_console`, `summer_get_debugger_errors`, `summer_get_debugger_warnings` |
|
|
278
278
|
| Runtime | `summer_play`, `summer_stop`, `summer_is_running` |
|
|
279
|
+
| Visual | `summer_screenshot` (see the editor viewport, an offscreen scene render, or the running game) |
|
|
280
|
+
| Interactive | `SimulateInput` / `RunVerification` raw ops via `summer_batch` — drive the running game or run a hidden GDScript probe (engine-build dependent) |
|
|
279
281
|
| Project | `summer_get_project_context`, `summer_open_main_scene`, `summer_project_setting`, `summer_input_map_bind` |
|
|
280
282
|
| Assets | `summer_search_assets`, `summer_import_asset`, `summer_import_from_url`, `summer_generate_image`, `summer_generate_3d`, `summer_generate_audio`, `summer_generate_video` |
|
|
281
283
|
|
|
@@ -285,6 +287,36 @@ File ops, git, shell, and grep already belong to your agent. We don't shadow the
|
|
|
285
287
|
|
|
286
288
|
For the full architecture, see [docs/OVERVIEW.md](docs/OVERVIEW.md).
|
|
287
289
|
|
|
290
|
+
### Using Summer via MCP: the verification loop
|
|
291
|
+
|
|
292
|
+
There is no single "verify" tool. You **compose** the checks, climbing only as high as the change demands. Call `summer_get_agent_playbook` for the full ladder; the short version:
|
|
293
|
+
|
|
294
|
+
**1. Does it compile?** After writing a `.gd`, call `summer_get_script_errors res://scripts/player.gd` — no game boot. For a project-wide sweep, `summer_get_diagnostics` (it tells you whether to then read `summer_get_console` / `summer_get_debugger_errors`).
|
|
295
|
+
|
|
296
|
+
**2. Does it look right?** `summer_screenshot` returns the actual pixels — you see them, no description layer. Pick the target on purpose:
|
|
297
|
+
- `viewport` (default) — the editor's current tab, as it looks now.
|
|
298
|
+
- `scene` — an offscreen render of a scene *file* (`scenePath`). No boot; **static at t=0**. Confesses if the scene has no `Camera3D` (renders grey/black when played) or no light — read those warnings.
|
|
299
|
+
- `game` — a frame from the **running** game (`summer_play` first). Over plain local HTTP this returns an honest failure until the desktop bridge is present; when it fails, drop to `viewport`/`scene` or ask the user.
|
|
300
|
+
|
|
301
|
+
**3. Does it run?** Compose the loop:
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
summer_clear_console # clean slate
|
|
305
|
+
summer_play # boot the game (or a specific scene)
|
|
306
|
+
summer_get_debugger_errors # runtime errors: null refs, missing nodes, physics
|
|
307
|
+
summer_screenshot target:game # optional: look at the live frame
|
|
308
|
+
summer_stop # ALWAYS stop — scene edits are refused while running
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**4. Does the interaction work?** To prove input-driven behavior (jump/move/shoot), send a raw op through `summer_batch` (engine-build dependent — a `failure_reason:"unsupported"` comes back verbatim on older builds):
|
|
312
|
+
- `SimulateInput` — inject into the **running** game: `summer_batch ops:[{op:"SimulateInput", type:"action", action:"jump", pressed:true}]`, then re-check screenshot/debugger.
|
|
313
|
+
- `RunVerification` — spawn a hidden, disposable game instance that runs a GDScript probe (press inputs, read state, save frames) and dies, never touching the editor: `summer_batch ops:[{op:"RunVerification", probe_source:"…", max_seconds:20}]` → `{ok, results, frames, out_dir}`.
|
|
314
|
+
- If neither is available on this build, **ask the user to try it** and report what they see — don't fake it.
|
|
315
|
+
|
|
316
|
+
**Honesty.** Never describe an image you didn't receive; a failed capture is a *result* — report it and climb down (`scene`→`viewport`) or ask the user. Pass structured failures (`failure_reason`, `terminalState`, `identity_mismatch`) through verbatim. `summer_get_project_context` binds the session to the open project; a `projectMismatch` warning on a screenshot means the engine switched projects and the frame may be from the wrong one — rebind before trusting it.
|
|
317
|
+
|
|
318
|
+
**Debugging the MCP itself.** Set `SUMMER_MCP_DEBUG=1` in the server's environment to log a structured stderr line per tool call (`tool`, `ok`, `durationMs`, `terminalState`, `errorClass`, `failureReason`, `retried`). With the flag off, only failures are logged.
|
|
319
|
+
|
|
288
320
|
---
|
|
289
321
|
|
|
290
322
|
## The basic workflow
|
|
@@ -390,7 +422,15 @@ Writes the MCP server config to VS Code's globalStorage for the Cline extension
|
|
|
390
422
|
npx -y summer-engine@latest setup roo-code --yes
|
|
391
423
|
```
|
|
392
424
|
|
|
393
|
-
Same shape as Cline (Roo Code is a Cline fork): writes globalStorage MCP config and `.clinerules/` files. **Restart VS Code** afterward.
|
|
425
|
+
Same shape as Cline (Roo Code is a Cline fork): writes globalStorage MCP config and `.clinerules/` files. **Restart VS Code** afterward. Note: Roo Code shut down in May 2026 — prefer Kilo Code, its maintained successor.
|
|
426
|
+
|
|
427
|
+
### Kilo Code (VS Code)
|
|
428
|
+
|
|
429
|
+
```bash
|
|
430
|
+
npx -y summer-engine@latest setup kilo-code --yes
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
Writes the MCP server config to VS Code's globalStorage for the Kilo Code extension (project scope writes `.kilocode/mcp.json`) and drops rules into `.kilocode/rules/`. **Restart VS Code** so Kilo reloads its MCP config.
|
|
394
434
|
|
|
395
435
|
### Gemini CLI
|
|
396
436
|
|
|
@@ -424,7 +464,19 @@ npx -y summer-engine@latest setup opencode --yes
|
|
|
424
464
|
|
|
425
465
|
Writes the MCP server entry into `opencode.json` (`~/.config/opencode/opencode.json` for user scope, `./opencode.json` for project) using the array-shaped `command: ["npx", "-y", "summer-engine@latest", "mcp"]` format. Restart OpenCode. Full guide: [`.opencode/INSTALL.md`](./.opencode/INSTALL.md).
|
|
426
466
|
|
|
427
|
-
###
|
|
467
|
+
### LM Studio (local models)
|
|
468
|
+
|
|
469
|
+
```bash
|
|
470
|
+
npx -y summer-engine@latest setup lm-studio --yes
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
Writes the MCP server entry into `~/.lmstudio/mcp.json` (app-global; there is no project scope). In LM Studio, toggle the `summer-engine` server on in the **Program** tab, and raise the loaded model's context length to **32k or higher** — MCP tool schemas overflow small contexts silently. LM Studio has no rules/skills folder; the MCP server's `summer_get_agent_playbook` tool covers in-chat guidance. Pair with a tool-calling-reliable local model (gpt-oss-20b on 12–16 GB VRAM, Qwen3-Coder-30B on 24 GB).
|
|
474
|
+
|
|
475
|
+
### Ollama (local models)
|
|
476
|
+
|
|
477
|
+
Ollama is the model backend, not an MCP client — pair it with OpenCode, Kilo Code, or Goose and point that agent's provider at `http://localhost:11434/v1`. Before connecting MCP, raise Ollama's context window (defaults to 4k under 24 GB VRAM): start with `OLLAMA_CONTEXT_LENGTH=65536 ollama serve`, then `ollama ps` to confirm the model still fits on the GPU.
|
|
478
|
+
|
|
479
|
+
### Devin Desktop (formerly Windsurf) and others
|
|
428
480
|
|
|
429
481
|
```bash
|
|
430
482
|
npx -y summer-engine@latest setup <agent> --yes --force
|
|
@@ -456,7 +508,7 @@ npx -y summer-engine@latest doctor
|
|
|
456
508
|
| `summer mcp setup <agent>` | Write MCP config for an agent. |
|
|
457
509
|
| `summer setup <agent> [--yes]` | One shot: MCP config + recommended skills + doctor. |
|
|
458
510
|
|
|
459
|
-
Agents: `claude-code`, `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `gemini`, `opencode`. Scopes: `--scope user` (default), `--scope project`.
|
|
511
|
+
Agents: `claude-code`, `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `kilo-code`, `gemini`, `github-copilot`, `vscode-copilot`, `opencode`, `lm-studio`. (`devin` and `devin-desktop` are accepted as aliases for `windsurf`.) Scopes: `--scope user` (default), `--scope project`.
|
|
460
512
|
|
|
461
513
|
---
|
|
462
514
|
|
package/dist/bin/summer.js
CHANGED
|
@@ -56,7 +56,7 @@ function printIntro(version) {
|
|
|
56
56
|
console.log(` ${sym.arrow()} ${c.bold("Summer Engine")} ${c.dim("v" + version)} ${c.dim("·")} AI-native game engine`);
|
|
57
57
|
console.log("");
|
|
58
58
|
console.log(` ${c.bold("Setup wizard")}`);
|
|
59
|
-
console.log(` Open Claude Code, Cursor, Codex, Copilot, Windsurf, or another supported agent and paste:`);
|
|
59
|
+
console.log(` Open Claude Code, Cursor, Codex, Copilot, Devin Desktop (formerly Windsurf), or another supported agent and paste:`);
|
|
60
60
|
console.log(` ${c.brand("\"Install Summer Engine and let's make a game.\"")}`);
|
|
61
61
|
console.log("");
|
|
62
62
|
console.log(` ${c.bold("Manual commands")}`);
|
package/dist/commands/setup.js
CHANGED
|
@@ -10,13 +10,15 @@ const AGENT_LABEL = {
|
|
|
10
10
|
"claude-code": "Claude Code",
|
|
11
11
|
codex: "Codex",
|
|
12
12
|
cursor: "Cursor",
|
|
13
|
-
windsurf: "Windsurf",
|
|
13
|
+
windsurf: "Devin Desktop (Windsurf)",
|
|
14
14
|
cline: "Cline",
|
|
15
15
|
"roo-code": "Roo Code",
|
|
16
|
+
"kilo-code": "Kilo Code",
|
|
16
17
|
gemini: "Gemini CLI",
|
|
17
18
|
"github-copilot": "GitHub Copilot CLI",
|
|
18
19
|
"vscode-copilot": "GitHub Copilot in VS Code",
|
|
19
20
|
opencode: "OpenCode",
|
|
21
|
+
"lm-studio": "LM Studio",
|
|
20
22
|
};
|
|
21
23
|
export const setupCommand = new Command("setup")
|
|
22
24
|
.description("Configure Summer Engine for an AI agent and run diagnostics")
|
|
@@ -76,6 +78,12 @@ function resolveScope(scopeOpt) {
|
|
|
76
78
|
return parsed;
|
|
77
79
|
}
|
|
78
80
|
function setupRecommendedSkills(agent, options) {
|
|
81
|
+
if (agent === "lm-studio") {
|
|
82
|
+
return {
|
|
83
|
+
status: "skipped",
|
|
84
|
+
message: "LM Studio has no rules or skills folder. The MCP server ships summer_get_agent_playbook, so the model can pull Summer guidance in-chat.",
|
|
85
|
+
};
|
|
86
|
+
}
|
|
79
87
|
const invocation = skillInstallInvocation(agent, { force: options.force });
|
|
80
88
|
if (!invocation) {
|
|
81
89
|
return {
|
package/dist/commands/skills.js
CHANGED
|
@@ -113,7 +113,8 @@ function resolveScope(agent, opts) {
|
|
|
113
113
|
if (agent === "cursor" ||
|
|
114
114
|
agent === "windsurf" ||
|
|
115
115
|
agent === "cline" ||
|
|
116
|
-
agent === "roo-code"
|
|
116
|
+
agent === "roo-code" ||
|
|
117
|
+
agent === "kilo-code") {
|
|
117
118
|
return "project";
|
|
118
119
|
}
|
|
119
120
|
return "user";
|
|
@@ -127,11 +128,13 @@ function agentLabel(agent) {
|
|
|
127
128
|
case "cursor":
|
|
128
129
|
return "Cursor";
|
|
129
130
|
case "windsurf":
|
|
130
|
-
return "Windsurf";
|
|
131
|
+
return "Devin Desktop (Windsurf)";
|
|
131
132
|
case "cline":
|
|
132
133
|
return "Cline";
|
|
133
134
|
case "roo-code":
|
|
134
135
|
return "Roo Code";
|
|
136
|
+
case "kilo-code":
|
|
137
|
+
return "Kilo Code";
|
|
135
138
|
case "gemini":
|
|
136
139
|
return "Gemini CLI";
|
|
137
140
|
case "github-copilot":
|
|
@@ -152,7 +155,7 @@ function resolveInstallLocation(agent, scope) {
|
|
|
152
155
|
if (agent === "windsurf") {
|
|
153
156
|
return { kind: "windsurf-rule-file", path: join(overrideDir, ".windsurfrules") };
|
|
154
157
|
}
|
|
155
|
-
if (agent === "cline" || agent === "roo-code") {
|
|
158
|
+
if (agent === "cline" || agent === "roo-code" || agent === "kilo-code") {
|
|
156
159
|
return { kind: "cline-rule-dir", path: overrideDir };
|
|
157
160
|
}
|
|
158
161
|
if (agent === "gemini") {
|
|
@@ -187,6 +190,13 @@ function resolveInstallLocation(agent, scope) {
|
|
|
187
190
|
? rooCodeUserRulesDir()
|
|
188
191
|
: join(process.cwd(), ".clinerules"),
|
|
189
192
|
};
|
|
193
|
+
case "kilo-code":
|
|
194
|
+
return {
|
|
195
|
+
kind: "cline-rule-dir",
|
|
196
|
+
path: scope === "user"
|
|
197
|
+
? join(homedir(), ".kilocode", "rules")
|
|
198
|
+
: join(process.cwd(), ".kilocode", "rules"),
|
|
199
|
+
};
|
|
190
200
|
case "gemini":
|
|
191
201
|
return {
|
|
192
202
|
kind: "gemini-skill-dir",
|
|
@@ -390,7 +400,7 @@ function printInstallSummary(count, agent, scope, location) {
|
|
|
390
400
|
console.log("Restart OpenCode so it picks up the new agent definitions.");
|
|
391
401
|
}
|
|
392
402
|
else {
|
|
393
|
-
console.log(`Windsurf rules are in ${tildeified}`);
|
|
403
|
+
console.log(`Devin Desktop (formerly Windsurf) rules are in ${tildeified}`);
|
|
394
404
|
}
|
|
395
405
|
}
|
|
396
406
|
export const skillsCommand = new Command("skills")
|
|
@@ -484,7 +494,7 @@ function installClaudeCommands(scope, force) {
|
|
|
484
494
|
}
|
|
485
495
|
/**
|
|
486
496
|
* Drop a `.summer-version` marker into the install dir so doctor's
|
|
487
|
-
* `skills-version-stale` check can detect drift later. Windsurf writes a
|
|
497
|
+
* `skills-version-stale` check can detect drift later. Devin Desktop (formerly Windsurf) writes a
|
|
488
498
|
* single rules file with no surrounding dir, so we skip it there.
|
|
489
499
|
*/
|
|
490
500
|
function writeMarkerForLocation(location) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const SUMMER_MCP_SERVER_NAME = "summer-engine";
|
|
2
|
-
export declare const supportedAgents: readonly ["codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "github-copilot", "vscode-copilot", "opencode"];
|
|
2
|
+
export declare const supportedAgents: readonly ["codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "kilo-code", "gemini", "github-copilot", "vscode-copilot", "opencode", "lm-studio"];
|
|
3
3
|
export type SupportedAgent = (typeof supportedAgents)[number];
|
|
4
4
|
export type ConfigScope = "user" | "project";
|
|
5
5
|
export interface StdioMcpServerConfig {
|
package/dist/lib/agent-config.js
CHANGED
|
@@ -11,10 +11,12 @@ export const supportedAgents = [
|
|
|
11
11
|
"windsurf",
|
|
12
12
|
"cline",
|
|
13
13
|
"roo-code",
|
|
14
|
+
"kilo-code",
|
|
14
15
|
"gemini",
|
|
15
16
|
"github-copilot",
|
|
16
17
|
"vscode-copilot",
|
|
17
18
|
"opencode",
|
|
19
|
+
"lm-studio",
|
|
18
20
|
];
|
|
19
21
|
const agentAliases = {
|
|
20
22
|
claude: "claude-code",
|
|
@@ -22,10 +24,16 @@ const agentAliases = {
|
|
|
22
24
|
codex: "codex",
|
|
23
25
|
cursor: "cursor",
|
|
24
26
|
windsurf: "windsurf",
|
|
27
|
+
devin: "windsurf",
|
|
28
|
+
"devin-desktop": "windsurf",
|
|
29
|
+
devindesktop: "windsurf",
|
|
25
30
|
cline: "cline",
|
|
26
31
|
"roo-code": "roo-code",
|
|
27
32
|
roo: "roo-code",
|
|
28
33
|
roocode: "roo-code",
|
|
34
|
+
kilo: "kilo-code",
|
|
35
|
+
kilocode: "kilo-code",
|
|
36
|
+
"kilo-code": "kilo-code",
|
|
29
37
|
gemini: "gemini",
|
|
30
38
|
"gemini-cli": "gemini",
|
|
31
39
|
copilot: "github-copilot",
|
|
@@ -39,6 +47,9 @@ const agentAliases = {
|
|
|
39
47
|
"github-copilot-vscode": "vscode-copilot",
|
|
40
48
|
opencode: "opencode",
|
|
41
49
|
"open-code": "opencode",
|
|
50
|
+
lmstudio: "lm-studio",
|
|
51
|
+
"lm-studio": "lm-studio",
|
|
52
|
+
"lm_studio": "lm-studio",
|
|
42
53
|
};
|
|
43
54
|
export function parseAgent(value) {
|
|
44
55
|
if (!value)
|
|
@@ -148,7 +159,7 @@ function resolveConfigTarget(agent, scope, cwd, env) {
|
|
|
148
159
|
const warnings = [];
|
|
149
160
|
if (override) {
|
|
150
161
|
if (scope === "project" &&
|
|
151
|
-
(agent === "cline" || agent === "roo-code" || agent === "gemini")) {
|
|
162
|
+
(agent === "cline" || agent === "roo-code" || agent === "gemini" || agent === "lm-studio")) {
|
|
152
163
|
warnings.push(`${agent} MCP config has no project scope today; treating as user scope.`);
|
|
153
164
|
}
|
|
154
165
|
return {
|
|
@@ -212,6 +223,25 @@ function resolveConfigTarget(agent, scope, cwd, env) {
|
|
|
212
223
|
warnings,
|
|
213
224
|
};
|
|
214
225
|
}
|
|
226
|
+
if (agent === "kilo-code") {
|
|
227
|
+
return {
|
|
228
|
+
path: scope === "user"
|
|
229
|
+
? vsCodeGlobalStoragePath(env, "kilocode.kilo-code", "mcp_settings.json")
|
|
230
|
+
: join(cwd, ".kilocode", "mcp.json"),
|
|
231
|
+
format: "json",
|
|
232
|
+
warnings,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
if (agent === "lm-studio") {
|
|
236
|
+
if (scope === "project") {
|
|
237
|
+
warnings.push("LM Studio's MCP config is app-global (~/.lmstudio/mcp.json); treating as user scope.");
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
path: join(homedir(), ".lmstudio", "mcp.json"),
|
|
241
|
+
format: "json",
|
|
242
|
+
warnings,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
215
245
|
if (agent === "gemini") {
|
|
216
246
|
if (scope === "project") {
|
|
217
247
|
warnings.push("Gemini extensions are user-scoped today; writing to ~/.gemini/extensions/summer-engine/ instead of project.");
|
|
@@ -250,7 +280,7 @@ function resolveConfigTarget(agent, scope, cwd, env) {
|
|
|
250
280
|
};
|
|
251
281
|
}
|
|
252
282
|
if (scope === "project") {
|
|
253
|
-
warnings.push("Windsurf documents MCP configuration as user-scoped; project scope writes .windsurf/mcp_config.json for teams that load workspace config.");
|
|
283
|
+
warnings.push("Devin Desktop (formerly Windsurf) documents MCP configuration as user-scoped; project scope writes .windsurf/mcp_config.json for teams that load workspace config.");
|
|
254
284
|
}
|
|
255
285
|
return {
|
|
256
286
|
path: scope === "user"
|
|
@@ -260,18 +290,18 @@ function resolveConfigTarget(agent, scope, cwd, env) {
|
|
|
260
290
|
warnings,
|
|
261
291
|
};
|
|
262
292
|
}
|
|
263
|
-
function vsCodeGlobalStoragePath(env, extensionId) {
|
|
293
|
+
function vsCodeGlobalStoragePath(env, extensionId, fileName = "cline_mcp_settings.json") {
|
|
264
294
|
const os = platform();
|
|
265
295
|
if (os === "win32") {
|
|
266
296
|
const appData = env.APPDATA ?? join(homedir(), "AppData", "Roaming");
|
|
267
|
-
return join(appData, "Code", "User", "globalStorage", extensionId, "settings",
|
|
297
|
+
return join(appData, "Code", "User", "globalStorage", extensionId, "settings", fileName);
|
|
268
298
|
}
|
|
269
299
|
if (os === "darwin") {
|
|
270
|
-
return join(homedir(), "Library", "Application Support", "Code", "User", "globalStorage", extensionId, "settings",
|
|
300
|
+
return join(homedir(), "Library", "Application Support", "Code", "User", "globalStorage", extensionId, "settings", fileName);
|
|
271
301
|
}
|
|
272
302
|
// Linux and other Unix
|
|
273
303
|
const xdg = env.XDG_CONFIG_HOME ?? join(homedir(), ".config");
|
|
274
|
-
return join(xdg, "Code", "User", "globalStorage", extensionId, "settings",
|
|
304
|
+
return join(xdg, "Code", "User", "globalStorage", extensionId, "settings", fileName);
|
|
275
305
|
}
|
|
276
306
|
function opencodeUserConfigPath(env) {
|
|
277
307
|
const os = platform();
|
|
@@ -305,6 +335,10 @@ function getConfigPathOverride(agent, env) {
|
|
|
305
335
|
return env.SUMMER_CLINE_CONFIG_FILE;
|
|
306
336
|
if (agent === "roo-code")
|
|
307
337
|
return env.SUMMER_ROO_CODE_CONFIG_FILE;
|
|
338
|
+
if (agent === "kilo-code")
|
|
339
|
+
return env.SUMMER_KILO_CODE_CONFIG_FILE;
|
|
340
|
+
if (agent === "lm-studio")
|
|
341
|
+
return env.SUMMER_LM_STUDIO_CONFIG_FILE;
|
|
308
342
|
if (agent === "gemini")
|
|
309
343
|
return env.SUMMER_GEMINI_CONFIG_FILE;
|
|
310
344
|
if (agent === "github-copilot")
|
|
@@ -558,15 +592,19 @@ function createNextSteps(agent, scope, path) {
|
|
|
558
592
|
? "Restart VS Code so Cline reloads its MCP config."
|
|
559
593
|
: agent === "roo-code"
|
|
560
594
|
? "Restart VS Code so Roo Code reloads its MCP config."
|
|
561
|
-
: agent === "
|
|
562
|
-
? "
|
|
563
|
-
: agent === "
|
|
564
|
-
? "
|
|
565
|
-
: agent === "
|
|
566
|
-
? "
|
|
567
|
-
: agent === "
|
|
568
|
-
? "Restart
|
|
569
|
-
:
|
|
595
|
+
: agent === "kilo-code"
|
|
596
|
+
? "Restart VS Code so Kilo Code reloads its MCP config."
|
|
597
|
+
: agent === "lm-studio"
|
|
598
|
+
? "Open LM Studio, toggle on the summer-engine MCP server in the Program tab, and raise the loaded model's context length to 32k or higher."
|
|
599
|
+
: agent === "gemini"
|
|
600
|
+
? "Run `gemini extensions enable summer-engine` (if not already enabled), then restart Gemini CLI."
|
|
601
|
+
: agent === "github-copilot"
|
|
602
|
+
? "Restart Copilot CLI, or run /mcp reload and /skills reload in the active session."
|
|
603
|
+
: agent === "vscode-copilot"
|
|
604
|
+
? "Restart VS Code or run MCP: List Servers, then start summer-engine in Copilot Agent mode."
|
|
605
|
+
: agent === "opencode"
|
|
606
|
+
? "Restart OpenCode so it reloads opencode.json."
|
|
607
|
+
: "Restart Devin Desktop (formerly Windsurf) and refresh MCP servers from the agent settings.";
|
|
570
608
|
const projectTrust = scope === "project" && agent === "codex"
|
|
571
609
|
? "Codex only loads project .codex/config.toml from trusted projects."
|
|
572
610
|
: null;
|
package/dist/lib/api-client.d.ts
CHANGED
|
@@ -2,6 +2,10 @@ export type EngineSnapshot = {
|
|
|
2
2
|
ok: boolean;
|
|
3
3
|
localPath?: string;
|
|
4
4
|
path?: string;
|
|
5
|
+
/** Raw image bytes, base64-encoded. Carried so a caller (e.g. the MCP
|
|
6
|
+
* screenshot tool) can return an MCP image content block to a vision-capable
|
|
7
|
+
* client without re-reading localPath off disk. */
|
|
8
|
+
base64?: string;
|
|
5
9
|
width?: number;
|
|
6
10
|
height?: number;
|
|
7
11
|
format?: string;
|
|
@@ -12,12 +16,43 @@ export type EngineSnapshot = {
|
|
|
12
16
|
bytes?: number;
|
|
13
17
|
error?: string;
|
|
14
18
|
metadata?: Record<string, unknown>;
|
|
19
|
+
/** Structured failure classifier the engine returns on a game snapshot over
|
|
20
|
+
* local HTTP (409 `bridge_required`) — surfaced verbatim so the tool can give
|
|
21
|
+
* an honest, actionable message instead of a truncated generic 409 string.
|
|
22
|
+
* When P4.4 lands (game snapshots answer 200/202 over HTTP) this simply
|
|
23
|
+
* never fires and the tool works. */
|
|
24
|
+
failureReason?: string;
|
|
25
|
+
/** Scene-preview confession fields (P4.3). Populated only for target:"scene".
|
|
26
|
+
* A scene with no Camera3D renders grey/black when played; the engine reports
|
|
27
|
+
* whether it had to synthesize a camera/light so the model can warn honestly. */
|
|
28
|
+
sceneHasCamera?: boolean;
|
|
29
|
+
sceneHadLight?: boolean;
|
|
30
|
+
usedSyntheticCamera?: boolean;
|
|
31
|
+
/** Set true when the bound projectIdHash no longer matches the engine's live
|
|
32
|
+
* health hash at capture time — the frame may be from the WRONG project
|
|
33
|
+
* (item 4, client-side drift check). */
|
|
34
|
+
projectMismatch?: boolean;
|
|
15
35
|
};
|
|
16
36
|
export declare class EngineApiClient {
|
|
17
37
|
private port;
|
|
18
38
|
private token;
|
|
19
|
-
|
|
39
|
+
private boundProjectIdHash?;
|
|
40
|
+
constructor(port: number, token: string, boundProjectIdHash?: string);
|
|
20
41
|
static connect(): Promise<EngineApiClient>;
|
|
42
|
+
/** The projectIdHash this session is bound to (undefined if none was reported
|
|
43
|
+
* at connect — e.g. no project open yet). */
|
|
44
|
+
getBoundProjectIdHash(): string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Re-read health and rebind to the currently-open project. Called by
|
|
47
|
+
* summer_get_project_context so the agent can INTENTIONALLY follow a project
|
|
48
|
+
* switch (the deliberate escape hatch after an identity_mismatch). Returns the
|
|
49
|
+
* new bound hash. Reads carry no identity, so this always reaches the engine
|
|
50
|
+
* even when a mutation would be rejected.
|
|
51
|
+
*/
|
|
52
|
+
rebind(): Promise<string | undefined>;
|
|
53
|
+
/** Identity to attach to a MUTATING command's options so the engine can reject
|
|
54
|
+
* a wrong-project write. Empty when unbound (engine then skips the check). */
|
|
55
|
+
private identityOptions;
|
|
21
56
|
private request;
|
|
22
57
|
/** Raw fetch with auth + timeout — returns the Response so callers can inspect
|
|
23
58
|
* the status (202 queued vs 200 legacy). */
|
|
@@ -47,7 +82,46 @@ export declare class EngineApiClient {
|
|
|
47
82
|
getSelection(): Promise<unknown>;
|
|
48
83
|
private writeSnapshotFile;
|
|
49
84
|
private snapshot;
|
|
85
|
+
/** Shared: turn an ops/snapshot response envelope into an EngineSnapshot.
|
|
86
|
+
* Used by viewport/game snapshots and by scenePreview. */
|
|
87
|
+
private _parseSnapshotResponse;
|
|
88
|
+
/**
|
|
89
|
+
* Probe /api/snapshot/game for the structural 409 `bridge_required` shape
|
|
90
|
+
* (tool_net_thread.cpp:495-503). Returns a structured failure only when the
|
|
91
|
+
* engine actually answers 409 with `bridge_required` / `unsupported_transport`;
|
|
92
|
+
* ANY other status (200/202/other) returns null so the caller proceeds to the
|
|
93
|
+
* normal queued path — so the moment the engine starts answering over HTTP
|
|
94
|
+
* (P4.4), game capture just works with no code change here.
|
|
95
|
+
*/
|
|
96
|
+
private _detectBridgeRequired;
|
|
50
97
|
viewportSnapshot(): Promise<EngineSnapshot>;
|
|
51
98
|
gameSnapshot(): Promise<EngineSnapshot>;
|
|
99
|
+
/**
|
|
100
|
+
* Offscreen scene render via the `ScenePreview` op over /api/ops (no game
|
|
101
|
+
* boot; physics/animations are static). Mirrors the web previewScene op input
|
|
102
|
+
* (snapshot-tools.ts): { op:'ScenePreview', scene_path?, framing?, size?,
|
|
103
|
+
* node_path? } — scene_path optional, engine defaults to the open scene. The
|
|
104
|
+
* result carries image_base64 + mime (+ width/height) plus the P4.3 confession
|
|
105
|
+
* fields (scene_has_camera / scene_had_light / used_synthetic_camera).
|
|
106
|
+
*/
|
|
107
|
+
scenePreview(input?: {
|
|
108
|
+
scenePath?: string;
|
|
109
|
+
framing?: "auto" | "top" | "front" | "iso";
|
|
110
|
+
size?: [number, number];
|
|
111
|
+
nodePath?: string;
|
|
112
|
+
}): Promise<EngineSnapshot>;
|
|
52
113
|
getPort(): number;
|
|
114
|
+
/**
|
|
115
|
+
* Cheap drift probe for the MCP client cache. The engine mints a fresh
|
|
116
|
+
* api-token on every launch (local_api_server.cpp::_generate_api_token) and can
|
|
117
|
+
* bind a different port (tool_net_thread.cpp::start increments 6550..6565 when
|
|
118
|
+
* the old socket lingers), so a client built before an engine restart holds
|
|
119
|
+
* dead credentials. Re-read the on-disk creds and report whether they no longer
|
|
120
|
+
* match this client's snapshot.
|
|
121
|
+
*
|
|
122
|
+
* Empty / unreadable creds (engine mid-write, or just closed) are treated as
|
|
123
|
+
* "no drift" so a transient read never thrashes the cache — the live request
|
|
124
|
+
* will fail and trigger a reconnect+retry if the client really is stale.
|
|
125
|
+
*/
|
|
126
|
+
credentialsChanged(): Promise<boolean>;
|
|
53
127
|
}
|