summer-engine 3.8.0 → 4.2.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 (527) hide show
  1. package/.claude-plugin/marketplace.json +2 -13
  2. package/.claude-plugin/plugin.json +24 -22
  3. package/.codex-plugin/plugin.json +18 -22
  4. package/.cursor-plugin/plugin.json +8 -14
  5. package/.factory-plugin/plugin.json +6 -13
  6. package/AGENTS.md +19 -12
  7. package/CHANGELOG.md +133 -0
  8. package/GEMINI.md +3 -3
  9. package/README.md +118 -37
  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/config.js +3 -2
  15. package/dist/cli/commands/create.js +12 -3
  16. package/dist/cli/commands/list.d.ts +5 -0
  17. package/dist/cli/commands/list.js +30 -13
  18. package/dist/cli/commands/login.d.ts +27 -0
  19. package/dist/cli/commands/login.js +58 -12
  20. package/dist/cli/commands/memory.js +6 -2
  21. package/dist/cli/commands/ops.d.ts +64 -0
  22. package/dist/cli/commands/ops.js +329 -0
  23. package/dist/cli/commands/setup.d.ts +4 -0
  24. package/dist/cli/commands/setup.js +254 -26
  25. package/dist/cli/commands/skills.js +28 -11
  26. package/dist/cli/commands/status.d.ts +26 -0
  27. package/dist/cli/commands/status.js +36 -21
  28. package/dist/cli/index.js +7 -0
  29. package/dist/core/agent-host.d.ts +65 -0
  30. package/dist/core/agent-host.js +193 -0
  31. package/dist/core/capabilities/agent-playbook.d.ts +3 -0
  32. package/dist/core/capabilities/agent-playbook.js +54 -2
  33. package/dist/core/capabilities/apps.d.ts +33 -10
  34. package/dist/core/capabilities/apps.js +25 -12
  35. package/dist/core/capabilities/audit/args.d.ts +6 -6
  36. package/dist/core/capabilities/doctor.d.ts +3 -0
  37. package/dist/core/capabilities/doctor.js +20 -15
  38. package/dist/core/capabilities/fabricate-mesh.d.ts +4 -4
  39. package/dist/core/capabilities/game-task-plan.d.ts +12 -6
  40. package/dist/core/capabilities/game-task-plan.js +80 -5
  41. package/dist/core/capabilities/hdri-import.d.ts +2 -2
  42. package/dist/core/capabilities/motion-generation.d.ts +2 -2
  43. package/dist/core/capabilities/motion-generation.js +2 -2
  44. package/dist/core/capabilities/navigation/open.d.ts +6 -2
  45. package/dist/core/capabilities/navigation/open.js +3 -0
  46. package/dist/core/capabilities/placement.d.ts +23 -23
  47. package/dist/core/capabilities/publish-build.js +2 -0
  48. package/dist/core/capabilities/runtime-control.d.ts +42 -42
  49. package/dist/core/capabilities/scene-script-target.d.ts +17 -0
  50. package/dist/core/capabilities/scene-script-target.js +70 -0
  51. package/dist/core/capabilities/seeing/args.d.ts +16 -16
  52. package/dist/core/capabilities/sfx-choices.d.ts +4 -0
  53. package/dist/core/capabilities/sfx-choices.js +13 -6
  54. package/dist/core/capabilities/tool-dispatch.d.ts +12 -3
  55. package/dist/core/capabilities/tool-dispatch.js +81 -46
  56. package/dist/core/capabilities/ui-control.d.ts +2 -2
  57. package/dist/core/capabilities/world-snapshot.d.ts +4 -4
  58. package/dist/core/embeddings.d.ts +2 -0
  59. package/dist/core/embeddings.js +1 -1
  60. package/dist/core/error-codes.d.ts +62 -0
  61. package/dist/core/error-codes.js +97 -0
  62. package/dist/core/format.d.ts +2 -0
  63. package/dist/core/format.js +2 -1
  64. package/dist/core/hosted-mcp.d.ts +22 -0
  65. package/dist/core/hosted-mcp.js +56 -1
  66. package/dist/core/library-read.js +5 -0
  67. package/dist/core/library-search.d.ts +2 -2
  68. package/dist/core/library-search.js +2 -1
  69. package/dist/core/oauth.js +4 -0
  70. package/dist/core/ops/areas.d.ts +11 -0
  71. package/dist/core/ops/areas.js +24 -0
  72. package/dist/core/ops/catalog.d.ts +45 -0
  73. package/dist/core/ops/catalog.js +157 -0
  74. package/dist/core/ops/cloud.d.ts +64 -0
  75. package/dist/core/ops/cloud.js +198 -0
  76. package/dist/core/ops/contract.d.ts +120 -0
  77. package/dist/core/ops/contract.js +134 -0
  78. package/dist/core/ops/engine-answer.d.ts +25 -0
  79. package/dist/core/ops/engine-answer.js +117 -0
  80. package/dist/core/ops/engine.d.ts +55 -0
  81. package/dist/core/ops/engine.js +649 -0
  82. package/dist/core/ops/public-catalog.d.ts +48 -0
  83. package/dist/core/ops/public-catalog.js +56 -0
  84. package/dist/core/ops/save-files.d.ts +78 -0
  85. package/dist/core/ops/save-files.js +419 -0
  86. package/dist/core/ops/search.d.ts +8 -0
  87. package/dist/core/ops/search.js +187 -0
  88. package/dist/core/skills-registry.d.ts +16 -1
  89. package/dist/core/skills-registry.js +35 -2
  90. package/dist/core/telemetry.d.ts +32 -0
  91. package/dist/core/telemetry.js +38 -10
  92. package/dist/core/tool-profiles.d.ts +25 -0
  93. package/dist/core/tool-profiles.js +41 -0
  94. package/dist/installer/agent-config.d.ts +17 -4
  95. package/dist/installer/agent-config.js +27 -6
  96. package/dist/installer/agent-table.d.ts +12 -0
  97. package/dist/installer/agent-table.js +33 -9
  98. package/dist/installer/cli-permissions.d.ts +65 -0
  99. package/dist/installer/cli-permissions.js +182 -0
  100. package/dist/installer/setup.d.ts +4 -0
  101. package/dist/installer/setup.js +12 -4
  102. package/dist/installer/skills-refresh.d.ts +29 -0
  103. package/dist/installer/skills-refresh.js +261 -0
  104. package/dist/installer/version-check.d.ts +51 -11
  105. package/dist/installer/version-check.js +147 -37
  106. package/dist/mcp/command.js +7 -0
  107. package/dist/mcp/hosted-mount.d.ts +27 -2
  108. package/dist/mcp/hosted-mount.js +53 -23
  109. package/dist/mcp/legacy-toolset.d.ts +27 -0
  110. package/dist/mcp/legacy-toolset.js +43 -0
  111. package/dist/mcp/ops-surface.d.ts +59 -0
  112. package/dist/mcp/ops-surface.js +453 -0
  113. package/dist/mcp/server.d.ts +45 -11
  114. package/dist/mcp/server.js +263 -89
  115. package/dist/mcp/tool-results.d.ts +26 -0
  116. package/dist/mcp/tool-results.js +81 -0
  117. package/dist/mcp/tool-surface.d.ts +65 -0
  118. package/dist/mcp/tool-surface.js +317 -0
  119. package/dist/mcp/tools/app-tools.js +9 -2
  120. package/dist/mcp/tools/asset-tools.js +55 -53
  121. package/dist/mcp/tools/audit-tools.js +21 -21
  122. package/dist/mcp/tools/debug-tools.js +6 -6
  123. package/dist/mcp/tools/fabricate-tools.js +6 -6
  124. package/dist/mcp/tools/generate-tools.js +76 -70
  125. package/dist/mcp/tools/project-tools.d.ts +9 -4
  126. package/dist/mcp/tools/project-tools.js +16 -10
  127. package/dist/mcp/tools/scene-tools.js +12 -23
  128. package/dist/mcp/tools/script-tools.js +9 -5
  129. package/dist/mcp/tools/with-engine.d.ts +6 -0
  130. package/dist/mcp/tools/with-engine.js +19 -0
  131. package/dist/project-memory/agent-instructions.d.ts +47 -0
  132. package/dist/project-memory/agent-instructions.js +226 -0
  133. package/gemini-extension.json +6 -13
  134. package/hooks/pre-commit-doctor.sh +5 -4
  135. package/hooks/session-start.sh +24 -28
  136. package/integrations/README.md +1 -1
  137. package/integrations/claude/README.md +6 -0
  138. package/integrations/claude/manifest-target.json +4 -0
  139. package/integrations/claude-desktop/README.md +1 -1
  140. package/integrations/copilot-jetbrains/README.md +1 -1
  141. package/integrations/gemini/README.md +11 -0
  142. package/integrations/junie/README.md +1 -1
  143. package/integrations/lm-studio/README.md +1 -1
  144. package/integrations/trae/README.md +1 -1
  145. package/integrations/visual-studio/README.md +1 -1
  146. package/integrations/windsurf/README.md +1 -1
  147. package/library/references/mcp-tools-reference/mcp-tools-reference.md +79 -51
  148. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  149. package/library/references/product-map/resource.yaml +2 -2
  150. package/library/skills/3d-lighting/SKILL.md +69 -28
  151. package/library/skills/3d-lighting/resource.yaml +1 -1
  152. package/library/skills/README.md +121 -118
  153. package/library/skills/adaptive-music/SKILL.md +40 -23
  154. package/library/skills/adaptive-music/resource.yaml +1 -1
  155. package/library/skills/agent-playtesting/SKILL.md +23 -1
  156. package/library/skills/agent-playtesting/resource.yaml +1 -1
  157. package/library/skills/ai-characters-in-games/SKILL.md +16 -1
  158. package/library/skills/ai-characters-in-games/resource.yaml +1 -1
  159. package/library/skills/ambient-bed/SKILL.md +38 -13
  160. package/library/skills/ambient-bed/resource.yaml +1 -1
  161. package/library/skills/animated-loop/SKILL.md +60 -32
  162. package/library/skills/animated-loop/resource.yaml +1 -1
  163. package/library/skills/animation-tree/SKILL.md +27 -1
  164. package/library/skills/animation-tree/resource.yaml +1 -1
  165. package/library/skills/art-direction/SKILL.md +17 -3
  166. package/library/skills/art-direction/resource.yaml +1 -1
  167. package/library/skills/asset-strategy/SKILL.md +51 -4
  168. package/library/skills/asset-strategy/resource.yaml +2 -1
  169. package/library/skills/audio-direction/SKILL.md +26 -10
  170. package/library/skills/audio-direction/resource.yaml +1 -1
  171. package/library/skills/auto-fire-targeting/SKILL.md +15 -1
  172. package/library/skills/auto-fire-targeting/resource.yaml +1 -1
  173. package/library/skills/bounded-engine-runs/SKILL.md +1 -1
  174. package/library/skills/bounded-engine-runs/resource.yaml +1 -1
  175. package/library/skills/brainstorm-game/SKILL.md +14 -1
  176. package/library/skills/brainstorm-game/resource.yaml +1 -1
  177. package/library/skills/brainstorming/SKILL.md +1 -1
  178. package/library/skills/brainstorming/resource.yaml +1 -1
  179. package/library/skills/browse-templates/SKILL.md +11 -1
  180. package/library/skills/browse-templates/resource.yaml +1 -1
  181. package/library/skills/camera-rigs/SKILL.md +22 -2
  182. package/library/skills/camera-rigs/resource.yaml +1 -1
  183. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -0
  184. package/library/skills/character-animation-wiring/SKILL.md +28 -4
  185. package/library/skills/character-animation-wiring/resource.yaml +1 -1
  186. package/library/skills/character-model/SKILL.md +83 -47
  187. package/library/skills/character-model/resource.yaml +1 -1
  188. package/library/skills/character-movement/SKILL.md +27 -3
  189. package/library/skills/character-movement/resource.yaml +1 -1
  190. package/library/skills/character-portrait/SKILL.md +39 -19
  191. package/library/skills/character-portrait/resource.yaml +1 -1
  192. package/library/skills/cinematic-cutscene/SKILL.md +79 -46
  193. package/library/skills/cinematic-cutscene/resource.yaml +1 -1
  194. package/library/skills/combat-basics/SKILL.md +20 -1
  195. package/library/skills/combat-basics/resource.yaml +1 -1
  196. package/library/skills/compatibility-renderer-traps/SKILL.md +12 -1
  197. package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
  198. package/library/skills/concept-art/SKILL.md +29 -12
  199. package/library/skills/concept-art/resource.yaml +1 -1
  200. package/library/skills/concept-to-level/SKILL.md +258 -0
  201. package/library/skills/concept-to-level/references/technical-rules.md +150 -0
  202. package/library/skills/concept-to-level/resource.yaml +44 -0
  203. package/library/skills/create-asset-sheet/SKILL.md +37 -13
  204. package/library/skills/create-asset-sheet/resource.yaml +1 -1
  205. package/library/skills/debug/SKILL.md +34 -2
  206. package/library/skills/debug/resource.yaml +1 -1
  207. package/library/skills/debugging-game-feel/SKILL.md +13 -1
  208. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  209. package/library/skills/design-level/SKILL.md +40 -35
  210. package/library/skills/design-level/resource.yaml +1 -1
  211. package/library/skills/design-mechanic/SKILL.md +18 -1
  212. package/library/skills/design-mechanic/resource.yaml +1 -1
  213. package/library/skills/design-npc/SKILL.md +43 -24
  214. package/library/skills/design-npc/resource.yaml +1 -1
  215. package/library/skills/diagnosing-perf-regressions/SKILL.md +13 -1
  216. package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
  217. package/library/skills/driving-the-editor-ui/SKILL.md +24 -1
  218. package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
  219. package/library/skills/environment-kit/SKILL.md +43 -16
  220. package/library/skills/environment-kit/resource.yaml +1 -1
  221. package/library/skills/export-and-ship/SKILL.md +29 -6
  222. package/library/skills/export-and-ship/resource.yaml +1 -1
  223. package/library/skills/fabricating-assets/SKILL.md +30 -7
  224. package/library/skills/fabricating-assets/resource.yaml +3 -3
  225. package/library/skills/facial-and-lipsync/SKILL.md +36 -15
  226. package/library/skills/facial-and-lipsync/resource.yaml +1 -1
  227. package/library/skills/fps-controller/SKILL.md +50 -41
  228. package/library/skills/fps-controller/resource.yaml +1 -1
  229. package/library/skills/game-feel/SKILL.md +34 -8
  230. package/library/skills/game-feel/resource.yaml +1 -1
  231. package/library/skills/gameskill/SKILL.md +15 -4
  232. package/library/skills/gameskill/resource.yaml +1 -1
  233. package/library/skills/gdscript-patterns/SKILL.md +16 -1
  234. package/library/skills/gdscript-patterns/resource.yaml +1 -1
  235. package/library/skills/generate-motion/SKILL.md +51 -21
  236. package/library/skills/generate-motion/resource.yaml +1 -1
  237. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +18 -1
  238. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
  239. package/library/skills/grow-analytics/SKILL.md +13 -3
  240. package/library/skills/grow-analytics/resource.yaml +1 -1
  241. package/library/skills/headless-scripting/SKILL.md +14 -1
  242. package/library/skills/headless-scripting/resource.yaml +1 -1
  243. package/library/skills/in-game-purchases/SKILL.md +12 -1
  244. package/library/skills/in-game-purchases/resource.yaml +1 -1
  245. package/library/skills/instantiate-asset-pack/SKILL.md +19 -2
  246. package/library/skills/instantiate-asset-pack/resource.yaml +1 -1
  247. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +1 -0
  248. package/library/skills/make-game/SKILL.md +33 -4
  249. package/library/skills/make-game/references/2d-platformer.md +1 -1
  250. package/library/skills/make-game/references/3d-fps.md +1 -1
  251. package/library/skills/make-game/references/3d-horror.md +1 -1
  252. package/library/skills/make-game/references/3d-third-person.md +2 -2
  253. package/library/skills/make-game/resource.yaml +1 -1
  254. package/library/skills/multiplayer/SKILL.md +13 -1
  255. package/library/skills/multiplayer/resource.yaml +1 -1
  256. package/library/skills/multiplayer-movement/SKILL.md +19 -1
  257. package/library/skills/multiplayer-movement/resource.yaml +1 -1
  258. package/library/skills/multiplayer-project/SKILL.md +18 -1
  259. package/library/skills/multiplayer-project/resource.yaml +1 -1
  260. package/library/skills/multiplayer-publish/SKILL.md +25 -7
  261. package/library/skills/multiplayer-publish/resource.yaml +3 -3
  262. package/library/skills/multiplayer-state/SKILL.md +17 -1
  263. package/library/skills/multiplayer-state/resource.yaml +1 -1
  264. package/library/skills/multiplayer-testing/SKILL.md +16 -1
  265. package/library/skills/multiplayer-testing/resource.yaml +1 -1
  266. package/library/skills/music-track/SKILL.md +38 -13
  267. package/library/skills/music-track/resource.yaml +1 -1
  268. package/library/skills/navigate-summer/SKILL.md +26 -9
  269. package/library/skills/navigate-summer/resource.yaml +1 -1
  270. package/library/skills/new-project/SKILL.md +12 -1
  271. package/library/skills/new-project/resource.yaml +1 -1
  272. package/library/skills/organic-model/SKILL.md +48 -18
  273. package/library/skills/organic-model/resource.yaml +1 -1
  274. package/library/skills/pixel-art/SKILL.md +42 -23
  275. package/library/skills/pixel-art/resource.yaml +1 -1
  276. package/library/skills/play/SKILL.md +19 -1
  277. package/library/skills/play/resource.yaml +1 -1
  278. package/library/skills/playtesting-a-feature/SKILL.md +24 -1
  279. package/library/skills/playtesting-a-feature/resource.yaml +1 -1
  280. package/library/skills/procedural-animation/SKILL.md +38 -16
  281. package/library/skills/procedural-animation/resource.yaml +1 -1
  282. package/library/skills/prop-model/SKILL.md +48 -19
  283. package/library/skills/prop-model/resource.yaml +1 -1
  284. package/library/skills/psx-retro-rendering/resource.yaml +1 -0
  285. package/library/skills/publish-your-game/SKILL.md +43 -6
  286. package/library/skills/publish-your-game/resource.yaml +3 -3
  287. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -0
  288. package/library/skills/release-readiness/SKILL.md +13 -1
  289. package/library/skills/release-readiness/resource.yaml +1 -1
  290. package/library/skills/remote-deploy/SKILL.md +15 -1
  291. package/library/skills/remote-deploy/resource.yaml +1 -1
  292. package/library/skills/retarget/SKILL.md +43 -20
  293. package/library/skills/retarget/resource.yaml +1 -1
  294. package/library/skills/running-in-the-cloud/SKILL.md +11 -1
  295. package/library/skills/running-in-the-cloud/resource.yaml +1 -1
  296. package/library/skills/save-load/SKILL.md +16 -1
  297. package/library/skills/save-load/resource.yaml +1 -1
  298. package/library/skills/scene-composition/SKILL.md +18 -1
  299. package/library/skills/scene-composition/resource.yaml +1 -1
  300. package/library/skills/scene-hierarchy-design/SKILL.md +26 -2
  301. package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
  302. package/library/skills/scene-scripting/SKILL.md +96 -636
  303. package/library/skills/scene-scripting/references/ctx-api.md +184 -0
  304. package/library/skills/scene-scripting/references/recipes-2d-ui.md +193 -0
  305. package/library/skills/scene-scripting/references/recipes-3d.md +280 -0
  306. package/library/skills/scene-scripting/resource.yaml +4 -4
  307. package/library/skills/scene-to-level/SKILL.md +24 -2
  308. package/library/skills/scene-to-level/resource.yaml +1 -1
  309. package/library/skills/skill-create/resource.yaml +1 -0
  310. package/library/skills/skill-improve/resource.yaml +1 -0
  311. package/library/skills/skill-test/SKILL.md +12 -2
  312. package/library/skills/skill-test/resource.yaml +1 -0
  313. package/library/skills/skintokens-auto-rigging/resource.yaml +1 -0
  314. package/library/skills/skybox-panorama/SKILL.md +47 -21
  315. package/library/skills/skybox-panorama/resource.yaml +1 -1
  316. package/library/skills/sound-effect/SKILL.md +52 -20
  317. package/library/skills/sound-effect/resource.yaml +1 -1
  318. package/library/skills/spatial-placement/SKILL.md +44 -9
  319. package/library/skills/spatial-placement/resource.yaml +1 -1
  320. package/library/skills/sprite-sheet/SKILL.md +55 -27
  321. package/library/skills/sprite-sheet/resource.yaml +1 -1
  322. package/library/skills/store-art/SKILL.md +14 -3
  323. package/library/skills/store-art/resource.yaml +2 -2
  324. package/library/skills/store-listing/SKILL.md +13 -3
  325. package/library/skills/store-listing/resource.yaml +2 -2
  326. package/library/skills/summer-analytics/SKILL.md +22 -5
  327. package/library/skills/summer-analytics/resource.yaml +2 -2
  328. package/library/skills/summer-apps/SKILL.md +77 -32
  329. package/library/skills/summer-apps/manifest.md +1 -1
  330. package/library/skills/summer-apps/minimal-app.md +7 -7
  331. package/library/skills/summer-apps/resource.yaml +1 -1
  332. package/library/skills/summer-apps/sdk-reference.md +5 -5
  333. package/library/skills/summer-apps-design/SKILL.md +1 -1
  334. package/library/skills/summer-apps-design/resource.yaml +1 -1
  335. package/library/skills/summer-assets/SKILL.md +86 -0
  336. package/library/skills/summer-assets/resource.yaml +34 -0
  337. package/library/skills/summer-cli/SKILL.md +133 -0
  338. package/library/skills/summer-cli/resource.yaml +31 -0
  339. package/library/skills/summer-friends/SKILL.md +14 -0
  340. package/library/skills/summer-leaderboards/SKILL.md +16 -0
  341. package/library/skills/summer-match-results/SKILL.md +17 -0
  342. package/library/skills/summer-matchmaking/SKILL.md +17 -0
  343. package/library/skills/summer-parties/SKILL.md +14 -0
  344. package/library/skills/summer-player-data/SKILL.md +14 -0
  345. package/library/skills/summer-store/SKILL.md +16 -1
  346. package/library/skills/summer-world-chat/SKILL.md +14 -0
  347. package/library/skills/summer-world-saves/SKILL.md +14 -0
  348. package/library/skills/text-to-motion/SKILL.md +45 -23
  349. package/library/skills/text-to-motion/prompts-and-controls.md +5 -5
  350. package/library/skills/text-to-motion/resource.yaml +1 -1
  351. package/library/skills/text-to-motion/rigging-for-text-motion.md +2 -2
  352. package/library/skills/tileable-texture/SKILL.md +37 -15
  353. package/library/skills/tileable-texture/resource.yaml +1 -1
  354. package/library/skills/trailer-shot/SKILL.md +46 -24
  355. package/library/skills/trailer-shot/resource.yaml +1 -1
  356. package/library/skills/tune-performance/SKILL.md +32 -6
  357. package/library/skills/tune-performance/resource.yaml +1 -1
  358. package/library/skills/ui-basics/SKILL.md +55 -36
  359. package/library/skills/ui-basics/resource.yaml +1 -1
  360. package/library/skills/ui-graphics/SKILL.md +64 -38
  361. package/library/skills/ui-graphics/resource.yaml +1 -1
  362. package/library/skills/use-widget-asset/SKILL.md +15 -1
  363. package/library/skills/use-widget-asset/resource.yaml +1 -1
  364. package/library/skills/using-summer/SKILL.md +32 -5
  365. package/library/skills/using-summer/resource.yaml +3 -2
  366. package/library/skills/vehicle-model/SKILL.md +92 -57
  367. package/library/skills/vehicle-model/resource.yaml +1 -1
  368. package/library/skills/verification-before-completion/SKILL.md +1 -1
  369. package/library/skills/verification-before-completion/resource.yaml +1 -1
  370. package/library/skills/verifying-scenes/SKILL.md +31 -2
  371. package/library/skills/verifying-scenes/resource.yaml +1 -1
  372. package/library/skills/vfx-dissolve/SKILL.md +21 -2
  373. package/library/skills/vfx-dissolve/resource.yaml +1 -1
  374. package/library/skills/vfx-fire/SKILL.md +41 -41
  375. package/library/skills/vfx-fire/resource.yaml +1 -1
  376. package/library/skills/vfx-hit-spark/SKILL.md +24 -1
  377. package/library/skills/vfx-hit-spark/resource.yaml +1 -1
  378. package/library/skills/vfx-lightning/SKILL.md +30 -16
  379. package/library/skills/vfx-lightning/resource.yaml +1 -1
  380. package/library/skills/vfx-magic-glow/SKILL.md +46 -32
  381. package/library/skills/vfx-magic-glow/resource.yaml +1 -1
  382. package/library/skills/vfx-muzzle-flash/SKILL.md +43 -35
  383. package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
  384. package/library/skills/vfx-smoke/SKILL.md +39 -31
  385. package/library/skills/vfx-smoke/resource.yaml +1 -1
  386. package/library/skills/vfx-water-ripple/SKILL.md +35 -31
  387. package/library/skills/vfx-water-ripple/resource.yaml +1 -1
  388. package/library/skills/voice-line/SKILL.md +87 -40
  389. package/library/skills/voice-line/resource.yaml +1 -1
  390. package/library/skills/web-and-touch-input/SKILL.md +20 -1
  391. package/library/skills/web-and-touch-input/resource.yaml +1 -1
  392. package/library/skills/web-compatibility-look/SKILL.md +21 -1
  393. package/library/skills/web-compatibility-look/resource.yaml +1 -1
  394. package/library/skills/world-building-3d/SKILL.md +29 -1
  395. package/library/skills/world-building-3d/resource.yaml +1 -1
  396. package/library/skills/writing-skills/resource.yaml +1 -0
  397. package/library/tools/add-node/GUIDE.md +14 -0
  398. package/library/tools/align-distribute-3d/GUIDE.md +7 -0
  399. package/library/tools/app-call/resource.yaml +1 -1
  400. package/library/tools/app-guide/resource.yaml +2 -2
  401. package/library/tools/app-page/resource.yaml +1 -1
  402. package/library/tools/app-screenshot/resource.yaml +19 -1
  403. package/library/tools/app-tools/resource.yaml +1 -1
  404. package/library/tools/attach-to-surface/GUIDE.md +15 -0
  405. package/library/tools/batch/GUIDE.md +27 -0
  406. package/library/tools/camera-bookmark/GUIDE.md +12 -0
  407. package/library/tools/capture-gameplay/GUIDE.md +3 -0
  408. package/library/tools/capture-gameplay/resource.yaml +3 -3
  409. package/library/tools/check-job/resource.yaml +1 -1
  410. package/library/tools/clear-console/GUIDE.md +3 -0
  411. package/library/tools/connect-ports/GUIDE.md +9 -0
  412. package/library/tools/connect-signal/GUIDE.md +14 -0
  413. package/library/tools/create-debug-report/GUIDE.md +10 -0
  414. package/library/tools/create-scene/GUIDE.md +10 -0
  415. package/library/tools/debug-views/GUIDE.md +7 -0
  416. package/library/tools/enable-plugin/GUIDE.md +3 -0
  417. package/library/tools/export-game/GUIDE.md +3 -0
  418. package/library/tools/export-game/resource.yaml +3 -3
  419. package/library/tools/export-templates/GUIDE.md +3 -0
  420. package/library/tools/fabricate-3d/GUIDE.md +19 -0
  421. package/library/tools/frame-nodes/GUIDE.md +9 -0
  422. package/library/tools/frame-shot/GUIDE.md +9 -0
  423. package/library/tools/game-control/GUIDE.md +9 -0
  424. package/library/tools/game-input/GUIDE.md +9 -0
  425. package/library/tools/game-probe/GUIDE.md +9 -0
  426. package/library/tools/generate-3d/resource.yaml +3 -3
  427. package/library/tools/generate-motion/resource.yaml +2 -2
  428. package/library/tools/get-console/GUIDE.md +9 -0
  429. package/library/tools/get-console/resource.yaml +5 -0
  430. package/library/tools/get-debugger-errors/GUIDE.md +7 -0
  431. package/library/tools/get-debugger-errors/resource.yaml +5 -0
  432. package/library/tools/get-debugger-warnings/GUIDE.md +7 -0
  433. package/library/tools/get-debugger-warnings/resource.yaml +5 -0
  434. package/library/tools/get-diagnostics/GUIDE.md +13 -0
  435. package/library/tools/get-project-context/GUIDE.md +25 -0
  436. package/library/tools/get-runtime-tree/GUIDE.md +7 -0
  437. package/library/tools/get-runtime-tree/resource.yaml +5 -0
  438. package/library/tools/get-scene-tree/GUIDE.md +11 -0
  439. package/library/tools/get-scene-tree/resource.yaml +5 -0
  440. package/library/tools/get-script-errors/GUIDE.md +5 -0
  441. package/library/tools/grep/GUIDE.md +11 -0
  442. package/library/tools/import-asset/GUIDE.md +8 -0
  443. package/library/tools/import-asset-by-id/GUIDE.md +12 -0
  444. package/library/tools/import-from-url/GUIDE.md +10 -0
  445. package/library/tools/import-from-url-batch/GUIDE.md +3 -0
  446. package/library/tools/import-hdri/GUIDE.md +16 -0
  447. package/library/tools/input-map-bind/GUIDE.md +11 -0
  448. package/library/tools/inspect-asset/GUIDE.md +14 -0
  449. package/library/tools/inspect-asset/resource.yaml +5 -0
  450. package/library/tools/inspect-node/GUIDE.md +11 -0
  451. package/library/tools/inspect-node/resource.yaml +5 -0
  452. package/library/tools/inspect-resource/GUIDE.md +7 -0
  453. package/library/tools/inspect-resource/resource.yaml +5 -0
  454. package/library/tools/inspect-runtime-node/GUIDE.md +7 -0
  455. package/library/tools/inspect-runtime-node/resource.yaml +5 -0
  456. package/library/tools/instantiate-scene/GUIDE.md +12 -0
  457. package/library/tools/is-running/GUIDE.md +3 -0
  458. package/library/tools/measure/GUIDE.md +8 -0
  459. package/library/tools/navigation-probe/GUIDE.md +9 -0
  460. package/library/tools/open/resource.yaml +2 -2
  461. package/library/tools/open-main-scene/GUIDE.md +6 -0
  462. package/library/tools/open-scene/GUIDE.md +8 -0
  463. package/library/tools/place-adjacent/GUIDE.md +7 -0
  464. package/library/tools/play/GUIDE.md +13 -0
  465. package/library/tools/project-setting/GUIDE.md +9 -0
  466. package/library/tools/publish-build/resource.yaml +6 -6
  467. package/library/tools/raycast/GUIDE.md +7 -0
  468. package/library/tools/read-file/GUIDE.md +10 -0
  469. package/library/tools/read-library/resource.yaml +5 -0
  470. package/library/tools/recent-events/GUIDE.md +7 -0
  471. package/library/tools/remove-node/GUIDE.md +3 -0
  472. package/library/tools/repeat-along/GUIDE.md +5 -0
  473. package/library/tools/replace-node/GUIDE.md +9 -0
  474. package/library/tools/replace-text/GUIDE.md +5 -0
  475. package/library/tools/run-editor-script/GUIDE.md +16 -0
  476. package/library/tools/run-script/GUIDE.md +30 -0
  477. package/library/tools/run-script/resource.yaml +6 -3
  478. package/library/tools/runtime-animate/GUIDE.md +7 -0
  479. package/library/tools/runtime-call/GUIDE.md +7 -0
  480. package/library/tools/runtime-set/GUIDE.md +9 -0
  481. package/library/tools/runtime-spawn/GUIDE.md +9 -0
  482. package/library/tools/save-scene/GUIDE.md +3 -0
  483. package/library/tools/scene-audit/GUIDE.md +29 -0
  484. package/library/tools/screenshot/GUIDE.md +17 -0
  485. package/library/tools/select-node/GUIDE.md +3 -0
  486. package/library/tools/set-prop/GUIDE.md +23 -0
  487. package/library/tools/set-resource-property/GUIDE.md +8 -0
  488. package/library/tools/shot-sheet/GUIDE.md +7 -0
  489. package/library/tools/snap-to-surface/GUIDE.md +17 -0
  490. package/library/tools/snapshot-diff/GUIDE.md +7 -0
  491. package/library/tools/starcast/GUIDE.md +12 -0
  492. package/library/tools/stop/GUIDE.md +3 -0
  493. package/library/tools/test-placement/GUIDE.md +7 -0
  494. package/library/tools/ui-actions/GUIDE.md +12 -0
  495. package/library/tools/ui-activate/GUIDE.md +11 -0
  496. package/library/tools/ui-screenshot/GUIDE.md +9 -0
  497. package/library/tools/ui-tree/GUIDE.md +10 -0
  498. package/library/tools/wait-for-event/GUIDE.md +11 -0
  499. package/library/tools/world-snapshot/GUIDE.md +9 -0
  500. package/library/tools/write-file/GUIDE.md +5 -0
  501. package/library/tools/zoom/GUIDE.md +5 -0
  502. package/package.json +8 -5
  503. package/registry/generated/counts.json +2 -2
  504. package/registry/generated/gemini-extension.json +6 -13
  505. package/registry/generated/index.json +482 -349
  506. package/registry/generated/marketplace.claude.json +2 -13
  507. package/registry/generated/plugin.claude-directory.json +168 -0
  508. package/registry/generated/plugin.claude.json +24 -22
  509. package/registry/generated/plugin.codex.json +18 -22
  510. package/registry/generated/plugin.cursor.json +8 -14
  511. package/registry/generated/plugin.factory.json +6 -13
  512. package/registry/generated/server.json +43 -0
  513. package/registry/generated/skills-index.md +121 -118
  514. package/registry/generated/skills-registry.json +167 -115
  515. package/registry/operations/fixtures/invalid-deprecated-without-replacement.json +60 -0
  516. package/registry/operations/fixtures/invalid-name.json +60 -0
  517. package/registry/operations/fixtures/invalid-publish-without-owner.json +82 -0
  518. package/registry/operations/fixtures/invalid-spend-without-estimate.json +42 -0
  519. package/registry/operations/fixtures/invalid-unknown-field.json +61 -0
  520. package/registry/operations/fixtures/valid-player-facing.json +82 -0
  521. package/registry/operations/fixtures/valid-read.json +60 -0
  522. package/registry/operations/fixtures/valid-spend.json +43 -0
  523. package/registry/operations/legacy-names.json +1241 -0
  524. package/registry/operations/public-catalog.json +33160 -0
  525. package/registry/schemas/operation.schema.json +318 -0
  526. package/registry/schemas/skill.schema.json +4 -0
  527. package/CLAUDE.md +0 -7
@@ -20,6 +20,7 @@ import { tmpdir } from "node:os";
20
20
  import { join } from "node:path";
21
21
  import { mkdir, mkdtemp, writeFile } from "node:fs/promises";
22
22
  import { EngineApiClient } from "../api-client.js";
23
+ import { CLI_RECOVERY, codedFailure, codeForStatus, describeNetworkError, engineNotRunningFromConnectError, networkDetails, NOT_SIGNED_IN, } from "../error-codes.js";
23
24
  import { missingEngineEventsResult, missingEngineOpResult, } from "../capability-skew.js";
24
25
  import { buildAgentPlaybook } from "./agent-playbook.js";
25
26
  import { recentEvents, recentEventsArgsSchema, waitForEvent, waitForEventArgsSchema, } from "./events.js";
@@ -35,7 +36,8 @@ import { ImportHdriError, importHdriArgsSchema, importPolyHavenHdri } from "./hd
35
36
  import { FABRICATE_FALLBACK, buildFabricateMeshOp, fabricateArgsSchema } from "./fabricate-mesh.js";
36
37
  import { buildUiActionsOp, buildUiActivateOp, buildUiScreenshotOp, buildUiTreeOp, executeUiOp, uiActionsArgsSchema, uiActivateArgsSchema, uiScreenshotArgsSchema, uiScreenshotCaption, uiScreenshotImage, uiTreeArgsSchema, withUiFailureDetails, } from "./ui-control.js";
37
38
  import { PLAY_INSTANCE_FALLBACK, RUNTIME_FALLBACKS, buildGameControlOp, buildGameInputOp, buildGameProbeOp, buildRuntimeAnimateOp, buildRuntimeCallOp, buildRuntimeSetOp, buildRuntimeSpawnOp, buildStopGameOp, findProbePayload, gameControlArgsSchema, gameInputArgsSchema, gameProbeArgsSchema, playGame, probeFrameStamp, runtimeAnimateArgsSchema, runtimeCallArgsSchema, runtimeSetArgsSchema, runtimeSpawnArgsSchema, stripProbeImage, withRuntimeFailureHints, } from "./runtime-control.js";
38
- import { RUN_EDITOR_SCRIPT_FALLBACK, RUN_SCRIPT_FALLBACK, buildRunEditorScriptOp, buildRunSceneScriptOp, } from "./scene-script.js";
39
+ import { RUN_EDITOR_SCRIPT_FALLBACK, RUN_SCRIPT_FALLBACK, buildRunEditorScriptOp, } from "./scene-script.js";
40
+ import { runSceneScriptOn } from "./scene-script-target.js";
39
41
  import { CAMERA_BOOKMARK_ACTIONS, CAMERA_BOOKMARK_FALLBACK, SCREENSHOT_FRAMINGS, buildCameraBookmarkOp, buildScenePreviewInput, } from "./camera-view.js";
40
42
  import { PLAY_DETERMINISM_NOT_SUPPORTED, pickPlayDeterminism, readPlayDeterminism } from "./play-determinism.js";
41
43
  import { debugViews, frameNodes, frameShot, rememberBookmarkRender, shotSheet, slotPolicy, zoom, } from "./seeing/seeing.js";
@@ -75,15 +77,12 @@ import { PLACEMENT_FIELDS, SCENE_MUTATION_OPS, SCENE_QUERY_OPS, instantiateScene
75
77
  import { attachToSurface, attachToSurfaceArgsSchema, connectPorts, connectPortsArgsSchema, inspectAsset, inspectAssetArgsSchema, measure, measureArgsSchema, placeAdjacent, placeAdjacentArgsSchema, raycast, raycastArgsSchema, repeatAlong, repeatAlongArgsSchema, } from "./placement.js";
76
78
  import { readLibraryEntry, readLibraryInputSchema } from "../library-read.js";
77
79
  import { runSearchLibrary, searchLibraryInputSchema } from "../library-search.js";
78
- import { TOOLKIT_VERSION as CLI_VERSION } from "../version.js";
80
+ import { runWithToolContext, summerRequestHeaders } from "../agent-host.js";
79
81
  import { APP_DOCK_FALLBACK, appCall, appCallArgsSchema, appCreate, appCreateArgsSchema, appData, appDataArgsSchema, appDockArgsSchema, appDockOp, appEvents, appEventsArgsSchema, appGet, appGetArgsSchema, appGuide, appGuideArgsSchema, appList, appListArgsSchema, appPage, appPageArgsSchema, appScreenshot, appScreenshotArgsSchema, appUpdate, appUpdateArgsSchema, appPublish, appPublishArgsSchema, appReportGap, appReportGapArgsSchema, appsGateway, appTools, appToolsArgsSchema, } from "./apps.js";
80
82
  import { enablePluginArgsSchema, enablePluginOp, interpretEnablePluginResult } from "./enable-plugin.js";
81
83
  /** Dispatch-level failure with a user-facing message (no stack needed). */
82
84
  export class ToolDispatchError extends Error {
83
85
  }
84
- /** The local engine is not reachable — a clean state, not a crash. */
85
- export class EngineUnavailableError extends ToolDispatchError {
86
- }
87
86
  /** A tool failed with a structured receipt that `summer tool` prints whole
88
87
  * (JSON on stdout, exit 1) instead of flattening to `message`: every engine
89
88
  * envelope extractOpError reads as a failure (the same gate the MCP face
@@ -98,6 +97,23 @@ export class ToolResultError extends ToolDispatchError {
98
97
  this.result = result;
99
98
  }
100
99
  }
100
+ /** A shared failure (core/error-codes.ts) — not signed in, no credits,
101
+ * network — printed as `{ok:false, code, error, recovery}` with the shell
102
+ * wording of the next step. */
103
+ export class CodedToolError extends ToolResultError {
104
+ constructor(code, message, extra = {}, recovery = CLI_RECOVERY[code]) {
105
+ super(codedFailure(code, message, extra, recovery), message);
106
+ }
107
+ }
108
+ /** The local engine is not reachable — a clean state, not a crash. Prints
109
+ * `{ok:false, code:"engine_not_running", error, recovery, hint}`. */
110
+ export class EngineUnavailableError extends CodedToolError {
111
+ constructor(message) {
112
+ super("engine_not_running", message, {
113
+ hint: "Engine-free tools (generate-*, asset search/list/get, library search/read, plan) work without it.",
114
+ });
115
+ }
116
+ }
101
117
  export function createDefaultDispatchContext() {
102
118
  let cached = null;
103
119
  return {
@@ -110,10 +126,12 @@ export function createDefaultDispatchContext() {
110
126
  }
111
127
  catch (error) {
112
128
  const reason = error instanceof Error ? error.message : String(error);
113
- throw new EngineUnavailableError("Summer Engine is not running (or no project is open).\n" +
114
- `${reason}\n` +
115
- "Start it with 'summer run' or open the project in the Summer desktop app, then retry.\n" +
116
- "Engine-free tools (generate-*, asset search/list/get, creator, plan) work without it.");
129
+ // Several editors open (or another selection problem) already says
130
+ // how to pick one; only "nothing reachable" is engine_not_running.
131
+ const notRunning = engineNotRunningFromConnectError(reason);
132
+ if (!notRunning)
133
+ throw new ToolDispatchError(reason);
134
+ throw new EngineUnavailableError(notRunning.message);
117
135
  }
118
136
  },
119
137
  };
@@ -265,17 +283,24 @@ async function dispatchUiOp(ctx, built) {
265
283
  // ---------------------------------------------------------------------------
266
284
  async function requireToken() {
267
285
  const token = await getAuthToken();
268
- if (!token) {
269
- throw new ToolDispatchError("Not signed in. Run 'summer login' first — these tools require a Summer Engine account.");
270
- }
286
+ if (!token)
287
+ throw new CodedToolError("not_signed_in", NOT_SIGNED_IN);
271
288
  return token;
272
289
  }
290
+ /** A non-OK Summer web reply: 401 and 402 carry the shared codes. */
291
+ function gatewayFailure(status, data) {
292
+ const message = String(data.message || data.error || `Request failed (${status})`);
293
+ const code = codeForStatus(status);
294
+ if (code === "not_signed_in")
295
+ return new CodedToolError(code, message, { status }, "Run: summer login --force");
296
+ if (code)
297
+ return new CodedToolError(code, message, { status });
298
+ return new ToolDispatchError(message);
299
+ }
273
300
  function gatewayHeaders(token, endpoint) {
274
301
  return {
302
+ ...summerRequestHeaders({ surface: "cli" }),
275
303
  Authorization: `Bearer ${token}`,
276
- "X-Summer-Client": "summer-cli",
277
- "X-Summer-Client-Version": CLI_VERSION,
278
- "X-Summer-Client-Surface": "cli",
279
304
  "X-Summer-MCP-Endpoint": endpoint,
280
305
  };
281
306
  }
@@ -305,12 +330,11 @@ async function gatewayGet(endpoint, params, timeoutMs = 30_000) {
305
330
  });
306
331
  }
307
332
  catch (err) {
308
- throw new ToolDispatchError(`Request failed: ${err instanceof Error ? err.message : String(err)}`);
333
+ throw new CodedToolError("unavailable", `Request failed: ${describeNetworkError(err)}`, networkDetails(err));
309
334
  }
310
335
  const data = await readJsonBody(res);
311
- if (!res.ok) {
312
- throw new ToolDispatchError(String(data.message || data.error || `Request failed (${res.status})`));
313
- }
336
+ if (!res.ok)
337
+ throw gatewayFailure(res.status, data);
314
338
  return data;
315
339
  }
316
340
  async function gatewayPost(endpoint, body, timeoutMs = 120_000) {
@@ -329,19 +353,11 @@ async function gatewayPost(endpoint, body, timeoutMs = 120_000) {
329
353
  });
330
354
  }
331
355
  catch (err) {
332
- throw new ToolDispatchError(`Generation request failed: ${err instanceof Error ? err.message : String(err)}`);
356
+ throw new CodedToolError("unavailable", `Generation request failed: ${describeNetworkError(err)}`, networkDetails(err));
333
357
  }
334
358
  const data = await readJsonBody(res);
335
- if (!res.ok) {
336
- let message = String(data.message || data.error || `Request failed (${res.status})`);
337
- if (res.status === 402) {
338
- message = `${message} — insufficient credits; top up or upgrade on the Summer dashboard.`;
339
- }
340
- if (res.status === 401) {
341
- message = `${message} — auth token expired; run 'summer login' again.`;
342
- }
343
- throw new ToolDispatchError(message);
344
- }
359
+ if (!res.ok)
360
+ throw gatewayFailure(res.status, data);
345
361
  return data;
346
362
  }
347
363
  async function pollGenerationJob(jobId, maxWaitMs = 600_000, intervalMs = 5_000) {
@@ -350,14 +366,19 @@ async function pollGenerationJob(jobId, maxWaitMs = 600_000, intervalMs = 5_000)
350
366
  const deadline = Date.now() + maxWaitMs;
351
367
  let interval = intervalMs;
352
368
  while (Date.now() < deadline) {
353
- const res = await fetch(`${gatewayUrl}/api/mcp/jobs/${encodeURIComponent(jobId)}`, {
354
- headers: gatewayHeaders(token, "/api/mcp/jobs"),
355
- signal: AbortSignal.timeout(15_000),
356
- });
357
- const data = await readJsonBody(res);
358
- if (!res.ok) {
359
- throw new ToolDispatchError(String(data.message || "Job poll failed"));
369
+ let res;
370
+ try {
371
+ res = await fetch(`${gatewayUrl}/api/mcp/jobs/${encodeURIComponent(jobId)}`, {
372
+ headers: gatewayHeaders(token, "/api/mcp/jobs"),
373
+ signal: AbortSignal.timeout(15_000),
374
+ });
375
+ }
376
+ catch (err) {
377
+ throw new CodedToolError("unavailable", `Job poll failed: ${describeNetworkError(err)}`, { jobId, ...networkDetails(err) });
360
378
  }
379
+ const data = await readJsonBody(res);
380
+ if (!res.ok)
381
+ throw gatewayFailure(res.status, { message: "Job poll failed", ...data });
361
382
  if (data.status === "completed")
362
383
  return data;
363
384
  if (data.status === "failed") {
@@ -366,7 +387,15 @@ async function pollGenerationJob(jobId, maxWaitMs = 600_000, intervalMs = 5_000)
366
387
  await new Promise((resolve) => setTimeout(resolve, interval));
367
388
  interval = Math.min(interval * 1.2, 15_000);
368
389
  }
369
- throw new ToolDispatchError(`Timed out after ${maxWaitMs / 1000}s. Re-check later with: summer tool check-job --json '{"jobId":"${jobId}"}'`);
390
+ throw new ToolDispatchError(`Timed out after ${maxWaitMs / 1000}s. Re-check later with: ${cliCheckJobCommand(jobId)}`);
391
+ }
392
+ function cliCheckJobCommand(jobId) {
393
+ return `summer tool check-job --args '{"jobId":"${jobId}"}'`;
394
+ }
395
+ /** generate-3d / generate-motion return the job at once, like the MCP face;
396
+ * `--args '{"wait":true,…}'` blocks instead. */
397
+ function cliCheckJobNext(jobId) {
398
+ return `The job runs on Summer's servers. Check it with: ${cliCheckJobCommand(jobId)}`;
370
399
  }
371
400
  async function searchAssetsGateway(params) {
372
401
  const search = new URLSearchParams();
@@ -403,6 +432,10 @@ async function gatewayReply(call) {
403
432
  catch (error) {
404
433
  if (!(error instanceof ToolDispatchError))
405
434
  throw error;
435
+ if (error instanceof CodedToolError) {
436
+ const { code, recovery } = error.result;
437
+ return { error: error.message, status: 0, code, recovery };
438
+ }
406
439
  return { error: error.message, status: 0 };
407
440
  }
408
441
  }
@@ -978,8 +1011,8 @@ export const TOOL_DISPATCH = [
978
1011
  options,
979
1012
  });
980
1013
  const jobId = typeof result.jobId === "string" ? result.jobId : undefined;
981
- if (args.wait === false || !jobId)
982
- return result;
1014
+ if (args.wait !== true || !jobId)
1015
+ return jobId ? { ...result, next: cliCheckJobNext(jobId) } : result;
983
1016
  const final = await pollGenerationJob(jobId);
984
1017
  return { ...final, jobId };
985
1018
  }),
@@ -1000,7 +1033,7 @@ export const TOOL_DISPATCH = [
1000
1033
  const result = await gatewayPost("/api/mcp/generate/motion", built.body);
1001
1034
  const jobId = typeof result.jobId === "string" ? result.jobId : undefined;
1002
1035
  if (!parsed.wait || !jobId)
1003
- return result;
1036
+ return jobId ? { ...result, next: cliCheckJobNext(jobId) } : result;
1004
1037
  const final = await pollGenerationJob(jobId, 600_000);
1005
1038
  return { ...final, jobId };
1006
1039
  }),
@@ -1253,19 +1286,19 @@ export const TOOL_DISPATCH = [
1253
1286
  return runBatch(await ctx.engine(), { scenePath, ops, receipt });
1254
1287
  }),
1255
1288
  // --- scene scripting ---
1256
- entry("summer_run_script", "Run a GDScript func run(ctx) inside the live editor against the open scene", true, async (args, ctx) => {
1289
+ entry("summer_run_script", "Run a GDScript func run(ctx) inside the live editor against scenePath (or the open scene)", true, async (args, ctx) => {
1257
1290
  const client = await ctx.engine();
1258
1291
  const missing = missingEngineOpResult(client, "RunSceneScript", RUN_SCRIPT_FALLBACK);
1259
1292
  if (missing)
1260
1293
  refuseMissingOp(missing);
1261
1294
  const undo = optStr(args, "undo");
1262
- const { op, timeoutMs } = buildRunSceneScriptOp({
1295
+ return requireSupportedOp(await runSceneScriptOn(client, {
1296
+ scenePath: optStr(args, "scenePath"),
1263
1297
  source: str(args, "source"),
1264
1298
  max_seconds: typeof args.max_seconds === "number" ? args.max_seconds : undefined,
1265
1299
  checkpoint: typeof args.checkpoint === "boolean" ? args.checkpoint : undefined,
1266
1300
  undo: undo === "action" || undo === "none" ? undo : undefined,
1267
- });
1268
- return requireSupportedOp(await client.executeIdentityBoundOps([op], undefined, timeoutMs), "RunSceneScript", RUN_SCRIPT_FALLBACK);
1301
+ }), "RunSceneScript", RUN_SCRIPT_FALLBACK);
1269
1302
  }),
1270
1303
  entry("summer_run_editor_script", "Run an EditorScript in a fresh headless child editor against the on-disk project", true, async (args, ctx) => {
1271
1304
  const client = await ctx.engine();
@@ -1730,5 +1763,7 @@ export async function dispatchTool(nameOrSlug, args, ctx = createDefaultDispatch
1730
1763
  // The one gate every result passes, mirroring withEngine on the MCP face:
1731
1764
  // whatever the MCP face would mark isError is a ToolResultError here, so the
1732
1765
  // CLI exit code says what the receipt says — for every tool, not per handler.
1733
- return requireEngineSuccess(await dispatchEntry.handler(args, ctx));
1766
+ // Summer requests made for this call name the tool (core/agent-host.ts); the
1767
+ // MCP face sets the same context in its call wrapper.
1768
+ return requireEngineSuccess(await runWithToolContext(dispatchEntry.name, "cli", () => dispatchEntry.handler(args, ctx)));
1734
1769
  }
@@ -90,7 +90,7 @@ export declare const uiActivateArgsSchema: z.ZodObject<{
90
90
  value?: string | number | undefined;
91
91
  title?: string | undefined;
92
92
  path?: string | undefined;
93
- action?: "focus" | "press" | "toggle" | "select_tab" | "set_text" | "set_value" | "dismiss_dialog" | undefined;
93
+ action?: "focus" | "press" | "select_tab" | "toggle" | "set_text" | "set_value" | "dismiss_dialog" | undefined;
94
94
  button?: string | undefined;
95
95
  index?: number | undefined;
96
96
  submit?: boolean | undefined;
@@ -98,7 +98,7 @@ export declare const uiActivateArgsSchema: z.ZodObject<{
98
98
  value?: string | number | undefined;
99
99
  title?: string | undefined;
100
100
  path?: string | undefined;
101
- action?: "focus" | "press" | "toggle" | "select_tab" | "set_text" | "set_value" | "dismiss_dialog" | undefined;
101
+ action?: "focus" | "press" | "select_tab" | "toggle" | "set_text" | "set_value" | "dismiss_dialog" | undefined;
102
102
  button?: string | undefined;
103
103
  index?: number | undefined;
104
104
  submit?: boolean | undefined;
@@ -38,18 +38,18 @@ export declare const worldSnapshotInputSchema: z.ZodObject<{
38
38
  fields: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
39
39
  }, "strict", z.ZodTypeAny, {
40
40
  scene_path?: string | undefined;
41
+ fields?: string[] | undefined;
42
+ path_prefix?: string | undefined;
41
43
  offset?: number | undefined;
42
44
  max_nodes?: number | undefined;
43
- path_prefix?: string | undefined;
44
45
  classes?: string[] | undefined;
45
- fields?: string[] | undefined;
46
46
  }, {
47
47
  scene_path?: string | undefined;
48
+ fields?: string[] | undefined;
49
+ path_prefix?: string | undefined;
48
50
  offset?: number | undefined;
49
51
  max_nodes?: number | undefined;
50
- path_prefix?: string | undefined;
51
52
  classes?: string[] | undefined;
52
- fields?: string[] | undefined;
53
53
  }>;
54
54
  export type WorldSnapshotArgs = z.infer<typeof worldSnapshotInputSchema>;
55
55
  export declare function buildWorldSnapshotOp(args: WorldSnapshotArgs): JsonRecord;
@@ -47,6 +47,8 @@ export interface EmbedProviderOptions {
47
47
  token?: string | null;
48
48
  timeoutMs: number;
49
49
  fetchImpl?: typeof fetch;
50
+ /** Extra request headers (the runtime's client and agent-host headers). */
51
+ headers?: Record<string, string>;
50
52
  }
51
53
  export declare function encodeVector(vector: readonly number[]): string;
52
54
  export declare function decodeVector(encoded: string): Float32Array;
@@ -140,7 +140,7 @@ export function createEmbedProvider(options) {
140
140
  const controller = new AbortController();
141
141
  const timer = setTimeout(() => controller.abort(), options.timeoutMs);
142
142
  try {
143
- const headers = { "Content-Type": "application/json" };
143
+ const headers = { ...options.headers, "Content-Type": "application/json" };
144
144
  if (options.token)
145
145
  headers.Authorization = `Bearer ${options.token}`;
146
146
  const response = await fetchImpl(options.url, {
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Stable codes for the failures any Summer tool can hit before it does its
3
+ * job: the engine is not running, the person is not signed in, the account
4
+ * has no credits left, or the network failed. Agents branch on `code` and
5
+ * follow `recovery` (one next step); the older fields each tool returned
6
+ * (`error`, `message`, `hint`) stay next to them so 3.x callers keep working.
7
+ *
8
+ * The store sign-in keeps its own code, `store_login_required`
9
+ * (core/oauth.ts): it is a second grant with its own recovery
10
+ * (`summer login --store`).
11
+ *
12
+ * The codes are the ones the 4.0 tools use (one closed list, shared with the
13
+ * hosted Summer MCP), so 4.0 changes where they sit, not their names.
14
+ */
15
+ export type SummerErrorCode = "engine_not_running" | "not_signed_in" | "no_credits" | "unavailable";
16
+ export declare const SIGN_IN_COMMAND = "npx -y summer-engine@latest login";
17
+ export declare const CREDITS_URL = "https://summerengine.com/studio/credits";
18
+ /** The one sentence every tool uses when there is no Summer account token. */
19
+ export declare const NOT_SIGNED_IN = "Not signed in to Summer.";
20
+ /** A token the server refused (expired, revoked): plain `login` would say
21
+ * "Already logged in", so the step forces a new sign-in. */
22
+ export declare const SIGN_IN_AGAIN_RECOVERY = "Ask the person to sign in again: npx -y summer-engine@latest login --force";
23
+ /** The one next step per code, as the MCP face words it (the agent may not
24
+ * have `summer` on PATH, so commands go through npx). */
25
+ export declare const RECOVERY: Record<SummerErrorCode, string>;
26
+ /** The same steps for `summer tool` in a shell, where `summer` is the CLI. */
27
+ export declare const CLI_RECOVERY: Record<SummerErrorCode, string>;
28
+ export interface CodedFailure {
29
+ ok: false;
30
+ code: SummerErrorCode;
31
+ error: string;
32
+ recovery: string;
33
+ }
34
+ /** `{ok:false, code, error, recovery}` first, then any other fields the
35
+ * tool already returned (`message`, `hint`, `status`, …). The four named
36
+ * fields win over `extra`; `recovery` defaults to the MCP wording. */
37
+ export declare function codedFailure(code: SummerErrorCode, error: string, extra?: Record<string, unknown>, recovery?: string): CodedFailure & Record<string, unknown>;
38
+ /** The code for a failed Summer web request by HTTP status, when it is one
39
+ * of the shared ones. */
40
+ export declare function codeForStatus(status: number): SummerErrorCode | null;
41
+ /** The message for a failed request, with the real cause in it. */
42
+ export declare function describeNetworkError(error: unknown): string;
43
+ /** `details.cause` for an `unavailable` answer. */
44
+ export declare function networkDetails(error: unknown): {
45
+ details: {
46
+ cause: string;
47
+ };
48
+ };
49
+ /** The engine connect failure that means "nothing is running for this
50
+ * project", worded for the person; the raw reason (token files, instance
51
+ * registry paths) stays in the logs, not in the line the agent repeats. */
52
+ export declare class EngineNotRunningError extends Error {
53
+ readonly reason: string;
54
+ readonly code: "engine_not_running";
55
+ constructor(message: string, reason: string);
56
+ }
57
+ /** A connect error from core/engine.ts → EngineNotRunningError when it means
58
+ * no editor is reachable; null for the others (several editors open, …),
59
+ * which already say what to do. */
60
+ export declare function engineNotRunningFromConnectError(reason: string): EngineNotRunningError | null;
61
+ /** Engine-free tools keep working while the engine is down. */
62
+ export declare const ENGINE_FREE_NOTE: string;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Stable codes for the failures any Summer tool can hit before it does its
3
+ * job: the engine is not running, the person is not signed in, the account
4
+ * has no credits left, or the network failed. Agents branch on `code` and
5
+ * follow `recovery` (one next step); the older fields each tool returned
6
+ * (`error`, `message`, `hint`) stay next to them so 3.x callers keep working.
7
+ *
8
+ * The store sign-in keeps its own code, `store_login_required`
9
+ * (core/oauth.ts): it is a second grant with its own recovery
10
+ * (`summer login --store`).
11
+ *
12
+ * The codes are the ones the 4.0 tools use (one closed list, shared with the
13
+ * hosted Summer MCP), so 4.0 changes where they sit, not their names.
14
+ */
15
+ export const SIGN_IN_COMMAND = "npx -y summer-engine@latest login";
16
+ export const CREDITS_URL = "https://summerengine.com/studio/credits";
17
+ /** The one sentence every tool uses when there is no Summer account token. */
18
+ export const NOT_SIGNED_IN = "Not signed in to Summer.";
19
+ /** A token the server refused (expired, revoked): plain `login` would say
20
+ * "Already logged in", so the step forces a new sign-in. */
21
+ export const SIGN_IN_AGAIN_RECOVERY = `Ask the person to sign in again: ${SIGN_IN_COMMAND} --force`;
22
+ /** The one next step per code, as the MCP face words it (the agent may not
23
+ * have `summer` on PATH, so commands go through npx). */
24
+ export const RECOVERY = {
25
+ engine_not_running: "Open the project in Summer Engine, or run: npx -y summer-engine@latest run <project-path> (the folder that holds project.godot).",
26
+ not_signed_in: `Ask the person to sign in: ${SIGN_IN_COMMAND}`,
27
+ no_credits: `Ask the person to add credits: ${CREDITS_URL}`,
28
+ unavailable: "Check the network connection, then retry.",
29
+ };
30
+ /** The same steps for `summer tool` in a shell, where `summer` is the CLI. */
31
+ export const CLI_RECOVERY = {
32
+ ...RECOVERY,
33
+ engine_not_running: "Open the project in Summer Engine, or run: summer run <project-path> (the folder that holds project.godot).",
34
+ not_signed_in: "Run: summer login",
35
+ };
36
+ /** `{ok:false, code, error, recovery}` first, then any other fields the
37
+ * tool already returned (`message`, `hint`, `status`, …). The four named
38
+ * fields win over `extra`; `recovery` defaults to the MCP wording. */
39
+ export function codedFailure(code, error, extra = {}, recovery = RECOVERY[code]) {
40
+ const named = { ok: false, code, error, recovery };
41
+ return Object.assign({ ...named }, extra, named);
42
+ }
43
+ /** The code for a failed Summer web request by HTTP status, when it is one
44
+ * of the shared ones. */
45
+ export function codeForStatus(status) {
46
+ if (status === 401)
47
+ return "not_signed_in";
48
+ if (status === 402)
49
+ return "no_credits";
50
+ return null;
51
+ }
52
+ /** `fetch failed` says nothing; Node puts the real reason on `cause`
53
+ * (`connect ECONNREFUSED 127.0.0.1:443`, `getaddrinfo ENOTFOUND …`). */
54
+ function networkCause(error) {
55
+ const message = error instanceof Error ? error.message : String(error);
56
+ const cause = error instanceof Error ? error.cause : undefined;
57
+ return cause instanceof Error ? cause.message : typeof cause === "string" ? cause : message;
58
+ }
59
+ /** The message for a failed request, with the real cause in it. */
60
+ export function describeNetworkError(error) {
61
+ const message = error instanceof Error ? error.message : String(error);
62
+ const cause = networkCause(error);
63
+ return message.includes(cause) ? message : `${message} (${cause})`;
64
+ }
65
+ /** `details.cause` for an `unavailable` answer. */
66
+ export function networkDetails(error) {
67
+ return { details: { cause: networkCause(error) } };
68
+ }
69
+ /** The engine connect failure that means "nothing is running for this
70
+ * project", worded for the person; the raw reason (token files, instance
71
+ * registry paths) stays in the logs, not in the line the agent repeats. */
72
+ export class EngineNotRunningError extends Error {
73
+ reason;
74
+ code = "engine_not_running";
75
+ constructor(message, reason) {
76
+ super(message);
77
+ this.reason = reason;
78
+ this.name = "EngineNotRunningError";
79
+ }
80
+ }
81
+ /** A connect error from core/engine.ts → EngineNotRunningError when it means
82
+ * no editor is reachable; null for the others (several editors open, …),
83
+ * which already say what to do. */
84
+ export function engineNotRunningFromConnectError(reason) {
85
+ const port = reason.match(/not responding on port (\d+)/)?.[1];
86
+ if (port)
87
+ return new EngineNotRunningError(`Summer Engine is not responding on port ${port}.`, reason);
88
+ if (/^No running Summer editor matches/.test(reason)) {
89
+ return new EngineNotRunningError(reason.split(/(?<=\.)\s/)[0], reason);
90
+ }
91
+ if (/not running/i.test(reason))
92
+ return new EngineNotRunningError("Summer Engine is not running.", reason);
93
+ return null;
94
+ }
95
+ /** Engine-free tools keep working while the engine is down. */
96
+ export const ENGINE_FREE_NOTE = "Only tools that touch the local project need the engine. Library, generation and asset tools " +
97
+ "(summer_search_library, summer_generate_*, summer_search_assets, summer_list_my_assets, summer_get_asset, summer_check_job) work now.";
@@ -1,3 +1,5 @@
1
+ /** ANSI colour only for a terminal: NO_COLOR turns it off, FORCE_COLOR on. */
2
+ export declare function useColor(): boolean;
1
3
  export declare const c: {
2
4
  bold: (s: string) => string;
3
5
  dim: (s: string) => string;
@@ -10,7 +10,8 @@ const ANSI = {
10
10
  // Summer brand orange (matches banner.ts mid gradient)
11
11
  brand: "\x1b[38;2;255;143;23m",
12
12
  };
13
- function useColor() {
13
+ /** ANSI colour only for a terminal: NO_COLOR turns it off, FORCE_COLOR on. */
14
+ export function useColor() {
14
15
  if (process.env.NO_COLOR)
15
16
  return false;
16
17
  if (process.env.FORCE_COLOR)
@@ -1,4 +1,5 @@
1
1
  import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { OAuthError } from "./oauth.js";
2
3
  /** The part of an MCP client the mount and the CLI use (a fake in tests). */
3
4
  export interface HostedClient {
4
5
  listTools(params?: {
@@ -54,7 +55,26 @@ export interface HostedConnectDependencies {
54
55
  connect: (url: string, token: () => Promise<string>) => Promise<HostedClient>;
55
56
  }
56
57
  export declare function connectHostedMcp(url: string, token: () => Promise<string>): Promise<HostedClient>;
58
+ /**
59
+ * The hosted server's 3.x surface: the same address with `?surface=v3`. Once
60
+ * the hosted server serves 4.0 to every request that does not ask, only 3.x
61
+ * npm releases keep 3.x without asking, so the 3.x tool names here ask.
62
+ */
63
+ export declare function withV3Surface(url: string): string;
57
64
  export declare const defaultHostedConnectDependencies: HostedConnectDependencies;
65
+ /** The hosted server could not be reached, so no call was sent (a sign-in problem is an OAuthError instead). */
66
+ export declare class HostedUnreachableError extends Error {
67
+ readonly recovery: string;
68
+ constructor(message: string, recovery: string);
69
+ }
70
+ /** The HTTP status an MCP transport error carries (the SDK's StreamableHTTPError puts it on `code`). */
71
+ export declare function httpStatusOf(error: unknown): number | undefined;
72
+ /**
73
+ * A failure to connect to the hosted server, before any call was sent: a
74
+ * sign-in problem (an OAuthError, or a 401), an account the server refuses
75
+ * (403, store_access_denied), or the server not answering.
76
+ */
77
+ export declare function hostedConnectFailure(error: unknown, unreachableRecovery: string): OAuthError | HostedUnreachableError;
58
78
  /** True when this machine has a store sign-in on disk (no network). */
59
79
  export declare function hasStoreSignIn(): Promise<boolean>;
60
80
  export declare function listAllHostedTools(client: HostedClient): Promise<Tool[]>;
@@ -113,3 +133,5 @@ export type HostedCallOutcome = {
113
133
  };
114
134
  /** Call a hosted tool by its name or slug with the store sign-in (one connection). */
115
135
  export declare function callHostedToolForCli(name: string, args: Record<string, unknown>, deps?: HostedConnectDependencies, signedIn?: () => Promise<boolean>): Promise<HostedCallOutcome>;
136
+ /** The tool a tools/call JSON-RPC body names, for the X-Summer-MCP-Tool header. */
137
+ export declare function calledTool(body: unknown): string | undefined;
@@ -2,6 +2,7 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
2
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
3
3
  import { getStoreAccessToken, OAuthError, readStoredOAuthToken, resolveMcpResourceUrl } from "./oauth.js";
4
4
  import { TOOLKIT_VERSION } from "./version.js";
5
+ import { summerRequestHeaders } from "./agent-host.js";
5
6
  /**
6
7
  * A client for the hosted Summer Engine MCP (mcp.summerengine.com), signed in
7
8
  * with the store sign-in ("summer login --store"). The local MCP mounts its
@@ -15,6 +16,8 @@ export async function connectHostedMcp(url, token) {
15
16
  // A fresh (refreshed when near expiry) token on every request.
16
17
  fetch: async (input, init) => {
17
18
  const headers = new Headers(init?.headers);
19
+ for (const [name, value] of Object.entries(summerRequestHeaders({ tool: calledTool(init?.body), surface: "mcp" })))
20
+ headers.set(name, value);
18
21
  headers.set("authorization", `Bearer ${await token()}`);
19
22
  return fetch(input, { ...init, headers });
20
23
  },
@@ -32,11 +35,51 @@ export async function connectHostedMcp(url, token) {
32
35
  close: () => client.close(),
33
36
  };
34
37
  }
38
+ /**
39
+ * The hosted server's 3.x surface: the same address with `?surface=v3`. Once
40
+ * the hosted server serves 4.0 to every request that does not ask, only 3.x
41
+ * npm releases keep 3.x without asking, so the 3.x tool names here ask.
42
+ */
43
+ export function withV3Surface(url) {
44
+ const parsed = new URL(url);
45
+ parsed.searchParams.set("surface", "v3");
46
+ return parsed.href;
47
+ }
35
48
  export const defaultHostedConnectDependencies = {
36
- url: () => resolveMcpResourceUrl(),
49
+ url: () => withV3Surface(resolveMcpResourceUrl()),
37
50
  token: () => getStoreAccessToken(),
38
51
  connect: connectHostedMcp,
39
52
  };
53
+ /** The hosted server could not be reached, so no call was sent (a sign-in problem is an OAuthError instead). */
54
+ export class HostedUnreachableError extends Error {
55
+ recovery;
56
+ constructor(message, recovery) {
57
+ super(`${message} ${recovery}`);
58
+ this.recovery = recovery;
59
+ this.name = "HostedUnreachableError";
60
+ }
61
+ }
62
+ /** The HTTP status an MCP transport error carries (the SDK's StreamableHTTPError puts it on `code`). */
63
+ export function httpStatusOf(error) {
64
+ const code = error?.code;
65
+ return typeof code === "number" && code >= 100 && code <= 599 ? code : undefined;
66
+ }
67
+ /**
68
+ * A failure to connect to the hosted server, before any call was sent: a
69
+ * sign-in problem (an OAuthError, or a 401), an account the server refuses
70
+ * (403, store_access_denied), or the server not answering.
71
+ */
72
+ export function hostedConnectFailure(error, unreachableRecovery) {
73
+ if (error instanceof OAuthError || error instanceof HostedUnreachableError)
74
+ return error;
75
+ const cause = error instanceof Error ? error.message : String(error);
76
+ const status = httpStatusOf(error);
77
+ if (status === 401)
78
+ return new OAuthError("oauth_token_invalid", `Summer's hosted server refused the sign-in: ${cause}.`, 'Recovery: run "summer login --store --force".');
79
+ if (status === 403)
80
+ return new OAuthError("store_access_denied", `Summer's hosted server refused this account: ${cause}.`, "Recovery: check the account in Summer Studio (for example confirm the email), then try again.");
81
+ return new HostedUnreachableError(`The hosted Summer Engine MCP did not answer: ${cause}.`, unreachableRecovery);
82
+ }
40
83
  /** True when this machine has a store sign-in on disk (no network). */
41
84
  export async function hasStoreSignIn() {
42
85
  return (await readStoredOAuthToken()) !== null;
@@ -162,3 +205,15 @@ export async function callHostedToolForCli(name, args, deps = defaultHostedConne
162
205
  return { status: "unavailable", message: error instanceof Error ? error.message : String(error) };
163
206
  }
164
207
  }
208
+ /** The tool a tools/call JSON-RPC body names, for the X-Summer-MCP-Tool header. */
209
+ export function calledTool(body) {
210
+ if (typeof body !== "string" || !body.includes('"tools/call"'))
211
+ return undefined;
212
+ try {
213
+ const message = JSON.parse(body);
214
+ return message.method === "tools/call" && typeof message.params?.name === "string" ? message.params.name : undefined;
215
+ }
216
+ catch {
217
+ return undefined;
218
+ }
219
+ }
@@ -480,6 +480,11 @@ export async function readLibraryEntry(requestedId, part = "all", deps = {}) {
480
480
  else if (kind === "tool") {
481
481
  bodyTitle = "how to call";
482
482
  body = toolBody(entry, slug);
483
+ // An engine tool's guide: its full how-to (the v4 surface lists only a short summary).
484
+ const guide = readText(join(dir, "GUIDE.md"));
485
+ if (guide !== null) {
486
+ body = `${body}\n\n${guide.replace(/\s+$/, "")}`;
487
+ }
483
488
  }
484
489
  else if (kind === "template") {
485
490
  bodyTitle = "pin";
@@ -98,12 +98,12 @@ export declare const searchLibraryInputSchema: z.ZodObject<{
98
98
  include_preview: z.ZodOptional<z.ZodBoolean>;
99
99
  }, "strict", z.ZodTypeAny, {
100
100
  query: string;
101
- kinds?: ("template" | "tool" | "reference" | "skill" | "example" | "collection")[] | undefined;
101
+ kinds?: ("template" | "tool" | "skill" | "reference" | "example" | "collection")[] | undefined;
102
102
  limit?: number | undefined;
103
103
  include_preview?: boolean | undefined;
104
104
  }, {
105
105
  query: string;
106
- kinds?: ("template" | "tool" | "reference" | "skill" | "example" | "collection")[] | undefined;
106
+ kinds?: ("template" | "tool" | "skill" | "reference" | "example" | "collection")[] | undefined;
107
107
  limit?: number | undefined;
108
108
  include_preview?: boolean | undefined;
109
109
  }>;