summer-engine 3.1.0 → 3.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 (366) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +27 -5
  3. package/.codex-plugin/plugin.json +28 -6
  4. package/.cursor-plugin/plugin.json +27 -5
  5. package/.factory-plugin/plugin.json +27 -5
  6. package/.opencode/plugins/summer.js +1 -1
  7. package/CHANGELOG.md +102 -0
  8. package/README.md +18 -3
  9. package/assets/audit/scene_audit.gd +4136 -0
  10. package/assets/seeing/seeing_probe.gd +1873 -0
  11. package/dist/cli/commands/skills.js +20 -2
  12. package/dist/core/api-client.d.ts +9 -1
  13. package/dist/core/api-client.js +21 -4
  14. package/dist/core/capabilities/agent-playbook.js +46 -0
  15. package/dist/core/capabilities/audit/accept.d.ts +55 -0
  16. package/dist/core/capabilities/audit/accept.js +147 -0
  17. package/dist/core/capabilities/audit/args.d.ts +95 -0
  18. package/dist/core/capabilities/audit/args.js +89 -0
  19. package/dist/core/capabilities/audit/audit.d.ts +56 -0
  20. package/dist/core/capabilities/audit/audit.js +287 -0
  21. package/dist/core/capabilities/audit/frame.d.ts +14 -0
  22. package/dist/core/capabilities/audit/frame.js +35 -0
  23. package/dist/core/capabilities/audit/gaps.d.ts +96 -0
  24. package/dist/core/capabilities/audit/gaps.js +257 -0
  25. package/dist/core/capabilities/audit/judge.d.ts +162 -0
  26. package/dist/core/capabilities/audit/judge.js +1134 -0
  27. package/dist/core/capabilities/audit/math.d.ts +110 -0
  28. package/dist/core/capabilities/audit/math.js +263 -0
  29. package/dist/core/capabilities/audit/summary.d.ts +74 -0
  30. package/dist/core/capabilities/audit/summary.js +212 -0
  31. package/dist/core/capabilities/board.d.ts +31 -0
  32. package/dist/core/capabilities/board.js +43 -0
  33. package/dist/core/capabilities/camera-view.d.ts +4 -2
  34. package/dist/core/capabilities/camera-view.js +6 -3
  35. package/dist/core/capabilities/connect-signal.d.ts +85 -0
  36. package/dist/core/capabilities/connect-signal.js +285 -0
  37. package/dist/core/capabilities/engine-fallbacks.d.ts +5 -0
  38. package/dist/core/capabilities/engine-fallbacks.js +5 -0
  39. package/dist/core/capabilities/engine-ops.d.ts +5 -1
  40. package/dist/core/capabilities/engine-ops.js +0 -3
  41. package/dist/core/capabilities/engine-receipt.d.ts +12 -0
  42. package/dist/core/capabilities/engine-receipt.js +26 -0
  43. package/dist/core/capabilities/file-read.d.ts +64 -0
  44. package/dist/core/capabilities/file-read.js +325 -0
  45. package/dist/core/capabilities/game-task-plan.js +4 -2
  46. package/dist/core/capabilities/grep.d.ts +60 -0
  47. package/dist/core/capabilities/grep.js +190 -0
  48. package/dist/core/capabilities/inspect-node.d.ts +56 -0
  49. package/dist/core/capabilities/inspect-node.js +225 -0
  50. package/dist/core/capabilities/inspect-resource.d.ts +61 -0
  51. package/dist/core/capabilities/inspect-resource.js +376 -0
  52. package/dist/core/capabilities/math3d.d.ts +28 -0
  53. package/dist/core/capabilities/math3d.js +88 -0
  54. package/dist/core/capabilities/motion-generation.d.ts +62 -0
  55. package/dist/core/capabilities/motion-generation.js +138 -0
  56. package/dist/core/capabilities/placement-batch.d.ts +102 -0
  57. package/dist/core/capabilities/placement-batch.js +483 -0
  58. package/dist/core/capabilities/placement-math.d.ts +70 -0
  59. package/dist/core/capabilities/placement-math.js +209 -0
  60. package/dist/core/capabilities/placement-script.d.ts +42 -0
  61. package/dist/core/capabilities/placement-script.js +1096 -0
  62. package/dist/core/capabilities/placement.d.ts +485 -0
  63. package/dist/core/capabilities/placement.js +1731 -0
  64. package/dist/core/capabilities/project-context.d.ts +33 -2
  65. package/dist/core/capabilities/project-context.js +87 -4
  66. package/dist/core/capabilities/replace-node.d.ts +91 -0
  67. package/dist/core/capabilities/replace-node.js +423 -0
  68. package/dist/core/capabilities/runtime-control.d.ts +18 -2
  69. package/dist/core/capabilities/runtime-control.js +67 -2
  70. package/dist/core/capabilities/scene-batch.d.ts +63 -0
  71. package/dist/core/capabilities/scene-batch.js +394 -0
  72. package/dist/core/capabilities/scene-readback.d.ts +36 -0
  73. package/dist/core/capabilities/scene-readback.js +54 -0
  74. package/dist/core/capabilities/seeing/args.d.ts +348 -0
  75. package/dist/core/capabilities/seeing/args.js +178 -0
  76. package/dist/core/capabilities/seeing/candidates.d.ts +127 -0
  77. package/dist/core/capabilities/seeing/candidates.js +282 -0
  78. package/dist/core/capabilities/seeing/math.d.ts +134 -0
  79. package/dist/core/capabilities/seeing/math.js +269 -0
  80. package/dist/core/capabilities/seeing/probe.d.ts +62 -0
  81. package/dist/core/capabilities/seeing/probe.js +188 -0
  82. package/dist/core/capabilities/seeing/scoring.d.ts +235 -0
  83. package/dist/core/capabilities/seeing/scoring.js +639 -0
  84. package/dist/core/capabilities/seeing/seeing.d.ts +233 -0
  85. package/dist/core/capabilities/seeing/seeing.js +1341 -0
  86. package/dist/core/capabilities/seeing/shot-store.d.ts +52 -0
  87. package/dist/core/capabilities/seeing/shot-store.js +204 -0
  88. package/dist/core/capabilities/surface-snap-mesh.d.ts +88 -0
  89. package/dist/core/capabilities/surface-snap-mesh.js +425 -0
  90. package/dist/core/capabilities/surface-snap.d.ts +77 -0
  91. package/dist/core/capabilities/surface-snap.js +461 -0
  92. package/dist/core/capabilities/tool-dispatch.js +231 -72
  93. package/dist/core/capabilities/tscn.d.ts +85 -0
  94. package/dist/core/capabilities/tscn.js +391 -0
  95. package/dist/core/capabilities/world-snapshot.d.ts +58 -0
  96. package/dist/core/capabilities/world-snapshot.js +150 -0
  97. package/dist/core/capability-skew.d.ts +5 -5
  98. package/dist/core/capability-skew.js +14 -6
  99. package/dist/core/headless/worker-engine-client.d.ts +1 -1
  100. package/dist/core/headless/worker-engine-client.js +2 -2
  101. package/dist/core/library-read.d.ts +37 -5
  102. package/dist/core/library-read.js +264 -33
  103. package/dist/core/library-search.d.ts +2 -2
  104. package/dist/installer/agent-config.js +5 -3
  105. package/dist/installer/agent-table.d.ts +16 -0
  106. package/dist/installer/agent-table.js +52 -17
  107. package/dist/mcp/server.js +9 -3
  108. package/dist/mcp/tools/asset-tools.js +21 -3
  109. package/dist/mcp/tools/audit-tools.d.ts +23 -0
  110. package/dist/mcp/tools/audit-tools.js +60 -0
  111. package/dist/mcp/tools/debug-tools.js +3 -1
  112. package/dist/mcp/tools/file-tools.js +17 -4
  113. package/dist/mcp/tools/generate-tools.js +74 -66
  114. package/dist/mcp/tools/library-tools.js +2 -0
  115. package/dist/mcp/tools/perception-tools.js +6 -19
  116. package/dist/mcp/tools/placement-tools.d.ts +24 -0
  117. package/dist/mcp/tools/placement-tools.js +91 -0
  118. package/dist/mcp/tools/project-tools.js +18 -15
  119. package/dist/mcp/tools/scene-tools.js +71 -83
  120. package/dist/mcp/tools/seeing-tools.d.ts +24 -0
  121. package/dist/mcp/tools/seeing-tools.js +64 -0
  122. package/dist/mcp/tools/spatial-tools.js +17 -9
  123. package/dist/mcp/tools/visual-tools.js +59 -7
  124. package/gemini-extension.json +26 -4
  125. package/integrations/amp/README.md +1 -1
  126. package/integrations/crush/README.md +1 -1
  127. package/integrations/grok-build/README.md +1 -1
  128. package/integrations/hermes/README.md +1 -1
  129. package/integrations/kimi-code/README.md +1 -1
  130. package/integrations/mistral-vibe/README.md +1 -1
  131. package/integrations/opencode/README.md +1 -1
  132. package/integrations/rovo-dev/README.md +1 -1
  133. package/integrations/vscode-copilot/README.md +1 -1
  134. package/integrations/warp/README.md +1 -1
  135. package/integrations/windsurf/README.md +1 -1
  136. package/library/references/mcp-tools-reference/mcp-tools-reference.md +59 -15
  137. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  138. package/library/references/summer-folder/resource.yaml +1 -1
  139. package/library/references/summer-folder/summer-folder.md +1 -1
  140. package/library/skills/3d-lighting/SKILL.md +1 -1
  141. package/library/skills/README.md +36 -14
  142. package/library/skills/adaptive-music/SKILL.md +1 -1
  143. package/library/skills/agent-playtesting/SKILL.md +1 -1
  144. package/library/skills/ai-characters-in-games/SKILL.md +220 -0
  145. package/library/skills/ai-characters-in-games/resource.yaml +30 -0
  146. package/library/skills/ambient-bed/SKILL.md +1 -1
  147. package/library/skills/animated-loop/SKILL.md +1 -1
  148. package/library/skills/animation-tree/SKILL.md +1 -1
  149. package/library/skills/art-direction/SKILL.md +1 -1
  150. package/library/skills/asset-strategy/SKILL.md +2 -1
  151. package/library/skills/asset-strategy/resource.yaml +2 -1
  152. package/library/skills/audio-direction/SKILL.md +1 -1
  153. package/library/skills/auto-fire-targeting/SKILL.md +1 -1
  154. package/library/skills/brainstorm-game/SKILL.md +1 -1
  155. package/library/skills/brainstorming/SKILL.md +1 -1
  156. package/library/skills/browse-templates/SKILL.md +3 -3
  157. package/library/skills/browse-templates/resource.yaml +1 -1
  158. package/library/skills/camera-rigs/SKILL.md +128 -0
  159. package/library/skills/camera-rigs/resource.yaml +29 -0
  160. package/library/skills/celeste-momentum-platforming/SKILL.md +1 -1
  161. package/library/skills/character-animation-wiring/SKILL.md +1 -1
  162. package/library/skills/character-model/SKILL.md +1 -1
  163. package/library/skills/character-movement/SKILL.md +326 -0
  164. package/library/skills/character-movement/references/default-third-person-controller.gd +201 -0
  165. package/library/skills/character-movement/references/default-third-person-verification-probe.gd +154 -0
  166. package/library/skills/character-movement/references/movement-3d.md +136 -0
  167. package/library/skills/character-movement/references/platformer-feel.md +83 -0
  168. package/library/skills/character-movement/resource.yaml +40 -0
  169. package/library/skills/character-portrait/SKILL.md +1 -1
  170. package/library/skills/cinematic-cutscene/SKILL.md +1 -1
  171. package/library/skills/combat-basics/SKILL.md +159 -0
  172. package/library/skills/combat-basics/references/projectiles-and-aoe.md +100 -0
  173. package/library/skills/combat-basics/resource.yaml +34 -0
  174. package/library/skills/concept-art/SKILL.md +1 -1
  175. package/library/skills/create-asset-sheet/SKILL.md +1 -1
  176. package/library/skills/debug/SKILL.md +1 -1
  177. package/library/skills/debugging-game-feel/SKILL.md +1 -1
  178. package/library/skills/design-level/SKILL.md +1 -1
  179. package/library/skills/design-mechanic/SKILL.md +1 -1
  180. package/library/skills/design-npc/SKILL.md +1 -1
  181. package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
  182. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -1
  183. package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
  184. package/library/skills/environment-kit/SKILL.md +1 -1
  185. package/library/skills/export-and-ship/SKILL.md +1 -1
  186. package/library/skills/fabricating-assets/SKILL.md +1 -1
  187. package/library/skills/facial-and-lipsync/SKILL.md +1 -1
  188. package/library/skills/fps-controller/SKILL.md +9 -7
  189. package/library/skills/fps-controller/resource.yaml +4 -1
  190. package/library/skills/game-feel/SKILL.md +1 -1
  191. package/library/skills/gameskill/SKILL.md +1 -1
  192. package/library/skills/gdscript-patterns/SKILL.md +1 -1
  193. package/library/skills/generate-motion/SKILL.md +9 -9
  194. package/library/skills/generate-motion/resource.yaml +2 -1
  195. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
  196. package/library/skills/headless-scripting/SKILL.md +1 -1
  197. package/library/skills/in-game-purchases/SKILL.md +254 -0
  198. package/library/skills/in-game-purchases/resource.yaml +29 -0
  199. package/library/skills/instantiate-asset-pack/SKILL.md +1 -1
  200. package/library/skills/investigating-bugs/SKILL.md +1 -1
  201. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +1 -1
  202. package/library/skills/make-game/SKILL.md +25 -3
  203. package/library/skills/make-game/references/2d-platformer-polish.md +93 -0
  204. package/library/skills/make-game/references/2d-platformer.md +117 -0
  205. package/library/skills/make-game/references/2d-rpg-content.md +234 -0
  206. package/library/skills/make-game/references/2d-rpg.md +241 -0
  207. package/library/skills/make-game/references/2d-survivors-progression.md +201 -0
  208. package/library/skills/make-game/references/2d-survivors.md +237 -0
  209. package/library/skills/make-game/references/3d-fps-systems.md +216 -0
  210. package/library/skills/make-game/references/3d-fps.md +177 -0
  211. package/library/skills/make-game/references/3d-horror-systems.md +186 -0
  212. package/library/skills/make-game/references/3d-horror.md +201 -0
  213. package/library/skills/make-game/references/3d-third-person-systems.md +220 -0
  214. package/library/skills/make-game/references/3d-third-person.md +215 -0
  215. package/library/skills/make-game/resource.yaml +6 -1
  216. package/library/skills/multiplayer/SKILL.md +150 -0
  217. package/library/skills/multiplayer/resource.yaml +33 -0
  218. package/library/skills/multiplayer-movement/SKILL.md +510 -0
  219. package/library/skills/multiplayer-movement/files.md +501 -0
  220. package/library/skills/multiplayer-movement/resource.yaml +30 -0
  221. package/library/skills/multiplayer-project/SKILL.md +521 -0
  222. package/library/skills/multiplayer-project/files.md +448 -0
  223. package/library/skills/multiplayer-project/resource.yaml +36 -0
  224. package/library/skills/multiplayer-publish/SKILL.md +229 -0
  225. package/library/skills/multiplayer-publish/export-errors.md +89 -0
  226. package/library/skills/multiplayer-publish/resource.yaml +28 -0
  227. package/library/skills/multiplayer-state/SKILL.md +438 -0
  228. package/library/skills/multiplayer-state/files.md +592 -0
  229. package/library/skills/multiplayer-state/resource.yaml +35 -0
  230. package/library/skills/multiplayer-testing/SKILL.md +236 -0
  231. package/library/skills/multiplayer-testing/resource.yaml +39 -0
  232. package/library/skills/music-track/SKILL.md +1 -1
  233. package/library/skills/navigate-summer/SKILL.md +1 -1
  234. package/library/skills/new-project/SKILL.md +1 -1
  235. package/library/skills/organic-model/SKILL.md +1 -1
  236. package/library/skills/pixel-art/SKILL.md +1 -1
  237. package/library/skills/play/SKILL.md +1 -1
  238. package/library/skills/playtesting-a-feature/SKILL.md +1 -1
  239. package/library/skills/procedural-animation/SKILL.md +2 -2
  240. package/library/skills/procedural-animation/resource.yaml +1 -1
  241. package/library/skills/prop-model/SKILL.md +1 -1
  242. package/library/skills/psx-retro-rendering/SKILL.md +1 -1
  243. package/library/skills/realtime-wet-surfaces/SKILL.md +2 -2
  244. package/library/skills/remote-deploy/SKILL.md +1 -1
  245. package/library/skills/retarget/SKILL.md +1 -1
  246. package/library/skills/running-in-the-cloud/SKILL.md +1 -1
  247. package/library/skills/save-load/SKILL.md +156 -0
  248. package/library/skills/save-load/resource.yaml +27 -0
  249. package/library/skills/scene-composition/SKILL.md +1 -1
  250. package/library/skills/scene-hierarchy-design/SKILL.md +1 -1
  251. package/library/skills/scene-scripting/SKILL.md +1 -1
  252. package/library/skills/scene-to-level/SKILL.md +1 -1
  253. package/library/skills/skill-create/SKILL.md +1 -1
  254. package/library/skills/skill-improve/SKILL.md +1 -1
  255. package/library/skills/skill-test/SKILL.md +1 -1
  256. package/library/skills/skintokens-auto-rigging/SKILL.md +1 -1
  257. package/library/skills/skybox-panorama/SKILL.md +1 -1
  258. package/library/skills/sound-effect/SKILL.md +1 -1
  259. package/library/skills/spatial-placement/SKILL.md +134 -3
  260. package/library/skills/spatial-placement/references/kit-placement-tools.md +364 -0
  261. package/library/skills/spatial-placement/resource.yaml +16 -2
  262. package/library/skills/sprite-sheet/SKILL.md +1 -1
  263. package/library/skills/summer-analytics/SKILL.md +147 -0
  264. package/library/skills/summer-analytics/resource.yaml +28 -0
  265. package/library/skills/summer-friends/SKILL.md +226 -0
  266. package/library/skills/summer-friends/resource.yaml +28 -0
  267. package/library/skills/summer-leaderboards/SKILL.md +231 -0
  268. package/library/skills/summer-leaderboards/resource.yaml +30 -0
  269. package/library/skills/summer-match-results/SKILL.md +286 -0
  270. package/library/skills/summer-match-results/resource.yaml +32 -0
  271. package/library/skills/summer-matchmaking/SKILL.md +301 -0
  272. package/library/skills/summer-matchmaking/resource.yaml +32 -0
  273. package/library/skills/summer-parties/SKILL.md +253 -0
  274. package/library/skills/summer-parties/resource.yaml +30 -0
  275. package/library/skills/summer-player-data/SKILL.md +322 -0
  276. package/library/skills/summer-player-data/resource.yaml +30 -0
  277. package/library/skills/summer-store/SKILL.md +271 -0
  278. package/library/skills/summer-store/resource.yaml +29 -0
  279. package/library/skills/summer-world-chat/SKILL.md +195 -0
  280. package/library/skills/summer-world-chat/resource.yaml +30 -0
  281. package/library/skills/summer-world-saves/SKILL.md +284 -0
  282. package/library/skills/summer-world-saves/resource.yaml +29 -0
  283. package/library/skills/text-to-motion/SKILL.md +99 -0
  284. package/library/skills/text-to-motion/prompts-and-controls.md +34 -0
  285. package/library/skills/text-to-motion/resource.yaml +41 -0
  286. package/library/skills/text-to-motion/rigging-for-text-motion.md +54 -0
  287. package/library/skills/tileable-texture/SKILL.md +1 -1
  288. package/library/skills/trailer-shot/SKILL.md +1 -1
  289. package/library/skills/tune-performance/SKILL.md +1 -1
  290. package/library/skills/ui-basics/SKILL.md +10 -1
  291. package/library/skills/ui-graphics/SKILL.md +1 -1
  292. package/library/skills/use-widget-asset/SKILL.md +1 -1
  293. package/library/skills/using-summer/SKILL.md +2 -2
  294. package/library/skills/using-summer/resource.yaml +2 -2
  295. package/library/skills/vehicle-model/SKILL.md +1 -1
  296. package/library/skills/verification-before-completion/SKILL.md +1 -1
  297. package/library/skills/verifying-scenes/SKILL.md +76 -2
  298. package/library/skills/verifying-scenes/resource.yaml +13 -2
  299. package/library/skills/vfx-dissolve/SKILL.md +1 -1
  300. package/library/skills/vfx-fire/SKILL.md +1 -1
  301. package/library/skills/vfx-hit-spark/SKILL.md +1 -1
  302. package/library/skills/vfx-lightning/SKILL.md +1 -1
  303. package/library/skills/vfx-magic-glow/SKILL.md +1 -1
  304. package/library/skills/vfx-muzzle-flash/SKILL.md +1 -1
  305. package/library/skills/vfx-smoke/SKILL.md +1 -1
  306. package/library/skills/vfx-water-ripple/SKILL.md +1 -1
  307. package/library/skills/voice-line/SKILL.md +1 -1
  308. package/library/skills/web-and-touch-input/SKILL.md +38 -0
  309. package/library/skills/web-and-touch-input/resource.yaml +28 -0
  310. package/library/skills/web-compatibility-look/SKILL.md +62 -0
  311. package/library/skills/web-compatibility-look/resource.yaml +30 -0
  312. package/library/skills/world-building-3d/SKILL.md +8 -1
  313. package/library/skills/world-building-3d/references/spatial-tools.md +1 -1
  314. package/library/skills/world-building-3d/resource.yaml +2 -1
  315. package/library/skills/writing-plans/SKILL.md +1 -1
  316. package/library/skills/writing-skills/SKILL.md +1 -1
  317. package/library/templates/3d-lan-multiplayer-starter/resource.yaml +2 -2
  318. package/library/tools/attach-to-surface/resource.yaml +142 -0
  319. package/library/tools/batch/resource.yaml +9 -3
  320. package/library/tools/connect-ports/resource.yaml +120 -0
  321. package/library/tools/connect-signal/resource.yaml +3 -2
  322. package/library/tools/debug-views/resource.yaml +94 -0
  323. package/library/tools/frame-nodes/resource.yaml +104 -0
  324. package/library/tools/frame-shot/resource.yaml +134 -0
  325. package/library/tools/generate-motion/resource.yaml +44 -9
  326. package/library/tools/get-board/resource.yaml +50 -0
  327. package/library/tools/get-project-context/resource.yaml +13 -2
  328. package/library/tools/grep/resource.yaml +77 -0
  329. package/library/tools/inspect-asset/resource.yaml +71 -0
  330. package/library/tools/inspect-node/resource.yaml +9 -2
  331. package/library/tools/inspect-resource/resource.yaml +16 -5
  332. package/library/tools/instantiate-scene/resource.yaml +27 -2
  333. package/library/tools/measure/resource.yaml +96 -0
  334. package/library/tools/place-adjacent/resource.yaml +113 -0
  335. package/library/tools/play/resource.yaml +15 -2
  336. package/library/tools/raycast/resource.yaml +101 -0
  337. package/library/tools/read-file/resource.yaml +36 -2
  338. package/library/tools/read-library/resource.yaml +2 -2
  339. package/library/tools/repeat-along/resource.yaml +129 -0
  340. package/library/tools/replace-node/resource.yaml +11 -5
  341. package/library/tools/scene-audit/resource.yaml +144 -0
  342. package/library/tools/screenshot/resource.yaml +13 -2
  343. package/library/tools/search-assets/resource.yaml +18 -0
  344. package/library/tools/shot-sheet/resource.yaml +110 -0
  345. package/library/tools/snap-to-surface/resource.yaml +4 -1
  346. package/library/tools/world-snapshot/resource.yaml +24 -3
  347. package/library/tools/zoom/resource.yaml +105 -0
  348. package/package.json +1 -1
  349. package/registry/generated/aliases.json +17 -3
  350. package/registry/generated/counts.json +3 -3
  351. package/registry/generated/gemini-extension.json +26 -4
  352. package/registry/generated/index.json +2154 -469
  353. package/registry/generated/marketplace.claude.json +2 -2
  354. package/registry/generated/plugin.claude.json +27 -5
  355. package/registry/generated/plugin.codex.json +28 -6
  356. package/registry/generated/plugin.cursor.json +27 -5
  357. package/registry/generated/plugin.factory.json +27 -5
  358. package/registry/generated/skills-index.md +36 -14
  359. package/registry/generated/skills-registry.json +421 -124
  360. package/registry/generated/templates-registry.json +2 -2
  361. package/library/skills/host-authoritative-state/SKILL.md +0 -332
  362. package/library/skills/host-authoritative-state/resource.yaml +0 -28
  363. package/library/skills/peer-to-peer-multiplayer/SKILL.md +0 -373
  364. package/library/skills/peer-to-peer-multiplayer/resource.yaml +0 -28
  365. package/library/skills/setup-multiplayer/SKILL.md +0 -336
  366. package/library/skills/setup-multiplayer/resource.yaml +0 -28
@@ -0,0 +1,485 @@
1
+ /**
2
+ * Kit-placement tools, shared by both faces: the MCP tools
3
+ * (src/mcp/tools/placement-tools.ts) register these zod shapes and call these
4
+ * runners; `summer tool <slug>` (tool-dispatch.ts) parses with the same
5
+ * schemas and calls the same runners.
6
+ *
7
+ * summer_inspect_asset measure an asset file without adding it to a scene
8
+ * summer_place_adjacent put one node's bounds face against another's
9
+ * summer_attach_to_surface turn a piece's back onto a surface and seat it
10
+ * summer_repeat_along instance copies of a scene along a line
11
+ * summer_connect_ports meet one piece's port with another's
12
+ * summer_raycast cast an arbitrary ray (physics, then visual AABB)
13
+ * summer_measure gap/overlap per axis, or face coplanarity
14
+ *
15
+ * No engine op is new. Reads run the placement probe (placement-script.ts)
16
+ * through RunSceneScript with undo "none" and no checkpoint; mutations are the
17
+ * ordinary SetProp / SnapToSurface / InstantiateScene ops with the usual scene
18
+ * target, undo and final SaveScene. attach_to_surface checks its seat before
19
+ * the SaveScene and, when it refuses, sets the piece's original transform back
20
+ * instead of saving. Every result is compact (< 5 KB) and names its evidence:
21
+ * visual_aabb (visible GeometryInstance3D bounds, the definition
22
+ * AlignDistribute3D uses), physics (collider queries), or mesh_triangles.
23
+ */
24
+ import { z } from "zod";
25
+ import { type CapabilityAdvertisingClient } from "../capability-skew.js";
26
+ import { type JsonRecord } from "../util/json.js";
27
+ import { type Basis3, type SignedAxis, type Vec3, type WorldAxis, type Xform } from "./placement-math.js";
28
+ export interface PlacementClient extends CapabilityAdvertisingClient {
29
+ executeIdentityBoundOps(ops: Record<string, unknown>[], options?: Record<string, unknown>, timeoutMs?: number): Promise<unknown>;
30
+ }
31
+ export type PlacementResult = JsonRecord & {
32
+ ok: boolean;
33
+ };
34
+ /** What a placement tool tells the model when the engine lacks RunSceneScript. */
35
+ export declare const PLACEMENT_PROBE_FALLBACK = "read bounds with summer_starcast (or summer_inspect_node + summer_inspect_resource) and place with summer_set_prop, then verify with summer_screenshot";
36
+ export declare function isSafeNodePath(value: string): boolean;
37
+ export declare function isSafeResPath(value: string): boolean;
38
+ /**
39
+ * Run the placement probe and return its result dictionary, or a structured
40
+ * failure. Never mutates: undo "none", no checkpoint.
41
+ */
42
+ export declare function runPlacementProbe(client: PlacementClient, tool: string, args: JsonRecord, seconds?: number): Promise<PlacementResult>;
43
+ /** Trim the named lists (in order) until the result fits; declare every trim. */
44
+ export declare function fitToBudget(result: JsonRecord, listKeys: string[], target?: number): JsonRecord;
45
+ export declare const inspectAssetArgsSchema: z.ZodObject<{
46
+ path: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
47
+ maxTriangles: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
48
+ detail: z.ZodDefault<z.ZodOptional<z.ZodEnum<["summary", "full"]>>>;
49
+ }, "strip", z.ZodTypeAny, {
50
+ path: string;
51
+ detail: "summary" | "full";
52
+ maxTriangles: number;
53
+ }, {
54
+ path: string;
55
+ detail?: "summary" | "full" | undefined;
56
+ maxTriangles?: number | undefined;
57
+ }>;
58
+ export type InspectAssetArgs = z.output<typeof inspectAssetArgsSchema>;
59
+ /** Planes the probe reports, largest first. */
60
+ interface PlaneRecord {
61
+ normal: Vec3;
62
+ offset: number;
63
+ area: number;
64
+ tris?: number;
65
+ cull_back?: number;
66
+ }
67
+ /** One open boundary loop as the probe reports it: full precision, in the
68
+ * piece's own frame (the frame of the asset root, or of the scene node with
69
+ * its own transform excluded), in discovery order. */
70
+ export interface RawLoop {
71
+ center: Vec3;
72
+ direction: Vec3;
73
+ radius: number;
74
+ vertices?: number;
75
+ mesh?: number;
76
+ max_dev?: number;
77
+ direction_ambiguous?: boolean;
78
+ }
79
+ /** A loop with its stable place: `index` in the stable order and `id`. */
80
+ export interface OrderedLoop extends RawLoop {
81
+ index: number;
82
+ id: string;
83
+ /** The signed piece axis its outward direction is nearest, e.g. "+Y";
84
+ * "~Y" when the probe could not decide which way it faces. */
85
+ facing: string;
86
+ }
87
+ /** What the port-like rules read from a loop. */
88
+ interface LoopRecord {
89
+ direction: Vec3;
90
+ radius: number;
91
+ center?: Vec3;
92
+ direction_ambiguous?: boolean;
93
+ }
94
+ /** A stable open-loop id: "+Y", "+Y#2" (the second loop facing +Y), "~Z". */
95
+ export declare const LOOP_ID_PATTERN: RegExp;
96
+ /**
97
+ * The stable order and ids of a piece's open loops. Sort key: the signed piece
98
+ * axis the outward direction is nearest (+X, -X, +Y, -Y, +Z, -Z, then the
99
+ * undecided ~X, ~Y, ~Z); then the outermost along that axis first; then centre
100
+ * x, y, z; radius (largest first) and vertex count only break exact ties. All
101
+ * in the piece's own frame, so the ids are the same in summer_inspect_asset
102
+ * and summer_connect_ports and do not change with the piece's pose. The first
103
+ * loop facing +Y is "+Y", the next "+Y#2". Exported for tests.
104
+ */
105
+ export declare function orderLoops(loops: RawLoop[]): OrderedLoop[];
106
+ export type PortSelector = {
107
+ kind: "marker";
108
+ name: string;
109
+ } | {
110
+ kind: "loop_id";
111
+ id: string;
112
+ } | {
113
+ kind: "loop_index";
114
+ index: number;
115
+ };
116
+ /** "+y", "+Y" and "+Y#1" all name the loop "+Y"; numbers are loop indices;
117
+ * any other string is a Marker3D (or Node3D) name. */
118
+ export declare function parsePortSelector(port: string | number): PortSelector;
119
+ /**
120
+ * The two largest pairs of opposite planes, for reading facing at a glance:
121
+ * per plane direction the largest plane and the largest one facing the other
122
+ * way (null for a single sheet), ranked by their combined area; pairs under 1%
123
+ * of the largest pair's area are left out. Exported for tests.
124
+ */
125
+ export declare function planePairs(planes: PlaneRecord[], limit?: number): JsonRecord[];
126
+ /**
127
+ * Loops that look like pipe or duct ends: radius over 2 cm, a decided
128
+ * direction, and at least one partner loop of similar radius facing more than
129
+ * 60 degrees away (the other end of a straight run or a bend). The outline of
130
+ * a flat sheet and its holes all face one way and never qualify. Exported for
131
+ * tests.
132
+ */
133
+ export declare function portLikeLoops<T extends LoopRecord>(loops: T[], aabb?: {
134
+ min: Vec3;
135
+ max: Vec3;
136
+ }): T[];
137
+ export declare function inspectAsset(client: PlacementClient, args: InspectAssetArgs): Promise<PlacementResult>;
138
+ export declare const measureArgsSchema: z.ZodObject<{
139
+ scenePath: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>;
140
+ mode: z.ZodDefault<z.ZodOptional<z.ZodEnum<["pair", "plane"]>>>;
141
+ a: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>;
142
+ b: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>;
143
+ axis: z.ZodOptional<z.ZodEnum<["x", "y", "z"]>>;
144
+ nodes: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, "many">>;
145
+ face: z.ZodOptional<z.ZodEnum<["+x", "-x", "+y", "-y", "+z", "-z"]>>;
146
+ space: z.ZodDefault<z.ZodOptional<z.ZodEnum<["world", "local"]>>>;
147
+ tolerance: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
148
+ }, "strip", z.ZodTypeAny, {
149
+ mode: "pair" | "plane";
150
+ scenePath: string;
151
+ space: "local" | "world";
152
+ tolerance: number;
153
+ a?: string | undefined;
154
+ axis?: "y" | "x" | "z" | undefined;
155
+ nodes?: string[] | undefined;
156
+ b?: string | undefined;
157
+ face?: "-y" | "+x" | "-x" | "+y" | "+z" | "-z" | undefined;
158
+ }, {
159
+ scenePath: string;
160
+ mode?: "pair" | "plane" | undefined;
161
+ a?: string | undefined;
162
+ space?: "local" | "world" | undefined;
163
+ axis?: "y" | "x" | "z" | undefined;
164
+ nodes?: string[] | undefined;
165
+ b?: string | undefined;
166
+ tolerance?: number | undefined;
167
+ face?: "-y" | "+x" | "-x" | "+y" | "+z" | "-z" | undefined;
168
+ }>;
169
+ export type MeasureArgs = z.output<typeof measureArgsSchema>;
170
+ export declare function measure(client: PlacementClient, args: MeasureArgs): Promise<PlacementResult>;
171
+ export declare const raycastArgsSchema: z.ZodObject<{
172
+ scenePath: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>;
173
+ origin: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
174
+ direction: z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number], [number, number, number]>;
175
+ maxDistance: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
176
+ collisionMask: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
177
+ collideWithAreas: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
178
+ evidence: z.ZodDefault<z.ZodOptional<z.ZodEnum<["auto", "physics", "visual_aabb"]>>>;
179
+ exclude: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, "many">>;
180
+ }, "strip", z.ZodTypeAny, {
181
+ scenePath: string;
182
+ origin: [number, number, number];
183
+ direction: [number, number, number];
184
+ evidence: "auto" | "physics" | "visual_aabb";
185
+ maxDistance: number;
186
+ collisionMask: number;
187
+ collideWithAreas: boolean;
188
+ exclude?: string[] | undefined;
189
+ }, {
190
+ scenePath: string;
191
+ origin: [number, number, number];
192
+ direction: [number, number, number];
193
+ evidence?: "auto" | "physics" | "visual_aabb" | undefined;
194
+ maxDistance?: number | undefined;
195
+ collisionMask?: number | undefined;
196
+ collideWithAreas?: boolean | undefined;
197
+ exclude?: string[] | undefined;
198
+ }>;
199
+ export type RaycastArgs = z.output<typeof raycastArgsSchema>;
200
+ export declare function raycast(client: PlacementClient, args: RaycastArgs): Promise<PlacementResult>;
201
+ declare const alignMode: z.ZodEnum<["min", "center", "max", "none"]>;
202
+ type AlignMode = z.output<typeof alignMode>;
203
+ export declare const placeAdjacentArgsSchema: z.ZodObject<{
204
+ scenePath: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>;
205
+ subject: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
206
+ reference: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
207
+ axis: z.ZodEnum<["x", "y", "z"]>;
208
+ side: z.ZodEnum<["min", "max"]>;
209
+ gap: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
210
+ alignOtherAxes: z.ZodDefault<z.ZodOptional<z.ZodUnion<[z.ZodEnum<["min", "center", "max", "none"]>, z.ZodObject<{
211
+ x: z.ZodOptional<z.ZodEnum<["min", "center", "max", "none"]>>;
212
+ y: z.ZodOptional<z.ZodEnum<["min", "center", "max", "none"]>>;
213
+ z: z.ZodOptional<z.ZodEnum<["min", "center", "max", "none"]>>;
214
+ }, "strip", z.ZodTypeAny, {
215
+ y?: "none" | "min" | "max" | "center" | undefined;
216
+ x?: "none" | "min" | "max" | "center" | undefined;
217
+ z?: "none" | "min" | "max" | "center" | undefined;
218
+ }, {
219
+ y?: "none" | "min" | "max" | "center" | undefined;
220
+ x?: "none" | "min" | "max" | "center" | undefined;
221
+ z?: "none" | "min" | "max" | "center" | undefined;
222
+ }>]>>>;
223
+ space: z.ZodDefault<z.ZodOptional<z.ZodEnum<["world", "local"]>>>;
224
+ }, "strip", z.ZodTypeAny, {
225
+ scenePath: string;
226
+ space: "local" | "world";
227
+ gap: number;
228
+ axis: "y" | "x" | "z";
229
+ subject: string;
230
+ reference: string;
231
+ side: "min" | "max";
232
+ alignOtherAxes: "none" | "min" | "max" | "center" | {
233
+ y?: "none" | "min" | "max" | "center" | undefined;
234
+ x?: "none" | "min" | "max" | "center" | undefined;
235
+ z?: "none" | "min" | "max" | "center" | undefined;
236
+ };
237
+ }, {
238
+ scenePath: string;
239
+ axis: "y" | "x" | "z";
240
+ subject: string;
241
+ reference: string;
242
+ side: "min" | "max";
243
+ space?: "local" | "world" | undefined;
244
+ gap?: number | undefined;
245
+ alignOtherAxes?: "none" | "min" | "max" | "center" | {
246
+ y?: "none" | "min" | "max" | "center" | undefined;
247
+ x?: "none" | "min" | "max" | "center" | undefined;
248
+ z?: "none" | "min" | "max" | "center" | undefined;
249
+ } | undefined;
250
+ }>;
251
+ export type PlaceAdjacentArgs = z.output<typeof placeAdjacentArgsSchema>;
252
+ /** Per-axis translation that puts subject against reference. Exported for tests. */
253
+ export declare function adjacentDeltas(subject: Array<[number, number]>, reference: Array<[number, number]>, axis: WorldAxis, side: "min" | "max", gap: number, align: (axis: WorldAxis) => AlignMode): Vec3;
254
+ export declare function placeAdjacent(client: PlacementClient, args: PlaceAdjacentArgs): Promise<PlacementResult>;
255
+ export declare const attachToSurfaceArgsSchema: z.ZodObject<{
256
+ scenePath: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>;
257
+ subject: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
258
+ surface: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>;
259
+ ray: z.ZodOptional<z.ZodObject<{
260
+ origin: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
261
+ direction: z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number], [number, number, number]>;
262
+ }, "strip", z.ZodTypeAny, {
263
+ origin: [number, number, number];
264
+ direction: [number, number, number];
265
+ }, {
266
+ origin: [number, number, number];
267
+ direction: [number, number, number];
268
+ }>>;
269
+ placeAt: z.ZodDefault<z.ZodOptional<z.ZodEnum<["current", "hit"]>>>;
270
+ maxMove: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
271
+ backAxis: z.ZodDefault<z.ZodOptional<z.ZodEnum<["+x", "-x", "+y", "-y", "+z", "-z"]>>>;
272
+ upAxis: z.ZodDefault<z.ZodOptional<z.ZodEnum<["+x", "-x", "+y", "-y", "+z", "-z"]>>>;
273
+ worldUp: z.ZodDefault<z.ZodOptional<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number], [number, number, number]>>>;
274
+ standoff: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
275
+ maxDistance: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
276
+ collisionMask: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
277
+ }, "strip", z.ZodTypeAny, {
278
+ scenePath: string;
279
+ subject: string;
280
+ maxDistance: number;
281
+ collisionMask: number;
282
+ placeAt: "current" | "hit";
283
+ maxMove: number;
284
+ backAxis: "-y" | "+x" | "-x" | "+y" | "+z" | "-z";
285
+ upAxis: "-y" | "+x" | "-x" | "+y" | "+z" | "-z";
286
+ worldUp: [number, number, number];
287
+ standoff: number;
288
+ surface?: string | undefined;
289
+ ray?: {
290
+ origin: [number, number, number];
291
+ direction: [number, number, number];
292
+ } | undefined;
293
+ }, {
294
+ scenePath: string;
295
+ subject: string;
296
+ surface?: string | undefined;
297
+ ray?: {
298
+ origin: [number, number, number];
299
+ direction: [number, number, number];
300
+ } | undefined;
301
+ maxDistance?: number | undefined;
302
+ collisionMask?: number | undefined;
303
+ placeAt?: "current" | "hit" | undefined;
304
+ maxMove?: number | undefined;
305
+ backAxis?: "-y" | "+x" | "-x" | "+y" | "+z" | "-z" | undefined;
306
+ upAxis?: "-y" | "+x" | "-x" | "+y" | "+z" | "-z" | undefined;
307
+ worldUp?: [number, number, number] | undefined;
308
+ standoff?: number | undefined;
309
+ }>;
310
+ export type AttachToSurfaceArgs = z.output<typeof attachToSurfaceArgsSchema>;
311
+ /** The piece is turned and put this far in front of its planned seat before
312
+ * SnapToSurface sweeps it in. */
313
+ export declare const ATTACH_PRESEAT_CLEARANCE = 0.05;
314
+ /** How far past the planned seat the sweep may go (a collider set back from
315
+ * the visible back face). */
316
+ export declare const ATTACH_SEAT_REACH = 0.25;
317
+ /** A seat this far in front of the planned plane stopped on something else. */
318
+ export declare const ATTACH_PLAN_TOLERANCE = 0.03;
319
+ /** Extents of a node's visible bounds along its own local axes, relative to
320
+ * its origin: lo/hi per local x, y, z. Exported for tests. */
321
+ export declare function localExtents(intervals: Array<[number, number]>, dirs: Vec3[], origin: Vec3): {
322
+ lo: Vec3;
323
+ hi: Vec3;
324
+ };
325
+ /**
326
+ * Where the subject's origin must go so its back face (the extreme of its
327
+ * visible bounds along backAxis) sits standoff in front of the surface plane
328
+ * through hitPoint. `current` keeps the origin's place along the surface (and
329
+ * so its height on a wall); `hit` puts the centre of the back face on the hit
330
+ * point. `rotation` maps local unit axes to their new world directions.
331
+ * Exported for tests.
332
+ */
333
+ export declare function seatOrigin(plan: {
334
+ origin: Vec3;
335
+ extents: {
336
+ lo: Vec3;
337
+ hi: Vec3;
338
+ };
339
+ backAxis: SignedAxis;
340
+ rotation: Basis3;
341
+ hitPoint: Vec3;
342
+ normal: Vec3;
343
+ standoff: number;
344
+ placeAt: "current" | "hit";
345
+ }): {
346
+ origin: Vec3;
347
+ backOffset: number;
348
+ backCentre: Vec3;
349
+ };
350
+ /** The mounting rotation: local back -> -normal, local up -> world up projected
351
+ * onto the surface plane. Exported for tests. */
352
+ export declare function mountingRotation(backAxis: SignedAxis, upAxis: SignedAxis, normal: Vec3, worldUp: Vec3, currentUp?: Vec3): {
353
+ rotation: Basis3;
354
+ up: Vec3;
355
+ usedCurrentUp: boolean;
356
+ } | null;
357
+ /** One concrete next step for a failed seat, naming what blocked it. */
358
+ export declare function seatNextStep(reason: string, blockers: JsonRecord | undefined, sweep: number): string;
359
+ export declare function attachToSurface(client: PlacementClient, args: AttachToSurfaceArgs): Promise<PlacementResult>;
360
+ export declare const repeatAlongArgsSchema: z.ZodObject<{
361
+ scenePath: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>;
362
+ template: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
363
+ parent: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
364
+ start: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
365
+ end: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
366
+ direction: z.ZodOptional<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number], [number, number, number]>>;
367
+ count: z.ZodOptional<z.ZodNumber>;
368
+ spacing: z.ZodOptional<z.ZodNumber>;
369
+ align: z.ZodDefault<z.ZodOptional<z.ZodEnum<["start", "center", "end"]>>>;
370
+ rotationDegrees: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
371
+ scale: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
372
+ namePrefix: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
373
+ }, "strip", z.ZodTypeAny, {
374
+ scenePath: string;
375
+ template: string;
376
+ parent: string;
377
+ start: [number, number, number];
378
+ align: "end" | "start" | "center";
379
+ end?: [number, number, number] | undefined;
380
+ count?: number | undefined;
381
+ scale?: [number, number, number] | undefined;
382
+ direction?: [number, number, number] | undefined;
383
+ spacing?: number | undefined;
384
+ rotationDegrees?: [number, number, number] | undefined;
385
+ namePrefix?: string | undefined;
386
+ }, {
387
+ scenePath: string;
388
+ template: string;
389
+ parent: string;
390
+ start: [number, number, number];
391
+ end?: [number, number, number] | undefined;
392
+ count?: number | undefined;
393
+ scale?: [number, number, number] | undefined;
394
+ direction?: [number, number, number] | undefined;
395
+ spacing?: number | undefined;
396
+ align?: "end" | "start" | "center" | undefined;
397
+ rotationDegrees?: [number, number, number] | undefined;
398
+ namePrefix?: string | undefined;
399
+ }>;
400
+ export type RepeatAlongArgs = z.output<typeof repeatAlongArgsSchema>;
401
+ export declare const REPEAT_MAX_COPIES = 64;
402
+ /** Copy positions for a repeat_along call. Exported for tests. */
403
+ export declare function repeatPositions(args: Pick<RepeatAlongArgs, "start" | "end" | "direction" | "count" | "spacing" | "align">): {
404
+ positions: Vec3[];
405
+ spacing: number;
406
+ direction: Vec3;
407
+ };
408
+ export declare function repeatAlong(client: PlacementClient, args: RepeatAlongArgs): Promise<PlacementResult>;
409
+ /** A join may tilt the subject's up axis this many degrees unless allowed. */
410
+ export declare const DEFAULT_MAX_TILT_DEGREES = 5;
411
+ export declare const connectPortsArgsSchema: z.ZodObject<{
412
+ scenePath: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, string, string>;
413
+ subject: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
414
+ subjectPort: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodNumber]>;
415
+ target: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
416
+ targetPort: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodNumber]>;
417
+ gap: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
418
+ rollDegrees: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
419
+ maxTiltDegrees: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
420
+ allowTilt: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
421
+ maxTriangles: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
422
+ }, "strip", z.ZodTypeAny, {
423
+ scenePath: string;
424
+ target: string;
425
+ gap: number;
426
+ subject: string;
427
+ maxTriangles: number;
428
+ subjectPort: string | number;
429
+ targetPort: string | number;
430
+ rollDegrees: number;
431
+ maxTiltDegrees: number;
432
+ allowTilt: boolean;
433
+ }, {
434
+ scenePath: string;
435
+ target: string;
436
+ subject: string;
437
+ subjectPort: string | number;
438
+ targetPort: string | number;
439
+ gap?: number | undefined;
440
+ maxTriangles?: number | undefined;
441
+ rollDegrees?: number | undefined;
442
+ maxTiltDegrees?: number | undefined;
443
+ allowTilt?: boolean | undefined;
444
+ }>;
445
+ export type ConnectPortsArgs = z.output<typeof connectPortsArgsSchema>;
446
+ interface PortRead {
447
+ kind: string;
448
+ position: Vec3;
449
+ direction: Vec3;
450
+ radius?: number;
451
+ name?: string;
452
+ id?: string;
453
+ index?: number;
454
+ direction_ambiguous?: boolean;
455
+ analysis_truncated?: boolean;
456
+ /** The subject's other ports (ports read with other_ports). */
457
+ others?: PortRead[];
458
+ others_total?: number;
459
+ }
460
+ /**
461
+ * The probe's answer for one port -> the port in scene space. A marker comes
462
+ * resolved; an open-loop port comes as every loop of the node in its own
463
+ * frame, which is ordered here (orderLoops) and picked by id or index, so the
464
+ * same id names the same loop in every pose. With withOthers, the node's other
465
+ * loops come along in scene space.
466
+ */
467
+ export declare function resolveProbePort(raw: unknown, selector: PortSelector, label: "subject" | "target", node: string, withOthers: boolean): {
468
+ port: PortRead;
469
+ } | {
470
+ failure: PlacementResult;
471
+ };
472
+ /** New scene-space transform that joins the subject port to the target port.
473
+ * `joint` is where the subject port lands; a subject point p moves to
474
+ * rotation * (p - subject port) + joint. */
475
+ export declare function connectTransform(subject: Xform, sp: PortRead, tp: PortRead, gap: number, rollDegrees: number): {
476
+ xform: Xform;
477
+ rotation: Basis3;
478
+ joint: Vec3;
479
+ rollAxis: Vec3;
480
+ };
481
+ /** How far a scene-space rotation turns the subject's up axis (its local +Y),
482
+ * in degrees. A turn about the up axis is 0. Exported for tests. */
483
+ export declare function tiltDegrees(subject: Xform, rotation: Basis3): number;
484
+ export declare function connectPorts(client: PlacementClient, args: ConnectPortsArgs): Promise<PlacementResult>;
485
+ export {};