{"ok":true,"site":{"host":"synspace-beta.vercel.app","url":"https://synspace-beta.vercel.app/","type":"live","desc":"SynSpace","tools":[{"name":"spawn_3d_asset","kind":"act","impl":"imperative","description":"Place a new object into the world at a floor position. Optionally size it in metres (width_m/height_m/depth_m) and give it a label, which buildings and hospitals show as signage. Returns the created object id.","inputSchema":{"type":"object","properties":{"model_type":{"type":"string","description":"Kind of asset to place. Built-in kinds: desk, chair, meeting-table, sofa, plant, partition, server-rack, door, storage-unit, whiteboard, cafe-table, counter, wall-segment, barrier, building, hospital, road, vehicle. Kinds added with define_asset work here too — call list_asset_types for the current set."},"x":{"type":"number","description":"Metres along X from the room centre."},"y":{"type":"number","description":"Height in metres. Use 0 to stand on the floor."},"z":{"type":"number","description":"Metres along Z from the room centre."},"rotation":{"description":"Rotation in DEGREES. Either a single number for yaw, or [x, y, z]. 0 faces +Z.","anyOf":[{"type":"number"},{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3}]},"color":{"type":"string","description":"Optional 6-digit hex accent colour, e.g. \"#4f8cff\"."},"label":{"type":"string","description":"Optional display name. Buildings and hospitals render this as signage on the front of the model, so a name like \"City Hospital\" or \"Riverside Tower\" is visible in the 3D world."},"width_m":{"type":"number","description":"Optional real-world width in metres. The asset kit is fixed; sizing an instance is how you get a tower rather than a shop from the same building model."},"height_m":{"type":"number","description":"Optional real-world height in metres."},"depth_m":{"type":"number","description":"Optional real-world depth in metres."}},"required":["model_type","x","z"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"read_scene_graph","kind":"answer","impl":"imperative","description":"Read the complete current state of the spatial world: coordinate system, room boundary, every object with its position, rotation, size, category and zone, the named zones, the active spatial constraints, and the environment. Always reflects the latest human edits.","inputSchema":{"type":"object","properties":{"model_type":{"type":"string","description":"Optional filter — return only objects of this type. Built-in kinds: desk, chair, meeting-table, sofa, plant, partition, server-rack, door, storage-unit, whiteboard, cafe-table, counter, wall-segment, barrier, building, hospital, road, vehicle. Kinds added with define_asset work here too — call list_asset_types for the current set."},"zone_id":{"type":"string","description":"Optional filter — return only objects inside this zone."},"object_id":{"type":"string","description":"Optional — when given, also return the spatial relationships and nearest neighbours for that object."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"move_3d_asset","kind":"act","impl":"imperative","description":"Move an existing object to an absolute floor position, in metres from the room centre.","inputSchema":{"type":"object","properties":{"object_id":{"type":"string","description":"Id of an existing object, as returned by read_scene_graph."},"x":{"type":"number","description":"Target X in metres."},"y":{"type":"number","description":"Target height in metres. Usually 0."},"z":{"type":"number","description":"Target Z in metres."}},"required":["object_id","x","z"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"rotate_3d_asset","kind":"act","impl":"imperative","description":"Rotate an existing object. Rotation is absolute, in degrees.","inputSchema":{"type":"object","properties":{"object_id":{"type":"string","description":"Id of an existing object, as returned by read_scene_graph."},"rotation":{"description":"Rotation in DEGREES. Either a single number for yaw, or [x, y, z]. 0 faces +Z.","anyOf":[{"type":"number"},{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3}]}},"required":["object_id","rotation"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_3d_asset","kind":"transact","impl":"imperative","description":"Permanently remove an object from the workspace. Undoable by the human.","inputSchema":{"type":"object","properties":{"object_id":{"type":"string","description":"Id of an existing object, as returned by read_scene_graph."}},"required":["object_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"check_constraints","kind":"answer","impl":"imperative","description":"Analyse the current layout against the active spatial rules: object collisions, walkway width, entrance clearance, emergency egress, object spacing and alignment. Returns structured violations.","inputSchema":{"type":"object","properties":{"kinds":{"type":"array","items":{"type":"string","enum":["collision","walkway-width","entrance-clearance","exit-clearance","object-spacing","alignment"]},"description":"Optional filter — only report these constraint kinds."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"optimize_layout","kind":"act","impl":"imperative","description":"Improve the layout with a deterministic strategy. grid_align squares everything to a 0.5 m grid; clear_walkways opens circulation and doorways; improve_spacing separates crowded objects; circle_cluster arranges seating in a ring. Applies as a single undoable change.","inputSchema":{"type":"object","properties":{"strategy":{"type":"string","enum":["grid_align","clear_walkways","improve_spacing","circle_cluster"]},"object_ids":{"type":"array","items":{"type":"string"},"description":"Optional — restrict the strategy to these objects."},"model_type":{"type":"string","description":"Optional — restrict the strategy to one asset type. Built-in kinds: desk, chair, meeting-table, sofa, plant, partition, server-rack, door, storage-unit, whiteboard, cafe-table, counter, wall-segment, barrier, building, hospital, road, vehicle. Kinds added with define_asset work here too — call list_asset_types for the current set."}},"required":["strategy"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"change_environment_variables","kind":"act","impl":"imperative","description":"Switch the workspace lighting mood. daytime is bright and neutral, sunset is warm and low, cyberpunk is dark with magenta and violet light.","inputSchema":{"type":"object","properties":{"preset":{"type":"string","enum":["studio","daytime","sunset","cyberpunk"]},"shadows_enabled":{"type":"boolean","description":"Optional shadow toggle."}},"required":["preset"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"clear_canvas","kind":"act","impl":"imperative","description":"Remove every object from the workspace, leaving an empty room. Destructive — the human can undo it with one step. Requires confirm: true.","inputSchema":{"type":"object","properties":{"confirm":{"type":"boolean","description":"Must be true. Guards against clearing the room by accident."}},"required":["confirm"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"inspect_world","kind":"answer","impl":"imperative","description":"Return deterministic world metrics and a concise structured constraint summary for the current world or an isolated scenario.","inputSchema":{"type":"object","properties":{"scenario_id":{"type":"string","description":"Scenario id returned by create_scenario."},"selected_object_ids":{"type":"array","items":{"type":"string"},"description":"Optional object ids used only for the average pair-distance metric."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"query_spatial_relationships","kind":"answer","impl":"imperative","description":"Inspect one object in the current world or a scenario: zone membership, boundary status, derived relationships, and nearest objects.","inputSchema":{"type":"object","properties":{"object_id":{"type":"string"},"scenario_id":{"type":"string","description":"Scenario id returned by create_scenario."},"limit":{"type":"integer","minimum":1,"maximum":20,"default":5}},"required":["object_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_scenario","kind":"act","impl":"imperative","description":"Clone the current world into an isolated what-if scenario. This does not modify the current world.","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100}},"required":["name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"modify_scenario","kind":"act","impl":"imperative","description":"Apply one high-level hypothetical operation to a scenario: add/remove/move objects, change zone capacity, block a path, or change a constraint. The current world remains unchanged.","inputSchema":{"type":"object","properties":{"scenario_id":{"type":"string","description":"Scenario id returned by create_scenario."},"operation":{"oneOf":[{"type":"object","properties":{"kind":{"const":"add_object"},"asset_type":{"type":"string","description":"Kind of asset to add. Built-in kinds: desk, chair, meeting-table, sofa, plant, partition, server-rack, door, storage-unit, whiteboard, cafe-table, counter, wall-segment, barrier, building, hospital, road, vehicle. Kinds added with define_asset work here too — call list_asset_types for the current set."},"count":{"type":"integer","minimum":1,"maximum":50},"zone_id":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"rotation_degrees":{"anyOf":[{"type":"number"},{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3}]},"label_prefix":{"type":"string"}},"required":["kind","asset_type","count"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"remove_object"},"object_id":{"type":"string"}},"required":["kind","object_id"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"move_object"},"object_id":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"}},"required":["kind","object_id","x","z"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"change_capacity"},"zone_id":{"type":"string"},"capacity":{"type":"integer","minimum":0,"maximum":1000}},"required":["kind","zone_id","capacity"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"block_path"},"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"},"width":{"type":"number","exclusiveMinimum":0,"maximum":20},"depth":{"type":"number","exclusiveMinimum":0,"maximum":20},"label":{"type":"string"}},"required":["kind","x","z","width","depth"],"additionalProperties":false},{"type":"object","properties":{"kind":{"const":"change_constraint"},"constraint_id":{"type":"string"},"value":{"type":"number","minimum":0,"maximum":100},"enabled":{"type":"boolean"},"severity":{"type":"string","enum":["error","warning","info"]}},"required":["kind","constraint_id"],"additionalProperties":false}]}},"required":["scenario_id","operation"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"analyze_scenario","kind":"act","impl":"imperative","description":"Calculate deterministic world metrics and all structured constraint consequences for an isolated scenario.","inputSchema":{"type":"object","properties":{"scenario_id":{"type":"string","description":"Scenario id returned by create_scenario."},"selected_object_ids":{"type":"array","items":{"type":"string"}}},"required":["scenario_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"compare_scenarios","kind":"act","impl":"imperative","description":"Compare a scenario with the current world by default, or with another scenario. Returns metric deltas, improved/worsened constraints, and a deterministic recommendation.","inputSchema":{"type":"object","properties":{"scenario_id":{"type":"string","description":"Scenario id returned by create_scenario."},"against_scenario_id":{"type":"string","description":"Scenario id returned by create_scenario."},"selected_object_ids":{"type":"array","items":{"type":"string"}}},"required":["scenario_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"apply_scenario","kind":"act","impl":"imperative","description":"Apply an isolated scenario to the current world as one undoable change. Requires confirm: true and rejects stale scenario bases.","inputSchema":{"type":"object","properties":{"scenario_id":{"type":"string","description":"Scenario id returned by create_scenario."},"confirm":{"type":"boolean"}},"required":["scenario_id","confirm"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"discard_scenario","kind":"act","impl":"imperative","description":"Reject an isolated scenario without changing the current world. Requires confirm: true.","inputSchema":{"type":"object","properties":{"scenario_id":{"type":"string","description":"Scenario id returned by create_scenario."},"confirm":{"type":"boolean"}},"required":["scenario_id","confirm"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"generate_layout","kind":"act","impl":"imperative","description":"Rebuild the world as a named kind of space — an office, classroom, cafe, clinic waiting room, data hall, retail floor or city district. Replaces the objects and zones in one undoable step and resizes the room to suit the layout, so a city district gets city-sized ground and a classroom does not. Use this when asked to build or change what kind of space this is, rather than placing objects one at a time. Call list_layouts first if you are unsure which one fits the request.","inputSchema":{"type":"object","properties":{"layout":{"type":"string","enum":["open-plan-office","classroom","cafe","clinic","data-hall","retail","city"],"description":"Which arrangement to build."}},"required":["layout"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_layouts","kind":"answer","impl":"imperative","description":"List the arrangements generate_layout can build, with the kinds of request each one answers.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_proposal","kind":"act","impl":"imperative","description":"Propose a set of changes for the human to review. Nothing is applied: the proposal is simulated, compared against the live world, and returned with its expected benefits. Objects the human has fixed are rejected rather than silently moved.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Short name for the proposal."},"summary":{"type":"string","description":"One sentence a person can act on. Omit to generate one from the measured effect."},"operations":{"type":"array","description":"The changes to simulate.","items":{"type":"object","properties":{"kind":{"type":"string","enum":["move_object","remove_object"]},"object_id":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"}},"required":["kind","object_id"],"additionalProperties":false}}},"required":["title","operations"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_layout_fix","kind":"act","impl":"imperative","description":"Work out a deterministic layout fix and return it as a proposal for the human to review. Fixed objects are never moved. Use after check_constraints reports a problem.","inputSchema":{"type":"object","properties":{"strategy":{"type":"string","enum":["grid_align","clear_walkways","improve_spacing","circle_cluster"]},"title":{"type":"string","description":"Optional proposal title."}},"required":["strategy"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_proposals","kind":"answer","impl":"imperative","description":"List every proposal with its status and whether it is still valid against the current world revision.","inputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","approved","rejected","applied","superseded"],"description":"Optional filter."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"recalculate_proposal","kind":"act","impl":"imperative","description":"Rebuild a stale proposal against the current world. Use this when the human has changed the world since the proposal was created — the old proposal is superseded, never applied over newer work.","inputSchema":{"type":"object","properties":{"proposal_id":{"type":"string"}},"required":["proposal_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"apply_proposal","kind":"act","impl":"imperative","description":"Apply a proposal the human has already approved. Fails if it has not been approved, or if the world has changed since it was computed. Applying is a single undoable step.","inputSchema":{"type":"object","properties":{"proposal_id":{"type":"string"}},"required":["proposal_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_object_fixed","kind":"act","impl":"imperative","description":"Mark an object as fixed, or release it. A fixed object is never moved by optimisation or by any proposal. Use this to honour an instruction such as \"keep this desk exactly where it is\".","inputSchema":{"type":"object","properties":{"object_id":{"type":"string"},"fixed":{"type":"boolean","description":"true to fix in place, false to release."}},"required":["object_id","fixed"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"resize_world","kind":"act","impl":"imperative","description":"Change the size of the world itself — its floor width, depth and wall height, in metres. Use this when the scene you are asked for does not fit the current room: a classroom needs about 10×8 m, an open-plan office 18×14 m, a warehouse 40×30 m, and a city district 100×80 m or more. Enlarging is safe. Shrinking pulls any object that would end up outside back to the nearest legal spot, which can crowd them together, so run check_constraints afterwards. Range: 4–240 m per side, walls 2–40 m.","inputSchema":{"type":"object","properties":{"width_m":{"type":"number","description":"Floor width along X, in metres (4–240). Omit to leave unchanged."},"depth_m":{"type":"number","description":"Floor depth along Z, in metres (4–240). Omit to leave unchanged."},"wall_height_m":{"type":"number","description":"Wall height, in metres (2–40). Omit to leave unchanged."},"reason":{"type":"string","description":"Why this size suits the world being built."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"resize_3d_asset","kind":"act","impl":"imperative","description":"Resize an existing object to real-world metres. The asset kit is fixed and small on purpose — scaling instances is how one \"building\" model becomes a corner shop, a warehouse or a tower block, so reach for this instead of expecting a new asset type. Axes you omit are left alone.","inputSchema":{"type":"object","properties":{"object_id":{"type":"string","description":"Id of the object to resize."},"width_m":{"type":"number","description":"Target width in metres (0.1–60)."},"height_m":{"type":"number","description":"Target height in metres (0.1–60)."},"depth_m":{"type":"number","description":"Target depth in metres (0.1–60)."}},"required":["object_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"define_asset","kind":"act","impl":"imperative","description":"Create a new kind of asset from primitive solids, without any code change. Use this when the world needs something the built-in kit does not cover — a tree, a fountain, a bus shelter, a market stall, a wind turbine. Build it from boxes, cylinders, spheres and cones positioned in metres from the asset origin, which sits on the floor at the centre of the object (y is height above the floor). The overall footprint is measured from the parts you give, so the new kind takes part in collision, spacing and clearance checks exactly like a built-in one. Once defined it can be placed with spawn_3d_asset by its type name, as many times as you like — define once, place many. Defining the same type again replaces its shape for future placements.","inputSchema":{"type":"object","properties":{"type":{"type":"string","description":"Type name in lowercase kebab-case, e.g. \"tree\" or \"bus-shelter\". This is what spawn_3d_asset takes as model_type. Cannot be a built-in kind."},"name":{"type":"string","description":"Display name shown to people, e.g. \"Oak Tree\"."},"category":{"type":"string","enum":["Workstations","Seating","Collaboration","Hospitality","Storage","Infrastructure","Structure","Urban","Ambience"],"description":"Which section of the asset library it belongs in."},"description":{"type":"string","description":"One line on what it is and where it belongs."},"color":{"type":"string","description":"Default 6-digit hex accent colour. Parts that set no colour of their own use it."},"clearance":{"type":"number","description":"Optional clear space to keep around it, in metres. Derived from its size if omitted."},"signage_height_m":{"type":"number","description":"Optional. When set, the placed object’s label is painted onto the front face at this height in metres — good for anything that should read as a named place."},"parts":{"type":"array","minItems":1,"maxItems":24,"description":"The solids it is built from. Sizes and positions are metres; the origin is on the floor at the object centre, so a 2 m post is size [0.2, 2, 0.2] at position [0, 1, 0].","items":{"type":"object","properties":{"shape":{"type":"string","enum":["box","cylinder","sphere","cone"],"description":"Which primitive solid."},"size":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3,"description":"[width, height, depth] in metres. For a cylinder or cone, width and depth are the diameters."},"position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3,"description":"[x, y, z] offset of the part centre from the asset origin, in metres."},"rotation":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3,"description":"Optional [x, y, z] rotation in radians."},"color":{"type":"string","description":"Optional 6-digit hex. Omit to take the placed object’s accent colour."},"finish":{"type":"string","enum":["matte","soft","satin","metallic"],"description":"Optional surface treatment. Defaults to matte."}},"required":["shape","size","position"],"additionalProperties":false}}},"required":["type","name","category","parts"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_asset_types","kind":"answer","impl":"imperative","description":"List every asset kind that can be placed right now — the built-in kit plus anything defined with define_asset in this world — with its size, category and clearance. Call this before spawn_3d_asset when you are unsure whether a suitable kind already exists.","inputSchema":{"type":"object","properties":{"category":{"type":"string","enum":["Workstations","Seating","Collaboration","Hospitality","Storage","Infrastructure","Structure","Urban","Ambience"],"description":"Optional filter — only kinds in this category."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_asset_type","kind":"act","impl":"imperative","description":"Remove a kind that was defined with define_asset. Refuses while any object of that kind is still placed, so the world can never reference a kind it no longer has — delete those objects first.","inputSchema":{"type":"object","properties":{"type":{"type":"string","description":"The runtime-defined type to remove."}},"required":["type"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"favicon":"/favicons/synspace-beta.vercel.app.svg","apiSurface":"spec","category":"Developer Tools","toolCount":30}}