summer-engine 3.8.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (485) hide show
  1. package/.claude-plugin/marketplace.json +2 -13
  2. package/.claude-plugin/plugin.json +23 -22
  3. package/.codex-plugin/plugin.json +4 -12
  4. package/.cursor-plugin/plugin.json +4 -12
  5. package/.factory-plugin/plugin.json +4 -12
  6. package/AGENTS.md +19 -12
  7. package/CHANGELOG.md +96 -0
  8. package/GEMINI.md +3 -3
  9. package/README.md +103 -33
  10. package/assets/icon.png +0 -0
  11. package/commands/start.md +71 -0
  12. package/commands/summer.md +3 -2
  13. package/dist/cli/banner.js +3 -0
  14. package/dist/cli/commands/login.d.ts +27 -0
  15. package/dist/cli/commands/login.js +58 -12
  16. package/dist/cli/commands/ops.d.ts +47 -0
  17. package/dist/cli/commands/ops.js +301 -0
  18. package/dist/cli/commands/setup.d.ts +2 -0
  19. package/dist/cli/commands/setup.js +37 -12
  20. package/dist/cli/commands/skills.js +11 -7
  21. package/dist/cli/index.js +7 -0
  22. package/dist/core/agent-host.d.ts +65 -0
  23. package/dist/core/agent-host.js +193 -0
  24. package/dist/core/capabilities/agent-playbook.d.ts +3 -0
  25. package/dist/core/capabilities/agent-playbook.js +54 -2
  26. package/dist/core/capabilities/apps.d.ts +25 -2
  27. package/dist/core/capabilities/apps.js +25 -12
  28. package/dist/core/capabilities/doctor.d.ts +3 -0
  29. package/dist/core/capabilities/doctor.js +20 -15
  30. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -2
  31. package/dist/core/capabilities/game-task-plan.d.ts +12 -6
  32. package/dist/core/capabilities/game-task-plan.js +80 -5
  33. package/dist/core/capabilities/motion-generation.js +2 -2
  34. package/dist/core/capabilities/navigation/open.d.ts +6 -2
  35. package/dist/core/capabilities/navigation/open.js +3 -0
  36. package/dist/core/capabilities/publish-build.js +2 -0
  37. package/dist/core/capabilities/runtime-control.d.ts +4 -4
  38. package/dist/core/capabilities/scene-script-target.d.ts +17 -0
  39. package/dist/core/capabilities/scene-script-target.js +70 -0
  40. package/dist/core/capabilities/sfx-choices.d.ts +4 -0
  41. package/dist/core/capabilities/sfx-choices.js +13 -6
  42. package/dist/core/capabilities/tool-dispatch.d.ts +12 -3
  43. package/dist/core/capabilities/tool-dispatch.js +81 -46
  44. package/dist/core/embeddings.d.ts +2 -0
  45. package/dist/core/embeddings.js +1 -1
  46. package/dist/core/error-codes.d.ts +62 -0
  47. package/dist/core/error-codes.js +97 -0
  48. package/dist/core/format.d.ts +2 -0
  49. package/dist/core/format.js +2 -1
  50. package/dist/core/hosted-mcp.d.ts +22 -0
  51. package/dist/core/hosted-mcp.js +56 -1
  52. package/dist/core/library-read.js +5 -0
  53. package/dist/core/library-search.js +2 -1
  54. package/dist/core/oauth.js +4 -0
  55. package/dist/core/ops/catalog.d.ts +41 -0
  56. package/dist/core/ops/catalog.js +145 -0
  57. package/dist/core/ops/cloud.d.ts +56 -0
  58. package/dist/core/ops/cloud.js +175 -0
  59. package/dist/core/ops/contract.d.ts +119 -0
  60. package/dist/core/ops/contract.js +142 -0
  61. package/dist/core/ops/engine-answer.d.ts +25 -0
  62. package/dist/core/ops/engine-answer.js +117 -0
  63. package/dist/core/ops/engine.d.ts +55 -0
  64. package/dist/core/ops/engine.js +649 -0
  65. package/dist/core/ops/save-files.d.ts +78 -0
  66. package/dist/core/ops/save-files.js +419 -0
  67. package/dist/core/ops/search.d.ts +9 -0
  68. package/dist/core/ops/search.js +55 -0
  69. package/dist/core/skills-registry.d.ts +16 -1
  70. package/dist/core/skills-registry.js +35 -2
  71. package/dist/core/telemetry.d.ts +32 -0
  72. package/dist/core/telemetry.js +38 -10
  73. package/dist/core/tool-profiles.d.ts +25 -0
  74. package/dist/core/tool-profiles.js +41 -0
  75. package/dist/installer/agent-config.d.ts +17 -4
  76. package/dist/installer/agent-config.js +22 -6
  77. package/dist/installer/agent-table.d.ts +3 -0
  78. package/dist/installer/agent-table.js +10 -7
  79. package/dist/installer/setup.d.ts +2 -0
  80. package/dist/installer/setup.js +9 -4
  81. package/dist/installer/version-check.d.ts +29 -9
  82. package/dist/installer/version-check.js +81 -28
  83. package/dist/mcp/command.js +7 -0
  84. package/dist/mcp/hosted-mount.d.ts +27 -2
  85. package/dist/mcp/hosted-mount.js +53 -23
  86. package/dist/mcp/legacy-toolset.d.ts +27 -0
  87. package/dist/mcp/legacy-toolset.js +43 -0
  88. package/dist/mcp/ops-surface.d.ts +59 -0
  89. package/dist/mcp/ops-surface.js +443 -0
  90. package/dist/mcp/server.d.ts +35 -11
  91. package/dist/mcp/server.js +234 -89
  92. package/dist/mcp/tool-results.d.ts +26 -0
  93. package/dist/mcp/tool-results.js +81 -0
  94. package/dist/mcp/tool-surface.d.ts +65 -0
  95. package/dist/mcp/tool-surface.js +317 -0
  96. package/dist/mcp/tools/app-tools.js +9 -2
  97. package/dist/mcp/tools/asset-tools.js +55 -53
  98. package/dist/mcp/tools/audit-tools.js +21 -21
  99. package/dist/mcp/tools/debug-tools.js +6 -6
  100. package/dist/mcp/tools/fabricate-tools.js +6 -6
  101. package/dist/mcp/tools/generate-tools.js +76 -70
  102. package/dist/mcp/tools/project-tools.d.ts +9 -4
  103. package/dist/mcp/tools/project-tools.js +16 -10
  104. package/dist/mcp/tools/scene-tools.js +12 -23
  105. package/dist/mcp/tools/script-tools.js +9 -5
  106. package/dist/mcp/tools/with-engine.d.ts +6 -0
  107. package/dist/mcp/tools/with-engine.js +19 -0
  108. package/gemini-extension.json +4 -12
  109. package/hooks/pre-commit-doctor.sh +5 -4
  110. package/hooks/session-start.sh +24 -28
  111. package/integrations/claude-desktop/README.md +1 -1
  112. package/integrations/copilot-jetbrains/README.md +1 -1
  113. package/integrations/junie/README.md +1 -1
  114. package/integrations/lm-studio/README.md +1 -1
  115. package/integrations/trae/README.md +1 -1
  116. package/integrations/visual-studio/README.md +1 -1
  117. package/library/references/mcp-tools-reference/mcp-tools-reference.md +79 -51
  118. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  119. package/library/references/product-map/resource.yaml +2 -2
  120. package/library/skills/3d-lighting/SKILL.md +53 -28
  121. package/library/skills/3d-lighting/resource.yaml +1 -1
  122. package/library/skills/README.md +119 -117
  123. package/library/skills/adaptive-music/SKILL.md +19 -23
  124. package/library/skills/adaptive-music/resource.yaml +1 -1
  125. package/library/skills/agent-playtesting/SKILL.md +1 -1
  126. package/library/skills/agent-playtesting/resource.yaml +1 -1
  127. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  128. package/library/skills/ai-characters-in-games/resource.yaml +1 -1
  129. package/library/skills/ambient-bed/SKILL.md +22 -13
  130. package/library/skills/ambient-bed/resource.yaml +1 -1
  131. package/library/skills/animated-loop/SKILL.md +41 -32
  132. package/library/skills/animated-loop/resource.yaml +1 -1
  133. package/library/skills/animation-tree/SKILL.md +1 -1
  134. package/library/skills/animation-tree/resource.yaml +1 -1
  135. package/library/skills/art-direction/SKILL.md +3 -3
  136. package/library/skills/art-direction/resource.yaml +1 -1
  137. package/library/skills/asset-strategy/SKILL.md +21 -4
  138. package/library/skills/asset-strategy/resource.yaml +2 -1
  139. package/library/skills/audio-direction/SKILL.md +10 -10
  140. package/library/skills/audio-direction/resource.yaml +1 -1
  141. package/library/skills/auto-fire-targeting/SKILL.md +1 -1
  142. package/library/skills/auto-fire-targeting/resource.yaml +1 -1
  143. package/library/skills/bounded-engine-runs/SKILL.md +1 -1
  144. package/library/skills/bounded-engine-runs/resource.yaml +1 -1
  145. package/library/skills/brainstorm-game/SKILL.md +1 -1
  146. package/library/skills/brainstorm-game/resource.yaml +1 -1
  147. package/library/skills/brainstorming/SKILL.md +1 -1
  148. package/library/skills/brainstorming/resource.yaml +1 -1
  149. package/library/skills/browse-templates/SKILL.md +1 -1
  150. package/library/skills/browse-templates/resource.yaml +1 -1
  151. package/library/skills/camera-rigs/SKILL.md +2 -2
  152. package/library/skills/camera-rigs/resource.yaml +1 -1
  153. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -0
  154. package/library/skills/character-animation-wiring/SKILL.md +4 -4
  155. package/library/skills/character-animation-wiring/resource.yaml +1 -1
  156. package/library/skills/character-model/SKILL.md +55 -47
  157. package/library/skills/character-model/resource.yaml +1 -1
  158. package/library/skills/character-movement/SKILL.md +3 -3
  159. package/library/skills/character-movement/resource.yaml +1 -1
  160. package/library/skills/character-portrait/SKILL.md +24 -19
  161. package/library/skills/character-portrait/resource.yaml +1 -1
  162. package/library/skills/cinematic-cutscene/SKILL.md +58 -46
  163. package/library/skills/cinematic-cutscene/resource.yaml +1 -1
  164. package/library/skills/combat-basics/SKILL.md +1 -1
  165. package/library/skills/combat-basics/resource.yaml +1 -1
  166. package/library/skills/compatibility-renderer-traps/SKILL.md +1 -1
  167. package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
  168. package/library/skills/concept-art/SKILL.md +16 -12
  169. package/library/skills/concept-art/resource.yaml +1 -1
  170. package/library/skills/concept-to-level/SKILL.md +239 -0
  171. package/library/skills/concept-to-level/references/technical-rules.md +150 -0
  172. package/library/skills/concept-to-level/resource.yaml +44 -0
  173. package/library/skills/create-asset-sheet/SKILL.md +19 -13
  174. package/library/skills/create-asset-sheet/resource.yaml +1 -1
  175. package/library/skills/debug/SKILL.md +2 -2
  176. package/library/skills/debug/resource.yaml +1 -1
  177. package/library/skills/debugging-game-feel/SKILL.md +1 -1
  178. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  179. package/library/skills/design-level/SKILL.md +23 -35
  180. package/library/skills/design-level/resource.yaml +1 -1
  181. package/library/skills/design-mechanic/SKILL.md +1 -1
  182. package/library/skills/design-mechanic/resource.yaml +1 -1
  183. package/library/skills/design-npc/SKILL.md +22 -24
  184. package/library/skills/design-npc/resource.yaml +1 -1
  185. package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
  186. package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
  187. package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
  188. package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
  189. package/library/skills/environment-kit/SKILL.md +20 -16
  190. package/library/skills/environment-kit/resource.yaml +1 -1
  191. package/library/skills/export-and-ship/SKILL.md +6 -6
  192. package/library/skills/export-and-ship/resource.yaml +1 -1
  193. package/library/skills/fabricating-assets/SKILL.md +7 -7
  194. package/library/skills/fabricating-assets/resource.yaml +3 -3
  195. package/library/skills/facial-and-lipsync/SKILL.md +14 -15
  196. package/library/skills/facial-and-lipsync/resource.yaml +1 -1
  197. package/library/skills/fps-controller/SKILL.md +33 -41
  198. package/library/skills/fps-controller/resource.yaml +1 -1
  199. package/library/skills/game-feel/SKILL.md +8 -8
  200. package/library/skills/game-feel/resource.yaml +1 -1
  201. package/library/skills/gameskill/SKILL.md +4 -4
  202. package/library/skills/gameskill/resource.yaml +1 -1
  203. package/library/skills/gdscript-patterns/SKILL.md +1 -1
  204. package/library/skills/gdscript-patterns/resource.yaml +1 -1
  205. package/library/skills/generate-motion/SKILL.md +30 -21
  206. package/library/skills/generate-motion/resource.yaml +1 -1
  207. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
  208. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
  209. package/library/skills/grow-analytics/SKILL.md +3 -3
  210. package/library/skills/grow-analytics/resource.yaml +1 -1
  211. package/library/skills/headless-scripting/SKILL.md +1 -1
  212. package/library/skills/headless-scripting/resource.yaml +1 -1
  213. package/library/skills/in-game-purchases/SKILL.md +1 -1
  214. package/library/skills/in-game-purchases/resource.yaml +1 -1
  215. package/library/skills/instantiate-asset-pack/SKILL.md +2 -2
  216. package/library/skills/instantiate-asset-pack/resource.yaml +1 -1
  217. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +1 -0
  218. package/library/skills/make-game/SKILL.md +4 -4
  219. package/library/skills/make-game/references/2d-platformer.md +1 -1
  220. package/library/skills/make-game/references/3d-fps.md +1 -1
  221. package/library/skills/make-game/references/3d-horror.md +1 -1
  222. package/library/skills/make-game/references/3d-third-person.md +2 -2
  223. package/library/skills/make-game/resource.yaml +1 -1
  224. package/library/skills/multiplayer/SKILL.md +1 -1
  225. package/library/skills/multiplayer/resource.yaml +1 -1
  226. package/library/skills/multiplayer-movement/SKILL.md +1 -1
  227. package/library/skills/multiplayer-movement/resource.yaml +1 -1
  228. package/library/skills/multiplayer-project/SKILL.md +1 -1
  229. package/library/skills/multiplayer-project/resource.yaml +1 -1
  230. package/library/skills/multiplayer-publish/SKILL.md +8 -7
  231. package/library/skills/multiplayer-publish/resource.yaml +3 -3
  232. package/library/skills/multiplayer-state/SKILL.md +1 -1
  233. package/library/skills/multiplayer-state/resource.yaml +1 -1
  234. package/library/skills/multiplayer-testing/SKILL.md +1 -1
  235. package/library/skills/multiplayer-testing/resource.yaml +1 -1
  236. package/library/skills/music-track/SKILL.md +22 -13
  237. package/library/skills/music-track/resource.yaml +1 -1
  238. package/library/skills/navigate-summer/SKILL.md +11 -9
  239. package/library/skills/navigate-summer/resource.yaml +1 -1
  240. package/library/skills/new-project/SKILL.md +1 -1
  241. package/library/skills/new-project/resource.yaml +1 -1
  242. package/library/skills/organic-model/SKILL.md +24 -18
  243. package/library/skills/organic-model/resource.yaml +1 -1
  244. package/library/skills/pixel-art/SKILL.md +27 -23
  245. package/library/skills/pixel-art/resource.yaml +1 -1
  246. package/library/skills/play/SKILL.md +1 -1
  247. package/library/skills/play/resource.yaml +1 -1
  248. package/library/skills/playtesting-a-feature/SKILL.md +1 -1
  249. package/library/skills/playtesting-a-feature/resource.yaml +1 -1
  250. package/library/skills/procedural-animation/SKILL.md +20 -16
  251. package/library/skills/procedural-animation/resource.yaml +1 -1
  252. package/library/skills/prop-model/SKILL.md +25 -19
  253. package/library/skills/prop-model/resource.yaml +1 -1
  254. package/library/skills/psx-retro-rendering/resource.yaml +1 -0
  255. package/library/skills/publish-your-game/SKILL.md +16 -6
  256. package/library/skills/publish-your-game/resource.yaml +3 -3
  257. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -0
  258. package/library/skills/release-readiness/SKILL.md +1 -1
  259. package/library/skills/release-readiness/resource.yaml +1 -1
  260. package/library/skills/remote-deploy/SKILL.md +1 -1
  261. package/library/skills/remote-deploy/resource.yaml +1 -1
  262. package/library/skills/retarget/SKILL.md +23 -20
  263. package/library/skills/retarget/resource.yaml +1 -1
  264. package/library/skills/running-in-the-cloud/SKILL.md +1 -1
  265. package/library/skills/running-in-the-cloud/resource.yaml +1 -1
  266. package/library/skills/save-load/SKILL.md +1 -1
  267. package/library/skills/save-load/resource.yaml +1 -1
  268. package/library/skills/scene-composition/SKILL.md +1 -1
  269. package/library/skills/scene-composition/resource.yaml +1 -1
  270. package/library/skills/scene-hierarchy-design/SKILL.md +2 -2
  271. package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
  272. package/library/skills/scene-scripting/SKILL.md +66 -636
  273. package/library/skills/scene-scripting/references/ctx-api.md +184 -0
  274. package/library/skills/scene-scripting/references/recipes-2d-ui.md +193 -0
  275. package/library/skills/scene-scripting/references/recipes-3d.md +280 -0
  276. package/library/skills/scene-scripting/resource.yaml +4 -4
  277. package/library/skills/scene-to-level/SKILL.md +2 -2
  278. package/library/skills/scene-to-level/resource.yaml +1 -1
  279. package/library/skills/skill-create/resource.yaml +1 -0
  280. package/library/skills/skill-improve/resource.yaml +1 -0
  281. package/library/skills/skill-test/SKILL.md +2 -2
  282. package/library/skills/skill-test/resource.yaml +1 -0
  283. package/library/skills/skintokens-auto-rigging/resource.yaml +1 -0
  284. package/library/skills/skybox-panorama/SKILL.md +27 -21
  285. package/library/skills/skybox-panorama/resource.yaml +1 -1
  286. package/library/skills/sound-effect/SKILL.md +29 -20
  287. package/library/skills/sound-effect/resource.yaml +1 -1
  288. package/library/skills/spatial-placement/SKILL.md +14 -9
  289. package/library/skills/spatial-placement/resource.yaml +1 -1
  290. package/library/skills/sprite-sheet/SKILL.md +32 -27
  291. package/library/skills/sprite-sheet/resource.yaml +1 -1
  292. package/library/skills/store-art/SKILL.md +3 -3
  293. package/library/skills/store-art/resource.yaml +2 -2
  294. package/library/skills/store-listing/SKILL.md +3 -3
  295. package/library/skills/store-listing/resource.yaml +2 -2
  296. package/library/skills/summer-analytics/SKILL.md +7 -5
  297. package/library/skills/summer-analytics/resource.yaml +2 -2
  298. package/library/skills/summer-apps/SKILL.md +48 -32
  299. package/library/skills/summer-apps/manifest.md +1 -1
  300. package/library/skills/summer-apps/minimal-app.md +7 -7
  301. package/library/skills/summer-apps/resource.yaml +1 -1
  302. package/library/skills/summer-apps/sdk-reference.md +5 -5
  303. package/library/skills/summer-apps-design/SKILL.md +1 -1
  304. package/library/skills/summer-apps-design/resource.yaml +1 -1
  305. package/library/skills/summer-assets/SKILL.md +56 -0
  306. package/library/skills/summer-assets/resource.yaml +34 -0
  307. package/library/skills/summer-store/SKILL.md +1 -1
  308. package/library/skills/text-to-motion/SKILL.md +30 -23
  309. package/library/skills/text-to-motion/prompts-and-controls.md +5 -5
  310. package/library/skills/text-to-motion/resource.yaml +1 -1
  311. package/library/skills/text-to-motion/rigging-for-text-motion.md +2 -2
  312. package/library/skills/tileable-texture/SKILL.md +19 -15
  313. package/library/skills/tileable-texture/resource.yaml +1 -1
  314. package/library/skills/trailer-shot/SKILL.md +28 -24
  315. package/library/skills/trailer-shot/resource.yaml +1 -1
  316. package/library/skills/tune-performance/SKILL.md +6 -6
  317. package/library/skills/tune-performance/resource.yaml +1 -1
  318. package/library/skills/ui-basics/SKILL.md +41 -36
  319. package/library/skills/ui-basics/resource.yaml +1 -1
  320. package/library/skills/ui-graphics/SKILL.md +47 -38
  321. package/library/skills/ui-graphics/resource.yaml +1 -1
  322. package/library/skills/use-widget-asset/SKILL.md +1 -1
  323. package/library/skills/use-widget-asset/resource.yaml +1 -1
  324. package/library/skills/using-summer/SKILL.md +6 -5
  325. package/library/skills/using-summer/resource.yaml +1 -1
  326. package/library/skills/vehicle-model/SKILL.md +65 -57
  327. package/library/skills/vehicle-model/resource.yaml +1 -1
  328. package/library/skills/verification-before-completion/SKILL.md +1 -1
  329. package/library/skills/verification-before-completion/resource.yaml +1 -1
  330. package/library/skills/verifying-scenes/SKILL.md +2 -2
  331. package/library/skills/verifying-scenes/resource.yaml +1 -1
  332. package/library/skills/vfx-dissolve/SKILL.md +2 -2
  333. package/library/skills/vfx-dissolve/resource.yaml +1 -1
  334. package/library/skills/vfx-fire/SKILL.md +15 -41
  335. package/library/skills/vfx-fire/resource.yaml +1 -1
  336. package/library/skills/vfx-hit-spark/SKILL.md +1 -1
  337. package/library/skills/vfx-hit-spark/resource.yaml +1 -1
  338. package/library/skills/vfx-lightning/SKILL.md +7 -16
  339. package/library/skills/vfx-lightning/resource.yaml +1 -1
  340. package/library/skills/vfx-magic-glow/SKILL.md +23 -32
  341. package/library/skills/vfx-magic-glow/resource.yaml +1 -1
  342. package/library/skills/vfx-muzzle-flash/SKILL.md +20 -35
  343. package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
  344. package/library/skills/vfx-smoke/SKILL.md +13 -31
  345. package/library/skills/vfx-smoke/resource.yaml +1 -1
  346. package/library/skills/vfx-water-ripple/SKILL.md +12 -31
  347. package/library/skills/vfx-water-ripple/resource.yaml +1 -1
  348. package/library/skills/voice-line/SKILL.md +71 -40
  349. package/library/skills/voice-line/resource.yaml +1 -1
  350. package/library/skills/web-and-touch-input/SKILL.md +1 -1
  351. package/library/skills/web-and-touch-input/resource.yaml +1 -1
  352. package/library/skills/web-compatibility-look/SKILL.md +1 -1
  353. package/library/skills/web-compatibility-look/resource.yaml +1 -1
  354. package/library/skills/world-building-3d/SKILL.md +1 -1
  355. package/library/skills/world-building-3d/resource.yaml +1 -1
  356. package/library/skills/writing-skills/resource.yaml +1 -0
  357. package/library/tools/add-node/GUIDE.md +14 -0
  358. package/library/tools/align-distribute-3d/GUIDE.md +7 -0
  359. package/library/tools/app-call/resource.yaml +1 -1
  360. package/library/tools/app-guide/resource.yaml +2 -2
  361. package/library/tools/app-page/resource.yaml +1 -1
  362. package/library/tools/app-screenshot/resource.yaml +19 -1
  363. package/library/tools/app-tools/resource.yaml +1 -1
  364. package/library/tools/attach-to-surface/GUIDE.md +15 -0
  365. package/library/tools/batch/GUIDE.md +27 -0
  366. package/library/tools/camera-bookmark/GUIDE.md +12 -0
  367. package/library/tools/capture-gameplay/GUIDE.md +3 -0
  368. package/library/tools/capture-gameplay/resource.yaml +3 -3
  369. package/library/tools/check-job/resource.yaml +1 -1
  370. package/library/tools/clear-console/GUIDE.md +3 -0
  371. package/library/tools/connect-ports/GUIDE.md +9 -0
  372. package/library/tools/connect-signal/GUIDE.md +14 -0
  373. package/library/tools/create-debug-report/GUIDE.md +10 -0
  374. package/library/tools/create-scene/GUIDE.md +10 -0
  375. package/library/tools/debug-views/GUIDE.md +7 -0
  376. package/library/tools/enable-plugin/GUIDE.md +3 -0
  377. package/library/tools/export-game/GUIDE.md +3 -0
  378. package/library/tools/export-game/resource.yaml +3 -3
  379. package/library/tools/export-templates/GUIDE.md +3 -0
  380. package/library/tools/fabricate-3d/GUIDE.md +19 -0
  381. package/library/tools/frame-nodes/GUIDE.md +9 -0
  382. package/library/tools/frame-shot/GUIDE.md +9 -0
  383. package/library/tools/game-control/GUIDE.md +9 -0
  384. package/library/tools/game-input/GUIDE.md +9 -0
  385. package/library/tools/game-probe/GUIDE.md +9 -0
  386. package/library/tools/generate-3d/resource.yaml +3 -3
  387. package/library/tools/generate-motion/resource.yaml +2 -2
  388. package/library/tools/get-console/GUIDE.md +9 -0
  389. package/library/tools/get-console/resource.yaml +5 -0
  390. package/library/tools/get-debugger-errors/GUIDE.md +7 -0
  391. package/library/tools/get-debugger-errors/resource.yaml +5 -0
  392. package/library/tools/get-debugger-warnings/GUIDE.md +7 -0
  393. package/library/tools/get-debugger-warnings/resource.yaml +5 -0
  394. package/library/tools/get-diagnostics/GUIDE.md +13 -0
  395. package/library/tools/get-project-context/GUIDE.md +25 -0
  396. package/library/tools/get-runtime-tree/GUIDE.md +7 -0
  397. package/library/tools/get-runtime-tree/resource.yaml +5 -0
  398. package/library/tools/get-scene-tree/GUIDE.md +11 -0
  399. package/library/tools/get-scene-tree/resource.yaml +5 -0
  400. package/library/tools/get-script-errors/GUIDE.md +5 -0
  401. package/library/tools/grep/GUIDE.md +11 -0
  402. package/library/tools/import-asset/GUIDE.md +8 -0
  403. package/library/tools/import-asset-by-id/GUIDE.md +12 -0
  404. package/library/tools/import-from-url/GUIDE.md +10 -0
  405. package/library/tools/import-from-url-batch/GUIDE.md +3 -0
  406. package/library/tools/import-hdri/GUIDE.md +16 -0
  407. package/library/tools/input-map-bind/GUIDE.md +11 -0
  408. package/library/tools/inspect-asset/GUIDE.md +14 -0
  409. package/library/tools/inspect-asset/resource.yaml +5 -0
  410. package/library/tools/inspect-node/GUIDE.md +11 -0
  411. package/library/tools/inspect-node/resource.yaml +5 -0
  412. package/library/tools/inspect-resource/GUIDE.md +7 -0
  413. package/library/tools/inspect-resource/resource.yaml +5 -0
  414. package/library/tools/inspect-runtime-node/GUIDE.md +7 -0
  415. package/library/tools/inspect-runtime-node/resource.yaml +5 -0
  416. package/library/tools/instantiate-scene/GUIDE.md +12 -0
  417. package/library/tools/is-running/GUIDE.md +3 -0
  418. package/library/tools/measure/GUIDE.md +8 -0
  419. package/library/tools/navigation-probe/GUIDE.md +9 -0
  420. package/library/tools/open/resource.yaml +2 -2
  421. package/library/tools/open-main-scene/GUIDE.md +6 -0
  422. package/library/tools/open-scene/GUIDE.md +8 -0
  423. package/library/tools/place-adjacent/GUIDE.md +7 -0
  424. package/library/tools/play/GUIDE.md +13 -0
  425. package/library/tools/project-setting/GUIDE.md +9 -0
  426. package/library/tools/publish-build/resource.yaml +6 -6
  427. package/library/tools/raycast/GUIDE.md +7 -0
  428. package/library/tools/read-file/GUIDE.md +10 -0
  429. package/library/tools/read-library/resource.yaml +5 -0
  430. package/library/tools/recent-events/GUIDE.md +7 -0
  431. package/library/tools/remove-node/GUIDE.md +3 -0
  432. package/library/tools/repeat-along/GUIDE.md +5 -0
  433. package/library/tools/replace-node/GUIDE.md +9 -0
  434. package/library/tools/replace-text/GUIDE.md +5 -0
  435. package/library/tools/run-editor-script/GUIDE.md +16 -0
  436. package/library/tools/run-script/GUIDE.md +30 -0
  437. package/library/tools/run-script/resource.yaml +6 -3
  438. package/library/tools/runtime-animate/GUIDE.md +7 -0
  439. package/library/tools/runtime-call/GUIDE.md +7 -0
  440. package/library/tools/runtime-set/GUIDE.md +9 -0
  441. package/library/tools/runtime-spawn/GUIDE.md +9 -0
  442. package/library/tools/save-scene/GUIDE.md +3 -0
  443. package/library/tools/scene-audit/GUIDE.md +29 -0
  444. package/library/tools/screenshot/GUIDE.md +17 -0
  445. package/library/tools/select-node/GUIDE.md +3 -0
  446. package/library/tools/set-prop/GUIDE.md +23 -0
  447. package/library/tools/set-resource-property/GUIDE.md +8 -0
  448. package/library/tools/shot-sheet/GUIDE.md +7 -0
  449. package/library/tools/snap-to-surface/GUIDE.md +17 -0
  450. package/library/tools/snapshot-diff/GUIDE.md +7 -0
  451. package/library/tools/starcast/GUIDE.md +12 -0
  452. package/library/tools/stop/GUIDE.md +3 -0
  453. package/library/tools/test-placement/GUIDE.md +7 -0
  454. package/library/tools/ui-actions/GUIDE.md +12 -0
  455. package/library/tools/ui-activate/GUIDE.md +11 -0
  456. package/library/tools/ui-screenshot/GUIDE.md +9 -0
  457. package/library/tools/ui-tree/GUIDE.md +10 -0
  458. package/library/tools/wait-for-event/GUIDE.md +11 -0
  459. package/library/tools/world-snapshot/GUIDE.md +9 -0
  460. package/library/tools/write-file/GUIDE.md +5 -0
  461. package/library/tools/zoom/GUIDE.md +5 -0
  462. package/package.json +6 -4
  463. package/registry/generated/counts.json +2 -2
  464. package/registry/generated/gemini-extension.json +4 -12
  465. package/registry/generated/index.json +433 -339
  466. package/registry/generated/marketplace.claude.json +2 -13
  467. package/registry/generated/plugin.claude.json +23 -22
  468. package/registry/generated/plugin.codex.json +4 -12
  469. package/registry/generated/plugin.cursor.json +4 -12
  470. package/registry/generated/plugin.factory.json +4 -12
  471. package/registry/generated/server.json +34 -0
  472. package/registry/generated/skills-index.md +119 -117
  473. package/registry/generated/skills-registry.json +153 -115
  474. package/registry/operations/fixtures/invalid-deprecated-without-replacement.json +60 -0
  475. package/registry/operations/fixtures/invalid-name.json +60 -0
  476. package/registry/operations/fixtures/invalid-publish-without-owner.json +82 -0
  477. package/registry/operations/fixtures/invalid-spend-without-estimate.json +42 -0
  478. package/registry/operations/fixtures/invalid-unknown-field.json +61 -0
  479. package/registry/operations/fixtures/valid-player-facing.json +82 -0
  480. package/registry/operations/fixtures/valid-read.json +60 -0
  481. package/registry/operations/fixtures/valid-spend.json +43 -0
  482. package/registry/operations/legacy-names.json +1206 -0
  483. package/registry/schemas/operation.schema.json +318 -0
  484. package/registry/schemas/skill.schema.json +4 -0
  485. package/CLAUDE.md +0 -7
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { getSkillRegistry } from "../skills-registry.js";
2
+ import { getSkillRegistry, isAssetSkill } from "../skills-registry.js";
3
3
  export const GAME_TASK_MODES = [
4
4
  "auto",
5
5
  "new-game",
@@ -150,7 +150,7 @@ function addSkill(routes, name, why, weight) {
150
150
  }
151
151
  routes.push({ name, why, weight });
152
152
  }
153
- function inferSkills(mode, target, goal) {
153
+ function inferSkills(mode, target, goal, engine = true) {
154
154
  const text = goal.toLowerCase();
155
155
  const routes = [];
156
156
  const animationIntent = includesAny(text, [
@@ -182,7 +182,12 @@ function inferSkills(mode, target, goal) {
182
182
  "voice",
183
183
  "animation clip",
184
184
  ]);
185
- addSkill(routes, "using-summer", "Baseline workflow for building through Summer CLI/MCP.", 100);
185
+ if (engine) {
186
+ addSkill(routes, "using-summer", "Baseline workflow for building through Summer CLI/MCP.", 100);
187
+ }
188
+ else {
189
+ addSkill(routes, "summer-assets", "The asset loop without Summer Engine: reuse, generate, check, download.", 250);
190
+ }
186
191
  if (mode === "debug") {
187
192
  addSkill(routes, "debug", "Primary runtime/script/diagnostics loop.", 300);
188
193
  addSkill(routes, "investigating-bugs", "Systematic bug investigation workflow.", 220);
@@ -307,6 +312,8 @@ function inferSkills(mode, target, goal) {
307
312
  addSkill(routes, "gdscript-patterns", "Use guarded Summer file tools for scripts, then verify through MCP.", 90);
308
313
  addSkill(routes, "verification-before-completion", "Do not finish without a clean verification story.", 80);
309
314
  return routes
315
+ // Without engine tools, only the skills that work without them.
316
+ .filter((route) => engine || isAssetSkill(skillByName().get(route.name)))
310
317
  .sort((a, b) => b.weight - a.weight)
311
318
  .slice(0, 7)
312
319
  .map((route) => {
@@ -372,9 +379,34 @@ function buildMcpToolPlan(mode, target, assetPolicy, verification, goal = "") {
372
379
  }
373
380
  return { start, mutate, assets, verify };
374
381
  }
375
- function buildUserGates(mode, assetPolicy) {
382
+ /** The plan for a session without engine tools: find, generate, check, hand over a file. */
383
+ function buildAssetsToolPlan(target, assetPolicy, verification) {
384
+ const assets = ["summer_list_my_assets", "summer_search_assets", "summer_get_asset"];
385
+ if (assetPolicy !== "no-paid-generation") {
386
+ const generator = {
387
+ "3d": "summer_generate_3d",
388
+ "2d": "summer_generate_image",
389
+ ui: "summer_generate_image",
390
+ audio: "summer_generate_audio",
391
+ animation: "summer_generate_motion",
392
+ };
393
+ if (generator[target])
394
+ assets.push(generator[target]);
395
+ assets.push("summer_check_job");
396
+ }
397
+ assets.push("summer_get_asset_download_url");
398
+ return {
399
+ start: ["summer_search_library", "summer_read_library"],
400
+ mutate: [],
401
+ assets,
402
+ verify: verification === "none" ? [] : ["summer_check_job", "summer_get_asset"],
403
+ };
404
+ }
405
+ function buildUserGates(mode, assetPolicy, engine = true) {
376
406
  const gates = [
377
- "Ask before destructive scene changes, deleting assets, or changing locked .summer memory.",
407
+ engine
408
+ ? "Ask before destructive scene changes, deleting assets, or changing locked .summer memory."
409
+ : "Ask before deleting or replacing the person's assets.",
378
410
  ];
379
411
  if (assetPolicy !== "generate-when-clearly-needed") {
380
412
  gates.push("Ask before paid generation, rigging, video, or large batch asset creation.");
@@ -395,6 +427,8 @@ export function buildGameTaskPlan(options) {
395
427
  const verification = options.verification ?? "full";
396
428
  const mode = inferMode(goal, options.mode ?? "auto");
397
429
  const target = inferTarget(goal, options.target ?? "auto");
430
+ if (options.engine === false)
431
+ return buildAssetsPlan(goal, mode, target, assetPolicy, verification);
398
432
  return {
399
433
  goal,
400
434
  mode,
@@ -431,3 +465,44 @@ export function buildGameTaskPlan(options) {
431
465
  ],
432
466
  };
433
467
  }
468
+ /** summer_start_game_task in a session without engine tools (the assets profile). */
469
+ function buildAssetsPlan(goal, mode, target, assetPolicy, verification) {
470
+ const needsEngine = mode !== "asset";
471
+ return {
472
+ goal,
473
+ mode,
474
+ target,
475
+ assetPolicy,
476
+ verification,
477
+ profileNote: "This session has generation and the Summer asset library, and no Summer Engine tools. Deliver files the person can use in any engine or web app." +
478
+ (needsEngine
479
+ ? " Building or changing a game needs Summer Engine and the full setup: npx -y summer-engine@latest setup <agent> --yes. Until then, make the assets the task needs."
480
+ : ""),
481
+ principles: [
482
+ "Deliver files, not scenes: the asset is done when it is saved where the person asked.",
483
+ "Reuse the person's assets and the Summer library before paid generation unless the person wants something custom.",
484
+ "Use the asset id a job returns; never search by name right after a generation.",
485
+ "Check each asset before claiming it is done: the job finished, and you saw the preview (or the person heard the sound).",
486
+ ],
487
+ recommendedSkills: inferSkills(mode, target, goal, false),
488
+ mcpToolPlan: buildAssetsToolPlan(target, assetPolicy, verification),
489
+ hostFileWork: [
490
+ "summer_generate_image saves the file itself when you pass out (a folder or a file path in the person's project).",
491
+ "Download other assets from summer_get_asset_download_url with your own shell into the folder the person named.",
492
+ ],
493
+ userGates: buildUserGates(mode, assetPolicy, false),
494
+ nextAgentSteps: [
495
+ "Load the top recommended skill; follow it until the asset exists, then its 'Without Summer Engine' section.",
496
+ "Ask what the asset is for: engine or app, format, size or scale, style, how many.",
497
+ "Check summer_list_my_assets and summer_search_assets before generating.",
498
+ "Generate after the person confirms the spend; poll summer_check_job until the state is terminal.",
499
+ "Hand the file over and tell the person its path and format.",
500
+ ],
501
+ antiPatterns: [
502
+ "Do not call engine tools (summer_get_project_context, summer_add_node, summer_play, summer_import_asset_by_id): this session does not have them.",
503
+ "Do not generate assets before checking library/user assets.",
504
+ "Do not search by name for an asset immediately after generation; use the returned asset ID.",
505
+ "Do not say an asset looks right without a preview you actually received.",
506
+ ],
507
+ };
508
+ }
@@ -53,8 +53,8 @@ export const motionGenerationArgsSchema = z.object({
53
53
  .describe("Stable retry key so the same logical request is not billed or queued twice"),
54
54
  wait: z
55
55
  .boolean()
56
- .default(true)
57
- .describe("Wait for completion (default true, up to 10 min). Set false to get jobId immediately."),
56
+ .default(false)
57
+ .describe("Block until the job finishes (up to 10 min) and return the result. Default false returns the jobId at once; poll summer_check_job."),
58
58
  options: z
59
59
  .record(z.any())
60
60
  .optional()
@@ -20,6 +20,7 @@
20
20
  */
21
21
  import { z } from "zod";
22
22
  import type { EngineCapabilities } from "../../capability-skew.js";
23
+ import { type SummerErrorCode } from "../../error-codes.js";
23
24
  import { type EditorTargetMeta, type NavParam, type NavSurface, type NavTarget } from "./targets.js";
24
25
  export type OpenSurface = "auto" | NavSurface;
25
26
  /** The ONE argument shape both faces validate with (mirrors
@@ -36,14 +37,14 @@ export declare const openArgsSchema: z.ZodObject<{
36
37
  surface: z.ZodOptional<z.ZodEnum<["auto", "web", "editor"]>>;
37
38
  open: z.ZodOptional<z.ZodBoolean>;
38
39
  }, "strict", z.ZodTypeAny, {
40
+ surface?: "web" | "editor" | "auto" | undefined;
39
41
  params?: Record<string, string> | undefined;
40
42
  target?: string | undefined;
41
- surface?: "web" | "editor" | "auto" | undefined;
42
43
  open?: boolean | undefined;
43
44
  }, {
45
+ surface?: "web" | "editor" | "auto" | undefined;
44
46
  params?: Record<string, string> | undefined;
45
47
  target?: string | undefined;
46
- surface?: "web" | "editor" | "auto" | undefined;
47
48
  open?: boolean | undefined;
48
49
  }>;
49
50
  export type OpenArgs = z.infer<typeof openArgsSchema>;
@@ -93,6 +94,9 @@ export interface OpenResult {
93
94
  receipt?: unknown;
94
95
  /** Structured failure class for ok:false results (engine_lacks_op, …). */
95
96
  failure_reason?: string;
97
+ /** The shared code (core/error-codes.ts) when the engine is not running. */
98
+ code?: SummerErrorCode;
99
+ recovery?: string;
96
100
  matches?: OpenMatch[];
97
101
  targets?: OpenTargetSummary[];
98
102
  hint?: string;
@@ -20,6 +20,7 @@
20
20
  */
21
21
  import { z } from "zod";
22
22
  import { extractOpError } from "../engine-receipt.js";
23
+ import { RECOVERY } from "../../error-codes.js";
23
24
  import { NAV_TARGETS, WEB_CATALOG, getNavTarget, } from "./targets.js";
24
25
  /** The ONE argument shape both faces validate with (mirrors
25
26
  * library/tools/open/resource.yaml input_schema; parity-tested). */
@@ -516,6 +517,8 @@ export async function runOpen(args, deps) {
516
517
  return {
517
518
  ok: false,
518
519
  action: "engine_not_running",
520
+ code: "engine_not_running",
521
+ recovery: RECOVERY.engine_not_running,
519
522
  target: summary,
520
523
  op: navigateOp,
521
524
  engine: { running: false, error: message },
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
2
2
  import { createReadStream } from "node:fs";
3
3
  import { open } from "node:fs/promises";
4
4
  import { extname, resolve } from "node:path";
5
+ import { summerRequestHeaders } from "../agent-host.js";
5
6
  import { resolveGatewayUrl } from "../config.js";
6
7
  import { getStoreAccessToken, OAuthError } from "../oauth.js";
7
8
  import { appendStoreJsonLine } from "../store.js";
@@ -87,6 +88,7 @@ export function createStore(baseUrl, token, deps) {
87
88
  response = await deps.fetch(`${baseUrl}${STORE_PROXY_PATH}/${path}`, {
88
89
  method,
89
90
  headers: {
91
+ ...summerRequestHeaders(),
90
92
  accept: "application/json",
91
93
  authorization: `Bearer ${token}`,
92
94
  ...(options.body === undefined ? {} : { "content-type": "application/json" }),
@@ -140,18 +140,18 @@ export declare const runtimeSpawnArgsSchema: z.ZodObject<{
140
140
  }, "strip", z.ZodTypeAny, {
141
141
  action: "spawn" | "free";
142
142
  mode?: "free" | "queue_free" | undefined;
143
+ name?: string | undefined;
143
144
  instance?: string | undefined;
144
145
  scene?: string | undefined;
145
- name?: string | undefined;
146
146
  path?: string | undefined;
147
147
  parent?: string | undefined;
148
148
  props?: Record<string, string | number | boolean> | undefined;
149
149
  }, {
150
150
  action: "spawn" | "free";
151
151
  mode?: "free" | "queue_free" | undefined;
152
+ name?: string | undefined;
152
153
  instance?: string | undefined;
153
154
  scene?: string | undefined;
154
- name?: string | undefined;
155
155
  path?: string | undefined;
156
156
  parent?: string | undefined;
157
157
  props?: Record<string, string | number | boolean> | undefined;
@@ -182,10 +182,10 @@ export declare const runtimeAnimateArgsSchema: z.ZodObject<{
182
182
  }, "strip", z.ZodTypeAny, {
183
183
  path: string;
184
184
  target: "tree" | "player" | "bones";
185
+ name?: string | undefined;
185
186
  state?: string | undefined;
186
187
  value?: string | number | boolean | undefined;
187
188
  instance?: string | undefined;
188
- name?: string | undefined;
189
189
  space?: "local" | "global" | "both" | undefined;
190
190
  cmd?: "state" | "pause" | "play" | "stop" | "seek" | "speed" | "travel" | "start" | "set_param" | "get_param" | undefined;
191
191
  blend?: number | undefined;
@@ -201,10 +201,10 @@ export declare const runtimeAnimateArgsSchema: z.ZodObject<{
201
201
  }, {
202
202
  path: string;
203
203
  target: "tree" | "player" | "bones";
204
+ name?: string | undefined;
204
205
  state?: string | undefined;
205
206
  value?: string | number | boolean | undefined;
206
207
  instance?: string | undefined;
207
- name?: string | undefined;
208
208
  space?: "local" | "global" | "both" | undefined;
209
209
  cmd?: "state" | "pause" | "play" | "stop" | "seek" | "speed" | "travel" | "start" | "set_param" | "get_param" | undefined;
210
210
  blend?: number | undefined;
@@ -0,0 +1,17 @@
1
+ import { type RunSceneScriptArgs } from "./scene-script.js";
2
+ export interface SceneScriptClient {
3
+ executeIdentityBoundOps(ops: Record<string, unknown>[], options?: Record<string, unknown>, timeoutMs?: number): Promise<unknown>;
4
+ getSceneState(): Promise<unknown>;
5
+ }
6
+ export interface SceneTarget {
7
+ scenePath: string;
8
+ /** The script's scene was not the edited one, so its tab was brought forward. */
9
+ opened: boolean;
10
+ /** The scene the editor showed before, opened again after the run. */
11
+ restored?: string;
12
+ /** Why that tab could not be restored (the script still ran). */
13
+ restore_error?: string;
14
+ }
15
+ export declare function runSceneScriptOn(client: SceneScriptClient, args: RunSceneScriptArgs & {
16
+ scenePath?: string;
17
+ }): Promise<unknown>;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * summer_run_script with a target scene. The engine's RunSceneScript runs
3
+ * against the scene the editor is editing and takes no target of its own, so
4
+ * a scenePath is honored here, the same way for the MCP tool and the CLI:
5
+ *
6
+ * 1. Read the scene the editor is editing (a snapshot up to ~300 ms old).
7
+ * 2. OpenScene scenePath, alone (never in one batch with a mutation), even
8
+ * when the snapshot says it is already the edited scene: the person may
9
+ * have switched tabs since, and opening the current scene again changes
10
+ * nothing. The engine answers ok only once that scene is the edited one,
11
+ * so a failed open stops here and the script never runs.
12
+ * 3. Run the script.
13
+ * 4. Give the person back the tab they had (OpenScene of the earlier scene),
14
+ * as the engine's own scene-targeted ops do.
15
+ *
16
+ * The result is the engine's RunSceneScript receipt plus `scene_target`.
17
+ */
18
+ import { resolveCurrentScene } from "./project-context.js";
19
+ import { buildRunSceneScriptOp } from "./scene-script.js";
20
+ import { validateScenePath } from "./seeing/seeing.js";
21
+ import { extractOpError } from "./engine-receipt.js";
22
+ function withTarget(result, target) {
23
+ return result && typeof result === "object" && !Array.isArray(result)
24
+ ? { ...result, scene_target: target }
25
+ : { result, scene_target: target };
26
+ }
27
+ export async function runSceneScriptOn(client, args) {
28
+ const { op, timeoutMs } = buildRunSceneScriptOp(args);
29
+ if (args.scenePath === undefined)
30
+ return client.executeIdentityBoundOps([op], undefined, timeoutMs);
31
+ const scenePath = validateScenePath(args.scenePath);
32
+ let before = null;
33
+ let beforeError;
34
+ try {
35
+ before = resolveCurrentScene(undefined, await client.getSceneState(), undefined);
36
+ }
37
+ catch (error) {
38
+ beforeError = error instanceof Error ? error.message : String(error);
39
+ }
40
+ const open = await client.executeIdentityBoundOps([{ op: "OpenScene", path: scenePath }]);
41
+ const openError = extractOpError(open);
42
+ if (openError) {
43
+ return {
44
+ ok: false,
45
+ error: `Could not open ${scenePath}, so the script did not run. ${openError}`,
46
+ failure_reason: "scene_target_failed",
47
+ scene_target: { scenePath, opened: false },
48
+ receipt: open,
49
+ };
50
+ }
51
+ const opened = before !== scenePath;
52
+ const result = await client.executeIdentityBoundOps([op], undefined, timeoutMs);
53
+ const target = { scenePath, opened };
54
+ if (beforeError !== undefined)
55
+ target.restore_error = `The scene open before could not be read, so no tab was restored: ${beforeError}`;
56
+ if (opened && before) {
57
+ try {
58
+ const restore = await client.executeIdentityBoundOps([{ op: "OpenScene", path: before }]);
59
+ const restoreError = extractOpError(restore);
60
+ if (restoreError)
61
+ target.restore_error = restoreError;
62
+ else
63
+ target.restored = before;
64
+ }
65
+ catch (error) {
66
+ target.restore_error = error instanceof Error ? error.message : String(error);
67
+ }
68
+ }
69
+ return withTarget(result, target);
70
+ }
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { type SummerErrorCode } from "../error-codes.js";
2
3
  /**
3
4
  * Sound-effect choices (summer_generate_sfx_choices + summer_get_choices).
4
5
  *
@@ -59,6 +60,9 @@ export interface GatewayReply {
59
60
  data?: any;
60
61
  error?: string;
61
62
  status: number;
63
+ /** Set for the shared failures (not signed in, no credits, network). */
64
+ code?: SummerErrorCode;
65
+ recovery?: string;
62
66
  }
63
67
  export interface SfxChoicesDeps {
64
68
  post(endpoint: string, body: Record<string, unknown>, timeoutMs: number): Promise<GatewayReply>;
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { codedFailure } from "../error-codes.js";
2
3
  /**
3
4
  * Sound-effect choices (summer_generate_sfx_choices + summer_get_choices).
4
5
  *
@@ -59,6 +60,14 @@ export const getChoicesArgsSchema = z.object({
59
60
  .optional()
60
61
  .describe("Wait up to this many seconds (max 50) for the person to decide before answering. 0 or omitted: answer now"),
61
62
  });
63
+ /** A failed reply as a tool result; coded when the reply carries a code. */
64
+ function replyFailure(reply) {
65
+ // An unavailable reply's data is already `{details: {cause}}`.
66
+ const details = reply.code === "unavailable" ? reply.data ?? {} : reply.data ? { details: reply.data } : {};
67
+ return reply.code
68
+ ? codedFailure(reply.code, reply.error ?? "Request failed", details, reply.recovery)
69
+ : { ok: false, error: reply.error, ...details };
70
+ }
62
71
  // ---------------------------------------------------------------------------
63
72
  // Showing the page
64
73
  // ---------------------------------------------------------------------------
@@ -138,9 +147,8 @@ function clipSummary(clip) {
138
147
  }
139
148
  export async function generateSfxChoices(args, deps) {
140
149
  const reply = await deps.post(SFX_CHOICES_ENDPOINT, sfxChoicesRequestBody(args), SFX_CHOICES_TIMEOUT_MS);
141
- if (reply.error) {
142
- return { ok: false, error: reply.error, ...(reply.data ? { details: reply.data } : {}) };
143
- }
150
+ if (reply.error)
151
+ return replyFailure(reply);
144
152
  const data = reply.data ?? {};
145
153
  const clips = Array.isArray(data.clips) ? data.clips : [];
146
154
  const failed = Array.isArray(data.failed) ? data.failed : [];
@@ -211,9 +219,8 @@ export async function getChoices(args, deps) {
211
219
  if (args.waitSeconds)
212
220
  params.set("waitSeconds", String(args.waitSeconds));
213
221
  const reply = await deps.get(choicesEndpoint(args.choiceSetId), params, choicesTimeoutMs(args.waitSeconds));
214
- if (reply.error) {
215
- return { ok: false, error: reply.error, ...(reply.data ? { details: reply.data } : {}) };
216
- }
222
+ if (reply.error)
223
+ return replyFailure(reply);
217
224
  const data = reply.data ?? {};
218
225
  const clips = Array.isArray(data.clips) ? data.clips : [];
219
226
  const status = data.status === "decided" ? "decided" : "pending";
@@ -1,4 +1,5 @@
1
1
  import { EngineApiClient } from "../api-client.js";
2
+ import { type SummerErrorCode } from "../error-codes.js";
2
3
  export type DispatchArgs = Record<string, unknown>;
3
4
  export interface ToolDispatchContext {
4
5
  /** Lazily connect to the local engine. Throws EngineUnavailableError with a
@@ -19,9 +20,6 @@ export interface ToolDispatchEntry {
19
20
  /** Dispatch-level failure with a user-facing message (no stack needed). */
20
21
  export declare class ToolDispatchError extends Error {
21
22
  }
22
- /** The local engine is not reachable — a clean state, not a crash. */
23
- export declare class EngineUnavailableError extends ToolDispatchError {
24
- }
25
23
  /** A tool failed with a structured receipt that `summer tool` prints whole
26
24
  * (JSON on stdout, exit 1) instead of flattening to `message`: every engine
27
25
  * envelope extractOpError reads as a failure (the same gate the MCP face
@@ -33,6 +31,17 @@ export declare class ToolResultError extends ToolDispatchError {
33
31
  readonly result: Record<string, unknown>;
34
32
  constructor(result: Record<string, unknown>, message: string);
35
33
  }
34
+ /** A shared failure (core/error-codes.ts) — not signed in, no credits,
35
+ * network — printed as `{ok:false, code, error, recovery}` with the shell
36
+ * wording of the next step. */
37
+ export declare class CodedToolError extends ToolResultError {
38
+ constructor(code: SummerErrorCode, message: string, extra?: Record<string, unknown>, recovery?: string);
39
+ }
40
+ /** The local engine is not reachable — a clean state, not a crash. Prints
41
+ * `{ok:false, code:"engine_not_running", error, recovery, hint}`. */
42
+ export declare class EngineUnavailableError extends CodedToolError {
43
+ constructor(message: string);
44
+ }
36
45
  export declare function createDefaultDispatchContext(): ToolDispatchContext;
37
46
  export declare const TOOL_DISPATCH: readonly ToolDispatchEntry[];
38
47
  export declare function listToolDispatches(): readonly ToolDispatchEntry[];