{"ok":true,"site":{"host":"morphus.myles4miles.chatgpt.site","url":"https://morphus.myles4miles.chatgpt.site/","type":"live","desc":"Morphus is an AI-native workspace for designing worlds and generating playable game experiences.","tools":[{"name":"list_nodes","kind":"answer","impl":"imperative","description":"Lists the scene node outline as a lightweight hierarchy. Returns IDs, names, kinds, child nodes, and attached entities, but not full node data.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_scene_settings","kind":"answer","impl":"imperative","description":"Gets current scene settings. This is the canonical source for player scale, jump height, movement, camera mode, physics, fog, and ambient lighting.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_node_details","kind":"answer","impl":"imperative","description":"Gets full details of a specific node, including transform, worldTransform, hierarchy links, hooks, metadata, and node data.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Node ID to inspect"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_terrain_state","kind":"answer","impl":"imperative","description":"Returns a mesh terrain node's current authoring state: world size and section size in meters, seed, base profile, LOD count, the four material channels, and a summary of every modifier in the stack in evaluation order. Read this before a follow-up edit so new strokes land relative to what is already there instead of guessing. The full point list of each stroke is not returned, only its bounds, so this stays cheap on a heavily sculpted terrain.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."},"maxModifiers":{"type":"number","description":"Maximum modifier summaries to return, most recent last. Default 60."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_forest_state","kind":"answer","impl":"imperative","description":"Lists every forest field with its shape, stand settings, and — where it has been grown — the stem count, boulder count, and which tree prototypes it uses. Read this before a follow-up edit so a change lands relative to what is already standing.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_vfx_abilities","kind":"answer","impl":"imperative","description":"Lists the combat abilities available to cast, with the key each is bound to in the editor and how each is aimed (a line cast travels along the aimed line; a far cast lands its footprint at the far end; gate, ring and scribe casts build a structure). Read this before casting so the ability matches what the user described.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"capture_viewport_screenshot","kind":"act","impl":"imperative","description":"Capture a screenshot of the active editor viewport so you can inspect what has actually been built. Use this after meaningful scene changes when visual confirmation would help.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"reason":{"type":"string","description":"Optional short note about what you want to inspect in the screenshot"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_mesh_terrain","kind":"act","impl":"imperative","description":"Creates a mesh terrain node: a sculptable surface mesh, not a heightfield grid. Because strokes displace along the picked surface normal and holes are cut by exact CSG, mesh terrain can carry overhangs, undercut cliffs, arches, caves, and tunnels that heightmap terrain cannot represent. Terrain is authored in world meters at kilometre scale, so a default terrain is a 4 km square. Returns the node ID that every other terrain_* tool takes as nodeId.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name for the terrain node"},"x":{"type":"number","description":"World X of the terrain center in meters (default 0)"},"y":{"type":"number","description":"World Y of the terrain base plane in meters (default 0 = ground level)"},"z":{"type":"number","description":"World Z of the terrain center in meters (default 0)"},"worldSizeMeters":{"type":"number","description":"Edge length of the square terrain in meters. Default 4096, i.e. a 4 km world. Clamped to 256-16384."},"sectionSizeMeters":{"type":"number","description":"Edge length of one streamed terrain section in meters. Default 128. Smaller sections rebuild faster after an edit but cost more draw calls. Clamped…"},"seed":{"type":"number","description":"Deterministic base-field seed. The same seed and profile always produce the same starting surface, before any stroke."},"profile":{"type":"string","enum":["natural","flat"],"description":"Base elevation the terrain starts from. \"natural\" (default) gives rolling procedural relief to sculpt against; \"flat\" gives a level plane at Y=0 for…"},"lodLevels":{"type":"number","description":"Number of geometric LODs compiled per section, 1-5. Default 5."},"allowDuplicate":{"type":"boolean","description":"Set true only when a second terrain node is genuinely intended. Defaults false, which refuses to add a second mesh terrain to the scene."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"terrain_sculpt_stroke","kind":"act","impl":"imperative","description":"Sculpts the terrain along a path of world-space points, in meters. Nine modes: raise and lower move the surface, clay builds mass, smooth relaxes it, flatten levels toward one height, pinch sharpens ridges, scrape planes material away, terrace cuts benches, noise adds grain. Domain 'heightfield' moves straight up, 'mesh' follows the picked surface normal and can form overhangs. Strokes stack non-destructively, so build a landform in passes rather than one huge stroke.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."},"mode":{"type":"string","enum":["raise","lower","smooth","flatten","clay","pinch","scrape","terrace","noise"],"description":"Sculpt operation. `raise`/`lower` push the surface out or in along the domain axis. `smooth` averages neighbours to soften noise and stroke seams.…"},"domain":{"type":"string","enum":["heightfield","mesh"],"description":"Displacement axis. \"heightfield\" moves vertices along world +Y and cannot create an overhang. \"mesh\" (default) moves them along the picked surface…"},"path":{"type":"array","description":"Ordered world-space dab positions, in meters. Give at least one point; two or more sweep the brush along the path.","items":{"type":"object","properties":{"x":{"type":"number","description":"World X in meters"},"y":{"type":"number","description":"World Y in meters. For heightfield strokes this only picks the dab, not the result height."},"z":{"type":"number","description":"World Z in meters"},"normalX":{"type":"number","description":"Surface normal X at this point. Only meaningful for domain \"mesh\"; defaults to world up (0,1,0)."},"normalY":{"type":"number","description":"Surface normal Y at this point. Defaults to 1."},"normalZ":{"type":"number","description":"Surface normal Z at this point. Defaults to 0."},"weight":{"type":"number","description":"Relative brush flow at this point, 0-1. Default 1. Taper the ends of a ridge by fading this toward 0."}},"required":["x","y","z"]}},"radiusMeters":{"type":"number","description":"Brush radius in meters. Terrain is kilometre scale, so a mountain mass is typically 200-600 m, a ridge 60-200 m, a trail cut or boulder detail 5-15 m."},"strength":{"type":"number","description":"Peak displacement per dab in meters, at the center of the brush. Keep it positive: `lower` and `scrape` already remove material. A 400 m peak is…"},"falloff":{"type":"number","description":"Edge softness 0-1. 0 is a hard-edged disc that leaves a visible rim; 1 is a fully smooth falloff. Default 0.5."},"targetY":{"type":"number","description":"Only for mode \"flatten\": the world Y elevation in meters the surface is pulled toward. Defaults to the Y of the first path point."},"terraceStepMeters":{"type":"number","description":"Only for mode \"terrace\": vertical spacing between terrace treads, in meters."},"noiseScale":{"type":"number","description":"Only for mode \"noise\": world-space wavelength of the added roughness, in meters. Smaller values give finer grain."},"accumulate":{"type":"boolean","description":"When true the stroke keeps building depth over overlapping dabs instead of settling on a single displacement. Use true to dig deep with one stroke,…"},"sculptLayerId":{"type":"string","description":"Optional sculpt layer ID to file this stroke under, so a group of strokes can later be faded or disabled together."}},"required":["mode","path","radiusMeters","strength"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"terrain_carve_tunnel","kind":"act","impl":"imperative","description":"Carves a tunnel straight through a mesh terrain by sweeping a capsule between two world-space portals and subtracting it with exact CSG. This produces a genuine hole with interior walls, not a masked-out region, which is why it belongs to mesh terrain and has no heightmap equivalent. Use it for road and rail tunnels, mine adits, and the trunk passage of a cave system; branch chambers and side passages are better added with `terrain_add_csg_volume`. All distances are meters.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."},"startX":{"type":"number","description":"World X of the entrance portal in meters, placed on the terrain surface"},"startY":{"type":"number","description":"World Y of the entrance portal in meters"},"startZ":{"type":"number","description":"World Z of the entrance portal in meters"},"startNormalX":{"type":"number","description":"Direction the entrance portal faces, X. Should point out of the hillside. Defaults to the direction of the other portal."},"startNormalY":{"type":"number","description":"Direction the entrance portal faces, Y"},"startNormalZ":{"type":"number","description":"Direction the entrance portal faces, Z"},"endX":{"type":"number","description":"World X of the exit portal in meters, placed on the terrain surface"},"endY":{"type":"number","description":"World Y of the exit portal in meters"},"endZ":{"type":"number","description":"World Z of the exit portal in meters"},"endNormalX":{"type":"number","description":"Direction the exit portal faces, X. Should point out of the hillside."},"endNormalY":{"type":"number","description":"Direction the exit portal faces, Y"},"endNormalZ":{"type":"number","description":"Direction the exit portal faces, Z"},"radiusMeters":{"type":"number","description":"Tunnel bore radius in meters. Default 8. A single-track rail tunnel is about 4 m, a two-lane road tunnel about 6-8 m, a walkable cave passage 3-10 m."},"depthMeters":{"type":"number","description":"How far each portal drives straight inward before the two ends are joined, in meters. Default is 1.75x radiusMeters. Larger values give a straighter…"},"noise":{"type":"number","description":"Wall roughness, 0 or more. 0 gives a machined bore, which is correct for an engineered tunnel; 1 (default) gives rock. Raise it toward 2-3 for a…"},"noiseScale":{"type":"number","description":"World-space wavelength of the wall roughness in meters. Default 2.6. Larger values give broad undulation instead of fine pitting."}},"required":["startX","startY","startZ","endX","endY","endZ"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"terrain_paint_weights","kind":"act","impl":"imperative","description":"Paints one of a mesh terrain's four material channels along a world-space path, and appends the paint stroke to the node's modifier stack. Channel weights blend the terrain's four surface materials; painting one channel up naturally takes weight from the others. Use `terrain_set_material_channels` first if the channels do not already mean what you need. All distances are meters.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."},"channel":{"type":"string","enum":["channel0","channel1","channel2","channel3"],"description":"Which of the four material channels to paint. Call `get_terrain_state` to see what each channel is currently named. Defaults are channel0 Grass,…"},"mode":{"type":"string","enum":["add","subtract"],"description":"\"add\" (default) paints the channel in; \"subtract\" erases it, letting the other channels show through."},"path":{"type":"array","description":"Ordered world-space dab positions, in meters.","items":{"type":"object","properties":{"x":{"type":"number","description":"World X in meters"},"y":{"type":"number","description":"World Y in meters"},"z":{"type":"number","description":"World Z in meters"},"normalX":{"type":"number","description":"Surface normal X at this point. Defaults to world up."},"normalY":{"type":"number","description":"Surface normal Y at this point. Defaults to 1."},"normalZ":{"type":"number","description":"Surface normal Z at this point. Defaults to 0."},"weight":{"type":"number","description":"Relative paint flow at this point, 0-1. Default 1."}},"required":["x","y","z"]}},"radiusMeters":{"type":"number","description":"Paint radius in meters. Material bands read best when they are wide: a snowline or scree band is typically 100-400 m."},"strength":{"type":"number","description":"Weight applied per dab, 0-1. Default 0.5. Use low values and repeated passes for a soft transition between materials."},"falloff":{"type":"number","description":"Edge softness 0-1. Default 0.7; material boundaries almost always want a soft edge."}},"required":["channel","path","radiusMeters"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_forest_field","kind":"act","impl":"imperative","description":"Creates a forest field: a stand described as a spline on the ground rather than a list of trees. Nothing grows until the shape has at least two control points and `grow_forest_field` runs, so the normal sequence is create, add points, then grow. Returns the field ID every other forest_* tool takes. Forests sit on the terrain's height field, so make the terrain first when the user wants both.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name for the field, for example \"North Woods\""},"preset":{"type":"string","enum":["mossy-old-growth","temperate-mixed","ancient-oak-grove","boreal-conifer","primeval-redwood","tropical-wet","palm-oasis","savanna","arid-woodland"],"description":"The stand type. This decides the species mix, the floor, and the stems per hectare. Pick by climate and age: boreal-conifer for cold spruce/fir,…"},"points":{"type":"array","description":"Optional control points to lay down immediately, so a field can be created and shaped in one call. Each is a point on the ground plane in world…","items":{"type":"object","properties":{"x":{"type":"number"},"z":{"type":"number"}},"required":["x","z"]}},"closed":{"type":"boolean","description":"True (default) makes the spline a closed loop enclosing an area. False makes it an open belt of `width` either side, for a treeline, hedgerow, or…"},"grow":{"type":"boolean","description":"Grow the stand immediately after creating it. Only meaningful when `points` supplies at least two points. Defaults to true when points are given."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_forest_points","kind":"act","impl":"imperative","description":"Appends control points to a forest field's spline, in order. The curve through them is a centripetal Catmull-Rom, so points may be placed close together without the shape cusping. Adding points marks the field dirty; it does not regrow until `grow_forest_field` runs.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"fieldId":{"type":"string","description":"Forest field ID. Omit when exactly one field exists."},"points":{"type":"array","description":"Ground-plane points in world meters, in the order they should join.","items":{"type":"object","properties":{"x":{"type":"number"},"z":{"type":"number"}},"required":["x","z"]}}},"required":["points"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"grow_forest_field","kind":"act","impl":"imperative","description":"Grows a forest field: lays out the stems, scatters the boulders, and reports what was produced. This is the expensive step in the whole forest system, so it is explicit and never implied by editing the shape. Growing again after a change replaces the previous stand.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"fieldId":{"type":"string","description":"Forest field ID. Omit to grow every dirty field."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_primitive","kind":"act","impl":"imperative","description":"Places a parametric primitive shape (cube, sphere, cylinder, cone). Use it for static blockout primitives or physics props.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"x":{"type":"number","description":"World X position"},"y":{"type":"number","description":"World Y position"},"z":{"type":"number","description":"World Z position"},"role":{"type":"string","enum":["brush","prop"],"description":"brush = static blockout primitive, prop = physics object"},"shape":{"type":"string","enum":["cube","sphere","cylinder","cone"],"description":"Primitive shape"},"sizeX":{"type":"number","description":"Size X (default: 2)"},"sizeY":{"type":"number","description":"Size Y (default: 2, or 3 for cylinder/cone)"},"sizeZ":{"type":"number","description":"Size Z (default: 2)"},"materialId":{"type":"string","description":"Material ID to apply directly. Avoids needing a separate assign_material call."},"name":{"type":"string","description":"Display name"}},"required":["x","y","z","role","shape"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_blockout_room","kind":"act","impl":"imperative","description":"Places a blockout room (enclosed box with walls, floor, ceiling). Open sides remove entire wall/floor/ceiling planes for coarse full-side openings only. Position is the center-bottom of the room.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"x":{"type":"number","description":"World X position of room center"},"y":{"type":"number","description":"World Y position of room bottom (usually 0 for ground level)"},"z":{"type":"number","description":"World Z position of room center"},"sizeX":{"type":"number","description":"Room width in meters (X axis)"},"sizeY":{"type":"number","description":"Room height in meters (Y axis)"},"sizeZ":{"type":"number","description":"Room depth in meters (Z axis)"},"openSides":{"type":"array","items":{"type":"string","enum":["north","south","east","west","top","bottom"]},"description":"Whole sides to leave open. This removes the entire wall, floor, or ceiling plane and is not suitable for doorway- or hallway-sized openings."},"materialId":{"type":"string","description":"Material ID to apply. Use list_materials to see available IDs."},"name":{"type":"string","description":"Display name for the room node"}},"required":["x","y","z","sizeX","sizeY","sizeZ"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_scene_settings","kind":"act","impl":"imperative","description":"Updates scene settings (world physics, fog, ambient, skybox, grass wind, player config). Skybox uses world.skybox; grass wind animates the procedural grass field shader.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"gravityX":{"type":"number","description":"Gravity X (default: 0)"},"gravityY":{"type":"number","description":"Gravity Y (default: -9.81)"},"gravityZ":{"type":"number","description":"Gravity Z (default: 0)"},"physicsEnabled":{"type":"boolean","description":"Enable physics simulation"},"ambientColor":{"type":"string","description":"Ambient light hex color"},"ambientIntensity":{"type":"number","description":"Ambient light intensity"},"fogColor":{"type":"string","description":"Fog hex color"},"fogNear":{"type":"number","description":"Fog near distance"},"fogFar":{"type":"number","description":"Fog far distance"},"skyboxEnabled":{"type":"boolean","description":"Enable HDR/image skybox"},"skyboxSource":{"type":"string","description":"Skybox URL or asset path (HDR or image per skyboxFormat)"},"skyboxFormat":{"type":"string","enum":["hdr","image"],"description":"Skybox file type"},"skyboxName":{"type":"string","description":"Display label for the sky preset"},"skyboxIntensity":{"type":"number","description":"Skybox display intensity"},"skyboxLightingIntensity":{"type":"number","description":"How strongly the sky contributes to scene lighting (when affectsLighting)"},"skyboxBlur":{"type":"number","description":"IBL / sky blur amount"},"skyboxAffectsLighting":{"type":"boolean","description":"Whether skybox drives environmental lighting"},"grassEnabled":{"type":"boolean","description":"Enable procedural grass field in lit viewport"},"grassWindSpeed":{"type":"number","description":"Grass shader wind speed"},"grassWindStrength":{"type":"number","description":"Grass shader wind displacement strength"},"cameraMode":{"type":"string","enum":["fps","third-person","top-down"],"description":"Player camera mode"},"playerHeight":{"type":"number","description":"Player height in meters"},"movementSpeed":{"type":"number","description":"Player movement speed"},"jumpHeight":{"type":"number","description":"Player jump height"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"cast_vfx_ability","kind":"act","impl":"imperative","description":"Fires one of seven combat abilities in the viewport as a one-off effect. Each travels from an origin along a flat heading, erupts at the far end, then clears itself. Use it to show what an ability looks like or to dress a frame. The cast is not saved with the scene. Call list_vfx_abilities first to match an ability to what the user described.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"element":{"type":"string","enum":["pyre","kraken","electrical","earth","portal","aether","firePortal"],"description":"Which ability. pyre is a ring of burning blades over a molten crater; kraken is cephalopod arms hauling out of a rift and hammering the ground;…"},"x":{"type":"number","description":"World X the cast starts from, in meters. Defaults to 0."},"y":{"type":"number","description":"World Y of the cast origin, in meters. Ground level unless the ability hangs in the air. Defaults to 0."},"z":{"type":"number","description":"World Z the cast starts from, in meters. Defaults to 0."},"directionX":{"type":"number","description":"Flat heading X. Need not be unit length; it is normalised. Defaults to 0."},"directionZ":{"type":"number","description":"Flat heading Z. Defaults to 1, i.e. straight along +Z."},"distance":{"type":"number","description":"How far the cast reaches, in meters. 20 is a natural skillshot range; clamped to 1-400."}},"required":["element"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_procedural_world","kind":"act","impl":"imperative","description":"Creates a persistent LAAS procedural-world node. It is WebGPU-only and stores deterministic generator settings rather than generated GPU data.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string"},"seed":{"type":"number"},"preset":{"type":"string","enum":["low","high","ultra"]},"worldSizeMeters":{"type":"number"},"timeOfDay":{"type":"number"},"allowDuplicate":{"type":"boolean"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"inspect_procedural_world","kind":"answer","impl":"imperative","description":"Returns persisted settings and current deterministic configuration for a procedural world.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"regenerate_procedural_world","kind":"act","impl":"imperative","description":"Queues regeneration from the persisted LAAS seed and settings. Does not claim GPU generation succeeded before the viewport reports it.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_procedural_world_seed","kind":"act","impl":"imperative","description":"Sets the deterministic uint32 seed for a procedural world.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"seed":{"type":"number"}},"required":["seed"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_procedural_world_preset","kind":"act","impl":"imperative","description":"Selects the low, high, or ultra LAAS quality preset.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"preset":{"type":"string","enum":["low","high","ultra"]}},"required":["preset"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"configure_procedural_terrain","kind":"act","impl":"imperative","description":"Configures LAAS terrain/hydrology authoring controls.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"heightAmplitude":{"type":"number"},"noiseScale":{"type":"number"},"hydraulicErosion":{"type":"number"},"thermalErosion":{"type":"number"},"riverThreshold":{"type":"number"},"lakeBehavior":{"type":"string","enum":["connected","natural","off"]},"moisture":{"type":"number"},"snow":{"type":"number"},"terrainRange":{"type":"number"},"farShell":{"type":"boolean"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"configure_proc_vegetation","kind":"act","impl":"imperative","description":"Configures LAAS GPU scatter densities, species, slopes, impostors, and wind response.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"enabledSpecies":{"type":"array","items":{"type":"string"}},"treeDensity":{"type":"number"},"understoryDensity":{"type":"number"},"grassDensity":{"type":"number"},"slopeLimit":{"type":"number"},"scatterSeedOffset":{"type":"number"},"impostorRange":{"type":"number"},"windResponse":{"type":"number"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"configure_procedural_lighting","kind":"act","impl":"imperative","description":"Configures LAAS sun, cascaded shadows, and canopy-aware GI.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"giEnabled":{"type":"boolean"},"shadowQuality":{"type":"string","enum":["low","high","ultra"]},"sunAzimuth":{"type":"number"},"sunElevation":{"type":"number"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"configure_proc_atmosphere","kind":"act","impl":"imperative","description":"Configures LAAS clouds, fog, and froxel volumetrics.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"cloudCoverage":{"type":"number"},"cloudSpeed":{"type":"number"},"fogDensity":{"type":"number"},"volumetrics":{"type":"boolean"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"configure_procedural_water","kind":"act","impl":"imperative","description":"Configures LAAS rivers/lakes, reflections, caustics, foam, wet margins, and clipmap distance.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"enabled":{"type":"boolean"},"reflectionQuality":{"type":"string","enum":["low","high","ultra"]},"caustics":{"type":"boolean"},"foam":{"type":"boolean"},"wetMargins":{"type":"boolean"},"clipmapDistance":{"type":"number"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"configure_procedural_motion","kind":"act","impl":"imperative","description":"Configures LAAS wind, cloud motion, particle classes, and deterministic freeze mode.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"windDirection":{"type":"number"},"windStrength":{"type":"number"},"cloudSpeed":{"type":"number"},"particlePreset":{"type":"string","enum":["low","high","ultra"]},"particleTypes":{"type":"array","items":{"type":"string","enum":["leaves","pollen","snow"]}},"freezeSimulation":{"type":"boolean"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"configure_procedural_post","kind":"act","impl":"imperative","description":"Configures LAAS TAA, GTAO, bounce, bloom, exposure, and debug view settings.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"taa":{"type":"boolean"},"gtao":{"type":"boolean"},"screenSpaceBounce":{"type":"boolean"},"bloom":{"type":"boolean"},"autoExposure":{"type":"boolean"},"debugView":{"type":"string","enum":["none","ao","clouds","velocity"]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_world_time_of_day","kind":"act","impl":"imperative","description":"Sets LAAS physical sky time of day in hours from 0 through 24.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"timeOfDay":{"type":"number"}},"required":["timeOfDay"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_world_weather","kind":"act","impl":"imperative","description":"Applies a concise cloud/fog/particle weather configuration.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"cloudCoverage":{"type":"number"},"fogDensity":{"type":"number"},"particleTypes":{"type":"array","items":{"type":"string"}}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_world_exploration_mode","kind":"act","impl":"imperative","description":"Sets editor, walk, or fly exploration mode for the world preview/runtime.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"mode":{"type":"string","enum":["editor","walk","fly"]}},"required":["mode"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_world_bookmark","kind":"act","impl":"imperative","description":"Adds a serialized procedural-world camera bookmark.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"name":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"yaw":{"type":"number"},"pitch":{"type":"number"},"timeOfDay":{"type":"number"}},"required":["name","x","y","z"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_world_bookmark","kind":"act","impl":"imperative","description":"Updates a serialized procedural-world camera bookmark.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"bookmarkId":{"type":"string"},"name":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"yaw":{"type":"number"},"pitch":{"type":"number"},"timeOfDay":{"type":"number"}},"required":["bookmarkId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_world_bookmark","kind":"transact","impl":"imperative","description":"Deletes a serialized procedural-world camera bookmark.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"},"bookmarkId":{"type":"string"}},"required":["bookmarkId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"play_world_flythrough","kind":"act","impl":"imperative","description":"Enters LAAS fly exploration mode so its composed bookmark flythrough controls can run.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"stop_world_flythrough","kind":"act","impl":"imperative","description":"Returns the procedural world to editor exploration mode.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"inspect_world_performance","kind":"answer","impl":"imperative","description":"Returns persisted quality/capacity expectations; live GPU timings are available only after a WebGPU world is running.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"capture_world_verify_shot","kind":"act","impl":"imperative","description":"Captures the current viewport for procedural-world verification when screenshot capture is available.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_copilot_skill_references","kind":"answer","impl":"imperative","description":"Lists available read-only Copilot skill references. Use this before reading a deeper reference when the active skill names several documents.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"skillId":{"type":"string","description":"Optional active Copilot skill ID"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"read_copilot_skill_reference","kind":"answer","impl":"imperative","description":"Reads a bounded line range from an active Copilot skill reference. Do not reread an identical range during this run.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"skillId":{"type":"string"},"referenceId":{"type":"string"},"startLine":{"type":"number"},"endLine":{"type":"number"},"maxChars":{"type":"number","description":"Maximum 24000 characters"}},"required":["skillId","referenceId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"search_skill_references","kind":"answer","impl":"imperative","description":"Searches active Copilot skill references and returns focused line ranges. Search before reading a long document.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string"},"skillId":{"type":"string"},"referenceIds":{"type":"array","items":{"type":"string"}},"maxResults":{"type":"number","description":"Maximum 24 results"}},"required":["query"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_blockout_platform","kind":"act","impl":"imperative","description":"Places a flat blockout mesh platform (floor slab, roof, shelf). Position is the center of the platform volume.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"x":{"type":"number","description":"World X position"},"y":{"type":"number","description":"World Y position (center of slab thickness)"},"z":{"type":"number","description":"World Z position"},"sizeX":{"type":"number","description":"Platform width (X)"},"sizeY":{"type":"number","description":"Platform thickness (Y), typically 0.25-0.5"},"sizeZ":{"type":"number","description":"Platform depth (Z)"},"materialId":{"type":"string","description":"Material ID"},"name":{"type":"string","description":"Display name"}},"required":["x","y","z","sizeX","sizeY","sizeZ"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_blockout_stairs","kind":"act","impl":"imperative","description":"Places a parametric staircase with optional landings. Position is the center-bottom of the bottom landing. Returns topLandingCenter for chaining connections.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"x":{"type":"number","description":"World X position of stair base"},"y":{"type":"number","description":"World Y position of stair base (bottom)"},"z":{"type":"number","description":"World Z position of stair base"},"stepCount":{"type":"number","description":"Number of steps"},"stepHeight":{"type":"number","description":"Height of each step in meters (typical: 0.2)"},"treadDepth":{"type":"number","description":"Depth of each step tread in meters (typical: 0.3)"},"width":{"type":"number","description":"Stair width in meters"},"direction":{"type":"string","enum":["north","south","east","west"],"description":"Direction the stairs ascend toward (default: north)"},"materialId":{"type":"string","description":"Material ID"},"name":{"type":"string","description":"Display name"}},"required":["x","y","z","stepCount","stepHeight","treadDepth","width"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_brush","kind":"act","impl":"imperative","description":"Legacy-named compatibility tool that places a simple axis-aligned mesh box. Default is a 4x3x4 box. Prefer mesh editing workflows after placement.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"x":{"type":"number","description":"World X position"},"y":{"type":"number","description":"World Y position"},"z":{"type":"number","description":"World Z position"},"sizeX":{"type":"number","description":"Brush width (default: 4)"},"sizeY":{"type":"number","description":"Brush height (default: 3)"},"sizeZ":{"type":"number","description":"Brush depth (default: 4)"},"name":{"type":"string","description":"Display name"}},"required":["x","y","z"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_light","kind":"act","impl":"imperative","description":"Places a light in the scene. Types: point (local area), directional (sun), spot (focused cone), ambient (global fill), hemisphere (sky/ground).","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"x":{"type":"number","description":"World X position"},"y":{"type":"number","description":"World Y position"},"z":{"type":"number","description":"World Z position"},"type":{"type":"string","enum":["point","directional","spot","ambient","hemisphere"],"description":"Light type"},"color":{"type":"string","description":"Hex color (e.g. '#ffffff')"},"intensity":{"type":"number","description":"Light intensity"}},"required":["x","y","z","type"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_entity","kind":"act","impl":"imperative","description":"Places a gameplay entity (spawn point, NPC, or interactive object). Prefer place_player_spawn for playable start positions.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"x":{"type":"number","description":"World X position"},"y":{"type":"number","description":"World Y position"},"z":{"type":"number","description":"World Z position"},"rotationY":{"type":"number","description":"Yaw rotation in radians"},"type":{"type":"string","enum":["player-spawn","npc-spawn","smart-object"],"description":"Entity type"},"name":{"type":"string","description":"Display name"}},"required":["x","y","z","type"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_player_spawn","kind":"act","impl":"imperative","description":"Places a player-spawn entity. Use this for playable maps instead of generic entity placement.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"x":{"type":"number","description":"World X position"},"y":{"type":"number","description":"World Y position"},"z":{"type":"number","description":"World Z position"},"rotationY":{"type":"number","description":"Yaw rotation in radians"},"name":{"type":"string","description":"Display name"}},"required":["x","y","z"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_skatepark_element","kind":"act","impl":"imperative","description":"Places a procedural skatepark element (ramps, rails, bowls, etc.). Position is the center-bottom of the element.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"x":{"type":"number","description":"World X position"},"y":{"type":"number","description":"World Y position (bottom)"},"z":{"type":"number","description":"World Z position"},"type":{"type":"string","enum":["quarter-pipe","half-pipe","bank","spine","gap-to-rail","floor","ledge","rail","stair-set","hubba","bowl","taco","handrail","kicker"],"description":"Type of skatepark element"},"rotationY":{"type":"number","description":"Rotation around Y axis in radians (default: 0)"},"width":{"type":"number","description":"Standard width (default: 4)"},"height":{"type":"number","description":"Standard height (default: 2)"},"length":{"type":"number","description":"Standard length/depth (default: 4)"},"materialId":{"type":"string","description":"Specific material ID (e.g. 'material:skate:concrete', 'material:skate:plywood', 'material:skate:metal')"},"name":{"type":"string","description":"Display name"}},"required":["x","y","z","type"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_architecture_element","kind":"act","impl":"imperative","description":"Places an architecture element (wall, slab, ceiling, roof, door, window, light fixture). Position is the center-bottom of the element.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"x":{"type":"number","description":"World X position"},"y":{"type":"number","description":"World Y position (bottom)"},"z":{"type":"number","description":"World Z position"},"type":{"type":"string","enum":["wall","slab","ceiling","roof","item"],"description":"Architecture element type"},"width":{"type":"number","description":"Width in meters (default: 4)"},"height":{"type":"number","description":"Height in meters (default: 3 for walls, 0.2 for slabs)"},"depth":{"type":"number","description":"Depth in meters (default: 4 for slabs/ceilings/roofs)"},"thickness":{"type":"number","description":"Thickness in meters (default: 0.2 for walls, 0.15 for ceilings)"},"pitchAngle":{"type":"number","description":"Roof pitch angle in degrees, 0 for flat (default: 30)"},"overhang":{"type":"number","description":"Roof overhang in meters (default: 0.3)"},"itemType":{"type":"string","enum":["door","window","light-fixture"],"description":"Item sub-type (required when type is 'item')"},"rotationY":{"type":"number","description":"Rotation around Y axis in radians (default: 0)"},"materialId":{"type":"string","description":"Material ID (defaults to architecture material for the element type)"},"name":{"type":"string","description":"Display name"}},"required":["x","y","z","type"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"translate_nodes","kind":"act","impl":"imperative","description":"Moves nodes by a relative offset (delta). Does not set absolute position — adds delta to current position.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeIds":{"type":"array","items":{"type":"string"},"description":"Node IDs to move"},"dx":{"type":"number","description":"X offset"},"dy":{"type":"number","description":"Y offset"},"dz":{"type":"number","description":"Z offset"}},"required":["nodeIds","dx","dy","dz"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_node_transform","kind":"act","impl":"imperative","description":"Sets a node's absolute position, rotation, and scale.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Node ID"},"x":{"type":"number","description":"Absolute X position"},"y":{"type":"number","description":"Absolute Y position"},"z":{"type":"number","description":"Absolute Z position"},"rotationX":{"type":"number","description":"Rotation X in radians"},"rotationY":{"type":"number","description":"Rotation Y in radians"},"rotationZ":{"type":"number","description":"Rotation Z in radians"},"scaleX":{"type":"number","description":"Scale X"},"scaleY":{"type":"number","description":"Scale Y"},"scaleZ":{"type":"number","description":"Scale Z"}},"required":["nodeId","x","y","z"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"duplicate_nodes","kind":"act","impl":"imperative","description":"Duplicates nodes with a position offset. Returns the new node IDs.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeIds":{"type":"array","items":{"type":"string"},"description":"Node IDs to duplicate"},"offsetX":{"type":"number","description":"X offset for duplicates"},"offsetY":{"type":"number","description":"Y offset for duplicates"},"offsetZ":{"type":"number","description":"Z offset for duplicates"}},"required":["nodeIds","offsetX","offsetY","offsetZ"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"mirror_nodes","kind":"act","impl":"imperative","description":"Mirrors (flips) nodes across the specified axis.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeIds":{"type":"array","items":{"type":"string"},"description":"Node IDs to mirror"},"axis":{"type":"string","enum":["x","y","z"],"description":"Axis to mirror across"}},"required":["nodeIds","axis"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_nodes","kind":"transact","impl":"imperative","description":"Deletes nodes and/or entities by their IDs. Also removes all children.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"Node or entity IDs to delete"}},"required":["ids"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"split_brush","kind":"act","impl":"imperative","description":"Legacy brush-only tool. Splits brush nodes at their midpoint along the specified axis. Returns the new node IDs.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeIds":{"type":"array","items":{"type":"string"},"description":"Brush node IDs to split"},"axis":{"type":"string","enum":["x","y","z"],"description":"Axis to split along"}},"required":["nodeIds","axis"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"extrude_brush","kind":"act","impl":"imperative","description":"Legacy brush-only tool. Extrudes (grows) brush nodes along an axis by a given amount.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeIds":{"type":"array","items":{"type":"string"},"description":"Brush node IDs"},"axis":{"type":"string","enum":["x","y","z"],"description":"Extrusion axis"},"amount":{"type":"number","description":"Extrusion distance in meters"},"direction":{"type":"string","enum":["-1","1"],"description":"Extrusion direction: '-1' (negative) or '1' (positive)"}},"required":["nodeIds","axis","amount","direction"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"offset_brush_face","kind":"act","impl":"imperative","description":"Legacy brush-only tool. Moves a single face of a brush inward or outward.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Brush node ID"},"axis":{"type":"string","enum":["x","y","z"],"description":"Face axis"},"side":{"type":"string","enum":["min","max"],"description":"Which face (min or max)"},"amount":{"type":"number","description":"Offset amount (positive = outward)"}},"required":["nodeId","axis","side","amount"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"assign_material_to_brushes","kind":"act","impl":"imperative","description":"Legacy brush-only tool. Assigns a material to all faces of the specified brush nodes.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeIds":{"type":"array","items":{"type":"string"},"description":"Brush node IDs"},"materialId":{"type":"string","description":"Material ID to assign"}},"required":["nodeIds","materialId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_material","kind":"act","impl":"imperative","description":"Creates or updates a material in the scene library. The ID is auto-generated as 'material:custom:<slug>' from the name (e.g. name 'Dark Wood' → id 'material:custom:dark-wood'). You can use this predictable ID immediately in assign_material calls.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Material display name"},"color":{"type":"string","description":"Hex color (e.g. '#ff6633')"},"category":{"type":"string","enum":["flat","blockout","custom"],"description":"Material category (default: custom)"},"metalness":{"type":"number","description":"Metalness 0-1 (default: 0)"},"roughness":{"type":"number","description":"Roughness 0-1 (default: 0.8)"}},"required":["name","color"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"assign_material","kind":"act","impl":"imperative","description":"Assigns a material to nodes (all faces) or specific faces on nodes.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"targets":{"type":"array","items":{"type":"object","properties":{"nodeId":{"type":"string","description":"Node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Optional face IDs (omit for all faces)"}},"required":["nodeId"]},"description":"Nodes (and optional faces) to assign material to"},"materialId":{"type":"string","description":"Material ID to assign"}},"required":["targets","materialId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_uv_scale","kind":"act","impl":"imperative","description":"Sets UV texture tiling scale on nodes or specific faces.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"targets":{"type":"array","items":{"type":"object","properties":{"nodeId":{"type":"string"},"faceIds":{"type":"array","items":{"type":"string"}}},"required":["nodeId"]}},"scaleX":{"type":"number","description":"UV scale X"},"scaleY":{"type":"number","description":"UV scale Y"}},"required":["targets","scaleX","scaleY"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"group_nodes","kind":"act","impl":"imperative","description":"Groups nodes/entities under a new group node. Returns the group ID.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"Node/entity IDs to group"}},"required":["ids"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"select_nodes","kind":"act","impl":"imperative","description":"Sets the editor selection to the given node/entity IDs.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"IDs to select"}},"required":["ids"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"clear_selection","kind":"act","impl":"imperative","description":"Clears the current editor selection.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"undo","kind":"act","impl":"imperative","description":"Undoes the last editor command.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"push_scene_to_connected_game","kind":"act","impl":"imperative","description":"Pushes the current editor scene into the connected scaffolded game dev server. Use it when the user asks to sync or send the current scene to the game.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"forceSwitch":{"type":"boolean","description":"If true, request the game to reload directly into the pushed scene after syncing."},"gameId":{"type":"string","description":"Optional specific connected game ID when more than one game is available."},"projectName":{"type":"string","description":"Optional project display name override for the pushed scene."},"projectSlug":{"type":"string","description":"Optional slug override for the target scene folder."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_articulated_asset","kind":"act","impl":"imperative","description":"Creates a true Articraft-generated articulated 3D asset in the editor viewport by calling the local Articraft Python SDK/compiler, compiling an Articraft model.py into URDF/mesh assets, and importing the result. Use this for objects with semantic parts and joints such as robot arms, desk lamps, cabinets with drawers, vehicles with wheels, doors, lids, sliders, hinges, levers, grippers, and mechanisms.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Asset display name, e.g. 'Articulated Desk Lamp'"},"prompt":{"type":"string","description":"The original natural-language asset request. Used as Articraft provenance metadata."},"x":{"type":"number","description":"Root world X position"},"y":{"type":"number","description":"Root world Y position"},"z":{"type":"number","description":"Root world Z position"},"showJointGuides":{"type":"boolean","description":"Whether to add visible pivot/axis guide primitives for each joint. Default true."},"parts":{"type":"array","description":"Semantic parts. Each part becomes a viewport node. Positions are local to parentPartId when provided, otherwise local to the asset root.","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable part id such as 'base', 'upper_arm', 'drawer'"},"name":{"type":"string","description":"Part display name"},"parentPartId":{"type":"string","description":"Optional parent part id. Use 'root' or omit for root-level parts."},"semanticRole":{"type":"string","description":"Semantic role such as base, housing, hinge, arm, wheel, drawer, lid, handle, bracket, knob"},"shape":{"type":"string","enum":["cube","box","sphere","cylinder","cone"],"description":"Simple viewport primitive shape"},"x":{"type":"number","description":"Local X position"},"y":{"type":"number","description":"Local Y position"},"z":{"type":"number","description":"Local Z position"},"sizeX":{"type":"number","description":"Part size along X"},"sizeY":{"type":"number","description":"Part size along Y"},"sizeZ":{"type":"number","description":"Part size along Z"},"rotationX":{"type":"number","description":"Local X rotation in radians"},"rotationY":{"type":"number","description":"Local Y rotation in radians"},"rotationZ":{"type":"number","description":"Local Z rotation in radians"},"pivotX":{"type":"number","description":"Optional local pivot X for hinge/slider previews"},"pivotY":{"type":"number","description":"Optional local pivot Y for hinge/slider previews"},"pivotZ":{"type":"number","description":"Optional local pivot Z for hinge/slider previews"},"materialId":{"type":"string","description":"Existing material id to use"},"color":{"type":"string","description":"Hex color if a new material should be created for this part"},"metalness":{"type":"number","description":"Optional material metalness 0-1"},"roughness":{"type":"number","description":"Optional material roughness 0-1"},"mass":{"type":"number","description":"Optional physical mass metadata"}},"required":["id","name","shape","x","y","z","sizeX","sizeY","sizeZ"]}},"joints":{"type":"array","description":"Articulations between parts, using Articraft/URDF-style conventions: origin is in the parent part frame; axis is in the joint frame; revolute values…","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable joint id, e.g. 'base_to_arm'"},"name":{"type":"string","description":"Joint display name"},"type":{"type":"string","enum":["fixed","revolute","continuous","prismatic","ball"],"description":"Joint/articulation type"},"parentPartId":{"type":"string","description":"Parent part id"},"childPartId":{"type":"string","description":"Child part id"},"originX":{"type":"number","description":"Joint origin X in parent part frame"},"originY":{"type":"number","description":"Joint origin Y in parent part frame"},"originZ":{"type":"number","description":"Joint origin Z in parent part frame"},"axisX":{"type":"number","description":"Joint axis X"},"axisY":{"type":"number","description":"Joint axis Y"},"axisZ":{"type":"number","description":"Joint axis Z"},"lower":{"type":"number","description":"Lower motion limit; radians for revolute, meters for prismatic"},"upper":{"type":"number","description":"Upper motion limit; radians for revolute, meters for prismatic"},"defaultValue":{"type":"number","description":"Optional default preview value"},"effort":{"type":"number","description":"Optional effort limit metadata"},"velocity":{"type":"number","description":"Optional velocity limit metadata"},"mimicJointId":{"type":"string","description":"Optional source joint id this joint mimics"},"mimicMultiplier":{"type":"number","description":"Optional mimic multiplier"},"mimicOffset":{"type":"number","description":"Optional mimic offset"}},"required":["id","type","parentPartId","childPartId"]}}},"required":["name","parts","joints"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"pose_articulated_joint","kind":"act","impl":"imperative","description":"Sets a preview pose for one articulated asset joint in the viewport. Revolute/continuous values are radians; prismatic values are meters. The pose is stored on the asset metadata and applied from the child part's saved base transform.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"assetNodeId":{"type":"string","description":"Root articulated asset group node id"},"jointId":{"type":"string","description":"Joint id or joint name to pose"},"value":{"type":"number","description":"Joint value in radians or meters"},"clampToLimits":{"type":"boolean","description":"Clamp value to lower/upper limits when present. Default true."}},"required":["assetNodeId","jointId","value"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_entities","kind":"answer","impl":"imperative","description":"Lists entities in a lightweight form with ID, name, type, and parentId. Use get_entity_details for full data.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_materials","kind":"answer","impl":"imperative","description":"Lists all materials in the scene with their ID, name, color, and category.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_scene_paths","kind":"answer","impl":"imperative","description":"Lists all scene-level waypoint paths with ids, names, loop state, and points.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_scene_events","kind":"answer","impl":"imperative","description":"Lists the standard and custom gameplay events available in the scene.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_hook_types","kind":"answer","impl":"imperative","description":"Lists all supported gameplay hook types, including field paths, defaults, emitted events, and listened events.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_articulated_assets","kind":"answer","impl":"imperative","description":"Lists articulated asset roots created in the viewport, including part/joint counts and current pose metadata.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_articulated_asset_details","kind":"answer","impl":"imperative","description":"Gets full structured part, joint, pose, and node details for one articulated asset root.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"assetNodeId":{"type":"string","description":"Root articulated asset group node id"}},"required":["assetNodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_entity_details","kind":"answer","impl":"imperative","description":"Gets full details of a specific entity, including transform, worldTransform, parentId, properties, and hooks.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"entityId":{"type":"string","description":"Entity ID to inspect"}},"required":["entityId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_scene_path","kind":"act","impl":"imperative","description":"Creates a new scene-level waypoint path. Paths are referenced by hook config such as path_mover.pathId.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Optional explicit path id"},"name":{"type":"string","description":"Display name"},"loop":{"type":"boolean","description":"Whether the path loops"},"points":{"type":"array","items":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"}},"required":["x","y","z"]},"description":"Waypoint points in world space"}},"required":["name","points"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_scene_path","kind":"act","impl":"imperative","description":"Updates a scene path by replacing any provided fields such as name, loop, or points.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"pathId":{"type":"string","description":"Path id to update"},"name":{"type":"string","description":"New display name"},"loop":{"type":"boolean","description":"Whether the path loops"},"points":{"type":"array","items":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"}},"required":["x","y","z"]},"description":"Replacement waypoint points in world space"}},"required":["pathId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_scene_path","kind":"transact","impl":"imperative","description":"Deletes a scene-level waypoint path.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"pathId":{"type":"string","description":"Path id to delete"}},"required":["pathId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_hook","kind":"act","impl":"imperative","description":"Attaches a gameplay hook to a node or entity using the canonical default config for that hook type, then applies any provided config overrides.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"targetKind":{"type":"string","enum":["node","entity"],"description":"Whether the hook attaches to a node or entity"},"targetId":{"type":"string","description":"Node or entity id"},"hookType":{"type":"string","description":"Hook type. Use list_hook_types to inspect supported types."},"enabled":{"type":"boolean","description":"Whether the hook starts enabled"},"defaultPathId":{"type":"string","description":"Optional default path id for path_mover hooks"},"config":{"type":"object","additionalProperties":true,"description":"Optional config override object merged into the canonical default config"}},"required":["targetKind","targetId","hookType"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_hook_value","kind":"act","impl":"imperative","description":"Sets a specific hook config value by dot path on an existing node/entity hook.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"targetKind":{"type":"string","enum":["node","entity"],"description":"Whether the hook is on a node or entity"},"targetId":{"type":"string","description":"Node or entity id"},"hookId":{"type":"string","description":"Hook id to edit"},"path":{"type":"string","description":"Dot path inside hook.config, for example 'pathId' or 'trigger.event'"},"value":{"description":"New value to write at the config path"}},"required":["targetKind","targetId","hookId","path","value"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_hook","kind":"act","impl":"imperative","description":"Removes a gameplay hook from a node or entity.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"targetKind":{"type":"string","enum":["node","entity"],"description":"Whether the hook is on a node or entity"},"targetId":{"type":"string","description":"Node or entity id"},"hookId":{"type":"string","description":"Hook id to remove"}},"required":["targetKind","targetId","hookId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_behavior_trees","kind":"answer","impl":"imperative","description":"Lists locally saved behavior trees from the AI Behavior Tree Editor.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_behavior_tree","kind":"answer","impl":"imperative","description":"Gets the full nodes and edges for a saved behavior tree by id.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"treeId":{"type":"string","description":"Behavior tree id"}},"required":["treeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_behavior_tree","kind":"act","impl":"imperative","description":"Creates a new behavior tree in local storage. By default it starts with a root node only. Set useDefaultTemplate to true for the starter attack/patrol example tree.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"treeId":{"type":"string","description":"Optional requested tree id. If omitted, one is derived from the name."},"name":{"type":"string","description":"Tree display name"},"useDefaultTemplate":{"type":"boolean","description":"Whether to start from the built-in sample tree instead of an empty root-only tree"}},"required":["name"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_behavior_tree_node","kind":"act","impl":"imperative","description":"Adds a node to a behavior tree, optionally connecting it under a parent node.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"treeId":{"type":"string","description":"Behavior tree id"},"nodeType":{"type":"string","enum":["root","selector","sequence","parallel","inverter","repeater","condition","action"],"description":"Behavior tree node type"},"label":{"type":"string","description":"Optional node label"},"parentNodeId":{"type":"string","description":"Optional parent node id to connect from"},"positionX":{"type":"number","description":"Optional canvas X position"},"positionY":{"type":"number","description":"Optional canvas Y position"},"event":{"type":"string","description":"Condition event name"},"mode":{"type":"string","enum":["allOf","anyOf"],"description":"Condition mode"},"actionType":{"type":"string","description":"Action type, usually emit"},"actionTarget":{"type":"string","description":"Action target/event name"},"actionValue":{"type":"string","description":"Optional action value"},"count":{"type":"number","description":"Repeater count"}},"required":["treeId","nodeType"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_behavior_tree_node","kind":"act","impl":"imperative","description":"Updates label, behavior data, or canvas position for an existing behavior tree node.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"treeId":{"type":"string","description":"Behavior tree id"},"nodeId":{"type":"string","description":"Node id"},"label":{"type":"string","description":"Updated node label"},"event":{"type":"string","description":"Condition event name"},"mode":{"type":"string","enum":["allOf","anyOf"],"description":"Condition mode"},"actionType":{"type":"string","description":"Action type"},"actionTarget":{"type":"string","description":"Action target/event name"},"actionValue":{"type":"string","description":"Optional action value"},"count":{"type":"number","description":"Repeater count"},"positionX":{"type":"number","description":"Canvas X position"},"positionY":{"type":"number","description":"Canvas Y position"}},"required":["treeId","nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"connect_behavior_tree_nodes","kind":"act","impl":"imperative","description":"Creates a directed edge from one behavior tree node to another.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"treeId":{"type":"string","description":"Behavior tree id"},"sourceNodeId":{"type":"string","description":"Parent/source node id"},"targetNodeId":{"type":"string","description":"Child/target node id"}},"required":["treeId","sourceNodeId","targetNodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_behavior_tree_node","kind":"transact","impl":"imperative","description":"Deletes a node and any connected edges from a behavior tree.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"treeId":{"type":"string","description":"Behavior tree id"},"nodeId":{"type":"string","description":"Node id"}},"required":["treeId","nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"apply_behavior_tree_layout","kind":"act","impl":"imperative","description":"Automatically lays out the nodes in a behavior tree.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"treeId":{"type":"string","description":"Behavior tree id"}},"required":["treeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_behavior_tree","kind":"transact","impl":"imperative","description":"Deletes a saved behavior tree from local storage.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"treeId":{"type":"string","description":"Behavior tree id"}},"required":["treeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_mesh_topology","kind":"answer","impl":"imperative","description":"Returns the face IDs, vertex IDs with positions, face centers, face normals, and edges for a mesh node. Use this before mesh editing operations to discover which faces/vertices/edges to target.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID to inspect"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"extrude_mesh_faces","kind":"act","impl":"imperative","description":"Extrude one or more faces of a mesh node along their normal by an amount. Use get_mesh_topology first to find face IDs.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to extrude"},"amount":{"type":"number","description":"Extrusion distance in meters (positive = outward)"}},"required":["nodeId","faceIds","amount"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"extrude_mesh_edge","kind":"act","impl":"imperative","description":"Extrude a boundary edge of a mesh outward, creating a new quad face.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"vertexId1":{"type":"string","description":"First vertex ID of the edge"},"vertexId2":{"type":"string","description":"Second vertex ID of the edge"},"amount":{"type":"number","description":"Extrusion distance"}},"required":["nodeId","vertexId1","vertexId2","amount"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"bevel_mesh_edges","kind":"act","impl":"imperative","description":"Bevel (chamfer/round) edges of a mesh. Creates smooth transitions at sharp edges.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"edges":{"type":"array","items":{"type":"array","items":{"type":"string"}},"description":"Edges as [[vertexId1, vertexId2], ...] pairs"},"width":{"type":"number","description":"Bevel width in meters"},"steps":{"type":"number","description":"Number of bevel segments (1=flat chamfer, 3+=smooth round)"},"profile":{"type":"string","enum":["flat","round"],"description":"Bevel profile shape (default: flat)"}},"required":["nodeId","edges","width","steps"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"inset_mesh_faces","kind":"act","impl":"imperative","description":"Inset selected faces to create an inner face loop. Use it for panel lines, door/window frames, and prep before extrusion.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to inset"},"amount":{"type":"number","description":"Inset amount in meters"}},"required":["nodeId","faceIds","amount"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"bridge_mesh_edges","kind":"act","impl":"imperative","description":"Bridge two selected boundary edges with a new face. Use get_mesh_topology first and pass exactly two edge pairs.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"edges":{"type":"array","items":{"type":"array","items":{"type":"string"}},"description":"Two edges as [[vertexId1, vertexId2], [vertexId3, vertexId4]]"}},"required":["nodeId","edges"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"poke_mesh_faces","kind":"act","impl":"imperative","description":"Poke selected faces into triangles from a new center vertex. Useful for radial detail, peaks, and controlled triangulation.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to poke"}},"required":["nodeId","faceIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"triangulate_mesh_faces","kind":"act","impl":"imperative","description":"Triangulate selected faces, or all faces when faceIds is omitted. Useful before runtime baking or cleanup.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Optional face IDs to triangulate"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"quadrangulate_mesh_faces","kind":"act","impl":"imperative","description":"Attempt to rebuild selected triangle pairs into quads. Use after triangulation or cleanup when quad authoring is preferred.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to quadrangulate"}},"required":["nodeId","faceIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"solidify_mesh","kind":"act","impl":"imperative","description":"Add shell thickness to a mesh as a one-shot topology edit. Prefer add_mesh_modeling_modifier type=solidify for live/non-destructive work.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"thickness":{"type":"number","description":"Shell thickness in meters"}},"required":["nodeId","thickness"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"mirror_mesh","kind":"act","impl":"imperative","description":"Mirror a mesh across one local axis as a one-shot topology edit. Prefer the modeling stack for reusable symmetry.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"axis":{"type":"string","enum":["x","y","z"],"description":"Mirror axis"}},"required":["nodeId","axis"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"weld_mesh_vertices_by_distance","kind":"act","impl":"imperative","description":"Merge vertices within a distance threshold. Use for cleanup after boolean, bridge, mirror, import, or remesh-style edits.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"vertexIds":{"type":"array","items":{"type":"string"},"description":"Optional vertex IDs to restrict the weld"},"distance":{"type":"number","description":"Maximum merge distance in meters"}},"required":["nodeId","distance"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"weld_mesh_vertices_to_target","kind":"act","impl":"imperative","description":"Target-weld source vertices into one target vertex. Use for precise cleanup and snapping holes shut.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"targetVertexId":{"type":"string","description":"Vertex ID that receives the weld"},"sourceVertexIds":{"type":"array","items":{"type":"string"},"description":"Vertex IDs to merge into the target"}},"required":["nodeId","targetVertexId","sourceVertexIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"subdivide_mesh_face","kind":"act","impl":"imperative","description":"Subdivide a mesh face into smaller faces. Quad faces get a grid pattern, others get radial.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceId":{"type":"string","description":"Face ID to subdivide"},"cuts":{"type":"number","description":"Number of cuts (1=2x2 for quads, 2=3x3, etc.)"}},"required":["nodeId","faceId","cuts"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"cut_mesh_face","kind":"act","impl":"imperative","description":"Cut a mesh face with a line passing through a point, splitting it into two faces.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceId":{"type":"string","description":"Face ID to cut"},"pointX":{"type":"number","description":"X coordinate of cut point on the face"},"pointY":{"type":"number","description":"Y coordinate"},"pointZ":{"type":"number","description":"Z coordinate"},"snapSize":{"type":"number","description":"Snap resolution (default: 1)"}},"required":["nodeId","faceId","pointX","pointY","pointZ"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"cut_mesh_between_edges","kind":"act","impl":"imperative","description":"Knife-cut a polygon by connecting the midpoints of two non-adjacent edges on the same face.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"edges":{"type":"array","items":{"type":"array","items":{"type":"string"}},"description":"Exactly two non-adjacent edges as [[vertexId1, vertexId2], [vertexId3, vertexId4]]"}},"required":["nodeId","edges"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_mesh_faces","kind":"transact","impl":"imperative","description":"Delete faces from a mesh, leaving real holes. Use only for intentional openings to empty space or adjacent voids, not as a shortcut for doorway- or hallway-sized passages.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to delete"}},"required":["nodeId","faceIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"merge_mesh_faces","kind":"act","impl":"imperative","description":"Merge adjacent coplanar faces into a single face.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to merge (must be coplanar and adjacent)"}},"required":["nodeId","faceIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"merge_mesh_vertices","kind":"act","impl":"imperative","description":"Merge multiple vertices to their average position.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"vertexIds":{"type":"array","items":{"type":"string"},"description":"Vertex IDs to merge"}},"required":["nodeId","vertexIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"translate_mesh_vertices","kind":"act","impl":"imperative","description":"Translate selected mesh vertices in world space. Use this to reposition a cap or face region after cutting or extruding.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"vertexIds":{"type":"array","items":{"type":"string"},"description":"Vertex IDs to move"},"offsetX":{"type":"number","description":"World X offset in meters"},"offsetY":{"type":"number","description":"World Y offset in meters"},"offsetZ":{"type":"number","description":"World Z offset in meters"}},"required":["nodeId","vertexIds","offsetX","offsetY","offsetZ"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"scale_mesh_vertices","kind":"act","impl":"imperative","description":"Scale selected mesh vertices around their centroid or an optional pivot. Use this to widen or narrow an extruded cap before the next extrusion.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"vertexIds":{"type":"array","items":{"type":"string"},"description":"Vertex IDs to scale"},"scaleX":{"type":"number","description":"World-axis scale factor around the pivot for X"},"scaleY":{"type":"number","description":"World-axis scale factor around the pivot for Y"},"scaleZ":{"type":"number","description":"World-axis scale factor around the pivot for Z"},"pivotX":{"type":"number","description":"Optional pivot X. Defaults to the selected vertices centroid."},"pivotY":{"type":"number","description":"Optional pivot Y. Defaults to the selected vertices centroid."},"pivotZ":{"type":"number","description":"Optional pivot Z. Defaults to the selected vertices centroid."}},"required":["nodeId","vertexIds","scaleX","scaleY","scaleZ"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"fill_mesh_face","kind":"act","impl":"imperative","description":"Create a new face from a loop of boundary vertices, filling a hole in the mesh.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"vertexIds":{"type":"array","items":{"type":"string"},"description":"Vertex IDs forming the boundary loop (>=3, must be boundary vertices)"}},"required":["nodeId","vertexIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"invert_mesh_normals","kind":"act","impl":"imperative","description":"Flip face normals (winding order) on selected or all faces of a mesh.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to invert (omit for all faces)"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"arc_mesh_edges","kind":"act","impl":"imperative","description":"Curve straight edges into arcs by inserting interpolated vertices.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"edges":{"type":"array","items":{"type":"array","items":{"type":"string"}},"description":"Edges as [[vertexId1, vertexId2], ...] pairs"},"offset":{"type":"number","description":"Arc height/offset in meters"},"segments":{"type":"number","description":"Number of arc segments (minimum 2)"}},"required":["nodeId","edges","offset","segments"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"inflate_mesh","kind":"act","impl":"imperative","description":"Move all vertices of mesh nodes along their averaged normals (inflate/deflate).","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeIds":{"type":"array","items":{"type":"string"},"description":"Mesh node IDs"},"factor":{"type":"number","description":"Inflate factor (positive = outward, negative = inward)"}},"required":["nodeIds","factor"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"convert_brush_to_mesh","kind":"act","impl":"imperative","description":"Convert a legacy brush node into an editable mesh node, enabling the preferred face/edge/vertex editing workflow.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Brush node ID to convert"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"capture_mesh_modeling_base","kind":"act","impl":"imperative","description":"Capture the current mesh topology as the base for a live/non-destructive modeling stack.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"rebuild_mesh_modeling_stack","kind":"act","impl":"imperative","description":"Re-evaluate the mesh modeling stack from its captured base topology and current modifiers.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_mesh_modeling_modifier","kind":"act","impl":"imperative","description":"Add a live/non-destructive modeling modifier. Supports boolean, mirror, solidify, lattice, remesh, and retopo modifiers.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"type":{"type":"string","enum":["boolean","mirror","solidify","lattice","remesh","retopo"],"description":"Modifier type"},"label":{"type":"string","description":"Display label"},"enabled":{"type":"boolean","description":"Whether the modifier is enabled"},"operation":{"type":"string","enum":["union","difference","intersect"],"description":"Boolean operation"},"targetNodeId":{"type":"string","description":"Boolean target mesh node ID"},"mode":{"type":"string","description":"Boolean mode apply/live, lattice mode bend/twist/taper/shear, or remesh mode cleanup/quad/voxel"},"axis":{"type":"string","enum":["x","y","z"],"description":"Mirror/lattice axis"},"weld":{"type":"boolean","description":"Mirror weld/symmetry weld toggle"},"thickness":{"type":"number","description":"Solidify thickness in meters"},"intensity":{"type":"number","description":"Lattice intensity"},"falloff":{"type":"number","description":"Lattice falloff"},"resolution":{"type":"number","description":"Remesh resolution"},"smoothing":{"type":"number","description":"Remesh smoothing amount"},"weldDistance":{"type":"number","description":"Cleanup weld distance"},"preserveBorders":{"type":"boolean","description":"Retopo preserve-border toggle"},"targetFaceCount":{"type":"number","description":"Retopo target face count"}},"required":["nodeId","type"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_mesh_modeling_modifier","kind":"act","impl":"imperative","description":"Update fields on an existing live modeling modifier by modifierId.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"modifierId":{"type":"string","description":"Modifier ID to update"},"label":{"type":"string","description":"Display label"},"enabled":{"type":"boolean","description":"Whether the modifier is enabled"},"operation":{"type":"string","enum":["union","difference","intersect"],"description":"Boolean operation"},"targetNodeId":{"type":"string","description":"Boolean target mesh node ID"},"mode":{"type":"string","description":"Boolean, lattice, or remesh mode"},"axis":{"type":"string","enum":["x","y","z"],"description":"Mirror/lattice axis"},"weld":{"type":"boolean","description":"Mirror weld/symmetry weld toggle"},"thickness":{"type":"number","description":"Solidify thickness in meters"},"intensity":{"type":"number","description":"Lattice intensity"},"falloff":{"type":"number","description":"Lattice falloff"},"resolution":{"type":"number","description":"Remesh resolution"},"smoothing":{"type":"number","description":"Remesh smoothing amount"},"weldDistance":{"type":"number","description":"Cleanup weld distance"},"preserveBorders":{"type":"boolean","description":"Retopo preserve-border toggle"},"targetFaceCount":{"type":"number","description":"Retopo target face count"}},"required":["nodeId","modifierId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_mesh_modeling_modifier","kind":"act","impl":"imperative","description":"Remove a live/non-destructive modeling modifier from a mesh.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"modifierId":{"type":"string","description":"Modifier ID to remove"}},"required":["nodeId","modifierId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_mesh_symmetry","kind":"act","impl":"imperative","description":"Enable or update live symmetry settings for a mesh modeling stack.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"enabled":{"type":"boolean","description":"Whether symmetry is enabled"},"axis":{"type":"string","enum":["x","y","z"],"description":"Symmetry mirror axis"},"weld":{"type":"boolean","description":"Whether symmetry should weld mirrored seams"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_mesh_polygroup","kind":"act","impl":"imperative","description":"Create a PolyGroup/face group from selected face IDs for material IDs, retopo regions, LOD planning, and bake masks.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to include"},"name":{"type":"string","description":"Group display name"},"groupId":{"type":"string","description":"Optional stable group ID"},"color":{"type":"string","description":"Hex color for the group"}},"required":["nodeId","faceIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"assign_faces_to_mesh_polygroup","kind":"act","impl":"imperative","description":"Add more face IDs to an existing PolyGroup.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"groupId":{"type":"string","description":"Existing PolyGroup ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to add"}},"required":["nodeId","groupId","faceIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_mesh_smoothing_group","kind":"act","impl":"imperative","description":"Create a smoothing group over selected faces with a target smoothing angle.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to include"},"name":{"type":"string","description":"Group display name"},"groupId":{"type":"string","description":"Optional stable group ID"},"angle":{"type":"number","description":"Smoothing angle in degrees"}},"required":["nodeId","faceIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_mesh_lod_profiles","kind":"act","impl":"imperative","description":"Author LOD targets for runtime export. Pass profiles with ratios/faceCounts, or ratios for generated profiles.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"ratios":{"type":"array","items":{"type":"number"},"description":"LOD reduction ratios such as [0.7, 0.4, 0.18]"},"profiles":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"ratio":{"type":"number"},"faceCount":{"type":"number"}}},"description":"Explicit LOD profiles"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"queue_mesh_bake_outputs","kind":"act","impl":"imperative","description":"Queue bake-map output slots for runtime asset production: normals, AO, curvature, ID masks, and vertex colors.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"kinds":{"type":"array","items":{"type":"string","enum":["normals","ao","curvature","id-mask","vertex-colors"]},"description":"Bake map kinds to queue"},"resolution":{"type":"number","description":"Bake texture resolution, default 2048"},"sourceGroupId":{"type":"string","description":"Optional PolyGroup/source group ID"},"replaceExisting":{"type":"boolean","description":"Replace existing queued outputs for the same kind, default true"}},"required":["nodeId","kinds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"unwrap_mesh_uvs","kind":"act","impl":"imperative","description":"Create or replace explicit UVs on mesh faces using smart unwrap, planar, box, or cylindrical projection.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Optional face IDs; omit for whole mesh"},"mode":{"type":"string","enum":["smart","planar","box","cylindrical"],"description":"UV unwrap/projection mode"},"axis":{"type":"string","enum":["x","y","z"],"description":"Projection axis for planar/cylindrical modes"},"angleThresholdDegrees":{"type":"number","description":"Smart unwrap hard-edge seam angle, default 66"},"margin":{"type":"number","description":"Packing margin 0-0.2, default 0.02"},"scaleU":{"type":"number","description":"U scale for projection"},"scaleV":{"type":"number","description":"V scale for projection"},"offsetU":{"type":"number","description":"U offset for projection"},"offsetV":{"type":"number","description":"V offset for projection"}},"required":["nodeId","mode"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"pack_mesh_uvs","kind":"act","impl":"imperative","description":"Pack existing mesh UV islands into 0-1 UV space with deterministic shelf packing.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Optional face IDs; omit for whole mesh"},"margin":{"type":"number","description":"Island margin, default 0.02"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"mark_mesh_uv_seams","kind":"act","impl":"imperative","description":"Mark UV seams using vertex-id edge pairs. Use list_mesh_topology first to inspect vertex IDs and edges.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"edges":{"type":"array","items":{"type":"array","items":{"type":"string"}},"description":"Edges as [[vertexId1, vertexId2], ...]"},"append":{"type":"boolean","description":"Append to existing seams, default true"}},"required":["nodeId","edges"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"normalize_mesh_texel_density","kind":"act","impl":"imperative","description":"Scale selected face UVs to a target texel density for game-production texture consistency.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Optional face IDs; omit for whole mesh"},"pixelsPerMeter":{"type":"number","description":"Target pixels per meter, default 512"},"textureResolution":{"type":"number","description":"Texture resolution in pixels, default 1024"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"paint_mesh_face_material","kind":"act","impl":"imperative","description":"Assign a material to mesh faces and register it as a mesh-local material slot.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to paint; omit for all faces"},"materialId":{"type":"string","description":"Material ID from list_materials"}},"required":["nodeId","materialId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"paint_mesh_vertex_color","kind":"act","impl":"imperative","description":"Paint RGBA vertex colors onto mesh face corners. Hex color is easiest, e.g. #ff8844.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to paint; omit for all faces"},"color":{"type":"string","description":"Hex color such as #ffffff"},"r":{"type":"number","description":"Red 0-1 when not using color"},"g":{"type":"number","description":"Green 0-1 when not using color"},"b":{"type":"number","description":"Blue 0-1 when not using color"},"alpha":{"type":"number","description":"Alpha 0-1, default 1"},"strength":{"type":"number","description":"Paint strength 0-1, default 1"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_mesh_surface_blend_layer","kind":"act","impl":"imperative","description":"Add or update one of the mesh's up-to-4 PBR texture blend layers, usually from an existing material.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"layerId":{"type":"string","description":"Stable blend layer ID. Defaults to blend:<materialId>"},"materialId":{"type":"string","description":"Existing material ID to copy color/textures from"},"name":{"type":"string","description":"Layer display name"},"color":{"type":"string","description":"Fallback layer color"},"colorTexture":{"type":"string","description":"Color texture URL/data URI"},"normalTexture":{"type":"string","description":"Normal texture URL/data URI"},"metalnessTexture":{"type":"string","description":"Metalness texture URL/data URI"},"roughnessTexture":{"type":"string","description":"Roughness texture URL/data URI"},"metalness":{"type":"number","description":"Layer metalness 0-1"},"roughness":{"type":"number","description":"Layer roughness 0-1"}},"required":["nodeId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"paint_mesh_texture_blend","kind":"act","impl":"imperative","description":"Paint normalized per-corner weights for a mesh surface blend layer.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Face IDs to paint; omit for all faces"},"layerId":{"type":"string","description":"Blend layer ID to paint"},"strength":{"type":"number","description":"Paint strength 0-1, default 1"}},"required":["nodeId","layerId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_mesh_projected_decal","kind":"act","impl":"imperative","description":"Add a live projected decal record to a mesh for editor and runtime overlay rendering.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh node ID"},"decalId":{"type":"string","description":"Optional stable decal ID"},"name":{"type":"string","description":"Decal display name"},"materialId":{"type":"string","description":"Optional material ID to copy texture/color from"},"texture":{"type":"string","description":"Optional decal texture URL/data URI"},"color":{"type":"string","description":"Fallback decal color"},"blendMode":{"type":"string","enum":["normal","multiply","add"],"description":"Decal blend mode"},"opacity":{"type":"number","description":"Opacity 0-1"},"x":{"type":"number","description":"Local projected decal center X"},"y":{"type":"number","description":"Local projected decal center Y"},"z":{"type":"number","description":"Local projected decal center Z"},"normalX":{"type":"number","description":"Projection normal X"},"normalY":{"type":"number","description":"Projection normal Y"},"normalZ":{"type":"number","description":"Projection normal Z"},"upX":{"type":"number","description":"Decal up vector X"},"upY":{"type":"number","description":"Decal up vector Y"},"upZ":{"type":"number","description":"Decal up vector Z"},"sizeX":{"type":"number","description":"Decal width in mesh-local units"},"sizeY":{"type":"number","description":"Decal height in mesh-local units"},"depth":{"type":"number","description":"Projection depth"},"faceIds":{"type":"array","items":{"type":"string"},"description":"Optional target face IDs"}},"required":["nodeId","x","y","z","normalX","normalY","normalZ","sizeX","sizeY"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"split_brush_at_coordinate","kind":"act","impl":"imperative","description":"Split a brush node at an exact world coordinate along an axis (more precise than split_brush which only splits at the midpoint).","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Brush node ID"},"axis":{"type":"string","enum":["x","y","z"],"description":"Axis to split along"},"coordinate":{"type":"number","description":"World coordinate to split at"}},"required":["nodeId","axis","coordinate"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"terrain_add_csg_volume","kind":"act","impl":"imperative","description":"Adds a non-destructive cutter volume to the terrain: a box, sphere, cylinder or capsule that carves the surface where it overlaps, for caves, arches and overhangs. The volume stays live in the modifier stack, so it can be moved, resized or removed later without rebaking the landform. Prefer this over terrain_carve_tunnel when the opening is a chamber rather than a passage.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."},"operation":{"type":"string","enum":["subtract","add"],"description":"\"subtract\" (default) removes the volumes from the terrain solid; \"add\" unions them into it."},"volumes":{"type":"array","description":"The volumes to combine with the terrain. Fields other than `kind` and the shared surface fields apply only to the kinds named in their description.","items":{"type":"object","properties":{"kind":{"type":"string","enum":["capsule","ellipsoid","box","sweep"],"description":"Volume shape. `capsule` is a swept sphere between two points -- passages, tubes, and windows punched through a fin. `ellipsoid` is a rotated ellipsoid -- round for a chamber, flattened for a cliff undercut. `box` is a rotated box, for the straight-walled reaches of a slot canyon. `sweep` is a chain of elliptical rings, for one continuously varying cave shell."},"startX":{"type":"number","description":"capsule: world X of the capsule axis start, in meters"},"startY":{"type":"number","description":"capsule: world Y of the capsule axis start, in meters"},"startZ":{"type":"number","description":"capsule: world Z of the capsule axis start, in meters"},"endX":{"type":"number","description":"capsule: world X of the capsule axis end, in meters"},"endY":{"type":"number","description":"capsule: world Y of the capsule axis end, in meters"},"endZ":{"type":"number","description":"capsule: world Z of the capsule axis end, in meters"},"radiusMeters":{"type":"number","description":"capsule: sphere radius swept along the axis, in meters"},"centerX":{"type":"number","description":"ellipsoid and box: world X of the volume center, in meters"},"centerY":{"type":"number","description":"ellipsoid and box: world Y of the volume center, in meters"},"centerZ":{"type":"number","description":"ellipsoid and box: world Z of the volume center, in meters"},"radiusX":{"type":"number","description":"ellipsoid: half-extent along the local forward axis, in meters"},"radiusY":{"type":"number","description":"ellipsoid: half-extent along local up, in meters. Make this small relative to radiusX and radiusZ to undercut a cliff."},"radiusZ":{"type":"number","description":"ellipsoid: half-extent along the local side axis, in meters"},"halfExtentX":{"type":"number","description":"box: half-size along the local forward axis, in meters"},"halfExtentY":{"type":"number","description":"box: half-size along local up, in meters"},"halfExtentZ":{"type":"number","description":"box: half-size along the local side axis, in meters"},"forwardX":{"type":"number","description":"ellipsoid and box: world direction the local +X axis points along. Defaults to (1,0,0)."},"forwardY":{"type":"number","description":"ellipsoid and box: forward direction Y"},"forwardZ":{"type":"number","description":"ellipsoid and box: forward direction Z"},"upX":{"type":"number","description":"ellipsoid and box: optional world up reference, X. Defaults to (0,1,0)."},"upY":{"type":"number","description":"ellipsoid and box: optional world up reference, Y"},"upZ":{"type":"number","description":"ellipsoid and box: optional world up reference, Z"},"rings":{"type":"array","description":"sweep: ordered elliptical cross-sections defining one continuous void. Three or more rings give a passage that widens and narrows convincingly.","items":{"type":"object","properties":{"x":{"type":"number","description":"World X of the ring center, in meters"},"y":{"type":"number","description":"World Y of the ring center, in meters"},"z":{"type":"number","description":"World Z of the ring center, in meters"},"horizontalRadius":{"type":"number","description":"Ring half-width in meters"},"verticalRadius":{"type":"number","description":"Ring half-height in meters. Below the horizontal radius it reads as a bedding-plane crawl; above it, as a rift."}},"required":["x","y","z","horizontalRadius","verticalRadius"]}},"surface":{"type":"string","enum":["cave","arch","overhang","canyon","hoodoo","default","none"],"description":"Displacement character applied to the cut face before the boolean runs. Pick the one that matches what the volume is for; \"none\" leaves an analytic, machined-looking surface and is only right for engineered geometry."},"noise":{"type":"number","description":"Relative cross-section roughness, 0 or more. 0 is smooth."},"noiseScale":{"type":"number","description":"World-space wavelength of the close-surface roughness, in meters."},"interior":{"type":"string","enum":["rock","ember"],"description":"Material classification for the faces this subtraction exposes."}},"required":["kind"]}}},"required":["volumes"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"terrain_refine_density","kind":"act","impl":"imperative","description":"Locally raises mesh density on a terrain so a following sculpt stroke or CSG cut has enough vertices to resolve detail. Terrain starts at a density tuned for kilometre-scale relief, so fine work -- a cave mouth, a trail cut, a rock shelf -- needs refinement first or it will come out mushy. Use \"tessellate\" to subdivide in place, and \"remesh\" to rebuild the region at an even edge length when repeated sculpting has left stretched triangles. All distances are meters.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."},"mode":{"type":"string","enum":["tessellate","remesh"],"description":"\"tessellate\" (default) subdivides existing triangles inside the sphere. \"remesh\" rebuilds them toward a uniform edge length, which also relaxes…"},"x":{"type":"number","description":"World X of the refinement sphere center, in meters"},"y":{"type":"number","description":"World Y of the refinement sphere center, in meters"},"z":{"type":"number","description":"World Z of the refinement sphere center, in meters"},"radiusMeters":{"type":"number","description":"Radius of the refined region in meters. Cover the whole area of the planned edit plus a margin."},"targetEdgeLengthMeters":{"type":"number","description":"Desired triangle edge length in meters inside the region. A cave mouth wants roughly 0.5-2 m; a hillside 5-20 m. Smaller values cost geometry quickly."}},"required":["x","y","z","radiusMeters","targetEdgeLengthMeters"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"terrain_set_material_channels","kind":"act","impl":"imperative","description":"Renames, recolours, or sets roughness on a mesh terrain's four material channels. The channels are fixed at four and cannot be added to; this tool decides what they mean. Do this before painting so the channel names in `terrain_paint_weights` match the biome the user asked for.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."},"channels":{"type":"array","description":"The channels to change. Omit any channel to leave it as it is.","items":{"type":"object","properties":{"id":{"type":"string","enum":["channel0","channel1","channel2","channel3"],"description":"Which channel this entry configures"},"name":{"type":"string","description":"Display name, for example \"Alpine Grass\", \"Scree\", \"Wet Sand\""},"color":{"type":"string","description":"Base colour as a hex string such as \"#4f7d32\""},"roughness":{"type":"number","description":"Surface roughness 0-1. Rock and soil sit near 0.85-0.95; wet stone and packed snow sit lower, near 0.6-0.7."}},"required":["id"]}}},"required":["channels"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"generate_street_grid","kind":"act","impl":"imperative","description":"Lays out a street grid: avenues, cross streets, junctions, kerbs and footways, conformed to the terrain. This is the ground a city stands on -- blocks and buildings are derived from it, so run this before either. Block proportion matters more than block size; the default 80m by 275m is roughly Manhattan, and long thin blocks are most of what makes a grid read as a city rather than as graph paper. Replaces any existing network.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"columns":{"type":"number","description":"Blocks along x. 4 to 12 is a neighbourhood; above 20 gets heavy."},"rows":{"type":"number","description":"Blocks along z."},"blockWidth":{"type":"number","description":"Block interior width in meters, across the short side. Defaults to 80."},"blockDepth":{"type":"number","description":"Block interior depth in meters, along the long side. Defaults to 275."},"centerX":{"type":"number","description":"Grid centre x in world meters. Defaults to 0."},"centerZ":{"type":"number","description":"Grid centre z in world meters. Defaults to 0."},"arterialEvery":{"type":"number","description":"Every nth avenue is a wide arterial. Defaults to 4; 0 makes every street the same width, which reads flatter."},"rotation":{"type":"number","description":"Rotation of the whole grid in degrees, so it need not align to the world axes."}},"required":["columns","rows"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_street_network","kind":"answer","impl":"imperative","description":"Reports the street network: how many junctions and segments exist, the bounding extent, and a sample of segments with their widths and classes. Call before editing so changes are made against what is actually there.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_street","kind":"act","impl":"imperative","description":"Joins two junctions with a new street, creating either junction if it does not exist yet. Use it to extend a generated grid, cut a diagonal avenue across it, or build a network by hand. The road class sets width and footways unless overridden.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"fromX":{"type":"number","description":"Start junction x in world meters."},"fromZ":{"type":"number","description":"Start junction z in world meters."},"toX":{"type":"number","description":"End junction x in world meters."},"toZ":{"type":"number","description":"End junction z in world meters."},"roadClass":{"type":"string","enum":["arterial","street","alley"],"description":"arterial is a wide multi-lane avenue, street is the ordinary case, alley is narrow with no footways. Defaults to street."},"width":{"type":"number","description":"Carriageway width in meters, kerb to kerb, overriding the class default."},"sidewalkWidth":{"type":"number","description":"Footway width in meters per side. 0 removes footways."}},"required":["fromX","fromZ","toX","toZ"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_crosswalk","kind":"act","impl":"imperative","description":"Paints a zebra crossing across one existing street segment. Use get_street_network first to choose a segment. The crossing follows the compiled road surface and terrain.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"segmentId":{"type":"string","description":"Source street segment that owns the crossing."},"position":{"type":"number","description":"Position from 0 at the segment start to 1 at its end. Defaults to 0.5."},"width":{"type":"number","description":"Crossing length along the street in metres. Defaults to 4."}},"required":["segmentId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"clear_street_network","kind":"act","impl":"imperative","description":"Removes every street and junction. The terrain and everything else in the scene are untouched.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"generate_city_massing","kind":"act","impl":"imperative","description":"Fills the street grid's blocks with building volumes. Divides each block into lots with street frontage, then extrudes each lot to a height, so buildings stand shoulder to shoulder along the street with a shared interior behind. This is the stage that decides a city's silhouette -- skyline, street wall, where the towers cluster -- and it renders as flat coloured boxes rather than finished facades. Requires a street network; run generate_street_grid first.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"lotWidth":{"type":"number","description":"Target street frontage per building in meters. Defaults to 18. Smaller reads as townhouses, larger as apartment blocks."},"lotDepth":{"type":"number","description":"How far back from the street a building reaches, in meters. Defaults to 24. Clamped so two rows on a shallow block cannot overlap."},"minStoreys":{"type":"number","description":"Fewest storeys for a building at the edge of the city. Defaults to 2."},"maxStoreys":{"type":"number","description":"Most storeys for a building at the centre. Defaults to 12."},"storeyHeight":{"type":"number","description":"Floor-to-floor height in meters. Defaults to 3.4."},"centerX":{"type":"number","description":"Where the tall buildings cluster, x in world meters. Defaults to 0."},"centerZ":{"type":"number","description":"Where the tall buildings cluster, z in world meters. Defaults to 0."},"falloffRadius":{"type":"number","description":"How far from the centre height falls off, in meters. Defaults to 400. Large values make the city uniformly tall."},"setback":{"type":"number","description":"Extra gap between the footway and the building line, in meters. 0 (default) is a dense downtown; larger values suburbanise it."},"seed":{"type":"number","description":"Seed for lot widths and heights. The same seed rebuilds the same city."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"clear_city_massing","kind":"act","impl":"imperative","description":"Removes every building volume, leaving the street network in place.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"generate_city_buildings","kind":"act","impl":"imperative","description":"Replaces the tallest massing volumes with real buildings: limestone banks, setback towers and corner headquarters, with colonnades, windows, cornices and roof equipment. Only a few dozen are generated because each costs around 140,000 triangles, so they stand as landmarks among the massing boxes rather than replacing all of them -- which is what a downtown looks like anyway. Requires massing; run generate_city_massing first.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"count":{"type":"number","description":"How many landmarks to generate, tallest lots first. Defaults to 12. Above about 40 the viewport slows noticeably."},"coverage":{"type":"number","description":"Fraction of lots to build instead of a fixed count, 0 to 1. Whichever of this and `count` is smaller wins. Defaults to 0.08."},"seed":{"type":"number","description":"Seed for materials and proportions. The same seed rebuilds the same buildings."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"clear_city_buildings","kind":"act","impl":"imperative","description":"Removes the generated landmark buildings. The massing boxes they replaced come back, and streets are untouched.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"configure_forest_field","kind":"act","impl":"imperative","description":"Changes a forest field's shape and stand settings. `feather` is the number that matters most: it is the depth in meters over which the stand thins out at its boundary, and a hard edge is what makes a painted forest read as a decal rather than a place. Twenty to forty meters reads as a real wood; zero reads as a surveyed line. Marks the field dirty.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"fieldId":{"type":"string","description":"Forest field ID. Omit when exactly one field exists."},"preset":{"type":"string","enum":["mossy-old-growth","temperate-mixed","ancient-oak-grove","boreal-conifer","primeval-redwood","tropical-wet","palm-oasis","savanna","arid-woodland"],"description":"Change the stand type."},"density":{"type":"number","description":"Multiplier on the preset's stems per hectare. 1 is the preset's own figure; fields open at 0.6 because a full-density stand over a couple of hundred…"},"feather":{"type":"number","description":"Meters the stand fades across at its boundary. 20-40 for a natural wood."},"width":{"type":"number","description":"Half-width in meters of an open belt. Ignored when the field is a closed loop."},"closed":{"type":"boolean","description":"Whether the spline encloses an area (true) or is a belt (false)."},"seed":{"type":"number","description":"Layout seed. Change it to reshuffle the same stand into a different arrangement."},"visible":{"type":"boolean","description":"Whether the stand draws in the viewport."},"name":{"type":"string","description":"Rename the field."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_forest_field","kind":"transact","impl":"imperative","description":"Removes a forest field and the stand grown from it.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"fieldId":{"type":"string","description":"Forest field ID."}},"required":["fieldId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Developer Tools","favicon":"/favicons/morphus.myles4miles.chatgpt.site.png","apiSurface":"spec","toolCount":154}}