summer-engine 3.4.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +5 -1
  3. package/.codex-plugin/plugin.json +5 -1
  4. package/.cursor-plugin/plugin.json +5 -1
  5. package/.factory-plugin/plugin.json +5 -1
  6. package/.opencode/INSTALL.md +8 -8
  7. package/.opencode/plugins/summer.js +2 -2
  8. package/AGENTS.md +7 -7
  9. package/CHANGELOG.md +37 -0
  10. package/GEMINI.md +1 -1
  11. package/NOTICE +1 -1
  12. package/README.md +35 -35
  13. package/assets/autopilot/run.sh +2 -2
  14. package/assets/navigation/web-routes.json +1 -1
  15. package/commands/gameskill.md +2 -2
  16. package/commands/summer.md +25 -25
  17. package/dist/cli/commands/open.d.ts +1 -1
  18. package/dist/cli/commands/run.d.ts +1 -1
  19. package/dist/cli/commands/run.js +1 -1
  20. package/dist/cli/commands/setup.js +24 -4
  21. package/dist/cli/commands/skills.js +2 -2
  22. package/dist/core/api-client.d.ts +5 -6
  23. package/dist/core/api-client.js +12 -15
  24. package/dist/core/auth.js +2 -2
  25. package/dist/core/capabilities/asset-import.d.ts +0 -1
  26. package/dist/core/capabilities/camera-view.d.ts +1 -1
  27. package/dist/core/capabilities/camera-view.js +2 -2
  28. package/dist/core/capabilities/capture-gameplay.d.ts +72 -7
  29. package/dist/core/capabilities/capture-gameplay.js +386 -25
  30. package/dist/core/capabilities/connect-signal.d.ts +1 -2
  31. package/dist/core/capabilities/connect-signal.js +1 -2
  32. package/dist/core/capabilities/console-read.d.ts +2 -2
  33. package/dist/core/capabilities/console-read.js +2 -2
  34. package/dist/core/capabilities/engine-receipt.d.ts +5 -7
  35. package/dist/core/capabilities/engine-receipt.js +7 -9
  36. package/dist/core/capabilities/export-engine-version.d.ts +7 -0
  37. package/dist/core/capabilities/export-engine-version.js +9 -0
  38. package/dist/core/capabilities/export-game.d.ts +4 -0
  39. package/dist/core/capabilities/export-game.js +53 -10
  40. package/dist/core/capabilities/export-presets.d.ts +1 -1
  41. package/dist/core/capabilities/export-presets.js +1 -1
  42. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
  43. package/dist/core/capabilities/fabricate-mesh.js +2 -3
  44. package/dist/core/capabilities/frame-quality.d.ts +4 -4
  45. package/dist/core/capabilities/frame-quality.js +4 -4
  46. package/dist/core/capabilities/grep.d.ts +1 -1
  47. package/dist/core/capabilities/grep.js +1 -1
  48. package/dist/core/capabilities/image-generation.d.ts +12 -2
  49. package/dist/core/capabilities/image-generation.js +31 -2
  50. package/dist/core/capabilities/navigation/open.d.ts +1 -1
  51. package/dist/core/capabilities/navigation/open.js +1 -1
  52. package/dist/core/capabilities/navigation/render-product-map.js +1 -1
  53. package/dist/core/capabilities/navigation/targets.js +2 -2
  54. package/dist/core/capabilities/placement-batch.d.ts +1 -1
  55. package/dist/core/capabilities/placement-batch.js +2 -2
  56. package/dist/core/capabilities/play-determinism.d.ts +1 -1
  57. package/dist/core/capabilities/play-determinism.js +1 -1
  58. package/dist/core/capabilities/publish-build.d.ts +1 -1
  59. package/dist/core/capabilities/publish-build.js +21 -9
  60. package/dist/core/capabilities/publish-download.d.ts +1 -2
  61. package/dist/core/capabilities/publish-download.js +2 -3
  62. package/dist/core/capabilities/replace-node.d.ts +1 -3
  63. package/dist/core/capabilities/replace-node.js +1 -3
  64. package/dist/core/capabilities/runtime-control.d.ts +5 -7
  65. package/dist/core/capabilities/runtime-control.js +7 -9
  66. package/dist/core/capabilities/scene-batch.d.ts +1 -1
  67. package/dist/core/capabilities/scene-batch.js +1 -1
  68. package/dist/core/capabilities/scene-kind.js +1 -1
  69. package/dist/core/capabilities/scene-readback.d.ts +3 -4
  70. package/dist/core/capabilities/scene-readback.js +3 -4
  71. package/dist/core/capabilities/scene-script.d.ts +2 -2
  72. package/dist/core/capabilities/scene-script.js +2 -2
  73. package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
  74. package/dist/core/capabilities/seeing/shot-store.js +1 -1
  75. package/dist/core/capabilities/summer-bundle.d.ts +11 -3
  76. package/dist/core/capabilities/summer-bundle.js +21 -3
  77. package/dist/core/capabilities/surface-snap.d.ts +1 -1
  78. package/dist/core/capabilities/surface-snap.js +1 -1
  79. package/dist/core/capabilities/tool-dispatch.js +14 -3
  80. package/dist/core/capabilities/ui-control.d.ts +1 -2
  81. package/dist/core/capabilities/ui-control.js +1 -2
  82. package/dist/core/capabilities/world-snapshot.d.ts +1 -1
  83. package/dist/core/capabilities/world-snapshot.js +1 -1
  84. package/dist/core/capability-skew.d.ts +2 -3
  85. package/dist/core/capability-skew.js +4 -5
  86. package/dist/core/feedback/client.js +1 -1
  87. package/dist/core/launch-posture.d.ts +3 -3
  88. package/dist/core/launch-posture.js +3 -3
  89. package/dist/core/library-read.d.ts +7 -0
  90. package/dist/core/library-read.js +60 -9
  91. package/dist/core/library-search.d.ts +2 -0
  92. package/dist/core/templates.d.ts +1 -2
  93. package/dist/core/templates.js +1 -2
  94. package/dist/installer/agent-config.d.ts +25 -0
  95. package/dist/installer/agent-config.js +114 -3
  96. package/dist/installer/agent-table.d.ts +12 -0
  97. package/dist/installer/agent-table.js +9 -0
  98. package/dist/mcp/server.d.ts +2 -2
  99. package/dist/mcp/server.js +2 -2
  100. package/dist/mcp/tools/creator-tools.js +33 -4
  101. package/dist/mcp/tools/debug-tools.js +1 -1
  102. package/dist/mcp/tools/generate-tools.js +18 -37
  103. package/dist/mcp/tools/library-tools.d.ts +2 -1
  104. package/dist/mcp/tools/library-tools.js +1 -0
  105. package/dist/mcp/tools/navigation-tools.d.ts +1 -1
  106. package/dist/mcp/tools/navigation-tools.js +1 -1
  107. package/dist/mcp/tools/spatial-tools.js +1 -1
  108. package/dist/mcp/tools/visual-tools.js +2 -2
  109. package/dist/mcp/tools/with-engine.d.ts +1 -2
  110. package/dist/mcp/tools/with-engine.js +1 -2
  111. package/gemini-extension.json +5 -1
  112. package/hooks/session-start.sh +2 -2
  113. package/integrations/README.md +70 -76
  114. package/integrations/claude/README.md +0 -3
  115. package/integrations/codex/README.md +1 -2
  116. package/integrations/copilot-jetbrains/README.md +1 -1
  117. package/integrations/cursor/README.md +1 -2
  118. package/integrations/factory/README.md +15 -11
  119. package/integrations/mistral-vibe/README.md +1 -1
  120. package/integrations/opencode/README.md +1 -1
  121. package/integrations/roo-code/README.md +1 -1
  122. package/integrations/rovo-dev/README.md +1 -1
  123. package/integrations/trae/README.md +1 -1
  124. package/integrations/windsurf/README.md +3 -3
  125. package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
  126. package/library/references/gd-style/gd-style.md +4 -6
  127. package/library/references/godot-version/godot-version.md +3 -3
  128. package/library/references/headless-routing/headless-routing.md +2 -2
  129. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
  130. package/library/references/mcp-tools-reference/mcp-tools-reference.md +16 -15
  131. package/library/references/product-map/product-map.md +1 -1
  132. package/library/references/public-surface-language/public-surface-language.md +1 -1
  133. package/library/references/summer-folder/summer-folder.md +1 -1
  134. package/library/skills/3d-lighting/SKILL.md +4 -4
  135. package/library/skills/README.md +16 -6
  136. package/library/skills/adaptive-music/SKILL.md +7 -7
  137. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  138. package/library/skills/ambient-bed/SKILL.md +12 -14
  139. package/library/skills/animated-loop/SKILL.md +42 -42
  140. package/library/skills/animation-tree/SKILL.md +6 -6
  141. package/library/skills/art-direction/SKILL.md +8 -11
  142. package/library/skills/asset-strategy/SKILL.md +3 -3
  143. package/library/skills/audio-direction/SKILL.md +8 -10
  144. package/library/skills/auto-fire-targeting/SKILL.md +4 -3
  145. package/library/skills/bounded-engine-runs/SKILL.md +6 -7
  146. package/library/skills/brainstorm-game/SKILL.md +5 -5
  147. package/library/skills/brainstorming/SKILL.md +9 -15
  148. package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
  149. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
  150. package/library/skills/character-animation-wiring/SKILL.md +2 -2
  151. package/library/skills/character-model/SKILL.md +15 -26
  152. package/library/skills/character-movement/SKILL.md +1 -1
  153. package/library/skills/character-movement/references/movement-3d.md +1 -1
  154. package/library/skills/character-portrait/SKILL.md +4 -4
  155. package/library/skills/cinematic-cutscene/SKILL.md +38 -38
  156. package/library/skills/combat-basics/SKILL.md +1 -1
  157. package/library/skills/compatibility-renderer-traps/SKILL.md +2 -2
  158. package/library/skills/concept-art/SKILL.md +3 -3
  159. package/library/skills/create-asset-sheet/SKILL.md +12 -31
  160. package/library/skills/debug/SKILL.md +5 -4
  161. package/library/skills/debugging-game-feel/SKILL.md +1 -4
  162. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  163. package/library/skills/design-level/SKILL.md +5 -5
  164. package/library/skills/design-mechanic/SKILL.md +6 -6
  165. package/library/skills/design-npc/SKILL.md +8 -15
  166. package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
  167. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
  168. package/library/skills/environment-kit/SKILL.md +5 -5
  169. package/library/skills/export-and-ship/SKILL.md +24 -25
  170. package/library/skills/export-and-ship/resource.yaml +2 -1
  171. package/library/skills/fabricating-assets/SKILL.md +1 -1
  172. package/library/skills/facial-and-lipsync/SKILL.md +5 -5
  173. package/library/skills/fps-controller/SKILL.md +17 -16
  174. package/library/skills/fps-controller/resource.yaml +0 -2
  175. package/library/skills/game-feel/SKILL.md +6 -7
  176. package/library/skills/gameskill/SKILL.md +3 -3
  177. package/library/skills/gdscript-patterns/SKILL.md +3 -3
  178. package/library/skills/generate-motion/SKILL.md +5 -22
  179. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
  180. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
  181. package/library/skills/grow-analytics/SKILL.md +21 -0
  182. package/library/skills/grow-analytics/resource.yaml +27 -0
  183. package/library/skills/headless-scripting/SKILL.md +8 -8
  184. package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
  185. package/library/skills/investigating-bugs/SKILL.md +3 -11
  186. package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
  187. package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
  188. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
  189. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
  190. package/library/skills/make-game/SKILL.md +3 -5
  191. package/library/skills/make-game/references/2d-platformer.md +1 -1
  192. package/library/skills/multiplayer-project/SKILL.md +1 -1
  193. package/library/skills/multiplayer-testing/SKILL.md +4 -4
  194. package/library/skills/music-track/SKILL.md +40 -38
  195. package/library/skills/new-project/SKILL.md +4 -6
  196. package/library/skills/organic-model/SKILL.md +9 -9
  197. package/library/skills/pixel-art/SKILL.md +6 -6
  198. package/library/skills/play/SKILL.md +3 -4
  199. package/library/skills/playtesting-a-feature/SKILL.md +4 -6
  200. package/library/skills/procedural-animation/SKILL.md +10 -11
  201. package/library/skills/prop-model/SKILL.md +4 -4
  202. package/library/skills/psx-retro-rendering/SKILL.md +20 -20
  203. package/library/skills/psx-retro-rendering/resource.yaml +2 -3
  204. package/library/skills/publish-your-game/SKILL.md +21 -0
  205. package/library/skills/publish-your-game/resource.yaml +29 -0
  206. package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
  207. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
  208. package/library/skills/remote-deploy/SKILL.md +20 -21
  209. package/library/skills/retarget/SKILL.md +19 -23
  210. package/library/skills/running-in-the-cloud/SKILL.md +5 -5
  211. package/library/skills/scene-composition/SKILL.md +5 -5
  212. package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
  213. package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
  214. package/library/skills/scene-scripting/SKILL.md +3 -3
  215. package/library/skills/scene-to-level/SKILL.md +28 -31
  216. package/library/skills/skill-create/SKILL.md +1 -1
  217. package/library/skills/skill-improve/SKILL.md +9 -9
  218. package/library/skills/skill-test/SKILL.md +10 -10
  219. package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
  220. package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
  221. package/library/skills/skybox-panorama/SKILL.md +8 -9
  222. package/library/skills/sound-effect/SKILL.md +19 -19
  223. package/library/skills/spatial-placement/SKILL.md +2 -2
  224. package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
  225. package/library/skills/sprite-sheet/SKILL.md +10 -10
  226. package/library/skills/store-art/SKILL.md +23 -0
  227. package/library/skills/store-art/resource.yaml +30 -0
  228. package/library/skills/store-listing/SKILL.md +21 -0
  229. package/library/skills/store-listing/resource.yaml +25 -0
  230. package/library/skills/summer-analytics/SKILL.md +3 -3
  231. package/library/skills/summer-analytics/resource.yaml +1 -0
  232. package/library/skills/summer-friends/SKILL.md +10 -10
  233. package/library/skills/summer-leaderboards/SKILL.md +6 -6
  234. package/library/skills/summer-match-results/SKILL.md +13 -13
  235. package/library/skills/summer-matchmaking/SKILL.md +11 -11
  236. package/library/skills/summer-parties/SKILL.md +9 -9
  237. package/library/skills/summer-player-data/SKILL.md +12 -12
  238. package/library/skills/summer-store/SKILL.md +6 -6
  239. package/library/skills/summer-world-chat/SKILL.md +9 -9
  240. package/library/skills/summer-world-saves/SKILL.md +7 -7
  241. package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
  242. package/library/skills/tileable-texture/SKILL.md +1 -1
  243. package/library/skills/trailer-shot/SKILL.md +36 -36
  244. package/library/skills/tune-performance/SKILL.md +13 -13
  245. package/library/skills/tune-performance/resource.yaml +1 -1
  246. package/library/skills/ui-graphics/SKILL.md +7 -7
  247. package/library/skills/use-widget-asset/SKILL.md +7 -7
  248. package/library/skills/using-summer/SKILL.md +5 -7
  249. package/library/skills/vehicle-model/SKILL.md +6 -7
  250. package/library/skills/vehicle-model/resource.yaml +2 -2
  251. package/library/skills/verification-before-completion/SKILL.md +5 -6
  252. package/library/skills/vfx-dissolve/SKILL.md +4 -4
  253. package/library/skills/vfx-fire/SKILL.md +6 -6
  254. package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
  255. package/library/skills/vfx-hit-spark/SKILL.md +4 -4
  256. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
  257. package/library/skills/vfx-lightning/SKILL.md +5 -5
  258. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
  259. package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
  260. package/library/skills/vfx-magic-glow/SKILL.md +4 -4
  261. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
  262. package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
  263. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
  264. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
  265. package/library/skills/vfx-smoke/SKILL.md +5 -5
  266. package/library/skills/vfx-water-ripple/SKILL.md +2 -2
  267. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
  268. package/library/skills/voice-line/SKILL.md +9 -9
  269. package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
  270. package/library/skills/writing-plans/SKILL.md +4 -4
  271. package/library/skills/writing-skills/SKILL.md +8 -8
  272. package/library/tools/capture-gameplay/resource.yaml +66 -1
  273. package/library/tools/creator-publish/resource.yaml +4 -4
  274. package/library/tools/creator-releases/resource.yaml +5 -5
  275. package/library/tools/export-game/resource.yaml +3 -0
  276. package/library/tools/generate-image/resource.yaml +4 -2
  277. package/library/tools/publish-build/resource.yaml +5 -1
  278. package/package.json +1 -1
  279. package/registry/generated/counts.json +2 -2
  280. package/registry/generated/gemini-extension.json +5 -1
  281. package/registry/generated/index.json +280 -137
  282. package/registry/generated/marketplace.claude.json +1 -1
  283. package/registry/generated/plugin.claude.json +5 -1
  284. package/registry/generated/plugin.codex.json +5 -1
  285. package/registry/generated/plugin.cursor.json +5 -1
  286. package/registry/generated/plugin.factory.json +5 -1
  287. package/registry/generated/skills-index.md +16 -6
  288. package/registry/generated/skills-registry.json +57 -5
  289. package/registry/schemas/domains.json +1 -1
  290. package/registry/schemas/skill.schema.json +5 -0
@@ -6,8 +6,7 @@
6
6
  * both faces validate the same inputs, send the same op and wait the same
7
7
  * budget.
8
8
  *
9
- * Engine contract (frozen): doc/SUMMER/SCENE_SCRIPTING_CONTRACTS.md "Wave I —
10
- * Runtime control & playtest ops" + editor/ops/runtime_ops.h. Every op except
9
+ * Engine contract (frozen): the runtime control and playtest ops. Every op except
11
10
  * ListGameInstances is SINGLE-ONLY and ASYNC (a debugger round-trip needs the
12
11
  * reply channel), requires a RUNNING game, accepts `instance?` (default
13
12
  * "main"), stamps the game frame it describes, rounds floats to 3dp and
@@ -499,9 +498,8 @@ export declare function playRequestsLocalPlay(args: PlayGameArgs): boolean;
499
498
  /**
500
499
  * Quiet is the default whenever an agent drives play — both faces of this tool
501
500
  * (MCP and `summer tool`) ARE agent faces, so the only way to a focus-stealing
502
- * launch is an explicit focus:true. Quiet travels as PlayGame `agent:true`
503
- * (debug_ops.cpp play_game -> GameView::set_agent_quiet_play), which the engine
504
- * has honoured since 0.5.45 (c7c490d84f3, 2026-07-02).
501
+ * launch is an explicit focus:true. Quiet travels as PlayGame `agent:true`,
502
+ * which the engine has honoured since 0.5.45.
505
503
  */
506
504
  export declare function playIsQuiet(args: PlayGameArgs): boolean;
507
505
  /** True when the call needs the PlayGame OP (instance-aware / determinism
@@ -529,8 +527,8 @@ export declare function withLocalPlayEcho(result: unknown, args: PlayGameArgs):
529
527
  export declare const PLAY_QUIET_NOT_SUPPORTED = "This Summer Engine build did not echo `agent_quiet` in its PlayGame result \u2014 it predates quiet play and has most likely switched the editor to the Game tab and taken focus. Update Summer Engine (restart it after updating) for launches that leave the user's screen alone.";
530
528
  /**
531
529
  * Quiet was requested: the engine echoes `agent_quiet` when it understood the
532
- * flag (debug_ops.cpp play_game — in the launch branch AND the already-running
533
- * branch on current engines). No echo at all means an engine that predates
530
+ * flag (in the launch branch AND the already-running branch on current
531
+ * engines). No echo at all means an engine that predates
534
532
  * the flag ignored it — say so instead of letting the model believe the user
535
533
  * was left alone. The field is the contract; the `note` text is never matched.
536
534
  */
@@ -6,8 +6,7 @@
6
6
  * both faces validate the same inputs, send the same op and wait the same
7
7
  * budget.
8
8
  *
9
- * Engine contract (frozen): doc/SUMMER/SCENE_SCRIPTING_CONTRACTS.md "Wave I —
10
- * Runtime control & playtest ops" + editor/ops/runtime_ops.h. Every op except
9
+ * Engine contract (frozen): the runtime control and playtest ops. Every op except
11
10
  * ListGameInstances is SINGLE-ONLY and ASYNC (a debugger round-trip needs the
12
11
  * reply channel), requires a RUNNING game, accepts `instance?` (default
13
12
  * "main"), stamps the game frame it describes, rounds floats to 3dp and
@@ -59,7 +58,7 @@ export const RUNTIME_CONTROL_OP_KINDS = [
59
58
  "ListGameInstances",
60
59
  ];
61
60
  // ---------------------------------------------------------------------------
62
- // Budgets — mirror the engine's watchdogs (runtime_ops.cpp) plus relay headroom.
61
+ // Budgets — mirror the engine's runtime-op watchdogs plus relay headroom.
63
62
  // ---------------------------------------------------------------------------
64
63
  /** Default editor-side watchdog for a runtime op (_RT_DEFAULT_TIMEOUT_SEC). */
65
64
  export const RUNTIME_WATCHDOG_DEFAULT_SEC = 10;
@@ -882,9 +881,8 @@ export function playRequestsLocalPlay(args) {
882
881
  /**
883
882
  * Quiet is the default whenever an agent drives play — both faces of this tool
884
883
  * (MCP and `summer tool`) ARE agent faces, so the only way to a focus-stealing
885
- * launch is an explicit focus:true. Quiet travels as PlayGame `agent:true`
886
- * (debug_ops.cpp play_game -> GameView::set_agent_quiet_play), which the engine
887
- * has honoured since 0.5.45 (c7c490d84f3, 2026-07-02).
884
+ * launch is an explicit focus:true. Quiet travels as PlayGame `agent:true`,
885
+ * which the engine has honoured since 0.5.45.
888
886
  */
889
887
  export function playIsQuiet(args) {
890
888
  return args.focus !== true;
@@ -894,7 +892,7 @@ export function playIsQuiet(args) {
894
892
  export function playNeedsOp(args) {
895
893
  return (
896
894
  // The /api/play rung builds a PlayGame op with ONLY `scene`
897
- // (local_api_server.cpp play branch), so `agent:true` has to ride the op.
895
+ // (the engine's /api/play handler), so `agent:true` has to ride the op.
898
896
  playIsQuiet(args) ||
899
897
  (typeof args.instance === "string" && args.instance.trim().length > 0) ||
900
898
  args.mode !== undefined ||
@@ -1031,8 +1029,8 @@ export function withLocalPlayEcho(result, args) {
1031
1029
  export const PLAY_QUIET_NOT_SUPPORTED = "This Summer Engine build did not echo `agent_quiet` in its PlayGame result — it predates quiet play and has most likely switched the editor to the Game tab and taken focus. Update Summer Engine (restart it after updating) for launches that leave the user's screen alone.";
1032
1030
  /**
1033
1031
  * Quiet was requested: the engine echoes `agent_quiet` when it understood the
1034
- * flag (debug_ops.cpp play_game — in the launch branch AND the already-running
1035
- * branch on current engines). No echo at all means an engine that predates
1032
+ * flag (in the launch branch AND the already-running branch on current
1033
+ * engines). No echo at all means an engine that predates
1036
1034
  * the flag ignored it — say so instead of letting the model believe the user
1037
1035
  * was left alone. The field is the contract; the `note` text is never matched.
1038
1036
  */
@@ -4,7 +4,7 @@
4
4
  * re-owning step every MCP path that sends ReparentNode shares.
5
5
  *
6
6
  * Two engine ops answer ok for changes SaveScene then leaves out of the file
7
- * (engine modules/1summer_engine/editor/ops/scene_ops.cpp, engine 0.6.0):
7
+ * (engine 0.6.0):
8
8
  *
9
9
  * - ReparentNode (SceneOps::reparent_node) re-owns only the node it moves
10
10
  * (`add_do_method(node, "set_owner", root)`). The remove_child before it
@@ -4,7 +4,7 @@
4
4
  * re-owning step every MCP path that sends ReparentNode shares.
5
5
  *
6
6
  * Two engine ops answer ok for changes SaveScene then leaves out of the file
7
- * (engine modules/1summer_engine/editor/ops/scene_ops.cpp, engine 0.6.0):
7
+ * (engine 0.6.0):
8
8
  *
9
9
  * - ReparentNode (SceneOps::reparent_node) re-owns only the node it moves
10
10
  * (`add_do_method(node, "set_owner", root)`). The remove_child before it
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Is a scene 2D or 3D? Decided from a scene-tree read, the way the engine's
3
- * ScenePreview decides it (preview_ops.cpp `_scene_has_3d` / `_scene_has_2d`):
3
+ * ScenePreview decides it:
4
4
  * any Node3D anywhere in the tree makes the scene 3D; otherwise any CanvasItem
5
5
  * makes it 2D; a tree of plain Nodes is neither.
6
6
  *
@@ -4,10 +4,9 @@
4
4
  * trusting the engine receipt (summer_replace_node, summer_batch with
5
5
  * ReparentNode, summer_connect_signal).
6
6
  *
7
- * The engine's `scenePersistence.persisted` only says SaveScene returned OK
8
- * (ops_executor.cpp: scene_persistence["persisted"] =
9
- * explicit_scene_save_succeeded); what the file holds is only known by reading
10
- * it. The client renames that flag to `saved` (engine-receipt.ts
7
+ * The engine's `scenePersistence.persisted` only says SaveScene returned OK;
8
+ * what the file holds is only known by reading it. The client renames that
9
+ * flag to `saved` (engine-receipt.ts
11
10
  * honestSceneReceipt); `verified` is set only by tools that read back here.
12
11
  */
13
12
  import { type JsonRecord } from "../util/json.js";
@@ -4,10 +4,9 @@
4
4
  * trusting the engine receipt (summer_replace_node, summer_batch with
5
5
  * ReparentNode, summer_connect_signal).
6
6
  *
7
- * The engine's `scenePersistence.persisted` only says SaveScene returned OK
8
- * (ops_executor.cpp: scene_persistence["persisted"] =
9
- * explicit_scene_save_succeeded); what the file holds is only known by reading
10
- * it. The client renames that flag to `saved` (engine-receipt.ts
7
+ * The engine's `scenePersistence.persisted` only says SaveScene returned OK;
8
+ * what the file holds is only known by reading it. The client renames that
9
+ * flag to `saved` (engine-receipt.ts
11
10
  * honestSceneReceipt); `verified` is set only by tools that read back here.
12
11
  */
13
12
  import { asRecord } from "../util/json.js";
@@ -5,8 +5,8 @@
5
5
  *
6
6
  * Server-side clamps: RunSceneScript blocks between frames of the LIVE editor,
7
7
  * so its ceiling is deliberately low; RunEditorScript boots a whole headless
8
- * child editor, so its floor covers the boot cost (editor_script_ops.cpp:
9
- * 15..600 default 120).
8
+ * child editor, so its floor covers the boot cost (engine clamp: 15..600,
9
+ * default 120).
10
10
  */
11
11
  export declare const SCENE_SCRIPT_MIN_SECONDS = 5;
12
12
  export declare const SCENE_SCRIPT_MAX_SECONDS = 120;
@@ -5,8 +5,8 @@
5
5
  *
6
6
  * Server-side clamps: RunSceneScript blocks between frames of the LIVE editor,
7
7
  * so its ceiling is deliberately low; RunEditorScript boots a whole headless
8
- * child editor, so its floor covers the boot cost (editor_script_ops.cpp:
9
- * 15..600 default 120).
8
+ * child editor, so its floor covers the boot cost (engine clamp: 15..600,
9
+ * default 120).
10
10
  */
11
11
  export const SCENE_SCRIPT_MIN_SECONDS = 5;
12
12
  export const SCENE_SCRIPT_MAX_SECONDS = 120;
@@ -2,7 +2,7 @@ export declare const SHOTS_DIR: string;
2
2
  export declare const SAVED_SUBDIR = "saved";
3
3
  export declare const SHOT_MAX_EDGE = 1024;
4
4
  export declare const SHOTS_MAX_TOTAL_BYTES: number;
5
- /** Same grammar as camera bookmark names (preview_ops.cpp). */
5
+ /** Same grammar as camera bookmark names. */
6
6
  export declare const SHOT_NAME_PATTERN: RegExp;
7
7
  export declare class ShotStoreError extends Error {
8
8
  readonly reason: "bad_name" | "not_jpeg" | "too_large" | "over_cap" | "unsafe_path" | "no_project";
@@ -22,7 +22,7 @@ export const SHOTS_DIR = join(".summer", "shots");
22
22
  export const SAVED_SUBDIR = "saved";
23
23
  export const SHOT_MAX_EDGE = 1024;
24
24
  export const SHOTS_MAX_TOTAL_BYTES = 20 * 1024 * 1024;
25
- /** Same grammar as camera bookmark names (preview_ops.cpp). */
25
+ /** Same grammar as camera bookmark names. */
26
26
  export const SHOT_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
27
27
  export class ShotStoreError extends Error {
28
28
  reason;
@@ -1,12 +1,20 @@
1
1
  /**
2
- * The summer.games export (summer-platform ADR 0033): one .zip with
2
+ * The summer.games export: one .zip with
3
3
  * summer-bundle.json, client.pck, and for a game with a host server.pck plus
4
4
  * config/. This reads what the build upload declares; the Platform verifies
5
- * the uploaded bytes again. Same rules as Studio's browser check
6
- * (publicsummerengine src/lib/creator-store/pck-check.ts, checkBundle).
5
+ * the uploaded bytes again. Same rules as Studio's browser check.
7
6
  */
8
7
  export declare const BUNDLE_SCHEMA = "summer.bundle.v1";
9
8
  export declare const BUNDLE_MANIFEST = "summer-bundle.json";
9
+ /** The same platforms, in any order. */
10
+ export declare function samePlatforms(a: readonly string[], b: readonly string[]): boolean;
11
+ /**
12
+ * Why the store will refuse this hosted bundle's Build declaration, or null.
13
+ * The store requires summer.build.json's targetPlatforms to equal the
14
+ * platforms the client pack was exported for (declaration_mismatch), and the
15
+ * refusal spends the clientVersion, so this is checked before any upload.
16
+ */
17
+ export declare function declarationMismatch(bundle: Pick<SummerBundle, "hostedBuild" | "targetPlatforms">): string | null;
10
18
  /** A failure with a stable code, a plain message and the next step. */
11
19
  export declare class BuildToolError extends Error {
12
20
  readonly code: string;
@@ -2,17 +2,35 @@ import { createHash } from "node:crypto";
2
2
  import { createReadStream } from "node:fs";
3
3
  import { readZipEntries, readZipEntry, ZipReadError } from "../util/zip.js";
4
4
  /**
5
- * The summer.games export (summer-platform ADR 0033): one .zip with
5
+ * The summer.games export: one .zip with
6
6
  * summer-bundle.json, client.pck, and for a game with a host server.pck plus
7
7
  * config/. This reads what the build upload declares; the Platform verifies
8
- * the uploaded bytes again. Same rules as Studio's browser check
9
- * (publicsummerengine src/lib/creator-store/pck-check.ts, checkBundle).
8
+ * the uploaded bytes again. Same rules as Studio's browser check.
10
9
  */
11
10
  export const BUNDLE_SCHEMA = "summer.bundle.v1";
12
11
  export const BUNDLE_MANIFEST = "summer-bundle.json";
13
12
  const BUNDLE_CLIENT = "client.pck";
14
13
  const BUNDLE_SERVER = "server.pck";
15
14
  const BUNDLE_BUILD = "config/summer.build.json";
15
+ /** The same platforms, in any order. */
16
+ export function samePlatforms(a, b) {
17
+ return a.length === b.length && [...a].sort().join(",") === [...b].sort().join(",");
18
+ }
19
+ /**
20
+ * Why the store will refuse this hosted bundle's Build declaration, or null.
21
+ * The store requires summer.build.json's targetPlatforms to equal the
22
+ * platforms the client pack was exported for (declaration_mismatch), and the
23
+ * refusal spends the clientVersion, so this is checked before any upload.
24
+ */
25
+ export function declarationMismatch(bundle) {
26
+ const declared = bundle.hostedBuild?.targetPlatforms;
27
+ if (!Array.isArray(declared))
28
+ return null;
29
+ const platforms = declared.map(String);
30
+ return samePlatforms(platforms, bundle.targetPlatforms)
31
+ ? null
32
+ : `the bundle targets ${[...bundle.targetPlatforms].sort().join(", ")} but its summer.build.json declares ${[...platforms].sort().join(", ")}`;
33
+ }
16
34
  const SHA256 = /^sha256:[0-9a-f]{64}$/;
17
35
  const AS_EXPORTED = "Recovery: export the game again with the summer.games preset and use the .zip exactly as Summer Engine wrote it.";
18
36
  /** A failure with a stable code, a plain message and the next step. */
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * surface-snap — ONE implementation of `summer_snap_to_surface` for both faces
3
3
  * (src/mcp/tools/spatial-tools.ts and tool-dispatch.ts), around the engine's
4
- * SnapToSurface op (modules/1summer_engine/editor/ops/surface_snap_ops.cpp).
4
+ * SnapToSurface op.
5
5
  *
6
6
  * Two gaps in the engine op, closed here with ops main already ships:
7
7
  *
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * surface-snap — ONE implementation of `summer_snap_to_surface` for both faces
3
3
  * (src/mcp/tools/spatial-tools.ts and tool-dispatch.ts), around the engine's
4
- * SnapToSurface op (modules/1summer_engine/editor/ops/surface_snap_ops.cpp).
4
+ * SnapToSurface op.
5
5
  *
6
6
  * Two gaps in the engine op, closed here with ops main already ships:
7
7
  *
@@ -28,7 +28,7 @@ import { executeSceneMutation, occurrenceCount, readTextPayload, safeProjectPath
28
28
  import { extractOpError, withOldEngineHint } from "./engine-receipt.js";
29
29
  import { lookupApiDocs } from "./api-docs.js";
30
30
  import { BOARD_ENDPOINT, boardArgsSchema, boardQuery } from "./board.js";
31
- import { imageGenerationArgsSchema } from "./image-generation.js";
31
+ import { IMAGE_GENERATION_TIMEOUT_MS, imageGenerationArgsSchema, saveGeneratedImage } from "./image-generation.js";
32
32
  import { buildMotionRequestBody, motionGenerationArgsSchema } from "./motion-generation.js";
33
33
  import { ImportHdriError, importHdriArgsSchema, importPolyHavenHdri } from "./hdri-import.js";
34
34
  import { FABRICATE_FALLBACK, buildFabricateMeshOp, fabricateArgsSchema } from "./fabricate-mesh.js";
@@ -618,6 +618,7 @@ export const TOOL_DISPATCH = [
618
618
  targets: Array.isArray(args.targets) ? args.targets.map(String) : undefined,
619
619
  format: optStr(args, "format"),
620
620
  debug: args.debug === true,
621
+ alignDeclaration: args.alignDeclaration === true,
621
622
  ...(typeof args.timeoutSeconds === "number" ? { timeoutMs: args.timeoutSeconds * 1000 } : {}),
622
623
  })),
623
624
  entry("summer_export_templates", "List or install Summer export templates from the CDN (web, macos, windows)", false, (args) => {
@@ -639,6 +640,8 @@ export const TOOL_DISPATCH = [
639
640
  waitSeconds: optNumberOrUndefined(args, "waitSeconds"),
640
641
  intervalSeconds: optNumberOrUndefined(args, "intervalSeconds"),
641
642
  out: optStr(args, "out"),
643
+ args: args.args,
644
+ steps: args.steps,
642
645
  })),
643
646
  entry("summer_publish_build", "Upload a summer.games export to your store game (confirm-gated)", false, (args) => publishBuild({
644
647
  gameId: optStr(args, "gameId"),
@@ -661,7 +664,7 @@ export const TOOL_DISPATCH = [
661
664
  confirm: args.confirm === true,
662
665
  face: "cli",
663
666
  })),
664
- entry("summer_creator_releases", "List creator-owned releases", false, (args) => listCreatorReleases({
667
+ entry("summer_creator_releases", "Deprecated: list releases on the legacy creator API; use summer_store_releases", false, (args) => listCreatorReleases({
665
668
  projectId: optStr(args, "projectId"),
666
669
  limit: typeof args.limit === "number" ? args.limit : 20,
667
670
  cursor: optStr(args, "cursor"),
@@ -896,7 +899,15 @@ export const TOOL_DISPATCH = [
896
899
  const parsed = parseToolArgs(boardArgsSchema, args, "get-board");
897
900
  return gatewayGet(BOARD_ENDPOINT, boardQuery({ ...parsed, pictures: parsed.pictures ?? false }), 45_000);
898
901
  }),
899
- entry("summer_generate_image", "Generate or edit an image via Summer Studio", false, (args) => gatewayPost("/api/mcp/generate/image", parseToolArgs(imageGenerationArgsSchema, args, "generate-image"))),
902
+ entry("summer_generate_image", "Generate or edit an image via Summer Studio", false, async (args) => {
903
+ const { out, ...body } = parseToolArgs(imageGenerationArgsSchema, args, "generate-image");
904
+ const result = await gatewayPost("/api/mcp/generate/image", body, IMAGE_GENERATION_TIMEOUT_MS);
905
+ if (!out)
906
+ return result;
907
+ const asset = (result.asset ?? {});
908
+ const url = typeof asset.fileUrl === "string" ? asset.fileUrl : typeof asset.thumbnailUrl === "string" ? asset.thumbnailUrl : null;
909
+ return { ...result, localPath: url ? await saveGeneratedImage(url, out) : null };
910
+ }),
900
911
  entry("summer_slice_asset_sheet", "Detect and crop every asset from a generated sheet image", false, (args) => gatewayPost("/api/mcp/generate/slice-asset-sheet", { assetId: str(args, "assetId") }, 300_000)),
901
912
  entry("summer_generate_audio", "Generate speech, sound effects, music, or dialogue", false, (args) => {
902
913
  const body = { capability: str(args, "capability") };
@@ -4,8 +4,7 @@
4
4
  * both faces validate the same arguments, send the same op, and render the
5
5
  * engine's failure taxonomy the same way.
6
6
  *
7
- * Seven engine ops (modules/1summer_engine/editor/ops/ui_ops.cpp, frozen in
8
- * doc/SUMMER/SCENE_SCRIPTING_CONTRACTS.md "Wave L") behind four tools:
7
+ * Seven engine ops (a frozen engine contract) behind four tools:
9
8
  *
10
9
  * summer_ui_actions mode:"list" -> UiListActions (read)
11
10
  * mode:"invoke" -> UiInvoke (mutates)
@@ -4,8 +4,7 @@
4
4
  * both faces validate the same arguments, send the same op, and render the
5
5
  * engine's failure taxonomy the same way.
6
6
  *
7
- * Seven engine ops (modules/1summer_engine/editor/ops/ui_ops.cpp, frozen in
8
- * doc/SUMMER/SCENE_SCRIPTING_CONTRACTS.md "Wave L") behind four tools:
7
+ * Seven engine ops (a frozen engine contract) behind four tools:
9
8
  *
10
9
  * summer_ui_actions mode:"list" -> UiListActions (read)
11
10
  * mode:"invoke" -> UiInvoke (mutates)
@@ -3,7 +3,7 @@
3
3
  * `summer_world_snapshot` (src/mcp/tools/perception-tools.ts and
4
4
  * tool-dispatch.ts).
5
5
  *
6
- * The engine's GetWorldSnapshot (world_snapshot_ops.cpp) takes only
6
+ * The engine's GetWorldSnapshot op takes only
7
7
  * scene_path / max_nodes / max_lights / include_2d and returns every node it
8
8
  * walked, about 250 bytes each: a scene of a few thousand nodes is far too
9
9
  * big to read.
@@ -3,7 +3,7 @@
3
3
  * `summer_world_snapshot` (src/mcp/tools/perception-tools.ts and
4
4
  * tool-dispatch.ts).
5
5
  *
6
- * The engine's GetWorldSnapshot (world_snapshot_ops.cpp) takes only
6
+ * The engine's GetWorldSnapshot op takes only
7
7
  * scene_path / max_nodes / max_lights / include_2d and returns every node it
8
8
  * walked, about 250 bytes each: a scene of a few thousand nodes is far too
9
9
  * big to read.
@@ -77,7 +77,7 @@ export interface EngineCapabilities {
77
77
  * `summer` capture ships, and the offscreen instance cap. Absent = engine
78
78
  * predates runtime control (or advertises the kinds only in opKinds). */
79
79
  runtimeControl?: EngineRuntimeControlCapabilities;
80
- /** Editor navigation advert (engine `Navigate` op, navigate_ops.cpp): the
80
+ /** Editor navigation advert (engine `Navigate` op): the
81
81
  * destination ids this build can open. Absent = engine predates the op;
82
82
  * summer_open then falls back to the legacy per-surface ops it can map. */
83
83
  navigation?: EngineNavigationCapabilities;
@@ -174,8 +174,7 @@ export declare function missingEngineEventsResult(client: CapabilityAdvertisingC
174
174
  export declare function buildCapabilitySkewWarning(health: unknown): string | null;
175
175
  /**
176
176
  * Engine ops that MUST be dispatched as their own single-op request. Mirrors
177
- * _summer_requires_single_async_dispatch (local_api_server.cpp, engine
178
- * 0.5.60+): the engine rejects any multi-op batch containing one of these
177
+ * the engine's single-async-op list (engine 0.5.60+): the engine rejects any multi-op batch containing one of these
179
178
  * WHOLESALE — nothing in the batch executes, and the batch fails with per-op
180
179
  * failure_reason "unsupported_transport"/"skipped". Git ops are covered by a
181
180
  * prefix check in the dispatchers.
@@ -46,7 +46,7 @@ export const CLI_KNOWN_OP_NEEDS = [
46
46
  // summer_grep (core/capabilities/grep.ts)
47
47
  "Grep",
48
48
  // Navigation (summer_open: core/capabilities/navigation/) — Navigate is the
49
- // one-table op (engine navigate_ops.cpp); the other three are the legacy
49
+ // engine's one-table op; the other three are the legacy
50
50
  // fallbacks on engines that predate it.
51
51
  "Navigate", "OpenResource", "FocusDock", "RevealInFileSystem",
52
52
  // Project + input
@@ -334,8 +334,7 @@ export function buildCapabilitySkewWarning(health) {
334
334
  // ---------------------------------------------------------------------------
335
335
  /**
336
336
  * Engine ops that MUST be dispatched as their own single-op request. Mirrors
337
- * _summer_requires_single_async_dispatch (local_api_server.cpp, engine
338
- * 0.5.60+): the engine rejects any multi-op batch containing one of these
337
+ * the engine's single-async-op list (engine 0.5.60+): the engine rejects any multi-op batch containing one of these
339
338
  * WHOLESALE — nothing in the batch executes, and the batch fails with per-op
340
339
  * failure_reason "unsupported_transport"/"skipped". Git ops are covered by a
341
340
  * prefix check in the dispatchers.
@@ -353,12 +352,12 @@ export const FALLBACK_SINGLE_ONLY_OPS = new Set([
353
352
  "RunCommand", "RunVerification", "RunEditorScript", "RunSceneScript",
354
353
  "ImportFromUrl", "ImportFromUrlBatch", "ExtractZipFromUrl",
355
354
  // Mesh fabrication: a headless Blender child on the same async single-op lane as
356
- // RunEditorScript (local_api_server.cpp SUMMER_SINGLE_ASYNC_OPS).
355
+ // RunEditorScript.
357
356
  "FabricateMesh",
358
357
  // runtime control (RuntimeOps::async_op_kinds): every op below rides
359
358
  // the `summer` debugger capture, so like GameSnapshot each needs the async
360
359
  // single-op reply channel. ListGameInstances is deliberately NOT here — it
361
- // is a cheap synchronous editor read that batches fine (runtime_ops.h).
360
+ // is a cheap synchronous editor read that batches fine.
362
361
  "SetRuntimeProp", "CallRuntimeMethod", "SpawnRuntimeScene", "FreeRuntimeNode",
363
362
  "RuntimeAnimation", "RuntimeAnimationTree", "GetRuntimeBones",
364
363
  "GamePause", "GameSpeed", "GameStep",
@@ -7,7 +7,7 @@
7
7
  * silent failure, never throws, never retries, never blocks the agent
8
8
  * for more than the timeout.
9
9
  *
10
- * Consent (SELF_IMPROVING_LIBRARY.md §3.4):
10
+ * Consent:
11
11
  * - SUMMER_NO_TELEMETRY=1 or DO_NOT_TRACK=1 → nothing is ever sent.
12
12
  * - First-run notice BEFORE the first event (CONTRACT §10): the first call
13
13
  * ever made on a machine sends NOTHING and returns a one-paragraph notice
@@ -11,8 +11,8 @@
11
11
  * or takes focus until the user clicks it.
12
12
  * offscreen `--summer-offscreen` (also `--summer-verify`) — never
13
13
  * activates, never frontmost; on shipped engines an unfocusable
14
- * window pushed off-screen where a sliver may stay visible
15
- * (main.cpp says so), on the background-posture engine a
14
+ * window pushed off-screen where a sliver may stay visible;
15
+ * on the background-posture engine a
16
16
  * no-Dock-icon accessory process. Used by RunVerification /
17
17
  * offscreen play instances, never by `summer run`.
18
18
  *
@@ -139,7 +139,7 @@ export interface DetectBackgroundSupportOptions {
139
139
  export declare function detectBackgroundLaunchSupport(binary: string, options?: DetectBackgroundSupportOptions): Promise<BackgroundLaunchSupport>;
140
140
  /**
141
141
  * The running engine's own word, once it is up: /api/health
142
- * `capabilities.launchPostures` (engine tool_net_thread.cpp, newer builds;
142
+ * `capabilities.launchPostures` (newer engine builds;
143
143
  * "focus" always, "background" / "offscreen" only where enforced). true /
144
144
  * false when advertised, null when the engine predates the advert.
145
145
  */
@@ -11,8 +11,8 @@
11
11
  * or takes focus until the user clicks it.
12
12
  * offscreen `--summer-offscreen` (also `--summer-verify`) — never
13
13
  * activates, never frontmost; on shipped engines an unfocusable
14
- * window pushed off-screen where a sliver may stay visible
15
- * (main.cpp says so), on the background-posture engine a
14
+ * window pushed off-screen where a sliver may stay visible;
15
+ * on the background-posture engine a
16
16
  * no-Dock-icon accessory process. Used by RunVerification /
17
17
  * offscreen play instances, never by `summer run`.
18
18
  *
@@ -241,7 +241,7 @@ export async function detectBackgroundLaunchSupport(binary, options = {}) {
241
241
  }
242
242
  /**
243
243
  * The running engine's own word, once it is up: /api/health
244
- * `capabilities.launchPostures` (engine tool_net_thread.cpp, newer builds;
244
+ * `capabilities.launchPostures` (newer engine builds;
245
245
  * "focus" always, "background" / "offscreen" only where enforced). true /
246
246
  * false when advertised, null when the engine predates the advert.
247
247
  */
@@ -10,6 +10,8 @@ export declare const FOOTER_SUFFIX = "If this entry is wrong, stale, or you devi
10
10
  export declare const LINKED_FILE_EXTENSIONS: ReadonlySet<string>;
11
11
  /** A linked file larger than this is refused rather than dumped. */
12
12
  export declare const LINKED_FILE_MAX_BYTES: number;
13
+ /** How long a hosted skill read waits for the hosted Summer Engine MCP. */
14
+ export declare const HOSTED_READ_TIMEOUT_MS = 8000;
13
15
  export declare const readLibraryInputShape: {
14
16
  id: z.ZodString;
15
17
  part: z.ZodOptional<z.ZodEnum<["skill", "resource", "all"]>>;
@@ -29,6 +31,8 @@ export interface LibraryReadDeps extends LibrarySearchDeps {
29
31
  /** Root holding library/ (default: the installed package). */
30
32
  packageRoot?: string;
31
33
  templates?: readonly TemplateEntry[];
34
+ /** Reads a hosted skill's text by resource URI; throws when it cannot. */
35
+ readHostedResource?: (uri: string) => Promise<string>;
32
36
  }
33
37
  export interface LibraryReadOk {
34
38
  ok: true;
@@ -57,6 +61,9 @@ export interface LibraryReadOk {
57
61
  target: string;
58
62
  id: string | null;
59
63
  }>;
64
+ /** Hosted skills: the resource the body comes from, and why it did not load. */
65
+ hosted_resource?: string;
66
+ hosted_error?: string;
60
67
  /** Tool records: how to reach it. */
61
68
  mcp_tool_name?: string;
62
69
  cli_command?: string;