summer-engine 3.7.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 (501) hide show
  1. package/.claude-plugin/marketplace.json +2 -13
  2. package/.claude-plugin/plugin.json +25 -22
  3. package/.codex-plugin/plugin.json +8 -14
  4. package/.cursor-plugin/plugin.json +7 -13
  5. package/.factory-plugin/plugin.json +7 -13
  6. package/AGENTS.md +19 -12
  7. package/CHANGELOG.md +112 -0
  8. package/GEMINI.md +3 -3
  9. package/README.md +111 -31
  10. package/assets/icon.png +0 -0
  11. package/commands/start.md +71 -0
  12. package/commands/summer.md +5 -3
  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 +341 -0
  27. package/dist/core/capabilities/apps.js +353 -0
  28. package/dist/core/capabilities/doctor.d.ts +3 -0
  29. package/dist/core/capabilities/doctor.js +20 -15
  30. package/dist/core/capabilities/enable-plugin.d.ts +27 -0
  31. package/dist/core/capabilities/enable-plugin.js +75 -0
  32. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -2
  33. package/dist/core/capabilities/game-task-plan.d.ts +12 -6
  34. package/dist/core/capabilities/game-task-plan.js +80 -5
  35. package/dist/core/capabilities/motion-generation.js +2 -2
  36. package/dist/core/capabilities/navigation/open.d.ts +6 -2
  37. package/dist/core/capabilities/navigation/open.js +3 -0
  38. package/dist/core/capabilities/publish-build.js +2 -0
  39. package/dist/core/capabilities/runtime-control.d.ts +4 -4
  40. package/dist/core/capabilities/scene-script-target.d.ts +17 -0
  41. package/dist/core/capabilities/scene-script-target.js +70 -0
  42. package/dist/core/capabilities/sfx-choices.d.ts +4 -0
  43. package/dist/core/capabilities/sfx-choices.js +13 -6
  44. package/dist/core/capabilities/tool-dispatch.d.ts +12 -3
  45. package/dist/core/capabilities/tool-dispatch.js +130 -46
  46. package/dist/core/capability-skew.js +4 -0
  47. package/dist/core/embeddings.d.ts +2 -0
  48. package/dist/core/embeddings.js +1 -1
  49. package/dist/core/error-codes.d.ts +62 -0
  50. package/dist/core/error-codes.js +97 -0
  51. package/dist/core/format.d.ts +2 -0
  52. package/dist/core/format.js +2 -1
  53. package/dist/core/hosted-mcp.d.ts +22 -0
  54. package/dist/core/hosted-mcp.js +56 -1
  55. package/dist/core/library-read.js +5 -0
  56. package/dist/core/library-search.js +2 -1
  57. package/dist/core/oauth.js +4 -0
  58. package/dist/core/ops/catalog.d.ts +41 -0
  59. package/dist/core/ops/catalog.js +145 -0
  60. package/dist/core/ops/cloud.d.ts +56 -0
  61. package/dist/core/ops/cloud.js +175 -0
  62. package/dist/core/ops/contract.d.ts +119 -0
  63. package/dist/core/ops/contract.js +142 -0
  64. package/dist/core/ops/engine-answer.d.ts +25 -0
  65. package/dist/core/ops/engine-answer.js +117 -0
  66. package/dist/core/ops/engine.d.ts +55 -0
  67. package/dist/core/ops/engine.js +649 -0
  68. package/dist/core/ops/save-files.d.ts +78 -0
  69. package/dist/core/ops/save-files.js +419 -0
  70. package/dist/core/ops/search.d.ts +9 -0
  71. package/dist/core/ops/search.js +55 -0
  72. package/dist/core/skills-registry.d.ts +16 -1
  73. package/dist/core/skills-registry.js +35 -2
  74. package/dist/core/telemetry.d.ts +32 -0
  75. package/dist/core/telemetry.js +38 -10
  76. package/dist/core/tool-profiles.d.ts +25 -0
  77. package/dist/core/tool-profiles.js +41 -0
  78. package/dist/installer/agent-config.d.ts +17 -4
  79. package/dist/installer/agent-config.js +22 -6
  80. package/dist/installer/agent-table.d.ts +3 -0
  81. package/dist/installer/agent-table.js +10 -7
  82. package/dist/installer/setup.d.ts +2 -0
  83. package/dist/installer/setup.js +9 -4
  84. package/dist/installer/version-check.d.ts +29 -9
  85. package/dist/installer/version-check.js +81 -28
  86. package/dist/mcp/command.js +7 -0
  87. package/dist/mcp/hosted-mount.d.ts +27 -2
  88. package/dist/mcp/hosted-mount.js +66 -24
  89. package/dist/mcp/legacy-toolset.d.ts +27 -0
  90. package/dist/mcp/legacy-toolset.js +43 -0
  91. package/dist/mcp/ops-surface.d.ts +59 -0
  92. package/dist/mcp/ops-surface.js +443 -0
  93. package/dist/mcp/server.d.ts +35 -11
  94. package/dist/mcp/server.js +236 -89
  95. package/dist/mcp/tool-results.d.ts +26 -0
  96. package/dist/mcp/tool-results.js +81 -0
  97. package/dist/mcp/tool-surface.d.ts +65 -0
  98. package/dist/mcp/tool-surface.js +317 -0
  99. package/dist/mcp/tools/app-tools.d.ts +2 -0
  100. package/dist/mcp/tools/app-tools.js +71 -0
  101. package/dist/mcp/tools/asset-tools.js +55 -53
  102. package/dist/mcp/tools/audit-tools.js +21 -21
  103. package/dist/mcp/tools/debug-tools.js +6 -6
  104. package/dist/mcp/tools/fabricate-tools.js +6 -6
  105. package/dist/mcp/tools/generate-tools.js +76 -70
  106. package/dist/mcp/tools/project-tools.d.ts +9 -4
  107. package/dist/mcp/tools/project-tools.js +16 -10
  108. package/dist/mcp/tools/scene-tools.js +12 -23
  109. package/dist/mcp/tools/script-tools.js +9 -5
  110. package/dist/mcp/tools/with-engine.d.ts +6 -0
  111. package/dist/mcp/tools/with-engine.js +19 -0
  112. package/gemini-extension.json +6 -12
  113. package/hooks/pre-commit-doctor.sh +5 -4
  114. package/hooks/session-start.sh +24 -28
  115. package/integrations/claude-desktop/README.md +1 -1
  116. package/integrations/copilot-jetbrains/README.md +1 -1
  117. package/integrations/junie/README.md +1 -1
  118. package/integrations/lm-studio/README.md +1 -1
  119. package/integrations/trae/README.md +1 -1
  120. package/integrations/visual-studio/README.md +1 -1
  121. package/library/references/mcp-tools-reference/mcp-tools-reference.md +85 -35
  122. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  123. package/library/references/product-map/resource.yaml +2 -2
  124. package/library/skills/3d-lighting/SKILL.md +53 -28
  125. package/library/skills/3d-lighting/resource.yaml +1 -1
  126. package/library/skills/README.md +126 -116
  127. package/library/skills/adaptive-music/SKILL.md +19 -23
  128. package/library/skills/adaptive-music/resource.yaml +1 -1
  129. package/library/skills/agent-playtesting/SKILL.md +1 -1
  130. package/library/skills/agent-playtesting/resource.yaml +1 -1
  131. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  132. package/library/skills/ai-characters-in-games/resource.yaml +1 -1
  133. package/library/skills/ambient-bed/SKILL.md +22 -13
  134. package/library/skills/ambient-bed/resource.yaml +1 -1
  135. package/library/skills/animated-loop/SKILL.md +41 -32
  136. package/library/skills/animated-loop/resource.yaml +1 -1
  137. package/library/skills/animation-tree/SKILL.md +1 -1
  138. package/library/skills/animation-tree/resource.yaml +1 -1
  139. package/library/skills/art-direction/SKILL.md +3 -3
  140. package/library/skills/art-direction/resource.yaml +1 -1
  141. package/library/skills/asset-strategy/SKILL.md +21 -4
  142. package/library/skills/asset-strategy/resource.yaml +2 -1
  143. package/library/skills/audio-direction/SKILL.md +10 -10
  144. package/library/skills/audio-direction/resource.yaml +1 -1
  145. package/library/skills/auto-fire-targeting/SKILL.md +1 -1
  146. package/library/skills/auto-fire-targeting/resource.yaml +1 -1
  147. package/library/skills/bounded-engine-runs/SKILL.md +1 -1
  148. package/library/skills/bounded-engine-runs/resource.yaml +1 -1
  149. package/library/skills/brainstorm-game/SKILL.md +1 -1
  150. package/library/skills/brainstorm-game/resource.yaml +1 -1
  151. package/library/skills/brainstorming/SKILL.md +1 -1
  152. package/library/skills/brainstorming/resource.yaml +1 -1
  153. package/library/skills/browse-templates/SKILL.md +1 -1
  154. package/library/skills/browse-templates/resource.yaml +1 -1
  155. package/library/skills/camera-rigs/SKILL.md +2 -2
  156. package/library/skills/camera-rigs/resource.yaml +1 -1
  157. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -0
  158. package/library/skills/character-animation-wiring/SKILL.md +4 -4
  159. package/library/skills/character-animation-wiring/resource.yaml +1 -1
  160. package/library/skills/character-model/SKILL.md +55 -47
  161. package/library/skills/character-model/resource.yaml +1 -1
  162. package/library/skills/character-movement/SKILL.md +3 -3
  163. package/library/skills/character-movement/resource.yaml +1 -1
  164. package/library/skills/character-portrait/SKILL.md +24 -19
  165. package/library/skills/character-portrait/resource.yaml +1 -1
  166. package/library/skills/cinematic-cutscene/SKILL.md +58 -46
  167. package/library/skills/cinematic-cutscene/resource.yaml +1 -1
  168. package/library/skills/combat-basics/SKILL.md +1 -1
  169. package/library/skills/combat-basics/resource.yaml +1 -1
  170. package/library/skills/compatibility-renderer-traps/SKILL.md +1 -1
  171. package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
  172. package/library/skills/concept-art/SKILL.md +16 -12
  173. package/library/skills/concept-art/resource.yaml +1 -1
  174. package/library/skills/concept-to-level/SKILL.md +239 -0
  175. package/library/skills/concept-to-level/references/technical-rules.md +150 -0
  176. package/library/skills/concept-to-level/resource.yaml +44 -0
  177. package/library/skills/create-asset-sheet/SKILL.md +19 -13
  178. package/library/skills/create-asset-sheet/resource.yaml +1 -1
  179. package/library/skills/debug/SKILL.md +2 -2
  180. package/library/skills/debug/resource.yaml +1 -1
  181. package/library/skills/debugging-game-feel/SKILL.md +1 -1
  182. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  183. package/library/skills/design-level/SKILL.md +23 -35
  184. package/library/skills/design-level/resource.yaml +1 -1
  185. package/library/skills/design-mechanic/SKILL.md +1 -1
  186. package/library/skills/design-mechanic/resource.yaml +1 -1
  187. package/library/skills/design-npc/SKILL.md +22 -24
  188. package/library/skills/design-npc/resource.yaml +1 -1
  189. package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
  190. package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
  191. package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
  192. package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
  193. package/library/skills/environment-kit/SKILL.md +20 -16
  194. package/library/skills/environment-kit/resource.yaml +1 -1
  195. package/library/skills/export-and-ship/SKILL.md +6 -6
  196. package/library/skills/export-and-ship/resource.yaml +1 -1
  197. package/library/skills/fabricating-assets/SKILL.md +7 -7
  198. package/library/skills/fabricating-assets/resource.yaml +3 -3
  199. package/library/skills/facial-and-lipsync/SKILL.md +14 -15
  200. package/library/skills/facial-and-lipsync/resource.yaml +1 -1
  201. package/library/skills/fps-controller/SKILL.md +33 -41
  202. package/library/skills/fps-controller/resource.yaml +1 -1
  203. package/library/skills/game-feel/SKILL.md +8 -8
  204. package/library/skills/game-feel/resource.yaml +1 -1
  205. package/library/skills/gameskill/SKILL.md +4 -4
  206. package/library/skills/gameskill/resource.yaml +1 -1
  207. package/library/skills/gdscript-patterns/SKILL.md +1 -1
  208. package/library/skills/gdscript-patterns/resource.yaml +1 -1
  209. package/library/skills/generate-motion/SKILL.md +30 -21
  210. package/library/skills/generate-motion/resource.yaml +1 -1
  211. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
  212. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
  213. package/library/skills/grow-analytics/SKILL.md +3 -3
  214. package/library/skills/grow-analytics/resource.yaml +1 -1
  215. package/library/skills/headless-scripting/SKILL.md +1 -1
  216. package/library/skills/headless-scripting/resource.yaml +1 -1
  217. package/library/skills/in-game-purchases/SKILL.md +1 -1
  218. package/library/skills/in-game-purchases/resource.yaml +1 -1
  219. package/library/skills/instantiate-asset-pack/SKILL.md +2 -2
  220. package/library/skills/instantiate-asset-pack/resource.yaml +1 -1
  221. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +1 -0
  222. package/library/skills/make-game/SKILL.md +4 -4
  223. package/library/skills/make-game/references/2d-platformer.md +1 -1
  224. package/library/skills/make-game/references/3d-fps.md +1 -1
  225. package/library/skills/make-game/references/3d-horror.md +1 -1
  226. package/library/skills/make-game/references/3d-third-person.md +2 -2
  227. package/library/skills/make-game/resource.yaml +1 -1
  228. package/library/skills/multiplayer/SKILL.md +1 -1
  229. package/library/skills/multiplayer/resource.yaml +1 -1
  230. package/library/skills/multiplayer-movement/SKILL.md +1 -1
  231. package/library/skills/multiplayer-movement/resource.yaml +1 -1
  232. package/library/skills/multiplayer-project/SKILL.md +1 -1
  233. package/library/skills/multiplayer-project/resource.yaml +1 -1
  234. package/library/skills/multiplayer-publish/SKILL.md +8 -7
  235. package/library/skills/multiplayer-publish/resource.yaml +3 -3
  236. package/library/skills/multiplayer-state/SKILL.md +1 -1
  237. package/library/skills/multiplayer-state/resource.yaml +1 -1
  238. package/library/skills/multiplayer-testing/SKILL.md +1 -1
  239. package/library/skills/multiplayer-testing/resource.yaml +1 -1
  240. package/library/skills/music-track/SKILL.md +22 -13
  241. package/library/skills/music-track/resource.yaml +1 -1
  242. package/library/skills/navigate-summer/SKILL.md +11 -9
  243. package/library/skills/navigate-summer/resource.yaml +1 -1
  244. package/library/skills/new-project/SKILL.md +1 -1
  245. package/library/skills/new-project/resource.yaml +1 -1
  246. package/library/skills/organic-model/SKILL.md +24 -18
  247. package/library/skills/organic-model/resource.yaml +1 -1
  248. package/library/skills/pixel-art/SKILL.md +27 -23
  249. package/library/skills/pixel-art/resource.yaml +1 -1
  250. package/library/skills/play/SKILL.md +1 -1
  251. package/library/skills/play/resource.yaml +1 -1
  252. package/library/skills/playtesting-a-feature/SKILL.md +1 -1
  253. package/library/skills/playtesting-a-feature/resource.yaml +1 -1
  254. package/library/skills/procedural-animation/SKILL.md +20 -16
  255. package/library/skills/procedural-animation/resource.yaml +1 -1
  256. package/library/skills/prop-model/SKILL.md +25 -19
  257. package/library/skills/prop-model/resource.yaml +1 -1
  258. package/library/skills/psx-retro-rendering/resource.yaml +1 -0
  259. package/library/skills/publish-your-game/SKILL.md +16 -6
  260. package/library/skills/publish-your-game/resource.yaml +3 -3
  261. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -0
  262. package/library/skills/release-readiness/SKILL.md +1 -1
  263. package/library/skills/release-readiness/resource.yaml +1 -1
  264. package/library/skills/remote-deploy/SKILL.md +1 -1
  265. package/library/skills/remote-deploy/resource.yaml +1 -1
  266. package/library/skills/retarget/SKILL.md +23 -20
  267. package/library/skills/retarget/resource.yaml +1 -1
  268. package/library/skills/running-in-the-cloud/SKILL.md +1 -1
  269. package/library/skills/running-in-the-cloud/resource.yaml +1 -1
  270. package/library/skills/save-load/SKILL.md +1 -1
  271. package/library/skills/save-load/resource.yaml +1 -1
  272. package/library/skills/scene-composition/SKILL.md +1 -1
  273. package/library/skills/scene-composition/resource.yaml +1 -1
  274. package/library/skills/scene-hierarchy-design/SKILL.md +2 -2
  275. package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
  276. package/library/skills/scene-scripting/SKILL.md +66 -636
  277. package/library/skills/scene-scripting/references/ctx-api.md +184 -0
  278. package/library/skills/scene-scripting/references/recipes-2d-ui.md +193 -0
  279. package/library/skills/scene-scripting/references/recipes-3d.md +280 -0
  280. package/library/skills/scene-scripting/resource.yaml +4 -4
  281. package/library/skills/scene-to-level/SKILL.md +2 -2
  282. package/library/skills/scene-to-level/resource.yaml +1 -1
  283. package/library/skills/skill-create/resource.yaml +1 -0
  284. package/library/skills/skill-improve/resource.yaml +1 -0
  285. package/library/skills/skill-test/SKILL.md +2 -2
  286. package/library/skills/skill-test/resource.yaml +1 -0
  287. package/library/skills/skintokens-auto-rigging/resource.yaml +1 -0
  288. package/library/skills/skybox-panorama/SKILL.md +27 -21
  289. package/library/skills/skybox-panorama/resource.yaml +1 -1
  290. package/library/skills/sound-effect/SKILL.md +31 -20
  291. package/library/skills/sound-effect/resource.yaml +1 -1
  292. package/library/skills/spatial-placement/SKILL.md +14 -9
  293. package/library/skills/spatial-placement/resource.yaml +1 -1
  294. package/library/skills/sprite-sheet/SKILL.md +32 -27
  295. package/library/skills/sprite-sheet/resource.yaml +1 -1
  296. package/library/skills/store-art/SKILL.md +3 -3
  297. package/library/skills/store-art/resource.yaml +2 -2
  298. package/library/skills/store-listing/SKILL.md +3 -3
  299. package/library/skills/store-listing/resource.yaml +2 -2
  300. package/library/skills/summer-analytics/SKILL.md +7 -5
  301. package/library/skills/summer-analytics/resource.yaml +2 -2
  302. package/library/skills/summer-apps/SKILL.md +168 -0
  303. package/library/skills/summer-apps/manifest.md +57 -0
  304. package/library/skills/summer-apps/minimal-app.md +183 -0
  305. package/library/skills/summer-apps/resource.yaml +36 -0
  306. package/library/skills/summer-apps/sdk-reference.md +135 -0
  307. package/library/skills/summer-apps-design/SKILL.md +197 -0
  308. package/library/skills/summer-apps-design/resource.yaml +23 -0
  309. package/library/skills/summer-assets/SKILL.md +56 -0
  310. package/library/skills/summer-assets/resource.yaml +34 -0
  311. package/library/skills/summer-store/SKILL.md +1 -1
  312. package/library/skills/text-to-motion/SKILL.md +30 -23
  313. package/library/skills/text-to-motion/prompts-and-controls.md +5 -5
  314. package/library/skills/text-to-motion/resource.yaml +1 -1
  315. package/library/skills/text-to-motion/rigging-for-text-motion.md +2 -2
  316. package/library/skills/tileable-texture/SKILL.md +19 -15
  317. package/library/skills/tileable-texture/resource.yaml +1 -1
  318. package/library/skills/trailer-shot/SKILL.md +28 -24
  319. package/library/skills/trailer-shot/resource.yaml +1 -1
  320. package/library/skills/tune-performance/SKILL.md +6 -6
  321. package/library/skills/tune-performance/resource.yaml +1 -1
  322. package/library/skills/ui-basics/SKILL.md +41 -36
  323. package/library/skills/ui-basics/resource.yaml +1 -1
  324. package/library/skills/ui-graphics/SKILL.md +47 -38
  325. package/library/skills/ui-graphics/resource.yaml +1 -1
  326. package/library/skills/use-widget-asset/SKILL.md +1 -1
  327. package/library/skills/use-widget-asset/resource.yaml +1 -1
  328. package/library/skills/using-summer/SKILL.md +7 -5
  329. package/library/skills/using-summer/resource.yaml +1 -1
  330. package/library/skills/vehicle-model/SKILL.md +65 -57
  331. package/library/skills/vehicle-model/resource.yaml +1 -1
  332. package/library/skills/verification-before-completion/SKILL.md +1 -1
  333. package/library/skills/verification-before-completion/resource.yaml +1 -1
  334. package/library/skills/verifying-scenes/SKILL.md +2 -2
  335. package/library/skills/verifying-scenes/resource.yaml +1 -1
  336. package/library/skills/vfx-dissolve/SKILL.md +2 -2
  337. package/library/skills/vfx-dissolve/resource.yaml +1 -1
  338. package/library/skills/vfx-fire/SKILL.md +15 -41
  339. package/library/skills/vfx-fire/resource.yaml +1 -1
  340. package/library/skills/vfx-hit-spark/SKILL.md +1 -1
  341. package/library/skills/vfx-hit-spark/resource.yaml +1 -1
  342. package/library/skills/vfx-lightning/SKILL.md +7 -16
  343. package/library/skills/vfx-lightning/resource.yaml +1 -1
  344. package/library/skills/vfx-magic-glow/SKILL.md +23 -32
  345. package/library/skills/vfx-magic-glow/resource.yaml +1 -1
  346. package/library/skills/vfx-muzzle-flash/SKILL.md +20 -35
  347. package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
  348. package/library/skills/vfx-smoke/SKILL.md +13 -31
  349. package/library/skills/vfx-smoke/resource.yaml +1 -1
  350. package/library/skills/vfx-water-ripple/SKILL.md +12 -31
  351. package/library/skills/vfx-water-ripple/resource.yaml +1 -1
  352. package/library/skills/voice-line/SKILL.md +71 -40
  353. package/library/skills/voice-line/resource.yaml +1 -1
  354. package/library/skills/web-and-touch-input/SKILL.md +1 -1
  355. package/library/skills/web-and-touch-input/resource.yaml +1 -1
  356. package/library/skills/web-compatibility-look/SKILL.md +1 -1
  357. package/library/skills/web-compatibility-look/resource.yaml +1 -1
  358. package/library/skills/world-building-3d/SKILL.md +1 -1
  359. package/library/skills/world-building-3d/resource.yaml +1 -1
  360. package/library/skills/writing-skills/resource.yaml +1 -0
  361. package/library/tools/add-node/GUIDE.md +14 -0
  362. package/library/tools/align-distribute-3d/GUIDE.md +7 -0
  363. package/library/tools/app-call/resource.yaml +59 -0
  364. package/library/tools/app-create/resource.yaml +67 -0
  365. package/library/tools/app-data/resource.yaml +74 -0
  366. package/library/tools/app-dock/resource.yaml +59 -0
  367. package/library/tools/app-events/resource.yaml +68 -0
  368. package/library/tools/app-get/resource.yaml +46 -0
  369. package/library/tools/app-guide/resource.yaml +55 -0
  370. package/library/tools/app-list/resource.yaml +48 -0
  371. package/library/tools/app-page/resource.yaml +74 -0
  372. package/library/tools/app-publish/resource.yaml +90 -0
  373. package/library/tools/app-report-gap/resource.yaml +58 -0
  374. package/library/tools/app-screenshot/resource.yaml +103 -0
  375. package/library/tools/app-tools/resource.yaml +46 -0
  376. package/library/tools/app-update/resource.yaml +68 -0
  377. package/library/tools/attach-to-surface/GUIDE.md +15 -0
  378. package/library/tools/batch/GUIDE.md +27 -0
  379. package/library/tools/camera-bookmark/GUIDE.md +12 -0
  380. package/library/tools/capture-gameplay/GUIDE.md +3 -0
  381. package/library/tools/capture-gameplay/resource.yaml +3 -3
  382. package/library/tools/check-job/resource.yaml +1 -1
  383. package/library/tools/clear-console/GUIDE.md +3 -0
  384. package/library/tools/connect-ports/GUIDE.md +9 -0
  385. package/library/tools/connect-signal/GUIDE.md +14 -0
  386. package/library/tools/create-debug-report/GUIDE.md +10 -0
  387. package/library/tools/create-scene/GUIDE.md +10 -0
  388. package/library/tools/debug-views/GUIDE.md +7 -0
  389. package/library/tools/enable-plugin/GUIDE.md +3 -0
  390. package/library/tools/enable-plugin/resource.yaml +53 -0
  391. package/library/tools/export-game/GUIDE.md +3 -0
  392. package/library/tools/export-game/resource.yaml +3 -3
  393. package/library/tools/export-templates/GUIDE.md +3 -0
  394. package/library/tools/fabricate-3d/GUIDE.md +19 -0
  395. package/library/tools/frame-nodes/GUIDE.md +9 -0
  396. package/library/tools/frame-shot/GUIDE.md +9 -0
  397. package/library/tools/game-control/GUIDE.md +9 -0
  398. package/library/tools/game-input/GUIDE.md +9 -0
  399. package/library/tools/game-probe/GUIDE.md +9 -0
  400. package/library/tools/generate-3d/resource.yaml +3 -3
  401. package/library/tools/generate-motion/resource.yaml +2 -2
  402. package/library/tools/get-console/GUIDE.md +9 -0
  403. package/library/tools/get-console/resource.yaml +5 -0
  404. package/library/tools/get-debugger-errors/GUIDE.md +7 -0
  405. package/library/tools/get-debugger-errors/resource.yaml +5 -0
  406. package/library/tools/get-debugger-warnings/GUIDE.md +7 -0
  407. package/library/tools/get-debugger-warnings/resource.yaml +5 -0
  408. package/library/tools/get-diagnostics/GUIDE.md +13 -0
  409. package/library/tools/get-project-context/GUIDE.md +25 -0
  410. package/library/tools/get-runtime-tree/GUIDE.md +7 -0
  411. package/library/tools/get-runtime-tree/resource.yaml +5 -0
  412. package/library/tools/get-scene-tree/GUIDE.md +11 -0
  413. package/library/tools/get-scene-tree/resource.yaml +5 -0
  414. package/library/tools/get-script-errors/GUIDE.md +5 -0
  415. package/library/tools/grep/GUIDE.md +11 -0
  416. package/library/tools/import-asset/GUIDE.md +8 -0
  417. package/library/tools/import-asset-by-id/GUIDE.md +12 -0
  418. package/library/tools/import-from-url/GUIDE.md +10 -0
  419. package/library/tools/import-from-url-batch/GUIDE.md +3 -0
  420. package/library/tools/import-hdri/GUIDE.md +16 -0
  421. package/library/tools/input-map-bind/GUIDE.md +11 -0
  422. package/library/tools/inspect-asset/GUIDE.md +14 -0
  423. package/library/tools/inspect-asset/resource.yaml +5 -0
  424. package/library/tools/inspect-node/GUIDE.md +11 -0
  425. package/library/tools/inspect-node/resource.yaml +5 -0
  426. package/library/tools/inspect-resource/GUIDE.md +7 -0
  427. package/library/tools/inspect-resource/resource.yaml +5 -0
  428. package/library/tools/inspect-runtime-node/GUIDE.md +7 -0
  429. package/library/tools/inspect-runtime-node/resource.yaml +5 -0
  430. package/library/tools/instantiate-scene/GUIDE.md +12 -0
  431. package/library/tools/is-running/GUIDE.md +3 -0
  432. package/library/tools/measure/GUIDE.md +8 -0
  433. package/library/tools/navigation-probe/GUIDE.md +9 -0
  434. package/library/tools/open/resource.yaml +2 -2
  435. package/library/tools/open-main-scene/GUIDE.md +6 -0
  436. package/library/tools/open-scene/GUIDE.md +8 -0
  437. package/library/tools/place-adjacent/GUIDE.md +7 -0
  438. package/library/tools/play/GUIDE.md +13 -0
  439. package/library/tools/project-setting/GUIDE.md +9 -0
  440. package/library/tools/publish-build/resource.yaml +6 -6
  441. package/library/tools/raycast/GUIDE.md +7 -0
  442. package/library/tools/read-file/GUIDE.md +10 -0
  443. package/library/tools/read-library/resource.yaml +5 -0
  444. package/library/tools/recent-events/GUIDE.md +7 -0
  445. package/library/tools/remove-node/GUIDE.md +3 -0
  446. package/library/tools/repeat-along/GUIDE.md +5 -0
  447. package/library/tools/replace-node/GUIDE.md +9 -0
  448. package/library/tools/replace-text/GUIDE.md +5 -0
  449. package/library/tools/run-editor-script/GUIDE.md +16 -0
  450. package/library/tools/run-script/GUIDE.md +30 -0
  451. package/library/tools/run-script/resource.yaml +6 -3
  452. package/library/tools/runtime-animate/GUIDE.md +7 -0
  453. package/library/tools/runtime-call/GUIDE.md +7 -0
  454. package/library/tools/runtime-set/GUIDE.md +9 -0
  455. package/library/tools/runtime-spawn/GUIDE.md +9 -0
  456. package/library/tools/save-scene/GUIDE.md +3 -0
  457. package/library/tools/scene-audit/GUIDE.md +29 -0
  458. package/library/tools/screenshot/GUIDE.md +17 -0
  459. package/library/tools/select-node/GUIDE.md +3 -0
  460. package/library/tools/set-prop/GUIDE.md +23 -0
  461. package/library/tools/set-resource-property/GUIDE.md +8 -0
  462. package/library/tools/shot-sheet/GUIDE.md +7 -0
  463. package/library/tools/snap-to-surface/GUIDE.md +17 -0
  464. package/library/tools/snapshot-diff/GUIDE.md +7 -0
  465. package/library/tools/starcast/GUIDE.md +12 -0
  466. package/library/tools/stop/GUIDE.md +3 -0
  467. package/library/tools/test-placement/GUIDE.md +7 -0
  468. package/library/tools/ui-actions/GUIDE.md +12 -0
  469. package/library/tools/ui-activate/GUIDE.md +11 -0
  470. package/library/tools/ui-screenshot/GUIDE.md +9 -0
  471. package/library/tools/ui-tree/GUIDE.md +10 -0
  472. package/library/tools/wait-for-event/GUIDE.md +11 -0
  473. package/library/tools/world-snapshot/GUIDE.md +9 -0
  474. package/library/tools/write-file/GUIDE.md +5 -0
  475. package/library/tools/zoom/GUIDE.md +5 -0
  476. package/package.json +6 -4
  477. package/registry/generated/aliases.json +15 -0
  478. package/registry/generated/counts.json +3 -3
  479. package/registry/generated/gemini-extension.json +6 -12
  480. package/registry/generated/index.json +1155 -408
  481. package/registry/generated/marketplace.claude.json +2 -13
  482. package/registry/generated/plugin.claude.json +25 -22
  483. package/registry/generated/plugin.codex.json +8 -14
  484. package/registry/generated/plugin.cursor.json +7 -13
  485. package/registry/generated/plugin.factory.json +7 -13
  486. package/registry/generated/server.json +34 -0
  487. package/registry/generated/skills-index.md +126 -116
  488. package/registry/generated/skills-registry.json +178 -113
  489. package/registry/operations/fixtures/invalid-deprecated-without-replacement.json +60 -0
  490. package/registry/operations/fixtures/invalid-name.json +60 -0
  491. package/registry/operations/fixtures/invalid-publish-without-owner.json +82 -0
  492. package/registry/operations/fixtures/invalid-spend-without-estimate.json +42 -0
  493. package/registry/operations/fixtures/invalid-unknown-field.json +61 -0
  494. package/registry/operations/fixtures/valid-player-facing.json +82 -0
  495. package/registry/operations/fixtures/valid-read.json +60 -0
  496. package/registry/operations/fixtures/valid-spend.json +43 -0
  497. package/registry/operations/legacy-names.json +1206 -0
  498. package/registry/schemas/allowed-hosts.json +4 -2
  499. package/registry/schemas/operation.schema.json +318 -0
  500. package/registry/schemas/skill.schema.json +4 -0
  501. package/CLAUDE.md +0 -7
@@ -0,0 +1,142 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { PACKAGE_ROOT } from "../package-root.js";
4
+ /**
5
+ * The Summer operation catalog, the part this package needs (contract 1).
6
+ * Every Summer operation has one name (`area.action`), one effect, one
7
+ * approval rule and one answer shape; the MCP surface, the CLI and the
8
+ * store profiles are views of it. The machine contract is
9
+ * registry/schemas/operation.schema.json; old 3.x tool names map to
10
+ * operations in registry/operations/legacy-names.json.
11
+ *
12
+ * Engine and local operations run in this package. Cloud operations run on
13
+ * the hosted Summer server; this package reaches them through its v4
14
+ * surface (summer_search, summer_call) with the person's sign-in.
15
+ */
16
+ export const CONTRACT_VERSION = 1;
17
+ export const EFFECTS = ["read", "write", "spend", "publish", "player_facing", "destructive"];
18
+ export const MIN_APPROVAL = {
19
+ read: "none",
20
+ write: "none",
21
+ spend: "none",
22
+ publish: "owner",
23
+ player_facing: "owner",
24
+ destructive: "confirm",
25
+ };
26
+ export function errorAnswer(code, message, options = {}) {
27
+ return {
28
+ ok: false,
29
+ error: {
30
+ code,
31
+ message,
32
+ ...(options.next ? { next: options.next } : {}),
33
+ retry: options.retry ?? (code === "rate_limited" || code === "unavailable" || code === "in_progress" ? "after" : code === "engine_not_running" ? "safe" : code === "outcome_unknown" ? "same_key" : "no"),
34
+ ...(options.details ? { details: options.details } : {}),
35
+ },
36
+ };
37
+ }
38
+ // ── Names ────────────────────────────────────────────────────────────────────
39
+ export const OP_NAME = /^(whoami|[a-z][a-z0-9_]*\.[a-z][a-z0-9_]*)$/;
40
+ /** `games.list` -> `summer_games_list`. */
41
+ export function mcpNameOf(op) {
42
+ return `summer_${op.replace(/\./g, "_")}`;
43
+ }
44
+ /** `assets generate-image` -> `assets.generate_image`; `whoami` stays. */
45
+ export function opFromCli(area, action) {
46
+ const clean = (part) => part.trim().toLowerCase().replace(/-/g, "_");
47
+ return action ? `${clean(area)}.${clean(action)}` : clean(area);
48
+ }
49
+ let legacyCache = null;
50
+ /** registry/operations/legacy-names.json: every 3.x tool name (and `#action`) to its operation. */
51
+ export function legacyNames() {
52
+ if (legacyCache)
53
+ return legacyCache;
54
+ try {
55
+ const parsed = JSON.parse(readFileSync(join(PACKAGE_ROOT, "registry", "operations", "legacy-names.json"), "utf8"));
56
+ legacyCache = parsed.names ?? {};
57
+ }
58
+ catch {
59
+ legacyCache = {};
60
+ }
61
+ return legacyCache;
62
+ }
63
+ /** A 3.x name as its operation name; an operation name unchanged. */
64
+ export function resolveOpName(name) {
65
+ const trimmed = name.trim();
66
+ return legacyNames()[trimmed]?.op ?? trimmed;
67
+ }
68
+ /**
69
+ * Operations that run in this package: everything in `engine`, the library
70
+ * (`docs`, apart from the Studio workflows, which are cloud), opening a
71
+ * page or an editor surface, docking an App in the editor, and uploading a
72
+ * local export. Everything else runs on the hosted server.
73
+ */
74
+ const LOCAL_OPS = new Set(["docs.search", "docs.read", "docs.feedback", "docs.plan", "docs.engine_api", "studio.open", "apps.dock", "apps.publish_folder", "store.upload_file"]);
75
+ /**
76
+ * Local operations a 3.x tool runs although legacy-names.json maps that
77
+ * tool to a cloud operation: the local-only input is its own operation
78
+ * (apps.publish_folder reads a folder on disk; apps.publish takes files).
79
+ */
80
+ export const LOCAL_RUNNERS = { "apps.publish_folder": "summer_app_publish" };
81
+ export function isLocalOp(op) {
82
+ return op.startsWith("engine.") || LOCAL_OPS.has(op);
83
+ }
84
+ /**
85
+ * The local 3.x tools that run an operation here, first choice first: the
86
+ * tool the op was renamed from before the tools merged into it.
87
+ */
88
+ export function localToolsFor(op) {
89
+ if (LOCAL_RUNNERS[op])
90
+ return [LOCAL_RUNNERS[op]];
91
+ const rank = (row) => (row.kind === "merge" ? 1 : 0);
92
+ return Object.entries(legacyNames())
93
+ .filter(([name, row]) => row.op === op && !name.includes("#"))
94
+ .sort(([, a], [, b]) => rank(a) - rank(b))
95
+ .map(([name]) => name);
96
+ }
97
+ // ── Job ids ──────────────────────────────────────────────────────────────────
98
+ const JOB_KINDS = new Set(["gen", "op", "apr", "plan", "build", "upload", "engine"]);
99
+ /** `<kind>:<backend id>`; an id without a known kind is a 3.x generation job. */
100
+ export function parseJobId(id) {
101
+ const trimmed = id.trim();
102
+ if (!/^[A-Za-z0-9._~:-]{1,260}$/.test(trimmed))
103
+ return null;
104
+ const [head, ...rest] = trimmed.split(":");
105
+ return JOB_KINDS.has(head) && rest.length > 0 && rest.every(Boolean) ? { kind: head, parts: rest } : { kind: "gen", parts: [trimmed] };
106
+ }
107
+ // ── Telemetry ────────────────────────────────────────────────────────────────
108
+ const AREA_TOOL = /^summer_([a-z]+)_([a-z][a-z0-9_]*)$/;
109
+ /**
110
+ * The operation a tool call ran, for usage telemetry: summer_call's `op`,
111
+ * summer_search's own op, a 3.x name's op, or a v4 tool's op from its name
112
+ * (areas are single words, so the first underscore after `summer_` is the dot).
113
+ */
114
+ export function opForToolCall(tool, args) {
115
+ if (tool === "summer_call") {
116
+ const call = args && typeof args === "object" ? args : {};
117
+ if (typeof call.op !== "string")
118
+ return null;
119
+ const name = call.op.trim();
120
+ // A mixed 3.x tool: the action in its input picks the operation; an engine operation's own tool name is the operation.
121
+ const input = call.input && typeof call.input === "object" ? call.input : {};
122
+ const action = typeof input.action === "string" ? input.action : typeof input.mode === "string" ? input.mode : null;
123
+ const resolved = (action ? legacyNames()[`${name}#${action}`]?.op : undefined) ??
124
+ (name.startsWith("summer_engine_") ? `engine.${name.slice("summer_engine_".length)}` : resolveOpName(name));
125
+ return OP_NAME.test(resolved) ? resolved : null;
126
+ }
127
+ if (tool === "summer_search")
128
+ return "ops.search";
129
+ if (tool === "summer_whoami")
130
+ return "whoami";
131
+ // A split 3.x tool: its action (or mode) argument picks the operation.
132
+ const record = args && typeof args === "object" ? args : {};
133
+ const action = typeof record.action === "string" ? record.action : typeof record.mode === "string" ? record.mode : null;
134
+ const split = action ? legacyNames()[`${tool}#${action}`]?.op : undefined;
135
+ if (split)
136
+ return split;
137
+ const legacy = legacyNames()[tool]?.op;
138
+ if (legacy)
139
+ return legacy;
140
+ const match = tool.match(AREA_TOOL);
141
+ return match ? `${match[1]}.${match[2]}` : null;
142
+ }
@@ -0,0 +1,25 @@
1
+ import { type Answer, type NextStep } from "./contract.js";
2
+ /**
3
+ * A 3.x engine tool's result as the one answer shape (SPEC §5.2, §5.5).
4
+ * Success: `{ok, status: "done", result}` with the tool's own payload as
5
+ * the result. Failure: one stable code with one next step; the engine's
6
+ * structured failure (failure_reason, receipts) travels whole in
7
+ * `details.tool`, so nothing the 3.x result said is lost.
8
+ */
9
+ export declare const ENGINE_NOT_RUNNING_STEP: NextStep;
10
+ export declare function engineNotRunning(): Answer;
11
+ /** The text blocks of a tool result: the first is its payload, the rest are notes (a tip, a caption). */
12
+ export declare function textsOf(result: unknown): string[];
13
+ /**
14
+ * Map a failed engine tool call. `guide` is the docs.read id with the tool's
15
+ * full guide and schema (tool/<slug>), the one next step for a bad input.
16
+ */
17
+ export declare function engineFailure(text: string, op: string, options: {
18
+ effect: "read" | "write";
19
+ guide?: string;
20
+ }): Answer;
21
+ /** A 3.x engine tool's whole result as the answer: its payload on success, the mapped failure otherwise. */
22
+ export declare function answerOfEngineResult(result: unknown, op: string, options: {
23
+ effect: "read" | "write";
24
+ guide?: string;
25
+ }): Answer;
@@ -0,0 +1,117 @@
1
+ import { errorAnswer } from "./contract.js";
2
+ /**
3
+ * A 3.x engine tool's result as the one answer shape (SPEC §5.2, §5.5).
4
+ * Success: `{ok, status: "done", result}` with the tool's own payload as
5
+ * the result. Failure: one stable code with one next step; the engine's
6
+ * structured failure (failure_reason, receipts) travels whole in
7
+ * `details.tool`, so nothing the 3.x result said is lost.
8
+ */
9
+ export const ENGINE_NOT_RUNNING_STEP = {
10
+ say: "Open the project in Summer Engine, or run: npx -y summer-engine@latest run <project-path>",
11
+ };
12
+ export function engineNotRunning() {
13
+ return errorAnswer("engine_not_running", "Summer Engine is not running, or no project is open.", { next: ENGINE_NOT_RUNNING_STEP });
14
+ }
15
+ /** The text blocks of a tool result: the first is its payload, the rest are notes (a tip, a caption). */
16
+ export function textsOf(result) {
17
+ const content = result && typeof result === "object" ? result.content : undefined;
18
+ return Array.isArray(content)
19
+ ? content.filter((part) => part?.type === "text" && typeof part.text === "string").map((part) => part.text)
20
+ : [];
21
+ }
22
+ function parsePayload(text) {
23
+ // A classified engine failure is JSON, sometimes followed by a plain "Hint:" paragraph.
24
+ const json = text.split(/\n\nHint: /)[0];
25
+ try {
26
+ return JSON.parse(json);
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ /** The 4.0 codes a 3.x result may already carry (`{ok:false, code}`, summer PR #139). */
33
+ const PASSED_CODES = new Set(["engine_not_running", "engine_lacks_op", "not_signed_in", "no_credits", "unavailable", "invalid_input", "not_found"]);
34
+ const NOT_RUNNING = /Summer Engine is not running|Summer Engine( instance \S+)? is not responding on port|No running Summer editor matches/;
35
+ /** Several editors run and none was picked for this session. */
36
+ const SEVERAL_EDITORS = /Multiple Summer editors are running/;
37
+ const SEVERAL_EDITORS_STEP = { say: "Several Summer editors are open: start the agent in the project folder, or run the MCP with --project <path>." };
38
+ const NO_PROJECT = /No project\.godot found/;
39
+ /** withEngine's transport recipe: the call failed between this package and the engine, mid-request. */
40
+ const TRANSPORT = /Recovery: \(1\) check the engine is running/;
41
+ function str(value) {
42
+ return typeof value === "string" && value.trim() ? value : undefined;
43
+ }
44
+ /** Where to read after a failure that may have changed something. */
45
+ function readAfter(op) {
46
+ if (op === "engine.write_file" || op === "engine.replace_text")
47
+ return { op: "engine.read_file" };
48
+ if (op.startsWith("engine.runtime_") || op.startsWith("engine.game_"))
49
+ return { op: "engine.game_probe" };
50
+ return { op: "engine.get_scene_tree" };
51
+ }
52
+ /**
53
+ * Map a failed engine tool call. `guide` is the docs.read id with the tool's
54
+ * full guide and schema (tool/<slug>), the one next step for a bad input.
55
+ */
56
+ export function engineFailure(text, op, options) {
57
+ const payload = parsePayload(text);
58
+ const body = payload && typeof payload === "object" && !Array.isArray(payload) ? payload : null;
59
+ // `error` is sometimes a code ("import_failed") and `message` the sentence.
60
+ const sentence = /^[a-z0-9_]+$/.test(str(body?.error) ?? "") ? (str(body?.message) ?? str(body?.error)) : (str(body?.error) ?? str(body?.message));
61
+ const message = (sentence ?? text.split("\n")[0] ?? "").slice(0, 500) || "The engine tool failed.";
62
+ const details = { tool: body ?? text };
63
+ const describe = options.guide ? { op: "docs.read", input: { id: options.guide } } : { op: "ops.describe", input: { name: op } };
64
+ const code = str(body?.code);
65
+ const reason = str(body?.failure_reason);
66
+ if (code === "engine_not_running" || NOT_RUNNING.test(text))
67
+ return engineNotRunning();
68
+ if (SEVERAL_EDITORS.test(text))
69
+ return errorAnswer("conflict", message, { next: SEVERAL_EDITORS_STEP, details });
70
+ if (NO_PROJECT.test(text))
71
+ return errorAnswer("not_found", message, { next: { say: "Name the folder that holds project.godot, or open the project in Summer Engine." }, details });
72
+ if (code === "engine_lacks_op" || reason === "engine_lacks_op" || reason === "engine_lacks_events" || /engine_lacks_op/.test(text)) {
73
+ return errorAnswer("engine_lacks_op", message, { next: { say: "Update Summer Engine." }, details });
74
+ }
75
+ if (code && PASSED_CODES.has(code))
76
+ return errorAnswer(code, message, { details, ...(code === "invalid_input" ? { next: describe } : {}) });
77
+ if (!body && TRANSPORT.test(text)) {
78
+ return options.effect === "read"
79
+ ? errorAnswer("unavailable", message, { retry: "safe", next: { op: "engine.get_project_context" }, details })
80
+ : errorAnswer("outcome_unknown", `${message} It may have partly applied: read before you retry.`, { retry: "no", next: readAfter(op), details });
81
+ }
82
+ switch (reason) {
83
+ case "invalid_input":
84
+ case "bad_args":
85
+ return errorAnswer("invalid_input", message, { next: describe, details });
86
+ case "unsupported_operation":
87
+ return errorAnswer("unsupported", message, { details });
88
+ case "identity_mismatch":
89
+ return errorAnswer("conflict", message, { next: { op: "engine.get_project_context" }, details });
90
+ case "busy":
91
+ return errorAnswer("in_progress", message, { retry: "after", details: { ...details, retryAfterSeconds: 5 } });
92
+ case "game_not_running":
93
+ return errorAnswer("not_found", message, { next: { op: "engine.play" }, details });
94
+ case "unknown_snapshot":
95
+ return errorAnswer("not_found", message, { next: { op: "engine.world_snapshot" }, details });
96
+ case "not_found":
97
+ return errorAnswer("not_found", message, { details });
98
+ }
99
+ if (/identity_mismatch|registry identity changed/i.test(text))
100
+ return errorAnswer("conflict", message, { next: { op: "engine.get_project_context" }, details });
101
+ if (/^[a-z_]*not_found$/.test(str(body?.error) ?? ""))
102
+ return errorAnswer("not_found", message, { details });
103
+ if (/no scene (is currently )?open|no edited scene/i.test(text))
104
+ return errorAnswer("not_found", message, { next: { op: "engine.open_main_scene" }, details });
105
+ if (/not found|does not exist|no such/i.test(message))
106
+ return errorAnswer("not_found", message, { details });
107
+ return errorAnswer("invalid_input", message, { next: describe, details });
108
+ }
109
+ /** A 3.x engine tool's whole result as the answer: its payload on success, the mapped failure otherwise. */
110
+ export function answerOfEngineResult(result, op, options) {
111
+ const [first = "", ...notes] = textsOf(result);
112
+ if (result && typeof result === "object" && result.isError === true) {
113
+ return engineFailure([first, ...notes].join("\n\n"), op, options);
114
+ }
115
+ const payload = parsePayload(first) ?? (first ? { text: first } : {});
116
+ return { ok: true, status: "done", result: payload, ...(notes.length ? { warnings: notes } : {}) };
117
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * The `engine` area of the operation catalog: every operation that runs in
3
+ * Summer Engine on the person's computer. The 3.x tools stay the
4
+ * implementation and keep their MCP names (summer_set_prop is
5
+ * engine.set_prop); their input schemas stay in
6
+ * library/tools/<slug>/resource.yaml. This file adds what the catalog needs
7
+ * on top: a title, a short summary (what it does, what it returns, the next
8
+ * operation), the effect, and one real example.
9
+ *
10
+ * The long how-to text of each 3.x description lives in
11
+ * library/tools/<slug>/GUIDE.md (docs.read tool/<slug>), so a summary stays
12
+ * at or under 300 characters.
13
+ *
14
+ * Effects follow the 3.x annotations: a tool that only reads or renders
15
+ * evidence is `read` (render baselines and audit notes under res://.summer/
16
+ * do not change the game); everything else is `write`. Scene edits are
17
+ * undoable and checkpointed, so no engine operation is `destructive`, and
18
+ * none needs an approval.
19
+ *
20
+ * Two 3.x tools mixed a read with a change; their operations are split here
21
+ * (SPEC §3.1 rule 5) and run the same tool with its action fixed:
22
+ * summer_camera_bookmark (list, save, delete) and summer_ui_actions (list,
23
+ * invoke).
24
+ */
25
+ export interface EngineOpDef {
26
+ title: string;
27
+ summary: string;
28
+ effect: "read" | "write";
29
+ example: {
30
+ input: Record<string, unknown>;
31
+ note: string;
32
+ };
33
+ /** Needs the Summer sign-in (imports from the Summer library). */
34
+ auth?: "account";
35
+ }
36
+ /** An operation cut out of a mixed 3.x tool: that tool, with its action fixed and only these fields. */
37
+ export interface EngineSplitDef extends EngineOpDef {
38
+ tool: string;
39
+ fixed: Record<string, string>;
40
+ fields: readonly string[];
41
+ required?: readonly string[];
42
+ }
43
+ export declare const ENGINE_OPS: Readonly<Record<string, EngineOpDef>>;
44
+ export declare const ENGINE_SPLIT_OPS: Readonly<Record<string, EngineSplitDef>>;
45
+ /** The catalog fields of an engine operation, split or not; null for anything else. */
46
+ export declare function engineOpDef(op: string): EngineOpDef | EngineSplitDef | null;
47
+ export declare function isSplitOp(op: string): boolean;
48
+ /** A split operation's input as its 3.x tool takes it: only its fields, plus its fixed action. */
49
+ export declare function splitToolArgs(def: EngineSplitDef, input: Record<string, unknown>): Record<string, unknown>;
50
+ /** A split operation's input JSON Schema, cut from its 3.x tool's schema. */
51
+ export declare function splitInputSchema(def: EngineSplitDef, toolSchema: Record<string, unknown> | null): Record<string, unknown>;
52
+ /** Every operation a summary names (`engine.snapshot_diff`, `docs.read`). */
53
+ export declare function opsNamedIn(text: string): string[];
54
+ /** A summary with each operation it names written as the tool that runs it in this view. */
55
+ export declare function renderOpRefs(text: string, toolOf: (op: string) => string | undefined): string;